about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.rubocop.yml2
-rw-r--r--AUTHORS.md269
-rw-r--r--CHANGELOG.md73
-rw-r--r--Gemfile10
-rw-r--r--Gemfile.lock132
-rw-r--r--app/controllers/admin/dashboard_controller.rb1
-rw-r--r--app/controllers/admin/settings_controller.rb81
-rw-r--r--app/controllers/api/v1/accounts/identity_proofs_controller.rb19
-rw-r--r--app/controllers/concerns/account_controller_concern.rb6
-rw-r--r--app/controllers/directories_controller.rb2
-rw-r--r--app/controllers/relationships_controller.rb9
-rw-r--r--app/controllers/settings/identity_proofs_controller.rb22
-rw-r--r--app/helpers/admin/dashboard_helper.rb10
-rw-r--r--app/helpers/admin/filter_helper.rb2
-rw-r--r--app/helpers/stream_entries_helper.rb4
-rw-r--r--app/javascript/flavours/glitch/actions/identity_proofs.js30
-rw-r--r--app/javascript/flavours/glitch/actions/search.js1
-rw-r--r--app/javascript/flavours/glitch/components/status_action_bar.js2
-rw-r--r--app/javascript/flavours/glitch/components/status_content.js6
-rw-r--r--app/javascript/flavours/glitch/containers/status_container.js9
-rw-r--r--app/javascript/flavours/glitch/features/account/components/action_bar.js109
-rw-r--r--app/javascript/flavours/glitch/features/account/components/header.js257
-rw-r--r--app/javascript/flavours/glitch/features/account_timeline/components/header.js15
-rw-r--r--app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js9
-rw-r--r--app/javascript/flavours/glitch/features/account_timeline/index.js3
-rw-r--r--app/javascript/flavours/glitch/features/drawer/results/index.js8
-rw-r--r--app/javascript/flavours/glitch/features/emoji_picker/index.js51
-rw-r--r--app/javascript/flavours/glitch/features/status/components/action_bar.js2
-rw-r--r--app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js9
-rw-r--r--app/javascript/flavours/glitch/features/status/index.js9
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js12
-rw-r--r--app/javascript/flavours/glitch/reducers/identity_proofs.js25
-rw-r--r--app/javascript/flavours/glitch/reducers/index.js2
-rw-r--r--app/javascript/flavours/glitch/reducers/timelines.js9
-rw-r--r--app/javascript/flavours/glitch/styles/_mixins.scss1
-rw-r--r--app/javascript/flavours/glitch/styles/admin.scss5
-rw-r--r--app/javascript/flavours/glitch/styles/components/accounts.scss351
-rw-r--r--app/javascript/flavours/glitch/styles/components/drawer.scss46
-rw-r--r--app/javascript/flavours/glitch/styles/components/emoji.scss4
-rw-r--r--app/javascript/flavours/glitch/styles/components/emoji_picker.scss25
-rw-r--r--app/javascript/flavours/glitch/styles/components/index.scss14
-rw-r--r--app/javascript/flavours/glitch/styles/components/metadata.scss45
-rw-r--r--app/javascript/flavours/glitch/styles/components/modal.scss1
-rw-r--r--app/javascript/flavours/glitch/styles/components/status.scss1
-rw-r--r--app/javascript/flavours/glitch/styles/containers.scss9
-rw-r--r--app/javascript/flavours/glitch/styles/forms.scss45
-rw-r--r--app/javascript/flavours/glitch/styles/metadata.scss56
-rw-r--r--app/javascript/flavours/glitch/styles/stream_entries.scss1
-rw-r--r--app/javascript/flavours/glitch/styles/widgets.scss1
-rw-r--r--app/javascript/flavours/glitch/util/api.js8
-rw-r--r--app/javascript/flavours/glitch/util/emoji/emoji_picker.js4
-rw-r--r--app/javascript/mastodon/actions/identity_proofs.js30
-rw-r--r--app/javascript/mastodon/actions/search.js1
-rw-r--r--app/javascript/mastodon/api.js8
-rw-r--r--app/javascript/mastodon/components/status_action_bar.js2
-rw-r--r--app/javascript/mastodon/components/status_content.js6
-rw-r--r--app/javascript/mastodon/containers/status_container.js9
-rw-r--r--app/javascript/mastodon/features/account/components/action_bar.js190
-rw-r--r--app/javascript/mastodon/features/account/components/header.js293
-rw-r--r--app/javascript/mastodon/features/account_timeline/components/header.js12
-rw-r--r--app/javascript/mastodon/features/account_timeline/containers/header_container.js9
-rw-r--r--app/javascript/mastodon/features/account_timeline/index.js25
-rw-r--r--app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js51
-rw-r--r--app/javascript/mastodon/features/direct_timeline/components/column_settings.js35
-rw-r--r--app/javascript/mastodon/features/direct_timeline/containers/column_settings_container.js17
-rw-r--r--app/javascript/mastodon/features/emoji/emoji_picker.js4
-rw-r--r--app/javascript/mastodon/features/followers/index.js8
-rw-r--r--app/javascript/mastodon/features/following/index.js8
-rw-r--r--app/javascript/mastodon/features/status/components/action_bar.js2
-rw-r--r--app/javascript/mastodon/features/status/containers/detailed_status_container.js9
-rw-r--r--app/javascript/mastodon/features/status/index.js9
-rw-r--r--app/javascript/mastodon/features/ui/components/confirmation_modal.js12
-rw-r--r--app/javascript/mastodon/locales/ar.json8
-rw-r--r--app/javascript/mastodon/locales/ast.json8
-rw-r--r--app/javascript/mastodon/locales/bg.json8
-rw-r--r--app/javascript/mastodon/locales/bn.json383
-rw-r--r--app/javascript/mastodon/locales/ca.json10
-rw-r--r--app/javascript/mastodon/locales/co.json32
-rw-r--r--app/javascript/mastodon/locales/cs.json18
-rw-r--r--app/javascript/mastodon/locales/cy.json8
-rw-r--r--app/javascript/mastodon/locales/da.json32
-rw-r--r--app/javascript/mastodon/locales/de.json54
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json117
-rw-r--r--app/javascript/mastodon/locales/el.json10
-rw-r--r--app/javascript/mastodon/locales/en.json3
-rw-r--r--app/javascript/mastodon/locales/eo.json12
-rw-r--r--app/javascript/mastodon/locales/es.json8
-rw-r--r--app/javascript/mastodon/locales/eu.json8
-rw-r--r--app/javascript/mastodon/locales/fa.json38
-rw-r--r--app/javascript/mastodon/locales/fi.json8
-rw-r--r--app/javascript/mastodon/locales/fr.json8
-rw-r--r--app/javascript/mastodon/locales/gl.json12
-rw-r--r--app/javascript/mastodon/locales/he.json8
-rw-r--r--app/javascript/mastodon/locales/hr.json8
-rw-r--r--app/javascript/mastodon/locales/hu.json8
-rw-r--r--app/javascript/mastodon/locales/hy.json8
-rw-r--r--app/javascript/mastodon/locales/id.json8
-rw-r--r--app/javascript/mastodon/locales/io.json8
-rw-r--r--app/javascript/mastodon/locales/it.json8
-rw-r--r--app/javascript/mastodon/locales/ja.json26
-rw-r--r--app/javascript/mastodon/locales/ka.json8
-rw-r--r--app/javascript/mastodon/locales/kk.json30
-rw-r--r--app/javascript/mastodon/locales/ko.json48
-rw-r--r--app/javascript/mastodon/locales/lv.json8
-rw-r--r--app/javascript/mastodon/locales/ms.json8
-rw-r--r--app/javascript/mastodon/locales/nl.json8
-rw-r--r--app/javascript/mastodon/locales/no.json8
-rw-r--r--app/javascript/mastodon/locales/oc.json28
-rw-r--r--app/javascript/mastodon/locales/pl.json8
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json8
-rw-r--r--app/javascript/mastodon/locales/pt.json8
-rw-r--r--app/javascript/mastodon/locales/ro.json8
-rw-r--r--app/javascript/mastodon/locales/ru.json8
-rw-r--r--app/javascript/mastodon/locales/sk.json30
-rw-r--r--app/javascript/mastodon/locales/sl.json8
-rw-r--r--app/javascript/mastodon/locales/sq.json8
-rw-r--r--app/javascript/mastodon/locales/sr-Latn.json8
-rw-r--r--app/javascript/mastodon/locales/sr.json8
-rw-r--r--app/javascript/mastodon/locales/sv.json8
-rw-r--r--app/javascript/mastodon/locales/ta.json8
-rw-r--r--app/javascript/mastodon/locales/te.json38
-rw-r--r--app/javascript/mastodon/locales/th.json514
-rw-r--r--app/javascript/mastodon/locales/tr.json8
-rw-r--r--app/javascript/mastodon/locales/uk.json8
-rw-r--r--app/javascript/mastodon/locales/whitelist_bn.json2
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json8
-rw-r--r--app/javascript/mastodon/locales/zh-HK.json8
-rw-r--r--app/javascript/mastodon/locales/zh-TW.json392
-rw-r--r--app/javascript/mastodon/reducers/identity_proofs.js25
-rw-r--r--app/javascript/mastodon/reducers/index.js2
-rw-r--r--app/javascript/mastodon/reducers/timelines.js9
-rw-r--r--app/javascript/styles/mastodon/admin.scss5
-rw-r--r--app/javascript/styles/mastodon/components.scss342
-rw-r--r--app/javascript/styles/mastodon/containers.scss9
-rw-r--r--app/javascript/styles/mastodon/emoji_picker.scss25
-rw-r--r--app/javascript/styles/mastodon/forms.scss45
-rw-r--r--app/javascript/styles/mastodon/stream_entries.scss6
-rw-r--r--app/javascript/styles/mastodon/widgets.scss1
-rw-r--r--app/lib/activitypub/activity/announce.rb4
-rw-r--r--app/lib/activitypub/activity/create.rb10
-rw-r--r--app/lib/activitypub/activity/update.rb4
-rw-r--r--app/lib/activitypub/adapter.rb76
-rw-r--r--app/lib/activitypub/serializer.rb30
-rw-r--r--app/lib/formatter.rb4
-rw-r--r--app/lib/language_detector.rb4
-rw-r--r--app/lib/proof_provider/keybase.rb6
-rw-r--r--app/lib/proof_provider/keybase/config_serializer.rb9
-rw-r--r--app/lib/proof_provider/keybase/verifier.rb6
-rw-r--r--app/models/account.rb2
-rw-r--r--app/models/account_identity_proof.rb2
-rw-r--r--app/models/follow_request.rb2
-rw-r--r--app/models/form/admin_settings.rb149
-rw-r--r--app/models/instance.rb6
-rw-r--r--app/models/notification.rb2
-rw-r--r--app/models/status.rb19
-rw-r--r--app/models/user.rb12
-rw-r--r--app/presenters/account_relationships_presenter.rb6
-rw-r--r--app/presenters/instance_presenter.rb1
-rw-r--r--app/serializers/activitypub/accept_follow_serializer.rb2
-rw-r--r--app/serializers/activitypub/activity_serializer.rb2
-rw-r--r--app/serializers/activitypub/actor_serializer.rb35
-rw-r--r--app/serializers/activitypub/add_serializer.rb2
-rw-r--r--app/serializers/activitypub/block_serializer.rb2
-rw-r--r--app/serializers/activitypub/collection_serializer.rb2
-rw-r--r--app/serializers/activitypub/delete_actor_serializer.rb2
-rw-r--r--app/serializers/activitypub/delete_serializer.rb6
-rw-r--r--app/serializers/activitypub/emoji_serializer.rb4
-rw-r--r--app/serializers/activitypub/flag_serializer.rb2
-rw-r--r--app/serializers/activitypub/follow_serializer.rb2
-rw-r--r--app/serializers/activitypub/image_serializer.rb4
-rw-r--r--app/serializers/activitypub/like_serializer.rb2
-rw-r--r--app/serializers/activitypub/note_serializer.rb29
-rw-r--r--app/serializers/activitypub/public_key_serializer.rb4
-rw-r--r--app/serializers/activitypub/reject_follow_serializer.rb2
-rw-r--r--app/serializers/activitypub/remove_serializer.rb2
-rw-r--r--app/serializers/activitypub/undo_announce_serializer.rb2
-rw-r--r--app/serializers/activitypub/undo_block_serializer.rb2
-rw-r--r--app/serializers/activitypub/undo_follow_serializer.rb2
-rw-r--r--app/serializers/activitypub/undo_like_serializer.rb2
-rw-r--r--app/serializers/activitypub/update_poll_serializer.rb4
-rw-r--r--app/serializers/activitypub/update_serializer.rb2
-rw-r--r--app/serializers/activitypub/vote_serializer.rb4
-rw-r--r--app/serializers/manifest_serializer.rb2
-rw-r--r--app/serializers/oembed_serializer.rb1
-rw-r--r--app/serializers/rest/identity_proof_serializer.rb17
-rw-r--r--app/serializers/rest/relationship_serializer.rb6
-rw-r--r--app/serializers/rest/status_serializer.rb2
-rw-r--r--app/services/activitypub/fetch_remote_poll_service.rb1
-rw-r--r--app/services/activitypub/process_account_service.rb28
-rw-r--r--app/services/activitypub/process_poll_service.rb6
-rw-r--r--app/services/post_status_service.rb2
-rw-r--r--app/services/vote_service.rb4
-rw-r--r--app/validators/existing_username_validator.rb20
-rw-r--r--app/validators/html_validator.rb18
-rw-r--r--app/views/about/_registration.html.haml29
-rw-r--r--app/views/admin/dashboard/index.html.haml94
-rw-r--r--app/views/admin/instances/index.html.haml2
-rw-r--r--app/views/admin/settings/edit.html.haml1
-rw-r--r--app/views/relationships/show.html.haml7
-rw-r--r--app/views/settings/identity_proofs/new.html.haml5
-rw-r--r--app/views/stream_entries/_detailed_status.html.haml6
-rw-r--r--app/views/stream_entries/_simple_status.html.haml6
-rw-r--r--app/workers/activitypub/distribute_poll_update_worker.rb4
-rw-r--r--config/initializers/active_model_serializers.rb19
-rw-r--r--config/initializers/omniauth.rb2
-rw-r--r--config/locales/activerecord.ca.yml3
-rw-r--r--config/locales/activerecord.co.yml4
-rw-r--r--config/locales/activerecord.cs.yml4
-rw-r--r--config/locales/activerecord.da.yml3
-rw-r--r--config/locales/activerecord.de.yml3
-rw-r--r--config/locales/activerecord.el.yml3
-rw-r--r--config/locales/activerecord.en.yml5
-rw-r--r--config/locales/activerecord.fa.yml3
-rw-r--r--config/locales/activerecord.gl.yml3
-rw-r--r--config/locales/activerecord.oc.yml3
-rw-r--r--config/locales/activerecord.sk.yml3
-rw-r--r--config/locales/activerecord.th.yml4
-rw-r--r--config/locales/activerecord.zh_Hant.yml15
-rw-r--r--config/locales/bn.yml125
-rw-r--r--config/locales/ca.yml41
-rw-r--r--config/locales/co.yml69
-rw-r--r--config/locales/cs.yml92
-rw-r--r--config/locales/da.yml45
-rw-r--r--config/locales/de.yml84
-rw-r--r--config/locales/devise.ca.yml3
-rw-r--r--config/locales/devise.co.yml3
-rw-r--r--config/locales/devise.cs.yml2
-rw-r--r--config/locales/devise.de.yml3
-rw-r--r--config/locales/devise.el.yml3
-rw-r--r--config/locales/devise.fa.yml3
-rw-r--r--config/locales/devise.gl.yml3
-rw-r--r--config/locales/devise.ja.yml2
-rw-r--r--config/locales/devise.oc.yml3
-rw-r--r--config/locales/devise.sk.yml6
-rw-r--r--config/locales/devise.sl.yml17
-rw-r--r--config/locales/devise.th.yml2
-rw-r--r--config/locales/devise.zh-CN.yml2
-rw-r--r--config/locales/devise.zh-TW.yml110
-rw-r--r--config/locales/el.yml62
-rw-r--r--config/locales/en.yml15
-rw-r--r--config/locales/en_GB.yml1056
-rw-r--r--config/locales/eo.yml6
-rw-r--r--config/locales/es.yml4
-rw-r--r--config/locales/fa.yml66
-rw-r--r--config/locales/gl.yml57
-rw-r--r--config/locales/ja.yml10
-rw-r--r--config/locales/ko.yml81
-rw-r--r--config/locales/oc.yml38
-rw-r--r--config/locales/pt-BR.yml4
-rw-r--r--config/locales/simple_form.cs.yml4
-rw-r--r--config/locales/simple_form.en_GB.yml133
-rw-r--r--config/locales/simple_form.fa.yml27
-rw-r--r--config/locales/simple_form.ko.yml10
-rw-r--r--config/locales/simple_form.th.yml150
-rw-r--r--config/locales/simple_form.zh-TW.yml136
-rw-r--r--config/locales/sk.yml23
-rw-r--r--config/locales/sl.yml6
-rw-r--r--config/locales/th.yml680
-rw-r--r--config/locales/zh-CN.yml2
-rw-r--r--config/locales/zh-TW.yml251
-rw-r--r--config/navigation.rb4
-rw-r--r--config/routes.rb1
-rw-r--r--config/webpack/rules/node_modules.js11
-rw-r--r--dist/nginx.conf1
-rw-r--r--lib/cli.rb77
-rw-r--r--lib/mastodon/search_cli.rb22
-rw-r--r--lib/mastodon/version.rb6
-rw-r--r--package.json2
-rw-r--r--spec/controllers/admin/settings_controller_spec.rb4
-rw-r--r--spec/controllers/settings/identity_proofs_controller_spec.rb57
-rw-r--r--spec/lib/activitypub/activity/create_spec.rb4
-rw-r--r--spec/lib/activitypub/adapter_spec.rb88
-rw-r--r--spec/services/activitypub/process_account_service_spec.rb45
-rw-r--r--yarn.lock9
274 files changed, 6715 insertions, 3014 deletions
diff --git a/.rubocop.yml b/.rubocop.yml
index 59e8a757a..f1095e022 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -80,7 +80,7 @@ Rails/HttpStatus:
 Rails/Exit:
   Exclude:
     - 'lib/mastodon/*'
-    - 'lib/cli'
+    - 'lib/cli.rb'
 
 Style/ClassAndModuleChildren:
   Enabled: false
diff --git a/AUTHORS.md b/AUTHORS.md
index 3171214e0..8d3aaf480 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -6,8 +6,8 @@ and provided thanks to the work of the following contributors:
 
 * [Gargron](https://github.com/Gargron)
 * [ykzts](https://github.com/ykzts)
-* [akihikodaki](https://github.com/akihikodaki)
 * [ThibG](https://github.com/ThibG)
+* [akihikodaki](https://github.com/akihikodaki)
 * [mjankowski](https://github.com/mjankowski)
 * [dependabot[bot]](https://github.com/apps/dependabot)
 * [unarist](https://github.com/unarist)
@@ -27,14 +27,14 @@ and provided thanks to the work of the following contributors:
 * [blackle](https://github.com/blackle)
 * [Quent-in](https://github.com/Quent-in)
 * [JantsoP](https://github.com/JantsoP)
-* [mabkenar](https://github.com/mabkenar)
 * [Kjwon15](https://github.com/Kjwon15)
+* [mabkenar](https://github.com/mabkenar)
 * [nullkal](https://github.com/nullkal)
 * [yookoala](https://github.com/yookoala)
 * [shuheiktgw](https://github.com/shuheiktgw)
 * [ashfurrow](https://github.com/ashfurrow)
-* [Quenty31](https://github.com/Quenty31)
 * [zunda](https://github.com/zunda)
+* [Quenty31](https://github.com/Quenty31)
 * [eramdam](https://github.com/eramdam)
 * [takayamaki](https://github.com/takayamaki)
 * [masarakki](https://github.com/masarakki)
@@ -45,8 +45,8 @@ and provided thanks to the work of the following contributors:
 * [stephenburgess8](https://github.com/stephenburgess8)
 * [Wonderfall](https://github.com/Wonderfall)
 * [matteoaquila](https://github.com/matteoaquila)
-* [rkarabut](https://github.com/rkarabut)
 * [yukimochi](https://github.com/yukimochi)
+* [rkarabut](https://github.com/rkarabut)
 * [Artoria2e5](https://github.com/Artoria2e5)
 * [nightpool](https://github.com/nightpool)
 * [marrus-sh](https://github.com/marrus-sh)
@@ -64,11 +64,14 @@ and provided thanks to the work of the following contributors:
 * [MaciekBaron](https://github.com/MaciekBaron)
 * [MitarashiDango](mailto:mitarashidango@users.noreply.github.com)
 * [beatrix-bitrot](https://github.com/beatrix-bitrot)
+* [Aditoo17](https://github.com/Aditoo17)
 * [adbelle](https://github.com/adbelle)
 * [evanminto](https://github.com/evanminto)
 * [MightyPork](https://github.com/MightyPork)
 * [yhirano55](https://github.com/yhirano55)
+* [rinsuki](https://github.com/rinsuki)
 * [camponez](https://github.com/camponez)
+* [hinaloe](https://github.com/hinaloe)
 * [SerCom-KC](https://github.com/SerCom-KC)
 * [aschmitz](https://github.com/aschmitz)
 * [devkral](https://github.com/devkral)
@@ -81,10 +84,8 @@ and provided thanks to the work of the following contributors:
 * [lindwurm](https://github.com/lindwurm)
 * [victorhck](mailto:victorhck@geeko.site)
 * [voidsatisfaction](https://github.com/voidsatisfaction)
-* [rinsuki](https://github.com/rinsuki)
 * [hikari-no-yume](https://github.com/hikari-no-yume)
 * [angristan](https://github.com/angristan)
-* [hinaloe](https://github.com/hinaloe)
 * [seefood](https://github.com/seefood)
 * [jackjennings](https://github.com/jackjennings)
 * [spla](mailto:spla@mastodont.cat)
@@ -102,9 +103,10 @@ and provided thanks to the work of the following contributors:
 * [victorhck](https://github.com/victorhck)
 * [kedamaDQ](https://github.com/kedamaDQ)
 * [puckipedia](https://github.com/puckipedia)
+* [trwnh](https://github.com/trwnh)
 * [fvh-P](https://github.com/fvh-P)
-* [contraexemplo](https://github.com/contraexemplo)
-* [Aditoo17](https://github.com/Aditoo17)
+* [Anna e só](mailto:contraexemplos@gmail.com)
+* [BenLubar](https://github.com/BenLubar)
 * [kazu9su](https://github.com/kazu9su)
 * [Komic](https://github.com/Komic)
 * [lmorchard](https://github.com/lmorchard)
@@ -117,7 +119,6 @@ and provided thanks to the work of the following contributors:
 * [goofy-bz](mailto:goofy@babelzilla.org)
 * [kadiix](https://github.com/kadiix)
 * [kodacs](https://github.com/kodacs)
-* [trwnh](https://github.com/trwnh)
 * [JMendyk](https://github.com/JMendyk)
 * [KScl](https://github.com/KScl)
 * [sterdev](https://github.com/sterdev)
@@ -133,6 +134,7 @@ and provided thanks to the work of the following contributors:
 * [Reverite](https://github.com/Reverite)
 * [JohnD28](https://github.com/JohnD28)
 * [znz](https://github.com/znz)
+* [marek-lach](https://github.com/marek-lach)
 * [Naouak](https://github.com/Naouak)
 * [pawelngei](https://github.com/pawelngei)
 * [rtucker](https://github.com/rtucker)
@@ -150,7 +152,6 @@ and provided thanks to the work of the following contributors:
 * [178inaba](https://github.com/178inaba)
 * [alyssais](https://github.com/alyssais)
 * [hiphref](https://github.com/hiphref)
-* [BenLubar](https://github.com/BenLubar)
 * [stalker314314](https://github.com/stalker314314)
 * [huertanix](https://github.com/huertanix)
 * [genesixx](https://github.com/genesixx)
@@ -161,16 +162,16 @@ and provided thanks to the work of the following contributors:
 * [kmichl](https://github.com/kmichl)
 * [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name)
 * [saper](https://github.com/saper)
-* [marek-lach](https://github.com/marek-lach)
 * [nevillepark](https://github.com/nevillepark)
 * [ornithocoder](https://github.com/ornithocoder)
 * [pierreozoux](https://github.com/pierreozoux)
 * [qguv](https://github.com/qguv)
 * [Ram Lmn](mailto:ramlmn@users.noreply.github.com)
+* [sascha-sl](https://github.com/sascha-sl)
 * [harukasan](https://github.com/harukasan)
 * [stamak](https://github.com/stamak)
 * [Technowix](mailto:technowix@users.noreply.github.com)
-* [Eychics](https://github.com/Eychics)
+* [Zoeille](https://github.com/Zoeille)
 * [Thor Harald Johansen](mailto:thj@thj.no)
 * [0x70b1a5](https://github.com/0x70b1a5)
 * [gled-rs](https://github.com/gled-rs)
@@ -244,9 +245,9 @@ and provided thanks to the work of the following contributors:
 * [raymestalez](https://github.com/raymestalez)
 * [remram44](https://github.com/remram44)
 * [sts10](https://github.com/sts10)
-* [sascha-sl](https://github.com/sascha-sl)
 * [u1-liquid](https://github.com/u1-liquid)
 * [sim6](https://github.com/sim6)
+* [Sir-Boops](https://github.com/Sir-Boops)
 * [stemid](https://github.com/stemid)
 * [sumdog](https://github.com/sumdog)
 * [ThomasLeister](https://github.com/ThomasLeister)
@@ -316,8 +317,11 @@ and provided thanks to the work of the following contributors:
 * [Andreas Drop](mailto:andy@remline.de)
 * [andi1984](https://github.com/andi1984)
 * [schas002](https://github.com/schas002)
+* [contraexemplo](https://github.com/contraexemplo)
 * [abackstrom](https://github.com/abackstrom)
+* [armandfardeau](https://github.com/armandfardeau)
 * [jumbosushi](https://github.com/jumbosushi)
+* [aurelien-reeves](https://github.com/aurelien-reeves)
 * [ayumin](https://github.com/ayumin)
 * [BaptisteGelez](https://github.com/BaptisteGelez)
 * [bzg](https://github.com/bzg)
@@ -335,7 +339,7 @@ and provided thanks to the work of the following contributors:
 * [Motoma](https://github.com/Motoma)
 * [chriswk](https://github.com/chriswk)
 * [csu](https://github.com/csu)
-* [clarcharr](https://github.com/clarcharr)
+* [clarfon](https://github.com/clarfon)
 * [kklleemm](https://github.com/kklleemm)
 * [colindean](https://github.com/colindean)
 * [dachinat](https://github.com/dachinat)
@@ -358,6 +362,7 @@ and provided thanks to the work of the following contributors:
 * [eai04191](https://github.com/eai04191)
 * [d3vgru](https://github.com/d3vgru)
 * [Elizafox](https://github.com/Elizafox)
+* [enewhuis](https://github.com/enewhuis)
 * [ericblade](https://github.com/ericblade)
 * [mikoim](https://github.com/mikoim)
 * [espenronnevik](https://github.com/espenronnevik)
@@ -446,6 +451,7 @@ and provided thanks to the work of the following contributors:
 * [mouse-reeve](https://github.com/mouse-reeve)
 * [Mozinet-fr](https://github.com/Mozinet-fr)
 * [lae](https://github.com/lae)
+* [nosada](https://github.com/nosada)
 * [Nanamachi](https://github.com/Nanamachi)
 * [orinthe](https://github.com/orinthe)
 * [NecroTechno](https://github.com/NecroTechno)
@@ -462,10 +468,11 @@ and provided thanks to the work of the following contributors:
 * [noppa](https://github.com/noppa)
 * [Otakan951](https://github.com/Otakan951)
 * [fahy](https://github.com/fahy)
-* [PatrickRWells](https://github.com/PatrickRWells)
-* [Pangoraw](https://github.com/Pangoraw)
-* [peterkeen](https://github.com/peterkeen)
-* [pgate](https://github.com/pgate)
+* [PatrickRWells](mailto:32802366+patrickrwells@users.noreply.github.com)
+* [Paul](mailto:naydex.mc+github@gmail.com)
+* [Pete Keen](mailto:pete@petekeen.net)
+* [Pierre-Morgan Gate](mailto:pgate@users.noreply.github.com)
+* [Ratmir Karabut](mailto:rkarabut@sfmodern.ru)
 * [Reto Kromer](mailto:retokromer@users.noreply.github.com)
 * [Rey Tucker](mailto:git@reytucker.us)
 * [Rob Watson](mailto:rfwatson@users.noreply.github.com)
@@ -488,7 +495,6 @@ and provided thanks to the work of the following contributors:
 * [Sho Kusano](mailto:rosylilly@aduca.org)
 * [Shouko Yu](mailto:imshouko@gmail.com)
 * [Sina Mashek](mailto:sina@mashek.xyz)
-* [Sir-Boops](mailto:admin@boops.me)
 * [Soshi Kato](mailto:mail@sossii.com)
 * [Spanky](mailto:2788886+spankyworks@users.noreply.github.com)
 * [Stanislas](mailto:angristan@pm.me)
@@ -555,12 +561,14 @@ and provided thanks to the work of the following contributors:
 * [karlyeurl](mailto:karl.yeurl@gmail.com)
 * [kedama](mailto:32974885+kedamadq@users.noreply.github.com)
 * [kodai](mailto:shirafuta.kodai@gmail.com)
+* [koyu](mailto:me@koyu.space)
 * [kuro5hin](mailto:rusty@kuro5hin.org)
 * [luzpaz](mailto:luzpaz@users.noreply.github.com)
 * [maxypy](mailto:maxime@mpigou.fr)
 * [mhe](mailto:mail@marcus-herrmann.com)
 * [mike castleman](mailto:m@mlcastle.net)
 * [mimikun](mailto:dzdzble_effort_311@outlook.jp)
+* [mohemohe](mailto:mohemohe@users.noreply.github.com)
 * [mshrtkch](mailto:mshrtkch@users.noreply.github.com)
 * [muan](mailto:muan@github.com)
 * [namelessGonbai](mailto:43787036+namelessgonbai@users.noreply.github.com)
@@ -599,243 +607,338 @@ This document is provided for informational purposes only. Since it is only upda
 
 Following people have contributed to translation of Mastodon:
 
+- **Albanian**
+  - Besnik Bleta
+  - Aditoo
 - **Arabic**
   - ButterflyOfFire
+  - Aditoo
+  - Amrz0
 - **Asturian**
   - ButterflyOfFire
   - Enol P.
+  - Aditoo
 - **Basque**
+  - Osoitz
+  - Aditoo
   - Aitzol
   - ButterflyOfFire
-  - Gorka Azkarate
-  - Osoitz
   - Peru Iparragirre
+  - Gorka Azkarate
+- **Bengali**
+  - dxwc
 - **Bulgarian**
   - ButterflyOfFire
+  - Aditoo
 - **Catalan**
+  - spla
+  - Aditoo
   - ButterflyOfFire
   - Joan Montané
   - Jose Luis
-  - spla
 - **Chinese (Hong Kong)**
   - ButterflyOfFire
   - Luzi Leung
+  - Aditoo
 - **Chinese (Simplified)**
   - Allen Zhong
   - ButterflyOfFire
   - SerCom_KC
+  - martialarts
+  - Kaitian Xie
+  - Aditoo
+  - pan93412
 - **Chinese (Traditional)**
+  - Aditoo
   - ButterflyOfFire
   - James58899
-  - Jeff Huang
+  - pan93412
   - S1ttidoe477
   - SHA265
+  - Jeff Huang
 - **Corsican**
   - Alix D. R.
+  - Aditoo
   - ButterflyOfFire
 - **Croatian**
   - ButterflyOfFire
+  - Aditoo
 - **Czech**
-  - ButterflyOfFire
-  - Lorem Ipsum
+  - Aditoo
   - Marek Ľach
-- **Danish**
   - ButterflyOfFire
+- **Danish**
+  - Einhjeriar
   - Rasmus Sæderup
+  - Aditoo
+  - ButterflyOfFire
 - **Dutch**
+  - Albakham
   - ButterflyOfFire
-  - Jelv
   - jeroenpraat
   - rscmbbng
+  - Aditoo
+  - Jelv
 - **English**
   - ButterflyOfFire
   - Renato "Lond" Cerqueira
+- **English (United Kingdom)**
+  - Albakham
 - **Esperanto**
+  - Aditoo
   - ButterflyOfFire
+  - Becci Cat
   - Jeong Arm
-  - Martin Bodin
   - Mélanie Chauvel
   - Vanege
+  - Martin Bodin
   - tuxayo/Victor Grousset
 - **Finnish**
   - ButterflyOfFire
-  - Jonne Arjoranta
-  - S Heija
+  - Mikko Poussu
   - Taru Luojola
+  - S Heija
+  - Aditoo
+  - Jonne Arjoranta
 - **French**
-  - Alda Marteau-Hardi
+  - Albakham
   - Alix D. R.
-  - Baptiste Jonglez
   - ButterflyOfFire
-  - Franck Paul
-  - Jean-Baptiste Holcroft
-  - Jonathan Chan
-  - Letiteuf55
-  - Martin Bodin
+  - codl
+  - Leia
+  - Alda Marteau-Hardi
   - Mélanie Chauvel
-  - Olivier Humbert
   - Paul Marques Mota
-  - Sylvhem
+  - azenet
+  - Olivier Humbert
+  - Aditoo
+  - Jonathan Chan
+  - Letiteuf55
+  - Baptiste Jonglez
+  - goofy-mdn
+  - Jean-Baptiste Holcroft
   - Technowix
-  - Thibaut Girka
+  - Martin Bodin
   - Théodore
-  - azenet
-  - codl
+  - Thibaut Girka
+  - Franck Paul
+  - Sylvhem
 - **Galician**
   - ButterflyOfFire
   - Xose M.
+  - Aditoo
   - manequim
 - **Georgian**
   - ButterflyOfFire
+  - Aditoo
 - **German**
-  - Benedikt Geißler
+  - Aditoo
   - ButterflyOfFire
   - Daniel
-  - Eugen Rochko
-  - Koyu Berteon
-  - Patrick Figel
-  - Weblate Admin
   - averageunicorn
-  - ePirat
-  - koyu
+  - Koyu Berteon
   - larsreineke
+  - koyu
+  - Austin Jones
   - lilo
+  - Benedikt Geißler
+  - ePirat
+  - Eugen Rochko
+  - Weblate Admin
+  - Patrick Figel
 - **Greek**
+  - Dimitris Maroulidis
   - Antonis
+  - Aditoo
   - ButterflyOfFire
-  - Dimitris Maroulidis
   - Konstantinos Grevenitis
 - **Hebrew**
   - ButterflyOfFire
+  - Aditoo
   - Ira
   - Yaron Shahrabani
 - **Hungarian**
-  - Adam Paszternak
   - ButterflyOfFire
+  - Adam Paszternak
+  - Aditoo
   - Tibike Miklós
 - **Ido**
   - ButterflyOfFire
+  - Aditoo
 - **Indonesian**
-  - Alfiana Sibuea
+  - afachri
   - ButterflyOfFire
   - Dito Kurnia Pratama
   - Eirworks
-  - afachri
+  - Aditoo
+  - Alfiana Sibuea
   - se7entime
+- **Irish**
+  - Albakham
+  - Kevin Houlihan
 - **Italian**
   - Alessandro Levati
+  - Albakham
   - ButterflyOfFire
+  - Marcin Mikołajczak
+  - Aditoo
   - Giuseppe Pignataro
   - Stefano
 - **Japanese**
-  - ButterflyOfFire
-  - Kumasun Morino
-  - Yamagishi Kazutoshi
+  - Hinaloe
+  - 小鳥遊まりあ
   - mayaeh
   - osapon
-  - unarist
-  - 小鳥遊まりあ
   - 森の子リスのミーコの大冒険
-- **Korean**
+  - Kumasun Morino
+  - Yamagishi Kazutoshi
+  - Aditoo
   - ButterflyOfFire
   - Jeong Arm
+  - unarist
+- **Kazakh**
+  - arshat
+  - Aditoo
+- **Korean**
+  - Aditoo
+  - Jeong Arm
+  - ButterflyOfFire
   - Minori Hiraoka
   - Yamagishi Kazutoshi
+- **Lithuanian**
+  - Sarunas Medeikis
 - **Malay**
-  - ButterflyOfFire
   - Muhammad Nur Hidayat (MNH48)
+  - Aditoo
+  - ButterflyOfFire
 - **Norwegian (old code)**
   - ButterflyOfFire
   - Espen Rønnevik
+  - Aditoo
   - Tale
 - **Occitan**
+  - Aditoo
   - ButterflyOfFire
-  - Maxenç
   - Quenti2
   - Quentí
+  - Maxenç
 - **Persian**
-  - ButterflyOfFire
   - Masoud Abkenar
+  - Aditoo
+  - ButterflyOfFire
 - **Polish**
+  - Aditoo
+  - Albakham
   - ButterflyOfFire
-  - Jakub Mendyk
+  - Stasiek Michalski
   - Marcin Mikołajczak
+  - Jakub Mendyk
   - Marek Ľach
-  - Stasiek Michalski
   - krkk
 - **Portuguese**
+  - Albakham
+  - João Pinheiro
+  - manequim
+  - Aditoo
   - ButterflyOfFire
   - Hugo Gameiro
-  - manequim
 - **Portuguese (Brazil)**
-  - André Andrade
+  - Aditoo
+  - Albakham
   - Anna e só
-  - ButterflyOfFire
   - Renato "Lond" Cerqueira
-- **Romanian**
+  - André Andrade
   - ButterflyOfFire
+- **Romanian**
   - adrianbblk
+  - ButterflyOfFire
+  - Aditoo
 - **Russian**
-  - Andrew Zyabin
+  - Albakham
   - ButterflyOfFire
   - Evgeny Petrov
+  - Aditoo
+  - Павел Гастелло
+  - Andrew Zyabin
   - Yaron Shahrabani
 - **Serbian**
   - Branko Kokanovic
   - Burekz Finezt
+  - Aditoo
   - ButterflyOfFire
 - **Serbian (latin)**
   - ButterflyOfFire
+  - Aditoo
 - **Slovak**
+  - Aditoo
   - ButterflyOfFire
   - Ivan Pleva
-  - Lorem Ipsum
   - Marek Ľach
   - Peter
 - **Slovenian**
-  - ButterflyOfFire
   - Kristijan Tkalec
+  - Aditoo
+  - ButterflyOfFire
 - **Spanish**
-  - Angeles Broullón
-  - Antón López
+  - Albakham
   - ButterflyOfFire
   - Carlos Mondragon
+  - Antón López
+  - Max Winkler
+  - Pablo de la Concepción Sanz
+  - Sergio Soriano
+  - Angeles Broullón
+  - Lothar Wolf
+  - Aditoo
   - David Charte
   - Emmanuel
-  - Lothar Wolf
-  - Pablo de la Concepción Sanz
 - **Swedish**
   - ButterflyOfFire
-  - Elias Mårtenson
   - Isak Holmström
   - Shellkr
+  - Aditoo
+  - Elias Mårtenson
   - Stefan Midjich
   - Tim Stahel
+  - Jonas Hultén
 - **Telugu**
+  - avndp
+  - Ranjith Tellakula
+  - Aditoo
   - ButterflyOfFire
   - Joseph Nuthalapati
-  - Ranjith Tellakula
-  - avndp
 - **Thai**
   - ButterflyOfFire
+  - parnikkapore
+  - Thai Localization
+  - Aditoo
 - **Turkish**
+  - Ali Demirtas
   - ButterflyOfFire
+  - Aditoo
 - **Ukrainian**
+  - alexcleac
   - ButterflyOfFire
+  - Aditoo
   - Ivan Verchenko
-  - alexcleac
 - **Welsh**
-  - ButterflyOfFire
+  - carl morris
   - Jaz-Michael King
-  - Kevin Beynon
   - Owain Rhys Lewis
-  - Renato "Lond" Cerqueira
   - Rhoslyn Prys
-  - carl morris
+  - Aditoo
+  - ButterflyOfFire
+  - Renato "Lond" Cerqueira
+  - Albakham
+  - Kevin Beynon
 - **Armenian**
+  - Aditoo
   - ButterflyOfFire
 - **Latvian**
+  - Aditoo
   - ButterflyOfFire
+  - Maigonis
 - **Tamil**
+  - Aditoo
   - ButterflyOfFire
   - Prasanna Venkadesh
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7b10adbbf..91e66c400 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,79 @@ Changelog
 
 All notable changes to this project will be documented in this file.
 
+## [Unreleased]
+### Added
+
+- Add polls ([Gargron](https://github.com/tootsuite/mastodon/pull/10111), [ThibG](https://github.com/tootsuite/mastodon/pull/10155), [Gargron](https://github.com/tootsuite/mastodon/pull/10184), [ThibG](https://github.com/tootsuite/mastodon/pull/10196), [Gargron](https://github.com/tootsuite/mastodon/pull/10248), [ThibG](https://github.com/tootsuite/mastodon/pull/10255), [ThibG](https://github.com/tootsuite/mastodon/pull/10322), [Gargron](https://github.com/tootsuite/mastodon/pull/10138), [Gargron](https://github.com/tootsuite/mastodon/pull/10139), [Gargron](https://github.com/tootsuite/mastodon/pull/10144), [Gargron](https://github.com/tootsuite/mastodon/pull/10145),[Gargron](https://github.com/tootsuite/mastodon/pull/10146), [Gargron](https://github.com/tootsuite/mastodon/pull/10148), [Gargron](https://github.com/tootsuite/mastodon/pull/10151), [ThibG](https://github.com/tootsuite/mastodon/pull/10150), [Gargron](https://github.com/tootsuite/mastodon/pull/10168), [Gargron](https://github.com/tootsuite/mastodon/pull/10165), [Gargron](https://github.com/tootsuite/mastodon/pull/10172), [Gargron](https://github.com/tootsuite/mastodon/pull/10170), [Gargron](https://github.com/tootsuite/mastodon/pull/10171), [Gargron](https://github.com/tootsuite/mastodon/pull/10186), [Gargron](https://github.com/tootsuite/mastodon/pull/10189), [ThibG](https://github.com/tootsuite/mastodon/pull/10200), [rinsuki](https://github.com/tootsuite/mastodon/pull/10203), [Gargron](https://github.com/tootsuite/mastodon/pull/10213), [Gargron](https://github.com/tootsuite/mastodon/pull/10246), [Gargron](https://github.com/tootsuite/mastodon/pull/10265), [Gargron](https://github.com/tootsuite/mastodon/pull/10261), [ThibG](https://github.com/tootsuite/mastodon/pull/10333), [Gargron](https://github.com/tootsuite/mastodon/pull/10352), [ThibG](https://github.com/tootsuite/mastodon/pull/10140), [ThibG](https://github.com/tootsuite/mastodon/pull/10142), [ThibG](https://github.com/tootsuite/mastodon/pull/10141), [ThibG](https://github.com/tootsuite/mastodon/pull/10162), [ThibG](https://github.com/tootsuite/mastodon/pull/10161), [ThibG](https://github.com/tootsuite/mastodon/pull/10158), [ThibG](https://github.com/tootsuite/mastodon/pull/10156), [ThibG](https://github.com/tootsuite/mastodon/pull/10160), [Gargron](https://github.com/tootsuite/mastodon/pull/10185), [Gargron](https://github.com/tootsuite/mastodon/pull/10188), [ThibG](https://github.com/tootsuite/mastodon/pull/10195), [ThibG](https://github.com/tootsuite/mastodon/pull/10208), [Gargron](https://github.com/tootsuite/mastodon/pull/10187), [ThibG](https://github.com/tootsuite/mastodon/pull/10214), [ThibG](https://github.com/tootsuite/mastodon/pull/10209))
+- Add follows & followers managing UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10268), [Gargron](https://github.com/tootsuite/mastodon/pull/10308), [Gargron](https://github.com/tootsuite/mastodon/pull/10404), [Gargron](https://github.com/tootsuite/mastodon/pull/10293))
+- Add identity proof integration with Keybase ([Gargron](https://github.com/tootsuite/mastodon/pull/10297), [xgess](https://github.com/tootsuite/mastodon/pull/10375), [Gargron](https://github.com/tootsuite/mastodon/pull/10338), [Gargron](https://github.com/tootsuite/mastodon/pull/10350), [Gargron](https://github.com/tootsuite/mastodon/pull/10414))
+- Add option to overwrite imported data instead of merging ([Gargron](https://github.com/tootsuite/mastodon/pull/9962))
+- Add featured hashtags to profiles ([Gargron](https://github.com/tootsuite/mastodon/pull/9755), [Gargron](https://github.com/tootsuite/mastodon/pull/10167), [Gargron](https://github.com/tootsuite/mastodon/pull/10249), [ThibG](https://github.com/tootsuite/mastodon/pull/10034))
+- Add admission-based registrations mode ([Gargron](https://github.com/tootsuite/mastodon/pull/10250), [ThibG](https://github.com/tootsuite/mastodon/pull/10269), [Gargron](https://github.com/tootsuite/mastodon/pull/10264), [ThibG](https://github.com/tootsuite/mastodon/pull/10321), [Gargron](https://github.com/tootsuite/mastodon/pull/10349))
+- Add support for WebP uploads ([acid-chicken](https://github.com/tootsuite/mastodon/pull/9879))
+- Add "copy link" item to status action bars in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9983))
+- Add list title editing in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9748))
+- Add a "Block & Report" button to the block confirmation dialog in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10360))
+- Add disappointed elephant when the page crashes in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10275))
+- Add ability to upload multiple files at once in web UI ([tmm576](https://github.com/tootsuite/mastodon/pull/9856))
+- Add indication that you have been blocked when viewing profiles in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10420))
+- Add validations to admin settings to catch common mistakes ([Gargron](https://github.com/tootsuite/mastodon/pull/10348), [ThibG](https://github.com/tootsuite/mastodon/pull/10354))
+- Add `type`, `limit`, `offset`, `min_id`, `max_id`, `account_id` to search API ([Gargron](https://github.com/tootsuite/mastodon/pull/10091))
+- Add a preferences API so apps can share basic behaviours ([Gargron](https://github.com/tootsuite/mastodon/pull/10109))
+- Add `visibility` param to reblog REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/9851), [ThibG](https://github.com/tootsuite/mastodon/pull/10302))
+- Add `allowfullscreen` attribute to OEmbed iframe ([rinsuki](https://github.com/tootsuite/mastodon/pull/10370))
+- Add `blocked_by` relationship to the REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/10373))
+- Add `tootctl statuses remove` to sweep unreferenced statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/10063))
+- Add `tootctl search deploy` to avoid ugly rake task syntax ([Gargron](https://github.com/tootsuite/mastodon/pull/10403))
+- Add `tootctl self-destruct` to shut down server gracefully ([Gargron](https://github.com/tootsuite/mastodon/pull/10367))
+- Add option to hide application used to toot ([ThibG](https://github.com/tootsuite/mastodon/pull/9897), [rinsuki](https://github.com/tootsuite/mastodon/pull/9994), [hinaloe](https://github.com/tootsuite/mastodon/pull/10086))
+- Add `DB_SSLMODE` configuration variable ([sascha-sl](https://github.com/tootsuite/mastodon/pull/10210))
+- Add click-to-copy UI to invites page ([Gargron](https://github.com/tootsuite/mastodon/pull/10259))
+- Add self-replies fetching ([ThibG](https://github.com/tootsuite/mastodon/pull/10106), [ThibG](https://github.com/tootsuite/mastodon/pull/10128), [ThibG](https://github.com/tootsuite/mastodon/pull/10175), [ThibG](https://github.com/tootsuite/mastodon/pull/10201))
+
+### Changed
+
+- Change design of landing page ([Gargron](https://github.com/tootsuite/mastodon/pull/10232), [Gargron](https://github.com/tootsuite/mastodon/pull/10260), [ThibG](https://github.com/tootsuite/mastodon/pull/10284), [ThibG](https://github.com/tootsuite/mastodon/pull/10291), [koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/10356), [Gargron](https://github.com/tootsuite/mastodon/pull/10245))
+- Change design of profile column in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10337), [Aditoo17](https://github.com/tootsuite/mastodon/pull/10387), [ThibG](https://github.com/tootsuite/mastodon/pull/10390), [mayaeh](https://github.com/tootsuite/mastodon/pull/10379), [ThibG](https://github.com/tootsuite/mastodon/pull/10411))
+- Change language detector threshold from 140 characters to 4 words ([Gargron](https://github.com/tootsuite/mastodon/pull/10376))
+- Change language detector to always kick in for non-latin alphabets ([Gargron](https://github.com/tootsuite/mastodon/pull/10276))
+- Change icons of features on admin dashboard ([Gargron](https://github.com/tootsuite/mastodon/pull/10366))
+- Change DNS timeouts from 1s to 5s ([ThibG](https://github.com/tootsuite/mastodon/pull/10238))
+- Change Docker image to use Ubuntu with jemalloc ([Sir-Boops](https://github.com/tootsuite/mastodon/pull/10100), [BenLubar](https://github.com/tootsuite/mastodon/pull/10212))
+- Change public pages to be cacheable by proxies ([BenLubar](https://github.com/tootsuite/mastodon/pull/9059))
+- Change the 410 gone response for suspended accounts to be cacheable by proxies ([ThibG](https://github.com/tootsuite/mastodon/pull/10339))
+- Change web UI to not not empty timeline of blocked users on block ([ThibG](https://github.com/tootsuite/mastodon/pull/10359))
+- Change JSON serializer to remove unused `@context` values ([Gargron](https://github.com/tootsuite/mastodon/pull/10378))
+- Change GIFV file size limit to be the same as for other videos ([rinsuki](https://github.com/tootsuite/mastodon/pull/9924))
+- Change Webpack to not use @babel/preset-env to compile node_modules ([ykzts](https://github.com/tootsuite/mastodon/pull/10289))
+- Change web UI to use new Web Share Target API ([gol-cha](https://github.com/tootsuite/mastodon/pull/9963))
+- Change ActivityPub reports to have persistent URIs ([ThibG](https://github.com/tootsuite/mastodon/pull/10303))
+
+### Removed
+
+- Remove zopfli compression to speed up Webpack from 6min to 1min ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10288))
+- Remove stats.json generation to speed up Webpack ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10290))
+
+### Fixed
+
+- Fix public timelines being broken by new toots when they are not mounted in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10131))
+- Fix quick filter settings not being saved when selecting a different filter in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10296))
+- Fix remote interaction dialogs being indexed by search engines ([Gargron](https://github.com/tootsuite/mastodon/pull/10240))
+- Fix maxed-out invites not showing up as expired in UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10274))
+- Fix scrollbar styles on compose textarea ([Gargron](https://github.com/tootsuite/mastodon/pull/10292))
+- Fix timeline merge workers being queued for remote users ([Gargron](https://github.com/tootsuite/mastodon/pull/10355))
+- Fix alternative relay support regression ([Gargron](https://github.com/tootsuite/mastodon/pull/10398))
+- Fix trying to fetch keys of unknown accounts on a self-delete from them ([ThibG](https://github.com/tootsuite/mastodon/pull/10326))
+- Fix CAS `:service_validate_url` option ([enewhuis](https://github.com/tootsuite/mastodon/pull/10328))
+- Fix race conditions when creating backups ([ThibG](https://github.com/tootsuite/mastodon/pull/10234))
+- Fix whitespace not being stripped out of username before validation ([aurelien-reeves](https://github.com/tootsuite/mastodon/pull/10239))
+- Fix n+1 query when deleting status ([Gargron](https://github.com/tootsuite/mastodon/pull/10247))
+- Fix exiting follows not being rejected when suspending a remote account ([ThibG](https://github.com/tootsuite/mastodon/pull/10230))
+- Fix the underlying button element in a disabled icon button not being disabled ([ThibG](https://github.com/tootsuite/mastodon/pull/10194))
+- Fix race condition when streaming out deleted statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10280))
+- Fix performance of admin federation UI by caching account counts ([Gargron](https://github.com/tootsuite/mastodon/pull/10374))
+- Fix JS error on pages that don't define a CSRF token ([hinaloe](https://github.com/tootsuite/mastodon/pull/10383))
+
 ## [2.7.4] - 2019-03-05
 ### Fixed
 
diff --git a/Gemfile b/Gemfile
index 7f90ab5aa..5f0e3ab2c 100644
--- a/Gemfile
+++ b/Gemfile
@@ -6,7 +6,7 @@ ruby '>= 2.4.0', '< 2.7.0'
 gem 'pkg-config', '~> 1.3'
 
 gem 'puma', '~> 3.12'
-gem 'rails', '~> 5.2.2'
+gem 'rails', '~> 5.2.3'
 gem 'thor', '~> 0.20'
 
 gem 'hamlit-rails', '~> 0.2'
@@ -15,7 +15,7 @@ gem 'makara', '~> 0.4'
 gem 'pghero', '~> 2.2'
 gem 'dotenv-rails', '~> 2.7'
 
-gem 'aws-sdk-s3', '~> 1.33', require: false
+gem 'aws-sdk-s3', '~> 1.36', require: false
 gem 'fog-core', '<= 2.1.0'
 gem 'fog-openstack', '~> 0.3', require: false
 gem 'paperclip', '~> 6.0'
@@ -30,7 +30,7 @@ gem 'charlock_holmes', '~> 0.7.6'
 gem 'iso-639'
 gem 'chewy', '~> 5.0'
 gem 'cld3', '~> 3.2.3'
-gem 'devise', '~> 4.5'
+gem 'devise', '~> 4.6'
 gem 'devise-two-factor', '~> 3.0'
 
 group :pam_authentication, optional: true do
@@ -86,7 +86,7 @@ gem 'strong_migrations', '~> 0.3'
 gem 'tty-command', '~> 0.8', require: false
 gem 'tty-prompt', '~> 0.18', require: false
 gem 'twitter-text', '~> 1.14'
-gem 'tzinfo-data', '~> 1.2018'
+gem 'tzinfo-data', '~> 1.2019'
 gem 'webpacker', '~> 4.0'
 gem 'webpush'
 
@@ -108,7 +108,7 @@ group :production, :test do
 end
 
 group :test do
-  gem 'capybara', '~> 3.14'
+  gem 'capybara', '~> 3.16'
   gem 'climate_control', '~> 0.2'
   gem 'faker', '~> 1.9'
   gem 'microformats', '~> 4.1'
diff --git a/Gemfile.lock b/Gemfile.lock
index 5df1dc0ad..620651983 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -15,25 +15,25 @@ GIT
 GEM
   remote: https://rubygems.org/
   specs:
-    actioncable (5.2.2.1)
-      actionpack (= 5.2.2.1)
+    actioncable (5.2.3)
+      actionpack (= 5.2.3)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
-    actionmailer (5.2.2.1)
-      actionpack (= 5.2.2.1)
-      actionview (= 5.2.2.1)
-      activejob (= 5.2.2.1)
+    actionmailer (5.2.3)
+      actionpack (= 5.2.3)
+      actionview (= 5.2.3)
+      activejob (= 5.2.3)
       mail (~> 2.5, >= 2.5.4)
       rails-dom-testing (~> 2.0)
-    actionpack (5.2.2.1)
-      actionview (= 5.2.2.1)
-      activesupport (= 5.2.2.1)
+    actionpack (5.2.3)
+      actionview (= 5.2.3)
+      activesupport (= 5.2.3)
       rack (~> 2.0)
       rack-test (>= 0.6.3)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.0, >= 1.0.2)
-    actionview (5.2.2.1)
-      activesupport (= 5.2.2.1)
+    actionview (5.2.3)
+      activesupport (= 5.2.3)
       builder (~> 3.1)
       erubi (~> 1.4)
       rails-dom-testing (~> 2.0)
@@ -44,20 +44,20 @@ GEM
       case_transform (>= 0.2)
       jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
     active_record_query_trace (1.6.2)
-    activejob (5.2.2.1)
-      activesupport (= 5.2.2.1)
+    activejob (5.2.3)
+      activesupport (= 5.2.3)
       globalid (>= 0.3.6)
-    activemodel (5.2.2.1)
-      activesupport (= 5.2.2.1)
-    activerecord (5.2.2.1)
-      activemodel (= 5.2.2.1)
-      activesupport (= 5.2.2.1)
+    activemodel (5.2.3)
+      activesupport (= 5.2.3)
+    activerecord (5.2.3)
+      activemodel (= 5.2.3)
+      activesupport (= 5.2.3)
       arel (>= 9.0)
-    activestorage (5.2.2.1)
-      actionpack (= 5.2.2.1)
-      activerecord (= 5.2.2.1)
+    activestorage (5.2.3)
+      actionpack (= 5.2.3)
+      activerecord (= 5.2.3)
       marcel (~> 0.3.1)
-    activesupport (5.2.2.1)
+    activesupport (5.2.3)
       concurrent-ruby (~> 1.0, >= 1.0.2)
       i18n (>= 0.7, < 2)
       minitest (~> 5.1)
@@ -76,17 +76,17 @@ GEM
     av (0.9.0)
       cocaine (~> 0.5.3)
     aws-eventstream (1.0.2)
-    aws-partitions (1.144.0)
-    aws-sdk-core (3.48.0)
+    aws-partitions (1.147.0)
+    aws-sdk-core (3.48.3)
       aws-eventstream (~> 1.0, >= 1.0.2)
       aws-partitions (~> 1.0)
       aws-sigv4 (~> 1.1)
       jmespath (~> 1.0)
-    aws-sdk-kms (1.15.0)
-      aws-sdk-core (~> 3, >= 3.48.0)
+    aws-sdk-kms (1.16.0)
+      aws-sdk-core (~> 3, >= 3.48.2)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.33.0)
-      aws-sdk-core (~> 3, >= 3.48.0)
+    aws-sdk-s3 (1.36.0)
+      aws-sdk-core (~> 3, >= 3.48.2)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.0)
     aws-sigv4 (1.1.0)
@@ -99,7 +99,7 @@ GEM
       rack (>= 0.9.0)
     binding_of_caller (0.8.0)
       debug_inspector (>= 0.0.1)
-    bootsnap (1.4.1)
+    bootsnap (1.4.2)
       msgpack (~> 1.0)
     brakeman (4.5.0)
     browser (2.5.3)
@@ -127,7 +127,7 @@ GEM
       sshkit (~> 1.3)
     capistrano-yarn (2.0.2)
       capistrano (~> 3.0)
-    capybara (3.14.0)
+    capybara (3.16.0)
       addressable
       mini_mime (>= 0.1.3)
       nokogiri (~> 1.8)
@@ -165,7 +165,7 @@ GEM
       rack (>= 1)
       rake (> 10, < 13)
       thor (~> 0.19)
-    devise (4.5.0)
+    devise (4.6.2)
       bcrypt (~> 3.0)
       orm_adapter (~> 0.1)
       railties (>= 4.1.0, < 6.0)
@@ -186,9 +186,9 @@ GEM
       unf (>= 0.0.5, < 1.0.0)
     doorkeeper (5.0.2)
       railties (>= 4.2)
-    dotenv (2.7.1)
-    dotenv-rails (2.7.1)
-      dotenv (= 2.7.1)
+    dotenv (2.7.2)
+    dotenv-rails (2.7.2)
+      dotenv (= 2.7.2)
       railties (>= 3.2, < 6.1)
     elasticsearch (6.0.2)
       elasticsearch-api (= 6.0.2)
@@ -330,13 +330,13 @@ GEM
       nokogiri (>= 1.5.9)
     mail (2.7.1)
       mini_mime (>= 0.1.1)
-    makara (0.4.0)
+    makara (0.4.1)
       activerecord (>= 3.0.0)
     marcel (0.3.3)
       mimemagic (~> 0.3.2)
     mario-redis-lock (1.2.1)
       redis (>= 3.0.5)
-    memory_profiler (0.9.12)
+    memory_profiler (0.9.13)
     method_source (0.9.2)
     microformats (4.1.0)
       json (~> 2.1)
@@ -348,7 +348,7 @@ GEM
     mini_mime (1.0.1)
     mini_portile2 (2.4.0)
     minitest (5.11.3)
-    msgpack (1.2.6)
+    msgpack (1.2.9)
     multi_json (1.13.1)
     multipart-post (2.0.0)
     necromancer (0.4.0)
@@ -357,7 +357,7 @@ GEM
       net-ssh (>= 2.6.5)
     net-ssh (5.0.2)
     nio4r (2.3.1)
-    nokogiri (1.10.1)
+    nokogiri (1.10.2)
       mini_portile2 (~> 2.4.0)
     nokogumbo (2.0.0)
       nokogiri (~> 1.8, >= 1.8.4)
@@ -366,7 +366,7 @@ GEM
       concurrent-ruby (~> 1.0, >= 1.0.2)
       sidekiq (>= 3.5)
       statsd-ruby (~> 1.4, >= 1.4.0)
-    oj (3.7.10)
+    oj (3.7.11)
     omniauth (1.9.0)
       hashie (>= 3.4.6, < 3.7.0)
       rack (>= 1.6.2, < 3)
@@ -422,32 +422,32 @@ GEM
       pry (>= 0.10.4)
     psych (3.1.0)
     public_suffix (3.0.3)
-    puma (3.12.0)
+    puma (3.12.1)
     pundit (2.0.1)
       activesupport (>= 3.0.0)
     raabro (1.1.6)
     rack (2.0.6)
     rack-attack (5.4.2)
       rack (>= 1.0, < 3)
-    rack-cors (1.0.2)
+    rack-cors (1.0.3)
     rack-protection (2.0.5)
       rack
     rack-proxy (0.6.5)
       rack
     rack-test (1.1.0)
       rack (>= 1.0, < 3)
-    rails (5.2.2.1)
-      actioncable (= 5.2.2.1)
-      actionmailer (= 5.2.2.1)
-      actionpack (= 5.2.2.1)
-      actionview (= 5.2.2.1)
-      activejob (= 5.2.2.1)
-      activemodel (= 5.2.2.1)
-      activerecord (= 5.2.2.1)
-      activestorage (= 5.2.2.1)
-      activesupport (= 5.2.2.1)
+    rails (5.2.3)
+      actioncable (= 5.2.3)
+      actionmailer (= 5.2.3)
+      actionpack (= 5.2.3)
+      actionview (= 5.2.3)
+      activejob (= 5.2.3)
+      activemodel (= 5.2.3)
+      activerecord (= 5.2.3)
+      activestorage (= 5.2.3)
+      activesupport (= 5.2.3)
       bundler (>= 1.3.0)
-      railties (= 5.2.2.1)
+      railties (= 5.2.3)
       sprockets-rails (>= 2.0.0)
     rails-controller-testing (1.0.4)
       actionpack (>= 5.0.1.x)
@@ -463,9 +463,9 @@ GEM
       railties (>= 5.0, < 6)
     rails-settings-cached (0.6.6)
       rails (>= 4.2.0)
-    railties (5.2.2.1)
-      actionpack (= 5.2.2.1)
-      activesupport (= 5.2.2.1)
+    railties (5.2.3)
+      actionpack (= 5.2.3)
+      activesupport (= 5.2.3)
       method_source
       rake (>= 0.8.7)
       thor (>= 0.19.0, < 2.0)
@@ -501,9 +501,9 @@ GEM
     regexp_parser (1.3.0)
     request_store (1.4.1)
       rack (>= 1.4)
-    responders (2.4.0)
-      actionpack (>= 4.2.0, < 5.3)
-      railties (>= 4.2.0, < 5.3)
+    responders (2.4.1)
+      actionpack (>= 4.2.0, < 6.0)
+      railties (>= 4.2.0, < 6.0)
     rotp (2.1.2)
     rpam2 (4.0.2)
     rqrcode (0.10.1)
@@ -625,15 +625,15 @@ GEM
       unf (~> 0.1.0)
     tzinfo (1.2.5)
       thread_safe (~> 0.1)
-    tzinfo-data (1.2018.9)
+    tzinfo-data (1.2019.1)
       tzinfo (>= 1.0.0)
     unf (0.1.4)
       unf_ext
     unf_ext (0.0.7.5)
     unicode-display_width (1.5.0)
     uniform_notifier (1.12.1)
-    warden (1.2.7)
-      rack (>= 1.0)
+    warden (1.2.8)
+      rack (>= 2.0.6)
     webmock (3.5.1)
       addressable (>= 2.3.6)
       crack (>= 0.3.2)
@@ -660,7 +660,7 @@ DEPENDENCIES
   active_record_query_trace (~> 1.6)
   addressable (~> 2.6)
   annotate (~> 2.7)
-  aws-sdk-s3 (~> 1.33)
+  aws-sdk-s3 (~> 1.36)
   better_errors (~> 2.5)
   binding_of_caller (~> 0.7)
   bootsnap (~> 1.4)
@@ -672,14 +672,14 @@ DEPENDENCIES
   capistrano-rails (~> 1.4)
   capistrano-rbenv (~> 2.1)
   capistrano-yarn (~> 2.0)
-  capybara (~> 3.14)
+  capybara (~> 3.16)
   charlock_holmes (~> 0.7.6)
   chewy (~> 5.0)
   cld3 (~> 3.2.3)
   climate_control (~> 0.2)
   concurrent-ruby
   derailed_benchmarks
-  devise (~> 4.5)
+  devise (~> 4.6)
   devise-two-factor (~> 3.0)
   devise_pam_authenticatable2 (~> 9.2)
   doorkeeper (~> 5.0)
@@ -739,7 +739,7 @@ DEPENDENCIES
   pundit (~> 2.0)
   rack-attack (~> 5.4)
   rack-cors (~> 1.0)
-  rails (~> 5.2.2)
+  rails (~> 5.2.3)
   rails-controller-testing (~> 1.0)
   rails-i18n (~> 5.1)
   rails-settings-cached (~> 0.6)
@@ -769,7 +769,7 @@ DEPENDENCIES
   tty-command (~> 0.8)
   tty-prompt (~> 0.18)
   twitter-text (~> 1.14)
-  tzinfo-data (~> 1.2018)
+  tzinfo-data (~> 1.2019)
   webmock (~> 3.5)
   webpacker (~> 4.0)
   webpush
diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb
index 22bbcec19..f23ed1508 100644
--- a/app/controllers/admin/dashboard_controller.rb
+++ b/app/controllers/admin/dashboard_controller.rb
@@ -29,6 +29,7 @@ module Admin
       @hidden_service        = ENV['ALLOW_ACCESS_TO_HIDDEN_SERVICE'] == 'true'
       @trending_hashtags     = TrendingTags.get(7)
       @profile_directory     = Setting.profile_directory
+      @timeline_preview      = Setting.timeline_preview
     end
 
     private
diff --git a/app/controllers/admin/settings_controller.rb b/app/controllers/admin/settings_controller.rb
index a64e98868..dc1c79b7f 100644
--- a/app/controllers/admin/settings_controller.rb
+++ b/app/controllers/admin/settings_controller.rb
@@ -2,94 +2,29 @@
 
 module Admin
   class SettingsController < BaseController
-    ADMIN_SETTINGS = %w(
-      site_contact_username
-      site_contact_email
-      site_title
-      site_short_description
-      site_description
-      site_extended_description
-      site_terms
-      registrations_mode
-      closed_registrations_message
-      open_deletion
-      timeline_preview
-      show_staff_badge
-      bootstrap_timeline_accounts
-      flavour
-      skin
-      flavour_and_skin
-      thumbnail
-      hero
-      mascot
-      min_invite_role
-      activity_api_enabled
-      peers_api_enabled
-      show_known_fediverse_at_about_page
-      preview_sensitive_media
-      custom_css
-      profile_directory
-      hide_followers_count
-    ).freeze
-
-    BOOLEAN_SETTINGS = %w(
-      open_deletion
-      timeline_preview
-      show_staff_badge
-      activity_api_enabled
-      peers_api_enabled
-      show_known_fediverse_at_about_page
-      preview_sensitive_media
-      profile_directory
-      hide_followers_count
-    ).freeze
-
-    UPLOAD_SETTINGS = %w(
-      thumbnail
-      hero
-      mascot
-    ).freeze
-
     def edit
       authorize :settings, :show?
+
       @admin_settings = Form::AdminSettings.new
     end
 
     def update
       authorize :settings, :update?
 
-      settings = settings_params
-      flavours_and_skin = settings.delete('flavour_and_skin')
-      if flavours_and_skin
-        settings['flavour'], settings['skin'] = flavours_and_skin.split('/', 2)
-      end
+      @admin_settings = Form::AdminSettings.new(settings_params)
 
-      settings.each do |key, value|
-        if UPLOAD_SETTINGS.include?(key)
-          upload = SiteUpload.where(var: key).first_or_initialize(var: key)
-          upload.update(file: value)
-        else
-          setting = Setting.where(var: key).first_or_initialize(var: key)
-          setting.update(value: value_for_update(key, value))
-        end
+      if @admin_settings.save
+        flash[:notice] = I18n.t('generic.changes_saved_msg')
+        redirect_to edit_admin_settings_path
+      else
+        render :edit
       end
-
-      flash[:notice] = I18n.t('generic.changes_saved_msg')
-      redirect_to edit_admin_settings_path
     end
 
     private
 
     def settings_params
-      params.require(:form_admin_settings).permit(ADMIN_SETTINGS)
-    end
-
-    def value_for_update(key, value)
-      if BOOLEAN_SETTINGS.include?(key)
-        value == '1'
-      else
-        value
-      end
+      params.require(:form_admin_settings).permit(*Form::AdminSettings::KEYS)
     end
   end
 end
diff --git a/app/controllers/api/v1/accounts/identity_proofs_controller.rb b/app/controllers/api/v1/accounts/identity_proofs_controller.rb
new file mode 100644
index 000000000..bea51ae11
--- /dev/null
+++ b/app/controllers/api/v1/accounts/identity_proofs_controller.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class Api::V1::Accounts::IdentityProofsController < Api::BaseController
+  before_action :require_user!
+  before_action :set_account
+
+  respond_to :json
+
+  def index
+    @proofs = @account.identity_proofs.active
+    render json: @proofs, each_serializer: REST::IdentityProofSerializer
+  end
+
+  private
+
+  def set_account
+    @account = Account.find(params[:account_id])
+  end
+end
diff --git a/app/controllers/concerns/account_controller_concern.rb b/app/controllers/concerns/account_controller_concern.rb
index 8817fd7de..4f28941ae 100644
--- a/app/controllers/concerns/account_controller_concern.rb
+++ b/app/controllers/concerns/account_controller_concern.rb
@@ -69,6 +69,10 @@ module AccountControllerConcern
   end
 
   def check_account_suspension
-    gone if @account.suspended?
+    if @account.suspended?
+      skip_session!
+      expires_in(3.minutes, public: true)
+      gone
+    end
   end
 end
diff --git a/app/controllers/directories_controller.rb b/app/controllers/directories_controller.rb
index 70013d760..59247a21f 100644
--- a/app/controllers/directories_controller.rb
+++ b/app/controllers/directories_controller.rb
@@ -37,7 +37,7 @@ class DirectoriesController < ApplicationController
   end
 
   def set_accounts
-    @accounts = Account.discoverable.page(params[:page]).per(40).tap do |query|
+    @accounts = Account.discoverable.by_recent_status.page(params[:page]).per(40).tap do |query|
       query.merge!(Account.tagged_with(@tag.id)) if @tag
     end
   end
diff --git a/app/controllers/relationships_controller.rb b/app/controllers/relationships_controller.rb
index a0b9c77df..c87a0cf13 100644
--- a/app/controllers/relationships_controller.rb
+++ b/app/controllers/relationships_controller.rb
@@ -32,13 +32,14 @@ class RelationshipsController < ApplicationController
   def relationships_scope
     scope = begin
       if following_relationship?
-        current_account.following.joins(:account_stat)
+        current_account.following.eager_load(:account_stat).reorder(nil)
       else
-        current_account.followers.joins(:account_stat)
+        current_account.followers.eager_load(:account_stat).reorder(nil)
       end
     end
 
-    scope.merge!(Follow.recent)
+    scope.merge!(Follow.recent)             if params[:order].blank? || params[:order] == 'recent'
+    scope.merge!(Account.by_recent_status)  if params[:order] == 'active'
     scope.merge!(mutual_relationship_scope) if mutual_relationship?
     scope.merge!(moved_account_scope)       if params[:status] == 'moved'
     scope.merge!(primary_account_scope)     if params[:status] == 'primary'
@@ -85,7 +86,7 @@ class RelationshipsController < ApplicationController
   end
 
   def current_params
-    params.slice(:page, :status, :relationship, :by_domain, :activity).permit(:page, :status, :relationship, :by_domain, :activity)
+    params.slice(:page, :status, :relationship, :by_domain, :activity, :order).permit(:page, :status, :relationship, :by_domain, :activity, :order)
   end
 
   def action_from_button
diff --git a/app/controllers/settings/identity_proofs_controller.rb b/app/controllers/settings/identity_proofs_controller.rb
index 4a3b89a5e..8f857fdcc 100644
--- a/app/controllers/settings/identity_proofs_controller.rb
+++ b/app/controllers/settings/identity_proofs_controller.rb
@@ -18,7 +18,12 @@ class Settings::IdentityProofsController < Settings::BaseController
       provider_username: params[:provider_username]
     )
 
-    render layout: 'auth'
+    if current_account.username == params[:username]
+      render layout: 'auth'
+    else
+      flash[:alert] = I18n.t('identity_proofs.errors.wrong_user', proving: params[:username], current: current_account.username)
+      redirect_to settings_identity_proofs_path
+    end
   end
 
   def create
@@ -26,6 +31,7 @@ class Settings::IdentityProofsController < Settings::BaseController
     @proof.token = resource_params[:token]
 
     if @proof.save
+      PostStatusService.new.call(current_user.account, text: post_params[:status_text]) if publish_proof?
       redirect_to @proof.on_success_path(params[:user_agent])
     else
       flash[:alert] = I18n.t('identity_proofs.errors.failed', provider: @proof.provider.capitalize)
@@ -36,10 +42,22 @@ class Settings::IdentityProofsController < Settings::BaseController
   private
 
   def check_required_params
-    redirect_to settings_identity_proofs_path unless [:provider, :provider_username, :token].all? { |k| params[k].present? }
+    redirect_to settings_identity_proofs_path unless [:provider, :provider_username, :username, :token].all? { |k| params[k].present? }
   end
 
   def resource_params
     params.require(:account_identity_proof).permit(:provider, :provider_username, :token)
   end
+
+  def publish_proof?
+    ActiveModel::Type::Boolean.new.cast(post_params[:post_status])
+  end
+
+  def post_params
+    params.require(:account_identity_proof).permit(:post_status, :status_text)
+  end
+
+  def set_body_classes
+    @body_classes = ''
+  end
 end
diff --git a/app/helpers/admin/dashboard_helper.rb b/app/helpers/admin/dashboard_helper.rb
new file mode 100644
index 000000000..4ee2cdef4
--- /dev/null
+++ b/app/helpers/admin/dashboard_helper.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+module Admin::DashboardHelper
+  def feature_hint(feature, enabled)
+    indicator   = safe_join([enabled ? t('simple_form.yes') : t('simple_form.no'), fa_icon('power-off fw')], ' ')
+    class_names = enabled ? 'pull-right positive-hint' : 'pull-right neutral-hint'
+
+    safe_join([feature, content_tag(:span, indicator, class: class_names)])
+  end
+end
diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb
index 4fd36ef42..0bda25974 100644
--- a/app/helpers/admin/filter_helper.rb
+++ b/app/helpers/admin/filter_helper.rb
@@ -7,7 +7,7 @@ module Admin::FilterHelper
   CUSTOM_EMOJI_FILTERS = %i(local remote by_domain shortcode).freeze
   TAGS_FILTERS         = %i(hidden).freeze
   INSTANCES_FILTERS    = %i(limited by_domain).freeze
-  FOLLOWERS_FILTERS    = %i(relationship status by_domain activity).freeze
+  FOLLOWERS_FILTERS    = %i(relationship status by_domain activity order).freeze
 
   FILTERS = ACCOUNT_FILTERS + REPORT_FILTERS + INVITE_FILTER + CUSTOM_EMOJI_FILTERS + TAGS_FILTERS + INSTANCES_FILTERS + FOLLOWERS_FILTERS
 
diff --git a/app/helpers/stream_entries_helper.rb b/app/helpers/stream_entries_helper.rb
index 1e49e4fc6..5ad2c438e 100644
--- a/app/helpers/stream_entries_helper.rb
+++ b/app/helpers/stream_entries_helper.rb
@@ -111,8 +111,8 @@ module StreamEntriesHelper
   end
 
   def poll_summary(status)
-    return unless status.poll
-    status.poll.options.map { |o| "[ ] #{o}" }.join("\n")
+    return unless status.preloadable_poll
+    status.preloadable_poll.options.map { |o| "[ ] #{o}" }.join("\n")
   end
 
   def status_description(status)
diff --git a/app/javascript/flavours/glitch/actions/identity_proofs.js b/app/javascript/flavours/glitch/actions/identity_proofs.js
new file mode 100644
index 000000000..a7241da20
--- /dev/null
+++ b/app/javascript/flavours/glitch/actions/identity_proofs.js
@@ -0,0 +1,30 @@
+import api from 'flavours/glitch/util/api';
+
+export const IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST = 'IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST';
+export const IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS = 'IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS';
+export const IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL    = 'IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL';
+
+export const fetchAccountIdentityProofs = accountId => (dispatch, getState) => {
+  dispatch(fetchAccountIdentityProofsRequest(accountId));
+
+  api(getState).get(`/api/v1/accounts/${accountId}/identity_proofs`)
+    .then(({ data }) => dispatch(fetchAccountIdentityProofsSuccess(accountId, data)))
+    .catch(err => dispatch(fetchAccountIdentityProofsFail(accountId, err)));
+};
+
+export const fetchAccountIdentityProofsRequest = id => ({
+  type: IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST,
+  id,
+});
+
+export const fetchAccountIdentityProofsSuccess = (accountId, identity_proofs) => ({
+  type: IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS,
+  accountId,
+  identity_proofs,
+});
+
+export const fetchAccountIdentityProofsFail = (accountId, err) => ({
+  type: IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL,
+  accountId,
+  err,
+});
diff --git a/app/javascript/flavours/glitch/actions/search.js b/app/javascript/flavours/glitch/actions/search.js
index bc094eed5..b2d24e10b 100644
--- a/app/javascript/flavours/glitch/actions/search.js
+++ b/app/javascript/flavours/glitch/actions/search.js
@@ -37,6 +37,7 @@ export function submitSearch() {
       params: {
         q: value,
         resolve: true,
+        limit: 10,
       },
     }).then(response => {
       if (response.data.accounts) {
diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js
index 1d3130604..e0cc652d2 100644
--- a/app/javascript/flavours/glitch/components/status_action_bar.js
+++ b/app/javascript/flavours/glitch/components/status_action_bar.js
@@ -146,7 +146,7 @@ export default class StatusActionBar extends ImmutablePureComponent {
   }
 
   handleBlockClick = () => {
-    this.props.onBlock(this.props.status.get('account'));
+    this.props.onBlock(this.props.status);
   }
 
   handleOpen = () => {
diff --git a/app/javascript/flavours/glitch/components/status_content.js b/app/javascript/flavours/glitch/components/status_content.js
index 98a34ebaf..a62844185 100644
--- a/app/javascript/flavours/glitch/components/status_content.js
+++ b/app/javascript/flavours/glitch/components/status_content.js
@@ -198,7 +198,7 @@ export default class StatusContent extends React.PureComponent {
           <p
             style={{ marginBottom: hidden && status.get('mentions').isEmpty() ? '0px' : null }}
           >
-            <span dangerouslySetInnerHTML={spoilerContent} />
+            <span dangerouslySetInnerHTML={spoilerContent} lang={status.get('language')} />
             {' '}
             <button tabIndex='0' className='status__content__spoiler-link' onClick={this.handleSpoilerClick}>
               {toggleText}
@@ -213,6 +213,7 @@ export default class StatusContent extends React.PureComponent {
               style={directionStyle}
               tabIndex={!hidden ? 0 : null}
               dangerouslySetInnerHTML={content}
+              lang={status.get('language')}
             />
             {media}
           </div>
@@ -231,6 +232,7 @@ export default class StatusContent extends React.PureComponent {
           <div
             ref={this.setRef}
             dangerouslySetInnerHTML={content}
+            lang={status.get('language')}
             tabIndex='0'
           />
           {media}
@@ -243,7 +245,7 @@ export default class StatusContent extends React.PureComponent {
           style={directionStyle}
           tabIndex='0'
         >
-          <div ref={this.setRef} dangerouslySetInnerHTML={content} tabIndex='0' />
+          <div ref={this.setRef} dangerouslySetInnerHTML={content} lang={status.get('language')} tabIndex='0' />
           {media}
         </div>
       );
diff --git a/app/javascript/flavours/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js
index f783878b0..60636feb4 100644
--- a/app/javascript/flavours/glitch/containers/status_container.js
+++ b/app/javascript/flavours/glitch/containers/status_container.js
@@ -35,6 +35,7 @@ const messages = defineMessages({
   blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },
   replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
   replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
+  blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' },
 });
 
 const makeMapStateToProps = () => {
@@ -169,11 +170,17 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
     dispatch(openModal('VIDEO', { media, time }));
   },
 
-  onBlock (account) {
+  onBlock (status) {
+    const account = status.get('account');
     dispatch(openModal('CONFIRM', {
       message: <FormattedMessage id='confirmations.block.message' defaultMessage='Are you sure you want to block {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
       confirm: intl.formatMessage(messages.blockConfirm),
       onConfirm: () => dispatch(blockAccount(account.get('id'))),
+      secondary: intl.formatMessage(messages.blockAndReport),
+      onSecondary: () => {
+        dispatch(blockAccount(account.get('id')));
+        dispatch(initReport(account, status));
+      },
     }));
   },
 
diff --git a/app/javascript/flavours/glitch/features/account/components/action_bar.js b/app/javascript/flavours/glitch/features/account/components/action_bar.js
index fdacb7298..a2c00c1c2 100644
--- a/app/javascript/flavours/glitch/features/account/components/action_bar.js
+++ b/app/javascript/flavours/glitch/features/account/components/action_bar.js
@@ -3,58 +3,19 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
 import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
 import { NavLink } from 'react-router-dom';
-import { defineMessages, injectIntl, FormattedMessage, FormattedNumber } from 'react-intl';
+import { injectIntl, FormattedMessage, FormattedNumber } from 'react-intl';
 import { me, isStaff } from 'flavours/glitch/util/initial_state';
 import { profileLink, accountAdminLink } from 'flavours/glitch/util/backend_links';
-
-const messages = defineMessages({
-  mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' },
-  direct: { id: 'account.direct', defaultMessage: 'Direct message @{name}' },
-  edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
-  unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
-  unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
-  unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
-  block: { id: 'account.block', defaultMessage: 'Block @{name}' },
-  mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
-  follow: { id: 'account.follow', defaultMessage: 'Follow' },
-  report: { id: 'account.report', defaultMessage: 'Report @{name}' },
-  share: { id: 'account.share', defaultMessage: 'Share @{name}\'s profile' },
-  media: { id: 'account.media', defaultMessage: 'Media' },
-  blockDomain: { id: 'account.block_domain', defaultMessage: 'Hide everything from {domain}' },
-  unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' },
-  hideReblogs: { id: 'account.hide_reblogs', defaultMessage: 'Hide boosts from @{name}' },
-  showReblogs: { id: 'account.show_reblogs', defaultMessage: 'Show boosts from @{name}' },
-  endorse: { id: 'account.endorse', defaultMessage: 'Feature on profile' },
-  unendorse: { id: 'account.unendorse', defaultMessage: 'Don\'t feature on profile' },
-  add_or_remove_from_list: { id: 'account.add_or_remove_from_list', defaultMessage: 'Add or Remove from lists' },
-  admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
-});
+import Icon from 'flavours/glitch/components/icon';
 
 @injectIntl
 export default class ActionBar extends React.PureComponent {
 
   static propTypes = {
     account: ImmutablePropTypes.map.isRequired,
-    onFollow: PropTypes.func,
-    onBlock: PropTypes.func.isRequired,
-    onMention: PropTypes.func.isRequired,
-    onDirect: PropTypes.func.isRequired,
-    onReblogToggle: PropTypes.func.isRequired,
-    onReport: PropTypes.func.isRequired,
-    onMute: PropTypes.func.isRequired,
-    onBlockDomain: PropTypes.func.isRequired,
-    onUnblockDomain: PropTypes.func.isRequired,
-    onEndorseToggle: PropTypes.func.isRequired,
-    onAddToList: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
   };
 
-  handleShare = () => {
-    navigator.share({
-      url: this.props.account.get('url'),
-    });
-  }
-
   isStatusesPageActive = (match, location) => {
     if (!match) {
       return false;
@@ -65,56 +26,12 @@ export default class ActionBar extends React.PureComponent {
   render () {
     const { account, intl } = this.props;
 
-    let menu = [];
     let extraInfo = '';
 
-    menu.push({ text: intl.formatMessage(messages.mention, { name: account.get('username') }), action: this.props.onMention });
-    menu.push({ text: intl.formatMessage(messages.direct, { name: account.get('username') }), action: this.props.onDirect });
-
-    if ('share' in navigator) {
-      menu.push({ text: intl.formatMessage(messages.share, { name: account.get('username') }), action: this.handleShare });
-    }
-
-    menu.push(null);
-
-    if (account.get('id') === me) {
-      if (profileLink !== undefined) {
-        menu.push({ text: intl.formatMessage(messages.edit_profile), href: profileLink });
-      }
-    } else {
-      if (account.getIn(['relationship', 'following'])) {
-        if (account.getIn(['relationship', 'showing_reblogs'])) {
-          menu.push({ text: intl.formatMessage(messages.hideReblogs, { name: account.get('username') }), action: this.props.onReblogToggle });
-        } else {
-          menu.push({ text: intl.formatMessage(messages.showReblogs, { name: account.get('username') }), action: this.props.onReblogToggle });
-        }
-
-        menu.push({ text: intl.formatMessage(account.getIn(['relationship', 'endorsed']) ? messages.unendorse : messages.endorse), action: this.props.onEndorseToggle });
-        menu.push({ text: intl.formatMessage(messages.add_or_remove_from_list), action: this.props.onAddToList });
-        menu.push(null);
-      }
-
-      if (account.getIn(['relationship', 'muting'])) {
-        menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.props.onMute });
-      } else {
-        menu.push({ text: intl.formatMessage(messages.mute, { name: account.get('username') }), action: this.props.onMute });
-      }
-
-      if (account.getIn(['relationship', 'blocking'])) {
-        menu.push({ text: intl.formatMessage(messages.unblock, { name: account.get('username') }), action: this.props.onBlock });
-      } else {
-        menu.push({ text: intl.formatMessage(messages.block, { name: account.get('username') }), action: this.props.onBlock });
-      }
-
-      menu.push({ text: intl.formatMessage(messages.report, { name: account.get('username') }), action: this.props.onReport });
-    }
-
     if (account.get('acct') !== account.get('username')) {
-      const domain = account.get('acct').split('@')[1];
-
       extraInfo = (
         <div className='account__disclaimer'>
-          <FormattedMessage
+          <Icon icon='info-circle' fixedWidth /> <FormattedMessage
             id='account.disclaimer_full'
             defaultMessage="Information below may reflect the user's profile incompletely."
           />
@@ -124,22 +41,6 @@ export default class ActionBar extends React.PureComponent {
           </a>
         </div>
       );
-
-      menu.push(null);
-
-      if (account.getIn(['relationship', 'domain_blocking'])) {
-        menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain }), action: this.props.onUnblockDomain });
-      } else {
-        menu.push({ text: intl.formatMessage(messages.blockDomain, { domain }), action: this.props.onBlockDomain });
-      }
-    }
-
-    if (account.get('id') !== me && isStaff && (accountAdminLink !== undefined)) {
-      menu.push(null);
-      menu.push({
-        text: intl.formatMessage(messages.admin_account, { name: account.get('username') }),
-        href: accountAdminLink(account.get('id')),
-      });
     }
 
     return (
@@ -147,10 +48,6 @@ export default class ActionBar extends React.PureComponent {
         {extraInfo}
 
         <div className='account__action-bar'>
-          <div className='account__action-bar-dropdown'>
-            <DropdownMenuContainer items={menu} icon='bars' size={24} direction='right' />
-          </div>
-
           <div className='account__action-bar-links'>
             <NavLink isActive={this.isStatusesPageActive} activeClassName='active' className='account__action-bar__tab' to={`/accounts/${account.get('id')}`}>
               <FormattedMessage id='account.posts' defaultMessage='Posts' />
diff --git a/app/javascript/flavours/glitch/features/account/components/header.js b/app/javascript/flavours/glitch/features/account/components/header.js
index 96696c2a5..13f7741c8 100644
--- a/app/javascript/flavours/glitch/features/account/components/header.js
+++ b/app/javascript/flavours/glitch/features/account/components/header.js
@@ -3,12 +3,14 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-
-import Avatar from 'flavours/glitch/components/avatar';
-import IconButton from 'flavours/glitch/components/icon_button';
-
-import { autoPlayGif, me } from 'flavours/glitch/util/initial_state';
+import { autoPlayGif, me, isStaff } from 'flavours/glitch/util/initial_state';
 import classNames from 'classnames';
+import Icon from 'flavours/glitch/components/icon';
+import Avatar from 'flavours/glitch/components/avatar';
+import Button from 'flavours/glitch/components/button';
+import { shortNumberFormat } from 'flavours/glitch/util/numbers';
+import { NavLink } from 'react-router-dom';
+import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
 
 const messages = defineMessages({
   unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
@@ -16,7 +18,34 @@ const messages = defineMessages({
   requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request' },
   unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
   edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
-  link_verified_on: { id: 'account.link_verified_on', defaultMessage: 'Ownership of this link was checked on {date}' },
+  linkVerifiedOn: { id: 'account.link_verified_on', defaultMessage: 'Ownership of this link was checked on {date}' },
+  account_locked: { id: 'account.locked_info', defaultMessage: 'This account privacy status is set to locked. The owner manually reviews who can follow them.' },
+  mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' },
+  direct: { id: 'account.direct', defaultMessage: 'Direct message @{name}' },
+  edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
+  unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
+  unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
+  block: { id: 'account.block', defaultMessage: 'Block @{name}' },
+  mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
+  report: { id: 'account.report', defaultMessage: 'Report @{name}' },
+  share: { id: 'account.share', defaultMessage: 'Share @{name}\'s profile' },
+  media: { id: 'account.media', defaultMessage: 'Media' },
+  blockDomain: { id: 'account.block_domain', defaultMessage: 'Hide everything from {domain}' },
+  unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' },
+  hideReblogs: { id: 'account.hide_reblogs', defaultMessage: 'Hide boosts from @{name}' },
+  showReblogs: { id: 'account.show_reblogs', defaultMessage: 'Show boosts from @{name}' },
+  pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned toots' },
+  preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
+  follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
+  favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' },
+  lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
+  blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },
+  domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Hidden domains' },
+  mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' },
+  endorse: { id: 'account.endorse', defaultMessage: 'Feature on profile' },
+  unendorse: { id: 'account.unendorse', defaultMessage: 'Don\'t feature on profile' },
+  add_or_remove_from_list: { id: 'account.add_or_remove_from_list', defaultMessage: 'Add or Remove from lists' },
+  admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
 });
 
 const dateFormatOptions = {
@@ -28,14 +57,16 @@ const dateFormatOptions = {
   minute: '2-digit',
 };
 
-@injectIntl
-export default class Header extends ImmutablePureComponent {
+export default @injectIntl
+class Header extends ImmutablePureComponent {
 
   static propTypes = {
     account: ImmutablePropTypes.map,
+    identity_props: ImmutablePropTypes.list,
     onFollow: PropTypes.func.isRequired,
     onBlock: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
+    domain: PropTypes.string.isRequired,
   };
 
   openEditProfile = () => {
@@ -43,109 +74,191 @@ export default class Header extends ImmutablePureComponent {
   }
 
   render () {
-    const { account, intl } = this.props;
+    const { account, intl, domain, identity_proofs } = this.props;
 
     if (!account) {
       return null;
     }
 
-    let displayName = account.get('display_name_html');
-    let fields      = account.get('fields');
-    let badge       = account.get('bot') ? (<div className='roles'><div className='account-role bot'><FormattedMessage id='account.badges.bot' defaultMessage='Bot' /></div></div>) : null;
-
-    let info        = '';
-    let mutingInfo  = '';
+    let info        = [];
     let actionBtn   = '';
+    let lockedIcon  = '';
+    let menu        = [];
 
     if (me !== account.get('id') && account.getIn(['relationship', 'followed_by'])) {
-      info = <span className='account--follows-info'><FormattedMessage id='account.follows_you' defaultMessage='Follows you' /></span>;
+      info.push(<span className='relationship-tag'><FormattedMessage id='account.follows_you' defaultMessage='Follows you' /></span>);
     }
     else if (me !== account.get('id') && account.getIn(['relationship', 'blocking'])) {
-      info = <span className='account--follows-info'><FormattedMessage id='account.blocked' defaultMessage='Blocked' /></span>;
+      info.push(<span className='relationship-tag'><FormattedMessage id='account.blocked' defaultMessage='Blocked' /></span>);
     }
 
     if (me !== account.get('id') && account.getIn(['relationship', 'muting'])) {
-      mutingInfo = <span className='account--muting-info'><FormattedMessage id='account.muted' defaultMessage='Muted' /></span>;
+      info.push(<span className='relationship-tag'><FormattedMessage id='account.muted' defaultMessage='Muted' /></span>);
     } else if (me !== account.get('id') && account.getIn(['relationship', 'domain_blocking'])) {
-      mutingInfo = <span className='account--muting-info'><FormattedMessage id='account.domain_blocked' defaultMessage='Domain hidden' /></span>;
+      info.push(<span className='relationship-tag'><FormattedMessage id='account.domain_blocked' defaultMessage='Domain hidden' /></span>);
     }
 
     if (me !== account.get('id')) {
       if (!account.get('relationship')) { // Wait until the relationship is loaded
         actionBtn = '';
       } else if (account.getIn(['relationship', 'requested'])) {
-        actionBtn = (
-          <div className='account--action-button'>
-            <IconButton size={26} active icon='hourglass' title={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />
-          </div>
-        );
+        actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />;
       } else if (!account.getIn(['relationship', 'blocking'])) {
-        actionBtn = (
-          <div className='account--action-button'>
-            <IconButton size={26} icon={account.getIn(['relationship', 'following']) ? 'user-times' : 'user-plus'} active={account.getIn(['relationship', 'following'])} title={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={this.props.onFollow} />
-          </div>
-        );
+        actionBtn = <Button className={classNames('logo-button', { 'button--destructive': account.getIn(['relationship', 'following']) })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={this.props.onFollow} />;
       } else if (account.getIn(['relationship', 'blocking'])) {
-        actionBtn = (
-          <div className='account--action-button'>
-            <IconButton size={26} icon='unlock' title={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.props.onBlock} />
-          </div>
-        );
+        actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.props.onBlock} />;
       }
     } else {
-      actionBtn = (
-        <div className='account--action-button'>
-          <IconButton size={26} icon='pencil' title={intl.formatMessage(messages.edit_profile)} onClick={this.openEditProfile} />
-        </div>
-      );
+      actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.edit_profile)} onClick={this.openEditProfile} />;
     }
 
     if (account.get('moved') && !account.getIn(['relationship', 'following'])) {
       actionBtn = '';
     }
 
-    const content = { __html: account.get('note_emojified') };
+    if (account.get('locked')) {
+      lockedIcon = <Icon icon='lock' title={intl.formatMessage(messages.account_locked)} />;
+    }
 
-    return (
-      <div className='account__header__wrapper'>
-        <div className={classNames('account__header', { inactive: !!account.get('moved') })} style={{ backgroundImage: `url(${autoPlayGif ? account.get('header') : account.get('header_static')})` }}>
-          <div>
-            <a
-              href={account.get('url')}
-              className='account__header__avatar'
-              role='presentation'
-              target='_blank'
-              rel='noopener'
-            >
-              <Avatar account={account} size={90} />
-            </a>
+    if (account.get('id') !== me) {
+      menu.push({ text: intl.formatMessage(messages.mention, { name: account.get('username') }), action: this.props.onMention });
+      menu.push({ text: intl.formatMessage(messages.direct, { name: account.get('username') }), action: this.props.onDirect });
+      menu.push(null);
+    }
+
+    if ('share' in navigator) {
+      menu.push({ text: intl.formatMessage(messages.share, { name: account.get('username') }), action: this.handleShare });
+      menu.push(null);
+    }
+
+    if (account.get('id') === me) {
+      menu.push({ text: intl.formatMessage(messages.edit_profile), href: '/settings/profile' });
+      menu.push({ text: intl.formatMessage(messages.preferences), href: '/settings/preferences' });
+      menu.push({ text: intl.formatMessage(messages.pins), to: '/pinned' });
+      menu.push(null);
+      menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' });
+      menu.push({ text: intl.formatMessage(messages.favourites), to: '/favourites' });
+      menu.push({ text: intl.formatMessage(messages.lists), to: '/lists' });
+      menu.push(null);
+      menu.push({ text: intl.formatMessage(messages.mutes), to: '/mutes' });
+      menu.push({ text: intl.formatMessage(messages.blocks), to: '/blocks' });
+      menu.push({ text: intl.formatMessage(messages.domain_blocks), to: '/domain_blocks' });
+    } else {
+      if (account.getIn(['relationship', 'following'])) {
+        if (account.getIn(['relationship', 'showing_reblogs'])) {
+          menu.push({ text: intl.formatMessage(messages.hideReblogs, { name: account.get('username') }), action: this.props.onReblogToggle });
+        } else {
+          menu.push({ text: intl.formatMessage(messages.showReblogs, { name: account.get('username') }), action: this.props.onReblogToggle });
+        }
+
+        menu.push({ text: intl.formatMessage(account.getIn(['relationship', 'endorsed']) ? messages.unendorse : messages.endorse), action: this.props.onEndorseToggle });
+        menu.push({ text: intl.formatMessage(messages.add_or_remove_from_list), action: this.props.onAddToList });
+        menu.push(null);
+      }
+
+      if (account.getIn(['relationship', 'muting'])) {
+        menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.props.onMute });
+      } else {
+        menu.push({ text: intl.formatMessage(messages.mute, { name: account.get('username') }), action: this.props.onMute });
+      }
+
+      if (account.getIn(['relationship', 'blocking'])) {
+        menu.push({ text: intl.formatMessage(messages.unblock, { name: account.get('username') }), action: this.props.onBlock });
+      } else {
+        menu.push({ text: intl.formatMessage(messages.block, { name: account.get('username') }), action: this.props.onBlock });
+      }
+
+      menu.push({ text: intl.formatMessage(messages.report, { name: account.get('username') }), action: this.props.onReport });
+    }
+
+    if (account.get('acct') !== account.get('username')) {
+      const domain = account.get('acct').split('@')[1];
 
-            <span className='account__header__display-name' dangerouslySetInnerHTML={{ __html: displayName }} />
-            <span className='account__header__username'>@{account.get('acct')} {account.get('locked') ? <i className='fa fa-lock' /> : null}</span>
+      menu.push(null);
 
-            {badge}
+      if (account.getIn(['relationship', 'domain_blocking'])) {
+        menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain }), action: this.props.onUnblockDomain });
+      } else {
+        menu.push({ text: intl.formatMessage(messages.blockDomain, { domain }), action: this.props.onBlockDomain });
+      }
+    }
 
-            <div className='account__header__content' dangerouslySetInnerHTML={content} />
+    if (account.get('id') !== me && isStaff) {
+      menu.push(null);
+      menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: `/admin/accounts/${account.get('id')}` });
+    }
 
-            {fields.size > 0 && (
-              <div className='account__header__fields'>
-                {fields.map((pair, i) => (
-                  <dl key={i}>
-                    <dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} />
-                    <dd className={pair.get('verified_at') && 'verified'} title={pair.get('value_plain')}>
-                      {pair.get('verified_at') && <span title={intl.formatMessage(messages.link_verified_on, { date: intl.formatDate(pair.get('verified_at'), dateFormatOptions) })}><i className='fa fa-check verified__mark' /></span>} <span dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} />
-                    </dd>
-                 </dl>
-                ))}
-              </div>
-            )}
+    const content          = { __html: account.get('note_emojified') };
+    const displayNameHtml = { __html: account.get('display_name_html') };
+    const fields          = account.get('fields');
+    const badge           = account.get('bot') ? (<div className='account-role bot'><FormattedMessage id='account.badges.bot' defaultMessage='Bot' /></div>) : null;
+    const acct            = account.get('acct').indexOf('@') === -1 && domain ? `${account.get('acct')}@${domain}` : account.get('acct');
 
+    return (
+      <div className={classNames('account__header', { inactive: !!account.get('moved') })}>
+        <div className='account__header__image'>
+          <div className='account__header__info'>
             {info}
-            {mutingInfo}
-            {actionBtn}
           </div>
+
+          <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' className='parallax' />
         </div>
-      </div>
+
+        <div className='account__header__bar'>
+          <div className='account__header__tabs'>
+            <a className='avatar' href={account.get('url')} rel='noopener' target='_blank'>
+              <Avatar account={account} size={90} />
+            </a>
+
+            <div className='spacer' />
+
+            <div className='account__header__tabs__buttons'>
+              {actionBtn}
+
+              <DropdownMenuContainer items={menu} icon='ellipsis-v' size={24} direction='right' />
+            </div>
+          </div>
+
+          <div className='account__header__tabs__name'>
+            <h1>
+              <span dangerouslySetInnerHTML={displayNameHtml} /> {badge}
+              <small>@{acct} {lockedIcon}</small>
+            </h1>
+          </div>
+
+          <div className='account__header__extra'>
+            <div className='account__header__bio'>
+              { (fields.size > 0 || identity_proofs.size > 0) && (
+                <div className='account__header__fields'>
+                  {identity_proofs.map((proof, i) => (
+                    <dl key={i}>
+                      <dt dangerouslySetInnerHTML={{ __html: proof.get('provider') }} />
+
+                      <dd className='verified'>
+                        <a href={proof.get('proof_url')} target='_blank' rel='noopener'><span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(proof.get('updated_at'), dateFormatOptions) })}>
+                          <Icon id='check' className='verified__mark' />
+                        </span></a>
+                        <a href={proof.get('profile_url')} target='_blank' rel='noopener'><span dangerouslySetInnerHTML={{ __html: ' '+proof.get('provider_username') }} /></a>
+                      </dd>
+                    </dl>
+                  ))}
+                  {fields.map((pair, i) => (
+                    <dl key={i}>
+                      <dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} />
+ 
+                      <dd className={pair.get('verified_at') && 'verified'} title={pair.get('value_plain')}>
+                        {pair.get('verified_at') && <span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(pair.get('verified_at'), dateFormatOptions) })}><Icon id='check' className='verified__mark' /></span>} <span dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} />
+                      </dd>
+                    </dl>
+                  ))}
+                </div>
+              )}
+
+              {account.get('note').length > 0 && account.get('note') !== '<p></p>' && <div className='account__header__content' dangerouslySetInnerHTML={content} />}
+            </div>
+         </div>
+       </div>
+     </div>
     );
   }
 
diff --git a/app/javascript/flavours/glitch/features/account_timeline/components/header.js b/app/javascript/flavours/glitch/features/account_timeline/components/header.js
index 8dc0be93e..96cabe847 100644
--- a/app/javascript/flavours/glitch/features/account_timeline/components/header.js
+++ b/app/javascript/flavours/glitch/features/account_timeline/components/header.js
@@ -13,6 +13,7 @@ export default class Header extends ImmutablePureComponent {
 
   static propTypes = {
     account: ImmutablePropTypes.map,
+    identity_proofs: ImmutablePropTypes.list,
     onFollow: PropTypes.func.isRequired,
     onBlock: PropTypes.func.isRequired,
     onMention: PropTypes.func.isRequired,
@@ -25,6 +26,7 @@ export default class Header extends ImmutablePureComponent {
     onEndorseToggle: PropTypes.func.isRequired,
     onAddToList: PropTypes.func.isRequired,
     hideTabs: PropTypes.bool,
+    domain: PropTypes.string.isRequired,
   };
 
   static contextTypes = {
@@ -84,7 +86,7 @@ export default class Header extends ImmutablePureComponent {
   }
 
   render () {
-    const { account, hideTabs } = this.props;
+    const { account, hideTabs, identity_proofs } = this.props;
 
     if (account === null) {
       return <MissingIndicator />;
@@ -96,13 +98,9 @@ export default class Header extends ImmutablePureComponent {
 
         <InnerHeader
           account={account}
+          identity_proofs={identity_proofs}
           onFollow={this.handleFollow}
           onBlock={this.handleBlock}
-        />
-
-        <ActionBar
-          account={account}
-          onBlock={this.handleBlock}
           onMention={this.handleMention}
           onDirect={this.handleDirect}
           onReblogToggle={this.handleReblogToggle}
@@ -112,6 +110,11 @@ export default class Header extends ImmutablePureComponent {
           onUnblockDomain={this.handleUnblockDomain}
           onEndorseToggle={this.handleEndorseToggle}
           onAddToList={this.handleAddToList}
+          domain={this.props.domain}
+        />
+
+        <ActionBar
+          account={account}
         />
 
         {!hideTabs && (
diff --git a/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js
index e333c31a1..787a36658 100644
--- a/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js
+++ b/app/javascript/flavours/glitch/features/account_timeline/containers/header_container.js
@@ -21,11 +21,13 @@ import { openModal } from 'flavours/glitch/actions/modal';
 import { blockDomain, unblockDomain } from 'flavours/glitch/actions/domain_blocks';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import { unfollowModal } from 'flavours/glitch/util/initial_state';
+import { List as ImmutableList } from 'immutable';
 
 const messages = defineMessages({
   unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
   blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },
   blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Hide entire domain' },
+  blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' },
 });
 
 const makeMapStateToProps = () => {
@@ -33,6 +35,8 @@ const makeMapStateToProps = () => {
 
   const mapStateToProps = (state, { accountId }) => ({
     account: getAccount(state, accountId),
+    domain: state.getIn(['meta', 'domain']),
+    identity_proofs: state.getIn(['identity_proofs', accountId], ImmutableList()),
   });
 
   return mapStateToProps;
@@ -64,6 +68,11 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
         message: <FormattedMessage id='confirmations.block.message' defaultMessage='Are you sure you want to block {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
         confirm: intl.formatMessage(messages.blockConfirm),
         onConfirm: () => dispatch(blockAccount(account.get('id'))),
+        secondary: intl.formatMessage(messages.blockAndReport),
+        onSecondary: () => {
+          dispatch(blockAccount(account.get('id')));
+          dispatch(initReport(account));
+        },
       }));
     }
   },
diff --git a/app/javascript/flavours/glitch/features/account_timeline/index.js b/app/javascript/flavours/glitch/features/account_timeline/index.js
index d683b8789..9971c0f4a 100644
--- a/app/javascript/flavours/glitch/features/account_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/account_timeline/index.js
@@ -12,6 +12,7 @@ import HeaderContainer from './containers/header_container';
 import { List as ImmutableList } from 'immutable';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { FormattedMessage } from 'react-intl';
+import { fetchAccountIdentityProofs } from '../../actions/identity_proofs';
 
 const mapStateToProps = (state, { params: { accountId }, withReplies = false }) => {
   const path = withReplies ? `${accountId}:with_replies` : accountId;
@@ -41,6 +42,7 @@ export default class AccountTimeline extends ImmutablePureComponent {
     const { params: { accountId }, withReplies } = this.props;
 
     this.props.dispatch(fetchAccount(accountId));
+    this.props.dispatch(fetchAccountIdentityProofs(accountId));
     if (!withReplies) {
       this.props.dispatch(expandAccountFeaturedTimeline(accountId));
     }
@@ -50,6 +52,7 @@ export default class AccountTimeline extends ImmutablePureComponent {
   componentWillReceiveProps (nextProps) {
     if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) {
       this.props.dispatch(fetchAccount(nextProps.params.accountId));
+      this.props.dispatch(fetchAccountIdentityProofs(nextProps.params.accountId));
       if (!nextProps.withReplies) {
         this.props.dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId));
       }
diff --git a/app/javascript/flavours/glitch/features/drawer/results/index.js b/app/javascript/flavours/glitch/features/drawer/results/index.js
index ac7a14ef4..4574c0e1e 100644
--- a/app/javascript/flavours/glitch/features/drawer/results/index.js
+++ b/app/javascript/flavours/glitch/features/drawer/results/index.js
@@ -10,6 +10,7 @@ import spring from 'react-motion/lib/spring';
 import { Link } from 'react-router-dom';
 
 //  Components.
+import Icon from 'flavours/glitch/components/icon';
 import AccountContainer from 'flavours/glitch/containers/account_container';
 import StatusContainer from 'flavours/glitch/containers/status_container';
 import Hashtag from 'flavours/glitch/components/hashtag';
@@ -62,6 +63,7 @@ export default function DrawerResults ({
           }}
         >
           <header>
+            <Icon icon='search' fixedWidth />
             <FormattedMessage
               {...messages.total}
               values={{ count }}
@@ -69,7 +71,7 @@ export default function DrawerResults ({
           </header>
           {accounts && accounts.size ? (
             <section>
-              <h5><FormattedMessage id='search_results.accounts' defaultMessage='People' /></h5>
+              <h5><Icon icon='users' fixedWidth /><FormattedMessage id='search_results.accounts' defaultMessage='People' /></h5>
 
               {accounts.map(
                 accountId => (
@@ -83,7 +85,7 @@ export default function DrawerResults ({
           ) : null}
           {statuses && statuses.size ? (
             <section>
-              <h5><FormattedMessage id='search_results.statuses' defaultMessage='Toots' /></h5>
+              <h5><Icon icon='quote-right' fixedWidth /><FormattedMessage id='search_results.statuses' defaultMessage='Toots' /></h5>
 
               {statuses.map(
                 statusId => (
@@ -97,7 +99,7 @@ export default function DrawerResults ({
           ) : null}
           {hashtags && hashtags.size ? (
             <section>
-              <h5><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></h5>
+              <h5><Icon icon='hashtag' fixedWidth /><FormattedMessage id='search_results.hashtags' defaultMessage='Hashtags' /></h5>
 
               {hashtags.map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}
             </section>
diff --git a/app/javascript/flavours/glitch/features/emoji_picker/index.js b/app/javascript/flavours/glitch/features/emoji_picker/index.js
index d963039dc..a78117971 100644
--- a/app/javascript/flavours/glitch/features/emoji_picker/index.js
+++ b/app/javascript/flavours/glitch/features/emoji_picker/index.js
@@ -129,7 +129,6 @@ class ModifierPickerMenu extends React.PureComponent {
     active: PropTypes.bool,
     onSelect: PropTypes.func.isRequired,
     onClose: PropTypes.func.isRequired,
-    modifier: PropTypes.number,
   };
 
   handleClick = e => {
@@ -166,36 +165,20 @@ class ModifierPickerMenu extends React.PureComponent {
 
   setRef = c => {
     this.node = c;
-    if (this.node) {
-      this.node.querySelector('li:first-child button').focus(); // focus the first element when opened
-    }
   }
 
   render () {
-    const { active, modifier } = this.props;
+    const { active } = this.props;
 
     return (
-      <ul
-        className='emoji-picker-dropdown__modifiers__menu'
-        style={{ display: active ? 'block' : 'none' }}
-        role='menuitem'
-        ref={this.setRef}
-      >
-        {[1, 2, 3, 4, 5, 6].map(i => (
-          <li
-            onClick={this.handleClick}
-            role='menuitemradio'
-            aria-checked={i === (modifier || 1)}
-            data-index={i}
-            key={i}
-          >
-            <Emoji
-              emoji='fist' set='twitter' size={22} sheetSize={32} skin={i}
-              backgroundImageFn={backgroundImageFn}
-            />
-          </li>
-        ))}
-      </ul>
+      <div className='emoji-picker-dropdown__modifiers__menu' style={{ display: active ? 'block' : 'none' }} ref={this.setRef}>
+        <button onClick={this.handleClick} data-index={1}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={1} backgroundImageFn={backgroundImageFn} /></button>
+        <button onClick={this.handleClick} data-index={2}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={2} backgroundImageFn={backgroundImageFn} /></button>
+        <button onClick={this.handleClick} data-index={3}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={3} backgroundImageFn={backgroundImageFn} /></button>
+        <button onClick={this.handleClick} data-index={4}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={4} backgroundImageFn={backgroundImageFn} /></button>
+        <button onClick={this.handleClick} data-index={5}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={5} backgroundImageFn={backgroundImageFn} /></button>
+        <button onClick={this.handleClick} data-index={6}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={6} backgroundImageFn={backgroundImageFn} /></button>
+      </div>
     );
   }
 
@@ -227,22 +210,10 @@ class ModifierPicker extends React.PureComponent {
   render () {
     const { active, modifier } = this.props;
 
-    function setRef(ref) {
-      if (!ref) {
-        return;
-      }
-      // TODO: It would be nice if we could pass props directly to emoji-mart's buttons.
-      const button = ref.querySelector('button');
-      button.setAttribute('aria-haspopup', 'true');
-      button.setAttribute('aria-expanded', active);
-    }
-
     return (
       <div className='emoji-picker-dropdown__modifiers'>
-        <div ref={setRef}>
-          <Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={modifier} onClick={this.handleClick} backgroundImageFn={backgroundImageFn} />
-        </div>
-        <ModifierPickerMenu active={active} modifier={modifier} onSelect={this.handleSelect} onClose={this.props.onClose} />
+        <Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={modifier} onClick={this.handleClick} backgroundImageFn={backgroundImageFn} />
+        <ModifierPickerMenu active={active} onSelect={this.handleSelect} onClose={this.props.onClose} />
       </div>
     );
   }
diff --git a/app/javascript/flavours/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js
index 66cc10d78..8291319c3 100644
--- a/app/javascript/flavours/glitch/features/status/components/action_bar.js
+++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js
@@ -98,7 +98,7 @@ export default class ActionBar extends React.PureComponent {
   }
 
   handleBlockClick = () => {
-    this.props.onBlock(this.props.status.get('account'));
+    this.props.onBlock(this.props.status);
   }
 
   handleReport = () => {
diff --git a/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js b/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js
index 6d3909ea7..e6c390537 100644
--- a/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js
+++ b/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js
@@ -38,6 +38,7 @@ const messages = defineMessages({
   blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },
   replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
   replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
+  blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' },
 });
 
 const makeMapStateToProps = () => {
@@ -136,11 +137,17 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
     dispatch(openModal('VIDEO', { media, time }));
   },
 
-  onBlock (account) {
+  onBlock (status) {
+    const account = status.get('account');
     dispatch(openModal('CONFIRM', {
       message: <FormattedMessage id='confirmations.block.message' defaultMessage='Are you sure you want to block {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
       confirm: intl.formatMessage(messages.blockConfirm),
       onConfirm: () => dispatch(blockAccount(account.get('id'))),
+      secondary: intl.formatMessage(messages.blockAndReport),
+      onSecondary: () => {
+        dispatch(blockAccount(account.get('id')));
+        dispatch(initReport(account, status));
+      },
     }));
   },
 
diff --git a/app/javascript/flavours/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js
index 73d3c7e9e..7f8f02188 100644
--- a/app/javascript/flavours/glitch/features/status/index.js
+++ b/app/javascript/flavours/glitch/features/status/index.js
@@ -54,6 +54,7 @@ const messages = defineMessages({
   detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' },
   replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
   replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
+  blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' },
   tootHeading: { id: 'column.toot', defaultMessage: 'Toots and replies' },
 });
 
@@ -279,13 +280,19 @@ export default class Status extends ImmutablePureComponent {
     this.setState({ isExpanded: !isExpanded, threadExpanded: !isExpanded });
   }
 
-  handleBlockClick = (account) => {
+  handleBlockClick = (status) => {
     const { dispatch, intl } = this.props;
+    const account = status.get('account');
 
     dispatch(openModal('CONFIRM', {
       message: <FormattedMessage id='confirmations.block.message' defaultMessage='Are you sure you want to block {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
       confirm: intl.formatMessage(messages.blockConfirm),
       onConfirm: () => dispatch(blockAccount(account.get('id'))),
+      secondary: intl.formatMessage(messages.blockAndReport),
+      onSecondary: () => {
+        dispatch(blockAccount(account.get('id')));
+        dispatch(initReport(account, status));
+      },
     }));
   }
 
diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js b/app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js
index 07281f818..970df30b6 100644
--- a/app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modal.js
@@ -11,6 +11,8 @@ export default class ConfirmationModal extends React.PureComponent {
     confirm: PropTypes.string.isRequired,
     onClose: PropTypes.func.isRequired,
     onConfirm: PropTypes.func.isRequired,
+    secondary: PropTypes.string,
+    onSecondary: PropTypes.func,
     onDoNotAsk: PropTypes.func,
     intl: PropTypes.object.isRequired,
   };
@@ -27,6 +29,11 @@ export default class ConfirmationModal extends React.PureComponent {
     }
   }
 
+  handleSecondary = () => {
+    this.props.onClose();
+    this.props.onSecondary();
+  }
+
   handleCancel = () => {
     this.props.onClose();
   }
@@ -40,7 +47,7 @@ export default class ConfirmationModal extends React.PureComponent {
   }
 
   render () {
-    const { message, confirm, onDoNotAsk } = this.props;
+    const { message, confirm, secondary, onDoNotAsk } = this.props;
 
     return (
       <div className='modal-root__modal confirmation-modal'>
@@ -61,6 +68,9 @@ export default class ConfirmationModal extends React.PureComponent {
             <Button onClick={this.handleCancel} className='confirmation-modal__cancel-button'>
               <FormattedMessage id='confirmation_modal.cancel' defaultMessage='Cancel' />
             </Button>
+            {secondary !== undefined && (
+              <Button text={secondary} onClick={this.handleSecondary} className='confirmation-modal__secondary-button' />
+            )}
             <Button text={confirm} onClick={this.handleClick} ref={this.setRef} />
           </div>
         </div>
diff --git a/app/javascript/flavours/glitch/reducers/identity_proofs.js b/app/javascript/flavours/glitch/reducers/identity_proofs.js
new file mode 100644
index 000000000..58af0a5fa
--- /dev/null
+++ b/app/javascript/flavours/glitch/reducers/identity_proofs.js
@@ -0,0 +1,25 @@
+import { Map as ImmutableMap, fromJS } from 'immutable';
+import {
+  IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST,
+  IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS,
+  IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL,
+} from '../actions/identity_proofs';
+
+const initialState = ImmutableMap();
+
+export default function identityProofsReducer(state = initialState, action) {
+  switch(action.type) {
+  case IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST:
+    return state.set('isLoading', true);
+  case IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL:
+    return state.set('isLoading', false);
+  case IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS:
+    return state.update(identity_proofs => identity_proofs.withMutations(map => {
+      map.set('isLoading', false);
+      map.set('loaded', true);
+      map.set(action.accountId, fromJS(action.identity_proofs));
+    }));
+  default:
+    return state;
+  }
+};
diff --git a/app/javascript/flavours/glitch/reducers/index.js b/app/javascript/flavours/glitch/reducers/index.js
index 7b3e0f651..76b38adb4 100644
--- a/app/javascript/flavours/glitch/reducers/index.js
+++ b/app/javascript/flavours/glitch/reducers/index.js
@@ -30,6 +30,7 @@ import listAdder from './list_adder';
 import filters from './filters';
 import pinnedAccountsEditor from './pinned_accounts_editor';
 import polls from './polls';
+import identity_proofs from './identity_proofs';
 
 const reducers = {
   dropdown_menu,
@@ -57,6 +58,7 @@ const reducers = {
   notifications,
   height_cache,
   custom_emojis,
+  identity_proofs,
   lists,
   listEditor,
   listAdder,
diff --git a/app/javascript/flavours/glitch/reducers/timelines.js b/app/javascript/flavours/glitch/reducers/timelines.js
index ca71c3833..cb233de1c 100644
--- a/app/javascript/flavours/glitch/reducers/timelines.js
+++ b/app/javascript/flavours/glitch/reducers/timelines.js
@@ -73,14 +73,15 @@ const updateTimeline = (state, timeline, status) => {
   }));
 };
 
-const deleteStatus = (state, id, accountId, references) => {
+const deleteStatus = (state, id, accountId, references, exclude_account = null) => {
   state.keySeq().forEach(timeline => {
-    state = state.updateIn([timeline, 'items'], list => list.filterNot(item => item === id));
+    if (exclude_account === null || (timeline !== `account:${exclude_account}` && !timeline.startsWith(`account:${exclude_account}:`)))
+      state = state.updateIn([timeline, 'items'], list => list.filterNot(item => item === id));
   });
 
   // Remove reblogs of deleted status
   references.forEach(ref => {
-    state = deleteStatus(state, ref[0], ref[1], []);
+    state = deleteStatus(state, ref[0], ref[1], [], exclude_account);
   });
 
   return state;
@@ -99,7 +100,7 @@ const filterTimelines = (state, relationship, statuses) => {
     }
 
     references = statuses.filter(item => item.get('reblog') === status.get('id')).map(item => [item.get('id'), item.get('account')]);
-    state      = deleteStatus(state, status.get('id'), status.get('account'), references);
+    state      = deleteStatus(state, status.get('id'), status.get('account'), references, relationship.id);
   });
 
   return state;
diff --git a/app/javascript/flavours/glitch/styles/_mixins.scss b/app/javascript/flavours/glitch/styles/_mixins.scss
index 586802185..d542b1083 100644
--- a/app/javascript/flavours/glitch/styles/_mixins.scss
+++ b/app/javascript/flavours/glitch/styles/_mixins.scss
@@ -1,6 +1,5 @@
 @mixin avatar-radius() {
   border-radius: $ui-avatar-border-size;
-  background: transparent no-repeat;
   background-position: 50%;
   background-clip: padding-box;
 }
diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss
index 42f53f525..05c7821e4 100644
--- a/app/javascript/flavours/glitch/styles/admin.scss
+++ b/app/javascript/flavours/glitch/styles/admin.scss
@@ -220,6 +220,11 @@ $content-width: 840px;
       color: $error-value-color;
       font-weight: 500;
     }
+
+    .neutral-hint {
+      color: $dark-text-color;
+      font-weight: 500;
+    }
   }
 
   @media screen and (max-width: $no-columns-breakpoint) {
diff --git a/app/javascript/flavours/glitch/styles/components/accounts.scss b/app/javascript/flavours/glitch/styles/components/accounts.scss
index 0b7b58bb0..00380c575 100644
--- a/app/javascript/flavours/glitch/styles/components/accounts.scss
+++ b/app/javascript/flavours/glitch/styles/components/accounts.scss
@@ -79,68 +79,8 @@
   background: lighten($ui-base-color, 4%);
 }
 
-.account__header {
-  flex: 0 0 auto;
-  background: lighten($ui-base-color, 4%);
-  text-align: center;
-  background-size: cover;
-  background-position: center;
-  position: relative;
-
-  .account__avatar {
-    @include avatar-radius();
-    @include avatar-size(90px);
-    display: block;
-    margin: 0 auto 10px;
-    overflow: hidden;
-  }
-
-  &.inactive {
-    opacity: 0.5;
-
-    .account__header__avatar {
-      filter: grayscale(100%);
-    }
-
-    .account__header__username {
-      color: $secondary-text-color;
-    }
-  }
-
-  & > div {
-    background: rgba(lighten($ui-base-color, 4%), 0.9);
-    padding: 20px 10px;
-  }
-
-  .account__header__content {
-    color: $secondary-text-color;
-  }
-
-  .account__header__display-name {
-    color: $primary-text-color;
-    display: inline-block;
-    width: 100%;
-    font-size: 20px;
-    line-height: 27px;
-    font-weight: 500;
-    overflow: hidden;
-    text-overflow: ellipsis;
-  }
-
-  .account__header__username {
-    color: $highlight-text-color;
-    font-size: 14px;
-    font-weight: 400;
-    display: block;
-    margin-bottom: 10px;
-    overflow: hidden;
-    text-overflow: ellipsis;
-  }
-}
-
 .account__disclaimer {
   padding: 10px;
-  border-top: 1px solid lighten($ui-base-color, 8%);
   color: $dark-text-color;
 
   strong {
@@ -166,39 +106,6 @@
   }
 }
 
-.account__header__content {
-  color: $darker-text-color;
-  font-size: 14px;
-  font-weight: 400;
-  overflow: hidden;
-  word-break: normal;
-  word-wrap: break-word;
-
-  p {
-    margin-bottom: 20px;
-
-    &:last-child {
-      margin-bottom: 0;
-    }
-  }
-
-  a {
-    color: inherit;
-    text-decoration: underline;
-
-    &:hover {
-      text-decoration: none;
-    }
-  }
-}
-
-.account__header__display-name {
-  .emojione {
-    width: 25px;
-    height: 25px;
-  }
-}
-
 .account__action-bar {
   border-top: 1px solid lighten($ui-base-color, 8%);
   border-bottom: 1px solid lighten($ui-base-color, 8%);
@@ -208,24 +115,6 @@
   display: flex;
 }
 
-.account__action-bar-dropdown {
-  padding: 10px;
-
-  .dropdown--active {
-    .dropdown__content.dropdown__right {
-      left: 6px;
-      right: initial;
-    }
-
-    &::after {
-      bottom: initial;
-      margin-left: 11px;
-      margin-top: -7px;
-      right: initial;
-    }
-  }
-}
-
 .account__action-bar-links {
   display: flex;
   flex: 1 1 auto;
@@ -241,6 +130,10 @@
   padding: 10px 0;
   border-bottom: 4px solid transparent;
 
+  &:first-child {
+    border-left: 0;
+  }
+
   &.active {
     border-bottom: 4px solid $ui-highlight-color;
   }
@@ -270,15 +163,6 @@
   }
 }
 
-.account__header__avatar {
-  background-size: 90px 90px;
-  display: block;
-  height: 90px;
-  margin: 0 auto 10px;
-  overflow: hidden;
-  width: 90px;
-}
-
 .account-authorize {
   padding: 14px 10px;
 
@@ -427,42 +311,22 @@
   }
 }
 
-.account--follows-info {
+.relationship-tag {
   color: $primary-text-color;
-  position: absolute;
-  top: 10px;
-  left: 10px;
-  opacity: 0.7;
-  display: inline-block;
+  margin-bottom: 4px;
+  display: block;
   vertical-align: top;
-  background-color: rgba($base-overlay-background, 0.4);
+  background-color: $base-overlay-background;
   text-transform: uppercase;
   font-size: 11px;
   font-weight: 500;
   padding: 4px;
   border-radius: 4px;
-}
-
-.account--muting-info {
-  color: $primary-text-color;
-  position: absolute;
-  top: 40px;
-  left: 10px;
   opacity: 0.7;
-  display: inline-block;
-  vertical-align: top;
-  background-color: rgba($base-overlay-background, 0.4);
-  text-transform: uppercase;
-  font-size: 11px;
-  font-weight: 500;
-  padding: 4px;
-  border-radius: 4px;
-}
 
-.account--action-button {
-  position: absolute;
-  top: 10px;
-  right: 20px;
+  &:hover {
+    opacity: 1;
+  }
 }
 
 .account-gallery__container {
@@ -614,8 +478,193 @@
   }
 }
 
-.account__header .roles {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  padding: 0 15px;
+.account__header__content {
+  color: $darker-text-color;
+  font-size: 14px;
+  font-weight: 400;
+  overflow: hidden;
+  word-break: normal;
+  word-wrap: break-word;
+
+  p {
+    margin-bottom: 20px;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
+
+  a {
+    color: inherit;
+    text-decoration: underline;
+
+    &:hover {
+      text-decoration: none;
+    }
+  }
+}
+
+.account__header {
+  overflow: hidden;
+
+  &.inactive {
+    opacity: 0.5;
+
+    .account__header__image,
+    .account__avatar {
+      filter: grayscale(100%);
+    }
+  }
+
+  &__info {
+    position: absolute;
+    top: 10px;
+    left: 10px;
+  }
+
+  &__image {
+    overflow: hidden;
+    height: 145px;
+    position: relative;
+    background: darken($ui-base-color, 4%);
+
+    img {
+      object-fit: cover;
+      display: block;
+      width: 100%;
+      height: 100%;
+      margin: 0;
+    }
+  }
+
+  &__bar {
+    position: relative;
+    background: lighten($ui-base-color, 4%);
+    padding: 5px;
+    border-bottom: 1px solid lighten($ui-base-color, 12%);
+
+    .avatar {
+      display: block;
+      flex: 0 0 auto;
+      width: 94px;
+      margin-left: -2px;
+
+      .account__avatar {
+        background: darken($ui-base-color, 8%);
+        border: 2px solid lighten($ui-base-color, 4%);
+      }
+    }
+  }
+
+  &__tabs {
+    display: flex;
+    align-items: flex-start;
+    padding: 7px 5px;
+    margin-top: -55px;
+
+    &__buttons {
+      display: flex;
+      align-items: center;
+      padding-top: 55px;
+      overflow: hidden;
+
+      .icon-button {
+        border: 1px solid lighten($ui-base-color, 12%);
+        border-radius: 4px;
+        box-sizing: content-box;
+        padding: 2px;
+      }
+
+      .button {
+        margin: 0 8px;
+      }
+    }
+
+    &__name {
+      padding: 5px;
+
+      .account-role {
+        vertical-align: top;
+      }
+
+      .emojione {
+        width: 22px;
+        height: 22px;
+      }
+
+      h1 {
+        font-size: 16px;
+        line-height: 24px;
+        color: $primary-text-color;
+        font-weight: 500;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+
+        small {
+          display: block;
+          font-size: 14px;
+          color: $darker-text-color;
+          font-weight: 400;
+          overflow: hidden;
+          text-overflow: ellipsis;
+        }
+      }
+    }
+
+    .spacer {
+      flex: 1 1 auto;
+    }
+  }
+
+  &__bio {
+    overflow: hidden;
+    margin: 0 -5px;
+
+    .account__header__content {
+      padding: 20px 15px;
+      padding-bottom: 5px;
+      color: $primary-text-color;
+    }
+
+    .account__header__fields {
+      margin: 0;
+      border-top: 1px solid lighten($ui-base-color, 12%);
+
+      a {
+        color: lighten($ui-highlight-color, 8%);
+      }
+
+      dl:first-child .verified {
+        border-radius: 0 4px 0 0;
+      }
+
+      .verified a {
+        color: $valid-value-color;
+      }
+    }
+  }
+
+  &__extra {
+    margin-top: 4px;
+
+    &__links {
+      font-size: 14px;
+      color: $darker-text-color;
+
+      a {
+        display: inline-block;
+        color: $darker-text-color;
+        text-decoration: none;
+        padding: 10px;
+        padding-top: 20px;
+        font-weight: 500;
+
+        strong {
+          font-weight: 700;
+          color: $primary-text-color;
+        }
+      }
+    }
+  }
 }
diff --git a/app/javascript/flavours/glitch/styles/components/drawer.scss b/app/javascript/flavours/glitch/styles/components/drawer.scss
index f4931c36c..d22783b94 100644
--- a/app/javascript/flavours/glitch/styles/components/drawer.scss
+++ b/app/javascript/flavours/glitch/styles/components/drawer.scss
@@ -196,43 +196,35 @@
   overflow-y: auto;
 
   & > header {
-    border-bottom: 1px solid darken($ui-base-color, 4%);
-    padding: 15px 10px;
     color: $dark-text-color;
     background: lighten($ui-base-color, 2%);
-    font-size: 14px;
+    padding: 15px;
     font-weight: 500;
+    font-size: 16px;
+    cursor: default;
+
+    .fa {
+      display: inline-block;
+      margin-right: 5px;
+    }
   }
 
   & > section {
-    background: $ui-base-color;
-    margin-bottom: 20px;
+    margin-bottom: 5px;
 
     h5 {
-      position: relative;
-
-      &::before {
-        content: "";
-        display: block;
-        position: absolute;
-        left: 0;
-        right: 0;
-        top: 50%;
-        width: 100%;
-        height: 0;
-        border-top: 1px solid lighten($ui-base-color, 8%);
-      }
+      background: darken($ui-base-color, 4%);
+      border-bottom: 1px solid lighten($ui-base-color, 8%);
+      cursor: default;
+      display: flex;
+      padding: 15px;
+      font-weight: 500;
+      font-size: 16px;
+      color: $dark-text-color;
 
-      span {
+      .fa {
         display: inline-block;
-        background: $ui-base-color;
-        color: $darker-text-color;
-        font-size: 14px;
-        font-weight: 500;
-        padding: 10px;
-        position: relative;
-        z-index: 1;
-        cursor: default;
+        margin-right: 5px;
       }
     }
 
diff --git a/app/javascript/flavours/glitch/styles/components/emoji.scss b/app/javascript/flavours/glitch/styles/components/emoji.scss
index ccfd42f28..dd386d698 100644
--- a/app/javascript/flavours/glitch/styles/components/emoji.scss
+++ b/app/javascript/flavours/glitch/styles/components/emoji.scss
@@ -44,11 +44,11 @@
   box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
   overflow: hidden;
 
-  li {
+  button {
     display: block;
     cursor: pointer;
     border: 0;
-    padding: 3px 8px;
+    padding: 4px 8px;
     background: transparent;
 
     &:hover,
diff --git a/app/javascript/flavours/glitch/styles/components/emoji_picker.scss b/app/javascript/flavours/glitch/styles/components/emoji_picker.scss
index 171623352..dcc551c5b 100644
--- a/app/javascript/flavours/glitch/styles/components/emoji_picker.scss
+++ b/app/javascript/flavours/glitch/styles/components/emoji_picker.scss
@@ -1,5 +1,3 @@
-@import '~emoji-mart/css/emoji-mart.css';
-
 .emoji-mart {
   &,
   * {
@@ -53,14 +51,6 @@
 
   &:hover {
     color: darken($lighter-text-color, 4%);
-
-    svg {
-      fill: darken($lighter-text-color, 4%);
-    }
-  }
-
-  svg {
-    fill: $lighter-text-color;
   }
 }
 
@@ -69,19 +59,11 @@
 
   &:hover {
     color: darken($highlight-text-color, 4%);
-
-    svg {
-      fill: darken($highlight-text-color, 4%);
-    }
   }
 
   .emoji-mart-anchor-bar {
     bottom: 0;
   }
-
-  svg {
-    fill: $highlight-text-color;
-  }
 }
 
 .emoji-mart-anchor-bar {
@@ -101,6 +83,7 @@
   }
 
   svg {
+    fill: currentColor;
     max-height: 18px;
   }
 }
@@ -120,14 +103,15 @@
 }
 
 .emoji-mart-search {
-  margin: 10px 40px 10px 5px;
+  padding: 10px;
+  padding-right: 45px;
   background: $simple-background-color;
 
   input {
     font-size: 14px;
     font-weight: 400;
     padding: 7px 9px;
-    font-family: $font-sans-serif;
+    font-family: inherit;
     display: block;
     width: 100%;
     background: rgba($ui-secondary-color, 0.3);
@@ -182,7 +166,6 @@
     font-weight: 500;
     padding: 5px 6px;
     background: $simple-background-color;
-    font-family: $font-sans-serif;
   }
 }
 
diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss
index b9811f25c..b098676b0 100644
--- a/app/javascript/flavours/glitch/styles/components/index.scss
+++ b/app/javascript/flavours/glitch/styles/components/index.scss
@@ -35,6 +35,17 @@
     transition: all 200ms ease-out;
   }
 
+  &--destructive {
+    transition: none;
+
+    &:active,
+    &:focus,
+    &:hover {
+      background-color: $error-red;
+      transition: none;
+    }
+  }
+
   &:disabled {
     background-color: $ui-primary-color;
     cursor: default;
@@ -269,9 +280,7 @@
 
 .display-name {
   display: block;
-  padding: 6px 0;
   max-width: 100%;
-  height: 36px;
   overflow: hidden;
   text-overflow: ellipsis;
   white-space: nowrap;
@@ -1263,7 +1272,6 @@ noscript {
 @import 'domains';
 @import 'status';
 @import 'modal';
-@import 'metadata';
 @import 'composer';
 @import 'columns';
 @import 'regeneration_indicator';
diff --git a/app/javascript/flavours/glitch/styles/components/metadata.scss b/app/javascript/flavours/glitch/styles/components/metadata.scss
index da045574a..e69de29bb 100644
--- a/app/javascript/flavours/glitch/styles/components/metadata.scss
+++ b/app/javascript/flavours/glitch/styles/components/metadata.scss
@@ -1,45 +0,0 @@
-.account__header .account__header__fields {
-  font-size: 15px;
-  line-height: 20px;
-  overflow: hidden;
-  margin: 20px -10px -20px;
-  border-bottom: 0;
-  border-top: 0;
-
-  dl {
-    background: $ui-base-color;
-    border-top: 1px solid lighten($ui-base-color, 4%);
-    border-bottom: 0;
-    display: flex;
-  }
-
-  dt,
-  dd {
-    box-sizing: border-box;
-    padding: 14px 5px;
-    text-align: center;
-    max-height: 48px;
-    overflow: hidden;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-  }
-
-  dt {
-    color: $darker-text-color;
-    background: lighten($ui-base-color, 13%);
-    width: 120px;
-    flex: 0 0 auto;
-    font-weight: 500;
-  }
-
-  dd {
-    flex: 1 1 auto;
-    color: $primary-text-color;
-    background: $ui-base-color;
-
-    &.verified {
-      border: 1px solid rgba($valid-value-color, 0.5);
-      background: rgba($valid-value-color, 0.25);
-    }
-  }
-}
diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss
index 3598959e7..fece8593b 100644
--- a/app/javascript/flavours/glitch/styles/components/modal.scss
+++ b/app/javascript/flavours/glitch/styles/components/modal.scss
@@ -671,6 +671,7 @@
 
 .confirmation-modal__action-bar,
 .mute-modal__action-bar {
+  .confirmation-modal__secondary-button,
   .confirmation-modal__cancel-button,
   .mute-modal__cancel-button {
     background-color: transparent;
diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index 9d2757065..b73dd3d09 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -357,6 +357,7 @@
 
 .status__info__account {
   display: flex;
+  align-items: center;
 }
 
 .status-check-box {
diff --git a/app/javascript/flavours/glitch/styles/containers.scss b/app/javascript/flavours/glitch/styles/containers.scss
index fd334f869..b27524739 100644
--- a/app/javascript/flavours/glitch/styles/containers.scss
+++ b/app/javascript/flavours/glitch/styles/containers.scss
@@ -10,12 +10,10 @@
 }
 
 .logo-container {
-  margin: 100px auto;
-  margin-bottom: 50px;
+  margin: 100px auto 50px;
 
-  @media screen and (max-width: 400px) {
-    margin: 30px auto;
-    margin-bottom: 20px;
+  @media screen and (max-width: 500px) {
+    margin: 40px auto 0;
   }
 
   h1 {
@@ -683,6 +681,7 @@
           color: $darker-text-color;
           text-decoration: none;
           padding: 15px;
+          font-weight: 500;
 
           strong {
             font-weight: 700;
diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss
index 9ef45e425..91888d305 100644
--- a/app/javascript/flavours/glitch/styles/forms.scss
+++ b/app/javascript/flavours/glitch/styles/forms.scss
@@ -475,6 +475,42 @@ code {
       }
     }
   }
+
+  &__overlay-area {
+    position: relative;
+
+    &__overlay {
+      position: absolute;
+      top: 0;
+      left: 0;
+      width: 100%;
+      height: 100%;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      background: rgba($ui-base-color, 0.65);
+      backdrop-filter: blur(2px);
+      border-radius: 4px;
+
+      &__content {
+        text-align: center;
+
+        &.rich-formatting {
+          &,
+          p {
+            color: $primary-text-color;
+          }
+        }
+      }
+    }
+  }
+}
+
+.block-icon {
+  display: block;
+  margin: 0 auto;
+  margin-bottom: 10px;
+  font-size: 24px;
 }
 
 .flash-message {
@@ -818,13 +854,19 @@ code {
     flex: 1;
     flex-direction: column;
     flex-shrink: 1;
+    max-width: 50%;
 
     &-sep {
+      align-self: center;
       flex-grow: 0;
       overflow: visible;
       position: relative;
       z-index: 1;
     }
+
+    p {
+      word-break: break-word;
+    }
   }
 
   .account__avatar {
@@ -846,12 +888,13 @@ code {
       height: 100%;
       left: 50%;
       position: absolute;
+      top: 0;
       width: 1px;
     }
   }
 
   &__row {
-    align-items: center;
+    align-items: flex-start;
     display: flex;
     flex-direction: row;
   }
diff --git a/app/javascript/flavours/glitch/styles/metadata.scss b/app/javascript/flavours/glitch/styles/metadata.scss
deleted file mode 100644
index 280848959..000000000
--- a/app/javascript/flavours/glitch/styles/metadata.scss
+++ /dev/null
@@ -1,56 +0,0 @@
-.account__header__fields {
-  $meta-table-border: lighten($ui-base-color, 8%);
-  padding: 0;
-  margin: 15px -15px -15px -15px;
-  border: 0 none;
-  border-top: 1px solid $meta-table-border;
-  border-bottom: 1px solid $meta-table-border;
-  font-size: 14px;
-  line-height: 20px;
-
-  dl {
-    display: flex;
-    border-bottom: 1px solid $meta-table-border;
-  }
-
-  dt,
-  dd {
-    box-sizing: border-box;
-    padding: 14px;
-    text-align: center;
-    max-height: 48px;
-    overflow: hidden;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-  }
-
-  dt {
-    padding-left: 15px;
-    font-weight: 500;
-    text-align: center;
-    width: 120px;
-    flex: 0 0 auto;
-    color: $secondary-text-color;
-    background: darken($ui-base-color, 8%);
-  }
-
-  dd {
-    flex: 1 1 auto;
-    color: $darker-text-color;
-  }
-
-  a {
-    color: $highlight-text-color;
-    text-decoration: none;
-
-    &:hover,
-    &:focus,
-    &:active {
-      text-decoration: underline;
-    }
-  }
-
-  dl:last-child {
-    border-bottom: 0;
-  }
-}
diff --git a/app/javascript/flavours/glitch/styles/stream_entries.scss b/app/javascript/flavours/glitch/styles/stream_entries.scss
index 45dcf70ed..6735049b9 100644
--- a/app/javascript/flavours/glitch/styles/stream_entries.scss
+++ b/app/javascript/flavours/glitch/styles/stream_entries.scss
@@ -192,6 +192,7 @@
     .status__info .status__display-name {
       display: block;
       max-width: 100%;
+      padding: 6px 0;
       padding-right: 25px;
       margin: initial;
 
diff --git a/app/javascript/flavours/glitch/styles/widgets.scss b/app/javascript/flavours/glitch/styles/widgets.scss
index 645192ea4..307e509d5 100644
--- a/app/javascript/flavours/glitch/styles/widgets.scss
+++ b/app/javascript/flavours/glitch/styles/widgets.scss
@@ -352,6 +352,7 @@
     border-radius: 50%;
     position: relative;
     margin-left: -10px;
+    background: darken($ui-base-color, 8%);
     border: 2px solid $ui-base-color;
 
     &:nth-child(1) {
diff --git a/app/javascript/flavours/glitch/util/api.js b/app/javascript/flavours/glitch/util/api.js
index 033d2d67b..c59a24518 100644
--- a/app/javascript/flavours/glitch/util/api.js
+++ b/app/javascript/flavours/glitch/util/api.js
@@ -13,10 +13,14 @@ export const getLinks = response => {
 };
 
 let csrfHeader = {};
+
 function setCSRFHeader() {
-  const csrfToken = document.querySelector('meta[name=csrf-token]').content;
-  csrfHeader['X-CSRF-Token'] = csrfToken;
+  const csrfToken = document.querySelector('meta[name=csrf-token]');
+  if (csrfToken) {
+    csrfHeader['X-CSRF-Token'] = csrfToken.content;
+  }
 }
+
 ready(setCSRFHeader);
 
 export default getState => axios.create({
diff --git a/app/javascript/flavours/glitch/util/emoji/emoji_picker.js b/app/javascript/flavours/glitch/util/emoji/emoji_picker.js
index 73fcaa8c8..044d38cb2 100644
--- a/app/javascript/flavours/glitch/util/emoji/emoji_picker.js
+++ b/app/javascript/flavours/glitch/util/emoji/emoji_picker.js
@@ -1,5 +1,5 @@
-import Picker from 'emoji-mart/dist-modern/components/picker/picker';
-import Emoji from 'emoji-mart/dist-modern/components/emoji/emoji';
+import Picker from 'emoji-mart/dist-es/components/picker/picker';
+import Emoji from 'emoji-mart/dist-es/components/emoji/emoji';
 
 export {
   Picker,
diff --git a/app/javascript/mastodon/actions/identity_proofs.js b/app/javascript/mastodon/actions/identity_proofs.js
new file mode 100644
index 000000000..449debf61
--- /dev/null
+++ b/app/javascript/mastodon/actions/identity_proofs.js
@@ -0,0 +1,30 @@
+import api from '../api';
+
+export const IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST = 'IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST';
+export const IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS = 'IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS';
+export const IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL    = 'IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL';
+
+export const fetchAccountIdentityProofs = accountId => (dispatch, getState) => {
+  dispatch(fetchAccountIdentityProofsRequest(accountId));
+
+  api(getState).get(`/api/v1/accounts/${accountId}/identity_proofs`)
+    .then(({ data }) => dispatch(fetchAccountIdentityProofsSuccess(accountId, data)))
+    .catch(err => dispatch(fetchAccountIdentityProofsFail(accountId, err)));
+};
+
+export const fetchAccountIdentityProofsRequest = id => ({
+  type: IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST,
+  id,
+});
+
+export const fetchAccountIdentityProofsSuccess = (accountId, identity_proofs) => ({
+  type: IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS,
+  accountId,
+  identity_proofs,
+});
+
+export const fetchAccountIdentityProofsFail = (accountId, err) => ({
+  type: IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL,
+  accountId,
+  err,
+});
diff --git a/app/javascript/mastodon/actions/search.js b/app/javascript/mastodon/actions/search.js
index b670d25c3..7c06670eb 100644
--- a/app/javascript/mastodon/actions/search.js
+++ b/app/javascript/mastodon/actions/search.js
@@ -37,6 +37,7 @@ export function submitSearch() {
       params: {
         q: value,
         resolve: true,
+        limit: 5,
       },
     }).then(response => {
       if (response.data.accounts) {
diff --git a/app/javascript/mastodon/api.js b/app/javascript/mastodon/api.js
index 4be3eadb0..98d59de43 100644
--- a/app/javascript/mastodon/api.js
+++ b/app/javascript/mastodon/api.js
@@ -13,10 +13,14 @@ export const getLinks = response => {
 };
 
 let csrfHeader = {};
+
 function setCSRFHeader() {
-  const csrfToken = document.querySelector('meta[name=csrf-token]').content;
-  csrfHeader['X-CSRF-Token'] = csrfToken;
+  const csrfToken = document.querySelector('meta[name=csrf-token]');
+  if (csrfToken) {
+    csrfHeader['X-CSRF-Token'] = csrfToken.content;
+  }
 }
+
 ready(setCSRFHeader);
 
 export default getState => axios.create({
diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js
index 53d17d418..0bfbd8879 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/mastodon/components/status_action_bar.js
@@ -139,7 +139,7 @@ class StatusActionBar extends ImmutablePureComponent {
   }
 
   handleBlockClick = () => {
-    this.props.onBlock(this.props.status.get('account'));
+    this.props.onBlock(this.props.status);
   }
 
   handleOpen = () => {
diff --git a/app/javascript/mastodon/components/status_content.js b/app/javascript/mastodon/components/status_content.js
index 70713047d..fa8901386 100644
--- a/app/javascript/mastodon/components/status_content.js
+++ b/app/javascript/mastodon/components/status_content.js
@@ -183,14 +183,14 @@ export default class StatusContent extends React.PureComponent {
       return (
         <div className={classNames} ref={this.setRef} tabIndex='0' style={directionStyle} onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp}>
           <p style={{ marginBottom: hidden && status.get('mentions').isEmpty() ? '0px' : null }}>
-            <span dangerouslySetInnerHTML={spoilerContent} />
+            <span dangerouslySetInnerHTML={spoilerContent} lang={status.get('language')} />
             {' '}
             <button tabIndex='0' className={`status__content__spoiler-link ${hidden ? 'status__content__spoiler-link--show-more' : 'status__content__spoiler-link--show-less'}`} onClick={this.handleSpoilerClick}>{toggleText}</button>
           </p>
 
           {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' : ''}`} style={directionStyle} dangerouslySetInnerHTML={content} lang={status.get('language')} />
         </div>
       );
     } else if (this.props.onClick) {
@@ -202,6 +202,7 @@ export default class StatusContent extends React.PureComponent {
           className={classNames}
           style={directionStyle}
           dangerouslySetInnerHTML={content}
+          lang={status.get('language')}
           onMouseDown={this.handleMouseDown}
           onMouseUp={this.handleMouseUp}
         />,
@@ -220,6 +221,7 @@ export default class StatusContent extends React.PureComponent {
           className='status__content'
           style={directionStyle}
           dangerouslySetInnerHTML={content}
+          lang={status.get('language')}
         />
       );
     }
diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/mastodon/containers/status_container.js
index b3555c76e..0fce674e2 100644
--- a/app/javascript/mastodon/containers/status_container.js
+++ b/app/javascript/mastodon/containers/status_container.js
@@ -38,6 +38,7 @@ const messages = defineMessages({
   blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },
   replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
   replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
+  blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' },
 });
 
 const makeMapStateToProps = () => {
@@ -134,11 +135,17 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
     dispatch(openModal('VIDEO', { media, time }));
   },
 
-  onBlock (account) {
+  onBlock (status) {
+    const account = status.get('account');
     dispatch(openModal('CONFIRM', {
       message: <FormattedMessage id='confirmations.block.message' defaultMessage='Are you sure you want to block {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
       confirm: intl.formatMessage(messages.blockConfirm),
       onConfirm: () => dispatch(blockAccount(account.get('id'))),
+      secondary: intl.formatMessage(messages.blockAndReport),
+      onSecondary: () => {
+        dispatch(blockAccount(account.get('id')));
+        dispatch(initReport(account, status));
+      },
     }));
   },
 
diff --git a/app/javascript/mastodon/features/account/components/action_bar.js b/app/javascript/mastodon/features/account/components/action_bar.js
deleted file mode 100644
index 8ed4c917a..000000000
--- a/app/javascript/mastodon/features/account/components/action_bar.js
+++ /dev/null
@@ -1,190 +0,0 @@
-import React from 'react';
-import ImmutablePropTypes from 'react-immutable-proptypes';
-import PropTypes from 'prop-types';
-import DropdownMenuContainer from '../../../containers/dropdown_menu_container';
-import { NavLink } from 'react-router-dom';
-import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import { me, isStaff  } from '../../../initial_state';
-import { shortNumberFormat } from '../../../utils/numbers';
-
-const messages = defineMessages({
-  mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' },
-  direct: { id: 'account.direct', defaultMessage: 'Direct message @{name}' },
-  edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
-  unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
-  unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
-  unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
-  block: { id: 'account.block', defaultMessage: 'Block @{name}' },
-  mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
-  follow: { id: 'account.follow', defaultMessage: 'Follow' },
-  report: { id: 'account.report', defaultMessage: 'Report @{name}' },
-  share: { id: 'account.share', defaultMessage: 'Share @{name}\'s profile' },
-  media: { id: 'account.media', defaultMessage: 'Media' },
-  blockDomain: { id: 'account.block_domain', defaultMessage: 'Hide everything from {domain}' },
-  unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' },
-  hideReblogs: { id: 'account.hide_reblogs', defaultMessage: 'Hide boosts from @{name}' },
-  showReblogs: { id: 'account.show_reblogs', defaultMessage: 'Show boosts from @{name}' },
-  pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned toots' },
-  preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
-  follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
-  favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' },
-  lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
-  blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },
-  domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Hidden domains' },
-  mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' },
-  endorse: { id: 'account.endorse', defaultMessage: 'Feature on profile' },
-  unendorse: { id: 'account.unendorse', defaultMessage: 'Don\'t feature on profile' },
-  add_or_remove_from_list: { id: 'account.add_or_remove_from_list', defaultMessage: 'Add or Remove from lists' },
-  admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
-});
-
-export default @injectIntl
-class ActionBar extends React.PureComponent {
-
-  static propTypes = {
-    account: ImmutablePropTypes.map.isRequired,
-    onFollow: PropTypes.func,
-    onBlock: PropTypes.func.isRequired,
-    onMention: PropTypes.func.isRequired,
-    onDirect: PropTypes.func.isRequired,
-    onReblogToggle: PropTypes.func.isRequired,
-    onReport: PropTypes.func.isRequired,
-    onMute: PropTypes.func.isRequired,
-    onBlockDomain: PropTypes.func.isRequired,
-    onUnblockDomain: PropTypes.func.isRequired,
-    onEndorseToggle: PropTypes.func.isRequired,
-    onAddToList: PropTypes.func.isRequired,
-    intl: PropTypes.object.isRequired,
-  };
-
-  handleShare = () => {
-    navigator.share({
-      url: this.props.account.get('url'),
-    });
-  }
-
-  isStatusesPageActive = (match, location) => {
-    if (!match) {
-      return false;
-    }
-    return !location.pathname.match(/\/(followers|following)\/?$/);
-  }
-
-  render () {
-    const { account, intl } = this.props;
-
-    let menu = [];
-    let extraInfo = '';
-
-    if (account.get('id') !== me) {
-      menu.push({ text: intl.formatMessage(messages.mention, { name: account.get('username') }), action: this.props.onMention });
-      menu.push({ text: intl.formatMessage(messages.direct, { name: account.get('username') }), action: this.props.onDirect });
-      menu.push(null);
-    }
-
-    if ('share' in navigator) {
-      menu.push({ text: intl.formatMessage(messages.share, { name: account.get('username') }), action: this.handleShare });
-      menu.push(null);
-    }
-
-    if (account.get('id') === me) {
-      menu.push({ text: intl.formatMessage(messages.edit_profile), href: '/settings/profile' });
-      menu.push({ text: intl.formatMessage(messages.preferences), href: '/settings/preferences' });
-      menu.push({ text: intl.formatMessage(messages.pins), to: '/pinned' });
-      menu.push(null);
-      menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' });
-      menu.push({ text: intl.formatMessage(messages.favourites), to: '/favourites' });
-      menu.push({ text: intl.formatMessage(messages.lists), to: '/lists' });
-      menu.push(null);
-      menu.push({ text: intl.formatMessage(messages.mutes), to: '/mutes' });
-      menu.push({ text: intl.formatMessage(messages.blocks), to: '/blocks' });
-      menu.push({ text: intl.formatMessage(messages.domain_blocks), to: '/domain_blocks' });
-    } else {
-      if (account.getIn(['relationship', 'following'])) {
-        if (account.getIn(['relationship', 'showing_reblogs'])) {
-          menu.push({ text: intl.formatMessage(messages.hideReblogs, { name: account.get('username') }), action: this.props.onReblogToggle });
-        } else {
-          menu.push({ text: intl.formatMessage(messages.showReblogs, { name: account.get('username') }), action: this.props.onReblogToggle });
-        }
-
-        menu.push({ text: intl.formatMessage(account.getIn(['relationship', 'endorsed']) ? messages.unendorse : messages.endorse), action: this.props.onEndorseToggle });
-        menu.push({ text: intl.formatMessage(messages.add_or_remove_from_list), action: this.props.onAddToList });
-        menu.push(null);
-      }
-
-      if (account.getIn(['relationship', 'muting'])) {
-        menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.props.onMute });
-      } else {
-        menu.push({ text: intl.formatMessage(messages.mute, { name: account.get('username') }), action: this.props.onMute });
-      }
-
-      if (account.getIn(['relationship', 'blocking'])) {
-        menu.push({ text: intl.formatMessage(messages.unblock, { name: account.get('username') }), action: this.props.onBlock });
-      } else {
-        menu.push({ text: intl.formatMessage(messages.block, { name: account.get('username') }), action: this.props.onBlock });
-      }
-
-      menu.push({ text: intl.formatMessage(messages.report, { name: account.get('username') }), action: this.props.onReport });
-    }
-
-    if (account.get('acct') !== account.get('username')) {
-      const domain = account.get('acct').split('@')[1];
-
-      extraInfo = (
-        <div className='account__disclaimer'>
-          <FormattedMessage
-            id='account.disclaimer_full'
-            defaultMessage="Information below may reflect the user's profile incompletely."
-          />
-          {' '}
-          <a target='_blank' rel='noopener' href={account.get('url')}>
-            <FormattedMessage id='account.view_full_profile' defaultMessage='View full profile' />
-          </a>
-        </div>
-      );
-
-      menu.push(null);
-
-      if (account.getIn(['relationship', 'domain_blocking'])) {
-        menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain }), action: this.props.onUnblockDomain });
-      } else {
-        menu.push({ text: intl.formatMessage(messages.blockDomain, { domain }), action: this.props.onBlockDomain });
-      }
-    }
-
-    if (account.get('id') !== me && isStaff) {
-      menu.push(null);
-      menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: `/admin/accounts/${account.get('id')}` });
-    }
-
-    return (
-      <div>
-        {extraInfo}
-
-        <div className='account__action-bar'>
-          <div className='account__action-bar-links'>
-            <NavLink isActive={this.isStatusesPageActive} activeClassName='active' className='account__action-bar__tab' to={`/accounts/${account.get('id')}`} title={intl.formatNumber(account.get('statuses_count'))}>
-              <FormattedMessage id='account.posts' defaultMessage='Toots' />
-              <strong>{shortNumberFormat(account.get('statuses_count'))}</strong>
-            </NavLink>
-
-            <NavLink exact activeClassName='active' className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`} title={intl.formatNumber(account.get('following_count'))}>
-              <FormattedMessage id='account.follows' defaultMessage='Follows' />
-              <strong>{shortNumberFormat(account.get('following_count'))}</strong>
-            </NavLink>
-
-            <NavLink exact activeClassName='active' className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`} title={intl.formatNumber(account.get('followers_count'))}>
-              <FormattedMessage id='account.followers' defaultMessage='Followers' />
-              <strong>{shortNumberFormat(account.get('followers_count'))}</strong>
-            </NavLink>
-          </div>
-
-          <div className='account__action-bar-dropdown'>
-            <DropdownMenuContainer items={menu} icon='ellipsis-v' size={24} direction='right' />
-          </div>
-        </div>
-      </div>
-    );
-  }
-
-}
diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js
index 7fe6d6a4f..f21ba8a9c 100644
--- a/app/javascript/mastodon/features/account/components/header.js
+++ b/app/javascript/mastodon/features/account/components/header.js
@@ -2,13 +2,15 @@ import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import IconButton from '../../../components/icon_button';
-import Motion from '../../ui/util/optional_motion';
-import spring from 'react-motion/lib/spring';
+import Button from 'mastodon/components/button';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import { autoPlayGif, me } from '../../../initial_state';
+import { autoPlayGif, me, isStaff } from 'mastodon/initial_state';
 import classNames from 'classnames';
 import Icon from 'mastodon/components/icon';
+import Avatar from 'mastodon/components/avatar';
+import { shortNumberFormat } from 'mastodon/utils/numbers';
+import { NavLink } from 'react-router-dom';
+import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container';
 
 const messages = defineMessages({
   unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
@@ -18,6 +20,32 @@ const messages = defineMessages({
   edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
   linkVerifiedOn: { id: 'account.link_verified_on', defaultMessage: 'Ownership of this link was checked on {date}' },
   account_locked: { id: 'account.locked_info', defaultMessage: 'This account privacy status is set to locked. The owner manually reviews who can follow them.' },
+  mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' },
+  direct: { id: 'account.direct', defaultMessage: 'Direct message @{name}' },
+  edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
+  unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
+  unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
+  block: { id: 'account.block', defaultMessage: 'Block @{name}' },
+  mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
+  report: { id: 'account.report', defaultMessage: 'Report @{name}' },
+  share: { id: 'account.share', defaultMessage: 'Share @{name}\'s profile' },
+  media: { id: 'account.media', defaultMessage: 'Media' },
+  blockDomain: { id: 'account.block_domain', defaultMessage: 'Hide everything from {domain}' },
+  unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' },
+  hideReblogs: { id: 'account.hide_reblogs', defaultMessage: 'Hide boosts from @{name}' },
+  showReblogs: { id: 'account.show_reblogs', defaultMessage: 'Show boosts from @{name}' },
+  pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned toots' },
+  preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
+  follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
+  favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' },
+  lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
+  blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },
+  domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Hidden domains' },
+  mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' },
+  endorse: { id: 'account.endorse', defaultMessage: 'Feature on profile' },
+  unendorse: { id: 'account.unendorse', defaultMessage: 'Don\'t feature on profile' },
+  add_or_remove_from_list: { id: 'account.add_or_remove_from_list', defaultMessage: 'Add or Remove from lists' },
+  admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
 });
 
 const dateFormatOptions = {
@@ -29,120 +57,66 @@ const dateFormatOptions = {
   minute: '2-digit',
 };
 
-class Avatar extends ImmutablePureComponent {
-
-  static propTypes = {
-    account: ImmutablePropTypes.map.isRequired,
-  };
-
-  state = {
-    isHovered: false,
-  };
-
-  handleMouseOver = () => {
-    if (this.state.isHovered) return;
-    this.setState({ isHovered: true });
-  }
-
-  handleMouseOut = () => {
-    if (!this.state.isHovered) return;
-    this.setState({ isHovered: false });
-  }
-
-  render () {
-    const { account }   = this.props;
-    const { isHovered } = this.state;
-
-    return (
-      <Motion defaultStyle={{ radius: 90 }} style={{ radius: spring(isHovered ? 30 : 90, { stiffness: 180, damping: 12 }) }}>
-        {({ radius }) => (
-          <a
-            href={account.get('url')}
-            className='account__header__avatar'
-            role='presentation'
-            target='_blank'
-            rel='noopener'
-            style={{ borderRadius: `${radius}px`, backgroundImage: `url(${autoPlayGif || isHovered ? account.get('avatar') : account.get('avatar_static')})` }}
-            onMouseOver={this.handleMouseOver}
-            onMouseOut={this.handleMouseOut}
-            onFocus={this.handleMouseOver}
-            onBlur={this.handleMouseOut}
-          >
-            <span style={{ display: 'none' }}>{account.get('acct')}</span>
-          </a>
-        )}
-      </Motion>
-    );
-  }
-
-}
-
 export default @injectIntl
 class Header extends ImmutablePureComponent {
 
   static propTypes = {
     account: ImmutablePropTypes.map,
+    identity_props: ImmutablePropTypes.list,
     onFollow: PropTypes.func.isRequired,
     onBlock: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
+    domain: PropTypes.string.isRequired,
   };
 
   openEditProfile = () => {
     window.open('/settings/profile', '_blank');
   }
 
+  isStatusesPageActive = (match, location) => {
+    if (!match) {
+      return false;
+    }
+
+    return !location.pathname.match(/\/(followers|following)\/?$/);
+  }
+
   render () {
-    const { account, intl } = this.props;
+    const { account, intl, domain, identity_proofs } = this.props;
 
     if (!account) {
       return null;
     }
 
-    let info        = '';
-    let mutingInfo  = '';
+    let info        = [];
     let actionBtn   = '';
     let lockedIcon  = '';
+    let menu        = [];
 
     if (me !== account.get('id') && account.getIn(['relationship', 'followed_by'])) {
-      info = <span className='account--follows-info'><FormattedMessage id='account.follows_you' defaultMessage='Follows you' /></span>;
+      info.push(<span key='followed_by' className='relationship-tag'><FormattedMessage id='account.follows_you' defaultMessage='Follows you' /></span>);
     } else if (me !== account.get('id') && account.getIn(['relationship', 'blocking'])) {
-      info = <span className='account--follows-info'><FormattedMessage id='account.blocked' defaultMessage='Blocked' /></span>;
+      info.push(<span key='blocked' className='relationship-tag'><FormattedMessage id='account.blocked' defaultMessage='Blocked' /></span>);
     }
 
     if (me !== account.get('id') && account.getIn(['relationship', 'muting'])) {
-      mutingInfo = <span className='account--muting-info'><FormattedMessage id='account.muted' defaultMessage='Muted' /></span>;
+      info.push(<span key='muted' className='relationship-tag'><FormattedMessage id='account.muted' defaultMessage='Muted' /></span>);
     } else if (me !== account.get('id') && account.getIn(['relationship', 'domain_blocking'])) {
-      mutingInfo = <span className='account--muting-info'><FormattedMessage id='account.domain_blocked' defaultMessage='Domain hidden' /></span>;
+      info.push(<span key='domain_blocked' className='relationship-tag'><FormattedMessage id='account.domain_blocked' defaultMessage='Domain hidden' /></span>);
     }
 
     if (me !== account.get('id')) {
       if (!account.get('relationship')) { // Wait until the relationship is loaded
         actionBtn = '';
       } else if (account.getIn(['relationship', 'requested'])) {
-        actionBtn = (
-          <div className='account--action-button'>
-            <IconButton size={26} active icon='hourglass' title={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />
-          </div>
-        );
+        actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />;
       } else if (!account.getIn(['relationship', 'blocking'])) {
-        actionBtn = (
-          <div className='account--action-button'>
-            <IconButton size={26} icon={account.getIn(['relationship', 'following']) ? 'user-times' : 'user-plus'} active={account.getIn(['relationship', 'following'])} title={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={this.props.onFollow} />
-          </div>
-        );
+        actionBtn = <Button disabled={account.getIn(['relationship', 'blocked_by'])} className={classNames('logo-button', { 'button--destructive': account.getIn(['relationship', 'following']) })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={this.props.onFollow} />;
       } else if (account.getIn(['relationship', 'blocking'])) {
-        actionBtn = (
-          <div className='account--action-button'>
-            <IconButton size={26} icon='unlock' title={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.props.onBlock} />
-          </div>
-        );
+        actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.props.onBlock} />;
       }
     } else {
-      actionBtn = (
-        <div className='account--action-button'>
-          <IconButton size={26} icon='pencil' title={intl.formatMessage(messages.edit_profile)} onClick={this.openEditProfile} />
-        </div>
-      );
+      actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.edit_profile)} onClick={this.openEditProfile} />;
     }
 
     if (account.get('moved') && !account.getIn(['relationship', 'following'])) {
@@ -153,40 +127,157 @@ class Header extends ImmutablePureComponent {
       lockedIcon = <Icon id='lock' title={intl.formatMessage(messages.account_locked)} />;
     }
 
+    if (account.get('id') !== me) {
+      menu.push({ text: intl.formatMessage(messages.mention, { name: account.get('username') }), action: this.props.onMention });
+      menu.push({ text: intl.formatMessage(messages.direct, { name: account.get('username') }), action: this.props.onDirect });
+      menu.push(null);
+    }
+
+    if ('share' in navigator) {
+      menu.push({ text: intl.formatMessage(messages.share, { name: account.get('username') }), action: this.handleShare });
+      menu.push(null);
+    }
+
+    if (account.get('id') === me) {
+      menu.push({ text: intl.formatMessage(messages.edit_profile), href: '/settings/profile' });
+      menu.push({ text: intl.formatMessage(messages.preferences), href: '/settings/preferences' });
+      menu.push({ text: intl.formatMessage(messages.pins), to: '/pinned' });
+      menu.push(null);
+      menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' });
+      menu.push({ text: intl.formatMessage(messages.favourites), to: '/favourites' });
+      menu.push({ text: intl.formatMessage(messages.lists), to: '/lists' });
+      menu.push(null);
+      menu.push({ text: intl.formatMessage(messages.mutes), to: '/mutes' });
+      menu.push({ text: intl.formatMessage(messages.blocks), to: '/blocks' });
+      menu.push({ text: intl.formatMessage(messages.domain_blocks), to: '/domain_blocks' });
+    } else {
+      if (account.getIn(['relationship', 'following'])) {
+        if (account.getIn(['relationship', 'showing_reblogs'])) {
+          menu.push({ text: intl.formatMessage(messages.hideReblogs, { name: account.get('username') }), action: this.props.onReblogToggle });
+        } else {
+          menu.push({ text: intl.formatMessage(messages.showReblogs, { name: account.get('username') }), action: this.props.onReblogToggle });
+        }
+
+        menu.push({ text: intl.formatMessage(account.getIn(['relationship', 'endorsed']) ? messages.unendorse : messages.endorse), action: this.props.onEndorseToggle });
+        menu.push({ text: intl.formatMessage(messages.add_or_remove_from_list), action: this.props.onAddToList });
+        menu.push(null);
+      }
+
+      if (account.getIn(['relationship', 'muting'])) {
+        menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.props.onMute });
+      } else {
+        menu.push({ text: intl.formatMessage(messages.mute, { name: account.get('username') }), action: this.props.onMute });
+      }
+
+      if (account.getIn(['relationship', 'blocking'])) {
+        menu.push({ text: intl.formatMessage(messages.unblock, { name: account.get('username') }), action: this.props.onBlock });
+      } else {
+        menu.push({ text: intl.formatMessage(messages.block, { name: account.get('username') }), action: this.props.onBlock });
+      }
+
+      menu.push({ text: intl.formatMessage(messages.report, { name: account.get('username') }), action: this.props.onReport });
+    }
+
+    if (account.get('acct') !== account.get('username')) {
+      const domain = account.get('acct').split('@')[1];
+
+      menu.push(null);
+
+      if (account.getIn(['relationship', 'domain_blocking'])) {
+        menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain }), action: this.props.onUnblockDomain });
+      } else {
+        menu.push({ text: intl.formatMessage(messages.blockDomain, { domain }), action: this.props.onBlockDomain });
+      }
+    }
+
+    if (account.get('id') !== me && isStaff) {
+      menu.push(null);
+      menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: `/admin/accounts/${account.get('id')}` });
+    }
+
     const content         = { __html: account.get('note_emojified') };
     const displayNameHtml = { __html: account.get('display_name_html') };
     const fields          = account.get('fields');
-    const badge           = account.get('bot') ? (<div className='roles'><div className='account-role bot'><FormattedMessage id='account.badges.bot' defaultMessage='Bot' /></div></div>) : null;
+    const badge           = account.get('bot') ? (<div className='account-role bot'><FormattedMessage id='account.badges.bot' defaultMessage='Bot' /></div>) : null;
+    const acct            = account.get('acct').indexOf('@') === -1 && domain ? `${account.get('acct')}@${domain}` : account.get('acct');
 
     return (
-      <div className={classNames('account__header', { inactive: !!account.get('moved') })} style={{ backgroundImage: `url(${autoPlayGif ? account.get('header') : account.get('header_static')})` }}>
-        <div>
-          <Avatar account={account} />
+      <div className={classNames('account__header', { inactive: !!account.get('moved') })}>
+        <div className='account__header__image'>
+          <div className='account__header__info'>
+            {info}
+          </div>
 
-          <span className='account__header__display-name' dangerouslySetInnerHTML={displayNameHtml} />
-          <span className='account__header__username'>@{account.get('acct')} {lockedIcon}</span>
+          <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' className='parallax' />
+        </div>
 
-          {badge}
+        <div className='account__header__bar'>
+          <div className='account__header__tabs'>
+            <a className='avatar' href={account.get('url')} rel='noopener' target='_blank'>
+              <Avatar account={account} size={90} />
+            </a>
 
-          <div className='account__header__content' dangerouslySetInnerHTML={content} />
+            <div className='spacer' />
 
-          {fields.size > 0 && (
-            <div className='account__header__fields'>
-              {fields.map((pair, i) => (
-                <dl key={i}>
-                  <dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} />
+            <div className='account__header__tabs__buttons'>
+              {actionBtn}
 
-                  <dd className={pair.get('verified_at') && 'verified'} title={pair.get('value_plain')}>
-                    {pair.get('verified_at') && <span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(pair.get('verified_at'), dateFormatOptions) })}><Icon id='check' className='verified__mark' /></span>} <span dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} />
-                  </dd>
-                </dl>
-              ))}
+              <DropdownMenuContainer items={menu} icon='ellipsis-v' size={24} direction='right' />
             </div>
-          )}
+          </div>
+
+          <div className='account__header__tabs__name'>
+            <h1>
+              <span dangerouslySetInnerHTML={displayNameHtml} /> {badge}
+              <small>@{acct} {lockedIcon}</small>
+            </h1>
+          </div>
+
+          <div className='account__header__extra'>
+            <div className='account__header__bio'>
+              { (fields.size > 0 || identity_proofs.size > 0) && (
+                <div className='account__header__fields'>
+                  {identity_proofs.map((proof, i) => (
+                    <dl key={i}>
+                      <dt dangerouslySetInnerHTML={{ __html: proof.get('provider') }} />
+
+                      <dd className='verified'>
+                        <a href={proof.get('proof_url')} target='_blank' rel='noopener'><span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(proof.get('updated_at'), dateFormatOptions) })}>
+                          <Icon id='check' className='verified__mark' />
+                        </span></a>
+                        <a href={proof.get('profile_url')} target='_blank' rel='noopener'><span dangerouslySetInnerHTML={{ __html: ' '+proof.get('provider_username') }} /></a>
+                      </dd>
+                    </dl>
+                  ))}
+                  {fields.map((pair, i) => (
+                    <dl key={i}>
+                      <dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} />
 
-          {info}
-          {mutingInfo}
-          {actionBtn}
+                      <dd className={pair.get('verified_at') && 'verified'} title={pair.get('value_plain')}>
+                        {pair.get('verified_at') && <span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(pair.get('verified_at'), dateFormatOptions) })}><Icon id='check' className='verified__mark' /></span>} <span dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} />
+                      </dd>
+                    </dl>
+                  ))}
+                </div>
+              )}
+
+              {account.get('note').length > 0 && account.get('note') !== '<p></p>' && <div className='account__header__content' dangerouslySetInnerHTML={content} />}
+            </div>
+
+            <div className='account__header__extra__links'>
+              <NavLink isActive={this.isStatusesPageActive} activeClassName='active' to={`/accounts/${account.get('id')}`} title={intl.formatNumber(account.get('statuses_count'))}>
+                <strong>{shortNumberFormat(account.get('statuses_count'))}</strong> <FormattedMessage id='account.posts' defaultMessage='Toots' />
+              </NavLink>
+
+              <NavLink exact activeClassName='active' to={`/accounts/${account.get('id')}/following`} title={intl.formatNumber(account.get('following_count'))}>
+                <strong>{shortNumberFormat(account.get('following_count'))}</strong> <FormattedMessage id='account.follows' defaultMessage='Follows' />
+              </NavLink>
+
+              <NavLink exact activeClassName='active' to={`/accounts/${account.get('id')}/followers`} title={intl.formatNumber(account.get('followers_count'))}>
+                <strong>{shortNumberFormat(account.get('followers_count'))}</strong> <FormattedMessage id='account.followers' defaultMessage='Followers' />
+              </NavLink>
+            </div>
+          </div>
         </div>
       </div>
     );
diff --git a/app/javascript/mastodon/features/account_timeline/components/header.js b/app/javascript/mastodon/features/account_timeline/components/header.js
index 779e116e0..27dfcc516 100644
--- a/app/javascript/mastodon/features/account_timeline/components/header.js
+++ b/app/javascript/mastodon/features/account_timeline/components/header.js
@@ -2,7 +2,6 @@ import React from 'react';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import PropTypes from 'prop-types';
 import InnerHeader from '../../account/components/header';
-import ActionBar from '../../account/components/action_bar';
 import MissingIndicator from '../../../components/missing_indicator';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import MovedNote from './moved_note';
@@ -13,6 +12,7 @@ export default class Header extends ImmutablePureComponent {
 
   static propTypes = {
     account: ImmutablePropTypes.map,
+    identity_proofs: ImmutablePropTypes.list,
     onFollow: PropTypes.func.isRequired,
     onBlock: PropTypes.func.isRequired,
     onMention: PropTypes.func.isRequired,
@@ -25,6 +25,7 @@ export default class Header extends ImmutablePureComponent {
     onEndorseToggle: PropTypes.func.isRequired,
     onAddToList: PropTypes.func.isRequired,
     hideTabs: PropTypes.bool,
+    domain: PropTypes.string.isRequired,
   };
 
   static contextTypes = {
@@ -84,7 +85,7 @@ export default class Header extends ImmutablePureComponent {
   }
 
   render () {
-    const { account, hideTabs } = this.props;
+    const { account, hideTabs, identity_proofs } = this.props;
 
     if (account === null) {
       return <MissingIndicator />;
@@ -96,13 +97,9 @@ export default class Header extends ImmutablePureComponent {
 
         <InnerHeader
           account={account}
+          identity_proofs={identity_proofs}
           onFollow={this.handleFollow}
           onBlock={this.handleBlock}
-        />
-
-        <ActionBar
-          account={account}
-          onBlock={this.handleBlock}
           onMention={this.handleMention}
           onDirect={this.handleDirect}
           onReblogToggle={this.handleReblogToggle}
@@ -112,6 +109,7 @@ export default class Header extends ImmutablePureComponent {
           onUnblockDomain={this.handleUnblockDomain}
           onEndorseToggle={this.handleEndorseToggle}
           onAddToList={this.handleAddToList}
+          domain={this.props.domain}
         />
 
         {!hideTabs && (
diff --git a/app/javascript/mastodon/features/account_timeline/containers/header_container.js b/app/javascript/mastodon/features/account_timeline/containers/header_container.js
index 0fd79d036..4d4ae6e82 100644
--- a/app/javascript/mastodon/features/account_timeline/containers/header_container.js
+++ b/app/javascript/mastodon/features/account_timeline/containers/header_container.js
@@ -21,11 +21,13 @@ import { openModal } from '../../../actions/modal';
 import { blockDomain, unblockDomain } from '../../../actions/domain_blocks';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import { unfollowModal } from '../../../initial_state';
+import { List as ImmutableList } from 'immutable';
 
 const messages = defineMessages({
   unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
   blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },
   blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Hide entire domain' },
+  blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' },
 });
 
 const makeMapStateToProps = () => {
@@ -33,6 +35,8 @@ const makeMapStateToProps = () => {
 
   const mapStateToProps = (state, { accountId }) => ({
     account: getAccount(state, accountId),
+    domain: state.getIn(['meta', 'domain']),
+    identity_proofs: state.getIn(['identity_proofs', accountId], ImmutableList()),
   });
 
   return mapStateToProps;
@@ -64,6 +68,11 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
         message: <FormattedMessage id='confirmations.block.message' defaultMessage='Are you sure you want to block {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
         confirm: intl.formatMessage(messages.blockConfirm),
         onConfirm: () => dispatch(blockAccount(account.get('id'))),
+        secondary: intl.formatMessage(messages.blockAndReport),
+        onSecondary: () => {
+          dispatch(blockAccount(account.get('id')));
+          dispatch(initReport(account));
+        },
       }));
     }
   },
diff --git a/app/javascript/mastodon/features/account_timeline/index.js b/app/javascript/mastodon/features/account_timeline/index.js
index afc484c60..71341debb 100644
--- a/app/javascript/mastodon/features/account_timeline/index.js
+++ b/app/javascript/mastodon/features/account_timeline/index.js
@@ -12,15 +12,19 @@ import ColumnBackButton from '../../components/column_back_button';
 import { List as ImmutableList } from 'immutable';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { FormattedMessage } from 'react-intl';
+import { fetchAccountIdentityProofs } from '../../actions/identity_proofs';
+
+const emptyList = ImmutableList();
 
 const mapStateToProps = (state, { params: { accountId }, withReplies = false }) => {
   const path = withReplies ? `${accountId}:with_replies` : accountId;
 
   return {
-    statusIds: state.getIn(['timelines', `account:${path}`, 'items'], ImmutableList()),
-    featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], ImmutableList()),
+    statusIds: state.getIn(['timelines', `account:${path}`, 'items'], emptyList),
+    featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], emptyList),
     isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']),
-    hasMore:   state.getIn(['timelines', `account:${path}`, 'hasMore']),
+    hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']),
+    blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false),
   };
 };
 
@@ -36,24 +40,31 @@ class AccountTimeline extends ImmutablePureComponent {
     isLoading: PropTypes.bool,
     hasMore: PropTypes.bool,
     withReplies: PropTypes.bool,
+    blockedBy: PropTypes.bool,
   };
 
   componentWillMount () {
     const { params: { accountId }, withReplies } = this.props;
 
     this.props.dispatch(fetchAccount(accountId));
+    this.props.dispatch(fetchAccountIdentityProofs(accountId));
+
     if (!withReplies) {
       this.props.dispatch(expandAccountFeaturedTimeline(accountId));
     }
+
     this.props.dispatch(expandAccountTimeline(accountId, { withReplies }));
   }
 
   componentWillReceiveProps (nextProps) {
     if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) {
       this.props.dispatch(fetchAccount(nextProps.params.accountId));
+      this.props.dispatch(fetchAccountIdentityProofs(nextProps.params.accountId));
+
       if (!nextProps.withReplies) {
         this.props.dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId));
       }
+
       this.props.dispatch(expandAccountTimeline(nextProps.params.accountId, { withReplies: nextProps.params.withReplies }));
     }
   }
@@ -63,7 +74,7 @@ class AccountTimeline extends ImmutablePureComponent {
   }
 
   render () {
-    const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore } = this.props;
+    const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy } = this.props;
 
     if (!statusIds && isLoading) {
       return (
@@ -73,6 +84,8 @@ class AccountTimeline extends ImmutablePureComponent {
       );
     }
 
+    const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_timeline_blocked' defaultMessage='You are blocked' /> : <FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />;
+
     return (
       <Column>
         <ColumnBackButton />
@@ -81,13 +94,13 @@ class AccountTimeline extends ImmutablePureComponent {
           prepend={<HeaderContainer accountId={this.props.params.accountId} />}
           alwaysPrepend
           scrollKey='account_timeline'
-          statusIds={statusIds}
+          statusIds={blockedBy ? emptyList : statusIds}
           featuredStatusIds={featuredStatusIds}
           isLoading={isLoading}
           hasMore={hasMore}
           onLoadMore={this.handleLoadMore}
           shouldUpdateScroll={shouldUpdateScroll}
-          emptyMessage={<FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />}
+          emptyMessage={emptyMessage}
         />
       </Column>
     );
diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
index 038d93483..c1429c756 100644
--- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
@@ -50,7 +50,6 @@ class ModifierPickerMenu extends React.PureComponent {
     active: PropTypes.bool,
     onSelect: PropTypes.func.isRequired,
     onClose: PropTypes.func.isRequired,
-    modifier: PropTypes.number,
   };
 
   handleClick = e => {
@@ -87,36 +86,20 @@ class ModifierPickerMenu extends React.PureComponent {
 
   setRef = c => {
     this.node = c;
-    if (this.node) {
-      this.node.querySelector('li:first-child button').focus(); // focus the first element when opened
-    }
   }
 
   render () {
-    const { active, modifier } = this.props;
+    const { active } = this.props;
 
     return (
-      <ul
-        className='emoji-picker-dropdown__modifiers__menu'
-        style={{ display: active ? 'block' : 'none' }}
-        role='menuitem'
-        ref={this.setRef}
-      >
-        {[1, 2, 3, 4, 5, 6].map(i => (
-          <li
-            onClick={this.handleClick}
-            role='menuitemradio'
-            aria-checked={i === (modifier || 1)}
-            data-index={i}
-            key={i}
-          >
-            <Emoji
-              emoji='fist' set='twitter' size={22} sheetSize={32} skin={i}
-              backgroundImageFn={backgroundImageFn}
-            />
-          </li>
-        ))}
-      </ul>
+      <div className='emoji-picker-dropdown__modifiers__menu' style={{ display: active ? 'block' : 'none' }} ref={this.setRef}>
+        <button onClick={this.handleClick} data-index={1}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={1} backgroundImageFn={backgroundImageFn} /></button>
+        <button onClick={this.handleClick} data-index={2}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={2} backgroundImageFn={backgroundImageFn} /></button>
+        <button onClick={this.handleClick} data-index={3}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={3} backgroundImageFn={backgroundImageFn} /></button>
+        <button onClick={this.handleClick} data-index={4}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={4} backgroundImageFn={backgroundImageFn} /></button>
+        <button onClick={this.handleClick} data-index={5}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={5} backgroundImageFn={backgroundImageFn} /></button>
+        <button onClick={this.handleClick} data-index={6}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={6} backgroundImageFn={backgroundImageFn} /></button>
+      </div>
     );
   }
 
@@ -148,22 +131,10 @@ class ModifierPicker extends React.PureComponent {
   render () {
     const { active, modifier } = this.props;
 
-    function setRef(ref) {
-      if (!ref) {
-        return;
-      }
-      // TODO: It would be nice if we could pass props directly to emoji-mart's buttons.
-      const button = ref.querySelector('button');
-      button.setAttribute('aria-haspopup', 'true');
-      button.setAttribute('aria-expanded', active);
-    }
-
     return (
       <div className='emoji-picker-dropdown__modifiers'>
-        <div ref={setRef}>
-          <Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={modifier} onClick={this.handleClick} backgroundImageFn={backgroundImageFn} />
-        </div>
-        <ModifierPickerMenu active={active} modifier={modifier} onSelect={this.handleSelect} onClose={this.props.onClose} />
+        <Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={modifier} onClick={this.handleClick} backgroundImageFn={backgroundImageFn} />
+        <ModifierPickerMenu active={active} onSelect={this.handleSelect} onClose={this.props.onClose} />
       </div>
     );
   }
diff --git a/app/javascript/mastodon/features/direct_timeline/components/column_settings.js b/app/javascript/mastodon/features/direct_timeline/components/column_settings.js
deleted file mode 100644
index b629c128d..000000000
--- a/app/javascript/mastodon/features/direct_timeline/components/column_settings.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import React from 'react';
-import PropTypes from 'prop-types';
-import ImmutablePropTypes from 'react-immutable-proptypes';
-import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import SettingText from '../../../components/setting_text';
-
-const messages = defineMessages({
-  filter_regex: { id: 'home.column_settings.filter_regex', defaultMessage: 'Filter out by regular expressions' },
-  settings: { id: 'home.settings', defaultMessage: 'Column settings' },
-});
-
-export default @injectIntl
-class ColumnSettings extends React.PureComponent {
-
-  static propTypes = {
-    settings: ImmutablePropTypes.map.isRequired,
-    onChange: PropTypes.func.isRequired,
-    intl: PropTypes.object.isRequired,
-  };
-
-  render () {
-    const { settings, onChange, intl } = this.props;
-
-    return (
-      <div>
-        <span className='column-settings__section'><FormattedMessage id='home.column_settings.advanced' defaultMessage='Advanced' /></span>
-
-        <div className='column-settings__row'>
-          <SettingText settings={settings} settingKey={['regex', 'body']} onChange={onChange} label={intl.formatMessage(messages.filter_regex)} />
-        </div>
-      </div>
-    );
-  }
-
-}
diff --git a/app/javascript/mastodon/features/direct_timeline/containers/column_settings_container.js b/app/javascript/mastodon/features/direct_timeline/containers/column_settings_container.js
deleted file mode 100644
index 38054ce9e..000000000
--- a/app/javascript/mastodon/features/direct_timeline/containers/column_settings_container.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import { connect } from 'react-redux';
-import ColumnSettings from '../components/column_settings';
-import { changeSetting } from '../../../actions/settings';
-
-const mapStateToProps = state => ({
-  settings: state.getIn(['settings', 'direct']),
-});
-
-const mapDispatchToProps = dispatch => ({
-
-  onChange (key, checked) {
-    dispatch(changeSetting(['direct', ...key], checked));
-  },
-
-});
-
-export default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);
diff --git a/app/javascript/mastodon/features/emoji/emoji_picker.js b/app/javascript/mastodon/features/emoji/emoji_picker.js
index 73fcaa8c8..044d38cb2 100644
--- a/app/javascript/mastodon/features/emoji/emoji_picker.js
+++ b/app/javascript/mastodon/features/emoji/emoji_picker.js
@@ -1,5 +1,5 @@
-import Picker from 'emoji-mart/dist-modern/components/picker/picker';
-import Emoji from 'emoji-mart/dist-modern/components/emoji/emoji';
+import Picker from 'emoji-mart/dist-es/components/picker/picker';
+import Emoji from 'emoji-mart/dist-es/components/emoji/emoji';
 
 export {
   Picker,
diff --git a/app/javascript/mastodon/features/followers/index.js b/app/javascript/mastodon/features/followers/index.js
index ce56f270c..167f61b31 100644
--- a/app/javascript/mastodon/features/followers/index.js
+++ b/app/javascript/mastodon/features/followers/index.js
@@ -20,6 +20,7 @@ import ScrollableList from '../../components/scrollable_list';
 const mapStateToProps = (state, props) => ({
   accountIds: state.getIn(['user_lists', 'followers', props.params.accountId, 'items']),
   hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']),
+  blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
 });
 
 export default @connect(mapStateToProps)
@@ -31,6 +32,7 @@ class Followers extends ImmutablePureComponent {
     shouldUpdateScroll: PropTypes.func,
     accountIds: ImmutablePropTypes.list,
     hasMore: PropTypes.bool,
+    blockedBy: PropTypes.bool,
   };
 
   componentWillMount () {
@@ -50,7 +52,7 @@ class Followers extends ImmutablePureComponent {
   }, 300, { leading: true });
 
   render () {
-    const { shouldUpdateScroll, accountIds, hasMore } = this.props;
+    const { shouldUpdateScroll, accountIds, hasMore, blockedBy } = this.props;
 
     if (!accountIds) {
       return (
@@ -60,7 +62,7 @@ class Followers extends ImmutablePureComponent {
       );
     }
 
-    const emptyMessage = <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;
+    const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_timeline_blocked' defaultMessage='You are blocked' /> : <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;
 
     return (
       <Column>
@@ -75,7 +77,7 @@ class Followers extends ImmutablePureComponent {
           alwaysPrepend
           emptyMessage={emptyMessage}
         >
-          {accountIds.map(id =>
+          {blockedBy ? [] : accountIds.map(id =>
             <AccountContainer key={id} id={id} withNote={false} />
           )}
         </ScrollableList>
diff --git a/app/javascript/mastodon/features/following/index.js b/app/javascript/mastodon/features/following/index.js
index bda0438a0..87638e051 100644
--- a/app/javascript/mastodon/features/following/index.js
+++ b/app/javascript/mastodon/features/following/index.js
@@ -20,6 +20,7 @@ import ScrollableList from '../../components/scrollable_list';
 const mapStateToProps = (state, props) => ({
   accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),
   hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),
+  blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
 });
 
 export default @connect(mapStateToProps)
@@ -31,6 +32,7 @@ class Following extends ImmutablePureComponent {
     shouldUpdateScroll: PropTypes.func,
     accountIds: ImmutablePropTypes.list,
     hasMore: PropTypes.bool,
+    blockedBy: PropTypes.bool,
   };
 
   componentWillMount () {
@@ -50,7 +52,7 @@ class Following extends ImmutablePureComponent {
   }, 300, { leading: true });
 
   render () {
-    const { shouldUpdateScroll, accountIds, hasMore } = this.props;
+    const { shouldUpdateScroll, accountIds, hasMore, blockedBy } = this.props;
 
     if (!accountIds) {
       return (
@@ -60,7 +62,7 @@ class Following extends ImmutablePureComponent {
       );
     }
 
-    const emptyMessage = <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />;
+    const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_timeline_blocked' defaultMessage='You are blocked' /> : <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />;
 
     return (
       <Column>
@@ -75,7 +77,7 @@ class Following extends ImmutablePureComponent {
           alwaysPrepend
           emptyMessage={emptyMessage}
         >
-          {accountIds.map(id =>
+          {blockedBy ? [] : accountIds.map(id =>
             <AccountContainer key={id} id={id} withNote={false} />
           )}
         </ScrollableList>
diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js
index 73be1fc5f..3e511b7a6 100644
--- a/app/javascript/mastodon/features/status/components/action_bar.js
+++ b/app/javascript/mastodon/features/status/components/action_bar.js
@@ -92,7 +92,7 @@ class ActionBar extends React.PureComponent {
   }
 
   handleBlockClick = () => {
-    this.props.onBlock(this.props.status.get('account'));
+    this.props.onBlock(this.props.status);
   }
 
   handleReport = () => {
diff --git a/app/javascript/mastodon/features/status/containers/detailed_status_container.js b/app/javascript/mastodon/features/status/containers/detailed_status_container.js
index 2c0db0a6b..61e0c428a 100644
--- a/app/javascript/mastodon/features/status/containers/detailed_status_container.js
+++ b/app/javascript/mastodon/features/status/containers/detailed_status_container.js
@@ -38,6 +38,7 @@ const messages = defineMessages({
   blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },
   replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
   replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
+  blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' },
 });
 
 const makeMapStateToProps = () => {
@@ -135,11 +136,17 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
     dispatch(openModal('VIDEO', { media, time }));
   },
 
-  onBlock (account) {
+  onBlock (status) {
+    const account = status.get('account');
     dispatch(openModal('CONFIRM', {
       message: <FormattedMessage id='confirmations.block.message' defaultMessage='Are you sure you want to block {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
       confirm: intl.formatMessage(messages.blockConfirm),
       onConfirm: () => dispatch(blockAccount(account.get('id'))),
+      secondary: intl.formatMessage(messages.blockAndReport),
+      onSecondary: () => {
+        dispatch(blockAccount(account.get('id')));
+        dispatch(initReport(account, status));
+      },
     }));
   },
 
diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js
index 3b5febcac..c0ea460e8 100644
--- a/app/javascript/mastodon/features/status/index.js
+++ b/app/javascript/mastodon/features/status/index.js
@@ -57,6 +57,7 @@ const messages = defineMessages({
   detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' },
   replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
   replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
+  blockAndReport: { id: 'confirmations.block.block_and_report', defaultMessage: 'Block & Report' },
 });
 
 const makeMapStateToProps = () => {
@@ -253,13 +254,19 @@ class Status extends ImmutablePureComponent {
     }
   }
 
-  handleBlockClick = (account) => {
+  handleBlockClick = (status) => {
     const { dispatch, intl } = this.props;
+    const account = status.get('account');
 
     dispatch(openModal('CONFIRM', {
       message: <FormattedMessage id='confirmations.block.message' defaultMessage='Are you sure you want to block {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
       confirm: intl.formatMessage(messages.blockConfirm),
       onConfirm: () => dispatch(blockAccount(account.get('id'))),
+      secondary: intl.formatMessage(messages.blockAndReport),
+      onSecondary: () => {
+        dispatch(blockAccount(account.get('id')));
+        dispatch(initReport(account, status));
+      },
     }));
   }
 
diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modal.js b/app/javascript/mastodon/features/ui/components/confirmation_modal.js
index f0f3ad134..1227fa453 100644
--- a/app/javascript/mastodon/features/ui/components/confirmation_modal.js
+++ b/app/javascript/mastodon/features/ui/components/confirmation_modal.js
@@ -11,6 +11,8 @@ class ConfirmationModal extends React.PureComponent {
     confirm: PropTypes.string.isRequired,
     onClose: PropTypes.func.isRequired,
     onConfirm: PropTypes.func.isRequired,
+    secondary: PropTypes.string,
+    onSecondary: PropTypes.func,
     intl: PropTypes.object.isRequired,
   };
 
@@ -23,6 +25,11 @@ class ConfirmationModal extends React.PureComponent {
     this.props.onConfirm();
   }
 
+  handleSecondary = () => {
+    this.props.onClose();
+    this.props.onSecondary();
+  }
+
   handleCancel = () => {
     this.props.onClose();
   }
@@ -32,7 +39,7 @@ class ConfirmationModal extends React.PureComponent {
   }
 
   render () {
-    const { message, confirm } = this.props;
+    const { message, confirm, secondary } = this.props;
 
     return (
       <div className='modal-root__modal confirmation-modal'>
@@ -44,6 +51,9 @@ class ConfirmationModal extends React.PureComponent {
           <Button onClick={this.handleCancel} className='confirmation-modal__cancel-button'>
             <FormattedMessage id='confirmation_modal.cancel' defaultMessage='Cancel' />
           </Button>
+          {secondary !== undefined && (
+            <Button text={secondary} onClick={this.handleSecondary} className='confirmation-modal__secondary-button' />
+          )}
           <Button text={confirm} onClick={this.handleClick} ref={this.setRef} />
         </div>
       </div>
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 0acc7aedb..6ed799941 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -5,7 +5,6 @@
   "account.block_domain": "إخفاء كل شيئ قادم من إسم النطاق {domain}",
   "account.blocked": "محظور",
   "account.direct": "رسالة خاصة إلى @{name}",
-  "account.disclaimer_full": "قد لا تعكس المعلومات أدناه الملف الشخصي الكامل للمستخدم.",
   "account.domain_blocked": "النطاق مخفي",
   "account.edit_profile": "تعديل الملف الشخصي",
   "account.endorse": "خاصّية على الملف الشخصي",
@@ -36,7 +35,6 @@
   "account.unfollow": "إلغاء المتابعة",
   "account.unmute": "إلغاء الكتم عن @{name}",
   "account.unmute_notifications": "إلغاء كتم إخطارات @{name}",
-  "account.view_full_profile": "عرض الملف الشخصي كاملا",
   "alert.unexpected.message": "لقد طرأ هناك خطأ غير متوقّع.",
   "alert.unexpected.title": "المعذرة !",
   "boost_modal.combo": "يمكنك/ي ضغط {combo} لتخطّي هذه في المرّة القادمة",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "النص غير مخفي",
   "compose_form.spoiler_placeholder": "تنبيه عن المحتوى",
   "confirmation_modal.cancel": "إلغاء",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "حجب",
   "confirmations.block.message": "هل أنت متأكد أنك تريد حجب {name} ؟",
   "confirmations.delete.confirm": "حذف",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "لم تقم بكتم أي مستخدم بعد.",
   "empty_column.notifications": "لم تتلق أي إشعار بعدُ. تفاعل مع المستخدمين الآخرين لإنشاء محادثة.",
   "empty_column.public": "لا يوجد أي شيء هنا ! قم بنشر شيء ما للعامة، أو إتبع المستخدمين الآخرين المتواجدين على الخوادم الأخرى لملء خيط المحادثات",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "ترخيص",
   "follow_request.reject": "رفض",
   "getting_started.developers": "المُطوِّرون",
@@ -248,6 +246,7 @@
   "notification.favourite": "أُعجِب {name} بمنشورك",
   "notification.follow": "{name} يتابعك",
   "notification.mention": "{name} ذكرك",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} قام بترقية تبويقك",
   "notifications.clear": "إمسح الإخطارات",
   "notifications.clear_confirmation": "أمتأكد من أنك تود مسح جل الإخطارات الخاصة بك و المتلقاة إلى حد الآن ؟",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "عرض",
   "notifications.column_settings.follow": "متابعُون جُدُد :",
   "notifications.column_settings.mention": "الإشارات :",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "الإخطارات المدفوعة",
   "notifications.column_settings.reblog": "الترقيّات:",
   "notifications.column_settings.show": "إعرِضها في عمود",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "المفضلة",
   "notifications.filter.follows": "يتابِع",
   "notifications.filter.mentions": "الإشارات",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} إشعارات",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "الوُسوم",
   "search_results.statuses": "التبويقات",
   "search_results.total": "{count, number} {count, plural, one {result} و {results}}",
-  "standalone.public_title": "نظرة على ...",
   "status.admin_account": "افتح الواجهة الإدارية لـ @{name}",
   "status.admin_status": "افتح هذا المنشور على واجهة الإشراف",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 86454c2d3..a341567a7 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Anubrir tolo de {domain}",
   "account.blocked": "Blocked",
   "account.direct": "Unviar un mensaxe direutu a @{name}",
-  "account.disclaimer_full": "La información d'embaxo podría reflexar de mou incompletu'l perfil del usuariu.",
   "account.domain_blocked": "Dominiu anubríu",
   "account.edit_profile": "Editar el perfil",
   "account.endorse": "Destacar nel perfil",
@@ -36,7 +35,6 @@
   "account.unfollow": "Unfollow",
   "account.unmute": "Unmute @{name}",
   "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account.view_full_profile": "Ver el perfil completu",
   "alert.unexpected.message": "Asocedió un fallu inesperáu.",
   "alert.unexpected.title": "¡Ups!",
   "boost_modal.combo": "Pues primir {combo} pa saltar esto la próxima vegada",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "El testu va anubrise",
   "compose_form.spoiler_placeholder": "Escribi equí l'avertencia",
   "confirmation_modal.cancel": "Encaboxar",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Block",
   "confirmations.block.message": "¿De xuru que quies bloquiar a {name}?",
   "confirmations.delete.confirm": "Delete",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Entá nun silenciesti a dengún usuariu.",
   "empty_column.notifications": "Entá nun tienes dengún avisu. Interactua con otros p'aniciar la conversación.",
   "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Refugar",
   "getting_started.developers": "Desendolcadores",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} siguióte",
   "notification.mention": "{name} mentóte",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} compartió'l to estáu",
   "notifications.clear": "Llimpiar avisos",
   "notifications.clear_confirmation": "¿De xuru que quies llimpiar dafechu tolos avisos?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Siguidores nuevos:",
   "notifications.column_settings.mention": "Menciones:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
   "notifications.column_settings.reblog": "Toots compartíos:",
   "notifications.column_settings.show": "Amosar en columna",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} avisos",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Etiquetes",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "A look inside...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Bloquiar a @{name}",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index ef9c34cac..49e043582 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Редактирай профила си",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Не следвай",
   "account.unmute": "Unmute @{name}",
   "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account.view_full_profile": "View full profile",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "You can press {combo} to skip this next time",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Content warning",
   "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",
@@ -133,7 +132,6 @@
   "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 instances to fill it up",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Authorize",
   "follow_request.reject": "Reject",
   "getting_started.developers": "Developers",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} хареса твоята публикация",
   "notification.follow": "{name} те последва",
   "notification.mention": "{name} те спомена",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} сподели твоята публикация",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Нови последователи:",
   "notifications.column_settings.mention": "Споменавания:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
   "notifications.column_settings.reblog": "Споделяния:",
   "notifications.column_settings.show": "Покажи в колона",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "A look inside...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
new file mode 100644
index 000000000..0d095bdeb
--- /dev/null
+++ b/app/javascript/mastodon/locales/bn.json
@@ -0,0 +1,383 @@
+{
+  "account.add_or_remove_from_list": "লিস্টে আরো যুক্ত বা মুছে ফেলুন",
+  "account.badges.bot": "রোবট",
+  "account.block": "@{name} কে বন্ধ করুন",
+  "account.block_domain": "{domain} থেকে সব সরিয়ে ফেলুন",
+  "account.blocked": "বন্ধ করা হয়েছে",
+  "account.direct": "@{name}কে সরকারি পাঠান",
+  "account.domain_blocked": "বেবিসিটটি সরানো আছে",
+  "account.edit_profile": "Edit profile",
+  "account.endorse": "Feature on profile",
+  "account.follow": "Follow",
+  "account.followers": "Followers",
+  "account.followers.empty": "No one follows this user yet.",
+  "account.follows": "Follows",
+  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows_you": "Follows you",
+  "account.hide_reblogs": "Hide boosts from @{name}",
+  "account.link_verified_on": "Ownership of this link was checked on {date}",
+  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.media": "Media",
+  "account.mention": "Mention @{name}",
+  "account.moved_to": "{name} has moved to:",
+  "account.mute": "Mute @{name}",
+  "account.mute_notifications": "Mute notifications from @{name}",
+  "account.muted": "Muted",
+  "account.posts": "Toots",
+  "account.posts_with_replies": "Toots and replies",
+  "account.report": "Report @{name}",
+  "account.requested": "Awaiting approval. Click to cancel follow request",
+  "account.share": "Share @{name}'s profile",
+  "account.show_reblogs": "Show boosts from @{name}",
+  "account.unblock": "Unblock @{name}",
+  "account.unblock_domain": "Unhide {domain}",
+  "account.unendorse": "Don't feature on profile",
+  "account.unfollow": "Unfollow",
+  "account.unmute": "Unmute @{name}",
+  "account.unmute_notifications": "Unmute notifications from @{name}",
+  "alert.unexpected.message": "An unexpected error occurred.",
+  "alert.unexpected.title": "Oops!",
+  "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.community": "Local timeline",
+  "column.direct": "Direct messages",
+  "column.domain_blocks": "Hidden 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.media_only": "Media 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.publish": "Toot",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.sensitive.marked": "Media is marked as sensitive",
+  "compose_form.sensitive.unmarked": "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.mute.confirm": "Mute",
+  "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}?",
+  "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_timeline": "No toots here!",
+  "empty_column.blocks": "You haven't blocked any users yet.",
+  "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 hidden 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",
+  "follow_request.authorize": "Authorize",
+  "follow_request.reject": "Reject",
+  "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",
+  "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.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.start": "to open \"get started\" column",
+  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+  "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.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.search": "Search among people you follow",
+  "lists.subheading": "Your lists",
+  "loading_indicator.label": "Loading...",
+  "media_gallery.toggle_visible": "Toggle visibility",
+  "missing_indicator.label": "Not found",
+  "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.blocks": "Blocked users",
+  "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.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.mention": "{name} mentioned you",
+  "notification.poll": "A poll you have voted in has ended",
+  "notification.reblog": "{name} boosted your status",
+  "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.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.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.group": "{count} notifications",
+  "poll.closed": "Closed",
+  "poll.refresh": "Refresh",
+  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
+  "poll.vote": "Vote",
+  "poll_button.add_poll": "Add a poll",
+  "poll_button.remove_poll": "Remove poll",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Post to mentioned users only",
+  "privacy.direct.short": "Direct",
+  "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",
+  "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",
+  "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.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.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 to original audience",
+  "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.reply": "Reply",
+  "status.replyAll": "Reply to thread",
+  "status.report": "Report @{name}",
+  "status.sensitive_toggle": "Click to view",
+  "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.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",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.description": "Describe for the visually impaired",
+  "upload_form.focus": "Crop",
+  "upload_form.undo": "Delete",
+  "upload_progress.label": "Uploading...",
+  "video.close": "Close video",
+  "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/ca.json b/app/javascript/mastodon/locales/ca.json
index e7333f6fe..6c98c6ae7 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Amaga-ho tot de {domain}",
   "account.blocked": "Bloquejat",
   "account.direct": "Missatge directe @{name}",
-  "account.disclaimer_full": "La informació següent pot reflectir incompleta el perfil de l'usuari.",
   "account.domain_blocked": "Domini ocult",
   "account.edit_profile": "Editar el perfil",
   "account.endorse": "Recomanar en el teu perfil",
@@ -36,7 +35,6 @@
   "account.unfollow": "Deixa de seguir",
   "account.unmute": "Treure silenci de @{name}",
   "account.unmute_notifications": "Activar notificacions de @{name}",
-  "account.view_full_profile": "Mostra el perfil complet",
   "alert.unexpected.message": "S'ha produït un error inesperat.",
   "alert.unexpected.title": "Vaja!",
   "boost_modal.combo": "Pots premer {combo} per saltar-te això el proper cop",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Text no ocult",
   "compose_form.spoiler_placeholder": "Escriu l'avís aquí",
   "confirmation_modal.cancel": "Cancel·la",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Bloca",
   "confirmations.block.message": "Estàs segur que vols blocar {name}?",
   "confirmations.delete.confirm": "Suprimeix",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Encara no has silenciat cap usuari.",
   "empty_column.notifications": "Encara no tens notificacions. Interactua amb altres per iniciar la conversa.",
   "empty_column.public": "No hi ha res aquí! Escriu públicament alguna cosa o manualment segueix usuaris d'altres servidors per omplir-ho",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autoritzar",
   "follow_request.reject": "Rebutjar",
   "getting_started.developers": "Desenvolupadors",
@@ -158,7 +156,7 @@
   "home.column_settings.show_replies": "Mostrar respostes",
   "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}}",
+  "intervals.full.minutes": "{number, plural, one {# minut} other {# minuts}}",
   "introduction.federation.action": "Següent",
   "introduction.federation.federated.headline": "Federada",
   "introduction.federation.federated.text": "Les publicacions públiques d'altres servidors del fedivers apareixeran a la línia de temps federada.",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} ha afavorit el teu estat",
   "notification.follow": "{name} et segueix",
   "notification.mention": "{name} t'ha esmentat",
+  "notification.poll": "Ha finalitzat una enquesta en la que has votat",
   "notification.reblog": "{name} ha retootejat el teu estat",
   "notifications.clear": "Netejar notificacions",
   "notifications.clear_confirmation": "Estàs segur que vols esborrar permanenment totes les teves notificacions?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Mostra",
   "notifications.column_settings.follow": "Nous seguidors:",
   "notifications.column_settings.mention": "Mencions:",
+  "notifications.column_settings.poll": "Resultats de l’enquesta:",
   "notifications.column_settings.push": "Push notificacions",
   "notifications.column_settings.reblog": "Impulsos:",
   "notifications.column_settings.show": "Mostrar en la columna",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favorits",
   "notifications.filter.follows": "Seguiments",
   "notifications.filter.mentions": "Mencions",
+  "notifications.filter.polls": "Resultats de l'enquesta",
   "notifications.group": "{count} notificacions",
   "poll.closed": "Finalitzada",
   "poll.refresh": "Actualitza",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Etiquetes",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, un {result} altres {results}}",
-  "standalone.public_title": "Una mirada a l'interior ...",
   "status.admin_account": "Obre l'interfície de moderació per a @{name}",
   "status.admin_status": "Obre aquest estat a la interfície de moderació",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 5f4d520d6..154feab98 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Piattà tuttu da {domain}",
   "account.blocked": "Bluccatu",
   "account.direct": "Missaghju direttu @{name}",
-  "account.disclaimer_full": "Ghjè pussibule chì l’infurmazione quì sottu ùn rifletta micca u prufile sanu di l’utilizatore.",
   "account.domain_blocked": "Duminiu piattatu",
   "account.edit_profile": "Mudificà u prufile",
   "account.endorse": "Fà figurà nant'à u prufilu",
@@ -36,7 +35,6 @@
   "account.unfollow": "Ùn siguità più",
   "account.unmute": "Ùn piattà più @{name}",
   "account.unmute_notifications": "Ùn piattà più nutificazione da @{name}",
-  "account.view_full_profile": "Vede tuttu u prufile",
   "alert.unexpected.message": "Un prublemu inaspettatu hè accadutu.",
   "alert.unexpected.title": "Uups!",
   "boost_modal.combo": "Pudete appughjà nant'à {combo} per saltà quessa a prussima volta",
@@ -73,10 +71,10 @@
   "compose_form.lock_disclaimer": "U vostru contu ùn hè micca {locked}. Tuttu u mondu pò seguitavi è vede i vostri statuti privati.",
   "compose_form.lock_disclaimer.lock": "privatu",
   "compose_form.placeholder": "À chè pensate?",
-  "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.add_option": "Aghjustà una scelta",
+  "compose_form.poll.duration": "Durata di u scandagliu",
+  "compose_form.poll.option_placeholder": "Scelta {number}",
+  "compose_form.poll.remove_option": "Toglie sta scelta",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.marked": "Media indicatu cum'è sensibile",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Testu micca piattatu",
   "compose_form.spoiler_placeholder": "Scrive u vostr'avertimentu quì",
   "confirmation_modal.cancel": "Annullà",
+  "confirmations.block.block_and_report": "Bluccà è signalà",
   "confirmations.block.confirm": "Bluccà",
   "confirmations.block.message": "Site sicuru·a che vulete bluccà @{name}?",
   "confirmations.delete.confirm": "Toglie",
@@ -133,12 +132,11 @@
   "empty_column.mutes": "Per avà ùn avete manc'un utilizatore piattatu.",
   "empty_column.notifications": "Ùn avete ancu nisuna nutificazione. Interact with others to start the conversation.",
   "empty_column.public": "Ùn c'hè nunda quì! Scrivete qualcosa in pubblicu o seguitate utilizatori d'altri servori per empie a linea pubblica",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Auturizà",
   "follow_request.reject": "Righjittà",
   "getting_started.developers": "Sviluppatori",
   "getting_started.directory": "Annuariu di i prufili",
-  "getting_started.documentation": "Documentation",
+  "getting_started.documentation": "Ducumentazione",
   "getting_started.heading": "Per principià",
   "getting_started.invite": "Invità ghjente",
   "getting_started.open_source_notice": "Mastodon ghjè un lugiziale liberu. Pudete cuntribuisce à u codice o a traduzione, o palisà un bug, nant'à GitHub: {github}.",
@@ -156,9 +154,9 @@
   "home.column_settings.basic": "Bàsichi",
   "home.column_settings.show_reblogs": "Vede e spartere",
   "home.column_settings.show_replies": "Vede e risposte",
-  "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}}",
+  "intervals.full.days": "{number, plural, one {# ghjornu} other {# ghjorni}}",
+  "intervals.full.hours": "{number, plural, one {# ora} other {# ore}}",
+  "intervals.full.minutes": "{number, plural, one {# minuta} other {# minute}}",
   "introduction.federation.action": "Cuntinuà",
   "introduction.federation.federated.headline": "Federata",
   "introduction.federation.federated.text": "I statuti pubblichi da l'altri servori di u fediverse saranu mustrati nant'à a linea pubblica federata.",
@@ -240,7 +238,7 @@
   "navigation_bar.lists": "Liste",
   "navigation_bar.logout": "Scunnettassi",
   "navigation_bar.mutes": "Utilizatori piattati",
-  "navigation_bar.personal": "Personal",
+  "navigation_bar.personal": "Persunale",
   "navigation_bar.pins": "Statuti puntarulati",
   "navigation_bar.preferences": "Preferenze",
   "navigation_bar.public_timeline": "Linea pubblica glubale",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} hà aghjuntu u vostru statutu à i so favuriti",
   "notification.follow": "{name} v'hà seguitatu",
   "notification.mention": "{name} v'hà mintuvatu",
+  "notification.poll": "Un scandagliu induve avete vutatu hè finitu",
   "notification.reblog": "{name} hà spartutu u vostru statutu",
   "notifications.clear": "Purgà e nutificazione",
   "notifications.clear_confirmation": "Site sicuru·a che vulete toglie tutte ste nutificazione?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Mustrà",
   "notifications.column_settings.follow": "Abbunati novi:",
   "notifications.column_settings.mention": "Minzione:",
+  "notifications.column_settings.poll": "Risultati:",
   "notifications.column_settings.push": "Nutificazione Push",
   "notifications.column_settings.reblog": "Spartere:",
   "notifications.column_settings.show": "Mustrà indè a colonna",
@@ -267,13 +267,14 @@
   "notifications.filter.favourites": "Favuriti",
   "notifications.filter.follows": "Abbunamenti",
   "notifications.filter.mentions": "Minzione",
+  "notifications.filter.polls": "Risultati di u scandagliu",
   "notifications.group": "{count} nutificazione",
   "poll.closed": "Chjosu",
   "poll.refresh": "Attualizà",
   "poll.total_votes": "{count, plural, one {# votu} other {# voti}}",
   "poll.vote": "Vutà",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll_button.add_poll": "Aghjustà un scandagliu",
+  "poll_button.remove_poll": "Toglie u scandagliu",
   "privacy.change": "Mudificà a cunfidenzialità di u statutu",
   "privacy.direct.long": "Mandà solu à quelli chì so mintuvati",
   "privacy.direct.short": "Direttu",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtag",
   "search_results.statuses": "Statuti",
   "search_results.total": "{count, number} {count, plural, one {risultatu} other {risultati}}",
-  "standalone.public_title": "Una vista à l'internu...",
   "status.admin_account": "Apre l'interfaccia di muderazione per @{name}",
   "status.admin_status": "Apre stu statutu in l'interfaccia di muderazione",
   "status.block": "Bluccà @{name}",
@@ -366,7 +366,7 @@
   "upload_area.title": "Drag & drop per caricà un fugliale",
   "upload_button.label": "Aghjunghje un media (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Limita di caricamentu di fugliali trapassata.",
-  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_error.poll": "Ùn si pò micca caricà fugliali cù i scandagli.",
   "upload_form.description": "Discrive per i malvistosi",
   "upload_form.focus": "Cambià a vista",
   "upload_form.undo": "Sguassà",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 7ccbdef00..e711961e7 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Skrýt vše z {domain}",
   "account.blocked": "Blokován/a",
   "account.direct": "Poslat přímou zprávu uživateli @{name}",
-  "account.disclaimer_full": "Níže uvedené informace nemusejí zcela odrážet profil uživatele.",
   "account.domain_blocked": "Doména skryta",
   "account.edit_profile": "Upravit profil",
   "account.endorse": "Představit na profilu",
@@ -27,7 +26,7 @@
   "account.posts": "Tooty",
   "account.posts_with_replies": "Tooty a odpovědi",
   "account.report": "Nahlásit uživatele @{name}",
-  "account.requested": "Požadavek čeká na schválení. Kliknutím zrušíte požadavek o sledování",
+  "account.requested": "Čekám na schválení. Kliknutím zrušíte požadavek o sledování",
   "account.share": "Sdílet profil uživatele @{name}",
   "account.show_reblogs": "Zobrazit boosty od uživatele @{name}",
   "account.unblock": "Odblokovat uživatele @{name}",
@@ -36,7 +35,6 @@
   "account.unfollow": "Přestat sledovat",
   "account.unmute": "Odkrýt uživatele @{name}",
   "account.unmute_notifications": "Odkrýt oznámení od uživatele @{name}",
-  "account.view_full_profile": "Zobrazit celý profil",
   "alert.unexpected.message": "Objevila se neočekávaná chyba.",
   "alert.unexpected.title": "Jejda!",
   "boost_modal.combo": "Příště můžete pro přeskočení kliknout na {combo}",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Text není skrytý",
   "compose_form.spoiler_placeholder": "Sem napište vaše varování",
   "confirmation_modal.cancel": "Zrušit",
+  "confirmations.block.block_and_report": "Blokovat a nahlásit",
   "confirmations.block.confirm": "Blokovat",
   "confirmations.block.message": "Jste si jistý/á, že chcete zablokovat uživatele {name}?",
   "confirmations.delete.confirm": "Smazat",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Ještě jste neskryl/a žádné uživatele.",
   "empty_column.notifications": "Ještě nemáte žádná oznámení. Začněte konverzaci komunikováním s ostatními.",
   "empty_column.public": "Tady nic není! Napište něco veřejně, nebo začněte ručně sledovat uživatele z jiných serverů, aby tu něco přibylo",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autorizovat",
   "follow_request.reject": "Odmítnout",
   "getting_started.developers": "Vývojáři",
@@ -161,7 +159,7 @@
   "intervals.full.minutes": "{number, plural, one {# minuta} few {# minuty} many {# minuty} other {# minut}}",
   "introduction.federation.action": "Další",
   "introduction.federation.federated.headline": "Federovaná",
-  "introduction.federation.federated.text": "Veřejné příspěvky z jiných serverů na fediverse se zobrazí na federované časové ose.",
+  "introduction.federation.federated.text": "Veřejné příspěvky z jiných serverů ve fedivesmíru se zobrazí na federované časové ose.",
   "introduction.federation.home.headline": "Domů",
   "introduction.federation.home.text": "Příspěvky od lidí, které sledujete, se objeví ve vašem domovském proudu. Můžete sledovat kohokoliv na jakémkoliv serveru!",
   "introduction.federation.local.headline": "Místní",
@@ -175,7 +173,7 @@
   "introduction.interactions.reply.text": "Můžete odpovídat na tooty jiných lidí i vaše vlastní, což je propojí do konverzace.",
   "introduction.welcome.action": "Jdeme na to!",
   "introduction.welcome.headline": "První kroky",
-  "introduction.welcome.text": "Vítejte na fediverse! Za malou chvíli budete moci posílat zprávy a povídat si se svými přátely přes širokou škálu serverů. Tento server, {domain}, je však speciální—je na něm váš profil, proto si zapamatujte jeho jméno.",
+  "introduction.welcome.text": "Vítejte ve fedivesmíru! Za malou chvíli budete moci posílat zprávy a povídat si se svými přátely přes širokou škálu serverů. Tento server, {domain}, je však speciální—je na něm váš profil, proto si zapamatujte jeho jméno.",
   "keyboard_shortcuts.back": "k návratu zpět",
   "keyboard_shortcuts.blocked": "k otevření seznamu blokovaných uživatelů",
   "keyboard_shortcuts.boost": "k boostnutí",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} si oblíbil/a váš toot",
   "notification.follow": "{name} vás začal/a sledovat",
   "notification.mention": "{name} vás zmínil/a",
+  "notification.poll": "Anketa, ve které jste hlasoval/a, skončila",
   "notification.reblog": "{name} boostnul/a váš toot",
   "notifications.clear": "Vymazat oznámení",
   "notifications.clear_confirmation": "Jste si jistý/á, že chcete trvale vymazat všechna vaše oznámení?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Zobrazit",
   "notifications.column_settings.follow": "Noví sledující:",
   "notifications.column_settings.mention": "Zmínky:",
+  "notifications.column_settings.poll": "Výsledky anket:",
   "notifications.column_settings.push": "Push oznámení",
   "notifications.column_settings.reblog": "Boosty:",
   "notifications.column_settings.show": "Zobrazit ve sloupci",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Oblíbení",
   "notifications.filter.follows": "Sledování",
   "notifications.filter.mentions": "Zmínky",
+  "notifications.filter.polls": "Výsledky anket",
   "notifications.group": "{count} oznámení",
   "poll.closed": "Uzavřena",
   "poll.refresh": "Obnovit",
@@ -308,9 +309,8 @@
   "search_results.hashtags": "Hashtagy",
   "search_results.statuses": "Tooty",
   "search_results.total": "{count, number} {count, plural, one {výsledek} few {výsledky} many {výsledku} other {výsledků}}",
-  "standalone.public_title": "Nahlédněte dovnitř...",
-  "status.admin_account": "Otevřít moderační rozhraní pro uživatele @{name}",
-  "status.admin_status": "Otevřít tento toot v moderačním rozhraní",
+  "status.admin_account": "Otevřít moderátorské rozhraní pro uživatele @{name}",
+  "status.admin_status": "Otevřít tento toot v moderátorském rozhraní",
   "status.block": "Zablokovat uživatele @{name}",
   "status.cancel_reblog_private": "Zrušit boost",
   "status.cannot_reblog": "Tento příspěvek nemůže být boostnutý",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index 635226d7b..f03b54750 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Cuddio popeth rhag {domain}",
   "account.blocked": "Blociwyd",
   "account.direct": "Neges breifat @{name}",
-  "account.disclaimer_full": "Gall y wybodaeth isod adlewyrchu darlun anghyflawn o broffil defnyddiwr.",
   "account.domain_blocked": "Parth wedi ei guddio",
   "account.edit_profile": "Golygu proffil",
   "account.endorse": "Arddangos ar fy mhroffil",
@@ -36,7 +35,6 @@
   "account.unfollow": "Dad-ddilyn",
   "account.unmute": "Dad-dawelu @{name}",
   "account.unmute_notifications": "Dad-dawelu hysbysiadau o @{name}",
-  "account.view_full_profile": "Gweld proffil llawn",
   "alert.unexpected.message": "Digwyddodd gwall annisgwyl.",
   "alert.unexpected.title": "Wps!",
   "boost_modal.combo": "Mae modd gwasgu {combo} er mwyn sgipio hyn tro nesa",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Nid yw'r testun wedi ei guddio",
   "compose_form.spoiler_placeholder": "Ysgrifenwch eich rhybudd yma",
   "confirmation_modal.cancel": "Canslo",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Blocio",
   "confirmations.block.message": "Ydych chi'n sicr eich bod eisiau blocio {name}?",
   "confirmations.delete.confirm": "Dileu",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Nid ydych wedi tawelu unrhyw ddefnyddwyr eto.",
   "empty_column.notifications": "Nid oes gennych unrhyw hysbysiadau eto. Rhyngweithiwch ac eraill i ddechrau'r sgwrs.",
   "empty_column.public": "Does dim byd yma! Ysgrifennwch rhywbeth yn gyhoeddus, neu dilynwch ddefnyddwyr o achosion eraill i'w lenwi",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Caniatau",
   "follow_request.reject": "Gwrthod",
   "getting_started.developers": "Datblygwyr",
@@ -248,6 +246,7 @@
   "notification.favourite": "hoffodd {name} eich tŵt",
   "notification.follow": "dilynodd {name} chi",
   "notification.mention": "Soniodd {name} amdanoch chi",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "Hysbysebodd {name} eich tŵt",
   "notifications.clear": "Clirio hysbysiadau",
   "notifications.clear_confirmation": "Ydych chi'n sicr eich bod am glirio'ch holl hysbysiadau am byth?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Dangos",
   "notifications.column_settings.follow": "Dilynwyr newydd:",
   "notifications.column_settings.mention": "Crybwylliadau:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Hysbysiadau push",
   "notifications.column_settings.reblog": "Hybiadau:",
   "notifications.column_settings.show": "Dangos yn y golofn",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Ffefrynnau",
   "notifications.filter.follows": "Yn dilyn",
   "notifications.filter.mentions": "Crybwylliadau",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} o hysbysiadau",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hanshnodau",
   "search_results.statuses": "Tŵtiau",
   "search_results.total": "{count, number} {count, plural, one {result} arall {results}}",
-  "standalone.public_title": "Golwg tu fewn...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this tŵt in the moderation interface",
   "status.block": "Blocio @{name}",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 86df1447e..1be8d989d 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Skjul alt fra {domain}",
   "account.blocked": "Blokeret",
   "account.direct": "Send en direkte besked til @{name}",
-  "account.disclaimer_full": "Nedenstående oplysninger reflekterer ikke nødvendigvis brugerens profil fuldstændigt.",
   "account.domain_blocked": "Domænet er blevet skjult",
   "account.edit_profile": "Rediger profil",
   "account.endorse": "Fremhæv på profil",
@@ -36,7 +35,6 @@
   "account.unfollow": "Følg ikke længere",
   "account.unmute": "Fjern dæmpningen af @{name}",
   "account.unmute_notifications": "Fjern dæmpningen af notifikationer fra @{name}",
-  "account.view_full_profile": "Se fuld profil",
   "alert.unexpected.message": "Der opstod en uventet fejl.",
   "alert.unexpected.title": "Ups!",
   "boost_modal.combo": "Du kan trykke {combo} for at springe dette over næste gang",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Teksten er ikke skjult",
   "compose_form.spoiler_placeholder": "Skriv din advarsel her",
   "confirmation_modal.cancel": "Annuller",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Bloker",
   "confirmations.block.message": "Er du sikker på, du vil blokere {name}?",
   "confirmations.delete.confirm": "Slet",
@@ -117,7 +116,7 @@
   "emoji_button.search_results": "Søgeresultater",
   "emoji_button.symbols": "Symboler",
   "emoji_button.travel": "Rejser & steder",
-  "empty_column.account_timeline": "No toots here!",
+  "empty_column.account_timeline": "Ingen bidrag her!",
   "empty_column.blocks": "Du har ikke blokeret nogen endnu.",
   "empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at starte lavinen!",
   "empty_column.direct": "Du har endnu ingen direkte beskeder. Når du sender eller modtager en, vil den vises her.",
@@ -132,8 +131,7 @@
   "empty_column.lists": "Du har endnu ingen lister. Når du opretter en, vil den blive vist her.",
   "empty_column.mutes": "Du har endnu ikke dæmpet nogen som helst bruger.",
   "empty_column.notifications": "Du har endnu ingen notifikationer. Tag ud og bland dig med folkemængden for at starte samtalen.",
-  "empty_column.public": "Der er ikke noget at se her! Skriv noget offentligt eller start ud med manuelt at følge brugere fra andre instanser for st udfylde tomrummet",
-  "error_boundary.it_crashed": "It crashed!",
+  "empty_column.public": "Der er ikke noget at se her! Skriv noget offentligt eller start ud med manuelt at følge brugere fra andre server for at udfylde tomrummet",
   "follow_request.authorize": "Godkend",
   "follow_request.reject": "Afvis",
   "getting_started.developers": "Udviklere",
@@ -144,9 +142,9 @@
   "getting_started.open_source_notice": "Mastodon er et open source software. Du kan bidrage eller rapporterer fejl på GitHub {github}.",
   "getting_started.security": "Sikkerhed",
   "getting_started.terms": "Vilkår",
-  "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_header.tag_mode.all": "og {additional}",
+  "hashtag.column_header.tag_mode.any": "eller {additional}",
+  "hashtag.column_header.tag_mode.none": "uden {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",
@@ -161,20 +159,20 @@
   "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
   "introduction.federation.action": "Næste",
   "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.federated.text": "Offentlige bidrag fra andre servere af fediversen vil komme til syne i den 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 tutorial!",
-  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.action": "Slut tutorial!",
+  "introduction.interactions.favourite.headline": "Favorisere",
   "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.interactions.reply.headline": "Svar",
+  "introduction.interactions.reply.text": "Du kan svare andres og din egen bidrag, hvilke vil kæde dem sammen i en konversation.",
+  "introduction.welcome.action": "Læd os gå!",
+  "introduction.welcome.headline": "Første skridt",
   "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": "for at navigere dig tilbage",
   "keyboard_shortcuts.blocked": "for at åbne listen over blokerede brugere",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} favoriserede din status",
   "notification.follow": "{name} fulgte dig",
   "notification.mention": "{name} nævnte dig",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} fremhævede din status",
   "notifications.clear": "Ryd notifikationer",
   "notifications.clear_confirmation": "Er du sikker på, du vil rydde alle dine notifikationer permanent?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Nye følgere:",
   "notifications.column_settings.mention": "Omtale:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifikationer",
   "notifications.column_settings.reblog": "Fremhævelser:",
   "notifications.column_settings.show": "Vis i kolonne",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favoritter",
   "notifications.filter.follows": "Følger",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifikationer",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Emnetags",
   "search_results.statuses": "Trut",
   "search_results.total": "{count, number} {count, plural, et {result} andre {results}}",
-  "standalone.public_title": "Et kig indenfor...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Bloker @{name}",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 734737c55..a335af1bd 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Alles von {domain} verstecken",
   "account.blocked": "Blockiert",
   "account.direct": "Direktnachricht an @{name}",
-  "account.disclaimer_full": "Das Profil wird möglicherweise unvollständig wiedergegeben.",
   "account.domain_blocked": "Domain versteckt",
   "account.edit_profile": "Profil bearbeiten",
   "account.endorse": "Auf Profil hervorheben",
@@ -36,7 +35,6 @@
   "account.unfollow": "Entfolgen",
   "account.unmute": "@{name} nicht mehr stummschalten",
   "account.unmute_notifications": "Benachrichtigungen von @{name} einschalten",
-  "account.view_full_profile": "Vollständiges Profil anzeigen",
   "alert.unexpected.message": "Ein unerwarteter Fehler ist aufgetreten.",
   "alert.unexpected.title": "Hoppla!",
   "boost_modal.combo": "Du kannst {combo} drücken, um dies beim nächsten Mal zu überspringen",
@@ -73,10 +71,10 @@
   "compose_form.lock_disclaimer": "Dein Profil ist nicht {locked}. Wer dir folgen will, kann das jederzeit tun und dann auch deine privaten Beiträge sehen.",
   "compose_form.lock_disclaimer.lock": "gesperrt",
   "compose_form.placeholder": "Was gibt's Neues?",
-  "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.add_option": "Eine Auswahl hinzufügen",
+  "compose_form.poll.duration": "Umfragedauer",
+  "compose_form.poll.option_placeholder": "Auswahl {number}",
+  "compose_form.poll.remove_option": "Auswahl entfernen",
   "compose_form.publish": "Tröt",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.marked": "Medien sind als heikel markiert",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Text ist nicht versteckt",
   "compose_form.spoiler_placeholder": "Inhaltswarnung",
   "confirmation_modal.cancel": "Abbrechen",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Blockieren",
   "confirmations.block.message": "Bist du dir sicher, dass du {name} blockieren möchtest?",
   "confirmations.delete.confirm": "Löschen",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Du hast keine Profile stummgeschaltet.",
   "empty_column.notifications": "Du hast noch keine Mitteilungen. Interagiere mit anderen, um ins Gespräch zu kommen.",
   "empty_column.public": "Hier ist nichts zu sehen! Schreibe etwas öffentlich oder folge Profilen von anderen Servern, um die Zeitleiste aufzufüllen",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Erlauben",
   "follow_request.reject": "Ablehnen",
   "getting_started.developers": "Entwickler",
@@ -147,18 +145,18 @@
   "hashtag.column_header.tag_mode.all": "und {additional}",
   "hashtag.column_header.tag_mode.any": "oder {additional}",
   "hashtag.column_header.tag_mode.none": "ohne {additional}",
-  "hashtag.column_settings.select.no_options_message": "No suggestions found",
-  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+  "hashtag.column_settings.select.no_options_message": "Keine Vorschläge gefunden",
+  "hashtag.column_settings.select.placeholder": "Hashtags eintragen…",
   "hashtag.column_settings.tag_mode.all": "All diese",
   "hashtag.column_settings.tag_mode.any": "Eine von diesen",
   "hashtag.column_settings.tag_mode.none": "Keine von diesen",
-  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "hashtag.column_settings.tag_toggle": "Zusätzliche Tags für diese Spalte einfügen",
   "home.column_settings.basic": "Einfach",
   "home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen",
   "home.column_settings.show_replies": "Antworten anzeigen",
-  "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}}",
+  "intervals.full.days": "{number, plural, one {# Tag} other {# Tage}}",
+  "intervals.full.hours": "{number, plural, one {# Stunde} other {# Stunden}}",
+  "intervals.full.minutes": "{number, plural, one {# Minute} other {# Minuten}}",
   "introduction.federation.action": "Weiter",
   "introduction.federation.federated.headline": "Föderiert",
   "introduction.federation.federated.text": "Öffentliche Beiträge von anderen Servern im Fediverse erscheinen in der föderierten Zeitleiste.",
@@ -214,7 +212,7 @@
   "lists.account.remove": "Von der Liste entfernen",
   "lists.delete": "Delete list",
   "lists.edit": "Liste bearbeiten",
-  "lists.edit.submit": "Change title",
+  "lists.edit.submit": "Titel ändern",
   "lists.new.create": "Liste hinzufügen",
   "lists.new.title_placeholder": "Neuer Titel der Liste",
   "lists.search": "Suche nach Leuten denen du folgst",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} hat deinen Beitrag favorisiert",
   "notification.follow": "{name} folgt dir",
   "notification.mention": "{name} hat dich erwähnt",
+  "notification.poll": "Eine Umfrage in der du abgestimmt hast ist vorbei",
   "notification.reblog": "{name} hat deinen Beitrag geteilt",
   "notifications.clear": "Mitteilungen löschen",
   "notifications.clear_confirmation": "Bist du dir sicher, dass du alle Mitteilungen löschen möchtest?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Anzeigen",
   "notifications.column_settings.follow": "Neue Folgende:",
   "notifications.column_settings.mention": "Erwähnungen:",
+  "notifications.column_settings.poll": "Ergebnisse der Umfrage:",
   "notifications.column_settings.push": "Push-Benachrichtigungen",
   "notifications.column_settings.reblog": "Geteilte Beiträge:",
   "notifications.column_settings.show": "In der Spalte anzeigen",
@@ -267,13 +267,14 @@
   "notifications.filter.favourites": "Favoriten",
   "notifications.filter.follows": "Folgende",
   "notifications.filter.mentions": "Erwähnungen",
+  "notifications.filter.polls": "Ergebnisse der Umfrage",
   "notifications.group": "{count} Benachrichtigungen",
-  "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
-  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Vote",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll.closed": "Geschlossen",
+  "poll.refresh": "Aktualisieren",
+  "poll.total_votes": "{count, plural, one {# Stimme} other {# Stimmen}}",
+  "poll.vote": "Abstimmen",
+  "poll_button.add_poll": "Eine Umfrage erstellen",
+  "poll_button.remove_poll": "Umfrage entfernen",
   "privacy.change": "Sichtbarkeit des Beitrags anpassen",
   "privacy.direct.long": "Beitrag nur an erwähnte Profile",
   "privacy.direct.short": "Direkt",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Beiträge",
   "search_results.total": "{count, number} {count, plural, one {Ergebnis} other {Ergebnisse}}",
-  "standalone.public_title": "Ein kleiner Einblick …",
   "status.admin_account": "Öffne Moderationsoberfläche für @{name}",
   "status.admin_status": "Öffne diesen Status in der Moderationsoberfläche",
   "status.block": "Blockiere @{name}",
@@ -356,17 +356,17 @@
   "tabs_bar.local_timeline": "Lokal",
   "tabs_bar.notifications": "Mitteilungen",
   "tabs_bar.search": "Suchen",
-  "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",
+  "time_remaining.days": "{number, plural, one {# Tag} other {# Tage}} verbleibend",
+  "time_remaining.hours": "{number, plural, one {# Stunde} other {# Stunden}} verbleibend",
+  "time_remaining.minutes": "{number, plural, one {# Minute} other {# Minuten}} verbleibend",
+  "time_remaining.moments": "Momente verbleibend",
+  "time_remaining.seconds": "{number, plural, one {# Sekunde} other {# Sekunden}} verbleibend",
   "trends.count_by_accounts": "{count} {rawCount, plural, eine {Person} other {Personen}} reden darüber",
   "ui.beforeunload": "Dein Entwurf geht verloren, wenn du Mastodon verlässt.",
   "upload_area.title": "Zum Hochladen hereinziehen",
   "upload_button.label": "Mediendatei hinzufügen (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Dateiupload-Limit erreicht.",
-  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_error.poll": "Dateiuploads sind in Kombination mit Umfragen nicht erlaubt.",
   "upload_form.description": "Für Menschen mit Sehbehinderung beschreiben",
   "upload_form.focus": "Thumbnail bearbeiten",
   "upload_form.undo": "Löschen",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 8261ce578..a83933d57 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -480,6 +480,10 @@
         "id": "confirmations.reply.message"
       },
       {
+        "defaultMessage": "Block & Report",
+        "id": "confirmations.block.block_and_report"
+      },
+      {
         "defaultMessage": "Are you sure you want to block {name}?",
         "id": "confirmations.block.message"
       }
@@ -527,6 +531,10 @@
         "id": "confirmations.domain_block.confirm"
       },
       {
+        "defaultMessage": "Block & Report",
+        "id": "confirmations.block.block_and_report"
+      },
+      {
         "defaultMessage": "Are you sure you want to unfollow {name}?",
         "id": "confirmations.unfollow.message"
       },
@@ -553,24 +561,40 @@
   {
     "descriptors": [
       {
-        "defaultMessage": "Mention @{name}",
-        "id": "account.mention"
+        "defaultMessage": "Unfollow",
+        "id": "account.unfollow"
       },
       {
-        "defaultMessage": "Direct message @{name}",
-        "id": "account.direct"
+        "defaultMessage": "Follow",
+        "id": "account.follow"
       },
       {
-        "defaultMessage": "Edit profile",
-        "id": "account.edit_profile"
+        "defaultMessage": "Awaiting approval. Click to cancel follow request",
+        "id": "account.requested"
       },
       {
         "defaultMessage": "Unblock @{name}",
         "id": "account.unblock"
       },
       {
-        "defaultMessage": "Unfollow",
-        "id": "account.unfollow"
+        "defaultMessage": "Edit profile",
+        "id": "account.edit_profile"
+      },
+      {
+        "defaultMessage": "Ownership of this link was checked on {date}",
+        "id": "account.link_verified_on"
+      },
+      {
+        "defaultMessage": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+        "id": "account.locked_info"
+      },
+      {
+        "defaultMessage": "Mention @{name}",
+        "id": "account.mention"
+      },
+      {
+        "defaultMessage": "Direct message @{name}",
+        "id": "account.direct"
       },
       {
         "defaultMessage": "Unmute @{name}",
@@ -585,10 +609,6 @@
         "id": "account.mute"
       },
       {
-        "defaultMessage": "Follow",
-        "id": "account.follow"
-      },
-      {
         "defaultMessage": "Report @{name}",
         "id": "account.report"
       },
@@ -665,59 +685,6 @@
         "id": "status.admin_account"
       },
       {
-        "defaultMessage": "Information below may reflect the user's profile incompletely.",
-        "id": "account.disclaimer_full"
-      },
-      {
-        "defaultMessage": "View full profile",
-        "id": "account.view_full_profile"
-      },
-      {
-        "defaultMessage": "Toots",
-        "id": "account.posts"
-      },
-      {
-        "defaultMessage": "Follows",
-        "id": "account.follows"
-      },
-      {
-        "defaultMessage": "Followers",
-        "id": "account.followers"
-      }
-    ],
-    "path": "app/javascript/mastodon/features/account/components/action_bar.json"
-  },
-  {
-    "descriptors": [
-      {
-        "defaultMessage": "Unfollow",
-        "id": "account.unfollow"
-      },
-      {
-        "defaultMessage": "Follow",
-        "id": "account.follow"
-      },
-      {
-        "defaultMessage": "Awaiting approval. Click to cancel follow request",
-        "id": "account.requested"
-      },
-      {
-        "defaultMessage": "Unblock @{name}",
-        "id": "account.unblock"
-      },
-      {
-        "defaultMessage": "Edit profile",
-        "id": "account.edit_profile"
-      },
-      {
-        "defaultMessage": "Ownership of this link was checked on {date}",
-        "id": "account.link_verified_on"
-      },
-      {
-        "defaultMessage": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
-        "id": "account.locked_info"
-      },
-      {
         "defaultMessage": "Follows you",
         "id": "account.follows_you"
       },
@@ -736,6 +703,18 @@
       {
         "defaultMessage": "Bot",
         "id": "account.badges.bot"
+      },
+      {
+        "defaultMessage": "Toots",
+        "id": "account.posts"
+      },
+      {
+        "defaultMessage": "Follows",
+        "id": "account.follows"
+      },
+      {
+        "defaultMessage": "Followers",
+        "id": "account.followers"
       }
     ],
     "path": "app/javascript/mastodon/features/account/components/header.json"
@@ -2100,6 +2079,10 @@
         "id": "confirmations.reply.message"
       },
       {
+        "defaultMessage": "Block & Report",
+        "id": "confirmations.block.block_and_report"
+      },
+      {
         "defaultMessage": "Are you sure you want to block {name}?",
         "id": "confirmations.block.message"
       }
@@ -2149,6 +2132,10 @@
         "id": "confirmations.reply.message"
       },
       {
+        "defaultMessage": "Block & Report",
+        "id": "confirmations.block.block_and_report"
+      },
+      {
         "defaultMessage": "Are you sure you want to block {name}?",
         "id": "confirmations.block.message"
       }
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index d0bbc830b..701410a81 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Απόκρυψε τα πάντα από το {domain}",
   "account.blocked": "Αποκλεισμένος/η",
   "account.direct": "Προσωπικό μήνυμα προς @{name}",
-  "account.disclaimer_full": "Οι παρακάτω πληροφορίες μπορει να μην αντανακλούν το προφίλ του χρήστη επαρκως.",
   "account.domain_blocked": "Κρυμμένος τομέας",
   "account.edit_profile": "Επεξεργασία προφίλ",
   "account.endorse": "Προβολή στο προφίλ",
@@ -36,7 +35,6 @@
   "account.unfollow": "Διακοπή παρακολούθησης",
   "account.unmute": "Διακοπή αποσιώπησης του/της @{name}",
   "account.unmute_notifications": "Διακοπή αποσιώπησης ειδοποιήσεων του/της @{name}",
-  "account.view_full_profile": "Δες το πλήρες προφίλ",
   "alert.unexpected.message": "Προέκυψε απροσδόκητο σφάλμα.",
   "alert.unexpected.title": "Εεπ!",
   "boost_modal.combo": "Μπορείς να πατήσεις {combo} για να το προσπεράσεις αυτό την επόμενη φορά",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Μη κρυμμένο κείμενο",
   "compose_form.spoiler_placeholder": "Γράψε την προειδοποίησή σου εδώ",
   "confirmation_modal.cancel": "Άκυρο",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Απόκλεισε",
   "confirmations.block.message": "Σίγουρα θες να αποκλείσεις τον/την {name};",
   "confirmations.delete.confirm": "Διέγραψε",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Δεν έχεις αποσιωπήσει κανένα χρήστη ακόμα.",
   "empty_column.notifications": "Δεν έχεις ειδοποιήσεις ακόμα. Αλληλεπίδρασε με άλλους χρήστες για να ξεκινήσεις την κουβέντα.",
   "empty_column.public": "Δεν υπάρχει τίποτα εδώ! Γράψε κάτι δημόσιο, ή ακολούθησε χειροκίνητα χρήστες από άλλους κόμβους για να τη γεμίσεις",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Ενέκρινε",
   "follow_request.reject": "Απέρριψε",
   "getting_started.developers": "Ανάπτυξη",
@@ -158,7 +156,7 @@
   "home.column_settings.show_replies": "Εμφάνιση απαντήσεων",
   "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}}",
+  "intervals.full.minutes": "{number, plural, one {# λεπτό} other {# λεπτά}}",
   "introduction.federation.action": "Επόμενο",
   "introduction.federation.federated.headline": "Ομοσπονδιακή",
   "introduction.federation.federated.text": "Οι δημόσιες αναρτήσεις από άλλους κόμβους του fediverse θα εμφανίζονται στην ομοσπονδιακή ροή.",
@@ -248,6 +246,7 @@
   "notification.favourite": "Ο/Η {name} σημείωσε ως αγαπημένη την κατάστασή σου",
   "notification.follow": "Ο/Η {name} σε ακολούθησε",
   "notification.mention": "Ο/Η {name} σε ανέφερε",
+  "notification.poll": "Έλαβε τέλος μια από τις ψηφοφορίες που συμμετείχες",
   "notification.reblog": "Ο/Η {name} προώθησε την κατάστασή σου",
   "notifications.clear": "Καθαρισμός ειδοποιήσεων",
   "notifications.clear_confirmation": "Σίγουρα θέλεις να καθαρίσεις όλες τις ειδοποιήσεις σου;",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Εμφάνιση",
   "notifications.column_settings.follow": "Νέοι ακόλουθοι:",
   "notifications.column_settings.mention": "Αναφορές:",
+  "notifications.column_settings.poll": "Αποτελέσματα ψηφοφορίας:",
   "notifications.column_settings.push": "Άμεσες ειδοποιήσεις",
   "notifications.column_settings.reblog": "Προωθήσεις:",
   "notifications.column_settings.show": "Εμφάνισε σε στήλη",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Αγαπημένα",
   "notifications.filter.follows": "Ακόλουθοι",
   "notifications.filter.mentions": "Αναφορές",
+  "notifications.filter.polls": "Αποτελέσματα ψηφοφορίας",
   "notifications.group": "{count} ειδοποιήσεις",
   "poll.closed": "Κλειστή",
   "poll.refresh": "Ανανέωση",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Ταμπέλες",
   "search_results.statuses": "Τουτ",
   "search_results.total": "{count, number} {count, plural, zero {αποτελέσματα} one {αποτέλεσμα} other {αποτελέσματα}}",
-  "standalone.public_title": "Μια πρώτη γεύση...",
   "status.admin_account": "Άνοιγμα λειτουργίας διαμεσολάβησης για τον/την @{name}",
   "status.admin_status": "Άνοιγμα αυτής της δημοσίευσης στη λειτουργία διαμεσολάβησης",
   "status.block": "Αποκλεισμός @{name}",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 1c45d6f20..e47081f9e 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
   "account.direct": "Direct message @{name}",
-  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Edit profile",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Unfollow",
   "account.unmute": "Unmute @{name}",
   "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account.view_full_profile": "View full profile",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "You can press {combo} to skip this next time",
@@ -89,6 +87,7 @@
   "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",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 05e7e12d8..dd2188d8e 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Kaŝi ĉion de {domain}",
   "account.blocked": "Blokita",
   "account.direct": "Rekte mesaĝi @{name}",
-  "account.disclaimer_full": "Subaj informoj povas reflekti la profilon de la uzanto nekomplete.",
   "account.domain_blocked": "Domajno kaŝita",
   "account.edit_profile": "Redakti profilon",
   "account.endorse": "Montri en profilo",
@@ -36,7 +35,6 @@
   "account.unfollow": "Ne plu sekvi",
   "account.unmute": "Malsilentigi @{name}",
   "account.unmute_notifications": "Malsilentigi sciigojn de @{name}",
-  "account.view_full_profile": "Vidi plenan profilon",
   "alert.unexpected.message": "Neatendita eraro okazis.",
   "alert.unexpected.title": "Ups!",
   "boost_modal.combo": "Vi povas premi {combo} por preterpasi sekvafoje",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Teksto ne kaŝita",
   "compose_form.spoiler_placeholder": "Skribu vian averton ĉi tie",
   "confirmation_modal.cancel": "Nuligi",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Bloki",
   "confirmations.block.message": "Ĉu vi certas, ke vi volas bloki {name}?",
   "confirmations.delete.confirm": "Forigi",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Vi ne ankoraŭ silentigis iun uzanton.",
   "empty_column.notifications": "Vi ankoraŭ ne havas sciigojn. Interagu kun aliaj por komenci konversacion.",
   "empty_column.public": "Estas nenio ĉi tie! Publike skribu ion, aŭ mane sekvu uzantojn de aliaj serviloj por plenigi la publikan tempolinion",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Rajtigi",
   "follow_request.reject": "Rifuzi",
   "getting_started.developers": "Programistoj",
@@ -152,13 +150,13 @@
   "hashtag.column_settings.tag_mode.all": "Ĉiuj",
   "hashtag.column_settings.tag_mode.any": "Iu ajn",
   "hashtag.column_settings.tag_mode.none": "Neniu",
-  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "hashtag.column_settings.tag_toggle": "Inkluzivi pluajn etikedojn por ĉi tiu kolumno",
   "home.column_settings.basic": "Bazaj agordoj",
   "home.column_settings.show_reblogs": "Montri diskonigojn",
   "home.column_settings.show_replies": "Montri respondojn",
   "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}}",
+  "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutoj}}",
   "introduction.federation.action": "Sekva",
   "introduction.federation.federated.headline": "Federated",
   "introduction.federation.federated.text": "Publikaj mesaĝoj el aliaj serviloj de la Fediverse aperos en la fratara tempolinio.",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} stelumis vian mesaĝon",
   "notification.follow": "{name} eksekvis vin",
   "notification.mention": "{name} menciis vin",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} diskonigis vian mesaĝon",
   "notifications.clear": "Forviŝi sciigojn",
   "notifications.clear_confirmation": "Ĉu vi certas, ke vi volas porĉiame forviŝi ĉiujn viajn sciigojn?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Montri",
   "notifications.column_settings.follow": "Novaj sekvantoj:",
   "notifications.column_settings.mention": "Mencioj:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Puŝsciigoj",
   "notifications.column_settings.reblog": "Diskonigoj:",
   "notifications.column_settings.show": "Montri en kolumno",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Stelumoj",
   "notifications.filter.follows": "Sekvoj",
   "notifications.filter.mentions": "Mencioj",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} sciigoj",
   "poll.closed": "Finita",
   "poll.refresh": "Aktualigi",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Kradvortoj",
   "search_results.statuses": "Mesaĝoj",
   "search_results.total": "{count, number} {count, plural, one {rezulto} other {rezultoj}}",
-  "standalone.public_title": "Enrigardo…",
   "status.admin_account": "Malfermi la kontrolan interfacon por @{name}",
   "status.admin_status": "Malfermi ĉi tiun mesaĝon en la kontrola interfaco",
   "status.block": "Bloki @{name}",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index bf20e5f9d..97d03d840 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Ocultar todo de {domain}",
   "account.blocked": "Bloqueado",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "La siguiente información del usuario puede estar incompleta.",
   "account.domain_blocked": "Dominio oculto",
   "account.edit_profile": "Editar perfil",
   "account.endorse": "Mostrar en perfil",
@@ -36,7 +35,6 @@
   "account.unfollow": "Dejar de seguir",
   "account.unmute": "Dejar de silenciar a @{name}",
   "account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
-  "account.view_full_profile": "Ver perfil completo",
   "alert.unexpected.message": "Hubo un error inesperado.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "Puedes presionar {combo} para saltear este aviso la próxima vez",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Texto no oculto",
   "compose_form.spoiler_placeholder": "Advertencia de contenido",
   "confirmation_modal.cancel": "Cancelar",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Bloquear",
   "confirmations.block.message": "¿Estás seguro de que quieres bloquear a {name}?",
   "confirmations.delete.confirm": "Eliminar",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Aún no has silenciado a ningún usuario.",
   "empty_column.notifications": "No tienes ninguna notificación aún. Interactúa con otros para empezar una conversación.",
   "empty_column.public": "¡No hay nada aquí! Escribe algo públicamente, o sigue usuarios de otras instancias manualmente para llenarlo",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rechazar",
   "getting_started.developers": "Desarrolladores",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} marcó tu estado como favorito",
   "notification.follow": "{name} te empezó a seguir",
   "notification.mention": "{name} te ha mencionado",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} ha retooteado tu estado",
   "notifications.clear": "Limpiar notificaciones",
   "notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Nuevos seguidores:",
   "notifications.column_settings.mention": "Menciones:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Notificaciones push",
   "notifications.column_settings.reblog": "Retoots:",
   "notifications.column_settings.show": "Mostrar en columna",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notificaciones",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Etiquetas",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
-  "standalone.public_title": "Un pequeño vistazo...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 0915ee6cc..17f84dc27 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Ezkutatu {domain} domeinuko guztia",
   "account.blocked": "Blokeatuta",
   "account.direct": "Mezu zuzena @{name}(r)i",
-  "account.disclaimer_full": "Baliteke beheko informazioak erabiltzailearen profilaren zati bat baino ez erakustea.",
   "account.domain_blocked": "Ezkutatutako domeinua",
   "account.edit_profile": "Aldatu profila",
   "account.endorse": "Nabarmendu profilean",
@@ -36,7 +35,6 @@
   "account.unfollow": "Jarraitzeari utzi",
   "account.unmute": "Desmututu @{name}",
   "account.unmute_notifications": "Desmututu @{name}(r)en jakinarazpenak",
-  "account.view_full_profile": "Ikusi profil osoa",
   "alert.unexpected.message": "Ustekabeko errore bat gertatu da.",
   "alert.unexpected.title": "Ene!",
   "boost_modal.combo": "{combo} sakatu dezakezu hurrengoan hau saltatzeko",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Testua ez dago ezkutatuta",
   "compose_form.spoiler_placeholder": "Idatzi zure abisua hemen",
   "confirmation_modal.cancel": "Utzi",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Block",
   "confirmations.block.message": "Ziur {name} blokeatu nahi duzula?",
   "confirmations.delete.confirm": "Ezabatu",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Ez duzu erabiltzailerik mututu oraindik.",
   "empty_column.notifications": "Ez duzu jakinarazpenik oraindik. Jarri besteekin harremanetan elkarrizketa abiatzeko.",
   "empty_column.public": "Ez dago ezer hemen! Idatzi zerbait publikoki edo jarraitu eskuz beste zerbitzari batzuetako erabiltzaileak hau betetzen joateko",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Baimendu",
   "follow_request.reject": "Ukatu",
   "getting_started.developers": "Garatzaileak",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name}(e)k zure mezua gogoko du",
   "notification.follow": "{name}(e)k jarraitzen zaitu",
   "notification.mention": "{name}(e)k aipatu zaitu",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name}(e)k bultzada eman dio zure mezuari",
   "notifications.clear": "Garbitu jakinarazpenak",
   "notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Erakutsi",
   "notifications.column_settings.follow": "Jarraitzaile berriak:",
   "notifications.column_settings.mention": "Aipamenak:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push jakinarazpenak",
   "notifications.column_settings.reblog": "Bultzadak:",
   "notifications.column_settings.show": "Erakutsi zutabean",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Gogokoak",
   "notifications.filter.follows": "Jarraipenak",
   "notifications.filter.mentions": "Aipamenak",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} jakinarazpen",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Traolak",
   "search_results.statuses": "Toot-ak",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "Begiradatxo bat...",
   "status.admin_account": "Ireki @{name} erabiltzailearen moderazio interfazea",
   "status.admin_status": "Ireki mezu hau moderazio interfazean",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index e4003d6a0..91a27e366 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -5,7 +5,6 @@
   "account.block_domain": "پنهان‌سازی همه چیز از سرور {domain}",
   "account.blocked": "مسدودشده",
   "account.direct": "پیغام خصوصی به @{name}",
-  "account.disclaimer_full": "اطلاعات زیر ممکن است نمایهٔ این کاربر را به تمامی نشان ندهد.",
   "account.domain_blocked": "دامین پنهان‌شده",
   "account.edit_profile": "ویرایش نمایه",
   "account.endorse": "نمایش در نمایه",
@@ -36,7 +35,6 @@
   "account.unfollow": "پایان پیگیری",
   "account.unmute": "باصدا کردن @{name}",
   "account.unmute_notifications": "باصداکردن اعلان‌ها از طرف @{name}",
-  "account.view_full_profile": "نمایش نمایهٔ کامل",
   "alert.unexpected.message": "خطای پیش‌بینی‌نشده‌ای رخ داد.",
   "alert.unexpected.title": "ای وای!",
   "boost_modal.combo": "دکمهٔ {combo} را بزنید تا دیگر این را نبینید",
@@ -73,10 +71,10 @@
   "compose_form.lock_disclaimer": "حساب شما {locked} نیست. هر کسی می‌تواند پیگیر شما شود و نوشته‌های ویژهٔ پیگیران شما را ببیند.",
   "compose_form.lock_disclaimer.lock": "قفل",
   "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.remove_option": "Remove this choice",
+  "compose_form.poll.add_option": "افزودن گزینه",
+  "compose_form.poll.duration": "مدت نظرسنجی",
+  "compose_form.poll.option_placeholder": "گزینهٔ {number}",
+  "compose_form.poll.remove_option": "حذف این گزینه",
   "compose_form.publish": "بوق",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.marked": "این تصویر به عنوان حساس علامت‌گذاری شده",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "نوشته پنهان نیست",
   "compose_form.spoiler_placeholder": "هشدار محتوا",
   "confirmation_modal.cancel": "بی‌خیال",
+  "confirmations.block.block_and_report": "مسدودسازی و گزارش",
   "confirmations.block.confirm": "مسدود کن",
   "confirmations.block.message": "آیا واقعاً می‌خواهید {name} را مسدود کنید؟",
   "confirmations.delete.confirm": "پاک کن",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "شما هنوز هیچ کاربری را بی‌صدا نکرده‌اید.",
   "empty_column.notifications": "هنوز هیچ اعلانی ندارید. به نوشته‌های دیگران واکنش نشان دهید تا گفتگو آغاز شود.",
   "empty_column.public": "این‌جا هنوز چیزی نیست! خودتان چیزی بنویسید یا کاربران سرورهای دیگر را پی بگیرید تا این‌جا پر شود",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "اجازه دهید",
   "follow_request.reject": "اجازه ندهید",
   "getting_started.developers": "برای برنامه‌نویسان",
@@ -156,9 +154,9 @@
   "home.column_settings.basic": "اصلی",
   "home.column_settings.show_reblogs": "نمایش بازبوق‌ها",
   "home.column_settings.show_replies": "نمایش پاسخ‌ها",
-  "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}}",
+  "intervals.full.days": "{number, plural, one {# روز} other {# روز}}",
+  "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": "نوشته‌های عمومی سرورهای دیگر در این فهرست نمایش می‌یابند.",
@@ -248,6 +246,7 @@
   "notification.favourite": "‫{name}‬ نوشتهٔ شما را پسندید",
   "notification.follow": "‫{name}‬ پیگیر شما شد",
   "notification.mention": "‫{name}‬ از شما نام برد",
+  "notification.poll": "نظرسنجی‌ای که در آن رأی دادید به پایان رسیده است",
   "notification.reblog": "‫{name}‬ نوشتهٔ شما را بازبوقید",
   "notifications.clear": "پاک‌کردن اعلان‌ها",
   "notifications.clear_confirmation": "واقعاً می‌خواهید همهٔ اعلان‌هایتان را برای همیشه پاک کنید؟",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "نمایش",
   "notifications.column_settings.follow": "پیگیران تازه:",
   "notifications.column_settings.mention": "نام‌بردن‌ها:",
+  "notifications.column_settings.poll": "نتایج نظرسنجی:",
   "notifications.column_settings.push": "اعلان‌ها از سمت سرور",
   "notifications.column_settings.reblog": "بازبوق‌ها:",
   "notifications.column_settings.show": "نمایش در ستون",
@@ -267,13 +267,14 @@
   "notifications.filter.favourites": "پسندیده‌ها",
   "notifications.filter.follows": "پیگیری‌ها",
   "notifications.filter.mentions": "گفتگوها",
+  "notifications.filter.polls": "نتایج نظرسنجی",
   "notifications.group": "{count} اعلان",
   "poll.closed": "پایان‌یافته",
   "poll.refresh": "به‌روزرسانی",
   "poll.total_votes": "{count, plural, one {# رأی} other {# رأی}}",
   "poll.vote": "رأی",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll_button.add_poll": "افزودن نظرسنجی",
+  "poll_button.remove_poll": "حذف نظرسنجی",
   "privacy.change": "تنظیم حریم خصوصی نوشته‌ها",
   "privacy.direct.long": "تنها به کاربران نام‌برده‌شده نشان بده",
   "privacy.direct.short": "مستقیم",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "هشتگ‌ها",
   "search_results.statuses": "بوق‌ها",
   "search_results.total": "{count, number} {count, plural, one {نتیجه} other {نتیجه}}",
-  "standalone.public_title": "نگاهی به کاربران این سرور...",
   "status.admin_account": "محیط مدیریت مربوط به @{name} را باز کن",
   "status.admin_status": "این نوشته را در محیط مدیریت باز کن",
   "status.block": "مسدودسازی @{name}",
@@ -356,19 +356,19 @@
   "tabs_bar.local_timeline": "محلی",
   "tabs_bar.notifications": "اعلان‌ها",
   "tabs_bar.search": "جستجو",
-  "time_remaining.days": "{number, plural, one {# روز} other {# روز}} left",
-  "time_remaining.hours": "{number, plural, one {# ساعت} other {# ساعت}} left",
-  "time_remaining.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}} left",
+  "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 {# ثانیه}} left",
+  "time_remaining.seconds": "{number, plural, one {# ثانیه} other {# ثانیه}} باقی مانده",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {نفر نوشته است} other {نفر نوشته‌اند}}",
   "ui.beforeunload": "اگر از ماستدون خارج شوید پیش‌نویس شما پاک خواهد شد.",
   "upload_area.title": "برای بارگذاری به این‌جا بکشید",
   "upload_button.label": "افزودن عکس و ویدیو (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "از حد مجاز باگذاری فراتر رفتید.",
-  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_error.poll": "باگذاری پرونده در نظرسنجی‌ها ممکن نیست.",
   "upload_form.description": "نوشتهٔ توضیحی برای کم‌بینایان و نابینایان",
-  "upload_form.focus": "بریدن لبه‌ها",
+  "upload_form.focus": "تغییر پیش‌نمایش",
   "upload_form.undo": "حذف",
   "upload_progress.label": "بارگذاری...",
   "video.close": "بستن ویدیو",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 9949d741e..68381f6b3 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Piilota kaikki sisältö verkkotunnuksesta {domain}",
   "account.blocked": "Estetty",
   "account.direct": "Viesti käyttäjälle @{name}",
-  "account.disclaimer_full": "Alla olevat käyttäjän profiilitiedot saattavat olla epätäydellisiä.",
   "account.domain_blocked": "Verkko-osoite piilotettu",
   "account.edit_profile": "Muokkaa",
   "account.endorse": "Suosittele profiilissasi",
@@ -36,7 +35,6 @@
   "account.unfollow": "Lakkaa seuraamasta",
   "account.unmute": "Poista käyttäjän @{name} mykistys",
   "account.unmute_notifications": "Poista mykistys käyttäjän @{name} ilmoituksilta",
-  "account.view_full_profile": "Näytä koko profiili",
   "alert.unexpected.message": "Tapahtui odottamaton virhe.",
   "alert.unexpected.title": "Hups!",
   "boost_modal.combo": "Ensi kerralla voit ohittaa tämän painamalla {combo}",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Teksti ei ole piilotettu",
   "compose_form.spoiler_placeholder": "Sisältövaroitus",
   "confirmation_modal.cancel": "Peruuta",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Estä",
   "confirmations.block.message": "Haluatko varmasti estää käyttäjän {name}?",
   "confirmations.delete.confirm": "Poista",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Et ole mykistänyt vielä yhtään käyttäjää.",
   "empty_column.notifications": "Sinulle ei ole vielä ilmoituksia. Aloita keskustelu juttelemalla muille.",
   "empty_column.public": "Täällä ei ole mitään! Saat sisältöä, kun kirjoitat jotain julkisesti tai käyt seuraamassa muiden instanssien käyttäjiä",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Valtuuta",
   "follow_request.reject": "Hylkää",
   "getting_started.developers": "Kehittäjille",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} tykkäsi tilastasi",
   "notification.follow": "{name} seurasi sinua",
   "notification.mention": "{name} mainitsi sinut",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} buustasi tilaasi",
   "notifications.clear": "Tyhjennä ilmoitukset",
   "notifications.clear_confirmation": "Haluatko varmasti poistaa kaikki ilmoitukset pysyvästi?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Uudet seuraajat:",
   "notifications.column_settings.mention": "Maininnat:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push-ilmoitukset",
   "notifications.column_settings.reblog": "Buustit:",
   "notifications.column_settings.show": "Näytä sarakkeessa",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtagit",
   "search_results.statuses": "Tuuttaukset",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "Kurkistus sisälle...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Estä @{name}",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index b257a16b9..4d7451248 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Tout masquer venant de {domain}",
   "account.blocked": "Bloqué",
   "account.direct": "Envoyer un message direct à @{name}",
-  "account.disclaimer_full": "Les données ci-dessous peuvent ne pas refléter ce profil dans sa totalité.",
   "account.domain_blocked": "Domaine caché",
   "account.edit_profile": "Modifier le profil",
   "account.endorse": "Figure sur le profil",
@@ -36,7 +35,6 @@
   "account.unfollow": "Ne plus suivre",
   "account.unmute": "Ne plus masquer @{name}",
   "account.unmute_notifications": "Réactiver les notifications de @{name}",
-  "account.view_full_profile": "Afficher le profil complet",
   "alert.unexpected.message": "Une erreur inattendue s’est produite.",
   "alert.unexpected.title": "Oups !",
   "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour pouvoir passer ceci, la prochaine fois",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Le texte n’est pas caché",
   "compose_form.spoiler_placeholder": "Écrivez ici votre avertissement",
   "confirmation_modal.cancel": "Annuler",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Bloquer",
   "confirmations.block.message": "Confirmez-vous le blocage de {name} ?",
   "confirmations.delete.confirm": "Supprimer",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Vous n’avez pas encore mis d'utilisateur·rice·s en silence.",
   "empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres personnes pour débuter la conversation.",
   "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres instances pour remplir le fil public",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Accepter",
   "follow_request.reject": "Rejeter",
   "getting_started.developers": "Développeur·euse·s",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} a ajouté à ses favoris :",
   "notification.follow": "{name} vous suit",
   "notification.mention": "{name} vous a mentionné :",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} a partagé votre statut :",
   "notifications.clear": "Nettoyer les notifications",
   "notifications.clear_confirmation": "Voulez-vous vraiment supprimer toutes vos notifications ?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Afficher",
   "notifications.column_settings.follow": "Nouveaux⋅elles abonné⋅e·s :",
   "notifications.column_settings.mention": "Mentions :",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Notifications",
   "notifications.column_settings.reblog": "Partages :",
   "notifications.column_settings.show": "Afficher dans la colonne",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favoris",
   "notifications.filter.follows": "Abonné·e·s",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Fermé",
   "poll.refresh": "Actualiser",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Pouets",
   "search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}",
-  "standalone.public_title": "Un aperçu…",
   "status.admin_account": "Ouvrir l'interface de modération pour @{name}",
   "status.admin_status": "Ouvrir ce statut dans l'interface de modération",
   "status.block": "Bloquer @{name}",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 83adc563f..3011e7d07 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Ocultar calquer contido de {domain}",
   "account.blocked": "Bloqueada",
   "account.direct": "Mensaxe directa @{name}",
-  "account.disclaimer_full": "A información inferior podería mostrar un perfil incompleto da usuaria.",
   "account.domain_blocked": "Dominio agochado",
   "account.edit_profile": "Editar perfil",
   "account.endorse": "Mostrado no perfil",
@@ -36,7 +35,6 @@
   "account.unfollow": "Non seguir",
   "account.unmute": "Non acalar @{name}",
   "account.unmute_notifications": "Desbloquear as notificacións de @{name}",
-  "account.view_full_profile": "Ver o perfil completo",
   "alert.unexpected.message": "Aconteceu un fallo non agardado.",
   "alert.unexpected.title": "Vaia!",
   "boost_modal.combo": "Pulse {combo} para saltar esto a próxima vez",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "O texto non está agochado",
   "compose_form.spoiler_placeholder": "Escriba o aviso aquí",
   "confirmation_modal.cancel": "Cancelar",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Bloquear",
   "confirmations.block.message": "Está segura de querer bloquear a {name}?",
   "confirmations.delete.confirm": "Borrar",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Non acalou ningunha usuaria polo de agora.",
   "empty_column.notifications": "Aínda non ten notificacións. Interactúe con outras para iniciar unha conversa.",
   "empty_column.public": "Nada por aquí! Escriba algo de xeito público, ou siga manualmente usuarias de outros servidores para ir enchéndoa",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rexeitar",
   "getting_started.developers": "Desenvolvedoras",
@@ -152,13 +150,13 @@
   "hashtag.column_settings.tag_mode.all": "Todos estos",
   "hashtag.column_settings.tag_mode.any": "Calquera de estos",
   "hashtag.column_settings.tag_mode.none": "Ningún de estos",
-  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "hashtag.column_settings.tag_toggle": "Incluír etiquetas adicionais para esta columna",
   "home.column_settings.basic": "Básico",
   "home.column_settings.show_reblogs": "Mostrar repeticións",
   "home.column_settings.show_replies": "Mostrar respostas",
   "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}}",
+  "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}",
   "introduction.federation.action": "Seguinte",
   "introduction.federation.federated.headline": "Federated",
   "introduction.federation.federated.text": "Publicacións públicas desde outros servidores do fediverso aparecerán na liña temporal federada.",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} marcou como favorito o seu estado",
   "notification.follow": "{name} está a seguila",
   "notification.mention": "{name} mencionoute",
+  "notification.poll": "Unha sondaxe na que votou xa rematou",
   "notification.reblog": "{name} promoveu o seu estado",
   "notifications.clear": "Limpar notificacións",
   "notifications.clear_confirmation": "Estás seguro de que queres limpar permanentemente todas as túas notificacións?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Mostrar",
   "notifications.column_settings.follow": "Novos seguidores:",
   "notifications.column_settings.mention": "Mencións:",
+  "notifications.column_settings.poll": "Resultados da sondaxe:",
   "notifications.column_settings.push": "Enviar notificacións",
   "notifications.column_settings.reblog": "Promocións:",
   "notifications.column_settings.show": "Mostrar en columna",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favoritos",
   "notifications.filter.follows": "Seguimentos",
   "notifications.filter.mentions": "Mencións",
+  "notifications.filter.polls": "Resultados da sondaxe",
   "notifications.group": "{count} notificacións",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Etiquetas",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count,plural,one {result} outros {results}}",
-  "standalone.public_title": "Ollada dentro...",
   "status.admin_account": "Abrir interface de moderación para @{name}",
   "status.admin_status": "Abrir este estado na interface de moderación",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index 07d2a9c34..c136c111f 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -5,7 +5,6 @@
   "account.block_domain": "להסתיר הכל מהקהילה {domain}",
   "account.blocked": "Blocked",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "המידע להלן עשוי להיות לא עדכני או לא שלם.",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "עריכת פרופיל",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "הפסקת מעקב",
   "account.unmute": "הפסקת השתקת @{name}",
   "account.unmute_notifications": "להפסיק הסתרת הודעות מעם @{name}",
-  "account.view_full_profile": "הצגת פרופיל מלא",
   "alert.unexpected.message": "אירעה שגיאה בלתי צפויה.",
   "alert.unexpected.title": "אופס!",
   "boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "אזהרת תוכן",
   "confirmation_modal.cancel": "ביטול",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "לחסום",
   "confirmations.block.message": "לחסום את {name}?",
   "confirmations.delete.confirm": "למחוק",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "אין התראות עדיין. יאללה, הגיע הזמן להתחיל להתערבב.",
   "empty_column.public": "אין פה כלום! כדי למלא את הטור הזה אפשר לכתוב משהו, או להתחיל לעקוב אחרי אנשים מקהילות אחרות",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "קבלה",
   "follow_request.reject": "דחיה",
   "getting_started.developers": "Developers",
@@ -248,6 +246,7 @@
   "notification.favourite": "חצרוצך חובב על ידי {name}",
   "notification.follow": "{name} במעקב אחרייך",
   "notification.mention": "אוזכרת על ידי {name}",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "חצרוצך הודהד על ידי {name}",
   "notifications.clear": "הסרת התראות",
   "notifications.clear_confirmation": "להסיר את כל ההתראות? בטוח?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "עוקבים חדשים:",
   "notifications.column_settings.mention": "פניות:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "הודעות בדחיפה",
   "notifications.column_settings.reblog": "הדהודים:",
   "notifications.column_settings.show": "הצגה בטור",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {תוצאה} other {תוצאות}}",
-  "standalone.public_title": "הצצה פנימה...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index 0312da592..86bd01a79 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Sakrij sve sa {domain}",
   "account.blocked": "Blocked",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "Ovaj korisnik je sa druge instance. Ovaj broj bi mogao biti veći.",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Uredi profil",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Prestani slijediti",
   "account.unmute": "Poništi utišavanje @{name}",
   "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account.view_full_profile": "View full profile",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "Možeš pritisnuti {combo} kako bi ovo preskočio sljedeći put",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Upozorenje o sadržaju",
   "confirmation_modal.cancel": "Otkaži",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Blokiraj",
   "confirmations.block.message": "Želiš li sigurno blokirati {name}?",
   "confirmations.delete.confirm": "Obriši",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "Još nemaš notifikacija. Komuniciraj sa drugima kako bi započeo razgovor.",
   "empty_column.public": "Ovdje nema ništa! Napiši nešto javno, ili ručno slijedi korisnike sa drugih instanci kako bi popunio",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autoriziraj",
   "follow_request.reject": "Odbij",
   "getting_started.developers": "Developers",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} je lajkao tvoj status",
   "notification.follow": "{name} te sada slijedi",
   "notification.mention": "{name} te je spomenuo",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} je podigao tvoj status",
   "notifications.clear": "Očisti notifikacije",
   "notifications.clear_confirmation": "Želiš li zaista obrisati sve svoje notifikacije?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Novi sljedbenici:",
   "notifications.column_settings.mention": "Spominjanja:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
   "notifications.column_settings.reblog": "Boostovi:",
   "notifications.column_settings.show": "Prikaži u stupcu",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "A look inside...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 20b21be73..507e04400 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Minden elrejtése innen: {domain}",
   "account.blocked": "Blocked",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "Az alul található információk hiányosan mutathatják be a felhasználót.",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Profil szerkesztése",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Követés abbahagyása",
   "account.unmute": "@{name} kinémítása",
   "account.unmute_notifications": "@{name} értesítéseinek kinémítása",
-  "account.view_full_profile": "Teljes profil megtekintése",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "Megnyomhatod {combo}, hogy átugord következő alkalommal",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Figyelmeztetését írja ide",
   "confirmation_modal.cancel": "Bezár",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Letilt",
   "confirmations.block.message": "Biztos benne, hogy le szeretné tiltani {name}?",
   "confirmations.delete.confirm": "Töröl",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "Jelenleg nincsenek értesítései. Lépj kapcsolatba másokkal, hogy indítsd el a beszélgetést.",
   "empty_column.public": "Jelenleg semmi nincs itt! Írj valamit publikusan vagy kövess más szervereken levő felhasználókat, hogy megtöltsd",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Engedélyez",
   "follow_request.reject": "Visszautasít",
   "getting_started.developers": "Developers",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} kedvencnek jelölte az állapotod",
   "notification.follow": "{name} követ téged",
   "notification.mention": "{name} megemlített",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} rebloggolta az állapotod",
   "notifications.clear": "Értesítések törlése",
   "notifications.clear_confirmation": "Biztos benne, hogy véglegesen törölni akarja az összes értesítését?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Új követők:",
   "notifications.column_settings.mention": "Megemítéseim:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push értesítések",
   "notifications.column_settings.reblog": "Rebloggolások:",
   "notifications.column_settings.show": "Oszlopban mutatás",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "Betekintés...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index b96d9499e..a4c8bffba 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Թաքցնել ամենը հետեւյալ տիրույթից՝ {domain}",
   "account.blocked": "Blocked",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "Ներքոհիշյալը կարող է ոչ ամբողջությամբ արտացոլել օգտատիրոջ էջի տվյալները։",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Խմբագրել անձնական էջը",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Չհետեւել",
   "account.unmute": "Ապալռեցնել @{name}֊ին",
   "account.unmute_notifications": "Միացնել ծանուցումները @{name}֊ից",
-  "account.view_full_profile": "Դիտել ամբողջական տարբերակը։",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "Կարող ես սեղմել {combo}՝ սա հաջորդ անգամ բաց թողնելու համար",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Գրիր նախազգուշացումդ այստեղ",
   "confirmation_modal.cancel": "Չեղարկել",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Արգելափակել",
   "confirmations.block.message": "Վստա՞հ ես, որ ուզում ես արգելափակել {name}֊ին։",
   "confirmations.delete.confirm": "Ջնջել",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "Ոչ մի ծանուցում դեռ չունես։ Բզիր մյուսներին՝ խոսակցությունը սկսելու համար։",
   "empty_column.public": "Այստեղ բան չկա՛։ Հրապարակային մի բան գրիր կամ հետեւիր այլ հանգույցներից էակների՝ այն լցնելու համար։",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Վավերացնել",
   "follow_request.reject": "Մերժել",
   "getting_started.developers": "Developers",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} հավանեց թութդ",
   "notification.follow": "{name} սկսեց հետեւել քեզ",
   "notification.mention": "{name} նշեց քեզ",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} տարածեց թութդ",
   "notifications.clear": "Մաքրել ծանուցումները",
   "notifications.clear_confirmation": "Վստա՞հ ես, որ ուզում ես մշտապես մաքրել քո բոլոր ծանուցումները։",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Նոր հետեւողներ՝",
   "notifications.column_settings.mention": "Նշումներ՝",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Հրելու ծանուցումներ",
   "notifications.column_settings.reblog": "Տարածածներից՝",
   "notifications.column_settings.show": "Ցուցադրել սյունում",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "Այս պահին…",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Արգելափակել @{name}֊ին",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 2b00ece08..5319705dc 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Sembunyikan segalanya dari {domain}",
   "account.blocked": "Terblokir",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "Informasi di bawah mungkin tidak mencerminkan profil user secara lengkap.",
   "account.domain_blocked": "Domain disembunyikan",
   "account.edit_profile": "Ubah profil",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Berhenti mengikuti",
   "account.unmute": "Berhenti membisukan @{name}",
   "account.unmute_notifications": "Munculkan notifikasi dari @{name}",
-  "account.view_full_profile": "Lihat profil lengkap",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "Anda dapat menekan {combo} untuk melewati ini",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Teks tidak tersembunyi",
   "compose_form.spoiler_placeholder": "Peringatan konten",
   "confirmation_modal.cancel": "Batal",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Blokir",
   "confirmations.block.message": "Apa anda yakin ingin memblokir {name}?",
   "confirmations.delete.confirm": "Hapus",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "Anda tidak memiliki notifikasi apapun. Berinteraksi dengan orang lain untuk memulai percakapan.",
   "empty_column.public": "Tidak ada apapun disini! Tulis sesuatu, atau ikuti pengguna lain dari server lain untuk mengisi ini",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Izinkan",
   "follow_request.reject": "Tolak",
   "getting_started.developers": "Developers",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} menyukai status anda",
   "notification.follow": "{name} mengikuti anda",
   "notification.mention": "{name} mentioned you",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} mem-boost status anda",
   "notifications.clear": "Hapus notifikasi",
   "notifications.clear_confirmation": "Apa anda yakin hendak menghapus semua notifikasi anda?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Pengikut baru:",
   "notifications.column_settings.mention": "Balasan:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
   "notifications.column_settings.reblog": "Boost:",
   "notifications.column_settings.show": "Tampilkan dalam kolom",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {hasil} other {hasil}}",
-  "standalone.public_title": "A look inside...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 7e0e5563c..300bc4484 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Modifikar profilo",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Ne plus sequar",
   "account.unmute": "Ne plus celar @{name}",
   "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account.view_full_profile": "View full profile",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "Tu povas presar sur {combo} por omisar co en la venonta foyo",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Averto di kontenajo",
   "confirmation_modal.cancel": "Cancel",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Block",
   "confirmations.block.message": "Are you sure you want to block {name}?",
   "confirmations.delete.confirm": "Delete",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "Tu havas ankore nula savigo. Komunikez kun altri por debutar la konverso.",
   "empty_column.public": "Esas nulo hike! Skribez ulo publike, o manuale sequez uzeri de altra instaluri por plenigar ol.",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Yurizar",
   "follow_request.reject": "Refuzar",
   "getting_started.developers": "Developers",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} favorizis tua mesajo",
   "notification.follow": "{name} sequeskis tu",
   "notification.mention": "{name} mencionis tu",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} repetis tua mesajo",
   "notifications.clear": "Efacar savigi",
   "notifications.clear_confirmation": "Ka tu esas certa, ke tu volas efacar omna tua savigi?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Nova sequanti:",
   "notifications.column_settings.mention": "Mencioni:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
   "notifications.column_settings.reblog": "Repeti:",
   "notifications.column_settings.show": "Montrar en kolumno",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {rezulto} other {rezulti}}",
-  "standalone.public_title": "A look inside...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index e4cd96475..d70a88dbb 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Nascondi tutto da {domain}",
   "account.blocked": "Bloccato",
   "account.direct": "Invia messaggio diretto a @{name}",
-  "account.disclaimer_full": "Il profilo dell'utente mostrato qui sotto potrebbe essere incompleto.",
   "account.domain_blocked": "Dominio nascosto",
   "account.edit_profile": "Modifica profilo",
   "account.endorse": "Metti in evidenza sul profilo",
@@ -36,7 +35,6 @@
   "account.unfollow": "Non seguire",
   "account.unmute": "Non silenziare @{name}",
   "account.unmute_notifications": "Non silenziare più le notifiche da @{name}",
-  "account.view_full_profile": "Vedi profilo completo",
   "alert.unexpected.message": "Si è verificato un errore inatteso.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "Puoi premere {combo} per saltare questo passaggio la prossima volta",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Il testo non è nascosto",
   "compose_form.spoiler_placeholder": "Content warning",
   "confirmation_modal.cancel": "Annulla",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Blocca",
   "confirmations.block.message": "Sei sicuro di voler bloccare {name}?",
   "confirmations.delete.confirm": "Cancella",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Non hai ancora silenziato nessun utente.",
   "empty_column.notifications": "Non hai ancora nessuna notifica. Interagisci con altri per iniziare conversazioni.",
   "empty_column.public": "Qui non c'è nulla! Scrivi qualcosa pubblicamente, o aggiungi utenti da altri server per riempire questo spazio",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autorizza",
   "follow_request.reject": "Rifiuta",
   "getting_started.developers": "Sviluppatori",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} ha apprezzato il tuo post",
   "notification.follow": "{name} ha iniziato a seguirti",
   "notification.mention": "{name} ti ha menzionato",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} ha condiviso il tuo post",
   "notifications.clear": "Cancella notifiche",
   "notifications.clear_confirmation": "Vuoi davvero cancellare tutte le notifiche?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Mostra",
   "notifications.column_settings.follow": "Nuovi seguaci:",
   "notifications.column_settings.mention": "Menzioni:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Notifiche push",
   "notifications.column_settings.reblog": "Post condivisi:",
   "notifications.column_settings.show": "Mostra in colonna",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Apprezzati",
   "notifications.filter.follows": "Seguaci",
   "notifications.filter.mentions": "Menzioni",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifiche",
   "poll.closed": "Chiuso",
   "poll.refresh": "Aggiorna",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtag",
   "search_results.statuses": "Toot",
   "search_results.total": "{count} {count, plural, one {risultato} other {risultati}}",
-  "standalone.public_title": "Un'occhiata all'interno...",
   "status.admin_account": "Apri interfaccia di moderazione per @{name}",
   "status.admin_status": "Apri questo status nell'interfaccia di moderazione",
   "status.block": "Blocca @{name}",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index ca66fbf2a..423ff3dce 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -5,7 +5,6 @@
   "account.block_domain": "{domain}全体を非表示",
   "account.blocked": "ブロック済み",
   "account.direct": "@{name}さんにダイレクトメッセージ",
-  "account.disclaimer_full": "以下の情報は不正確な可能性があります。",
   "account.domain_blocked": "ドメイン非表示中",
   "account.edit_profile": "プロフィールを編集",
   "account.endorse": "プロフィールで紹介する",
@@ -36,7 +35,6 @@
   "account.unfollow": "フォロー解除",
   "account.unmute": "@{name}さんのミュートを解除",
   "account.unmute_notifications": "@{name}さんからの通知を受け取るようにする",
-  "account.view_full_profile": "全ての情報を見る",
   "alert.unexpected.message": "不明なエラーが発生しました。",
   "alert.unexpected.title": "エラー!",
   "boost_modal.combo": "次からは{combo}を押せばスキップできます",
@@ -78,7 +76,7 @@
   "compose_form.lock_disclaimer.lock": "承認制",
   "compose_form.placeholder": "今なにしてる?",
   "compose_form.poll.add_option": "Add a choice",
-  "compose_form.poll.duration": "Poll duration",
+  "compose_form.poll.duration": "投票期間",
   "compose_form.poll.option_placeholder": "Choice {number}",
   "compose_form.poll.remove_option": "Remove this choice",
   "compose_form.publish": "トゥート",
@@ -89,6 +87,7 @@
   "compose_form.spoiler.unmarked": "閲覧注意が設定されていません",
   "compose_form.spoiler_placeholder": "ここに警告を書いてください",
   "confirmation_modal.cancel": "キャンセル",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "ブロック",
   "confirmations.block.message": "本当に{name}さんをブロックしますか?",
   "confirmations.delete.confirm": "削除",
@@ -161,7 +160,7 @@
   "home.column_settings.show_replies": "返信表示",
   "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}}",
+  "intervals.full.minutes": "{number}分",
   "introduction.federation.action": "次へ",
   "introduction.federation.federated.headline": "連合タイムライン",
   "introduction.federation.federated.text": "Fediverseの他のサーバーからの公開投稿は連合タイムラインに表示されます。",
@@ -252,6 +251,7 @@
   "notification.favourite": "{name}さんがあなたのトゥートをお気に入りに登録しました",
   "notification.follow": "{name}さんにフォローされました",
   "notification.mention": "{name}さんがあなたに返信しました",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name}さんがあなたのトゥートをブーストしました",
   "notifications.clear": "通知を消去",
   "notifications.clear_confirmation": "本当に通知を消去しますか?",
@@ -262,6 +262,7 @@
   "notifications.column_settings.filter_bar.show": "表示",
   "notifications.column_settings.follow": "新しいフォロワー:",
   "notifications.column_settings.mention": "返信:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "プッシュ通知",
   "notifications.column_settings.reblog": "ブースト:",
   "notifications.column_settings.show": "カラムに表示",
@@ -271,13 +272,14 @@
   "notifications.filter.favourites": "お気に入り",
   "notifications.filter.follows": "フォロー",
   "notifications.filter.mentions": "返信",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} 件の通知",
   "poll.closed": "終了",
   "poll.refresh": "更新",
-  "poll.total_votes": "{count, plural, one {# 票} other {# 票}}",
+  "poll.total_votes": "{count}票",
   "poll.vote": "Vote",
   "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll_button.remove_poll": "投票を削除",
   "privacy.change": "公開範囲を変更",
   "privacy.direct.long": "メンションしたユーザーだけに公開",
   "privacy.direct.short": "ダイレクト",
@@ -359,19 +361,19 @@
   "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}日",
+  "time_remaining.hours": "残り{number}時間",
+  "time_remaining.minutes": "残り{number}分",
   "time_remaining.moments": "まもなく終了",
-  "time_remaining.seconds": "残り {number, plural, one {# 秒} other {# 秒}}",
-  "trends.count_by_accounts": "{count} {rawCount, plural, one {人} other {人}} がトゥート",
+  "time_remaining.seconds": "残り{number}秒",
+  "trends.count_by_accounts": "{count}人がトゥート",
   "ui.beforeunload": "Mastodonから離れると送信前の投稿は失われます。",
   "upload_area.title": "ドラッグ&ドロップでアップロード",
   "upload_button.label": "メディアを追加 (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "アップロードできる上限を超えています。",
   "upload_error.poll": "File upload not allowed with polls.",
   "upload_form.description": "視覚障害者のための説明",
-  "upload_form.focus": "焦点",
+  "upload_form.focus": "プレビューを変更",
   "upload_form.undo": "削除",
   "upload_progress.label": "アップロード中...",
   "video.close": "動画を閉じる",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 21afe8df3..fa1d823d0 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -5,7 +5,6 @@
   "account.block_domain": "დაიმალოს ყველაფერი დომენიდან {domain}",
   "account.blocked": "დაიბლოკა",
   "account.direct": "პირდაპირი წერილი @{name}-ს",
-  "account.disclaimer_full": "ქვემოთ მოცემულმა ინფორმაციამ შეიძლება სრულად არ ასახოს მომხმარებლის პროფილი.",
   "account.domain_blocked": "დომენი დამალულია",
   "account.edit_profile": "პროფილის ცვლილება",
   "account.endorse": "გამორჩევა პროფილზე",
@@ -36,7 +35,6 @@
   "account.unfollow": "ნუღარ მიჰყვები",
   "account.unmute": "ნუღარ აჩუმებ @{name}-ს",
   "account.unmute_notifications": "ნუღარ აჩუმებ შეტყობინებებს @{name}-სგან",
-  "account.view_full_profile": "სრული პროფილის ჩვენება",
   "alert.unexpected.message": "წარმოიშვა მოულოდნელი შეცდომა.",
   "alert.unexpected.title": "უპს!",
   "boost_modal.combo": "შეგიძლიათ დააჭიროთ {combo}-ს რათა შემდეგ ჯერზე გამოტოვოთ ეს",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "ტექსტი არაა დამალული",
   "compose_form.spoiler_placeholder": "თქვენი გაფრთხილება დაწერეთ აქ",
   "confirmation_modal.cancel": "უარყოფა",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "ბლოკი",
   "confirmations.block.message": "დარწმუნებული ხართ, გსურთ დაბლოკოთ {name}?",
   "confirmations.delete.confirm": "გაუქმება",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "ჯერ შეტყობინებები არ გაქვთ. საუბრის დასაწყებად იურთიერთქმედეთ სხვებთან.",
   "empty_column.public": "აქ არაფერია! შესავსებად, დაწერეთ რაიმე ღიად ან ხელით გაჰყევით მომხმარებლებს სხვა ინსტანციებისგან",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "ავტორიზაცია",
   "follow_request.reject": "უარყოფა",
   "getting_started.developers": "დეველოპერები",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name}-მა თქვენი სტატუსი აქცია ფავორიტად",
   "notification.follow": "{name} გამოგყვათ",
   "notification.mention": "{name}-მა გასახელათ",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name}-მა დაბუსტა თქვენი სტატუსი",
   "notifications.clear": "შეტყობინებების გასუფთავება",
   "notifications.clear_confirmation": "დარწმუნებული ხართ, გსურთ სამუდამოდ წაშალოთ ყველა თქვენი შეტყობინება?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "ახალი მიმდევრები:",
   "notifications.column_settings.mention": "ხსენებები:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "ფუშ შეტყობინებები",
   "notifications.column_settings.reblog": "ბუსტები:",
   "notifications.column_settings.show": "გამოჩნდეს სვეტში",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} შეტყობინება",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "ჰეშტეგები",
   "search_results.statuses": "ტუტები",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "შიდა ხედი...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "დაბლოკე @{name}",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index 034810fdd..12cdf25c9 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Домендегі барлығын бұғатта {domain}",
   "account.blocked": "Бұғатталды",
   "account.direct": "Жеке хат @{name}",
-  "account.disclaimer_full": "Қолданушы туралы барлық мәліметті көрсетпеуі мүмкін.",
   "account.domain_blocked": "Домен жабық",
   "account.edit_profile": "Профильді өңдеу",
   "account.endorse": "Профильде рекомендеу",
@@ -36,7 +35,6 @@
   "account.unfollow": "Оқымау",
   "account.unmute": "@{name} ескертпелерін қосу",
   "account.unmute_notifications": "@{name} ескертпелерін көрсету",
-  "account.view_full_profile": "Толқы профилін көрсету",
   "alert.unexpected.message": "Бір нәрсе дұрыс болмады.",
   "alert.unexpected.title": "Өй!",
   "boost_modal.combo": "Келесіде өткізіп жіберу үшін басыңыз {combo}",
@@ -55,7 +53,7 @@
   "column.home": "Басты бет",
   "column.lists": "Тізімдер",
   "column.mutes": "Үнсіз қолданушылар",
-  "column.notifications": "Notifications",
+  "column.notifications": "Ескертпелер",
   "column.pins": "Жабыстырылған жазбалар",
   "column.public": "Жаһандық желі",
   "column_back_button.label": "Артқа",
@@ -73,10 +71,10 @@
   "compose_form.lock_disclaimer": "Аккаунтыңыз {locked} емес. Кез келген адам жазылып, сізді оқи алады.",
   "compose_form.lock_disclaimer.lock": "жабық",
   "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.remove_option": "Remove this choice",
+  "compose_form.poll.add_option": "Жауап қос",
+  "compose_form.poll.duration": "Сауалнама мерзімі",
+  "compose_form.poll.option_placeholder": "Жауап {number}",
+  "compose_form.poll.remove_option": "Бұл жауапты өшір",
   "compose_form.publish": "Түрт",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.marked": "Медиа нәзік деп белгіленген",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Мәтін жасырылмаған",
   "compose_form.spoiler_placeholder": "Ескертуіңізді осында жазыңыз",
   "confirmation_modal.cancel": "Қайтып алу",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Бұғаттау",
   "confirmations.block.message": "{name} атты қолданушыны бұғаттайтыныңызға сенімдісіз бе?",
   "confirmations.delete.confirm": "Өшіру",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Әзірше ешқандай үнсізге қойылған қолданушы жоқ.",
   "empty_column.notifications": "Әзірше ешқандай ескертпе жоқ. Басқалармен араласуды бастаңыз және пікірталастарға қатысыңыз.",
   "empty_column.public": "Ештеңе жоқ бұл жерде! Өзіңіз бастап жазып көріңіз немесе басқаларға жазылыңыз",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Авторизация",
   "follow_request.reject": "Қабылдамау",
   "getting_started.developers": "Жасаушылар тобы",
@@ -156,8 +154,8 @@
   "home.column_settings.basic": "Негізгі",
   "home.column_settings.show_reblogs": "Бөлісулерді көрсету",
   "home.column_settings.show_replies": "Жауаптарды көрсету",
-  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
-  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
+  "intervals.full.days": "{number, plural, one {# күн} other {# күн}}",
+  "intervals.full.hours": "{number, plural, one {# сағат} other {# сағат}}",
   "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
   "introduction.federation.action": "Келесі",
   "introduction.federation.federated.headline": "Жаһандық",
@@ -224,7 +222,7 @@
   "missing_indicator.label": "Табылмады",
   "missing_indicator.sublabel": "Бұл ресурс табылмады",
   "mute_modal.hide_notifications": "Бұл қолданушы ескертпелерін жасырамыз ба?",
-  "navigation_bar.apps": "Мобиль қосымшаларMobile apps",
+  "navigation_bar.apps": "Мобиль қосымшалар",
   "navigation_bar.blocks": "Бұғатталғандар",
   "navigation_bar.community_timeline": "Жергілікті желі",
   "navigation_bar.compose": "Жаңа жазба бастау",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} жазбаңызды таңдаулыға қосты",
   "notification.follow": "{name} сізге жазылды",
   "notification.mention": "{name} сізді атап өтті",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} жазбаңызды бөлісті",
   "notifications.clear": "Ескертпелерді тазарт",
   "notifications.clear_confirmation": "Шынымен барлық ескертпелерді өшіресіз бе?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Көрсету",
   "notifications.column_settings.follow": "Жаңа оқырмандар:",
   "notifications.column_settings.mention": "Аталымдар:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push ескертпелер",
   "notifications.column_settings.reblog": "Бөлісулер:",
   "notifications.column_settings.show": "Бағанда көрсет",
@@ -267,13 +267,14 @@
   "notifications.filter.favourites": "Таңдаулылар",
   "notifications.filter.follows": "Жазылулар",
   "notifications.filter.mentions": "Аталымдар",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} ескертпе",
   "poll.closed": "Жабық",
   "poll.refresh": "Жаңарту",
   "poll.total_votes": "{count, plural, one {# дауыс} other {# дауыс}}",
   "poll.vote": "Дауыс беру",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll_button.add_poll": "Сауалнама қосу",
+  "poll_button.remove_poll": "Сауалнаманы өшіру",
   "privacy.change": "Құпиялылықты реттеу",
   "privacy.direct.long": "Аталған адамдарға ғана көрінетін жазба",
   "privacy.direct.short": "Тікелей",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Хэштегтер",
   "search_results.statuses": "Жазбалар",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "Ішкі көрініс...",
   "status.admin_account": "@{name} үшін модерация интерфейсін аш",
   "status.admin_status": "Бұл жазбаны модерация интерфейсінде аш",
   "status.block": "Бұғаттау @{name}",
@@ -366,7 +366,7 @@
   "upload_area.title": "Жүктеу үшін сүйреп әкеліңіз",
   "upload_button.label": "Медиа қосу (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Файл жүктеу лимитінен асып кеттіңіз.",
-  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_error.poll": "Сауалнамамен бірге файл жүктеуге болмайды",
   "upload_form.description": "Көру қабілеті нашар адамдар үшін сипаттаңыз",
   "upload_form.focus": "Превьюді өзгерту",
   "upload_form.undo": "Өшіру",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index cbd68d195..433592ffd 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -5,7 +5,6 @@
   "account.block_domain": "{domain} 전체를 숨김",
   "account.blocked": "차단 됨",
   "account.direct": "@{name}으로부터의 다이렉트 메시지",
-  "account.disclaimer_full": "여기 있는 정보는 유저의 프로파일을 정확히 반영하지 못 할 수도 있습니다.",
   "account.domain_blocked": "도메인 숨겨짐",
   "account.edit_profile": "프로필 편집",
   "account.endorse": "프로필에 나타내기",
@@ -36,7 +35,6 @@
   "account.unfollow": "팔로우 해제",
   "account.unmute": "뮤트 해제",
   "account.unmute_notifications": "@{name}의 알림 뮤트 해제",
-  "account.view_full_profile": "전체 프로필 보기",
   "alert.unexpected.message": "예측하지 못한 에러가 발생했습니다.",
   "alert.unexpected.title": "앗!",
   "boost_modal.combo": "{combo}를 누르면 다음부터 이 과정을 건너뛸 수 있습니다",
@@ -73,10 +71,10 @@
   "compose_form.lock_disclaimer": "이 계정은 {locked}로 설정 되어 있지 않습니다. 누구나 이 계정을 팔로우 할 수 있으며, 팔로워 공개의 포스팅을 볼 수 있습니다.",
   "compose_form.lock_disclaimer.lock": "비공개",
   "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.remove_option": "Remove this choice",
+  "compose_form.poll.add_option": "항목 추가",
+  "compose_form.poll.duration": "투표 기간",
+  "compose_form.poll.option_placeholder": "{number}번 항목",
+  "compose_form.poll.remove_option": "이 항목 삭제",
   "compose_form.publish": "툿",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.marked": "미디어가 열람주의로 설정되어 있습니다",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "열람주의가 설정 되어 있지 않습니다",
   "compose_form.spoiler_placeholder": "경고",
   "confirmation_modal.cancel": "취소",
+  "confirmations.block.block_and_report": "차단하고 신고하기",
   "confirmations.block.confirm": "차단",
   "confirmations.block.message": "정말로 {name}를 차단하시겠습니까?",
   "confirmations.delete.confirm": "삭제",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "아직 아무도 뮤트하지 않았습니다.",
   "empty_column.notifications": "아직 알림이 없습니다. 다른 사람과 대화를 시작해 보세요.",
   "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 서버의 유저를 팔로우 해서 채워보세요",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "허가",
   "follow_request.reject": "거부",
   "getting_started.developers": "개발자",
@@ -152,19 +150,19 @@
   "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": "답글 표시",
-  "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}}",
+  "intervals.full.days": "{number} 일",
+  "intervals.full.hours": "{number} 시간",
+  "intervals.full.minutes": "{number} 분",
   "introduction.federation.action": "다음",
-  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.federated.headline": "연합",
   "introduction.federation.federated.text": "페디버스의 다른 서버의 공개 게시물이 연합 타임라인에 나타납니다.",
-  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.headline": "홈",
   "introduction.federation.home.text": "당신이 팔로우 하고 있는 사람의 게시물이 홈 타임라인에 나타납니다. 어느 서버에 있는 사람이라도 팔로우가 가능합니다!",
-  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.headline": "로컬",
   "introduction.federation.local.text": "같은 서버에 있는 공개 게시물은 로컬 타임라인에 나타납니다.",
   "introduction.interactions.action": "튜토리얼 마치기!",
   "introduction.interactions.favourite.headline": "즐겨찾기",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name}님이 즐겨찾기 했습니다",
   "notification.follow": "{name}님이 나를 팔로우 했습니다",
   "notification.mention": "{name}님이 답글을 보냈습니다",
+  "notification.poll": "당신이 참여 한 투표가 종료되었습니다",
   "notification.reblog": "{name}님이 부스트 했습니다",
   "notifications.clear": "알림 지우기",
   "notifications.clear_confirmation": "정말로 알림을 삭제하시겠습니까?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "표시",
   "notifications.column_settings.follow": "새 팔로워:",
   "notifications.column_settings.mention": "답글:",
+  "notifications.column_settings.poll": "투표 결과:",
   "notifications.column_settings.push": "푸시 알림",
   "notifications.column_settings.reblog": "부스트:",
   "notifications.column_settings.show": "컬럼에 표시",
@@ -267,13 +267,14 @@
   "notifications.filter.favourites": "즐겨찾기",
   "notifications.filter.follows": "팔로우",
   "notifications.filter.mentions": "멘션",
+  "notifications.filter.polls": "투표 결과",
   "notifications.group": "{count} 개의 알림",
   "poll.closed": "마감됨",
   "poll.refresh": "새로고침",
-  "poll.total_votes": "명 참여",
+  "poll.total_votes": "{count} 명 참여",
   "poll.vote": "투표",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll_button.add_poll": "투표 추가",
+  "poll_button.remove_poll": "투표 삭제",
   "privacy.change": "포스트의 프라이버시 설정을 변경",
   "privacy.direct.long": "멘션한 사용자에게만 공개",
   "privacy.direct.short": "다이렉트",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "해시태그",
   "search_results.statuses": "툿",
   "search_results.total": "{count, number}건의 결과",
-  "standalone.public_title": "지금 이런 이야기를 하고 있습니다…",
   "status.admin_account": "@{name}에 대한 모더레이션 인터페이스 열기",
   "status.admin_status": "모더레이션 인터페이스에서 이 게시물 열기",
   "status.block": "@{name} 차단",
@@ -356,17 +356,17 @@
   "tabs_bar.local_timeline": "로컬",
   "tabs_bar.notifications": "알림",
   "tabs_bar.search": "검색",
-  "time_remaining.days": "일 남음",
-  "time_remaining.hours": "시간 남음",
-  "time_remaining.minutes": "분 남음",
+  "time_remaining.days": "{number} 일 남음",
+  "time_remaining.hours": "{number} 시간 남음",
+  "time_remaining.minutes": "{number} 분 남음",
   "time_remaining.moments": "남은 시간",
-  "time_remaining.seconds": "초 남음",
-  "trends.count_by_accounts": "{count} {rawCount, plural, one {명} other {명}} 의 사람들이 말하고 있습니다",
+  "time_remaining.seconds": "{number} 초 남음",
+  "trends.count_by_accounts": "{count} 명의 사람들이 말하고 있습니다",
   "ui.beforeunload": "지금 나가면 저장되지 않은 항목을 잃게 됩니다.",
   "upload_area.title": "드래그 & 드롭으로 업로드",
   "upload_button.label": "미디어 추가 (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "파일 업로드 제한에 도달했습니다.",
-  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_error.poll": "파일 업로드는 투표와 함께 첨부할 수 없습니다.",
   "upload_form.description": "시각장애인을 위한 설명",
   "upload_form.focus": "미리보기 변경",
   "upload_form.undo": "삭제",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index ab784d1b4..0fa0c4fde 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Slēpt visu no {domain}",
   "account.blocked": "Bloķēts",
   "account.direct": "Privātā ziņa @{name}",
-  "account.disclaimer_full": "Informācija zemāk var nepilnīgi atspoguļot lietotāja profilu.",
   "account.domain_blocked": "Domēns ir paslēpts",
   "account.edit_profile": "Labot profilu",
   "account.endorse": "Izcelts profilā",
@@ -36,7 +35,6 @@
   "account.unfollow": "Nesekot",
   "account.unmute": "Noņemt apklusinājumu no lietotāja @{name}",
   "account.unmute_notifications": "Rādīt paziņojumus no lietotāja @{name}",
-  "account.view_full_profile": "Apskatīt pilnu profilu",
   "alert.unexpected.message": "Negaidīta kļūda.",
   "alert.unexpected.title": "Ups!",
   "boost_modal.combo": "Nospied {combo} lai izlaistu šo nākamreiz",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Teksts nav paslēpts",
   "compose_form.spoiler_placeholder": "Ieraksti Savu brīdinājuma tekstu šeit",
   "confirmation_modal.cancel": "Atcelt",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Bloķēt",
   "confirmations.block.message": "Vai tiešām vēlies bloķēt lietotāju {name}?",
   "confirmations.delete.confirm": "Dzēst",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Tu neesi nevienu apklusinājis.",
   "empty_column.notifications": "Tev nav paziņojumu. Iesaisties sarunās ar citiem.",
   "empty_column.public": "Šeit nekā nav, tukšums! Ieraksti kaut ko publiski, vai uzmeklē un seko kādam no citas instances",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autorizēt",
   "follow_request.reject": "Noraidīt",
   "getting_started.developers": "Developers",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
   "notification.mention": "{name} mentioned you",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
   "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",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "A look inside...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 9f8f797c8..eedd4c6f3 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
   "account.direct": "Direct message @{name}",
-  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Edit profile",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Unfollow",
   "account.unmute": "Unmute @{name}",
   "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account.view_full_profile": "View full profile",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "You can press {combo} to skip this next time",
@@ -85,6 +83,7 @@
   "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",
@@ -133,7 +132,6 @@
   "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 instances to fill it up",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Authorize",
   "follow_request.reject": "Reject",
   "getting_started.developers": "Developers",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
   "notification.mention": "{name} mentioned you",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
   "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",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "A look inside...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index 84ae28037..e5e4748d7 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Verberg alles van {domain}",
   "account.blocked": "Geblokkeerd",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "De informatie hieronder kan een incompleet beeld geven van dit gebruikersprofiel.",
   "account.domain_blocked": "Domein verborgen",
   "account.edit_profile": "Profiel bewerken",
   "account.endorse": "Op profiel weergeven",
@@ -36,7 +35,6 @@
   "account.unfollow": "Ontvolgen",
   "account.unmute": "@{name} niet langer negeren",
   "account.unmute_notifications": "@{name} meldingen niet langer negeren",
-  "account.view_full_profile": "Volledig profiel tonen",
   "alert.unexpected.message": "Er deed zich een onverwachte fout voor",
   "alert.unexpected.title": "Oeps!",
   "boost_modal.combo": "Je kunt {combo} klikken om dit de volgende keer over te slaan",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Tekst is niet verborgen",
   "compose_form.spoiler_placeholder": "Waarschuwingstekst",
   "confirmation_modal.cancel": "Annuleren",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Blokkeren",
   "confirmations.block.message": "Weet je het zeker dat je {name} wilt blokkeren?",
   "confirmations.delete.confirm": "Verwijderen",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Jij hebt nog geen gebruikers genegeerd.",
   "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_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Goedkeuren",
   "follow_request.reject": "Afkeuren",
   "getting_started.developers": "Ontwikkelaars",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} voegde jouw toot als favoriet toe",
   "notification.follow": "{name} volgt jou nu",
   "notification.mention": "{name} vermeldde jou",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boostte jouw toot",
   "notifications.clear": "Meldingen verwijderen",
   "notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Tonen",
   "notifications.column_settings.follow": "Nieuwe volgers:",
   "notifications.column_settings.mention": "Vermeldingen:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Pushmeldingen",
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "In kolom tonen",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favorieten",
   "notifications.filter.follows": "Die jij volgt",
   "notifications.filter.mentions": "Vermeldingen",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} meldingen",
   "poll.closed": "Gesloten",
   "poll.refresh": "Vernieuwen",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}",
-  "standalone.public_title": "Een kijkje binnenin...",
   "status.admin_account": "Moderatie-omgeving van @{name} openen",
   "status.admin_status": "Deze toot in de moderatie-omgeving openen",
   "status.block": "Blokkeer @{name}",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 45a3d500f..9556c5ad8 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Skjul alt fra {domain}",
   "account.blocked": "Blocked",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "Informasjonen nedenfor kan gi et ufullstendig bilde av brukerens profil.",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Rediger profil",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Avfølg",
   "account.unmute": "Avdemp @{name}",
   "account.unmute_notifications": "Vis varsler fra @{name}",
-  "account.view_full_profile": "Vis hele profilen",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "You kan trykke {combo} for å hoppe over dette neste gang",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Innholdsadvarsel",
   "confirmation_modal.cancel": "Avbryt",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Blokkèr",
   "confirmations.block.message": "Er du sikker på at du vil blokkere {name}?",
   "confirmations.delete.confirm": "Slett",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "Du har ingen varsler ennå. Kommuniser med andre for å begynne samtalen.",
   "empty_column.public": "Det er ingenting her! Skriv noe offentlig, eller følg brukere manuelt fra andre instanser for å fylle den opp",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autorisér",
   "follow_request.reject": "Avvis",
   "getting_started.developers": "Developers",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} likte din status",
   "notification.follow": "{name} fulgte deg",
   "notification.mention": "{name} nevnte deg",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} fremhevde din status",
   "notifications.clear": "Fjern varsler",
   "notifications.clear_confirmation": "Er du sikker på at du vil fjerne alle dine varsler permanent?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Nye følgere:",
   "notifications.column_settings.mention": "Nevnt:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push varsler",
   "notifications.column_settings.reblog": "Fremhevet:",
   "notifications.column_settings.show": "Vis i kolonne",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {resultat} other {resultater}}",
-  "standalone.public_title": "En titt inni...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 625cd49f0..8fc8762a4 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Tot amagar del domeni {domain}",
   "account.blocked": "Blocat",
   "account.direct": "Escriure un MP a @{name}",
-  "account.disclaimer_full": "Aquelas informacions de perfil pòdon èsser incomplètas.",
   "account.domain_blocked": "Domeni amagat",
   "account.edit_profile": "Modificar lo perfil",
   "account.endorse": "Mostrar pel perfil",
@@ -36,7 +35,6 @@
   "account.unfollow": "Quitar de sègre",
   "account.unmute": "Quitar de rescondre @{name}",
   "account.unmute_notifications": "Mostrar las notificacions de @{name}",
-  "account.view_full_profile": "Veire lo perfil complèt",
   "alert.unexpected.message": "Una error s’es producha.",
   "alert.unexpected.title": "Ops !",
   "boost_modal.combo": "Podètz botar {combo} per passar aquò lo còp que ven",
@@ -73,10 +71,10 @@
   "compose_form.lock_disclaimer": "Vòstre compte es pas {locked}. Tot lo monde pòt vos sègre e veire los estatuts reservats als seguidors.",
   "compose_form.lock_disclaimer.lock": "clavat",
   "compose_form.placeholder": "A de qué pensatz ?",
-  "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.add_option": "Ajustar una causida",
+  "compose_form.poll.duration": "Durada del sondatge",
+  "compose_form.poll.option_placeholder": "Opcion {number}",
+  "compose_form.poll.remove_option": "Levar aquesta opcion",
   "compose_form.publish": "Tut",
   "compose_form.publish_loud": "{publish} !",
   "compose_form.sensitive.marked": "Lo mèdia es marcat coma sensible",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Lo tèxte es pas rescondut",
   "compose_form.spoiler_placeholder": "Escrivètz l’avertiment aquí",
   "confirmation_modal.cancel": "Anullar",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Blocar",
   "confirmations.block.message": "Volètz vertadièrament blocar {name} ?",
   "confirmations.delete.confirm": "Escafar",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Encara avètz pas mes en silenci degun.",
   "empty_column.notifications": "Avètz pas encara de notificacions. Respondètz a qualqu’un per començar una conversacion.",
   "empty_column.public": "I a pas res aquí ! Escrivètz quicòm de public, o seguètz de personas d’autres servidors per garnir lo flux public",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Acceptar",
   "follow_request.reject": "Regetar",
   "getting_started.developers": "Desvelopaires",
@@ -156,9 +154,9 @@
   "home.column_settings.basic": "Basic",
   "home.column_settings.show_reblogs": "Mostrar los partatges",
   "home.column_settings.show_replies": "Mostrar las responsas",
-  "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}}",
+  "intervals.full.days": "{number, plural, one {# jorn} other {# jorns}}",
+  "intervals.full.hours": "{number, plural, one {# ora} other {# oras}}",
+  "intervals.full.minutes": "{number, plural, one {# minuta} other {# minutas}}",
   "introduction.federation.action": "Seguent",
   "introduction.federation.federated.headline": "Federat",
   "introduction.federation.federated.text": "Los tuts publics d’autres servidors del fediverse apareisseràn dins lo flux d’actualitats.",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} a ajustat a sos favorits",
   "notification.follow": "{name} vos sèc",
   "notification.mention": "{name} vos a mencionat",
+  "notification.poll": "Avètz participat a un sondatge que ven de s’acabar",
   "notification.reblog": "{name} a partejat vòstre estatut",
   "notifications.clear": "Escafar",
   "notifications.clear_confirmation": "Volètz vertadièrament escafar totas vòstras las notificacions ?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Mostrar",
   "notifications.column_settings.follow": "Nòus seguidors :",
   "notifications.column_settings.mention": "Mencions :",
+  "notifications.column_settings.poll": "Resultats del sondatge :",
   "notifications.column_settings.push": "Notificacions",
   "notifications.column_settings.reblog": "Partatges :",
   "notifications.column_settings.show": "Mostrar dins la colomna",
@@ -267,13 +267,14 @@
   "notifications.filter.favourites": "Favorits",
   "notifications.filter.follows": "Seguiments",
   "notifications.filter.mentions": "Mencions",
+  "notifications.filter.polls": "Resultats del sondatge",
   "notifications.group": "{count} notificacions",
   "poll.closed": "Tampat",
   "poll.refresh": "Actualizar",
   "poll.total_votes": "{count, plural, one {# vòte} other {# vòtes}}",
   "poll.vote": "Votar",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll_button.add_poll": "Ajustar un sondatge",
+  "poll_button.remove_poll": "Levar lo sondatge",
   "privacy.change": "Ajustar la confidencialitat del messatge",
   "privacy.direct.long": "Mostrar pas qu’a las personas mencionadas",
   "privacy.direct.short": "Dirècte",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Etiquetas",
   "search_results.statuses": "Tuts",
   "search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
-  "standalone.public_title": "Una ulhada dedins…",
   "status.admin_account": "Dobrir l’interfàcia de moderacion per @{name}",
   "status.admin_status": "Dobrir aqueste estatut dins l’interfàcia de moderacion",
   "status.block": "Blocar @{name}",
@@ -366,7 +366,7 @@
   "upload_area.title": "Lisatz e depausatz per mandar",
   "upload_button.label": "Ajustar un mèdia (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Talha maximum pels mandadís subrepassada.",
-  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_error.poll": "Lo mandadís de fichièr es pas autorizat pels sondatges.",
   "upload_form.description": "Descripcion pels mal vesents",
   "upload_form.focus": "Modificar l’apercebut",
   "upload_form.undo": "Suprimir",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 9d7bef774..107ac8757 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Blokuj wszystko z {domain}",
   "account.blocked": "Zablokowany(-a)",
   "account.direct": "Wyślij wiadomość bezpośrednią do @{name}",
-  "account.disclaimer_full": "Poniższe informacje mogą nie odwzorowywać bezbłędnie profilu użytkownika.",
   "account.domain_blocked": "Ukryto domenę",
   "account.edit_profile": "Edytuj profil",
   "account.endorse": "Polecaj na profilu",
@@ -36,7 +35,6 @@
   "account.unfollow": "Przestań śledzić",
   "account.unmute": "Cofnij wyciszenie @{name}",
   "account.unmute_notifications": "Cofnij wyciszenie powiadomień od @{name}",
-  "account.view_full_profile": "Wyświetl pełny profil",
   "alert.unexpected.message": "Wystąpił nieoczekiwany błąd.",
   "alert.unexpected.title": "O nie!",
   "boost_modal.combo": "Naciśnij {combo}, aby pominąć to następnym razem",
@@ -89,6 +87,7 @@
   "compose_form.spoiler.unmarked": "Tekst nie jest ukryty",
   "compose_form.spoiler_placeholder": "Wprowadź swoje ostrzeżenie o zawartości",
   "confirmation_modal.cancel": "Anuluj",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Zablokuj",
   "confirmations.block.message": "Czy na pewno chcesz zablokować {name}?",
   "confirmations.delete.confirm": "Usuń",
@@ -137,7 +136,6 @@
   "empty_column.mutes": "Nie wyciszyłeś(-aś) jeszcze żadnego użytkownika.",
   "empty_column.notifications": "Nie masz żadnych powiadomień. Rozpocznij interakcje z innymi użytkownikami.",
   "empty_column.public": "Tu nic nie ma! Napisz coś publicznie, lub dodaj ludzi z innych serwerów, aby to wyświetlić",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autoryzuj",
   "follow_request.reject": "Odrzuć",
   "getting_started.developers": "Dla programistów",
@@ -253,6 +251,7 @@
   "notification.favourite": "{name} dodał(a) Twój wpis do ulubionych",
   "notification.follow": "{name} zaczął(-ęła) Cię śledzić",
   "notification.mention": "{name} wspomniał(a) o tobie",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} podbił(a) Twój wpis",
   "notifications.clear": "Wyczyść powiadomienia",
   "notifications.clear_confirmation": "Czy na pewno chcesz bezpowrotnie usunąć wszystkie powiadomienia?",
@@ -263,6 +262,7 @@
   "notifications.column_settings.filter_bar.show": "Pokaż",
   "notifications.column_settings.follow": "Nowi śledzący:",
   "notifications.column_settings.mention": "Wspomnienia:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Powiadomienia push",
   "notifications.column_settings.reblog": "Podbicia:",
   "notifications.column_settings.show": "Pokaż w kolumnie",
@@ -272,6 +272,7 @@
   "notifications.filter.favourites": "Ulubione",
   "notifications.filter.follows": "Śledzenia",
   "notifications.filter.mentions": "Wspomienia",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count, number} {count, plural, one {powiadomienie} few {powiadomienia} many {powiadomień} more {powiadomień}}",
   "poll.closed": "Zamknięte",
   "poll.refresh": "Odśwież",
@@ -313,7 +314,6 @@
   "search_results.hashtags": "Hashtagi",
   "search_results.statuses": "Wpisy",
   "search_results.total": "{count, number} {count, plural, one {wynik} few {wyniki} many {wyników} more {wyników}}",
-  "standalone.public_title": "Spojrzenie w głąb…",
   "status.admin_account": "Otwórz interfejs moderacyjny dla @{name}",
   "status.admin_status": "Otwórz ten wpis w interfejsie moderacyjnym",
   "status.block": "Zablokuj @{name}",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 9562ce648..7533a462b 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Esconder tudo de {domain}",
   "account.blocked": "Bloqueado",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "As informações abaixo podem refletir o perfil do usuário de maneira incompleta.",
   "account.domain_blocked": "Domínio escondido",
   "account.edit_profile": "Editar perfil",
   "account.endorse": "Destacar no perfil",
@@ -36,7 +35,6 @@
   "account.unfollow": "Deixar de seguir",
   "account.unmute": "Não silenciar @{name}",
   "account.unmute_notifications": "Retirar silêncio das notificações vindas de @{name}",
-  "account.view_full_profile": "Ver perfil completo",
   "alert.unexpected.message": "Um erro inesperado ocorreu.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "Você pode pressionar {combo} para ignorar este diálogo na próxima vez",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "O texto não está escondido",
   "compose_form.spoiler_placeholder": "Aviso de conteúdo",
   "confirmation_modal.cancel": "Cancelar",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Bloquear",
   "confirmations.block.message": "Você tem certeza de que quer bloquear {name}?",
   "confirmations.delete.confirm": "Excluir",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Você ainda não silenciou nenhum usuário.",
   "empty_column.notifications": "Você ainda não possui notificações. Interaja com outros usuários para começar a conversar.",
   "empty_column.public": "Não há nada aqui! Escreva algo publicamente ou siga manualmente usuários de outras instâncias",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rejeitar",
   "getting_started.developers": "Desenvolvedores",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} adicionou a sua postagem aos favoritos",
   "notification.follow": "{name} te seguiu",
   "notification.mention": "{name} te mencionou",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} compartilhou a sua postagem",
   "notifications.clear": "Limpar notificações",
   "notifications.clear_confirmation": "Você tem certeza de que quer limpar todas as suas notificações permanentemente?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Mostrar",
   "notifications.column_settings.follow": "Novos seguidores:",
   "notifications.column_settings.mention": "Menções:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Enviar notificações",
   "notifications.column_settings.reblog": "Compartilhamento:",
   "notifications.column_settings.show": "Mostrar nas colunas",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favoritos",
   "notifications.filter.follows": "Seguidores",
   "notifications.filter.mentions": "Menções",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notificações",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
-  "standalone.public_title": "Dê uma espiada...",
   "status.admin_account": "Abrir interface de moderação para @{name}",
   "status.admin_status": "Abrir esse status na interface de moderação",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json
index fa2ade697..001a48b04 100644
--- a/app/javascript/mastodon/locales/pt.json
+++ b/app/javascript/mastodon/locales/pt.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Esconder tudo do domínio {domain}",
   "account.blocked": "Bloqueado",
   "account.direct": "Mensagem directa @{name}",
-  "account.disclaimer_full": "As informações abaixo podem reflectir o perfil do utilizador de forma incompleta.",
   "account.domain_blocked": "Domínio escondido",
   "account.edit_profile": "Editar perfil",
   "account.endorse": "Atributo no perfil",
@@ -36,7 +35,6 @@
   "account.unfollow": "Deixar de seguir",
   "account.unmute": "Não silenciar @{name}",
   "account.unmute_notifications": "Deixar de silenciar @{name}",
-  "account.view_full_profile": "Ver perfil completo",
   "alert.unexpected.message": "Ocorreu um erro inesperado.",
   "alert.unexpected.title": "Bolas!",
   "boost_modal.combo": "Pode clicar {combo} para não voltar a ver",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "O texto não está escondido",
   "compose_form.spoiler_placeholder": "Escreve o teu aviso aqui",
   "confirmation_modal.cancel": "Cancelar",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Bloquear",
   "confirmations.block.message": "De certeza que queres bloquear {name}?",
   "confirmations.delete.confirm": "Eliminar",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Ainda não silenciaste qualquer utilizador.",
   "empty_column.notifications": "Não tens notificações. Interage com outros utilizadores para iniciar uma conversa.",
   "empty_column.public": "Não há nada aqui! Escreve algo publicamente ou segue outros utilizadores para veres aqui os conteúdos públicos",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rejeitar",
   "getting_started.developers": "Responsáveis pelo desenvolvimento",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} adicionou o teu post aos favoritos",
   "notification.follow": "{name} seguiu-te",
   "notification.mention": "{name} mencionou-te",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} partilhou o teu post",
   "notifications.clear": "Limpar notificações",
   "notifications.clear_confirmation": "Queres mesmo limpar todas as notificações?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Mostrar",
   "notifications.column_settings.follow": "Novos seguidores:",
   "notifications.column_settings.mention": "Menções:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Notificações Push",
   "notifications.column_settings.reblog": "Partilhas:",
   "notifications.column_settings.show": "Mostrar nas colunas",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favoritas",
   "notifications.filter.follows": "Seguimento",
   "notifications.filter.mentions": "Referências",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notificações",
   "poll.closed": "Fechado",
   "poll.refresh": "Recarregar",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Publicações",
   "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
-  "standalone.public_title": "Espreitar lá dentro...",
   "status.admin_account": "Abrir a interface de moderação para @{name}",
   "status.admin_status": "Abrir esta publicação na interface de moderação",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index 071fbb507..7192e10b9 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Ascunde tot de la {domain}",
   "account.blocked": "Blocat",
   "account.direct": "Mesaj direct @{name}",
-  "account.disclaimer_full": "Informațiile de mai jos pot reflecta profilul utilizatorului incomplet.",
   "account.domain_blocked": "Domeniu ascuns",
   "account.edit_profile": "Editează profilul",
   "account.endorse": "Redistribuie pe profil",
@@ -36,7 +35,6 @@
   "account.unfollow": "Nu mai urmări",
   "account.unmute": "Activează notificările de la @{name}",
   "account.unmute_notifications": "Activează notificările de la @{name}",
-  "account.view_full_profile": "Vezi profilul complet",
   "alert.unexpected.message": "A apărut o eroare neașteptată.",
   "alert.unexpected.title": "Hopa!",
   "boost_modal.combo": "Poți apăsa {combo} pentru a omite asta data viitoare",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Textul nu este ascuns",
   "compose_form.spoiler_placeholder": "Scrie averitzarea aici",
   "confirmation_modal.cancel": "Anulează",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Blochează",
   "confirmations.block.message": "Ești sigur că vrei să blochezi {name}?",
   "confirmations.delete.confirm": "Șterge",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Nu ai oprit nici un utilizator incă.",
   "empty_column.notifications": "Nu ai nici o notificare încă. Interacționează cu alții pentru a începe o conversație.",
   "empty_column.public": "Nu este nimci aici încă! Scrie ceva public, sau urmărește alți utilizatori din alte instanțe pentru a porni fluxul",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autorizează",
   "follow_request.reject": "Respinge",
   "getting_started.developers": "Dezvoltatori",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} a adăugat statusul tău la favorite",
   "notification.follow": "{name} te urmărește",
   "notification.mention": "{name} te-a menționat",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} a redistribuit postarea ta",
   "notifications.clear": "Șterge notificările",
   "notifications.clear_confirmation": "Ești sigur că vrei să ștergi toate notificările?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Arată",
   "notifications.column_settings.follow": "Noi urmăritori:",
   "notifications.column_settings.mention": "Mențiuni:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Notificări push",
   "notifications.column_settings.reblog": "Redistribuite:",
   "notifications.column_settings.show": "Arată în coloană",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favorite",
   "notifications.filter.follows": "Urmărește",
   "notifications.filter.mentions": "Menționări",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notificări",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtaguri",
   "search_results.statuses": "Postări",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "Se întâmplă acum...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Blochează @{name}",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 1e149c470..09425c32e 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Блокировать все с {domain}",
   "account.blocked": "Заблокирован(а)",
   "account.direct": "Написать @{name}",
-  "account.disclaimer_full": "Нижеуказанная информация может не полностью отражать профиль пользователя.",
   "account.domain_blocked": "Домен скрыт",
   "account.edit_profile": "Изменить профиль",
   "account.endorse": "Рекомендовать в профиле",
@@ -36,7 +35,6 @@
   "account.unfollow": "Отписаться",
   "account.unmute": "Снять глушение",
   "account.unmute_notifications": "Показывать уведомления от @{name}",
-  "account.view_full_profile": "Показать полный профиль",
   "alert.unexpected.message": "Что-то пошло не так.",
   "alert.unexpected.title": "Ой!",
   "boost_modal.combo": "Нажмите {combo}, чтобы пропустить это в следующий раз",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Текст не скрыт",
   "compose_form.spoiler_placeholder": "Текст предупреждения",
   "confirmation_modal.cancel": "Отмена",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Заблокировать",
   "confirmations.block.message": "Вы уверены, что хотите заблокировать {name}?",
   "confirmations.delete.confirm": "Удалить",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Вы ещё никого не заглушили.",
   "empty_column.notifications": "У Вас еще нет уведомлений. Заведите знакомство с другими пользователями, чтобы начать разговор.",
   "empty_column.public": "Здесь ничего нет! Опубликуйте что-нибудь или подпишитесь на пользователей с других узлов, чтобы заполнить ленту.",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Авторизовать",
   "follow_request.reject": "Отказать",
   "getting_started.developers": "Для разработчиков",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} понравился Ваш статус",
   "notification.follow": "{name} подписался(-лась) на Вас",
   "notification.mention": "{name} упомянул(а) Вас",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} продвинул(а) Ваш статус",
   "notifications.clear": "Очистить уведомления",
   "notifications.clear_confirmation": "Вы уверены, что хотите очистить все уведомления?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Новые подписчики:",
   "notifications.column_settings.mention": "Упоминания:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push-уведомления",
   "notifications.column_settings.reblog": "Продвижения:",
   "notifications.column_settings.show": "Показывать в колонке",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} уведомл.",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Хэштеги",
   "search_results.statuses": "Посты",
   "search_results.total": "{count, number} {count, plural, one {результат} few {результата} many {результатов} other {результатов}}",
-  "standalone.public_title": "Прямо сейчас",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Заблокировать @{name}",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 17b50522f..5542198f7 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Ukry všetko z {domain}",
   "account.blocked": "Blokovaný/á",
   "account.direct": "Súkromná správa pre @{name}",
-  "account.disclaimer_full": "Inofrmácie uvedené nižšie nemusia byť úplným odrazom uživateľovho účtu.",
   "account.domain_blocked": "Doména ukrytá",
   "account.edit_profile": "Upraviť profil",
   "account.endorse": "Zobrazuj na profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Prestaň následovať",
   "account.unmute": "Prestaň ignorovať @{name}",
   "account.unmute_notifications": "Zrušiť stlmenie oznámení od @{name}",
-  "account.view_full_profile": "Pozri celý profil",
   "alert.unexpected.message": "Vyskytla sa nečakaná chyba.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "Nabudúce môžeš kliknúť {combo} pre preskočenie",
@@ -73,10 +71,10 @@
   "compose_form.lock_disclaimer": "Váš účet nie je {locked}. Ktokoľvek ťa môže nasledovať a vidieť tvoje správy pre sledujúcich.",
   "compose_form.lock_disclaimer.lock": "zamknutý",
   "compose_form.placeholder": "Čo máš na mysli?",
-  "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.add_option": "Pridaj voľbu",
+  "compose_form.poll.duration": "Trvanie ankety",
+  "compose_form.poll.option_placeholder": "Voľba {number}",
+  "compose_form.poll.remove_option": "Odstráň túto voľbu",
   "compose_form.publish": "Pošli",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.marked": "Médiálny obsah je označený ako chúlostivý",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Text nieje ukrytý",
   "compose_form.spoiler_placeholder": "Sem napíš tvoje varovanie",
   "confirmation_modal.cancel": "Zruš",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Blokuj",
   "confirmations.block.message": "Si si istý/á, že chceš blokovať {name}?",
   "confirmations.delete.confirm": "Vymaž",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Ešte si nestĺmil žiadných užívateľov.",
   "empty_column.notifications": "Ešte nemáš žiadne oznámenia. Začni komunikovať s ostatnými, aby diskusia mohla začať.",
   "empty_column.public": "Ešte tu nič nie je. Napíš niečo verejne, alebo začni sledovať užívateľov z iných serverov, aby tu niečo pribudlo",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Povoľ prístup",
   "follow_request.reject": "Odmietni",
   "getting_started.developers": "Vývojári",
@@ -156,9 +154,9 @@
   "home.column_settings.basic": "Základné",
   "home.column_settings.show_reblogs": "Zobraziť povýšené",
   "home.column_settings.show_replies": "Ukázať odpovede",
-  "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}}",
+  "intervals.full.days": "{number, plural, one {# deň} few {# dní} many {# dní} other {# dni}}",
+  "intervals.full.hours": "{number, plural, one {# hodina} few {# hodín} many {# hodín} other {# hodiny}}",
+  "intervals.full.minutes": "{number, plural, one {# minúta} few {# minút} many {# minút} other {# minúty}}",
   "introduction.federation.action": "Ďalej",
   "introduction.federation.federated.headline": "Federated",
   "introduction.federation.federated.text": "Verejné príspevky z ostatných serverov vo fediverse budú zobrazenie vo federovanej časovej osi.",
@@ -245,9 +243,10 @@
   "navigation_bar.preferences": "Voľby",
   "navigation_bar.public_timeline": "Federovaná časová os",
   "navigation_bar.security": "Zabezbečenie",
-  "notification.favourite": "{name} sa páči tvoj status",
+  "notification.favourite": "{name} si obľúbil/a tvoj príspevok",
   "notification.follow": "{name} ťa začal/a následovať",
   "notification.mention": "{name} ťa spomenul/a",
+  "notification.poll": "Anketa v ktorej si hlasoval/a sa skončila",
   "notification.reblog": "{name} zdieľal/a tvoj status",
   "notifications.clear": "Vyčistiť zoznam notifikácii",
   "notifications.clear_confirmation": "Naozaj chcete nenávratne prečistiť všetky vaše notifikácie?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Ukáž",
   "notifications.column_settings.follow": "Noví následujúci:",
   "notifications.column_settings.mention": "Zmienenia:",
+  "notifications.column_settings.poll": "Výsledky ankiet:",
   "notifications.column_settings.push": "Push notifikácie",
   "notifications.column_settings.reblog": "Boosty:",
   "notifications.column_settings.show": "Zobraziť v stĺpci",
@@ -267,13 +267,14 @@
   "notifications.filter.favourites": "Obľúbené",
   "notifications.filter.follows": "Sledovania",
   "notifications.filter.mentions": "Iba spomenutia",
+  "notifications.filter.polls": "Výsledky ankiet",
   "notifications.group": "{count} oboznámení",
   "poll.closed": "Uzatvorená",
   "poll.refresh": "Aktualizuj",
   "poll.total_votes": "{count, plural, one {# hlas} few {# hlasov} many {# hlasov} other {# hlasy}}",
   "poll.vote": "Hlasuj",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll_button.add_poll": "Pridaj anketu",
+  "poll_button.remove_poll": "Odstráň anketu",
   "privacy.change": "Uprav súkromie príspevku",
   "privacy.direct.long": "Pošli iba spomenutým používateľom",
   "privacy.direct.short": "Súkromne",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Haštagy",
   "search_results.statuses": "Príspevky",
   "search_results.total": "{count, number} {count, plural, one {výsledok} many {výsledkov} other {výsledky}}",
-  "standalone.public_title": "Náhľad dovnútra...",
   "status.admin_account": "Otvor moderovacie rozhranie užívateľa @{name}",
   "status.admin_status": "Otvor tento príspevok v moderovacom rozhraní",
   "status.block": "Blokovať @{name}",
@@ -366,7 +366,7 @@
   "upload_area.title": "Pretiahni a pusť pre nahratie",
   "upload_button.label": "Pridať médiálny súbor (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Limit pre nahrávanie súborov bol prekročený.",
-  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_error.poll": "Nahrávanie súborov pri anketách nieje dovolené.",
   "upload_form.description": "Opis pre slabo vidiacich",
   "upload_form.focus": "Pozmeň náhľad",
   "upload_form.undo": "Vymaž",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 9ee2e5b52..bef4efe0e 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Skrij vse iz {domain}",
   "account.blocked": "Blokirano",
   "account.direct": "Neposredno sporočilo @{name}",
-  "account.disclaimer_full": "Spodnje informacije lahko nepopolno prikazujejo profil uporabnika.",
   "account.domain_blocked": "Skrita domena",
   "account.edit_profile": "Uredi profil",
   "account.endorse": "Zmožnost profila",
@@ -36,7 +35,6 @@
   "account.unfollow": "Prenehaj slediti",
   "account.unmute": "Odtišaj @{name}",
   "account.unmute_notifications": "Vklopi obvestila od @{name}",
-  "account.view_full_profile": "Ogled celotnega profila",
   "alert.unexpected.message": "Zgodila se je nepričakovana napaka.",
   "alert.unexpected.title": "Uups!",
   "boost_modal.combo": "Če želite naslednjič preskočiti to, lahko pritisnete {combo}",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Besedilo ni skrito",
   "compose_form.spoiler_placeholder": "Napišite opozorilo tukaj",
   "confirmation_modal.cancel": "Prekliči",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Block",
   "confirmations.block.message": "Ali ste prepričani, da želite blokirati {name}?",
   "confirmations.delete.confirm": "Delete",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "Nimate še nobenih obvestil. Poveži se z drugimi, da začnete pogovor.",
   "empty_column.public": "Tukaj ni ničesar! Da ga napolnite, napišite nekaj javnega ali pa ročno sledite uporabnikom iz drugih vozlišč",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Odobri",
   "follow_request.reject": "Zavrni",
   "getting_started.developers": "Developers",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
   "notification.mention": "{name} mentioned you",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
   "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",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Tuti",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "A look inside...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 498b1bdd6..b86c6e2ee 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Fshih gjithçka prej {domain}",
   "account.blocked": "E bllokuar",
   "account.direct": "Mesazh i drejtpërdrejt për @{name}",
-  "account.disclaimer_full": "Të dhënat më poshtë mund ta pasqyrojnë pjesërisht profilin e përdoruesit.",
   "account.domain_blocked": "Përkatësi e fshehur",
   "account.edit_profile": "Përpunoni profilin",
   "account.endorse": "Pasqyrojeni në profil",
@@ -36,7 +35,6 @@
   "account.unfollow": "Resht së ndjekuri",
   "account.unmute": "Ktheji zërin @{name}",
   "account.unmute_notifications": "Hiqua ndalimin e shfaqjes njoftimeve nga @{name}",
-  "account.view_full_profile": "Shihni profilin e plotë",
   "alert.unexpected.message": "Ndodhi një gabim të papritur.",
   "alert.unexpected.title": "Hëm!",
   "boost_modal.combo": "Mund të shtypni {combo}, që të anashkalohet kjo herës tjetër",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Teksti s’është i fshehur",
   "compose_form.spoiler_placeholder": "Shkruani këtu sinjalizimin tuaj",
   "confirmation_modal.cancel": "Anuloje",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Bllokoje",
   "confirmations.block.message": "Jeni i sigurt se doni të bllokohet {name}?",
   "confirmations.delete.confirm": "Fshije",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "S’keni heshtuar ende ndonjë përdorues.",
   "empty_column.notifications": "Ende s’keni ndonjë njoftim. Ndërveproni me të tjerët që të nisë biseda.",
   "empty_column.public": "S’ka gjë këtu! Shkruani diçka publikisht, ose ndiqni dorazi përdorues prej instancash të tjera, që ta mbushni këtë zonë",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Autorizoje",
   "follow_request.reject": "Hidhe tej",
   "getting_started.developers": "Zhvillues",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} parapëlqeu gjendjen tuaj",
   "notification.follow": "{name} zuri t’ju ndjekë",
   "notification.mention": "{name} ju ka përmendur",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "përforcoi gjendjen tuaj",
   "notifications.clear": "Pastroji njoftimet",
   "notifications.clear_confirmation": "Jeni i sigurt se doni të pastrohen përgjithmonë krejt njoftimet tuaja?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Shfaq",
   "notifications.column_settings.follow": "Ndjekës të rinj:",
   "notifications.column_settings.mention": "Përmendje:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Njoftime Push",
   "notifications.column_settings.reblog": "Përforcime:",
   "notifications.column_settings.show": "Shfaq në shtylla",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Të parapëlqyer",
   "notifications.filter.follows": "Ndjekje",
   "notifications.filter.mentions": "Përmendje",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "%(count)s njoftime",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtagë",
   "search_results.statuses": "Mesazhe",
   "search_results.total": "{count, number} {count, plural, një {result} {results} të tjera}",
-  "standalone.public_title": "Një pamje brenda…",
   "status.admin_account": "Hap ndërfaqe moderimi për @{name}",
   "status.admin_status": "Hape këtë gjendje te ndërfaqja e moderimit",
   "status.block": "Blloko @{name}",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index abc1df5de..155935306 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Sakrij sve sa domena {domain}",
   "account.blocked": "Blocked",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "Navedene informacije možda ne odslikavaju korisnički profil u potpunosti.",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Izmeni profil",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Otprati",
   "account.unmute": "Ukloni ućutkavanje korisniku @{name}",
   "account.unmute_notifications": "Uključi nazad obaveštenja od korisnika @{name}",
-  "account.view_full_profile": "Vidi ceo profil",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "Možete pritisnuti {combo} da preskočite ovo sledeći put",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Ovde upišite upozorenje",
   "confirmation_modal.cancel": "Poništi",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Blokiraj",
   "confirmations.block.message": "Da li ste sigurni da želite da blokirate korisnika {name}?",
   "confirmations.delete.confirm": "Obriši",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "Trenutno nemate obaveštenja. Družite se malo da započnete razgovore.",
   "empty_column.public": "Ovde nema ničega! Napišite nešto javno, ili nađite korisnike sa drugih instanci koje ćete zapratiti da popunite ovu prazninu",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Odobri",
   "follow_request.reject": "Odbij",
   "getting_started.developers": "Developers",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} je stavio Vaš status kao omiljeni",
   "notification.follow": "{name} Vas je zapratio",
   "notification.mention": "{name} Vas je pomenuo",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} je podržao(la) Vaš status",
   "notifications.clear": "Očisti obaveštenja",
   "notifications.clear_confirmation": "Da li ste sigurno da trajno želite da očistite Vaša obaveštenja?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Novi pratioci:",
   "notifications.column_settings.mention": "Pominjanja:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Guraj obaveštenja",
   "notifications.column_settings.reblog": "Podrški:",
   "notifications.column_settings.show": "Prikaži u koloni",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {rezultat} few {rezultata} other {rezultata}}",
-  "standalone.public_title": "Pogled iznutra...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index ac7f97c6d..1124ed8d5 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Сакриј све са домена {domain}",
   "account.blocked": "Блокиран",
   "account.direct": "Директна порука @{name}",
-  "account.disclaimer_full": "Наведене информације можда не одсликавају кориснички профил у потпуности.",
   "account.domain_blocked": "Домен сакривен",
   "account.edit_profile": "Измени профил",
   "account.endorse": "Приказати на профилу",
@@ -36,7 +35,6 @@
   "account.unfollow": "Отпрати",
   "account.unmute": "Уклони ућуткавање кориснику @{name}",
   "account.unmute_notifications": "Укључи назад обавештења од корисника @{name}",
-  "account.view_full_profile": "Види цео профил",
   "alert.unexpected.message": "Појавила се неочекивана грешка.",
   "alert.unexpected.title": "Упс!",
   "boost_modal.combo": "Можете притиснути {combo} да прескочите ово следећи пут",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Текст није сакривен",
   "compose_form.spoiler_placeholder": "Овде упишите упозорење",
   "confirmation_modal.cancel": "Поништи",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Блокирај",
   "confirmations.block.message": "Да ли сте сигурни да желите да блокирате корисника {name}?",
   "confirmations.delete.confirm": "Обриши",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Још увек немате ућутканих корисника.",
   "empty_column.notifications": "Тренутно немате обавештења. Дружите се мало да започнете разговор.",
   "empty_column.public": "Овде нема ничега! Напишите нешто јавно, или нађите кориснике са других инстанци које ћете запратити да попуните ову празнину",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Одобри",
   "follow_request.reject": "Одбиј",
   "getting_started.developers": "Програмери",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} је ставио/ла Ваш статус као омиљени",
   "notification.follow": "{name} Вас је запратио/ла",
   "notification.mention": "{name} Вас је поменуо/ла",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} је подржао/ла Ваш статус",
   "notifications.clear": "Очисти обавештења",
   "notifications.clear_confirmation": "Да ли сте сигурно да трајно желите да очистите Ваша обавештења?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Нови пратиоци:",
   "notifications.column_settings.mention": "Помињања:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Гурај обавештења",
   "notifications.column_settings.reblog": "Подршки:",
   "notifications.column_settings.show": "Прикажи у колони",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} обавештења",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Тарабе",
   "search_results.statuses": "Трубе",
   "search_results.total": "{count, number} {count, plural, one {резултат} few {резултата} other {резултата}}",
-  "standalone.public_title": "Поглед изнутра...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Блокирај @{name}",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index cd002ee02..9093637b3 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Dölj allt från {domain}",
   "account.blocked": "Blockerad",
   "account.direct": "Direktmeddelande @{name}",
-  "account.disclaimer_full": "Informationen nedan kan spegla användarens profil ofullständigt.",
   "account.domain_blocked": "Domän dold",
   "account.edit_profile": "Redigera profil",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Sluta följa",
   "account.unmute": "Ta bort tystad @{name}",
   "account.unmute_notifications": "Återaktivera notifikationer från @{name}",
-  "account.view_full_profile": "Visa hela profilen",
   "alert.unexpected.message": "Ett oväntat fel uppstod.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "Du kan trycka {combo} för att slippa denna nästa gång",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Texten är inte dold",
   "compose_form.spoiler_placeholder": "Skriv din varning här",
   "confirmation_modal.cancel": "Ångra",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Blockera",
   "confirmations.block.message": "Är du säker att du vill blockera {name}?",
   "confirmations.delete.confirm": "Ta bort",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "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_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Godkänn",
   "follow_request.reject": "Avvisa",
   "getting_started.developers": "Utvecklare",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} favoriserade din status",
   "notification.follow": "{name} följer dig",
   "notification.mention": "{name} nämnde dig",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} knuffade din status",
   "notifications.clear": "Rensa meddelanden",
   "notifications.clear_confirmation": "Är du säker på att du vill radera alla dina meddelanden permanent?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Nya följare:",
   "notifications.column_settings.mention": "Omnämningar:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push meddelanden",
   "notifications.column_settings.reblog": "Knuffar:",
   "notifications.column_settings.show": "Visa i kolumnen",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} aviseringar",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, ett {result} andra {results}}",
-  "standalone.public_title": "En titt inuti...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 9f8f797c8..eedd4c6f3 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
   "account.direct": "Direct message @{name}",
-  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Edit profile",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Unfollow",
   "account.unmute": "Unmute @{name}",
   "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account.view_full_profile": "View full profile",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
   "boost_modal.combo": "You can press {combo} to skip this next time",
@@ -85,6 +83,7 @@
   "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",
@@ -133,7 +132,6 @@
   "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 instances to fill it up",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Authorize",
   "follow_request.reject": "Reject",
   "getting_started.developers": "Developers",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
   "notification.mention": "{name} mentioned you",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
   "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",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "A look inside...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 02896333e..c93ff63df 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -5,7 +5,6 @@
   "account.block_domain": "{domain} నుంచి అన్నీ దాచిపెట్టు",
   "account.blocked": "బ్లాక్ అయినవి",
   "account.direct": "@{name}కు నేరుగా సందేశం పంపు",
-  "account.disclaimer_full": "క్రింది సమాచారం వాడుకరి యొక్క ప్రొఫైల్ను అసంపూర్తిగా ప్రతిబింబించవచ్చు.",
   "account.domain_blocked": "డొమైన్ దాచిపెట్టబడినది",
   "account.edit_profile": "ప్రొఫైల్ని సవరించండి",
   "account.endorse": "ప్రొఫైల్లో చూపించు",
@@ -36,7 +35,6 @@
   "account.unfollow": "అనుసరించవద్దు",
   "account.unmute": "@{name}పై మ్యూట్ ని తొలగించు",
   "account.unmute_notifications": "@{name} నుంచి ప్రకటనలపై మ్యూట్ ని తొలగించు",
-  "account.view_full_profile": "పూర్తి ప్రొఫైల్ను చూడండి",
   "alert.unexpected.message": "అనుకోని తప్పు జరిగినది.",
   "alert.unexpected.title": "అయ్యో!",
   "boost_modal.combo": "మీరు తదుపరిసారి దీనిని దాటవేయడానికి {combo} నొక్కవచ్చు",
@@ -73,10 +71,10 @@
   "compose_form.lock_disclaimer": "మీ ఖాతా {locked} చేయబడలేదు. ఎవరైనా మిమ్మల్ని అనుసరించి మీ అనుచరులకు-మాత్రమే పోస్ట్లను వీక్షించవచ్చు.",
   "compose_form.lock_disclaimer.lock": "బిగించబడినది",
   "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.remove_option": "Remove this choice",
+  "compose_form.poll.add_option": "ఒక ఎంపికను చేర్చండి",
+  "compose_form.poll.duration": "ఎన్నిక వ్యవధి",
+  "compose_form.poll.option_placeholder": "ఎంపిక {number}",
+  "compose_form.poll.remove_option": "ఈ ఎంపికను తొలగించు",
   "compose_form.publish": "టూట్",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.marked": "మీడియా సున్నితమైనదిగా గుర్తించబడింది",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "పాఠ్యం దాచబడలేదు",
   "compose_form.spoiler_placeholder": "ఇక్కడ మీ హెచ్చరికను రాయండి",
   "confirmation_modal.cancel": "రద్దు చెయ్యి",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "బ్లాక్ చేయి",
   "confirmations.block.message": "మీరు ఖచ్చితంగా {name}ని బ్లాక్ చేయాలనుకుంటున్నారా?",
   "confirmations.delete.confirm": "తొలగించు",
@@ -132,8 +131,7 @@
   "empty_column.lists": "మీకు ఇంకా జాబితాలు ఏమీ లేవు. మీరు ఒకటి సృష్టించగానే, అది ఇక్కడ కనబడుతుంది.",
   "empty_column.mutes": "మీరు ఇంకా ఏ వినియోగదారులనూ మ్యూట్ చేయలేదు.",
   "empty_column.notifications": "మీకు ఇంకా ఏ నోటిఫికేషన్లు లేవు. సంభాషణను ప్రారంభించడానికి ఇతరులతో ప్రతిస్పందించండి.",
-  "empty_column.public": "ఇక్కడ ఏమీ లేదు! దీన్ని నింపడానికి బహిరంగంగా ఏదైనా వ్రాయండి, లేదా ఇతర దృష్టాంతాల్లోని వినియోగదారులను అనుసరించండి",
-  "error_boundary.it_crashed": "It crashed!",
+  "empty_column.public": "ఇక్కడ ఏమీ లేదు! దీన్ని నింపడానికి బహిరంగంగా ఏదైనా వ్రాయండి, లేదా ఇతర సేవికల నుండి వినియోగదారులను అనుసరించండి",
   "follow_request.authorize": "అనుమతించు",
   "follow_request.reject": "తిరస్కరించు",
   "getting_started.developers": "డెవలపర్లు",
@@ -152,7 +150,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": "ప్రత్యుత్తరాలను చూపించు",
@@ -214,7 +212,7 @@
   "lists.account.remove": "జాబితా నుండి తొలగించు",
   "lists.delete": "జాబితాను తొలగించు",
   "lists.edit": "జాబితాను సవరించు",
-  "lists.edit.submit": "Change title",
+  "lists.edit.submit": "శీర్షిక మార్చు",
   "lists.new.create": "జాబితాను జోడించు",
   "lists.new.title_placeholder": "కొత్త జాబితా శీర్షిక",
   "lists.search": "మీరు అనుసరించే వ్యక్తులలో శోధించండి",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} మీ స్టేటస్ ను ఇష్టపడ్డారు",
   "notification.follow": "{name} మిమ్మల్ని అనుసరిస్తున్నారు",
   "notification.mention": "{name} మిమ్మల్ని ప్రస్తావించారు",
+  "notification.poll": "మీరు పాల్గొనిన ఎన్సిక ముగిసినది",
   "notification.reblog": "{name} మీ స్టేటస్ ను బూస్ట్ చేసారు",
   "notifications.clear": "ప్రకటనలను తుడిచివేయు",
   "notifications.clear_confirmation": "మీరు మీ అన్ని నోటిఫికేషన్లను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "చూపించు",
   "notifications.column_settings.follow": "క్రొత్త అనుచరులు:",
   "notifications.column_settings.mention": "ప్రస్తావనలు:",
+  "notifications.column_settings.poll": "ఎన్నిక ఫలితాలు:",
   "notifications.column_settings.push": "పుష్ ప్రకటనలు",
   "notifications.column_settings.reblog": "బూస్ట్ లు:",
   "notifications.column_settings.show": "నిలువు వరుసలో చూపు",
@@ -267,13 +267,14 @@
   "notifications.filter.favourites": "ఇష్టాలు",
   "notifications.filter.follows": "అనుసరిస్తున్నవి",
   "notifications.filter.mentions": "పేర్కొన్నవి",
+  "notifications.filter.polls": "ఎన్నిక ఫలితాలు",
   "notifications.group": "{count} ప్రకటనలు",
-  "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
+  "poll.closed": "మూసివేయబడినవి",
+  "poll.refresh": "నవీకరించు",
   "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Vote",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll.vote": "ఎన్నుకోండి",
+  "poll_button.add_poll": "ఒక ఎన్నికను చేర్చు",
+  "poll_button.remove_poll": "ఎన్నికను తొలగించు",
   "privacy.change": "స్టేటస్ గోప్యతను సర్దుబాటు చేయండి",
   "privacy.direct.long": "పేర్కొన్న వినియోగదారులకు మాత్రమే పోస్ట్ చేయి",
   "privacy.direct.short": "ప్రత్యక్ష",
@@ -293,7 +294,7 @@
   "reply_indicator.cancel": "రద్దు చెయ్యి",
   "report.forward": "{target}కి ఫార్వార్డ్ చేయండి",
   "report.forward_hint": "ఖాతా మరొక సర్వర్లో ఉంది. నివేదిక యొక్క ఒక అనామకంగా ఉన్న కాపీని అక్కడికి కూడా పంపించమంటారా?",
-  "report.hint": "మీ దుష్టాంత మోడరేటర్లకు నివేదిక పంపబడుతుంది. దిగువ ఈ ఖాతాను ఎందుకు నివేదిస్తున్నారనేదాని వివరణను మీరు అందించవచ్చు:",
+  "report.hint": "మీ సేవిక మోడరేటర్లకు నివేదిక పంపబడుతుంది. ఈ ఖాతాను ఎందుకు నివేదిస్తున్నారనేదాని వివరణను మీరు దిగువన అందించవచ్చు:",
   "report.placeholder": "అదనపు వ్యాఖ్యలు",
   "report.submit": "సమర్పించండి",
   "report.target": "{target}పై ఫిర్యాదు చేయండి",
@@ -308,13 +309,12 @@
   "search_results.hashtags": "హాష్ ట్యాగ్లు",
   "search_results.statuses": "టూట్లు",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "లోపలికి ఒక చూపు...",
   "status.admin_account": "@{name} కొరకు సమన్వయ వినిమయసీమను తెరువు",
   "status.admin_status": "సమన్వయ వినిమయసీమలో ఈ స్టేటస్ ను తెరవండి",
   "status.block": "@{name} ను బ్లాక్ చేయి",
   "status.cancel_reblog_private": "బూస్ట్ను తొలగించు",
   "status.cannot_reblog": "ఈ పోస్ట్ను బూస్ట్ చేయడం సాధ్యం కాదు",
-  "status.copy": "Copy link to status",
+  "status.copy": "లంకెను స్టేటస్కు కాపీ చేయి",
   "status.delete": "తొలగించు",
   "status.detailed_status": "వివరణాత్మక సంభాషణ వీక్షణ",
   "status.direct": "@{name}కు నేరుగా సందేశం పంపు",
@@ -359,7 +359,7 @@
   "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.moments": "కొన్ని క్షణాలు మాత్రమే మిగిలి ఉన్నాయి",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} మాట్లాడుతున్నారు",
   "ui.beforeunload": "మీరు మాస్టొడొన్ను వదిలివేస్తే మీ డ్రాఫ్ట్లు పోతాయి.",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 6d120ac76..e15382402 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -1,74 +1,72 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "เพิ่มหรือเอาออกจากรายการ",
   "account.badges.bot": "บอต",
-  "account.block": "บล็อค @{name}",
+  "account.block": "ปิดกั้น @{name}",
   "account.block_domain": "ซ่อนทุกอย่างจาก {domain}",
-  "account.blocked": "ถูกบล็อค",
-  "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
-  "account.domain_blocked": "Domain hidden",
-  "account.edit_profile": "Edit profile",
+  "account.blocked": "ปิดกั้นอยู่",
+  "account.direct": "ส่งข้อความโดยตรงถึง @{name}",
+  "account.domain_blocked": "ซ่อนโดเมนอยู่",
+  "account.edit_profile": "แก้ไขโปรไฟล์",
   "account.endorse": "Feature on profile",
   "account.follow": "ติดตาม",
   "account.followers": "ผู้ติดตาม",
-  "account.followers.empty": "ยังไม่มีใครติดตาม",
+  "account.followers.empty": "ยังไม่มีใครติดตามผู้ใช้นี้",
   "account.follows": "ติดตาม",
-  "account.follows.empty": "ยังไม่ได้ติดตามใคร",
+  "account.follows.empty": "ผู้ใช้นี้ยังไม่ได้ติดตามใคร",
   "account.follows_you": "ติดตามคุณ",
-  "account.hide_reblogs": "Hide boosts from @{name}",
+  "account.hide_reblogs": "ซ่อนการดันจาก @{name}",
   "account.link_verified_on": "Ownership of this link was checked on {date}",
   "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
-  "account.media": "Media",
-  "account.mention": "Mention @{name}",
-  "account.moved_to": "{name} has moved to:",
-  "account.mute": "Mute @{name}",
-  "account.mute_notifications": "Mute notifications from @{name}",
-  "account.muted": "Muted",
-  "account.posts": "Posts",
-  "account.posts_with_replies": "Toots with replies",
-  "account.report": "Report @{name}",
-  "account.requested": "Awaiting approval",
-  "account.share": "Share @{name}'s profile",
-  "account.show_reblogs": "Show boosts from @{name}",
-  "account.unblock": "Unblock @{name}",
-  "account.unblock_domain": "Unhide {domain}",
+  "account.media": "สื่อ",
+  "account.mention": "กล่าวถึง @{name}",
+  "account.moved_to": "{name} ได้ย้ายไปยัง:",
+  "account.mute": "ปิดเสียง @{name}",
+  "account.mute_notifications": "ปิดเสียงการแจ้งเตือนจาก @{name}",
+  "account.muted": "ปิดเสียงอยู่",
+  "account.posts": "โพสต์",
+  "account.posts_with_replies": "โพสต์และการตอบกลับ",
+  "account.report": "รายงาน @{name}",
+  "account.requested": "กำลังรอการอนุมัติ คลิกเพื่อยกเลิกคำขอติดตาม",
+  "account.share": "แบ่งปันโปรไฟล์ของ @{name}",
+  "account.show_reblogs": "แสดงการดันจาก @{name}",
+  "account.unblock": "เลิกปิดกั้น @{name}",
+  "account.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.view_full_profile": "View full profile",
-  "alert.unexpected.message": "An unexpected error occurred.",
-  "alert.unexpected.title": "Oops!",
+  "account.unfollow": "เลิกติดตาม",
+  "account.unmute": "เลิกปิดเสียง @{name}",
+  "account.unmute_notifications": "เลิกปิดเสียงการแจ้งเตือนจาก @{name}",
+  "alert.unexpected.message": "เกิดข้อผิดพลาดที่ไม่คาดคิด",
+  "alert.unexpected.title": "อุปส์!",
   "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_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",
-  "column.community": "Local timeline",
-  "column.direct": "Direct messages",
-  "column.domain_blocks": "Hidden 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.media_only": "Media Only",
+  "bundle_modal_error.retry": "ลองอีกครั้ง",
+  "column.blocks": "ผู้ใช้ที่ปิดกั้นอยู่",
+  "column.community": "เส้นเวลาในเว็บ",
+  "column.direct": "ข้อความโดยตรง",
+  "column.domain_blocks": "โดเมนที่ซ่อนอยู่",
+  "column.favourites": "รายการโปรด",
+  "column.follow_requests": "คำขอติดตาม",
+  "column.home": "หน้าแรก",
+  "column.lists": "รายการ",
+  "column.mutes": "ผู้ใช้ที่ปิดเสียงอยู่",
+  "column.notifications": "การแจ้งเตือน",
+  "column.pins": "โพสต์ที่ปักหมุด",
+  "column.public": "เส้นเวลาที่ติดต่อกับภายนอก",
+  "column_back_button.label": "ย้อนกลับ",
+  "column_header.hide_settings": "ซ่อนการตั้งค่า",
+  "column_header.moveLeft_settings": "ย้ายคอลัมน์ไปทางซ้าย",
+  "column_header.moveRight_settings": "ย้ายคอลัมน์ไปทางขวา",
+  "column_header.pin": "ปักหมุด",
+  "column_header.show_settings": "แสดงการตั้งค่า",
+  "column_header.unpin": "ถอนหมุด",
+  "column_subheading.settings": "การตั้งค่า",
+  "community.column_settings.media_only": "สื่อเท่านั้น",
   "compose_form.direct_message_warning": "This toot will only be visible 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",
@@ -77,89 +75,89 @@
   "compose_form.poll.duration": "Poll duration",
   "compose_form.poll.option_placeholder": "Choice {number}",
   "compose_form.poll.remove_option": "Remove this choice",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "โพสต์",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.marked": "Media is marked as sensitive",
   "compose_form.sensitive.unmarked": "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": "Content warning",
-  "confirmation_modal.cancel": "Cancel",
-  "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?",
+  "compose_form.spoiler_placeholder": "เขียนคำเตือนของคุณที่นี่",
+  "confirmation_modal.cancel": "ยกเลิก",
+  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.confirm": "ปิดกั้น",
+  "confirmations.block.message": "คุณแน่ใจหรือไม่ว่าต้องการปิดกั้น {name}?",
+  "confirmations.delete.confirm": "ลบ",
+  "confirmations.delete.message": "คุณแน่ใจหรือไม่ว่าต้องการลบสถานะนี้?",
+  "confirmations.delete_list.confirm": "ลบ",
+  "confirmations.delete_list.message": "คุณแน่ใจหรือไม่ว่าต้องการลบรายการนี้อย่างถาวร?",
   "confirmations.domain_block.confirm": "Hide entire domain",
   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",
-  "confirmations.mute.confirm": "Mute",
-  "confirmations.mute.message": "Are you sure you want to mute {name}?",
-  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.mute.confirm": "ปิดเสียง",
+  "confirmations.mute.message": "คุณแน่ใจหรือไม่ว่าต้องการปิดเสียง {name}?",
+  "confirmations.redraft.confirm": "ลบแล้วร่างใหม่",
   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
-  "confirmations.reply.confirm": "Reply",
+  "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}?",
+  "confirmations.unfollow.confirm": "เลิกติดตาม",
+  "confirmations.unfollow.message": "คุณแน่ใจหรือไม่ว่าต้องการเลิกติดตาม {name}?",
   "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.activity": "กิจกรรม",
+  "emoji_button.custom": "กำหนดเอง",
+  "emoji_button.flags": "ธง",
+  "emoji_button.food": "อาหารและเครื่องดื่ม",
+  "emoji_button.label": "แทรกอีโมจิ",
+  "emoji_button.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_timeline": "No toots here!",
+  "emoji_button.objects": "วัตถุ",
+  "emoji_button.people": "ผู้คน",
+  "emoji_button.recent": "ที่ใช้บ่อย",
+  "emoji_button.search": "ค้นหา...",
+  "emoji_button.search_results": "ผลลัพธ์การค้นหา",
+  "emoji_button.symbols": "สัญลักษณ์",
+  "emoji_button.travel": "การเดินทางและสถานที่",
+  "empty_column.account_timeline": "ไม่มีโพสต์ที่นี่!",
   "empty_column.blocks": "You haven't blocked any users yet.",
   "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 hidden domains yet.",
+  "empty_column.domain_blocks": "ยังไม่มีโดเมนที่ซ่อนอยู่",
   "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.home.public_timeline": "เส้นเวลาสาธารณะ",
   "empty_column.list": "There is nothing in this list yet.",
   "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.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 instances to fill it up",
-  "error_boundary.it_crashed": "It crashed!",
-  "follow_request.authorize": "Authorize",
-  "follow_request.reject": "Reject",
-  "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
-  "getting_started.documentation": "Documentation",
-  "getting_started.heading": "Getting started",
-  "getting_started.invite": "Invite people",
+  "follow_request.authorize": "อนุญาต",
+  "follow_request.reject": "ปฏิเสธ",
+  "getting_started.developers": "นักพัฒนา",
+  "getting_started.directory": "ไดเรกทอรีโปรไฟล์",
+  "getting_started.documentation": "เอกสารประกอบ",
+  "getting_started.heading": "เริ่มต้นใช้งาน",
+  "getting_started.invite": "เชิญผู้คน",
   "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.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_header.tag_mode.all": "และ {additional}",
+  "hashtag.column_header.tag_mode.any": "หรือ {additional}",
+  "hashtag.column_header.tag_mode.none": "โดยไม่มี {additional}",
+  "hashtag.column_settings.select.no_options_message": "ไม่พบข้อเสนอแนะ",
+  "hashtag.column_settings.select.placeholder": "ป้อนแฮชแท็ก…",
   "hashtag.column_settings.tag_mode.all": "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.column_settings.basic": "พื้นฐาน",
+  "home.column_settings.show_reblogs": "แสดงการดัน",
+  "home.column_settings.show_replies": "แสดงการตอบกลับ",
   "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.action": "ถัดไป",
   "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",
@@ -181,7 +179,7 @@
   "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.description": "คำอธิบาย",
   "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
@@ -190,7 +188,7 @@
   "keyboard_shortcuts.federated": "to open federated timeline",
   "keyboard_shortcuts.heading": "Keyboard Shortcuts",
   "keyboard_shortcuts.home": "to open home timeline",
-  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.hotkey": "ปุ่มลัด",
   "keyboard_shortcuts.legend": "to display this legend",
   "keyboard_shortcuts.local": "to open local timeline",
   "keyboard_shortcuts.mention": "to mention author",
@@ -207,177 +205,179 @@
   "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.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.search": "Search among people you follow",
-  "lists.subheading": "Your lists",
-  "loading_indicator.label": "Loading...",
-  "media_gallery.toggle_visible": "Toggle visibility",
-  "missing_indicator.label": "Not found",
-  "missing_indicator.sublabel": "This resource could not be found",
-  "mute_modal.hide_notifications": "Hide notifications from this user?",
-  "navigation_bar.apps": "Mobile apps",
-  "navigation_bar.blocks": "Blocked users",
-  "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.info": "About this instance",
-  "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
-  "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.mention": "{name} mentioned you",
-  "notification.reblog": "{name} boosted your status",
-  "notifications.clear": "Clear notifications",
-  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "lightbox.close": "ปิด",
+  "lightbox.next": "ถัดไป",
+  "lightbox.previous": "ก่อนหน้า",
+  "lists.account.add": "เพิ่มไปยังรายการ",
+  "lists.account.remove": "เอาออกจากรายการ",
+  "lists.delete": "ลบรายการ",
+  "lists.edit": "แก้ไขรายการ",
+  "lists.edit.submit": "เปลี่ยนชื่อเรื่อง",
+  "lists.new.create": "เพิ่มรายการ",
+  "lists.new.title_placeholder": "ชื่อเรื่องรายการใหม่",
+  "lists.search": "ค้นหาในหมู่ผู้คนที่คุณติดตาม",
+  "lists.subheading": "รายการของคุณ",
+  "loading_indicator.label": "กำลังโหลด...",
+  "media_gallery.toggle_visible": "เปิด/ปิดการมองเห็น",
+  "missing_indicator.label": "ไม่พบ",
+  "missing_indicator.sublabel": "ไม่พบทรัพยากรนี้",
+  "mute_modal.hide_notifications": "ซ่อนการแจ้งเตือนจากผู้ใช้นี้?",
+  "navigation_bar.apps": "แอปสำหรับมือถือ",
+  "navigation_bar.blocks": "ผู้ใช้ที่ปิดกั้นอยู่",
+  "navigation_bar.community_timeline": "เส้นเวลาในเว็บ",
+  "navigation_bar.compose": "เขียนโพสต์ใหม่",
+  "navigation_bar.direct": "ข้อความโดยตรง",
+  "navigation_bar.discover": "ค้นพบ",
+  "navigation_bar.domain_blocks": "โดเมนที่ซ่อนอยู่",
+  "navigation_bar.edit_profile": "แก้ไขโปรไฟล์",
+  "navigation_bar.favourites": "รายการโปรด",
+  "navigation_bar.filters": "คำที่ปิดเสียงอยู่",
+  "navigation_bar.follow_requests": "คำขอติดตาม",
+  "navigation_bar.info": "เกี่ยวกับเซิร์ฟเวอร์นี้",
+  "navigation_bar.keyboard_shortcuts": "ปุ่มลัด",
+  "navigation_bar.lists": "รายการ",
+  "navigation_bar.logout": "ออกจากระบบ",
+  "navigation_bar.mutes": "ผู้ใช้ที่ปิดเสียงอยู่",
+  "navigation_bar.personal": "ส่วนบุคคล",
+  "navigation_bar.pins": "โพสต์ที่ปักหมุด",
+  "navigation_bar.preferences": "การกำหนดลักษณะ",
+  "navigation_bar.public_timeline": "เส้นเวลาที่ติดต่อกับภายนอก",
+  "navigation_bar.security": "ความปลอดภัย",
+  "notification.favourite": "{name} ได้ชื่นชอบสถานะของคุณ",
+  "notification.follow": "{name} ได้ติดตามคุณ",
+  "notification.mention": "{name} ได้กล่าวถึงคุณ",
+  "notification.poll": "A poll you have voted in has ended",
+  "notification.reblog": "{name} ได้ดันสถานะของคุณ",
+  "notifications.clear": "ล้างการแจ้งเตือน",
+  "notifications.clear_confirmation": "คุณแน่ใจหรือไม่ว่าต้องการล้างการแจ้งเตือนทั้งหมดของคุณอย่างถาวร?",
   "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.mention": "Mentions:",
-  "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.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
-  "notifications.group": "{count} notifications",
-  "poll.closed": "Closed",
+  "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.mention": "การกล่าวถึง:",
+  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.push": "การแจ้งเตือนแบบผลัก",
+  "notifications.column_settings.reblog": "การดัน:",
+  "notifications.column_settings.show": "แสดงในคอลัมน์",
+  "notifications.column_settings.sound": "เล่นเสียง",
+  "notifications.filter.all": "ทั้งหมด",
+  "notifications.filter.boosts": "การดัน",
+  "notifications.filter.favourites": "รายการโปรด",
+  "notifications.filter.follows": "การติดตาม",
+  "notifications.filter.mentions": "การกล่าวถึง",
+  "notifications.filter.polls": "Poll results",
+  "notifications.group": "{count} การแจ้งเตือน",
+  "poll.closed": "ปิดแล้ว",
   "poll.refresh": "Refresh",
   "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
   "poll.vote": "Vote",
   "poll_button.add_poll": "Add a poll",
   "poll_button.remove_poll": "Remove poll",
   "privacy.change": "Adjust status privacy",
-  "privacy.direct.long": "Post to mentioned users only",
-  "privacy.direct.short": "Direct",
-  "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 post to public timelines",
-  "privacy.unlisted.short": "Unlisted",
-  "regeneration_indicator.label": "Loading…",
+  "privacy.direct.long": "โพสต์ไปยังผู้ใช้ที่กล่าวถึงเท่านั้น",
+  "privacy.direct.short": "โดยตรง",
+  "privacy.private.long": "โพสต์ไปยังผู้ติดตามเท่านั้น",
+  "privacy.private.short": "ผู้ติดตามเท่านั้น",
+  "privacy.public.long": "โพสต์ไปยังเส้นเวลาสาธารณะ",
+  "privacy.public.short": "สาธารณะ",
+  "privacy.unlisted.long": "ไม่โพสต์ไปยังเส้นเวลาสาธารณะ",
+  "privacy.unlisted.short": "ไม่อยู่ในรายการ",
+  "regeneration_indicator.label": "กำลังโหลด…",
   "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",
-  "reply_indicator.cancel": "Cancel",
-  "report.forward": "Forward to {target}",
+  "relative_time.days": "{number} วัน",
+  "relative_time.hours": "{number} ชั่วโมง",
+  "relative_time.just_now": "ตอนนี้",
+  "relative_time.minutes": "{number} นาที",
+  "relative_time.seconds": "{number} วินาที",
+  "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 instance moderators. You can provide an explanation of why you are reporting this account below:",
-  "report.placeholder": "Additional comments",
-  "report.submit": "Submit",
-  "report.target": "Reporting",
-  "search.placeholder": "Search",
-  "search_popout.search_format": "Advanced search format",
+  "report.placeholder": "ความคิดเห็นเพิ่มเติม",
+  "report.submit": "ส่ง",
+  "report.target": "กำลังรายงาน {target}",
+  "search.placeholder": "ค้นหา",
+  "search_popout.search_format": "รูปแบบการค้นหาขั้นสูง",
   "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
-  "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.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "A look inside...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
-  "status.block": "Block @{name}",
-  "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.admin_account": "เปิดส่วนติดต่อการควบคุมสำหรับ @{name}",
+  "status.admin_status": "เปิดสถานะนี้ในส่วนติดต่อการควบคุม",
+  "status.block": "ปิดกั้น @{name}",
+  "status.cancel_reblog_private": "เลิกดัน",
+  "status.cannot_reblog": "ไม่สามารถดันโพสต์นี้",
+  "status.copy": "คัดลอกลิงก์ไปยังสถานะ",
+  "status.delete": "ลบ",
+  "status.detailed_status": "มุมมองการสนทนาโดยละเอียด",
+  "status.direct": "ส่งข้อความโดยตรงถึง @{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 to original audience",
-  "status.reblogged_by": "{name} boosted",
+  "status.favourite": "ชื่นชอบ",
+  "status.filtered": "กรองอยู่",
+  "status.load_more": "โหลดเพิ่มเติม",
+  "status.media_hidden": "ซ่อนสื่ออยู่",
+  "status.mention": "กล่าวถึง @{name}",
+  "status.more": "เพิ่มเติม",
+  "status.mute": "ปิดเสียง @{name}",
+  "status.mute_conversation": "ปิดเสียงการสนทนา",
+  "status.open": "ขยายสถานะนี้",
+  "status.pin": "ปักหมุดในโปรไฟล์",
+  "status.pinned": "โพสต์ที่ปักหมุด",
+  "status.read_more": "อ่านเพิ่มเติม",
+  "status.reblog": "ดัน",
+  "status.reblog_private": "ดันไปยังผู้ชมดั้งเดิม",
+  "status.reblogged_by": "{name} ได้ดัน",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
-  "status.redraft": "Delete & re-draft",
-  "status.reply": "Reply",
-  "status.replyAll": "Reply to thread",
-  "status.report": "Report @{name}",
-  "status.sensitive_toggle": "Click to view",
-  "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.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",
+  "status.redraft": "ลบแล้วร่างใหม่",
+  "status.reply": "ตอบกลับ",
+  "status.replyAll": "ตอบกลับกระทู้",
+  "status.report": "รายงาน @{name}",
+  "status.sensitive_toggle": "คลิกเพื่อดู",
+  "status.sensitive_warning": "เนื้อหาที่ละเอียดอ่อน",
+  "status.share": "แบ่งปัน",
+  "status.show_less": "แสดงน้อยลง",
+  "status.show_less_all": "แสดงน้อยลงทั้งหมด",
+  "status.show_more": "แสดงเพิ่มเติม",
+  "status.show_more_all": "แสดงเพิ่มเติมทั้งหมด",
+  "status.show_thread": "แสดงกระทู้",
+  "status.unmute_conversation": "เลิกปิดเสียงการสนทนา",
+  "status.unpin": "ถอนหมุดจากโปรไฟล์",
+  "suggestions.dismiss": "ยกเลิกข้อเสนอแนะ",
+  "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",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
-  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
-  "upload_area.title": "Drag & drop to upload",
-  "upload_button.label": "Add media",
-  "upload_error.limit": "File upload limit exceeded.",
+  "ui.beforeunload": "แบบร่างของคุณจะหายไปหากคุณออกจาก Mastodon",
+  "upload_area.title": "ลากแล้วปล่อยเพื่ออัปโหลด",
+  "upload_button.label": "เพิ่มสื่อ (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "เกินขีดจำกัดการอัปโหลดไฟล์",
   "upload_error.poll": "File upload not allowed with polls.",
   "upload_form.description": "Describe for the visually impaired",
-  "upload_form.focus": "Crop",
-  "upload_form.undo": "Undo",
-  "upload_progress.label": "Uploading...",
-  "video.close": "Close video",
-  "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"
+  "upload_form.focus": "ตัวอย่างการเปลี่ยนแปลง",
+  "upload_form.undo": "ลบ",
+  "upload_progress.label": "กำลังอัปโหลด...",
+  "video.close": "ปิดวิดีโอ",
+  "video.exit_fullscreen": "ออกจากเต็มหน้าจอ",
+  "video.expand": "ขยายวิดีโอ",
+  "video.fullscreen": "เต็มหน้าจอ",
+  "video.hide": "ซ่อนวิดีโอ",
+  "video.mute": "ปิดเสียง",
+  "video.pause": "หยุดชั่วคราว",
+  "video.play": "เล่น",
+  "video.unmute": "เลิกปิดเสียง"
 }
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 28b34fa04..cbe1c5726 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -5,7 +5,6 @@
   "account.block_domain": "{domain} alanından her şeyi gizle",
   "account.blocked": "Engellenmiş",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "Aşağıdaki bilgiler, kullanıcının profilini tam olarak yansıtmayabilir.",
   "account.domain_blocked": "Alan adı gizlendi",
   "account.edit_profile": "Profili düzenle",
   "account.endorse": "Profildeki özellik",
@@ -36,7 +35,6 @@
   "account.unfollow": "Takipten vazgeç",
   "account.unmute": "Sesi aç @{name}",
   "account.unmute_notifications": "@{name} kullanıcısından bildirimleri aç",
-  "account.view_full_profile": "Tüm profili görüntüle",
   "alert.unexpected.message": "Beklenmedik bir hata oluştu.",
   "alert.unexpected.title": "Hay aksi!",
   "boost_modal.combo": "Bir dahaki sefere {combo} tuşuna basabilirsiniz",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Metin gizli değil",
   "compose_form.spoiler_placeholder": "İçerik uyarısı",
   "confirmation_modal.cancel": "İptal",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Engelle",
   "confirmations.block.message": "{name} kullanıcısını engellemek istiyor musunuz?",
   "confirmations.delete.confirm": "Sil",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "Henüz hiçbir kullanıcıyı sessize almadınız.",
   "empty_column.notifications": "Henüz hiçbir bildiriminiz yok. Diğer insanlarla sobhet edebilmek için etkileşime geçebilirsiniz.",
   "empty_column.public": "Burada hiçbir şey yok! Herkese açık bir şeyler yazın veya burayı doldurmak için diğer sunuculardaki kullanıcıları takip edin",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Yetkilendir",
   "follow_request.reject": "Reddet",
   "getting_started.developers": "Geliştiriciler",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} senin durumunu favorilere ekledi",
   "notification.follow": "{name} seni takip ediyor",
   "notification.mention": "{name} mentioned you",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} senin durumunu boost etti",
   "notifications.clear": "Bildirimleri temizle",
   "notifications.clear_confirmation": "Tüm bildirimlerinizi kalıcı olarak temizlemek ister misiniz?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Yeni takipçiler:",
   "notifications.column_settings.mention": "Bahsedilenler:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
   "notifications.column_settings.reblog": "Boost’lar:",
   "notifications.column_settings.show": "Bildirimlerde göster",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} notifications",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {sonuç} other {sonuçlar}}",
-  "standalone.public_title": "A look inside...",
   "status.admin_account": "@{name} için denetim arayüzünü açın",
   "status.admin_status": "Denetim arayüzünde bu durumu açın",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index bd492e9e9..fc1c4f5d5 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -5,7 +5,6 @@
   "account.block_domain": "Заглушити {domain}",
   "account.blocked": "Заблоковані",
   "account.direct": "Пряме повідомлення @{name}",
-  "account.disclaimer_full": "Інфомація знизу може відображати профіль користувача неповністю.",
   "account.domain_blocked": "Домен приховано",
   "account.edit_profile": "Редагувати профіль",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "Відписатися",
   "account.unmute": "Зняти глушення @{name}",
   "account.unmute_notifications": "Показувати сповіщення від @{name}",
-  "account.view_full_profile": "Показати профіль повністю",
   "alert.unexpected.message": "Трапилась неочікувана помилка.",
   "alert.unexpected.title": "Ой!",
   "boost_modal.combo": "Ви можете натиснути {combo}, щоб пропустити це наступного разу",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "Текст видимий",
   "compose_form.spoiler_placeholder": "Попередження щодо прихованого тексту",
   "confirmation_modal.cancel": "Відмінити",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Заблокувати",
   "confirmations.block.message": "Ви впевнені, що хочете заблокувати {name}?",
   "confirmations.delete.confirm": "Видалити",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "У вас ще немає сповіщень. Переписуйтесь з іншими користувачами, щоб почати розмову.",
   "empty_column.public": "Тут поки нічого немає! Опублікуйте щось, або вручну підпишіться на користувачів інших інстанцій, щоб заповнити стрічку",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "Авторизувати",
   "follow_request.reject": "Відмовити",
   "getting_started.developers": "Розробникам",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} вподобав(-ла) ваш допис",
   "notification.follow": "{name} підписався(-лась) на Вас",
   "notification.mention": "{name} згадав(-ла) Вас",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} передмухнув(-ла) Ваш допис",
   "notifications.clear": "Очистити сповіщення",
   "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщеня?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Нові підписники:",
   "notifications.column_settings.mention": "Згадки:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push-сповіщення",
   "notifications.column_settings.reblog": "Передмухи:",
   "notifications.column_settings.show": "Показати в колонці",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} сповіщень",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {результат} few {результати} many {результатів} other {результатів}}",
-  "standalone.public_title": "A look inside...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
diff --git a/app/javascript/mastodon/locales/whitelist_bn.json b/app/javascript/mastodon/locales/whitelist_bn.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_bn.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index ae319d232..702be0ded 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -5,7 +5,6 @@
   "account.block_domain": "隐藏来自 {domain} 的内容",
   "account.blocked": "已屏蔽",
   "account.direct": "发送私信给 @{name}",
-  "account.disclaimer_full": "此处显示的信息可能不是全部内容。",
   "account.domain_blocked": "网站已屏蔽",
   "account.edit_profile": "修改个人资料",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "取消关注",
   "account.unmute": "不再隐藏 @{name}",
   "account.unmute_notifications": "不再隐藏来自 @{name} 的通知",
-  "account.view_full_profile": "查看完整资料",
   "alert.unexpected.message": "发生了意外错误。",
   "alert.unexpected.title": "哎呀!",
   "boost_modal.combo": "下次按住 {combo} 即可跳过此提示",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "正文未被折叠",
   "compose_form.spoiler_placeholder": "折叠部分的警告消息",
   "confirmation_modal.cancel": "取消",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "屏蔽",
   "confirmations.block.message": "你确定要屏蔽 {name} 吗?",
   "confirmations.delete.confirm": "删除",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "你还没有收到过任何通知,快向其他用户搭讪吧。",
   "empty_column.public": "这里神马都没有!写一些公开的嘟文,或者关注其他实例的用户后,这里就会有嘟文出现了哦!",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "同意",
   "follow_request.reject": "拒绝",
   "getting_started.developers": "开发",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} 收藏了你的嘟文",
   "notification.follow": "{name} 开始关注你",
   "notification.mention": "{name} 提及你",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} 转嘟了你的嘟文",
   "notifications.clear": "清空通知列表",
   "notifications.clear_confirmation": "你确定要永久清空通知列表吗?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "当有人关注你时:",
   "notifications.column_settings.mention": "当有人在嘟文中提及你时:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "推送通知",
   "notifications.column_settings.reblog": "当有人转嘟了你的嘟文时:",
   "notifications.column_settings.show": "在通知栏显示",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} 条通知",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "话题标签",
   "search_results.statuses": "嘟文",
   "search_results.total": "共 {count, number} 个结果",
-  "standalone.public_title": "大家都在干啥?",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "屏蔽 @{name}",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 4fde7ef45..5ea738bc9 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -5,7 +5,6 @@
   "account.block_domain": "隱藏來自 {domain} 的一切文章",
   "account.blocked": "封鎖",
   "account.direct": "私訊 @{name}",
-  "account.disclaimer_full": "下列資料不一定完整。",
   "account.domain_blocked": "服務站被隱藏",
   "account.edit_profile": "修改個人資料",
   "account.endorse": "Feature on profile",
@@ -36,7 +35,6 @@
   "account.unfollow": "取消關注",
   "account.unmute": "取消 @{name} 的靜音",
   "account.unmute_notifications": "取消來自 @{name} 通知的靜音",
-  "account.view_full_profile": "查看完整資料",
   "alert.unexpected.message": "發生不可預期的錯誤。",
   "alert.unexpected.title": "噢!",
   "boost_modal.combo": "如你想在下次路過這顯示,請按{combo},",
@@ -85,6 +83,7 @@
   "compose_form.spoiler.unmarked": "文字沒有被隱藏",
   "compose_form.spoiler_placeholder": "敏感警告訊息",
   "confirmation_modal.cancel": "取消",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "封鎖",
   "confirmations.block.message": "你確定要封鎖{name}嗎?",
   "confirmations.delete.confirm": "刪除",
@@ -133,7 +132,6 @@
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "你沒有任何通知紀錄,快向其他用戶搭訕吧。",
   "empty_column.public": "跨站時間軸暫時沒有內容!快寫一些公共的文章,或者關注另一些服務站的用戶吧!你和本站、友站的交流,將決定這裏出現的內容。",
-  "error_boundary.it_crashed": "It crashed!",
   "follow_request.authorize": "批准",
   "follow_request.reject": "拒絕",
   "getting_started.developers": "開發者",
@@ -248,6 +246,7 @@
   "notification.favourite": "{name} 收藏了你的文章",
   "notification.follow": "{name} 開始關注你",
   "notification.mention": "{name} 提及你",
+  "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} 轉推你的文章",
   "notifications.clear": "清空通知紀錄",
   "notifications.clear_confirmation": "你確定要清空通知紀錄嗎?",
@@ -258,6 +257,7 @@
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "關注你:",
   "notifications.column_settings.mention": "提及你:",
+  "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "推送通知",
   "notifications.column_settings.reblog": "轉推你的文章:",
   "notifications.column_settings.show": "在通知欄顯示",
@@ -267,6 +267,7 @@
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} 條通知",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
@@ -308,7 +309,6 @@
   "search_results.hashtags": "標籤",
   "search_results.statuses": "文章",
   "search_results.total": "{count, number} 項結果",
-  "standalone.public_title": "站點一瞥…",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "封鎖 @{name}",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index 9a116a702..6d33ef070 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -1,222 +1,220 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "從名單中新增或移除",
   "account.badges.bot": "機器人",
   "account.block": "封鎖 @{name}",
-  "account.block_domain": "隱藏來自 {domain} 的一切嘟文",
-  "account.blocked": "已被封鎖的",
-  "account.direct": "發送私訊給 @{name}",
-  "account.disclaimer_full": "下列資料不一定完整。",
-  "account.domain_blocked": "站點被隱藏",
-  "account.edit_profile": "編輯使用者資訊",
-  "account.endorse": "在個人資訊頁面上推薦對方",
+  "account.block_domain": "隱藏來自 {domain} 的所有嘟文",
+  "account.blocked": "已封鎖",
+  "account.direct": "傳私訊給 @{name}",
+  "account.domain_blocked": "已隱藏網域",
+  "account.edit_profile": "編輯個人資料",
+  "account.endorse": "在個人資料推薦對方",
   "account.follow": "關注",
   "account.followers": "關注者",
-  "account.followers.empty": "還沒有人關注這個使用者。",
+  "account.followers.empty": "還沒有人關注這位使用者。",
   "account.follows": "正在關注",
-  "account.follows.empty": "這個使用者還沒有關注任何人。",
-  "account.follows_you": "關注你",
+  "account.follows.empty": "這個使用者尚未關注任何使用者。",
+  "account.follows_you": "關注了你",
   "account.hide_reblogs": "隱藏來自 @{name} 的轉推",
-  "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.link_verified_on": "此連結的所有權已在 {date} 檢查",
+  "account.locked_info": "此帳號的隱私狀態被設為鎖定,擁有者將手動審核可關注此帳號的人。",
   "account.media": "媒體",
-  "account.mention": "提到 @{name}",
-  "account.moved_to": "{name} 已經移至:",
+  "account.mention": "提及 @{name}",
+  "account.moved_to": "{name} 已遷移至:",
   "account.mute": "靜音 @{name}",
   "account.mute_notifications": "靜音來自 @{name} 的通知",
-  "account.muted": "靜音",
+  "account.muted": "已靜音",
   "account.posts": "嘟文",
   "account.posts_with_replies": "嘟文與回覆",
   "account.report": "檢舉 @{name}",
-  "account.requested": "正在等待對方同意。點擊以取消發送關注請求",
-  "account.share": "分享 @{name} 的使用者資訊",
+  "account.requested": "正在等待核准。按一下取消關注請求",
+  "account.share": "分享 @{name} 的個人資料",
   "account.show_reblogs": "顯示來自 @{name} 的嘟文",
   "account.unblock": "取消封鎖 @{name}",
-  "account.unblock_domain": "不再隱藏 {domain}",
-  "account.unendorse": "不再於個人資訊頁面上推薦對方",
+  "account.unblock_domain": "取消隱藏 {domain}",
+  "account.unendorse": "不再於個人資料頁面推薦對方",
   "account.unfollow": "取消關注",
   "account.unmute": "不再靜音 @{name}",
-  "account.unmute_notifications": "不再對來自 @{name} 的通知靜音",
-  "account.view_full_profile": "查看完整資訊",
-  "alert.unexpected.message": "發生非預期的錯誤。",
+  "account.unmute_notifications": "不再靜音來自 @{name} 的通知",
+  "alert.unexpected.message": "發生了非預期的錯誤。",
   "alert.unexpected.title": "哎呀!",
-  "boost_modal.combo": "下次你可以按 {combo} 來跳過",
-  "bundle_column_error.body": "加載本組件出錯。",
+  "boost_modal.combo": "下次您可以按 {combo} 跳過",
+  "bundle_column_error.body": "載入此組件時發生錯誤。",
   "bundle_column_error.retry": "重試",
   "bundle_column_error.title": "網路錯誤",
   "bundle_modal_error.close": "關閉",
-  "bundle_modal_error.message": "加載本組件出錯。",
+  "bundle_modal_error.message": "載入此組件時發生錯誤。",
   "bundle_modal_error.retry": "重試",
   "column.blocks": "封鎖的使用者",
   "column.community": "本地時間軸",
   "column.direct": "私訊",
-  "column.domain_blocks": "隱藏的站點",
+  "column.domain_blocks": "隱藏的網域",
   "column.favourites": "最愛",
   "column.follow_requests": "關注請求",
   "column.home": "主頁",
   "column.lists": "名單",
-  "column.mutes": "靜音的使用者",
+  "column.mutes": "被靜音的使用者",
   "column.notifications": "通知",
-  "column.pins": "置頂嘟文",
-  "column.public": "其他站點時間軸",
+  "column.pins": "釘選的嘟文",
+  "column.public": "聯邦時間軸",
   "column_back_button.label": "上一頁",
   "column_header.hide_settings": "隱藏設定",
-  "column_header.moveLeft_settings": "將欄左移",
-  "column_header.moveRight_settings": "將欄右移",
-  "column_header.pin": "固定",
+  "column_header.moveLeft_settings": "將欄位向左移動",
+  "column_header.moveRight_settings": "將欄位向右移動",
+  "column_header.pin": "釘選",
   "column_header.show_settings": "顯示設定",
-  "column_header.unpin": "取下",
+  "column_header.unpin": "取消釘選",
   "column_subheading.settings": "設定",
   "community.column_settings.media_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.hashtag_warning": "因這則嘟文設成「不公開」,因此它不會列在任何「#」標籤下。只有公開嘟文才能用「#」標籤找到。",
+  "compose_form.lock_disclaimer": "您的帳戶尚未{locked}。任何人都能關注您並看到您設定成僅關注者能看的嘟文。",
   "compose_form.lock_disclaimer.lock": "上鎖",
-  "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.remove_option": "Remove this choice",
+  "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.publish": "嘟掉",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.marked": "此媒體已被標註為敏感的",
-  "compose_form.sensitive.unmarked": "此媒體未被標註為敏感的",
-  "compose_form.spoiler.marked": "文字隱藏在警告後",
-  "compose_form.spoiler.unmarked": "文字不是隱藏的",
-  "compose_form.spoiler_placeholder": "內容警告",
+  "compose_form.sensitive.marked": "此媒體被標記為敏感內容",
+  "compose_form.sensitive.unmarked": "此媒體未被標記為敏感內容",
+  "compose_form.spoiler.marked": "正文已隱藏在警告之後",
+  "compose_form.spoiler.unmarked": "正文未被隱藏",
+  "compose_form.spoiler_placeholder": "請在此處寫入警告訊息",
   "confirmation_modal.cancel": "取消",
+  "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "封鎖",
   "confirmations.block.message": "你確定要封鎖 {name} ?",
   "confirmations.delete.confirm": "刪除",
-  "confirmations.delete.message": "你確定要刪除這個狀態?",
+  "confirmations.delete.message": "你確定要刪除這條嘟文?",
   "confirmations.delete_list.confirm": "刪除",
-  "confirmations.delete_list.message": "確定要永久性地刪除這個名單嗎?",
+  "confirmations.delete_list.message": "確定要永久刪除此名單?",
   "confirmations.domain_block.confirm": "隱藏整個網域",
-  "confirmations.domain_block.message": "你真的確定要靜音所有來自 {domain} 的內容嗎? 多數情況下,封鎖或靜音幾個特定用戶應該就能滿足你的需求了。來自該站點的內容將不再出現在你的公共時間軸或通知裡。來自該站點的關注者將會被移除。",
-  "confirmations.mute.confirm": "消音",
-  "confirmations.mute.message": "你確定要消音 {name} ?",
-  "confirmations.redraft.confirm": "刪除 & 編輯",
-  "confirmations.redraft.message": "你確定要刪除這條嘟文並重新編輯它嗎?所有相關的轉嘟與最愛都會被刪除,而對原始嘟文的回覆將會變成孤兒。",
-  "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.domain_block.message": "確定封鎖整個 {domain} 嗎?多數情況下,封鎖或靜音幾個特定使用者應該就能滿足你的需求了。您將不能在任何公開時間軸或通知中看到來自該網域的內容。來自該網域的關注者將被移除。",
+  "confirmations.mute.confirm": "靜音",
+  "confirmations.mute.message": "確定靜音 {name} ?",
+  "confirmations.redraft.confirm": "刪除並重新編輯",
+  "confirmations.redraft.message": "你確定要刪除這條嘟文並重新編輯它嗎?這麼做將失去轉嘟和最愛,而對原始嘟文的回覆將被孤立。",
+  "confirmations.reply.confirm": "回覆",
+  "confirmations.reply.message": "現在回覆將蓋掉您目前正在撰寫的訊息。是否仍要回覆?",
   "confirmations.unfollow.confirm": "取消關注",
-  "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?",
-  "embed.instructions": "要內嵌此嘟文,請將以下代碼貼進你的網站。",
-  "embed.preview": "看上去會變成這樣:",
+  "confirmations.unfollow.message": "真的要取消關注 {name} 嗎?",
+  "embed.instructions": "要嵌入此嘟文,請將以下代碼貼進你的網站。",
+  "embed.preview": "他會顯示成這樣:",
   "emoji_button.activity": "活動",
   "emoji_button.custom": "自訂",
-  "emoji_button.flags": "旗幟",
+  "emoji_button.flags": "旗標",
   "emoji_button.food": "飲食",
   "emoji_button.label": "插入表情符號",
-  "emoji_button.nature": "自然",
-  "emoji_button.not_found": "沒有表情符號吼!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.nature": "大自然",
+  "emoji_button.not_found": "就沒這表情符號吼!! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "物件",
   "emoji_button.people": "使用者",
-  "emoji_button.recent": "常用",
+  "emoji_button.recent": "最常使用",
   "emoji_button.search": "搜尋…",
   "emoji_button.search_results": "搜尋結果",
   "emoji_button.symbols": "符號",
   "emoji_button.travel": "旅遊與地點",
-  "empty_column.account_timeline": "No toots here!",
+  "empty_column.account_timeline": "這裡還沒有嘟文!",
   "empty_column.blocks": "你還沒有封鎖任何使用者。",
-  "empty_column.community": "本地時間軸是空的。公開寫點什麼吧!",
-  "empty_column.direct": "你還沒有使用過私訊。當你發出或著收到私訊時,它會在這裡顯示。",
-  "empty_column.domain_blocks": "還沒有隱藏任何網域。",
-  "empty_column.favourited_statuses": "你還沒有收藏任何嘟文。收藏後的嘟文會顯示在這裡。",
-  "empty_column.favourites": "還沒有人收藏此嘟文。如果有人收藏,會顯示在這裡。",
-  "empty_column.follow_requests": "還沒有人請求關注你。如果收到關注請求,會顯示在這裡。",
-  "empty_column.hashtag": "這個主題標籤下什麼都沒有。",
-  "empty_column.home": "你還沒關注任何人。造訪{public}或利用搜尋功能找到其他用者。",
+  "empty_column.community": "本地時間軸是空的。快公開嘟些文搶頭香啊!",
+  "empty_column.direct": "您還沒有任何私訊。當您私訊別人或收到私訊時,它將於此顯示。",
+  "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.list": "此份名單還沒有東西。當此名單的成員嘟出了新的嘟文時,它們就會出現在這裡。",
   "empty_column.lists": "你還沒有建立任何名單。你建立的名單將會顯示在這裡。",
   "empty_column.mutes": "你還沒有靜音任何使用者。",
-  "empty_column.notifications": "還沒有任何通知。和別的使用者互動來開始對話。",
-  "empty_column.public": "這裡什麼都沒有! 寫一些公開的嘟文,或著關注其他站點的使用者後,這裡就會有嘟文出現了",
-  "error_boundary.it_crashed": "It crashed!",
+  "empty_column.notifications": "您尚未收到任何通知,和別人互動開啟對話吧。",
+  "empty_column.public": "這裡什麼都沒有!嘗試寫些公開的嘟文,或著自己關注其他伺服器的使用者後就會有嘟文出現了",
   "follow_request.authorize": "授權",
   "follow_request.reject": "拒絕",
-  "getting_started.developers": "開發",
-  "getting_started.directory": "Profile directory",
+  "getting_started.developers": "開發者",
+  "getting_started.directory": "個人資料目錄",
   "getting_started.documentation": "文件",
-  "getting_started.heading": "馬上開始",
+  "getting_started.heading": "開始使用",
   "getting_started.invite": "邀請使用者",
-  "getting_started.open_source_notice": "Mastodon 是開源軟體。你可以在 GitHub {github} 上做出貢獻或是回報問題。",
-  "getting_started.security": "登入資訊",
-  "getting_started.terms": "使用條款",
-  "hashtag.column_header.tag_mode.all": "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",
+  "getting_started.open_source_notice": "Mastodon 是開源軟體。你可以在 GitHub {github} 上貢獻或是回報問題。",
+  "getting_started.security": "安全性",
+  "getting_started.terms": "服務條款",
+  "hashtag.column_header.tag_mode.all": "以及{additional}",
+  "hashtag.column_header.tag_mode.any": "或是{additional}",
+  "hashtag.column_header.tag_mode.none": "而不用{additional}",
+  "hashtag.column_settings.select.no_options_message": "找不到建議",
+  "hashtag.column_settings.select.placeholder": "輸入「#」標籤…",
+  "hashtag.column_settings.tag_mode.all": "全部",
+  "hashtag.column_settings.tag_mode.any": "任一",
+  "hashtag.column_settings.tag_mode.none": "全都不要",
+  "hashtag.column_settings.tag_toggle": "對此欄位加入額外標籤",
   "home.column_settings.basic": "基本",
   "home.column_settings.show_reblogs": "顯示轉推",
-  "home.column_settings.show_replies": "顯示回應",
-  "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 tutorial!",
-  "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": "回到上一個",
-  "keyboard_shortcuts.blocked": "到封鎖的使用者名單",
-  "keyboard_shortcuts.boost": "到轉推",
-  "keyboard_shortcuts.column": "選擇第 X 欄中的嘟文",
-  "keyboard_shortcuts.compose": "焦點移至撰寫文字區塊",
+  "home.column_settings.show_replies": "顯示回覆",
+  "intervals.full.days": "{number, plural, one {# 天} other {# 天}}",
+  "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.home.headline": "首頁",
+  "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.welcome.action": "開始!",
+  "introduction.welcome.headline": "第一步",
+  "introduction.welcome.text": "歡迎來到聯邦!稍候您將可以廣播訊息並跨各種各式各樣的伺服器與朋友聊天。但這台伺服器,{domain},十分特殊 -- 它寄管了您的個人資料,所以請記住這台伺服器的名稱。",
+  "keyboard_shortcuts.back": "返回上一頁",
+  "keyboard_shortcuts.blocked": "開啟「封鎖的使用者」名單",
+  "keyboard_shortcuts.boost": "轉嘟",
+  "keyboard_shortcuts.column": "將焦點放在其中一欄的嘟文",
+  "keyboard_shortcuts.compose": "將焦點移至撰寫文字區塊",
   "keyboard_shortcuts.description": "描述",
-  "keyboard_shortcuts.direct": "到私訊欄",
-  "keyboard_shortcuts.down": "在列表往下移動",
-  "keyboard_shortcuts.enter": "看嘟文",
-  "keyboard_shortcuts.favourite": "收藏",
-  "keyboard_shortcuts.favourites": "到收藏名單",
-  "keyboard_shortcuts.federated": "到其他站點時間軸",
+  "keyboard_shortcuts.direct": "開啟私訊欄",
+  "keyboard_shortcuts.down": "在名單中往下移動",
+  "keyboard_shortcuts.enter": "檢視嘟文",
+  "keyboard_shortcuts.favourite": "加入最愛",
+  "keyboard_shortcuts.favourites": "開啟最愛名單",
+  "keyboard_shortcuts.federated": "開啟聯邦時間軸",
   "keyboard_shortcuts.heading": "鍵盤快速鍵",
-  "keyboard_shortcuts.home": "到主頁時間軸",
+  "keyboard_shortcuts.home": "開啟首頁時間軸",
   "keyboard_shortcuts.hotkey": "快速鍵",
-  "keyboard_shortcuts.legend": "顯示這個說明",
-  "keyboard_shortcuts.local": "到本地時間軸",
-  "keyboard_shortcuts.mention": "到提到的作者",
-  "keyboard_shortcuts.muted": "到靜音的使用者列表",
-  "keyboard_shortcuts.my_profile": "到你的個人資訊頁",
-  "keyboard_shortcuts.notifications": "打開通知欄",
-  "keyboard_shortcuts.pinned": "到收藏的嘟文名單",
-  "keyboard_shortcuts.profile": "到嘟文作者的個人資訊頁",
-  "keyboard_shortcuts.reply": "到回應",
-  "keyboard_shortcuts.requests": "打開關注請求名單",
-  "keyboard_shortcuts.search": "把滑鼠移動到搜尋",
-  "keyboard_shortcuts.start": "到「馬上開始」",
-  "keyboard_shortcuts.toggle_hidden": "顯示或隱藏被標為敏感的嘟文",
-  "keyboard_shortcuts.toot": "新的嘟文",
-  "keyboard_shortcuts.unfocus": "取消輸入",
-  "keyboard_shortcuts.up": "在列表往上移動",
+  "keyboard_shortcuts.legend": "顯示此說明",
+  "keyboard_shortcuts.local": "開啟本地時間軸",
+  "keyboard_shortcuts.mention": "提及作者",
+  "keyboard_shortcuts.muted": "開啟靜音使用者名單",
+  "keyboard_shortcuts.my_profile": "開啟個人資料頁面",
+  "keyboard_shortcuts.notifications": "開啟通知欄",
+  "keyboard_shortcuts.pinned": "開啟釘選的嘟文名單",
+  "keyboard_shortcuts.profile": "開啟作者的個人資料頁",
+  "keyboard_shortcuts.reply": "回應嘟文",
+  "keyboard_shortcuts.requests": "開啟關注請求名單",
+  "keyboard_shortcuts.search": "將焦點移至搜尋框",
+  "keyboard_shortcuts.start": "開啟「開始使用」欄位",
+  "keyboard_shortcuts.toggle_hidden": "顯示/隱藏在內容警告之後的正文",
+  "keyboard_shortcuts.toot": "開始發出新嘟文",
+  "keyboard_shortcuts.unfocus": "取消輸入文字區塊 / 搜尋的焦點",
+  "keyboard_shortcuts.up": "在名單中往上移動",
   "lightbox.close": "關閉",
-  "lightbox.next": "繼續",
-  "lightbox.previous": "回退",
-  "lists.account.add": "加到名單裡",
+  "lightbox.next": "下一步",
+  "lightbox.previous": "上一步",
+  "lists.account.add": "新增至名單",
   "lists.account.remove": "從名單中移除",
   "lists.delete": "刪除名單",
-  "lists.edit": "修改名單",
-  "lists.edit.submit": "Change title",
+  "lists.edit": "編輯名單",
+  "lists.edit.submit": "變更標題",
   "lists.new.create": "新增名單",
-  "lists.new.title_placeholder": "名單名稱",
+  "lists.new.title_placeholder": "新名單標題",
   "lists.search": "搜尋您關注的使用者",
   "lists.subheading": "您的名單",
   "loading_indicator.label": "讀取中...",
@@ -227,53 +225,56 @@
   "navigation_bar.apps": "行動應用程式",
   "navigation_bar.blocks": "封鎖的使用者",
   "navigation_bar.community_timeline": "本地時間軸",
-  "navigation_bar.compose": "寫新的嘟文",
+  "navigation_bar.compose": "撰寫新嘟文",
   "navigation_bar.direct": "私訊",
   "navigation_bar.discover": "探索",
-  "navigation_bar.domain_blocks": "隱藏的站點",
-  "navigation_bar.edit_profile": "編輯使用者資訊",
-  "navigation_bar.favourites": "最愛",
-  "navigation_bar.filters": "消音的詞",
+  "navigation_bar.domain_blocks": "隱藏的網域",
+  "navigation_bar.edit_profile": "編輯個人資料",
+  "navigation_bar.favourites": "最愛內容",
+  "navigation_bar.filters": "靜音詞彙",
   "navigation_bar.follow_requests": "關注請求",
-  "navigation_bar.info": "關於本站",
-  "navigation_bar.keyboard_shortcuts": "快捷鍵",
+  "navigation_bar.info": "關於此伺服器",
+  "navigation_bar.keyboard_shortcuts": "快速鍵",
   "navigation_bar.lists": "名單",
   "navigation_bar.logout": "登出",
   "navigation_bar.mutes": "靜音的使用者",
   "navigation_bar.personal": "個人",
-  "navigation_bar.pins": "置頂嘟文",
+  "navigation_bar.pins": "釘選的嘟文",
   "navigation_bar.preferences": "偏好設定",
-  "navigation_bar.public_timeline": "其他站點時間軸",
-  "navigation_bar.security": "登入資訊",
-  "notification.favourite": "{name}把你的嘟文加入了最愛",
-  "notification.follow": "{name}關注了你",
-  "notification.mention": "{name}提到了你",
+  "navigation_bar.public_timeline": "聯邦時間軸",
+  "navigation_bar.security": "安全性",
+  "notification.favourite": "{name} 把你的嘟文加入了最愛",
+  "notification.follow": "{name} 關注了你",
+  "notification.mention": "{name} 提到了你",
+  "notification.poll": "您投過的投票已經結束",
   "notification.reblog": "{name}轉嘟了你的嘟文",
   "notifications.clear": "清除通知",
   "notifications.clear_confirmation": "確定要永久清除你的通知嗎?",
   "notifications.column_settings.alert": "桌面通知",
   "notifications.column_settings.favourite": "最愛:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
-  "notifications.column_settings.follow": "新的關注者:",
-  "notifications.column_settings.mention": "提到:",
+  "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.mention": "提及:",
+  "notifications.column_settings.poll": "投票結果:",
   "notifications.column_settings.push": "推送通知",
   "notifications.column_settings.reblog": "轉嘟:",
-  "notifications.column_settings.show": "顯示在欄位中",
+  "notifications.column_settings.show": "在欄位中顯示",
   "notifications.column_settings.sound": "播放音效",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.all": "全部",
+  "notifications.filter.boosts": "轉嘟",
+  "notifications.filter.favourites": "最愛",
+  "notifications.filter.follows": "關注的使用者",
+  "notifications.filter.mentions": "提及",
+  "notifications.filter.polls": "投票結果",
   "notifications.group": "{count} 條通知",
-  "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
-  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Vote",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll.closed": "已關閉",
+  "poll.refresh": "重新整理",
+  "poll.total_votes": "{count, plural, one {# 個投票} other {# 個投票}}",
+  "poll.vote": "投票",
+  "poll_button.add_poll": "建立投票",
+  "poll_button.remove_poll": "移除投票",
   "privacy.change": "調整隱私狀態",
   "privacy.direct.long": "只有被提到的使用者能看到",
   "privacy.direct.short": "私訊",
@@ -293,7 +294,7 @@
   "reply_indicator.cancel": "取消",
   "report.forward": "轉寄到 {target}",
   "report.forward_hint": "這個帳戶屬於其他站點。要像該站點發送匿名的檢舉訊息嗎?",
-  "report.hint": "這項訊息會發送到你該站點的管理員。你可以提供檢舉這個帳戶的理由:",
+  "report.hint": "這項訊息會發送到您伺服器的管理員。你可以提供檢舉這個帳戶的理由:",
   "report.placeholder": "更多訊息",
   "report.submit": "送出",
   "report.target": "檢舉 {target}",
@@ -301,20 +302,19 @@
   "search_popout.search_format": "進階搜尋格式",
   "search_popout.tips.full_text": "輸入簡單的文字,搜尋由你撰寫、最愛、轉嘟或提你的嘟文,以及符合使用者名稱、帳戶名稱和標籤。",
   "search_popout.tips.hashtag": "主題標籤",
-  "search_popout.tips.status": "狀態",
+  "search_popout.tips.status": "嘟文",
   "search_popout.tips.text": "輸入簡單的文字,搜尋符合的使用者名稱,帳戶名稱與標籤",
   "search_popout.tips.user": "使用者",
   "search_results.accounts": "使用者",
   "search_results.hashtags": "主題標籤",
   "search_results.statuses": "嘟文",
   "search_results.total": "{count, number} 項結果",
-  "standalone.public_title": "站點一瞥…",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "開啟 @{name} 的管理介面",
+  "status.admin_status": "在管理介面開啟此嘟文",
   "status.block": "封鎖 @{name}",
   "status.cancel_reblog_private": "取消轉嘟",
   "status.cannot_reblog": "這篇嘟文無法被轉嘟",
-  "status.copy": "Copy link to status",
+  "status.copy": "將連結複製到嘟文中",
   "status.delete": "刪除",
   "status.detailed_status": "對話的詳細內容",
   "status.direct": "發送私訊給 @{name}",
@@ -328,9 +328,9 @@
   "status.mute": "靜音 @{name}",
   "status.mute_conversation": "靜音對話",
   "status.open": "展開嘟文",
-  "status.pin": "置頂到個人資訊頁",
-  "status.pinned": "置頂嘟文",
-  "status.read_more": "Read more",
+  "status.pin": "釘選到個人資料頁",
+  "status.pinned": "釘選的嘟文",
+  "status.read_more": "閱讀更多",
   "status.reblog": "轉嘟",
   "status.reblog_private": "轉嘟給原有關注者",
   "status.reblogged_by": "{name} 轉嘟了",
@@ -346,29 +346,29 @@
   "status.show_less_all": "減少顯示這類嘟文",
   "status.show_more": "顯示更多",
   "status.show_more_all": "顯示更多這類嘟文",
-  "status.show_thread": "Show thread",
+  "status.show_thread": "顯示討論串",
   "status.unmute_conversation": "解除此對話的靜音",
   "status.unpin": "解除置頂",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
+  "suggestions.dismiss": "關閉建議",
+  "suggestions.header": "您可能對這些東西有興趣…",
   "tabs_bar.federated_timeline": "其他站點",
   "tabs_bar.home": "主頁",
   "tabs_bar.local_timeline": "本站",
   "tabs_bar.notifications": "通知",
   "tabs_bar.search": "搜尋",
-  "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",
+  "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 {# 秒}}",
   "trends.count_by_accounts": "{count} 位使用者在討論",
   "ui.beforeunload": "如果離開 Mastodon,你的草稿將會不見。",
   "upload_area.title": "拖放來上傳",
   "upload_button.label": "上傳媒體檔案 (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "File upload limit exceeded.",
-  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_error.limit": "已達到檔案上傳限制。",
+  "upload_error.poll": "不允許在投票上傳檔案。",
   "upload_form.description": "為視障人士增加文字說明",
-  "upload_form.focus": "裁切",
+  "upload_form.focus": "變更預覽",
   "upload_form.undo": "刪除",
   "upload_progress.label": "上傳中...",
   "video.close": "關閉影片",
diff --git a/app/javascript/mastodon/reducers/identity_proofs.js b/app/javascript/mastodon/reducers/identity_proofs.js
new file mode 100644
index 000000000..58af0a5fa
--- /dev/null
+++ b/app/javascript/mastodon/reducers/identity_proofs.js
@@ -0,0 +1,25 @@
+import { Map as ImmutableMap, fromJS } from 'immutable';
+import {
+  IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST,
+  IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS,
+  IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL,
+} from '../actions/identity_proofs';
+
+const initialState = ImmutableMap();
+
+export default function identityProofsReducer(state = initialState, action) {
+  switch(action.type) {
+  case IDENTITY_PROOFS_ACCOUNT_FETCH_REQUEST:
+    return state.set('isLoading', true);
+  case IDENTITY_PROOFS_ACCOUNT_FETCH_FAIL:
+    return state.set('isLoading', false);
+  case IDENTITY_PROOFS_ACCOUNT_FETCH_SUCCESS:
+    return state.update(identity_proofs => identity_proofs.withMutations(map => {
+      map.set('isLoading', false);
+      map.set('loaded', true);
+      map.set(action.accountId, fromJS(action.identity_proofs));
+    }));
+  default:
+    return state;
+  }
+};
diff --git a/app/javascript/mastodon/reducers/index.js b/app/javascript/mastodon/reducers/index.js
index a7e9c4d0f..981ad8e64 100644
--- a/app/javascript/mastodon/reducers/index.js
+++ b/app/javascript/mastodon/reducers/index.js
@@ -30,6 +30,7 @@ import filters from './filters';
 import conversations from './conversations';
 import suggestions from './suggestions';
 import polls from './polls';
+import identity_proofs from './identity_proofs';
 
 const reducers = {
   dropdown_menu,
@@ -56,6 +57,7 @@ const reducers = {
   notifications,
   height_cache,
   custom_emojis,
+  identity_proofs,
   lists,
   listEditor,
   listAdder,
diff --git a/app/javascript/mastodon/reducers/timelines.js b/app/javascript/mastodon/reducers/timelines.js
index 94b570ecd..6a972f967 100644
--- a/app/javascript/mastodon/reducers/timelines.js
+++ b/app/javascript/mastodon/reducers/timelines.js
@@ -78,14 +78,15 @@ const updateTimeline = (state, timeline, status) => {
   }));
 };
 
-const deleteStatus = (state, id, accountId, references) => {
+const deleteStatus = (state, id, accountId, references, exclude_account = null) => {
   state.keySeq().forEach(timeline => {
-    state = state.updateIn([timeline, 'items'], list => list.filterNot(item => item === id));
+    if (exclude_account === null || (timeline !== `account:${exclude_account}` && !timeline.startsWith(`account:${exclude_account}:`)))
+      state = state.updateIn([timeline, 'items'], list => list.filterNot(item => item === id));
   });
 
   // Remove reblogs of deleted status
   references.forEach(ref => {
-    state = deleteStatus(state, ref[0], ref[1], []);
+    state = deleteStatus(state, ref[0], ref[1], [], exclude_account);
   });
 
   return state;
@@ -104,7 +105,7 @@ const filterTimelines = (state, relationship, statuses) => {
     }
 
     references = statuses.filter(item => item.get('reblog') === status.get('id')).map(item => [item.get('id'), item.get('account')]);
-    state      = deleteStatus(state, status.get('id'), status.get('account'), references);
+    state      = deleteStatus(state, status.get('id'), status.get('account'), references, relationship.id);
   });
 
   return state;
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index 42f53f525..05c7821e4 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -220,6 +220,11 @@ $content-width: 840px;
       color: $error-value-color;
       font-weight: 500;
     }
+
+    .neutral-hint {
+      color: $dark-text-color;
+      font-weight: 500;
+    }
   }
 
   @media screen and (max-width: $no-columns-breakpoint) {
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 5b86778bb..2ad93c59d 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -1186,57 +1186,6 @@ a .account__avatar {
   white-space: nowrap;
 }
 
-.account__header {
-  flex: 0 0 auto;
-  background: lighten($ui-base-color, 4%);
-  text-align: center;
-  background-size: cover;
-  background-position: center;
-  position: relative;
-
-  &.inactive {
-    opacity: 0.5;
-
-    .account__header__avatar {
-      filter: grayscale(100%);
-    }
-
-    .account__header__username {
-      color: $secondary-text-color;
-    }
-  }
-
-  & > div {
-    background: rgba(lighten($ui-base-color, 4%), 0.9);
-    padding: 20px 10px;
-  }
-
-  .account__header__content {
-    color: $secondary-text-color;
-  }
-
-  .account__header__display-name {
-    color: $primary-text-color;
-    display: inline-block;
-    width: 100%;
-    font-size: 20px;
-    line-height: 27px;
-    font-weight: 500;
-    overflow: hidden;
-    text-overflow: ellipsis;
-  }
-
-  .account__header__username {
-    color: $highlight-text-color;
-    font-size: 14px;
-    font-weight: 400;
-    display: block;
-    margin-bottom: 10px;
-    overflow: hidden;
-    text-overflow: ellipsis;
-  }
-}
-
 .account__disclaimer {
   padding: 10px;
   border-top: 1px solid lighten($ui-base-color, 8%);
@@ -1265,39 +1214,6 @@ a .account__avatar {
   }
 }
 
-.account__header__content {
-  color: $darker-text-color;
-  font-size: 14px;
-  font-weight: 400;
-  overflow: hidden;
-  word-break: normal;
-  word-wrap: break-word;
-
-  p {
-    margin-bottom: 20px;
-
-    &:last-child {
-      margin-bottom: 0;
-    }
-  }
-
-  a {
-    color: inherit;
-    text-decoration: underline;
-
-    &:hover {
-      text-decoration: none;
-    }
-  }
-}
-
-.account__header__display-name {
-  .emojione {
-    width: 25px;
-    height: 25px;
-  }
-}
-
 .account__action-bar {
   border-top: 1px solid lighten($ui-base-color, 8%);
   border-bottom: 1px solid lighten($ui-base-color, 8%);
@@ -1369,15 +1285,6 @@ a .account__avatar {
   }
 }
 
-.account__header__avatar {
-  background-size: 90px 90px;
-  display: block;
-  height: 90px;
-  margin: 0 auto 10px;
-  overflow: hidden;
-  width: 90px;
-}
-
 .account-authorize {
   padding: 14px 10px;
 
@@ -3154,42 +3061,22 @@ a.status-card.compact:hover {
   }
 }
 
-.account--follows-info {
+.relationship-tag {
   color: $primary-text-color;
-  position: absolute;
-  top: 10px;
-  left: 10px;
-  opacity: 0.7;
-  display: inline-block;
+  margin-bottom: 4px;
+  display: block;
   vertical-align: top;
-  background-color: rgba($base-overlay-background, 0.4);
+  background-color: $base-overlay-background;
   text-transform: uppercase;
   font-size: 11px;
   font-weight: 500;
   padding: 4px;
   border-radius: 4px;
-}
-
-.account--muting-info {
-  color: $primary-text-color;
-  position: absolute;
-  top: 40px;
-  left: 10px;
   opacity: 0.7;
-  display: inline-block;
-  vertical-align: top;
-  background-color: rgba($base-overlay-background, 0.4);
-  text-transform: uppercase;
-  font-size: 11px;
-  font-weight: 500;
-  padding: 4px;
-  border-radius: 4px;
-}
 
-.account--action-button {
-  position: absolute;
-  top: 10px;
-  right: 20px;
+  &:hover {
+    opacity: 1;
+  }
 }
 
 .setting-toggle {
@@ -3339,11 +3226,11 @@ a.status-card.compact:hover {
   box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
   overflow: hidden;
 
-  li {
+  button {
     display: block;
     cursor: pointer;
     border: 0;
-    padding: 3px 8px;
+    padding: 4px 8px;
     background: transparent;
 
     &:hover,
@@ -4245,6 +4132,7 @@ a.status-card.compact:hover {
 
 .confirmation-modal__action-bar,
 .mute-modal__action-bar {
+  .confirmation-modal__secondary-button,
   .confirmation-modal__cancel-button,
   .mute-modal__cancel-button {
     background-color: transparent;
@@ -5348,53 +5236,193 @@ noscript {
   }
 }
 
-.account__header .roles {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  padding: 0 15px;
+.account__header__content {
+  color: $darker-text-color;
+  font-size: 14px;
+  font-weight: 400;
+  overflow: hidden;
+  word-break: normal;
+  word-wrap: break-word;
+
+  p {
+    margin-bottom: 20px;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
+
+  a {
+    color: inherit;
+    text-decoration: underline;
+
+    &:hover {
+      text-decoration: none;
+    }
+  }
 }
 
-.account__header .account__header__fields {
-  font-size: 14px;
-  line-height: 20px;
+.account__header {
   overflow: hidden;
-  margin: 20px -10px -20px;
-  border-bottom: 0;
-  border-top: 0;
 
-  dl {
-    border-top: 1px solid lighten($ui-base-color, 4%);
-    border-bottom: 0;
-    display: flex;
+  &.inactive {
+    opacity: 0.5;
+
+    .account__header__image,
+    .account__avatar {
+      filter: grayscale(100%);
+    }
   }
 
-  dt,
-  dd {
-    box-sizing: border-box;
-    padding: 14px 5px;
-    text-align: center;
-    max-height: 48px;
-    overflow: hidden;
-    white-space: nowrap;
-    text-overflow: ellipsis;
+  &__info {
+    position: absolute;
+    top: 10px;
+    left: 10px;
   }
 
-  dt {
-    color: $darker-text-color;
+  &__image {
+    overflow: hidden;
+    height: 145px;
+    position: relative;
     background: darken($ui-base-color, 4%);
-    width: 120px;
-    flex: 0 0 auto;
-    font-weight: 500;
+
+    img {
+      object-fit: cover;
+      display: block;
+      width: 100%;
+      height: 100%;
+      margin: 0;
+    }
   }
 
-  dd {
-    flex: 1 1 auto;
-    color: $primary-text-color;
-    background: $ui-base-color;
+  &__bar {
+    position: relative;
+    background: lighten($ui-base-color, 4%);
+    padding: 5px;
+    border-bottom: 1px solid lighten($ui-base-color, 12%);
+
+    .avatar {
+      display: block;
+      flex: 0 0 auto;
+      width: 94px;
+      margin-left: -2px;
 
-    &.verified {
-      border: 1px solid rgba($valid-value-color, 0.5);
-      background: rgba($valid-value-color, 0.25);
+      .account__avatar {
+        background: darken($ui-base-color, 8%);
+        border: 2px solid lighten($ui-base-color, 4%);
+      }
+    }
+  }
+
+  &__tabs {
+    display: flex;
+    align-items: flex-start;
+    padding: 7px 5px;
+    margin-top: -55px;
+
+    &__buttons {
+      display: flex;
+      align-items: center;
+      padding-top: 55px;
+      overflow: hidden;
+
+      .icon-button {
+        border: 1px solid lighten($ui-base-color, 12%);
+        border-radius: 4px;
+        box-sizing: content-box;
+        padding: 2px;
+      }
+
+      .button {
+        margin: 0 8px;
+      }
+    }
+
+    &__name {
+      padding: 5px;
+
+      .account-role {
+        vertical-align: top;
+      }
+
+      .emojione {
+        width: 22px;
+        height: 22px;
+      }
+
+      h1 {
+        font-size: 16px;
+        line-height: 24px;
+        color: $primary-text-color;
+        font-weight: 500;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+
+        small {
+          display: block;
+          font-size: 14px;
+          color: $darker-text-color;
+          font-weight: 400;
+          overflow: hidden;
+          text-overflow: ellipsis;
+        }
+      }
+    }
+
+    .spacer {
+      flex: 1 1 auto;
+    }
+  }
+
+  &__bio {
+    overflow: hidden;
+    margin: 0 -5px;
+
+    .account__header__content {
+      padding: 20px 15px;
+      padding-bottom: 5px;
+      color: $primary-text-color;
+    }
+
+    .account__header__fields {
+      margin: 0;
+      border-top: 1px solid lighten($ui-base-color, 12%);
+
+      a {
+        color: lighten($ui-highlight-color, 8%);
+      }
+
+      dl:first-child .verified {
+        border-radius: 0 4px 0 0;
+      }
+
+      .verified a {
+        color: $valid-value-color;
+      }
+    }
+  }
+
+  &__extra {
+    margin-top: 4px;
+
+    &__links {
+      font-size: 14px;
+      color: $darker-text-color;
+
+      a {
+        display: inline-block;
+        color: $darker-text-color;
+        text-decoration: none;
+        padding: 10px;
+        padding-top: 20px;
+        font-weight: 500;
+
+        strong {
+          font-weight: 700;
+          color: $primary-text-color;
+        }
+      }
     }
   }
 }
diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss
index a98fa52c4..368c2304b 100644
--- a/app/javascript/styles/mastodon/containers.scss
+++ b/app/javascript/styles/mastodon/containers.scss
@@ -10,12 +10,10 @@
 }
 
 .logo-container {
-  margin: 100px auto;
-  margin-bottom: 50px;
+  margin: 100px auto 50px;
 
-  @media screen and (max-width: 400px) {
-    margin: 30px auto;
-    margin-bottom: 20px;
+  @media screen and (max-width: 500px) {
+    margin: 40px auto 0;
   }
 
   h1 {
@@ -677,6 +675,7 @@
           color: $darker-text-color;
           text-decoration: none;
           padding: 15px;
+          font-weight: 500;
 
           strong {
             font-weight: 700;
diff --git a/app/javascript/styles/mastodon/emoji_picker.scss b/app/javascript/styles/mastodon/emoji_picker.scss
index 94578ffee..e49084b5f 100644
--- a/app/javascript/styles/mastodon/emoji_picker.scss
+++ b/app/javascript/styles/mastodon/emoji_picker.scss
@@ -1,5 +1,3 @@
-@import '~emoji-mart/css/emoji-mart.css';
-
 .emoji-mart {
   &,
   * {
@@ -53,14 +51,6 @@
 
   &:hover {
     color: darken($lighter-text-color, 4%);
-
-    svg {
-      fill: darken($lighter-text-color, 4%);
-    }
-  }
-
-  svg {
-    fill: $lighter-text-color;
   }
 }
 
@@ -69,19 +59,11 @@
 
   &:hover {
     color: darken($highlight-text-color, 4%);
-
-    svg {
-      fill: darken($highlight-text-color, 4%);
-    }
   }
 
   .emoji-mart-anchor-bar {
     bottom: -1px;
   }
-
-  svg {
-    fill: $highlight-text-color;
-  }
 }
 
 .emoji-mart-anchor-bar {
@@ -101,6 +83,7 @@
   }
 
   svg {
+    fill: currentColor;
     max-height: 18px;
   }
 }
@@ -120,14 +103,15 @@
 }
 
 .emoji-mart-search {
-  margin: 10px 40px 10px 5px;
+  padding: 10px;
+  padding-right: 45px;
   background: $simple-background-color;
 
   input {
     font-size: 14px;
     font-weight: 400;
     padding: 7px 9px;
-    font-family: $font-sans-serif;
+    font-family: inherit;
     display: block;
     width: 100%;
     background: rgba($ui-secondary-color, 0.3);
@@ -182,7 +166,6 @@
     font-weight: 500;
     padding: 5px 6px;
     background: $simple-background-color;
-    font-family: $font-sans-serif;
   }
 }
 
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index 9ef45e425..91888d305 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -475,6 +475,42 @@ code {
       }
     }
   }
+
+  &__overlay-area {
+    position: relative;
+
+    &__overlay {
+      position: absolute;
+      top: 0;
+      left: 0;
+      width: 100%;
+      height: 100%;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      background: rgba($ui-base-color, 0.65);
+      backdrop-filter: blur(2px);
+      border-radius: 4px;
+
+      &__content {
+        text-align: center;
+
+        &.rich-formatting {
+          &,
+          p {
+            color: $primary-text-color;
+          }
+        }
+      }
+    }
+  }
+}
+
+.block-icon {
+  display: block;
+  margin: 0 auto;
+  margin-bottom: 10px;
+  font-size: 24px;
 }
 
 .flash-message {
@@ -818,13 +854,19 @@ code {
     flex: 1;
     flex-direction: column;
     flex-shrink: 1;
+    max-width: 50%;
 
     &-sep {
+      align-self: center;
       flex-grow: 0;
       overflow: visible;
       position: relative;
       z-index: 1;
     }
+
+    p {
+      word-break: break-word;
+    }
   }
 
   .account__avatar {
@@ -846,12 +888,13 @@ code {
       height: 100%;
       left: 50%;
       position: absolute;
+      top: 0;
       width: 1px;
     }
   }
 
   &__row {
-    align-items: center;
+    align-items: flex-start;
     display: flex;
     flex-direction: row;
   }
diff --git a/app/javascript/styles/mastodon/stream_entries.scss b/app/javascript/styles/mastodon/stream_entries.scss
index d8bd30377..a739c446d 100644
--- a/app/javascript/styles/mastodon/stream_entries.scss
+++ b/app/javascript/styles/mastodon/stream_entries.scss
@@ -99,9 +99,9 @@
     }
   }
 
-  &:active,
-  &:focus,
-  &:hover {
+  &:active:not(:disabled),
+  &:focus:not(:disabled),
+  &:hover:not(:disabled) {
     background: lighten($ui-highlight-color, 10%);
 
     svg path:last-child {
diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss
index 645192ea4..307e509d5 100644
--- a/app/javascript/styles/mastodon/widgets.scss
+++ b/app/javascript/styles/mastodon/widgets.scss
@@ -352,6 +352,7 @@
     border-radius: 50%;
     position: relative;
     margin-left: -10px;
+    background: darken($ui-base-color, 8%);
     border: 2px solid $ui-base-color;
 
     &:nth-child(1) {
diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb
index 9f8ffd9fb..1aa6ee9ec 100644
--- a/app/lib/activitypub/activity/announce.rb
+++ b/app/lib/activitypub/activity/announce.rb
@@ -47,6 +47,10 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
     followed_by_local_accounts? || requested_through_relay? || reblog_of_local_status?
   end
 
+  def requested_through_relay?
+    super || Relay.find_by(inbox_url: @account.inbox_url)&.enabled?
+  end
+
   def reblog_of_local_status?
     status_from_uri(object_uri)&.account&.local?
   end
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 8fe7b9138..dabdcbcf7 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -68,7 +68,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
         thread: replied_to_status,
         conversation: conversation_from_uri(@object['conversation']),
         media_attachment_ids: process_attachments.take(4).map(&:id),
-        owned_poll: process_poll,
+        poll: process_poll,
       }
     end
   end
@@ -240,11 +240,11 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
   end
 
   def poll_vote?
-    return false if replied_to_status.nil? || replied_to_status.poll.nil? || !replied_to_status.local? || !replied_to_status.poll.options.include?(@object['name'])
+    return false if replied_to_status.nil? || replied_to_status.preloadable_poll.nil? || !replied_to_status.local? || !replied_to_status.preloadable_poll.options.include?(@object['name'])
 
-    unless replied_to_status.poll.expired?
-      replied_to_status.poll.votes.create!(account: @account, choice: replied_to_status.poll.options.index(@object['name']), uri: @object['id'])
-      ActivityPub::DistributePollUpdateWorker.perform_in(3.minutes, replied_to_status.id) unless replied_to_status.poll.hide_totals?
+    unless replied_to_status.preloadable_poll.expired?
+      replied_to_status.preloadable_poll.votes.create!(account: @account, choice: replied_to_status.preloadable_poll.options.index(@object['name']), uri: @object['id'])
+      ActivityPub::DistributePollUpdateWorker.perform_in(3.minutes, replied_to_status.id) unless replied_to_status.preloadable_poll.hide_totals?
     end
 
     true
diff --git a/app/lib/activitypub/activity/update.rb b/app/lib/activitypub/activity/update.rb
index bc9a63f98..70035325b 100644
--- a/app/lib/activitypub/activity/update.rb
+++ b/app/lib/activitypub/activity/update.rb
@@ -23,8 +23,8 @@ class ActivityPub::Activity::Update < ActivityPub::Activity
     return reject_payload! if invalid_origin?(@object['id'])
 
     status = Status.find_by(uri: object_uri, account_id: @account.id)
-    return if status.nil? || status.poll.nil?
+    return if status.nil? || status.preloadable_poll.nil?
 
-    ActivityPub::ProcessPollService.new.call(status.poll, @object)
+    ActivityPub::ProcessPollService.new.call(status.preloadable_poll, @object)
   end
 end
diff --git a/app/lib/activitypub/adapter.rb b/app/lib/activitypub/adapter.rb
index 99f4d9305..94eb2899c 100644
--- a/app/lib/activitypub/adapter.rb
+++ b/app/lib/activitypub/adapter.rb
@@ -1,30 +1,24 @@
 # frozen_string_literal: true
 
 class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base
-  CONTEXT = {
-    '@context': [
-      'https://www.w3.org/ns/activitystreams',
-      'https://w3id.org/security/v1',
-
-      {
-        'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers',
-        'sensitive'                 => 'as:sensitive',
-        'movedTo'                   => { '@id' => 'as:movedTo', '@type' => '@id' },
-        'alsoKnownAs'               => { '@id' => 'as:alsoKnownAs', '@type' => '@id' },
-        'Hashtag'                   => 'as:Hashtag',
-        'ostatus'                   => 'http://ostatus.org#',
-        'atomUri'                   => 'ostatus:atomUri',
-        'inReplyToAtomUri'          => 'ostatus:inReplyToAtomUri',
-        'conversation'              => 'ostatus:conversation',
-        'toot'                      => 'http://joinmastodon.org/ns#',
-        'Emoji'                     => 'toot:Emoji',
-        'focalPoint'                => { '@container' => '@list', '@id' => 'toot:focalPoint' },
-        'featured'                  => { '@id' => 'toot:featured', '@type' => '@id' },
-        'schema'                    => 'http://schema.org#',
-        'PropertyValue'             => 'schema:PropertyValue',
-        'value'                     => 'schema:value',
-      },
-    ],
+  NAMED_CONTEXT_MAP = {
+    activitystreams: 'https://www.w3.org/ns/activitystreams',
+    security: 'https://w3id.org/security/v1',
+  }.freeze
+
+  CONTEXT_EXTENSION_MAP = {
+    manually_approves_followers: { 'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers' },
+    sensitive: { 'sensitive' => 'as:sensitive' },
+    hashtag: { 'Hashtag' => 'as:Hashtag' },
+    moved_to: { 'movedTo' => { '@id' => 'as:movedTo', '@type' => '@id' } },
+    also_known_as: { 'alsoKnownAs' => { '@id' => 'as:alsoKnownAs', '@type' => '@id' } },
+    emoji: { 'toot' => 'http://joinmastodon.org/ns#', 'Emoji' => 'toot:Emoji' },
+    featured: { 'toot' => 'http://joinmastodon.org/ns#', 'featured' => { '@id' => 'toot:featured', '@type' => '@id' } },
+    property_value: { 'schema' => 'http://schema.org#', 'PropertyValue' => 'schema:PropertyValue', 'value' => 'schema:value' },
+    atom_uri: { 'ostatus' => 'http://ostatus.org#', 'atomUri' => 'ostatus:atomUri' },
+    conversation: { 'ostatus' => 'http://ostatus.org#', 'inReplyToAtomUri' => 'ostatus:inReplyToAtomUri', 'conversation' => 'ostatus:conversation' },
+    focal_point: { 'toot' => 'http://joinmastodon.org/ns#', 'focalPoint' => { '@container' => '@list', '@id' => 'toot:focalPoint' } },
+    identity_proof: { 'toot' => 'http://joinmastodon.org/ns#', 'IdentityProof' => 'toot:IdentityProof' },
   }.freeze
 
   def self.default_key_transform
@@ -36,8 +30,36 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base
   end
 
   def serializable_hash(options = nil)
-    options = serialization_options(options)
-    serialized_hash = ActiveModelSerializers::Adapter::Attributes.new(serializer, instance_options).serializable_hash(options)
-    CONTEXT.merge(self.class.transform_key_casing!(serialized_hash, instance_options))
+    options         = serialization_options(options)
+    serialized_hash = serializer.serializable_hash(options)
+    serialized_hash = self.class.transform_key_casing!(serialized_hash, instance_options)
+
+    { '@context' => serialized_context }.merge(serialized_hash)
+  end
+
+  private
+
+  def serialized_context
+    context_array = []
+
+    serializer_options = serializer.send(:instance_options) || {}
+    named_contexts     = [:activitystreams] + serializer._named_contexts.keys + serializer_options.fetch(:named_contexts, {}).keys
+    context_extensions = serializer._context_extensions.keys + serializer_options.fetch(:context_extensions, {}).keys
+
+    named_contexts.each do |key|
+      context_array << NAMED_CONTEXT_MAP[key]
+    end
+
+    extensions = context_extensions.each_with_object({}) do |key, h|
+      h.merge!(CONTEXT_EXTENSION_MAP[key])
+    end
+
+    context_array << extensions unless extensions.empty?
+
+    if context_array.size == 1
+      context_array.first
+    else
+      context_array
+    end
   end
 end
diff --git a/app/lib/activitypub/serializer.rb b/app/lib/activitypub/serializer.rb
new file mode 100644
index 000000000..07bd8c494
--- /dev/null
+++ b/app/lib/activitypub/serializer.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class ActivityPub::Serializer < ActiveModel::Serializer
+  with_options instance_writer: false, instance_reader: true do |serializer|
+    serializer.class_attribute :_named_contexts
+    serializer.class_attribute :_context_extensions
+
+    self._named_contexts     ||= {}
+    self._context_extensions ||= {}
+  end
+
+  def self.inherited(base)
+    super
+
+    base._named_contexts     = _named_contexts.dup
+    base._context_extensions = _context_extensions.dup
+  end
+
+  def self.context(*named_contexts)
+    named_contexts.each do |context|
+      _named_contexts[context] = true
+    end
+  end
+
+  def self.context_extensions(*extension_names)
+    extension_names.each do |extension_name|
+      _context_extensions[extension_name] = true
+    end
+  end
+end
diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
index aadf03b2a..59dfc9004 100644
--- a/app/lib/formatter.rb
+++ b/app/lib/formatter.rb
@@ -19,8 +19,8 @@ class Formatter
 
     raw_content = status.text
 
-    if options[:inline_poll_options] && status.poll
-      raw_content = raw_content + "\n\n" + status.poll.options.map { |title| "[ ] #{title}" }.join("\n")
+    if options[:inline_poll_options] && status.preloadable_poll
+      raw_content = raw_content + "\n\n" + status.preloadable_poll.options.map { |title| "[ ] #{title}" }.join("\n")
     end
 
     return '' if raw_content.blank?
diff --git a/app/lib/language_detector.rb b/app/lib/language_detector.rb
index 70a9084d1..1e90af42d 100644
--- a/app/lib/language_detector.rb
+++ b/app/lib/language_detector.rb
@@ -3,7 +3,7 @@
 class LanguageDetector
   include Singleton
 
-  CHARACTER_THRESHOLD    = 140
+  WORDS_THRESHOLD        = 4
   RELIABLE_CHARACTERS_RE = /[\p{Hebrew}\p{Arabic}\p{Syriac}\p{Thaana}\p{Nko}\p{Han}\p{Katakana}\p{Hiragana}\p{Hangul}]+/m
 
   def initialize
@@ -37,7 +37,7 @@ class LanguageDetector
   end
 
   def sufficient_text_length?(text)
-    text.size >= CHARACTER_THRESHOLD
+    text.split(/\s+/).size >= WORDS_THRESHOLD
   end
 
   def language_specific_character_set?(text)
diff --git a/app/lib/proof_provider/keybase.rb b/app/lib/proof_provider/keybase.rb
index 96322a265..628972e9d 100644
--- a/app/lib/proof_provider/keybase.rb
+++ b/app/lib/proof_provider/keybase.rb
@@ -1,7 +1,8 @@
 # frozen_string_literal: true
 
 class ProofProvider::Keybase
-  BASE_URL = 'https://keybase.io'
+  BASE_URL = ENV.fetch('KEYBASE_BASE_URL', 'https://keybase.io')
+  DOMAIN = ENV.fetch('KEYBASE_DOMAIN', Rails.configuration.x.local_domain)
 
   class Error < StandardError; end
 
@@ -27,7 +28,8 @@ class ProofProvider::Keybase
       return
     end
 
-    return if @proof.provider_username.blank?
+    # Do not perform synchronous validation for remote accounts
+    return if @proof.provider_username.blank? || !@proof.account.local?
 
     if verifier.valid?
       @proof.verified = true
diff --git a/app/lib/proof_provider/keybase/config_serializer.rb b/app/lib/proof_provider/keybase/config_serializer.rb
index 474ea74e2..5241d201f 100644
--- a/app/lib/proof_provider/keybase/config_serializer.rb
+++ b/app/lib/proof_provider/keybase/config_serializer.rb
@@ -2,6 +2,7 @@
 
 class ProofProvider::Keybase::ConfigSerializer < ActiveModel::Serializer
   include RoutingHelper
+  include ActionView::Helpers::TextHelper
 
   attributes :version, :domain, :display_name, :username,
              :brand_color, :logo, :description, :prefill_url,
@@ -13,7 +14,7 @@ class ProofProvider::Keybase::ConfigSerializer < ActiveModel::Serializer
   end
 
   def domain
-    Rails.configuration.x.local_domain
+    ProofProvider::Keybase::DOMAIN
   end
 
   def display_name
@@ -29,11 +30,11 @@ class ProofProvider::Keybase::ConfigSerializer < ActiveModel::Serializer
   end
 
   def description
-    Setting.site_short_description.presence || Setting.site_description.presence || I18n.t('about.about_mastodon_html')
+    strip_tags(Setting.site_short_description.presence || I18n.t('about.about_mastodon_html'))
   end
 
   def username
-    { min: 1, max: 30, re: Account::USERNAME_RE.inspect }
+    { min: 1, max: 30, re: '[a-z0-9_]+([a-z0-9_\.-]+[a-z0-9_]+)?' }
   end
 
   def prefill_url
@@ -65,6 +66,6 @@ class ProofProvider::Keybase::ConfigSerializer < ActiveModel::Serializer
   end
 
   def contact
-    [Setting.site_contact_email.presence].compact
+    [Setting.site_contact_email.presence || 'unknown'].compact
   end
 end
diff --git a/app/lib/proof_provider/keybase/verifier.rb b/app/lib/proof_provider/keybase/verifier.rb
index 86f249dd7..ab1422323 100644
--- a/app/lib/proof_provider/keybase/verifier.rb
+++ b/app/lib/proof_provider/keybase/verifier.rb
@@ -49,14 +49,10 @@ class ProofProvider::Keybase::Verifier
 
   def query_params
     {
-      domain: domain,
+      domain: ProofProvider::Keybase::DOMAIN,
       kb_username: @provider_username,
       username: @local_username,
       sig_hash: @token,
     }
   end
-
-  def domain
-    Rails.configuration.x.local_domain
-  end
 end
diff --git a/app/models/account.rb b/app/models/account.rb
index 6b539f004..a82251d2e 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -98,7 +98,7 @@ class Account < ApplicationRecord
   scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) }
   scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
   scope :searchable, -> { without_suspended.where(moved_to_account_id: nil) }
-  scope :discoverable, -> { searchable.without_silenced.where(discoverable: true).joins(:account_stat).where(AccountStat.arel_table[:followers_count].gteq(MIN_FOLLOWERS_DISCOVERY)).by_recent_status }
+  scope :discoverable, -> { searchable.without_silenced.where(discoverable: true).joins(:account_stat).where(AccountStat.arel_table[:followers_count].gteq(MIN_FOLLOWERS_DISCOVERY)) }
   scope :tagged_with, ->(tag) { joins(:accounts_tags).where(accounts_tags: { tag_id: tag }) }
   scope :by_recent_status, -> { order(Arel.sql('(case when account_stats.last_status_at is null then 1 else 0 end) asc, account_stats.last_status_at desc')) }
   scope :popular, -> { order('account_stats.followers_count desc') }
diff --git a/app/models/account_identity_proof.rb b/app/models/account_identity_proof.rb
index e7a3f97e5..1ac234735 100644
--- a/app/models/account_identity_proof.rb
+++ b/app/models/account_identity_proof.rb
@@ -26,7 +26,7 @@ class AccountIdentityProof < ApplicationRecord
 
   scope :active, -> { where(verified: true, live: true) }
 
-  after_create_commit :queue_worker
+  after_commit :queue_worker, if: :saved_change_to_token?
 
   delegate :refresh!, :on_success_path, :badge, to: :provider_instance
 
diff --git a/app/models/follow_request.rb b/app/models/follow_request.rb
index c5451a050..96ac7eaa5 100644
--- a/app/models/follow_request.rb
+++ b/app/models/follow_request.rb
@@ -26,7 +26,7 @@ class FollowRequest < ApplicationRecord
 
   def authorize!
     account.follow!(target_account, reblogs: show_reblogs, uri: uri)
-    MergeWorker.perform_async(target_account.id, account.id)
+    MergeWorker.perform_async(target_account.id, account.id) if account.local?
     destroy!
   end
 
diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb
index 929c65793..0fcbd0605 100644
--- a/app/models/form/admin_settings.rb
+++ b/app/models/form/admin_settings.rb
@@ -3,57 +3,108 @@
 class Form::AdminSettings
   include ActiveModel::Model
 
-  delegate(
-    :site_contact_username,
-    :site_contact_username=,
-    :site_contact_email,
-    :site_contact_email=,
-    :site_title,
-    :site_title=,
-    :site_short_description,
-    :site_short_description=,
-    :site_description,
-    :site_description=,
-    :site_extended_description,
-    :site_extended_description=,
-    :site_terms,
-    :site_terms=,
-    :registrations_mode,
-    :registrations_mode=,
-    :closed_registrations_message,
-    :closed_registrations_message=,
-    :open_deletion,
-    :open_deletion=,
-    :timeline_preview,
-    :timeline_preview=,
-    :show_staff_badge,
-    :show_staff_badge=,
-    :bootstrap_timeline_accounts,
-    :bootstrap_timeline_accounts=,
-    :hide_followers_count,
-    :hide_followers_count=,
-    :flavour,
-    :flavour=,
-    :skin,
-    :skin=,
-    :min_invite_role,
-    :min_invite_role=,
-    :activity_api_enabled,
-    :activity_api_enabled=,
-    :peers_api_enabled,
-    :peers_api_enabled=,
-    :show_known_fediverse_at_about_page,
-    :show_known_fediverse_at_about_page=,
-    :preview_sensitive_media,
-    :preview_sensitive_media=,
-    :custom_css,
-    :custom_css=,
-    :profile_directory,
-    :profile_directory=,
-    to: Setting
-  )
+  KEYS = %i(
+    site_contact_username
+    site_contact_email
+    site_title
+    site_short_description
+    site_description
+    site_extended_description
+    site_terms
+    registrations_mode
+    closed_registrations_message
+    open_deletion
+    timeline_preview
+    show_staff_badge
+    bootstrap_timeline_accounts
+    flavour
+    skin
+    min_invite_role
+    activity_api_enabled
+    peers_api_enabled
+    show_known_fediverse_at_about_page
+    preview_sensitive_media
+    custom_css
+    profile_directory
+    hide_followers_count
+    flavour_and_skin
+  ).freeze
+
+  BOOLEAN_KEYS = %i(
+    open_deletion
+    timeline_preview
+    show_staff_badge
+    activity_api_enabled
+    peers_api_enabled
+    show_known_fediverse_at_about_page
+    preview_sensitive_media
+    profile_directory
+    hide_followers_count
+  ).freeze
+
+  UPLOAD_KEYS = %i(
+    thumbnail
+    hero
+    mascot
+  ).freeze
+
+  PSEUDO_KEYS = %i(
+    flavour_and_skin
+  ).freeze
+
+  attr_accessor(*KEYS)
+
+  validates :site_short_description, :site_description, :site_extended_description, :site_terms, :closed_registrations_message, html: true
+  validates :registrations_mode, inclusion: { in: %w(open approved none) }
+  validates :min_invite_role, inclusion: { in: %w(disabled user moderator admin) }
+  validates :site_contact_email, :site_contact_username, presence: true
+  validates :site_contact_username, existing_username: true
+  validates :bootstrap_timeline_accounts, existing_username: { multiple: true }
+
+  def initialize(_attributes = {})
+    super
+    initialize_attributes
+  end
+
+  def save
+    return false unless valid?
+
+    KEYS.each do |key|
+      next if PSEUDO_KEYS.include?(key)
+      value = instance_variable_get("@#{key}")
+
+      if UPLOAD_KEYS.include?(key)
+        upload = SiteUpload.where(var: key).first_or_initialize(var: key)
+        upload.update(file: value)
+      else
+        setting = Setting.where(var: key).first_or_initialize(var: key)
+        setting.update(value: typecast_value(key, value))
+      end
+    end
+  end
 
   def flavour_and_skin
     "#{Setting.flavour}/#{Setting.skin}"
   end
+
+  def flavour_and_skin=(value)
+    @flavour, @skin = value.split('/', 2)
+  end
+
+  private
+
+  def initialize_attributes
+    KEYS.each do |key|
+      next if PSEUDO_KEYS.include?(key)
+      instance_variable_set("@#{key}", Setting.public_send(key)) if instance_variable_get("@#{key}").nil?
+    end
+  end
+
+  def typecast_value(key, value)
+    if BOOLEAN_KEYS.include?(key)
+      value == '1'
+    else
+      value
+    end
+  end
 end
diff --git a/app/models/instance.rb b/app/models/instance.rb
index 7448d465c..7bf000d40 100644
--- a/app/models/instance.rb
+++ b/app/models/instance.rb
@@ -7,7 +7,7 @@ class Instance
 
   def initialize(resource)
     @domain         = resource.domain
-    @accounts_count = resource.accounts_count
+    @accounts_count = resource.is_a?(DomainBlock) ? nil : resource.accounts_count
     @domain_block   = resource.is_a?(DomainBlock) ? resource : DomainBlock.find_by(domain: domain)
   end
 
@@ -15,6 +15,10 @@ class Instance
     Rails.cache.fetch("#{cache_key}/sample_accounts", expires_in: 12.hours) { Account.where(domain: domain).searchable.joins(:account_stat).popular.limit(3) }
   end
 
+  def cached_accounts_count
+    @accounts_count || Rails.cache.fetch("#{cache_key}/count", expires_in: 12.hours) { Account.where(domain: domain).count }
+  end
+
   def to_param
     domain
   end
diff --git a/app/models/notification.rb b/app/models/notification.rb
index 982136c05..300269e24 100644
--- a/app/models/notification.rb
+++ b/app/models/notification.rb
@@ -25,7 +25,7 @@ class Notification < ApplicationRecord
     poll:           'Poll',
   }.freeze
 
-  STATUS_INCLUDES = [:account, :application, :media_attachments, :tags, active_mentions: :account, reblog: [:account, :application, :media_attachments, :tags, active_mentions: :account]].freeze
+  STATUS_INCLUDES = [:account, :application, :preloadable_poll, :media_attachments, :tags, active_mentions: :account, reblog: [:account, :application, :preloadable_poll, :media_attachments, :tags, active_mentions: :account]].freeze
 
   belongs_to :account, optional: true
   belongs_to :from_account, class_name: 'Account', optional: true
diff --git a/app/models/status.rb b/app/models/status.rb
index c049401e8..e7fa0220b 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -47,7 +47,7 @@ class Status < ApplicationRecord
   belongs_to :account, inverse_of: :statuses
   belongs_to :in_reply_to_account, foreign_key: 'in_reply_to_account_id', class_name: 'Account', optional: true
   belongs_to :conversation, optional: true
-  belongs_to :poll, optional: true
+  belongs_to :preloadable_poll, class_name: 'Poll', foreign_key: 'poll_id', optional: true
 
   belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies, optional: true
   belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, optional: true
@@ -66,7 +66,7 @@ class Status < ApplicationRecord
   has_one :notification, as: :activity, dependent: :destroy
   has_one :stream_entry, as: :activity, inverse_of: :status
   has_one :status_stat, inverse_of: :status
-  has_one :owned_poll, class_name: 'Poll', inverse_of: :status, dependent: :destroy
+  has_one :poll, inverse_of: :status, dependent: :destroy
 
   validates :uri, uniqueness: true, presence: true, unless: :local?
   validates :text, presence: true, unless: -> { with_media? || reblog? }
@@ -75,7 +75,7 @@ class Status < ApplicationRecord
   validates :reblog, uniqueness: { scope: :account }, if: :reblog?
   validates :visibility, exclusion: { in: %w(direct limited) }, if: :reblog?
 
-  accepts_nested_attributes_for :owned_poll
+  accepts_nested_attributes_for :poll
 
   default_scope { recent }
 
@@ -112,7 +112,7 @@ class Status < ApplicationRecord
                    :tags,
                    :preview_cards,
                    :stream_entry,
-                   :poll,
+                   :preloadable_poll,
                    account: :account_stat,
                    active_mentions: { account: :account_stat },
                    reblog: [
@@ -123,7 +123,7 @@ class Status < ApplicationRecord
                      :media_attachments,
                      :conversation,
                      :status_stat,
-                     :poll,
+                     :preloadable_poll,
                      account: :account_stat,
                      active_mentions: { account: :account_stat },
                    ],
@@ -219,10 +219,11 @@ class Status < ApplicationRecord
 
   def emojis
     return @emojis if defined?(@emojis)
-    fields = [spoiler_text, text]
-    fields += owned_poll.options unless owned_poll.nil?
+
+    fields  = [spoiler_text, text]
+    fields += preloadable_poll.options unless preloadable_poll.nil?
+
     @emojis = CustomEmoji.from_text(fields.join(' '), account.domain)
-    @emojis
   end
 
   def mark_for_mass_destruction!
@@ -473,7 +474,7 @@ class Status < ApplicationRecord
   end
 
   def set_poll_id
-    update_column(:poll_id, owned_poll.id) unless owned_poll.nil?
+    update_column(:poll_id, poll.id) unless poll.nil?
   end
 
   def set_visibility
diff --git a/app/models/user.rb b/app/models/user.rb
index 47657a670..66c1543ff 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -124,7 +124,8 @@ class User < ApplicationRecord
   end
 
   def confirm
-    new_user = !confirmed?
+    new_user      = !confirmed?
+    self.approved = true if open_registrations?
 
     super
 
@@ -136,7 +137,8 @@ class User < ApplicationRecord
   end
 
   def confirm!
-    new_user = !confirmed?
+    new_user      = !confirmed?
+    self.approved = true if open_registrations?
 
     skip_confirmation!
     save!
@@ -264,7 +266,11 @@ class User < ApplicationRecord
   private
 
   def set_approved
-    self.approved = Setting.registrations_mode == 'open' || invited?
+    self.approved = open_registrations? || invited?
+  end
+
+  def open_registrations?
+    Setting.registrations_mode == 'open'
   end
 
   def sanitize_languages
diff --git a/app/presenters/account_relationships_presenter.rb b/app/presenters/account_relationships_presenter.rb
index e4aaa65f6..b05673a3d 100644
--- a/app/presenters/account_relationships_presenter.rb
+++ b/app/presenters/account_relationships_presenter.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class AccountRelationshipsPresenter
-  attr_reader :following, :followed_by, :blocking,
+  attr_reader :following, :followed_by, :blocking, :blocked_by,
               :muting, :requested, :domain_blocking,
               :endorsed
 
@@ -12,6 +12,7 @@ class AccountRelationshipsPresenter
     @following       = cached[:following].merge(Account.following_map(@uncached_account_ids, @current_account_id))
     @followed_by     = cached[:followed_by].merge(Account.followed_by_map(@uncached_account_ids, @current_account_id))
     @blocking        = cached[:blocking].merge(Account.blocking_map(@uncached_account_ids, @current_account_id))
+    @blocked_by      = cached[:blocked_by].merge(Account.blocked_by_map(@uncached_account_ids, @current_account_id))
     @muting          = cached[:muting].merge(Account.muting_map(@uncached_account_ids, @current_account_id))
     @requested       = cached[:requested].merge(Account.requested_map(@uncached_account_ids, @current_account_id))
     @domain_blocking = cached[:domain_blocking].merge(Account.domain_blocking_map(@uncached_account_ids, @current_account_id))
@@ -22,6 +23,7 @@ class AccountRelationshipsPresenter
     @following.merge!(options[:following_map] || {})
     @followed_by.merge!(options[:followed_by_map] || {})
     @blocking.merge!(options[:blocking_map] || {})
+    @blocked_by.merge!(options[:blocked_by_map] || {})
     @muting.merge!(options[:muting_map] || {})
     @requested.merge!(options[:requested_map] || {})
     @domain_blocking.merge!(options[:domain_blocking_map] || {})
@@ -37,6 +39,7 @@ class AccountRelationshipsPresenter
       following: {},
       followed_by: {},
       blocking: {},
+      blocked_by: {},
       muting: {},
       requested: {},
       domain_blocking: {},
@@ -64,6 +67,7 @@ class AccountRelationshipsPresenter
         following:       { account_id => following[account_id] },
         followed_by:     { account_id => followed_by[account_id] },
         blocking:        { account_id => blocking[account_id] },
+        blocked_by:      { account_id => blocked_by[account_id] },
         muting:          { account_id => muting[account_id] },
         requested:       { account_id => requested[account_id] },
         domain_blocking: { account_id => domain_blocking[account_id] },
diff --git a/app/presenters/instance_presenter.rb b/app/presenters/instance_presenter.rb
index 94a2c1692..d234516e0 100644
--- a/app/presenters/instance_presenter.rb
+++ b/app/presenters/instance_presenter.rb
@@ -8,6 +8,7 @@ class InstancePresenter
     :site_description,
     :site_extended_description,
     :site_terms,
+    :closed_registrations_message,
     to: Setting
   )
 
diff --git a/app/serializers/activitypub/accept_follow_serializer.rb b/app/serializers/activitypub/accept_follow_serializer.rb
index 3e23591a5..1c1c6ab73 100644
--- a/app/serializers/activitypub/accept_follow_serializer.rb
+++ b/app/serializers/activitypub/accept_follow_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::AcceptFollowSerializer < ActiveModel::Serializer
+class ActivityPub::AcceptFollowSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor
 
   has_one :object, serializer: ActivityPub::FollowSerializer
diff --git a/app/serializers/activitypub/activity_serializer.rb b/app/serializers/activitypub/activity_serializer.rb
index c001e28aa..c06d5c87c 100644
--- a/app/serializers/activitypub/activity_serializer.rb
+++ b/app/serializers/activitypub/activity_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::ActivitySerializer < ActiveModel::Serializer
+class ActivityPub::ActivitySerializer < ActivityPub::Serializer
   attributes :id, :type, :actor, :published, :to, :cc
 
   has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, if: :serialize_object?
diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb
index 6746c1782..0644219fb 100644
--- a/app/serializers/activitypub/actor_serializer.rb
+++ b/app/serializers/activitypub/actor_serializer.rb
@@ -1,8 +1,13 @@
 # frozen_string_literal: true
 
-class ActivityPub::ActorSerializer < ActiveModel::Serializer
+class ActivityPub::ActorSerializer < ActivityPub::Serializer
   include RoutingHelper
 
+  context :security
+
+  context_extensions :manually_approves_followers, :featured, :also_known_as,
+                     :moved_to, :property_value, :hashtag, :emoji, :identity_proof
+
   attributes :id, :type, :following, :followers,
              :inbox, :outbox, :featured,
              :preferred_username, :name, :summary,
@@ -16,7 +21,7 @@ class ActivityPub::ActorSerializer < ActiveModel::Serializer
   attribute :moved_to, if: :moved?
   attribute :also_known_as, if: :also_known_as?
 
-  class EndpointsSerializer < ActiveModel::Serializer
+  class EndpointsSerializer < ActivityPub::Serializer
     include RoutingHelper
 
     attributes :shared_inbox
@@ -110,7 +115,7 @@ class ActivityPub::ActorSerializer < ActiveModel::Serializer
   end
 
   def virtual_attachments
-    object.fields
+    object.fields + object.identity_proofs.active
   end
 
   def moved_to
@@ -124,7 +129,7 @@ class ActivityPub::ActorSerializer < ActiveModel::Serializer
   class CustomEmojiSerializer < ActivityPub::EmojiSerializer
   end
 
-  class TagSerializer < ActiveModel::Serializer
+  class TagSerializer < ActivityPub::Serializer
     include RoutingHelper
 
     attributes :type, :href, :name
@@ -142,7 +147,7 @@ class ActivityPub::ActorSerializer < ActiveModel::Serializer
     end
   end
 
-  class Account::FieldSerializer < ActiveModel::Serializer
+  class Account::FieldSerializer < ActivityPub::Serializer
     attributes :type, :name, :value
 
     def type
@@ -153,4 +158,24 @@ class ActivityPub::ActorSerializer < ActiveModel::Serializer
       Formatter.instance.format_field(object.account, object.value)
     end
   end
+
+  class AccountIdentityProofSerializer < ActivityPub::Serializer
+    attributes :type, :name, :signature_algorithm, :signature_value
+
+    def type
+      'IdentityProof'
+    end
+
+    def name
+      object.provider_username
+    end
+
+    def signature_algorithm
+      object.provider
+    end
+
+    def signature_value
+      object.token
+    end
+  end
 end
diff --git a/app/serializers/activitypub/add_serializer.rb b/app/serializers/activitypub/add_serializer.rb
index c0906e8d0..6f5aab17f 100644
--- a/app/serializers/activitypub/add_serializer.rb
+++ b/app/serializers/activitypub/add_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::AddSerializer < ActiveModel::Serializer
+class ActivityPub::AddSerializer < ActivityPub::Serializer
   include RoutingHelper
 
   attributes :type, :actor, :target
diff --git a/app/serializers/activitypub/block_serializer.rb b/app/serializers/activitypub/block_serializer.rb
index 624ce2fce..e6c69329d 100644
--- a/app/serializers/activitypub/block_serializer.rb
+++ b/app/serializers/activitypub/block_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::BlockSerializer < ActiveModel::Serializer
+class ActivityPub::BlockSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor
   attribute :virtual_object, key: :object
 
diff --git a/app/serializers/activitypub/collection_serializer.rb b/app/serializers/activitypub/collection_serializer.rb
index b03609957..da1ba735f 100644
--- a/app/serializers/activitypub/collection_serializer.rb
+++ b/app/serializers/activitypub/collection_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::CollectionSerializer < ActiveModel::Serializer
+class ActivityPub::CollectionSerializer < ActivityPub::Serializer
   def self.serializer_for(model, options)
     return ActivityPub::NoteSerializer if model.class.name == 'Status'
     return ActivityPub::CollectionSerializer if model.class.name == 'ActivityPub::CollectionPresenter'
diff --git a/app/serializers/activitypub/delete_actor_serializer.rb b/app/serializers/activitypub/delete_actor_serializer.rb
index ddf59be97..a6c5e2385 100644
--- a/app/serializers/activitypub/delete_actor_serializer.rb
+++ b/app/serializers/activitypub/delete_actor_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::DeleteActorSerializer < ActiveModel::Serializer
+class ActivityPub::DeleteActorSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor, :to
   attribute :virtual_object, key: :object
 
diff --git a/app/serializers/activitypub/delete_serializer.rb b/app/serializers/activitypub/delete_serializer.rb
index 5012a8383..a7d5bd469 100644
--- a/app/serializers/activitypub/delete_serializer.rb
+++ b/app/serializers/activitypub/delete_serializer.rb
@@ -1,7 +1,9 @@
 # frozen_string_literal: true
 
-class ActivityPub::DeleteSerializer < ActiveModel::Serializer
-  class TombstoneSerializer < ActiveModel::Serializer
+class ActivityPub::DeleteSerializer < ActivityPub::Serializer
+  class TombstoneSerializer < ActivityPub::Serializer
+    context_extensions :atom_uri
+
     attributes :id, :type, :atom_uri
 
     def id
diff --git a/app/serializers/activitypub/emoji_serializer.rb b/app/serializers/activitypub/emoji_serializer.rb
index 7b06b1e5d..4dc38f3ea 100644
--- a/app/serializers/activitypub/emoji_serializer.rb
+++ b/app/serializers/activitypub/emoji_serializer.rb
@@ -1,8 +1,10 @@
 # frozen_string_literal: true
 
-class ActivityPub::EmojiSerializer < ActiveModel::Serializer
+class ActivityPub::EmojiSerializer < ActivityPub::Serializer
   include RoutingHelper
 
+  context_extensions :emoji
+
   attributes :id, :type, :name, :updated
 
   has_one :icon, serializer: ActivityPub::ImageSerializer
diff --git a/app/serializers/activitypub/flag_serializer.rb b/app/serializers/activitypub/flag_serializer.rb
index 1e7a46dd9..2f2a707d3 100644
--- a/app/serializers/activitypub/flag_serializer.rb
+++ b/app/serializers/activitypub/flag_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::FlagSerializer < ActiveModel::Serializer
+class ActivityPub::FlagSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor, :content
   attribute :virtual_object, key: :object
 
diff --git a/app/serializers/activitypub/follow_serializer.rb b/app/serializers/activitypub/follow_serializer.rb
index bb204ee8f..9228d7716 100644
--- a/app/serializers/activitypub/follow_serializer.rb
+++ b/app/serializers/activitypub/follow_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::FollowSerializer < ActiveModel::Serializer
+class ActivityPub::FollowSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor
   attribute :virtual_object, key: :object
 
diff --git a/app/serializers/activitypub/image_serializer.rb b/app/serializers/activitypub/image_serializer.rb
index 3c08f77e8..1060f9691 100644
--- a/app/serializers/activitypub/image_serializer.rb
+++ b/app/serializers/activitypub/image_serializer.rb
@@ -1,8 +1,10 @@
 # frozen_string_literal: true
 
-class ActivityPub::ImageSerializer < ActiveModel::Serializer
+class ActivityPub::ImageSerializer < ActivityPub::Serializer
   include RoutingHelper
 
+  context_extensions :focal_point
+
   attributes :type, :media_type, :url
   attribute :focal_point, if: :focal_point?
 
diff --git a/app/serializers/activitypub/like_serializer.rb b/app/serializers/activitypub/like_serializer.rb
index c1a7ff6f6..0f170ddb4 100644
--- a/app/serializers/activitypub/like_serializer.rb
+++ b/app/serializers/activitypub/like_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::LikeSerializer < ActiveModel::Serializer
+class ActivityPub::LikeSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor
   attribute :virtual_object, key: :object
 
diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb
index 553f333d8..d11cfa59a 100644
--- a/app/serializers/activitypub/note_serializer.rb
+++ b/app/serializers/activitypub/note_serializer.rb
@@ -1,6 +1,9 @@
 # frozen_string_literal: true
 
-class ActivityPub::NoteSerializer < ActiveModel::Serializer
+class ActivityPub::NoteSerializer < ActivityPub::Serializer
+  context_extensions :atom_uri, :conversation, :sensitive,
+                     :hashtag, :emoji, :focal_point
+
   attributes :id, :type, :summary,
              :in_reply_to, :published, :url,
              :attributed_to, :to, :cc, :sensitive,
@@ -26,7 +29,7 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
   end
 
   def type
-    object.poll ? 'Question' : 'Note'
+    object.preloadable_poll ? 'Question' : 'Note'
   end
 
   def summary
@@ -122,32 +125,32 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
   end
 
   def poll_options
-    object.poll.loaded_options
+    object.preloadable_poll.loaded_options
   end
 
   def poll_and_multiple?
-    object.poll&.multiple?
+    object.preloadable_poll&.multiple?
   end
 
   def poll_and_not_multiple?
-    object.poll && !object.poll.multiple?
+    object.preloadable_poll && !object.preloadable_poll.multiple?
   end
 
   def closed
-    object.poll.expires_at.iso8601
+    object.preloadable_poll.expires_at.iso8601
   end
 
   alias end_time closed
 
   def poll_and_expires?
-    object.poll&.expires_at&.present?
+    object.preloadable_poll&.expires_at&.present?
   end
 
   def poll_and_expired?
-    object.poll&.expired?
+    object.preloadable_poll&.expired?
   end
 
-  class MediaAttachmentSerializer < ActiveModel::Serializer
+  class MediaAttachmentSerializer < ActivityPub::Serializer
     include RoutingHelper
 
     attributes :type, :media_type, :url, :name
@@ -178,7 +181,7 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
     end
   end
 
-  class MentionSerializer < ActiveModel::Serializer
+  class MentionSerializer < ActivityPub::Serializer
     attributes :type, :href, :name
 
     def type
@@ -194,7 +197,7 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
     end
   end
 
-  class TagSerializer < ActiveModel::Serializer
+  class TagSerializer < ActivityPub::Serializer
     include RoutingHelper
 
     attributes :type, :href, :name
@@ -215,8 +218,8 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
   class CustomEmojiSerializer < ActivityPub::EmojiSerializer
   end
 
-  class OptionSerializer < ActiveModel::Serializer
-    class RepliesSerializer < ActiveModel::Serializer
+  class OptionSerializer < ActivityPub::Serializer
+    class RepliesSerializer < ActivityPub::Serializer
       attributes :type, :total_items
 
       def type
diff --git a/app/serializers/activitypub/public_key_serializer.rb b/app/serializers/activitypub/public_key_serializer.rb
index 38e9e93ba..62ed49e81 100644
--- a/app/serializers/activitypub/public_key_serializer.rb
+++ b/app/serializers/activitypub/public_key_serializer.rb
@@ -1,6 +1,8 @@
 # frozen_string_literal: true
 
-class ActivityPub::PublicKeySerializer < ActiveModel::Serializer
+class ActivityPub::PublicKeySerializer < ActivityPub::Serializer
+  context :security
+
   attributes :id, :owner, :public_key_pem
 
   def id
diff --git a/app/serializers/activitypub/reject_follow_serializer.rb b/app/serializers/activitypub/reject_follow_serializer.rb
index 7814f4f57..4996c9a3c 100644
--- a/app/serializers/activitypub/reject_follow_serializer.rb
+++ b/app/serializers/activitypub/reject_follow_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::RejectFollowSerializer < ActiveModel::Serializer
+class ActivityPub::RejectFollowSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor
 
   has_one :object, serializer: ActivityPub::FollowSerializer
diff --git a/app/serializers/activitypub/remove_serializer.rb b/app/serializers/activitypub/remove_serializer.rb
index c2a5ae1b3..7fefda59d 100644
--- a/app/serializers/activitypub/remove_serializer.rb
+++ b/app/serializers/activitypub/remove_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::RemoveSerializer < ActiveModel::Serializer
+class ActivityPub::RemoveSerializer < ActivityPub::Serializer
   include RoutingHelper
 
   attributes :type, :actor, :target
diff --git a/app/serializers/activitypub/undo_announce_serializer.rb b/app/serializers/activitypub/undo_announce_serializer.rb
index 4fc042727..6758af679 100644
--- a/app/serializers/activitypub/undo_announce_serializer.rb
+++ b/app/serializers/activitypub/undo_announce_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::UndoAnnounceSerializer < ActiveModel::Serializer
+class ActivityPub::UndoAnnounceSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor, :to
 
   has_one :object, serializer: ActivityPub::ActivitySerializer
diff --git a/app/serializers/activitypub/undo_block_serializer.rb b/app/serializers/activitypub/undo_block_serializer.rb
index 2f43d8402..b4f049377 100644
--- a/app/serializers/activitypub/undo_block_serializer.rb
+++ b/app/serializers/activitypub/undo_block_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::UndoBlockSerializer < ActiveModel::Serializer
+class ActivityPub::UndoBlockSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor
 
   has_one :object, serializer: ActivityPub::BlockSerializer
diff --git a/app/serializers/activitypub/undo_follow_serializer.rb b/app/serializers/activitypub/undo_follow_serializer.rb
index e5b7f143d..9b3e0ca3c 100644
--- a/app/serializers/activitypub/undo_follow_serializer.rb
+++ b/app/serializers/activitypub/undo_follow_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::UndoFollowSerializer < ActiveModel::Serializer
+class ActivityPub::UndoFollowSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor
 
   has_one :object, serializer: ActivityPub::FollowSerializer
diff --git a/app/serializers/activitypub/undo_like_serializer.rb b/app/serializers/activitypub/undo_like_serializer.rb
index 25f4ccaae..20c786cb7 100644
--- a/app/serializers/activitypub/undo_like_serializer.rb
+++ b/app/serializers/activitypub/undo_like_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::UndoLikeSerializer < ActiveModel::Serializer
+class ActivityPub::UndoLikeSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor
 
   has_one :object, serializer: ActivityPub::LikeSerializer
diff --git a/app/serializers/activitypub/update_poll_serializer.rb b/app/serializers/activitypub/update_poll_serializer.rb
index f7933346f..b894f309f 100644
--- a/app/serializers/activitypub/update_poll_serializer.rb
+++ b/app/serializers/activitypub/update_poll_serializer.rb
@@ -1,12 +1,12 @@
 # frozen_string_literal: true
 
-class ActivityPub::UpdatePollSerializer < ActiveModel::Serializer
+class ActivityPub::UpdatePollSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor, :to
 
   has_one :object, serializer: ActivityPub::NoteSerializer
 
   def id
-    [ActivityPub::TagManager.instance.uri_for(object), '#updates/', object.poll.updated_at.to_i].join
+    [ActivityPub::TagManager.instance.uri_for(object), '#updates/', object.preloadable_poll.updated_at.to_i].join
   end
 
   def type
diff --git a/app/serializers/activitypub/update_serializer.rb b/app/serializers/activitypub/update_serializer.rb
index 48d7a1929..a5eb857d3 100644
--- a/app/serializers/activitypub/update_serializer.rb
+++ b/app/serializers/activitypub/update_serializer.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-class ActivityPub::UpdateSerializer < ActiveModel::Serializer
+class ActivityPub::UpdateSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor, :to
 
   has_one :object, serializer: ActivityPub::ActorSerializer
diff --git a/app/serializers/activitypub/vote_serializer.rb b/app/serializers/activitypub/vote_serializer.rb
index 248190404..71ef5c77e 100644
--- a/app/serializers/activitypub/vote_serializer.rb
+++ b/app/serializers/activitypub/vote_serializer.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
-class ActivityPub::VoteSerializer < ActiveModel::Serializer
-  class NoteSerializer < ActiveModel::Serializer
+class ActivityPub::VoteSerializer < ActivityPub::Serializer
+  class NoteSerializer < ActivityPub::Serializer
     attributes :id, :type, :name, :attributed_to,
                :in_reply_to, :to
 
diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb
index cc8b9a4d4..28127437d 100644
--- a/app/serializers/manifest_serializer.rb
+++ b/app/serializers/manifest_serializer.rb
@@ -18,7 +18,7 @@ class ManifestSerializer < ActiveModel::Serializer
   end
 
   def description
-    strip_tags(object.site_description.presence || I18n.t('about.about_mastodon_html'))
+    strip_tags(object.site_short_description.presence || I18n.t('about.about_mastodon_html'))
   end
 
   def icons
diff --git a/app/serializers/oembed_serializer.rb b/app/serializers/oembed_serializer.rb
index 0c8350e2d..01689633b 100644
--- a/app/serializers/oembed_serializer.rb
+++ b/app/serializers/oembed_serializer.rb
@@ -43,6 +43,7 @@ class OEmbedSerializer < ActiveModel::Serializer
       style: 'max-width: 100%; border: 0',
       width: width,
       height: height,
+      allowfullscreen: true,
     }
 
     content_tag(:iframe, nil, attributes) + content_tag(:script, nil, src: full_asset_url('embed.js', skip_pipeline: true), async: true)
diff --git a/app/serializers/rest/identity_proof_serializer.rb b/app/serializers/rest/identity_proof_serializer.rb
new file mode 100644
index 000000000..0e7415935
--- /dev/null
+++ b/app/serializers/rest/identity_proof_serializer.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class REST::IdentityProofSerializer < ActiveModel::Serializer
+  attributes :provider, :provider_username, :updated_at, :proof_url, :profile_url
+
+  def proof_url
+    object.badge.proof_url
+  end
+
+  def profile_url
+    object.badge.profile_url
+  end
+
+  def provider
+    object.provider.capitalize
+  end
+end
diff --git a/app/serializers/rest/relationship_serializer.rb b/app/serializers/rest/relationship_serializer.rb
index c6c722a54..1a3fd915c 100644
--- a/app/serializers/rest/relationship_serializer.rb
+++ b/app/serializers/rest/relationship_serializer.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class REST::RelationshipSerializer < ActiveModel::Serializer
-  attributes :id, :following, :showing_reblogs, :followed_by, :blocking,
+  attributes :id, :following, :showing_reblogs, :followed_by, :blocking, :blocked_by,
              :muting, :muting_notifications, :requested, :domain_blocking,
              :endorsed
 
@@ -27,6 +27,10 @@ class REST::RelationshipSerializer < ActiveModel::Serializer
     instance_options[:relationships].blocking[object.id] || false
   end
 
+  def blocked_by
+    instance_options[:relationships].blocked_by[object.id] || false
+  end
+
   def muting
     instance_options[:relationships].muting[object.id] ? true : false
   end
diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb
index 7185121d6..a7b797368 100644
--- a/app/serializers/rest/status_serializer.rb
+++ b/app/serializers/rest/status_serializer.rb
@@ -23,7 +23,7 @@ class REST::StatusSerializer < ActiveModel::Serializer
   has_many :emojis, serializer: REST::CustomEmojiSerializer
 
   has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer
-  has_one :poll, serializer: REST::PollSerializer
+  has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer
 
   def id
     object.id.to_s
diff --git a/app/services/activitypub/fetch_remote_poll_service.rb b/app/services/activitypub/fetch_remote_poll_service.rb
index 44a23712c..854a32d05 100644
--- a/app/services/activitypub/fetch_remote_poll_service.rb
+++ b/app/services/activitypub/fetch_remote_poll_service.rb
@@ -5,6 +5,7 @@ class ActivityPub::FetchRemotePollService < BaseService
 
   def call(poll, on_behalf_of = nil)
     json = fetch_resource(poll.status.uri, true, on_behalf_of)
+    return unless supported_context?(json)
     ActivityPub::ProcessPollService.new.call(poll, json)
   end
 end
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index 5e3308428..6d0609ca0 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -24,6 +24,7 @@ class ActivityPub::ProcessAccountService < BaseService
         create_account if @account.nil?
         update_account
         process_tags
+        process_attachments
       else
         raise Mastodon::RaceConditionError
       end
@@ -151,7 +152,7 @@ class ActivityPub::ProcessAccountService < BaseService
 
   def property_values
     return unless @json['attachment'].is_a?(Array)
-    @json['attachment'].select { |attachment| attachment['type'] == 'PropertyValue' }.map { |attachment| attachment.slice('name', 'value') }
+    as_array(@json['attachment']).select { |attachment| attachment['type'] == 'PropertyValue' }.map { |attachment| attachment.slice('name', 'value') }
   end
 
   def mismatching_origin?(url)
@@ -231,6 +232,23 @@ class ActivityPub::ProcessAccountService < BaseService
     end
   end
 
+  def process_attachments
+    return if @json['attachment'].blank?
+
+    previous_proofs = @account.identity_proofs.to_a
+    current_proofs  = []
+
+    as_array(@json['attachment']).each do |attachment|
+      next unless equals_or_includes?(attachment['type'], 'IdentityProof')
+      current_proofs << process_identity_proof(attachment)
+    end
+
+    previous_proofs.each do |previous_proof|
+      next if current_proofs.any? { |current_proof| current_proof.id == previous_proof.id }
+      previous_proof.delete
+    end
+  end
+
   def process_emoji(tag)
     return if skip_download?
     return if tag['name'].blank? || tag['icon'].blank? || tag['icon']['url'].blank?
@@ -247,4 +265,12 @@ class ActivityPub::ProcessAccountService < BaseService
     emoji.image_remote_url = image_url
     emoji.save
   end
+
+  def process_identity_proof(attachment)
+    provider          = attachment['signatureAlgorithm']
+    provider_username = attachment['name']
+    token             = attachment['signatureValue']
+
+    @account.identity_proofs.where(provider: provider, provider_username: provider_username).find_or_create_by(provider: provider, provider_username: provider_username, token: token)
+  end
 end
diff --git a/app/services/activitypub/process_poll_service.rb b/app/services/activitypub/process_poll_service.rb
index ee248169d..61357abd3 100644
--- a/app/services/activitypub/process_poll_service.rb
+++ b/app/services/activitypub/process_poll_service.rb
@@ -5,7 +5,7 @@ class ActivityPub::ProcessPollService < BaseService
 
   def call(poll, json)
     @json = json
-    return unless supported_context? && expected_type?
+    return unless expected_type?
 
     previous_expires_at = poll.expires_at
 
@@ -54,10 +54,6 @@ class ActivityPub::ProcessPollService < BaseService
 
   private
 
-  def supported_context?
-    super(@json)
-  end
-
   def expected_type?
     equals_or_includes_any?(@json['type'], %w(Question))
   end
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index 820c553c9..333bf88d8 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -162,7 +162,7 @@ class PostStatusService < BaseService
       text: @text,
       media_attachments: @media || [],
       thread: @in_reply_to,
-      owned_poll_attributes: poll_attributes,
+      poll_attributes: poll_attributes,
       sensitive: (@options[:sensitive].nil? ? @account.user&.setting_default_sensitive : @options[:sensitive]) || @options[:spoiler_text].present?,
       spoiler_text: @options[:spoiler_text] || '',
       visibility: @visibility,
diff --git a/app/services/vote_service.rb b/app/services/vote_service.rb
index 0cace6c00..81af9ef3a 100644
--- a/app/services/vote_service.rb
+++ b/app/services/vote_service.rb
@@ -11,14 +11,14 @@ class VoteService < BaseService
     @choices = choices
     @votes   = []
 
-    return if @poll.expired?
-
     ApplicationRecord.transaction do
       @choices.each do |choice|
         @votes << @poll.votes.create!(account: @account, choice: choice)
       end
     end
 
+    ActivityTracker.increment('activity:interactions')
+
     if @poll.account.local?
       distribute_poll!
     else
diff --git a/app/validators/existing_username_validator.rb b/app/validators/existing_username_validator.rb
new file mode 100644
index 000000000..4388a0c98
--- /dev/null
+++ b/app/validators/existing_username_validator.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class ExistingUsernameValidator < ActiveModel::EachValidator
+  def validate_each(record, attribute, value)
+    return if value.blank?
+
+    if options[:multiple]
+      missing_usernames = value.split(',').map { |username| username unless Account.find_local(username) }.compact
+      record.errors.add(attribute, I18n.t('existing_username_validator.not_found_multiple', usernames: missing_usernames.join(', '))) if missing_usernames.any?
+    else
+      record.errors.add(attribute, I18n.t('existing_username_validator.not_found')) unless Account.find_local(value)
+    end
+  end
+
+  private
+
+  def valid_html?(str)
+    Nokogiri::HTML.fragment(str).to_s == str
+  end
+end
diff --git a/app/validators/html_validator.rb b/app/validators/html_validator.rb
new file mode 100644
index 000000000..b7caee5a9
--- /dev/null
+++ b/app/validators/html_validator.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class HtmlValidator < ActiveModel::EachValidator
+  def validate_each(record, attribute, value)
+    return if value.blank?
+    errors = html_errors(value)
+    unless errors.empty?
+      record.errors.add(attribute, I18n.t('html_validator.invalid_markup', error: errors.first.to_s))
+    end
+  end
+
+  private
+
+  def html_errors(str)
+    fragment = Nokogiri::HTML.fragment(str)
+    fragment.errors
+  end
+end
diff --git a/app/views/about/_registration.html.haml b/app/views/about/_registration.html.haml
index 9cb4eb2bc..09cbe2e28 100644
--- a/app/views/about/_registration.html.haml
+++ b/app/views/about/_registration.html.haml
@@ -1,16 +1,23 @@
 = simple_form_for(new_user, url: user_registration_path) do |f|
-  %p.lead= t('about.federation_hint_html', instance: content_tag(:strong, site_hostname))
+  .simple_form__overlay-area
+    %p.lead= t('about.federation_hint_html', instance: content_tag(:strong, site_hostname))
 
-  .fields-group
-    = f.simple_fields_for :account do |account_fields|
-      = account_fields.input :username, wrapper: :with_label, autofocus: true, label: false, required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username'), :autocomplete => 'off', placeholder: t('simple_form.labels.defaults.username') }, append: "@#{site_hostname}", hint: false, disabled: closed_registrations?
+    .fields-group
+      = f.simple_fields_for :account do |account_fields|
+        = account_fields.input :username, wrapper: :with_label, label: false, required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username'), :autocomplete => 'off', placeholder: t('simple_form.labels.defaults.username') }, append: "@#{site_hostname}", hint: false, disabled: closed_registrations?
 
-    = f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email'), :autocomplete => 'off' }, hint: false, disabled: closed_registrations?
-    = f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' }, hint: false, disabled: closed_registrations?
-    = f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'off' }, hint: false, disabled: closed_registrations?
+      = f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email'), :autocomplete => 'off' }, hint: false, disabled: closed_registrations?
+      = f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'off' }, hint: false, disabled: closed_registrations?
+      = f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'off' }, hint: false, disabled: closed_registrations?
 
-  .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), disabled: closed_registrations?
+    .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), disabled: closed_registrations?
 
-  .actions
-    = f.button :button, sign_up_message, type: :submit, class: 'button button-primary', disabled: closed_registrations?
+    .actions
+      = f.button :button, sign_up_message, type: :submit, class: 'button button-primary', disabled: closed_registrations?
+
+    - if closed_registrations? && @instance_presenter.closed_registrations_message.present?
+      .simple_form__overlay-area__overlay
+        .simple_form__overlay-area__overlay__content.rich-formatting
+          .block-icon= fa_icon 'warning'
+          = @instance_presenter.closed_registrations_message.html_safe
diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml
index fa3d70e9e..d448e3862 100644
--- a/app/views/admin/dashboard/index.html.haml
+++ b/app/views/admin/dashboard/index.html.haml
@@ -40,35 +40,17 @@
       %h4= t 'admin.dashboard.features'
       %ul
         %li
-          = link_to t('admin.dashboard.feature_registrations'), edit_admin_settings_path
-          - if @registrations_enabled
-            %span.pull-right.positive-hint= fa_icon 'check fw'
-          - else
-            %span.pull-right.negative-hint= fa_icon 'times fw'
-        %li
-          = link_to t('admin.dashboard.feature_invites'), edit_admin_settings_path
-          - if @invites_enabled
-            %span.pull-right.positive-hint= fa_icon 'check fw'
-          - else
-            %span.pull-right.negative-hint= fa_icon 'times fw'
-        %li
-          = link_to t('admin.dashboard.feature_deletions'), edit_admin_settings_path
-          - if @deletions_enabled
-            %span.pull-right.positive-hint= fa_icon 'check fw'
-          - else
-            %span.pull-right.negative-hint= fa_icon 'times fw'
-        %li
-          = link_to t('admin.dashboard.feature_profile_directory'), edit_admin_settings_path
-          - if @profile_directory
-            %span.pull-right.positive-hint= fa_icon 'check fw'
-          - else
-            %span.pull-right.negative-hint= fa_icon 'times fw'
-        %li
-          = link_to t('admin.dashboard.feature_relay'), admin_relays_path
-          - if @relay_enabled
-            %span.pull-right.positive-hint= fa_icon 'check fw'
-          - else
-            %span.pull-right.negative-hint= fa_icon 'times fw'
+          = feature_hint(link_to(t('admin.dashboard.feature_registrations'), edit_admin_settings_path), @registrations_enabled)
+        %li
+          = feature_hint(link_to(t('admin.dashboard.feature_invites'), edit_admin_settings_path), @invites_enabled)
+        %li
+          = feature_hint(link_to(t('admin.dashboard.feature_deletions'), edit_admin_settings_path), @deletions_enabled)
+        %li
+          = feature_hint(link_to(t('admin.dashboard.feature_profile_directory'), edit_admin_settings_path), @profile_directory)
+        %li
+          = feature_hint(link_to(t('admin.dashboard.feature_timeline_preview'), edit_admin_settings_path), @timeline_preview)
+        %li
+          = feature_hint(link_to(t('admin.dashboard.feature_relay'), admin_relays_path), @relay_enabled)
 
   .dashboard__widgets__versions
     %div
@@ -103,47 +85,19 @@
       %h4= t 'admin.dashboard.config'
       %ul
         %li
-          = t('admin.dashboard.search')
-          - if @search_enabled
-            %span.pull-right.positive-hint= fa_icon 'check fw'
-          - else
-            %span.pull-right.negative-hint= fa_icon 'times fw'
-        %li
-          = t('admin.dashboard.single_user_mode')
-          - if @single_user_mode
-            %span.pull-right.positive-hint= fa_icon 'check fw'
-          - else
-            %span.pull-right.negative-hint= fa_icon 'times fw'
-        %li
-          LDAP
-          - if @ldap_enabled
-            %span.pull-right.positive-hint= fa_icon 'check fw'
-          - else
-            %span.pull-right.negative-hint= fa_icon 'times fw'
-        %li
-          CAS
-          - if @cas_enabled
-            %span.pull-right.positive-hint= fa_icon 'check fw'
-          - else
-            %span.pull-right.negative-hint= fa_icon 'times fw'
-        %li
-          SAML
-          - if @saml_enabled
-            %span.pull-right.positive-hint= fa_icon 'check fw'
-          - else
-            %span.pull-right.negative-hint= fa_icon 'times fw'
-        %li
-          PAM
-          - if @pam_enabled
-            %span.pull-right.positive-hint= fa_icon 'check fw'
-          - else
-            %span.pull-right.negative-hint= fa_icon 'times fw'
-        %li
-          = t 'admin.dashboard.hidden_service'
-          - if @hidden_service
-            %span.pull-right.positive-hint= fa_icon 'check fw'
-          - else
-            %span.pull-right.negative-hint= fa_icon 'times fw'
+          = feature_hint(t('admin.dashboard.search'), @search_enabled)
+        %li
+          = feature_hint(t('admin.dashboard.single_user_mode'), @single_user_mode)
+        %li
+          = feature_hint('LDAP', @ldap_enabled)
+        %li
+          = feature_hint('CAS', @cas_enabled)
+        %li
+          = feature_hint('SAML', @saml_enabled)
+        %li
+          = feature_hint('PAM', @pam_enabled)
+        %li
+          = feature_hint(t('admin.dashboard.hidden_service'), @hidden_service)
 
   .dashboard__widgets__trends
     %div
diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml
index 235927140..9574c3147 100644
--- a/app/views/admin/instances/index.html.haml
+++ b/app/views/admin/instances/index.html.haml
@@ -33,7 +33,7 @@
       %h4
         = instance.domain
         %small
-          = t('admin.instances.known_accounts', count: instance.accounts_count)
+          = t('admin.instances.known_accounts', count: instance.cached_accounts_count)
 
           - if instance.domain_block
             - if !instance.domain_block.noop?
diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml
index 9995e0b2a..475fb3a2f 100644
--- a/app/views/admin/settings/edit.html.haml
+++ b/app/views/admin/settings/edit.html.haml
@@ -2,6 +2,7 @@
   = t('admin.settings.title')
 
 = simple_form_for @admin_settings, url: admin_settings_path, html: { method: :patch } do |f|
+  = render 'shared/error_messages', object: @admin_settings
 
   .fields-group
     = f.input :site_title, wrapper: :with_label, label: t('admin.settings.site_title')
diff --git a/app/views/relationships/show.html.haml b/app/views/relationships/show.html.haml
index fc9613731..1de4e373f 100644
--- a/app/views/relationships/show.html.haml
+++ b/app/views/relationships/show.html.haml
@@ -22,11 +22,18 @@
       %li= filter_link_to t('generic.all'), activity: nil
       %li= filter_link_to t('relationships.dormant'), activity: 'dormant'
 
+  .filter-subset
+    %strong= t 'generic.order_by'
+    %ul
+      %li= filter_link_to t('relationships.most_recent'), order: nil
+      %li= filter_link_to t('relationships.last_active'), order: 'active'
+
 = form_for(@form, url: relationships_path, method: :patch) do |f|
   = hidden_field_tag :page, params[:page] || 1
   = hidden_field_tag :relationship, params[:relationship]
   = hidden_field_tag :status, params[:status]
   = hidden_field_tag :activity, params[:activity]
+  = hidden_field_tag :order, params[:order]
 
   .batch-table
     .batch-table__toolbar
diff --git a/app/views/settings/identity_proofs/new.html.haml b/app/views/settings/identity_proofs/new.html.haml
index 8ce6e61c9..5e4e9895d 100644
--- a/app/views/settings/identity_proofs/new.html.haml
+++ b/app/views/settings/identity_proofs/new.html.haml
@@ -27,5 +27,10 @@
 
           %p= t('identity_proofs.i_am_html', username: content_tag(:strong, @proof.provider_username), service: @proof.provider.capitalize)
 
+    .connection-prompt__post
+      = f.input :post_status, label: t('identity_proofs.publicize_checkbox'), as: :boolean, wrapper: :with_label, :input_html => { checked: true }
+
+      = f.input :status_text, as: :text, input_html: { value: t('identity_proofs.publicize_toot', username: @proof.provider_username, service: @proof.provider.capitalize, url: @proof.badge.proof_url), rows: 4 }
+
     = f.button :button, t('identity_proofs.authorize'), type: :submit
     = link_to t('simple_form.no'), settings_identity_proofs_url, class: 'button negative'
diff --git a/app/views/stream_entries/_detailed_status.html.haml b/app/views/stream_entries/_detailed_status.html.haml
index d18ecd37a..4459581d9 100644
--- a/app/views/stream_entries/_detailed_status.html.haml
+++ b/app/views/stream_entries/_detailed_status.html.haml
@@ -22,9 +22,9 @@
         %a.status__content__spoiler-link{ href: '#' }= t('statuses.show_more')
     .e-content{ lang: status.language, style: "display: #{!current_account&.user&.setting_expand_spoilers && status.spoiler_text? ? 'none' : 'block'}; direction: #{rtl_status?(status) ? 'rtl' : 'ltr'}" }= Formatter.instance.format(status, custom_emojify: true, autoplay: autoplay)
 
-  - if status.poll
-    = react_component :poll, disabled: true, poll: ActiveModelSerializers::SerializableResource.new(status.poll, serializer: REST::PollSerializer, scope: current_user, scope_name: :current_user).as_json do
-      = render partial: 'stream_entries/poll', locals: { status: status, poll: status.poll, 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
+      = render partial: 'stream_entries/poll', locals: { status: status, poll: status.preloadable_poll, autoplay: autoplay }
   - elsif !status.media_attachments.empty?
     - if status.media_attachments.first.video?
       - video = status.media_attachments.first
diff --git a/app/views/stream_entries/_simple_status.html.haml b/app/views/stream_entries/_simple_status.html.haml
index 1952128a0..6d2a408ea 100644
--- a/app/views/stream_entries/_simple_status.html.haml
+++ b/app/views/stream_entries/_simple_status.html.haml
@@ -27,9 +27,9 @@
     .e-content{ lang: status.language, style: "display: #{!current_account&.user&.setting_expand_spoilers && status.spoiler_text? ? 'none' : 'block'}; direction: #{rtl_status?(status) ? 'rtl' : 'ltr'}" }<
       = Formatter.instance.format(status, custom_emojify: true, autoplay: autoplay)
 
-  - if status.poll
-    = react_component :poll, disabled: true, poll: ActiveModelSerializers::SerializableResource.new(status.poll, serializer: REST::PollSerializer, scope: current_user, scope_name: :current_user).as_json do
-      = render partial: 'stream_entries/poll', locals: { status: status, poll: status.poll, 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
+      = render partial: 'stream_entries/poll', locals: { status: status, poll: status.preloadable_poll, autoplay: autoplay }
   - elsif !status.media_attachments.empty?
     - if status.media_attachments.first.video?
       - video = status.media_attachments.first
diff --git a/app/workers/activitypub/distribute_poll_update_worker.rb b/app/workers/activitypub/distribute_poll_update_worker.rb
index 5536bd744..98b227111 100644
--- a/app/workers/activitypub/distribute_poll_update_worker.rb
+++ b/app/workers/activitypub/distribute_poll_update_worker.rb
@@ -9,7 +9,7 @@ class ActivityPub::DistributePollUpdateWorker
     @status  = Status.find(status_id)
     @account = @status.account
 
-    return if @status.poll.nil? || @status.local_only?
+    return if @status.preloadable_poll.nil? || @status.local_only?
 
     ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url|
       [payload, @account.id, inbox_url]
@@ -29,7 +29,7 @@ class ActivityPub::DistributePollUpdateWorker
   def inboxes
     return @inboxes if defined?(@inboxes)
 
-    @inboxes = [@status.mentions, @status.reblogs, @status.poll.votes].flat_map do |relation|
+    @inboxes = [@status.mentions, @status.reblogs, @status.preloadable_poll.votes].flat_map do |relation|
       relation.includes(:account).map do |record|
         record.account.preferred_inbox_url if !record.account.local? && record.account.activitypub?
       end
diff --git a/config/initializers/active_model_serializers.rb b/config/initializers/active_model_serializers.rb
index 0e69e1d96..329a5fb2c 100644
--- a/config/initializers/active_model_serializers.rb
+++ b/config/initializers/active_model_serializers.rb
@@ -3,3 +3,22 @@ ActiveModelSerializers.config.tap do |config|
 end
 
 ActiveSupport::Notifications.unsubscribe(ActiveModelSerializers::Logging::RENDER_EVENT)
+
+class ActiveModel::Serializer::Reflection
+  # We monkey-patch this method so that when we include associations in a serializer,
+  # the nested serializers can send information about used contexts upwards back to
+  # the root. We do this via instance_options because the nesting can be dynamic.
+  def build_association(parent_serializer, parent_serializer_options, include_slice = {})
+    serializer = options[:serializer]
+
+    parent_serializer_options.merge!(named_contexts: serializer._named_contexts, context_extensions: serializer._context_extensions) if serializer.respond_to?(:_named_contexts)
+
+    association_options = {
+      parent_serializer: parent_serializer,
+      parent_serializer_options: parent_serializer_options,
+      include_slice: include_slice,
+    }
+
+    ActiveModel::Serializer::Association.new(self, association_options)
+  end
+end
diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb
index 254e751d4..e8d7697a1 100644
--- a/config/initializers/omniauth.rb
+++ b/config/initializers/omniauth.rb
@@ -14,7 +14,7 @@ Devise.setup do |config|
     cas_options[:host] = ENV['CAS_HOST'] if ENV['CAS_HOST']
     cas_options[:port] = ENV['CAS_PORT'] if ENV['CAS_PORT']
     cas_options[:ssl] = ENV['CAS_SSL'] == 'true' if ENV['CAS_SSL']
-    cas_options[:validate_url] = ENV['CAS_VALIDATE_URL'] if ENV['CAS_VALIDATE_URL']
+    cas_options[:service_validate_url] = ENV['CAS_VALIDATE_URL'] if ENV['CAS_VALIDATE_URL']
     cas_options[:callback_url] = ENV['CAS_CALLBACK_URL'] if ENV['CAS_CALLBACK_URL']
     cas_options[:logout_url] = ENV['CAS_LOGOUT_URL'] if ENV['CAS_LOGOUT_URL']
     cas_options[:login_url] = ENV['CAS_LOGIN_URL'] if ENV['CAS_LOGIN_URL']
diff --git a/config/locales/activerecord.ca.yml b/config/locales/activerecord.ca.yml
index 39f6839aa..19e39b5e7 100644
--- a/config/locales/activerecord.ca.yml
+++ b/config/locales/activerecord.ca.yml
@@ -1,6 +1,9 @@
 ---
 ca:
   activerecord:
+    attributes:
+      status:
+        owned_poll: Enquesta
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.co.yml b/config/locales/activerecord.co.yml
index af28d108f..0a9a936dd 100644
--- a/config/locales/activerecord.co.yml
+++ b/config/locales/activerecord.co.yml
@@ -1,6 +1,10 @@
 ---
 co:
   activerecord:
+    attributes:
+      poll:
+        expires_at: Fine
+        options: Scelte
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.cs.yml b/config/locales/activerecord.cs.yml
index 838dee15f..57240a19e 100644
--- a/config/locales/activerecord.cs.yml
+++ b/config/locales/activerecord.cs.yml
@@ -1,6 +1,10 @@
 ---
 cs:
   activerecord:
+    attributes:
+      poll:
+        expires_at: Uzávěrka
+        options: Volby
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.da.yml b/config/locales/activerecord.da.yml
index 5e7266ef1..8e9db715b 100644
--- a/config/locales/activerecord.da.yml
+++ b/config/locales/activerecord.da.yml
@@ -1,6 +1,9 @@
 ---
 da:
   activerecord:
+    attributes:
+      status:
+        owned_poll: Afstemning
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.de.yml b/config/locales/activerecord.de.yml
index 7d09856d7..19267cc4c 100644
--- a/config/locales/activerecord.de.yml
+++ b/config/locales/activerecord.de.yml
@@ -1,6 +1,9 @@
 ---
 de:
   activerecord:
+    attributes:
+      status:
+        owned_poll: Umfrage
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.el.yml b/config/locales/activerecord.el.yml
index 86672b21d..e396860ea 100644
--- a/config/locales/activerecord.el.yml
+++ b/config/locales/activerecord.el.yml
@@ -1,6 +1,9 @@
 ---
 el:
   activerecord:
+    attributes:
+      status:
+        owned_poll: Ψηφοφορία
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.en.yml b/config/locales/activerecord.en.yml
index 561ce68b8..8533418cc 100644
--- a/config/locales/activerecord.en.yml
+++ b/config/locales/activerecord.en.yml
@@ -2,8 +2,9 @@
 en:
   activerecord:
     attributes:
-      status:
-        owned_poll: Poll
+      poll:
+        expires_at: Deadline
+        options: Choices
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.fa.yml b/config/locales/activerecord.fa.yml
index 1cd50eec7..0cc6c12d7 100644
--- a/config/locales/activerecord.fa.yml
+++ b/config/locales/activerecord.fa.yml
@@ -1,6 +1,9 @@
 ---
 fa:
   activerecord:
+    attributes:
+      status:
+        owned_poll: رأی‌گیری
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.gl.yml b/config/locales/activerecord.gl.yml
index e38131454..65a83fbee 100644
--- a/config/locales/activerecord.gl.yml
+++ b/config/locales/activerecord.gl.yml
@@ -1,6 +1,9 @@
 ---
 gl:
   activerecord:
+    attributes:
+      status:
+        owned_poll: Sondaxe
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.oc.yml b/config/locales/activerecord.oc.yml
index cdf0fa0ac..e664bd409 100644
--- a/config/locales/activerecord.oc.yml
+++ b/config/locales/activerecord.oc.yml
@@ -1,6 +1,9 @@
 ---
 oc:
   activerecord:
+    attributes:
+      status:
+        owned_poll: Sondatge
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.sk.yml b/config/locales/activerecord.sk.yml
index 9ae71fa9a..bba7c66f2 100644
--- a/config/locales/activerecord.sk.yml
+++ b/config/locales/activerecord.sk.yml
@@ -1,6 +1,9 @@
 ---
 sk:
   activerecord:
+    attributes:
+      status:
+        owned_poll: Anketa
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.th.yml b/config/locales/activerecord.th.yml
index 2a41f4bce..7890ed80c 100644
--- a/config/locales/activerecord.th.yml
+++ b/config/locales/activerecord.th.yml
@@ -6,8 +6,8 @@ th:
         account:
           attributes:
             username:
-              invalid: only letters, numbers and underscores
+              invalid: ตัวอักษร, ตัวเลข และขีดล่างเท่านั้น
         status:
           attributes:
             reblog:
-              taken: of status already exists
+              taken: มีสถานะอยู่แล้ว
diff --git a/config/locales/activerecord.zh_Hant.yml b/config/locales/activerecord.zh_Hant.yml
new file mode 100644
index 000000000..730ab3a51
--- /dev/null
+++ b/config/locales/activerecord.zh_Hant.yml
@@ -0,0 +1,15 @@
+zh_Hant:
+  activerecord:
+    attributes:
+      status:
+        owned_poll: 投票
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: 只允許使用字母、數字和底線
+        status:
+          attributes:
+            reblog:
+              taken: 的嘟文已經存在
diff --git a/config/locales/bn.yml b/config/locales/bn.yml
index e76c7ba21..b4eb012f5 100644
--- a/config/locales/bn.yml
+++ b/config/locales/bn.yml
@@ -4,13 +4,138 @@ bn:
     about_hashtag_html: এগুলো প্রকাশ্য লেখা যার হ্যাশট্যাগ <strong>#%{hashtag}</strong>। আপনি এগুলোর ব্যবহার বা সাথে যুক্ত হতে পারবেন যদি আপনার যুক্তবিশ্বের কোথাও নিবন্ধন থেকে থাকে।
     about_mastodon_html: মাস্টাডন উন্মুক্ত ইন্টারনেটজালের নিয়ম এবং স্বাধীন ও মুক্ত উৎসের সফটওয়্যারের ভিত্তিতে তৈরী একটি সামাজিক যোগাযোগ মাধ্যম। এটি ইমেইলের মত বিকেন্দ্রীভূত।
     about_this: কি
+    active_count_after: চালু
+    active_footnote: মাসিক সক্রিয় ব্যবহারকারী
     administered_by: 'পরিচালনা করছেন:'
     api: সফটওয়্যার তৈরীর নিয়ম (API)
     apps: মোবাইল অ্যাপ
+    apps_platforms: মাস্টাডন আইওএস, এন্ড্রোইড বা অন্য মাধ্যমে ব্যবহার করুন
+    browse_directory: একটি ব্যবহারকারীদের তালিকা দেখুন এবং পছন্দ অনুসারে খুজুন
+    browse_public_posts: মাস্টাডনে নতুন প্রকাশ্য লেখাগুলো সরাসরি দেখুন
     contact: যোগাযোগ
     contact_missing: নেই
     contact_unavailable: প্রযোজ্য নয়
+    discover_users: ব্যবহারকারীদের দেখুন
     documentation: ব্যবহারবিলি
     extended_description_html: |
       <h3>নিয়মের জন্য উপযুক্ত জায়গা</h3>
       <p>বিস্তারিত বিবরণ এখনো যুক্ত করা হয়নি</p>
+    federation_hint_html: "%{instance}তে একটা নিবন্ধন থাকলে আপনি যেকোনো মাস্টাডন বা এধরণের অন্যান্য সার্ভারের মানুষের সাথে যুক্ত হতে পারবেন ।"
+    generic_description: নেটওয়ার্কের ভেতরে %{domain} একটি সার্ভার
+    get_apps: মোবাইল এপ্প একটা ব্যবহার করতে পারেন
+    hosted_on: এই মাস্টাডনটি আছে %{domain} এ
+    learn_more: বিস্তারিত জানুন
+    privacy_policy: গোপনীয়তা নীতি
+    see_whats_happening: কী কী হচ্ছে দেখুন
+    server_stats: 'সার্ভারের অবস্থা:'
+    source_code: আসল তৈরীপত্র
+    status_count_after:
+      one: অবস্থা
+      other: স্থিতিগুলি
+    status_count_before: কে লিখেছে
+    tagline: পরিচিতজনদের সাথে যুক্ত হন এবং নতুনদের সাথে পরিচিত হন
+    terms: ব্যবহারের শর্তাবলী
+    user_count_after:
+      one: ব্যবহারকারী
+      other: জনের
+    user_count_before: বাসা
+    what_is_mastodon: মাস্টাডনটি কি ?
+  accounts:
+    choices_html: "%{name} বাছাই:"
+    follow: যুক্ত
+    followers:
+      one: যুক্ত আছে
+      other: যারা যুক্ত হয়েছে
+    following: যুক্ত করা
+    joined: যোগদান হয় %{date}
+    last_active: শেষ সক্রিয় ছিল
+    link_verified_on: এই লিংকের মালিকানা শেষ চেক করা হয়  %{date} তারিখে
+    media: ছবি বা ভিডিও
+    moved_html: "%{name} চলে গেছে %{new_profile_link} তে:"
+    network_hidden: এই তথ্যটি নেই
+    nothing_here: এখানে কিছুই নেই!
+    people_followed_by: "%{name} যাদেরকে অনুসরণ করে"
+    people_who_follow: যারা %{name} কে অনুসরণ করে
+    pin_errors:
+      following: সমর্থন করতে অনুসরণ থাকা লাগবে
+    posts:
+      one: লেখা
+      other: লেখাগুলো
+    posts_tab_heading: লেখাগুলো
+    posts_with_replies: লেখা এবং মতামত
+    reserved_username: নামটি সংরক্ষিত
+    roles:
+      admin: পরিচালক
+      bot: রোবট
+      moderator: পরিচালক
+    unfollow: অনুসরণ বাদ
+  admin:
+    account_actions:
+      action: করা
+      title: 'প্রশাসনা করুন এর উপর : %{acct}'
+    account_moderation_notes:
+      create: কিছু লিখুন
+      created_msg: প্রশাসনবস্তুত লেখাটি সঠিকভাবে তৈরী হয়েছে!
+      delete: মুছে ফেলা
+      destroyed_msg: প্রশাসনবস্তুত লেখাটি সঠিকভাবে মুছে ফেলা হয়েছে!
+    accounts:
+      approve: অনুমোদন দিন
+      are_you_sure: আপনি কি নিশ্চিত ?
+      avatar: অবতার
+      by_domain: ওয়েবসাইট/কার্যক্ষেত্র
+      change_email:
+        changed_msg: নিবন্ধনের ইমেইল সঠিকভাবে পরিবর্তন হয়েছে!
+        current_email: এখনকার ইমেইল
+        label: ইমেইল পরিবর্তন
+        new_email: নতুন ইমেইল
+        submit: ইমেইল পরিবর্তন
+        title: "%{username} এর ইমেইল পরিবর্তন"
+      confirm: নিশ্চিত করুন
+      confirmed: নিশ্চিত হয়েছে
+      confirming: নিশ্চিত করা হচ্ছে
+      deleted: মুছে ফেলা হয়েছে
+      demote: নিচের পদে দিন
+      disable: বন্ধ করুন
+      disable_two_factor_authentication: দুই পদ্ধতির প্রমাণীকরণ(2FA) বন্ধ করুন
+      disabled: বন্ধ করা হয়েছে
+      display_name: দেখানোর জন্য নাম
+      domain: ওয়েবসাইট/কার্যক্ষেত্র
+      edit: বদলান
+      email: ইমেইল
+      email_status: ইমেইলের অবস্থা
+      enable: চালু করুন
+      enabled: চালু করুন
+      feed_url: সম্মিলিত(feed) লিংক
+      followers: অনুসরকারীরা
+      followers_url: অনুসরণকারীদের লিংক
+      follows: অনুসরণ করে
+      header: শিরোলেখা
+      inbox_url: চিঠি পাওয়ার বক্স লিংক
+      invited_by: আমন্ত্রণ করেছে
+      ip: আইপি(IP)
+      joined: যোগ দিয়েছে
+      location:
+        all: সব
+        local: স্থানীয়
+        remote: দূরবর্তী
+        title: জায়গা
+      login_status: নিবন্ধনধারীভাবে প্রবেশের অবস্থা
+      media_attachments: ছবি/ভিডিও যুক্ত
+      memorialize: স্মরণিকা বানান
+      moderation:
+        active: চালু
+        all: সব
+        pending: অপেক্ষিত আছে
+        silenced: নীরব করা হয়েছে
+        suspended: স্থগিত করা হয়েছে
+        title: প্রশাসনা
+      moderation_notes: প্রশাসনের কিছু লেখা
+      most_recent_activity: সর্বশেষ কার্যক্রম
+      most_recent_ip: সর্বশেষ আইপি(IP)
+      no_limits_imposed: কোন সীমা আরোপ করা নেই
+      not_subscribed: সাবস্ক্রাইব নেই
+      outbox_url: চিঠি পাঠানোর বাক্স লিংক
+      pending: পয্র্যবেক্ষণের অপেক্ষায় আছে
+      perform_full_suspension: বাতিল করা
+  verification:
+    verification: সত্যতা নির্ধারণ
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index b17af3169..c9e0e092a 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -4,25 +4,36 @@ ca:
     about_hashtag_html: Aquests són toots públics etiquetats amb <strong>#%{hashtag}</strong>. Pots interactuar amb ells si tens un compte a qualsevol lloc del fediverse.
     about_mastodon_html: Mastodon és una xarxa social basada en protocols web oberts i en programari lliure i de codi obert. Està descentralitzat com el correu electrònic.
     about_this: Quant a
+    active_count_after: actiu
+    active_footnote: Usuaris actius mensuals (UAM)
     administered_by: 'Administrat per:'
     api: API
     apps: Apps mòbil
+    apps_platforms: Utilitza Mastodon des de iOS, Android i altres plataformes
+    browse_directory: Navega per el directori de perfils i filtra segons interessos
+    browse_public_posts: Navega per una transmissió en directe de publicacions públiques a Mastodon
     contact: Contacte
     contact_missing: No configurat
     contact_unavailable: N/D
+    discover_users: Descobreix usuaris
     documentation: Documentació
     extended_description_html: |
       <h3>Un bon lloc per les regles</h3>
       <p>Encara no s'ha configurat la descripció ampliada.</p>
+    federation_hint_html: Amb un compte de %{instance} podràs seguir persones de qualsevol servidor Mastodon i altres.
     generic_description: "%{domain} és un servidor a la xarxa"
+    get_apps: Prova una aplicació mòbil
     hosted_on: Mastodon allotjat a %{domain}
     learn_more: Més informació
     privacy_policy: Política de privacitat
+    see_whats_happening: Mira què està passant
+    server_stats: 'Estadístiques del servidor:'
     source_code: Codi font
     status_count_after:
       one: estat
       other: estats
     status_count_before: Que han escrit
+    tagline: Segueix els teus amics i descobreix-ne de nous
     terms: Termes del servei
     user_count_after:
       one: usuari
@@ -68,6 +79,7 @@ ca:
       delete: Suprimeix
       destroyed_msg: Nota de moderació destruïda amb èxit!
     accounts:
+      approve: Aprova
       are_you_sure: N'estàs segur?
       avatar: Avatar
       by_domain: Domini
@@ -113,6 +125,7 @@ ca:
       moderation:
         active: Actiu
         all: Tot
+        pending: Pendent
         silenced: Silenciat
         suspended: Suspès
         title: Moderació
@@ -122,6 +135,7 @@ ca:
       no_limits_imposed: Sense límits imposats
       not_subscribed: No subscrit
       outbox_url: URL de la bústia de sortida
+      pending: Revisió pendent
       perform_full_suspension: Suspèn
       profile_url: URL del perfil
       promote: Promociona
@@ -129,6 +143,7 @@ ca:
       public: Públic
       push_subscription_expires: La subscripció PuSH expira
       redownload: Actualitza el perfil
+      reject: Rebutja
       remove_avatar: Eliminar avatar
       remove_header: Treu la capçalera
       resend_confirmation:
@@ -400,6 +415,12 @@ ca:
         min_invite_role:
           disabled: Ningú
           title: Permet les invitacions de
+      registrations_mode:
+        modes:
+          approved: Es requereix l’aprovació per registrar-se
+          none: Ningú no pot registrar-se
+          open: Qualsevol pot registrar-se
+        title: Mode de registres
       show_known_fediverse_at_about_page:
         desc_html: Quan s'activa, mostrarà tots els toots de tot el fedivers conegut en vista prèvia. En cas contrari, només es mostraran toots locals.
         title: Mostra el fedivers conegut en vista prèvia de la línia de temps
@@ -462,6 +483,9 @@ ca:
       edit_preset: Edita l'avís predeterminat
       title: Gestiona les configuracions predefinides dels avisos
   admin_mailer:
+    new_pending_account:
+      body: A continuació trobaràs els detalls del compte nou. Pots aprovar o rebutjar aquest registre.
+      subject: Nou compte per a revisar a %{instance} (%{username})
     new_report:
       body: "%{reporter} ha informat de %{target}"
       body_remote: Algú des de el domini %{domain} ha informat sobre %{target}
@@ -483,7 +507,9 @@ ca:
     your_token: El teu identificador d'accés
   auth:
     agreement_html: Al fer clic en "Registre" acceptes respectar <a href="%{rules_path}">les normes del servidor</a> i <a href="%{terms_path}">els nostres termes del servei</a>.
+    apply_for_account: Demana una invitació
     change_password: Contrasenya
+    checkbox_agreement_html: Estic d'acord amb les <a href="%{rules_path}" target="_blank">normes del servidor</a> i <a href="%{terms_path}" target="_blank"> els termes del servei</a>
     confirm_email: Confirmar correu electrònic
     delete_account: Suprimeix el compte
     delete_account_html: Si vols suprimir el compte pots <a href="%{path}">fer-ho aquí</a>. Se't demanarà confirmació.
@@ -499,10 +525,12 @@ ca:
       cas: CAS
       saml: SAML
     register: Registre
+    registration_closed: "%{instance} no accepta nous membres"
     resend_confirmation: Torna a enviar el correu de confirmació
     reset_password: Restableix la contrasenya
     security: Seguretat
     set_new_password: Estableix una contrasenya nova
+    trouble_logging_in: Problemes per iniciar la sessió?
   authorize_follow:
     already_following: Ja estàs seguint aquest compte
     error: Malauradament, ha ocorregut un error cercant el compte remot
@@ -598,6 +626,7 @@ ca:
     more: Més…
     resources: Recursos
   generic:
+    all: Tot
     changes_saved_msg: Els canvis s'han desat correctament!
     copy: Copia
     save_changes: Desa els canvis
@@ -721,6 +750,17 @@ ca:
     other: Altre
     publishing: Publicació
     web: Web
+  relationships:
+    activity: Activitat del compte
+    dormant: Inactiu
+    moved: Mogut
+    mutual: Mútua
+    primary: Primari
+    relationship: Relació
+    remove_selected_domains: Elimina tots els seguidors dels dominis seleccionats
+    remove_selected_followers: Elimina els seguidors seleccionats
+    remove_selected_follows: Deixa de seguir als usuaris seleccionats
+    status: Estat del compte
   remote_follow:
     acct: Escriu el teu usuari@domini des del qual vols seguir
     missing_resource: No s'ha pogut trobar la URL de redirecció necessaria per al compte
@@ -799,6 +839,7 @@ ca:
     migrate: Migració del compte
     notifications: Notificacions
     preferences: Preferències
+    relationships: Seguits i seguidors
     settings: Configuració
     two_factor_authentication: Autenticació de dos factors
     your_apps: Les teves aplicacions
diff --git a/config/locales/co.yml b/config/locales/co.yml
index 651d29781..90c60e292 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -4,25 +4,36 @@ co:
     about_hashtag_html: Quessi sò statuti pubblichi taggati cù <strong>#%{hashtag}</strong>. Pudete interagisce cù elli sì voi avete un contu in qualche parte di u fediverse.
     about_mastodon_html: Mastodon ghjè una rete suciale custruita incù prutucolli web aperti è lugiziali liberi. Hè decentralizatu cumu l’e-mail.
     about_this: À prupositu
+    active_count_after: attivi
+    active_footnote: Utilizatori Attivi Mensili (UAM)
     administered_by: 'Amministratu da:'
     api: API
     apps: Applicazione per u telefuninu
+    apps_platforms: Utilizà Mastodon dapoi à iOS, Android è altre piattaforme
+    browse_directory: Navigà un'annuariu di i prufili è filtra per interessi
+    browse_public_posts: Navigà un flussu di i statuti publichi nant'à Mastodon
     contact: Cuntattu
     contact_missing: Mancante
     contact_unavailable: Micca dispunibule
+    discover_users: Scopre utilizatori
     documentation: Ducumentazione
     extended_description_html: |
       <h3>Una bona piazza per e regule</h3>
       <p>A descrizzione stesa ùn hè micca stata riempiuta.</p>
+    federation_hint_html: Cù un contu nant'à %{instance} puderete siguità ghjente da tutti i servori Mastodon è ancu più d'altri.
     generic_description: "%{domain} hè un servore di a rete"
+    get_apps: Pruvà un'applicazione di telefuninu
     hosted_on: Mastodon allughjatu nant’à %{domain}
     learn_more: Amparà di più
     privacy_policy: Pulitica di vita privata
+    see_whats_happening: Vede cio chì si passa
+    server_stats: 'Statistiche di u servore:'
     source_code: Codice di fonte
     status_count_after:
       one: statutu
       other: statuti
     status_count_before: chì anu pubblicatu
+    tagline: Siguità amichi è scopre ancu di più altri
     terms: Cundizione di u serviziu
     user_count_after:
       one: utilizatore
@@ -68,6 +79,7 @@ co:
       delete: Toglie
       destroyed_msg: Nota di muderazione sguassata!
     accounts:
+      approve: Appruvà
       are_you_sure: Site sicuru·a?
       avatar: Ritrattu di prufile
       by_domain: Duminiu
@@ -113,6 +125,7 @@ co:
       moderation:
         active: Attivu
         all: Tutti
+        pending: In attesa
         silenced: Silenzati
         suspended: Suspesi
         title: Muderazione
@@ -122,6 +135,7 @@ co:
       no_limits_imposed: Nisuna limita imposta
       not_subscribed: Micca abbunatu
       outbox_url: URL di l’outbox
+      pending: In attesa di rivista
       perform_full_suspension: Suspende
       profile_url: URL di u prufile
       promote: Prumove
@@ -129,6 +143,7 @@ co:
       public: Pubblicu
       push_subscription_expires: Spirata di l’abbunamentu PuSH
       redownload: Mette à ghjornu u prufile
+      reject: Righjittà
       remove_avatar: Toglie l’avatar
       remove_header: Toglie l'intistatura
       resend_confirmation:
@@ -230,6 +245,7 @@ co:
       feature_profile_directory: Annuariu di i prufili
       feature_registrations: Arregistramenti
       feature_relay: Ripetitore di federazione
+      feature_timeline_preview: Vista di a linea pubblica
       features: Funziunalità
       hidden_service: Federazione cù servizii piattati
       open_reports: signalamenti aperti
@@ -400,6 +416,12 @@ co:
         min_invite_role:
           disabled: Nisunu
           title: Auturizà l’invitazione da
+      registrations_mode:
+        modes:
+          approved: Apprubazione necessaria per arregistrassi
+          none: Nimu ùn pò arregistrassi
+          open: Tutt'ognunu pò arregistrassi
+        title: Modu d'arregistramenti
       show_known_fediverse_at_about_page:
         desc_html: Quandu ghjè selezziunatu, statuti di tuttu l’istanze cunnisciute saranu affissati indè a vista di e linee. Altrimente soli i statuti lucali saranu mustrati.
         title: Vedde tuttu u fediverse cunnisciutu nant’a vista di e linee
@@ -462,6 +484,9 @@ co:
       edit_preset: Cambià a preselezzione d'avertimentu
       title: Amministrà e preselezzione d'avertimentu
   admin_mailer:
+    new_pending_account:
+      body: I ditagli di u novu contu sò quì sottu. Pudete appruvà o righjittà a dumanda.
+      subject: Novu contu in attesa di rivista nant'à %{instance} (%{username})
     new_report:
       body: "%{reporter} hà palisatu %{target}"
       body_remote: Qualch’unu da %{domain} hà palisatu %{target}
@@ -483,7 +508,9 @@ co:
     your_token: Rigenerà a fiscia d’accessu
   auth:
     agreement_html: Cliccà "Arregistrassi" quì sottu vole dì chì site d’accunsentu per siguità <a href="%{rules_path}">e regule di u servore</a> è <a href="%{terms_path}">e cundizione d’usu</a>.
+    apply_for_account: Dumandà un'invitazione
     change_password: Chjave d’accessu
+    checkbox_agreement_html: Sò d'accunsentu cù e <a href="%{rules_path}" target="_blank">regule di u servore</a> è i <a href="%{terms_path}" target="_blank">termini di u serviziu</a>
     confirm_email: Cunfirmà l’e-mail
     delete_account: Sguassà u contu
     delete_account_html: S’è voi vulete toglie u vostru contu <a href="%{path}">ghjè quì</a>. Duverete cunfirmà a vostra scelta.
@@ -499,10 +526,12 @@ co:
       cas: CAS
       saml: SAML
     register: Arregistrassi
+    registration_closed: "%{instance} ùn accetta micca novi socii"
     resend_confirmation: Rimandà l’istruzzioni di cunfirmazione
     reset_password: Cambià a chjave d’accessu
     security: Sicurità
     set_new_password: Creà una nova chjave d’accessu
+    trouble_logging_in: Difficultà per cunnettavi?
   authorize_follow:
     already_following: Site digià abbunatu·a à stu contu
     error: Peccatu, c’hè statu un prublemu ricercandu u contu
@@ -558,6 +587,9 @@ co:
       content: Scusate, mà c’hè statu un prublemu cù u nostru servore.
       title: Sta pagina ùn hè curretta
     noscript_html: Mastodon nant’à u web hà bisognu di JavaScript per funziunà. Pudete ancu pruvà <a href="%{apps_path}">l’applicazione native</a> per a vostra piattaforma.
+  existing_username_validator:
+    not_found: ùn si pudeva micca truvà un'utilizatore lucale cù stu cugnome
+    not_found_multiple: ùn si pudeva micca truvà %{usernames}
   exports:
     archive_takeout:
       date: Data
@@ -598,12 +630,34 @@ co:
     more: Di più…
     resources: Risorze
   generic:
+    all: Tuttu
     changes_saved_msg: Cambiamenti salvati!
     copy: Cupià
+    order_by: Urdinà per
     save_changes: Salvà e mudificazione
     validation_errors:
       one: Qualcosa ùn và bè! Verificate u prublemu quì sottu
       other: Qualcosa ùn và bè! Verificate %{count} prublemi quì sottu
+  html_validator:
+    invalid_markup: 'cuntene codice HTML invalidu: %{error}'
+  identity_proofs:
+    active: Attiva
+    authorize: Ié, auturizà
+    authorize_connection_prompt: Auturizà sta cunnessione crittograffica?
+    errors:
+      failed: A cunnessione crittograffica s'hè fiascata. Ripruvate da %{provider}.
+      keybase:
+        invalid_token: E fiscie Keybase sò hash di firme è duvenu fà 66 caratteri esadecimali (0-9 A-F)
+        verification_failed: Keybase ùn ricunosce micca sta fiscia cum'una firma di l'utilizatore Keybase %{kb_username}. Ripruvate da Keybase.
+      wrong_user: Ùn si pò micca creà una prova per %{proving} mentre chì site cunnettatu·a cum'è %{current}. Cunnettatevi cum'è %{proving} è ripruvate.
+    explanation_html: Quì pudete cunnettà crittografficamente e vostre altre identità, cum'è per esempiu un prufile Keybase. Quessu permette à d'altre persone di mandà vi missaghji crittati, è d'affiducià i cuntinuti chì mandate.
+    i_am_html: Sò %{username} nant'à %{service}.
+    identity: Identità
+    inactive: Inattiva
+    publicize_checkbox: 'È mandà stu statutu:'
+    publicize_toot: 'Hè pruvata! Sò %{username} nant’à %{service}: %{url}'
+    status: Statutu di a verificazione
+    view_proof: Vede a prova
   imports:
     modes:
       merge: Unisce
@@ -721,6 +775,19 @@ co:
     other: Altre
     publishing: Pubblicazione
     web: Web
+  relationships:
+    activity: Attività di u contu
+    dormant: Inattivu
+    last_active: Ultima attività
+    most_recent: Più ricente
+    moved: Spiazzatu
+    mutual: Mutuale
+    primary: Primariu
+    relationship: Rilazione
+    remove_selected_domains: Toglie tutti l'abbunati da i dumini selezziunati
+    remove_selected_followers: Toglie l'abbunati selezziunati
+    remove_selected_follows: Ùn siguità più l'utilizatori selezziunati
+    status: Statutu di u contu
   remote_follow:
     acct: Entrate u vostru cugnome@istanza da induve vulete siguità stu contu
     missing_resource: Ùn avemu pussutu à truvà l’indirizzu di ridirezzione
@@ -795,10 +862,12 @@ co:
     edit_profile: Mudificà u prufile
     export: Spurtazione d’infurmazione
     featured_tags: Hashtag in vista
+    identity_proofs: Prove d'identità
     import: Impurtazione
     migrate: Migrazione di u contu
     notifications: Nutificazione
     preferences: Priferenze
+    relationships: Abbunamenti è abbunati
     settings: Parametri
     two_factor_authentication: Identificazione à dui fattori
     your_apps: E vostre applicazione
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index e455a27fd..43d8764ff 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -1,7 +1,7 @@
 ---
 cs:
   about:
-    about_hashtag_html: Tohle jsou veřejné tooty označené hashtagem <strong>#%{hashtag}</strong>. Pokud máte účet kdekoliv na fediverse, můžete s nimi interagovat.
+    about_hashtag_html: Tohle jsou veřejné tooty označené hashtagem <strong>#%{hashtag}</strong>. Pokud máte účet kdekoliv ve fedivesmíru, můžete s nimi interagovat.
     about_mastodon_html: Mastodon je sociální síť založená na otevřených webových protokolech a svobodném, otevřeném softwaru. Je decentralizovaná jako e-mail.
     about_this: O tomto serveru
     active_count_after: aktivních
@@ -76,12 +76,12 @@ cs:
   admin:
     account_actions:
       action: Vykonat akci
-      title: Vykonat moderační akci pro účet %{acct}
+      title: Vykonat moderátorskou akci pro účet %{acct}
     account_moderation_notes:
       create: Zanechat poznámku
-      created_msg: Poznámka moderátora byla úspěšně vytvořena!
+      created_msg: Moderátorská poznámka byla úspěšně vytvořena!
       delete: Smazat
-      destroyed_msg: Poznámka moderátora byla úspěšně zničena!
+      destroyed_msg: Moderátorská poznámka byla úspěšně zničena!
     accounts:
       approve: Schválit
       are_you_sure: Jste si jistý/á?
@@ -114,7 +114,7 @@ cs:
       followers_url: URL sledujících
       follows: Sledovaní
       header: Záhlaví
-      inbox_url: URL přijatých zpráv
+      inbox_url: URL příchozí schránky
       invited_by: Pozván/a uživatelem
       ip: IP
       joined: Připojil/a se
@@ -132,13 +132,13 @@ cs:
         pending: Čekající
         silenced: Utišen/a
         suspended: Pozastaven/a
-        title: Moderace
-      moderation_notes: Moderační poznámky
+        title: Moderování
+      moderation_notes: Moderátorské poznámky
       most_recent_activity: Nejnovější aktivita
       most_recent_ip: Nejnovější IP
       no_limits_imposed: Nejsou nastavena žádná omezení
       not_subscribed: Neodebírá
-      outbox_url: URL odchozích zpráv
+      outbox_url: URL odchozí schránky
       pending: Čeká na posouzení
       perform_full_suspension: Pozastavit
       profile_url: URL profilu
@@ -165,7 +165,7 @@ cs:
         user: Uživatel
       salmon_url: URL Salmon
       search: Hledat
-      shared_inbox_url: URL sdílených přijatých zpráv
+      shared_inbox_url: URL sdílené příchozí schránky
       show:
         created_reports: Vytvořená nahlášení
         targeted_reports: Nahlášeni ostatními
@@ -249,6 +249,7 @@ cs:
       feature_profile_directory: Adresář profilů
       feature_registrations: Registrace
       feature_relay: Federovací most
+      feature_timeline_preview: Náhled časové osy
       features: Vlastnosti
       hidden_service: Federace se skrytými službami
       open_reports: otevřená hlášení
@@ -270,7 +271,7 @@ cs:
       domain: Doména
       new:
         create: Vytvořit blokaci
-        hint: Blokace domény nezakáže vytváření účtových záznamů v databázi, ale bude na tyto účty zpětně a automaticky aplikovat specifické metody moderace.
+        hint: Blokace domény nezakáže vytváření záznamů účtů v databázi, ale bude na tyto účty zpětně a automaticky aplikovat specifické metody moderování.
         severity:
           desc_html: Funkce <strong>Utišit</strong> zneviditelní příspěvky z účtu komukoliv, kdo jej nesleduje. Funkce <strong>Pozastavit</strong> odstraní všechen obsah, média a profilová data účtu. Pro pouhé odmítnutí mediálních souborů použijte funkci <strong>Žádné</strong>.
           noop: Žádné
@@ -284,8 +285,8 @@ cs:
       rejecting_media: odmítají se mediální soubory
       rejecting_reports: odmítají se nahlášení
       severity:
-        silence: utišené
-        suspend: pozastavené
+        silence: utišeno
+        suspend: pozastaveno
       show:
         affected_accounts:
           few: "%{count} účty v databázi byly ovlivněny"
@@ -305,7 +306,7 @@ cs:
       domain: Doména
       new:
         create: Přidat doménu
-        title: Nový e-mail pro zablokování
+        title: Nová položka pro černou listinu e-mailů
       title: Černá listina e-mailů
     followers:
       back_to_account: Zpět na účet
@@ -320,7 +321,7 @@ cs:
       moderation:
         all: Všechny
         limited: Omezené
-        title: Moderace
+        title: Moderování
       title: Federace
       total_blocked_by_us: Blokované námi
       total_followed_by_them: Sledované jimi
@@ -338,7 +339,7 @@ cs:
     relays:
       add_new: Přidat nový most
       delete: Smazat
-      description_html: "<strong>Federovací most</strong> je přechodný server, který vyměňuje velká množství veřejných tootů mezi servery, které z něj odebírají a poblikují na něj. <strong>Může pomoci malým a středně velkým serverům objevovat obsah z fediverse</strong>, což by jinak vyžadovalo, aby místní uživatelé manuálně sledovali jiné lidi na vzdálených serverech."
+      description_html: "<strong>Federovací most</strong> je přechodný server, který vyměňuje velká množství veřejných tootů mezi servery, které z něj odebírají a publikují na něj. <strong>Může pomoci malým a středně velkým serverům objevovat obsah z fedivesmíru</strong>, což by jinak vyžadovalo, aby místní uživatelé manuálně sledovali jiné lidi na vzdálených serverech."
       disable: Zakázat
       disabled: Zakázáno
       enable: Povolit
@@ -403,7 +404,7 @@ cs:
         desc_html: Zobrazuje se na hlavní stránce. Doporučuje se rozlišení alespoň 293x205 px. Pokud toto není nastaveno, bude zobrazen výchozí maskot
         title: Obrázek maskota
       peers_api_enabled:
-        desc_html: Domény, na které tento server narazil ve fediverse
+        desc_html: Domény, na které tento server narazil ve fedivesmíru
         title: Zveřejnit seznam objevených serverů
       preview_sensitive_media:
         desc_html: Náhledy odkazů na jiných stránkách budou zobrazeny i pokud jsou media označena jako citlivá
@@ -425,22 +426,22 @@ cs:
         modes:
           approved: Pro registraci je vyžadováno schválení
           none: Nikdo se nemůže registrovat
-          open: Všichni se mohou registrovat
+          open: Kdokoliv se může registrovat
         title: Režim registrací
       show_known_fediverse_at_about_page:
-        desc_html: Je-li toto zapnuto, zobrazí se v náhledu tooty ze všech známých serverů na fediverse. Jinak budou zobrazeny pouze místní tooty.
-        title: Zobrazit na náhledu časové osy celé známé fediverse
+        desc_html: Je-li tohle zapnuto, zobrazí se v náhledu tooty z celého známého fedivesmíru. Jinak budou zobrazeny pouze místní tooty.
+        title: Zobrazit na náhledu časové osy celý známý fedivesmír
       show_staff_badge:
         desc_html: Zobrazit na stránce uživatele odznak člena personálu
         title: Zobrazit odznak personálu
       site_description:
-        desc_html: Úvodní odstavec na hlavní straně. Popište, díky čemu je tento server Mastodon zvláštní, a cokoliv jiného, co je důležité. Můžete zde používat HTML značky, hlavně <code>&lt;a&gt;</code> a <code>&lt;em&gt;</code>.
+        desc_html: Úvodní odstavec v API. Popište, díky čemu je tento server Mastodon zvláštní, a cokoliv jiného, co je důležité. Můžete zde používat HTML značky, hlavně <code>&lt;a&gt;</code> a <code>&lt;em&gt;</code>.
         title: Popis serveru
       site_description_extended:
         desc_html: Dobré místo pro vaše pravidla, pokyny a jiné věci, které váš server odlišují od ostatních. Lze použít HTML značky
-        title: Vlastní doplňující informace
+        title: Vlastní rozšířené informace
       site_short_description:
-        desc_html: Zobrazen v postranním panelu a meta značkách. Popište, co je Mastodon a díky čemu je tento server zvláštní v jediném odstavci. Je-li tohle prázdné, zobrazí se popis serveru.
+        desc_html: Zobrazen v postranním panelu a meta značkách. Popište, co je Mastodon a díky čemu je tento server zvláštní v jediném odstavci.
         title: Krátký popis serveru
       site_terms:
         desc_html: Můžete si napsat vlastní zásady soukromí, podmínky používání či jiné legality. Můžete použít HTML značky
@@ -593,6 +594,9 @@ cs:
       content: Omlouváme se, ale něco se u nás pokazilo.
       title: Tato stránka není správná
     noscript_html: Pro použití webové aplikace Mastodon prosím povolte JavaScript. Nebo zkuste jednu z <a href="%{apps_path}">nativních aplikací</a> pro Mastodon pro vaši platformu.
+  existing_username_validator:
+    not_found: nelze najít místního uživatele s tímto uživatelským jménem
+    not_found_multiple: nelze najít %{usernames}
   exports:
     archive_takeout:
       date: Datum
@@ -633,6 +637,7 @@ cs:
     more: Více…
     resources: Zdroje
   generic:
+    all: Všechny
     changes_saved_msg: Změny byly úspěšně uloženy!
     copy: Kopírovat
     save_changes: Uložit změny
@@ -640,6 +645,26 @@ cs:
       few: Něco ještě není úplně v pořádku! Prosím zkontrolujte %{count} chyby níže
       one: Něco ještě není úplně v pořádku! Prosím zkontrolujte chybu níže
       other: Něco ještě není úplně v pořádku! Prosím zkontrolujte %{count} chyb níže
+  html_validator:
+    invalid_markup: 'obsahuje neplatný HTML kód: %{error}'
+  identity_proofs:
+    active: Aktivní
+    authorize: Ano, autorizovat
+    authorize_connection_prompt: Autorizovat toto kryptografické spojení?
+    errors:
+      failed: Kryptografické spojení selhalo. Prosím zkuste to znovu z %{provider}.
+      keybase:
+        invalid_token: Tokeny Keybase jsou hashe podpisů a musí být 66 znaků dlouhé
+        verification_failed: Keybase nerozpoznává tento token jako podpis uživatele %{kb_username} na Keybase. Prosím zkuste to znovu z Keybase.
+      wrong_user: Nelze vytvořit důkaz pro uživatele %{proving}, zatímco jste přihlášen/a jako %{current}. Přihlaste se jako %{proving} a zkuste to znovu.
+    explanation_html: Zde můžete kryptograficky připojit vaše ostatní identity, například profil Keybase. To dovolí jiným lidem vám posílat šifrované zprávy a důvěřovat obsahu, který jim pošlete.
+    i_am_html: Na %{service} jsem %{username}.
+    identity: Identita
+    inactive: Neaktivní
+    publicize_checkbox: 'A tootnout tohle:'
+    publicize_toot: 'Je to dokázáno! Na %{service} jsem %{username}: %{url}'
+    status: Stav ověření
+    view_proof: Zobrazit důkaz
   imports:
     modes:
       merge: Sloučit
@@ -689,9 +714,9 @@ cs:
     acct: přezdívka@doména nového účtu
     currently_redirecting: 'Váš profil má nastaveno přesměrování na:'
     proceed: Uložit
-    updated_msg: Vaše nastavení migrace účtu bylo úspěšně aktualizováno!
+    updated_msg: Vaše nastavení přesunutí účtu bylo úspěšně aktualizováno!
   moderation:
-    title: Moderace
+    title: Moderování
   notification_mailer:
     digest:
       action: Zobrazit všechna oznámení
@@ -759,6 +784,19 @@ cs:
     other: Ostatní
     publishing: Publikování
     web: Web
+  relationships:
+    activity: Aktivita účtu
+    dormant: Nečinné
+    last_active: Naposledy aktivní
+    most_recent: Nedávno přidaní
+    moved: Přesunuté
+    mutual: Vzájemné
+    primary: Primární
+    relationship: Vztah
+    remove_selected_domains: Odstranit všechny sledující ze zvolených domén
+    remove_selected_followers: Odstranit zvolené sledující
+    remove_selected_follows: Přestat sledovat zvolené uživatele
+    status: Stav účtu
   remote_follow:
     acct: Napište svou přezdívku@doménu, ze které chcete jednat
     missing_resource: Nemůžeme najít požadované přesměrovací URL pro váš účet
@@ -833,10 +871,12 @@ cs:
     edit_profile: Upravit profil
     export: Export dat
     featured_tags: Zvýrazněné hashtagy
+    identity_proofs: Důkazy identity
     import: Import
     migrate: Přesunutí účtu
     notifications: Oznámení
     preferences: Předvolby
+    relationships: Sledovaní a sledující
     settings: Nastavení
     two_factor_authentication: Dvoufaktorové ověřování
     your_apps: Vaše aplikace
@@ -905,7 +945,7 @@ cs:
 
       <ul>
         <li>K poskytnutí základních funkcí Mastodonu. Interagovat s obsahem od jiných lidí a přispívat svým vlastním obsahem můžete pouze, pokud jste přihlášeni. Můžete například sledovat jiné lidi a zobrazit si jejich kombinované příspěvky ve vaší vlastní personalizované časové ose.</li>
-        <li>Pro pomoc moderaci komunity, například porovnáním vaší IP adresy s dalšími známými adresami pro určení vyhýbání se zákazům či jiných přestupků.</li>
+        <li>Pro pomoc moderování komunity, například porovnáním vaší IP adresy s dalšími známými adresami pro určení vyhýbání se zákazům či jiných přestupků.</li>
         <li>E-mailová adresa, kterou nám poskytnete, může být použita pro zasílání informací, oznámení o interakcích jiných uživatelů s vaším obsahem nebo přijatých zprávách a k odpovědím na dotazy a/nebo další požadavky či otázky.</li>
       </ul>
 
@@ -991,7 +1031,7 @@ cs:
     recovery_codes_regenerated: Záložní kódy byly úspěšně znovu vygenerované
     recovery_instructions_html: Ztratíte-li někdy přístup k vašemu telefonu, můžete k získání přístupu k účtu použít jeden ze záložních kódů. <strong>Uchovávejte tyto kódy v bezpečí</strong>. Můžete si je například vytisknout a uložit je mezi jiné důležité dokumenty.
     setup: Nastavit
-    wrong_code: Zadaný kód byl neplatný! Je serverový čas a čas na zařízení správný?
+    wrong_code: Zadaný kód byl neplatný! Je čas na serveru a na zařízení správný?
   user_mailer:
     backup_ready:
       explanation: Vyžádal/a jste si úplnou zálohu svého účtu Mastodon. Nyní je připravena ke stažení!
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 625cead43..88bf05d17 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -7,6 +7,7 @@ da:
     administered_by: 'Administreret af:'
     api: API
     apps: Apps til mobilen
+    apps_platforms: Brug Mastodon på iOS, Android og andre platformer
     contact: Kontakt
     contact_missing: Ikke sat
     contact_unavailable: Ikke tilgængeligt
@@ -139,8 +140,8 @@ da:
       search: Søg
       shared_inbox_url: Link til delt indbakke
       show:
-        created_reports: Anmeldelser oprettet af denne konto
-        targeted_reports: Anmeldelser fra denne konto
+        created_reports: Anmeldelser oprettet
+        targeted_reports: Anmeldelser fra andre
       silence: Dæmp
       silenced: Dæmpet
       statuses: Statusser
@@ -232,7 +233,7 @@ da:
       week_users_active: aktive denne uge
       week_users_new: brugere denne uge
     domain_blocks:
-      add_new: Tilføj ny
+      add_new: Tilføj ny domain block
       created_msg: Domæne blokade bliver nu behandlet
       destroyed_msg: Domæne blokade er blevet annulleret
       domain: Domæne
@@ -257,7 +258,7 @@ da:
           suspend: Fjern udelukkelsen af alle eksisterende konti fra dette domæne
         title: Annuller domæne blokeringen for domænet %{domain}
         undo: Fortryd
-      undo: Fortryd
+      undo: Fortryd domain block
     email_domain_blocks:
       add_new: Tilføj ny
       created_msg: Tilføjede succesfuldt email domænet til sortliste
@@ -271,7 +272,7 @@ da:
     followers:
       back_to_account: Tilbage til konto
     instances:
-      title: Kendte instanser
+      title: Førderation
     invites:
       deactivate_all: Deaktiver alle
       filter:
@@ -342,11 +343,11 @@ da:
         desc_html: Ændre udseendet med CSS indlæst på hver side
         title: Brugerdefineret CSS
       hero:
-        desc_html: Vist på forsiden. Mindst 600x100px anbefales. Hvis ikke sat, vil dette falde tilbage til billedet for instansen
+        desc_html: Vist på forsiden. Mindst 600x100px anbefales. Hvis ikke sat, vil dette falde tilbage til billedet fra serveren
         title: Billede af helt
       peers_api_enabled:
-        desc_html: Domæne navne denne instans er stødt på i fediverset
-        title: Udgiv liste over opdagede instanser
+        desc_html: Domæne navne denne server er stødt på i fediverset
+        title: Udgiv liste over opdagede server
       preview_sensitive_media:
         desc_html: Forhåndsvisninger af links på andre websider vil vise et miniaturebillede selv hvis mediet er markeret som følsomt
         title: Vis følsomt medie i OpenGraph forhåndsvisninger
@@ -368,20 +369,20 @@ da:
         title: Vis personale emblem
       site_description:
         desc_html: Introduktions afsnit på forsiden. Beskriv hvad der gør denne Mastodon server speciel og alt andet vigtigt. Du kan bruge HTML tags, især <code>&lt;a&gt;</code> og <code>&lt;em&gt;</code>.
-        title: Beskrivelse af instans
+        title: Beskrivelse af serveren
       site_description_extended:
-        desc_html: Et godt sted for placering af adfærdskodes, regler, retningslinjer og andre ting der gør din instans unik. Du kan bruge HTML tags
+        desc_html: Et godt sted for placering af adfærdskodes, regler, retningslinjer og andre ting der gør din server unik. Du kan bruge HTML tags
         title: Brugerdefineret udvidet information
       site_short_description:
-        desc_html: Vist på sidelinjen og meta tags. Beskriv hvad Mastodon er og hvad der gør denne server speciel i et enkelt afsnit. Hvis tomt, vil standard være beskrivelsen af instansen.
-        title: Kort beskrivelse af instans
+        desc_html: Vist på sidelinjen og meta tags. Beskriv hvad Mastodon er og hvad der gør denne server speciel i et enkelt afsnit. Hvis tomt, vil standard være beskrivelsen af serveren.
+        title: Kort beskrivelse af serveren
       site_terms:
         desc_html: Du kan skrive din egen privatlivpolitik, servicevilkår, eller lignende. Du kan bruge HTML tags
         title: Brugerdefineret servicevilkår
-      site_title: Navn på instans
+      site_title: Navn af serveren
       thumbnail:
         desc_html: Brugt til forhåndsvisninger via OpenGraph og API. 1200x630px anbefales
-        title: Miniaturebillede for instans
+        title: Miniaturebillede for serveren
       timeline_preview:
         desc_html: Vis offentlig tidslinje på landingssiden
         title: Tidslinje forhåndsvisning
@@ -431,7 +432,7 @@ da:
     warning: Vær meget forsigtig med disse data. Del dem aldrig med nogen!
     your_token: Din adgangs token
   auth:
-    agreement_html: Ved at oprette dig erklærer du dig enig i at følge <a href="%{rules_path}">instanses regler</a> og <a href="%{terms_path}">vores servicevilkår</a>.
+    agreement_html: Ved at oprette dig erklærer du dig enig i at følge <a href="%{rules_path}">serverens regler</a> og <a href="%{terms_path}">vores servicevilkår</a>.
     change_password: Kodeord
     confirm_email: Bekræft email
     delete_account: Slet konto
@@ -483,7 +484,7 @@ da:
     description_html: Dette vil <strong>permanent, uigenkaldeligt</strong> fjerne indhold fra din konto samt deaktivere den. Dit brugernavn vil forblive reserveret for at forhindre fremtidige efterligninger.
     proceed: Slet konto
     success_msg: Din konto er nu blevet slettet
-    warning_html: Kun sletning af indhold fra denne specifikke instans er garanteret. Indhold der er blevet delt rundt omkring vil sandsynligvis efterlade spor. Offline servere og servere der ikke længere abonnerer på dine opdateringer vil ikke opdatere deres databaser.
+    warning_html: Kun sletning af indhold fra denne specifikke server er garanteret. Indhold der er blevet delt rundt omkring vil sandsynligvis efterlade spor. Offline servere og servere der ikke længere abonnerer på dine opdateringer vil ikke opdatere deres databaser.
     warning_title: Tilgængelighed af delt indhold
   errors:
     '403': Du har ikke tilladelse til at se denne side.
@@ -538,7 +539,7 @@ da:
       one: Der er noget der ikke er helt som det bør være! Tag lige et kig på følgende fejl forneden
       other: Der er noget der ikke er helt som det bør være! Tag lige et kig på følgende %{count} fejl forneden
   imports:
-    preface: Du kan importere data du har eksporteret fra en anden instans, så som en liste over folk du følger eller blokerer.
+    preface: Du kan importere data du har eksporteret fra en anden server, så som en liste over folk du følger eller blokerer.
     success: Dine data blev succesfuldt uploaded og vil nu blive behandlet hurtigst muligt
     types:
       blocking: Blokeringsliste
@@ -563,7 +564,7 @@ da:
       one: 1 benyttelse
       other: "%{count} benyttelser"
     max_uses_prompt: Ubegrænset
-    prompt: Generer og del links med andre for at give dem adgang til denne instans
+    prompt: Generer og del links med andre for at give dem adgang til denne server
     table:
       expires_at: Udløber
       uses: Benyttelser
@@ -743,9 +744,9 @@ da:
     body_html: "<p><h2> Privatlivspolitik </h2> \n<h3 id=\"collect\">Hvilke information indsamler vi?</h3> \n\n<ul>\n  <li><em>Grundlæggende kontoinformation </em>: Hvis du registrerer dig på denne server, bliver du måske bedt om at indtaste et brugernavn, en e-mail-adresse og et kodeord. Du kan også indtaste yderligere profiloplysninger, såsom et visningsnavn og biografi, og uploade et profilbillede og headerbillede. Brugernavnet, visningsnavnet, biografien, profilbilledet og hovedbilledet vises altid offentligt. </li> \n  <li> <em>Stillinger, følgende og andre offentlige oplysninger </em>: Listen over personer du følger er offentliggjort, det samme gælder for dine tilhængere. Når du sender en besked, gemmes datoen og klokkeslættet såvel som det program, du sendte beskeden fra. Meddelelser kan indeholde medievedhæftninger, som f.eks. Billeder og videoer. Offentlige og unoterede indlæg er offentligt tilgængelige. Når du har et indlæg på din profil, er det også offentligt tilgængelig information. Dine indlæg leveres til dine tilhængere, i nogle tilfælde betyder det, at de leveres til forskellige servere, og der gemmes kopier der. Når du sletter indlæg, leveres det også til dine tilhængere. Handlingen med reblogging eller favorisering af et andet indlæg er altid offentligt. </li>\n  <li><em> Direkte og efterfølger-kun indlæg </ em>: Alle indlæg gemmes og behandles på serveren. Følgere-kun indlæg leveres til dine tilhængere og brugere, der er nævnt i dem, og direkte indlæg leveres kun til brugere nævnt i dem. I nogle tilfælde betyder det, at de leveres til forskellige servere, og der gemmes kopier der. Vi gør en god tro for at begrænse adgangen til disse stillinger kun til autoriserede personer, men andre servere kan undlade at gøre det. Derfor er det vigtigt at gennemgå de servere, dine tilhængere tilhører. Du kan skifte en mulighed for at godkende og afvise nye følgere manuelt i indstillingerne. <em> Vær opmærksom på, at operatørerne af serveren og enhver modtagende server muligvis kan se sådanne meddelelser </em>, og at modtagere muligvis skærmbilleder, kopierer eller på anden vis deler dem igen. <em> Del ikke nogen farlig information over Mastodon. </em> </li>\n  <li> <em> IP'er og andre metadata </em>: Når du logger ind, registrerer vi den IP-adresse, du logger ind fra, samt navnet på din browser-applikation. Alle indloggede sessioner er tilgængelige til din anmeldelse og tilbagekaldelse i indstillingerne. Den seneste anvendte IP-adresse gemmes i op til 12 måneder. Vi kan også beholde serverlogfiler, som indeholder IP-adressen til hver anmodning til vores server. </li>\n</ul>\n\n<hr class=\"spacer\" />\n\n<h3 id=\"use\">Hvad bruger vi dine oplysninger til? </h3>\n\n<p> Enhver af de oplysninger, vi indsamler fra dig, kan bruges på følgende måder: </p>\n\n<ul>\n  <li> At levere kernen funktionalitet Mastodon. Du kan kun interagere med andres indhold og indsende dit eget indhold, når du er logget ind. Du kan f.eks. Følge andre personer for at se deres kombinerede indlæg på din egen personlige tidslinje. </li>\n  <li> For at hjælpe moderering af samfundet, f.eks. sammenligning af din IP-adresse med andre kendte, for at bestemme forbud mod unddragelse eller andre overtrædelser. </li>\n  <li> Den e-mail-adresse, du angiver, kan bruges til at sende dig oplysninger, meddelelser om andre personer, der interagerer med dit indhold eller sender dig beskeder, og for at svare på henvendelser og / eller andre forespørgsler eller spørgsmål. </li>\n</ul>\n\n<hr class=\"spacer\" />\n\n<h3 id=\"protect\">Hvordan beskytter vi dine oplysninger? </h3>\n\n<p> Vi implementerer en række sikkerhedsforanstaltninger for at opretholde sikkerheden for dine personlige oplysninger, når du indtaster, indsender eller har adgang til dine personlige oplysninger. Bl.a. er din browsersession samt trafikken mellem dine applikationer og API'en sikret med SSL, og din adgangskode er hashed ved hjælp af en stærk envejsalgoritme. Du kan muligvis aktivere tofaktors godkendelse for yderligere at sikre adgang til din konto. </p>\n\n<hr class=\"spacer\" />\n\n<h3 id=\"data-retention\"> Hvad er vores data retention politik? </h3>\n\n<p> Vi vil gøre en god tro indsats for at: </p>\n\n<ul>\n  <li> Behold serverlogfiler, der indeholder IP-adressen på alle anmodninger til denne server, for så vidt som sådanne logfiler holdes, ikke mere end 90 dage. </li>\n  <li> Behold de IP-adresser, der er forbundet med registrerede brugere, ikke mere end 12 måneder. </li>\n</ul>\n\n<p> Du kan anmode om og downloade et arkiv af dit indhold, herunder dine indlæg, medievedhæftninger, profilbillede og headerbillede. </p>\n\n<p> Du kan til enhver tid slette din konto. </p>\n\n<hr class=\"spacer\" />\n\n<h3 id=\"cookies\"> Bruger vi cookies? </h3>\n\n<p> Ja. Cookies er små filer, som et websted eller dets tjenesteudbyder overfører til din computers harddisk via din webbrowser (hvis du tillader det). Disse cookies gør det muligt for webstedet at genkende din browser og, hvis du har en registreret konto, associerer den med din registrerede konto. </p>\n\n<p> Vi bruger cookies til at forstå og gemme dine præferencer til fremtidige besøg. </p>\n\n<hr class=\"spacer\" />\n\n<h3 id=\"disclose\"> Viser vi nogen information til eksterne parter? </h3>\n\n<p> Vi sælger ikke, handler eller på anden måde overfører dine personlige identificerbare oplysninger til eksterne parter. Dette omfatter ikke tillid til tredjeparter, der hjælper os med at drive vores hjemmeside, udføre vores forretning eller servicere dig, så længe parterne er enige om at holde disse oplysninger fortrolige. Vi kan også frigive dine oplysninger, når vi mener, at udgivelsen er hensigtsmæssig for at overholde loven, håndhæve vores webstedspolitikker eller beskytte vores eller andre rettigheder, ejendom eller sikkerhed. </p>\n\n<p> Dit offentlige indhold kan downloades af andre servere i netværket. Dine offentlige og efterfølger-kun indlæg leveres til de servere, hvor dine tilhængere er bosat, og direkte meddelelser leveres til modtagerens servere, for så vidt som disse tilhængere eller modtagere opholder sig på en anden server end dette. </p>\n\n<p> Når du autoriserer et program til at bruge din konto, afhænger det af omfanget af tilladelser, du godkender, det kan få adgang til dine offentlige profiloplysninger, din følgende liste, dine tilhængere, dine lister, alle dine indlæg og dine favoritter. Applikationer kan aldrig få adgang til din e-mail-adresse eller adgangskode. </p>\n\n<hr class=\"spacer\" />\n\n<h3 id=\"children\"> Bebyggelse af børn </h3>\n\n<p> Hvis denne server er i EU eller EØS: Vores websted, produkter og tjenester er alle rettet mod personer, der er mindst 16 år gamle. Hvis du er under 16 år, skal du ikke bruge dette websted efter kravene i GDPR (<a href=\"https://en.wikipedia.org/wiki/General_Data_Protection_Regulation\"> Generel databeskyttelsesforordning </a>). . </p>\n\n<p> Hvis denne server er i USA: Vores websted, produkter og tjenester er alle rettet mod personer, der er mindst 13 år. Hvis du er under 13 år, skal du ikke bruge kravene i COPPA (<a href=\"https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act\"> Børns online beskyttelse af personlige oplysninger </a>) dette websted. </p>\n\n<p> Lovkrav kan være anderledes, hvis denne server er i en anden jurisdiktion. </p>\n\n<hr class = \"spacer\" />\n\n<h3 id=\"changes\"> Ændringer i vores privatlivspolitik </h3>\n\n<p> Hvis vi beslutter os for at ændre vores privatlivspolitik, vil vi sende disse ændringer på denne side. </p>\n\n<p> Dette dokument er CC-BY-SA. Det blev senest opdateret 7. marts 2018. </p>\n\n<p> Oprindelig tilpasset fra <a href=\"https://github.com/discourse/discourse\"> Discourse privacy policy </a>.</p>\n"
     title: Vilkår og privatlivpolitik for %{instance}
   themes:
-    contrast: Høj kontrast
-    default: Mastodont
-    mastodon-light: Mastodon (lys)
+    contrast: Mastodon (Høj kontrast)
+    default: Mastodont (Mørk)
+    mastodon-light: Mastodon (Lys)
   time:
     formats:
       default: "%b %d, %Y, %H:%M"
@@ -778,7 +779,7 @@ da:
       final_action: Kom igang med at poste
       final_step: 'Start med at skrive opslag! Selv uden følgere vil dine offentlige beskeder kunne ses af andre, foreksempel på den lokale tidslinje og i hashtags. Måske kunne du tænke dig at introducere dig selv på #introductions hashtagget.'
       full_handle: Dit fulde brugernavn
-      full_handle_hint: Dette er hvad du vil fortælle dine venner så de kan sende dig beskeder eller følge dig fra andre instanser.
+      full_handle_hint: Dette er hvad du vil fortælle dine venner så de kan sende dig beskeder eller følge dig fra andre server.
       review_preferences_action: Ændre præferencer
       review_preferences_step: Vær sikker på at sætte dine præferencer, så som hvilke emails du kunne tænke dig at modtage, eller hvilket niveau af privatliv der skal være standard for dine opslag. Hvis du kunne tænke dig ikke at blive køresyg, kan du vælge at aktivere automatisk afspilning af GIFfer.
       subject: Velkommen til Mastodon
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 5c095c58a..6ac6e346b 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -4,25 +4,36 @@ de:
     about_hashtag_html: Dies sind öffentliche Beiträge, die mit <strong>#%{hashtag}</strong> getaggt wurden. Wenn du irgendwo im Fediversum ein Konto besitzt, kannst du mit ihnen interagieren.
     about_mastodon_html: Mastodon ist ein soziales Netzwerk. Es basiert auf offenen Web-Protokollen und freier, quelloffener Software. Es ist dezentral (so wie E-Mail!).
     about_this: Über diese Instanz
+    active_count_after: aktiv
+    active_footnote: Monatlich Aktive User (MAU)
     administered_by: 'Administriert von:'
     api: API
     apps: Mobile Apps
+    apps_platforms: Benutze Mastodon auf iOS, Android und anderen Plattformen
+    browse_directory: Durchsuche ein Profilverzeichnis und filtere nach Interessen
+    browse_public_posts: Durchsuche einen Zeitleiste an öffentlichen Beiträgen auf Mastodon
     contact: Kontakt
     contact_missing: Nicht angegeben
     contact_unavailable: N/A
+    discover_users: Benutzer entdecken
     documentation: Dokumentation
     extended_description_html: |
       <h3>Ein guter Platz für Regeln</h3>
       <p>Die erweiterte Beschreibung wurde noch nicht aufgesetzt.</p>
+    federation_hint_html: Mit einem Account auf %{instance} wirst du in der Lage sein Nutzern auf irgendeinem Mastodon-Server und darüber hinaus zu folgen.
     generic_description: "%{domain} ist ein Server im Netzwerk"
+    get_apps: Versuche eine mobile App
     hosted_on: Mastodon, beherbergt auf %{domain}
     learn_more: Mehr erfahren
     privacy_policy: Datenschutzerklärung
+    see_whats_happening: Finde heraus, was gerade in der Welt los ist
+    server_stats: 'Serverstatistiken:'
     source_code: Quellcode
     status_count_after:
       one: Statusmeldung
       other: Statusmeldungen
     status_count_before: mit
+    tagline: Finde Freunde und entdecke neue
     terms: Nutzungsbedingungen
     user_count_after:
       one: Benutzer:in
@@ -68,6 +79,7 @@ de:
       delete: Löschen
       destroyed_msg: Moderationsnotiz erfolgreich gelöscht!
     accounts:
+      approve: Aktzeptieren
       are_you_sure: Bist du sicher?
       avatar: Profilbild
       by_domain: Domain
@@ -113,6 +125,7 @@ de:
       moderation:
         active: Aktiv
         all: Alle
+        pending: Ausstehend
         silenced: Stummgeschaltet
         suspended: Gesperrt
         title: Moderation
@@ -122,6 +135,7 @@ de:
       no_limits_imposed: Keine Limits eingesetzt
       not_subscribed: Nicht abonniert
       outbox_url: Postausgangs-URL
+      pending: Ausstehender Review
       perform_full_suspension: Sperren
       profile_url: Profil-URL
       promote: Befördern
@@ -129,6 +143,7 @@ de:
       public: Öffentlich
       push_subscription_expires: PuSH-Abonnement läuft aus
       redownload: Profil neu laden
+      reject: Ablehnen
       remove_avatar: Profilbild entfernen
       remove_header: Header entfernen
       resend_confirmation:
@@ -291,6 +306,7 @@ de:
       back_to_account: Zurück zum Konto
       title: "%{acct}'s Follower"
     instances:
+      by_domain: Domain
       delivery_available: Zustellung ist verfügbar
       known_accounts:
         one: "%{count} bekanntes Konto"
@@ -399,6 +415,12 @@ de:
         min_invite_role:
           disabled: Niemand
           title: Einladungen erlauben von
+      registrations_mode:
+        modes:
+          approved: Zustimmung benötigt zur Registrierung
+          none: Niemand kann sich registrieren
+          open: Jeder kann sich registrieren
+        title: Registrierungsmodus
       show_known_fediverse_at_about_page:
         desc_html: Wenn aktiviert, wird es alle Beiträge aus dem bereits bekannten Teil des Fediversums auf der Startseite anzeigen. Andernfalls werden lokale Beitrage der Instanz angezeigt.
         title: Verwende öffentliche Zeitleiste für die Vorschau
@@ -461,6 +483,9 @@ de:
       edit_preset: Warnungsvorlage bearbeiten
       title: Warnungsvorlagen verwalten
   admin_mailer:
+    new_pending_account:
+      body: Die Details von diesem neuem Konto sind unten. Du kannst die Anfrage akzeptieren oder ablehnen.
+      subject: Neues Konto zur Überprüfung auf %{instance} verfügbar (%{username})
     new_report:
       body: "%{reporter} hat %{target} gemeldet"
       body_remote: Jemand von %{domain} hat %{target} gemeldet
@@ -482,7 +507,9 @@ de:
     your_token: Dein Zugangs-Token
   auth:
     agreement_html: Indem du dich registrierst, erklärst du dich mit den untenstehenden <a href="%{rules_path}">Regeln des Servers</a> und der <a href="%{terms_path}">Datenschutzerklärung</a> einverstanden.
+    apply_for_account: Eine Einladung anfragen
     change_password: Passwort
+    checkbox_agreement_html: Ich akzeptiere die <a href="%{rules_path}" target="_blank">Server-Regeln</a> und die <a href="%{terms_path}" target="_blank">Nutzungsbedingungen</a>
     confirm_email: E-Mail bestätigen
     delete_account: Konto löschen
     delete_account_html: Falls du dein Konto löschen willst, kannst du <a href="%{path}">hier damit fortfahren</a>. Du wirst um Bestätigung gebeten werden.
@@ -498,10 +525,12 @@ de:
       cas: CAS
       saml: SAML
     register: Registrieren
+    registration_closed: "%{instance} akzeptiert keine neuen Mitglieder"
     resend_confirmation: Bestätigungs-Mail erneut versenden
     reset_password: Passwort zurücksetzen
     security: Sicherheit
     set_new_password: Neues Passwort setzen
+    trouble_logging_in: Schwierigkeiten beim anmelden?
   authorize_follow:
     already_following: Du folgst diesem Konto bereits
     error: Das Remote-Konto konnte nicht geladen werden
@@ -557,6 +586,9 @@ de:
       content: Bitte verzeih, etwas ist bei uns schief gegangen.
       title: Diese Seite ist kaputt
     noscript_html: Bitte aktiviere JavaScript, um die Mastodon-Web-Anwendung zu verwenden. Alternativ kannst du auch eine der <a href="%{apps_path}">nativen Mastodon-Anwendungen</a> für deine Plattform probieren.
+  existing_username_validator:
+    not_found: kann lokalen Benutzer nicht mit diesem Nuternamen finden
+    not_found_multiple: kann %{usernames} nicht finden
   exports:
     archive_takeout:
       date: Datum
@@ -597,12 +629,30 @@ de:
     more: Mehr…
     resources: Ressourcen
   generic:
+    all: Alle
     changes_saved_msg: Änderungen gespeichert!
     copy: Kopieren
     save_changes: Änderungen speichern
     validation_errors:
       one: Etwas ist noch nicht ganz richtig! Bitte korrigiere den Fehler
       other: Etwas ist noch nicht ganz richtig! Bitte korrigiere %{count} Fehler
+  html_validator:
+    invalid_markup: 'enthält ungültiges HTML-Markup: %{error}'
+  identity_proofs:
+    active: Aktiv
+    authorize: Ja, autorisieren
+    authorize_connection_prompt: Diese kryptographische Verbindung autorisieren?
+    errors:
+      failed: Die kryptographische Verbindung ist fehlgeschlagen. Bitte versuche es nochmal von %{provider}.
+      keybase:
+        invalid_token: Keybase-Tokens sind Hashsignaturen und müssen 66 Hexadezimalzeichen lang sein
+        verification_failed: Keybase nimmt dieses Token nicht als Signatur für Keybase-Benutzer %{kb_username} an. Bitte versuche es nochmal über Keybase.
+    explanation_html: Hier kannst du kryptographisch deine anderen Identitäten wie dein Keybase-Profil verbinden. Dadurch können andere Leute dir verschlüsselte Nachrichten senden und dem Inhalt, den sie dir senden, vertrauen.
+    i_am_html: Ich bin %{username} auf %{service}.
+    identity: Identität
+    inactive: Inaktiv
+    status: Verifizierungsstatus
+    view_proof: Zeige Nachweis
   imports:
     modes:
       merge: Zusammenführen
@@ -705,11 +755,32 @@ de:
     older: Älter
     prev: Zurück
     truncate: "&hellip;"
+  polls:
+    errors:
+      already_voted: Du hast bereits für diese Umfrage abgestimmt
+      duplicate_options: enthält doppelte Einträge
+      duration_too_long: ist zu weit in der Zukunft
+      duration_too_short: ist zu früh
+      expired: Die Umfrage ist bereits vorbei
+      over_character_limit: kann nicht länger als jeweils %{max} Zeichen sein
+      too_few_options: muss mindestens einen Eintrag haben
+      too_many_options: kann nicht mehr als %{max} Einträge beinhalten
   preferences:
     languages: Sprachen
     other: Weiteres
     publishing: Beiträge
     web: Web
+  relationships:
+    activity: Kontoaktivität
+    dormant: Inaktiv
+    moved: Umgezogen
+    mutual: Bekannt
+    primary: Primär
+    relationship: Beziehung
+    remove_selected_domains: Entferne alle Follower von den ausgewählten Domains
+    remove_selected_followers: Entferne ausgewählte Follower
+    remove_selected_follows: Entfolge ausgewählte Benutzer
+    status: Kontostatus
   remote_follow:
     acct: Profilname@Domain, von wo aus du dieser Person folgen möchtest
     missing_resource: Die erforderliche Weiterleitungs-URL für dein Konto konnte nicht gefunden werden
@@ -784,10 +855,12 @@ de:
     edit_profile: Profil bearbeiten
     export: Datenexport
     featured_tags: Empfohlene Hashtags
+    identity_proofs: Identitätsnachweise
     import: Datenimport
     migrate: Konto-Umzug
     notifications: Benachrichtigungen
     preferences: Einstellungen
+    relationships: Folgende und Follower
     settings: Einstellungen
     two_factor_authentication: Zwei-Faktor-Auth
     your_apps: Deine Anwendungen
@@ -813,6 +886,11 @@ de:
       ownership: Du kannst nur eigene Beiträge anheften
       private: Du kannst nur öffentliche Beiträge anheften
       reblog: Du kannst keine geteilten Beiträge anheften
+    poll:
+      total_votes:
+        one: "%{count} Stimme"
+        other: "%{count} Stimmen"
+      vote: Abstimmen
     show_more: Mehr anzeigen
     sign_in_to_participate: Melde dich an, um an der Konversation teilzuhaben
     title: '%{name}: "%{quote}"'
@@ -834,7 +912,7 @@ de:
 
       <ul>
         <li><em>Grundlegende Kontoinformationen</em>: Wenn du dich auf diesem Server registrierst, wirst du darum gebeten, einen Benutzer:innen-Namen, eine E-Mail-Adresse und ein Passwort einzugeben. Du kannst auch zusätzliche Profilinformationen wie etwa einen Anzeigenamen oder eine Biografie eingeben und ein Profilbild oder ein Headerbild hochladen. Der Benutzer:innen-Name, der Anzeigename, die Biografie, das Profilbild und das Headerbild werden immer öffentlich angezeigt.</li>
-        <li><em>Beiträge, Folge- und andere öffentliche Informationen</em>: Die Liste der Leute, denen du folgst, wird öffentlich gezeigt, das gleiche gilt für deine Folgenden (Follower). Sobald du eine Nachricht übermittelst, wird das Datum und die Uhrzeit gemeinsam mit der Information, welche Anwendung du dafür verwendet hast, gespeichert. Nachricht können Medienanhänge enthalten, etwa Bilder und Videos. Öffentliche und ungelistete Beiträge sind öffentlich verfügbar. Sobald du einen Beitrag auf deinem Profil featurest, sind dies auch öffentlich verfügbare Informationen. Deine Beiträge werden an deine Folgenden ausgeliefert, was in manchen Fällen bedeutet, dass sie an andere Server ausgeliefert werden und dort Kopien gespeichert werden. Sobald du Beiträge löschst, wird dies ebenso an deine Follower ausgeliefert. Die Handlungen des Teilens und Favorisieren eines anderen Beitrages ist immer öffentlich.</li>
+        <li><em>Beiträge, Folge- und andere öffentliche Informationen</em>: Die Liste der Leute, denen du folgst, wird öffentlich gezeigt, das gleiche gilt für deine Folgenden (Follower). Sobald du eine Nachricht übermittelst, wird das Datum und die Uhrzeit gemeinsam mit der Information, welche Anwendung du dafür verwendet hast, gespeichert. Nachricht können Medienanhänge enthalten, etwa Bilder und Videos. Öffentliche und ungelistete Beiträge sind öffentlich verfügbar. Sobald du einen Beitrag auf deinem Profil anpinnst, sind dies auch öffentlich verfügbare Informationen. Deine Beiträge werden an deine Folgenden ausgeliefert, was in manchen Fällen bedeutet, dass sie an andere Server ausgeliefert werden und dort Kopien gespeichert werden. Sobald du Beiträge löschst, wird dies ebenso an deine Follower ausgeliefert. Die Handlungen des Teilens und Favorisieren eines anderen Beitrages ist immer öffentlich.</li>
         <li><em>Direkte und "Nur Folgende"-Beiträge</em>: Alle Beiträge werden auf dem Server gespeichert und verarbeitet. "Nur Folgende"-Beiträge werden an deine Folgenden und an Benutzer:innen, die du in ihnen erwähnst, ausgeliefert, direkte Beiträge nur an in ihnen erwähnte Benutzer:innen. In manchen Fällen bedeutet dass, dass sie an andere Server ausgeliefert werden und dort Kopien gespeichert werden. Wir bemühen uns nach bestem Wissen und Gewissen, den Zugriff auf diese Beiträge auf nur autorisierte Personen einzuschränken, jedoch könnten andere Server dabei scheitern. Deswegen ist es wichtig, die Server, zu denen deine Folgenden gehören, zu überprüfen. Du kannst eine Option in den Einstellungen umschalten, um neue Folgenden manuell anzunehmen oder abzuweisen. <em>Bitte beachte, dass die Betreiber des Server und jedes empfangenden Servers solche Nachrichten anschauen könnten</em> und dass Empfänger von diesen eine Bildschirmkopie erstellen könnten, sie kopieren oder anderweitig weiterverteilen könnten. <em>Teile nicht irgendwelche gefährlichen Informationen über Mastodon.</em></li>
         <li><em>Internet Protocol-Adressen (IP-Adressen) und andere Metadaten</em>: Sobald du dich anmeldest, erfassen wir sowohl die IP-Adresse, von der aus du dich anmeldest, als auch den Namen deine Browseranwendung. Alle angemeldeten Sitzungen (Sessions) sind für deine Überprüfung und Widerruf in den Einstellungen verfügbar. Die letzte verwendete IP-Adresse wird bis zu 12 Monate lang gespeichert. Wir könnten auch Serverprotokoll behalten, welche die IP-Adresse von jeder Anfrage an unseren Server enthalten.</li>
       </ul>
@@ -870,7 +948,7 @@ de:
 
       <p>Du kannst ein Archiv deines Inhalts anfordern und herunterladen, inkludierend deiner Beiträge, Medienanhänge, Profilbilder und Headerbilder.</p>
 
-      <p>Du kannst dein Konto jederzeit unwiderruflich  löschen.</p>
+      <p>Es ist in den meisten Fällen möglich dein Konto jederzeit eigenmächtig unwiderruflich zu löschen.</p>
 
       <hr class="spacer"/>
 
@@ -894,7 +972,7 @@ de:
 
       <h3 id="children">Webseitenbenutzung durch Kinder</h3>
 
-      <p>Wenn sich dieser Server in der EU oder im Europäischen Wirtschaftsraum befinden: Unsere Website, Produkte und Dienstleistungen sind alle an Leute gerichtet, die mindestens 16 Jahre als sind. Wenn du unter 16 bist, darfst du nach den Bestimmungen der DSGVO (<a href="https://de.wikipedia.org/wiki/Datenschutz-Grundverordnung">Datenschutz-Grundverordnung</a>) diese Webseite nicht benutzen.</p>
+      <p>Wenn sich dieser Server in der EU oder im Europäischen Wirtschaftsraum befindet: Unsere Website, Produkte und Dienstleistungen sind alle an Leute gerichtet, die mindestens 16 Jahre als sind. Wenn du unter 16 bist, darfst du nach den Bestimmungen der DSGVO (<a href="https://de.wikipedia.org/wiki/Datenschutz-Grundverordnung">Datenschutz-Grundverordnung</a>) diese Webseite nicht benutzen.</p>
 
       <p>Wenn sich dieser Server in den USA befindet: Unsere Webseite, Produkte und Dienstleistungen sind alle an Leute gerichtet, die mindestens 13 Jahre alt sind. Wenn du unter 13 bist, darfst du nach den Bestimmungen des COPPA (<a href="https://de.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act, dt. "Gesetz zum Schutz der Privatsphäre von Kindern im Internet"</a>) diese Webseite nicht benutzen.</p>
 
diff --git a/config/locales/devise.ca.yml b/config/locales/devise.ca.yml
index 89d837571..aea361d0d 100644
--- a/config/locales/devise.ca.yml
+++ b/config/locales/devise.ca.yml
@@ -12,6 +12,7 @@ ca:
       last_attempt: Tens un intent més, abans que es bloqui el compte.
       locked: El compte s'ha blocat.
       not_found_in_database: "%{authentication_keys} o contrasenya no vàlids."
+      pending: El teu compte encara està en revisió.
       timeout: La sessió ha expirat. Inicia sessió una altra vegada per a continuar.
       unauthenticated: Cal iniciar sessió o registrar-se abans de continuar.
       unconfirmed: Has de confirmar l'adreça de correu electrònic abans de continuar.
@@ -20,6 +21,7 @@ ca:
         action: Verifica l'adreça de correu
         action_with_app: Confirma i torna a %{app}
         explanation: Has creat un compte a %{host} amb aquesta adreça de correu electrònic. Estàs a un sol clic de l'activació. Si no fos així, ignora aquest correu electrònic.
+        explanation_when_pending: Has sol·licitat una invitació a %{host} amb aquesta adreça de correu electrònic. Un cop confirmis la teva adreça de correu electrònic revisarem la teva sol·licitud. No es pot iniciar la sessió fins llavors. Si la teva sol·licitud és rebutjada les teves dades s’eliminaran, de manera que no s’exigirà cap altra acció. Si no has estat tu qui ha fet aquest sol·licitud si us plau ignora aquest correu electrònic.
         extra_html: Si us plau consulta també <a href="%{terms_path}"> les regles del servidor</a> i <a href="%{policy_path}"> les nostres condicions de servei</a>.
         subject: 'Mastodon: Instruccions de confirmació %{instance}'
         title: Verifica l'adreça de correu
@@ -60,6 +62,7 @@ ca:
       signed_up: Benvingut! T'has registrat amb èxit.
       signed_up_but_inactive: T´has registrat amb èxit. No obstant, no podem identificar-te perquè el compte encara no s'ha activat.
       signed_up_but_locked: T´has registrat amb èxit. No obstant, no podem identificar-te perquè el compte està blocat.
+      signed_up_but_pending: S'ha enviat un missatge amb un enllaç de confirmació a la teva adreça de correu electrònic. Després de que hagis fet clic a l'enllaç, revisarem la teva sol·licitud. Se't notificarà si s'aprova.
       signed_up_but_unconfirmed: Un missatge amb un enllaç de confirmació ha estat enviat per correu electrònic. Si us plau segueixi l'enllaç per activar el seu compte.
       update_needs_confirmation: Ha actualitzat el seu compte amb èxit, però necessitem verificar la nova adreça de correu. Si us plau comprovi el correu i segueixi l'enllaç per confirmar la nova adreça de correu.
       updated: el seu compte ha estat actualitzat amb èxit.
diff --git a/config/locales/devise.co.yml b/config/locales/devise.co.yml
index 89688a5a9..16481737f 100644
--- a/config/locales/devise.co.yml
+++ b/config/locales/devise.co.yml
@@ -12,6 +12,7 @@ co:
       last_attempt: Avete un’ultimu tintativu nanzu chì u vostru contu sia chjosu.
       locked: U vostru contu hè chjosu.
       not_found_in_database: L’ %{authentication_keys} o a chjave d’accessu ùn sò curretti.
+      pending: U vostru contu hè sempre in corsu di rivista.
       timeout: A vostra sezzione hè spirata. Ricunnettatevi pè cuntinuà.
       unauthenticated: Cunnettatevi o arregistratevi pè cuntinuà.
       unconfirmed: Duvete cunfirmà u vostru contu pè cuntinuà.
@@ -20,6 +21,7 @@ co:
         action: Verificà l’indirizzu email
         action_with_app: Cunfirmà è rivene à %{app}
         explanation: Avete creatu un contu nant’à %{host} cù st’indirizzu email. Pudete attivallu cù un clic, o ignurà quessu missaghji s’ellu un era micca voi.
+        explanation_when_pending: Avete dumandatu un'invitazione à %{host}, cù st'indirizzu e-mail. Una volta ch'ellu hè cunfirmatu, avemu da dà un'ochjata à a vostra dumanda. Ùn pudete micca cunnettavi nanz'à quessa. S'ella hè righjittata a vostra dumanda, i vostri dati saranu sguassati è ùn duverete fà nund'altru. S'ellu ùn era micca voi, pudete ignurà quess'e-mail.
         extra_html: Pensate à leghje <a href="%{terms_path}">e regule di u servore</a> è <a href="%{policy_path}">i termini d’usu</a>.
         subject: 'Mastodon: Istruzzione di cunfirmazione per %{instance}'
         title: Verificà l’indirizzu email
@@ -60,6 +62,7 @@ co:
       signed_up: Benvinutu! Site cunnettatu·a.
       signed_up_but_inactive: Site arregistratu·a, mà ùn pudete micca cunnettavi perchè u vostru contu deve esse attivatu.
       signed_up_but_locked: Site arregistratu·a, mà ùn pudete micca cunnettavi perchè u vostru contu hè chjosu.
+      signed_up_but_pending: Un missaghju cù un ligame di cunfirmazione hè statu mandatu à u vostr'indirizzu e-mail. Dop'à avè cliccatu u ligame, avemu da rivede a vostra dumanda - sarete nutificatu·a s'ella hè appruvata.
       signed_up_but_unconfirmed: Un missaghju cù un ligame di cunfirmazione hè statu mandatu à u vostru indirizzu e-mail. Aprite stu ligame pè attivà u vostru contu. Pensate à verificà u cartulare di spam s’ellu ùn c’hè nunda.
       update_needs_confirmation: U vostru contu hè statu messu à ghjornu mà duvemu verificà u vostru novu e-mail. Un missaghju cù un ligame di cunfirmazione hè statu mandatu. Pensate à verificà u cartulare di spam s’ellu ùn c’hè nunda.
       updated: U vostru contu hè statu messu à ghjornu.
diff --git a/config/locales/devise.cs.yml b/config/locales/devise.cs.yml
index a1d36042a..bc9340605 100644
--- a/config/locales/devise.cs.yml
+++ b/config/locales/devise.cs.yml
@@ -20,7 +20,7 @@ cs:
       confirmation_instructions:
         action: Potvrdit e-mailovou adresu
         action_with_app: Potvrdit a navrátit se do %{app}
-        explanation: S touto e-mailovou adresou jste si vytvořil/a účet na %{host}. K jeho aktivaci vám zbývá jedno kliknutí. Pokud jste to nebyl/a vy, ignorujte této e-mail.
+        explanation: S touto e-mailovou adresou jste si vytvořil/a účet na %{host}. K jeho aktivaci vám zbývá jedno kliknutí. Pokud jste to nebyl/a vy, prosím ignorujte tento e-mail.
         explanation_when_pending: S touto e-mailovou adresou jste si vyžádal/a pozvánku na %{host}. Jakmile svou e-mailovou adresu potvrdíte, posoudíme váš poadavek. Do té doby se nemůžete přihlásit. Pokud bude váš požadavek zamítnut, budou vaše data odstraněna, takže od vás nebude vyžadována žádná další akce. Pokud jste to nebyl/a vy, prosím ignorujte tento e-mail.
         extra_html: Prosím podívejte se také na <a href="%{terms_path}">pravidla tohoto serveru</a> a <a href="%{policy_path}">naše podmínky používání</a>.
         subject: 'Mastodon: Potvrzovací instrukce pro %{instance}'
diff --git a/config/locales/devise.de.yml b/config/locales/devise.de.yml
index 5b060e0e7..bd573dc3e 100644
--- a/config/locales/devise.de.yml
+++ b/config/locales/devise.de.yml
@@ -12,6 +12,7 @@ de:
       last_attempt: Du hast noch einen Versuch, bevor dein Konto gesperrt wird.
       locked: Dein Konto ist gesperrt.
       not_found_in_database: "%{authentication_keys} oder Passwort ungültig."
+      pending: Dein Konto wird immer noch überprüft.
       timeout: Deine Sitzung ist abgelaufen. Bitte melde dich erneut an, um fortzufahren.
       unauthenticated: Du musst dich anmelden oder registrieren, bevor du fortfahren kannst.
       unconfirmed: Du musst deine E-Mail-Adresse bestätigen, bevor du fortfahren kannst.
@@ -20,6 +21,7 @@ de:
         action: E-Mail-Adresse verifizieren
         action_with_app: Bestätigen und zu %{app} zurückkehren
         explanation: Du hast einen Account auf %{host} mit dieser E-Mail-Adresse erstellt. Du bist nun einen Klick entfernt vor der Aktivierung. Wenn du das nicht warst, kannst du diese E-Mail ignorieren.
+        explanation_when_pending: Du hast dich für eine Einladung bei %{host} mit dieser E-Mailadresse beworben. Sobald du deine E-Mailadresse bestätigst werden wir deine Anfrage überprüfen. Du kannst dich in dieser Zeit nicht anmelden. Wenn deine Anfrage abgelehnt wird, werden deine Daten entfernt, also wird keine weitere Handlung benötigt. Wenn du das nicht warst kannst du diese E-Mail ignorieren.
         extra_html: Bitte lies auch die <a href="%{terms_path}">Regeln des Servers</a> und <a href="%{policy_path}">unsere Nutzungsbedingungen</a>.
         subject: 'Mastodon: Bestätigung deines Kontos bei %{instance}'
         title: Verifiziere E-Mail-Adresse
@@ -60,6 +62,7 @@ de:
       signed_up: Willkommen! Du hast dich erfolgreich registriert.
       signed_up_but_inactive: Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Konto inaktiv ist.
       signed_up_but_locked: Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Konto gesperrt ist.
+      signed_up_but_pending: Eine Nachricht mit einem Bestätigungslink wurde an dich per E-Mail geschickt. Nachdem du diesen Link angeklickt hast werden wir deine Anfrage überprüfen. Du wirst benachrichtigt falls die Anfrage angenommen wurde.
       signed_up_but_unconfirmed: Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Konto noch nicht bestätigt ist. Du erhältst in Kürze eine E-Mail. Darin ist erklärt, wie du dein Konto freischalten kannst.
       update_needs_confirmation: Deine Daten wurden aktualisiert, aber du musst deine neue E-Mail-Adresse bestätigen. Du erhältst in wenigen Minuten eine E-Mail. Darin ist erklärt, wie du die Änderung deiner E-Mail-Adresse abschließen kannst.
       updated: Deine Daten wurden aktualisiert.
diff --git a/config/locales/devise.el.yml b/config/locales/devise.el.yml
index e9725d96b..0b5c68636 100644
--- a/config/locales/devise.el.yml
+++ b/config/locales/devise.el.yml
@@ -12,6 +12,7 @@ el:
       last_attempt: Έχεις μια ακόμα προσπάθεια πριν κλειδωθεί ο λογαριασμός σου.
       locked: Ο λογαριασμός σου κλειδώθηκε.
       not_found_in_database: Λάθος %{authentication_keys} ή συνθηματικό.
+      pending: Εκκρεμεί η έγκριση του λογαριασμού σου.
       timeout: Η τρέχουσα σύνδεσή σου έληξε. Παρακαλούμε συνδέσου ξανά για να συνεχίσεις.
       unauthenticated: Πρέπει να συνδεθείς ή να εγγραφείς για να συνεχίσεις.
       unconfirmed: Πρέπει να επιβεβαιώσεις τη διεύθυνση email σου για να συνεχίσεις.
@@ -20,6 +21,7 @@ el:
         action: Επιβεβαίωσε διεύθυνση email
         action_with_app: Επιβεβαίωση και επιστροφή στο %{app}
         explanation: Δημιούργησες έναν λογαριασμό στο %{host} με αυτή τη διεύθυνση email. Με ένα κλικ θα τον ενεργοποιήσεις. Αν δεν το έκανες εσύ, παρακαλούμε αγνόησε αυτό το email.
+        explanation_when_pending: Έχεις υποβάλλει αίτηση πρόσκλησης στο %{host} με αυτή την ηλεκτρονική διεύθυνση email. Μόλις επιβεβαιώσεις το email σου, θα ελέγξουμε την αίτηση σου. Μέχρι τότε δε θα μπορεις να συνδεθείς. Αν απορριφθεί η αίτησή σου, τα στοιχεία σου θα αφαιρεθούν, άρα δε θα χρειαστεί να κάνεις κάτι επιπλέον. Αν δεν υπέβαλες εσύ την αίτηση, αγνόησε αυτό το email.
         extra_html: Παρακαλούμε να διαβάσεις <a href="%{terms_path}">του κανόνες αυτού του κόμβου</a> και <a href="%{policy_path}">τους όρους χρήσης της υπηρεσίας μας</a>.
         subject: 'Mastodon: Οδηγίες επιβεβαίωσης για %{instance}'
         title: Επιβεβαίωσε διεύθυνση email
@@ -60,6 +62,7 @@ el:
       signed_up: Καλώς ήρθες! Εγγράφηκες με επιτυχία.
       signed_up_but_inactive: Εγγράφηκες με επιτυχία. Όμως δε μπορέσαμε να σε συνδέσουμε γιατί ο λογαριασμός σου δεν έχει ενεργοποιηθεί ακόμα.
       signed_up_but_locked: Εγγράφηκες με επιτυχία. Όμως δε μπορέσαμε να σε συνδέσουμε γιατί ο λογαριασμός σου είναι κλειδωμένος.
+      signed_up_but_pending: Στάλθηκε στο email σου μήνυμα με ένα σύνδεσμο επιβεβαίωσης. Μόλις τον ακολουθήσεις θα ελέγξουμε την αίτηση σου. Θα ειδοποιήσεις εάν γίνει δεκτή.
       signed_up_but_unconfirmed: Σου στείλαμε ένα μήνυμα με σύνδεσμο επιβεβαίωσης στη διεύθυνση email σου. Παρακαλούμε ακολούθησε το σύνδεσμο για να ενεργοποιήσεις το λογαριασμό σου. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το λάβεις.
       update_needs_confirmation: Ενημέρωσες το λογαριασμό σου με επιτυχία αλλά χρειαζόμαστε να επιβεβαιώσουμε τη νέα διεύθυνση email σου. Παρακαλούμε έλεγξε τα email σου και ακολούθησε το σύνδεσμο για να την επιβεβαιώσεις. Παρακαλούμε έλεγξε το φάκελο με τα ανεπιθύμητα μηνύματα σου αν δεν το λάβεις.
       updated: Ο λογαριασμός σου επιβεβαιώθηκε με επιτυχία.
diff --git a/config/locales/devise.fa.yml b/config/locales/devise.fa.yml
index 1375c43f5..963572e6b 100644
--- a/config/locales/devise.fa.yml
+++ b/config/locales/devise.fa.yml
@@ -12,6 +12,7 @@ fa:
       last_attempt: پیش از آن که حساب شما قفل شود، یک فرصت دیگر دارید.
       locked: حساب شما قفل شده است.
       not_found_in_database: خطای %{authentication_keys} یا رمز نامعتبر.
+      pending: حساب شما همچنان در دست بررسی است.
       timeout: مهلت این ورود شما به سر رسید. برای ادامه، دوباره وارد شوید.
       unauthenticated: برای ادامه باید وارد شوید یا ثبت نام کنید.
       unconfirmed: برای ادامه باید نشانی ایمیل خود را تأیید کنید.
@@ -20,6 +21,7 @@ fa:
         action: تأیید نشانی ایمیل
         action_with_app: تأیید و بازگشت به %{app}
         explanation: شما با این نشانی ایمیل حسابی در %{host} باز کرده‌اید. با یک کلیک می‌توانید این حساب را فعال کنید. اگر شما چنین کاری نکردید، لطفاً این ایمیل را نادیده بگیرید.
+        explanation_when_pending: شما با این نشانی ایمیل برای %{host} درخواست دعوت‌نامه داده‌اید. اگر ایمیل خود را تأیید کنید، ما درخواست شما را بررسی خواهیم کرد. تا وقتی بررسی تمام نشده، شما نمی‌توانید به حساب خود وارد شوید. اگر درخواست شما رد شود، ما اطلاعاتی را که از شما داریم پاک خواهیم کرد پس نیازی به کاری از سمت شما نخواهد بود. اگر شما چنین درخواستی نداده‌اید، لطفاً این ایمیل را نادیده بگیرید.
         extra_html: لطفاً همچنین <a href="%{terms_path}">قانون‌های این سرور</a> و <a href="%{policy_path}">شرایط کاربری</a> آن را ببینید.
         subject: 'ماستدون: راهنمایی برای تأیید %{instance}'
         title: تأیید نشانی ایمیل
@@ -60,6 +62,7 @@ fa:
       signed_up: خوش آمدید! شما با موفقیت ثبت نام کردید.
       signed_up_but_inactive: خوش آمدید! شما با موفقیت ثبت نام کردید. ولی هنوز وارد سیستم نیستید زیرا حساب شما هنوز فعال نیست.
       signed_up_but_locked: خوش آمدید! شما با موفقیت ثبت نام کردید. ولی هنوز وارد سیستم نیستید زیرا حساب شما قفل شده است.
+      signed_up_but_pending: پیغامی که دارای یک پیوند برای تأیید است به نشانی ایمیل شما فرستاده شده. پس از این‌که پیوند را باز کردید، ما درخواست شما را بررسی خواهیم کرد. اگر درخواست شما پذیرفته شود، به شما خواهیم گفت.
       signed_up_but_unconfirmed: یک پیغام برای تأیید به نشانی ایمیل شما فرستاده شده. لطفاً پیوند موجود در ایمیل را دنبال کنید تا حسابتان فعال شود.
       update_needs_confirmation: شما با موفقیت حسابتان را به‌روز کردید، ولی لازم است که ما نشانی ایمیل تازهٔ شما را تأیید کنیم. لطفاً ایمیل خود را ببینید و پیوند موجود در ایمیل را دنبال کنید تا تا نشانی ایمیل تازهٔ شما تأیید شود.
       updated: حساب شما با موفقبت به‌روز شد.
diff --git a/config/locales/devise.gl.yml b/config/locales/devise.gl.yml
index d456d25df..60a935a8a 100644
--- a/config/locales/devise.gl.yml
+++ b/config/locales/devise.gl.yml
@@ -12,6 +12,7 @@ gl:
       last_attempt: Quédalle un intento antes de que a conta sexa bloqueada.
       locked: A súa conta foi bloqueada.
       not_found_in_database: Contrasinal ou %{authentication_keys} non válidos.
+      pending: A súa conta está en proceso de revisión.
       timeout: Caducou a sesión. Por favor conéctese de novo para seguir.
       unauthenticated: Precisa rexistrarse ou conectarse para continuar.
       unconfirmed: Debe confirmar o seu enderezo de correo antes de continuar.
@@ -20,6 +21,7 @@ gl:
         action: Validar enderezo de correo-e
         action_with_app: Confirmar e voltar a %{app}
         explanation: Creou unha conta en %{host} con este enderezo de correo. Está a punto de activalo, si non foi vostede quen fixo a petición, por favor ignore este correo.
+        explanation_when_pending: Vostede solicitou un convite para %{host} con este enderezo de correo. Unha vez confirme o enderezo de correo revisaremos a solicitude. Non pode conectarse ata entón. Si a solicitude fose rexeitada, os seus datos eliminaranse, así que non precisaría facer nada máis. Se non fixo vostede unha solicitude por favor ignore este correo.
         extra_html: Por favor, lea tamén <a href="%{terms_path}">as normas do sevidor</a> e <a href="%{policy_path}">os termos do servizo</a>.
         subject: 'Mastodon: Instruccións de confirmación para %{instance}'
         title: Verificar enderezo de correo-e
@@ -60,6 +62,7 @@ gl:
       signed_up: Ben vida! Rexistrouse con éxito.
       signed_up_but_inactive: Rexistrouse correctamente. Porén, aínda non podemos conectala porque a súa conta aínda non foi activada.
       signed_up_but_locked: Rexistrouse correctamente. Porén, non podemos conectala porque a conta está bloqueada.
+      signed_up_but_pending: Enviouselle unha mensaxe de correo que contén unha ligazón de confirmación. Tras pulsar na ligazón, revisaremos a súa solicitude. Notificarémoslle se está aprobada.
       signed_up_but_unconfirmed: Foi enviada unha mensaxe con unha ligazón de confirmación ao seu enderezo electrónico. Por favor siga a ligazón para activar a súa conta. Por favor comprobe o cartafol de spam si non recibe este correo.
       update_needs_confirmation: Actualizou a súa conta correctamente, pero precisamos verificar o seu enderezo. Por favor comprobe o seu email e siga a ligazón de confirmación para confirmar o seu novo enderezo. Por favor comprobe o cartafol de spam si non recibe este correo.
       updated: A súa conta foi actualizada correctamente.
diff --git a/config/locales/devise.ja.yml b/config/locales/devise.ja.yml
index b4772d8d6..3dac63050 100644
--- a/config/locales/devise.ja.yml
+++ b/config/locales/devise.ja.yml
@@ -21,7 +21,7 @@ ja:
         action: メールアドレスの確認
         action_with_app: 確認し %{app} に戻る
         explanation: このメールアドレスで%{host}にアカウントを作成しました。有効にするまであと一歩です。もし心当たりがない場合、申し訳ありませんがこのメールを無視してください。
-        explanation_when_pending: このメールアドレスで%{host}への招待を申請しました。メールアドレスを確認したら、サーバー管理者が申請を審査します。それまでログインできません。申請が却下された場合、あなたのデータは削除されますので以降の操作は必要ありません。もし心当たりがない場合、申し訳ありませんがこのメールを無視してください。
+        explanation_when_pending: このメールアドレスで%{host}への登録を申請しました。メールアドレスを確認したら、サーバー管理者が申請を審査します。それまでログインできません。申請が却下された場合、あなたのデータは削除されますので以降の操作は必要ありません。もし心当たりがない場合、申し訳ありませんがこのメールを無視してください。
         extra_html: また <a href="%{terms_path}">サーバーのルール</a> と <a href="%{policy_path}">利用規約</a> もお読みください。
         subject: 'Mastodon: メールアドレスの確認 %{instance}'
         title: メールアドレスの確認
diff --git a/config/locales/devise.oc.yml b/config/locales/devise.oc.yml
index e167f7e19..42be33f6b 100644
--- a/config/locales/devise.oc.yml
+++ b/config/locales/devise.oc.yml
@@ -12,6 +12,7 @@ oc:
       last_attempt: Vos demòra un ensag abans que vòstre compte siasque blocat.
       locked: Vòstre compte es blocat.
       not_found_in_database: "%{authentication_keys} invalida."
+      pending: Vòstre compte es encara en aprobacion.
       timeout: Vòstra session a expirat. Mercés de vos tornar connectar per contunhar.
       unauthenticated: Vos cal vos connectar o marcar abans de contunhar.
       unconfirmed: Vos cal confirmar vòstra adreça de corrièl abans de contunhar.
@@ -20,6 +21,7 @@ oc:
         action: Verificar l’adreça de corrièl
         action_with_app: Confirmar e tornar a %{app}
         explanation: Venètz de crear un compte sus %{host} amb aquesta adreça de corrièl. Vos manca pas qu’un clic per l’activar. S’èra pas vosautre mercés de far pas cas a aqueste messatge.
+        explanation_when_pending: Avètz demandat una invitacion a %{host} amb aquesta adreça electronica. Un còp que confirmetz vòstra adreça electronica revisarem vòstra demanda. Se pòt iniciar la session fins alara. Se vòstra demanda es pas acceptada vòstras donadas seràn suprimidas, de manièra que caldrà pas cap d’autra accion. S’èra pas vos qu’avètz fach la demanda, se vos plai ignoratz aqueste corrièl.
         extra_html: Pensatz tanben de gaitar <a href="%{terms_path}">las règlas del servidor</a> e <a href="%{policy_path}">nòstres tèrmes e condicions d’utilizacion</a>.
         subject: 'Mastodon : consignas de confirmacion per %{instance}'
         title: Verificatz l’adreça de corrièl
@@ -60,6 +62,7 @@ oc:
       signed_up: La benvenguda ! Sètz ben marcat al malhum.
       signed_up_but_inactive: Sètz ben marcat. Pasmens, avèm pas pogut vos connectar perque vòstre compte es pas encara validat.
       signed_up_but_locked: Sètz ben marcat. Pasmens, avèm pas pogut vos connectar perque vòstre compte es pas encara blocat.
+      signed_up_but_pending: Un messatge amb un ligam de confirmacion es estat enviat a vòstra adreça electronica. Aprèp aver clicat lo ligam, revisarem vòstra demanda. Seretz avisat se’s aprovada.
       signed_up_but_unconfirmed: Un messatge amb un ligam de confirmacion es estat enviat a vòstra adreça de corrièl. Clicatz sul ligam per activar vòstre compte. Mercés de verificar tanben vòstre dorsièr de corrièls indesirables.
       update_needs_confirmation: Avètz ben mes a jorn vòstre compte, mai nos cal verificar vòstra nòva adreça de corrièl. Mercés de verificar vòstres messatges e clicar sul ligam de confirmacion per confirmar vòstra nòva adreça de corrièl. Mercés de verificar tanben vòstre dorsièr de corrièls indesirables.
       updated: Vòstre compte es estat mes a jorn amb succès.
diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml
index e054efb30..0052bc0bc 100644
--- a/config/locales/devise.sk.yml
+++ b/config/locales/devise.sk.yml
@@ -12,6 +12,7 @@ sk:
       last_attempt: Máš posledný pokus pred zamknutím tvojho účtu.
       locked: Tvoj účet je zamknutý.
       not_found_in_database: Nesprávny %{authentication_keys} alebo heslo.
+      pending: Tvoj účet je stále prehodnocovaný.
       timeout: Vaša aktívna sezóna vypršala. Pre pokračovanie sa prosím znovu prihláste.
       unauthenticated: K pokračovaniu sa musíš zaregistrovať alebo prihlásiť.
       unconfirmed: Pred pokračovaním musíš potvrdiť svoj email.
@@ -60,8 +61,9 @@ sk:
       signed_up: Vitaj! Tvoja registrácia bola úspešná.
       signed_up_but_inactive: Registrácia bola úspešná. Avšak, účet ešte nebol aktivovaný, takže ťa nemožno prihlásiť.
       signed_up_but_locked: Registroval/a si sa úspešné. Avšak, tvoj účet je zamknutý, takže ťa nemožno prihlásiť.
-      signed_up_but_unconfirmed: Správa s odkazom na potvrdenie registrácie bola odoslaná na tvoj email. Pre aktváciu účtu, klikni prosím na daný odkaz. Takisto ale skontroluj aj svoju spam zložku, pokiaľ sa ti zdá, že si tento email nedostal/a.
-      update_needs_confirmation: Účet bol úspešne zmenený ale ešte potrebujeme overiť tvoju novú emailovú adresu. Pre overenie prosím klikni na link v správe ktorú si dostal/a na email. Takisto ale skontroluj aj svoju spam zložku, ak sa ti zdá, že si tento email nedostal/a.
+      signed_up_but_pending: Na tvoj email bola odoslaná správa s odkazom na potvrdenie. Po tom, čo naňho klikneš, bude tvoje uchádzanie posúdené. Budeš informovaný, ak sa tvoja požiadavka schváli.
+      signed_up_but_unconfirmed: Správa s odkazom na potvrdenie registrácie bola odoslaná na tvoj email. Pre aktváciu účtu, následuj prosím daný odkaz. Takisto ale skontroluj aj svoju spam zložku, pokiaľ sa ti zdá, že si tento email nedostal/a.
+      update_needs_confirmation: Účet bol úspešne pozmenený, ale ešte potrebujeme overiť tvoju novú emailovú adresu. Pre overenie prosím klikni na link v správe ktorú si dostal/a na email. Takisto ale skontroluj aj svoju spam zložku, ak sa ti zdá, že si tento email nedostal/a.
       updated: Tvoj účet bol úspešne aktualizovaný.
     sessions:
       already_signed_out: Odhlásil/a si sa úspešné.
diff --git a/config/locales/devise.sl.yml b/config/locales/devise.sl.yml
index 13c48e199..7d1e05fdf 100644
--- a/config/locales/devise.sl.yml
+++ b/config/locales/devise.sl.yml
@@ -12,13 +12,16 @@ sl:
       last_attempt: Pred zaklepom računa imate še en poskus.
       locked: Vaš račun je zaklenjen.
       not_found_in_database: Neveljavno %{authentication_keys} ali geslo.
+      pending: Vaš račun je še vedno pod drobnogledom.
       timeout: Vaša seja je potekla. Če želite nadaljevati, se znova prijavite.
       unauthenticated: Pred nadaljevanjem se morate prijaviti ali vpisati.
       unconfirmed: Pred nadaljevanjem morate potrditi svoj e-poštni naslov.
     mailer:
       confirmation_instructions:
         action: Potrdi e-poštni naslov
+        action_with_app: Potrdi in se vrni v %{app}
         explanation: S tem e-poštnim naslovom ste ustvarili račun na %{host}. Z enim samim klikom ga aktivirate. Če to niste bili vi, prosimo, prezrite to e-poštno sporočilo.
+        explanation_when_pending: S tem e-poštnim naslovom ste zaprosili za povabilo na %{host}. Ko potrdite svoj e-poštni naslov, bomo pregledali vašo prijavo. Do takrat se ne morete prijaviti. Če bo vaša prijava zavrnjena, bodo vaši podatki odstranjeni, zato ne bo potrebno nadaljnje ukrepanje. Če to niste bili vi, prezrite to e-poštno sporočilo.
         extra_html: Preverite tudi <a href="%{terms_path}">pravila vozlišča</a> in <a href="%{policy_path}">naše pogoje storitve</a>.
         subject: 'Mastodon: Navodila za potrditev za %{instance}'
         title: Potrdi e-poštni naslov
@@ -34,3 +37,17 @@ sl:
         title: Geslo je spremenjeno
       reconfirmation_instructions:
         explanation: Potrdite novi naslov, da spremenite svoj e-poštni naslov.
+        extra: Če te spremembe niste sprožili, prezrite to e-poštno sporočilo. E-poštni naslov za račun Mastodon se ne bo spremenil, dokler ne kliknete na zgornjo povezavo.
+        subject: 'Mastodon: Potrdite e-pošto za %{instance}'
+        title: Potrdi e-poštni naslov
+      reset_password_instructions:
+        action: Spremeni geslo
+        explanation: Zahtevali ste novo geslo za svoj račun.
+        extra: Če tega niste zahtevali, prezrite to e-poštno sporočilo. Vaše geslo se ne bo spremenilo, dokler ne kliknete na zgornjo povezavo in ustvarite novega.
+        subject: 'Mastodon: Navodila za ponastavitev gesla'
+        title: Ponastavitev gesla
+      unlock_instructions:
+        subject: 'Mastodon: Odkleni navodila'
+    omniauth_callbacks:
+      failure: Overitev iz %{kind} ni možna zaradi "%{reason}".
+      success: Overitev iz računa %{kind} je bila uspešna.
diff --git a/config/locales/devise.th.yml b/config/locales/devise.th.yml
index fec944310..e20df69af 100644
--- a/config/locales/devise.th.yml
+++ b/config/locales/devise.th.yml
@@ -54,7 +54,7 @@ th:
       already_confirmed: was already confirmed, please try signing in
       confirmation_period_expired: needs to be confirmed within %{period}, please request a new one
       expired: has expired, please request a new one
-      not_found: not found
+      not_found: ไม่พบ
       not_locked: was not locked
       not_saved:
         one: '1 error prohibited this %{resource} from being saved:'
diff --git a/config/locales/devise.zh-CN.yml b/config/locales/devise.zh-CN.yml
index 4ee021fcc..bef2baa18 100644
--- a/config/locales/devise.zh-CN.yml
+++ b/config/locales/devise.zh-CN.yml
@@ -59,7 +59,7 @@ zh-CN:
       signed_up: 欢迎!你已注册成功。
       signed_up_but_inactive: 你已注册,但尚未激活帐户。
       signed_up_but_locked: 你已注册,但帐户被锁定了。
-      signed_up_but_unconfirmed: 一封带有确认链接的邮件已经发送至你的邮箱,请点击邮件中的链接以激活你的帐户。如果没有,请检查你的垃圾邮箱。
+      signed_up_but_unconfirmed: 一封带有确认链接的邮件已经发送至你的邮箱,请点击邮件中的链接以激活你的帐户。如果没有,请检查你的垃圾邮件。
       update_needs_confirmation: 信息更新成功,但我们需要验证你的新电子邮件地址,请点击邮件中的链接以确认。如果没有,请检查你的垃圾邮箱。
       updated: 帐户资料更新成功。
     sessions:
diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml
index abbe45942..0ade1e60a 100644
--- a/config/locales/devise.zh-TW.yml
+++ b/config/locales/devise.zh-TW.yml
@@ -2,81 +2,85 @@
 zh-TW:
   devise:
     confirmations:
-      confirmed: 您的 E-mail 驗證成功。
-      send_instructions: 您將會在幾分鐘內收到驗證信。
-      send_paranoid_instructions: 如果您的 E-mail 存在於我們的資料庫,將會在幾分鐘內收到驗證信。
+      confirmed: 您的電子信箱位址已確認成功。
+      send_instructions: 幾分鐘後您將收到確認信件。若未收到此信件,請檢查垃圾郵件資料夾。
+      send_paranoid_instructions: 如果您的電子信箱存在於我們的資料庫,將會在幾分鐘內收到確認信。若未收到請檢查垃圾郵件資料夾。
     failure:
-      already_authenticated: 您已經登入了。
+      already_authenticated: 您已登入。
       inactive: 您的帳戶尚未啟用。
-      invalid: 不正確的 %{authentication_keys} 或密碼。
-      last_attempt: 您剩下最後一次嘗試機會,如失敗將會進行帳戶鎖定。如有問題請洽詢站點管理員。
+      invalid: 無效的 %{authentication_keys} 或密碼。
+      last_attempt: 在帳號遭封鎖前您還有最後一次嘗試機會。
       locked: 您的帳戶已被鎖定。
-      not_found_in_database: 不正確的 %{authentication_keys} 或密碼。
-      timeout: 您的登入階段已經逾期,請重新登入以繼續使用。
-      unauthenticated: 您必須先登入或註冊,以繼續使用。
-      unconfirmed: 您必須先完成 E-mail 驗證,以繼續使用。
+      not_found_in_database: 無效的 %{authentication_keys} 或密碼。
+      pending: 您的帳戶仍在審核中。
+      timeout: 登入階段逾時。請重新登入以繼續。
+      unauthenticated: 您必須先登入或註冊以繼續使用。
+      unconfirmed: 您必須先確認電子信箱才能繼續使用。
     mailer:
       confirmation_instructions:
-        action: 驗證 E-mail 地址
-        explanation: 您已經在 %{host} 上以此 E-mail 地址建立了一個帳號。您距離啟用它只剩一次點擊之遙了。如果這不是你,請忽略此 E-mail 。
-        extra_html: 同時也請看看<a href="%{terms_path}">該站點的規則</a>與<a href="%{policy_path}">我們的服務條款</a>。
-        subject: 'Mastodon: 信箱驗證 %{instance}'
-        title: 驗證 E-mail 地址
+        action: 驗證電子信箱位址
+        action_with_app: 確認並返回 %{app}
+        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: 您帳號的 E-mail 地址被變更為:
-        extra: 如果您並未變更您的 E-mail ,那麼很有可能是某人取得了你帳號的存取權限。請立刻變更您的密碼,或是若您的帳號已被鎖定,請聯絡站點的管理員。
-        subject: Mastodon  E-mail 變更
-        title: 新 E-mail 地址
+        explanation: 您帳戶的電子信箱位址將變更為:
+        extra: 若您未變更電子信箱,那麼很有可能是某人取得了你帳戶的存取權限。請立刻變更密碼,或當帳戶被鎖定時,請聯絡伺服器的管理員。
+        subject: Mastodon:已變更電子信箱
+        title: 新電子信箱位址
       password_change:
-        explanation: 您帳號的密碼已變更。
-        extra: 如果您並未變更您的密碼,那麼很有可能是某人取得了您帳號的存取權限。請立刻變更您的密碼,或是若您的帳號已被鎖定,請聯絡站點的管理員。
-        subject: 'Mastodon: 更改密碼'
+        explanation: 您帳戶的密碼已變更。
+        extra: 如果您未變更密碼,那麼很有可能是某人取得了帳戶的存取權限。請立刻變更密碼,或若帳戶被鎖定時,請聯絡伺服器的管理員。
+        subject: Mastodon:已變更密碼
         title: 密碼已變更
       reconfirmation_instructions:
-        explanation: 確認新的 E-mail 地址以變更您的 E-mail 。
-        extra: 若此次變更不是由您開啟的,請忽略這個 E-mail 。Mastodon 帳號的 E-mail 地址在您存取上面的連結前不會變更。
-        subject: Mastodon:%{instance} 的確認 E-mail
-        title: 驗證 E-mail 地址
+        explanation: 請確認新的電子信箱位址以變更。
+        extra: 若此次變更不是由您開啟的,請忽略此信件。Mastodon 帳戶的電子信箱位址在您存取上面的連結前不會變更。
+        subject: Mastodon:確認 %{instance} 的電子信箱位址
+        title: 驗證電子信箱位址
       reset_password_instructions:
         action: 變更密碼
-        explanation: 您為您的帳號請求了一個新密碼。
-        extra: 若您並未請求這個,請忽略此 E-mail 。您的密碼在您存取上面的連結並建立一個新的之前不會變更。
-        subject: 'Mastodon: 重設密碼'
+        explanation: 您已請求設定帳號的新密碼。
+        extra: 若您並未請求,請忽略此信件。您的密碼在存取上方連結並建立新連結前不會變更。
+        subject: Mastodon:重設密碼指引
         title: 重設密碼
       unlock_instructions:
-        subject: 'Mastodon: 帳號解鎖'
+        subject: Mastodon:帳戶解鎖指引
     omniauth_callbacks:
-      failure: 無法以 %{kind} 登入您的帳號,原因是︰「%{reason}」。
-      success: 成功以 %{kind} 登入您的帳號。
+      failure: 無法透過 %{kind} 認證是否為您,因為「%{reason}」。
+      success: 成功透過 %{kind} 登入帳戶。
     passwords:
-      no_token: 您請使用重設密碼信中的網址,並確認您用了完整的網址。
-      send_instructions: 您將在幾分鐘內收到重設密碼信。
-      send_paranoid_instructions: 如果您的電子信箱已經存在於我們的資料庫,您將會在幾分鐘內收到重設密碼信。
-      updated: 您的密碼已經更新,您現在正登入本站。
-      updated_not_active: 您的密碼已經更新。
+      no_token: 您必須透過密碼重設信件才能存取此頁面。若確實如此,請確定輸入的網址是完整的。
+      send_instructions: 若電子信箱位址存在於資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。
+      send_paranoid_instructions: 若電子信箱位址存在於資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。
+      updated: 您的密碼已成功變更,現在已經登入。
+      updated_not_active: 您的密碼已成功變更。
     registrations:
-      destroyed: 再見了!您的帳號已被取消,期待再相逢。
-      signed_up: 歡迎您!您的已成功註冊。
-      signed_up_but_inactive: 您已成功註冊,但由於您的帳號尚未啟用,我們暫時無法讓您登入。
-      signed_up_but_locked: 您已成功註冊,但由於您的帳號已被鎖定,我們無法讓您登入。
-      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: 成功登出。
+      already_signed_out: 已成功登出。
+      signed_in: 已成功登入。
+      signed_out: 已成功登出。
     unlocks:
-      send_instructions: 您將在幾分鐘內收到帳號解鎖信。
-      send_paranoid_instructions: 如果您的電子信箱已經存在於我們的資料庫,您將在幾分鐘內收到帳號解鎖信。
-      unlocked: 已解鎖您的帳號,請登入以繼續。
+      send_instructions: 幾分鐘後您將收到解鎖帳號的指引信件。若未收到請檢查垃圾郵件資料夾。
+      send_paranoid_instructions: 若此帳號存在,您將在幾分鐘後收到解鎖指引信件。若未收到請檢查垃圾郵件資料夾。
+      unlocked: 已解鎖您的帳戶,請登入繼續。
   errors:
     messages:
       already_confirmed: 已經確認,請嘗試登入
       confirmation_period_expired: 需要在 %{period} 內完成驗證。請重新申請
-      expired: 已經過期,請重新申請
+      expired: 已經過期,請重新請求
       not_found: 找不到
       not_locked: 並未被鎖定
       not_saved:
-        one: 有 1 個錯誤讓此 %{resource} 無法儲存:
-        other: 有 %{count} 個錯誤讓此 %{resource} 無法儲存:
+        one: 因 1 個錯誤導致 %{resource} 無法儲存:
+        other: 因 %{count} 錯誤導致 %{resource} 無法儲存:
diff --git a/config/locales/el.yml b/config/locales/el.yml
index d78d63955..b8fd45a68 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -4,25 +4,36 @@ el:
     about_hashtag_html: Αυτά είναι κάποια από τα δημόσια τουτ σημειωμένα με <strong>#%{hashtag}</strong>. Μπορείς να αλληλεπιδράσεις με αυτά αν έχεις λογαριασμό οπουδήποτε στο fediverse.
     about_mastodon_html: Το Mastodon είναι ένα κοινωνικό δίκτυο που βασίζεται σε ανοιχτά δικτυακά πρωτόκολλα και ελεύθερο λογισμικό ανοιχτού κώδικα. Είναι αποκεντρωμένο όπως το e-mail.
     about_this: Σχετικά
+    active_count_after: ενεργοί
+    active_footnote: Μηνιαίοι Ενεργοί Χρήστες (ΜΕΧ)
     administered_by: 'Διαχειριστής:'
     api: API
     apps: Εφαρμογές κινητών
+    apps_platforms: Χρησιμοποίησε το Mastodon από το iOS, το Android και αλλού
+    browse_directory: Ξεφύλλισε ένα κατάλογο χρηστών και φίλτραρε ανά ενδιαφέροντα
+    browse_public_posts: Κοίταξε μια ζωντανή ροή δημοσιεύσεων στο Mastodon
     contact: Επικοινωνία
     contact_missing: Δεν έχει οριστεί
     contact_unavailable: Μ/Δ
+    discover_users: Ανακάλυψε χρήστες
     documentation: Τεκμηρίωση
     extended_description_html: |
       <h3>Ένα καλό σημείο για κανόνες</h3>
       <p>Η αναλυτική περιγραφή δεν έχει ακόμα οριστεί</p>
+    federation_hint_html: Με ένα λογαριασμό στο %{instance} θα μπορείς να ακολουθείς ανθρώπους σε οποιοδήποτε κόμβο στο Mastodon αλλά και αλλού.
     generic_description: "%{domain} είναι ένας εξυπηρετητής στο δίκτυο"
+    get_apps: Δοκίμασε μια εφαρμογή κινητού
     hosted_on: Το Mastodon φιλοξενείται στο %{domain}
     learn_more: Μάθε περισσότερα
     privacy_policy: Πολιτική απορρήτου
+    see_whats_happening: Μάθε τι συμβαίνει
+    server_stats: 'Στατιστικά κόμβου:'
     source_code: Πηγαίος κώδικας
     status_count_after:
       one: δημοσίευση
       other: δημοσιεύσεις
     status_count_before: Που έγραψαν
+    tagline: Ακολούθησε τους γνωστούς σου και ανακάλυψε νέους ανθρώπους
     terms: Όροι χρήσης
     user_count_after:
       one: χρήστης
@@ -68,6 +79,7 @@ el:
       delete: Διαγραφή
       destroyed_msg: Επιτυχής καταστροφή σημειώματος μεσολάβησης!
     accounts:
+      approve: Έγκριση
       are_you_sure: Σίγουρα;
       avatar: Αβατάρ
       by_domain: Τομέας
@@ -113,6 +125,7 @@ el:
       moderation:
         active: Ενεργός/ή
         all: Όλα
+        pending: Εκκρεμούν
         silenced: Αποσιωπημένα
         suspended: Σε αναστολή
         title: Μεσολάβηση
@@ -122,6 +135,7 @@ el:
       no_limits_imposed: Χωρίς όρια
       not_subscribed: Άνευ συνδρομής
       outbox_url: URL εξερχομένων
+      pending: Εκκρεμεί έγκριση
       perform_full_suspension: Αναστολή
       profile_url: URL προφίλ
       promote: Προβίβασε
@@ -129,6 +143,7 @@ el:
       public: Δημόσιο
       push_subscription_expires: Η εγγραφή PuSH λήγει
       redownload: Ανανέωση αβατάρ
+      reject: Απόρριψη
       remove_avatar: Απομακρυσμένο αβατάρ
       remove_header: Αφαίρεση επικεφαλίδας
       resend_confirmation:
@@ -400,6 +415,12 @@ el:
         min_invite_role:
           disabled: Κανείς
           title: Επέτρεψε προσκλήσεις από
+      registrations_mode:
+        modes:
+          approved: Απαιτείται έγκριση για εγγραφή
+          none: Δεν μπορεί να εγγραφεί κανείς
+          open: Μπορεί να εγγραφεί ο οποιοσδήποτε
+        title: Μέθοδος εγγραφής
       show_known_fediverse_at_about_page:
         desc_html: Όταν αντιστραφεί, θα δείχνει τα τουτ από όλο το γνωστό fediverse στην προεπισκόπηση. Διαφορετικά θα δείχνει μόνο τοπικά τουτ.
         title: Εμφάνιση του γνωστού fediverse στην προεπισκόπηση ροής
@@ -462,6 +483,9 @@ el:
       edit_preset: Ενημέρωση προκαθορισμένης προειδοποίησης
       title: Διαχείριση προκαθορισμένων προειδοποιήσεων
   admin_mailer:
+    new_pending_account:
+      body: Τα στοιχεία του νέου λογαριασμού είναι παρακάτω. Μπορείς να εγκρίνεις ή να απορρίψεις αυτή την αίτηση.
+      subject: Νέος λογαριασμός προς έγκριση στο %{instance} (%{username})
     new_report:
       body: Ο/Η %{reporter} κατήγγειλε τον/την %{target}
       body_remote: Κάποιος/α από τον τομέα %{domain} κατήγγειλε τον/την %{target}
@@ -483,7 +507,9 @@ el:
     your_token: Το διακριτικό πρόσβασής σου (access token)
   auth:
     agreement_html: Επιλέγοντας το "Εγγραφή", συμφωνείς πως δέχεσαι <a href="%{rules_path}">τους κανόνες αυτού του κόμβου</a> και <a href="%{terms_path}">τους όρους χρήσης του</a>.
+    apply_for_account: Αίτηση πρόσκλησης
     change_password: Συνθηματικό
+    checkbox_agreement_html: Συμφωνώ με τους <a href="%{rules_path}" target="_blank">κανονισμούς του κόμβου</a> και <a href="%{terms_path}" target="_blank">τους όρους χρήσης</a>
     confirm_email: Επιβεβαίωση email
     delete_account: Διαγραφή email
     delete_account_html: Αν θέλεις να διαγράψεις το λογαριασμό σου, μπορείς <a href="%{path}">να συνεχίσεις εδώ</a>. Θα σου ζητηθεί επιβεβαίωση.
@@ -499,10 +525,12 @@ el:
       cas: Υπηρεσία Κεντρικής Πιστοποίησης (CAS)
       saml: SAML
     register: Εγγραφή
+    registration_closed: Το %{instance} δεν δέχεται νέα μέλη
     resend_confirmation: Στείλε ξανά τις οδηγίες επιβεβαίωσης
     reset_password: Επαναφορά συνθηματικού
     security: Ασφάλεια
     set_new_password: Ορισμός νέου συνθηματικού
+    trouble_logging_in: Πρόβλημα σύνδεσης;
   authorize_follow:
     already_following: Ήδη ακολουθείς αυτό το λογαριασμό
     error: Δυστυχώς παρουσιάστηκε ένα σφάλμα κατά την αναζήτηση του απομακρυσμένου λογαριασμού
@@ -558,6 +586,9 @@ el:
       content: Λυπούμαστε, κάτι πήγε στραβά από τη δική μας μεριά.
       title: Η σελίδα αυτή δεν είναι σωστή
     noscript_html: Για να χρησιμοποιήσετε τη δικτυακή εφαρμογή του Mastodon, ενεργοποίησε την Javascript. Εναλλακτικά, δοκίμασε μια από τις <a href="%{apps_path}">εφαρμογές</a> για το Mastodon στην πλατφόρμα σου.
+  existing_username_validator:
+    not_found: δεν βρέθηκε τοπικός χρήστης με αυτό το όνομα
+    not_found_multiple: δεν βρέθηκε %{usernames}
   exports:
     archive_takeout:
       date: Ημερομηνία
@@ -598,12 +629,30 @@ el:
     more: Περισσότερα…
     resources: Πόροι
   generic:
+    all: Όλα
     changes_saved_msg: Οι αλλαγές αποθηκεύτηκαν!
     copy: Αντιγραφή
     save_changes: Αποθήκευσε τις αλλαγές
     validation_errors:
       one: Κάτι δεν είναι εντάξει ακόμα! Για κοίταξε το παρακάτω σφάλμα
       other: Κάτι δεν είναι εντάξει ακόμα! Για κοίταξε τα παρακάτω %{count} σφάλματα
+  html_validator:
+    invalid_markup: 'περιέχει λάθος μορφοποίηση HTML: %{error}'
+  identity_proofs:
+    active: Ενεργή
+    authorize: Ναι, εξουσιοδότησε
+    authorize_connection_prompt: Εξουσιοδότηση αυτής της κρυπτογραφικής σύνδεσης;
+    errors:
+      failed: Η κρυπτογραφική σύνδεση απέτυχε. Παρακαλώ ξανά δοκίμασε μέσω %{provider}.
+      keybase:
+        invalid_token: Τα κλειδιά Keybase είναι κατακερματισμένες υπογραφές και πρέπει να έχουν μήκος 66 δεκαεξαδικών χαρακτήρων
+        verification_failed: Το Keybase δεν δέχτηκε αυτό το κλειδί ως υπογραφή του χρήστη %{kb_username}. Παρακαλούμε δοκίμασε μέσω Keybase.
+    explanation_html: Εδώ μπορείς να συνδέσεις κρυπτογραφικά τις υπόλοιπες ταυτοτητές σου, όπως για παράδειγμα ένα προφίλ στο Keybase. Αυτό επιτρέπει σε άλλους ανθρώπους να σου στέλνουν κρυπτογραφημένα μηνύματα και να μπορούν να εμπιστευτούν το περιεχόμενο που τους στέλνεις εσύ.
+    i_am_html: Είμαι ο/η %{username} στην υπηρεσία %{service}.
+    identity: Ταυτότητα
+    inactive: Ανενεργή
+    status: Κατάσταση επαλήθευσης
+    view_proof: Εμφάνιση απόδειξης
   imports:
     modes:
       merge: Συγχώνευση
@@ -720,6 +769,17 @@ el:
     other: Άλλο
     publishing: Δημοσίευση
     web: Διαδίκτυο
+  relationships:
+    activity: Δραστηριότητα λογαριασμού
+    dormant: Αδρανής
+    moved: Μετακόμισε
+    mutual: Αμοιβαίος
+    primary: Βασικός
+    relationship: Σχέση
+    remove_selected_domains: Αφαίρεση ακόλουθων που βρίσκονται στους επιλεγμένους κόμβους
+    remove_selected_followers: Αφαίρεση επιλεγμένων ακόλουθων
+    remove_selected_follows: Διακοπή παρακολούθησης επιλεγμένων χρηστών
+    status: Κατάσταση λογαριασμού
   remote_follow:
     acct: Γράψε το ΌνομαΧρήστη@τομέα από όπου θέλεις να εκτελέσεις την ενέργεια αυτή
     missing_resource: Δεν βρέθηκε το απαιτούμενο URL ανακατεύθυνσης για το λογαριασμό σου
@@ -794,10 +854,12 @@ el:
     edit_profile: Επεξεργασία προφίλ
     export: Εξαγωγή δεδομένων
     featured_tags: Χαρακτηριστικές ταμπέλες
+    identity_proofs: Αποδείξεις ταυτοτήτων
     import: Εισαγωγή
     migrate: Μετακόμιση λογαριασμού
     notifications: Ειδοποιήσεις
     preferences: Προτιμήσεις
+    relationships: Ακολουθεί και ακολουθείται
     settings: Ρυθμίσεις
     two_factor_authentication: Πιστοποίηση 2 παραγόντων (2FA)
     your_apps: Οι εφαρμογές σου
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 7e1d92884..682f85406 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -245,6 +245,7 @@ en:
       feature_profile_directory: Profile directory
       feature_registrations: Registrations
       feature_relay: Federation relay
+      feature_timeline_preview: Timeline preview
       features: Features
       hidden_service: Federation with hidden services
       open_reports: open reports
@@ -431,13 +432,13 @@ en:
         desc_html: Show a staff badge on a user page
         title: Show staff badge
       site_description:
-        desc_html: Introductory paragraph on the frontpage. Describe what makes this Mastodon server special and anything else important. You can use HTML tags, in particular <code>&lt;a&gt;</code> and <code>&lt;em&gt;</code>.
+        desc_html: Introductory paragraph on the API. Describe what makes this Mastodon server special and anything else important. You can use HTML tags, in particular <code>&lt;a&gt;</code> and <code>&lt;em&gt;</code>.
         title: Server description
       site_description_extended:
         desc_html: A good place for your code of conduct, rules, guidelines and other things that set your server apart. You can use HTML tags
         title: Custom extended information
       site_short_description:
-        desc_html: Displayed in sidebar and meta tags. Describe what Mastodon is and what makes this server special in a single paragraph. If empty, defaults to server description.
+        desc_html: Displayed in sidebar and meta tags. Describe what Mastodon is and what makes this server special in a single paragraph.
         title: Short server description
       site_terms:
         desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML tags
@@ -589,6 +590,9 @@ en:
       content: We're sorry, but something went wrong on our end.
       title: This page is not correct
     noscript_html: To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the <a href="%{apps_path}">native apps</a> for Mastodon for your platform.
+  existing_username_validator:
+    not_found: could not find a local user with that username
+    not_found_multiple: could not find %{usernames}
   exports:
     archive_takeout:
       date: Date
@@ -637,6 +641,8 @@ en:
     validation_errors:
       one: Something isn't quite right yet! Please review the error below
       other: Something isn't quite right yet! Please review %{count} errors below
+  html_validator:
+    invalid_markup: 'contains invalid HTML markup: %{error}'
   identity_proofs:
     active: Active
     authorize: Yes, authorize
@@ -646,10 +652,13 @@ en:
       keybase:
         invalid_token: Keybase tokens are hashes of signatures and must be 66 hex characters
         verification_failed: Keybase does not recognize this token as a signature of Keybase user %{kb_username}. Please retry from Keybase.
+      wrong_user: Cannot create a proof for %{proving} while logged in as %{current}. Log in as %{proving} and try again.
     explanation_html: Here you can cryptographically connect your other identities, such as a Keybase profile. This lets other people send you encrypted messages and trust content you send them.
     i_am_html: I am %{username} on %{service}.
     identity: Identity
     inactive: Inactive
+    publicize_checkbox: 'And toot this:'
+    publicize_toot: 'It is proven! I am %{username} on %{service}: %{url}'
     status: Verification status
     view_proof: View proof
   imports:
@@ -772,6 +781,8 @@ en:
   relationships:
     activity: Account activity
     dormant: Dormant
+    last_active: Last active
+    most_recent: Most recent
     moved: Moved
     mutual: Mutual
     primary: Primary
diff --git a/config/locales/en_GB.yml b/config/locales/en_GB.yml
index d9e1a256f..9e6eb5e94 100644
--- a/config/locales/en_GB.yml
+++ b/config/locales/en_GB.yml
@@ -1,2 +1,1056 @@
 ---
-{}
+en_GB:
+  about:
+    about_hashtag_html: These are public toots tagged with <strong>#%{hashtag}</strong>. You can interact with them if you have an account anywhere in the fediverse.
+    about_mastodon_html: Mastodon is a social network based on open web protocols and free, open-source software. It is decentralized like e-mail.
+    about_this: About
+    active_count_after: active
+    active_footnote: Monthly Active Users (MAU)
+    administered_by: 'Administered by:'
+    api: API
+    apps: Mobile apps
+    apps_platforms: Use Mastodon from iOS, Android and other platforms
+    browse_directory: Browse a profile directory and filter by interests
+    browse_public_posts: Browse a live stream of public posts on Mastodon
+    contact: Contact
+    contact_missing: Not set
+    contact_unavailable: N/A
+    discover_users: Discover users
+    documentation: Documentation
+    extended_description_html: |
+      <h3>1A good place for rules</h3>2
+      <p>3The extended description has not been set up yet.</p>4
+    federation_hint_html: With an account on %{instance} you'll be able to follow people on any Mastodon server and beyond.
+    generic_description: "%{domain} is one server in the network"
+    get_apps: Try a mobile app
+    hosted_on: Mastodon hosted on %{domain}
+    learn_more: Learn more
+    privacy_policy: Privacy policy
+    see_whats_happening: See what's happening
+    server_stats: 'Server stats:'
+    source_code: Source code
+    status_count_after:
+      one: status
+      other: statuses
+    status_count_before: Who authored
+    tagline: Follow friends and discover new ones
+    terms: Terms of service
+    user_count_after:
+      one: user
+      other: users
+    user_count_before: Home to
+    what_is_mastodon: What is Mastodon?
+  accounts:
+    choices_html: "%{name}'s choices:"
+    follow: Follow
+    followers:
+      one: Follower
+      other: Follower
+    following: Following
+    joined: Joined %{date}
+    last_active: last active
+    link_verified_on: Ownership of this link was checked on %{date}
+    media: Media
+    moved_html: "%{name} has moved to %{new_profile_link}:"
+    network_hidden: This information is not available
+    nothing_here: There is nothing here!
+    people_followed_by: People whom %{name} follows
+    people_who_follow: People who follow %{name}
+    pin_errors:
+      following: You must be already following the person you want to endorse
+    posts:
+      one: Toot
+      other: Toots
+    posts_tab_heading: Toots
+    posts_with_replies: Toots and replies
+    reserved_username: The username is reserved
+    roles:
+      admin: Admin
+      bot: Bot
+      moderator: Mod
+    unfollow: Unfollow
+  admin:
+    account_actions:
+      action: Perform action
+      title: Perform moderation action on %{acct}
+    account_moderation_notes:
+      create: Leave note
+      created_msg: Moderation note successfully created!
+      delete: Delete
+      destroyed_msg: Moderation note successfully destroyed!
+    accounts:
+      approve: Approve
+      are_you_sure: Are you sure?
+      avatar: Avatar
+      by_domain: Domain
+      change_email:
+        changed_msg: Account email successfully changed!
+        current_email: Current email
+        label: Change email
+        new_email: New email
+        submit: Change email
+        title: Change email for %{username}
+      confirm: Confirm
+      confirmed: Confirmed
+      confirming: Confirming
+      deleted: Deleted
+      demote: Demote
+      disable: Disable
+      disable_two_factor_authentication: Disable 2FA
+      disabled: Disabled
+      display_name: Display name
+      domain: Domain
+      edit: Edit
+      email: Email
+      email_status: Email status
+      enable: Enable
+      enabled: Enabled
+      feed_url: Feed URL
+      followers: Followers
+      followers_url: Followers URL
+      follows: Follows
+      header: Header
+      inbox_url: Inbox URL
+      invited_by: Invited by
+      ip: IP
+      joined: Joined
+      location:
+        all: All
+        local: Local
+        remote: Remote
+        title: Location
+      login_status: Login status
+      media_attachments: Media attachments
+      memorialize: Turn into memoriam
+      moderation:
+        active: Active
+        all: All
+        pending: Pending
+        silenced: Silenced
+        suspended: Suspended
+        title: Moderation
+      moderation_notes: Moderation notes
+      most_recent_activity: Most recent activity
+      most_recent_ip: Most recent IP
+      no_limits_imposed: No limits imposed
+      not_subscribed: Not subscribed
+      outbox_url: Outbox URL
+      pending: Pending review
+      perform_full_suspension: Suspend
+      profile_url: Profile URL
+      promote: Promote
+      protocol: Protocol
+      public: Public
+      push_subscription_expires: PuSH subscription expires
+      redownload: Refresh profile
+      reject: Reject
+      remove_avatar: Remove avatar
+      remove_header: Remove header
+      resend_confirmation:
+        already_confirmed: This user is already confirmed
+        send: Resend confirmation email
+        success: Confirmation email successfully sent!
+      reset: Reset
+      reset_password: Reset password
+      resubscribe: Resubscribe
+      role: Permissions
+      roles:
+        admin: Administrator
+        moderator: Moderator
+        staff: Staff
+        user: User
+      salmon_url: Salmon URL
+      search: Search
+      shared_inbox_url: Shared inbox URL
+      show:
+        created_reports: Made reports
+        targeted_reports: Reported by others
+      silence: Silence
+      silenced: Silenced
+      statuses: Statuses
+      subscribe: Subscribe
+      suspended: Suspended
+      title: Accounts
+      unconfirmed_email: Unconfirmed email
+      undo_silenced: Undo silence
+      undo_suspension: Undo suspension
+      unsubscribe: Unsubscribe
+      username: Username
+      warn: Warn
+      web: Web
+    action_logs:
+      actions:
+        assigned_to_self_report: "%{name} assigned report %{target} to themselves"
+        change_email_user: "%{name} changed the e-mail address of user %{target}"
+        confirm_user: "%{name} confirmed e-mail address of user %{target}"
+        create_account_warning: "%{name} sent a warning to %{target}"
+        create_custom_emoji: "%{name} uploaded new emoji %{target}"
+        create_domain_block: "%{name} blocked domain %{target}"
+        create_email_domain_block: "%{name} blacklisted e-mail domain %{target}"
+        demote_user: "%{name} demoted user %{target}"
+        destroy_custom_emoji: "%{name} destroyed emoji %{target}"
+        destroy_domain_block: "%{name} unblocked domain %{target}"
+        destroy_email_domain_block: "%{name} whitelisted e-mail domain %{target}"
+        destroy_status: "%{name} removed status by %{target}"
+        disable_2fa_user: "%{name} disabled two factor requirement for user %{target}"
+        disable_custom_emoji: "%{name} disabled emoji %{target}"
+        disable_user: "%{name} disabled login for user %{target}"
+        enable_custom_emoji: "%{name} enabled emoji %{target}"
+        enable_user: "%{name} enabled login for user %{target}"
+        memorialize_account: "%{name} turned %{target}'s account into a memoriam page"
+        promote_user: "%{name} promoted user %{target}"
+        remove_avatar_user: "%{name} removed %{target}'s avatar"
+        reopen_report: "%{name} reopened report %{target}"
+        reset_password_user: "%{name} reset password of user %{target}"
+        resolve_report: "%{name} resolved report %{target}"
+        silence_account: "%{name} silenced %{target}'s account"
+        suspend_account: "%{name} suspended %{target}'s account"
+        unassigned_report: "%{name} unassigned report %{target}"
+        unsilence_account: "%{name} unsilenced %{target}'s account"
+        unsuspend_account: "%{name} unsuspended %{target}'s account"
+        update_custom_emoji: "%{name} updated emoji %{target}"
+        update_status: "%{name} updated status by %{target}"
+      deleted_status: "(deleted status)"
+      title: Audit log
+    custom_emojis:
+      by_domain: Domain
+      copied_msg: Successfully created local copy of the emoji
+      copy: Copy
+      copy_failed_msg: Could not make a local copy of that emoji
+      created_msg: Emoji successfully created!
+      delete: Delete
+      destroyed_msg: Emojo successfully destroyed!
+      disable: Disable
+      disabled_msg: Successfully disabled that emoji
+      emoji: Emoji
+      enable: Enable
+      enabled_msg: Successfully enabled that emoji
+      image_hint: PNG up to 50KB
+      listed: Listed
+      new:
+        title: Add new custom emoji
+      overwrite: Overwrite
+      shortcode: Shortcode
+      shortcode_hint: At least 2 characters, only alphanumeric characters and underscores
+      title: Custom emojis
+      unlisted: Unlisted
+      update_failed_msg: Could not update that emoji
+      updated_msg: Emoji successfully updated!
+      upload: Upload
+    dashboard:
+      backlog: backlogged jobs
+      config: Configuration
+      feature_deletions: Account deletions
+      feature_invites: Invite links
+      feature_profile_directory: Profile directory
+      feature_registrations: Registrations
+      feature_relay: Federation relay
+      features: Features
+      hidden_service: Federation with hidden services
+      open_reports: open reports
+      recent_users: Recent users
+      search: Full-text search
+      single_user_mode: Single user mode
+      software: Software
+      space: Space usage
+      title: Dashboard
+      total_users: users in total
+      trends: Trends
+      week_interactions: interactions this week
+      week_users_active: active this week
+      week_users_new: users this week
+    domain_blocks:
+      add_new: Add new domain block
+      created_msg: Domain block is now being processed
+      destroyed_msg: Domain block has been undone
+      domain: Domain
+      new:
+        create: Create block
+        hint: The domain block will not prevent creation of account entries in the database, but will retroactively and automatically apply specific moderation methods on those accounts.
+        severity:
+          desc_html: "<strong>Silence</strong> will make the account's posts invisible to anyone who isn't following them. <strong>Suspend</strong> will remove all of the account's content, media, and profile data. Use <strong>None</strong> if you just want to reject media files."
+          noop: None
+          silence: Silence
+          suspend: Suspend
+        title: New domain block
+      reject_media: Reject media files
+      reject_media_hint: Removes locally stored media files and refuses to download any in the future. Irrelevant for suspensions
+      reject_reports: Reject reports
+      reject_reports_hint: Ignore all reports coming from this domain. Irrelevant for suspensions
+      rejecting_media: rejecting media files
+      rejecting_reports: rejecting reports
+      severity:
+        silence: silenced
+        suspend: suspended
+      show:
+        affected_accounts:
+          one: One account in the database affected
+          other: "%{count} accounts in the database affected"
+        retroactive:
+          silence: Unsilence all existing accounts from this domain
+          suspend: Unsuspend all existing accounts from this domain
+        title: Undo domain block for %{domain}
+        undo: Undo
+      undo: Undo domain block
+    email_domain_blocks:
+      add_new: Add new
+      created_msg: Successfully added e-mail domain to blacklist
+      delete: Delete
+      destroyed_msg: Successfully deleted e-mail domain from blacklist
+      domain: Domain
+      new:
+        create: Add domain
+        title: New e-mail blacklist entry
+      title: E-mail blacklist
+    followers:
+      back_to_account: Back To Account
+      title: "%{acct}'s Followers"
+    instances:
+      by_domain: Domain
+      delivery_available: Delivery is available
+      known_accounts:
+        one: "%{count} known account"
+        other: "%{count} known accounts"
+      moderation:
+        all: All
+        limited: Limited
+        title: Moderation
+      title: Federation
+      total_blocked_by_us: Blocked by us
+      total_followed_by_them: Followed by them
+      total_followed_by_us: Followed by us
+      total_reported: Reports about them
+      total_storage: Media attachments
+    invites:
+      deactivate_all: Deactivate all
+      filter:
+        all: All
+        available: Available
+        expired: Expired
+        title: Filter
+      title: Invites
+    relays:
+      add_new: Add new relay
+      delete: Delete
+      description_html: A <strong>federation relay</strong> is an intermediary server that exchanges large volumes of public toots between servers that subscribe and publish to it. <strong>It can help small and medium servers discover content from the fediverse</strong>, which would otherwise require local users manually following other people on remote servers.
+      disable: Disable
+      disabled: Disabled
+      enable: Enable
+      enable_hint: Once enabled, your server will subscribe to all public toots from this relay, and will begin sending this server's public toots to it.
+      enabled: Enabled
+      inbox_url: Relay URL
+      pending: Waiting for relay's approval
+      save_and_enable: Save and enable
+      setup: Setup a relay connection
+      status: Status
+      title: Relays
+    report_notes:
+      created_msg: Report note successfully created!
+      destroyed_msg: Report note successfully deleted!
+    reports:
+      account:
+        note: note
+        report: report
+      action_taken_by: Action taken by
+      are_you_sure: Are you sure?
+      assign_to_self: Assign to me
+      assigned: Assigned moderator
+      comment:
+        none: None
+      created_at: Reported
+      mark_as_resolved: Mark as resolved
+      mark_as_unresolved: Mark as unresolved
+      notes:
+        create: Add note
+        create_and_resolve: Resolve with note
+        create_and_unresolve: Reopen with note
+        delete: Delete
+        placeholder: Describe what actions have been taken, or any other related updates...
+      reopen: Reopen report
+      report: 'Report #%{id}'
+      reported_account: Reported account
+      reported_by: Reported by
+      resolved: Resolved
+      resolved_msg: Report successfully resolved!
+      status: Status
+      title: Reports
+      unassign: Unassign
+      unresolved: Unresolved
+      updated_at: Updated
+    settings:
+      activity_api_enabled:
+        desc_html: Counts of locally posted statuses, active users, and new registrations in weekly buckets
+        title: Publish aggregate statistics about user activity
+      bootstrap_timeline_accounts:
+        desc_html: Separate multiple usernames by comma. Only local and unlocked accounts will work. Default when empty is all local admins.
+        title: Default follows for new users
+      contact_information:
+        email: Business e-mail
+        username: Contact username
+      custom_css:
+        desc_html: Modify the look with CSS loaded on every page
+        title: Custom CSS
+      hero:
+        desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to server thumbnail
+        title: Hero image
+      mascot:
+        desc_html: Displayed on multiple pages. At least 293×205px recommended. When not set, falls back to default mascot
+        title: Mascot image
+      peers_api_enabled:
+        desc_html: Domain names this server has encountered in the fediverse
+        title: Publish list of discovered servers
+      preview_sensitive_media:
+        desc_html: Link previews on other websites will display a thumbnail even if the media is marked as sensitive
+        title: Show sensitive media in OpenGraph previews
+      profile_directory:
+        desc_html: Allow users to be discoverable
+        title: Enable profile directory
+      registrations:
+        closed_message:
+          desc_html: Displayed on frontpage when registrations are closed. You can use HTML tags
+          title: Closed registration message
+        deletion:
+          desc_html: Allow anyone to delete their account
+          title: Open account deletion
+        min_invite_role:
+          disabled: No one
+          title: Allow invitations by
+      registrations_mode:
+        modes:
+          approved: Approval required for sign up
+          none: Nobody can sign up
+          open: Anyone can sign up
+        title: Registrations mode
+      show_known_fediverse_at_about_page:
+        desc_html: When toggled, it will show toots from all the known fediverse on preview. Otherwise it will only show local toots.
+        title: Show known fediverse on timeline preview
+      show_staff_badge:
+        desc_html: Show a staff badge on a user page
+        title: Show staff badge
+      site_description:
+        desc_html: Introductory paragraph on the frontpage. Describe what makes this Mastodon server special and anything else important. You can use HTML tags, in particular <code>&lt;a&gt;</code> and <code>&lt;em&gt;</code>.
+        title: Server description
+      site_description_extended:
+        desc_html: A good place for your code of conduct, rules, guidelines and other things that set your server apart. You can use HTML tags
+        title: Custom extended information
+      site_short_description:
+        desc_html: Displayed in sidebar and meta tags. Describe what Mastodon is and what makes this server special in a single paragraph. If empty, defaults to server description.
+        title: Short server description
+      site_terms:
+        desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML tags
+        title: Custom terms of service
+      site_title: Server name
+      thumbnail:
+        desc_html: Used for previews via OpenGraph and API. 1200x630px recommended
+        title: Server thumbnail
+      timeline_preview:
+        desc_html: Display public timeline on landing page
+        title: Timeline preview
+      title: Site settings
+    statuses:
+      back_to_account: Back to account page
+      batch:
+        delete: Delete
+        nsfw_off: Mark as not sensitive
+        nsfw_on: Mark as sensitive
+      failed_to_execute: Failed to execute
+      media:
+        title: Media
+      no_media: No media
+      no_status_selected: No statuses were changed as none were selected
+      title: Account statuses
+      with_media: With media
+    subscriptions:
+      callback_url: Callback URL
+      confirmed: Confirmed
+      expires_in: Expires in
+      last_delivery: Last delivery
+      title: WebSub
+      topic: Topic
+    tags:
+      accounts: Accounts
+      hidden: Hidden
+      hide: Hide from directory
+      name: Hashtag
+      title: Hashtags
+      unhide: Show in directory
+      visible: Visible
+    title: Administration
+    warning_presets:
+      add_new: Add new
+      delete: Delete
+      edit: Edit
+      edit_preset: Edit warning preset
+      title: Manage warning presets
+  admin_mailer:
+    new_pending_account:
+      body: The details of the new account are below. You can approve or reject this application.
+      subject: New account up for review on %{instance} (%{username})
+    new_report:
+      body: "%{reporter} has reported %{target}"
+      body_remote: Someone from %{domain} has reported %{target}
+      subject: New report for %{instance} (#%{id})
+  application_mailer:
+    notification_preferences: Change e-mail preferences
+    salutation: "%{name},"
+    settings: 'Change e-mail preferences: %{link}'
+    view: 'View:'
+    view_profile: View Profile
+    view_status: View status
+  applications:
+    created: Application successfully created
+    destroyed: Application successfully deleted
+    invalid_url: The provided URL is invalid
+    regenerate_token: Regenerate access token
+    token_regenerated: Access token successfully regenerated
+    warning: Be very careful with this data. Never share it with anyone!
+    your_token: Your access token
+  auth:
+    agreement_html: By clicking "Sign up" below you agree to follow <a href="%{rules_path}">the rules of the server</a> and <a href="%{terms_path}">our terms of service</a>.
+    apply_for_account: Request an invite
+    change_password: Password
+    checkbox_agreement_html: I agree to the <a href="%{rules_path}" target="_blank">server rules</a> and <a href="%{terms_path}" target="_blank">terms of service</a>
+    confirm_email: Confirm email
+    delete_account: Delete account
+    delete_account_html: If you wish to delete your account, you can <a href="%{path}">proceed here</a>. You will be asked for confirmation.
+    didnt_get_confirmation: Didn't receive confirmation instructions?
+    forgot_password: Forgot your password?
+    invalid_reset_password_token: Password reset token is invalid or expired. Please request a new one.
+    login: Log in
+    logout: Logout
+    migrate_account: Move to a different account
+    migrate_account_html: If you wish to redirect this account to a different one, you can <a href="%{path}">configure it here</a>.
+    or_log_in_with: Or log in with
+    providers:
+      cas: CAS
+      saml: SAML
+    register: Sign up
+    registration_closed: "%{instance} is not accepting new members"
+    resend_confirmation: Resend confirmation instructions
+    reset_password: Reset password
+    security: Security
+    set_new_password: Set new password
+    trouble_logging_in: Trouble logging in?
+  authorize_follow:
+    already_following: You are already following this account
+    error: Unfortunately, there was an error looking up the remote account
+    follow: Follow
+    follow_request: 'You have sent a follow request to:'
+    following: 'Success! You are now following:'
+    post_follow:
+      close: Or, you can just close this window.
+      return: Show the user's profile
+      web: Go to web
+    title: Follow %{acct}
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count}h"
+      about_x_months: "%{count}mo"
+      about_x_years: "%{count}y"
+      almost_x_years: "%{count}y"
+      half_a_minute: Just now
+      less_than_x_minutes: "%{count}m"
+      less_than_x_seconds: Just now
+      over_x_years: "%{count}y"
+      x_days: "%{count}d"
+      x_minutes: "%{count}m"
+      x_months: "%{count}mo"
+      x_seconds: "%{count}s"
+  deletes:
+    bad_password_msg: Nice try, hackers! Incorrect password
+    confirm_password: Enter your current password to verify your identity
+    description_html: This will <strong>permanently, irreversibly</strong> remove content from your account and deactivate it. Your username will remain reserved to prevent future impersonations.
+    proceed: Delete account
+    success_msg: Your account was successfully deleted
+    warning_html: Only deletion of content from this particular server is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases.
+    warning_title: Disseminated content availability
+  directories:
+    directory: Profile directory
+    enabled: You are currently listed in the directory.
+    enabled_but_waiting: You have opted-in to be listed in the directory, but you do not have the minimum number of followers (%{min_followers}) to be listed yet.
+    explanation: Discover users based on their interests
+    explore_mastodon: Explore %{title}
+    how_to_enable: You are not currently opted-in to the directory. You can opt-in below. Use hashtags in your bio text to be listed under specific hashtags!
+    people:
+      one: "%{count} person"
+      other: "%{count} people"
+  errors:
+    '403': You don't have permission to view this page.
+    '404': The page you are looking for isn't here.
+    '410': The page you were looking for doesn't exist here anymore.
+    '422':
+      content: Security verification failed. Are you blocking cookies?
+      title: Security verification failed
+    '429': Throttled
+    '500':
+      content: We're sorry, but something went wrong on our end.
+      title: This page is not correct
+    noscript_html: To use the Mastodon web application, please enable JavaScript. Alternatively, try one of the <a href="%{apps_path}">native apps</a> for Mastodon for your platform.
+  exports:
+    archive_takeout:
+      date: Date
+      download: Download your archive
+      hint_html: You can request an archive of your <strong>toots and uploaded media</strong>. The exported data will be in the ActivityPub format, readable by any compliant software. You can request an archive every 7 days.
+      in_progress: Compiling your archive...
+      request: Request your archive
+      size: Size
+    blocks: You block
+    csv: CSV
+    domain_blocks: Domain blocks
+    follows: You follow
+    lists: Lists
+    mutes: You mute
+    storage: Media storage
+  featured_tags:
+    add_new: Add new
+    errors:
+      limit: You have already featured the maximum amount of hashtags
+  filters:
+    contexts:
+      home: Home timeline
+      notifications: Notifications
+      public: Public timelines
+      thread: Conversations
+    edit:
+      title: Edit filter
+    errors:
+      invalid_context: None or invalid context supplied
+      invalid_irreversible: Irreversible filtering only works with home or notifications context
+    index:
+      delete: Delete
+      title: Filters
+    new:
+      title: Add new filter
+  footer:
+    developers: Developers
+    more: More…
+    resources: Resources
+  generic:
+    all: All
+    changes_saved_msg: Changes successfully saved!
+    copy: Copy
+    save_changes: Save changes
+    validation_errors:
+      one: Something isn't quite right yet! Please review the error below
+      other: Something isn't quite right yet! Please review %{count} errors below
+  identity_proofs:
+    active: Active
+    authorize: Yes, authorize
+    authorize_connection_prompt: Authorize this cryptographic connection?
+    errors:
+      failed: The cryptographic connection failed. Please try again from %{provider}.
+      keybase:
+        invalid_token: Keybase tokens are hashes of signatures and must be 66 hex characters
+        verification_failed: Keybase does not recognize this token as a signature of Keybase user %{kb_username}. Please retry from Keybase.
+    explanation_html: Here you can cryptographically connect your other identities, such as a Keybase profile. This lets other people send you encrypted messages and trust content you send them.
+    i_am_html: I am %{username} on %{service}.
+    identity: Identity
+    inactive: Inactive
+    status: Verification status
+    view_proof: View proof
+  imports:
+    modes:
+      merge: Merge
+      merge_long: Keep existing records and add new ones
+      overwrite: Overwrite
+      overwrite_long: Replace current records with the new ones
+    preface: You can import data that you have exported from another server, such as a list of the people you are following or blocking.
+    success: Your data was successfully uploaded and will now be processed in due time
+    types:
+      blocking: Blocking list
+      domain_blocking: Domain blocking list
+      following: Following list
+      muting: Muting list
+    upload: Upload
+  in_memoriam_html: In Memoriam.
+  invites:
+    delete: Deactivate
+    expired: Expired
+    expires_in:
+      '1800': 30 minutes
+      '21600': 6 hours
+      '3600': 1 hour
+      '43200': 12 hours
+      '604800': 1 week
+      '86400': 1 day
+    expires_in_prompt: Never
+    generate: Generate
+    invited_by: 'You were invited by:'
+    max_uses:
+      one: 1 use
+      other: "%{count} uses"
+    max_uses_prompt: No limit
+    prompt: Generate and share links with others to grant access to this server
+    table:
+      expires_at: Expires
+      uses: Uses
+    title: Invite people
+  lists:
+    errors:
+      limit: You have reached the maximum amount of lists
+  media_attachments:
+    validations:
+      images_and_video: Cannot attach a video to a status that already contains images
+      too_many: Cannot attach more than 4 files
+  migrations:
+    acct: username@domain of the new account
+    currently_redirecting: 'Your profile is set to redirect to:'
+    proceed: Save
+    updated_msg: Your account migration setting successfully updated!
+  moderation:
+    title: Moderation
+  notification_mailer:
+    digest:
+      action: View all notifications
+      body: Here is a brief summary of the messages you missed since your last visit on %{since}
+      mention: "%{name} mentioned you in:"
+      new_followers_summary:
+        one: Also, you have acquired one new follower while being away! Yay!
+        other: Also, you have acquired %{count} new followers while being away! Amazing!
+      subject:
+        one: "1 new notification since your last visit \U0001F418"
+        other: "%{count} new notifications since your last visit \U0001F418"
+      title: In your absence...
+    favourite:
+      body: 'Your status was favourited by %{name}:'
+      subject: "%{name} favourited your status"
+      title: New favourite
+    follow:
+      body: "%{name} is now following you!"
+      subject: "%{name} is now following you"
+      title: New follower
+    follow_request:
+      action: Manage follow requests
+      body: "%{name} has requested to follow you"
+      subject: 'Pending follower: %{name}'
+      title: New follow request
+    mention:
+      action: Reply
+      body: 'You were mentioned by %{name} in:'
+      subject: You were mentioned by %{name}
+      title: New mention
+    reblog:
+      body: 'Your status was boosted by %{name}:'
+      subject: "%{name} boosted your status"
+      title: New boost
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: B
+          million: M
+          quadrillion: Q
+          thousand: K
+          trillion: T
+  pagination:
+    newer: Newer
+    next: Next
+    older: Older
+    prev: Prev
+    truncate: "&hellip;"
+  polls:
+    errors:
+      already_voted: You have already voted on this poll
+      duplicate_options: contain duplicate items
+      duration_too_long: is too far into the future
+      duration_too_short: is too soon
+      expired: The poll has already ended
+      over_character_limit: cannot be longer than %{max} characters each
+      too_few_options: must have more than one item
+      too_many_options: can't contain more than %{max} items
+  preferences:
+    languages: Languages
+    other: Other
+    publishing: Publishing
+    web: Web
+  relationships:
+    activity: Account activity
+    dormant: Dormant
+    moved: Moved
+    mutual: Mutual
+    primary: Primary
+    relationship: Relationship
+    remove_selected_domains: Remove all followers from the selected domains
+    remove_selected_followers: Remove selected followers
+    remove_selected_follows: Unfollow selected users
+    status: Account status
+  remote_follow:
+    acct: Enter your username@domain you want to act from
+    missing_resource: Could not find the required redirect URL for your account
+    no_account_html: Don't have an account? You can <a href='%{sign_up_path}' target='_blank'>sign up here</a>
+    proceed: Proceed to follow
+    prompt: 'You are going to follow:'
+    reason_html: "<strong>Why is this step necessary?</strong> <code>%{instance}</code> might not be the server where you are registered, so we need to redirect you to your home server first."
+  remote_interaction:
+    favourite:
+      proceed: Proceed to favourite
+      prompt: 'You want to favourite this toot:'
+    reblog:
+      proceed: Proceed to boost
+      prompt: 'You want to boost this toot:'
+    reply:
+      proceed: Proceed to reply
+      prompt: 'You want to reply to this toot:'
+  remote_unfollow:
+    error: Error
+    title: Title
+    unfollowed: Unfollowed
+  scheduled_statuses:
+    over_daily_limit: You have exceeded the limit of %{limit} scheduled toots for that day
+    over_total_limit: You have exceeded the limit of %{limit} scheduled toots
+    too_soon: The scheduled date must be in the future
+  sessions:
+    activity: Last activity
+    browser: Browser
+    browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Electron
+      firefox: Firefox
+      generic: Unknown browser
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Nokia S40 Ovi Browser
+      opera: Opera
+      otter: Otter
+      phantom_js: PhantomJS
+      qq: QQ Browser
+      safari: Safari
+      uc_browser: UCBrowser
+      weibo: Weibo
+    current_session: Current session
+    description: "%{browser} on %{platform}"
+    explanation: These are the web browsers currently logged in to your Mastodon account.
+    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: unknown platform
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
+    revoke: Revoke
+    revoke_success: Session successfully revoked
+    title: Sessions
+  settings:
+    authorized_apps: Authorized apps
+    back: Back to Mastodon
+    delete: Account deletion
+    development: Development
+    edit_profile: Edit profile
+    export: Data export
+    featured_tags: Featured hashtags
+    identity_proofs: Identity proofs
+    import: Import
+    migrate: Account migration
+    notifications: Notifications
+    preferences: Preferences
+    relationships: Follows and followers
+    settings: Settings
+    two_factor_authentication: Two-factor Auth
+    your_apps: Your applications
+  statuses:
+    attached:
+      description: 'Attached: %{attached}'
+      image:
+        one: "%{count} image"
+        other: "%{count} images"
+      video:
+        one: "%{count} video"
+        other: "%{count} videos"
+    boosted_from_html: Boosted from %{acct_link}
+    content_warning: 'Content warning: %{warning}'
+    disallowed_hashtags:
+      one: 'contained a disallowed hashtag: %{tags}'
+      other: 'contained the disallowed hashtags: %{tags}'
+    language_detection: Automatically detect language
+    open_in_web: Open in web
+    over_character_limit: character limit of %{max} exceeded
+    pin_errors:
+      limit: You have already pinned the maximum number of toots
+      ownership: Someone else's toot cannot be pinned
+      private: Non-public toot cannot be pinned
+      reblog: A boost cannot be pinned
+    poll:
+      total_votes:
+        one: "%{count} vote"
+        other: "%{count} votes"
+      vote: Vote
+    show_more: Show more
+    sign_in_to_participate: Sign in to participate in the conversation
+    title: '%{name}: "%{quote}"'
+    visibilities:
+      private: Followers-only
+      private_long: Only show to followers
+      public: Public
+      public_long: Everyone can see
+      unlisted: Unlisted
+      unlisted_long: Everyone can see, but not listed on public timelines
+  stream_entries:
+    pinned: Pinned toot
+    reblogged: boosted
+    sensitive_content: Sensitive content
+  terms:
+    body_html: |
+      <h2>Privacy Policy</h2>
+      <h3 id="collect">What information do we collect?</h3>
+
+      <ul>
+        <li><em>Basic account information</em>: If you register on this server, you may be asked to enter a username, an e-mail address and a password. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly.</li>
+        <li><em>Posts, following and other public information</em>: The list of people you follow is listed publicly, the same is true for your followers. When you submit a message, the date and time is stored as well as the application you submitted the message from. Messages may contain media attachments, such as pictures and videos. Public and unlisted posts are available publicly. When you feature a post on your profile, that is also publicly available information. Your posts are delivered to your followers, in some cases it means they are delivered to different servers and copies are stored there. When you delete posts, this is likewise delivered to your followers. The action of reblogging or favouriting another post is always public.</li>
+        <li><em>Direct and followers-only posts</em>: All posts are stored and processed on the server. Followers-only posts are delivered to your followers and users who are mentioned in them, and direct posts are delivered only to users mentioned in them. In some cases it means they are delivered to different servers and copies are stored there. We make a good faith effort to limit the access to those posts only to authorized persons, but other servers may fail to do so. Therefore it's important to review servers your followers belong to. You may toggle an option to approve and reject new followers manually in the settings. <em>Please keep in mind that the operators of the server and any receiving server may view such messages</em>, and that recipients may screenshot, copy or otherwise re-share them. <em>Do not share any dangerous information over Mastodon.</em></li>
+        <li><em>IPs and other metadata</em>: When you log in, we record the IP address you log in from, as well as the name of your browser application. All the logged in sessions are available for your review and revocation in the settings. The latest IP address used is stored for up to 12 months. We also may retain server logs which include the IP address of every request to our server.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">What do we use your information for?</h3>
+
+      <p>Any of the information we collect from you may be used in the following ways:</p>
+
+      <ul>
+        <li>To provide the core functionality of Mastodon. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.</li>
+        <li>To aid moderation of the community, for example comparing your IP address with other known ones to determine ban evasion or other violations.</li>
+        <li>The email address you provide may be used to send you information, notifications about other people interacting with your content or sending you messages, and to respond to inquiries, and/or other requests or questions.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="protect">How do we protect your information?</h3>
+
+      <p>We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information. Among other things, your browser session, as well as the traffic between your applications and the API, are secured with SSL, and your password is hashed using a strong one-way algorithm. You may enable two-factor authentication to further secure access to your account.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="data-retention">What is our data retention policy?</h3>
+
+      <p>We will make a good faith effort to:</p>
+
+      <ul>
+        <li>Retain server logs containing the IP address of all requests to this server, in so far as such logs are kept, no more than 90 days.</li>
+        <li>Retain the IP addresses associated with registered users no more than 12 months.</li>
+      </ul>
+
+      <p>You can request and download an archive of your content, including your posts, media attachments, profile picture, and header image.</p>
+
+      <p>You may irreversibly delete your account at any time.</p>
+
+      <hr class="spacer"/>
+
+      <h3 id="cookies">Do we use cookies?</h3>
+
+      <p>Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your Web browser (if you allow). These cookies enable the site to recognize your browser and, if you have a registered account, associate it with your registered account.</p>
+
+      <p>We use cookies to understand and save your preferences for future visits.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="disclose">Do we disclose any information to outside parties?</h3>
+
+      <p>We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety.</p>
+
+      <p>Your public content may be downloaded by other servers in the network. Your public and followers-only posts are delivered to the servers where your followers reside, and direct messages are delivered to the servers of the recipients, in so far as those followers or recipients reside on a different server than this.</p>
+
+      <p>When you authorize an application to use your account, depending on the scope of permissions you approve, it may access your public profile information, your following list, your followers, your lists, all your posts, and your favourites. Applications can never access your e-mail address or password.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="children">Site usage by children</h3>
+
+      <p>If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>) do not use this site.</p>
+
+      <p>If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) do not use this site.</p>
+
+      <p>Law requirements can be different if this server is in another jurisdiction.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="changes">Changes to our Privacy Policy</h3>
+
+      <p>If we decide to change our privacy policy, we will post those changes on this page.</p>
+
+      <p>This document is CC-BY-SA. It was last updated March 7, 2018.</p>
+
+      <p>Originally adapted from the <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p>
+    title: "%{instance} Terms of Service and Privacy Policy"
+  themes:
+    contrast: Mastodon (High contrast)
+    default: Mastodon (Dark)
+    mastodon-light: Mastodon (Light)
+  time:
+    formats:
+      default: "%b %d, %Y, %H:%M"
+      month: "%b %Y"
+  two_factor_authentication:
+    code_hint: Enter the code generated by your authenticator app to confirm
+    description_html: If you enable <strong>two-factor authentication</strong>, logging in will require you to be in possession of your phone, which will generate tokens for you to enter.
+    disable: Disable
+    enable: Enable
+    enabled: Two-factor authentication is enabled
+    enabled_success: Two-factor authentication successfully enabled
+    generate_recovery_codes: Generate recovery codes
+    instructions_html: "<strong>Scan this QR code into Google Authenticator or a similiar TOTP app on your phone</strong>. From now on, that app will generate tokens that you will have to enter when logging in."
+    lost_recovery_codes: Recovery codes allow you to regain access to your account if you lose your phone. If you've lost your recovery codes, you can regenerate them here. Your old recovery codes will be invalidated.
+    manual_instructions: 'If you can''t scan the QR code and need to enter it manually, here is the plain-text secret:'
+    recovery_codes: Backup recovery codes
+    recovery_codes_regenerated: Recovery codes successfully regenerated
+    recovery_instructions_html: If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. <strong>Keep the recovery codes safe</strong>. For example, you may print them and store them with other important documents.
+    setup: Set up
+    wrong_code: The entered code was invalid! Are server time and device time correct?
+  user_mailer:
+    backup_ready:
+      explanation: You requested a full backup of your Mastodon account. It's now ready for download!
+      subject: Your archive is ready for download
+      title: Archive takeout
+    warning:
+      explanation:
+        disable: While your account is frozen, your account data remains intact, but you cannot perform any actions until it is unlocked.
+        silence: While your account is limited, only people who are already following you will see your toots on this server, and you may be excluded from various public listings. However, others may still manually follow you.
+        suspend: Your account has been suspended, and all of your toots and your uploaded media files have been irreversibly removed from this server, and servers where you had followers.
+      review_server_policies: Review server policies
+      subject:
+        disable: Your account %{acct} has been frozen
+        none: Warning for %{acct}
+        silence: Your account %{acct} has been limited
+        suspend: Your account %{acct} has been suspended
+      title:
+        disable: Account frozen
+        none: Warning
+        silence: Account limited
+        suspend: Account suspended
+    welcome:
+      edit_profile_action: Setup profile
+      edit_profile_step: You can customize your profile by uploading an avatar, header, changing your display name and more. If you’d like to review new followers before they’re allowed to follow you, you can lock your account.
+      explanation: Here are some tips to get you started
+      final_action: Start posting
+      final_step: 'Start posting! Even without followers your public messages may be seen by others, for example on the local timeline and in hashtags. You may want to introduce yourself on the #introductions hashtag.'
+      full_handle: Your full handle
+      full_handle_hint: This is what you would tell your friends so they can message or follow you from another server.
+      review_preferences_action: Change preferences
+      review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay.
+      subject: Welcome to Mastodon
+      tip_federated_timeline: The federated timeline is a firehose view of the Mastodon network. But it only includes people your neighbours are subscribed to, so it's not complete.
+      tip_following: You follow your server's admin(s) by default. To find more interesting people, check the local and federated timelines.
+      tip_local_timeline: The local timeline is a firehose view of people on %{instance}. These are your immediate neighbours!
+      tip_mobile_webapp: If your mobile browser offers you to add Mastodon to your homescreen, you can receive push notifications. It acts like a native app in many ways!
+      tips: Tips
+      title: Welcome aboard, %{name}!
+  users:
+    follow_limit_reached: You cannot follow more than %{limit} people
+    invalid_email: The e-mail address is invalid
+    invalid_otp_token: Invalid two-factor code
+    otp_lost_help_html: If you lost access to both, you may get in touch with %{email}
+    seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available.
+    signed_in_as: 'Signed in as:'
+  verification:
+    explanation_html: 'You can <strong>verify yourself as the owner of the links in your profile metadata</strong>. For that, the linked website must contain a link back to your Mastodon profile. The link back <strong>must</strong> have a <code>rel="me"</code> attribute. The text content of the link does not matter. Here is an example:'
+    verification: Verification
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index bad9e6487..4621b93fc 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -4,17 +4,23 @@ eo:
     about_hashtag_html: Ĉi tiuj estas la publikaj mesaĝoj markitaj per <strong>#%{hashtag}</strong>. Vi povas interagi kun ili se vi havas konton ie ajn en la fediverse.
     about_mastodon_html: Mastodon estas socia reto bazita sur malfermitaj retaj protokoloj kaj sur libera malfermitkoda programo. Ĝi estas sencentra kiel retmesaĝoj.
     about_this: Pri
+    active_count_after: aktiva
     administered_by: 'Administrata de:'
     api: API
     apps: Poŝtelefonaj aplikaĵoj
+    apps_platforms: Uzu Mastodon ĉe iOS, Android kaj aliajn platformojn
+    browse_directory: Esplori profilujo kaj filtri per interesoj
     contact: Kontakti
     contact_missing: Ne elektita
     contact_unavailable: Ne disponebla
+    discover_users: Malkovri uzantojn
     documentation: Dokumentado
     extended_description_html: |
       <h3>Bona loko por reguloj</h3>
       <p>La detala priskribo ne estis elektita.</p>
+    federation_hint_html: Per konto ĉe %{instance}, vi povos sekvi homojn ĉe iu ajn Mastodon nodo kaj preter.
     generic_description: "%{domain} estas unu servilo en la reto"
+    get_apps: Provu telefonan aplikaĵon
     hosted_on: "%{domain} estas nodo de Mastodon"
     learn_more: Lerni pli
     privacy_policy: Privateca politiko
diff --git a/config/locales/es.yml b/config/locales/es.yml
index bb06bd5cf..bcc3fe62c 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -747,6 +747,10 @@ es:
     sensitive_content: Contenido sensible
   terms:
     title: Términos del Servicio y Políticas de Privacidad de %{instance}
+  themes:
+    contrast: Alto contraste
+    default: Mastodon
+    mastodon-light: Mastodon (claro)
   time:
     formats:
       default: "%d de %b del %Y, %H:%M"
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index ff8f80f13..d4ec320cb 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -4,25 +4,36 @@ fa:
     about_hashtag_html: این‌ها نوشته‌های عمومی هستند که برچسب (هشتگ) <strong>#%{hashtag}</strong> را دارند. اگر شما روی هر سروری حساب داشته باشید می‌توانید به این نوشته‌ها واکنش نشان دهید.
     about_mastodon_html: ماستدون (Mastodon) یک شبکهٔ اجتماعی است که بر اساس پروتکل‌های آزاد وب و نرم‌افزارهای آزاد و کدباز ساخته شده است. این شبکه مانند ایمیل غیرمتمرکز است.
     about_this: درباره
+    active_count_after: فعال
+    active_footnote: کاربران فعال در ماه گذشته
     administered_by: 'با مدیریت:'
     api: رابط برنامه‌نویسی کاربردی
     apps: اپ‌های موبایل
+    apps_platforms: ماستدون را در iOS، اندروید، و سایر سیستم‌ها داشته باشید
+    browse_directory: در فهرست گزیدهٔ کاربران این سرور چرخی بزنید و کاربران را بر اساس علاقه‌مندی‌هایشان پیدا کنید
+    browse_public_posts: فهرست لحظه‌ای نوشته‌های عمومی در ماستدون را ببینید
     contact: تماس
     contact_missing: تعیین نشده
     contact_unavailable: موجود نیست
+    discover_users: یافتن کاربران
     documentation: مستندات
     extended_description_html: |
       <h3>جای خوبی برای قانون‌ها</h3>
       <p>توضیحات تکمیلی نوشته نشده است.</p>
+    federation_hint_html: با داشتن حساب روی %{instance} می‌توانید کاربران همهٔ سرورهای دیگر ماستدون (و سایر شبکه‌های سازگار با آن) را پی بگیرید.
     generic_description: "%{domain} یک سرور روی شبکه است"
+    get_apps: یک اپ موبایل را امتحان کنید
     hosted_on: ماستدون، میزبانی‌شده روی %{domain}
     learn_more: بیشتر بدانید
     privacy_policy: سیاست رازداری
+    see_whats_happening: ببینید چه خبر است
+    server_stats: 'آمار سرور:'
     source_code: کدهای منبع
     status_count_after:
       one: چیز نوشته‌اند
       other: چیز نوشته‌اند
     status_count_before: که در کنار هم
+    tagline: با دوستان خود در ارتباط باشید و دوستان تازه پیدا کنید
     terms: شرایط کاربری
     user_count_after:
       one: کاربر
@@ -68,6 +79,7 @@ fa:
       delete: پاک کردن
       destroyed_msg: یادداشت مدیر با موفقیت پاک شد!
     accounts:
+      approve: پذیرفتن
       are_you_sure: آیا مطمئن هستید؟
       avatar: تصویر نمایه
       by_domain: دامین
@@ -113,6 +125,7 @@ fa:
       moderation:
         active: فعال
         all: همه
+        pending: در انتظار
         silenced: بی‌صدا شده
         suspended: معلق شده
         title: وضعیت
@@ -122,6 +135,7 @@ fa:
       no_limits_imposed: بدون محدودیت
       not_subscribed: عضو نیست
       outbox_url: نشانی صندوق خروجی
+      pending: در انتظار بررسی
       perform_full_suspension: تعلیق
       profile_url: نشانی نمایه
       promote: ترفیع‌دادن
@@ -129,6 +143,7 @@ fa:
       public: عمومی
       push_subscription_expires: عضویت از راه PuSH منقضی شد
       redownload: به‌روزرسانی نمایه
+      reject: نپذیرفتن
       remove_avatar: حذف تصویر نمایه
       remove_header: برداشتن تصویر زمینه
       resend_confirmation:
@@ -400,6 +415,12 @@ fa:
         min_invite_role:
           disabled: هیچ کس
           title: اجازهٔ دعوت به
+      registrations_mode:
+        modes:
+          approved: ثبت نام نیازمند تأیید مدیران است
+          none: کسی نمی‌تواند ثبت نام کند
+          open: همه می‌توانند ثبت نام کنند
+        title: شرایط ثبت نام
       show_known_fediverse_at_about_page:
         desc_html: اگر انتخاب شود، بوق‌های همهٔ سرورهای دیگر نیز در پیش‌نمایش این سرور نمایش می‌یابد. وگرنه فقط بوق‌های محلی نشان داده می‌شوند.
         title: نمایش سرورهای دیگر در پیش‌نمایش این سرور
@@ -407,13 +428,13 @@ fa:
         desc_html: نمایش علامت همکار روی صفحهٔ کاربر
         title: نمایش علامت همکار
       site_description:
-        desc_html: معرفی کوتاهی که روی صفحهٔ اصلی نمایش می‌یابد. دربارهٔ این که چه چیزی دربارهٔ این سرور ماستدون ویژه است یا هر چیز مهم دیگری بنویسید. می‌توانید HTML بنویسید، به‌ویژه <code>&lt;a&gt;</code> و <code>&lt;em&gt;</code>.
+        desc_html: معرفی کوتاهی دربارهٔ رابط برنامه‌نویسی کاربردی. دربارهٔ این که چه چیزی دربارهٔ این سرور ماستدون ویژه است یا هر چیز مهم دیگری بنویسید. می‌توانید HTML بنویسید، به‌ویژه <code>&lt;a&gt;</code> و <code>&lt;em&gt;</code>.
         title: دربارهٔ این سرور
       site_description_extended:
         desc_html: جای خوبی برای نوشتن سیاست‌های کاربری، قانون‌ها، راهنماها، و هر چیزی که ویژهٔ این سرور است. تگ‌های HTML هم مجاز است
         title: اطلاعات تکمیلی سفارشی
       site_short_description:
-        desc_html: روی نوار کناری و همچنین به عنوان فرادادهٔ صفحه‌ها نمایش می‌یابد. در یک بند توضیح دهید که ماستدون چیست و چرا این سرور با بقیه فرق دارد. اگر خالی بگذارید، به جایش «دربارهٔ سایت» نمایش می‌یابد.
+        desc_html: روی نوار کناری و همچنین به عنوان فرادادهٔ صفحه‌ها نمایش می‌یابد. در یک بند توضیح دهید که ماستدون چیست و چرا این سرور با بقیه فرق دارد.
         title: توضیح کوتاه دربارهٔ سرور
       site_terms:
         desc_html: می‌توانید سیاست رازداری، شرایط استفاده، یا سایر مسائل قانونی را به دلخواه خود بنویسید. تگ‌های HTML هم مجاز است
@@ -462,6 +483,9 @@ fa:
       edit_preset: ویرایش هشدار پیش‌فرض
       title: مدیریت هشدارهای پیش‌فرض
   admin_mailer:
+    new_pending_account:
+      body: جزئیات حساب تازه این‌جاست. شما می‌توانید آن را تأیید یا رد کنید.
+      subject: حساب تازه‌ای در %{instance} نیازمند بررسی است (%{username})
     new_report:
       body: کاربر %{reporter} کاربر %{target} را گزارش داد
       body_remote: کسی از %{domain} گزارش %{target} را فرستاده
@@ -483,7 +507,9 @@ fa:
     your_token: کد دسترسی شما
   auth:
     agreement_html: با کلیک روی دکمهٔ عضو شدن، شما <a href="%{rules_path}">قوانین این سرور</a> و <a href="%{terms_path}">شرایط استفادهٔ</a> ما را می‌پذیرید.
+    apply_for_account: درخواست دعوت‌نامه
     change_password: رمز
+    checkbox_agreement_html: من <a href="%{rules_path}" target="_blank">قانون‌های این سرور</a> و <a href="%{terms_path}" target="_blank">شرایط کاربری</a> را می‌پذیرم
     confirm_email: تأیید ایمیل
     delete_account: پاک‌کردن حساب
     delete_account_html: اگر می‌خواهید حساب خود را پاک کنید، از <a href="%{path}">این‌جا</a> پیش بروید. از شما درخواست تأیید خواهد شد.
@@ -499,10 +525,12 @@ fa:
       cas: CAS
       saml: SAML
     register: عضو شوید
+    registration_closed: سرور %{instance} عضو تازه‌ای نمی‌پذیرد
     resend_confirmation: راهنمایی برای تأیید را دوباره بفرست
     reset_password: بازنشانی رمز
     security: امنیت
     set_new_password: تعیین رمز تازه
+    trouble_logging_in: برای ورود مشکلی دارید؟
   authorize_follow:
     already_following: شما همین الان هم این حساب را پی‌می‌گیرید
     error: متأسفانه حین یافتن آن حساب خطایی رخ داد
@@ -558,6 +586,9 @@ fa:
       content: شرمنده، یک چیزی از سمت ما اشتباه شده.
       title: این صفحه درست نیست
     noscript_html: برای استفاده از نسخهٔ تحت وب ماستدون، لطفاً جاوااسکریپت را فعال کنید. یا به جایش می‌توانید <a href="%{apps_path}">یک اپ ماستدون</a> را به‌کار ببرید.
+  existing_username_validator:
+    not_found: کاربری در این سرور با این نام کاربری پیدا نشد
+    not_found_multiple: "%{usernames} پیدا نشد"
   exports:
     archive_takeout:
       date: تاریخ
@@ -598,12 +629,30 @@ fa:
     more: بیشتر…
     resources: منابع
   generic:
+    all: همه
     changes_saved_msg: تغییرات با موفقیت ذخیره شدند!
     copy: رونوشت
     save_changes: ذخیرهٔ تغییرات
     validation_errors:
       one: یک چیزی هنوز درست نیست! لطفاً خطاهای زیر را ببینید
       other: یک چیزی هنوز درست نیست! لطفاً %{count} خطای زیر را ببینید
+  html_validator:
+    invalid_markup: 'دارای نشانه‌گذاری نامعتبر HTML است: %{error}'
+  identity_proofs:
+    active: فعال
+    authorize: بله، اجازه بده
+    authorize_connection_prompt: آیا اجازهٔ این ارتباط رمزگذاری را می‌دهید؟
+    errors:
+      failed: برقراری ارتباط  رمزگذاری شکست خورد. لطفاً دوباره از %{provider} تلاش کنید.
+      keybase:
+        invalid_token: کدهای Keybase چکیده (هش) امضاهای دیجیتال هستند و دست‌کم ۶۶ نویسه در مبنای ۱۶ دارند
+        verification_failed: این کد را Keybase به عنوان امضای دیجیتال کاربر %{kb_username} تأیید نمی‌کند. لطفاً دوباره از Keybase تلاش کنید.
+    explanation_html: این‌جا می‌توانید به شناسه‌های دیگر خود مانند نمایهٔ Keybase خودتان به طور رمزنگارانه متصل شوید. با این کار دیگران می‌توانند به شما پیغام‌های رمزشده بفرستند و به چیزی که شما به آن‌ها می‌فرستید اعتماد کنند.
+    i_am_html: من %{username} روی %{service} هستم.
+    identity: شناسه
+    inactive: غیرفعال
+    status: وضعیت تأیید
+    view_proof: دیدن مدرک
   imports:
     modes:
       merge: ادغام
@@ -721,6 +770,17 @@ fa:
     other: سایر تنظیمات
     publishing: تنظیمات انتشار مطالب
     web: وب
+  relationships:
+    activity: فعالیت حساب
+    dormant: غیرفعال
+    moved: منتقل‌شده
+    mutual: دوطرفه
+    primary: اصلی
+    relationship: رابطه
+    remove_selected_domains: همهٔ پیگیران از طرف این سرور را بردار
+    remove_selected_followers: پیگیران انتخاب‌شده را بردار
+    remove_selected_follows: به پیگیری از کاربران انتخاب‌شده پایان بده
+    status: وضعیت حساب
   remote_follow:
     acct: نشانی حساب username@domain خود را این‌جا بنویسید
     missing_resource: نشانی اینترنتی برای رسیدن به حساب شما پیدا نشد
@@ -795,10 +855,12 @@ fa:
     edit_profile: ویرایش نمایه
     export: برون‌سپاری داده‌ها
     featured_tags: برچسب‌های منتخب
+    identity_proofs: مدرک شناسه‌ها
     import: درون‌ریزی
     migrate: انتقال حساب
     notifications: اعلان‌ها
     preferences: ترجیحات
+    relationships: پیگیری‌ها و پیگیران
     settings: تنظیمات
     two_factor_authentication: ورود دومرحله‌ای
     your_apps: برنامهٔ شما
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 1a1f6c590..32f642e16 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -4,25 +4,36 @@ gl:
     about_hashtag_html: Estas son mensaxes públicas etiquetadas con <strong>#%{hashtag}</strong>. Pode interactuar con elas si ten unha conta nalgures do fediverso.
     about_mastodon_html: Mastodon é unha rede social que se basea en protocolos web abertos e libres, software de código aberto. É descentralizada como o correo electrónico.
     about_this: Sobre
+    active_count_after: activo
+    active_footnote: Usuarias Activas no Mes (UAM)
     administered_by: 'Administrada por:'
     api: API
     apps: Apps móbiles
+    apps_platforms: Utilice Mastodon desde iOS, Android e outras plataformas
+    browse_directory: Navegue no directorio de perfís e filtre por intereses
+    browse_public_posts: Vexa o fluxo de comentarios públicos en Mastodon
     contact: Contacto
     contact_missing: Non establecido
     contact_unavailable: N/A
+    discover_users: Descubra usuarias
     documentation: Documentación
     extended_description_html: |
       <h3>Un bo lugar para regras</h3>
       <p>A descrición extendida aínda non se proporcionou.</p>
+    federation_hint_html: Con unha conta en %{instance} poderá seguir a outras persoas en calquera dos servidores Mastodon e incluso máis.
     generic_description: "%{domain} é un servidor na rede"
+    get_apps: Probe cunha app móbil
     hosted_on: Mastodon aloxado en %{domain}
     learn_more: Coñeza máis
     privacy_policy: Política de intimidade
+    see_whats_happening: Mire o que acontece
+    server_stats: 'Estatísticas:'
     source_code: Código fonte
     status_count_after:
       one: estado
       other: estados
     status_count_before: Que publicaron
+    tagline: Siga as amizades e faga outras novas
     terms: Termos do servizo
     user_count_after:
       one: usuaria
@@ -68,6 +79,7 @@ gl:
       delete: Eliminar
       destroyed_msg: Nota a moderación destruída con éxito!
     accounts:
+      approve: Aprobar
       are_you_sure: Está segura?
       avatar: Avatar
       by_domain: Dominio
@@ -113,6 +125,7 @@ gl:
       moderation:
         active: Activa
         all: Todo
+        pending: Pendente
         silenced: Acalado
         suspended: Suspendido
         title: Moderación
@@ -122,6 +135,7 @@ gl:
       no_limits_imposed: Sen límites impostos
       not_subscribed: Non suscrita
       outbox_url: URL caixa de saída
+      pending: Pendente revisión
       perform_full_suspension: Suspender
       profile_url: URL do perfil
       promote: Promocionar
@@ -129,6 +143,7 @@ gl:
       public: Público
       push_subscription_expires: A suscrición PuSH caduca
       redownload: Actualizar perfil
+      reject: Rexeitar
       remove_avatar: Eliminar avatar
       remove_header: Eliminar cabeceira
       resend_confirmation:
@@ -400,6 +415,12 @@ gl:
         min_invite_role:
           disabled: Ninguén
           title: Permitir convites por
+      registrations_mode:
+        modes:
+          approved: Precisa aprobación para rexistrarse
+          none: Rexistro pechado
+          open: Rexistro aberto
+        title: Estado do rexistro
       show_known_fediverse_at_about_page:
         desc_html: Si activado, mostraralle os toots de todo o fediverso coñecido nunha vista previa. Si non só mostrará os toots locais.
         title: Mostrar vista previa do fediverso na liña temporal
@@ -462,6 +483,9 @@ gl:
       edit_preset: Editar aviso preestablecido
       title: Xestionar avisos preestablecidos
   admin_mailer:
+    new_pending_account:
+      body: Abaixo están os detalles da conta. Pode aprobar ou rexeitar esta solicitude.
+      subject: Hai unha conta nova para revisar en %{instance} (%{username})
     new_report:
       body: "%{reporter} informou sobre %{target}"
       body_remote: Alguén desde %{domain} informou sobre %{target}
@@ -483,7 +507,9 @@ gl:
     your_token: O seu testemuño de acceso
   auth:
     agreement_html: Ao pulsar "Rexistrar" vostede acorda seguir <a href="%{rules_path}">as normas do servidor</a> e <a href="%{terms_path}">os termos do servizo</a>.
+    apply_for_account: Solicite un convite
     change_password: Contrasinal
+    checkbox_agreement_html: Acepto as <a href="%{rules_path}" target="_blank">regras do servidor</a> e os <a href="%{terms_path}" target="_blank">termos do servizo</a>
     confirm_email: Confirmar correo-e
     delete_account: Eliminar conta
     delete_account_html: Se desexa eliminar a súa conta, pode <a href="%{path}">facelo aquí</a>. Pediráselle confirmación.
@@ -499,10 +525,12 @@ gl:
       cas: CAS
       saml: SAML
     register: Rexistro
+    registration_closed: "%{instance} non está a aceptar novas usuarias"
     resend_confirmation: Voltar a enviar intruccións de confirmación
     reset_password: Restablecer contrasinal
     security: Seguridade
     set_new_password: Establecer novo contrasinal
+    trouble_logging_in: Problemas para conectar?
   authorize_follow:
     already_following: Xa está a seguir esta conta
     error: Desgraciadamente, algo fallou ao buscar a conta remota
@@ -598,12 +626,28 @@ gl:
     more: Máis…
     resources: Recursos
   generic:
+    all: Todo
     changes_saved_msg: Cambios gardados correctamente!!
     copy: Copiar
     save_changes: Gardar cambios
     validation_errors:
       one: Algo non está ben de todo! Por favor revise abaixo o erro
       other: Algo aínda non está ben! Por favor revise os %{count} erros abaixo
+  identity_proofs:
+    active: Activo
+    authorize: Si, autorizar
+    authorize_connection_prompt: Autorizar esta conexión criptográfica?
+    errors:
+      failed: Fallou a conexión criptográfica. Por favor inténteo de novo desde %{provider}.
+      keybase:
+        invalid_token: Os testemuños Keybase son hashes de firma e deben ter 66 caracteres hexadecimais
+        verification_failed: Keybase non recoñece este testemuño como firma da usuaria de Keybase %{kb_username}. Por favor inténteo desde Keybase.
+    explanation_html: Aquí pódese conectar criptográficamente as suas outras identidades, como a un perfil Keybase. Esto permitelle a outras persoas enviarlle mensaxes cifradas e confiar no contido que vostede lle envía.
+    i_am_html: Eu son %{username} en %{service}.
+    identity: Identidade
+    inactive: Inactiva
+    status: Estado da validación
+    view_proof: Ver proba
   imports:
     modes:
       merge: Fusionar
@@ -721,6 +765,17 @@ gl:
     other: Outro
     publishing: Publicando
     web: Web
+  relationships:
+    activity: Actividade da conta
+    dormant: En repouso
+    moved: Movida
+    mutual: Mutuo
+    primary: Principal
+    relationship: Relación
+    remove_selected_domains: Eliminar todas as seguidoras dos dominios escollidos
+    remove_selected_followers: Eliminar as seguidoras escollidas
+    remove_selected_follows: Deixar de seguir as usuarias escollidas
+    status: Estado da conta
   remote_follow:
     acct: Introduza o seu usuaria@servidor desde onde quere interactuar
     missing_resource: Non se puido atopar o URL de redirecionamento requerido para a súa conta
@@ -795,10 +850,12 @@ gl:
     edit_profile: Editar perfil
     export: Exportar datos
     featured_tags: Etiquetas destacadas
+    identity_proofs: Probas de identidade
     import: Importar
     migrate: Migrar conta
     notifications: Notificacións
     preferences: Preferencias
+    relationships: Seguindo e seguidoras
     settings: Axustes
     two_factor_authentication: Validar Doble Factor
     your_apps: As súas aplicacións
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 985d4f100..054d90833 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -437,7 +437,7 @@ ja:
         desc_html: サイドバーと meta タグに表示されます。Mastodon とは何か、そしてこのサーバーの特別な何かを1段落で記述してください。空欄の場合、サーバーの説明が使用されます。
         title: 短いサーバーの説明
       site_terms:
-        desc_html: あなたは独自のプライバシーポリシーや利用規約、そのほかの法的根拠を書くことができます。HTMLタグが使えます
+        desc_html: 独自のプライバシーポリシーや利用規約、その他の法的根拠を記述できます。HTMLタグが使えます
         title: カスタム利用規約
       site_title: サーバーの名前
       thumbnail:
@@ -737,9 +737,13 @@ ja:
     truncate: "&hellip;"
   polls:
     errors:
-      duplicate_options: 項目が重複しています
-      duration_too_short: 期限が短すぎます
+      duplicate_options: に同じものがあります
+      duration_too_long: が長過ぎます
+      duration_too_short: が短過ぎます
       expired: 既に終了している投票です
+      over_character_limit: は%{max}文字より長くすることはできません
+      too_few_options: は複数必要です
+      too_many_options: は%{max}個までです
   preferences:
     languages: 言語
     other: その他
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 7793a2108..fd1470d2d 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -4,25 +4,36 @@ ko:
     about_hashtag_html: "<strong>#%{hashtag}</strong> 라는 해시태그가 붙은 공개 툿 입니다. 같은 연합에 속한 임의의 인스턴스에 계정을 생성하면 당신도 대화에 참여할 수 있습니다."
     about_mastodon_html: 마스토돈은 <em>오픈 소스 기반의</em> 소셜 네트워크 서비스 입니다. 상용 플랫폼의 대체로서 <em>분산형 구조</em>를 채택해, 여러분의 대화가 한 회사에 독점되는 것을 방지합니다. 신뢰할 수 있는 인스턴스를 선택하세요 &mdash; 어떤 인스턴스를 고르더라도, 누구와도 대화할 수 있습니다. 누구나 자신만의 마스토돈 인스턴스를 만들 수 있으며, 아주 매끄럽게 <em>소셜 네트워크</em>에 참가할 수 있습니다.
     about_this: 이 인스턴스에 대해서
+    active_count_after: 활성 사용자
+    active_footnote: 월간 활성 사용자
     administered_by: '관리자:'
     api: API
     apps: 모바일 앱
+    apps_platforms: 마스토돈을 iOS, 안드로이드, 다른 플랫폼들에서도 사용하세요
+    browse_directory: 프로필 디렉터리를 둘러보고 관심사 찾기
+    browse_public_posts: 마스토돈의 공개 라이브 스트림을 둘러보기
     contact: 연락처
     contact_missing: 미설정
     contact_unavailable: N/A
+    discover_users: 유저 발견하기
     documentation: 문서
     extended_description_html: |
       <h3>룰을 작성하는 장소</h3>
       <p>아직 설명이 작성되지 않았습니다.</p>
+    federation_hint_html: "%{instance}에 계정을 만드는 것으로 모든 마스토돈 서버, 그리고 호환 되는 모든 서버의 사용자를 팔로우 할 수 있습니다."
     generic_description: "%{domain} 은 네트워크에 있는 한 서버입니다"
+    get_apps: 모바일 앱 사용해 보기
     hosted_on: "%{domain}에서 호스팅 되는 마스토돈"
     learn_more: 자세히
     privacy_policy: 개인정보 정책
+    see_whats_happening: 무슨 일이 일어나는 지 보기
+    server_stats: '서버 통계:'
     source_code: 소스 코드
     status_count_after:
       one: 툿
       other: 툿
     status_count_before: 툿 수
+    tagline: 친구들을 팔로우 하고 새로운 사람들도 만나기
     terms: 이용약관
     user_count_after:
       one: 명
@@ -68,6 +79,7 @@ ko:
       delete: 삭제
       destroyed_msg: 모더레이션 기록이 성공적으로 삭제되었습니다!
     accounts:
+      approve: 승인
       are_you_sure: 정말로 실행하시겠습니까?
       avatar: 아바타
       by_domain: 도메인
@@ -113,6 +125,7 @@ ko:
       moderation:
         active: 활동
         all: 전체
+        pending: 대기중
         silenced: 침묵 중
         suspended: 정지 중
         title: 모더레이션
@@ -122,6 +135,7 @@ ko:
       no_limits_imposed: 제한 없음
       not_subscribed: 구독하지 않음
       outbox_url: 발신함 URL
+      pending: 심사 대기
       perform_full_suspension: 정지시키기
       profile_url: 프로필 URL
       promote: 승급
@@ -129,6 +143,7 @@ ko:
       public: 전체 공개
       push_subscription_expires: PuSH 구독 기간 만료
       redownload: 프로필 업데이트
+      reject: 거부
       remove_avatar: 아바타 지우기
       remove_header: 헤더 삭제
       resend_confirmation:
@@ -136,7 +151,7 @@ ko:
         send: 다시 확인 이메일
         success: 확인 이메일이 전송되었습니다!
       reset: 초기화
-      reset_password: 비밀번호 초기화
+      reset_password: 암호 초기화
       resubscribe: 다시 구독
       role: 권한
       roles:
@@ -230,6 +245,7 @@ ko:
       feature_profile_directory: 프로필 디렉토리
       feature_registrations: 가입
       feature_relay: 연합 릴레이
+      feature_timeline_preview: 타임라인 미리보기
       features: 기능
       hidden_service: 히든 서비스와의 연합
       open_reports: 미해결 신고
@@ -402,6 +418,12 @@ ko:
         min_invite_role:
           disabled: 아무도 못 하게
           title: 초대링크를 만들 수 있는 권한
+      registrations_mode:
+        modes:
+          approved: 가입하려면 승인이 필요함
+          none: 아무도 가입 할 수 없음
+          open: 누구나 가입 할 수 있음
+        title: 가입 모드
       show_known_fediverse_at_about_page:
         desc_html: 활성화 되면 프리뷰 페이지에서 페디버스의 모든 툿을 표시합니다. 비활성화시 로컬에 있는 툿만 표시 됩니다.
         title: 타임라인 프리뷰에 알려진 페디버스 표시하기
@@ -409,13 +431,13 @@ ko:
         desc_html: 유저 페이지에 스태프 배지를 표시합니다
         title: 스태프 배지 표시
       site_description:
-        desc_html: 프론트 페이지의 소개문에 사용 됩니다.이 마스토돈 서버의 특별한 점 등을 설명하세요. HTML 태그, 주로 <code>&lt;a&gt;</code>, <code>&lt;em&gt;</code> 같은 것을 사용 가능합니다.
+        desc_html: API의 소개문에 사용 됩니다.이 마스토돈 서버의 특별한 점 등을 설명하세요. HTML 태그, 주로 <code>&lt;a&gt;</code>, <code>&lt;em&gt;</code> 같은 것을 사용 가능합니다.
         title: 서버 설명
       site_description_extended:
         desc_html: 규칙, 가이드라인 등을 작성하기 좋은 곳입니다. HTML 태그를 사용할 수 있습니다
         title: 사이트 상세 설명
       site_short_description:
-        desc_html: 사이드바와 메타 태그에 나타납니다. 마스토돈이 무엇이고 이 서버의 특징은 무엇인지 한 문장으로 설명하세요. 비워두면 서버 설명이 대신 사용됩니다.
+        desc_html: 사이드바와 메타 태그에 나타납니다. 마스토돈이 무엇이고 이 서버의 특징은 무엇인지 한 문장으로 설명하세요.
         title: 짧은 서버 설명
       site_terms:
         desc_html: 당신은 독자적인 개인정보 취급 방침이나 이용약관, 그 외의 법적 근거를 작성할 수 있습니다. HTML태그를 사용할 수 있습니다
@@ -464,6 +486,9 @@ ko:
       edit_preset: 경고 틀 수정
       title: 경고 틀 관리
   admin_mailer:
+    new_pending_account:
+      body: 아래에 새 계정에 대한 상세정보가 있습니다. 이 가입을 승인하거나 거부할 수 있습니다.
+      subject: "%{instance}의 새 계정(%{username})에 대한 심사가 대기중입니다"
     new_report:
       body: "%{reporter} 가 %{target} 를 신고했습니다"
       body_remote: "%{domain}의 누군가가 %{target}을 신고했습니다"
@@ -485,13 +510,15 @@ ko:
     your_token: 액세스 토큰
   auth:
     agreement_html: 이 등록으로 이 서버의 <a href="%{rules_path}">이용규약</a> 과 <a href="%{terms_path}">약관</a>에 동의하는 것으로 간주됩니다.
+    apply_for_account: 가입 요청하기
     change_password: 패스워드
+    checkbox_agreement_html: <a href="%{rules_path}" target="_blank">서버 규칙</a>과 <a href="%{terms_path}" target="_blank">이용약관</a>에 동의합니다
     confirm_email: 확인 메일 승인
     delete_account: 계정 삭제
     delete_account_html: 계정을 삭제하고 싶은 경우, <a href="%{path}">여기서</a> 삭제할 수 있습니다. 삭제 전 확인 화면이 표시됩니다.
     didnt_get_confirmation: 확인 메일을 받지 못하셨습니까?
     forgot_password: 비밀번호를 잊어버리셨습니까?
-    invalid_reset_password_token: 비밀번호 리셋 토큰이 올바르지 못하거나 기간이 만료되었습니다. 다시 요청해주세요.
+    invalid_reset_password_token: 암호 리셋 토큰이 올바르지 못하거나 기간이 만료되었습니다. 다시 요청해주세요.
     login: 로그인
     logout: 로그아웃
     migrate_account: 계정 옮기기
@@ -501,10 +528,12 @@ ko:
       cas: CAS
       saml: SAML
     register: 등록하기
+    registration_closed: "%{instance}는 새로운 가입을 받지 않고 있습니다"
     resend_confirmation: 확인 메일을 다시 보내기
-    reset_password: 비밀번호 재설정
+    reset_password: 암호 재설정
     security: 보안
-    set_new_password: 새 비밀번호
+    set_new_password: 새 암호
+    trouble_logging_in: 로그인 하는데 문제가 있나요?
   authorize_follow:
     already_following: 이미 이 계정을 팔로우 하고 있습니다
     error: 리모트 계정을 확인하는 도중 오류가 발생했습니다
@@ -560,6 +589,9 @@ ko:
       content: 죄송합니다, 뭔가 잘못 되었습니다.
       title: 이 페이지는 잘못되었습니다
     noscript_html: 마스토돈을 사용하기 위해서는 자바스크립트를 켜 주십시오. 아니면 <a href="%{apps_path}">네이티브 앱</a> 중 하나를 사용할 수 있습니다.
+  existing_username_validator:
+    not_found: 해당 유저네임에 대한 로컬 유저를 찾을 수 없습니다
+    not_found_multiple: "%{usernames}를 찾을 수 없습니다"
   exports:
     archive_takeout:
       date: 날짜
@@ -600,12 +632,34 @@ ko:
     more: 더 보기…
     resources: 리소스
   generic:
+    all: 모두
     changes_saved_msg: 정상적으로 변경되었습니다!
     copy: 복사
+    order_by: 순서
     save_changes: 변경 사항을 저장
     validation_errors:
       one: 오류가 발생했습니다. 아래 오류를 확인해 주십시오
       other: 오류가 발생했습니다. 아래 %{count}개 오류를 확인해 주십시오
+  html_validator:
+    invalid_markup: '올바르지 않은 HTML 마크업을 포함하고 있습니다: %{error}'
+  identity_proofs:
+    active: 활성
+    authorize: 네, 인증합니다
+    authorize_connection_prompt: 이 암호화 연결을 인증합니까?
+    errors:
+      failed: 암호화 연결에 실패했습니다. %{provider}에서 다시 시도해 주세요.
+      keybase:
+        invalid_token: 키베이스 토큰은 서명의 해시이며 66자의 16진수 문자여야 합니다
+        verification_failed: 키베이스가 이 토큰을 키베이스 유저 %{kb_username}의 서명으로 인식하지 못했습니다. 키베이스에서 다시 시도하세요.
+      wrong_user: "%{current}로 로그인 한 상태에서는 %{proving}에 대한 증명을 할 수 없습니다. %{proving}으로 로그인 한 후 다시 시도하세요."
+    explanation_html: 키베이스와 같은 다른 명의에 대한 암호화 연결을 할 수 있습니다. 이것으로 다른 사람들이 당신에게 암호화 된 메시지를 보낼 수 있고 당신의 메시지를 믿을 수 있습니다.
+    i_am_html: 나는 %{service}의 %{username} 입니다.
+    identity: 신원
+    inactive: 비활성
+    publicize_checkbox: '그리고 이것을 툿 하세요:'
+    publicize_toot: '증명되었습니다! 저는 %{service}에 있는 %{username}입니다: %{url}'
+    status: 인증 상태
+    view_proof: 증명 보기
   imports:
     modes:
       merge: 병합
@@ -723,6 +777,19 @@ ko:
     other: 기타
     publishing: 퍼블리싱
     web: 웹
+  relationships:
+    activity: 계정 활동
+    dormant: 휴면
+    last_active: 마지막 활동
+    most_recent: 가장 최근
+    moved: 이동함
+    mutual: 상호 팔로우
+    primary: 주 계정
+    relationship: 관계
+    remove_selected_domains: 선택한 도메인의 모든 팔로워 삭제
+    remove_selected_followers: 선택한 팔로워 삭제
+    remove_selected_follows: 선택한 유저들을 팔로우 해제
+    status: 계정 상태
   remote_follow:
     acct: 당신이 사용하는 아이디@도메인을 입력해 주십시오
     missing_resource: 리디렉션 대상을 찾을 수 없습니다
@@ -797,10 +864,12 @@ ko:
     edit_profile: 프로필 편집
     export: 데이터 내보내기
     featured_tags: 추천 해시태그
+    identity_proofs: 신원 증명
     import: 데이터 가져오기
     migrate: 계정 이동
     notifications: 알림
     preferences: 사용자 설정
+    relationships: 팔로잉과 팔로워
     settings: 설정
     two_factor_authentication: 2단계 인증
     your_apps: 애플리케이션
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 8c115a436..85df11cf6 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -4,20 +4,29 @@ oc:
     about_hashtag_html: Vaquí los estatuts publics ligats a <strong>#%{hashtag}</strong>. Podètz interagir amb eles s’avètz un compte ont que siasque sul fediverse.
     about_mastodon_html: Mastodon es un malhum social bastit amb de protocòls liures e gratuits. Es descentralizat coma los corrièls.
     about_this: A prepaus d’aquesta instància
+    active_count_after: actius
+    active_footnote: Utilizaire actius per mes (UAM)
     administered_by: 'Administrat per :'
     api: API
     apps: Aplicacions per mobil
+    apps_platforms: Utilizatz Mastodon d‘iOS, Android o d’autras plataforma estant
+    browse_directory: Navigatz per l’annuari de perfil e filtratz segon çò qu’aimatz
+    browse_public_posts: Navigatz pel flux public a Mastodon
     contact: Contacte
     contact_missing: Pas parametrat
     contact_unavailable: Pas disponible
+    discover_users: Descobrissètz de nòvas personas
     documentation: Documentacion
     extended_description_html: |
       <h3>Una bona plaça per las règlas</h3>
       <p>La descripcion longa es pas estada causida pel moment.</p>
     generic_description: "%{domain} es un dels servidors del malhum"
+    get_apps: Ensajatz una aplicacion mobil
     hosted_on: Mastodon albergat sus %{domain}
     learn_more: Ne saber mai
     privacy_policy: Politica de confidencialitat
+    see_whats_happening: Agachatz çò qu’arriba
+    server_stats: 'Estatisticas del servidor :'
     source_code: Còdi font
     status_count_after:
       one: estatut
@@ -68,6 +77,7 @@ oc:
       delete: Suprimir
       destroyed_msg: Nòta de moderacion ben suprimida !
     accounts:
+      approve: Aprovar
       are_you_sure: Sètz segur ?
       avatar: Avatar
       by_domain: Domeni
@@ -113,6 +123,7 @@ oc:
       moderation:
         active: Actius
         all: Totes
+        pending: En espèra
         silenced: Resconduts
         suspended: Suspenduts
         title: Moderacion
@@ -122,6 +133,7 @@ oc:
       no_limits_imposed: Cap de limit impausat
       not_subscribed: Pas seguidor
       outbox_url: URL Outbox
+      pending: Revision en espèra
       perform_full_suspension: Suspendre
       profile_url: URL del perfil
       promote: Promòure
@@ -400,6 +412,10 @@ oc:
         min_invite_role:
           disabled: Degun
           title: Autorizat amb invitacions
+      registrations_mode:
+        modes:
+          none: Degun pòt pas se marcar
+        title: Mòdes d’inscripcion
       show_known_fediverse_at_about_page:
         desc_html: Un còp activat mostrarà los tuts de totes los fediverse dins l’apercebut. Autrament mostrarà pas que los tuts locals.
         title: Mostrar los fediverse coneguts dins l’apercebut del flux
@@ -483,7 +499,9 @@ oc:
     your_token: Vòstre geton d’accès
   auth:
     agreement_html: En vos marcar acceptatz <a href="%{rules_path}">las règlas del servidor</a> e <a href="%{terms_path}">politica de confidencialitat</a>.
+    apply_for_account: Demandar una invitacion
     change_password: Senhal
+    checkbox_agreement_html: Accepti las <a href="%{rules_path}" target="_blank">règlas del servidor</a> e <a href="%{terms_path}" target="_blank">los tèrmes del servici</a>
     confirm_email: Confirmar lo corrièl
     delete_account: Suprimir lo compte
     delete_account_html: Se volètz suprimir vòstre compte, podètz <a href="%{path}">o far aquí</a>. Vos demandarem que confirmetz.
@@ -499,10 +517,12 @@ oc:
       cas: CAS
       saml: SAML
     register: Se marcar
+    registration_closed: "%{instance} accepta pas de nòus membres"
     resend_confirmation: Tornar mandar las instruccions de confirmacion
     reset_password: Reïnicializar lo senhal
     security: Seguretat
     set_new_password: Picar un nòu senhal
+    trouble_logging_in: Problèmas de connexion ?
   authorize_follow:
     already_following: Seguètz ja aqueste compte
     error: O planhèm, i a agut una error al moment de cercar lo compte
@@ -654,12 +674,19 @@ oc:
     more: Mai…
     resources: Ressorsas
   generic:
+    all: Tot
     changes_saved_msg: Cambiaments ben realizats !
     copy: Copiar
     save_changes: Salvar los cambiaments
     validation_errors:
       one: I a quicòm que truca ! Mercés de corregir l’error çai-jos
       other: I a quicòm que truca ! Mercés de corregir las %{count} errors çai-jos
+  identity_proofs:
+    authorize: Òc, autorizar
+    authorize_connection_prompt: Autorizar aquesta connexion criptografica ?
+    i_am_html: Soi %{username} a %{service}.
+    identity: Identitat
+    status: Estatut de verificacion
   imports:
     modes:
       merge: Fondre
@@ -769,7 +796,7 @@ oc:
       duration_too_long: es tròp alonhat dins lo futur
       duration_too_short: es tròp d’ora
       expired: Lo sondatge es ja acabat
-      over_character_limit: pòt pas èsser superior a %{max}  caractèrs cadun
+      over_character_limit: pòt pas èsser superior a %{max} caractèrs cadun
       too_few_options: deu contenir mai d’una opcion
       too_many_options: pòt pas contenir mai de %{max} opcions
   preferences:
@@ -777,6 +804,14 @@ oc:
     other: Autre
     publishing: Publicar
     web: Interfàcia Web
+  relationships:
+    activity: Activitat del compte
+    dormant: Inactiu
+    moved: Mudat
+    mutual: Mutuala
+    primary: Pirmària
+    relationship: Relacion
+    status: Estat del compte
   remote_follow:
     acct: Picatz vòstre utilizaire@domeni que que volètz utilizar per sègre aqueste utilizaire
     missing_resource: URL de redireccion pas trobada
@@ -855,6 +890,7 @@ oc:
     migrate: Migracion de compte
     notifications: Notificacions
     preferences: Preferéncias
+    relationships: Abonaments e seguidors
     settings: Paramètres
     two_factor_authentication: Autentificacion en dos temps
     your_apps: Vòstras aplicacions
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 46b3ec089..be1ea6155 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -896,6 +896,10 @@ pt-BR:
 
       <p>Adaptado originalmente a partir da <a href="https://github.com/discourse/discourse">política de privacidade Discourse</a>.</p>
     title: "%{instance} Termos de Serviço e Política de Privacidade"
+  themes:
+    contrast: Alto contraste
+    default: Mastodon
+    mastodon-light: Mastodon (claro)
   time:
     formats:
       default: "%b %d, %Y, %H:%M"
diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml
index 14a7db048..21134d07c 100644
--- a/config/locales/simple_form.cs.yml
+++ b/config/locales/simple_form.cs.yml
@@ -33,7 +33,7 @@ cs:
         setting_display_media_show_all: Vždy zobrazovat média označená jako citlivá
         setting_hide_network: Koho sledujete a kdo sleduje vás nebude zobrazeno na vašem profilu
         setting_noindex: Ovlivňuje váš veřejný profil a stránky tootů
-        setting_show_application: Aplikace, kterou používáte psaní tootů, bude zobrazena v detailním zobrazení vašich tootů
+        setting_show_application: Aplikace, kterou používáte k psaní tootů, bude zobrazena v detailním zobrazení vašich tootů
         setting_theme: Ovlivňuje jak Mastodon vypadá, jste-li přihlášen na libovolném zařízení.
         username: Vaše uživatelské jméno bude na %{domain} unikátní
         whole_word: Je-li klíčové slovo či fráze pouze alfanumerická, bude aplikována pouze, pokud se shoduje s celým slovem
@@ -78,7 +78,7 @@ cs:
         expires_in: Vypršet za
         fields: Metadata profilu
         header: Záhlaví
-        inbox_url: URL schránky mostu
+        inbox_url: URL příchozí schránky mostu
         irreversible: Zahodit místo skrytí
         locale: Jazyk rozhraní
         locked: Uzamknout účet
diff --git a/config/locales/simple_form.en_GB.yml b/config/locales/simple_form.en_GB.yml
index d9e1a256f..6eac4bf3c 100644
--- a/config/locales/simple_form.en_GB.yml
+++ b/config/locales/simple_form.en_GB.yml
@@ -1,2 +1,133 @@
 ---
-{}
+en_GB:
+  simple_form:
+    hints:
+      account_warning_preset:
+        text: You can use toot syntax, such as URLs, hashtags and mentions
+      admin_account_action:
+        send_email_notification: The user will receive an explanation of what happened with their account
+        text_html: Optional. You can use toot syntax. You can <a href="%{path}">add warning presets</a> to save time
+        type_html: Choose what to do with <strong>%{acct}</strong>
+        warning_preset_id: Optional. You can still add custom text to end of the preset
+      defaults:
+        autofollow: People who sign up through the invite will automatically follow you
+        avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px
+        bot: This account mainly performs automated actions and might not be monitored
+        context: One or multiple contexts where the filter should apply
+        digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence
+        discoverable_html: The <a href="%{path}" target="_blank">directory</a> lets people find accounts based on interests and activity. Requires at least %{min_followers} followers
+        email: You will be sent a confirmation e-mail
+        fields: You can have up to 4 items displayed as a table on your profile
+        header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px
+        inbox_url: Copy the URL from the frontpage of the relay you want to use
+        irreversible: Filtered toots will disappear irreversibly, even if filter is later removed
+        locale: The language of the user interface, e-mails and push notifications
+        locked: Requires you to manually approve followers
+        password: Use at least 8 characters
+        phrase: Will be matched regardless of casing in text or content warning of a toot
+        scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones.
+        setting_aggregate_reblogs: Do not show new boosts for toots that have been recently boosted (only affects newly-received boosts)
+        setting_default_language: The language of your toots can be detected automatically, but it's not always accurate
+        setting_display_media_default: Hide media marked as sensitive
+        setting_display_media_hide_all: Always hide all media
+        setting_display_media_show_all: Always show media marked as sensitive
+        setting_hide_network: Who you follow and who follows you will not be shown on your profile
+        setting_noindex: Affects your public profile and status pages
+        setting_show_application: The application you use to toot will be displayed in the detailed view of your toots
+        setting_theme: Affects how Mastodon looks when you're logged in from any device.
+        username: Your username will be unique on %{domain}
+        whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word
+      featured_tag:
+        name: 'You might want to use one of these:'
+      imports:
+        data: CSV file exported from another Mastodon server
+      sessions:
+        otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:'
+      user:
+        chosen_languages: When checked, only toots in selected languages will be displayed in public timelines
+    labels:
+      account:
+        fields:
+          name: Label
+          value: Content
+      account_warning_preset:
+        text: Preset text
+      admin_account_action:
+        send_email_notification: Notify the user per e-mail
+        text: Custom warning
+        type: Action
+        types:
+          disable: Disable
+          none: Do nothing
+          silence: Silence
+          suspend: Suspend and irreversibly delete account data
+        warning_preset_id: Use a warning preset
+      defaults:
+        autofollow: Invite to follow your account
+        avatar: Avatar
+        bot: This is a bot account
+        chosen_languages: Filter languages
+        confirm_new_password: Confirm new password
+        confirm_password: Confirm password
+        context: Filter contexts
+        current_password: Current password
+        data: Data
+        discoverable: List this account on the directory
+        display_name: Display name
+        email: E-mail address
+        expires_in: Expire after
+        fields: Profile metadata
+        header: Header
+        inbox_url: URL of the relay inbox
+        irreversible: Drop instead of hide
+        locale: Interface language
+        locked: Lock account
+        max_uses: Max number of uses
+        new_password: New password
+        note: Bio
+        otp_attempt: Two-factor code
+        password: Password
+        phrase: Keyword or phrase
+        setting_aggregate_reblogs: Group boosts in timelines
+        setting_auto_play_gif: Auto-play animated GIFs
+        setting_boost_modal: Show confirmation dialog before boosting
+        setting_default_language: Posting language
+        setting_default_privacy: Post privacy
+        setting_default_sensitive: Always mark media as sensitive
+        setting_delete_modal: Show confirmation dialog before deleting a toot
+        setting_display_media: Media display
+        setting_display_media_default: Default
+        setting_display_media_hide_all: Hide all
+        setting_display_media_show_all: Show all
+        setting_expand_spoilers: Always expand toots marked with content warnings
+        setting_hide_network: Hide your network
+        setting_noindex: Opt-out of search engine indexing
+        setting_reduce_motion: Reduce motion in animations
+        setting_show_application: Disclose application used to send toots
+        setting_system_font_ui: Use system's default font
+        setting_theme: Site theme
+        setting_unfollow_modal: Show confirmation dialog before unfollowing someone
+        severity: Severity
+        type: Import type
+        username: Username
+        username_or_email: Username or Email
+        whole_word: Whole word
+      featured_tag:
+        name: Hashtag
+      interactions:
+        must_be_follower: Block notifications from non-followers
+        must_be_following: Block notifications from people you don't follow
+        must_be_following_dm: Block direct messages from people you don't follow
+      notification_emails:
+        digest: Send digest e-mails
+        favourite: Send e-mail when someone favourites your status
+        follow: Send e-mail when someone follows you
+        follow_request: Send e-mail when someone requests to follow you
+        mention: Send e-mail when someone mentions you
+        reblog: Send e-mail when someone boosts your status
+        report: Send e-mail when a new report is submitted
+    'no': 'No'
+    required:
+      mark: "*"
+      text: required
+    'yes': 'Yes'
diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml
index f6e654d7b..b7ba444aa 100644
--- a/config/locales/simple_form.fa.yml
+++ b/config/locales/simple_form.fa.yml
@@ -2,12 +2,20 @@
 fa:
   simple_form:
     hints:
+      account_warning_preset:
+        text: می‌توانید مانند بوق‌های معمولی کاربران دیگر را نام ببرید یا پیوند و برچسب بگذارید
+      admin_account_action:
+        send_email_notification: توضیحی که کاربر می‌بینید که برای حسابش چه رخ داده است
+        text_html: اختیاری. می‌توانید مثل بوق‌های معمولی بنویسید. می‌توانید برای صرفه‌جویی در زمان <a href="%{path}">هشدارهای ازپیش‌آماده بیفزایید</a>
+        type_html: با حساب <strong>%{acct}</strong> می‌خواهید چه کار کنید؟‌
+        warning_preset_id: اختیاری. همچنان می‌توانید در پایان متن آماده چیزی بیفزایید
       defaults:
         autofollow: کسانی که از راه دعوت‌نامه عضو می‌شوند به طور خودکار پیگیر شما خواهند شد
         avatar: یکی از قالب‌های PNG یا  GIF یا JPG. بیشترین اندازه %{size}. تصویر به اندازهٔ %{dimensions} پیکسل تبدیل خواهد شد
         bot: این حساب بیشتر به طور خودکار فعالیت می‌کند و نظارت پیوسته‌ای روی آن وجود ندارد
         context: یک یا چند زمینه که فیلتر باید در آن‌ها اعمال شود
         digest: تنها وقتی فرستاده می‌شود که مدتی طولانی فعالیتی نداشته باشید و در این مدت برای شما پیغام خصوصی‌ای نوشته شده باشد
+        discoverable_html: با <a href="%{path}" target="_blank">فهرست گزیدهٔ کاربران</a> مردم می‌توانند حساب‌های این سرور را بر اساس علاقه‌مندی‌ها و فعالیت‌شان پیدا کنند. هر حساب دست‌کم باید %{min_followers} پیگیر داشته باشد
         email: به شما ایمیل تأییدی فرستاده خواهد شد
         fields: شما می‌توانید تا چهار مورد را در یک جدول در نمایهٔ خود نمایش دهید
         header: یکی از قالب‌های PNG یا  GIF یا JPG. بیشترین اندازه %{size}. تصویر به اندازهٔ %{dimensions} پیکسل تبدیل خواهد شد
@@ -25,9 +33,12 @@ fa:
         setting_display_media_show_all: همیشه تصویرهایی را که به عنوان حساس علامت زده شده‌اند را نشان بده
         setting_hide_network: فهرست پیگیران شما و فهرست کسانی که شما پی می‌گیرید روی نمایهٔ شما دیده نخواهد شد
         setting_noindex: روی نمایهٔ عمومی و صفحهٔ نوشته‌های شما تأثیر می‌گذارد
+        setting_show_application: برنامه‌ای که به کمک آن بوق می‌زنید، در جزئیات بوق شما نمایش خواهد یافت
         setting_theme: ظاهر ماستدون را وقتی که از هر دستگاهی به آن وارد می‌شوید تعیین می‌کند.
         username: نام کاربری شما روی %{domain} یکتا خواهد بود
         whole_word: اگر کلیدواژه فقط دارای حروف و اعداد باشد، تنها وقتی پیدا می‌شود که با کل یک واژه در متن منطبق باشد، نه با بخشی از یک واژه
+      featured_tag:
+        name: 'شاید بخواهید چنین چیزهایی را به کار ببرید:'
       imports:
         data: پروندهٔ CSV که از سرور ماستدون دیگری برون‌سپاری شده
       sessions:
@@ -39,6 +50,18 @@ fa:
         fields:
           name: برچسب
           value: محتوا
+      account_warning_preset:
+        text: متن از پیش آماده‌شده
+      admin_account_action:
+        send_email_notification: اطلاع‌رسانی به کاربر از راه ایمیل
+        text: هشدار موردی
+        type: نوع کنش
+        types:
+          disable: غیرفعال‌کردن
+          none: کاری نکن
+          silence: بی‌صدا کردن
+          suspend: تعلیق و پاک‌کردن کامل همهٔ اطلاعات حساب
+        warning_preset_id: یک هشدار از پیش‌آماده را به کار ببرید
       defaults:
         autofollow: دعوت از دیگران برای عضو شدن و پیگیری حساب شما
         avatar: تصویر نمایه
@@ -49,6 +72,7 @@ fa:
         context: زمینه‌های فیلترکردن
         current_password: رمز فعلی
         data: داده‌ها
+        discoverable: این حساب را در فهرست گزیدهٔ کاربران نشان بده
         display_name: نمایش به نام
         email: نشانی ایمیل
         expires_in: تاریخ انقضا
@@ -79,6 +103,7 @@ fa:
         setting_hide_network: نهفتن شبکهٔ ارتباطی
         setting_noindex: درخواست از موتورهای جستجوگر برای ظاهر نشدن در نتایج جستجو
         setting_reduce_motion: کاستن از حرکت در پویانمایی‌ها
+        setting_show_application: برنامه‌ای که به کار می‌برید آشکار شود
         setting_system_font_ui: به‌کاربردن قلم پیش‌فرض سیستم
         setting_theme: تم سایت
         setting_unfollow_modal: نمایش پیغام تأیید پیش از لغو پیگیری دیگران
@@ -87,6 +112,8 @@ fa:
         username: نام کاربری (لاتین)
         username_or_email: نام کاربری یا ایمیل
         whole_word: تطابق واژهٔ کامل
+      featured_tag:
+        name: برچسب
       interactions:
         must_be_follower: مسدودکردن اعلان‌های همه به جز پیگیران
         must_be_following: مسدودکردن اعلان‌های کسانی که شما پی نمی‌گیرید
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index 42be5a93c..81392c8be 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -67,10 +67,10 @@ ko:
         avatar: 아바타
         bot: 이것은 봇 계정입니다
         chosen_languages: 언어 필터링
-        confirm_new_password: 새로운 비밀번호 다시 입력
-        confirm_password: 현재 비밀번호 다시 입력
+        confirm_new_password: 암호 다시 입력
+        confirm_password: 암호 다시 입력
         context: 필터 컨텍스트
-        current_password: 현재 비밀번호 입력
+        current_password: 현재 암호 입력
         data: 데이터
         discoverable: 이 계정을 디렉토리에서 찾을 수 있도록 합니다
         display_name: 표시되는 이름
@@ -83,10 +83,10 @@ ko:
         locale: 인터페이스 언어
         locked: 계정 잠금
         max_uses: 사용 횟수 제한
-        new_password: 새로운 비밀번호 입력
+        new_password: 새로운 암호 입력
         note: 자기소개
         otp_attempt: 2단계 인증 코드
-        password: 비밀번호
+        password: 암호
         phrase: 키워드 또는 문장
         setting_aggregate_reblogs: 타임라인의 부스트를 그룹화
         setting_auto_play_gif: 애니메이션 GIF를 자동 재생
diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml
index a8611c2f7..bce5eaac6 100644
--- a/config/locales/simple_form.th.yml
+++ b/config/locales/simple_form.th.yml
@@ -2,48 +2,132 @@
 th:
   simple_form:
     hints:
+      account_warning_preset:
+        text: คุณสามารถใช้ไวยากรณ์โพสต์ เช่น URL, แฮชแท็ก และการกล่าวถึง
+      admin_account_action:
+        send_email_notification: ผู้ใช้จะได้รับคำอธิบายว่าเกิดอะไรขึ้นกับบัญชีของเขา
+        text_html: ตัวเลือกเพิ่มเติม คุณสามารถใช้ไวยากรณ์โพสต์ คุณสามารถ <a href="%{path}">เพิ่มคำเตือนที่ตั้งไว้ล่วงหน้า</a> เพื่อประหยัดเวลา
+        type_html: เลือกสิ่งที่จะทำกับ <strong>%{acct}</strong>
+        warning_preset_id: ตัวเลือกเพิ่มเติม คุณยังคงสามารถเพิ่มข้อความที่กำหนดเองที่จุดสิ้นสุดของค่าที่ตั้งไว้ล่วงหน้า
       defaults:
-        avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px
-        header: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px
-        locked: Requires you to manually approve followers and defaults post privacy to followers-only
+        autofollow: ผู้คนที่ลงทะเบียนผ่านคำเชิญจะติดตามคุณโดยอัตโนมัติ
+        avatar: PNG, GIF หรือ JPG สูงสุด %{size} จะถูกย่อขนาดเป็น %{dimensions}px
+        bot: บัญชีนี้ทำการกระทำอัตโนมัติเป็นหลักและอาจไม่ได้รับการสังเกตการณ์
+        context: บริบทจำนวนหนึ่งหรือมากกว่าที่ตัวกรองควรใช้
+        digest: ส่งเฉพาะหลังจากไม่มีการใช้งานเป็นเวลานานและในกรณีที่คุณได้รับข้อความส่วนบุคคลใด ๆ เมื่อคุณไม่อยู่เท่านั้น
+        discoverable_html: <a href="%{path}" target="_blank">ไดเรกทอรี</a> ช่วยให้ผู้คนค้นหาบัญชีตามความสนใจและกิจกรรม ต้องการอย่างน้อย %{min_followers} ผู้ติดตาม
+        email: คุณจะได้รับอีเมลยืนยัน
+        fields: คุณสามารถมีได้มากถึง 4 รายการแสดงผลเป็นตารางในโปรไฟล์ของคุณ
+        header: PNG, GIF หรือ JPG สูงสุด %{size} จะถูกย่อขนาดเป็น %{dimensions}px
+        inbox_url: คัดลอก URL จากหน้าแรกของรีเลย์ที่คุณต้องการใช้
+        irreversible: โพสต์ที่กรองจะหายไปอย่างถาวร แม้ว่าจะเอาตัวกรองออกในภายหลัง
+        locale: ภาษาของส่วนติดต่อผู้ใช้, อีเมล และการแจ้งเตือนแบบผลัก
+        locked: คุณต้องอนุมัติผู้ติดตามด้วยตนเอง
+        password: ใช้อย่างน้อย 8 ตัวอักษร
+        phrase: จะถูกจับคู่โดยไม่คำนึงถึงตัวอักษรใหญ่เล็กในข้อความหรือคำเตือนเนื้อหาของโพสต์
+        scopes: API ใดที่แอปพลิเคชันจะได้รับอนุญาตให้เข้าถึง หากคุณเลือกขอบเขตระดับบนสุด คุณไม่จำเป็นต้องเลือกแต่ละขอบเขต
+        setting_aggregate_reblogs: ไม่แสดงการดันใหม่สำหรับโพสต์ที่เพิ่งดัน (มีผลต่อการดันที่ได้รับใหม่เท่านั้น)
+        setting_default_language: สามารถตรวจพบภาษาของโพสต์ของคุณโดยอัตโนมัติ แต่อาจไม่แม่นยำเสมอไป
+        setting_display_media_default: ซ่อนสื่อที่ถูกทำเครื่องหมายว่าละเอียดอ่อน
+        setting_display_media_hide_all: ซ่อนสื่อทั้งหมดเสมอ
+        setting_display_media_show_all: แสดงสื่อที่ถูกทำเครื่องหมายว่าละเอียดอ่อนเสมอ
+        setting_hide_network: จะไม่แสดงผู้ที่คุณติดตามและผู้ที่ติดตามคุณในโปรไฟล์ของคุณ
+        setting_noindex: มีผลต่อโปรไฟล์สาธารณะและหน้าสถานะของคุณ
+        setting_show_application: จะแสดงผลแอปพลิเคชันที่คุณใช้เพื่อโพสต์ในมุมมองโดยละเอียดของโพสต์ของคุณ
+        setting_theme: มีผลต่อลักษณะของ Mastodon เมื่อคุณเข้าสู่ระบบจากอุปกรณ์ใด ๆ
+        username: ชื่อผู้ใช้ของคุณจะไม่ซ้ำกันบน %{domain}
+        whole_word: เมื่อคำสำคัญหรือวลีมีแค่ตัวอักษรและตัวเลข จะถูกใช้หากตรงกันทั้งคำเท่านั้น
+      featured_tag:
+        name: 'คุณอาจต้องการใช้หนึ่งในนี้:'
       imports:
-        data: CSV file exported from another Mastodon instance
+        data: ไฟล์ CSV ที่ส่งออกจากเซิร์ฟเวอร์ Mastodon อื่น
       sessions:
-        otp: Enter the Two-factor code from your phone or use one of your recovery codes.
+        otp: 'ป้อนรหัสสองปัจจัยที่สร้างโดยแอปในโทรศัพท์ของคุณหรือใช้หนึ่งในรหัสกู้คืนของคุณ:'
+      user:
+        chosen_languages: เมื่อกาเครื่องหมาย จะแสดงผลเฉพาะโพสต์ในภาษาที่เลือกในเส้นเวลาสาธารณะ
     labels:
+      account:
+        fields:
+          name: ป้ายชื่อ
+          value: เนื้อหา
+      account_warning_preset:
+        text: ข้อความที่ตั้งไว้ล่วงหน้า
+      admin_account_action:
+        send_email_notification: แจ้งเตือนผู้ใช้ทางอีเมล
+        text: คำเตือนที่กำหนดเอง
+        type: การกระทำ
+        types:
+          disable: ปิดใช้งาน
+          none: ไม่ทำสิ่งใด
+          silence: เงียบ
+          suspend: ระงับและลบข้อมูลบัญชีอย่างถาวร
+        warning_preset_id: ใช้คำเตือนที่ตั้งไว้ล่วงหน้า
       defaults:
-        avatar: Avatar
-        confirm_new_password: Confirm new password
-        confirm_password: Confirm password
-        current_password: Current password
+        autofollow: เชิญให้ติดตามบัญชีของคุณ
+        avatar: ภาพประจำตัว
+        bot: นี่คือบัญชีบอต
+        chosen_languages: กรองภาษา
+        confirm_new_password: ยืนยันรหัสผ่านใหม่
+        confirm_password: ยืนยันรหัสผ่าน
+        context: บริบทตัวกรอง
+        current_password: รหัสผ่านปัจจุบัน
         data: ข้อมูล
-        display_name: Display name
-        email: E-mail address
-        header: Header
-        locale: ภาษา
-        locked: Lock account
-        new_password: New password
-        note: Bio
-        otp_attempt: Two-factor code
-        password: พาร์สเวิร์ด
-        setting_auto_play_gif: Auto-play animated GIFs
-        setting_boost_modal: Show confirmation dialog before boosting
-        setting_default_privacy: Post privacy
-        severity: Severity
-        type: Import type
-        username: Username
+        discoverable: แสดงรายการบัญชีนี้ในไดเรกทอรี
+        display_name: ชื่อที่แสดงผล
+        email: ที่อยู่อีเมล
+        expires_in: หมดอายุหลังจาก
+        fields: ข้อมูลเมตาโปรไฟล์
+        header: ส่วนหัว
+        inbox_url: URL กล่องขาเข้าแบบรีเลย์
+        irreversible: ลบแทนที่จะซ่อน
+        locale: ภาษาส่วนติดต่อ
+        locked: ล็อคบัญชี
+        max_uses: จำนวนการใช้งานสูงสุด
+        new_password: รหัสผ่านใหม่
+        note: ชีวประวัติ
+        otp_attempt: รหัสสองปัจจัย
+        password: รหัสผ่าน
+        phrase: คำสำคัญหรือวลี
+        setting_aggregate_reblogs: จัดกลุ่มการดันในเส้นเวลา
+        setting_auto_play_gif: เล่น GIF แบบเคลื่อนไหวโดยอัตโนมัติ
+        setting_boost_modal: แสดงกล่องโต้ตอบการยืนยันก่อนดัน
+        setting_default_language: ภาษาที่โพสต์
+        setting_default_privacy: ความเป็นส่วนตัวของโพสต์
+        setting_default_sensitive: ทำเครื่องหมายสื่อว่าละเอียดอ่อนเสมอ
+        setting_delete_modal: แสดงกล่องโต้ตอบการยืนยันก่อนลบโพสต์
+        setting_display_media: การแสดงผลสื่อ
+        setting_display_media_default: ค่าเริ่มต้น
+        setting_display_media_hide_all: ซ่อนทั้งหมด
+        setting_display_media_show_all: แสดงทั้งหมด
+        setting_expand_spoilers: ขยายโพสต์ที่ทำเครื่องหมายด้วยคำเตือนเนื้อหาเสมอ
+        setting_hide_network: ซ่อนเครือข่ายของคุณ
+        setting_noindex: เลือกไม่รับการทำดัชนีโดยเครื่องมือค้นหา
+        setting_reduce_motion: ลดการเคลื่อนไหวในภาพเคลื่อนไหว
+        setting_show_application: เปิดเผยแอปพลิเคชันที่ใช้ในการส่งโพสต์
+        setting_system_font_ui: ใช้แบบอักษรเริ่มต้นของระบบ
+        setting_theme: ชุดรูปแบบไซต์
+        setting_unfollow_modal: แสดงกล่องโต้ตอบการยืนยันก่อนเลิกติดตามใครสักคน
+        severity: ความรุนแรง
+        type: ชนิดการนำเข้า
+        username: ชื่อผู้ใช้
+        username_or_email: ชื่อผู้ใช้หรืออีเมล
+        whole_word: ทั้งคำ
+      featured_tag:
+        name: แฮชแท็ก
       interactions:
-        must_be_follower: Block notifications from non-followers
-        must_be_following: Block notifications from people you don't follow
+        must_be_follower: ปิดกั้นการแจ้งเตือนจากที่ไม่ใช่ผู้ติดตาม
+        must_be_following: ปิดกั้นการแจ้งเตือนจากผู้คนที่คุณไม่ได้ติดตาม
+        must_be_following_dm: ปิดกั้นข้อความโดยตรงจากผู้คนที่คุณไม่ได้ติดตาม
       notification_emails:
-        digest: Send digest e-mails
-        favourite: Send e-mail when someone favourites your status
-        follow: Send e-mail when someone follows you
-        follow_request: Send e-mail when someone requests to follow you
-        mention: Send e-mail when someone mentions you
-        reblog: Send e-mail when someone boosts your status
+        digest: ส่งอีเมลสรุป
+        favourite: ส่งอีเมลเมื่อใครสักคนชื่นชอบสถานะของคุณ
+        follow: ส่งอีเมลเมื่อใครสักคนติดตามคุณ
+        follow_request: ส่งอีเมลเมื่อใครสักคนขอติดตามคุณ
+        mention: ส่งอีเมลเมื่อใครสักคนกล่าวถึงคุณ
+        reblog: ส่งอีเมลเมื่อใครสักคนดันสถานะของคุณ
+        report: ส่งอีเมลเมื่อมีการส่งรายงานใหม่
     'no': ไม่
     required:
       mark: "*"
-      text: required
+      text: ต้องระบุ
     'yes': ใช่
diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml
index 3747fbb98..61d07825c 100644
--- a/config/locales/simple_form.zh-TW.yml
+++ b/config/locales/simple_form.zh-TW.yml
@@ -2,90 +2,130 @@
 zh-TW:
   simple_form:
     hints:
+      account_warning_preset:
+        text: 您可使用嘟文語法,例如網址、「#」標籤和提及功能
+      admin_account_action:
+        send_email_notification: 使用者將收到帳戶發生之事情的解釋
+        text_html: 選用。您能使用嘟文語法。您可 <a href="%{path}">新增警告預設</a> 來節省時間
+        type_html: 設定要使用 <strong>%{acct}</strong> 做的事
+        warning_preset_id: 選用。您仍可在預設的結尾新增自訂文字
       defaults:
-        autofollow: 通過邀請網址註冊的使用者將會自動關注你
-        avatar: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px
-        bot: 這個帳號由程式進行自動式操作
+        autofollow: 通過邀請網址註冊的使用者將自動關注你
+        avatar: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會等比例縮減成 %{dimensions} 像素
+        bot: 此帳戶主要執行自動操作且可能未被監控
         context: 應該套用過濾器的一項或多項內容
-        digest: 僅在你長時間未登入,並且收到了私訊時發送
-        fields: 個人資訊頁至多可顯示 4 個項目
-        header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px
-        inbox_url: 從您想要使用的中繼首頁複製 URL
-        irreversible: 已過濾的嘟文將會不可逆的消失,即便過濾器之後也一樣
-        locale: 使用者介面、 E-mail 與通知的語言
-        locked: 你必須手動核准每個使用者對你的關注請求,而你的貼文隱私將會被設定為「只有關注你的人能看」
+        digest: 僅在你長時間未登入且在未登入期間收到私訊時傳送
+        discoverable_html: <a href="%{path}" target="_blank">目錄</a> 讓使用者們能基於興趣與活動尋找帳戶。需要至少 %{min_followers} 位關注者
+        email: 您將收到一封確認電子郵件
+        fields: 您可在個人資料上有至多 4 個以表格形式顯示的項目
+        header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會按比例縮小成 %{dimensions} 像素
+        inbox_url: 從您想要使用的中繼首頁複製網址
+        irreversible: 已過濾的嘟文將會不可逆的消失,即便過濾器移除之後也一樣
+        locale: 使用者介面、電子信件和推送通知的語言
+        locked: 需要您手動核准關注請求
+        password: 使用至少 8 個字元
         phrase: 無論是嘟文的本文或是內容警告都會被過濾
-        scopes: 應用程式將會被允許存取哪些 API。若您選取了最高階的範圍,您就不需要再選取單獨的了。
-        setting_default_language: 你嘟文的語言會被自動偵測,但不一定完全準確
+        scopes: 允許讓應用程式存取的 API。 若您選擇最高階範圍,則無須選擇個別項目。
+        setting_aggregate_reblogs: 請勿顯示最近已被轉嘟之嘟文的最新轉嘟(只影響最新收到的嘟文)
+        setting_default_language: 您嘟文的語言可被自動偵測,但不一定每次都準確
+        setting_display_media_default: 隱藏標為敏感的媒體
+        setting_display_media_hide_all: 總是隱藏所有媒體
+        setting_display_media_show_all: 總是顯示標為敏感的媒體
         setting_hide_network: 你關注的人與關注你的人將不會在你的個人資料頁上顯示
-        setting_noindex: 此設定會影響到你的公開個人資料與嘟文頁面
-        setting_theme: 此設定會影響到你從任意設備登入 Mastodon 時的顯示樣式。
-        whole_word: 如果關鍵字或詞組僅有字母與數字,它將只會在符合整個單字的時候才會套用
+        setting_noindex: 會影響您的公開個人資料與嘟文頁面
+        setting_show_application: 您用來發嘟文的應用程式將會在您嘟文的詳細檢視顯示
+        setting_theme: 會影響從任何裝置登入所看到的 Mastodon 樣式。
+        username: 您的使用者名稱將在 %{domain} 是獨一無二的
+        whole_word: 如果關鍵字或詞組僅有字母與數字,則其將只在符合整個單字的時候才會套用
+      featured_tag:
+        name: 您可能想使用其中一個:
       imports:
-        data: 自其他站點匯出的 CSV 檔案
+        data: 從其他 Mastodon 伺服器匯出的 CSV 檔案
       sessions:
-        otp: 輸入你手機上產生的兩階段認證碼,或著任意一個備用驗證碼:
+        otp: 請輸入產生自您手機 App 的兩步驟驗證碼,或輸入其中一個復原代碼:
       user:
-        chosen_languages: 只有被選擇的語言會在公開時間軸內顯示
+        chosen_languages: 當核取時,只有選取語言的嘟文會在公開時間軸中顯示
     labels:
       account:
         fields:
           name: 標籤
           value: 內容
+      account_warning_preset:
+        text: 預設文字
+      admin_account_action:
+        send_email_notification: 透過電子信件通知使用者
+        text: 自訂警告
+        type: 動作
+        types:
+          disable: 停用
+          none: 什麼也不做
+          silence: 安靜
+          suspend: 停權並不可逆的刪除帳戶資料
+        warning_preset_id: 使用警告預設
       defaults:
         autofollow: 邀請別人關注你的帳戶
-        avatar: 頭像
-        bot: 這個帳號是機器人
-        chosen_languages: 語言篩選
+        avatar: 大頭貼
+        bot: 此帳號是台機器人
+        chosen_languages: 過濾語言
         confirm_new_password: 確認新密碼
         confirm_password: 確認密碼
-        context: 過濾範圍
+        context: 過濾情境
         current_password: 目前密碼
         data: 資料
+        discoverable: 在目錄列出此帳戶
         display_name: 顯示名稱
-        email: E-mail
+        email: 電子信箱位址
         expires_in: 失效時間
-        fields: 資料
-        header: 個人頁面圖片
+        fields: 個人資料中繼資料
+        header: 頁面頂端
         inbox_url: 中繼收件匣的 URL
         irreversible: 放棄而非隱藏
         locale: 介面語言
-        locked: 將帳號轉為「私密」
+        locked: 鎖定帳號
         max_uses: 最大使用次數
         new_password: 新密碼
         note: 簡介
-        otp_attempt: 兩階段認證碼
+        otp_attempt: 兩步驟驗證碼
         password: 密碼
         phrase: 關鍵字或片語
-        setting_auto_play_gif: 自動播放 GIF
+        setting_aggregate_reblogs: 時間軸中的群組轉嘟
+        setting_auto_play_gif: 自動播放 GIF 動畫
         setting_boost_modal: 在轉嘟前先詢問我
         setting_default_language: 嘟文語言
-        setting_default_privacy: 嘟文預設為
+        setting_default_privacy: 嘟文可見範圍
         setting_default_sensitive: 總是將媒體標記為敏感內容
         setting_delete_modal: 刪除嘟文前先詢問我
-        setting_hide_network: 隱藏你的社交網路
-        setting_noindex: 阻止搜尋引擎收錄
-        setting_reduce_motion: 減低動畫效果
+        setting_display_media: 媒體顯示
+        setting_display_media_default: 預設
+        setting_display_media_hide_all: 全部隱藏
+        setting_display_media_show_all: 全部顯示
+        setting_expand_spoilers: 永遠展開標有內容警告的嘟文
+        setting_hide_network: 隱藏您的社交網路
+        setting_noindex: 阻止搜尋引擎建立索引
+        setting_reduce_motion: 減少過渡動畫效果
+        setting_show_application: 顯示用來傳送嘟文的應用程式
         setting_system_font_ui: 使用系統預設字型
-        setting_theme: 主題外觀
-        setting_unfollow_modal: 取消關注前先詢問我
-        severity: 等級
-        type: 匯入資料類型
+        setting_theme: 站點主題
+        setting_unfollow_modal: 取消關注某人前先詢問我
+        severity: 優先級
+        type: 匯入類型
         username: 使用者名稱
-        username_or_email: 使用者名稱或 E-mail
-        whole_word: 整個詞
+        username_or_email: 使用者名稱或電子信箱位址
+        whole_word: 整個詞彙
+      featured_tag:
+        name: "「#」標籤"
       interactions:
-        must_be_follower: 隱藏沒有關注你的使用者通知
-        must_be_following: 隱藏你沒關注的使用者通知
-        must_be_following_dm: 隱藏你沒關注的使用者私訊
+        must_be_follower: 封鎖非關注者的通知
+        must_be_following: 封鎖您未關注之使用者的通知
+        must_be_following_dm: 封鎖您未關注之使用者的私訊
       notification_emails:
-        digest: 定期發送摘要郵件
-        favourite: 當有使用者喜歡你的嘟文時,發送 E-mail 通知
-        follow: 當有使用者關注你時,發送 E-mail 通知
-        follow_request: 當有使用者要求關注你時,發送 E-mail 通知
-        mention: 當有使用者在嘟文提及你時,發送 E-mail 通知
-        reblog: 都有使用者轉嘟你的嘟文時,發送 E-mail 通知
-        report: 當遞交新報告時傳送電子郵件
+        digest: 傳送摘要信件
+        favourite: 當有使用者喜歡你的嘟文時,傳送電子信件通知
+        follow: 當有使用者關注你時,傳送電子信件通知
+        follow_request: 當有使用者請求關注你時,傳送電子信件通知
+        mention: 當有使用者在嘟文提及你時,傳送電子信件通知
+        reblog: 當有使用者轉嘟你的嘟文時,傳送電子信件通知
+        report: 當提交新檢舉時傳送電子郵件
     'no': 否
     required:
       mark: "*"
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 3bda6a814..d1ff178fd 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -4,26 +4,37 @@ sk:
     about_hashtag_html: Toto sú verejné príspevky, otagované pod <strong>#%{hashtag}</strong>. Ak máš účet hocikde v rámci fediversa, môžeš s nimi narábať.
     about_mastodon_html: Mastodon je sociálna sieť založená na otvorených webových protokoloch a na slobodnom softvéri. Je decentralizovaná, podobne ako email.
     about_this: O tomto serveri
+    active_count_after: aktívni
+    active_footnote: Mesačne aktívnych užívateľov (MAU)
     administered_by: 'Správcom je:'
     api: API
     apps: Aplikácie
+    apps_platforms: Uživaj Mastodon z iOSu, Androidu a iných platforiem
+    browse_directory: Prehľadávaj databázu profilov a filtruj ju podľa záujmov
+    browse_public_posts: Prebádaj naživo prúd verejných príspevkov na Mastodone
     contact: Kontakt
     contact_missing: Nezadaný
     contact_unavailable: Neuvedený
+    discover_users: Objavuj užívateľov
     documentation: Dokumentácia
     extended_description_html: |
       <h3>Pravidlá</h3>
       <p>Žiadne zatiaľ uvedené nie sú</p>
+    federation_hint_html: S účtom na %{instance} budeš môcť následovať ľúdí na hociakom inom Mastodon serveri, ale aj inde.
     generic_description: "%{domain} je jeden server v sieti"
+    get_apps: Vyskúšaj mobilnú aplikáciu
     hosted_on: Mastodon hostovaný na %{domain}
     learn_more: Zisti viac
     privacy_policy: Ustanovenia o súkromí
+    see_whats_happening: Pozoruj, čo sa deje
+    server_stats: 'Serverové štatistiky:'
     source_code: Zdrojový kód
     status_count_after:
       few: príspevkov
       one: príspevok
       other: príspevkov
     status_count_before: Ktorí napísali
+    tagline: Následuj kamarátov, a objavuj nových
     terms: Podmienky užívania
     user_count_after:
       few: užívatelia
@@ -72,6 +83,7 @@ sk:
       delete: Vymaž
       destroyed_msg: Moderátorska poznámka bola úspešne zmazaná!
     accounts:
+      approve: Schváľ
       are_you_sure: Si si istý/á?
       avatar: Maskot
       by_domain: Doména
@@ -117,6 +129,7 @@ sk:
       moderation:
         active: Aktívny
         all: Všetko
+        pending: Čakajúci
         silenced: Umlčané
         suspended: Vylúčený/á
         title: Moderácia
@@ -126,6 +139,7 @@ sk:
       no_limits_imposed: Nie sú stanovené žiadné obmedzenia
       not_subscribed: Neodoberá
       outbox_url: URL poslaných
+      pending: Vyžaduje posúdenie
       perform_full_suspension: Vylúč
       profile_url: URL profilu
       promote: Povýš
@@ -133,6 +147,7 @@ sk:
       public: Verejná os
       push_subscription_expires: PuSH odoberanie expiruje
       redownload: Obnov profil
+      reject: Odmietni
       remove_avatar: Odstrániť avatár
       remove_header: Odstráň hlavičku
       resend_confirmation:
@@ -406,6 +421,12 @@ sk:
         min_invite_role:
           disabled: Nikto
           title: Povoliť pozvánky od
+      registrations_mode:
+        modes:
+          approved: Pre registráciu je nutné povolenie
+          none: Nikto sa nemôže registrovať
+          open: Ktokoľvek sa môže zaregistrovať
+        title: Režím registrácií
       show_known_fediverse_at_about_page:
         desc_html: Pokiaľ je zapnuté, bude v ukážke osi možné nahliadnúť príspevky z celého známeho fediversa. Inak budú ukázané iba príspevky z miestnej osi.
         title: Ukáž celé známe fediverse na náhľade osi
@@ -468,6 +489,8 @@ sk:
       edit_preset: Uprav varovnú predlohu
       title: Spravuj varovné predlohy
   admin_mailer:
+    new_pending_account:
+      body: Podrobnosti o novom účte sú uvedené nižšie. Môžeš túto registračnú požiadavku buď prijať, alebo zamietnúť.
     new_report:
       body: "%{reporter} nahlásil/a %{target}"
       body_remote: Niekto z %{domain} nahlásil/a %{target}
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 5a4ffb6cd..3d99f7708 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -22,14 +22,14 @@ sl:
     status_count_after:
       few: stanja
       one: stanje
-      other: stanja
+      other: stanj
       two: stanja
-    status_count_before: Kdo je avtor
+    status_count_before: Ki so avtorji
     terms: Pogoji storitve
     user_count_after:
       few: uporabniki
       one: uporabnik
-      other: uporabniki
+      other: uporabnikov
       two: uporabniki
     user_count_before: Dom za
     what_is_mastodon: Kaj je Mastodon?
diff --git a/config/locales/th.yml b/config/locales/th.yml
index b562c8f7c..729865c83 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -1,224 +1,530 @@
 ---
 th:
   about:
-    about_mastodon_html: แมสโทดอน เป็น  <em>ดีเซ็นทรัลไลซ์</em><em>ฟรีโอเพ่นซอร์ส</em> โซเชี่ยวเน็ตเวริ์ค.  เป็นทางเลือกทดแทนโซเชี่ยวเน็ตเวิร์คที่ทำเป็นธุรกิจการค้า, ป้องกันการผูกขาดช่องทางการสื่อสารของคุณ. เลือกเซร์ฟเวอร์ที่คุณไว้ใจ &mdash; ที่คุณเลือกได้เอง, สื่อสารกับคนที่คุณต้องการได้เสมอ. ใครๆก็รันแมสโทดอนอินซะแตนซ์ได้ และ เชื่อมต่อกับ<em>โซเชี่ยวเน็ตเวิร์ค</em> โดยไม่มีอะไรมาขวางกั้น.
-    about_this: เกี่ยวกับอินซะแตนซ์นี้
+    about_mastodon_html: Mastodon เป็นเครือข่ายสังคมที่ทำงานบนโปรโตคอลเว็บแบบเปิดและซอฟต์แวร์เสรีที่เปิดต้นฉบับ กระจายศูนย์เหมือนอีเมล
+    about_this: เกี่ยวกับ
+    active_count_after: ที่ใช้งาน
+    active_footnote: ผู้ใช้งานรายเดือน (MAU)
+    administered_by: 'ดูแลโดย:'
+    api: API
+    apps: แอปสำหรับมือถือ
+    apps_platforms: ใช้ Mastodon จาก iOS, Android และแพลตฟอร์มอื่น ๆ
+    browse_directory: เรียกดูไดเรกทอรีโปรไฟล์และกรองตามความสนใจ
+    browse_public_posts: เรียกดูสตรีมสดของโพสต์สาธารณะใน Mastodon
     contact: ติดต่อ
-    source_code: ซอร์สโค๊ด
-    status_count_after: สถานะ
-    status_count_before: Who authored
-    user_count_after: ผู้ใช้
-    user_count_before: Home to
+    contact_missing: ไม่ได้ตั้ง
+    contact_unavailable: ไม่มี
+    discover_users: ค้นพบผู้ใช้
+    documentation: เอกสารประกอบ
+    extended_description_html: |
+      <h3>สถานที่ที่ดีสำหรับกฎ</h3>
+      <p>ยังไม่ได้ตั้งคำอธิบายแบบขยาย</p>
+    generic_description: "%{domain} เป็นเซิร์ฟเวอร์หนึ่งในเครือข่าย"
+    get_apps: ลองแอปสำหรับมือถือ
+    learn_more: เรียนรู้เพิ่มเติม
+    privacy_policy: นโยบายความเป็นส่วนตัว
+    server_stats: 'สถิติเซิร์ฟเวอร์:'
+    source_code: โค้ดต้นฉบับ
+    status_count_after:
+      one: สถานะ
+      other: สถานะ
+    status_count_before: ผู้สร้าง
+    user_count_after:
+      one: ผู้ใช้
+      other: ผู้ใช้
+    user_count_before: บ้านของ
+    what_is_mastodon: Mastodon คืออะไร?
   accounts:
     follow: ติดตาม
-    followers: ผู้ติดตาม
+    followers:
+      one: ผู้ติดตาม
+      other: ผู้ติดตาม
     following: กำลังติดตาม
-    nothing_here: ไม่พบสิ่งใดที่นี่!
-    people_followed_by: ถูกติดตามโดย %{name}
-    people_who_follow: คนที่ติดตาม %{name}
-    posts: โพสต์
+    joined: เข้าร่วมเมื่อ %{date}
+    last_active: ใช้งานล่าสุด
+    media: สื่อ
+    moved_html: "%{name} ได้ย้ายไปยัง %{new_profile_link}:"
+    network_hidden: ไม่มีข้อมูลนี้
+    nothing_here: ไม่มีสิ่งใดที่นี่!
+    people_followed_by: ผู้คนที่ %{name} ติดตาม
+    people_who_follow: ผู้คนที่ติดตาม %{name}
+    posts:
+      one: โพสต์
+      other: โพสต์
+    posts_tab_heading: โพสต์
+    posts_with_replies: โพสต์และการตอบกลับ
+    roles:
+      admin: ผู้ดูแล
+      bot: บอต
+      moderator: ผู้ควบคุม
     unfollow: เลิกติดตาม
   admin:
+    account_moderation_notes:
+      created_msg: สร้างหมายเหตุการควบคุมสำเร็จ!
+      delete: ลบ
+      destroyed_msg: ทำลายหมายเหตุการควบคุมสำเร็จ!
     accounts:
-      are_you_sure: แน่ใจนะ?
+      approve: อนุมัติ
+      are_you_sure: คุณแน่ใจหรือไม่?
+      avatar: ภาพประจำตัว
+      by_domain: โดเมน
+      change_email:
+        changed_msg: เปลี่ยนอีเมลบัญชีสำเร็จ!
+        current_email: อีเมลปัจจุบัน
+        label: เปลี่ยนอีเมล
+        new_email: อีเมลใหม่
+        submit: เปลี่ยนอีเมล
+        title: เปลี่ยนอีเมลสำหรับ %{username}
       confirm: ยืนยัน
-      confirmed: ยึนยันแล้ว
-      confirming: ยืนยัน
-      disable_two_factor_authentication: Disable 2FA
-      display_name: ชื่อสำหรับดีสเพล
+      confirmed: ยืนยันแล้ว
+      confirming: กำลังยืนยัน
+      deleted: ลบแล้ว
+      demote: ลดระดับ
+      disable: ปิดใช้งาน
+      disable_two_factor_authentication: ปิดใช้งาน 2FA
+      disabled: ปิดใช้งานอยู่
+      display_name: ชื่อที่แสดงผล
       domain: โดเมน
       edit: แก้ไข
-      email: อีเมล์
+      email: อีเมล
       email_status: สถานะอีเมล
-      feed_url: Feed URL
+      enable: เปิดใช้งาน
+      enabled: เปิดใช้งานอยู่
+      feed_url: URL ฟีด
       followers: ผู้ติดตาม
+      followers_url: URL ผู้ติดตาม
       follows: ติดตาม
+      header: ส่วนหัว
+      inbox_url: URL กล่องขาเข้า
+      invited_by: เชิญโดย
+      ip: IP
+      joined: เข้าร่วมเมื่อ
       location:
         all: ทั้งหมด
-        local: บนอินแสตนซ์นี้
-        remote: บนอินแสตนซ์อื่น
-        title: สถานที่
-      media_attachments: สื่อที่แนบมา
+        local: ในเว็บ
+        remote: ระยะไกล
+        title: ตำแหน่งที่ตั้ง
+      login_status: สถานะการเข้าสู่ระบบ
+      media_attachments: ไฟล์แนบสื่อ
       moderation:
         all: ทั้งหมด
-        silenced: ปิดเสียง
-        suspended: หยุดไว้
-        title: Moderation
+        silenced: เงียบอยู่
+        suspended: ระงับอยู่
+        title: การควบคุม
+      moderation_notes: หมายเหตุการควบคุม
       most_recent_activity: กิจกรรมล่าสุด
       most_recent_ip: IP ล่าสุด
-      not_subscribed: Not subscribed
-      perform_full_suspension: Perform full suspension
-      profile_url: Profile URL
+      not_subscribed: ไม่ได้บอกรับ
+      outbox_url: URL กล่องขาออก
+      perform_full_suspension: ระงับ
+      profile_url: URL โปรไฟล์
+      protocol: โปรโตคอล
       public: สาธารณะ
-      push_subscription_expires: PuSH subscription expires
+      push_subscription_expires: การบอกรับ PuSH หมดอายุเมื่อ
+      reject: ปฏิเสธ
+      remove_avatar: เอาภาพประจำตัวออก
+      remove_header: เอาส่วนหัวออก
       resend_confirmation:
-        already_confirmed: ผู้ใช้รายนี้ได้รับการยืนยันแล้ว
+        already_confirmed: ผู้ใช้นี้ได้รับการยืนยันอยู่แล้ว
         send: ส่งอีเมลยืนยันอีกครั้ง
-        success: ยืนยันอีเมลเรียบร้อยแล้ว!
-      reset_password: รีเซ็ตรหัสผ่าน
+        success: ส่งอีเมลยืนยันสำเร็จ!
+      reset_password: ตั้งรหัสผ่านใหม่
+      resubscribe: บอกรับใหม่
+      roles:
+        admin: ผู้ดูแล
+        moderator: ผู้ควบคุม
+        staff: พนักงาน
+        user: ผู้ใช้
       salmon_url: Salmon URL
+      search: ค้นหา
       show:
-        created_reports: รายงานที่ถูกสร้างโดย แอคเคาท์นี้
-        targeted_reports: รายงานเกี่ยวกับแอคเคาท์นี้
-      silence: ปิดเสียง
+        created_reports: รายงานที่สร้าง
+        targeted_reports: รายงานโดยผู้อื่น
+      silence: เงียบ
+      silenced: เงียบอยู่
       statuses: สถานะ
+      subscribe: บอกรับ
+      suspended: ระงับอยู่
       title: บัญชี
-      undo_silenced: ยกเลิกการปิดเสียง
-      undo_suspension: ยกเลิกการหยุด
+      undo_silenced: เลิกทำการเงียบ
+      undo_suspension: เลิกทำการระงับ
+      unsubscribe: เลิกบอกรับ
       username: ชื่อผู้ใช้
+      warn: เตือน
       web: เว็บ
+    action_logs:
+      deleted_status: "(สถานะที่ลบแล้ว)"
+      title: รายการบันทึกการตรวจสอบ
+    custom_emojis:
+      by_domain: โดเมน
+      copy: คัดลอก
+      created_msg: สร้างอีโมจิสำเร็จ!
+      delete: ลบ
+      disable: ปิดใช้งาน
+      emoji: อีโมจิ
+      enable: เปิดใช้งาน
+      new:
+        title: เพิ่มอีโมจิที่กำหนดเองใหม่
+      overwrite: เขียนทับ
+      shortcode: รหัสย่อ
+      title: อีโมจิที่กำหนดเอง
+      unlisted: ไม่อยู่ในรายการ
+      update_failed_msg: ไม่สามารถอัปเดตอีโมจินั้น
+      updated_msg: อัปเดตอีโมจิสำเร็จ!
+      upload: อัปโหลด
+    dashboard:
+      config: การกำหนดค่า
+      feature_deletions: การลบบัญชี
+      feature_invites: ลิงก์เชิญ
+      feature_profile_directory: ไดเรกทอรีโปรไฟล์
+      feature_registrations: การลงทะเบียน
+      features: คุณลักษณะ
+      open_reports: รายงานที่เปิด
+      recent_users: ผู้ใช้ล่าสุด
+      search: การค้นหาข้อความแบบเต็ม
+      single_user_mode: โหมดผู้ใช้เดี่ยว
+      software: ซอฟต์แวร์
+      space: การใช้พื้นที่
+      title: แดชบอร์ด
+      total_users: ผู้ใช้ทั้งหมด
+      trends: แนวโน้ม
+      week_interactions: การโต้ตอบในสัปดาห์นี้
+      week_users_active: ที่ใช้งานในสัปดาห์นี้
+      week_users_new: ผู้ใช้ในสัปดาห์นี้
     domain_blocks:
-      add_new: เพิ่มใหม่
-      created_msg: กำลังบล๊อกโดเมน
-      destroyed_msg: ยกเลิกการบล๊อกโดเมน
+      add_new: เพิ่มการปิดกั้นโดเมนใหม่
+      created_msg: กำลังประมวลผลการปิดกั้นโดเมน
+      destroyed_msg: เลิกทำการปิดกั้นโดเมนแล้ว
       domain: โดเมน
       new:
-        create: สร้างการบล๊อก
-        hint: การบล๊อคโดเมนไม่สามารถป้องกันการสร้างแอคเค๊าท์ในฐานข้อมูล, but will retroactively and automatically apply specific moderation methods on those accounts.
+        create: สร้างการปิดกั้น
+        hint: การปิดกั้นโดเมนจะไม่ป้องกันการสร้างรายการบัญชีในฐานข้อมูล แต่จะใช้วิธีการควบคุมเฉพาะกับบัญชีเหล่านั้นย้อนหลังและโดยอัตโนมัติ
         severity:
-          desc_html: "<strong>การปิดเสียง</strong> จะทำให้ผู้ที่ไมไ่ด้ติดตามไม่เห็นโพสต์ของเขา. <strong>การหยุด</strong> จะนำเนื้อหา สื่อ และ โปรไฟล์ ออก."
-          silence: ปิดเสียง
-          suspend: หยุดไว้
-        title: การบล๊อกโดเมนใหม่
-      reject_media: ไม่อนุมัติไฟล์สื่อ
-      reject_media_hint: ลบไฟล์สื่อที่เก็บไว้ในเครื่อง และ ป้องกันการดาวน์โหลดในอนาคต. Irrelevant for suspensions
+          desc_html: "<strong>เงียบ</strong> จะทำให้โพสต์ของบัญชีมองไม่เห็นกับใครก็ตามที่ไม่ได้กำลังติดตามบัญชี <strong>ระงับ</strong> จะเอาเนื้อหา, สื่อ และข้อมูลโปรไฟล์ทั้งหมดของบัญชีออก ใช้ <strong>ไม่มี</strong> หากคุณเพียงแค่ต้องการปฏิเสธไฟล์สื่อ"
+          noop: ไม่มี
+          silence: เงียบ
+          suspend: ระงับ
+        title: การปิดกั้นโดเมนใหม่
+      reject_media: ปฏิเสธไฟล์สื่อ
+      reject_media_hint: เอาไฟล์สื่อที่จัดเก็บไว้ในเว็บออกและปฏิเสธที่จะดาวน์โหลดไฟล์ใด ๆ ในอนาคต ไม่เกี่ยวข้องกับการระงับ
+      reject_reports: ปฏิเสธรายงาน
+      severity:
+        silence: เงียบอยู่
+        suspend: ระงับอยู่
       show:
         affected_accounts:
-          one: มีผลต่อหนึ่งแอคเค๊าท์ในฐานข้อมูล
-          other: มีผลต่อแอคเค๊าท์ในฐานข้อมูลจำนวน %{count}
+          one: มีผลต่อหนึ่งบัญชีในฐานข้อมูล
+          other: มีผลต่อ %{count} บัญชีในฐานข้อมูล
         retroactive:
-          silence: ยกเลิกการปิดเสียงทุกแอคเค๊าท์จากโดเมน
-          suspend: ยกเลิกการหยุดทุกแอคเค๊าท์จากโดเมน
-        title: ยกเลิกการบล๊อกโดเมน %{domain}
-        undo: ยกเลิก
-      undo: ยกเลิก
+          silence: เลิกเงียบบัญชีที่มีอยู่ทั้งหมดจากโดเมนนี้
+          suspend: เลิกระงับบัญชีที่มีอยู่ทั้งหมดจากโดเมนนี้
+        title: เลิกทำการปิดกั้นโดเมนสำหรับ %{domain}
+        undo: เลิกทำ
+      undo: เลิกทำการปิดกั้นโดเมน
+    email_domain_blocks:
+      add_new: เพิ่มใหม่
+      delete: ลบ
+      domain: โดเมน
+      new:
+        create: เพิ่มโดเมน
+    followers:
+      back_to_account: กลับไปที่บัญชี
+      title: ผู้ติดตามของ %{acct}
     instances:
-      title: Known Instances
+      by_domain: โดเมน
+      moderation:
+        all: ทั้งหมด
+        limited: จำกัดอยู่
+        title: การควบคุม
+      title: การติดต่อกับภายนอก
+      total_storage: ไฟล์แนบสื่อ
+    invites:
+      deactivate_all: ปิดใช้งานทั้งหมด
+      title: คำเชิญ
+    relays:
+      add_new: เพิ่มรีเลย์ใหม่
+      delete: ลบ
+      disable: ปิดใช้งาน
+      disabled: ปิดใช้งานอยู่
+      enable: เปิดใช้งาน
+      enabled: เปิดใช้งานอยู่
+      inbox_url: URL รีเลย์
+      status: สถานะ
+      title: รีเลย์
+    report_notes:
+      created_msg: สร้างหมายเหตุรายงานสำเร็จ!
+      destroyed_msg: ลบหมายเหตุรายงานสำเร็จ!
     reports:
+      account:
+        note: หมายเหตุ
+        report: รายงาน
+      are_you_sure: คุณแน่ใจหรือไม่?
+      assign_to_self: มอบหมายให้ฉัน
       comment:
-        none: None
-      mark_as_resolved: ทำเครื่องหมายว่าจัดการแล้ว
-      report: 'Report #%{id}'
-      reported_account: รายงานแอคเคาท์
+        none: ไม่มี
+      created_at: รายงานเมื่อ
+      mark_as_resolved: ทำเครื่องหมายว่าแก้ปัญหาแล้ว
+      mark_as_unresolved: ทำเครื่องหมายว่ายังไม่ได้แก้ปัญหา
+      notes:
+        create: เพิ่มหมายเหตุ
+        delete: ลบ
+      report: 'รายงาน #%{id}'
+      reported_account: บัญชีที่ได้รับการรายงาน
       reported_by: รายงานโดย
-      resolved: จัดการแล้ว
+      resolved: แก้ปัญหาแล้ว
+      resolved_msg: แก้ปัญหารายงานสำเร็จ!
       status: สถานะ
       title: รายงาน
-      unresolved: Unresolved
+      unassign: เลิกมอบหมาย
+      unresolved: ยังไม่ได้แก้ปัญหา
+      updated_at: อัปเดตเมื่อ
     settings:
       contact_information:
-        email: กรอกที่อยู่อีเมล์สาธารณะ
-        username: กรอกชื่อผู้ใช้
+        email: อีเมลธุรกิจ
+        username: ชื่อผู้ใช้ในการติดต่อ
+      custom_css:
+        title: CSS ที่กำหนดเอง
+      profile_directory:
+        title: เปิดใช้งานไดเรกทอรีโปรไฟล์
       registrations:
         closed_message:
-          desc_html: Displayed on frontpage when registrations are closed<br> ใช้ HTML tags ได้
-          title: ปิดข้อความลงทะเบียน
+          desc_html: แสดงผลในหน้าแรกเมื่อปิดการลงทะเบียน คุณสามารถใช้แท็ก HTML
+          title: ข้อความการปิดการลงทะเบียน
+        deletion:
+          desc_html: อนุญาตให้ใครก็ตามลบบัญชีของเขา
+          title: เปิดการลบบัญชี
+        min_invite_role:
+          disabled: ไม่มีใคร
+          title: อนุญาตคำเชิญโดย
+      registrations_mode:
+        modes:
+          none: ไม่มีใครสามารถลงทะเบียน
+          open: ใครก็ตามสามารถลงทะเบียน
+        title: โหมดการลงทะเบียน
+      show_staff_badge:
+        desc_html: แสดงป้ายพนักงานในหน้าผู้ใช้
+        title: แสดงป้ายพนักงาน
       site_description:
-        desc_html: Displayed as a paragraph on the frontpage and used as a meta tag.<br> ใช้ HTML tags ได้, in particular <code>&lt;a&gt;</code> และ <code>&lt;em&gt;</code>.
-        title: คำอธิบายไซต์
+        desc_html: ย่อหน้าเกริ่นนำในหน้าแรก อธิบายถึงสิ่งที่ทำให้เซิร์ฟเวอร์ Mastodon นี้พิเศษและสิ่งอื่นใดที่สำคัญ คุณสามารถใช้แท็ก HTML โดยเฉพาะอย่างยิ่ง <code>&lt;a&gt;</code> และ <code>&lt;em&gt;</code>
+        title: คำอธิบายเซิร์ฟเวอร์
       site_description_extended:
-        desc_html: Displayed on extended information page<br>You can use HTML tags
-        title: คำอธิบายไซต์เพิ่มเติม
-      site_title: ชื่อไซต์
-      title: ตั้งค่าไซต์
+        desc_html: สถานที่ที่ดีสำหรับแนวทางปฏิบัติ, กฎ, หลักเกณฑ์ และสิ่งอื่น ๆ ของคุณที่ทำให้เซิร์ฟเวอร์ของคุณแตกต่าง คุณสามารถใช้แท็ก HTML
+        title: ข้อมูลแบบขยายที่กำหนดเอง
+      site_short_description:
+        title: คำอธิบายเซิร์ฟเวอร์แบบสั้น
+      site_title: ชื่อเซิร์ฟเวอร์
+      timeline_preview:
+        desc_html: แสดงเส้นเวลาสาธารณะในหน้าเริ่มต้น
+        title: ตัวอย่างเส้นเวลา
+      title: การตั้งค่าไซต์
+    statuses:
+      back_to_account: กลับไปที่หน้าบัญชี
+      batch:
+        delete: ลบ
+        nsfw_off: ทำเครื่องหมายว่าไม่ละเอียดอ่อน
+        nsfw_on: ทำเครื่องหมายว่าละเอียดอ่อน
+      media:
+        title: สื่อ
+      no_media: ไม่มีสื่อ
+      title: สถานะบัญชี
     subscriptions:
-      callback_url: Callback URL
-      confirmed: ยืนยัน
+      callback_url: URL เรียกกลับ
+      confirmed: ยืนยันแล้ว
       expires_in: หมดอายุภายใน
-      last_delivery: จัดส่งครั้งล่าสุด
+      last_delivery: ส่งล่าสุด
       title: WebSub
-      topic: ชื่อเรื่อง
-    title: แอดมิน
+      topic: หัวข้อ
+    tags:
+      accounts: บัญชี
+      hidden: ซ่อนอยู่
+      hide: ซ่อนจากไดเรกทอรี
+      name: แฮชแท็ก
+      title: แฮชแท็ก
+      unhide: แสดงในไดเรกทอรี
+      visible: มองเห็น
+    title: การดูแล
+    warning_presets:
+      add_new: เพิ่มใหม่
+      delete: ลบ
+      edit: แก้ไข
+      edit_preset: แก้ไขคำเตือนที่ตั้งไว้ล่วงหน้า
+      title: จัดการคำเตือนที่ตั้งไว้ล่วงหน้า
   application_mailer:
-    settings: 'เปลี่ยนอีเมล์ preferences: %{link}'
-    view: 'วิว:'
+    notification_preferences: เปลี่ยนการกำหนดลักษณะอีเมล
+    settings: 'เปลี่ยนการกำหนดลักษณะอีเมล: %{link}'
+    view: 'มุมมอง:'
+    view_profile: ดูโปรไฟล์
+    view_status: ดูสถานะ
   applications:
-    invalid_url: URL ที่ระบุไม่ถูกตั้ง
+    invalid_url: URL ที่ระบุไม่ถูกต้อง
   auth:
+    apply_for_account: ขอคำเชิญ
+    change_password: รหัสผ่าน
+    confirm_email: ยืนยันอีเมล
+    delete_account: ลบบัญชี
     didnt_get_confirmation: Didn't receive confirmation instructions?
-    forgot_password: คุณลืมพาสเวริ์ดใช่ัม้ย?
-    login: ล๊อคอิน
-    logout: ล๊อคเอาท์
-    register: สมัคร
+    forgot_password: ลืมรหัสผ่านของคุณ?
+    login: เข้าสู่ระบบ
+    logout: ออกจากระบบ
+    migrate_account: ย้ายไปยังบัญชีอื่น
+    or_log_in_with: หรือเข้าสู่ระบบด้วย
+    providers:
+      cas: CAS
+      saml: SAML
+    register: ลงทะเบียน
     resend_confirmation: ส่งขั้นตอนวิธีการยืนยันใหม่อีกครั้ง
-    reset_password: เปลี่ยนรหัสผ่าน
-    security: Credentials
+    reset_password: ตั้งรหัสผ่านใหม่
+    security: ความปลอดภัย
     set_new_password: ตั้งรหัสผ่านใหม่
+    trouble_logging_in: มีปัญหาในการเข้าสู่ระบบ?
   authorize_follow:
+    already_following: คุณกำลังติดตามบัญชีนี้อยู่แล้ว
     error: Unfortunately, there was an error looking up the remote account
     follow: ติดตาม
+    following: 'สำเร็จ! คุณกำลังติดตาม:'
+    post_follow:
+      return: แสดงโปรไฟล์ของผู้ใช้
+      web: ไปยังเว็บ
     title: ติดตาม %{acct}
   datetime:
     distance_in_words:
-      about_x_hours: "%{count}ช"
-      about_x_months: "%{count}ด"
-      about_x_years: "%{count}ป"
-      almost_x_years: "%{count}ป"
-      half_a_minute: ครึ่งนาที
-      less_than_x_minutes: "%{count}ม"
-      less_than_x_seconds: ไม่ถึงนาที
-      over_x_years: "%{count}ป"
-      x_days: "%{count}ด"
-      x_minutes: "%{count}น"
-      x_months: "%{count}ด"
-      x_seconds: "%{count}ว"
+      about_x_hours: "%{count} ชั่วโมง"
+      about_x_months: "%{count} เดือน"
+      about_x_years: "%{count} ปี"
+      almost_x_years: "%{count} ปี"
+      half_a_minute: เมื่อกี้นี้
+      less_than_x_minutes: "%{count} นาที"
+      less_than_x_seconds: เมื่อกี้นี้
+      over_x_years: "%{count} ปี"
+      x_days: "%{count} วัน"
+      x_minutes: "%{count} นาที"
+      x_months: "%{count} เดือน"
+      x_seconds: "%{count} วินาที"
+  deletes:
+    proceed: ลบบัญชี
+    success_msg: ลบบัญชีของคุณสำเร็จ
+  directories:
+    directory: ไดเรกทอรีโปรไฟล์
+    explanation: ค้นพบผู้ใช้ตามความสนใจของเขา
+    explore_mastodon: สำรวจ %{title}
   errors:
-    '403': คุณไม่มีสิทธิ์เข้าดูหน้านี้.
-    '404': ไม่พบเพจที่คุณต้องการดู.
-    '410': เพจที่คุณต้องการดูไม่มีแล้ว.
+    '403': คุณไม่มีสิทธิดูหน้านี้
+    '404': หน้าที่คุณกำลังมองหาไม่ได้อยู่ที่นี่
+    '410': หน้าที่คุณกำลังมองหาไม่มีอยู่ที่นี่อีกต่อไป
     '422':
-      content: การตรวจสอบความปลอดภัยล้มเหลว. คุณกำลังบล๊อกคุกกี้อยู่?
+      content: การตรวจสอบความปลอดภัยล้มเหลว คุณกำลังปิดกั้นคุกกี้หรือไม่?
       title: การตรวจสอบความปลอดภัยล้มเหลว
     '429': Throttled
+    '500':
+      title: หน้านี้ไม่ถูกต้อง
   exports:
-    blocks: คุณบล๊อก
+    archive_takeout:
+      date: วันที่
+      download: ดาวน์โหลดการเก็บถาวรของคุณ
+      request: ขอการเก็บถาวรของคุณ
+      size: ขนาด
+    blocks: คุณปิดกั้น
     csv: CSV
+    domain_blocks: การปิดกั้นโดเมน
     follows: คุณติดตาม
+    lists: รายการ
     mutes: คุณปิดเสียง
-    storage: ที่เก็บสื่อ
+    storage: ที่เก็บข้อมูลสื่อ
+  featured_tags:
+    add_new: เพิ่มใหม่
+  filters:
+    contexts:
+      home: เส้นเวลาหน้าแรก
+      notifications: การแจ้งเตือน
+      public: เส้นเวลาสาธารณะ
+      thread: การสนทนา
+    edit:
+      title: แก้ไขตัวกรอง
+    index:
+      delete: ลบ
+      title: ตัวกรอง
+    new:
+      title: เพิ่มตัวกรองใหม่
+  footer:
+    developers: นักพัฒนา
+    more: เพิ่มเติม…
+    resources: ทรัพยากร
   generic:
-    changes_saved_msg: บันทึกการแก้ไขแล้ว!
+    all: ทั้งหมด
+    changes_saved_msg: บันทึกการเปลี่ยนแปลงสำเร็จ!
+    copy: คัดลอก
     save_changes: บันทึกการเปลี่ยนแปลง
     validation_errors:
       one: Something isn't quite right yet! Please review the error below
       other: Something isn't quite right yet! Please review %{count} errors below
   imports:
+    modes:
+      merge: ผสาน
+      overwrite: เขียนทับ
     preface: You can import certain data like all the people you are following or blocking into your account on this instance, from files created by an export on another instance.
     success: Your data was successfully uploaded and will now be processed in due time
     types:
-      blocking: Blocking list
-      following: Following list
-      muting: Muting list
-    upload: Upload
+      blocking: รายการปิดกั้น
+      following: รายการติดตาม
+      muting: รายการปิดเสียง
+    upload: อัปโหลด
+  invites:
+    delete: ปิดใช้งาน
+    expires_in:
+      '1800': 30 นาที
+      '21600': 6 ชั่วโมง
+      '3600': 1 ชั่วโมง
+      '43200': 12 ชั่วโมง
+      '604800': 1 สัปดาห์
+      '86400': 1 วัน
+    expires_in_prompt: ไม่เลย
+    generate: สร้าง
+    max_uses_prompt: ไม่มีขีดจำกัด
+    table:
+      expires_at: หมดอายุเมื่อ
+    title: เชิญผู้คน
   media_attachments:
     validations:
-      images_and_video: Cannot attach a video to a status that already contains images
-      too_many: แนบมากกว่า 4 ไฟล์ไม่ได้
+      images_and_video: ไม่สามารถแนบวิดีโอกับสถานะที่มีภาพอยู่แล้ว
+      too_many: ไม่สามารถแนบมากกว่า 4 ไฟล์
+  migrations:
+    acct: username@domain ของบัญชีใหม่
+    proceed: บันทึก
+  moderation:
+    title: การควบคุม
   notification_mailer:
     digest:
+      action: ดูการแจ้งเตือนทั้งหมด
       body: Here is a brief summary of the messages you missed since your last visit on %{since}
-      mention: "%{name} ส่งข้อความถึงคุณ:"
+      mention: "%{name} ได้กล่าวถึงคุณใน:"
       new_followers_summary:
-        one: ยินดีด้วยคุณได้ผู้ติดตามคนใหม่! Yay!
+        one: นอกจากนี้คุณยังมีหนึ่งผู้ติดตามใหม่ขณะที่ไม่อยู่! เย่!
         other: You have gotten %{count} new followers! Amazing!
       subject:
         one: "1 new notification since your last visit \U0001F418"
         other: "%{count} new notifications since your last visit \U0001F418"
     favourite:
-      body: 'สเตตัสของคุณได้รับการกดถูกใจโดย %{name} :'
-      subject: "%{name} กดถูกใจสเตตัสของคุณ"
+      body: 'สถานะของคุณได้รับการชื่นชอบโดย %{name}:'
+      subject: "%{name} ได้ชื่นชอบสถานะของคุณ"
+      title: รายการโปรดใหม่
     follow:
-      body: "%{name} กำลังติดตามคุณ"
-      subject: "%{name} ได้ติดตามคุณแล้ว"
+      body: "%{name} กำลังติดตามคุณ!"
+      subject: "%{name} กำลังติดตามคุณ"
+      title: ผู้ติดตามใหม่
     follow_request:
+      action: จัดการคำขอติดตาม
       body: "%{name} ได้ขอติดตามคุณ"
-      subject: 'Pending follower: %{name}'
+      subject: 'ผู้ติดตามที่รอดำเนินการ: %{name}'
+      title: คำขอติดตามใหม่
     mention:
-      body: 'You were mentioned by %{name} in:'
-      subject: You were mentioned by %{name}
+      action: ตอบกลับ
+      body: 'คุณได้รับการกล่าวถึงโดย %{name} ใน:'
+      subject: คุณได้รับการกล่าวถึงโดย %{name}
+      title: การกล่าวถึงใหม่
     reblog:
-      body: 'Your status was boosted by %{name}:'
-      subject: "%{name} boosted your status"
+      body: 'สถานะของคุณได้รับการดันโดย %{name}:'
+      subject: "%{name} ได้ดันสถานะของคุณ"
+      title: การดันใหม่
   number:
     human:
       decimal_units:
@@ -231,54 +537,130 @@ th:
           trillion: T
           unit: ''
   pagination:
-    next: ต่อไป
-    prev: ย้อนกลับ
+    newer: ใหม่กว่า
+    next: ถัดไป
+    older: เก่ากว่า
+    prev: ก่อนหน้า
     truncate: "&hellip;"
+  preferences:
+    languages: ภาษา
+    other: อื่น ๆ
+    publishing: การเผยแพร่
+    web: เว็บ
+  relationships:
+    activity: กิจกรรมบัญชี
+    relationship: ความสัมพันธ์
+    remove_selected_domains: เอาผู้ติดตามทั้งหมดออกจากโดเมนที่เลือก
+    remove_selected_followers: เอาผู้ติดตามที่เลือกออก
+    remove_selected_follows: เลิกติดตามผู้ใช้ที่เลือก
+    status: สถานะบัญชี
   remote_follow:
-    acct: Enter your username@domain you want to follow from
+    acct: ป้อน username@domain ของคุณที่คุณต้องการกระทำจาก
     missing_resource: Could not find the required redirect URL for your account
-    proceed: Proceed to follow
-    prompt: 'You are going to follow:'
+    no_account_html: ไม่มีบัญชี? คุณสามารถ <a href='%{sign_up_path}' target='_blank'>ลงทะเบียนที่นี่</a>
+    proceed: ดำเนินการต่อเพื่อติดตาม
+    prompt: 'คุณกำลังจะติดตาม:'
+  remote_interaction:
+    favourite:
+      proceed: ดำเนินการต่อเพื่อชื่นชอบ
+      prompt: 'คุณต้องการชื่นชอบโพสต์นี้:'
+    reblog:
+      proceed: ดำเนินการต่อเพื่อดัน
+      prompt: 'คุณต้องการดันโพสต์นี้:'
+    reply:
+      proceed: ดำเนินการต่อเพื่อตอบกลับ
+      prompt: 'คุณต้องการตอบกลับโพสต์นี้:'
+  remote_unfollow:
+    error: ข้อผิดพลาด
+    title: ชื่อเรื่อง
+    unfollowed: เลิกติดตามแล้ว
+  sessions:
+    activity: กิจกรรมล่าสุด
+    browser: เบราว์เซอร์
+    ip: IP
+    revoke: เพิกถอน
   settings:
-    authorized_apps: Authorized apps
-    back: กลับไปที่แมสโทดอน
+    authorized_apps: แอปที่ได้รับอนุญาต
+    back: กลับไปที่ Mastodon
+    delete: การลบบัญชี
+    development: การพัฒนา
     edit_profile: แก้ไขโปรไฟล์
-    export: นำข้อมูลออก
+    export: การส่งออกข้อมูล
     import: นำเข้า
-    preferences: Preferences
-    settings: ตั้งค่า
-    two_factor_authentication: Two-factor Authentication
+    notifications: การแจ้งเตือน
+    preferences: การกำหนดลักษณะ
+    relationships: การติดตามและผู้ติดตาม
+    settings: การตั้งค่า
+    two_factor_authentication: การรับรองความถูกต้องด้วยสองปัจจัย
+    your_apps: แอปพลิเคชันของคุณ
   statuses:
+    attached:
+      description: 'แนบ: %{attached}'
+      image:
+        one: "%{count} ภาพ"
+        other: "%{count} ภาพ"
+      video:
+        one: "%{count} วิดีโอ"
+        other: "%{count} วิดีโอ"
+    content_warning: 'คำเตือนเนื้อหา: %{warning}'
     open_in_web: เปิดในเว็บ
     over_character_limit: character limit of %{max} exceeded
-    show_more: แสดงเพิ่มอีก
+    pin_errors:
+      reblog: ไม่สามารถปักหมุดการดัน
+    poll:
+      total_votes:
+        one: "%{count} การลงคะแนน"
+        other: "%{count} การลงคะแนน"
+    show_more: แสดงเพิ่มเติม
+    sign_in_to_participate: ลงชื่อเข้าเพื่อเข้าร่วมการสนทนา
+    title: '%{name}: "%{quote}"'
     visibilities:
-      private: สำหรับผู้ติดตามเท่านั้น
-      private_long: ให้เห็นเฉพาะผู้ติดตาม
-      public: Public
-      public_long: เปิดให้ทุกคนเห็นได้
-      unlisted: Unlisted
+      private: ผู้ติดตามเท่านั้น
+      private_long: แสดงต่อผู้ติดตามเท่านั้น
+      public: สาธารณะ
+      public_long: ทุกคนสามารถเห็น
+      unlisted: ไม่อยู่ในรายการ
       unlisted_long: Everyone can see, but not listed on public timelines
   stream_entries:
+    pinned: โพสต์ที่ปักหมุด
     reblogged: boosted
-    sensitive_content: Sensitive content
+    sensitive_content: เนื้อหาที่ละเอียดอ่อน
+  themes:
+    contrast: Mastodon (ความคมชัดสูง)
+    default: Mastodon (มืด)
+    mastodon-light: Mastodon (สว่าง)
   time:
     formats:
-      default: "%b %d, %Y, %H:%M"
+      default: "%d %b %Y, %H:%M"
+      month: "%b %Y"
   two_factor_authentication:
     code_hint: Enter the code generated by your authenticator app to confirm
     description_html: If you enable <strong>two-factor authentication</strong>, logging in will require you to be in possession of your phone, which will generate tokens for you to enter.
-    disable: ปิด
-    enable: เปิด
-    enabled_success: Two-factor authentication successfully enabled
-    generate_recovery_codes: สร้าง Recovery Codes
+    disable: ปิดใช้งาน
+    enable: เปิดใช้งาน
+    enabled: เปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยแล้ว
+    enabled_success: เปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยสำเร็จ
+    generate_recovery_codes: สร้างรหัสกู้คืน
     instructions_html: "<strong>Scan this QR code into Google Authenticator or a similiar TOTP app on your phone</strong>. From now on, that app will generate tokens that you will have to enter when logging in."
     lost_recovery_codes: Recovery codes allow you to regain access to your account if you lose your phone. If you've lost your recovery codes, you can regenerate them here. Your old recovery codes will be invalidated.
     manual_instructions: 'If you can''t scan the QR code and need to enter it manually, here is the plain-text secret:'
     recovery_codes_regenerated: Recovery codes successfully regenerated
     recovery_instructions_html: If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. Keep the recovery codes safe, for example by printing them and storing them with other important documents.
     setup: ตั้งค่า
-    wrong_code: รหัสที่กรอกไม่ถูกต้อง! Are server time and device time correct?
+    wrong_code: รหัสที่ป้อนไม่ถูกต้อง! เวลาเซิร์ฟเวอร์และเวลาอุปกรณ์ถูกต้องหรือไม่?
+  user_mailer:
+    warning:
+      title:
+        none: คำเตือน
+        silence: จำกัดบัญชีอยู่
+        suspend: ระงับบัญชีอยู่
+    welcome:
+      review_preferences_action: เปลี่ยนการกำหนดลักษณะ
+      subject: ยินดีต้อนรับสู่ Mastodon
+      tips: เคล็ดลับ
   users:
-    invalid_email: อีเมล์ไม่ถูกต้อง
-    invalid_otp_token: two-factor code ไม่ถูกต้อง
+    invalid_email: ที่อยู่อีเมลไม่ถูกต้อง
+    invalid_otp_token: รหัสสองปัจจัยไม่ถูกต้อง
+    signed_in_as: 'ลงชื่อเข้าเป็น:'
+  verification:
+    verification: การตรวจสอบ
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 12a92a698..bfacc86fc 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -4,6 +4,8 @@ zh-CN:
     about_hashtag_html: 这里展示的是带有话题标签 <strong>#%{hashtag}</strong> 的公开嘟文。如果你想与他们互动,你需要在任意一个 Mastodon 实例或与其兼容的网站上拥有一个帐户。
     about_mastodon_html: Mastodon(长毛象)是一个建立在开放式网络协议和自由、开源软件之上的社交网络,有着类似于电子邮件的分布式设计。
     about_this: 关于本实例
+    active_count_after: 活跃
+    active_footnote: 每月活跃用户
     administered_by: 本实例的管理员:
     api: API
     apps: 移动应用
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index fb3d4f1f5..913442e17 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -2,84 +2,115 @@
 zh-TW:
   about:
     about_hashtag_html: 這些是包含「<strong>#%{hashtag}</strong>」標籤的公開文章。只要你有任何 Mastodon 站點、或者其他站點的使用者,便可以與他們互動。
-    about_mastodon_html: Mastodon (長毛象)是一個<em>自由、開放原始碼</em>的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 站點,在上面建立帳號,然後您就可以和任一 Mastodon 站點上的使用者互通,享受無縫的<em>社群網路</em>交流。
+    about_mastodon_html: Mastodon (長毛象)是一個<em>自由、開放原始碼</em>的社群網站。它是一個分散式的服務,避免您的通訊被單一商業機構壟斷操控。請您選擇一家您信任的 Mastodon 站點,在上面建立帳戶,然後您就可以和任一 Mastodon 站點上的使用者互通,享受無縫的<em>社群網路</em>交流。
     about_this: 關於本站
+    active_count_after: 活躍
+    active_footnote: 每月活躍使用者 (MAU)
     administered_by: 管理者:
     api: API
-    apps: Mobile apps
+    apps: 行動應用程式
+    apps_platforms: 在 iOS、Android 和其他平台使用 Mastodon
+    browse_directory: 依興趣瀏覽個人資料目錄和過濾器
+    browse_public_posts: 在 Mastodon 瀏覽公開嘟文的即時串流
     contact: 聯絡我們
     contact_missing: 未設定
     contact_unavailable: 未公開
+    discover_users: 探索使用者
     documentation: 文件
     extended_description_html: |
       <h3>這裡可以寫一些網站規則</h3>
       <p>本站點未有詳細介紹</p>
     generic_description: "%{domain} 是 Mastodon 網路中其中一個站點"
+    get_apps: 嘗試行動應用程式
     hosted_on: 在 %{domain} 運作的 Mastodon 站點
     learn_more: 了解詳細
+    privacy_policy: 隱私權政策
+    see_whats_happening: 看看發生什麼事
+    server_stats: 伺服器統計:
     source_code: 原始碼
-    status_count_after: 狀態
+    status_count_after:
+      one: 條嘟文
+      other: 條嘟文
     status_count_before: 他們共嘟出了
+    tagline: 關注朋友並探索新朋友
     terms: 使用條款
-    user_count_after: 使用者
-    user_count_before: 這裡共註冊有
+    user_count_after:
+      one: 位使用者
+      other: 位使用者
+    user_count_before: 註冊使用者數
     what_is_mastodon: 什麼是 Mastodon?
   accounts:
+    choices_html: "%{name} 的選擇:"
     follow: 關注
-    followers: 關注者
+    followers:
+      one: 關注者
+      other: 關注者
     following: 正在關注
+    joined: 加入於 %{date}
+    last_active: 上次活躍時間
+    link_verified_on: 此連結的所有權已在 %{date} 檢查過
     media: 媒體
     moved_html: "%{name} 已經搬遷到 %{new_profile_link}:"
     network_hidden: 此訊息不可用
     nothing_here: 暫時沒有內容可供顯示!
     people_followed_by: "%{name} 關注的人"
     people_who_follow: 關注 %{name} 的人
-    posts: 嘟文
+    posts:
+      one: 嘟文
+      other: 嘟文
     posts_tab_heading: 嘟文
     posts_with_replies: 嘟文與回覆
-    reserved_username: 此用戶名已被保留
+    reserved_username: 此使用者名稱已被保留
     roles:
       admin: 管理員
       bot: 機器人
       moderator: 版主
     unfollow: 取消關注
   admin:
+    account_actions:
+      action: 執行動作
+      title: 在 %{acct} 執行管理員動作
     account_moderation_notes:
       create: 記錄
       created_msg: 已新增管理備忘!
       delete: 刪除
       destroyed_msg: 成功刪除管理備忘!
     accounts:
+      approve: 核准
       are_you_sure: 您確定嗎?
       avatar: 頭像
-      by_domain: 網域
+      by_domain: 站點
       change_email:
-        changed_msg: E-mail更改成功!
-        current_email: 目前的E-mail
-        label: 更改E-mail
-        new_email: 新的E-mail
-        submit: 更改E-mail
-        title: 為 %{username} 更改E-mail
+        changed_msg: 已成功變更帳戶電子信箱位址!
+        current_email: 目前的電子信箱位址
+        label: 變更電子信箱位址
+        new_email: 新的電子信箱位址
+        submit: 變更電子信箱位址
+        title: 為 %{username} 變更電子信箱位址
       confirm: 確定
       confirmed: 已確定
       confirming: 確定
+      deleted: 已刪除
       demote: 降級
       disable: 停用
       disable_two_factor_authentication: 停用兩階段認證
       disabled: 已停用
       display_name: 暱稱
-      domain: 網域
+      domain: 站點
       edit: 編輯
-      email: E-mail
-      email_status: E-mail狀態
+      email: 電子信箱位址
+      email_status: 電子信箱狀態
       enable: 啟用
       enabled: 已啟用
       feed_url: 訂閱 URL
       followers: 關注者
       followers_url: 關注者(Followers)URL
       follows: 正在關注
+      header: 開頭
       inbox_url: 收件箱 (Inbox) URL
+      invited_by: 邀請者
       ip: IP 位址
+      joined: 已加入
       location:
         all: 全部
         local: 本站
@@ -89,25 +120,31 @@ zh-TW:
       media_attachments: 多媒體附件
       memorialize: 設定為追悼帳戶
       moderation:
+        active: 活躍
         all: 全部
+        pending: 等待中
         silenced: 已靜音
         suspended: 已停權
         title: 版務
       moderation_notes: 管理備忘
       most_recent_activity: 最近活動
       most_recent_ip: 最近 IP 位址
+      no_limits_imposed: 未受限制
       not_subscribed: 未訂閱
       outbox_url: 寄件箱 (Outbox) URL
-      perform_full_suspension: 進行停權
+      pending: 等待審核中
+      perform_full_suspension: 停權
       profile_url: 個人檔案 URL
       promote: 晉級
       protocol: 協議
       public: 公開
       push_subscription_expires: PuSH 訂閱過期
-      redownload: 更新頭像
+      redownload: 重新整理個人資料
+      reject: 拒絕
       remove_avatar: 取消頭像
+      remove_header: 移除開頭
       resend_confirmation:
-        already_confirmed: 此用戶已被確認
+        already_confirmed: 此使用者已被確認
         send: 重新發送驗證信
         success: 驗證信發送成功!
       reset: 重設
@@ -118,34 +155,39 @@ zh-TW:
         admin: 管理員
         moderator: 版主
         staff: 管理人員
-        user: 普通用戶
+        user: 普通使用者
       salmon_url: Salmon 網址
       search: 搜尋
-      shared_inbox_url: 公共收件箱 (Shared Inbox) URL
+      shared_inbox_url: 共享收件箱網址
       show:
-        created_reports: 這個使用者提交的檢舉
-        targeted_reports: 針對這個使用者的檢舉
+        created_reports: 建立檢舉
+        targeted_reports: 由其他人檢舉
       silence: 靜音
+      silenced: 已靜音
       statuses: 嘟文
       subscribe: 訂閱
+      suspended: 已停權
       title: 帳戶
-      unconfirmed_email: 等待驗證的E-mail
+      unconfirmed_email: 未確認的電子信箱位址
       undo_silenced: 取消靜音
       undo_suspension: 取消停權
       unsubscribe: 取消訂閱
       username: 使用者名稱
+      warn: 警告
       web: 頁面
     action_logs:
       actions:
         assigned_to_self_report: "%{name} 接受了檢舉 %{target}"
-        change_email_user: "%{name} 更改了使用者 %{target} 的E-mail"
-        confirm_user: "%{name} 確認了使用者 %{target} 的E-mail"
+        change_email_user: "%{name} 變更了使用者 %{target} 的電子信箱位址"
+        confirm_user: "%{name} 確認了使用者 %{target} 的電子信箱位址"
+        create_account_warning: "%{name} 已對 %{target} 送出警告"
         create_custom_emoji: "%{name} 加入自訂表情符號 %{target}"
-        create_domain_block: "%{name} 封鎖了網域 %{target}"
-        create_email_domain_block: "%{name} 封鎖了E-mail %{target}"
+        create_domain_block: "%{name} 封鎖了站點 %{target}"
+        create_email_domain_block: "%{name} 封鎖了電子信箱網域 %{target}"
         demote_user: "%{name} 把使用者 %{target} 降級"
-        destroy_domain_block: "%{name} 取消了對網域 %{target} 的封鎖"
-        destroy_email_domain_block: "%{name} 取消了對E-mail %{target} 的封鎖"
+        destroy_custom_emoji: "%{name} 破壞了 %{target} 表情符號"
+        destroy_domain_block: "%{name} 取消了對站點 %{target} 的封鎖"
+        destroy_email_domain_block: "%{name} 取消了對電子信箱網域 %{target} 的封鎖"
         destroy_status: "%{name} 刪除了 %{target} 的嘟文"
         disable_2fa_user: "%{name} 停用了使用者 %{target} 的兩階段認證"
         disable_custom_emoji: "%{name} 停用了自訂表情符號 %{target}"
@@ -165,9 +207,10 @@ zh-TW:
         unsuspend_account: "%{name} 取消了使用者 %{target} 的停權狀態"
         update_custom_emoji: "%{name} 更新了自訂表情符號 %{target}"
         update_status: "%{name} 重整了 %{target} 的嘟文"
+      deleted_status: "(已刪除嘟文)"
       title: 營運日誌
     custom_emojis:
-      by_domain: 網域
+      by_domain: 站點
       copied_msg: 成功將表情複製到本地
       copy: 複製
       copy_failed_msg: 無法將表情複製到本地
@@ -191,42 +234,76 @@ zh-TW:
       update_failed_msg: 無法更新表情符號
       updated_msg: 已更新表情符號!
       upload: 上傳新的表情符號
+    dashboard:
+      backlog: 未處理工作數
+      config: 設定
+      feature_deletions: 帳戶刪除
+      feature_invites: 邀請連結
+      feature_profile_directory: 個人資料目錄
+      feature_registrations: 註冊
+      feature_relay: 聯邦中繼站
+      features: 功能
+      hidden_service: 與隱密服務互連
+      open_reports: 待處理檢舉數
+      recent_users: 最近加入的使用者
+      search: 全文搜尋
+      single_user_mode: 單一使用者模式
+      software: 軟體
+      space: 儲存空間用量
+      title: 儀表板
+      total_users: 總使用者數
+      trends: 趨勢
+      week_interactions: 本週互動次數
+      week_users_active: 本週活躍使用者數
+      week_users_new: 本週新使用者數
     domain_blocks:
-      add_new: 新增
-      created_msg: 正在進行網域封鎖
-      destroyed_msg: 已撤銷網域封鎖
-      domain: 網域
+      add_new: 新增欲封鎖域名
+      created_msg: 正在進行站點封鎖
+      destroyed_msg: 已撤銷站點封鎖
+      domain: 站點
       new:
         create: 新增封鎖
-        hint: 網域封鎖動作並不會阻止帳戶紀錄被新增至資料庫,但會自動回溯性地對那些帳戶套用特定管理設定。
+        hint: 站點封鎖動作並不會阻止帳戶紀錄被新增至資料庫,但會自動回溯性地對那些帳戶套用特定管理設定。
         severity:
-          desc_html: "「<strong>自動靜音</strong>」令該網域下使用者的嘟文,設定為只對關注者顯示,沒有關注的人會看不到。 「<strong>自動刪除</strong>」會刪除將該網域下使用者的嘟文、媒體檔案和個人資料。「<strong>無</strong>」則會拒絕接收來自該網域的媒體檔案。"
+          desc_html: "「<strong>靜音</strong>」令該站點下使用者的嘟文,設定為只對關注者顯示,沒有關注的人會看不到。「<strong>停權</strong>」會刪除將該站點下使用者的嘟文、媒體檔案和個人資料。「<strong>無</strong>」則會拒絕接收來自該站點的媒體檔案。"
           noop: 無
-          silence: 自動靜音
+          silence: 靜音
           suspend: 停權
-        title: 新增封鎖網域
+        title: 新增封鎖站點
       reject_media: 拒絕媒體檔案
-      reject_media_hint: 刪除本地緩存的媒體檔案,並且不再接收來自該網域的任何媒體檔案。與自動封鎖無關
+      reject_media_hint: 刪除本地快取的媒體檔案,並且不再接收來自該站點的任何媒體檔案。與停權無關
+      reject_reports: 拒絕檢舉
+      reject_reports_hint: 忽略所有來自此站點的檢舉。與停權無關
+      rejecting_media: 拒絕媒體檔案
+      rejecting_reports: 拒絕檢舉中
+      severity:
+        silence: 已靜音
+        suspend: 已停權
       show:
-        affected_accounts: 資料庫中有%{count}個使用者受影響
+        affected_accounts:
+          one: 將影響到資料庫中的 1 個帳戶
+          other: 將影響到資料庫中的 %{count} 個帳戶
         retroactive:
-          silence: 對此網域的所有使用者取消靜音
-          suspend: 對此網域的所有使用者取消封鎖
-        title: 撤銷 %{domain} 的網域封鎖
+          silence: 對此站點的所有使用者取消靜音
+          suspend: 對此站點的所有使用者取消停權
+        title: 撤銷 %{domain} 的站點封鎖
         undo: 撤銷
-      undo: 撤銷
+      undo: 復原欲封鎖域名
     email_domain_blocks:
       add_new: 加入新項目
-      created_msg: 已新增E-mail封鎖
+      created_msg: 已成功將電子信箱網域加入黑名單
       delete: 刪除
-      destroyed_msg: 已刪除E-mail封鎖
-      domain: 網域
+      destroyed_msg: 已成功從黑名單刪除電子信箱網域
+      domain: 站點
       new:
-        create: 新增網域
-        title: 新增E-mail封鎖
-      title: E-mail封鎖
+        create: 新增站點
+        title: 新增電子信箱黑名單項目
+      title: 電子信箱黑名單
+    followers:
+      back_to_account: 返回帳戶
+      title: "%{acct} 的關注者"
     instances:
-      title: 已知站點
+      title: 聯邦
     invites:
       filter:
         all: 全部
@@ -234,6 +311,8 @@ zh-TW:
         expired: 已失效
         title: 篩選
       title: 邀請使用者
+    relays:
+      description_html: "<strong>聯邦中繼站</strong> 是種中繼伺服器,會在訂閱並推送至此中繼站的伺服器之間交換大量的公開嘟文。<strong>中繼站也能協助小型或中型伺服器從聯邦中探索內容</strong>,而無須本地使用者手動關注遠端伺服器的其他使用者。"
     report_notes:
       created_msg: 檢舉記錄建立成功!
       destroyed_msg: 檢舉記錄刪除成功!
@@ -262,7 +341,7 @@ zh-TW:
       reported_by: 檢舉人
       resolved: 已解決
       resolved_msg: 檢舉已處理!
-      status: 狀態
+      status: 嘟文
       title: 檢舉
       unassign: 取消指派
       unresolved: 未解決
@@ -272,17 +351,17 @@ zh-TW:
         desc_html: 本站使用者發佈的嘟文數量,以及本站的活躍使用者與一週內新使用者數量
         title: 公開使用者活躍度的統計數據
       bootstrap_timeline_accounts:
-        desc_html: 以半形逗號分隔多個使用者名。只能加入來自本站且未開啟保護的帳號。如果留空,則預設關注本站所有管理員。
+        desc_html: 以半形逗號分隔多個使用者名。只能加入來自本站且未開啟保護的帳戶。如果留空,則預設關注本站所有管理員。
         title: 新使用者預設關注
       contact_information:
-        email: 請輸入一個公開E-mail
+        email: 用於聯絡的公開電子信箱位址
         username: 請輸入使用者名稱
       hero:
-        desc_html: 在首頁顯示。推薦最小 600x100px。如果留空,就會預設為站點預覽圖
+        desc_html: 在首頁顯示。推薦最小 600x100px。如果留空,就會重設回伺服器預覽圖
         title: 主題圖片
       peers_api_enabled:
-        desc_html: 現在本站點在網路中已發現的網域
-        title: 公開已知站點的列表
+        desc_html: 本伺服器在聯邦中發現的站點
+        title: 發布已知伺服器的列表
       registrations:
         closed_message:
           desc_html: 關閉註冊時顯示在首頁的內容,可使用 HTML 標籤
@@ -300,18 +379,18 @@ zh-TW:
         desc_html: 在個人資料頁面上顯示管理人員標誌
         title: 顯示管理人員標誌
       site_description:
-        desc_html: "</code>在首頁顯示,及在 meta 標籤中的站點簡介。可以使用 HTML 標籤,包括 <code>&lt;a&gt;</code> 和 <code>&lt;em&gt;</code>。"
-        title: 站點描述
+        desc_html: 首頁上的介紹文字,描述此 Mastodon 伺服器的特別之處和其他重要資訊。可使用 HTML 標籤,包括 <code>&lt;a&gt;</code> 和 <code>&lt;em&gt;</code>。
+        title: 伺服器描述
       site_description_extended:
-        desc_html: 顯示在資訊頁的長版描述,可使用 HTML 標籤
+        desc_html: 可放置行為準則、規定以及其他此伺服器特有的內容。可使用 HTML 標籤
         title: 本站詳細資訊
       site_terms:
         desc_html: 可以填寫自己的隱私權政策、使用條款或其他法律文本。可以使用 HTML 標籤
         title: 自訂使用條款
-      site_title: 站點名稱
+      site_title: 伺服器名稱
       thumbnail:
         desc_html: 用於在 OpenGraph 和 API 中顯示預覽圖。推薦大小 1200×630px
-        title: 本站縮圖
+        title: 伺服器縮圖
       timeline_preview:
         desc_html: 在主頁顯示本站時間軸
         title: 時間軸預覽
@@ -342,9 +421,9 @@ zh-TW:
       body_remote: 來自 %{domain} 的使用者檢舉了使用者 %{target}
       subject: 來自 %{instance} 的使用者檢舉(#%{id})
   application_mailer:
-    notification_preferences: 更改E-mail設定
-    salutation: "%{name},"
-    settings: 修改E-mail設定︰ %{link}
+    notification_preferences: 變更電子信件設定
+    salutation: "%{name}、"
+    settings: 變更電子信箱設定︰%{link}
     view: '進入瀏覽:'
     view_profile: 檢視個人資料頁
     view_status: 檢視嘟文
@@ -357,9 +436,9 @@ zh-TW:
     warning: 警告,不要把它分享給任何人!
     your_token: 你的 token
   auth:
-    agreement_html: 註冊即表示你同意遵守<a href="%{rules_path}">本站點的規則</a>和<a href="%{terms_path}">使用條款</a>。
+    agreement_html: 按下下方的「註冊」即代表同意遵守 <a href="%{rules_path}">此伺服器的規則</a> 以及 <a href="%{terms_path}">使用條款</a>。
     change_password: 密碼
-    confirm_email: 確認E-mail
+    confirm_email: 確認電子信箱位址
     delete_account: 刪除帳戶
     delete_account_html: 如果你想刪除你的帳戶,請<a href="%{path}">點擊這裡繼續</a>。你需要確認你的操作。
     didnt_get_confirmation: 沒有收到驗證信?
@@ -367,14 +446,14 @@ zh-TW:
     invalid_reset_password_token: 密碼重設 token 無效或已過期。請重新設定密碼。
     login: 登入
     logout: 登出
-    migrate_account: 轉移到另一個帳號
+    migrate_account: 轉移到另一個帳戶
     migrate_account_html: 如果你希望引導他人關注另一個帳戶,請<a href="%{path}">到這裡設定</a>。
     or_log_in_with: 或透過其他方式登入
     providers:
       cas: CAS
       saml: SAML
     register: 註冊
-    resend_confirmation: 重新寄送E-mail
+    resend_confirmation: 重新寄送確認指引
     reset_password: 重設密碼
     security: 登入資訊
     set_new_password: 設定新密碼
@@ -406,15 +485,15 @@ zh-TW:
   deletes:
     bad_password_msg: 想得美,駭客! 密碼輸入錯誤
     confirm_password: 輸入你現在的密碼來驗證身份
-    description_html: 繼續操作將會<strong>永久地、不可還原地</strong>刪除帳戶中的所有內容,然後凍結帳戶。你的用戶名將會被保留,以防有人冒用你的身份。
+    description_html: 繼續操作將會<strong>永久地、不可還原地</strong>刪除帳戶中的所有內容,然後凍結帳戶。你的使用者名稱將會被保留,以防有人冒用你的身份。
     proceed: 刪除帳戶
     success_msg: 你的帳戶已經成功刪除
-    warning_html: 我們只能保證本站點上的內容將會被徹底刪除。對於已經被廣泛傳播的內容,它們在本站點以外的某些地方可能仍然可見。此外,失去連接的站點以及停止接收訂閱的站點所儲存的數據亦無法刪除。
+    warning_html: 我們只能保證本伺服器上的內容將會被徹底刪除。對於已經被廣泛傳播的內容,它們在本伺服器以外的某些地方可能仍然可見。此外,離線伺服器以及停止接收訂閱的伺服器所儲存的資料亦無法刪除。
     warning_title: 關於已傳播的內容警告
   errors:
     '403': 你沒有觀看這個頁面的權限。
     '404': 您所尋找的網頁不存在。
-    '410': 您所尋找的網頁已不存在。
+    '410': 您所尋找的網頁此處已不存在。
     '422':
       content: 安全驗證失敗。請確定有開啟瀏覽器 Cookies 功能?
       title: 安全驗證失敗
@@ -441,7 +520,7 @@ zh-TW:
     save_changes: 儲存修改
     validation_errors: 送出的資料有 %{count} 個問題
   imports:
-    preface: 您可以在此匯入您在其他站點所匯出的資料檔,包括關注的使用者、封鎖的使用者名單。
+    preface: 您可以在此匯入您在其他伺服器所匯出的資料檔,包括關注的使用者、封鎖的使用者名單。
     success: 資料檔上傳成功,正在匯入,請稍候
     types:
       blocking: 您封鎖的使用者名單
@@ -464,7 +543,7 @@ zh-TW:
     invited_by: 你的邀請人是:
     max_uses: "%{count} 次"
     max_uses_prompt: 無限制
-    prompt: 建立分享連結,邀請他人在本站點註冊
+    prompt: 建立分享連結,邀請他人在本伺服器註冊
     table:
       expires_at: 失效時間
       uses: 已使用次數
@@ -536,7 +615,7 @@ zh-TW:
     publishing: 發佈
     web: 站內
   remote_follow:
-    acct: 請輸入您的︰使用者名稱@站點網域
+    acct: 請輸入您的使用者名稱@站點網域
     missing_resource: 無法找到資源
     proceed: 下一步
     prompt: '您希望關注:'
@@ -567,7 +646,7 @@ zh-TW:
       weibo: 新浪微博
     current_session: 目前的 session
     description: "%{platform} 上的 %{browser}"
-    explanation: 這些是現在正登入於你的 Mastodon 帳號的瀏覽器。
+    explanation: 這些是現在正登入於你的 Mastodon 帳戶的瀏覽器。
     ip: IP 位址
     platforms:
       adobe_air: ''
@@ -623,8 +702,8 @@ zh-TW:
   terms:
     title: "%{instance} 使用條款和隱私權政策"
   themes:
-    contrast: 高對比
-    mastodon-light: Mastodon (亮色主題)
+    contrast: Mastodon(高對比)
+    mastodon-light: Mastodon(亮色主題)
   time:
     formats:
       default: "%Y年%-m月%d日 %H:%M"
@@ -646,18 +725,18 @@ zh-TW:
     wrong_code: 您輸入的認證碼無效! 請確認伺服器時間與設備時間是否正確?
   user_mailer:
     backup_ready:
-      explanation: 你要求的 Mastodon 帳號完整備份檔案現已就緒,可供下載!
+      explanation: 你要求的 Mastodon 帳戶完整備份檔案現已就緒,可供下載!
       subject: 你的備份檔已可供下載
       title: 檔案匯出
     welcome:
       edit_profile_action: 設定個人資料
-      edit_profile_step: 你可以設定你的個人資料,包括上傳頭像、橫幅圖片、更改顯示名稱等等。如果你想在新的關注者關注你之前對他們進行審核,你也可以選擇為你的帳戶設為「私人」。
+      edit_profile_step: 你可以設定你的個人資料,包括上傳頭像、橫幅圖片、變更顯示名稱等等。如果你想在新的關注者關注你之前對他們進行審核,你也可以選擇為你的帳戶設為「私人」。
       explanation: 下面是幾個小幫助,希望它們能幫到你
       final_action: 開始嘟嘟
       final_step: '開始嘟嘟吧! 即使你現在沒有關注者,其他人仍然能在本站時間軸或著話題標籤等地方看到你的公開嘟文。試著用 #introductions 這個話題標籤介紹一下自己吧。'
       full_handle: 你的完整帳戶名稱
-      full_handle_hint: 你需要把這個告訴你的朋友們,這樣他們就能從另一個站點向你發送訊息或著關注你。
-      review_preferences_action: 更改偏好設定
+      full_handle_hint: 你需要把這告訴你的朋友們,這樣他們就能從另一個伺服器向你發送訊息或著關注你。
+      review_preferences_action: 變更偏好設定
       review_preferences_step: 記得調整你的偏好設定,比如你想接收什麼類型的電子郵件,或著你想把你的嘟文可見範圍預設設定什麼級別。如果你沒有暈車的話,考慮一下啟用「自動播放 GIF 動畫」這個選項吧。
       subject: 歡迎來到 Mastodon
       tip_federated_timeline: 跨站公共時間軸可以讓你一窺更廣闊的 Mastodon 網路。不過,由於它們只顯示你的鄰居們所訂閱的內容,所以並不是全部。
@@ -667,7 +746,7 @@ zh-TW:
       tips: 小幫手
       title: "%{name} 歡迎你的加入!"
   users:
-    invalid_email: E-mail格式不正確
+    invalid_email: 電子信箱位址不正確
     invalid_otp_token: 兩階段認證碼不正確
     otp_lost_help_html: 如果你無法訪問這兩者,可以通過 %{email} 與我們聯繫
     seamless_external_login: 由於你是從外部系統登入,所以不能設定密碼與電子郵件。
diff --git a/config/navigation.rb b/config/navigation.rb
index 86c2572d7..34b566188 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -14,7 +14,7 @@ SimpleNavigation::Configuration.run do |navigation|
       settings.item :import, safe_join([fa_icon('cloud-upload fw'), t('settings.import')]), settings_import_url
       settings.item :export, safe_join([fa_icon('cloud-download fw'), t('settings.export')]), settings_export_url
       settings.item :authorized_apps, safe_join([fa_icon('list fw'), t('settings.authorized_apps')]), oauth_authorized_applications_url
-      settings.item :identity_proofs, safe_join([fa_icon('key fw'), t('settings.identity_proofs')]), settings_identity_proofs_path, highlights_on: %r{/settings/identity_proofs*}
+      settings.item :identity_proofs, safe_join([fa_icon('key fw'), t('settings.identity_proofs')]), settings_identity_proofs_path, highlights_on: %r{/settings/identity_proofs*}, if: proc { current_account.identity_proofs.exists? }
     end
 
     primary.item :flavours, safe_join([fa_icon('paint-brush fw'), t('settings.flavours')]), settings_flavours_url do |flavours|
@@ -43,7 +43,7 @@ SimpleNavigation::Configuration.run do |navigation|
 
     primary.item :admin, safe_join([fa_icon('cogs fw'), t('admin.title')]), admin_dashboard_url, if: proc { current_user.staff? } do |admin|
       admin.item :dashboard, safe_join([fa_icon('tachometer fw'), t('admin.dashboard.title')]), admin_dashboard_url
-      admin.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), edit_admin_settings_url, if: -> { current_user.admin? }
+      admin.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), edit_admin_settings_url, if: -> { current_user.admin? }, highlights_on: %r{/admin/settings}
       admin.item :custom_emojis, safe_join([fa_icon('smile-o fw'), t('admin.custom_emojis.title')]), admin_custom_emojis_url, highlights_on: %r{/admin/custom_emojis}
       admin.item :relays, safe_join([fa_icon('exchange fw'), t('admin.relays.title')]), admin_relays_url, if: -> { current_user.admin? }, highlights_on: %r{/admin/relays}
       admin.item :subscriptions, safe_join([fa_icon('paper-plane-o fw'), t('admin.subscriptions.title')]), admin_subscriptions_url, if: -> { current_user.admin? }
diff --git a/config/routes.rb b/config/routes.rb
index 24e1f8e16..5a51cc6e8 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -366,6 +366,7 @@ Rails.application.routes.draw do
         resources :followers, only: :index, controller: 'accounts/follower_accounts'
         resources :following, only: :index, controller: 'accounts/following_accounts'
         resources :lists, only: :index, controller: 'accounts/lists'
+        resources :identity_proofs, only: :index, controller: 'accounts/identity_proofs'
 
         member do
           post :follow
diff --git a/config/webpack/rules/node_modules.js b/config/webpack/rules/node_modules.js
index 5debc1b5d..7ed05504b 100644
--- a/config/webpack/rules/node_modules.js
+++ b/config/webpack/rules/node_modules.js
@@ -11,16 +11,7 @@ module.exports = {
       options: {
         babelrc: false,
         plugins: [
-          [
-            'transform-react-remove-prop-types',
-            {
-              mode: 'remove',
-              removeImport: true,
-              additionalLibraries: [
-                '../../utils/shared-props', // emoji-mart
-              ],
-            },
-          ],
+          'transform-react-remove-prop-types',
         ],
         cacheDirectory: join(settings.cache_path, 'babel-loader-node-modules'),
         cacheCompression: env.NODE_ENV === 'production',
diff --git a/dist/nginx.conf b/dist/nginx.conf
index 3d5741765..7c429bad4 100644
--- a/dist/nginx.conf
+++ b/dist/nginx.conf
@@ -78,6 +78,7 @@ server {
 
     proxy_cache CACHE;
     proxy_cache_valid 200 7d;
+    proxy_cache_valid 410 24h;
     proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
     add_header X-Cached $upstream_cache_status;
     add_header Strict-Transport-Security "max-age=31536000";
diff --git a/lib/cli.rb b/lib/cli.rb
index 59f0f3076..b56c6e76f 100644
--- a/lib/cli.rb
+++ b/lib/cli.rb
@@ -5,6 +5,7 @@ require_relative 'mastodon/media_cli'
 require_relative 'mastodon/emoji_cli'
 require_relative 'mastodon/accounts_cli'
 require_relative 'mastodon/feeds_cli'
+require_relative 'mastodon/search_cli'
 require_relative 'mastodon/settings_cli'
 require_relative 'mastodon/statuses_cli'
 require_relative 'mastodon/domains_cli'
@@ -28,6 +29,9 @@ module Mastodon
     desc 'feeds SUBCOMMAND ...ARGS', 'Manage feeds'
     subcommand 'feeds', Mastodon::FeedsCLI
 
+    desc 'search SUBCOMMAND ...ARGS', 'Manage the search engine'
+    subcommand 'search', Mastodon::SearchCLI
+
     desc 'settings SUBCOMMAND ...ARGS', 'Manage dynamic settings'
     subcommand 'settings', Mastodon::SettingsCLI
 
@@ -37,6 +41,79 @@ module Mastodon
     desc 'domains SUBCOMMAND ...ARGS', 'Manage account domains'
     subcommand 'domains', Mastodon::DomainsCLI
 
+    option :dry_run, type: :boolean
+    desc 'self-destruct', 'Erase the server from the federation'
+    long_desc <<~LONG_DESC
+      Erase the server from the federation by broadcasting account delete
+      activities to all known other servers. This allows a "clean exit" from
+      running a Mastodon server, as it leaves next to no cache behind on
+      other servers.
+
+      This command is always interactive and requires confirmation twice.
+
+      No local data is actually deleted, because emptying the
+      database or removing files is much faster through other, external
+      means, such as e.g. deleting the entire VPS. However, because other
+      servers will delete data about local users, but no local data will be
+      updated (such as e.g. followers), there will be a state mismatch
+      that will lead to glitches and issues if you then continue to run and use
+      the server.
+
+      So either you know exactly what you are doing, or you are starting
+      from a blank slate afterwards by manually clearing out all the local
+      data!
+    LONG_DESC
+    def self_destruct
+      require 'tty-prompt'
+
+      prompt = TTY::Prompt.new
+
+      exit(1) unless prompt.ask('Type in the domain of the server to confirm:', required: true) == Rails.configuration.x.local_domain
+
+      prompt.warn('This operation WILL NOT be reversible. It can also take a long time.')
+      prompt.warn('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.')
+      prompt.warn('A running Sidekiq process is required. Do not shut it down until queues clear.')
+
+      exit(1) if prompt.no?('Are you sure you want to proceed?')
+
+      inboxes   = Account.inboxes
+      processed = 0
+      dry_run   = options[:dry_run] ? ' (DRY RUN)' : ''
+
+      if inboxes.empty?
+        prompt.ok('It seems like your server has not federated with anything')
+        prompt.ok('You can shut it down and delete it any time')
+        return
+      end
+
+      prompt.warn('Do NOT interrupt this process...')
+
+      Account.local.without_suspended.find_each do |account|
+        payload = ActiveModelSerializers::SerializableResource.new(
+          account,
+          serializer: ActivityPub::DeleteActorSerializer,
+          adapter: ActivityPub::Adapter
+        ).as_json
+
+        json = Oj.dump(ActivityPub::LinkedDataSignature.new(payload).sign!(account))
+
+        unless options[:dry_run]
+          ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url|
+            [json, account.id, inbox_url]
+          end
+
+          account.update_column(:suspended, true)
+        end
+
+        processed += 1
+      end
+
+      prompt.ok("Queued #{inboxes.size * processed} items into Sidekiq for #{processed} accounts#{dry_run}")
+      prompt.ok('Wait until Sidekiq processes all items, then you can shut everything down and delete the data')
+    rescue TTY::Reader::InputInterrupt
+      exit(1)
+    end
+
     map %w(--version -v) => :version
 
     desc 'version', 'Show version'
diff --git a/lib/mastodon/search_cli.rb b/lib/mastodon/search_cli.rb
new file mode 100644
index 000000000..42ad93f1e
--- /dev/null
+++ b/lib/mastodon/search_cli.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require_relative '../../config/boot'
+require_relative '../../config/environment'
+require_relative 'cli_helper'
+
+module Mastodon
+  class SearchCLI < Thor
+    desc 'deploy', 'Create or update an ElasticSearch index and populate it'
+    long_desc <<~LONG_DESC
+      If ElasticSearch is empty, this command will create the necessary indices
+      and then import data from the database into those indices.
+
+      This command will also upgrade indices if the underlying schema has been
+      changed since the last run.
+    LONG_DESC
+    def deploy
+      processed = Chewy::RakeHelper.upgrade
+      Chewy::RakeHelper.sync(except: processed)
+    end
+  end
+end
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index b35dd0561..c728b3ab2 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -9,11 +9,11 @@ module Mastodon
     end
 
     def minor
-      7
+      8
     end
 
     def patch
-      4
+      0
     end
 
     def pre
@@ -21,7 +21,7 @@ module Mastodon
     end
 
     def flags
-      ''
+      'rc1'
     end
 
     def to_a
diff --git a/package.json b/package.json
index 0225f68da..b5963acd4 100644
--- a/package.json
+++ b/package.json
@@ -87,7 +87,7 @@
     "cssnano": "^4.1.10",
     "detect-passive-events": "^1.0.2",
     "dotenv": "^6.2.0",
-    "emoji-mart": "^2.10.0",
+    "emoji-mart": "Gargron/emoji-mart#build",
     "es6-symbol": "^3.1.1",
     "escape-html": "^1.0.3",
     "exif-js": "^2.3.0",
diff --git a/spec/controllers/admin/settings_controller_spec.rb b/spec/controllers/admin/settings_controller_spec.rb
index 34f6bbdae..6cf0ee20a 100644
--- a/spec/controllers/admin/settings_controller_spec.rb
+++ b/spec/controllers/admin/settings_controller_spec.rb
@@ -19,6 +19,10 @@ RSpec.describe Admin::SettingsController, type: :controller do
     end
 
     describe 'PUT #update' do
+      before do
+        allow_any_instance_of(Form::AdminSettings).to receive(:valid?).and_return(true)
+      end
+
       describe 'for a record that doesnt exist' do
         around do |example|
           before = Setting.site_extended_description
diff --git a/spec/controllers/settings/identity_proofs_controller_spec.rb b/spec/controllers/settings/identity_proofs_controller_spec.rb
index 46af3ccf4..5c05eb83c 100644
--- a/spec/controllers/settings/identity_proofs_controller_spec.rb
+++ b/spec/controllers/settings/identity_proofs_controller_spec.rb
@@ -1,6 +1,7 @@
 require 'rails_helper'
 
 describe Settings::IdentityProofsController do
+  include RoutingHelper
   render_views
 
   let(:user) { Fabricate(:user) }
@@ -9,8 +10,15 @@ describe Settings::IdentityProofsController do
   let(:provider) { 'keybase' }
   let(:findable_id) { Faker::Number.number(5) }
   let(:unfindable_id) { Faker::Number.number(5) }
+  let(:new_proof_params) do
+    { provider: provider, provider_username: kbname, token: valid_token, username: user.account.username }
+  end
+  let(:status_text) { "i just proved that i am also #{kbname} on #{provider}." }
+  let(:status_posting_params) do
+    { post_status: '0', status_text: status_text }
+  end
   let(:postable_params) do
-    { account_identity_proof: { provider: provider, provider_username: kbname, token: valid_token } }
+    { account_identity_proof: new_proof_params.merge(status_posting_params) }
   end
 
   before do
@@ -19,10 +27,32 @@ describe Settings::IdentityProofsController do
   end
 
   describe 'new proof creation' do
-    context 'GET #new with no existing proofs' do
-      it 'redirects to :index' do
-        get :new
-        expect(response).to redirect_to settings_identity_proofs_path
+    context 'GET #new' do
+      context 'with all of the correct params' do
+        before do
+          allow_any_instance_of(ProofProvider::Keybase::Badge).to receive(:avatar_url) { full_pack_url('media/images/void.png') }
+        end
+
+        it 'renders the template' do
+          get :new, params: new_proof_params
+          expect(response).to render_template(:new)
+        end
+      end
+
+      context 'without any params' do
+        it 'redirects to :index' do
+          get :new, params: {}
+          expect(response).to redirect_to settings_identity_proofs_path
+        end
+      end
+
+      context 'with params to prove a different, not logged-in user' do
+        let(:wrong_user_params) { new_proof_params.merge(username: 'someone_else') }
+
+        it 'shows a helpful alert' do
+          get :new, params: wrong_user_params
+          expect(flash[:alert]).to eq I18n.t('identity_proofs.errors.wrong_user', proving: 'someone_else', current: user.account.username)
+        end
       end
     end
 
@@ -44,6 +74,23 @@ describe Settings::IdentityProofsController do
           post :create, params: postable_params
           expect(response).to redirect_to root_url
         end
+
+        it 'does not post a status' do
+          expect(PostStatusService).not_to receive(:new)
+          post :create, params: postable_params
+        end
+
+        context 'and the user has requested to post a status' do
+          let(:postable_params_with_status) do
+            postable_params.tap { |p| p[:account_identity_proof][:post_status] = '1' }
+          end
+
+          it 'posts a status' do
+            expect_any_instance_of(PostStatusService).to receive(:call).with(user.account, text: status_text)
+
+            post :create, params: postable_params_with_status
+          end
+        end
       end
 
       context 'when saving fails' do
diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb
index 3a1463d95..412609de4 100644
--- a/spec/lib/activitypub/activity/create_spec.rb
+++ b/spec/lib/activitypub/activity/create_spec.rb
@@ -464,7 +464,7 @@ RSpec.describe ActivityPub::Activity::Create do
 
       context 'when a vote to a local poll' do
         let(:poll) { Fabricate(:poll, options: %w(Yellow Blue)) }
-        let!(:local_status) { Fabricate(:status, owned_poll: poll) }
+        let!(:local_status) { Fabricate(:status, poll: poll) }
 
         let(:object_json) do
           {
@@ -489,7 +489,7 @@ RSpec.describe ActivityPub::Activity::Create do
           poll.save(validate: false)
           poll
         end
-        let!(:local_status) { Fabricate(:status, owned_poll: poll) }
+        let!(:local_status) { Fabricate(:status, poll: poll) }
 
         let(:object_json) do
           {
diff --git a/spec/lib/activitypub/adapter_spec.rb b/spec/lib/activitypub/adapter_spec.rb
new file mode 100644
index 000000000..ea03797aa
--- /dev/null
+++ b/spec/lib/activitypub/adapter_spec.rb
@@ -0,0 +1,88 @@
+require 'rails_helper'
+
+RSpec.describe ActivityPub::Adapter do
+  class TestObject < ActiveModelSerializers::Model
+    attributes :foo
+  end
+
+  class TestWithBasicContextSerializer < ActivityPub::Serializer
+    attributes :foo
+  end
+
+  class TestWithNamedContextSerializer < ActivityPub::Serializer
+    context :security
+    attributes :foo
+  end
+
+  class TestWithNestedNamedContextSerializer < ActivityPub::Serializer
+    attributes :foo
+
+    has_one :virtual_object, key: :baz, serializer: TestWithNamedContextSerializer
+
+    def virtual_object
+      object
+    end
+  end
+
+  class TestWithContextExtensionSerializer < ActivityPub::Serializer
+    context_extensions :sensitive
+    attributes :foo
+  end
+
+  class TestWithNestedContextExtensionSerializer < ActivityPub::Serializer
+    context_extensions :manually_approves_followers
+    attributes :foo
+
+    has_one :virtual_object, key: :baz, serializer: TestWithContextExtensionSerializer
+
+    def virtual_object
+      object
+    end
+  end
+
+  describe '#serializable_hash' do
+    let(:serializer_class) {}
+
+    subject { ActiveModelSerializers::SerializableResource.new(TestObject.new(foo: 'bar'), serializer: serializer_class, adapter: described_class).as_json }
+
+    context 'when serializer defines no context' do
+      let(:serializer_class) { TestWithBasicContextSerializer }
+
+      it 'renders a basic @context' do
+        expect(subject).to include({ '@context' => 'https://www.w3.org/ns/activitystreams' })
+      end
+    end
+
+    context 'when serializer defines a named context' do
+      let(:serializer_class) { TestWithNamedContextSerializer }
+
+      it 'renders a @context with both items' do
+        expect(subject).to include({ '@context' => ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] })
+      end
+    end
+
+    context 'when serializer has children that define a named context' do
+      let(:serializer_class) { TestWithNestedNamedContextSerializer }
+
+      it 'renders a @context with both items' do
+        expect(subject).to include({ '@context' => ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] })
+      end
+    end
+
+    context 'when serializer defines context extensions' do
+      let(:serializer_class) { TestWithContextExtensionSerializer }
+
+      it 'renders a @context with the extension' do
+        expect(subject).to include({ '@context' => ['https://www.w3.org/ns/activitystreams', { 'sensitive' => 'as:sensitive' }] })
+      end
+    end
+
+    context 'when serializer has children that define context extensions' do
+      let(:serializer_class) { TestWithNestedContextExtensionSerializer }
+
+      it 'renders a @context with both extensions' do
+        expect(subject).to include({ '@context' => ['https://www.w3.org/ns/activitystreams', { 'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers', 'sensitive' => 'as:sensitive' }] })
+      end
+    end
+  end
+end
diff --git a/spec/services/activitypub/process_account_service_spec.rb b/spec/services/activitypub/process_account_service_spec.rb
index d3318b2ed..5141e3f16 100644
--- a/spec/services/activitypub/process_account_service_spec.rb
+++ b/spec/services/activitypub/process_account_service_spec.rb
@@ -28,4 +28,49 @@ RSpec.describe ActivityPub::ProcessAccountService, type: :service do
       expect(account.fields[1].value).to eq 'Unit test'
     end
   end
+
+  context 'identity proofs' do
+    let(:payload) do
+      {
+        id: 'https://foo.test',
+        type: 'Actor',
+        inbox: 'https://foo.test/inbox',
+        attachment: [
+          { type: 'IdentityProof', name: 'Alice', signatureAlgorithm: 'keybase', signatureValue: 'a' * 66 },
+        ],
+      }.with_indifferent_access
+    end
+
+    it 'parses out of attachment' do
+      allow(ProofProvider::Keybase::Worker).to receive(:perform_async)
+
+      account = subject.call('alice', 'example.com', payload)
+
+      expect(account.identity_proofs.count).to eq 1
+
+      proof = account.identity_proofs.first
+
+      expect(proof.provider).to eq 'keybase'
+      expect(proof.provider_username).to eq 'Alice'
+      expect(proof.token).to eq 'a' * 66
+    end
+
+    it 'removes no longer present proofs' do
+      allow(ProofProvider::Keybase::Worker).to receive(:perform_async)
+
+      account   = Fabricate(:account, username: 'alice', domain: 'example.com')
+      old_proof = Fabricate(:account_identity_proof, account: account, provider: 'keybase', provider_username: 'Bob', token: 'b' * 66)
+
+      subject.call('alice', 'example.com', payload)
+
+      expect(account.identity_proofs.count).to eq 1
+      expect(account.identity_proofs.find_by(id: old_proof.id)).to be_nil
+    end
+
+    it 'queues a validity check on the proof' do
+      allow(ProofProvider::Keybase::Worker).to receive(:perform_async)
+      account = subject.call('alice', 'example.com', payload)
+      expect(ProofProvider::Keybase::Worker).to have_received(:perform_async)
+    end
+  end
 end
diff --git a/yarn.lock b/yarn.lock
index 22f8abd48..11fe49fa6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3177,12 +3177,9 @@ elliptic@^6.0.0:
     minimalistic-assert "^1.0.0"
     minimalistic-crypto-utils "^1.0.0"
 
-emoji-mart@^2.10.0:
-  version "2.10.0"
-  resolved "https://registry.yarnpkg.com/emoji-mart/-/emoji-mart-2.10.0.tgz#e1adec430f4963f79055b12b80e6d60c5abb742d"
-  integrity sha512-VhcX463f8TDaQc1Tpc8rI31E15+8KXOYff1vwjokjMT52bZlCQCyq3zrnNScSYjv95f1+R4DMMreeuPvYFvOhg==
-  dependencies:
-    prop-types "^15.6.0"
+emoji-mart@Gargron/emoji-mart#build:
+  version "2.6.2"
+  resolved "https://codeload.github.com/Gargron/emoji-mart/tar.gz/ff00dc470b5b2d9f145a6d6e977a54de5df2b4c9"
 
 emoji-regex@^6.5.1:
   version "6.5.1"