about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.devcontainer/Dockerfile2
-rw-r--r--.devcontainer/devcontainer.json10
-rw-r--r--.devcontainer/docker-compose.yml4
-rwxr-xr-x.devcontainer/post-create.sh21
-rw-r--r--.env.production.sample2
-rw-r--r--.eslintrc.js16
-rw-r--r--.nvmrc2
-rw-r--r--.prettierignore7
-rw-r--r--.rubocop.yml200
-rw-r--r--Aptfile22
-rw-r--r--CODE_OF_CONDUCT.md6
-rw-r--r--CONTRIBUTING.md6
-rw-r--r--Dockerfile7
-rw-r--r--Gemfile26
-rw-r--r--Gemfile.lock91
-rw-r--r--app/controllers/admin/domain_blocks_controller.rb8
-rw-r--r--app/controllers/admin/instances_controller.rb2
-rw-r--r--app/controllers/admin/relays_controller.rb6
-rw-r--r--app/controllers/api/base_controller.rb20
-rw-r--r--app/controllers/api/v1/accounts/credentials_controller.rb12
-rw-r--r--app/controllers/api/v1/admin/domain_blocks_controller.rb6
-rw-r--r--app/controllers/api/v1/notifications_controller.rb2
-rw-r--r--app/controllers/auth/passwords_controller.rb2
-rw-r--r--app/controllers/auth/registrations_controller.rb4
-rw-r--r--app/controllers/concerns/rate_limit_headers.rb2
-rw-r--r--app/controllers/concerns/signature_verification.rb4
-rw-r--r--app/controllers/concerns/web_app_controller_concern.rb9
-rw-r--r--app/controllers/follower_accounts_controller.rb2
-rw-r--r--app/controllers/following_accounts_controller.rb2
-rw-r--r--app/controllers/media_controller.rb4
-rw-r--r--app/controllers/statuses_controller.rb4
-rw-r--r--app/controllers/tags_controller.rb2
-rw-r--r--app/helpers/formatting_helper.rb25
-rw-r--r--app/helpers/languages_helper.rb3
-rw-r--r--app/helpers/statuses_helper.rb2
-rw-r--r--app/javascript/core/admin.js2
-rw-r--r--app/javascript/flavours/glitch/actions/announcements.js4
-rw-r--r--app/javascript/flavours/glitch/actions/dropdown_menu.js4
-rw-r--r--app/javascript/flavours/glitch/components/dropdown_menu.js102
-rw-r--r--app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js5
-rw-r--r--app/javascript/flavours/glitch/components/icon_button.js4
-rw-r--r--app/javascript/flavours/glitch/components/media_gallery.js2
-rw-r--r--app/javascript/flavours/glitch/components/status.js8
-rw-r--r--app/javascript/flavours/glitch/components/status_action_bar.js43
-rw-r--r--app/javascript/flavours/glitch/containers/dropdown_menu_container.js5
-rw-r--r--app/javascript/flavours/glitch/containers/mastodon.js5
-rw-r--r--app/javascript/flavours/glitch/containers/status_container.js9
-rw-r--r--app/javascript/flavours/glitch/extra_polyfills.js3
-rw-r--r--app/javascript/flavours/glitch/features/account/components/follow_request_note.js37
-rw-r--r--app/javascript/flavours/glitch/features/account/components/header.js21
-rw-r--r--app/javascript/flavours/glitch/features/account/containers/follow_request_note_container.js15
-rw-r--r--app/javascript/flavours/glitch/features/account_gallery/components/media_item.js1
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/compose_form.js2
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/dropdown.js47
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/dropdown_menu.js46
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js39
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/language_dropdown.js81
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/poll_form.js1
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/search.js88
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/options_container.js2
-rw-r--r--app/javascript/flavours/glitch/features/explore/index.js32
-rw-r--r--app/javascript/flavours/glitch/features/hashtag_timeline/index.js2
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/navigation/index.js1
-rw-r--r--app/javascript/flavours/glitch/features/status/components/action_bar.js25
-rw-r--r--app/javascript/flavours/glitch/features/status/components/detailed_status.js9
-rw-r--r--app/javascript/flavours/glitch/features/status/index.js21
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/columns_area.js2
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/focal_point_modal.js6
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/link_footer.js16
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/modal_root.js5
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/video_modal.js1
-rw-r--r--app/javascript/flavours/glitch/features/video/index.js5
-rw-r--r--app/javascript/flavours/glitch/load_polyfills.js5
-rw-r--r--app/javascript/flavours/glitch/locales/af.js7
-rw-r--r--app/javascript/flavours/glitch/locales/af.json1
-rw-r--r--app/javascript/flavours/glitch/locales/an.json1
-rw-r--r--app/javascript/flavours/glitch/locales/ar.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ar.json6
-rw-r--r--app/javascript/flavours/glitch/locales/ast.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ast.json6
-rw-r--r--app/javascript/flavours/glitch/locales/be.json1
-rw-r--r--app/javascript/flavours/glitch/locales/bg.js7
-rw-r--r--app/javascript/flavours/glitch/locales/bg.json6
-rw-r--r--app/javascript/flavours/glitch/locales/bn.js7
-rw-r--r--app/javascript/flavours/glitch/locales/bn.json6
-rw-r--r--app/javascript/flavours/glitch/locales/br.js7
-rw-r--r--app/javascript/flavours/glitch/locales/br.json6
-rw-r--r--app/javascript/flavours/glitch/locales/bs.json1
-rw-r--r--app/javascript/flavours/glitch/locales/ca.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ca.json6
-rw-r--r--app/javascript/flavours/glitch/locales/ckb.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ckb.json6
-rw-r--r--app/javascript/flavours/glitch/locales/co.js7
-rw-r--r--app/javascript/flavours/glitch/locales/co.json6
-rw-r--r--app/javascript/flavours/glitch/locales/cs.js180
-rw-r--r--app/javascript/flavours/glitch/locales/cs.json153
-rw-r--r--app/javascript/flavours/glitch/locales/cy.js7
-rw-r--r--app/javascript/flavours/glitch/locales/cy.json6
-rw-r--r--app/javascript/flavours/glitch/locales/da.js7
-rw-r--r--app/javascript/flavours/glitch/locales/da.json6
-rw-r--r--app/javascript/flavours/glitch/locales/de.js7
-rw-r--r--app/javascript/flavours/glitch/locales/de.json200
-rw-r--r--app/javascript/flavours/glitch/locales/defaultMessages.json1064
-rw-r--r--app/javascript/flavours/glitch/locales/el.js7
-rw-r--r--app/javascript/flavours/glitch/locales/el.json6
-rw-r--r--app/javascript/flavours/glitch/locales/en-GB.json1
-rw-r--r--app/javascript/flavours/glitch/locales/en.js67
-rw-r--r--app/javascript/flavours/glitch/locales/en.json200
-rw-r--r--app/javascript/flavours/glitch/locales/eo.js7
-rw-r--r--app/javascript/flavours/glitch/locales/eo.json52
-rw-r--r--app/javascript/flavours/glitch/locales/es-AR.js7
-rw-r--r--app/javascript/flavours/glitch/locales/es-AR.json95
-rw-r--r--app/javascript/flavours/glitch/locales/es-MX.js7
-rw-r--r--app/javascript/flavours/glitch/locales/es-MX.json95
-rw-r--r--app/javascript/flavours/glitch/locales/es.js119
-rw-r--r--app/javascript/flavours/glitch/locales/es.json95
-rw-r--r--app/javascript/flavours/glitch/locales/et.js7
-rw-r--r--app/javascript/flavours/glitch/locales/et.json6
-rw-r--r--app/javascript/flavours/glitch/locales/eu.js7
-rw-r--r--app/javascript/flavours/glitch/locales/eu.json6
-rw-r--r--app/javascript/flavours/glitch/locales/fa.js7
-rw-r--r--app/javascript/flavours/glitch/locales/fa.json6
-rw-r--r--app/javascript/flavours/glitch/locales/fi.js7
-rw-r--r--app/javascript/flavours/glitch/locales/fi.json6
-rw-r--r--app/javascript/flavours/glitch/locales/fo.json1
-rw-r--r--app/javascript/flavours/glitch/locales/fr-QC.json200
-rw-r--r--app/javascript/flavours/glitch/locales/fr.js7
-rw-r--r--app/javascript/flavours/glitch/locales/fr.json200
-rw-r--r--app/javascript/flavours/glitch/locales/fy.json1
-rw-r--r--app/javascript/flavours/glitch/locales/ga.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ga.json6
-rw-r--r--app/javascript/flavours/glitch/locales/gd.js7
-rw-r--r--app/javascript/flavours/glitch/locales/gd.json6
-rw-r--r--app/javascript/flavours/glitch/locales/gl.js7
-rw-r--r--app/javascript/flavours/glitch/locales/gl.json6
-rw-r--r--app/javascript/flavours/glitch/locales/he.js7
-rw-r--r--app/javascript/flavours/glitch/locales/he.json6
-rw-r--r--app/javascript/flavours/glitch/locales/hi.js7
-rw-r--r--app/javascript/flavours/glitch/locales/hi.json18
-rw-r--r--app/javascript/flavours/glitch/locales/hr.js7
-rw-r--r--app/javascript/flavours/glitch/locales/hr.json6
-rw-r--r--app/javascript/flavours/glitch/locales/hu.js7
-rw-r--r--app/javascript/flavours/glitch/locales/hu.json6
-rw-r--r--app/javascript/flavours/glitch/locales/hy.js7
-rw-r--r--app/javascript/flavours/glitch/locales/hy.json6
-rw-r--r--app/javascript/flavours/glitch/locales/id.js7
-rw-r--r--app/javascript/flavours/glitch/locales/id.json6
-rw-r--r--app/javascript/flavours/glitch/locales/ig.json1
-rw-r--r--app/javascript/flavours/glitch/locales/io.js7
-rw-r--r--app/javascript/flavours/glitch/locales/io.json6
-rw-r--r--app/javascript/flavours/glitch/locales/is.js7
-rw-r--r--app/javascript/flavours/glitch/locales/is.json6
-rw-r--r--app/javascript/flavours/glitch/locales/it.js7
-rw-r--r--app/javascript/flavours/glitch/locales/it.json6
-rw-r--r--app/javascript/flavours/glitch/locales/ja.js158
-rw-r--r--app/javascript/flavours/glitch/locales/ja.json124
-rw-r--r--app/javascript/flavours/glitch/locales/ka.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ka.json6
-rw-r--r--app/javascript/flavours/glitch/locales/kab.js7
-rw-r--r--app/javascript/flavours/glitch/locales/kab.json6
-rw-r--r--app/javascript/flavours/glitch/locales/kk.js7
-rw-r--r--app/javascript/flavours/glitch/locales/kk.json6
-rw-r--r--app/javascript/flavours/glitch/locales/kn.js7
-rw-r--r--app/javascript/flavours/glitch/locales/kn.json6
-rw-r--r--app/javascript/flavours/glitch/locales/ko.js208
-rw-r--r--app/javascript/flavours/glitch/locales/ko.json200
-rw-r--r--app/javascript/flavours/glitch/locales/ku.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ku.json6
-rw-r--r--app/javascript/flavours/glitch/locales/kw.js7
-rw-r--r--app/javascript/flavours/glitch/locales/kw.json6
-rw-r--r--app/javascript/flavours/glitch/locales/la.json1
-rw-r--r--app/javascript/flavours/glitch/locales/lt.js7
-rw-r--r--app/javascript/flavours/glitch/locales/lt.json6
-rw-r--r--app/javascript/flavours/glitch/locales/lv.js7
-rw-r--r--app/javascript/flavours/glitch/locales/lv.json6
-rw-r--r--app/javascript/flavours/glitch/locales/mk.js7
-rw-r--r--app/javascript/flavours/glitch/locales/mk.json6
-rw-r--r--app/javascript/flavours/glitch/locales/ml.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ml.json6
-rw-r--r--app/javascript/flavours/glitch/locales/mr.js7
-rw-r--r--app/javascript/flavours/glitch/locales/mr.json6
-rw-r--r--app/javascript/flavours/glitch/locales/ms.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ms.json6
-rw-r--r--app/javascript/flavours/glitch/locales/my.json1
-rw-r--r--app/javascript/flavours/glitch/locales/nl.js7
-rw-r--r--app/javascript/flavours/glitch/locales/nl.json6
-rw-r--r--app/javascript/flavours/glitch/locales/nn.js7
-rw-r--r--app/javascript/flavours/glitch/locales/nn.json6
-rw-r--r--app/javascript/flavours/glitch/locales/no.js7
-rw-r--r--app/javascript/flavours/glitch/locales/no.json6
-rw-r--r--app/javascript/flavours/glitch/locales/oc.js7
-rw-r--r--app/javascript/flavours/glitch/locales/oc.json6
-rw-r--r--app/javascript/flavours/glitch/locales/pa.js7
-rw-r--r--app/javascript/flavours/glitch/locales/pa.json6
-rw-r--r--app/javascript/flavours/glitch/locales/pl.js79
-rw-r--r--app/javascript/flavours/glitch/locales/pl.json55
-rw-r--r--app/javascript/flavours/glitch/locales/pt-BR.js7
-rw-r--r--app/javascript/flavours/glitch/locales/pt-BR.json200
-rw-r--r--app/javascript/flavours/glitch/locales/pt-PT.js7
-rw-r--r--app/javascript/flavours/glitch/locales/pt-PT.json6
-rw-r--r--app/javascript/flavours/glitch/locales/ro.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ro.json6
-rw-r--r--app/javascript/flavours/glitch/locales/ru.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ru.json6
-rw-r--r--app/javascript/flavours/glitch/locales/sa.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sa.json6
-rw-r--r--app/javascript/flavours/glitch/locales/sc.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sc.json6
-rw-r--r--app/javascript/flavours/glitch/locales/sco.json1
-rw-r--r--app/javascript/flavours/glitch/locales/si.js7
-rw-r--r--app/javascript/flavours/glitch/locales/si.json6
-rw-r--r--app/javascript/flavours/glitch/locales/sk.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sk.json6
-rw-r--r--app/javascript/flavours/glitch/locales/sl.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sl.json6
-rw-r--r--app/javascript/flavours/glitch/locales/sq.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sq.json6
-rw-r--r--app/javascript/flavours/glitch/locales/sr-Latn.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sr-Latn.json6
-rw-r--r--app/javascript/flavours/glitch/locales/sr.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sr.json6
-rw-r--r--app/javascript/flavours/glitch/locales/sv.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sv.json6
-rw-r--r--app/javascript/flavours/glitch/locales/szl.js7
-rw-r--r--app/javascript/flavours/glitch/locales/szl.json201
-rw-r--r--app/javascript/flavours/glitch/locales/ta.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ta.json6
-rw-r--r--app/javascript/flavours/glitch/locales/tai.js7
-rw-r--r--app/javascript/flavours/glitch/locales/tai.json201
-rw-r--r--app/javascript/flavours/glitch/locales/te.js7
-rw-r--r--app/javascript/flavours/glitch/locales/te.json6
-rw-r--r--app/javascript/flavours/glitch/locales/th.js7
-rw-r--r--app/javascript/flavours/glitch/locales/th.json6
-rw-r--r--app/javascript/flavours/glitch/locales/tr.js7
-rw-r--r--app/javascript/flavours/glitch/locales/tr.json6
-rw-r--r--app/javascript/flavours/glitch/locales/tt.js7
-rw-r--r--app/javascript/flavours/glitch/locales/tt.json6
-rw-r--r--app/javascript/flavours/glitch/locales/ug.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ug.json6
-rw-r--r--app/javascript/flavours/glitch/locales/uk.js7
-rw-r--r--app/javascript/flavours/glitch/locales/uk.json48
-rw-r--r--app/javascript/flavours/glitch/locales/ur.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ur.json6
-rw-r--r--app/javascript/flavours/glitch/locales/vi.js7
-rw-r--r--app/javascript/flavours/glitch/locales/vi.json6
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_af.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ar.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ast.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_bg.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_bn.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_br.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ca.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ckb.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_co.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_cs.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_cy.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_da.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_de.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_el.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_en.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_eo.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_es-AR.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_es-MX.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_es.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_et.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_eu.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_fa.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_fi.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_fr.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ga.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_gd.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_gl.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_he.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_hi.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_hr.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_hu.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_hy.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_id.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_io.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_is.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_it.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ja.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ka.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_kab.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_kk.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_kn.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ko.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ku.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_kw.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_lt.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_lv.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_mk.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ml.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_mr.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ms.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_nl.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_nn.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_no.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_oc.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_pa.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_pl.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_pt-BR.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_pt-PT.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ro.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ru.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_sa.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_sc.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_si.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_sk.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_sl.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_sq.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_sr-Latn.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_sr.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_sv.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_szl.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ta.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_tai.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_te.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_th.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_tr.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_tt.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ug.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_uk.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_ur.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_vi.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_zgh.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_zh-CN.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_zh-HK.json2
-rw-r--r--app/javascript/flavours/glitch/locales/whitelist_zh-TW.json2
-rw-r--r--app/javascript/flavours/glitch/locales/zgh.js7
-rw-r--r--app/javascript/flavours/glitch/locales/zgh.json201
-rw-r--r--app/javascript/flavours/glitch/locales/zh-CN.js201
-rw-r--r--app/javascript/flavours/glitch/locales/zh-CN.json176
-rw-r--r--app/javascript/flavours/glitch/locales/zh-HK.js7
-rw-r--r--app/javascript/flavours/glitch/locales/zh-HK.json6
-rw-r--r--app/javascript/flavours/glitch/locales/zh-TW.js7
-rw-r--r--app/javascript/flavours/glitch/locales/zh-TW.json6
-rw-r--r--app/javascript/flavours/glitch/packs/public.js38
-rw-r--r--app/javascript/flavours/glitch/permissions.js7
-rw-r--r--app/javascript/flavours/glitch/reducers/compose.js6
-rw-r--r--app/javascript/flavours/glitch/reducers/dropdown_menu.js4
-rw-r--r--app/javascript/flavours/glitch/reducers/relationships.js11
-rw-r--r--app/javascript/flavours/glitch/selectors/index.js12
-rw-r--r--app/javascript/flavours/glitch/styles/admin.scss15
-rw-r--r--app/javascript/flavours/glitch/styles/components/accounts.scss40
-rw-r--r--app/javascript/flavours/glitch/styles/components/compose_form.scss2
-rw-r--r--app/javascript/flavours/glitch/styles/components/emoji.scss2
-rw-r--r--app/javascript/flavours/glitch/styles/components/index.scss109
-rw-r--r--app/javascript/flavours/glitch/styles/components/modal.scss1
-rw-r--r--app/javascript/flavours/glitch/styles/components/search.scss1
-rw-r--r--app/javascript/flavours/glitch/styles/components/single_column.scss5
-rw-r--r--app/javascript/flavours/glitch/styles/components/status.scss7
-rw-r--r--app/javascript/flavours/glitch/styles/mastodon-light/diff.scss18
-rw-r--r--app/javascript/flavours/glitch/styles/modal.scss2
-rw-r--r--app/javascript/flavours/glitch/styles/polls.scss4
-rw-r--r--app/javascript/flavours/glitch/theme.yml13
-rw-r--r--app/javascript/flavours/vanilla/theme.yml8
-rw-r--r--app/javascript/images/logo-symbol-icon.svg2
-rw-r--r--app/javascript/images/logo-symbol-wordmark.svg2
-rw-r--r--app/javascript/mastodon/actions/account_notes.js8
-rw-r--r--app/javascript/mastodon/actions/accounts.js144
-rw-r--r--app/javascript/mastodon/actions/alerts.js6
-rw-r--r--app/javascript/mastodon/actions/announcements.js4
-rw-r--r--app/javascript/mastodon/actions/blocks.js16
-rw-r--r--app/javascript/mastodon/actions/bookmarks.js16
-rw-r--r--app/javascript/mastodon/actions/columns.js6
-rw-r--r--app/javascript/mastodon/actions/compose.js88
-rw-r--r--app/javascript/mastodon/actions/custom_emojis.js8
-rw-r--r--app/javascript/mastodon/actions/domain_blocks.js32
-rw-r--r--app/javascript/mastodon/actions/dropdown_menu.js4
-rw-r--r--app/javascript/mastodon/actions/emojis.js2
-rw-r--r--app/javascript/mastodon/actions/favourites.js16
-rw-r--r--app/javascript/mastodon/actions/height_cache.js4
-rw-r--r--app/javascript/mastodon/actions/interactions.js80
-rw-r--r--app/javascript/mastodon/actions/markers.js10
-rw-r--r--app/javascript/mastodon/actions/modal.js4
-rw-r--r--app/javascript/mastodon/actions/mutes.js16
-rw-r--r--app/javascript/mastodon/actions/notifications.js18
-rw-r--r--app/javascript/mastodon/actions/pin_statuses.js8
-rw-r--r--app/javascript/mastodon/actions/search.js12
-rw-r--r--app/javascript/mastodon/actions/settings.js4
-rw-r--r--app/javascript/mastodon/actions/statuses.js48
-rw-r--r--app/javascript/mastodon/actions/store.js2
-rw-r--r--app/javascript/mastodon/actions/suggestions.js8
-rw-r--r--app/javascript/mastodon/actions/timelines.js18
-rw-r--r--app/javascript/mastodon/common.js2
-rw-r--r--app/javascript/mastodon/compare_id.js2
-rw-r--r--app/javascript/mastodon/components/admin/Retention.js2
-rw-r--r--app/javascript/mastodon/components/dropdown_menu.js102
-rw-r--r--app/javascript/mastodon/components/edited_timestamp/containers/dropdown_menu_container.js5
-rw-r--r--app/javascript/mastodon/components/icon_button.js4
-rw-r--r--app/javascript/mastodon/components/media_gallery.js2
-rw-r--r--app/javascript/mastodon/components/status_action_bar.js34
-rw-r--r--app/javascript/mastodon/containers/dropdown_menu_container.js5
-rw-r--r--app/javascript/mastodon/containers/mastodon.js4
-rw-r--r--app/javascript/mastodon/extra_polyfills.js3
-rw-r--r--app/javascript/mastodon/features/account/components/follow_request_note.js37
-rw-r--r--app/javascript/mastodon/features/account/components/header.js21
-rw-r--r--app/javascript/mastodon/features/account/containers/follow_request_note_container.js15
-rw-r--r--app/javascript/mastodon/features/account_gallery/components/media_item.js1
-rw-r--r--app/javascript/mastodon/features/closed_registrations_modal/index.js2
-rw-r--r--app/javascript/mastodon/features/compose/components/compose_form.js15
-rw-r--r--app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js39
-rw-r--r--app/javascript/mastodon/features/compose/components/language_dropdown.js81
-rw-r--r--app/javascript/mastodon/features/compose/components/poll_form.js1
-rw-r--r--app/javascript/mastodon/features/compose/components/privacy_dropdown.js85
-rw-r--r--app/javascript/mastodon/features/compose/components/search.js78
-rw-r--r--app/javascript/mastodon/features/compose/containers/compose_form_container.js1
-rw-r--r--app/javascript/mastodon/features/compose/index.js3
-rw-r--r--app/javascript/mastodon/features/compose/util/counter.js2
-rw-r--r--app/javascript/mastodon/features/explore/index.js32
-rw-r--r--app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js4
-rw-r--r--app/javascript/mastodon/features/hashtag_timeline/index.js2
-rw-r--r--app/javascript/mastodon/features/list_timeline/index.js2
-rw-r--r--app/javascript/mastodon/features/status/components/action_bar.js15
-rw-r--r--app/javascript/mastodon/features/ui/components/columns_area.js2
-rw-r--r--app/javascript/mastodon/features/ui/components/disabled_account_banner.js2
-rw-r--r--app/javascript/mastodon/features/ui/components/focal_point_modal.js6
-rw-r--r--app/javascript/mastodon/features/ui/components/link_footer.js18
-rw-r--r--app/javascript/mastodon/features/ui/components/video_modal.js1
-rw-r--r--app/javascript/mastodon/features/ui/util/react_router_helpers.js2
-rw-r--r--app/javascript/mastodon/features/video/index.js5
-rw-r--r--app/javascript/mastodon/load_polyfills.js5
-rw-r--r--app/javascript/mastodon/locales/af.json10
-rw-r--r--app/javascript/mastodon/locales/an.json10
-rw-r--r--app/javascript/mastodon/locales/ar.json10
-rw-r--r--app/javascript/mastodon/locales/ast.json18
-rw-r--r--app/javascript/mastodon/locales/be.json8
-rw-r--r--app/javascript/mastodon/locales/bg.json204
-rw-r--r--app/javascript/mastodon/locales/bn.json18
-rw-r--r--app/javascript/mastodon/locales/br.json10
-rw-r--r--app/javascript/mastodon/locales/bs.json8
-rw-r--r--app/javascript/mastodon/locales/ca.json144
-rw-r--r--app/javascript/mastodon/locales/ckb.json144
-rw-r--r--app/javascript/mastodon/locales/co.json10
-rw-r--r--app/javascript/mastodon/locales/cs.json8
-rw-r--r--app/javascript/mastodon/locales/cy.json10
-rw-r--r--app/javascript/mastodon/locales/da.json8
-rw-r--r--app/javascript/mastodon/locales/de.json40
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json57
-rw-r--r--app/javascript/mastodon/locales/el.json12
-rw-r--r--app/javascript/mastodon/locales/en-GB.json12
-rw-r--r--app/javascript/mastodon/locales/en.json16
-rw-r--r--app/javascript/mastodon/locales/eo.json40
-rw-r--r--app/javascript/mastodon/locales/es-AR.json6
-rw-r--r--app/javascript/mastodon/locales/es-MX.json8
-rw-r--r--app/javascript/mastodon/locales/es.json10
-rw-r--r--app/javascript/mastodon/locales/et.json304
-rw-r--r--app/javascript/mastodon/locales/eu.json10
-rw-r--r--app/javascript/mastodon/locales/fa.json10
-rw-r--r--app/javascript/mastodon/locales/fi.json78
-rw-r--r--app/javascript/mastodon/locales/fo.json14
-rw-r--r--app/javascript/mastodon/locales/fr-QC.json10
-rw-r--r--app/javascript/mastodon/locales/fr.json18
-rw-r--r--app/javascript/mastodon/locales/fy.json426
-rw-r--r--app/javascript/mastodon/locales/ga.json30
-rw-r--r--app/javascript/mastodon/locales/gd.json10
-rw-r--r--app/javascript/mastodon/locales/gl.json8
-rw-r--r--app/javascript/mastodon/locales/he.json22
-rw-r--r--app/javascript/mastodon/locales/hi.json46
-rw-r--r--app/javascript/mastodon/locales/hr.json160
-rw-r--r--app/javascript/mastodon/locales/hu.json8
-rw-r--r--app/javascript/mastodon/locales/hy.json10
-rw-r--r--app/javascript/mastodon/locales/id.json10
-rw-r--r--app/javascript/mastodon/locales/ig.json8
-rw-r--r--app/javascript/mastodon/locales/io.json10
-rw-r--r--app/javascript/mastodon/locales/is.json12
-rw-r--r--app/javascript/mastodon/locales/it.json16
-rw-r--r--app/javascript/mastodon/locales/ja.json12
-rw-r--r--app/javascript/mastodon/locales/ka.json10
-rw-r--r--app/javascript/mastodon/locales/kab.json10
-rw-r--r--app/javascript/mastodon/locales/kk.json10
-rw-r--r--app/javascript/mastodon/locales/kn.json20
-rw-r--r--app/javascript/mastodon/locales/ko.json14
-rw-r--r--app/javascript/mastodon/locales/ku.json22
-rw-r--r--app/javascript/mastodon/locales/kw.json10
-rw-r--r--app/javascript/mastodon/locales/la.json655
-rw-r--r--app/javascript/mastodon/locales/lt.json10
-rw-r--r--app/javascript/mastodon/locales/lv.json94
-rw-r--r--app/javascript/mastodon/locales/mk.json10
-rw-r--r--app/javascript/mastodon/locales/ml.json10
-rw-r--r--app/javascript/mastodon/locales/mr.json234
-rw-r--r--app/javascript/mastodon/locales/ms.json10
-rw-r--r--app/javascript/mastodon/locales/my.json8
-rw-r--r--app/javascript/mastodon/locales/nl.json22
-rw-r--r--app/javascript/mastodon/locales/nn.json26
-rw-r--r--app/javascript/mastodon/locales/no.json42
-rw-r--r--app/javascript/mastodon/locales/oc.json32
-rw-r--r--app/javascript/mastodon/locales/pa.json10
-rw-r--r--app/javascript/mastodon/locales/pl.json30
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json12
-rw-r--r--app/javascript/mastodon/locales/pt-PT.json238
-rw-r--r--app/javascript/mastodon/locales/ro.json10
-rw-r--r--app/javascript/mastodon/locales/ru.json8
-rw-r--r--app/javascript/mastodon/locales/sa.json10
-rw-r--r--app/javascript/mastodon/locales/sc.json10
-rw-r--r--app/javascript/mastodon/locales/sco.json10
-rw-r--r--app/javascript/mastodon/locales/si.json10
-rw-r--r--app/javascript/mastodon/locales/sk.json22
-rw-r--r--app/javascript/mastodon/locales/sl.json8
-rw-r--r--app/javascript/mastodon/locales/sq.json10
-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.json10
-rw-r--r--app/javascript/mastodon/locales/szl.json10
-rw-r--r--app/javascript/mastodon/locales/ta.json10
-rw-r--r--app/javascript/mastodon/locales/tai.json18
-rw-r--r--app/javascript/mastodon/locales/te.json10
-rw-r--r--app/javascript/mastodon/locales/th.json8
-rw-r--r--app/javascript/mastodon/locales/tr.json8
-rw-r--r--app/javascript/mastodon/locales/tt.json10
-rw-r--r--app/javascript/mastodon/locales/ug.json10
-rw-r--r--app/javascript/mastodon/locales/uk.json16
-rw-r--r--app/javascript/mastodon/locales/ur.json10
-rw-r--r--app/javascript/mastodon/locales/vi.json22
-rw-r--r--app/javascript/mastodon/locales/whitelist_la.json2
-rw-r--r--app/javascript/mastodon/locales/zgh.json10
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json14
-rw-r--r--app/javascript/mastodon/locales/zh-HK.json10
-rw-r--r--app/javascript/mastodon/locales/zh-TW.json26
-rw-r--r--app/javascript/mastodon/middleware/errors.js2
-rw-r--r--app/javascript/mastodon/middleware/loading_bar.js2
-rw-r--r--app/javascript/mastodon/middleware/sounds.js2
-rw-r--r--app/javascript/mastodon/permissions.js7
-rw-r--r--app/javascript/mastodon/reducers/accounts.js2
-rw-r--r--app/javascript/mastodon/reducers/accounts_counters.js2
-rw-r--r--app/javascript/mastodon/reducers/accounts_map.js2
-rw-r--r--app/javascript/mastodon/reducers/alerts.js2
-rw-r--r--app/javascript/mastodon/reducers/announcements.js2
-rw-r--r--app/javascript/mastodon/reducers/compose.js16
-rw-r--r--app/javascript/mastodon/reducers/contexts.js2
-rw-r--r--app/javascript/mastodon/reducers/conversations.js2
-rw-r--r--app/javascript/mastodon/reducers/custom_emojis.js2
-rw-r--r--app/javascript/mastodon/reducers/domain_lists.js2
-rw-r--r--app/javascript/mastodon/reducers/dropdown_menu.js4
-rw-r--r--app/javascript/mastodon/reducers/filters.js2
-rw-r--r--app/javascript/mastodon/reducers/height_cache.js2
-rw-r--r--app/javascript/mastodon/reducers/list_adder.js2
-rw-r--r--app/javascript/mastodon/reducers/list_editor.js2
-rw-r--r--app/javascript/mastodon/reducers/lists.js2
-rw-r--r--app/javascript/mastodon/reducers/markers.js2
-rw-r--r--app/javascript/mastodon/reducers/media_attachments.js2
-rw-r--r--app/javascript/mastodon/reducers/meta.js2
-rw-r--r--app/javascript/mastodon/reducers/missed_updates.js2
-rw-r--r--app/javascript/mastodon/reducers/modal.js2
-rw-r--r--app/javascript/mastodon/reducers/notifications.js2
-rw-r--r--app/javascript/mastodon/reducers/picture_in_picture.js2
-rw-r--r--app/javascript/mastodon/reducers/push_notifications.js2
-rw-r--r--app/javascript/mastodon/reducers/relationships.js13
-rw-r--r--app/javascript/mastodon/reducers/search.js2
-rw-r--r--app/javascript/mastodon/reducers/settings.js2
-rw-r--r--app/javascript/mastodon/reducers/status_lists.js2
-rw-r--r--app/javascript/mastodon/reducers/statuses.js2
-rw-r--r--app/javascript/mastodon/reducers/suggestions.js2
-rw-r--r--app/javascript/mastodon/reducers/tags.js2
-rw-r--r--app/javascript/mastodon/reducers/timelines.js2
-rw-r--r--app/javascript/mastodon/reducers/trends.js2
-rw-r--r--app/javascript/mastodon/reducers/user_lists.js2
-rw-r--r--app/javascript/mastodon/store/configureStore.js2
-rw-r--r--app/javascript/mastodon/uuid.js2
-rw-r--r--app/javascript/packs/public.js38
-rw-r--r--app/javascript/styles/mastodon-light/diff.scss18
-rw-r--r--app/javascript/styles/mastodon/admin.scss17
-rw-r--r--app/javascript/styles/mastodon/components.scss139
-rw-r--r--app/javascript/styles/mastodon/modal.scss2
-rw-r--r--app/javascript/styles/mastodon/polls.scss4
-rw-r--r--app/javascript/styles/mastodon/widgets.scss2
-rw-r--r--app/lib/admin/system_check/elasticsearch_check.rb13
-rw-r--r--app/lib/feed_manager.rb3
-rw-r--r--app/lib/request.rb17
-rw-r--r--app/lib/status_reach_finder.rb2
-rw-r--r--app/lib/translation_service/libre_translate.rb2
-rw-r--r--app/lib/vacuum/feeds_vacuum.rb8
-rw-r--r--app/lib/vacuum/statuses_vacuum.rb5
-rw-r--r--app/mailers/user_mailer.rb18
-rw-r--r--app/models/account.rb19
-rw-r--r--app/models/account_filter.rb2
-rw-r--r--app/models/admin/status_batch_action.rb16
-rw-r--r--app/models/concerns/account_interactions.rb4
-rw-r--r--app/models/concerns/omniauthable.rb9
-rw-r--r--app/models/form/admin_settings.rb20
-rw-r--r--app/models/media_attachment.rb2
-rw-r--r--app/models/relay.rb5
-rw-r--r--app/models/status.rb31
-rw-r--r--app/models/tag.rb22
-rw-r--r--app/models/user.rb17
-rw-r--r--app/models/webhook.rb1
-rw-r--r--app/presenters/account_relationships_presenter.rb6
-rw-r--r--app/serializers/initial_state_serializer.rb2
-rw-r--r--app/serializers/rest/preferences_serializer.rb5
-rw-r--r--app/serializers/rest/relationship_serializer.rb8
-rw-r--r--app/services/activitypub/process_status_update_service.rb42
-rw-r--r--app/services/batched_remove_status_service.rb2
-rw-r--r--app/services/fetch_oembed_service.rb4
-rw-r--r--app/services/post_status_service.rb12
-rw-r--r--app/services/suspend_account_service.rb14
-rw-r--r--app/services/tag_search_service.rb18
-rw-r--r--app/services/unsuspend_account_service.rb13
-rw-r--r--app/services/verify_link_service.rb2
-rw-r--r--app/validators/url_validator.rb2
-rw-r--r--app/views/admin/accounts/index.html.haml2
-rw-r--r--app/views/admin/accounts/show.html.haml6
-rw-r--r--app/views/admin/report_notes/_report_note.html.haml7
-rw-r--r--app/views/admin/reports/_actions.html.haml2
-rw-r--r--app/views/admin/reports/show.html.haml9
-rw-r--r--app/views/admin/settings/discovery/show.html.haml10
-rw-r--r--app/views/admin/trends/tags/index.html.haml2
-rw-r--r--app/views/auth/sessions/new.html.haml2
-rw-r--r--app/views/disputes/strikes/show.html.haml7
-rw-r--r--app/views/layouts/mailer.html.haml2
-rw-r--r--app/views/layouts/modal.html.haml2
-rw-r--r--app/views/relationships/show.html.haml6
-rw-r--r--app/views/settings/featured_tags/index.html.haml2
-rw-r--r--app/views/settings/preferences/appearance/show.html.haml2
-rw-r--r--app/workers/scheduler/suspended_user_cleanup_scheduler.rb2
-rw-r--r--config/application.rb1
-rw-r--r--config/i18n-tasks.yml15
-rw-r--r--config/initializers/devise.rb2
-rw-r--r--config/locales-glitch/af.yml1
-rw-r--r--config/locales-glitch/an.yml1
-rw-r--r--config/locales-glitch/ar.yml1
-rw-r--r--config/locales-glitch/ast.yml1
-rw-r--r--config/locales-glitch/be.yml1
-rw-r--r--config/locales-glitch/bg.yml1
-rw-r--r--config/locales-glitch/bn.yml1
-rw-r--r--config/locales-glitch/br.yml1
-rw-r--r--config/locales-glitch/bs.yml1
-rw-r--r--config/locales-glitch/ca.yml1
-rw-r--r--config/locales-glitch/ckb.yml1
-rw-r--r--config/locales-glitch/co.yml1
-rw-r--r--config/locales-glitch/cs.yml9
-rw-r--r--config/locales-glitch/cy.yml1
-rw-r--r--config/locales-glitch/da.yml1
-rw-r--r--config/locales-glitch/de.yml42
-rw-r--r--config/locales-glitch/el.yml1
-rw-r--r--config/locales-glitch/en-GB.yml1
-rw-r--r--config/locales-glitch/en.yml13
-rw-r--r--config/locales-glitch/eo.yml1
-rw-r--r--config/locales-glitch/es-AR.yml20
-rw-r--r--config/locales-glitch/es-MX.yml20
-rw-r--r--config/locales-glitch/es.yml9
-rw-r--r--config/locales-glitch/et.yml1
-rw-r--r--config/locales-glitch/eu.yml1
-rw-r--r--config/locales-glitch/fa.yml1
-rw-r--r--config/locales-glitch/fi.yml1
-rw-r--r--config/locales-glitch/fo.yml1
-rw-r--r--config/locales-glitch/fr-QC.yml42
-rw-r--r--config/locales-glitch/fr.yml42
-rw-r--r--config/locales-glitch/fy.yml1
-rw-r--r--config/locales-glitch/ga.yml1
-rw-r--r--config/locales-glitch/gd.yml1
-rw-r--r--config/locales-glitch/gl.yml1
-rw-r--r--config/locales-glitch/he.yml1
-rw-r--r--config/locales-glitch/hi.yml1
-rw-r--r--config/locales-glitch/hr.yml1
-rw-r--r--config/locales-glitch/hu.yml1
-rw-r--r--config/locales-glitch/hy.yml1
-rw-r--r--config/locales-glitch/id.yml1
-rw-r--r--config/locales-glitch/ig.yml1
-rw-r--r--config/locales-glitch/io.yml1
-rw-r--r--config/locales-glitch/is.yml1
-rw-r--r--config/locales-glitch/it.yml1
-rw-r--r--config/locales-glitch/ja.yml9
-rw-r--r--config/locales-glitch/ka.yml1
-rw-r--r--config/locales-glitch/kab.yml1
-rw-r--r--config/locales-glitch/kk.yml1
-rw-r--r--config/locales-glitch/kn.yml1
-rw-r--r--config/locales-glitch/ko.yml12
-rw-r--r--config/locales-glitch/ku.yml1
-rw-r--r--config/locales-glitch/kw.yml1
-rw-r--r--config/locales-glitch/la.yml1
-rw-r--r--config/locales-glitch/lt.yml1
-rw-r--r--config/locales-glitch/lv.yml1
-rw-r--r--config/locales-glitch/mk.yml1
-rw-r--r--config/locales-glitch/ml.yml1
-rw-r--r--config/locales-glitch/mr.yml1
-rw-r--r--config/locales-glitch/ms.yml1
-rw-r--r--config/locales-glitch/my.yml1
-rw-r--r--config/locales-glitch/nl.yml1
-rw-r--r--config/locales-glitch/nn.yml1
-rw-r--r--config/locales-glitch/no.yml1
-rw-r--r--config/locales-glitch/oc.yml1
-rw-r--r--config/locales-glitch/pa.yml1
-rw-r--r--config/locales-glitch/pt-BR.yml42
-rw-r--r--config/locales-glitch/pt-PT.yml1
-rw-r--r--config/locales-glitch/ro.yml1
-rw-r--r--config/locales-glitch/ru.yml1
-rw-r--r--config/locales-glitch/sa.yml1
-rw-r--r--config/locales-glitch/sc.yml1
-rw-r--r--config/locales-glitch/sco.yml1
-rw-r--r--config/locales-glitch/si.yml1
-rw-r--r--config/locales-glitch/simple_form.af.yml1
-rw-r--r--config/locales-glitch/simple_form.an.yml1
-rw-r--r--config/locales-glitch/simple_form.ar.yml1
-rw-r--r--config/locales-glitch/simple_form.ast.yml1
-rw-r--r--config/locales-glitch/simple_form.be.yml1
-rw-r--r--config/locales-glitch/simple_form.bg.yml1
-rw-r--r--config/locales-glitch/simple_form.bn.yml1
-rw-r--r--config/locales-glitch/simple_form.br.yml1
-rw-r--r--config/locales-glitch/simple_form.bs.yml1
-rw-r--r--config/locales-glitch/simple_form.ca.yml1
-rw-r--r--config/locales-glitch/simple_form.ckb.yml1
-rw-r--r--config/locales-glitch/simple_form.co.yml1
-rw-r--r--config/locales-glitch/simple_form.cs.yml5
-rw-r--r--config/locales-glitch/simple_form.cy.yml1
-rw-r--r--config/locales-glitch/simple_form.da.yml1
-rw-r--r--config/locales-glitch/simple_form.de.yml27
-rw-r--r--config/locales-glitch/simple_form.el.yml1
-rw-r--r--config/locales-glitch/simple_form.en-GB.yml1
-rw-r--r--config/locales-glitch/simple_form.en.yml2
-rw-r--r--config/locales-glitch/simple_form.eo.yml1
-rw-r--r--config/locales-glitch/simple_form.es-AR.yml18
-rw-r--r--config/locales-glitch/simple_form.es-MX.yml18
-rw-r--r--config/locales-glitch/simple_form.es.yml2
-rw-r--r--config/locales-glitch/simple_form.et.yml1
-rw-r--r--config/locales-glitch/simple_form.eu.yml1
-rw-r--r--config/locales-glitch/simple_form.fa.yml1
-rw-r--r--config/locales-glitch/simple_form.fi.yml1
-rw-r--r--config/locales-glitch/simple_form.fo.yml1
-rw-r--r--config/locales-glitch/simple_form.fr-QC.yml27
-rw-r--r--config/locales-glitch/simple_form.fr.yml27
-rw-r--r--config/locales-glitch/simple_form.fy.yml1
-rw-r--r--config/locales-glitch/simple_form.ga.yml1
-rw-r--r--config/locales-glitch/simple_form.gd.yml1
-rw-r--r--config/locales-glitch/simple_form.gl.yml1
-rw-r--r--config/locales-glitch/simple_form.he.yml1
-rw-r--r--config/locales-glitch/simple_form.hi.yml1
-rw-r--r--config/locales-glitch/simple_form.hr.yml1
-rw-r--r--config/locales-glitch/simple_form.hu.yml1
-rw-r--r--config/locales-glitch/simple_form.hy.yml1
-rw-r--r--config/locales-glitch/simple_form.id.yml1
-rw-r--r--config/locales-glitch/simple_form.ig.yml1
-rw-r--r--config/locales-glitch/simple_form.io.yml1
-rw-r--r--config/locales-glitch/simple_form.is.yml1
-rw-r--r--config/locales-glitch/simple_form.it.yml1
-rw-r--r--config/locales-glitch/simple_form.ja.yml1
-rw-r--r--config/locales-glitch/simple_form.ka.yml1
-rw-r--r--config/locales-glitch/simple_form.kab.yml1
-rw-r--r--config/locales-glitch/simple_form.kk.yml1
-rw-r--r--config/locales-glitch/simple_form.kn.yml1
-rw-r--r--config/locales-glitch/simple_form.ko.yml5
-rw-r--r--config/locales-glitch/simple_form.ku.yml1
-rw-r--r--config/locales-glitch/simple_form.kw.yml1
-rw-r--r--config/locales-glitch/simple_form.la.yml1
-rw-r--r--config/locales-glitch/simple_form.lt.yml1
-rw-r--r--config/locales-glitch/simple_form.lv.yml1
-rw-r--r--config/locales-glitch/simple_form.mk.yml1
-rw-r--r--config/locales-glitch/simple_form.ml.yml1
-rw-r--r--config/locales-glitch/simple_form.mr.yml1
-rw-r--r--config/locales-glitch/simple_form.ms.yml1
-rw-r--r--config/locales-glitch/simple_form.my.yml1
-rw-r--r--config/locales-glitch/simple_form.nl.yml1
-rw-r--r--config/locales-glitch/simple_form.nn.yml1
-rw-r--r--config/locales-glitch/simple_form.no.yml1
-rw-r--r--config/locales-glitch/simple_form.oc.yml1
-rw-r--r--config/locales-glitch/simple_form.pa.yml1
-rw-r--r--config/locales-glitch/simple_form.pt-BR.yml27
-rw-r--r--config/locales-glitch/simple_form.pt-PT.yml1
-rw-r--r--config/locales-glitch/simple_form.ro.yml1
-rw-r--r--config/locales-glitch/simple_form.ru.yml1
-rw-r--r--config/locales-glitch/simple_form.sa.yml1
-rw-r--r--config/locales-glitch/simple_form.sc.yml1
-rw-r--r--config/locales-glitch/simple_form.sco.yml1
-rw-r--r--config/locales-glitch/simple_form.si.yml1
-rw-r--r--config/locales-glitch/simple_form.sk.yml1
-rw-r--r--config/locales-glitch/simple_form.sl.yml1
-rw-r--r--config/locales-glitch/simple_form.sq.yml1
-rw-r--r--config/locales-glitch/simple_form.sr-Latn.yml1
-rw-r--r--config/locales-glitch/simple_form.sr.yml1
-rw-r--r--config/locales-glitch/simple_form.sv.yml1
-rw-r--r--config/locales-glitch/simple_form.ta.yml1
-rw-r--r--config/locales-glitch/simple_form.te.yml1
-rw-r--r--config/locales-glitch/simple_form.th.yml1
-rw-r--r--config/locales-glitch/simple_form.tr.yml1
-rw-r--r--config/locales-glitch/simple_form.tt.yml1
-rw-r--r--config/locales-glitch/simple_form.ug.yml1
-rw-r--r--config/locales-glitch/simple_form.uk.yml1
-rw-r--r--config/locales-glitch/simple_form.ur.yml1
-rw-r--r--config/locales-glitch/simple_form.vi.yml1
-rw-r--r--config/locales-glitch/simple_form.zh-CN.yml4
-rw-r--r--config/locales-glitch/simple_form.zh-HK.yml1
-rw-r--r--config/locales-glitch/simple_form.zh-TW.yml1
-rw-r--r--config/locales-glitch/sk.yml1
-rw-r--r--config/locales-glitch/sl.yml1
-rw-r--r--config/locales-glitch/sq.yml1
-rw-r--r--config/locales-glitch/sr-Latn.yml1
-rw-r--r--config/locales-glitch/sr.yml1
-rw-r--r--config/locales-glitch/sv.yml1
-rw-r--r--config/locales-glitch/ta.yml1
-rw-r--r--config/locales-glitch/te.yml1
-rw-r--r--config/locales-glitch/th.yml1
-rw-r--r--config/locales-glitch/tr.yml1
-rw-r--r--config/locales-glitch/tt.yml1
-rw-r--r--config/locales-glitch/ug.yml1
-rw-r--r--config/locales-glitch/uk.yml1
-rw-r--r--config/locales-glitch/ur.yml1
-rw-r--r--config/locales-glitch/vi.yml1
-rw-r--r--config/locales-glitch/zh-CN.yml9
-rw-r--r--config/locales-glitch/zh-HK.yml1
-rw-r--r--config/locales-glitch/zh-TW.yml1
-rw-r--r--config/locales/activerecord.bg.yml6
-rw-r--r--config/locales/activerecord.ca.yml2
-rw-r--r--config/locales/activerecord.ckb.yml5
-rw-r--r--config/locales/activerecord.de.yml16
-rw-r--r--config/locales/activerecord.es-MX.yml2
-rw-r--r--config/locales/activerecord.et.yml12
-rw-r--r--config/locales/activerecord.io.yml4
-rw-r--r--config/locales/activerecord.la.yml1
-rw-r--r--config/locales/an.yml1
-rw-r--r--config/locales/ar.yml84
-rw-r--r--config/locales/ast.yml6
-rw-r--r--config/locales/be.yml28
-rw-r--r--config/locales/bg.yml862
-rw-r--r--config/locales/ca.yml117
-rw-r--r--config/locales/ckb.yml1
-rw-r--r--config/locales/cs.yml9
-rw-r--r--config/locales/cy.yml9
-rw-r--r--config/locales/da.yml11
-rw-r--r--config/locales/de.yml55
-rw-r--r--config/locales/devise.be.yml4
-rw-r--r--config/locales/devise.bg.yml68
-rw-r--r--config/locales/devise.et.yml92
-rw-r--r--config/locales/devise.fi.yml4
-rw-r--r--config/locales/devise.fy.yml97
-rw-r--r--config/locales/devise.ku.yml34
-rw-r--r--config/locales/devise.la.yml1
-rw-r--r--config/locales/devise.sv.yml6
-rw-r--r--config/locales/devise.vi.yml2
-rw-r--r--config/locales/doorkeeper.ar.yml10
-rw-r--r--config/locales/doorkeeper.ast.yml1
-rw-r--r--config/locales/doorkeeper.be.yml76
-rw-r--r--config/locales/doorkeeper.bg.yml54
-rw-r--r--config/locales/doorkeeper.ca.yml22
-rw-r--r--config/locales/doorkeeper.cs.yml10
-rw-r--r--config/locales/doorkeeper.da.yml10
-rw-r--r--config/locales/doorkeeper.de.yml20
-rw-r--r--config/locales/doorkeeper.en-GB.yml10
-rw-r--r--config/locales/doorkeeper.en.yml14
-rw-r--r--config/locales/doorkeeper.es-AR.yml10
-rw-r--r--config/locales/doorkeeper.es-MX.yml22
-rw-r--r--config/locales/doorkeeper.es.yml10
-rw-r--r--config/locales/doorkeeper.et.yml62
-rw-r--r--config/locales/doorkeeper.fi.yml10
-rw-r--r--config/locales/doorkeeper.fo.yml10
-rw-r--r--config/locales/doorkeeper.fr-QC.yml10
-rw-r--r--config/locales/doorkeeper.fr.yml14
-rw-r--r--config/locales/doorkeeper.fy.yml22
-rw-r--r--config/locales/doorkeeper.gl.yml20
-rw-r--r--config/locales/doorkeeper.he.yml10
-rw-r--r--config/locales/doorkeeper.hu.yml10
-rw-r--r--config/locales/doorkeeper.id.yml7
-rw-r--r--config/locales/doorkeeper.is.yml10
-rw-r--r--config/locales/doorkeeper.it.yml10
-rw-r--r--config/locales/doorkeeper.ko.yml24
-rw-r--r--config/locales/doorkeeper.la.yml1
-rw-r--r--config/locales/doorkeeper.lv.yml14
-rw-r--r--config/locales/doorkeeper.nl.yml16
-rw-r--r--config/locales/doorkeeper.nn.yml10
-rw-r--r--config/locales/doorkeeper.no.yml10
-rw-r--r--config/locales/doorkeeper.pl.yml10
-rw-r--r--config/locales/doorkeeper.pt-PT.yml10
-rw-r--r--config/locales/doorkeeper.ro.yml2
-rw-r--r--config/locales/doorkeeper.ru.yml2
-rw-r--r--config/locales/doorkeeper.sl.yml10
-rw-r--r--config/locales/doorkeeper.sq.yml10
-rw-r--r--config/locales/doorkeeper.sr-Latn.yml5
-rw-r--r--config/locales/doorkeeper.sr.yml5
-rw-r--r--config/locales/doorkeeper.sv.yml10
-rw-r--r--config/locales/doorkeeper.th.yml10
-rw-r--r--config/locales/doorkeeper.tr.yml10
-rw-r--r--config/locales/doorkeeper.uk.yml16
-rw-r--r--config/locales/doorkeeper.vi.yml10
-rw-r--r--config/locales/doorkeeper.zh-CN.yml10
-rw-r--r--config/locales/doorkeeper.zh-HK.yml10
-rw-r--r--config/locales/doorkeeper.zh-TW.yml14
-rw-r--r--config/locales/el.yml8
-rw-r--r--config/locales/en-GB.yml18
-rw-r--r--config/locales/en.yml18
-rw-r--r--config/locales/eo.yml16
-rw-r--r--config/locales/es-AR.yml11
-rw-r--r--config/locales/es-MX.yml13
-rw-r--r--config/locales/es.yml9
-rw-r--r--config/locales/et.yml356
-rw-r--r--config/locales/eu.yml2
-rw-r--r--config/locales/fa.yml3
-rw-r--r--config/locales/fi.yml51
-rw-r--r--config/locales/fo.yml9
-rw-r--r--config/locales/fr-QC.yml32
-rw-r--r--config/locales/fr.yml11
-rw-r--r--config/locales/fy.yml1538
-rw-r--r--config/locales/ga.yml10
-rw-r--r--config/locales/gd.yml1
-rw-r--r--config/locales/gl.yml25
-rw-r--r--config/locales/he.yml11
-rw-r--r--config/locales/hu.yml11
-rw-r--r--config/locales/hy.yml2
-rw-r--r--config/locales/id.yml7
-rw-r--r--config/locales/io.yml14
-rw-r--r--config/locales/is.yml9
-rw-r--r--config/locales/it.yml9
-rw-r--r--config/locales/ja.yml13
-rw-r--r--config/locales/kab.yml2
-rw-r--r--config/locales/ko.yml22
-rw-r--r--config/locales/ku.yml49
-rw-r--r--config/locales/la.yml12
-rw-r--r--config/locales/lv.yml63
-rw-r--r--config/locales/ms.yml11
-rw-r--r--config/locales/nl.yml17
-rw-r--r--config/locales/nn.yml213
-rw-r--r--config/locales/no.yml216
-rw-r--r--config/locales/oc.yml2
-rw-r--r--config/locales/pl.yml11
-rw-r--r--config/locales/pt-BR.yml15
-rw-r--r--config/locales/pt-PT.yml593
-rw-r--r--config/locales/ru.yml30
-rw-r--r--config/locales/sco.yml1
-rw-r--r--config/locales/si.yml1
-rw-r--r--config/locales/simple_form.ar.yml12
-rw-r--r--config/locales/simple_form.be.yml87
-rw-r--r--config/locales/simple_form.bg.yml181
-rw-r--r--config/locales/simple_form.ca.yml46
-rw-r--r--config/locales/simple_form.de.yml50
-rw-r--r--config/locales/simple_form.en-GB.yml93
-rw-r--r--config/locales/simple_form.en.yml8
-rw-r--r--config/locales/simple_form.et.yml82
-rw-r--r--config/locales/simple_form.fi.yml14
-rw-r--r--config/locales/simple_form.fr-QC.yml2
-rw-r--r--config/locales/simple_form.fy.yml303
-rw-r--r--config/locales/simple_form.gl.yml2
-rw-r--r--config/locales/simple_form.is.yml2
-rw-r--r--config/locales/simple_form.ku.yml8
-rw-r--r--config/locales/simple_form.la.yml1
-rw-r--r--config/locales/simple_form.lv.yml22
-rw-r--r--config/locales/simple_form.no.yml41
-rw-r--r--config/locales/simple_form.pt-PT.yml18
-rw-r--r--config/locales/simple_form.sr-Latn.yml254
-rw-r--r--config/locales/simple_form.sr.yml28
-rw-r--r--config/locales/simple_form.th.yml2
-rw-r--r--config/locales/simple_form.uk.yml10
-rw-r--r--config/locales/simple_form.vi.yml4
-rw-r--r--config/locales/sk.yml8
-rw-r--r--config/locales/sl.yml9
-rw-r--r--config/locales/sq.yml15
-rw-r--r--config/locales/sr-Latn.yml1
-rw-r--r--config/locales/sr.yml123
-rw-r--r--config/locales/sv.yml17
-rw-r--r--config/locales/th.yml11
-rw-r--r--config/locales/tr.yml16
-rw-r--r--config/locales/uk.yml19
-rw-r--r--config/locales/vi.yml39
-rw-r--r--config/locales/zh-CN.yml13
-rw-r--r--config/locales/zh-HK.yml11
-rw-r--r--config/locales/zh-TW.yml19
-rw-r--r--config/puma.rb7
-rw-r--r--config/sidekiq.yml2
-rw-r--r--config/webpack/generateLocalePacks.js28
-rw-r--r--config/webpack/production.js6
-rw-r--r--config/webpack/translationRunner.js27
-rw-r--r--crowdin-glitch.yml8
-rw-r--r--lib/assets/wordmark.dark.css2
-rw-r--r--lib/mastodon/accounts_cli.rb151
-rw-r--r--lib/mastodon/domains_cli.rb2
-rw-r--r--lib/mastodon/media_cli.rb78
-rw-r--r--lib/sanitize_ext/sanitize_config.rb2
-rw-r--r--lib/tasks/mastodon.rake63
-rw-r--r--package.json32
-rw-r--r--postcss.config.js1
-rw-r--r--public/embed.js22
-rw-r--r--public/inert.css3
-rw-r--r--spec/controllers/admin/domain_blocks_controller_spec.rb47
-rw-r--r--spec/controllers/admin/reports/actions_controller_spec.rb42
-rw-r--r--spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb47
-rw-r--r--spec/controllers/auth/passwords_controller_spec.rb61
-rw-r--r--spec/controllers/well_known/nodeinfo_controller_spec.rb2
-rw-r--r--spec/helpers/application_helper_spec.rb2
-rw-r--r--spec/helpers/formatting_helper_spec.rb24
-rw-r--r--spec/lib/feed_manager_spec.rb12
-rw-r--r--spec/lib/request_spec.rb5
-rw-r--r--spec/lib/sanitize_config_spec.rb4
-rw-r--r--spec/models/account_spec.rb8
-rw-r--r--spec/models/tag_spec.rb57
-rw-r--r--spec/presenters/account_relationships_presenter_spec.rb9
-rw-r--r--spec/services/suspend_account_service_spec.rb6
-rw-r--r--spec/services/unsuspend_account_service_spec.rb14
-rw-r--r--spec/services/verify_link_service_spec.rb27
-rw-r--r--spec/support/matchers/json/match_json_schema.rb6
-rw-r--r--spec/support/schema/nodeinfo_2.0.json170
-rw-r--r--streaming/index.js2
-rw-r--r--yarn.lock622
989 files changed, 16733 insertions, 6065 deletions
diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index ac495e1c9..425b86a6b 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -9,7 +9,7 @@ FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT}
 # The value is a comma-separated list of allowed domains
 ENV RAILS_DEVELOPMENT_HOSTS=".githubpreview.dev"
 
-# [Choice] Node.js version: lts/*, 16, 14, 12, 10
+# [Choice] Node.js version: lts/*, 18, 16, 14
 ARG NODE_VERSION="lts/*"
 RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"
 
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 47497794f..b98f6a21e 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -2,7 +2,7 @@
   "name": "Mastodon",
   "dockerComposeFile": "docker-compose.yml",
   "service": "app",
-  "workspaceFolder": "/workspaces/mastodon",
+  "workspaceFolder": "/mastodon",
 
   // Set *default* container specific settings.json values on container create.
   "settings": {},
@@ -15,12 +15,18 @@
     "webben.browserslist"
   ],
 
+  "features": {
+    "ghcr.io/devcontainers/features/sshd:1": {
+      "version": "latest"
+    }
+  },
+
   // Use 'forwardPorts' to make a list of ports inside the container available locally.
   // This can be used to network with other containers or the host.
   "forwardPorts": [3000, 4000],
 
   // Use 'postCreateCommand' to run commands after the container is created.
-  "postCreateCommand": "bundle install --path vendor/bundle && yarn install && git checkout -- Gemfile.lock && ./bin/rails db:setup",
+  "postCreateCommand": ".devcontainer/post-create.sh",
 
   // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
   "remoteUser": "vscode"
diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml
index 46f42c454..95f401379 100644
--- a/.devcontainer/docker-compose.yml
+++ b/.devcontainer/docker-compose.yml
@@ -11,9 +11,9 @@ services:
         # Use -bullseye variants on local arm64/Apple Silicon.
         VARIANT: '3.0-bullseye'
         # Optional Node.js version to install
-        NODE_VERSION: '14'
+        NODE_VERSION: '16'
     volumes:
-      - ..:/workspaces/mastodon:cached
+      - ..:/mastodon:cached
     environment:
       RAILS_ENV: development
       NODE_ENV: development
diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh
new file mode 100755
index 000000000..02f488f12
--- /dev/null
+++ b/.devcontainer/post-create.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+set -e # Fail the whole script on first error
+
+# Fetch Ruby gem dependencies
+bundle install --path vendor/bundle --with='development test'
+
+# Fetch Javascript dependencies
+yarn install
+
+# Make Gemfile.lock pristine again
+git checkout -- Gemfile.lock
+
+# [re]create, migrate, and seed the test database
+RAILS_ENV=test ./bin/rails db:setup
+
+# Precompile assets for development
+RAILS_ENV=development ./bin/rails assets:precompile
+
+# Precompile assets for test
+RAILS_ENV=test NODE_ENV=tests ./bin/rails assets:precompile
diff --git a/.env.production.sample b/.env.production.sample
index da4c7fe4c..7bcce0f7e 100644
--- a/.env.production.sample
+++ b/.env.production.sample
@@ -103,7 +103,7 @@ VAPID_PUBLIC_KEY=
 
 # Sending mail
 # ------------
-SMTP_SERVER=smtp.mailgun.org
+SMTP_SERVER=
 SMTP_PORT=587
 SMTP_LOGIN=
 SMTP_PASSWORD=
diff --git a/.eslintrc.js b/.eslintrc.js
index e4ada6fe0..03af2975b 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1,6 +1,10 @@
 module.exports = {
   root: true,
 
+  extends: [
+    'eslint:recommended',
+  ],
+
   env: {
     browser: true,
     node: true,
@@ -64,8 +68,8 @@ module.exports = {
     eqeqeq: 'error',
     indent: ['warn', 2],
     'jsx-quotes': ['error', 'prefer-single'],
+    'no-case-declarations': 'off',
     'no-catch-shadow': 'error',
-    'no-cond-assign': 'error',
     'no-console': [
       'warn',
       {
@@ -75,18 +79,16 @@ module.exports = {
         ],
       },
     ],
-    'no-fallthrough': 'error',
-    'no-irregular-whitespace': 'error',
-    'no-mixed-spaces-and-tabs': 'warn',
+    'no-empty': 'off',
     'no-nested-ternary': 'warn',
+    'no-prototype-builtins': 'off',
     'no-restricted-properties': [
       'error',
       { property: 'substring', message: 'Use .slice instead of .substring.' },
       { property: 'substr', message: 'Use .slice instead of .substr.' },
     ],
+    'no-self-assign': 'off',
     'no-trailing-spaces': 'warn',
-    'no-undef': 'error',
-    'no-unreachable': 'error',
     'no-unused-expressions': 'error',
     'no-unused-vars': [
       'error',
@@ -96,6 +98,7 @@ module.exports = {
         ignoreRestSiblings: true,
       },
     ],
+    'no-useless-escape': 'off',
     'object-curly-spacing': ['error', 'always'],
     'padded-blocks': [
       'error',
@@ -105,7 +108,6 @@ module.exports = {
     ],
     quotes: ['error', 'single'],
     semi: 'error',
-    strict: 'off',
     'valid-typeof': 'error',
 
     'react/jsx-boolean-value': 'error',
diff --git a/.nvmrc b/.nvmrc
index 8351c1939..b6a7d89c6 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-14
+16
diff --git a/.prettierignore b/.prettierignore
index f72354a42..dc8c53693 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -70,3 +70,10 @@ docker-compose.override.yml
 # Ignore locale files
 /app/javascript/mastodon/locales
 /config/locales
+
+# Ignore glitch-soc locale files
+/app/javascript/flavours/glitch/locales
+/config/locales-glitch
+
+# Ignore glitch-soc emoji map file
+/app/javascript/flavours/glitch/features/emoji/emoji_map.json
diff --git a/.rubocop.yml b/.rubocop.yml
index aec11b030..3c9223470 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -1,12 +1,18 @@
 require:
   - rubocop-rails
+  - rubocop-rspec
+  - rubocop-performance
 
 AllCops:
   TargetRubyVersion: 2.7
-  NewCops: disable
+  DisplayCopNames: true
+  DisplayStyleGuide: true
+  ExtraDetails: true
+  UseCache: true
+  CacheRootDirectory: tmp
+  NewCops: enable
   Exclude:
-    - 'spec/**/*'
-    - 'db/**/*'
+    - db/schema.rb
     - 'app/views/**/*'
     - 'config/**/*'
     - 'bin/*'
@@ -67,15 +73,57 @@ Lint/UselessAccessModifier:
     - class_methods
 
 Metrics/AbcSize:
-  Max: 115
+  Max: 34 # RuboCop default 17
   Exclude:
-    - 'lib/mastodon/*_cli.rb'
+    - 'lib/**/*cli*.rb'
+    - db/*migrate/**/*
+    - lib/paperclip/color_extractor.rb
+    - app/workers/scheduler/follow_recommendations_scheduler.rb
+    - app/services/activitypub/fetch*_service.rb
+    - lib/paperclip/**/*
+  CountRepeatedAttributes: false
+  AllowedMethods:
+    - update_media_attachments!
+    - account_link_to
+    - attempt_oembed
+    - build_crutches
+    - calculate_scores
+    - cc
+    - dump_actor!
+    - filter_from_home?
+    - hydrate
+    - import_bookmarks!
+    - import_relationships!
+    - initialize
+    - link_to_mention
+    - log_target
+    - matches_time_window?
+    - parse_metadata
+    - perform_statuses_search!
+    - privatize_media_attachments!
+    - process_update
+    - publish_media_attachments!
+    - remotable_attachment
+    - render_initial_state
+    - render_with_cache
+    - searchable_by
+    - self.cached_filters_for
+    - set_fetchable_attributes!
+    - signed_request_actor
+    - statuses_to_delete
+    - update_poll!
 
 Metrics/BlockLength:
   Max: 55
   Exclude:
-    - 'lib/tasks/**/*'
     - 'lib/mastodon/*_cli.rb'
+  CountComments: false
+  CountAsOne: [array, heredoc]
+  AllowedMethods:
+    - task
+    - namespace
+    - class_methods
+    - included
 
 Metrics/BlockNesting:
   Max: 3
@@ -85,34 +133,144 @@ Metrics/BlockNesting:
 Metrics/ClassLength:
   CountComments: false
   Max: 500
+  CountAsOne: [array, heredoc]
   Exclude:
     - 'lib/mastodon/*_cli.rb'
 
 Metrics/CyclomaticComplexity:
-  Max: 25
+  Max: 12
   Exclude:
-    - 'lib/mastodon/*_cli.rb'
+    - lib/mastodon/*cli*.rb
+    - db/*migrate/**/*
+  AllowedMethods:
+    - attempt_oembed
+    - blocked?
+    - build_crutches
+    - calculate_scores
+    - cc
+    - discover_endpoint!
+    - filter_from_home?
+    - hydrate
+    - klass
+    - link_to_mention
+    - log_target
+    - matches_time_window?
+    - patch_for_forwarding!
+    - preprocess_attributes!
+    - process_update
+    - remotable_attachment
+    - scan_text!
+    - self.cached_filters_for
+    - set_fetchable_attributes!
+    - setup_redis_env_url
+    - update_media_attachments!
 
 Layout/LineLength:
+  Max: 140 # RuboCop default 120
+  AllowHeredoc: true
   AllowURI: true
-  Enabled: false
+  IgnoreCopDirectives: true
+  AllowedPatterns:
+    # Allow comments to be long lines
+    - !ruby/regexp / \# .*$/
+    - !ruby/regexp /^\# .*$/
+  Exclude:
+    - lib/**/*cli*.rb
+    - db/*migrate/**/*
+    - db/seeds/**/*
 
 Metrics/MethodLength:
   CountComments: false
-  Max: 65
+  CountAsOne: [array, heredoc]
+  Max: 25 # RuboCop default 10
   Exclude:
     - 'lib/mastodon/*_cli.rb'
+  AllowedMethods:
+    - account_link_to
+    - attempt_oembed
+    - body_with_limit
+    - build_crutches
+    - cached_filters_for
+    - calculate_scores
+    - check_webfinger!
+    - clean_feeds!
+    - collection_items
+    - collection_presenter
+    - copy_account_notes!
+    - deduplicate_accounts!
+    - deduplicate_conversations!
+    - deduplicate_local_accounts!
+    - deduplicate_statuses!
+    - deduplicate_tags!
+    - deduplicate_users!
+    - discover_endpoint!
+    - extract_extra_uris_with_indices
+    - extract_hashtags_with_indices
+    - extract_mentions_or_lists_with_indices
+    - filter_from_home?
+    - from_elasticsearch
+    - handle_explicit_update!
+    - handle_mark_as_sensitive!
+    - hsl_to_rgb
+    - import_bookmarks!
+    - import_domain_blocks!
+    - import_relationships!
+    - ldap_options
+    - matches_time_window?
+    - outbox_presenter
+    - pam_get_user
+    - parallelize_with_progress
+    - parse_and_transform
+    - patch_for_forwarding!
+    - populate_home
+    - post_process_style
+    - preload_cache_collection_target_statuses
+    - privatize_media_attachments!
+    - provides_callback_for
+    - publish_media_attachments!
+    - relevant_account_timestamp
+    - remotable_attachment
+    - rgb_to_hsl
+    - rss_status_content_format
+    - set_fetchable_attributes!
+    - setup_redis_env_url
+    - signed_request_actor
+    - to_preview_card_attributes
+    - upgrade_storage_filesystem
+    - upgrade_storage_s3
+    - user_settings_params
+    - hydrate
+    - cc
+    - self_destruct
 
 Metrics/ModuleLength:
   CountComments: false
   Max: 200
+  CountAsOne: [array, heredoc]
 
 Metrics/ParameterLists:
-  Max: 5
-  CountKeywordArgs: true
+  Max: 5 # RuboCop default 5
+  CountKeywordArgs: true # RuboCop default true
+  MaxOptionalParameters: 3 # RuboCop default 3
+  Exclude:
+    - app/models/concerns/account_interactions.rb
+    - app/services/activitypub/fetch_remote_account_service.rb
+    - app/services/activitypub/fetch_remote_actor_service.rb
 
 Metrics/PerceivedComplexity:
-  Max: 25
+  Max: 16 # RuboCop default 8
+  AllowedMethods:
+    - attempt_oembed
+    - build_crutches
+    - calculate_scores
+    - deduplicate_users!
+    - discover_endpoint!
+    - filter_from_home?
+    - hydrate
+    - patch_for_forwarding!
+    - process_update
+    - remove_orphans
+    - update_media_attachments!
 
 Naming/MemoizedInstanceVariableName:
   Enabled: false
@@ -267,9 +425,6 @@ Style/PercentLiteralDelimiters:
 Style/PerlBackrefs:
   AutoCorrect: false
 
-Style/RedundantAssignment:
-  Enabled: false
-
 Style/RedundantFetchBlock:
   Enabled: true
 
@@ -292,7 +447,7 @@ Style/RegexpLiteral:
   Enabled: false
 
 Style/RescueStandardError:
-  Enabled: false
+  Enabled: true
 
 Style/SignalException:
   Enabled: false
@@ -311,3 +466,14 @@ Style/TrailingCommaInHashLiteral:
 
 Style/UnpackFirst:
   Enabled: false
+
+RSpec/ScatteredSetup:
+  Enabled: false
+RSpec/ImplicitExpect:
+  Enabled: false
+RSpec/NamedSubject:
+  Enabled: false
+RSpec/DescribeClass:
+  Enabled: false
+RSpec/LetSetup:
+  Enabled: false
diff --git a/Aptfile b/Aptfile
index a52eef4e1..8f5bb72a2 100644
--- a/Aptfile
+++ b/Aptfile
@@ -1,26 +1,4 @@
 ffmpeg
-libicu[0-9][0-9]
-libicu-dev
-libidn12
-libidn-dev
 libpq-dev
 libxdamage1
 libxfixes3
-zlib1g-dev
-libcairo2
-libcroco3
-libdatrie1
-libgdk-pixbuf2.0-0
-libgraphite2-3
-libharfbuzz0b
-libpango-1.0-0
-libpangocairo-1.0-0
-libpangoft2-1.0-0
-libpixman-1-0
-librsvg2-2
-libthai-data
-libthai0
-libvpx[5-9]
-libxcb-render0
-libxcb-shm0
-libxrender1
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index cc0a7f51b..b3eafdc48 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -40,7 +40,7 @@ Project maintainers who do not follow or enforce the Code of Conduct in good fai
 
 ## Attribution
 
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://contributor-covenant.org/version/1/4][version]
 
-[homepage]: http://contributor-covenant.org
-[version]: http://contributor-covenant.org/version/1/4/
+[homepage]: https://contributor-covenant.org
+[version]: https://contributor-covenant.org/version/1/4/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 049cd4e29..ed670f5a6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -6,6 +6,12 @@ Here are some guidelines, and ways you can help.
 >   (This document is a bit of a work-in-progress, so please bear with us.
 >   If you don't see what you're looking for here, please don't hesitate to reach out!)
 
+## Translations
+
+You can submit glitch-soc-specific translations via [Crowdin](https://crowdin.com/project/glitch-soc). They are periodically merged into the codebase.
+
+[![Crowdin](https://badges.crowdin.net/glitch-soc/localized.svg)](https://crowdin.com/project/glitch-soc)
+
 ##  Planning  ##
 
 Right now a lot of the planning for this project takes place in our development Discord, or through GitHub Issues and Projects.
diff --git a/Dockerfile b/Dockerfile
index 48df56dd3..df2251425 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -15,7 +15,8 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 WORKDIR /opt/mastodon
 COPY Gemfile* package.json yarn.lock /opt/mastodon/
 
-RUN apt update && \
+# hadolint ignore=DL3008
+RUN apt-get update && \
     apt-get install -y --no-install-recommends build-essential \
         ca-certificates \
         git \
@@ -50,10 +51,12 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 ENV DEBIAN_FRONTEND="noninteractive" \
     PATH="${PATH}:/opt/ruby/bin:/opt/mastodon/bin"
 
+# Ignoreing these here since we don't want to pin any versions and the Debian image removes apt-get content after use
+# hadolint ignore=DL3008,DL3009
 RUN apt-get update && \
     echo "Etc/UTC" > /etc/localtime && \
     groupadd -g "${GID}" mastodon && \
-    useradd -u "$UID" -g "${GID}" -m -d /opt/mastodon mastodon && \
+    useradd -l -u "$UID" -g "${GID}" -m -d /opt/mastodon mastodon && \
     apt-get -y --no-install-recommends install whois \
         wget \
         procps \
diff --git a/Gemfile b/Gemfile
index 42d30589f..930ff6c4a 100644
--- a/Gemfile
+++ b/Gemfile
@@ -10,7 +10,7 @@ gem 'puma', '~> 5.6'
 gem 'rails', '~> 6.1.7'
 gem 'sprockets', '~> 3.7.2'
 gem 'thor', '~> 1.2'
-gem 'rack', '~> 2.2.4'
+gem 'rack', '~> 2.2.5'
 
 gem 'hamlit-rails', '~> 0.2'
 gem 'pg', '~> 1.4'
@@ -19,7 +19,7 @@ gem 'pghero', '~> 2.8'
 gem 'dotenv-rails', '~> 2.8'
 
 gem 'aws-sdk-s3', '~> 1.117', require: false
-gem 'fog-core', '<= 2.1.0'
+gem 'fog-core', '<= 2.4.0'
 gem 'fog-openstack', '~> 0.3', require: false
 gem 'kt-paperclip', '~> 7.1'
 gem 'blurhash', '~> 0.1'
@@ -51,7 +51,7 @@ gem 'ed25519', '~> 1.3'
 gem 'fast_blank', '~> 1.0'
 gem 'fastimage'
 gem 'hiredis', '~> 0.6'
-gem 'redis-namespace', '~> 1.9'
+gem 'redis-namespace', '~> 1.10'
 gem 'htmlentities', '~> 4.3'
 gem 'http', '~> 5.1'
 gem 'http_accept_language', '~> 2.1'
@@ -67,7 +67,7 @@ gem 'ox', '~> 2.14'
 gem 'parslet'
 gem 'posix-spawn'
 gem 'public_suffix', '~> 5.0'
-gem 'pundit', '~> 2.2'
+gem 'pundit', '~> 2.3'
 gem 'premailer-rails'
 gem 'rack-attack', '~> 6.6'
 gem 'rack-cors', '~> 1.1', require: 'rack/cors'
@@ -79,7 +79,7 @@ gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
 gem 'rqrcode', '~> 2.1'
 gem 'ruby-progressbar', '~> 1.11'
 gem 'sanitize', '~> 6.0'
-gem 'scenic', '~> 1.6'
+gem 'scenic', '~> 1.7'
 gem 'sidekiq', '~> 6.5'
 gem 'sidekiq-scheduler', '~> 4.0'
 gem 'sidekiq-unique-jobs', '~> 7.1'
@@ -107,6 +107,10 @@ group :development, :test do
   gem 'pry-byebug', '~> 3.10'
   gem 'pry-rails', '~> 0.3'
   gem 'rspec-rails', '~> 5.1'
+  gem 'rubocop-performance', require: false
+  gem 'rubocop-rails', require: false
+  gem 'rubocop-rspec', require: false
+  gem 'rubocop', require: false
 end
 
 group :production, :test do
@@ -116,14 +120,14 @@ end
 group :test do
   gem 'capybara', '~> 3.38'
   gem 'climate_control', '~> 0.2'
-  gem 'faker', '~> 3.0'
-  gem 'microformats', '~> 4.4'
+  gem 'faker', '~> 3.1'
+  gem 'json-schema', '~> 3.0'
+  gem 'rack-test', '~> 2.0'  
   gem 'rails-controller-testing', '~> 1.0'
+  gem 'rspec_junit_formatter', '~> 0.6'
   gem 'rspec-sidekiq', '~> 3.1'
-  gem 'simplecov', '~> 0.21', require: false
+  gem 'simplecov', '~> 0.22', require: false
   gem 'webmock', '~> 3.18'
-  gem 'rspec_junit_formatter', '~> 0.6'
-  gem 'rack-test', '~> 2.0'
 end
 
 group :development do
@@ -135,8 +139,6 @@ group :development do
   gem 'letter_opener', '~> 1.8'
   gem 'letter_opener_web', '~> 2.0'
   gem 'memory_profiler'
-  gem 'rubocop', '~> 1.30', require: false
-  gem 'rubocop-rails', '~> 2.15', require: false
   gem 'brakeman', '~> 5.4', require: false
   gem 'bundler-audit', '~> 0.9', require: false
 
diff --git a/Gemfile.lock b/Gemfile.lock
index afc7f00a5..80c46f07c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -130,7 +130,7 @@ GEM
       concurrent-ruby (~> 1.0, >= 1.0.5)
       redis (>= 1.0, < 6)
     builder (3.2.4)
-    bullet (7.0.4)
+    bullet (7.0.7)
       activesupport (>= 3.0.0)
       uniform_notifier (~> 1.11)
     bundler-audit (0.9.1)
@@ -203,7 +203,7 @@ GEM
     diff-lcs (1.5.0)
     discard (1.2.1)
       activerecord (>= 4.2, < 8)
-    docile (1.3.4)
+    docile (1.4.0)
     domain_name (0.5.20190701)
       unf (>= 0.0.5, < 1.0.0)
     doorkeeper (5.6.2)
@@ -226,9 +226,9 @@ GEM
     erubi (1.11.0)
     et-orbi (1.2.7)
       tzinfo
-    excon (0.76.0)
+    excon (0.95.0)
     fabrication (2.30.0)
-    faker (3.0.0)
+    faker (3.1.0)
       i18n (>= 1.8.11, < 2)
     faraday (1.9.3)
       faraday-em_http (~> 1.0)
@@ -271,7 +271,7 @@ GEM
       fog-core (>= 1.45, <= 2.1.0)
       fog-json (>= 1.0)
       ipaddress (>= 0.8)
-    formatador (0.2.5)
+    formatador (0.3.0)
     fugit (1.7.1)
       et-orbi (~> 1, >= 1.2.7)
       raabro (~> 1.4)
@@ -301,7 +301,7 @@ GEM
     hiredis (0.6.3)
     hkdf (0.3.0)
     htmlentities (4.3.4)
-    http (5.1.0)
+    http (5.1.1)
       addressable (~> 2.8)
       http-cookie (~> 1.0)
       http-form_data (~> 2.2)
@@ -330,9 +330,9 @@ GEM
     idn-ruby (0.1.5)
     ipaddress (0.8.3)
     jmespath (1.6.2)
-    json (2.6.2)
+    json (2.6.3)
     json-canonicalization (0.3.0)
-    json-jwt (1.13.0)
+    json-jwt (1.14.0)
       activesupport (>= 4.2)
       aes_key_wrap
       bindata
@@ -346,8 +346,10 @@ GEM
     json-ld-preloaded (3.2.2)
       json-ld (~> 3.2)
       rdf (~> 3.2)
+    json-schema (3.0.0)
+      addressable (>= 2.8)
     jsonapi-renderer (0.2.2)
-    jwt (2.4.1)
+    jwt (2.5.0)
     kaminari (1.2.2)
       activesupport (>= 4.1.0)
       kaminari-actionview (= 1.2.2)
@@ -384,7 +386,7 @@ GEM
       activesupport (>= 4)
       railties (>= 4)
       request_store (~> 1.0)
-    loofah (2.19.0)
+    loofah (2.19.1)
       crass (~> 1.0.2)
       nokogiri (>= 1.5.9)
     mail (2.7.1)
@@ -397,15 +399,12 @@ GEM
     matrix (0.4.2)
     memory_profiler (1.0.1)
     method_source (1.0.0)
-    microformats (4.4.1)
-      json (~> 2.2)
-      nokogiri (~> 1.10)
     mime-types (3.4.1)
       mime-types-data (~> 3.2015)
     mime-types-data (3.2022.0105)
     mini_mime (1.1.2)
     mini_portile2 (2.8.0)
-    minitest (5.16.3)
+    minitest (5.17.0)
     msgpack (1.6.0)
     multi_json (1.15.0)
     multipart-post (2.1.1)
@@ -454,9 +453,9 @@ GEM
     openssl-signature_algorithm (1.2.1)
       openssl (> 2.0, < 3.1)
     orm_adapter (0.5.0)
-    ox (2.14.11)
+    ox (2.14.12)
     parallel (1.22.1)
-    parser (3.1.2.1)
+    parser (3.1.3.0)
       ast (~> 2.4.1)
     parslet (2.0.0)
     pastel (0.8.0)
@@ -483,14 +482,14 @@ GEM
       pry (>= 0.13, < 0.15)
     pry-rails (0.3.9)
       pry (>= 0.10.4)
-    public_suffix (5.0.0)
+    public_suffix (5.0.1)
     puma (5.6.5)
       nio4r (~> 2.0)
-    pundit (2.2.0)
+    pundit (2.3.0)
       activesupport (>= 3.0.0)
     raabro (1.4.0)
     racc (1.6.1)
-    rack (2.2.4)
+    rack (2.2.5)
     rack-attack (6.6.1)
       rack (>= 1.0, < 3)
     rack-cors (1.1.1)
@@ -527,8 +526,8 @@ GEM
     rails-dom-testing (2.0.3)
       activesupport (>= 4.2.0)
       nokogiri (>= 1.6)
-    rails-html-sanitizer (1.4.3)
-      loofah (~> 2.3)
+    rails-html-sanitizer (1.4.4)
+      loofah (~> 2.19, >= 2.19.1)
     rails-i18n (6.0.0)
       i18n (>= 0.7, < 2)
       railties (>= 6.0.0, < 7)
@@ -548,11 +547,11 @@ GEM
       rdf (~> 3.2)
     redcarpet (3.5.1)
     redis (4.5.1)
-    redis-namespace (1.9.0)
+    redis-namespace (1.10.0)
       redis (>= 4)
     redlock (1.3.2)
       redis (>= 3.0.0, < 6.0)
-    regexp_parser (2.6.0)
+    regexp_parser (2.6.1)
     request_store (1.5.1)
       rack (>= 1.4)
     responders (3.0.1)
@@ -587,21 +586,27 @@ GEM
     rspec-support (3.11.1)
     rspec_junit_formatter (0.6.0)
       rspec-core (>= 2, < 4, != 2.12.0)
-    rubocop (1.30.1)
+    rubocop (1.42.0)
+      json (~> 2.3)
       parallel (~> 1.10)
-      parser (>= 3.1.0.0)
+      parser (>= 3.1.2.1)
       rainbow (>= 2.2.2, < 4.0)
       regexp_parser (>= 1.8, < 3.0)
       rexml (>= 3.2.5, < 4.0)
-      rubocop-ast (>= 1.18.0, < 2.0)
+      rubocop-ast (>= 1.24.1, < 2.0)
       ruby-progressbar (~> 1.7)
       unicode-display_width (>= 1.4.0, < 3.0)
-    rubocop-ast (1.18.0)
+    rubocop-ast (1.24.1)
       parser (>= 3.1.1.0)
-    rubocop-rails (2.15.0)
+    rubocop-performance (1.15.2)
+      rubocop (>= 1.7.0, < 2.0)
+      rubocop-ast (>= 0.4.0)
+    rubocop-rails (2.17.4)
       activesupport (>= 4.2.0)
       rack (>= 1.1)
-      rubocop (>= 1.7.0, < 2.0)
+      rubocop (>= 1.33.0, < 2.0)
+    rubocop-rspec (2.16.0)
+      rubocop (~> 1.33)
     ruby-progressbar (1.11.0)
     ruby-saml (1.13.0)
       nokogiri (>= 1.10.5)
@@ -614,7 +619,7 @@ GEM
     sanitize (6.0.0)
       crass (~> 1.0.2)
       nokogiri (>= 1.12.0)
-    scenic (1.6.0)
+    scenic (1.7.0)
       activerecord (>= 4.0.0)
       railties (>= 4.0.0)
     semantic_range (3.0.0)
@@ -640,12 +645,12 @@ GEM
     simple_form (5.1.0)
       actionpack (>= 5.2)
       activemodel (>= 5.2)
-    simplecov (0.21.2)
+    simplecov (0.22.0)
       docile (~> 1.1)
       simplecov-html (~> 0.11)
       simplecov_json_formatter (~> 0.1)
     simplecov-html (0.12.3)
-    simplecov_json_formatter (0.1.2)
+    simplecov_json_formatter (0.1.4)
     smart_properties (1.17.0)
     sprockets (3.7.2)
       concurrent-ruby (~> 1.0)
@@ -776,10 +781,10 @@ DEPENDENCIES
   dotenv-rails (~> 2.8)
   ed25519 (~> 1.3)
   fabrication (~> 2.30)
-  faker (~> 3.0)
+  faker (~> 3.1)
   fast_blank (~> 1.0)
   fastimage
-  fog-core (<= 2.1.0)
+  fog-core (<= 2.4.0)
   fog-openstack (~> 0.3)
   fuubar (~> 2.5)
   gitlab-omniauth-openid-connect (~> 0.10.0)
@@ -794,6 +799,7 @@ DEPENDENCIES
   idn-ruby
   json-ld
   json-ld-preloaded (~> 3.2)
+  json-schema (~> 3.0)
   kaminari (~> 1.2)
   kt-paperclip (~> 7.1)
   letter_opener (~> 1.8)
@@ -803,7 +809,6 @@ DEPENDENCIES
   makara (~> 0.5)
   mario-redis-lock (~> 1.2)
   memory_profiler
-  microformats (~> 4.4)
   mime-types (~> 3.4.1)
   net-ldap (~> 0.17)
   nokogiri (~> 1.13)
@@ -825,8 +830,8 @@ DEPENDENCIES
   pry-rails (~> 0.3)
   public_suffix (~> 5.0)
   puma (~> 5.6)
-  pundit (~> 2.2)
-  rack (~> 2.2.4)
+  pundit (~> 2.3)
+  rack (~> 2.2.5)
   rack-attack (~> 6.6)
   rack-cors (~> 1.1)
   rack-test (~> 2.0)
@@ -837,24 +842,26 @@ DEPENDENCIES
   rdf-normalize (~> 0.5)
   redcarpet (~> 3.5)
   redis (~> 4.5)
-  redis-namespace (~> 1.9)
+  redis-namespace (~> 1.10)
   rexml (~> 3.2)
   rqrcode (~> 2.1)
   rspec-rails (~> 5.1)
   rspec-sidekiq (~> 3.1)
   rspec_junit_formatter (~> 0.6)
-  rubocop (~> 1.30)
-  rubocop-rails (~> 2.15)
+  rubocop
+  rubocop-performance
+  rubocop-rails
+  rubocop-rspec
   ruby-progressbar (~> 1.11)
   sanitize (~> 6.0)
-  scenic (~> 1.6)
+  scenic (~> 1.7)
   sidekiq (~> 6.5)
   sidekiq-bulk (~> 0.2.0)
   sidekiq-scheduler (~> 4.0)
   sidekiq-unique-jobs (~> 7.1)
   simple-navigation (~> 4.4)
   simple_form (~> 5.1)
-  simplecov (~> 0.21)
+  simplecov (~> 0.22)
   sprockets (~> 3.7.2)
   sprockets-rails (~> 3.4)
   stackprof
diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb
index e79f7a43e..74764640b 100644
--- a/app/controllers/admin/domain_blocks_controller.rb
+++ b/app/controllers/admin/domain_blocks_controller.rb
@@ -55,12 +55,8 @@ module Admin
     def update
       authorize :domain_block, :update?
 
-      @domain_block.update(update_params)
-
-      severity_changed = @domain_block.severity_changed?
-
-      if @domain_block.save
-        DomainBlockWorker.perform_async(@domain_block.id, severity_changed)
+      if @domain_block.update(update_params)
+        DomainBlockWorker.perform_async(@domain_block.id, @domain_block.severity_previously_changed?)
         log_action :update, @domain_block
         redirect_to admin_instances_path(limited: '1'), notice: I18n.t('admin.domain_blocks.created_msg')
       else
diff --git a/app/controllers/admin/instances_controller.rb b/app/controllers/admin/instances_controller.rb
index 7c44e88b7..519405726 100644
--- a/app/controllers/admin/instances_controller.rb
+++ b/app/controllers/admin/instances_controller.rb
@@ -49,7 +49,7 @@ module Admin
     private
 
     def set_instance
-      @instance = Instance.find(params[:id])
+      @instance = Instance.find(TagManager.instance.normalize_domain(params[:id]&.strip))
     end
 
     def set_instances
diff --git a/app/controllers/admin/relays_controller.rb b/app/controllers/admin/relays_controller.rb
index 6fbb6e063..c1297c8b9 100644
--- a/app/controllers/admin/relays_controller.rb
+++ b/app/controllers/admin/relays_controller.rb
@@ -3,7 +3,7 @@
 module Admin
   class RelaysController < BaseController
     before_action :set_relay, except: [:index, :new, :create]
-    before_action :require_signatures_enabled!, only: [:new, :create, :enable]
+    before_action :warn_signatures_not_enabled!, only: [:new, :create, :enable]
 
     def index
       authorize :relay, :update?
@@ -56,8 +56,8 @@ module Admin
       params.require(:relay).permit(:inbox_url)
     end
 
-    def require_signatures_enabled!
-      redirect_to admin_relays_path, alert: I18n.t('admin.relays.signatures_not_enabled') if authorized_fetch_mode?
+    def warn_signatures_not_enabled!
+      flash.now[:error] = I18n.t('admin.relays.signatures_not_enabled') if authorized_fetch_mode?
     end
   end
 end
diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb
index defef0656..41f3ce2ee 100644
--- a/app/controllers/api/base_controller.rb
+++ b/app/controllers/api/base_controller.rb
@@ -16,6 +16,26 @@ class Api::BaseController < ApplicationController
 
   protect_from_forgery with: :null_session
 
+  content_security_policy do |p|
+    # Set every directive that does not have a fallback
+    p.default_src :none
+    p.frame_ancestors :none
+    p.form_action :none
+
+    # Disable every directive with a fallback to cut on response size
+    p.base_uri false
+    p.font_src false
+    p.img_src false
+    p.style_src false
+    p.media_src false
+    p.frame_src false
+    p.manifest_src false
+    p.connect_src false
+    p.script_src false
+    p.child_src false
+    p.worker_src false
+  end
+
   rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e|
     render json: { error: e.to_s }, status: 422
   end
diff --git a/app/controllers/api/v1/accounts/credentials_controller.rb b/app/controllers/api/v1/accounts/credentials_controller.rb
index 64b5cb747..94b707771 100644
--- a/app/controllers/api/v1/accounts/credentials_controller.rb
+++ b/app/controllers/api/v1/accounts/credentials_controller.rb
@@ -21,7 +21,17 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
   private
 
   def account_params
-    params.permit(:display_name, :note, :avatar, :header, :locked, :bot, :discoverable, fields_attributes: [:name, :value])
+    params.permit(
+      :display_name,
+      :note,
+      :avatar,
+      :header,
+      :locked,
+      :bot,
+      :discoverable,
+      :hide_collections,
+      fields_attributes: [:name, :value]
+    )
   end
 
   def user_settings_params
diff --git a/app/controllers/api/v1/admin/domain_blocks_controller.rb b/app/controllers/api/v1/admin/domain_blocks_controller.rb
index df5b1b3fc..8b77e9717 100644
--- a/app/controllers/api/v1/admin/domain_blocks_controller.rb
+++ b/app/controllers/api/v1/admin/domain_blocks_controller.rb
@@ -40,10 +40,8 @@ class Api::V1::Admin::DomainBlocksController < Api::BaseController
 
   def update
     authorize @domain_block, :update?
-    @domain_block.update(domain_block_params)
-    severity_changed = @domain_block.severity_changed?
-    @domain_block.save!
-    DomainBlockWorker.perform_async(@domain_block.id, severity_changed)
+    @domain_block.update!(domain_block_params)
+    DomainBlockWorker.perform_async(@domain_block.id, @domain_block.severity_previously_changed?)
     log_action :update, @domain_block
     render json: @domain_block, serializer: REST::Admin::DomainBlockSerializer
   end
diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb
index ac49167cb..a6ed359c9 100644
--- a/app/controllers/api/v1/notifications_controller.rb
+++ b/app/controllers/api/v1/notifications_controller.rb
@@ -40,7 +40,7 @@ class Api::V1::NotificationsController < Api::BaseController
   private
 
   def load_notifications
-    notifications = browserable_account_notifications.includes(from_account: :account_stat).to_a_paginated_by_id(
+    notifications = browserable_account_notifications.includes(from_account: [:account_stat, :user]).to_a_paginated_by_id(
       limit_param(DEFAULT_NOTIFICATIONS_LIMIT),
       params_slice(:max_id, :since_id, :min_id)
     )
diff --git a/app/controllers/auth/passwords_controller.rb b/app/controllers/auth/passwords_controller.rb
index 609220eb1..576c3e7bc 100644
--- a/app/controllers/auth/passwords_controller.rb
+++ b/app/controllers/auth/passwords_controller.rb
@@ -11,6 +11,8 @@ class Auth::PasswordsController < Devise::PasswordsController
     super do |resource|
       if resource.errors.empty?
         resource.session_activations.destroy_all
+
+        resource.revoke_access!
       end
     end
   end
diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb
index d363efeee..40c38bc6d 100644
--- a/app/controllers/auth/registrations_controller.rb
+++ b/app/controllers/auth/registrations_controller.rb
@@ -57,8 +57,8 @@ class Auth::RegistrationsController < Devise::RegistrationsController
   end
 
   def configure_sign_up_params
-    devise_parameter_sanitizer.permit(:sign_up) do |u|
-      u.permit({ account_attributes: [:username, :display_name], invite_request_attributes: [:text] }, :email, :password, :password_confirmation, :invite_code, :agreement, :website, :confirm_password)
+    devise_parameter_sanitizer.permit(:sign_up) do |user_params|
+      user_params.permit({ account_attributes: [:username, :display_name], invite_request_attributes: [:text] }, :email, :password, :password_confirmation, :invite_code, :agreement, :website, :confirm_password)
     end
   end
 
diff --git a/app/controllers/concerns/rate_limit_headers.rb b/app/controllers/concerns/rate_limit_headers.rb
index 86fe58a71..b8696df73 100644
--- a/app/controllers/concerns/rate_limit_headers.rb
+++ b/app/controllers/concerns/rate_limit_headers.rb
@@ -58,7 +58,7 @@ module RateLimitHeaders
   end
 
   def api_throttle_data
-    most_limited_type, = request.env['rack.attack.throttle_data'].min_by { |_, v| v[:limit] - v[:count] }
+    most_limited_type, = request.env['rack.attack.throttle_data'].min_by { |_key, value| value[:limit] - value[:count] }
     request.env['rack.attack.throttle_data'][most_limited_type]
   end
 
diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb
index 2394574b3..4502da698 100644
--- a/app/controllers/concerns/signature_verification.rb
+++ b/app/controllers/concerns/signature_verification.rb
@@ -28,8 +28,8 @@ module SignatureVerification
   end
 
   class SignatureParamsTransformer < Parslet::Transform
-    rule(params: subtree(:p)) do
-      (p.is_a?(Array) ? p : [p]).each_with_object({}) { |(key, val), h| h[key] = val }
+    rule(params: subtree(:param)) do
+      (param.is_a?(Array) ? param : [param]).each_with_object({}) { |(key, value), hash| hash[key] = value }
     end
 
     rule(param: { key: simple(:key), value: simple(:val) }) do
diff --git a/app/controllers/concerns/web_app_controller_concern.rb b/app/controllers/concerns/web_app_controller_concern.rb
index b6050c913..7ba7a57e3 100644
--- a/app/controllers/concerns/web_app_controller_concern.rb
+++ b/app/controllers/concerns/web_app_controller_concern.rb
@@ -4,22 +4,17 @@ module WebAppControllerConcern
   extend ActiveSupport::Concern
 
   included do
+    prepend_before_action :redirect_unauthenticated_to_permalinks!
     before_action :set_pack
-    before_action :redirect_unauthenticated_to_permalinks!
     before_action :set_app_body_class
-    before_action :set_referrer_policy_header
   end
 
   def set_app_body_class
     @body_classes = 'app-body'
   end
 
-  def set_referrer_policy_header
-    response.headers['Referrer-Policy'] = 'origin'
-  end
-
   def redirect_unauthenticated_to_permalinks!
-    return if user_signed_in?
+    return if user_signed_in? # NOTE: Different from upstream because we allow moved users to log in
 
     redirect_path = PermalinkRedirector.new(request.path).redirect_path
 
diff --git a/app/controllers/follower_accounts_controller.rb b/app/controllers/follower_accounts_controller.rb
index 35ce31f80..1f5ed30de 100644
--- a/app/controllers/follower_accounts_controller.rb
+++ b/app/controllers/follower_accounts_controller.rb
@@ -63,7 +63,7 @@ class FollowerAccountsController < ApplicationController
     if page_requested?
       ActivityPub::CollectionPresenter.new(
         id: account_followers_url(@account, page: params.fetch(:page, 1)),
-        items: follows.map { |f| ActivityPub::TagManager.instance.uri_for(f.account) },
+        items: follows.map { |follow| ActivityPub::TagManager.instance.uri_for(follow.account) },
         part_of: account_followers_url(@account),
         next: next_page_url,
         prev: prev_page_url,
diff --git a/app/controllers/following_accounts_controller.rb b/app/controllers/following_accounts_controller.rb
index f84dca1e5..febd13c97 100644
--- a/app/controllers/following_accounts_controller.rb
+++ b/app/controllers/following_accounts_controller.rb
@@ -66,7 +66,7 @@ class FollowingAccountsController < ApplicationController
         id: account_following_index_url(@account, page: params.fetch(:page, 1)),
         type: :ordered,
         size: @account.following_count,
-        items: follows.map { |f| ActivityPub::TagManager.instance.uri_for(f.target_account) },
+        items: follows.map { |follow| ActivityPub::TagManager.instance.uri_for(follow.target_account) },
         part_of: account_following_index_url(@account),
         next: next_page_url,
         prev: prev_page_url
diff --git a/app/controllers/media_controller.rb b/app/controllers/media_controller.rb
index d2de432ba..f9160d8c4 100644
--- a/app/controllers/media_controller.rb
+++ b/app/controllers/media_controller.rb
@@ -13,8 +13,8 @@ class MediaController < ApplicationController
   before_action :allow_iframing, only: :player
   before_action :set_pack, only: :player
 
-  content_security_policy only: :player do |p|
-    p.frame_ancestors(false)
+  content_security_policy only: :player do |policy|
+    policy.frame_ancestors(false)
   end
 
   def show
diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb
index 1a835c726..e5221df3a 100644
--- a/app/controllers/statuses_controller.rb
+++ b/app/controllers/statuses_controller.rb
@@ -17,8 +17,8 @@ class StatusesController < ApplicationController
   skip_around_action :set_locale, if: -> { request.format == :json }
   skip_before_action :require_functional!, only: [:show, :embed], unless: :whitelist_mode?
 
-  content_security_policy only: :embed do |p|
-    p.frame_ancestors(false)
+  content_security_policy only: :embed do |policy|
+    policy.frame_ancestors(false)
   end
 
   def show
diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb
index f0a099350..65017acba 100644
--- a/app/controllers/tags_controller.rb
+++ b/app/controllers/tags_controller.rb
@@ -65,7 +65,7 @@ class TagsController < ApplicationController
       id: tag_url(@tag),
       type: :ordered,
       size: @tag.statuses.count,
-      items: @statuses.map { |s| ActivityPub::TagManager.instance.uri_for(s) }
+      items: @statuses.map { |status| ActivityPub::TagManager.instance.uri_for(status) }
     )
   end
 end
diff --git a/app/helpers/formatting_helper.rb b/app/helpers/formatting_helper.rb
index 448177bec..05c003037 100644
--- a/app/helpers/formatting_helper.rb
+++ b/app/helpers/formatting_helper.rb
@@ -23,19 +23,28 @@ module FormattingHelper
 
     before_html = begin
       if status.spoiler_text?
-        "<p><strong>#{I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale)}</strong> #{h(status.spoiler_text)}</p><hr />"
-      else
-        ''
+        tag.p do
+          tag.strong do
+            I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale)
+          end
+
+          status.spoiler_text
+        end + tag.hr
       end
-    end.html_safe # rubocop:disable Rails/OutputSafety
+    end
 
     after_html = begin
       if status.preloadable_poll
-        "<p>#{status.preloadable_poll.options.map { |o| "<input type=#{status.preloadable_poll.multiple? ? 'checkbox' : 'radio'} disabled /> #{h(o)}" }.join('<br />')}</p>"
-      else
-        ''
+        tag.p do
+          safe_join(
+            status.preloadable_poll.options.map do |o|
+              tag.send(status.preloadable_poll.multiple? ? 'checkbox' : 'radio', o, disabled: true)
+            end,
+            tag.br
+          )
+        end
       end
-    end.html_safe # rubocop:disable Rails/OutputSafety
+    end
 
     prerender_custom_emojis(
       safe_join([before_html, html, after_html]),
diff --git a/app/helpers/languages_helper.rb b/app/helpers/languages_helper.rb
index 5086de5f6..27e8b376c 100644
--- a/app/helpers/languages_helper.rb
+++ b/app/helpers/languages_helper.rb
@@ -190,12 +190,15 @@ module LanguagesHelper
   ISO_639_3 = {
     ast: ['Asturian', 'Asturianu'].freeze,
     ckb: ['Sorani (Kurdish)', 'سۆرانی'].freeze,
+    cnr: ['Montenegrin', 'crnogorski'].freeze,
     jbo: ['Lojban', 'la .lojban.'].freeze,
     kab: ['Kabyle', 'Taqbaylit'].freeze,
     kmr: ['Kurmanji (Kurdish)', 'Kurmancî'].freeze,
     ldn: ['Láadan', 'Láadan'].freeze,
     lfn: ['Lingua Franca Nova', 'lingua franca nova'].freeze,
     sco: ['Scots', 'Scots'].freeze,
+    sma: ['Southern Sami', 'Åarjelsaemien Gïele'].freeze,
+    smj: ['Lule Sami', 'Julevsámegiella'].freeze,
     tok: ['Toki Pona', 'toki pona'].freeze,
     zba: ['Balaibalan', 'باليبلن'].freeze,
     zgh: ['Standard Moroccan Tamazight', 'ⵜⴰⵎⴰⵣⵉⵖⵜ'].freeze,
diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb
index 488eabeec..d1e3fddaf 100644
--- a/app/helpers/statuses_helper.rb
+++ b/app/helpers/statuses_helper.rb
@@ -21,7 +21,7 @@ module StatusesHelper
   def media_summary(status)
     attachments = { image: 0, video: 0, audio: 0 }
 
-    status.media_attachments.each do |media|
+    status.ordered_media_attachments.each do |media|
       if media.video?
         attachments[:video] += 1
       elsif media.audio?
diff --git a/app/javascript/core/admin.js b/app/javascript/core/admin.js
index 3175ff560..ac1b2f95f 100644
--- a/app/javascript/core/admin.js
+++ b/app/javascript/core/admin.js
@@ -194,7 +194,7 @@ ready(() => {
   }
 
   document.querySelector('a#add-instance-button')?.addEventListener('click', (e) => {
-    const domain = document.getElementById('by_domain')?.value;
+    const domain = document.querySelector('input[type="text"]#by_domain')?.value;
 
     if (domain) {
       const url = new URL(event.target.href);
diff --git a/app/javascript/flavours/glitch/actions/announcements.js b/app/javascript/flavours/glitch/actions/announcements.js
index 1bdea909f..586dcfd33 100644
--- a/app/javascript/flavours/glitch/actions/announcements.js
+++ b/app/javascript/flavours/glitch/actions/announcements.js
@@ -102,7 +102,7 @@ export const addReaction = (announcementId, name) => (dispatch, getState) => {
     dispatch(addReactionRequest(announcementId, name, alreadyAdded));
   }
 
-  api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => {
+  api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => {
     dispatch(addReactionSuccess(announcementId, name, alreadyAdded));
   }).catch(err => {
     if (!alreadyAdded) {
@@ -136,7 +136,7 @@ export const addReactionFail = (announcementId, name, error) => ({
 export const removeReaction = (announcementId, name) => (dispatch, getState) => {
   dispatch(removeReactionRequest(announcementId, name));
 
-  api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => {
+  api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => {
     dispatch(removeReactionSuccess(announcementId, name));
   }).catch(err => {
     dispatch(removeReactionFail(announcementId, name, err));
diff --git a/app/javascript/flavours/glitch/actions/dropdown_menu.js b/app/javascript/flavours/glitch/actions/dropdown_menu.js
index fb6e55612..023151d4b 100644
--- a/app/javascript/flavours/glitch/actions/dropdown_menu.js
+++ b/app/javascript/flavours/glitch/actions/dropdown_menu.js
@@ -1,8 +1,8 @@
 export const DROPDOWN_MENU_OPEN = 'DROPDOWN_MENU_OPEN';
 export const DROPDOWN_MENU_CLOSE = 'DROPDOWN_MENU_CLOSE';
 
-export function openDropdownMenu(id, placement, keyboard, scroll_key) {
-  return { type: DROPDOWN_MENU_OPEN, id, placement, keyboard, scroll_key };
+export function openDropdownMenu(id, keyboard, scroll_key) {
+  return { type: DROPDOWN_MENU_OPEN, id, keyboard, scroll_key };
 }
 
 export function closeDropdownMenu(id) {
diff --git a/app/javascript/flavours/glitch/components/dropdown_menu.js b/app/javascript/flavours/glitch/components/dropdown_menu.js
index 036e0b909..7c70f750f 100644
--- a/app/javascript/flavours/glitch/components/dropdown_menu.js
+++ b/app/javascript/flavours/glitch/components/dropdown_menu.js
@@ -2,9 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import IconButton from './icon_button';
-import Overlay from 'react-overlays/lib/Overlay';
-import Motion from '../features/ui/util/optional_motion';
-import spring from 'react-motion/lib/spring';
+import Overlay from 'react-overlays/Overlay';
 import { supportsPassiveEvents } from 'detect-passive-events';
 import classNames from 'classnames';
 import { CircularProgress } from 'flavours/glitch/components/loading_indicator';
@@ -24,9 +22,6 @@ class DropdownMenu extends React.PureComponent {
     scrollable: PropTypes.bool,
     onClose: PropTypes.func.isRequired,
     style: PropTypes.object,
-    placement: PropTypes.string,
-    arrowOffsetLeft: PropTypes.string,
-    arrowOffsetTop: PropTypes.string,
     openedViaKeyboard: PropTypes.bool,
     renderItem: PropTypes.func,
     renderHeader: PropTypes.func,
@@ -35,11 +30,6 @@ class DropdownMenu extends React.PureComponent {
 
   static defaultProps = {
     style: {},
-    placement: 'bottom',
-  };
-
-  state = {
-    mounted: false,
   };
 
   handleDocumentClick = e => {
@@ -56,8 +46,6 @@ class DropdownMenu extends React.PureComponent {
     if (this.focusedItem && this.props.openedViaKeyboard) {
       this.focusedItem.focus({ preventScroll: true });
     }
-
-    this.setState({ mounted: true });
   }
 
   componentWillUnmount () {
@@ -139,40 +127,28 @@ class DropdownMenu extends React.PureComponent {
   }
 
   render () {
-    const { items, style, placement, arrowOffsetLeft, arrowOffsetTop, scrollable, renderHeader, loading } = this.props;
-    const { mounted } = this.state;
+    const { items, scrollable, renderHeader, loading } = this.props;
 
     let renderItem = this.props.renderItem || this.renderItem;
 
     return (
-      <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>
-        {({ opacity, scaleX, scaleY }) => (
-          // It should not be transformed when mounting because the resulting
-          // size will be used to determine the coordinate of the menu by
-          // react-overlays
-          <div className={`dropdown-menu ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null }} ref={this.setRef}>
-            <div className={`dropdown-menu__arrow ${placement}`} style={{ left: arrowOffsetLeft, top: arrowOffsetTop }} />
-
-            <div className={classNames('dropdown-menu__container', { 'dropdown-menu__container--loading': loading })}>
-              {loading && (
-                <CircularProgress size={30} strokeWidth={3.5} />
-              )}
-
-              {!loading && renderHeader && (
-                <div className='dropdown-menu__container__header'>
-                  {renderHeader(items)}
-                </div>
-              )}
-
-              {!loading && (
-                <ul className={classNames('dropdown-menu__container__list', { 'dropdown-menu__container__list--scrollable': scrollable })}>
-                  {items.map((option, i) => renderItem(option, i, { onClick: this.handleClick, onKeyPress: this.handleItemKeyPress }))}
-                </ul>
-              )}
-            </div>
+      <div className={classNames('dropdown-menu__container', { 'dropdown-menu__container--loading': loading })} ref={this.setRef}>
+        {loading && (
+          <CircularProgress size={30} strokeWidth={3.5} />
+        )}
+
+        {!loading && renderHeader && (
+          <div className='dropdown-menu__container__header'>
+            {renderHeader(items)}
           </div>
         )}
-      </Motion>
+
+        {!loading && (
+          <ul className={classNames('dropdown-menu__container__list', { 'dropdown-menu__container__list--scrollable': scrollable })}>
+            {items.map((option, i) => renderItem(option, i, { onClick: this.handleClick, onKeyPress: this.handleItemKeyPress }))}
+          </ul>
+        )}
+      </div>
     );
   }
 
@@ -197,7 +173,6 @@ export default class Dropdown extends React.PureComponent {
     isUserTouching: PropTypes.func,
     onOpen: PropTypes.func.isRequired,
     onClose: PropTypes.func.isRequired,
-    dropdownPlacement: PropTypes.string,
     openDropdownId: PropTypes.number,
     openedViaKeyboard: PropTypes.bool,
     renderItem: PropTypes.func,
@@ -213,13 +188,11 @@ export default class Dropdown extends React.PureComponent {
     id: id++,
   };
 
-  handleClick = ({ target, type }) => {
+  handleClick = ({ type }) => {
     if (this.state.id === this.props.openDropdownId) {
       this.handleClose();
     } else {
-      const { top } = target.getBoundingClientRect();
-      const placement = top * 2 < innerHeight ? 'bottom' : 'top';
-      this.props.onOpen(this.state.id, this.handleItemClick, placement, type !== 'click');
+      this.props.onOpen(this.state.id, this.handleItemClick, type !== 'click');
     }
   }
 
@@ -303,7 +276,6 @@ export default class Dropdown extends React.PureComponent {
       disabled,
       loading,
       scrollable,
-      dropdownPlacement,
       openDropdownId,
       openedViaKeyboard,
       children,
@@ -314,7 +286,6 @@ export default class Dropdown extends React.PureComponent {
     const open = this.state.id === openDropdownId;
 
     const button = children ? React.cloneElement(React.Children.only(children), {
-      ref: this.setTargetRef,
       onClick: this.handleClick,
       onMouseDown: this.handleMouseDown,
       onKeyDown: this.handleButtonKeyDown,
@@ -326,7 +297,6 @@ export default class Dropdown extends React.PureComponent {
         active={open}
         disabled={disabled}
         size={size}
-        ref={this.setTargetRef}
         onClick={this.handleClick}
         onMouseDown={this.handleMouseDown}
         onKeyDown={this.handleButtonKeyDown}
@@ -336,19 +306,27 @@ export default class Dropdown extends React.PureComponent {
 
     return (
       <React.Fragment>
-        {button}
-
-        <Overlay show={open} placement={dropdownPlacement} target={this.findTarget}>
-          <DropdownMenu
-            items={items}
-            loading={loading}
-            scrollable={scrollable}
-            onClose={this.handleClose}
-            openedViaKeyboard={openedViaKeyboard}
-            renderItem={renderItem}
-            renderHeader={renderHeader}
-            onItemClick={this.handleItemClick}
-          />
+        <span ref={this.setTargetRef}>
+          {button}
+        </span>
+        <Overlay show={open} offset={[5, 5]} placement={'bottom'} flip target={this.findTarget} popperConfig={{ strategy: 'fixed' }}>
+          {({ props, arrowProps, placement }) => (
+            <div {...props}>
+              <div className={`dropdown-animation dropdown-menu ${placement}`}>
+                <div className={`dropdown-menu__arrow ${placement}`} {...arrowProps} />
+                <DropdownMenu
+                  items={items}
+                  loading={loading}
+                  scrollable={scrollable}
+                  onClose={this.handleClose}
+                  openedViaKeyboard={openedViaKeyboard}
+                  renderItem={renderItem}
+                  renderHeader={renderHeader}
+                  onItemClick={this.handleItemClick}
+                />
+              </div>
+            </div>
+          )}
         </Overlay>
       </React.Fragment>
     );
diff --git a/app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js b/app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js
index 8b73663d4..a1519757d 100644
--- a/app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js
+++ b/app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js
@@ -4,7 +4,6 @@ import { fetchHistory } from 'flavours/glitch/actions/history';
 import DropdownMenu from 'flavours/glitch/components/dropdown_menu';
 
 const mapStateToProps = (state, { statusId }) => ({
-  dropdownPlacement: state.getIn(['dropdown_menu', 'placement']),
   openDropdownId: state.getIn(['dropdown_menu', 'openId']),
   openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']),
   items: state.getIn(['history', statusId, 'items']),
@@ -13,9 +12,9 @@ const mapStateToProps = (state, { statusId }) => ({
 
 const mapDispatchToProps = (dispatch, { statusId }) => ({
 
-  onOpen (id, onItemClick, dropdownPlacement, keyboard) {
+  onOpen (id, onItemClick, keyboard) {
     dispatch(fetchHistory(statusId));
-    dispatch(openDropdownMenu(id, dropdownPlacement, keyboard));
+    dispatch(openDropdownMenu(id, keyboard));
   },
 
   onClose (id) {
diff --git a/app/javascript/flavours/glitch/components/icon_button.js b/app/javascript/flavours/glitch/components/icon_button.js
index 41a95e92f..2485f0f48 100644
--- a/app/javascript/flavours/glitch/components/icon_button.js
+++ b/app/javascript/flavours/glitch/components/icon_button.js
@@ -30,6 +30,7 @@ export default class IconButton extends React.PureComponent {
     counter: PropTypes.number,
     obfuscateCount: PropTypes.bool,
     href: PropTypes.string,
+    ariaHidden: PropTypes.bool,
   };
 
   static defaultProps = {
@@ -39,6 +40,7 @@ export default class IconButton extends React.PureComponent {
     animate: false,
     overlay: false,
     tabIndex: '0',
+    ariaHidden: false,
   };
 
   state = {
@@ -115,6 +117,7 @@ export default class IconButton extends React.PureComponent {
       counter,
       obfuscateCount,
       href,
+      ariaHidden,
     } = this.props;
 
     const {
@@ -155,6 +158,7 @@ export default class IconButton extends React.PureComponent {
       <button
         aria-label={title}
         aria-expanded={expanded}
+        aria-hidden={ariaHidden}
         title={title}
         className={classes}
         onClick={this.handleClick}
diff --git a/app/javascript/flavours/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js
index ac0d05926..23e279589 100644
--- a/app/javascript/flavours/glitch/components/media_gallery.js
+++ b/app/javascript/flavours/glitch/components/media_gallery.js
@@ -376,7 +376,7 @@ class MediaGallery extends React.PureComponent {
         </button>
       );
     } else if (visible) {
-      spoilerButton = <IconButton title={intl.formatMessage(messages.toggle_visible, { number: size })} icon='eye-slash' overlay onClick={this.handleOpen} />;
+      spoilerButton = <IconButton title={intl.formatMessage(messages.toggle_visible, { number: size })} icon='eye-slash' overlay onClick={this.handleOpen} ariaHidden />;
     } else {
       spoilerButton = (
         <button type='button' onClick={this.handleOpen} className='spoiler-button__overlay'>
diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js
index 4041b4819..409ec0adc 100644
--- a/app/javascript/flavours/glitch/components/status.js
+++ b/app/javascript/flavours/glitch/components/status.js
@@ -102,7 +102,7 @@ class Status extends ImmutablePureComponent {
     scrollKey: PropTypes.string,
     deployPictureInPicture: PropTypes.func,
     settings: ImmutablePropTypes.map.isRequired,
-    pictureInPicture: PropTypes.shape({
+    pictureInPicture: ImmutablePropTypes.contains({
       inUse: PropTypes.bool,
       available: PropTypes.bool,
     }),
@@ -603,7 +603,7 @@ class Status extends ImmutablePureComponent {
 
     attachments = status.get('media_attachments');
 
-    if (pictureInPicture.inUse) {
+    if (pictureInPicture.get('inUse')) {
       media.push(<PictureInPicturePlaceholder width={this.props.cachedMediaWidth} />);
       mediaIcons.push('video-camera');
     } else if (attachments.size > 0) {
@@ -631,7 +631,7 @@ class Status extends ImmutablePureComponent {
                 width={this.props.cachedMediaWidth}
                 height={110}
                 cacheWidth={this.props.cacheMediaWidth}
-                deployPictureInPicture={pictureInPicture.available ? this.handleDeployPictureInPicture : undefined}
+                deployPictureInPicture={pictureInPicture.get('available') ? this.handleDeployPictureInPicture : undefined}
                 sensitive={status.get('sensitive')}
                 blurhash={attachment.get('blurhash')}
                 visible={this.state.showMedia}
@@ -660,7 +660,7 @@ class Status extends ImmutablePureComponent {
               onOpenVideo={this.handleOpenVideo}
               width={this.props.cachedMediaWidth}
               cacheWidth={this.props.cacheMediaWidth}
-              deployPictureInPicture={pictureInPicture.available ? this.handleDeployPictureInPicture : undefined}
+              deployPictureInPicture={pictureInPicture.get('available') ? this.handleDeployPictureInPicture : undefined}
               visible={this.state.showMedia}
               onToggleVisibility={this.handleToggleMediaVisibility}
             />)}
diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js
index 977c98ccb..baf61000a 100644
--- a/app/javascript/flavours/glitch/components/status_action_bar.js
+++ b/app/javascript/flavours/glitch/components/status_action_bar.js
@@ -9,7 +9,7 @@ import { me } from 'flavours/glitch/initial_state';
 import RelativeTimestamp from './relative_timestamp';
 import { accountAdminLink, statusAdminLink } from 'flavours/glitch/utils/backend_links';
 import classNames from 'classnames';
-import { PERMISSION_MANAGE_USERS } from 'flavours/glitch/permissions';
+import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'flavours/glitch/permissions';
 
 const messages = defineMessages({
   delete: { id: 'status.delete', defaultMessage: 'Delete' },
@@ -37,9 +37,10 @@ const messages = defineMessages({
   unpin: { id: 'status.unpin', defaultMessage: 'Unpin from profile' },
   embed: { id: 'status.embed', defaultMessage: 'Embed' },
   admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
-  admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
-  copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },
-  hide: { id: 'status.hide', defaultMessage: 'Hide toot' },
+  admin_status: { id: 'status.admin_status', defaultMessage: 'Open this post in the moderation interface' },
+  admin_domain: { id: 'status.admin_domain', defaultMessage: 'Open moderation interface for {domain}' },
+  copy: { id: 'status.copy', defaultMessage: 'Copy link to post' },
+  hide: { id: 'status.hide', defaultMessage: 'Hide post' },
   edited: { id: 'status.edited', defaultMessage: 'Edited {date}' },
   filter: { id: 'status.filter', defaultMessage: 'Filter this post' },
   openOriginalPage: { id: 'account.open_original_page', defaultMessage: 'Open original page' },
@@ -197,6 +198,7 @@ class StatusActionBar extends ImmutablePureComponent {
 
   render () {
     const { status, intl, withDismiss, withCounters, showReplyCount, scrollKey } = this.props;
+    const { permissions } = this.context.identity;
 
     const anonymousAccess    = !me;
     const mutingConversation = status.get('muted');
@@ -212,11 +214,13 @@ class StatusActionBar extends ImmutablePureComponent {
 
     menu.push({ text: intl.formatMessage(messages.open), action: this.handleOpen });
 
+    if (publicStatus && isRemote) {
+      menu.push({ text: intl.formatMessage(messages.openOriginalPage), href: status.get('url') });
+    }
+
+    menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
+
     if (publicStatus) {
-      if (isRemote) {
-        menu.push({ text: intl.formatMessage(messages.openOriginalPage), href: status.get('url') });
-      }
-      menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
       menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
     }
 
@@ -250,19 +254,19 @@ class StatusActionBar extends ImmutablePureComponent {
       menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick });
       menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });
 
-      if ((this.context.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS && (accountAdminLink || statusAdminLink)) {
+      if (((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS && (accountAdminLink || statusAdminLink)) || (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION)) {
         menu.push(null);
-        if (accountAdminLink !== undefined) {
-          menu.push({
-            text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }),
-            href: accountAdminLink(status.getIn(['account', 'id'])),
-          });
+        if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) {
+          if (accountAdminLink !== undefined) {
+            menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: accountAdminLink(status.getIn(['account', 'id'])) });
+          }
+          if (statusAdminLink !== undefined) {
+            menu.push({ text: intl.formatMessage(messages.admin_status), href: statusAdminLink(status.getIn(['account', 'id']), status.get('id')) });
+          }
         }
-        if (statusAdminLink !== undefined) {
-          menu.push({
-            text: intl.formatMessage(messages.admin_status),
-            href: statusAdminLink(status.getIn(['account', 'id']), status.get('id')),
-          });
+        if (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION) {
+          const domain = status.getIn(['account', 'acct']).split('@')[1];
+          menu.push({ text: intl.formatMessage(messages.admin_domain, { domain: domain }), href: `/admin/instances/${domain}` });
         }
       }
     }
@@ -326,6 +330,7 @@ class StatusActionBar extends ImmutablePureComponent {
           />
         </div>
 
+        <div className='status__action-bar-spacer' />
         <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener'>
           <RelativeTimestamp timestamp={status.get('created_at')} />{status.get('edited_at') && <abbr title={intl.formatMessage(messages.edited, { date: intl.formatDate(status.get('edited_at'), { hour12: false, year: 'numeric', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) })}> *</abbr>}
         </a>
diff --git a/app/javascript/flavours/glitch/containers/dropdown_menu_container.js b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js
index b2dff63db..43ce8ca63 100644
--- a/app/javascript/flavours/glitch/containers/dropdown_menu_container.js
+++ b/app/javascript/flavours/glitch/containers/dropdown_menu_container.js
@@ -5,18 +5,17 @@ import DropdownMenu from 'flavours/glitch/components/dropdown_menu';
 import { isUserTouching } from '../is_mobile';
 
 const mapStateToProps = state => ({
-  dropdownPlacement: state.getIn(['dropdown_menu', 'placement']),
   openDropdownId: state.getIn(['dropdown_menu', 'openId']),
   openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']),
 });
 
 const mapDispatchToProps = (dispatch, { status, items, scrollKey }) => ({
-  onOpen(id, onItemClick, dropdownPlacement, keyboard) {
+  onOpen(id, onItemClick, keyboard) {
     dispatch(isUserTouching() ? openModal('ACTIONS', {
       status,
       actions: items,
       onClick: onItemClick,
-    }) : openDropdownMenu(id, dropdownPlacement, keyboard, scrollKey));
+    }) : openDropdownMenu(id, keyboard, scrollKey));
   },
 
   onClose(id) {
diff --git a/app/javascript/flavours/glitch/containers/mastodon.js b/app/javascript/flavours/glitch/containers/mastodon.js
index 6c92376d8..dd7623a81 100644
--- a/app/javascript/flavours/glitch/containers/mastodon.js
+++ b/app/javascript/flavours/glitch/containers/mastodon.js
@@ -27,8 +27,9 @@ store.dispatch(hydrateAction);
 // check for deprecated local settings
 store.dispatch(checkDeprecatedLocalSettings());
 
-// load custom emojis
-store.dispatch(fetchCustomEmojis());
+if (initialState.meta.me) {
+  store.dispatch(fetchCustomEmojis());
+}
 
 const createIdentityContext = state => ({
   signedIn: !!state.meta.me,
diff --git a/app/javascript/flavours/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js
index 947573fc7..645919ebe 100644
--- a/app/javascript/flavours/glitch/containers/status_container.js
+++ b/app/javascript/flavours/glitch/containers/status_container.js
@@ -1,7 +1,7 @@
 import { connect } from 'react-redux';
 import Status from 'flavours/glitch/components/status';
 import { List as ImmutableList } from 'immutable';
-import { makeGetStatus } from 'flavours/glitch/selectors';
+import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selectors';
 import {
   replyCompose,
   mentionCompose,
@@ -60,6 +60,7 @@ const messages = defineMessages({
 
 const makeMapStateToProps = () => {
   const getStatus = makeGetStatus();
+  const getPictureInPicture = makeGetPictureInPicture();
 
   const mapStateToProps = (state, props) => {
 
@@ -83,11 +84,7 @@ const makeMapStateToProps = () => {
       account: account || props.account,
       settings: state.get('local_settings'),
       prepend: prepend || props.prepend,
-
-      pictureInPicture: {
-        inUse: state.getIn(['meta', 'layout']) !== 'mobile' && state.get('picture_in_picture').statusId === props.id,
-        available: state.getIn(['meta', 'layout']) !== 'mobile',
-      },
+      pictureInPicture: getPictureInPicture(state, props),
     };
   };
 
diff --git a/app/javascript/flavours/glitch/extra_polyfills.js b/app/javascript/flavours/glitch/extra_polyfills.js
index 0d45c23b0..6e8004f07 100644
--- a/app/javascript/flavours/glitch/extra_polyfills.js
+++ b/app/javascript/flavours/glitch/extra_polyfills.js
@@ -1,6 +1,3 @@
 import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only';
 import 'intersection-observer';
 import 'requestidlecallback';
-import objectFitImages  from 'object-fit-images';
-
-objectFitImages();
diff --git a/app/javascript/flavours/glitch/features/account/components/follow_request_note.js b/app/javascript/flavours/glitch/features/account/components/follow_request_note.js
new file mode 100644
index 000000000..73c1737a6
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/account/components/follow_request_note.js
@@ -0,0 +1,37 @@
+import React from 'react';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { FormattedMessage } from 'react-intl';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import Icon from 'flavours/glitch/components/icon';
+
+export default class FollowRequestNote extends ImmutablePureComponent {
+
+  static propTypes = {
+    account: ImmutablePropTypes.map.isRequired,
+  };
+
+  render () {
+    const { account, onAuthorize, onReject } = this.props;
+
+    return (
+      <div className='follow-request-banner'>
+        <div className='follow-request-banner__message'>
+          <FormattedMessage id='account.requested_follow' defaultMessage='{name} has requested to follow you' values={{ name: <bdi><strong dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }} /></bdi> }} />
+        </div>
+
+        <div className='follow-request-banner__action'>
+          <button type='button' className='button button-tertiary button--confirmation' onClick={onAuthorize}>
+            <Icon id='check' fixedWidth />
+            <FormattedMessage id='follow_request.authorize' defaultMessage='Authorize' />
+          </button>
+
+          <button type='button' className='button button-tertiary button--destructive' onClick={onReject}>
+            <Icon id='times' fixedWidth />
+            <FormattedMessage id='follow_request.reject' defaultMessage='Reject' />
+          </button>
+        </div>
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/account/components/header.js b/app/javascript/flavours/glitch/features/account/components/header.js
index 9a5f2fd62..ec4a192bc 100644
--- a/app/javascript/flavours/glitch/features/account/components/header.js
+++ b/app/javascript/flavours/glitch/features/account/components/header.js
@@ -13,7 +13,8 @@ import Button from 'flavours/glitch/components/button';
 import { NavLink } from 'react-router-dom';
 import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
 import AccountNoteContainer from '../containers/account_note_container';
-import { PERMISSION_MANAGE_USERS } from 'flavours/glitch/permissions';
+import FollowRequestNoteContainer from '../containers/follow_request_note_container';
+import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'flavours/glitch/permissions';
 import { Helmet } from 'react-helmet';
 
 const messages = defineMessages({
@@ -51,6 +52,7 @@ const messages = defineMessages({
   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}' },
+  admin_domain: { id: 'status.admin_domain', defaultMessage: 'Open moderation interface for {domain}' },
   add_account_note: { id: 'account.add_account_note', defaultMessage: 'Add note for @{name}' },
   languages: { id: 'account.languages', defaultMessage: 'Change subscribed languages' },
   openOriginalPage: { id: 'account.open_original_page', defaultMessage: 'Open original page' },
@@ -154,7 +156,7 @@ class Header extends ImmutablePureComponent {
 
   render () {
     const { account, hidden, intl, domain } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn, permissions } = this.context.identity;
 
     if (!account) {
       return null;
@@ -290,9 +292,14 @@ class Header extends ImmutablePureComponent {
       }
     }
 
-    if (account.get('id') !== me && (this.context.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS && accountAdminLink) {
+    if (account.get('id') !== me && ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS && accountAdminLink) || (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION)) {
       menu.push(null);
-      menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: accountAdminLink(account.get('id')) });
+      if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS && accountAdminLink) {
+        menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: accountAdminLink(account.get('id')) });
+      }
+      if (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION) {
+        menu.push({ text: intl.formatMessage(messages.admin_domain, { domain: remoteDomain }), href: `/admin/instances/${remoteDomain}` });
+      }
     }
 
     const content          = { __html: account.get('note_emojified') };
@@ -314,6 +321,8 @@ class Header extends ImmutablePureComponent {
 
     return (
       <div className={classNames('account__header', { inactive: !!account.get('moved') })} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
+        {!(suspended || hidden || account.get('moved')) && account.getIn(['relationship', 'requested_by']) && <FollowRequestNoteContainer account={account} />}
+
         <div className='account__header__image'>
           <div className='account__header__info'>
             {info}
@@ -345,7 +354,9 @@ class Header extends ImmutablePureComponent {
           <div className='account__header__tabs__name'>
             <h1>
               <span dangerouslySetInnerHTML={displayNameHtml} /> {badge}
-              <small>@{acct} {lockedIcon}</small>
+              <small>
+                <span>@{acct}</span> {lockedIcon}
+              </small>
             </h1>
           </div>
 
diff --git a/app/javascript/flavours/glitch/features/account/containers/follow_request_note_container.js b/app/javascript/flavours/glitch/features/account/containers/follow_request_note_container.js
new file mode 100644
index 000000000..c6a3afb7e
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/account/containers/follow_request_note_container.js
@@ -0,0 +1,15 @@
+import { connect } from 'react-redux';
+import FollowRequestNote from '../components/follow_request_note';
+import { authorizeFollowRequest, rejectFollowRequest } from 'flavours/glitch/actions/accounts';
+
+const mapDispatchToProps = (dispatch, { account }) => ({
+  onAuthorize () {
+    dispatch(authorizeFollowRequest(account.get('id')));
+  },
+
+  onReject () {
+    dispatch(rejectFollowRequest(account.get('id')));
+  },
+});
+
+export default connect(null, mapDispatchToProps)(FollowRequestNote);
diff --git a/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js b/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js
index f7a7fd467..f20ee685e 100644
--- a/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js
+++ b/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js
@@ -104,6 +104,7 @@ export default class MediaItem extends ImmutablePureComponent {
           <video
             className='media-gallery__item-gifv-thumbnail'
             aria-label={attachment.get('description')}
+            title={attachment.get('description')}
             role='application'
             src={attachment.get('url')}
             onMouseEnter={this.handleMouseEnter}
diff --git a/app/javascript/flavours/glitch/features/compose/components/compose_form.js b/app/javascript/flavours/glitch/features/compose/components/compose_form.js
index abdd247a0..0462c7c4b 100644
--- a/app/javascript/flavours/glitch/features/compose/components/compose_form.js
+++ b/app/javascript/flavours/glitch/features/compose/components/compose_form.js
@@ -310,7 +310,7 @@ class ComposeForm extends ImmutablePureComponent {
 
         <ReplyIndicatorContainer />
 
-        <div className={`spoiler-input ${spoiler ? 'spoiler-input--visible' : ''}`} ref={this.setRef}>
+        <div className={`spoiler-input ${spoiler ? 'spoiler-input--visible' : ''}`} ref={this.setRef} aria-hidden={!this.props.spoiler}>
           <AutosuggestInput
             placeholder={intl.formatMessage(messages.spoiler_placeholder)}
             value={spoilerText}
diff --git a/app/javascript/flavours/glitch/features/compose/components/dropdown.js b/app/javascript/flavours/glitch/features/compose/components/dropdown.js
index 3de198c45..d98b311d9 100644
--- a/app/javascript/flavours/glitch/features/compose/components/dropdown.js
+++ b/app/javascript/flavours/glitch/features/compose/components/dropdown.js
@@ -2,7 +2,7 @@
 import classNames from 'classnames';
 import PropTypes from 'prop-types';
 import React from 'react';
-import Overlay from 'react-overlays/lib/Overlay';
+import Overlay from 'react-overlays/Overlay';
 
 //  Components.
 import IconButton from 'flavours/glitch/components/icon_button';
@@ -45,7 +45,7 @@ export default class ComposerOptionsDropdown extends React.PureComponent {
   };
 
   //  Toggles opening and closing the dropdown.
-  handleToggle = ({ target, type }) => {
+  handleToggle = ({ type }) => {
     const { onModalOpen } = this.props;
     const { open } = this.state;
 
@@ -59,11 +59,9 @@ export default class ComposerOptionsDropdown extends React.PureComponent {
         }
       }
     } else {
-      const { top } = target.getBoundingClientRect();
       if (this.state.open && this.activeElement) {
         this.activeElement.focus({ preventScroll: true });
       }
-      this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });
       this.setState({ open: !this.state.open, openedViaKeyboard: type !== 'click' });
     }
   }
@@ -158,6 +156,18 @@ export default class ComposerOptionsDropdown extends React.PureComponent {
     };
   }
 
+  setTargetRef = c => {
+    this.target = c;
+  }
+
+  findTarget = () => {
+    return this.target;
+  }
+
+  handleOverlayEnter = (state) => {
+    this.setState({ placement: state.placement });
+  }
+
   //  Rendering.
   render () {
     const {
@@ -179,6 +189,7 @@ export default class ComposerOptionsDropdown extends React.PureComponent {
       <div
         className={classNames('privacy-dropdown', placement, { active: open })}
         onKeyDown={this.handleKeyDown}
+        ref={this.setTargetRef}
       >
         <div className={classNames('privacy-dropdown__value', { active })}>
           <IconButton
@@ -204,18 +215,26 @@ export default class ComposerOptionsDropdown extends React.PureComponent {
           containerPadding={20}
           placement={placement}
           show={open}
-          target={this}
+          flip
+          target={this.findTarget}
           container={container}
+          popperConfig={{ strategy: 'fixed', onFirstUpdate: this.handleOverlayEnter }}
         >
-          <DropdownMenu
-            items={items}
-            renderItemContents={renderItemContents}
-            onChange={onChange}
-            onClose={this.handleClose}
-            value={value}
-            openedViaKeyboard={this.state.openedViaKeyboard}
-            closeOnChange={closeOnChange}
-          />
+          {({ props, placement }) => (
+            <div {...props}>
+              <div className={`dropdown-animation privacy-dropdown__dropdown ${placement}`}>
+                <DropdownMenu
+                  items={items}
+                  renderItemContents={renderItemContents}
+                  onChange={onChange}
+                  onClose={this.handleClose}
+                  value={value}
+                  openedViaKeyboard={this.state.openedViaKeyboard}
+                  closeOnChange={closeOnChange}
+                />
+              </div>
+            </div>
+          )}
         </Overlay>
       </div>
     );
diff --git a/app/javascript/flavours/glitch/features/compose/components/dropdown_menu.js b/app/javascript/flavours/glitch/features/compose/components/dropdown_menu.js
index 09e8fc35a..c4895dfd0 100644
--- a/app/javascript/flavours/glitch/features/compose/components/dropdown_menu.js
+++ b/app/javascript/flavours/glitch/features/compose/components/dropdown_menu.js
@@ -1,7 +1,6 @@
 //  Package imports.
 import PropTypes from 'prop-types';
 import React from 'react';
-import spring from 'react-motion/lib/spring';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import classNames from 'classnames';
 
@@ -10,15 +9,8 @@ import Icon from 'flavours/glitch/components/icon';
 
 //  Utils.
 import { withPassive } from 'flavours/glitch/utils/dom_helpers';
-import Motion from '../../ui/util/optional_motion';
 import { assignHandlers } from 'flavours/glitch/utils/react_helpers';
 
-//  The spring to use with our motion.
-const springMotion = spring(1, {
-  damping: 35,
-  stiffness: 400,
-});
-
 //  The component.
 export default class ComposerOptionsDropdownContent extends React.PureComponent {
 
@@ -44,7 +36,6 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent
   };
 
   state = {
-    mounted: false,
     value: this.props.openedViaKeyboard ? this.props.items[0].name : undefined,
   };
 
@@ -56,7 +47,7 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent
   }
 
   //  Stores our node in `this.node`.
-  handleRef = (node) => {
+  setRef = (node) => {
     this.node = node;
   }
 
@@ -69,7 +60,6 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent
     } else {
       this.node.firstChild.focus({ preventScroll: true });
     }
-    this.setState({ mounted: true });
   }
 
   //  On unmounting, we remove our listeners.
@@ -191,7 +181,6 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent
 
   //  Rendering.
   render () {
-    const { mounted } = this.state;
     const {
       items,
       onChange,
@@ -201,36 +190,9 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent
 
     //  The result.
     return (
-      <Motion
-        defaultStyle={{
-          opacity: 0,
-          scaleX: 0.85,
-          scaleY: 0.75,
-        }}
-        style={{
-          opacity: springMotion,
-          scaleX: springMotion,
-          scaleY: springMotion,
-        }}
-      >
-        {({ opacity, scaleX, scaleY }) => (
-          // It should not be transformed when mounting because the resulting
-          // size will be used to determine the coordinate of the menu by
-          // react-overlays
-          <div
-            className='privacy-dropdown__dropdown'
-            ref={this.handleRef}
-            role='listbox'
-            style={{
-              ...style,
-              opacity: opacity,
-              transform: mounted ? `scale(${scaleX}, ${scaleY})` : null,
-            }}
-          >
-            {!!items && items.map((item, i) => this.renderItem(item, i))}
-          </div>
-        )}
-      </Motion>
+      <div style={{ ...style }} role='listbox' ref={this.setRef}>
+        {!!items && items.map((item, i) => this.renderItem(item, i))}
+      </div>
     );
   }
 
diff --git a/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js
index 546d398a0..38c735551 100644
--- a/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js
+++ b/app/javascript/flavours/glitch/features/compose/components/emoji_picker_dropdown.js
@@ -2,7 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import { EmojiPicker as EmojiPickerAsync } from '../../ui/util/async-components';
-import Overlay from 'react-overlays/lib/Overlay';
+import Overlay from 'react-overlays/Overlay';
 import classNames from 'classnames';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import { supportsPassiveEvents } from 'detect-passive-events';
@@ -155,9 +155,6 @@ class EmojiPickerMenu extends React.PureComponent {
     onClose: PropTypes.func.isRequired,
     onPick: PropTypes.func.isRequired,
     style: PropTypes.object,
-    placement: PropTypes.string,
-    arrowOffsetLeft: PropTypes.string,
-    arrowOffsetTop: PropTypes.string,
     intl: PropTypes.object.isRequired,
     skinTone: PropTypes.number.isRequired,
     onSkinTone: PropTypes.func.isRequired,
@@ -326,14 +323,13 @@ class EmojiPickerDropdown extends React.PureComponent {
   state = {
     active: false,
     loading: false,
-    placement: null,
   };
 
   setRef = (c) => {
     this.dropdown = c;
   }
 
-  onShowDropdown = ({ target }) => {
+  onShowDropdown = () => {
     this.setState({ active: true });
 
     if (!EmojiPicker) {
@@ -348,9 +344,6 @@ class EmojiPickerDropdown extends React.PureComponent {
         this.setState({ loading: false, active: false });
       });
     }
-
-    const { top } = target.getBoundingClientRect();
-    this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });
   }
 
   onHideDropdown = () => {
@@ -384,7 +377,7 @@ class EmojiPickerDropdown extends React.PureComponent {
   render () {
     const { intl, onPickEmoji, onSkinTone, skinTone, frequentlyUsedEmojis, button } = this.props;
     const title = intl.formatMessage(messages.emoji);
-    const { active, loading, placement } = this.state;
+    const { active, loading } = this.state;
 
     return (
       <div className='emoji-picker-dropdown' onKeyDown={this.handleKeyDown}>
@@ -396,16 +389,22 @@ class EmojiPickerDropdown extends React.PureComponent {
           />}
         </div>
 
-        <Overlay show={active} placement={placement} target={this.findTarget}>
-          <EmojiPickerMenu
-            custom_emojis={this.props.custom_emojis}
-            loading={loading}
-            onClose={this.onHideDropdown}
-            onPick={onPickEmoji}
-            onSkinTone={onSkinTone}
-            skinTone={skinTone}
-            frequentlyUsedEmojis={frequentlyUsedEmojis}
-          />
+        <Overlay show={active} placement={'bottom'} target={this.findTarget} popperConfig={{ strategy: 'fixed' }}>
+          {({ props, placement })=> (
+            <div {...props} style={{ ...props.style, width: 299 }}>
+              <div className={`dropdown-animation ${placement}`}>
+                <EmojiPickerMenu
+                  custom_emojis={this.props.custom_emojis}
+                  loading={loading}
+                  onClose={this.onHideDropdown}
+                  onPick={onPickEmoji}
+                  onSkinTone={onSkinTone}
+                  skinTone={skinTone}
+                  frequentlyUsedEmojis={frequentlyUsedEmojis}
+                />
+              </div>
+            </div>
+          )}
         </Overlay>
       </div>
     );
diff --git a/app/javascript/flavours/glitch/features/compose/components/language_dropdown.js b/app/javascript/flavours/glitch/features/compose/components/language_dropdown.js
index a3256aa9b..3a1fa0226 100644
--- a/app/javascript/flavours/glitch/features/compose/components/language_dropdown.js
+++ b/app/javascript/flavours/glitch/features/compose/components/language_dropdown.js
@@ -2,9 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { injectIntl, defineMessages } from 'react-intl';
 import TextIconButton from './text_icon_button';
-import Overlay from 'react-overlays/lib/Overlay';
-import Motion from 'flavours/glitch/features/ui/util/optional_motion';
-import spring from 'react-motion/lib/spring';
+import Overlay from 'react-overlays/Overlay';
 import { supportsPassiveEvents } from 'detect-passive-events';
 import classNames from 'classnames';
 import { languages as preloadedLanguages } from 'flavours/glitch/initial_state';
@@ -22,10 +20,8 @@ const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
 class LanguageDropdownMenu extends React.PureComponent {
 
   static propTypes = {
-    style: PropTypes.object,
     value: PropTypes.string.isRequired,
     frequentlyUsedLanguages: PropTypes.arrayOf(PropTypes.string).isRequired,
-    placement: PropTypes.string.isRequired,
     onClose: PropTypes.func.isRequired,
     onChange: PropTypes.func.isRequired,
     languages: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)),
@@ -37,7 +33,6 @@ class LanguageDropdownMenu extends React.PureComponent {
   };
 
   state = {
-    mounted: false,
     searchValue: '',
   };
 
@@ -50,7 +45,6 @@ class LanguageDropdownMenu extends React.PureComponent {
   componentDidMount () {
     document.addEventListener('click', this.handleDocumentClick, false);
     document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
-    this.setState({ mounted: true });
 
     // Because of https://github.com/react-bootstrap/react-bootstrap/issues/2614 we need
     // to wait for a frame before focusing
@@ -222,29 +216,22 @@ class LanguageDropdownMenu extends React.PureComponent {
   }
 
   render () {
-    const { style, placement, intl } = this.props;
-    const { mounted, searchValue } = this.state;
+    const { intl } = this.props;
+    const { searchValue } = this.state;
     const isSearching = searchValue !== '';
     const results = this.search();
 
     return (
-      <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>
-        {({ opacity, scaleX, scaleY }) => (
-          // It should not be transformed when mounting because the resulting
-          // size will be used to determine the coordinate of the menu by
-          // react-overlays
-          <div className={`language-dropdown__dropdown ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null }} ref={this.setRef}>
-            <div className='emoji-mart-search'>
-              <input type='search' value={searchValue} onChange={this.handleSearchChange} onKeyDown={this.handleSearchKeyDown} placeholder={intl.formatMessage(messages.search)} />
-              <button className='emoji-mart-search-icon' disabled={!isSearching} aria-label={intl.formatMessage(messages.clear)} onClick={this.handleClear}>{!isSearching ? loupeIcon : deleteIcon}</button>
-            </div>
+      <div ref={this.setRef}>
+        <div className='emoji-mart-search'>
+          <input type='search' value={searchValue} onChange={this.handleSearchChange} onKeyDown={this.handleSearchKeyDown} placeholder={intl.formatMessage(messages.search)} />
+          <button type='button' className='emoji-mart-search-icon' disabled={!isSearching} aria-label={intl.formatMessage(messages.clear)} onClick={this.handleClear}>{!isSearching ? loupeIcon : deleteIcon}</button>
+        </div>
 
-            <div className='language-dropdown__dropdown__results emoji-mart-scroll' role='listbox' ref={this.setListRef}>
-              {results.map(this.renderItem)}
-            </div>
-          </div>
-        )}
-      </Motion>
+        <div className='language-dropdown__dropdown__results emoji-mart-scroll' role='listbox' ref={this.setListRef}>
+          {results.map(this.renderItem)}
+        </div>
+      </div>
     );
   }
 
@@ -266,14 +253,11 @@ class LanguageDropdown extends React.PureComponent {
     placement: 'bottom',
   };
 
-  handleToggle = ({ target }) => {
-    const { top } = target.getBoundingClientRect();
-
+  handleToggle = () => {
     if (this.state.open && this.activeElement) {
       this.activeElement.focus({ preventScroll: true });
     }
 
-    this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });
     this.setState({ open: !this.state.open });
   }
 
@@ -293,13 +277,25 @@ class LanguageDropdown extends React.PureComponent {
     onChange(value);
   }
 
+  setTargetRef = c => {
+    this.target = c;
+  }
+
+  findTarget = () => {
+    return this.target;
+  }
+
+  handleOverlayEnter = (state) => {
+    this.setState({ placement: state.placement });
+  }
+
   render () {
     const { value, intl, frequentlyUsedLanguages } = this.props;
     const { open, placement } = this.state;
 
     return (
-      <div className={classNames('privacy-dropdown', { active: open })}>
-        <div className='privacy-dropdown__value'>
+      <div className={classNames('privacy-dropdown', placement, { active: open })}>
+        <div className='privacy-dropdown__value' ref={this.setTargetRef} >
           <TextIconButton
             className='privacy-dropdown__value-icon'
             label={value && value.toUpperCase()}
@@ -309,15 +305,20 @@ class LanguageDropdown extends React.PureComponent {
           />
         </div>
 
-        <Overlay show={open} placement={placement} target={this}>
-          <LanguageDropdownMenu
-            value={value}
-            frequentlyUsedLanguages={frequentlyUsedLanguages}
-            onClose={this.handleClose}
-            onChange={this.handleChange}
-            placement={placement}
-            intl={intl}
-          />
+        <Overlay show={open} placement={'bottom'} flip target={this.findTarget} popperConfig={{ strategy: 'fixed', onFirstUpdate: this.handleOverlayEnter }}>
+          {({ props, placement }) => (
+            <div {...props}>
+              <div className={`dropdown-animation language-dropdown__dropdown ${placement}`} >
+                <LanguageDropdownMenu
+                  value={value}
+                  frequentlyUsedLanguages={frequentlyUsedLanguages}
+                  onClose={this.handleClose}
+                  onChange={this.handleChange}
+                  intl={intl}
+                />
+              </div>
+            </div>
+          )}
         </Overlay>
       </div>
     );
diff --git a/app/javascript/flavours/glitch/features/compose/components/poll_form.js b/app/javascript/flavours/glitch/features/compose/components/poll_form.js
index d5edccff3..afb5da097 100644
--- a/app/javascript/flavours/glitch/features/compose/components/poll_form.js
+++ b/app/javascript/flavours/glitch/features/compose/components/poll_form.js
@@ -153,6 +153,7 @@ class PollForm extends ImmutablePureComponent {
             <option value={1800}>{intl.formatMessage(messages.minutes, { number: 30 })}</option>
             <option value={3600}>{intl.formatMessage(messages.hours, { number: 1 })}</option>
             <option value={21600}>{intl.formatMessage(messages.hours, { number: 6 })}</option>
+            <option value={43200}>{intl.formatMessage(messages.hours, { number: 12 })}</option>
             <option value={86400}>{intl.formatMessage(messages.days, { number: 1 })}</option>
             <option value={259200}>{intl.formatMessage(messages.days, { number: 3 })}</option>
             <option value={604800}>{intl.formatMessage(messages.days, { number: 7 })}</option>
diff --git a/app/javascript/flavours/glitch/features/compose/components/search.js b/app/javascript/flavours/glitch/features/compose/components/search.js
index 326fe5b70..e5874de75 100644
--- a/app/javascript/flavours/glitch/features/compose/components/search.js
+++ b/app/javascript/flavours/glitch/features/compose/components/search.js
@@ -3,13 +3,12 @@ import classNames from 'classnames';
 import PropTypes from 'prop-types';
 import React from 'react';
 import { connect } from 'react-redux';
-import spring from 'react-motion/lib/spring';
 import {
   injectIntl,
   FormattedMessage,
   defineMessages,
 } from 'react-intl';
-import Overlay from 'react-overlays/lib/Overlay';
+import Overlay from 'react-overlays/Overlay';
 
 //  Components.
 import Icon from 'flavours/glitch/components/icon';
@@ -17,7 +16,6 @@ import Icon from 'flavours/glitch/components/icon';
 //  Utils.
 import { focusRoot } from 'flavours/glitch/utils/dom_helpers';
 import { searchEnabled } from 'flavours/glitch/initial_state';
-import Motion from '../../ui/util/optional_motion';
 
 const messages = defineMessages({
   placeholder: { id: 'search.placeholder', defaultMessage: 'Search' },
@@ -26,31 +24,20 @@ const messages = defineMessages({
 
 class SearchPopout extends React.PureComponent {
 
-  static propTypes = {
-    style: PropTypes.object,
-  };
-
   render () {
-    const { style } = this.props;
     const extraInformation = searchEnabled ? <FormattedMessage id='search_popout.tips.full_text' defaultMessage='Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.' /> : <FormattedMessage id='search_popout.tips.text' defaultMessage='Simple text returns matching display names, usernames and hashtags' />;
     return (
-      <div style={{ ...style, position: 'absolute', width: 285, zIndex: 2 }}>
-        <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>
-          {({ opacity, scaleX, scaleY }) => (
-            <div className='search-popout' style={{ opacity: opacity, transform: `scale(${scaleX}, ${scaleY})` }}>
-              <h4><FormattedMessage id='search_popout.search_format' defaultMessage='Advanced search format' /></h4>
-
-              <ul>
-                <li><em>#example</em> <FormattedMessage id='search_popout.tips.hashtag' defaultMessage='hashtag' /></li>
-                <li><em>@username@domain</em> <FormattedMessage id='search_popout.tips.user' defaultMessage='user' /></li>
-                <li><em>URL</em> <FormattedMessage id='search_popout.tips.user' defaultMessage='user' /></li>
-                <li><em>URL</em> <FormattedMessage id='search_popout.tips.status' defaultMessage='status' /></li>
-              </ul>
-
-              {extraInformation}
-            </div>
-          )}
-        </Motion>
+      <div className='search-popout'>
+        <h4><FormattedMessage id='search_popout.search_format' defaultMessage='Advanced search format' /></h4>
+
+        <ul>
+          <li><em>#example</em> <FormattedMessage id='search_popout.tips.hashtag' defaultMessage='hashtag' /></li>
+          <li><em>@username@domain</em> <FormattedMessage id='search_popout.tips.user' defaultMessage='user' /></li>
+          <li><em>URL</em> <FormattedMessage id='search_popout.tips.user' defaultMessage='user' /></li>
+          <li><em>URL</em> <FormattedMessage id='search_popout.tips.status' defaultMessage='status' /></li>
+        </ul>
+
+        {extraInformation}
       </div>
     );
   }
@@ -136,6 +123,10 @@ class Search extends React.PureComponent {
     }
   }
 
+  findTarget = () => {
+    return this.searchForm;
+  }
+
   render () {
     const { intl, value, submitted } = this.props;
     const { expanded } = this.state;
@@ -144,34 +135,31 @@ class Search extends React.PureComponent {
 
     return (
       <div className='search'>
-        <label>
-          <span style={{ display: 'none' }}>{intl.formatMessage(messages.placeholder)}</span>
-          <input
-            ref={this.setRef}
-            className='search__input'
-            type='text'
-            placeholder={intl.formatMessage(signedIn ? messages.placeholderSignedIn : messages.placeholder)}
-            value={value || ''}
-            onChange={this.handleChange}
-            onKeyUp={this.handleKeyUp}
-            onFocus={this.handleFocus}
-            onBlur={this.handleBlur}
-          />
-        </label>
-
-        <div
-          aria-label={intl.formatMessage(messages.placeholder)}
-          className='search__icon'
-          onClick={this.handleClear}
-          role='button'
-          tabIndex='0'
-        >
+        <input
+          ref={this.setRef}
+          className='search__input'
+          type='text'
+          placeholder={intl.formatMessage(signedIn ? messages.placeholderSignedIn : messages.placeholder)}
+          aria-label={intl.formatMessage(signedIn ? messages.placeholderSignedIn : messages.placeholder)}
+          value={value || ''}
+          onChange={this.handleChange}
+          onKeyUp={this.handleKeyUp}
+          onFocus={this.handleFocus}
+          onBlur={this.handleBlur}
+        />
+
+        <div role='button' tabIndex='0' className='search__icon' onClick={this.handleClear}>
           <Icon id='search' className={hasValue ? '' : 'active'} />
           <Icon id='times-circle' className={hasValue ? 'active' : ''} />
         </div>
-
-        <Overlay show={expanded && !hasValue} placement='bottom' target={this}>
-          <SearchPopout />
+        <Overlay show={expanded && !hasValue} placement='bottom' target={this.findTarget} popperConfig={{ strategy: 'fixed' }}>
+          {({ props, placement }) => (
+            <div {...props} style={{ ...props.style, width: 285, zIndex: 2 }}>
+              <div className={`dropdown-animation ${placement}`}>
+                <SearchPopout />
+              </div>
+            </div>
+          )}
         </Overlay>
       </div>
     );
diff --git a/app/javascript/flavours/glitch/features/compose/containers/options_container.js b/app/javascript/flavours/glitch/features/compose/containers/options_container.js
index 6c3db8173..5de9f5419 100644
--- a/app/javascript/flavours/glitch/features/compose/containers/options_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/options_container.js
@@ -46,7 +46,7 @@ const mapDispatchToProps = (dispatch) => ({
   },
 
   onDoodleOpen() {
-    dispatch(openModal('DOODLE', { noEsc: true }));
+    dispatch(openModal('DOODLE', { noEsc: true, noClose: true }));
   },
 });
 
diff --git a/app/javascript/flavours/glitch/features/explore/index.js b/app/javascript/flavours/glitch/features/explore/index.js
index ba435d7e3..da0dc7f7c 100644
--- a/app/javascript/flavours/glitch/features/explore/index.js
+++ b/app/javascript/flavours/glitch/features/explore/index.js
@@ -24,16 +24,6 @@ const mapStateToProps = state => ({
   isSearching: state.getIn(['search', 'submitted']) || !showTrends,
 });
 
-// Fix strange bug on Safari where <span> (rendered by FormattedMessage) disappears
-// after clicking around Explore top bar (issue #20885).
-// Removing width=100% from <a> also fixes it, as well as replacing <span> with <div>
-// We're choosing to wrap span with div to keep the changes local only to this tool bar.
-const WrapFormattedMessage = ({ children, ...props }) => <div><FormattedMessage {...props}>{children}</FormattedMessage></div>;
-WrapFormattedMessage.propTypes = {
-  children: PropTypes.any,
-};
-
-
 export default @connect(mapStateToProps)
 @injectIntl
 class Explore extends React.PureComponent {
@@ -78,12 +68,22 @@ class Explore extends React.PureComponent {
           {isSearching ? (
             <SearchResults />
           ) : (
-            <React.Fragment>
+            <>
               <div className='account__section-headline'>
-                <NavLink exact to='/explore'><WrapFormattedMessage id='explore.trending_statuses' defaultMessage='Posts' /></NavLink>
-                <NavLink exact to='/explore/tags'><WrapFormattedMessage id='explore.trending_tags' defaultMessage='Hashtags' /></NavLink>
-                <NavLink exact to='/explore/links'><WrapFormattedMessage id='explore.trending_links' defaultMessage='News' /></NavLink>
-                {signedIn && <NavLink exact to='/explore/suggestions'><WrapFormattedMessage id='explore.suggested_follows' defaultMessage='For you' /></NavLink>}
+                <NavLink exact to='/explore'>
+                  <FormattedMessage tagName='div' id='explore.trending_statuses' defaultMessage='Posts' />
+                </NavLink>
+                <NavLink exact to='/explore/tags'>
+                  <FormattedMessage tagName='div' id='explore.trending_tags' defaultMessage='Hashtags' />
+                </NavLink>
+                <NavLink exact to='/explore/links'>
+                  <FormattedMessage tagName='div' id='explore.trending_links' defaultMessage='News' />
+                </NavLink>
+                {signedIn && (
+                  <NavLink exact to='/explore/suggestions'>
+                    <FormattedMessage tagName='div' id='explore.suggested_follows' defaultMessage='For you' />
+                  </NavLink>
+                )}
               </div>
 
               <Switch>
@@ -97,7 +97,7 @@ class Explore extends React.PureComponent {
                 <title>{intl.formatMessage(messages.title)}</title>
                 <meta name='robots' content={isSearching ? 'noindex' : 'all'} />
               </Helmet>
-            </React.Fragment>
+            </>
           )}
         </div>
       </Column>
diff --git a/app/javascript/flavours/glitch/features/hashtag_timeline/index.js b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js
index 4428fdecf..219dc0ec6 100644
--- a/app/javascript/flavours/glitch/features/hashtag_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js
@@ -194,7 +194,7 @@ class HashtagTimeline extends React.PureComponent {
       const following = tag.get('following');
 
       followButton = (
-        <button className={classNames('column-header__button')} onClick={this.handleFollow} disabled={!signedIn} title={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)} aria-label={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)}>
+        <button className={classNames('column-header__button')} onClick={this.handleFollow} disabled={!signedIn} active={following} title={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)} aria-label={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)}>
           <Icon id={following ? 'user-times' : 'user-plus'} fixedWidth className='column-header__icon' />
         </button>
       );
diff --git a/app/javascript/flavours/glitch/features/local_settings/navigation/index.js b/app/javascript/flavours/glitch/features/local_settings/navigation/index.js
index e618a981e..98dda182f 100644
--- a/app/javascript/flavours/glitch/features/local_settings/navigation/index.js
+++ b/app/javascript/flavours/glitch/features/local_settings/navigation/index.js
@@ -13,7 +13,6 @@ const messages = defineMessages({
   general: {  id: 'settings.general', defaultMessage: 'General' },
   compose: {  id: 'settings.compose_box_opts', defaultMessage: 'Compose box' },
   content_warnings: { id: 'settings.content_warnings', defaultMessage: 'Content Warnings' },
-  filters: { id: 'settings.filters', defaultMessage: 'Filters' },
   collapsed: { id: 'settings.collapsed_statuses', defaultMessage: 'Collapsed toots' },
   media: { id: 'settings.media', defaultMessage: 'Media' },
   preferences: { id: 'settings.preferences', defaultMessage: 'Preferences' },
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 b6f8a9877..73913dd49 100644
--- a/app/javascript/flavours/glitch/features/status/components/action_bar.js
+++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js
@@ -7,7 +7,7 @@ import { defineMessages, injectIntl } from 'react-intl';
 import { me } from 'flavours/glitch/initial_state';
 import { accountAdminLink, statusAdminLink } from 'flavours/glitch/utils/backend_links';
 import classNames from 'classnames';
-import { PERMISSION_MANAGE_USERS } from 'flavours/glitch/permissions';
+import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'flavours/glitch/permissions';
 
 const messages = defineMessages({
   delete: { id: 'status.delete', defaultMessage: 'Delete' },
@@ -34,6 +34,7 @@ const messages = defineMessages({
   embed: { id: 'status.embed', defaultMessage: 'Embed' },
   admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
   admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
+  admin_domain: { id: 'status.admin_domain', defaultMessage: 'Open moderation interface for {domain}' },
   copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },
   openOriginalPage: { id: 'account.open_original_page', defaultMessage: 'Open original page' },
 });
@@ -177,19 +178,19 @@ class ActionBar extends React.PureComponent {
       menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick });
       menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick });
       menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });
-      if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS && (accountAdminLink || statusAdminLink)) {
+      if (((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS && (accountAdminLink || statusAdminLink)) || (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION)) {
         menu.push(null);
-        if (accountAdminLink !== undefined) {
-          menu.push({
-            text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }),
-            href: accountAdminLink(status.getIn(['account', 'id'])),
-          });
+        if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) {
+          if (accountAdminLink !== undefined) {
+            menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: accountAdminLink(status.getIn(['account', 'id'])) });
+          }
+          if (statusAdminLink !== undefined) {
+            menu.push({ text: intl.formatMessage(messages.admin_status), href: statusAdminLink(status.getIn(['account', 'id']), status.get('id')) });
+          }
         }
-        if (statusAdminLink !== undefined) {
-          menu.push({
-            text: intl.formatMessage(messages.admin_status),
-            href: statusAdminLink(status.getIn(['account', 'id']), status.get('id')),
-          });
+        if (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION) {
+          const domain = status.getIn(['account', 'acct']).split('@')[1];
+          menu.push({ text: intl.formatMessage(messages.admin_domain, { domain: domain }), href: `/admin/instances/${domain}` });
         }
       }
     }
diff --git a/app/javascript/flavours/glitch/features/status/components/detailed_status.js b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
index 7d2c2aace..907fc3f1c 100644
--- a/app/javascript/flavours/glitch/features/status/components/detailed_status.js
+++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
@@ -41,7 +41,10 @@ class DetailedStatus extends ImmutablePureComponent {
     domain: PropTypes.string.isRequired,
     compact: PropTypes.bool,
     showMedia: PropTypes.bool,
-    usingPiP: PropTypes.bool,
+    pictureInPicture: ImmutablePropTypes.contains({
+      inUse: PropTypes.bool,
+      available: PropTypes.bool,
+    }),
     onToggleMediaVisibility: PropTypes.func,
     intl: PropTypes.object.isRequired,
   };
@@ -120,7 +123,7 @@ class DetailedStatus extends ImmutablePureComponent {
 
   render () {
     const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status;
-    const { expanded, onToggleHidden, settings, usingPiP, intl } = this.props;
+    const { expanded, onToggleHidden, settings, pictureInPicture, intl } = this.props;
     const outerStyle = { boxSizing: 'border-box' };
     const { compact } = this.props;
 
@@ -153,7 +156,7 @@ class DetailedStatus extends ImmutablePureComponent {
       outerStyle.height = `${this.state.height}px`;
     }
 
-    if (usingPiP) {
+    if (pictureInPicture.get('inUse')) {
       media.push(<PictureInPicturePlaceholder />);
       mediaIcons.push('video-camera');
     } else if (status.get('media_attachments').size > 0) {
diff --git a/app/javascript/flavours/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js
index e190652b0..c22e7f0bd 100644
--- a/app/javascript/flavours/glitch/features/status/index.js
+++ b/app/javascript/flavours/glitch/features/status/index.js
@@ -41,7 +41,7 @@ import { initMuteModal } from 'flavours/glitch/actions/mutes';
 import { initBlockModal } from 'flavours/glitch/actions/blocks';
 import { initReport } from 'flavours/glitch/actions/reports';
 import { initBoostModal } from 'flavours/glitch/actions/boosts';
-import { makeGetStatus } from 'flavours/glitch/selectors';
+import { makeGetStatus, makeGetPictureInPicture } from 'flavours/glitch/selectors';
 import ScrollContainer from 'flavours/glitch/containers/scroll_container';
 import ColumnBackButton from 'flavours/glitch/components/column_back_button';
 import ColumnHeader from '../../components/column_header';
@@ -67,11 +67,12 @@ 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?' },
-  tootHeading: { id: 'column.toot', defaultMessage: 'Toots and replies' },
+  tootHeading: { id: 'account.posts_with_replies', defaultMessage: 'Posts and replies' },
 });
 
 const makeMapStateToProps = () => {
   const getStatus = makeGetStatus();
+  const getPictureInPicture = makeGetPictureInPicture();
 
   const getAncestorsIds = createSelector([
     (_, { id }) => id,
@@ -129,11 +130,12 @@ const makeMapStateToProps = () => {
 
   const mapStateToProps = (state, props) => {
     const status = getStatus(state, { id: props.params.statusId });
-    let ancestorsIds = Immutable.List();
+
+    let ancestorsIds   = Immutable.List();
     let descendantsIds = Immutable.List();
 
     if (status) {
-      ancestorsIds = getAncestorsIds(state, { id: status.get('in_reply_to_id') });
+      ancestorsIds   = getAncestorsIds(state, { id: status.get('in_reply_to_id') });
       descendantsIds = getDescendantsIds(state, { id: status.get('id') });
     }
 
@@ -145,7 +147,7 @@ const makeMapStateToProps = () => {
       settings: state.get('local_settings'),
       askReplyConfirmation: state.getIn(['local_settings', 'confirm_before_clearing_draft']) && state.getIn(['compose', 'text']).trim().length !== 0,
       domain: state.getIn(['meta', 'domain']),
-      usingPiP: state.get('picture_in_picture').statusId === props.params.statusId,
+      pictureInPicture: getPictureInPicture(state, { id: props.params.statusId }),
     };
   };
 
@@ -190,7 +192,10 @@ class Status extends ImmutablePureComponent {
     askReplyConfirmation: PropTypes.bool,
     multiColumn: PropTypes.bool,
     domain: PropTypes.string.isRequired,
-    usingPiP: PropTypes.bool,
+    pictureInPicture: ImmutablePropTypes.contains({
+      inUse: PropTypes.bool,
+      available: PropTypes.bool,
+    }),
   };
 
   state = {
@@ -604,7 +609,7 @@ class Status extends ImmutablePureComponent {
 
   render () {
     let ancestors, descendants;
-    const { isLoading, status, settings, ancestorsIds, descendantsIds, intl, domain, multiColumn, usingPiP } = this.props;
+    const { isLoading, status, settings, ancestorsIds, descendantsIds, intl, domain, multiColumn, pictureInPicture } = this.props;
     const { fullscreen } = this.state;
 
     if (isLoading) {
@@ -682,7 +687,7 @@ class Status extends ImmutablePureComponent {
                   domain={domain}
                   showMedia={this.state.showMedia}
                   onToggleMediaVisibility={this.handleToggleMediaVisibility}
-                  usingPiP={usingPiP}
+                  pictureInPicture={pictureInPicture}
                 />
 
                 <ActionBar
diff --git a/app/javascript/flavours/glitch/features/ui/components/columns_area.js b/app/javascript/flavours/glitch/features/ui/components/columns_area.js
index bf3e79c24..993a50796 100644
--- a/app/javascript/flavours/glitch/features/ui/components/columns_area.js
+++ b/app/javascript/flavours/glitch/features/ui/components/columns_area.js
@@ -99,7 +99,7 @@ export default class ColumnsArea extends ImmutablePureComponent {
       if (this.mediaQuery.removeEventListener) {
         this.mediaQuery.removeEventListener('change', this.handleLayoutChange);
       } else {
-        this.mediaQuery.removeListener(this.handleLayouteChange);
+        this.mediaQuery.removeListener(this.handleLayoutChange);
       }
     }
   }
diff --git a/app/javascript/flavours/glitch/features/ui/components/focal_point_modal.js b/app/javascript/flavours/glitch/features/ui/components/focal_point_modal.js
index de330b3a1..0dd07fb76 100644
--- a/app/javascript/flavours/glitch/features/ui/components/focal_point_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/focal_point_modal.js
@@ -291,11 +291,11 @@ class FocalPointModal extends ImmutablePureComponent {
     let descriptionLabel = null;
 
     if (media.get('type') === 'audio') {
-      descriptionLabel = <FormattedMessage id='upload_form.audio_description' defaultMessage='Describe for people with hearing loss' />;
+      descriptionLabel = <FormattedMessage id='upload_form.audio_description' defaultMessage='Describe for people who are hard of hearing' />;
     } else if (media.get('type') === 'video') {
-      descriptionLabel = <FormattedMessage id='upload_form.video_description' defaultMessage='Describe for people with hearing loss or visual impairment' />;
+      descriptionLabel = <FormattedMessage id='upload_form.video_description' defaultMessage='Describe for people who are deaf, hard of hearing, blind or have low vision' />;
     } else {
-      descriptionLabel = <FormattedMessage id='upload_form.description' defaultMessage='Describe for the visually impaired' />;
+      descriptionLabel = <FormattedMessage id='upload_form.description' defaultMessage='Describe for people who are blind or have low vision' />;
     }
 
     let ocrMessage = '';
diff --git a/app/javascript/flavours/glitch/features/ui/components/link_footer.js b/app/javascript/flavours/glitch/features/ui/components/link_footer.js
index 28adf5e06..ac0c78674 100644
--- a/app/javascript/flavours/glitch/features/ui/components/link_footer.js
+++ b/app/javascript/flavours/glitch/features/ui/components/link_footer.js
@@ -52,6 +52,8 @@ class LinkFooter extends React.PureComponent {
     const canInvite = signedIn && ((permissions & PERMISSION_INVITE_USERS) === PERMISSION_INVITE_USERS);
     const canProfileDirectory = profileDirectory;
 
+    const DividingCircle = <span aria-hidden>{' · '}</span>;
+
     return (
       <div className='link-footer'>
         <p>
@@ -60,17 +62,17 @@ class LinkFooter extends React.PureComponent {
           <Link key='about' to='/about'><FormattedMessage id='footer.about' defaultMessage='About' /></Link>
           {canInvite && (
             <>
-              {' · '}
+              {DividingCircle}
               <a key='invites' href='/invites' target='_blank'><FormattedMessage id='footer.invite' defaultMessage='Invite people' /></a>
             </>
           )}
           {canProfileDirectory && (
             <>
-              {' · '}
+              {DividingCircle}
               <Link key='directory' to='/directory'><FormattedMessage id='footer.directory' defaultMessage='Profiles directory' /></Link>
             </>
           )}
-          {' · '}
+          {DividingCircle}
           <Link key='privacy-policy' to='/privacy-policy'><FormattedMessage id='footer.privacy_policy' defaultMessage='Privacy policy' /></Link>
         </p>
 
@@ -78,11 +80,13 @@ class LinkFooter extends React.PureComponent {
           <strong>Mastodon</strong>:
           {' '}
           <a href='https://joinmastodon.org' target='_blank'><FormattedMessage id='footer.about' defaultMessage='About' /></a>
-          {' · '}
+          {DividingCircle}
+          <a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='footer.get_app' defaultMessage='Get the app' /></a>
+          {DividingCircle}
           <Link to='/keyboard-shortcuts'><FormattedMessage id='footer.keyboard_shortcuts' defaultMessage='Keyboard shortcuts' /></Link>
-          {' · '}
+          {DividingCircle}
           <a href={source_url} rel='noopener noreferrer' target='_blank'><FormattedMessage id='footer.source_code' defaultMessage='View source code' /></a>
-          {' · '}
+          {DividingCircle}
           v{version}
         </p>
       </div>
diff --git a/app/javascript/flavours/glitch/features/ui/components/modal_root.js b/app/javascript/flavours/glitch/features/ui/components/modal_root.js
index d2ee28948..379f57cbb 100644
--- a/app/javascript/flavours/glitch/features/ui/components/modal_root.js
+++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.js
@@ -116,13 +116,16 @@ export default class ModalRoot extends React.PureComponent {
     this._modal = c;
   }
 
+  // prevent closing of modal when clicking the overlay
+  noop = () => {}
+
   render () {
     const { type, props, ignoreFocus } = this.props;
     const { backgroundColor } = this.state;
     const visible = !!type;
 
     return (
-      <Base backgroundColor={backgroundColor} onClose={this.handleClose} noEsc={props ? props.noEsc : false} ignoreFocus={ignoreFocus}>
+      <Base backgroundColor={backgroundColor} onClose={props && props.noClose ? this.noop : this.handleClose} noEsc={props ? props.noEsc : false} ignoreFocus={ignoreFocus}>
         {visible && (
           <>
             <BundleContainer fetchComponent={MODAL_COMPONENTS[type]} loading={this.renderLoading(type)} error={this.renderError} renderDelay={200}>
diff --git a/app/javascript/flavours/glitch/features/ui/components/video_modal.js b/app/javascript/flavours/glitch/features/ui/components/video_modal.js
index 6b6e615a6..90be11e4b 100644
--- a/app/javascript/flavours/glitch/features/ui/components/video_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/video_modal.js
@@ -50,6 +50,7 @@ export default class VideoModal extends ImmutablePureComponent {
             autoPlay={options.autoPlay}
             volume={options.defaultVolume}
             onCloseVideo={onClose}
+            autoFocus
             detailed
             alt={media.get('description')}
           />
diff --git a/app/javascript/flavours/glitch/features/video/index.js b/app/javascript/flavours/glitch/features/video/index.js
index cb4655f7f..0daab747b 100644
--- a/app/javascript/flavours/glitch/features/video/index.js
+++ b/app/javascript/flavours/glitch/features/video/index.js
@@ -124,6 +124,7 @@ class Video extends React.PureComponent {
     volume: PropTypes.number,
     muted: PropTypes.bool,
     componentIndex: PropTypes.number,
+    autoFocus: PropTypes.bool,
   };
 
   static defaultProps = {
@@ -537,7 +538,7 @@ class Video extends React.PureComponent {
   }
 
   render () {
-    const { preview, src, inline, onOpenVideo, onCloseVideo, intl, alt, letterbox, fullwidth, detailed, sensitive, editable, blurhash } = this.props;
+    const { preview, src, inline, onOpenVideo, onCloseVideo, intl, alt, letterbox, fullwidth, detailed, sensitive, editable, blurhash, autoFocus } = this.props;
     const { containerWidth, currentTime, duration, volume, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state;
     const progress = Math.min((currentTime / duration) * 100, 100);
     const playerStyle = {};
@@ -635,7 +636,7 @@ class Video extends React.PureComponent {
 
           <div className='video-player__buttons-bar'>
             <div className='video-player__buttons left'>
-              <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} className='player-button' onClick={this.togglePlay} autoFocus={detailed}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
+              <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} className='player-button' onClick={this.togglePlay} autoFocus={autoFocus}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
               <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
 
               <div className={classNames('video-player__volume', { active: this.state.hovered })} onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}>
diff --git a/app/javascript/flavours/glitch/load_polyfills.js b/app/javascript/flavours/glitch/load_polyfills.js
index cc5bcd18f..f5a897f75 100644
--- a/app/javascript/flavours/glitch/load_polyfills.js
+++ b/app/javascript/flavours/glitch/load_polyfills.js
@@ -23,15 +23,14 @@ function loadPolyfills() {
   );
 
   // Latest version of Firefox and Safari do not have IntersectionObserver.
-  // Edge does not have requestIdleCallback and object-fit CSS property.
+  // Edge does not have requestIdleCallback.
   // This avoids shipping them all the polyfills.
   const needsExtraPolyfills = !(
     window.AbortController &&
     window.IntersectionObserver &&
     window.IntersectionObserverEntry &&
     'isIntersecting' in IntersectionObserverEntry.prototype &&
-    window.requestIdleCallback &&
-    'object-fit' in (new Image()).style
+    window.requestIdleCallback
   );
 
   return Promise.all([
diff --git a/app/javascript/flavours/glitch/locales/af.js b/app/javascript/flavours/glitch/locales/af.js
deleted file mode 100644
index 4c97b644a..000000000
--- a/app/javascript/flavours/glitch/locales/af.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/af.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/af.json b/app/javascript/flavours/glitch/locales/af.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/af.json
@@ -0,0 +1 @@
+{}
diff --git a/app/javascript/flavours/glitch/locales/an.json b/app/javascript/flavours/glitch/locales/an.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/an.json
@@ -0,0 +1 @@
+{}
diff --git a/app/javascript/flavours/glitch/locales/ar.js b/app/javascript/flavours/glitch/locales/ar.js
deleted file mode 100644
index 1081147d5..000000000
--- a/app/javascript/flavours/glitch/locales/ar.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ar.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ar.json b/app/javascript/flavours/glitch/locales/ar.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ar.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/ast.js b/app/javascript/flavours/glitch/locales/ast.js
deleted file mode 100644
index 41355c24c..000000000
--- a/app/javascript/flavours/glitch/locales/ast.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ast.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ast.json b/app/javascript/flavours/glitch/locales/ast.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ast.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/be.json b/app/javascript/flavours/glitch/locales/be.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/be.json
@@ -0,0 +1 @@
+{}
diff --git a/app/javascript/flavours/glitch/locales/bg.js b/app/javascript/flavours/glitch/locales/bg.js
deleted file mode 100644
index 979039376..000000000
--- a/app/javascript/flavours/glitch/locales/bg.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/bg.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/bg.json b/app/javascript/flavours/glitch/locales/bg.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/bg.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/bn.js b/app/javascript/flavours/glitch/locales/bn.js
deleted file mode 100644
index a453498b3..000000000
--- a/app/javascript/flavours/glitch/locales/bn.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/bn.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/bn.json b/app/javascript/flavours/glitch/locales/bn.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/bn.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/br.js b/app/javascript/flavours/glitch/locales/br.js
deleted file mode 100644
index 966bd1b2f..000000000
--- a/app/javascript/flavours/glitch/locales/br.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/br.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/br.json b/app/javascript/flavours/glitch/locales/br.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/br.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/bs.json b/app/javascript/flavours/glitch/locales/bs.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/bs.json
@@ -0,0 +1 @@
+{}
diff --git a/app/javascript/flavours/glitch/locales/ca.js b/app/javascript/flavours/glitch/locales/ca.js
deleted file mode 100644
index baf76bd6f..000000000
--- a/app/javascript/flavours/glitch/locales/ca.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ca.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ca.json b/app/javascript/flavours/glitch/locales/ca.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ca.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/ckb.js b/app/javascript/flavours/glitch/locales/ckb.js
deleted file mode 100644
index c2e177d5f..000000000
--- a/app/javascript/flavours/glitch/locales/ckb.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ckb.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ckb.json b/app/javascript/flavours/glitch/locales/ckb.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ckb.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/co.js b/app/javascript/flavours/glitch/locales/co.js
deleted file mode 100644
index 6e9e46797..000000000
--- a/app/javascript/flavours/glitch/locales/co.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/co.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/co.json b/app/javascript/flavours/glitch/locales/co.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/co.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/cs.js b/app/javascript/flavours/glitch/locales/cs.js
deleted file mode 100644
index e789facb0..000000000
--- a/app/javascript/flavours/glitch/locales/cs.js
+++ /dev/null
@@ -1,180 +0,0 @@
-import inherited from 'mastodon/locales/cs.json';
-
-const messages = {
-  'about.fork_disclaimer': 'Glitch-soc je svobodný software s otevřeným zdrojovým kódem založený na Mastodonu.',
-  'settings.layout_opts': 'Možnosti rozvržení',
-  'settings.layout': 'Rozložení:',
-  'layout.current_is': 'Nastavené rozložení je:',
-  'layout.auto': 'Automatické',
-  'layout.desktop': 'Desktop',
-  'layout.mobile': 'Mobil',
-  'layout.hint.auto': 'Vybrat rozložení automaticky v závislosti na nastavení “Povolit pokročilé webové rozhraní” a velikosti obrazovky.',
-  'layout.hint.desktop': 'Použít vícesloupcové rozložení nezávisle na nastavení “Povolit pokročilé webové rozhraní” a velikosti obrazovky.',
-  'layout.hint.single': 'Použít jednosloupcové rozložení nezávisle na nastavení “Povolit pokročilé webové rozhraní” a velikosti obrazovky.',
-  'navigation_bar.app_settings': 'Nastavení aplikace',
-  'navigation_bar.featured_users': 'Vybraní uživatelé',
-  'endorsed_accounts_editor.endorsed_accounts': 'Vybrané účty',
-  'navigation_bar.info': 'Rozšířené informace',
-  'navigation_bar.misc': 'Různé',
-  'navigation_bar.keyboard_shortcuts': 'Klávesové zkratky',
-  'getting_started.onboarding': 'Ukaž mi to tu', 
-  'onboarding.skip': 'Přeskočit',
-  'onboarding.next': 'Další',
-  'onboarding.done': 'Hotovo',
-  'onboarding.page_one.federation': '{domain} je \'instance\' Mastodonu. Mastodon je síť nezávislých serverů, které jsou spolu propojené do jedné velké sociální sítě. Těmto serverům říkáme instance.',
-  'onboarding.page_one.handle': 'Jste na instanci {domain}, takže celá adresa vašeho profilu je {handle}',
-  'onboarding.page_one.welcome': 'Vítá vás {domain}!',
-  'onboarding.page_two.compose': 'Příspěvky se píší v levém sloupci. Pomocí ikon pod příspěvkem k němu můžete připojit obrázky, změnit úroveň soukromí nebo přidat varování o obsahu.',
-  'onboarding.page_three.search': 'Pomocí vyhledávací lišty můžete hledat lidi nebo hashtagy. Pokud hledáte někoho z jiné instance, musíte použít celou adresu jeho profilu.',
-  'onboarding.page_three.profile': 'Upravte si svůj profil a nastavte si profilový obrázek, jméno, a krátký text o sobě. Naleznete tam i další možnosti nastavení.',
-  'onboarding.page_four.home': 'Domovská časová osa zobrazuje příspěvky od lidí, které sledujete.',
-  'onboarding.page_four.notifications': 'Notifikace se zobrazí, když s vámi někdo interaguje.',
-  'onboarding.page_five.public_timelines': 'Místní časová osa zobrazuje veřejné příspěvky všech uživatelů instance {domain}. Federovaná časová osa zobrazí příspěvky od všech, koho uživatelé instance {domain} sledují. Tyto veřejné časové osy jsou skvělý způsob, jak objevit nové lidi.',
-  'onboarding.page_six.almost_done': 'Skoro hotovo...',
-  'onboarding.page_six.github': 'Na serveru {domain} běží Glitchsoc. Glitchsoc je přátelský {fork} programu {Mastodon}, a je kompatibilní s jakoukoliv jinou mastodoní instancí nebo aplikací. Glitchsoc je zcela svobodný a má otevřený zdrojový kód. Na stránce {github} můžete hlásit chyby, žádat o nové funkce, nebo ke kódu vlastnoručně přispět.',
-  'onboarding.page_six.apps_available': 'Jsou dostupné {apps} pro iOS, Android i jiné platformy.',
-  'onboarding.page_six.various_app': 'mobilní aplikace',
-  'onboarding.page_six.appetoot': 'Veselé mastodonění!',
-  'settings.auto_collapse': 'Automaticky sbalit',
-  'settings.auto_collapse_all': 'Všechno',
-  'settings.auto_collapse_lengthy': 'Dlouhé příspěvky',
-  'settings.auto_collapse_media': 'Příspěvky s přílohami',
-  'settings.auto_collapse_notifications': 'Oznámení',
-  'settings.auto_collapse_reblogs': 'Boosty',
-  'settings.auto_collapse_replies': 'Odpovědi',
-  'settings.show_action_bar': 'Zobrazit ve sbalených příspěvcích tlačítka s akcemi',
-  'settings.close': 'Zavřít',
-  'settings.collapsed_statuses': 'Sbalené příspěvky',
-  'settings.confirm_boost_missing_media_description': 'Zobrazit potvrzovací dialog před boostnutím příspěvku s chybějícími popisky obrázků',
-  'boost_modal.missing_description': 'Příspěvek obsahuje obrázky bez popisků',
-  'settings.enable_collapsed': 'Povolit sbalené příspěvky',
-  'settings.enable_collapsed_hint': 'U sbalených příspěvků je část jejich obsahu skrytá, aby zabraly méně místa na obrazovce. (Tohle není stejná funkce jako varování o obsahu.)',
-  'settings.general': 'Obecné',
-  'settings.hicolor_privacy_icons': 'Barevné ikony soukromí',
-  'settings.hicolor_privacy_icons.hint': 'Zobrazit ikony úrovně soukromí příspěvků v jasných, snadno rozlišitelných barvách',
-  'settings.image_backgrounds': 'Obrázkové pozadí',
-  'settings.image_backgrounds_media': 'Náhled médií ve sbalených příspěvcích',
-  'settings.image_backgrounds_media_hint': 'Pokud jsou k příspěvku přiložena média, použije se první z nich jako pozadí', 
-  'settings.image_backgrounds_users': 'Nastavit sbaleným příspěvkům obrázkové pozadí',
-  'settings.inline_preview_cards': 'Zobrazit v časové ose náhledy externích odkazů',
-  'settings.media': 'Média',
-  'settings.media_letterbox': 'Neořezávat obrázky',
-  'settings.media_letterbox_hint': 'Místo výřezu obrázku zobrazit obrázek celý, doplněný podle potřeby o prázdné okraje',
-  'settings.media_fullwidth': 'Zobrazit náhledy v plné šířce',
-  'settings.notifications_opts': 'Možnosti oznámení',
-  'settings.notifications.tab_badge': 'Zobrazit počet nepřečtených oznámení',
-  'settings.notifications.tab_badge.hint': 'Počet nepřečtených oznámení se viditelně zobrazí na hlavní stránce (pokud není seznam oznámení viditelný)',
-  'settings.notifications.favicon_badge': 'Zobrazit počet na ikoně serveru',
-  'settings.notifications.favicon_badge.hint': 'Zobrazí počet nepřečtených oznámení na ikoně serveru',
-  'settings.preferences': 'Předvolby',
-  'settings.rewrite_mentions': 'Přepsat zmínky v zobrazených příspěvcích',
-  'settings.rewrite_mentions_no': 'Nepřepisovat zmínky',
-  'settings.rewrite_mentions_acct': 'Přepsat uživatelským jménem a doménou (pokud je účet na jiném serveru)',
-  'settings.rewrite_mentions_username': 'Přepsat uživatelským jménem',
-  'settings.show_reply_counter': 'Zobrazit odhad počtu odpovědí',
-  'settings.status_icons': 'Ikony u příspěvků',
-  'settings.status_icons_language': 'Indikace jazyk',
-  'settings.status_icons_reply': 'Indikace odpovědi',
-  'settings.status_icons_local_only': 'Indikace lokálního příspěvku',
-  'settings.status_icons_media': 'Indikace obrázků a anket',
-  'settings.status_icons_visibility': 'Indikace úrovně soukromí',
-  'settings.tag_misleading_links': 'Označit zavádějící odkazy',
-  'settings.tag_misleading_links.hint': 'Zobrazit skutečný cíl u každého odkazu, který ho explicitně nezmiňuje',
-  'settings.wide_view': 'Široké sloupce (pouze v režimu Desktop)',
-  'settings.wide_view_hint': 'Sloupce se roztáhnout, aby lépe vyplnily dostupný prostor.',
-  'settings.navbar_under': 'Navigační lišta vespod (pouze v režimu Mobil)',
-  'settings.compose_box_opts': 'Editační pole',
-  'settings.always_show_spoilers_field': 'Vždy zobrazit pole pro varování o obsahu',
-  'settings.prepend_cw_re': 'Při odpovídání přidat před varování o obsahu “re: ”',
-  'settings.preselect_on_reply': 'Při odpovědi označit uživatelská jména',
-  'settings.preselect_on_reply_hint': 'Při odpovídání na konverzaci s více účastníky se jména všech kromě prvního označí, aby šla jednoduše smazat',
-  'settings.confirm_missing_media_description': 'Zobrazit potvrzovací dialog při odesílání příspěvku, ve kterém chybí popisky obrázků',
-  'settings.confirm_before_clearing_draft': 'Zobrazit potvrzovací dialog před přepsáním právě vytvářené zprávy',
-  'settings.show_content_type_choice': 'Zobrazit volbu formátu příspěvku',
-  'settings.side_arm': 'Vedlejší odesílací tlačítko:',
-  'settings.side_arm.none': 'Žádné',
-  'settings.side_arm_reply_mode': 'Při odpovídání na příspěvek by vedlejší odesílací tlačítko mělo:',  
-  'settings.side_arm_reply_mode.keep': 'Použít svou nastavenou úroveň soukromí',
-  'settings.side_arm_reply_mode.copy': 'Použít úroveň soukromí příspěvku, na který odpovídáte',
-  'settings.side_arm_reply_mode.restrict': 'Zvýšit úroveň soukromí nejméně na úroveň příspěvku, na který odpovídáte',  
-  'settings.content_warnings': 'Varování o obsahu',
-  'settings.content_warnings_shared_state': 'Zobrazit/schovat všechny kopie naráz',
-  'settings.content_warnings_shared_state_hint': 'Tlačítko varování o obsahu bude mít efekt na všechny kopie příspěvku naráz, stejně jako na běžném Mastodonu. Nebude pak možné automaticky sbalit jakoukoliv kopii příspěvku, která má rozbalené varování o obsahu',
-  'settings.content_warnings_media_outside': 'Zobrazit obrázky a videa mimo varování o obsahu',
-  'settings.content_warnings_media_outside_hint': 'Obrázky a videa z příspěvku s varováním o obsahu se zobrazí se separátním přepínačem zobrazení, stejně jako na běžném Mastodonu.',
-  'settings.content_warnings_unfold_opts': 'Možnosti automatického rozbalení',
-  'settings.enable_content_warnings_auto_unfold': 'Vždy rozbalit příspěvky označené varováním o obsahu',
-  'settings.deprecated_setting': 'Tato možnost se nyní nastavuje v {settings_page_link}',
-  'settings.shared_settings_link': 'předvolbách Mastodonu',
-  'settings.content_warnings_filter': 'Tato varování o obsahu automaticky nerozbalovat:',
-  'settings.content_warnings.regexp': 'Regulární výraz',
-  'settings.media_reveal_behind_cw': 'Automaticky zobrazit média označená varováním o obsahu',
-  'settings.pop_in_player': 'Povolit plovoucí okno přehrávače',
-  'settings.pop_in_position': 'Pozice plovoucího okna:',
-  'settings.pop_in_left': 'Vlevo',
-  'settings.pop_in_right': 'Vpravo',
- 
-  
-  'status.collapse': 'Sbalit',
-  'status.uncollapse': 'Rozbalit',  
-  'status.in_reply_to': 'Tento příspěvek je odpověď',
-  'status.has_preview_card': 'Obsahuje náhled odkazu',
-  'status.has_pictures': 'Obsahuje obrázky',
-  'status.is_poll': 'Tento příspěvek je anketa',
-  'status.has_video': 'Obsahuje video',
-  'status.has_audio': 'Obsahuje audio',
-  'status.local_only': 'Viditelné pouze z vaší instance',
-
-  'media_gallery.sensitive': 'Citlivý obsah',
-
-  'favourite_modal.combo': 'Příště můžete pro přeskočení stisknout {combo}',
-
-  'home.column_settings.show_direct': 'Zobrazit přímé zprávy',
-
-  'notification_purge.start': 'Čistící režim',
-  'notifications.mark_as_read': 'Označit všechna oznámení jako přečtená',
-
-  'notification.markForDeletion': 'Označit pro smazání',
-  'notifications.clear': 'Vymazat všechna oznámení',
-  'notifications.marked_clear_confirmation': 'Určitě chcete trvale smazat všechna vybraná oznámení?',
-  'notifications.marked_clear': 'Smazat vybraná oznámení',
-
-  'notification_purge.btn_all': 'Vybrat\nvše',
-  'notification_purge.btn_none': 'Nevybrat\nnic',
-  'notification_purge.btn_invert': 'Obrátit\nvýběr',
-  'notification_purge.btn_apply': 'Smazat\nvybrané',
-
-  'compose.attach.upload': 'Nahrát soubor',
-  'compose.attach.doodle': 'Něco namalovat',
-  'compose.attach': 'Připojit...',
-
-  'advanced_options.local-only.short': 'Lokální příspěvek',
-  'advanced_options.local-only.long': 'Neposílat na jiné servery',
-  'advanced_options.local-only.tooltip': 'Tento příspěvek je pouze lokální',
-  'advanced_options.icon_title': 'Pokročilá nastavení',
-  'advanced_options.threaded_mode.short': 'Režim vlákna',
-  'advanced_options.threaded_mode.long': 'Po odeslání automaticky otevře pole pro odpověď',
-  'advanced_options.threaded_mode.tooltip': 'Režim vlákna je zapnutý',
-  
-  'home.column_settings.advanced': 'Pokročilé',
-  'home.column_settings.filter_regex': 'Filtrovat podle regulárních výrazů',
-  
-  'compose_form.poll.single_choice': 'Povolit jednu odpověď',
-  'compose_form.poll.multiple_choices': 'Povolit více odpovědí',
-  
-  'compose.content-type.plain': 'Prostý text',
-  'content-type.change': 'Formát příspěvku',
-  'compose_form.spoiler': 'Přidat varování o obsahu',
-  
-  'direct.group_by_conversations': 'Seskupit do konverzací',
-  'column.toot': 'Příspěvky a odpovědi',
-  'confirmation_modal.do_not_ask_again': 'Příště se už neptat',
-  
-  'keyboard_shortcuts.bookmark': 'Přidat do záložek',
-  'keyboard_shortcuts.toggle_collapse': 'Sbalit/rozbalit příspěvek',
-  'keyboard_shortcuts.secondary_toot': 'Odeslat příspěvek s druhotným nastavením soukromí',
-  
-  'column.subheading': 'Různé',
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/cs.json b/app/javascript/flavours/glitch/locales/cs.json
new file mode 100644
index 000000000..09ad53140
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/cs.json
@@ -0,0 +1,153 @@
+{
+  "about.fork_disclaimer": "Glitch-soc je svobodný software s otevřeným zdrojovým kódem založený na Mastodonu.",
+  "advanced_options.icon_title": "Pokročilá nastavení",
+  "advanced_options.local-only.long": "Neposílat na jiné servery",
+  "advanced_options.local-only.short": "Lokální příspěvek",
+  "advanced_options.local-only.tooltip": "Tento příspěvek je pouze lokální",
+  "advanced_options.threaded_mode.long": "Po odeslání automaticky otevře pole pro odpověď",
+  "advanced_options.threaded_mode.short": "Režim vlákna",
+  "advanced_options.threaded_mode.tooltip": "Režim vlákna je zapnutý",
+  "boost_modal.missing_description": "Příspěvek obsahuje obrázky bez popisků",
+  "column.subheading": "Různé",
+  "compose.attach": "Připojit...",
+  "compose.attach.doodle": "Něco namalovat",
+  "compose.attach.upload": "Nahrát soubor",
+  "compose.content-type.plain": "Prostý text",
+  "compose_form.poll.multiple_choices": "Povolit více odpovědí",
+  "compose_form.poll.single_choice": "Povolit jednu odpověď",
+  "compose_form.spoiler": "Přidat varování o obsahu",
+  "confirmation_modal.do_not_ask_again": "Příště se už neptat",
+  "content-type.change": "Formát příspěvku",
+  "direct.group_by_conversations": "Seskupit do konverzací",
+  "endorsed_accounts_editor.endorsed_accounts": "Vybrané účty",
+  "favourite_modal.combo": "Příště můžete pro přeskočení stisknout {combo}",
+  "getting_started.onboarding": "Ukaž mi to tu",
+  "home.column_settings.advanced": "Pokročilé",
+  "home.column_settings.filter_regex": "Filtrovat podle regulárních výrazů",
+  "home.column_settings.show_direct": "Zobrazit přímé zprávy",
+  "keyboard_shortcuts.bookmark": "Přidat do záložek",
+  "keyboard_shortcuts.secondary_toot": "Odeslat příspěvek s druhotným nastavením soukromí",
+  "keyboard_shortcuts.toggle_collapse": "Sbalit/rozbalit příspěvek",
+  "layout.auto": "Automatické",
+  "layout.hint.auto": "Vybrat rozložení automaticky v závislosti na nastavení “Povolit pokročilé webové rozhraní” a velikosti obrazovky.",
+  "layout.hint.desktop": "Použít vícesloupcové rozložení nezávisle na nastavení “Povolit pokročilé webové rozhraní” a velikosti obrazovky.",
+  "layout.hint.single": "Použít jednosloupcové rozložení nezávisle na nastavení “Povolit pokročilé webové rozhraní” a velikosti obrazovky.",
+  "media_gallery.sensitive": "Citlivý obsah",
+  "navigation_bar.app_settings": "Nastavení aplikace",
+  "navigation_bar.featured_users": "Vybraní uživatelé",
+  "navigation_bar.info": "Rozšířené informace",
+  "navigation_bar.keyboard_shortcuts": "Klávesové zkratky",
+  "navigation_bar.misc": "Různé",
+  "notification.markForDeletion": "Označit pro smazání",
+  "notification_purge.btn_all": "Vybrat\nvše",
+  "notification_purge.btn_apply": "Smazat\nvybrané",
+  "notification_purge.btn_invert": "Obrátit\nvýběr",
+  "notification_purge.btn_none": "Nevybrat\nnic",
+  "notification_purge.start": "Čistící režim",
+  "notifications.marked_clear": "Smazat vybraná oznámení",
+  "notifications.marked_clear_confirmation": "Určitě chcete trvale smazat všechna vybraná oznámení?",
+  "onboarding.done": "Hotovo",
+  "onboarding.next": "Další",
+  "onboarding.page_five.public_timelines": "Místní časová osa zobrazuje veřejné příspěvky všech uživatelů instance {domain}. Federovaná časová osa zobrazí příspěvky od všech, koho uživatelé instance {domain} sledují. Tyto veřejné časové osy jsou skvělý způsob, jak objevit nové lidi.",
+  "onboarding.page_four.home": "Domovská časová osa zobrazuje příspěvky od lidí, které sledujete.",
+  "onboarding.page_four.notifications": "Notifikace se zobrazí, když s vámi někdo interaguje.",
+  "onboarding.page_one.federation": "{domain} je 'instance' Mastodonu. Mastodon je síť nezávislých serverů, které jsou spolu propojené do jedné velké sociální sítě. Těmto serverům říkáme instance.",
+  "onboarding.page_one.handle": "Jste na instanci {domain}, takže celá adresa vašeho profilu je {handle}",
+  "onboarding.page_one.welcome": "Vítá vás {domain}!",
+  "onboarding.page_six.almost_done": "Skoro hotovo...",
+  "onboarding.page_six.appetoot": "Veselé mastodonění!",
+  "onboarding.page_six.apps_available": "Jsou dostupné {apps} pro iOS, Android i jiné platformy.",
+  "onboarding.page_six.github": "Na serveru {domain} běží Glitchsoc. Glitchsoc je přátelský {fork} programu {Mastodon}, a je kompatibilní s jakoukoliv jinou mastodoní instancí nebo aplikací. Glitchsoc je zcela svobodný a má otevřený zdrojový kód. Na stránce {github} můžete hlásit chyby, žádat o nové funkce, nebo ke kódu vlastnoručně přispět.",
+  "onboarding.page_six.various_app": "mobilní aplikace",
+  "onboarding.page_three.profile": "Upravte si svůj profil a nastavte si profilový obrázek, jméno, a krátký text o sobě. Naleznete tam i další možnosti nastavení.",
+  "onboarding.page_three.search": "Pomocí vyhledávací lišty můžete hledat lidi nebo hashtagy. Pokud hledáte někoho z jiné instance, musíte použít celou adresu jeho profilu.",
+  "onboarding.page_two.compose": "Příspěvky se píší v levém sloupci. Pomocí ikon pod příspěvkem k němu můžete připojit obrázky, změnit úroveň soukromí nebo přidat varování o obsahu.",
+  "onboarding.skip": "Přeskočit",
+  "settings.always_show_spoilers_field": "Vždy zobrazit pole pro varování o obsahu",
+  "settings.auto_collapse": "Automaticky sbalit",
+  "settings.auto_collapse_all": "Všechno",
+  "settings.auto_collapse_lengthy": "Dlouhé příspěvky",
+  "settings.auto_collapse_media": "Příspěvky s přílohami",
+  "settings.auto_collapse_notifications": "Oznámení",
+  "settings.auto_collapse_reblogs": "Boosty",
+  "settings.auto_collapse_replies": "Odpovědi",
+  "settings.close": "Zavřít",
+  "settings.collapsed_statuses": "Sbalené příspěvky",
+  "settings.compose_box_opts": "Editační pole",
+  "settings.confirm_before_clearing_draft": "Zobrazit potvrzovací dialog před přepsáním právě vytvářené zprávy",
+  "settings.confirm_boost_missing_media_description": "Zobrazit potvrzovací dialog před boostnutím příspěvku s chybějícími popisky obrázků",
+  "settings.confirm_missing_media_description": "Zobrazit potvrzovací dialog při odesílání příspěvku, ve kterém chybí popisky obrázků",
+  "settings.content_warnings": "Varování o obsahu",
+  "settings.content_warnings.regexp": "Regulární výraz",
+  "settings.content_warnings_filter": "Tato varování o obsahu automaticky nerozbalovat:",
+  "settings.content_warnings_media_outside": "Zobrazit obrázky a videa mimo varování o obsahu",
+  "settings.content_warnings_media_outside_hint": "Obrázky a videa z příspěvku s varováním o obsahu se zobrazí se separátním přepínačem zobrazení, stejně jako na běžném Mastodonu.",
+  "settings.content_warnings_shared_state": "Zobrazit/schovat všechny kopie naráz",
+  "settings.content_warnings_shared_state_hint": "Tlačítko varování o obsahu bude mít efekt na všechny kopie příspěvku naráz, stejně jako na běžném Mastodonu. Nebude pak možné automaticky sbalit jakoukoliv kopii příspěvku, která má rozbalené varování o obsahu",
+  "settings.content_warnings_unfold_opts": "Možnosti automatického rozbalení",
+  "settings.deprecated_setting": "Tato možnost se nyní nastavuje v {settings_page_link}",
+  "settings.enable_collapsed": "Povolit sbalené příspěvky",
+  "settings.enable_collapsed_hint": "U sbalených příspěvků je část jejich obsahu skrytá, aby zabraly méně místa na obrazovce. (Tohle není stejná funkce jako varování o obsahu.)",
+  "settings.enable_content_warnings_auto_unfold": "Vždy rozbalit příspěvky označené varováním o obsahu",
+  "settings.general": "Obecné",
+  "settings.hicolor_privacy_icons": "Barevné ikony soukromí",
+  "settings.hicolor_privacy_icons.hint": "Zobrazit ikony úrovně soukromí příspěvků v jasných, snadno rozlišitelných barvách",
+  "settings.image_backgrounds": "Obrázkové pozadí",
+  "settings.image_backgrounds_media": "Náhled médií ve sbalených příspěvcích",
+  "settings.image_backgrounds_media_hint": "Pokud jsou k příspěvku přiložena média, použije se první z nich jako pozadí",
+  "settings.image_backgrounds_users": "Nastavit sbaleným příspěvkům obrázkové pozadí",
+  "settings.inline_preview_cards": "Zobrazit v časové ose náhledy externích odkazů",
+  "settings.layout": "Rozložení:",
+  "settings.layout_opts": "Možnosti rozvržení",
+  "settings.media": "Média",
+  "settings.media_fullwidth": "Zobrazit náhledy v plné šířce",
+  "settings.media_letterbox": "Neořezávat obrázky",
+  "settings.media_letterbox_hint": "Místo výřezu obrázku zobrazit obrázek celý, doplněný podle potřeby o prázdné okraje",
+  "settings.media_reveal_behind_cw": "Automaticky zobrazit média označená varováním o obsahu",
+  "settings.notifications.favicon_badge": "Zobrazit počet na ikoně serveru",
+  "settings.notifications.favicon_badge.hint": "Zobrazí počet nepřečtených oznámení na ikoně serveru",
+  "settings.notifications.tab_badge": "Zobrazit počet nepřečtených oznámení",
+  "settings.notifications.tab_badge.hint": "Počet nepřečtených oznámení se viditelně zobrazí na hlavní stránce (pokud není seznam oznámení viditelný)",
+  "settings.notifications_opts": "Možnosti oznámení",
+  "settings.pop_in_left": "Vlevo",
+  "settings.pop_in_player": "Povolit plovoucí okno přehrávače",
+  "settings.pop_in_position": "Pozice plovoucího okna:",
+  "settings.pop_in_right": "Vpravo",
+  "settings.preferences": "Předvolby",
+  "settings.prepend_cw_re": "Při odpovídání přidat před varování o obsahu “re: ”",
+  "settings.preselect_on_reply": "Při odpovědi označit uživatelská jména",
+  "settings.preselect_on_reply_hint": "Při odpovídání na konverzaci s více účastníky se jména všech kromě prvního označí, aby šla jednoduše smazat",
+  "settings.rewrite_mentions": "Přepsat zmínky v zobrazených příspěvcích",
+  "settings.rewrite_mentions_acct": "Přepsat uživatelským jménem a doménou (pokud je účet na jiném serveru)",
+  "settings.rewrite_mentions_no": "Nepřepisovat zmínky",
+  "settings.rewrite_mentions_username": "Přepsat uživatelským jménem",
+  "settings.shared_settings_link": "předvolbách Mastodonu",
+  "settings.show_action_bar": "Zobrazit ve sbalených příspěvcích tlačítka s akcemi",
+  "settings.show_content_type_choice": "Zobrazit volbu formátu příspěvku",
+  "settings.show_reply_counter": "Zobrazit odhad počtu odpovědí",
+  "settings.side_arm": "Vedlejší odesílací tlačítko:",
+  "settings.side_arm.none": "Žádné",
+  "settings.side_arm_reply_mode": "Při odpovídání na příspěvek by vedlejší odesílací tlačítko mělo:",
+  "settings.side_arm_reply_mode.copy": "Použít úroveň soukromí příspěvku, na který odpovídáte",
+  "settings.side_arm_reply_mode.keep": "Použít svou nastavenou úroveň soukromí",
+  "settings.side_arm_reply_mode.restrict": "Zvýšit úroveň soukromí nejméně na úroveň příspěvku, na který odpovídáte",
+  "settings.status_icons": "Ikony u příspěvků",
+  "settings.status_icons_language": "Indikace jazyk",
+  "settings.status_icons_local_only": "Indikace lokálního příspěvku",
+  "settings.status_icons_media": "Indikace obrázků a anket",
+  "settings.status_icons_reply": "Indikace odpovědi",
+  "settings.status_icons_visibility": "Indikace úrovně soukromí",
+  "settings.tag_misleading_links": "Označit zavádějící odkazy",
+  "settings.tag_misleading_links.hint": "Zobrazit skutečný cíl u každého odkazu, který ho explicitně nezmiňuje",
+  "settings.wide_view": "Široké sloupce (pouze v režimu Desktop)",
+  "settings.wide_view_hint": "Sloupce se roztáhnout, aby lépe vyplnily dostupný prostor.",
+  "status.collapse": "Sbalit",
+  "status.has_audio": "Obsahuje audio",
+  "status.has_pictures": "Obsahuje obrázky",
+  "status.has_preview_card": "Obsahuje náhled odkazu",
+  "status.has_video": "Obsahuje video",
+  "status.in_reply_to": "Tento příspěvek je odpověď",
+  "status.is_poll": "Tento příspěvek je anketa",
+  "status.local_only": "Viditelné pouze z vaší instance",
+  "status.uncollapse": "Rozbalit"
+}
diff --git a/app/javascript/flavours/glitch/locales/cy.js b/app/javascript/flavours/glitch/locales/cy.js
deleted file mode 100644
index 09412bd72..000000000
--- a/app/javascript/flavours/glitch/locales/cy.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/cy.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/cy.json b/app/javascript/flavours/glitch/locales/cy.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/cy.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/da.js b/app/javascript/flavours/glitch/locales/da.js
deleted file mode 100644
index 2b08806be..000000000
--- a/app/javascript/flavours/glitch/locales/da.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/da.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/da.json b/app/javascript/flavours/glitch/locales/da.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/da.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/de.js b/app/javascript/flavours/glitch/locales/de.js
deleted file mode 100644
index ce6453623..000000000
--- a/app/javascript/flavours/glitch/locales/de.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/de.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/de.json b/app/javascript/flavours/glitch/locales/de.json
new file mode 100644
index 000000000..c5e3cdb35
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/de.json
@@ -0,0 +1,200 @@
+{
+  "about.fork_disclaimer": "Glitch-soc ist freie, quelloffene Software geforkt von Mastodon.",
+  "account.add_account_note": "Notiz für @{name} hinzufügen",
+  "account.disclaimer_full": "Die folgenden Informationen könnten das Profil des Nutzers unvollständig wiedergeben.",
+  "account.follows": "Folgt",
+  "account.joined": "Beigetreten am {date}",
+  "account.suspended_disclaimer_full": "Dieser Nutzer wurde durch einen Moderator gesperrt.",
+  "account.view_full_profile": "Vollständiges Profil anzeigen",
+  "account_note.cancel": "Abbrechen",
+  "account_note.edit": "Bearbeiten",
+  "account_note.glitch_placeholder": "Kein Kommentar angegeben",
+  "account_note.save": "Speichern",
+  "advanced_options.icon_title": "Erweiterte Optionen",
+  "advanced_options.local-only.long": "Nicht auf anderen Instanzen posten",
+  "advanced_options.local-only.short": "Nur lokal",
+  "advanced_options.local-only.tooltip": "Dieser Post ist nur lokal",
+  "advanced_options.threaded_mode.long": "Öffnet automatisch eine Antwort beim Schreiben",
+  "advanced_options.threaded_mode.short": "Thread-Modus",
+  "advanced_options.threaded_mode.tooltip": "Thread-Modus aktiviert",
+  "boost_modal.missing_description": "Dieser Toot enthält Medien ohne Beschreibung",
+  "column.favourited_by": "Favorisiert von",
+  "column.heading": "Sonstiges",
+  "column.reblogged_by": "Geteilt von",
+  "column.subheading": "Sonstige Optionen",
+  "column_header.profile": "Profil",
+  "column_subheading.lists": "Listen",
+  "column_subheading.navigation": "Navigation",
+  "community.column_settings.allow_local_only": "Nur-lokale Toots anzeigen",
+  "compose.attach": "Anhängen...",
+  "compose.attach.doodle": "Etwas zeichnen",
+  "compose.attach.upload": "Eine Datei hochladen",
+  "compose.content-type.html": "HTML",
+  "compose.content-type.markdown": "Markdown",
+  "compose.content-type.plain": "Unformatierter Text",
+  "compose_form.poll.multiple_choices": "Mehrfachauswahl erlauben",
+  "compose_form.poll.single_choice": "Eine Auswahl erlauben",
+  "compose_form.spoiler": "Text hinter Warnung verbergen",
+  "confirmation_modal.do_not_ask_again": "Nicht erneut nach Bestätigung fragen",
+  "confirmations.deprecated_settings.confirm": "Mastodon-Einstellungen verwenden",
+  "confirmations.deprecated_settings.message": "Einige der von dir verwendeten, glitch-soc-spezifischen {app_settings} wurden durch Mastodon {preferences} ersetzt und werden überschrieben:",
+  "confirmations.missing_media_description.confirm": "Trotzdem absenden",
+  "confirmations.missing_media_description.edit": "Anhänge bearbeiten",
+  "confirmations.missing_media_description.message": "Mindestens einem Anhang fehlt eine Beschreibung. Denke darüber nach, alle Anhänge für Sehbeeinträchtigte zu beschreiben, bevor du den Toot absendest.",
+  "confirmations.unfilter.author": "Urheber",
+  "confirmations.unfilter.confirm": "Anzeigen",
+  "confirmations.unfilter.edit_filter": "Filter bearbeiten",
+  "confirmations.unfilter.filters": "Passende{count, plural, one {r} other {}} Filter",
+  "content-type.change": "Inhaltstyp",
+  "direct.group_by_conversations": "Nach Unterhaltung gruppieren",
+  "endorsed_accounts_editor.endorsed_accounts": "Empfohlene Konten",
+  "favourite_modal.combo": "Mit {combo} wird dieses Fenster beim nächsten Mal nicht mehr angezeigt",
+  "getting_started.onboarding": "Führe mich herum",
+  "home.column_settings.advanced": "Erweitert",
+  "home.column_settings.filter_regex": "Mit regulären Ausdrücken herausfiltern",
+  "home.column_settings.show_direct": "Direktnachrichten anzeigen",
+  "home.settings": "Spalteneinstellungen",
+  "keyboard_shortcuts.bookmark": "zu Lesezeichen hinzufügen",
+  "keyboard_shortcuts.secondary_toot": "Toot mit sekundärer Privatsphäreeinstellung absenden",
+  "keyboard_shortcuts.toggle_collapse": "Toots ein-/ausklappen",
+  "layout.auto": "Automatisch",
+  "layout.desktop": "Desktop",
+  "layout.hint.auto": "Automatisch das Layout anhand der Einstellung \"Erweitertes Webinterface verwenden\" und Bildschirmgröße auswählen.",
+  "layout.hint.desktop": "Das mehrspaltige Layout verwenden, unabhängig von der Einstellung \"Erweitertes Webinterface verwenden\".",
+  "layout.hint.single": "Das einspaltige Layout verwenden, unabhängig von der Einstellung \"Erweitertes Webinterface verwenden\".",
+  "layout.single": "Mobil",
+  "media_gallery.sensitive": "Empfindlich",
+  "moved_to_warning": "Dieses Konto ist als verschoben zu {moved_to_link} markiert und akzeptiert daher keine neuen Follower.",
+  "navigation_bar.app_settings": "App-Einstellungen",
+  "navigation_bar.featured_users": "Empfohlene Nutzer",
+  "navigation_bar.info": "Erweiterte Informationen",
+  "navigation_bar.keyboard_shortcuts": "Tastaturkürzel",
+  "navigation_bar.misc": "Sonstiges",
+  "notification.markForDeletion": "Zum Entfernen auswählen",
+  "notification_purge.btn_all": "Alle\nauswählen",
+  "notification_purge.btn_apply": "Ausgewählte\nentfernen",
+  "notification_purge.btn_invert": "Auswahl\numkehren",
+  "notification_purge.btn_none": "Auswahl\naufheben",
+  "notification_purge.start": "Benachrichtigungen-Aufräumen-Modus starten",
+  "notifications.marked_clear": "Ausgewählte Benachrichtigungen entfernen",
+  "notifications.marked_clear_confirmation": "Möchtest du wirklich alle auswählten Benachrichtigungen für immer entfernen?",
+  "onboarding.done": "Fertig",
+  "onboarding.next": "Weiter",
+  "onboarding.page_five.public_timelines": "Die lokale Timeline zeigt öffentliche Posts von allen auf {domain}. Die föderierte Timeline zeigt öffentliche Posts von allen, denen Leute auf {domain} folgen. Das sind die öffentlichen Timelines, eine tolle Möglichkeit, neue Leute zu entdecken.",
+  "onboarding.page_four.home": "Die Startseite zeigt Posts von Leuten an, denen du folgst.",
+  "onboarding.page_four.notifications": "Die Benachrichtigungs-Spalte zeigt an, wenn jemand mit dir interagiert.",
+  "onboarding.page_one.federation": "{domain} ist eine \"Instanz\" von Mastodon. Mastodon ist ein Netzwerk aus unabhängigen Servern, die zusammen ein größeres soziales Netzwerk bilden. Diese Server nennen wir Instanzen.",
+  "onboarding.page_one.handle": "Du bist auf {domain}, also ist dein vollständiger Nutzername {handle}",
+  "onboarding.page_one.welcome": "Willkommen auf {domain}!",
+  "onboarding.page_six.admin": "Dein Instanz-Admin ist {admin}.",
+  "onboarding.page_six.almost_done": "Fast geschafft...",
+  "onboarding.page_six.appetoot": "Bon Appetoot!",
+  "onboarding.page_six.apps_available": "Es gibt {apps} für iOS, Android und andere Plattformen.",
+  "onboarding.page_six.github": "{domain} läuft auf glitch-soc. glitch-soc ist ein freundlicher {fork} von {Mastodon}, und ist mit jeder Mastodon-App oder -Instanz kompatibel. glitch-soc ist komplett frei und quelloffen. Auf {github} kannst du Fehler melden, Features anfragen oder Code beitragen.",
+  "onboarding.page_six.guidelines": "Community-Richtlinien",
+  "onboarding.page_six.read_guidelines": "Bitte lies die {guidelines} von {domain}!",
+  "onboarding.page_six.various_app": "mobile Apps",
+  "onboarding.page_three.profile": "Bearbeite dein Profil, um deinen Avatar, \"Über mich\" und den Anzeigenamen zu ändern. Dort findest du auch andere Einstellungen.",
+  "onboarding.page_three.search": "Benutze die Suchleiste, um Leute zu finden und Hashtags anzusehen, wie etwa {illustration} und {introductions}. Um nach einer Person zu suchen, die nicht auf dieser Instanz ist, benutze deren vollständigen Nutzername.",
+  "onboarding.page_two.compose": "Schreibe Posts in der Verfassen-Spalte. Mit den Symbolen unten kannst du Bilder hochladen, Privatsphäre-Einstellungen ändern, und Inhaltswarnungen hinzufügen.",
+  "onboarding.skip": "Überspringen",
+  "settings.always_show_spoilers_field": "Das Inhaltswarnungs-Feld immer aktivieren",
+  "settings.auto_collapse": "Automatisches Einklappen",
+  "settings.auto_collapse_all": "Alles",
+  "settings.auto_collapse_lengthy": "Lange Toots",
+  "settings.auto_collapse_media": "Toots mit Anhängen",
+  "settings.auto_collapse_notifications": "Benachrichtigungen",
+  "settings.auto_collapse_reblogs": "Geteilte Toots",
+  "settings.auto_collapse_replies": "Antworten",
+  "settings.close": "Schließen",
+  "settings.collapsed_statuses": "Eingeklappte Toots",
+  "settings.compose_box_opts": "Verfassen-Box",
+  "settings.confirm_before_clearing_draft": "Zeige einen Bestätigungsdialog, bevor der derzeitige Entwurf verworfen wird",
+  "settings.confirm_boost_missing_media_description": "Zeige einen Bestätigungsdialog, bevor Toots mit Anhängen ohne Beschreibung geteilt werden",
+  "settings.confirm_missing_media_description": "Zeige einen Bestätigungsdialog, bevor Toots mit Anhängen ohne Beschreibung abgesendet werden",
+  "settings.content_warnings": "Content warnings",
+  "settings.content_warnings.regexp": "Regulärer Ausdruck",
+  "settings.content_warnings_filter": "Inhaltswarnungen, die nicht ausgeklappt werden sollen:",
+  "settings.content_warnings_media_outside": "Medienanhänge außerhalb von Inhaltswarnungen anzeigen",
+  "settings.content_warnings_media_outside_hint": "Das ursprüngliche Verhalten von Mastodon wiederherstellen, in welchem Inhaltswarnungen keine Auswirkungen auf Anhänge haben",
+  "settings.content_warnings_shared_state": "Inhalt aller Kopien auf einmal ein-/ausblenden",
+  "settings.content_warnings_shared_state_hint": "Das ursprüngliche Verhalten von Mastodon wiederhertstellen, in welchem der Inhaltswarnungs-Knopf alle Kopien eines Posts auf einmal ein-/ausklappt. Das wird das automatische Einklappen jedweder Kopie eines Toots mit ausgeklappter Inhaltswarnung",
+  "settings.content_warnings_unfold_opts": "Optionen zum automatischen Ausklappen",
+  "settings.deprecated_setting": "Diese Einstellung wird nun von Mastodons {settings_page_link} gesteuert",
+  "settings.enable_collapsed": "Eingeklappte Toots aktivieren",
+  "settings.enable_collapsed_hint": "Eingeklappte Posts haben einen Teil ihres Inhalts verborgen, um weniger Platz am Bildschirm einzunehmen. Das passiert unabhängig von der Inhaltswarnfunktion",
+  "settings.enable_content_warnings_auto_unfold": "Inhaltswarnungen automatisch ausklappen",
+  "settings.general": "Allgemein",
+  "settings.hicolor_privacy_icons": "Eingefärbte Privatsphäre-Symbole",
+  "settings.hicolor_privacy_icons.hint": "Zeige Privatsphäre-Symbole in hellen und leicht zu unterscheidenden Farben",
+  "settings.image_backgrounds": "Bildhintergründe",
+  "settings.image_backgrounds_media": "Vorschau eingeklappter Toot-Anhänge",
+  "settings.image_backgrounds_media_hint": "Wenn der Post Anhänge hat, wird der erste als Hintergrund verwendet",
+  "settings.image_backgrounds_users": "Eingeklappten Toots einen Bild-Hintergrund geben",
+  "settings.inline_preview_cards": "Eingebettete Vorschaukarten für externe Links",
+  "settings.layout": "Layout:",
+  "settings.layout_opts": "Layout-Optionen",
+  "settings.media": "Medien",
+  "settings.media_fullwidth": "Medienvorschau in voller Breite",
+  "settings.media_letterbox": "Mediengröße anpassen",
+  "settings.media_letterbox_hint": "Medien runterskalieren und einpassen um die Bildbehälter zu füllen anstatt zu strecken und zuzuschneiden",
+  "settings.media_reveal_behind_cw": "Empfindliche Medien hinter Inhaltswarnungen standardmäßig anzeigen",
+  "settings.notifications.favicon_badge": "Favicon-Badge für ungelesene Benachrichtigungen",
+  "settings.notifications.favicon_badge.hint": "Ein Badge für ungelesene Benachrichtigungen zum Favicon hinzufügen",
+  "settings.notifications.tab_badge": "Badge für ungelesene Benachrichtigungen",
+  "settings.notifications.tab_badge.hint": "Ein Badge für ungelesene Benachrichtigungen in den Spaltensymbolen anzeigen, wenn die Benachrichtigungen nicht offen sind",
+  "settings.notifications_opts": "Benachrichtigungsoptionen",
+  "settings.pop_in_left": "Links",
+  "settings.pop_in_player": "Pop-In-Player aktivieren",
+  "settings.pop_in_position": "Position des Pop-In-Players:",
+  "settings.pop_in_right": "Rechts",
+  "settings.preferences": "Preferences",
+  "settings.prepend_cw_re": "\"re: \" beim Antworten an Inhaltswarnung voranstellen",
+  "settings.preselect_on_reply": "Nutzernamen bei Antwort vorauswählen",
+  "settings.preselect_on_reply_hint": "Beim Antworten auf eine Konversation alle Nutzernamen auswählen, die nach dem ersten kommen",
+  "settings.rewrite_mentions": "Erwähnungen in angezeigten Status umschreiben",
+  "settings.rewrite_mentions_acct": "Mit Nutzernamen und Domain umschreiben (wenn das Konto auf einer anderen Instanz ist)",
+  "settings.rewrite_mentions_no": "Erwähnungen nicht umschreiben",
+  "settings.rewrite_mentions_username": "Mit Nutzername umschreiben",
+  "settings.shared_settings_link": "Nutzereinstellungen",
+  "settings.show_action_bar": "Aktions-Knöpfe in eingeklappten Toots anzeigen",
+  "settings.show_content_type_choice": "Auswahl für die Inhaltsart beim Verfassen von Toots anzeigen",
+  "settings.show_reply_counter": "Schätzung der Antwortanzahl anzeigen",
+  "settings.side_arm": "Sekundärer Toot-Knopf:",
+  "settings.side_arm.none": "Nichts",
+  "settings.side_arm_reply_mode": "Beim Antworten auf einen Toot sollte der sekundäre Toot-Knopf:",
+  "settings.side_arm_reply_mode.copy": "Privatsphäre-Einstellung des zu beantwortenden Toot verwenden",
+  "settings.side_arm_reply_mode.keep": "Die eingestellte Privatsphäre beibehalten",
+  "settings.side_arm_reply_mode.restrict": "Privatsphäre-Einstellung auf die des zu beantwortenden Toot beschränken",
+  "settings.status_icons": "Toot-Symbole",
+  "settings.status_icons_language": "Sprach-Indikator",
+  "settings.status_icons_local_only": "\"nur Lokal\"-Indikator",
+  "settings.status_icons_media": "Medien- und Umfragen-Indikatoren",
+  "settings.status_icons_reply": "Antwort-Indikator",
+  "settings.status_icons_visibility": "Toot-Privatsphäre-Indikator",
+  "settings.swipe_to_change_columns": "Das Wechseln der Spalte durch Wischen erlauben (nur für die mobile Ansicht)",
+  "settings.tag_misleading_links": "Irreführende Links markieren",
+  "settings.tag_misleading_links.hint": "Füge eine visuelle Indikation mit dem Ziel-Host des Links zu jedem Link hinzu, bei dem dieser nicht explizit genannt wird",
+  "settings.wide_view": "Breite Ansicht (nur für den Desktop-Modus)",
+  "settings.wide_view_hint": "Verbreitert Spalten, um den verfügbaren Platz besser zu füllen.",
+  "status.collapse": "Einklappen",
+  "status.has_audio": "Hat angehängte Audiodateien",
+  "status.has_pictures": "Hat angehängte Bilder",
+  "status.has_preview_card": "Hat eine Vorschaukarte",
+  "status.has_video": "Hat angehängte Videos",
+  "status.in_reply_to": "Dieser Toot ist eine Antwort",
+  "status.is_poll": "Dieser Toot ist eine Umfrage",
+  "status.local_only": "Nur auf deiner Instanz sichtbar",
+  "status.sensitive_toggle": "Zum Anzeigen klicken",
+  "status.uncollapse": "Ausklappen",
+  "web_app_crash.change_your_settings": "Deine {settings} ändern",
+  "web_app_crash.content": "Du kannst folgende Dinge ausprobieren:",
+  "web_app_crash.debug_info": "Debug-Informationen",
+  "web_app_crash.disable_addons": "Browser-Add-ons oder eingebaute Übersetzungswerkzeuge deaktivieren",
+  "web_app_crash.issue_tracker": "Issue-Tracker",
+  "web_app_crash.reload": "neu laden",
+  "web_app_crash.reload_page": "Die Seite {reload}",
+  "web_app_crash.report_issue": "Einen Fehler im {issuetracker} melden",
+  "web_app_crash.settings": "Einstellungen",
+  "web_app_crash.title": "Es tut uns leid, aber mit der Mastodon-App ist etwas schiefgelaufen."
+}
diff --git a/app/javascript/flavours/glitch/locales/defaultMessages.json b/app/javascript/flavours/glitch/locales/defaultMessages.json
new file mode 100644
index 000000000..d7aec67ac
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/defaultMessages.json
@@ -0,0 +1,1064 @@
+[
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "We're sorry, but something went wrong with the Mastodon app.",
+        "id": "web_app_crash.title"
+      },
+      {
+        "defaultMessage": "You could try any of the following:",
+        "id": "web_app_crash.content"
+      },
+      {
+        "defaultMessage": "Disable browser add-ons or built-in translation tools",
+        "id": "web_app_crash.disable_addons"
+      },
+      {
+        "defaultMessage": "Report a bug in the {issuetracker}",
+        "id": "web_app_crash.report_issue"
+      },
+      {
+        "defaultMessage": "issue tracker",
+        "id": "web_app_crash.issue_tracker"
+      },
+      {
+        "defaultMessage": "Debug information",
+        "id": "web_app_crash.debug_info"
+      },
+      {
+        "defaultMessage": "{reload} the current page",
+        "id": "web_app_crash.reload_page"
+      },
+      {
+        "defaultMessage": "Reload",
+        "id": "web_app_crash.reload"
+      },
+      {
+        "defaultMessage": "Change your {settings}",
+        "id": "web_app_crash.change_your_settings"
+      },
+      {
+        "defaultMessage": "settings",
+        "id": "web_app_crash.settings"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/components/error_boundary.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Sensitive",
+        "id": "media_gallery.sensitive"
+      },
+      {
+        "defaultMessage": "Click to view",
+        "id": "status.sensitive_toggle"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/components/media_gallery.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Select\nall",
+        "id": "notification_purge.btn_all"
+      },
+      {
+        "defaultMessage": "Select\nnone",
+        "id": "notification_purge.btn_none"
+      },
+      {
+        "defaultMessage": "Invert\nselection",
+        "id": "notification_purge.btn_invert"
+      },
+      {
+        "defaultMessage": "Clear\nselected",
+        "id": "notification_purge.btn_apply"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/components/notification_purge_buttons.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Collapse",
+        "id": "status.collapse"
+      },
+      {
+        "defaultMessage": "Uncollapse",
+        "id": "status.uncollapse"
+      },
+      {
+        "defaultMessage": "This toot is a reply",
+        "id": "status.in_reply_to"
+      },
+      {
+        "defaultMessage": "Features an attached preview card",
+        "id": "status.has_preview_card"
+      },
+      {
+        "defaultMessage": "Features attached pictures",
+        "id": "status.has_pictures"
+      },
+      {
+        "defaultMessage": "This toot is a poll",
+        "id": "status.is_poll"
+      },
+      {
+        "defaultMessage": "Features attached videos",
+        "id": "status.has_video"
+      },
+      {
+        "defaultMessage": "Features attached audio files",
+        "id": "status.has_audio"
+      },
+      {
+        "defaultMessage": "Only visible from your instance",
+        "id": "status.local_only"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/components/status_icons.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Are you sure you want to permanently clear all selected notifications?",
+        "id": "notifications.marked_clear_confirmation"
+      },
+      {
+        "defaultMessage": "Clear selected notifications",
+        "id": "notifications.marked_clear"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/containers/notification_purge_buttons_container.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Show",
+        "id": "confirmations.unfilter.confirm"
+      },
+      {
+        "defaultMessage": "Author",
+        "id": "confirmations.unfilter.author"
+      },
+      {
+        "defaultMessage": "Matching {count, plural, one {filter} other {filters}}",
+        "id": "confirmations.unfilter.filters"
+      },
+      {
+        "defaultMessage": "Edit filter",
+        "id": "confirmations.unfilter.edit_filter"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/containers/status_container.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Glitch-soc is free open source software forked from Mastodon.",
+        "id": "about.fork_disclaimer"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/about/index.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "No comment provided",
+        "id": "account_note.glitch_placeholder"
+      },
+      {
+        "defaultMessage": "Cancel",
+        "id": "account_note.cancel"
+      },
+      {
+        "defaultMessage": "Save",
+        "id": "account_note.save"
+      },
+      {
+        "defaultMessage": "Edit",
+        "id": "account_note.edit"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/account/components/account_note.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "This user has been suspended by a moderator.",
+        "id": "account.suspended_disclaimer_full"
+      },
+      {
+        "defaultMessage": "Information below may reflect the user's profile incompletely.",
+        "id": "account.disclaimer_full"
+      },
+      {
+        "defaultMessage": "View full profile",
+        "id": "account.view_full_profile"
+      },
+      {
+        "defaultMessage": "Follows",
+        "id": "account.follows"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/account/components/action_bar.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Add note for @{name}",
+        "id": "account.add_account_note"
+      },
+      {
+        "defaultMessage": "Joined {date}",
+        "id": "account.joined"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/account/components/header.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Profile",
+        "id": "column_header.profile"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/account/components/profile_column_header.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Filter out by regular expressions",
+        "id": "home.column_settings.filter_regex"
+      },
+      {
+        "defaultMessage": "Column settings",
+        "id": "home.settings"
+      },
+      {
+        "defaultMessage": "Advanced",
+        "id": "home.column_settings.advanced"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/community_timeline/components/column_settings.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
+        "id": "confirmations.missing_media_description.message"
+      },
+      {
+        "defaultMessage": "Send anyway",
+        "id": "confirmations.missing_media_description.confirm"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/compose/components/compose_form.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "App settings",
+        "id": "navigation_bar.app_settings"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/compose/components/header.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Advanced options",
+        "id": "advanced_options.icon_title"
+      },
+      {
+        "defaultMessage": "Attach...",
+        "id": "compose.attach"
+      },
+      {
+        "defaultMessage": "Content type",
+        "id": "content-type.change"
+      },
+      {
+        "defaultMessage": "Draw something",
+        "id": "compose.attach.doodle"
+      },
+      {
+        "defaultMessage": "HTML",
+        "id": "compose.content-type.html"
+      },
+      {
+        "defaultMessage": "Do not post to other instances",
+        "id": "advanced_options.local-only.long"
+      },
+      {
+        "defaultMessage": "Local-only",
+        "id": "advanced_options.local-only.short"
+      },
+      {
+        "defaultMessage": "Markdown",
+        "id": "compose.content-type.markdown"
+      },
+      {
+        "defaultMessage": "Plain text",
+        "id": "compose.content-type.plain"
+      },
+      {
+        "defaultMessage": "Hide text behind warning",
+        "id": "compose_form.spoiler"
+      },
+      {
+        "defaultMessage": "Automatically opens a reply on posting",
+        "id": "advanced_options.threaded_mode.long"
+      },
+      {
+        "defaultMessage": "Threaded mode",
+        "id": "advanced_options.threaded_mode.short"
+      },
+      {
+        "defaultMessage": "Upload a file",
+        "id": "compose.attach.upload"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/compose/components/options.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Allow one choice",
+        "id": "compose_form.poll.single_choice"
+      },
+      {
+        "defaultMessage": "Allow multiple choices",
+        "id": "compose_form.poll.multiple_choices"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/compose/components/poll_form.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "This post is local-only",
+        "id": "advanced_options.local-only.tooltip"
+      },
+      {
+        "defaultMessage": "Threaded mode enabled",
+        "id": "advanced_options.threaded_mode.tooltip"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/compose/components/textarea_icons.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
+        "id": "confirmations.missing_media_description.message"
+      },
+      {
+        "defaultMessage": "Send anyway",
+        "id": "confirmations.missing_media_description.confirm"
+      },
+      {
+        "defaultMessage": "Edit media",
+        "id": "confirmations.missing_media_description.edit"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/compose/containers/compose_form_container.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Filter out by regular expressions",
+        "id": "home.column_settings.filter_regex"
+      },
+      {
+        "defaultMessage": "Column settings",
+        "id": "home.settings"
+      },
+      {
+        "defaultMessage": "Group by conversation",
+        "id": "direct.group_by_conversations"
+      },
+      {
+        "defaultMessage": "Advanced",
+        "id": "home.column_settings.advanced"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/direct_timeline/components/column_settings.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Favourited by",
+        "id": "column.favourited_by"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/favourites/index.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Misc",
+        "id": "column.heading"
+      },
+      {
+        "defaultMessage": "Miscellaneous options",
+        "id": "column.subheading"
+      },
+      {
+        "defaultMessage": "Extended information",
+        "id": "navigation_bar.info"
+      },
+      {
+        "defaultMessage": "Show me around",
+        "id": "getting_started.onboarding"
+      },
+      {
+        "defaultMessage": "Keyboard shortcuts",
+        "id": "navigation_bar.keyboard_shortcuts"
+      },
+      {
+        "defaultMessage": "Featured users",
+        "id": "navigation_bar.featured_users"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/getting_started_misc/index.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Navigation",
+        "id": "column_subheading.navigation"
+      },
+      {
+        "defaultMessage": "App settings",
+        "id": "navigation_bar.app_settings"
+      },
+      {
+        "defaultMessage": "Keyboard shortcuts",
+        "id": "navigation_bar.keyboard_shortcuts"
+      },
+      {
+        "defaultMessage": "Lists",
+        "id": "column_subheading.lists"
+      },
+      {
+        "defaultMessage": "Misc",
+        "id": "navigation_bar.misc"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/getting_started/index.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Filter out by regular expressions",
+        "id": "home.column_settings.filter_regex"
+      },
+      {
+        "defaultMessage": "Column settings",
+        "id": "home.settings"
+      },
+      {
+        "defaultMessage": "Show DMs",
+        "id": "home.column_settings.show_direct"
+      },
+      {
+        "defaultMessage": "Advanced",
+        "id": "home.column_settings.advanced"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/home_timeline/components/column_settings.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "to bookmark",
+        "id": "keyboard_shortcuts.bookmark"
+      },
+      {
+        "defaultMessage": "to collapse/uncollapse toots",
+        "id": "keyboard_shortcuts.toggle_collapse"
+      },
+      {
+        "defaultMessage": "to send toot using secondary privacy setting",
+        "id": "keyboard_shortcuts.secondary_toot"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/keyboard_shortcuts/index.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "General",
+        "id": "settings.general"
+      },
+      {
+        "defaultMessage": "Compose box",
+        "id": "settings.compose_box_opts"
+      },
+      {
+        "defaultMessage": "Content Warnings",
+        "id": "settings.content_warnings"
+      },
+      {
+        "defaultMessage": "Collapsed toots",
+        "id": "settings.collapsed_statuses"
+      },
+      {
+        "defaultMessage": "Media",
+        "id": "settings.media"
+      },
+      {
+        "defaultMessage": "Preferences",
+        "id": "settings.preferences"
+      },
+      {
+        "defaultMessage": "Close",
+        "id": "settings.close"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/local_settings/navigation/index.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Auto",
+        "id": "layout.auto"
+      },
+      {
+        "defaultMessage": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
+        "id": "layout.hint.auto"
+      },
+      {
+        "defaultMessage": "Desktop",
+        "id": "layout.desktop"
+      },
+      {
+        "defaultMessage": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
+        "id": "layout.hint.desktop"
+      },
+      {
+        "defaultMessage": "Mobile",
+        "id": "layout.single"
+      },
+      {
+        "defaultMessage": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
+        "id": "layout.hint.single"
+      },
+      {
+        "defaultMessage": "None",
+        "id": "settings.side_arm.none"
+      },
+      {
+        "defaultMessage": "Keep its set privacy",
+        "id": "settings.side_arm_reply_mode.keep"
+      },
+      {
+        "defaultMessage": "Copy privacy setting of the toot being replied to",
+        "id": "settings.side_arm_reply_mode.copy"
+      },
+      {
+        "defaultMessage": "Restrict privacy setting to that of the toot being replied to",
+        "id": "settings.side_arm_reply_mode.restrict"
+      },
+      {
+        "defaultMessage": "Regular expression",
+        "id": "settings.content_warnings.regexp"
+      },
+      {
+        "defaultMessage": "Do not rewrite mentions",
+        "id": "settings.rewrite_mentions_no"
+      },
+      {
+        "defaultMessage": "Rewrite with username and domain (when the account is remote)",
+        "id": "settings.rewrite_mentions_acct"
+      },
+      {
+        "defaultMessage": "Rewrite with username",
+        "id": "settings.rewrite_mentions_username"
+      },
+      {
+        "defaultMessage": "Left",
+        "id": "settings.pop_in_left"
+      },
+      {
+        "defaultMessage": "Right",
+        "id": "settings.pop_in_right"
+      },
+      {
+        "defaultMessage": "General",
+        "id": "settings.general"
+      },
+      {
+        "defaultMessage": "Display an estimate of the reply count",
+        "id": "settings.show_reply_counter"
+      },
+      {
+        "defaultMessage": "High color privacy icons",
+        "id": "settings.hicolor_privacy_icons"
+      },
+      {
+        "defaultMessage": "Display privacy icons in bright and easily distinguishable colors",
+        "id": "settings.hicolor_privacy_icons.hint"
+      },
+      {
+        "defaultMessage": "Show confirmation dialog before boosting toots lacking media descriptions",
+        "id": "settings.confirm_boost_missing_media_description"
+      },
+      {
+        "defaultMessage": "Tag misleading links",
+        "id": "settings.tag_misleading_links"
+      },
+      {
+        "defaultMessage": "Add a visual indication with the link target host to every link not mentioning it explicitly",
+        "id": "settings.tag_misleading_links.hint"
+      },
+      {
+        "defaultMessage": "Rewrite mentions in displayed statuses",
+        "id": "settings.rewrite_mentions"
+      },
+      {
+        "defaultMessage": "Notifications options",
+        "id": "settings.notifications_opts"
+      },
+      {
+        "defaultMessage": "Unread notifications badge",
+        "id": "settings.notifications.tab_badge"
+      },
+      {
+        "defaultMessage": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
+        "id": "settings.notifications.tab_badge.hint"
+      },
+      {
+        "defaultMessage": "Unread notifications favicon badge",
+        "id": "settings.notifications.favicon_badge"
+      },
+      {
+        "defaultMessage": "Add a badge for unread notifications to the favicon",
+        "id": "settings.notifications.favicon_badge.hint"
+      },
+      {
+        "defaultMessage": "Toot icons",
+        "id": "settings.status_icons"
+      },
+      {
+        "defaultMessage": "Language indicator",
+        "id": "settings.status_icons_language"
+      },
+      {
+        "defaultMessage": "Reply indicator",
+        "id": "settings.status_icons_reply"
+      },
+      {
+        "defaultMessage": "Local-only indicator",
+        "id": "settings.status_icons_local_only"
+      },
+      {
+        "defaultMessage": "Media and poll indicators",
+        "id": "settings.status_icons_media"
+      },
+      {
+        "defaultMessage": "Toot privacy indicator",
+        "id": "settings.status_icons_visibility"
+      },
+      {
+        "defaultMessage": "Layout options",
+        "id": "settings.layout_opts"
+      },
+      {
+        "defaultMessage": "Layout:",
+        "id": "settings.layout"
+      },
+      {
+        "defaultMessage": "Wide view (Desktop mode only)",
+        "id": "settings.wide_view"
+      },
+      {
+        "defaultMessage": "Stretches columns to better fill the available space.",
+        "id": "settings.wide_view_hint"
+      },
+      {
+        "defaultMessage": "Compose box",
+        "id": "settings.compose_box_opts"
+      },
+      {
+        "defaultMessage": "Always enable the Content Warning field",
+        "id": "settings.always_show_spoilers_field"
+      },
+      {
+        "defaultMessage": "Prepend “re: ” to content warnings when replying",
+        "id": "settings.prepend_cw_re"
+      },
+      {
+        "defaultMessage": "Pre-select usernames on reply",
+        "id": "settings.preselect_on_reply"
+      },
+      {
+        "defaultMessage": "When replying to a conversation with multiple participants, pre-select usernames past the first",
+        "id": "settings.preselect_on_reply_hint"
+      },
+      {
+        "defaultMessage": "Show confirmation dialog before sending toots lacking media descriptions",
+        "id": "settings.confirm_missing_media_description"
+      },
+      {
+        "defaultMessage": "Show confirmation dialog before overwriting the message being composed",
+        "id": "settings.confirm_before_clearing_draft"
+      },
+      {
+        "defaultMessage": "Show content-type choice when authoring toots",
+        "id": "settings.show_content_type_choice"
+      },
+      {
+        "defaultMessage": "Secondary toot button:",
+        "id": "settings.side_arm"
+      },
+      {
+        "defaultMessage": "When replying to a toot, the secondary toot button should:",
+        "id": "settings.side_arm_reply_mode"
+      },
+      {
+        "defaultMessage": "Content warnings",
+        "id": "settings.content_warnings"
+      },
+      {
+        "defaultMessage": "Show/hide content of all copies at once",
+        "id": "settings.content_warnings_shared_state"
+      },
+      {
+        "defaultMessage": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
+        "id": "settings.content_warnings_shared_state_hint"
+      },
+      {
+        "defaultMessage": "Display media attachments outside content warnings",
+        "id": "settings.content_warnings_media_outside"
+      },
+      {
+        "defaultMessage": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
+        "id": "settings.content_warnings_media_outside_hint"
+      },
+      {
+        "defaultMessage": "Auto-unfolding options",
+        "id": "settings.content_warnings_unfold_opts"
+      },
+      {
+        "defaultMessage": "Automatically unfold content-warnings",
+        "id": "settings.enable_content_warnings_auto_unfold"
+      },
+      {
+        "defaultMessage": "This setting is now controlled from Mastodon's {settings_page_link}",
+        "id": "settings.deprecated_setting"
+      },
+      {
+        "defaultMessage": "user preferences",
+        "id": "settings.shared_settings_link"
+      },
+      {
+        "defaultMessage": "Content warnings to not automatically unfold:",
+        "id": "settings.content_warnings_filter"
+      },
+      {
+        "defaultMessage": "Collapsed toots",
+        "id": "settings.collapsed_statuses"
+      },
+      {
+        "defaultMessage": "Enable collapsed toots",
+        "id": "settings.enable_collapsed"
+      },
+      {
+        "defaultMessage": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
+        "id": "settings.enable_collapsed_hint"
+      },
+      {
+        "defaultMessage": "Show action buttons in collapsed toots",
+        "id": "settings.show_action_bar"
+      },
+      {
+        "defaultMessage": "Automatic collapsing",
+        "id": "settings.auto_collapse"
+      },
+      {
+        "defaultMessage": "Everything",
+        "id": "settings.auto_collapse_all"
+      },
+      {
+        "defaultMessage": "Notifications",
+        "id": "settings.auto_collapse_notifications"
+      },
+      {
+        "defaultMessage": "Lengthy toots",
+        "id": "settings.auto_collapse_lengthy"
+      },
+      {
+        "defaultMessage": "Boosts",
+        "id": "settings.auto_collapse_reblogs"
+      },
+      {
+        "defaultMessage": "Replies",
+        "id": "settings.auto_collapse_replies"
+      },
+      {
+        "defaultMessage": "Toots with media",
+        "id": "settings.auto_collapse_media"
+      },
+      {
+        "defaultMessage": "Image backgrounds",
+        "id": "settings.image_backgrounds"
+      },
+      {
+        "defaultMessage": "Give collapsed toots an image background",
+        "id": "settings.image_backgrounds_users"
+      },
+      {
+        "defaultMessage": "Preview collapsed toot media",
+        "id": "settings.image_backgrounds_media"
+      },
+      {
+        "defaultMessage": "If the post has any media attachment, use the first one as a background",
+        "id": "settings.image_backgrounds_media_hint"
+      },
+      {
+        "defaultMessage": "Media",
+        "id": "settings.media"
+      },
+      {
+        "defaultMessage": "Letterbox media",
+        "id": "settings.media_letterbox"
+      },
+      {
+        "defaultMessage": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
+        "id": "settings.media_letterbox_hint"
+      },
+      {
+        "defaultMessage": "Full-width media previews",
+        "id": "settings.media_fullwidth"
+      },
+      {
+        "defaultMessage": "Inline preview cards for external links",
+        "id": "settings.inline_preview_cards"
+      },
+      {
+        "defaultMessage": "Reveal sensitive media behind a CW by default",
+        "id": "settings.media_reveal_behind_cw"
+      },
+      {
+        "defaultMessage": "Enable pop-in player",
+        "id": "settings.pop_in_player"
+      },
+      {
+        "defaultMessage": "Pop-in player position:",
+        "id": "settings.pop_in_position"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/local_settings/page/index.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Mark for deletion",
+        "id": "notification.markForDeletion"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/notifications/components/overlay.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Enter notification cleaning mode",
+        "id": "notification_purge.start"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/notifications/index.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Featured accounts",
+        "id": "endorsed_accounts_editor.endorsed_accounts"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/pinned_accounts_editor/index.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Filter out by regular expressions",
+        "id": "home.column_settings.filter_regex"
+      },
+      {
+        "defaultMessage": "Show local-only toots",
+        "id": "community.column_settings.allow_local_only"
+      },
+      {
+        "defaultMessage": "Advanced",
+        "id": "home.column_settings.advanced"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/public_timeline/components/column_settings.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Boosted by",
+        "id": "column.reblogged_by"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/reblogs/index.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "This toot contains some media without description",
+        "id": "boost_modal.missing_description"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/ui/components/boost_modal.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Do not ask for confirmation again",
+        "id": "confirmation_modal.do_not_ask_again"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/ui/components/confirmation_modal.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Use Mastodon preferences",
+        "id": "confirmations.deprecated_settings.confirm"
+      },
+      {
+        "defaultMessage": "Automatically unfold content-warnings",
+        "id": "settings.enable_content_warnings_auto_unfold"
+      },
+      {
+        "defaultMessage": "Allow swiping to change columns (Mobile only)",
+        "id": "settings.swipe_to_change_columns"
+      },
+      {
+        "defaultMessage": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
+        "id": "confirmations.deprecated_settings.message"
+      },
+      {
+        "defaultMessage": "App settings",
+        "id": "navigation_bar.app_settings"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/ui/components/deprecated_settings_modal.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "You can press {combo} to skip this next time",
+        "id": "favourite_modal.combo"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/ui/components/favourite_modal.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "App settings",
+        "id": "navigation_bar.app_settings"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/ui/components/navigation_panel.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Welcome to {domain}!",
+        "id": "onboarding.page_one.welcome"
+      },
+      {
+        "defaultMessage": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+        "id": "onboarding.page_one.federation"
+      },
+      {
+        "defaultMessage": "You are on {domain}, so your full handle is {handle}",
+        "id": "onboarding.page_one.handle"
+      },
+      {
+        "defaultMessage": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
+        "id": "onboarding.page_two.compose"
+      },
+      {
+        "defaultMessage": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
+        "id": "onboarding.page_three.search"
+      },
+      {
+        "defaultMessage": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
+        "id": "onboarding.page_three.profile"
+      },
+      {
+        "defaultMessage": "The home timeline shows posts from people you follow.",
+        "id": "onboarding.page_four.home"
+      },
+      {
+        "defaultMessage": "The notifications column shows when someone interacts with you.",
+        "id": "onboarding.page_four.notifications"
+      },
+      {
+        "defaultMessage": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
+        "id": "onboarding.page_five.public_timelines"
+      },
+      {
+        "defaultMessage": "Your instance's admin is {admin}.",
+        "id": "onboarding.page_six.admin"
+      },
+      {
+        "defaultMessage": "Please read {domain}'s {guidelines}!",
+        "id": "onboarding.page_six.read_guidelines"
+      },
+      {
+        "defaultMessage": "community guidelines",
+        "id": "onboarding.page_six.guidelines"
+      },
+      {
+        "defaultMessage": "Almost done...",
+        "id": "onboarding.page_six.almost_done"
+      },
+      {
+        "defaultMessage": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+        "id": "onboarding.page_six.github"
+      },
+      {
+        "defaultMessage": "There are {apps} available for iOS, Android and other platforms.",
+        "id": "onboarding.page_six.apps_available"
+      },
+      {
+        "defaultMessage": "mobile apps",
+        "id": "onboarding.page_six.various_app"
+      },
+      {
+        "defaultMessage": "Bon Appetoot!",
+        "id": "onboarding.page_six.appetoot"
+      },
+      {
+        "defaultMessage": "Next",
+        "id": "onboarding.next"
+      },
+      {
+        "defaultMessage": "Done",
+        "id": "onboarding.done"
+      },
+      {
+        "defaultMessage": "Skip",
+        "id": "onboarding.skip"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/ui/components/onboarding_modal.json"
+  },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
+        "id": "moved_to_warning"
+      }
+    ],
+    "path": "app/javascript/flavours/glitch/features/ui/index.json"
+  }
+]
\ No newline at end of file
diff --git a/app/javascript/flavours/glitch/locales/el.js b/app/javascript/flavours/glitch/locales/el.js
deleted file mode 100644
index 2d9bb829f..000000000
--- a/app/javascript/flavours/glitch/locales/el.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/el.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/el.json b/app/javascript/flavours/glitch/locales/el.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/el.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/en-GB.json b/app/javascript/flavours/glitch/locales/en-GB.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/en-GB.json
@@ -0,0 +1 @@
+{}
diff --git a/app/javascript/flavours/glitch/locales/en.js b/app/javascript/flavours/glitch/locales/en.js
deleted file mode 100644
index 90e924d4a..000000000
--- a/app/javascript/flavours/glitch/locales/en.js
+++ /dev/null
@@ -1,67 +0,0 @@
-import inherited from 'mastodon/locales/en.json';
-
-const messages = {
-  'getting_started.open_source_notice': 'Glitchsoc is free open source software forked from {Mastodon}. You can contribute or report issues on GitHub at {github}.',
-  'layout.auto': 'Auto',
-  'layout.current_is': 'Your current layout is:',
-  'layout.desktop': 'Desktop',
-  'layout.mobile': 'Mobile',
-  'navigation_bar.app_settings': 'App settings',
-  'getting_started.onboarding': 'Show me around',
-  'onboarding.page_one.federation': '{domain} is an \'instance\' of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.',
-  'onboarding.page_one.welcome': 'Welcome to {domain}!',
-  'onboarding.page_six.github': '{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}, and is compatible with any Mastodon instance or app. Glitchsoc is entirely free and open-source. You can report bugs, request features, or contribute to the code on {github}.',
-  'settings.auto_collapse': 'Automatic collapsing',
-  'settings.auto_collapse_all': 'Everything',
-  'settings.auto_collapse_lengthy': 'Lengthy toots',
-  'settings.auto_collapse_media': 'Toots with media',
-  'settings.auto_collapse_notifications': 'Notifications',
-  'settings.auto_collapse_reblogs': 'Boosts',
-  'settings.auto_collapse_replies': 'Replies',
-  'settings.show_action_bar': 'Show action buttons in collapsed toots',
-  'settings.close': 'Close',
-  'settings.collapsed_statuses': 'Collapsed toots',
-  'settings.enable_collapsed': 'Enable collapsed toots',
-  'settings.general': 'General',
-  'settings.image_backgrounds': 'Image backgrounds',
-  'settings.image_backgrounds_media': 'Preview collapsed toot media',
-  'settings.image_backgrounds_users': 'Give collapsed toots an image background',
-  'settings.media': 'Media',
-  'settings.media_letterbox': 'Letterbox media',
-  'settings.media_fullwidth': 'Full-width media previews',
-  'settings.preferences': 'User preferences',
-  'settings.wide_view': 'Wide view (Desktop mode only)',
-  'settings.navbar_under': 'Navbar at the bottom (Mobile only)',
-  'status.collapse': 'Collapse',
-  'status.uncollapse': 'Uncollapse',
-
-  'media_gallery.sensitive': 'Sensitive',
-
-  'favourite_modal.combo': 'You can press {combo} to skip this next time',
-
-  'home.column_settings.show_direct': 'Show DMs',
-
-  'notification.markForDeletion': 'Mark for deletion',
-  'notifications.clear': 'Clear all my notifications',
-  'notifications.marked_clear_confirmation': 'Are you sure you want to permanently clear all selected notifications?',
-  'notifications.marked_clear': 'Clear selected notifications',
-
-  'notification_purge.btn_all': 'Select\nall',
-  'notification_purge.btn_none': 'Select\nnone',
-  'notification_purge.btn_invert': 'Invert\nselection',
-  'notification_purge.btn_apply': 'Clear\nselected',
-
-  'compose.attach.upload': 'Upload a file',
-  'compose.attach.doodle': 'Draw something',
-  'compose.attach': 'Attach...',
-
-  'advanced_options.local-only.short': 'Local-only',
-  'advanced_options.local-only.long': 'Do not post to other instances',
-  'advanced_options.local-only.tooltip': 'This post is local-only',
-  'advanced_options.icon_title': 'Advanced options',
-  'advanced_options.threaded_mode.short': 'Threaded mode',
-  'advanced_options.threaded_mode.long': 'Automatically opens a reply on posting',
-  'advanced_options.threaded_mode.tooltip': 'Threaded mode enabled',
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/en.json b/app/javascript/flavours/glitch/locales/en.json
new file mode 100644
index 000000000..59f2f74b1
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/en.json
@@ -0,0 +1,200 @@
+{
+  "about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
+  "account.add_account_note": "Add note for @{name}",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
+  "account.follows": "Follows",
+  "account.joined": "Joined {date}",
+  "account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
+  "account.view_full_profile": "View full profile",
+  "account_note.cancel": "Cancel",
+  "account_note.edit": "Edit",
+  "account_note.glitch_placeholder": "No comment provided",
+  "account_note.save": "Save",
+  "advanced_options.icon_title": "Advanced options",
+  "advanced_options.local-only.long": "Do not post to other instances",
+  "advanced_options.local-only.short": "Local-only",
+  "advanced_options.local-only.tooltip": "This post is local-only",
+  "advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
+  "advanced_options.threaded_mode.short": "Threaded mode",
+  "advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
+  "boost_modal.missing_description": "This toot contains some media without description",
+  "column.favourited_by": "Favourited by",
+  "column.heading": "Misc",
+  "column.reblogged_by": "Boosted by",
+  "column.subheading": "Miscellaneous options",
+  "column_header.profile": "Profile",
+  "column_subheading.lists": "Lists",
+  "column_subheading.navigation": "Navigation",
+  "community.column_settings.allow_local_only": "Show local-only toots",
+  "compose.attach": "Attach...",
+  "compose.attach.doodle": "Draw something",
+  "compose.attach.upload": "Upload a file",
+  "compose.content-type.html": "HTML",
+  "compose.content-type.markdown": "Markdown",
+  "compose.content-type.plain": "Plain text",
+  "compose_form.poll.multiple_choices": "Allow multiple choices",
+  "compose_form.poll.single_choice": "Allow one choice",
+  "compose_form.spoiler": "Hide text behind warning",
+  "confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
+  "confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
+  "confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
+  "confirmations.missing_media_description.confirm": "Send anyway",
+  "confirmations.missing_media_description.edit": "Edit media",
+  "confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
+  "confirmations.unfilter.author": "Author",
+  "confirmations.unfilter.confirm": "Show",
+  "confirmations.unfilter.edit_filter": "Edit filter",
+  "confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
+  "content-type.change": "Content type",
+  "direct.group_by_conversations": "Group by conversation",
+  "endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
+  "favourite_modal.combo": "You can press {combo} to skip this next time",
+  "getting_started.onboarding": "Show me around",
+  "home.column_settings.advanced": "Advanced",
+  "home.column_settings.filter_regex": "Filter out by regular expressions",
+  "home.column_settings.show_direct": "Show DMs",
+  "home.settings": "Column settings",
+  "keyboard_shortcuts.bookmark": "to bookmark",
+  "keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
+  "keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
+  "layout.auto": "Auto",
+  "layout.desktop": "Desktop",
+  "layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
+  "layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
+  "layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
+  "layout.single": "Mobile",
+  "media_gallery.sensitive": "Sensitive",
+  "moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
+  "navigation_bar.app_settings": "App settings",
+  "navigation_bar.featured_users": "Featured users",
+  "navigation_bar.info": "Extended information",
+  "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
+  "navigation_bar.misc": "Misc",
+  "notification.markForDeletion": "Mark for deletion",
+  "notification_purge.btn_all": "Select\nall",
+  "notification_purge.btn_apply": "Clear\nselected",
+  "notification_purge.btn_invert": "Invert\nselection",
+  "notification_purge.btn_none": "Select\nnone",
+  "notification_purge.start": "Enter notification cleaning mode",
+  "notifications.marked_clear": "Clear selected notifications",
+  "notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
+  "onboarding.done": "Done",
+  "onboarding.next": "Next",
+  "onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
+  "onboarding.page_four.home": "The home timeline shows posts from people you follow.",
+  "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
+  "onboarding.page_one.federation": "{domain} is an 'instance' of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
+  "onboarding.page_one.welcome": "Welcome to {domain}!",
+  "onboarding.page_six.admin": "Your instance's admin is {admin}.",
+  "onboarding.page_six.almost_done": "Almost done...",
+  "onboarding.page_six.appetoot": "Bon Appetoot!",
+  "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}, and is compatible with any Mastodon instance or app. Glitchsoc is entirely free and open-source. You can report bugs, request features, or contribute to the code on {github}.",
+  "onboarding.page_six.guidelines": "community guidelines",
+  "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
+  "onboarding.page_six.various_app": "mobile apps",
+  "onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
+  "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
+  "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
+  "onboarding.skip": "Skip",
+  "settings.always_show_spoilers_field": "Always enable the Content Warning field",
+  "settings.auto_collapse": "Automatic collapsing",
+  "settings.auto_collapse_all": "Everything",
+  "settings.auto_collapse_lengthy": "Lengthy toots",
+  "settings.auto_collapse_media": "Toots with media",
+  "settings.auto_collapse_notifications": "Notifications",
+  "settings.auto_collapse_reblogs": "Boosts",
+  "settings.auto_collapse_replies": "Replies",
+  "settings.close": "Close",
+  "settings.collapsed_statuses": "Collapsed toots",
+  "settings.compose_box_opts": "Compose box",
+  "settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
+  "settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
+  "settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
+  "settings.content_warnings": "Content Warnings",
+  "settings.content_warnings.regexp": "Regular expression",
+  "settings.content_warnings_filter": "Content warnings to not automatically unfold:",
+  "settings.content_warnings_media_outside": "Display media attachments outside content warnings",
+  "settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
+  "settings.content_warnings_shared_state": "Show/hide content of all copies at once",
+  "settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
+  "settings.content_warnings_unfold_opts": "Auto-unfolding options",
+  "settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
+  "settings.enable_collapsed": "Enable collapsed toots",
+  "settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
+  "settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
+  "settings.general": "General",
+  "settings.hicolor_privacy_icons": "High color privacy icons",
+  "settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
+  "settings.image_backgrounds": "Image backgrounds",
+  "settings.image_backgrounds_media": "Preview collapsed toot media",
+  "settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
+  "settings.image_backgrounds_users": "Give collapsed toots an image background",
+  "settings.inline_preview_cards": "Inline preview cards for external links",
+  "settings.layout": "Layout:",
+  "settings.layout_opts": "Layout options",
+  "settings.media": "Media",
+  "settings.media_fullwidth": "Full-width media previews",
+  "settings.media_letterbox": "Letterbox media",
+  "settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
+  "settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
+  "settings.notifications.favicon_badge": "Unread notifications favicon badge",
+  "settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
+  "settings.notifications.tab_badge": "Unread notifications badge",
+  "settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
+  "settings.notifications_opts": "Notifications options",
+  "settings.pop_in_left": "Left",
+  "settings.pop_in_player": "Enable pop-in player",
+  "settings.pop_in_position": "Pop-in player position:",
+  "settings.pop_in_right": "Right",
+  "settings.preferences": "User preferences",
+  "settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
+  "settings.preselect_on_reply": "Pre-select usernames on reply",
+  "settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
+  "settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
+  "settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
+  "settings.rewrite_mentions_no": "Do not rewrite mentions",
+  "settings.rewrite_mentions_username": "Rewrite with username",
+  "settings.shared_settings_link": "user preferences",
+  "settings.show_action_bar": "Show action buttons in collapsed toots",
+  "settings.show_content_type_choice": "Show content-type choice when authoring toots",
+  "settings.show_reply_counter": "Display an estimate of the reply count",
+  "settings.side_arm": "Secondary toot button:",
+  "settings.side_arm.none": "None",
+  "settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
+  "settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
+  "settings.side_arm_reply_mode.keep": "Keep its set privacy",
+  "settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
+  "settings.status_icons": "Toot icons",
+  "settings.status_icons_language": "Language indicator",
+  "settings.status_icons_local_only": "Local-only indicator",
+  "settings.status_icons_media": "Media and poll indicators",
+  "settings.status_icons_reply": "Reply indicator",
+  "settings.status_icons_visibility": "Toot privacy indicator",
+  "settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
+  "settings.tag_misleading_links": "Tag misleading links",
+  "settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
+  "settings.wide_view": "Wide view (Desktop mode only)",
+  "settings.wide_view_hint": "Stretches columns to better fill the available space.",
+  "status.collapse": "Collapse",
+  "status.has_audio": "Features attached audio files",
+  "status.has_pictures": "Features attached pictures",
+  "status.has_preview_card": "Features an attached preview card",
+  "status.has_video": "Features attached videos",
+  "status.in_reply_to": "This toot is a reply",
+  "status.is_poll": "This toot is a poll",
+  "status.local_only": "Only visible from your instance",
+  "status.sensitive_toggle": "Click to view",
+  "status.uncollapse": "Uncollapse",
+  "web_app_crash.change_your_settings": "Change your {settings}",
+  "web_app_crash.content": "You could try any of the following:",
+  "web_app_crash.debug_info": "Debug information",
+  "web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
+  "web_app_crash.issue_tracker": "issue tracker",
+  "web_app_crash.reload": "Reload",
+  "web_app_crash.reload_page": "{reload} the current page",
+  "web_app_crash.report_issue": "Report a bug in the {issuetracker}",
+  "web_app_crash.settings": "settings",
+  "web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
+}
diff --git a/app/javascript/flavours/glitch/locales/eo.js b/app/javascript/flavours/glitch/locales/eo.js
deleted file mode 100644
index 04192f506..000000000
--- a/app/javascript/flavours/glitch/locales/eo.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/eo.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/eo.json b/app/javascript/flavours/glitch/locales/eo.json
new file mode 100644
index 000000000..87fe6c657
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/eo.json
@@ -0,0 +1,52 @@
+{
+  "account.add_account_note": "Aldoni noton por @{name}",
+  "account_note.cancel": "Nuligi",
+  "account_note.edit": "Redakti",
+  "account_note.save": "Konservi",
+  "column.reblogged_by": "Diskonigita de",
+  "column.subheading": "Diversaj agordoj",
+  "column_header.profile": "Profilo",
+  "column_subheading.lists": "Listoj",
+  "compose.attach": "Aldoni…",
+  "compose.attach.doodle": "Desegni ion",
+  "compose.attach.upload": "Alŝuti dosieron",
+  "compose.content-type.html": "HTML",
+  "compose.content-type.markdown": "Markdown",
+  "confirmations.unfilter.author": "Aŭtoro",
+  "confirmations.unfilter.confirm": "Montri",
+  "confirmations.unfilter.edit_filter": "Redakti filtrilon",
+  "navigation_bar.keyboard_shortcuts": "Fulmoklavoj",
+  "notification_purge.btn_all": "Selekti ĉiujn",
+  "notification_purge.btn_apply": "Forigi selektajn",
+  "notification_purge.btn_invert": "Inverti selekton",
+  "notification_purge.btn_none": "Elekti neniun",
+  "notifications.marked_clear": "Forigi selektajn sciigojn",
+  "onboarding.next": "Sekva",
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.almost_done": "Preskaŭ finita…",
+  "onboarding.page_six.apps_available": "Estas {apps} disponeblaj por iOS, Android kaj aliaj sistemoj.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "onboarding.page_six.various_app": "poŝtelefonaj aplikaĵoj",
+  "settings.auto_collapse_all": "Ĉiuj",
+  "settings.auto_collapse_lengthy": "Longaj afiŝoj",
+  "settings.auto_collapse_media": "Afiŝoj kun aŭdovidaĵoj",
+  "settings.auto_collapse_notifications": "Sciigoj",
+  "settings.auto_collapse_reblogs": "Diskonigoj",
+  "settings.auto_collapse_replies": "Respondoj",
+  "settings.close": "Fermi",
+  "settings.content_warnings": "Content warnings",
+  "settings.content_warnings.regexp": "Regula esprimo",
+  "settings.preferences": "Preferences",
+  "settings.shared_settings_link": "preferoj de uzanto",
+  "settings.side_arm": "Duaranga butono por afiŝi:",
+  "settings.side_arm.none": "Neniu",
+  "settings.status_icons": "Ikonoj sur la afiŝoj",
+  "settings.status_icons_language": "Indikilo de lingvo",
+  "settings.status_icons_media": "Indikilo de aŭdovidaĵojn kaj balotenketo",
+  "settings.status_icons_reply": "Indikilo de respondoj",
+  "settings.status_icons_visibility": "Indikilo de privateco de afiŝo",
+  "web_app_crash.change_your_settings": "Ŝanĝi viajn {settings}",
+  "web_app_crash.reload": "Reŝarĝi",
+  "web_app_crash.reload_page": "{reload} la nunan paĝon",
+  "web_app_crash.settings": "agordojn"
+}
diff --git a/app/javascript/flavours/glitch/locales/es-AR.js b/app/javascript/flavours/glitch/locales/es-AR.js
deleted file mode 100644
index 0dffabcd4..000000000
--- a/app/javascript/flavours/glitch/locales/es-AR.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/es-AR.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/es-AR.json b/app/javascript/flavours/glitch/locales/es-AR.json
new file mode 100644
index 000000000..fc5a2e904
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/es-AR.json
@@ -0,0 +1,95 @@
+{
+  "advanced_options.icon_title": "Opciones avanzadas",
+  "advanced_options.local-only.long": "No publicar a otras instancias",
+  "advanced_options.local-only.short": "Local",
+  "advanced_options.local-only.tooltip": "Este toot es local",
+  "advanced_options.threaded_mode.long": "Al publicar abre automáticamente una respuesta",
+  "advanced_options.threaded_mode.short": "Modo hilo",
+  "advanced_options.threaded_mode.tooltip": "Modo hilo habilitado",
+  "compose.attach": "Adjuntar...",
+  "compose.attach.doodle": "Dibujar algo",
+  "compose.attach.upload": "Subir un archivo",
+  "confirmations.unfilter.author": "Publicado por",
+  "confirmations.unfilter.confirm": "Mostrar",
+  "confirmations.unfilter.edit_filter": "Editar filtro",
+  "confirmations.unfilter.filters": "Coincidencia con {count, plural, one {filtro} other {filtros}}",
+  "favourite_modal.combo": "Puedes presionar {combo} para omitir esto la próxima vez",
+  "getting_started.onboarding": "Paseo inicial",
+  "home.column_settings.show_direct": "Mostrar mensajes directos",
+  "layout.auto": "Automático",
+  "layout.desktop": "Escritorio",
+  "layout.hint.auto": "Seleccionar un diseño automáticamente basado en \"Habilitar interface web avanzada\" y tamaño de pantalla",
+  "layout.hint.desktop": "Utiliza el diseño multi-columna sin importar \"Habilitar interface web avanzada\" o tamaño de pantalla",
+  "layout.hint.single": "Utiliza el diseño de una columna sin importar \"Habilitar interface web avanzada\" o tamaño de pantalla",
+  "media_gallery.sensitive": "Sensible",
+  "navigation_bar.app_settings": "Ajustes de aplicación",
+  "notification.markForDeletion": "Marcar para borrar",
+  "notification_purge.btn_all": "Seleccionar\ntodo",
+  "notification_purge.btn_apply": "Borrar\nselección",
+  "notification_purge.btn_invert": "Invertir\nselección",
+  "notification_purge.btn_none": "Seleccionar\nnada",
+  "notifications.marked_clear": "Limpiar notificaciones seleccionadas",
+  "notifications.marked_clear_confirmation": "¿Deseas borrar permanentemente todas las notificaciones seleccionadas?",
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_one.welcome": "¡Bienvenidx a {domain}!",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.always_show_spoilers_field": "Siempre mostrar el campo de advertencia de contenido",
+  "settings.auto_collapse": "Colapsar automáticamente",
+  "settings.auto_collapse_all": "Todo",
+  "settings.auto_collapse_lengthy": "Toots largos",
+  "settings.auto_collapse_media": "Toots con medios",
+  "settings.auto_collapse_notifications": "Notificaciones",
+  "settings.auto_collapse_reblogs": "Retoots",
+  "settings.auto_collapse_replies": "Respuestas",
+  "settings.close": "Cerrar",
+  "settings.collapsed_statuses": "Toots colapsados",
+  "settings.compose_box_opts": "Cuadro de redacción",
+  "settings.confirm_before_clearing_draft": "Mostrar diálogo de confirmación antes de sobreescribir un mensaje estabas escribiendo",
+  "settings.confirm_boost_missing_media_description": "Mostrar diálogo de confirmación antes de retootear publicaciones con medios sin descripción",
+  "settings.confirm_missing_media_description": "Mostrar diálogo de confirmación antes de publicar toots con medios sin descripción",
+  "settings.content_warnings": "Content warnings",
+  "settings.content_warnings.regexp": "Regexp (expresión regular)",
+  "settings.content_warnings_filter": "No descolapsar estas advertencias de contenido:",
+  "settings.enable_collapsed": "Habilitar toots colapsados",
+  "settings.enable_content_warnings_auto_unfold": "Descolapsar automáticamente advertencias de contenido",
+  "settings.hicolor_privacy_icons": "Íconos de privacidad más visibles",
+  "settings.image_backgrounds": "Fondos de imágenes",
+  "settings.image_backgrounds_media": "Vista previa de medios de toots colapsados",
+  "settings.image_backgrounds_users": "Darle fondo de imagen a toots colapsados",
+  "settings.inline_preview_cards": "Vista previa para enlaces externos",
+  "settings.layout": "Diseño",
+  "settings.layout_opts": "Opciones de diseño",
+  "settings.media": "Medios",
+  "settings.media_fullwidth": "Ancho completo al mostrar medios ",
+  "settings.media_letterbox": "Mantener proporciones al mostrar medios",
+  "settings.media_letterbox_hint": "Escalar medios para que llenen el espacio del contenedor sin cambiar sus proporciones sin recortarlos",
+  "settings.media_reveal_behind_cw": "Siempre mostrar medios sensibles dentro de las advertencias de contenido",
+  "settings.notifications.favicon_badge": "Marcador de notificaciones en el favicon",
+  "settings.notifications.favicon_badge.hint": "Muestra un marcador de notificaciones sin leer en el favicon",
+  "settings.notifications.tab_badge": "Marcador de notificaciones no leídas",
+  "settings.notifications.tab_badge.hint": "Muestra un marcador de notificaciones sin leer en el ícono de notificaciones cuando dicha columna no está abierta",
+  "settings.notifications_opts": "Opciones de notificaciones",
+  "settings.preferences": "Preferences",
+  "settings.prepend_cw_re": "Anteponer \"re: \" a las advertencias de contenido al responder",
+  "settings.preselect_on_reply": "Preseleccionar nombres de usuarix al responder",
+  "settings.preselect_on_reply_hint": "Al responder a conversaciones con múltiples participantes, preselecciona los nombres de usuarix subsecuentes del/la primerx",
+  "settings.rewrite_mentions": "Reescribir menciones in publicaciones mostradas",
+  "settings.rewrite_mentions_acct": "Reescribir con nombre de usuarix y dominio (para cuentas remotas)",
+  "settings.rewrite_mentions_no": "No reescribir menciones",
+  "settings.rewrite_mentions_username": "Reescribir con nombre de usuarix",
+  "settings.show_action_bar": "Mostrar botones de acción en toots colapsados",
+  "settings.show_content_type_choice": "Mostrar selección de tipo de contenido al crear toots",
+  "settings.show_reply_counter": "Mostrar un conteo estimado de respuestas",
+  "settings.side_arm": "Botón secundario:",
+  "settings.side_arm.none": "Ninguno",
+  "settings.side_arm_reply_mode": "Al responder a un toot, el botón de toot secundario debe:",
+  "settings.side_arm_reply_mode.copy": "Copiar opción de privacidad del toot al que estás respondiendo",
+  "settings.side_arm_reply_mode.keep": "Conservar opción de privacidad",
+  "settings.side_arm_reply_mode.restrict": "Restringir la opción de privacidad a la misma del toot al que estás respondiendo",
+  "settings.swipe_to_change_columns": "Permitir deslizar para cambiar columnas (Sólo en móvil)",
+  "settings.tag_misleading_links": "Marcar enlaces engañosos",
+  "settings.tag_misleading_links.hint": "Añadir una indicación visual indicando el destino de los enlace que no los mencionen explícitamente",
+  "settings.wide_view": "Vista amplia (solo modo de escritorio)",
+  "status.collapse": "Colapsar",
+  "status.uncollapse": "Descolapsar"
+}
diff --git a/app/javascript/flavours/glitch/locales/es-MX.js b/app/javascript/flavours/glitch/locales/es-MX.js
deleted file mode 100644
index eaefa20ef..000000000
--- a/app/javascript/flavours/glitch/locales/es-MX.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/es-MX.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/es-MX.json b/app/javascript/flavours/glitch/locales/es-MX.json
new file mode 100644
index 000000000..fc5a2e904
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/es-MX.json
@@ -0,0 +1,95 @@
+{
+  "advanced_options.icon_title": "Opciones avanzadas",
+  "advanced_options.local-only.long": "No publicar a otras instancias",
+  "advanced_options.local-only.short": "Local",
+  "advanced_options.local-only.tooltip": "Este toot es local",
+  "advanced_options.threaded_mode.long": "Al publicar abre automáticamente una respuesta",
+  "advanced_options.threaded_mode.short": "Modo hilo",
+  "advanced_options.threaded_mode.tooltip": "Modo hilo habilitado",
+  "compose.attach": "Adjuntar...",
+  "compose.attach.doodle": "Dibujar algo",
+  "compose.attach.upload": "Subir un archivo",
+  "confirmations.unfilter.author": "Publicado por",
+  "confirmations.unfilter.confirm": "Mostrar",
+  "confirmations.unfilter.edit_filter": "Editar filtro",
+  "confirmations.unfilter.filters": "Coincidencia con {count, plural, one {filtro} other {filtros}}",
+  "favourite_modal.combo": "Puedes presionar {combo} para omitir esto la próxima vez",
+  "getting_started.onboarding": "Paseo inicial",
+  "home.column_settings.show_direct": "Mostrar mensajes directos",
+  "layout.auto": "Automático",
+  "layout.desktop": "Escritorio",
+  "layout.hint.auto": "Seleccionar un diseño automáticamente basado en \"Habilitar interface web avanzada\" y tamaño de pantalla",
+  "layout.hint.desktop": "Utiliza el diseño multi-columna sin importar \"Habilitar interface web avanzada\" o tamaño de pantalla",
+  "layout.hint.single": "Utiliza el diseño de una columna sin importar \"Habilitar interface web avanzada\" o tamaño de pantalla",
+  "media_gallery.sensitive": "Sensible",
+  "navigation_bar.app_settings": "Ajustes de aplicación",
+  "notification.markForDeletion": "Marcar para borrar",
+  "notification_purge.btn_all": "Seleccionar\ntodo",
+  "notification_purge.btn_apply": "Borrar\nselección",
+  "notification_purge.btn_invert": "Invertir\nselección",
+  "notification_purge.btn_none": "Seleccionar\nnada",
+  "notifications.marked_clear": "Limpiar notificaciones seleccionadas",
+  "notifications.marked_clear_confirmation": "¿Deseas borrar permanentemente todas las notificaciones seleccionadas?",
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_one.welcome": "¡Bienvenidx a {domain}!",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.always_show_spoilers_field": "Siempre mostrar el campo de advertencia de contenido",
+  "settings.auto_collapse": "Colapsar automáticamente",
+  "settings.auto_collapse_all": "Todo",
+  "settings.auto_collapse_lengthy": "Toots largos",
+  "settings.auto_collapse_media": "Toots con medios",
+  "settings.auto_collapse_notifications": "Notificaciones",
+  "settings.auto_collapse_reblogs": "Retoots",
+  "settings.auto_collapse_replies": "Respuestas",
+  "settings.close": "Cerrar",
+  "settings.collapsed_statuses": "Toots colapsados",
+  "settings.compose_box_opts": "Cuadro de redacción",
+  "settings.confirm_before_clearing_draft": "Mostrar diálogo de confirmación antes de sobreescribir un mensaje estabas escribiendo",
+  "settings.confirm_boost_missing_media_description": "Mostrar diálogo de confirmación antes de retootear publicaciones con medios sin descripción",
+  "settings.confirm_missing_media_description": "Mostrar diálogo de confirmación antes de publicar toots con medios sin descripción",
+  "settings.content_warnings": "Content warnings",
+  "settings.content_warnings.regexp": "Regexp (expresión regular)",
+  "settings.content_warnings_filter": "No descolapsar estas advertencias de contenido:",
+  "settings.enable_collapsed": "Habilitar toots colapsados",
+  "settings.enable_content_warnings_auto_unfold": "Descolapsar automáticamente advertencias de contenido",
+  "settings.hicolor_privacy_icons": "Íconos de privacidad más visibles",
+  "settings.image_backgrounds": "Fondos de imágenes",
+  "settings.image_backgrounds_media": "Vista previa de medios de toots colapsados",
+  "settings.image_backgrounds_users": "Darle fondo de imagen a toots colapsados",
+  "settings.inline_preview_cards": "Vista previa para enlaces externos",
+  "settings.layout": "Diseño",
+  "settings.layout_opts": "Opciones de diseño",
+  "settings.media": "Medios",
+  "settings.media_fullwidth": "Ancho completo al mostrar medios ",
+  "settings.media_letterbox": "Mantener proporciones al mostrar medios",
+  "settings.media_letterbox_hint": "Escalar medios para que llenen el espacio del contenedor sin cambiar sus proporciones sin recortarlos",
+  "settings.media_reveal_behind_cw": "Siempre mostrar medios sensibles dentro de las advertencias de contenido",
+  "settings.notifications.favicon_badge": "Marcador de notificaciones en el favicon",
+  "settings.notifications.favicon_badge.hint": "Muestra un marcador de notificaciones sin leer en el favicon",
+  "settings.notifications.tab_badge": "Marcador de notificaciones no leídas",
+  "settings.notifications.tab_badge.hint": "Muestra un marcador de notificaciones sin leer en el ícono de notificaciones cuando dicha columna no está abierta",
+  "settings.notifications_opts": "Opciones de notificaciones",
+  "settings.preferences": "Preferences",
+  "settings.prepend_cw_re": "Anteponer \"re: \" a las advertencias de contenido al responder",
+  "settings.preselect_on_reply": "Preseleccionar nombres de usuarix al responder",
+  "settings.preselect_on_reply_hint": "Al responder a conversaciones con múltiples participantes, preselecciona los nombres de usuarix subsecuentes del/la primerx",
+  "settings.rewrite_mentions": "Reescribir menciones in publicaciones mostradas",
+  "settings.rewrite_mentions_acct": "Reescribir con nombre de usuarix y dominio (para cuentas remotas)",
+  "settings.rewrite_mentions_no": "No reescribir menciones",
+  "settings.rewrite_mentions_username": "Reescribir con nombre de usuarix",
+  "settings.show_action_bar": "Mostrar botones de acción en toots colapsados",
+  "settings.show_content_type_choice": "Mostrar selección de tipo de contenido al crear toots",
+  "settings.show_reply_counter": "Mostrar un conteo estimado de respuestas",
+  "settings.side_arm": "Botón secundario:",
+  "settings.side_arm.none": "Ninguno",
+  "settings.side_arm_reply_mode": "Al responder a un toot, el botón de toot secundario debe:",
+  "settings.side_arm_reply_mode.copy": "Copiar opción de privacidad del toot al que estás respondiendo",
+  "settings.side_arm_reply_mode.keep": "Conservar opción de privacidad",
+  "settings.side_arm_reply_mode.restrict": "Restringir la opción de privacidad a la misma del toot al que estás respondiendo",
+  "settings.swipe_to_change_columns": "Permitir deslizar para cambiar columnas (Sólo en móvil)",
+  "settings.tag_misleading_links": "Marcar enlaces engañosos",
+  "settings.tag_misleading_links.hint": "Añadir una indicación visual indicando el destino de los enlace que no los mencionen explícitamente",
+  "settings.wide_view": "Vista amplia (solo modo de escritorio)",
+  "status.collapse": "Colapsar",
+  "status.uncollapse": "Descolapsar"
+}
diff --git a/app/javascript/flavours/glitch/locales/es.js b/app/javascript/flavours/glitch/locales/es.js
deleted file mode 100644
index f22062977..000000000
--- a/app/javascript/flavours/glitch/locales/es.js
+++ /dev/null
@@ -1,119 +0,0 @@
-import inherited from 'mastodon/locales/es.json';
-
-const messages = {
-  'advanced_options.icon_title': 'Opciones avanzadas',
-  'advanced_options.local-only.long': 'No publicar a otras instancias',
-  'advanced_options.local-only.short': 'Local',
-  'advanced_options.local-only.tooltip': 'Este toot es local',
-  'advanced_options.threaded_mode.long': 'Al publicar abre automáticamente una respuesta',
-  'advanced_options.threaded_mode.short': 'Modo hilo',
-  'advanced_options.threaded_mode.tooltip': 'Modo hilo habilitado',
-  'compose.attach.doodle': 'Dibujar algo',
-  'compose.attach.upload': 'Subir un archivo',
-  'compose.attach': 'Adjuntar...',
-  'favourite_modal.combo': 'Puedes presionar {combo} para omitir esto la próxima vez',
-  'getting_started.onboarding': 'Paseo inicial',
-  'getting_started.open_source_notice': 'Glitchsoc es software libre y gratuito bifurcado de {Mastodon}. Puedes contribuir o reportar errores en GitHub en {github}.',
-  'home.column_settings.show_direct': 'Mostrar mensajes directos',
-  'layout.auto': 'Automático',
-  'layout.current_is': 'Tu diseño actual es:',
-  'layout.desktop': 'Escritorio',
-  'layout.hint.auto': 'Seleccionar un diseño automáticamente basado en "Habilitar interface web avanzada" y tamaño de pantalla',
-  'layout.hint.desktop': 'Utiliza el diseño multi-columna sin importar "Habilitar interface web avanzada" o tamaño de pantalla',
-  'layout.hint.single': 'Utiliza el diseño de una columna sin importar "Habilitar interface web avanzada" o tamaño de pantalla',
-  'layout.mobile': 'Móvil',
-  'media_gallery.sensitive': 'Sensible',
-  'navigation_bar.app_settings': 'Ajustes de aplicación',
-  'notification_purge.btn_all': 'Seleccionar\ntodo',
-  'notification_purge.btn_apply': 'Borrar\nselección',
-  'notification_purge.btn_invert': 'Invertir\nselección',
-  'notification_purge.btn_none': 'Seleccionar\nnada',
-  'notification.markForDeletion': 'Marcar para borrar',
-  'notifications.clear': 'Limpiar notificaciones',
-  'notifications.marked_clear_confirmation': '¿Deseas borrar permanentemente todas las notificaciones seleccionadas?',
-  'notifications.marked_clear': 'Limpiar notificaciones seleccionadas',
-  'onboarding.page_one.federation': '{domain} es una "instancia" de Mastodon. Mastodon es una red de servidores independientes que se unen para crear una red social más grande. A estos servidores los llamamos instancias.',
-  'onboarding.page_one.welcome': '¡Bienvenidx a {domain}!',
-  'onboarding.page_six.github': '{domain} usa Glitchsoc. Glitchsoc es una bifurcación {fork} amigable de {Mastodon}, y es compatible con cualquier instancia o aplicación de Mastodon. Glitchsoc es completamente gratuito y de código abierto. Puedes reportar errores, solicitar funciones o contribuir al código en {github}.',
-  'settings.always_show_spoilers_field': 'Siempre mostrar el campo de advertencia de contenido',
-  'settings.auto_collapse_all': 'Todo',
-  'settings.auto_collapse_lengthy': 'Toots largos',
-  'settings.auto_collapse_media': 'Toots con medios',
-  'settings.auto_collapse_notifications': 'Notificaciones',
-  'settings.auto_collapse_reblogs': 'Retoots',
-  'settings.auto_collapse_replies': 'Respuestas',
-  'settings.auto_collapse': 'Colapsar automáticamente',
-  'settings.close': 'Cerrar',
-  'settings.collapsed_statuses': 'Toots colapsados',
-  'settings.compose_box_opts': 'Cuadro de redacción',
-  'settings.confirm_before_clearing_draft': 'Mostrar diálogo de confirmación antes de sobreescribir un mensaje estabas escribiendo',
-  'settings.confirm_boost_missing_media_description': 'Mostrar diálogo de confirmación antes de retootear publicaciones con medios sin descripción',
-  'settings.confirm_missing_media_description': 'Mostrar diálogo de confirmación antes de publicar toots con medios sin descripción',
-  'settings.content_warnings_filter': 'No descolapsar estas advertencias de contenido:',
-  'settings.content_warnings.regexp': 'Regexp (expresión regular)',
-  'settings.content_warnings': 'Advertencias de contenido',
-  'settings.enable_collapsed': 'Habilitar toots colapsados',
-  'settings.enable_content_warnings_auto_unfold': 'Descolapsar automáticamente advertencias de contenido',
-  'settings.filtering_behavior.cw': 'Mostrar el toot y agregar las palabras filtradas a la advertencia de contenido',
-  'settings.filtering_behavior.drop': 'Ocultar toots filtrados por completo',
-  'settings.filtering_behavior.hide': 'Mostrar "Filtrado" y agregar un botón para saber por qué',
-  'settings.filtering_behavior.upstream': 'Mostrar "Filtrado"',
-  'settings.filtering_behavior': 'Configuración de filtros',
-  'settings.filters': 'Filtros',
-  'settings.general': 'General',
-  'settings.hicolor_privacy_icons': 'Íconos de privacidad más visibles',
-  'settings.image_backgrounds_media': 'Vista previa de medios de toots colapsados',
-  'settings.image_backgrounds_users': 'Darle fondo de imagen a toots colapsados',
-  'settings.image_backgrounds': 'Fondos de imágenes',
-  'settings.inline_preview_cards': 'Vista previa para enlaces externos',
-  'settings.layout_opts': 'Opciones de diseño',
-  'settings.layout': 'Diseño',
-  'settings.media_fullwidth': 'Ancho completo al mostrar medios ',
-  'settings.media_letterbox_hint': 'Escalar medios para que llenen el espacio del contenedor sin cambiar sus proporciones sin recortarlos',
-  'settings.media_letterbox': 'Mantener proporciones al mostrar medios',
-  'settings.media_reveal_behind_cw': 'Siempre mostrar medios sensibles dentro de las advertencias de contenido',
-  'settings.media': 'Medios',
-  'settings.navbar_under': 'Barra de navegación en la parte inferior (solo móvil)',
-  'settings.notifications_opts': 'Opciones de notificaciones',
-  'settings.notifications.favicon_badge.hint': 'Muestra un marcador de notificaciones sin leer en el favicon',
-  'settings.notifications.favicon_badge': 'Marcador de notificaciones en el favicon',
-  'settings.notifications.tab_badge.hint': 'Muestra un marcador de notificaciones sin leer en el ícono de notificaciones cuando dicha columna no está abierta',
-  'settings.notifications.tab_badge': 'Marcador de notificaciones no leídas',
-  'settings.preferences': 'Preferencias de usuarix',
-  'settings.prepend_cw_re': 'Anteponer "re: " a las advertencias de contenido al responder',
-  'settings.preselect_on_reply_hint': 'Al responder a conversaciones con múltiples participantes, preselecciona los nombres de usuarix subsecuentes del/la primerx',
-  'settings.preselect_on_reply': 'Preseleccionar nombres de usuarix al responder',
-  'settings.rewrite_mentions_acct': 'Reescribir con nombre de usuarix y dominio (para cuentas remotas)',
-  'settings.rewrite_mentions_no': 'No reescribir menciones',
-  'settings.rewrite_mentions_username': 'Reescribir con nombre de usuarix',
-  'settings.rewrite_mentions': 'Reescribir menciones in publicaciones mostradas',
-  'settings.show_action_bar': 'Mostrar botones de acción en toots colapsados',
-  'settings.show_content_type_choice': 'Mostrar selección de tipo de contenido al crear toots',
-  'settings.show_reply_counter': 'Mostrar un conteo estimado de respuestas',
-  'settings.side_arm_reply_mode.copy': 'Copiar opción de privacidad del toot al que estás respondiendo',
-  'settings.side_arm_reply_mode.keep': 'Conservar opción de privacidad',
-  'settings.side_arm_reply_mode.restrict': 'Restringir la opción de privacidad a la misma del toot al que estás respondiendo',
-  'settings.side_arm_reply_mode': 'Al responder a un toot, el botón de toot secundario debe:',
-  'settings.side_arm.none': 'Ninguno',
-  'settings.side_arm': 'Botón secundario:',
-  'settings.swipe_to_change_columns': 'Permitir deslizar para cambiar columnas (Sólo en móvil)',
-  'settings.tag_misleading_links.hint': 'Añadir una indicación visual indicando el destino de los enlace que no los mencionen explícitamente',
-  'settings.tag_misleading_links': 'Marcar enlaces engañosos',
-  'settings.wide_view': 'Vista amplia (solo modo de escritorio)',
-  'status.collapse': 'Colapsar',
-  'status.uncollapse': 'Descolapsar',
-  'confirmations.unfilter': 'Información del toot filtrado',
-  'confirmations.unfilter.author': 'Publicado por',
-  'confirmations.unfilter.filters': 'Coincidencia con {count, plural, one {filtro} other {filtros}}',
-  'confirmations.unfilter.edit_filter': 'Editar filtro',
-  'confirmations.unfilter.confirm': 'Mostrar',
-  'confirmations.delete.confirm': 'Borrar',
-  'confirmations.delete.message': 'Por favor confirma borrado',
-  'confirmations.redraft.confirm': 'Borrar y volver a borrador',
-  'confirmations.redraft.message': '¿Borrar y volver a borrador? Perderás todas las respuestas, retoots y favoritos asociados, y las respuestas a la publicación original quedarán huérfanos.',
-  'confirmations.reply.confirm': 'Responder',
-  'confirmations.reply.message': 'Responder no sobreescribirá el mensaje que estás escibiendo actualmente. ¿Deseas continuar?',
-  'status.show_filter_reason': '(mostrar por qué)',
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/es.json b/app/javascript/flavours/glitch/locales/es.json
new file mode 100644
index 000000000..07acbf914
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/es.json
@@ -0,0 +1,95 @@
+{
+  "advanced_options.icon_title": "Opciones avanzadas",
+  "advanced_options.local-only.long": "No publicar a otras instancias",
+  "advanced_options.local-only.short": "Local",
+  "advanced_options.local-only.tooltip": "Este toot es local",
+  "advanced_options.threaded_mode.long": "Al publicar abre automáticamente una respuesta",
+  "advanced_options.threaded_mode.short": "Modo hilo",
+  "advanced_options.threaded_mode.tooltip": "Modo hilo habilitado",
+  "compose.attach": "Adjuntar...",
+  "compose.attach.doodle": "Dibujar algo",
+  "compose.attach.upload": "Subir un archivo",
+  "confirmations.unfilter.author": "Publicado por",
+  "confirmations.unfilter.confirm": "Mostrar",
+  "confirmations.unfilter.edit_filter": "Editar filtro",
+  "confirmations.unfilter.filters": "Coincidencia con {count, plural, one {filtro} other {filtros}}",
+  "favourite_modal.combo": "Puedes presionar {combo} para omitir esto la próxima vez",
+  "getting_started.onboarding": "Paseo inicial",
+  "home.column_settings.show_direct": "Mostrar mensajes directos",
+  "layout.auto": "Automático",
+  "layout.desktop": "Escritorio",
+  "layout.hint.auto": "Seleccionar un diseño automáticamente basado en \"Habilitar interface web avanzada\" y tamaño de pantalla",
+  "layout.hint.desktop": "Utiliza el diseño multi-columna sin importar \"Habilitar interface web avanzada\" o tamaño de pantalla",
+  "layout.hint.single": "Utiliza el diseño de una columna sin importar \"Habilitar interface web avanzada\" o tamaño de pantalla",
+  "media_gallery.sensitive": "Sensible",
+  "navigation_bar.app_settings": "Ajustes de aplicación",
+  "notification.markForDeletion": "Marcar para borrar",
+  "notification_purge.btn_all": "Seleccionar\ntodo",
+  "notification_purge.btn_apply": "Borrar\nselección",
+  "notification_purge.btn_invert": "Invertir\nselección",
+  "notification_purge.btn_none": "Seleccionar\nnada",
+  "notifications.marked_clear": "Limpiar notificaciones seleccionadas",
+  "notifications.marked_clear_confirmation": "¿Deseas borrar permanentemente todas las notificaciones seleccionadas?",
+  "onboarding.page_one.federation": "{domain} es una \"instancia\" de Mastodon. Mastodon es una red de servidores independientes que se unen para crear una red social más grande. A estos servidores los llamamos instancias.",
+  "onboarding.page_one.welcome": "¡Bienvenidx a {domain}!",
+  "onboarding.page_six.github": "{domain} usa Glitchsoc. Glitchsoc es una bifurcación {fork} amigable de {Mastodon}, y es compatible con cualquier instancia o aplicación de Mastodon. Glitchsoc es completamente gratuito y de código abierto. Puedes reportar errores, solicitar funciones o contribuir al código en {github}.",
+  "settings.always_show_spoilers_field": "Siempre mostrar el campo de advertencia de contenido",
+  "settings.auto_collapse": "Colapsar automáticamente",
+  "settings.auto_collapse_all": "Todo",
+  "settings.auto_collapse_lengthy": "Toots largos",
+  "settings.auto_collapse_media": "Toots con medios",
+  "settings.auto_collapse_notifications": "Notificaciones",
+  "settings.auto_collapse_reblogs": "Retoots",
+  "settings.auto_collapse_replies": "Respuestas",
+  "settings.close": "Cerrar",
+  "settings.collapsed_statuses": "Toots colapsados",
+  "settings.compose_box_opts": "Cuadro de redacción",
+  "settings.confirm_before_clearing_draft": "Mostrar diálogo de confirmación antes de sobreescribir un mensaje estabas escribiendo",
+  "settings.confirm_boost_missing_media_description": "Mostrar diálogo de confirmación antes de retootear publicaciones con medios sin descripción",
+  "settings.confirm_missing_media_description": "Mostrar diálogo de confirmación antes de publicar toots con medios sin descripción",
+  "settings.content_warnings": "Advertencias de contenido",
+  "settings.content_warnings.regexp": "Regexp (expresión regular)",
+  "settings.content_warnings_filter": "No descolapsar estas advertencias de contenido:",
+  "settings.enable_collapsed": "Habilitar toots colapsados",
+  "settings.enable_content_warnings_auto_unfold": "Descolapsar automáticamente advertencias de contenido",
+  "settings.hicolor_privacy_icons": "Íconos de privacidad más visibles",
+  "settings.image_backgrounds": "Fondos de imágenes",
+  "settings.image_backgrounds_media": "Vista previa de medios de toots colapsados",
+  "settings.image_backgrounds_users": "Darle fondo de imagen a toots colapsados",
+  "settings.inline_preview_cards": "Vista previa para enlaces externos",
+  "settings.layout": "Diseño",
+  "settings.layout_opts": "Opciones de diseño",
+  "settings.media": "Medios",
+  "settings.media_fullwidth": "Ancho completo al mostrar medios ",
+  "settings.media_letterbox": "Mantener proporciones al mostrar medios",
+  "settings.media_letterbox_hint": "Escalar medios para que llenen el espacio del contenedor sin cambiar sus proporciones sin recortarlos",
+  "settings.media_reveal_behind_cw": "Siempre mostrar medios sensibles dentro de las advertencias de contenido",
+  "settings.notifications.favicon_badge": "Marcador de notificaciones en el favicon",
+  "settings.notifications.favicon_badge.hint": "Muestra un marcador de notificaciones sin leer en el favicon",
+  "settings.notifications.tab_badge": "Marcador de notificaciones no leídas",
+  "settings.notifications.tab_badge.hint": "Muestra un marcador de notificaciones sin leer en el ícono de notificaciones cuando dicha columna no está abierta",
+  "settings.notifications_opts": "Opciones de notificaciones",
+  "settings.preferences": "Preferencias de usuarix",
+  "settings.prepend_cw_re": "Anteponer \"re: \" a las advertencias de contenido al responder",
+  "settings.preselect_on_reply": "Preseleccionar nombres de usuarix al responder",
+  "settings.preselect_on_reply_hint": "Al responder a conversaciones con múltiples participantes, preselecciona los nombres de usuarix subsecuentes del/la primerx",
+  "settings.rewrite_mentions": "Reescribir menciones in publicaciones mostradas",
+  "settings.rewrite_mentions_acct": "Reescribir con nombre de usuarix y dominio (para cuentas remotas)",
+  "settings.rewrite_mentions_no": "No reescribir menciones",
+  "settings.rewrite_mentions_username": "Reescribir con nombre de usuarix",
+  "settings.show_action_bar": "Mostrar botones de acción en toots colapsados",
+  "settings.show_content_type_choice": "Mostrar selección de tipo de contenido al crear toots",
+  "settings.show_reply_counter": "Mostrar un conteo estimado de respuestas",
+  "settings.side_arm": "Botón secundario:",
+  "settings.side_arm.none": "Ninguno",
+  "settings.side_arm_reply_mode": "Al responder a un toot, el botón de toot secundario debe:",
+  "settings.side_arm_reply_mode.copy": "Copiar opción de privacidad del toot al que estás respondiendo",
+  "settings.side_arm_reply_mode.keep": "Conservar opción de privacidad",
+  "settings.side_arm_reply_mode.restrict": "Restringir la opción de privacidad a la misma del toot al que estás respondiendo",
+  "settings.swipe_to_change_columns": "Permitir deslizar para cambiar columnas (Sólo en móvil)",
+  "settings.tag_misleading_links": "Marcar enlaces engañosos",
+  "settings.tag_misleading_links.hint": "Añadir una indicación visual indicando el destino de los enlace que no los mencionen explícitamente",
+  "settings.wide_view": "Vista amplia (solo modo de escritorio)",
+  "status.collapse": "Colapsar",
+  "status.uncollapse": "Descolapsar"
+}
diff --git a/app/javascript/flavours/glitch/locales/et.js b/app/javascript/flavours/glitch/locales/et.js
deleted file mode 100644
index e3ea6b2a9..000000000
--- a/app/javascript/flavours/glitch/locales/et.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/et.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/et.json b/app/javascript/flavours/glitch/locales/et.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/et.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/eu.js b/app/javascript/flavours/glitch/locales/eu.js
deleted file mode 100644
index 946410b67..000000000
--- a/app/javascript/flavours/glitch/locales/eu.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/eu.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/eu.json b/app/javascript/flavours/glitch/locales/eu.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/eu.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/fa.js b/app/javascript/flavours/glitch/locales/fa.js
deleted file mode 100644
index d82461a1a..000000000
--- a/app/javascript/flavours/glitch/locales/fa.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/fa.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/fa.json b/app/javascript/flavours/glitch/locales/fa.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/fa.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/fi.js b/app/javascript/flavours/glitch/locales/fi.js
deleted file mode 100644
index 11c3cd082..000000000
--- a/app/javascript/flavours/glitch/locales/fi.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/fi.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/fi.json b/app/javascript/flavours/glitch/locales/fi.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/fi.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/fo.json b/app/javascript/flavours/glitch/locales/fo.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/fo.json
@@ -0,0 +1 @@
+{}
diff --git a/app/javascript/flavours/glitch/locales/fr-QC.json b/app/javascript/flavours/glitch/locales/fr-QC.json
new file mode 100644
index 000000000..383d933b4
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/fr-QC.json
@@ -0,0 +1,200 @@
+{
+  "about.fork_disclaimer": "Glitch-soc est un logiciel gratuit et open source, fork de Mastodon.",
+  "account.add_account_note": "Ajouter une note pour @{name}",
+  "account.disclaimer_full": "Les informations ci-dessous peuvent être incomplètes.",
+  "account.follows": "Abonnements",
+  "account.joined": "Ici depuis {date}",
+  "account.suspended_disclaimer_full": "Cet utilisateur a été suspendu par un modérateur.",
+  "account.view_full_profile": "Voir le profil complet",
+  "account_note.cancel": "Annuler",
+  "account_note.edit": "Éditer",
+  "account_note.glitch_placeholder": "Aucun commentaire fourni",
+  "account_note.save": "Sauvegarder",
+  "advanced_options.icon_title": "Options avancées",
+  "advanced_options.local-only.long": "Ne pas envoyer aux autres instances",
+  "advanced_options.local-only.short": "Uniquement en local",
+  "advanced_options.local-only.tooltip": "Ce post est uniquement local",
+  "advanced_options.threaded_mode.long": "Ouvre automatiquement une réponse lors de la publication",
+  "advanced_options.threaded_mode.short": "Mode thread",
+  "advanced_options.threaded_mode.tooltip": "Mode thread activé",
+  "boost_modal.missing_description": "Ce post contient des médias sans description",
+  "column.favourited_by": "Ajouté en favori par",
+  "column.heading": "Divers",
+  "column.reblogged_by": "Partagé par",
+  "column.subheading": "Autres options",
+  "column_header.profile": "Profil",
+  "column_subheading.lists": "Listes",
+  "column_subheading.navigation": "Navigation",
+  "community.column_settings.allow_local_only": "Afficher seulement les posts locaux",
+  "compose.attach": "Joindre…",
+  "compose.attach.doodle": "Dessiner quelque chose",
+  "compose.attach.upload": "Téléverser un fichier",
+  "compose.content-type.html": "HTML",
+  "compose.content-type.markdown": "Markdown",
+  "compose.content-type.plain": "Text brut",
+  "compose_form.poll.multiple_choices": "Choix multiples",
+  "compose_form.poll.single_choice": "Choix unique",
+  "compose_form.spoiler": "Cacher le texte derrière un avertissement",
+  "confirmation_modal.do_not_ask_again": "Ne plus demander confirmation",
+  "confirmations.deprecated_settings.confirm": "Utiliser les préférences de Mastodon",
+  "confirmations.deprecated_settings.message": "Certaines {app_settings} de glitch-soc que vous utilisez ont été remplacées par les {preferences} de Mastodon et seront remplacées :",
+  "confirmations.missing_media_description.confirm": "Envoyer quand même",
+  "confirmations.missing_media_description.edit": "Modifier le média",
+  "confirmations.missing_media_description.message": "Au moins un média joint manque d'une description. Pensez à décrire tous les médias attachés pour les malvoyant·e·s avant de publier votre post.",
+  "confirmations.unfilter.author": "Auteur",
+  "confirmations.unfilter.confirm": "Afficher",
+  "confirmations.unfilter.edit_filter": "Modifier le filtre",
+  "confirmations.unfilter.filters": "Correspondance avec {count, plural, one {un filtre} other {plusieurs filtres}}",
+  "content-type.change": "Type de contenu",
+  "direct.group_by_conversations": "Grouper par conversation",
+  "endorsed_accounts_editor.endorsed_accounts": "Comptes mis en avant",
+  "favourite_modal.combo": "Vous pouvez appuyer sur {combo} pour passer ceci la prochaine fois",
+  "getting_started.onboarding": "Montre-moi les alentours",
+  "home.column_settings.advanced": "Avancé",
+  "home.column_settings.filter_regex": "Filtrer par expression régulière",
+  "home.column_settings.show_direct": "Afficher les MPs",
+  "home.settings": "Paramètres de la colonne",
+  "keyboard_shortcuts.bookmark": "ajouter aux marque-pages",
+  "keyboard_shortcuts.secondary_toot": "Envoyer le post en utilisant les paramètres secondaires de confidentialité",
+  "keyboard_shortcuts.toggle_collapse": "Plier/déplier les posts",
+  "layout.auto": "Auto",
+  "layout.desktop": "Ordinateur",
+  "layout.hint.auto": "Choisir automatiquement la mise en page selon l'option \"Activer l'interface Web avancée\" et la taille d'écran.",
+  "layout.hint.desktop": "Utiliser la mise en page en plusieurs colonnes indépendamment de l'option \"Activer l'interface Web avancée\" ou de la taille d'écran.",
+  "layout.hint.single": "Utiliser la mise en page à colonne unique indépendamment de l'option \"Activer l'interface Web avancée\" ou de la taille d'écran.",
+  "layout.single": "Téléphone",
+  "media_gallery.sensitive": "Sensible",
+  "moved_to_warning": "Ce compte a déménagé vers {moved_to_link} et ne peut donc plus accepter de nouveaux abonné·e·s.",
+  "navigation_bar.app_settings": "Paramètres de l'application",
+  "navigation_bar.featured_users": "Utilisateurs mis en avant",
+  "navigation_bar.info": "Informations détaillées",
+  "navigation_bar.keyboard_shortcuts": "Raccourcis clavier",
+  "navigation_bar.misc": "Autres",
+  "notification.markForDeletion": "Ajouter aux éléments à supprimer",
+  "notification_purge.btn_all": "Sélectionner\ntout",
+  "notification_purge.btn_apply": "Effacer\nla sélection",
+  "notification_purge.btn_invert": "Inverser\nla sélection",
+  "notification_purge.btn_none": "Annuler\nla sélection",
+  "notification_purge.start": "Activer le mode de nettoyage des notifications",
+  "notifications.marked_clear": "Effacer les notifications sélectionnées",
+  "notifications.marked_clear_confirmation": "Voulez-vous vraiment effacer de manière permanente toutes les notifications sélectionnées ?",
+  "onboarding.done": "Terminé",
+  "onboarding.next": "Suivant",
+  "onboarding.page_five.public_timelines": "Le fil local affiche les posts publics de tout le monde sur {domain}. Le fil global affiche les posts publics de tous les comptes que les personnes de {domain} suivent. Ce sont les fils publics, une façon formidable de découvrir de nouvelles personnes.",
+  "onboarding.page_four.home": "L'accueil affiche les posts des personnes que vous suivez.",
+  "onboarding.page_four.notifications": "La colonne de notifications vous montre lorsque quelqu'un interagit avec vous.",
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_one.handle": "Vous êtes sur {domain}, donc votre nom d'utilisateur complet est {handle}",
+  "onboarding.page_one.welcome": "Bievenue sur {domain} !",
+  "onboarding.page_six.admin": "Votre admin d’instance est {admin}.",
+  "onboarding.page_six.almost_done": "C'est bientôt fini...",
+  "onboarding.page_six.appetoot": "Bon appétoot !",
+  "onboarding.page_six.apps_available": "Il y a des {apps} disponibles pour iOS, Android et d'autres plateformes.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "onboarding.page_six.guidelines": "règles de la communauté",
+  "onboarding.page_six.read_guidelines": "Veuillez lire les {guidelines} de {domain} !",
+  "onboarding.page_six.various_app": "applications mobiles",
+  "onboarding.page_three.profile": "Modifiez votre profil pour changer votre avatar, biographie et nom public. Ici, vous trouverez également d'autres options.",
+  "onboarding.page_three.search": "Utilisez la barre de recherche pour trouver des personnes et regarder les hashtags comme {illustration} et {introductions}. Pour chercher une personne n'étant pas sur cette instance, utilisez son nom d'utilisateur complet.",
+  "onboarding.page_two.compose": "Écrivez des posts depuis la colonne de rédaction. Vous pouvez téléverser des images, changer la confidentialité et ajouter des avertissements de contenu avec les boutons ci-dessous.",
+  "onboarding.skip": "Passer",
+  "settings.always_show_spoilers_field": "Toujours activer le champ de rédaction de l'avertissement de contenu",
+  "settings.auto_collapse": "Repliage automatique",
+  "settings.auto_collapse_all": "Tout",
+  "settings.auto_collapse_lengthy": "Posts longs",
+  "settings.auto_collapse_media": "Posts avec média",
+  "settings.auto_collapse_notifications": "Notifications",
+  "settings.auto_collapse_reblogs": "Boosts",
+  "settings.auto_collapse_replies": "Réponses",
+  "settings.close": "Fermer",
+  "settings.collapsed_statuses": "Posts repliés",
+  "settings.compose_box_opts": "Zone de rédaction",
+  "settings.confirm_before_clearing_draft": "Afficher une fenêtre de confirmation avant d'écraser le message en cours de rédaction",
+  "settings.confirm_boost_missing_media_description": "Afficher une fenêtre de confirmation avant de partager des posts manquant de description des médias",
+  "settings.confirm_missing_media_description": "Afficher une fenêtre de confirmation avant de publier des posts manquant de description de média",
+  "settings.content_warnings": "Content warnings",
+  "settings.content_warnings.regexp": "Expression rationnelle",
+  "settings.content_warnings_filter": "Avertissement de contenu à ne pas automatiquement déplier :",
+  "settings.content_warnings_media_outside": "Afficher les médias en dehors des avertissements de contenu",
+  "settings.content_warnings_media_outside_hint": "Reproduit le comportement par défaut de Mastodon, les médias attachés ne sont plus affectés par le bouton d'affichage d'un post avec avertissement",
+  "settings.content_warnings_shared_state": "Affiche/cache le contenu de toutes les copies à la fois",
+  "settings.content_warnings_shared_state_hint": "Reproduit le comportement par défaut de Mastodon, le bouton d'avertissement de contenu affecte toutes les copies d'un post à la fois. Cela empêchera le repliement automatique de n'importe quelle copie d'un post avec un avertissement déplié",
+  "settings.content_warnings_unfold_opts": "Options de dépliement automatique",
+  "settings.deprecated_setting": "Cette option est maintenant définie par les {settings_page_link} de Mastodon",
+  "settings.enable_collapsed": "Activer le repliement des posts",
+  "settings.enable_collapsed_hint": "Les posts repliés ont une partie de leur contenu caché pour libérer de l'espace sur l'écran. C'est une option différente de l'avertissement de contenu",
+  "settings.enable_content_warnings_auto_unfold": "Déplier automatiquement les avertissements de contenu",
+  "settings.general": "Général",
+  "settings.hicolor_privacy_icons": "Indicateurs de confidentialité en couleurs",
+  "settings.hicolor_privacy_icons.hint": "Affiche les indicateurs de confidentialité dans des couleurs facilement distinguables",
+  "settings.image_backgrounds": "Images en arrière-plan",
+  "settings.image_backgrounds_media": "Prévisualiser les médias d'un post replié",
+  "settings.image_backgrounds_media_hint": "Si le post a un média attaché, utiliser le premier comme arrière-plan du post",
+  "settings.image_backgrounds_users": "Donner aux posts repliés une image en arrière-plan",
+  "settings.inline_preview_cards": "Cartes d'aperçu pour les liens externes",
+  "settings.layout": "Mise en page :",
+  "settings.layout_opts": "Mise en page",
+  "settings.media": "Média",
+  "settings.media_fullwidth": "Utiliser toute la largeur pour les aperçus",
+  "settings.media_letterbox": "Afficher les médias en Letterbox",
+  "settings.media_letterbox_hint": "Réduit le média et utilise une letterbox pour afficher l'image entière plutôt que de l'étirer et de la rogner",
+  "settings.media_reveal_behind_cw": "Toujours afficher les médias sensibles avec avertissement",
+  "settings.notifications.favicon_badge": "Badge de notifications non lues dans la favicon",
+  "settings.notifications.favicon_badge.hint": "Ajoute un badge dans la favicon pour alerter d'une notification non lue",
+  "settings.notifications.tab_badge": "Badge de notifications non lues",
+  "settings.notifications.tab_badge.hint": "Affiche un badge de notifications non lues dans les icônes des colonnes quand la colonne n'est pas ouverte",
+  "settings.notifications_opts": "Options des notifications",
+  "settings.pop_in_left": "Gauche",
+  "settings.pop_in_player": "Activer le lecteur pop-in",
+  "settings.pop_in_position": "Position du lecteur pop-in :",
+  "settings.pop_in_right": "Droite",
+  "settings.preferences": "Preferences",
+  "settings.prepend_cw_re": "Préfixer les avertissements avec \"re: \" lors d'une réponse",
+  "settings.preselect_on_reply": "Présélectionner les noms d’utilisateur·rices lors de la réponse",
+  "settings.preselect_on_reply_hint": "Présélectionner les noms d'utilisateurs après le premier lors d'une réponse à une conversation à plusieurs participants",
+  "settings.rewrite_mentions": "Réécrire les mentions dans les posts affichés",
+  "settings.rewrite_mentions_acct": "Réécrire avec le nom d'utilisateur·rice et le domaine (lorsque le compte est distant)",
+  "settings.rewrite_mentions_no": "Ne pas réécrire les mentions",
+  "settings.rewrite_mentions_username": "Réécrire avec le nom d’utilisateur·rice",
+  "settings.shared_settings_link": "préférences de l'utilisateur",
+  "settings.show_action_bar": "Afficher les boutons d'action dans les posts repliés",
+  "settings.show_content_type_choice": "Afficher le choix du type de contenu lors de la création des posts",
+  "settings.show_reply_counter": "Afficher une estimation du nombre de réponses",
+  "settings.side_arm": "Bouton secondaire de publication :",
+  "settings.side_arm.none": "Aucun",
+  "settings.side_arm_reply_mode": "Quand vous répondez à un post, le bouton secondaire de publication devrait :",
+  "settings.side_arm_reply_mode.copy": "Copier la confidentialité du post auquel vous répondez",
+  "settings.side_arm_reply_mode.keep": "Garder la confidentialité établie",
+  "settings.side_arm_reply_mode.restrict": "Restreindre la confidentialité de la réponse à celle du post auquel vous répondez",
+  "settings.status_icons": "Icônes des posts",
+  "settings.status_icons_language": "Indicateur de langue",
+  "settings.status_icons_local_only": "Indicateur de post local",
+  "settings.status_icons_media": "Indicateur de médias et sondage",
+  "settings.status_icons_reply": "Indicateur de réponses",
+  "settings.status_icons_visibility": "Indicateur de la confidentialité du post",
+  "settings.swipe_to_change_columns": "Glissement latéral pour changer de colonne (mobile uniquement)",
+  "settings.tag_misleading_links": "Étiqueter les liens trompeurs",
+  "settings.tag_misleading_links.hint": "Ajouter une indication visuelle avec l'hôte cible du lien à chaque lien ne le mentionnant pas explicitement",
+  "settings.wide_view": "Vue élargie (mode ordinateur uniquement)",
+  "settings.wide_view_hint": "Étire les colonnes pour mieux remplir l'espace disponible.",
+  "status.collapse": "Replier",
+  "status.has_audio": "Contient des fichiers audio attachés",
+  "status.has_pictures": "Contient des images attachées",
+  "status.has_preview_card": "Contient une carte de prévisualisation attachée",
+  "status.has_video": "Contient des vidéos attachées",
+  "status.in_reply_to": "Ce post est une réponse",
+  "status.is_poll": "Ce post est un sondage",
+  "status.local_only": "Visible uniquement depuis votre instance",
+  "status.sensitive_toggle": "Cliquer pour voir",
+  "status.uncollapse": "Déplier",
+  "web_app_crash.change_your_settings": "Changez vos {settings}",
+  "web_app_crash.content": "Voici les différentes options qui s'offrent à vous :",
+  "web_app_crash.debug_info": "Informations de débogage",
+  "web_app_crash.disable_addons": "Désactivez les extensions de votre navigateur, ainsi que les outils de traduction intégrés",
+  "web_app_crash.issue_tracker": "traqueur d'erreurs",
+  "web_app_crash.reload": "Rafraichir",
+  "web_app_crash.reload_page": "{reload} la page actuelle",
+  "web_app_crash.report_issue": "Signalez un bug dans le {issuetracker}",
+  "web_app_crash.settings": "paramètres",
+  "web_app_crash.title": "Nous sommes navrés, mais quelque chose s'est mal passé dans l'application Mastodon."
+}
diff --git a/app/javascript/flavours/glitch/locales/fr.js b/app/javascript/flavours/glitch/locales/fr.js
deleted file mode 100644
index 8562f5594..000000000
--- a/app/javascript/flavours/glitch/locales/fr.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/fr.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/fr.json b/app/javascript/flavours/glitch/locales/fr.json
new file mode 100644
index 000000000..383d933b4
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/fr.json
@@ -0,0 +1,200 @@
+{
+  "about.fork_disclaimer": "Glitch-soc est un logiciel gratuit et open source, fork de Mastodon.",
+  "account.add_account_note": "Ajouter une note pour @{name}",
+  "account.disclaimer_full": "Les informations ci-dessous peuvent être incomplètes.",
+  "account.follows": "Abonnements",
+  "account.joined": "Ici depuis {date}",
+  "account.suspended_disclaimer_full": "Cet utilisateur a été suspendu par un modérateur.",
+  "account.view_full_profile": "Voir le profil complet",
+  "account_note.cancel": "Annuler",
+  "account_note.edit": "Éditer",
+  "account_note.glitch_placeholder": "Aucun commentaire fourni",
+  "account_note.save": "Sauvegarder",
+  "advanced_options.icon_title": "Options avancées",
+  "advanced_options.local-only.long": "Ne pas envoyer aux autres instances",
+  "advanced_options.local-only.short": "Uniquement en local",
+  "advanced_options.local-only.tooltip": "Ce post est uniquement local",
+  "advanced_options.threaded_mode.long": "Ouvre automatiquement une réponse lors de la publication",
+  "advanced_options.threaded_mode.short": "Mode thread",
+  "advanced_options.threaded_mode.tooltip": "Mode thread activé",
+  "boost_modal.missing_description": "Ce post contient des médias sans description",
+  "column.favourited_by": "Ajouté en favori par",
+  "column.heading": "Divers",
+  "column.reblogged_by": "Partagé par",
+  "column.subheading": "Autres options",
+  "column_header.profile": "Profil",
+  "column_subheading.lists": "Listes",
+  "column_subheading.navigation": "Navigation",
+  "community.column_settings.allow_local_only": "Afficher seulement les posts locaux",
+  "compose.attach": "Joindre…",
+  "compose.attach.doodle": "Dessiner quelque chose",
+  "compose.attach.upload": "Téléverser un fichier",
+  "compose.content-type.html": "HTML",
+  "compose.content-type.markdown": "Markdown",
+  "compose.content-type.plain": "Text brut",
+  "compose_form.poll.multiple_choices": "Choix multiples",
+  "compose_form.poll.single_choice": "Choix unique",
+  "compose_form.spoiler": "Cacher le texte derrière un avertissement",
+  "confirmation_modal.do_not_ask_again": "Ne plus demander confirmation",
+  "confirmations.deprecated_settings.confirm": "Utiliser les préférences de Mastodon",
+  "confirmations.deprecated_settings.message": "Certaines {app_settings} de glitch-soc que vous utilisez ont été remplacées par les {preferences} de Mastodon et seront remplacées :",
+  "confirmations.missing_media_description.confirm": "Envoyer quand même",
+  "confirmations.missing_media_description.edit": "Modifier le média",
+  "confirmations.missing_media_description.message": "Au moins un média joint manque d'une description. Pensez à décrire tous les médias attachés pour les malvoyant·e·s avant de publier votre post.",
+  "confirmations.unfilter.author": "Auteur",
+  "confirmations.unfilter.confirm": "Afficher",
+  "confirmations.unfilter.edit_filter": "Modifier le filtre",
+  "confirmations.unfilter.filters": "Correspondance avec {count, plural, one {un filtre} other {plusieurs filtres}}",
+  "content-type.change": "Type de contenu",
+  "direct.group_by_conversations": "Grouper par conversation",
+  "endorsed_accounts_editor.endorsed_accounts": "Comptes mis en avant",
+  "favourite_modal.combo": "Vous pouvez appuyer sur {combo} pour passer ceci la prochaine fois",
+  "getting_started.onboarding": "Montre-moi les alentours",
+  "home.column_settings.advanced": "Avancé",
+  "home.column_settings.filter_regex": "Filtrer par expression régulière",
+  "home.column_settings.show_direct": "Afficher les MPs",
+  "home.settings": "Paramètres de la colonne",
+  "keyboard_shortcuts.bookmark": "ajouter aux marque-pages",
+  "keyboard_shortcuts.secondary_toot": "Envoyer le post en utilisant les paramètres secondaires de confidentialité",
+  "keyboard_shortcuts.toggle_collapse": "Plier/déplier les posts",
+  "layout.auto": "Auto",
+  "layout.desktop": "Ordinateur",
+  "layout.hint.auto": "Choisir automatiquement la mise en page selon l'option \"Activer l'interface Web avancée\" et la taille d'écran.",
+  "layout.hint.desktop": "Utiliser la mise en page en plusieurs colonnes indépendamment de l'option \"Activer l'interface Web avancée\" ou de la taille d'écran.",
+  "layout.hint.single": "Utiliser la mise en page à colonne unique indépendamment de l'option \"Activer l'interface Web avancée\" ou de la taille d'écran.",
+  "layout.single": "Téléphone",
+  "media_gallery.sensitive": "Sensible",
+  "moved_to_warning": "Ce compte a déménagé vers {moved_to_link} et ne peut donc plus accepter de nouveaux abonné·e·s.",
+  "navigation_bar.app_settings": "Paramètres de l'application",
+  "navigation_bar.featured_users": "Utilisateurs mis en avant",
+  "navigation_bar.info": "Informations détaillées",
+  "navigation_bar.keyboard_shortcuts": "Raccourcis clavier",
+  "navigation_bar.misc": "Autres",
+  "notification.markForDeletion": "Ajouter aux éléments à supprimer",
+  "notification_purge.btn_all": "Sélectionner\ntout",
+  "notification_purge.btn_apply": "Effacer\nla sélection",
+  "notification_purge.btn_invert": "Inverser\nla sélection",
+  "notification_purge.btn_none": "Annuler\nla sélection",
+  "notification_purge.start": "Activer le mode de nettoyage des notifications",
+  "notifications.marked_clear": "Effacer les notifications sélectionnées",
+  "notifications.marked_clear_confirmation": "Voulez-vous vraiment effacer de manière permanente toutes les notifications sélectionnées ?",
+  "onboarding.done": "Terminé",
+  "onboarding.next": "Suivant",
+  "onboarding.page_five.public_timelines": "Le fil local affiche les posts publics de tout le monde sur {domain}. Le fil global affiche les posts publics de tous les comptes que les personnes de {domain} suivent. Ce sont les fils publics, une façon formidable de découvrir de nouvelles personnes.",
+  "onboarding.page_four.home": "L'accueil affiche les posts des personnes que vous suivez.",
+  "onboarding.page_four.notifications": "La colonne de notifications vous montre lorsque quelqu'un interagit avec vous.",
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_one.handle": "Vous êtes sur {domain}, donc votre nom d'utilisateur complet est {handle}",
+  "onboarding.page_one.welcome": "Bievenue sur {domain} !",
+  "onboarding.page_six.admin": "Votre admin d’instance est {admin}.",
+  "onboarding.page_six.almost_done": "C'est bientôt fini...",
+  "onboarding.page_six.appetoot": "Bon appétoot !",
+  "onboarding.page_six.apps_available": "Il y a des {apps} disponibles pour iOS, Android et d'autres plateformes.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "onboarding.page_six.guidelines": "règles de la communauté",
+  "onboarding.page_six.read_guidelines": "Veuillez lire les {guidelines} de {domain} !",
+  "onboarding.page_six.various_app": "applications mobiles",
+  "onboarding.page_three.profile": "Modifiez votre profil pour changer votre avatar, biographie et nom public. Ici, vous trouverez également d'autres options.",
+  "onboarding.page_three.search": "Utilisez la barre de recherche pour trouver des personnes et regarder les hashtags comme {illustration} et {introductions}. Pour chercher une personne n'étant pas sur cette instance, utilisez son nom d'utilisateur complet.",
+  "onboarding.page_two.compose": "Écrivez des posts depuis la colonne de rédaction. Vous pouvez téléverser des images, changer la confidentialité et ajouter des avertissements de contenu avec les boutons ci-dessous.",
+  "onboarding.skip": "Passer",
+  "settings.always_show_spoilers_field": "Toujours activer le champ de rédaction de l'avertissement de contenu",
+  "settings.auto_collapse": "Repliage automatique",
+  "settings.auto_collapse_all": "Tout",
+  "settings.auto_collapse_lengthy": "Posts longs",
+  "settings.auto_collapse_media": "Posts avec média",
+  "settings.auto_collapse_notifications": "Notifications",
+  "settings.auto_collapse_reblogs": "Boosts",
+  "settings.auto_collapse_replies": "Réponses",
+  "settings.close": "Fermer",
+  "settings.collapsed_statuses": "Posts repliés",
+  "settings.compose_box_opts": "Zone de rédaction",
+  "settings.confirm_before_clearing_draft": "Afficher une fenêtre de confirmation avant d'écraser le message en cours de rédaction",
+  "settings.confirm_boost_missing_media_description": "Afficher une fenêtre de confirmation avant de partager des posts manquant de description des médias",
+  "settings.confirm_missing_media_description": "Afficher une fenêtre de confirmation avant de publier des posts manquant de description de média",
+  "settings.content_warnings": "Content warnings",
+  "settings.content_warnings.regexp": "Expression rationnelle",
+  "settings.content_warnings_filter": "Avertissement de contenu à ne pas automatiquement déplier :",
+  "settings.content_warnings_media_outside": "Afficher les médias en dehors des avertissements de contenu",
+  "settings.content_warnings_media_outside_hint": "Reproduit le comportement par défaut de Mastodon, les médias attachés ne sont plus affectés par le bouton d'affichage d'un post avec avertissement",
+  "settings.content_warnings_shared_state": "Affiche/cache le contenu de toutes les copies à la fois",
+  "settings.content_warnings_shared_state_hint": "Reproduit le comportement par défaut de Mastodon, le bouton d'avertissement de contenu affecte toutes les copies d'un post à la fois. Cela empêchera le repliement automatique de n'importe quelle copie d'un post avec un avertissement déplié",
+  "settings.content_warnings_unfold_opts": "Options de dépliement automatique",
+  "settings.deprecated_setting": "Cette option est maintenant définie par les {settings_page_link} de Mastodon",
+  "settings.enable_collapsed": "Activer le repliement des posts",
+  "settings.enable_collapsed_hint": "Les posts repliés ont une partie de leur contenu caché pour libérer de l'espace sur l'écran. C'est une option différente de l'avertissement de contenu",
+  "settings.enable_content_warnings_auto_unfold": "Déplier automatiquement les avertissements de contenu",
+  "settings.general": "Général",
+  "settings.hicolor_privacy_icons": "Indicateurs de confidentialité en couleurs",
+  "settings.hicolor_privacy_icons.hint": "Affiche les indicateurs de confidentialité dans des couleurs facilement distinguables",
+  "settings.image_backgrounds": "Images en arrière-plan",
+  "settings.image_backgrounds_media": "Prévisualiser les médias d'un post replié",
+  "settings.image_backgrounds_media_hint": "Si le post a un média attaché, utiliser le premier comme arrière-plan du post",
+  "settings.image_backgrounds_users": "Donner aux posts repliés une image en arrière-plan",
+  "settings.inline_preview_cards": "Cartes d'aperçu pour les liens externes",
+  "settings.layout": "Mise en page :",
+  "settings.layout_opts": "Mise en page",
+  "settings.media": "Média",
+  "settings.media_fullwidth": "Utiliser toute la largeur pour les aperçus",
+  "settings.media_letterbox": "Afficher les médias en Letterbox",
+  "settings.media_letterbox_hint": "Réduit le média et utilise une letterbox pour afficher l'image entière plutôt que de l'étirer et de la rogner",
+  "settings.media_reveal_behind_cw": "Toujours afficher les médias sensibles avec avertissement",
+  "settings.notifications.favicon_badge": "Badge de notifications non lues dans la favicon",
+  "settings.notifications.favicon_badge.hint": "Ajoute un badge dans la favicon pour alerter d'une notification non lue",
+  "settings.notifications.tab_badge": "Badge de notifications non lues",
+  "settings.notifications.tab_badge.hint": "Affiche un badge de notifications non lues dans les icônes des colonnes quand la colonne n'est pas ouverte",
+  "settings.notifications_opts": "Options des notifications",
+  "settings.pop_in_left": "Gauche",
+  "settings.pop_in_player": "Activer le lecteur pop-in",
+  "settings.pop_in_position": "Position du lecteur pop-in :",
+  "settings.pop_in_right": "Droite",
+  "settings.preferences": "Preferences",
+  "settings.prepend_cw_re": "Préfixer les avertissements avec \"re: \" lors d'une réponse",
+  "settings.preselect_on_reply": "Présélectionner les noms d’utilisateur·rices lors de la réponse",
+  "settings.preselect_on_reply_hint": "Présélectionner les noms d'utilisateurs après le premier lors d'une réponse à une conversation à plusieurs participants",
+  "settings.rewrite_mentions": "Réécrire les mentions dans les posts affichés",
+  "settings.rewrite_mentions_acct": "Réécrire avec le nom d'utilisateur·rice et le domaine (lorsque le compte est distant)",
+  "settings.rewrite_mentions_no": "Ne pas réécrire les mentions",
+  "settings.rewrite_mentions_username": "Réécrire avec le nom d’utilisateur·rice",
+  "settings.shared_settings_link": "préférences de l'utilisateur",
+  "settings.show_action_bar": "Afficher les boutons d'action dans les posts repliés",
+  "settings.show_content_type_choice": "Afficher le choix du type de contenu lors de la création des posts",
+  "settings.show_reply_counter": "Afficher une estimation du nombre de réponses",
+  "settings.side_arm": "Bouton secondaire de publication :",
+  "settings.side_arm.none": "Aucun",
+  "settings.side_arm_reply_mode": "Quand vous répondez à un post, le bouton secondaire de publication devrait :",
+  "settings.side_arm_reply_mode.copy": "Copier la confidentialité du post auquel vous répondez",
+  "settings.side_arm_reply_mode.keep": "Garder la confidentialité établie",
+  "settings.side_arm_reply_mode.restrict": "Restreindre la confidentialité de la réponse à celle du post auquel vous répondez",
+  "settings.status_icons": "Icônes des posts",
+  "settings.status_icons_language": "Indicateur de langue",
+  "settings.status_icons_local_only": "Indicateur de post local",
+  "settings.status_icons_media": "Indicateur de médias et sondage",
+  "settings.status_icons_reply": "Indicateur de réponses",
+  "settings.status_icons_visibility": "Indicateur de la confidentialité du post",
+  "settings.swipe_to_change_columns": "Glissement latéral pour changer de colonne (mobile uniquement)",
+  "settings.tag_misleading_links": "Étiqueter les liens trompeurs",
+  "settings.tag_misleading_links.hint": "Ajouter une indication visuelle avec l'hôte cible du lien à chaque lien ne le mentionnant pas explicitement",
+  "settings.wide_view": "Vue élargie (mode ordinateur uniquement)",
+  "settings.wide_view_hint": "Étire les colonnes pour mieux remplir l'espace disponible.",
+  "status.collapse": "Replier",
+  "status.has_audio": "Contient des fichiers audio attachés",
+  "status.has_pictures": "Contient des images attachées",
+  "status.has_preview_card": "Contient une carte de prévisualisation attachée",
+  "status.has_video": "Contient des vidéos attachées",
+  "status.in_reply_to": "Ce post est une réponse",
+  "status.is_poll": "Ce post est un sondage",
+  "status.local_only": "Visible uniquement depuis votre instance",
+  "status.sensitive_toggle": "Cliquer pour voir",
+  "status.uncollapse": "Déplier",
+  "web_app_crash.change_your_settings": "Changez vos {settings}",
+  "web_app_crash.content": "Voici les différentes options qui s'offrent à vous :",
+  "web_app_crash.debug_info": "Informations de débogage",
+  "web_app_crash.disable_addons": "Désactivez les extensions de votre navigateur, ainsi que les outils de traduction intégrés",
+  "web_app_crash.issue_tracker": "traqueur d'erreurs",
+  "web_app_crash.reload": "Rafraichir",
+  "web_app_crash.reload_page": "{reload} la page actuelle",
+  "web_app_crash.report_issue": "Signalez un bug dans le {issuetracker}",
+  "web_app_crash.settings": "paramètres",
+  "web_app_crash.title": "Nous sommes navrés, mais quelque chose s'est mal passé dans l'application Mastodon."
+}
diff --git a/app/javascript/flavours/glitch/locales/fy.json b/app/javascript/flavours/glitch/locales/fy.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/fy.json
@@ -0,0 +1 @@
+{}
diff --git a/app/javascript/flavours/glitch/locales/ga.js b/app/javascript/flavours/glitch/locales/ga.js
deleted file mode 100644
index af2846ff8..000000000
--- a/app/javascript/flavours/glitch/locales/ga.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ga.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ga.json b/app/javascript/flavours/glitch/locales/ga.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ga.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/gd.js b/app/javascript/flavours/glitch/locales/gd.js
deleted file mode 100644
index 604ee86dc..000000000
--- a/app/javascript/flavours/glitch/locales/gd.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/gd.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/gd.json b/app/javascript/flavours/glitch/locales/gd.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/gd.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/gl.js b/app/javascript/flavours/glitch/locales/gl.js
deleted file mode 100644
index 6a9140b1a..000000000
--- a/app/javascript/flavours/glitch/locales/gl.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/gl.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/gl.json b/app/javascript/flavours/glitch/locales/gl.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/gl.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/he.js b/app/javascript/flavours/glitch/locales/he.js
deleted file mode 100644
index 99516ee0c..000000000
--- a/app/javascript/flavours/glitch/locales/he.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/he.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/he.json b/app/javascript/flavours/glitch/locales/he.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/he.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/hi.js b/app/javascript/flavours/glitch/locales/hi.js
deleted file mode 100644
index 1a569495f..000000000
--- a/app/javascript/flavours/glitch/locales/hi.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/hi.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/hi.json b/app/javascript/flavours/glitch/locales/hi.json
new file mode 100644
index 000000000..f6eb75f84
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/hi.json
@@ -0,0 +1,18 @@
+{
+  "about.fork_disclaimer": "ग्लिच-सोक एक मुफ्त और ओपन सोर्स सॉफ़्टवेर है जो मैस्टोडॉन से फोर्क किया गया है",
+  "account.add_account_note": "@{name} के लिए कोई नोट लिखें",
+  "account.follows": "फ़ॉलोज़",
+  "account.joined": "ज़ोईन करने की {date}",
+  "account.suspended_disclaimer_full": "यह यूज़र एक मॉडरेटर द्वारा सस्पेंड कर दिया गया है",
+  "account.view_full_profile": "पूरी प्रोफ़ाइल देखें",
+  "account_note.cancel": "कैन्सल",
+  "account_note.edit": "एडिट या सम्पादन करें",
+  "account_note.glitch_placeholder": "कोई कॉमेंट नहीं दिया गया है",
+  "account_note.save": "सेव",
+  "advanced_options.icon_title": "एडवांस्ड ऑप्शन्स",
+  "advanced_options.local-only.long": "दूसरे इंस्टेंसों में पोस्ट ना करें",
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/hr.js b/app/javascript/flavours/glitch/locales/hr.js
deleted file mode 100644
index dbf9b4b9f..000000000
--- a/app/javascript/flavours/glitch/locales/hr.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/hr.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/hr.json b/app/javascript/flavours/glitch/locales/hr.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/hr.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/hu.js b/app/javascript/flavours/glitch/locales/hu.js
deleted file mode 100644
index 1f0849af3..000000000
--- a/app/javascript/flavours/glitch/locales/hu.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/hu.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/hu.json b/app/javascript/flavours/glitch/locales/hu.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/hu.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/hy.js b/app/javascript/flavours/glitch/locales/hy.js
deleted file mode 100644
index 96f6a4d19..000000000
--- a/app/javascript/flavours/glitch/locales/hy.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/hy.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/hy.json b/app/javascript/flavours/glitch/locales/hy.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/hy.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/id.js b/app/javascript/flavours/glitch/locales/id.js
deleted file mode 100644
index 07e5f7e56..000000000
--- a/app/javascript/flavours/glitch/locales/id.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/id.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/id.json b/app/javascript/flavours/glitch/locales/id.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/id.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/ig.json b/app/javascript/flavours/glitch/locales/ig.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ig.json
@@ -0,0 +1 @@
+{}
diff --git a/app/javascript/flavours/glitch/locales/io.js b/app/javascript/flavours/glitch/locales/io.js
deleted file mode 100644
index 74ea6fae6..000000000
--- a/app/javascript/flavours/glitch/locales/io.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/io.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/io.json b/app/javascript/flavours/glitch/locales/io.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/io.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/is.js b/app/javascript/flavours/glitch/locales/is.js
deleted file mode 100644
index b05a08ad0..000000000
--- a/app/javascript/flavours/glitch/locales/is.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/is.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/is.json b/app/javascript/flavours/glitch/locales/is.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/is.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/it.js b/app/javascript/flavours/glitch/locales/it.js
deleted file mode 100644
index 90f543093..000000000
--- a/app/javascript/flavours/glitch/locales/it.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/it.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/it.json b/app/javascript/flavours/glitch/locales/it.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/it.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/ja.js b/app/javascript/flavours/glitch/locales/ja.js
deleted file mode 100644
index 52aeed3d6..000000000
--- a/app/javascript/flavours/glitch/locales/ja.js
+++ /dev/null
@@ -1,158 +0,0 @@
-import inherited from 'mastodon/locales/ja.json';
-
-const messages = {
-  'getting_started.open_source_notice': 'Glitchsocは{Mastodon}によるフリーなオープンソースソフトウェアです。誰でもGitHub({github})から開発に參加したり、問題を報告したりできます。',
-  'layout.auto': '自動',
-  'layout.current_is': 'あなたの現在のレイアウト:',
-  'layout.desktop': 'デスクトップ',
-  'layout.single': 'モバイル',
-  'navigation_bar.app_settings': 'アプリ設定',
-  'navigation_bar.featured_users': '紹介しているアカウント',
-  'navigation_bar.misc': 'その他',
-  'getting_started.onboarding': '解説を表示',
-  'onboarding.page_one.federation': '{domain}はMastodonのインスタンスです。Mastodonとは、独立したサーバが連携して作るソーシャルネットワークです。これらのサーバーをインスタンスと呼びます。',
-  'onboarding.page_one.welcome': '{domain}へようこそ!',
-  'onboarding.page_six.github': '{domain}はGlitchsocを使用しています。Glitchsocは{Mastodon}のフレンドリーな{fork}で、どんなMastodonアプリやインスタンスとも互換性があります。Glitchsocは完全に無料で、オープンソースです。{github}でバグ報告や機能要望あるいは貢獻をすることが可能です。',
-  'settings.always_show_spoilers_field': '常にコンテンツワーニング設定を表示する(指定がない場合は通常投稿)',
-  'settings.auto_collapse': '自動折りたたみ',
-  'settings.auto_collapse_all': 'すべて',
-  'settings.auto_collapse_lengthy': '長いトゥート',
-  'settings.auto_collapse_media': 'メディア付きトゥート',
-  'settings.auto_collapse_notifications': '通知',
-  'settings.auto_collapse_reblogs': 'ブースト',
-  'settings.auto_collapse_replies': '返信',
-  'settings.close': '閉じる',
-  'settings.collapsed_statuses': 'トゥート折りたたみ',
-  'settings.confirm_missing_media_description': '画像に対する補助記載がないときに投稿前の警告を表示する',
-  'settings.content_warnings': 'コンテンツワーニング',
-  'settings.content_warnings_filter': '説明に指定した文字が含まれているものを自動で展開しないようにする',
-  'settings.content_warnings.regexp': '正規表現',
-  'settings.enable_collapsed': 'トゥート折りたたみを有効にする',
-  'settings.enable_content_warnings_auto_unfold': 'コンテンツワーニング指定されている投稿を常に表示する',
-  'settings.general': '一般',
-  'settings.image_backgrounds': '画像背景',
-  'settings.image_backgrounds_media': '折りたまれたメディア付きトゥートをプレビュー',
-  'settings.image_backgrounds_users': '折りたまれたトゥートの背景を変更する',
-  'settings.media': 'メディア',
-  'settings.media_letterbox': 'メディアをレターボックス式で表示',
-  'settings.media_fullwidth': '全幅メディアプレビュー',
-  'settings.navbar_under': 'ナビを画面下部に移動させる(モバイル レイアウトのみ)',
-  'settings.notifications.favicon_badge': '通知アイコンに未読件数を表示する',
-  'settings.notifications_opts': '通知の設定',
-  'settings.notifications.tab_badge': '未読の通知があるとき、通知アイコンにマークを表示する',
-  'settings.preferences': 'ユーザー設定',
-  'settings.wide_view': 'ワイドビュー(デスクトップ レイアウトのみ)',
-  'settings.compose_box_opts': 'コンポーズボックス設定',
-  'settings.show_reply_counter': '投稿に対するリプライの数を表示する',
-  'settings.side_arm': 'セカンダリートゥートボタン',
-  'settings.side_arm.none': '表示しない',
-  'settings.side_arm_reply_mode': '返信時の投稿範囲',
-  'settings.side_arm_reply_mode.copy': '返信先の投稿範囲を利用する',
-  'settings.side_arm_reply_mode.keep': 'セカンダリートゥートボタンの設定を維持する',
-  'settings.side_arm_reply_mode.restrict': '返信先の投稿範囲に制限する',
-  'settings.layout': 'レイアウト',
-  'settings.layout_opts': 'レイアウトの設定',
-  'status.collapse': '折りたたむ',
-  'status.uncollapse': '折りたたみを解除',
-
-  'confirmations.missing_media_description.message': '少なくとも1つの画像に視覚障害者のための画像説明が付与されていません。すべての画像に対して説明を付与することを望みます。',
-  'confirmations.missing_media_description.confirm': 'このまま投稿',
-  'confirmations.missing_media_description.edit': 'メディアを編集',
-
-  'favourite_modal.combo': '次からは {combo} を押せば、これをスキップできます。',
-
-  'home.column_settings.show_direct': 'DMを表示',
-  'home.column_settings.advanced': '高度',
-  'home.column_settings.filter_regex': '正規表現でフィルター',
-
-  'notification.markForDeletion': '選択',
-  'notifications.clear': '通知を全てクリアする',
-  'notifications.marked_clear_confirmation': '削除した全ての通知を完全に削除してもよろしいですか?',
-  'notifications.marked_clear': '選択した通知を削除する',
-
-  'notification_purge.btn_all': 'すべて\n選択',
-  'notification_purge.btn_none': '選択\n解除',
-  'notification_purge.btn_invert': '選択を\n反転',
-  'notification_purge.btn_apply': '選択したものを\n削除',
-
-  'compose.attach.upload': 'ファイルをアップロード',
-  'compose.attach.doodle': 'お絵描きをする',
-  'compose.attach': '添付...',
-
-  'advanced_options.local-only.short': 'ローカル限定',
-  'advanced_options.local-only.long': '他のインスタンスには投稿されません',
-  'advanced_options.local-only.tooltip': 'この投稿はローカル限定投稿です',
-  'advanced_options.icon_title': '高度な設定',
-  'advanced_options.threaded_mode.short': 'スレッドモード',
-  'advanced_options.threaded_mode.long': '投稿時に自動的に返信するように設定します',
-  'advanced_options.threaded_mode.tooltip': 'スレッドモードを有効にする',
-
-  'navigation_bar.direct': 'ダイレクトメッセージ',
-  'navigation_bar.bookmarks': 'ブックマーク',
-  'column.bookmarks': 'ブックマーク',
-
-  'account.add_account_note': '@{name}のメモを追加',
-  'account.disclaimer_full': 'このユーザー情報は不正確な可能性があります。',
-  'account.follows': 'フォロー',
-  'account.suspended_disclaimer_full': 'このユーザーはモデレータにより停止されました。',
-  'account.view_full_profile': '正確な情報を見る',
-  'account_note.cancel': 'キャンセル',
-  'account_note.edit': '編集',
-  'account_note.glitch_placeholder': 'メモがありません',
-  'account_note.save': '保存',
-  'boost_modal.missing_description': 'このトゥートには少なくとも1つの画像に説明が付与されていません',
-  'community.column_settings.allow_local_only': 'ローカル限定投稿を表示する',
-  'compose.content-type.html': 'HTML',
-  'compose.content-type.markdown': 'マークダウン',
-  'compose.content-type.plain': 'プレーンテキスト',
-  'compose_form.poll.multiple_choices': '複数回答を許可',
-  'compose_form.poll.single_choice': '単一回答を許可',
-  'compose_form.spoiler': '本文は警告の後ろに隠す',
-  'confirmation_modal.do_not_ask_again': 'もう1度尋ねない',
-  'confirmations.discard_edit_media.confirm': '破棄',
-  'confirmations.discard_edit_media.message': 'メディアの説明・プレビューに保存していない変更があります。破棄してもよろしいですか?',
-  'confirmations.unfilter': 'このフィルターされたトゥートについての情報',
-  'confirmations.unfilter.author': '筆者',
-  'confirmations.unfilter.confirm': '見る',
-  'confirmations.unfilter.edit_filter': 'フィルターを編集',
-  'confirmations.unfilter.filters': '適用されたフィルター',
-  'content-type.change': 'コンテンツ形式を変更',
-  'direct.conversations_mode': '会話',
-  'direct.timeline_mode': 'タイムライン',
-  'endorsed_accounts_editor.endorsed_accounts': '紹介しているユーザー',
-  'keyboard_shortcuts.bookmark': 'ブックマーク',
-  'keyboard_shortcuts.secondary_toot': 'セカンダリートゥートの公開範囲でトゥートする',
-  'keyboard_shortcuts.toggle_collapse': '折りたたむ/折りたたみを解除',
-  'moved_to_warning': 'このアカウント{moved_to_link}に引っ越したため、新しいフォロワーを受け入れていません。',
-  'settings.show_action_bar': 'アクションバーを表示',
-  'settings.filtering_behavior': 'フィルターの振る舞い',
-  'settings.filtering_behavior.cw': '警告文にフィルターされた単語を付加して表示します',
-  'settings.filtering_behavior.drop': 'フィルターされたトゥートを完全に隠します',
-  'settings.filtering_behavior.hide': '\'フィルターされました\'とその理由を確認するボタンを表示する',
-  'settings.filtering_behavior.upstream': '\'フィルターされました\'とバニラMastodonと同じように表示する',
-  'settings.filters': 'フィルター',
-  'settings.hicolor_privacy_icons': 'ハイカラーの公開範囲アイコン',
-  'settings.hicolor_privacy_icons.hint': '公開範囲アイコンを明るく表示し見分けやすい色にします',
-  'settings.confirm_boost_missing_media_description': 'メディアの説明が欠けているトゥートをブーストする前に確認ダイアログを表示する',
-  'settings.tag_misleading_links': '誤解を招くリンクにタグをつける',
-  'settings.tag_misleading_links.hint': '明示的に言及していないすべてのリンクに、リンクターゲットホストを含む視覚的な表示を追加します',
-  'settings.rewrite_mentions': '表示されたトゥートの返信先表示を書き換える',
-  'settings.rewrite_mentions_acct': 'ユーザー名とドメイン名(アカウントがリモートの場合)を表示するように書き換える',
-  'settings.rewrite_mentions_no': '書き換えない',
-  'settings.rewrite_mentions_username': 'ユーザー名を表示するように書き換える',
-  'settings.swipe_to_change_columns': 'スワイプでカラムを切り替え可能にする(モバイルのみ)',
-  'settings.prepend_cw_re': '返信するとき警告に "re: "を付加する',
-  'settings.preselect_on_reply': '返信するときユーザー名を事前選択する',
-  'settings.confirm_before_clearing_draft': '作成しているメッセージが上書きされる前に確認ダイアログを表示する',
-  'settings.show_content_type_choice': 'トゥートを書くときコンテンツ形式の選択ボタンを表示する',
-  'settings.inline_preview_cards': '外部リンクに埋め込みプレビューを有効にする',
-  'settings.media_reveal_behind_cw': '既定で警告指定されているトゥートの閲覧注意メディアを表示する',
-  'settings.pop_in_left': '左',
-  'settings.pop_in_player': 'ポップインプレイヤーを有効化する',
-  'settings.pop_in_position': 'ポップインプレーヤーの位置:',
-  'settings.pop_in_right': '右',
-  'status.show_filter_reason': '(理由を見る)',
-
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ja.json b/app/javascript/flavours/glitch/locales/ja.json
new file mode 100644
index 000000000..610cd7525
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ja.json
@@ -0,0 +1,124 @@
+{
+  "account.add_account_note": "@{name}のメモを追加",
+  "account.disclaimer_full": "このユーザー情報は不正確な可能性があります。",
+  "account.follows": "フォロー",
+  "account.suspended_disclaimer_full": "このユーザーはモデレータにより停止されました。",
+  "account.view_full_profile": "正確な情報を見る",
+  "account_note.cancel": "キャンセル",
+  "account_note.edit": "編集",
+  "account_note.glitch_placeholder": "メモがありません",
+  "account_note.save": "保存",
+  "advanced_options.icon_title": "高度な設定",
+  "advanced_options.local-only.long": "他のインスタンスには投稿されません",
+  "advanced_options.local-only.short": "ローカル限定",
+  "advanced_options.local-only.tooltip": "この投稿はローカル限定投稿です",
+  "advanced_options.threaded_mode.long": "投稿時に自動的に返信するように設定します",
+  "advanced_options.threaded_mode.short": "スレッドモード",
+  "advanced_options.threaded_mode.tooltip": "スレッドモードを有効にする",
+  "boost_modal.missing_description": "このトゥートには少なくとも1つの画像に説明が付与されていません",
+  "community.column_settings.allow_local_only": "ローカル限定投稿を表示する",
+  "compose.attach": "添付...",
+  "compose.attach.doodle": "お絵描きをする",
+  "compose.attach.upload": "ファイルをアップロード",
+  "compose.content-type.markdown": "マークダウン",
+  "compose.content-type.plain": "プレーンテキスト",
+  "compose_form.poll.multiple_choices": "複数回答を許可",
+  "compose_form.poll.single_choice": "単一回答を許可",
+  "compose_form.spoiler": "本文は警告の後ろに隠す",
+  "confirmation_modal.do_not_ask_again": "もう1度尋ねない",
+  "confirmations.missing_media_description.confirm": "このまま投稿",
+  "confirmations.missing_media_description.edit": "メディアを編集",
+  "confirmations.missing_media_description.message": "少なくとも1つの画像に視覚障害者のための画像説明が付与されていません。すべての画像に対して説明を付与することを望みます。",
+  "confirmations.unfilter.author": "筆者",
+  "confirmations.unfilter.confirm": "見る",
+  "confirmations.unfilter.edit_filter": "フィルターを編集",
+  "confirmations.unfilter.filters": "適用されたフィルター",
+  "content-type.change": "コンテンツ形式を変更",
+  "endorsed_accounts_editor.endorsed_accounts": "紹介しているユーザー",
+  "favourite_modal.combo": "次からは {combo} を押せば、これをスキップできます。",
+  "getting_started.onboarding": "解説を表示",
+  "home.column_settings.advanced": "高度",
+  "home.column_settings.filter_regex": "正規表現でフィルター",
+  "home.column_settings.show_direct": "DMを表示",
+  "keyboard_shortcuts.bookmark": "ブックマーク",
+  "keyboard_shortcuts.secondary_toot": "セカンダリートゥートの公開範囲でトゥートする",
+  "keyboard_shortcuts.toggle_collapse": "折りたたむ/折りたたみを解除",
+  "layout.auto": "自動",
+  "layout.desktop": "デスクトップ",
+  "layout.single": "モバイル",
+  "moved_to_warning": "このアカウント{moved_to_link}に引っ越したため、新しいフォロワーを受け入れていません。",
+  "navigation_bar.app_settings": "アプリ設定",
+  "navigation_bar.featured_users": "紹介しているアカウント",
+  "navigation_bar.misc": "その他",
+  "notification.markForDeletion": "選択",
+  "notification_purge.btn_all": "すべて\n選択",
+  "notification_purge.btn_apply": "選択したものを\n削除",
+  "notification_purge.btn_invert": "選択を\n反転",
+  "notification_purge.btn_none": "選択\n解除",
+  "notifications.marked_clear": "選択した通知を削除する",
+  "notifications.marked_clear_confirmation": "削除した全ての通知を完全に削除してもよろしいですか?",
+  "onboarding.page_one.federation": "{domain}はMastodonのインスタンスです。Mastodonとは、独立したサーバが連携して作るソーシャルネットワークです。これらのサーバーをインスタンスと呼びます。",
+  "onboarding.page_one.welcome": "{domain}へようこそ!",
+  "onboarding.page_six.github": "{domain}はGlitchsocを使用しています。Glitchsocは{Mastodon}のフレンドリーな{fork}で、どんなMastodonアプリやインスタンスとも互換性があります。Glitchsocは完全に無料で、オープンソースです。{github}でバグ報告や機能要望あるいは貢獻をすることが可能です。",
+  "settings.always_show_spoilers_field": "常にコンテンツワーニング設定を表示する(指定がない場合は通常投稿)",
+  "settings.auto_collapse": "自動折りたたみ",
+  "settings.auto_collapse_all": "すべて",
+  "settings.auto_collapse_lengthy": "長いトゥート",
+  "settings.auto_collapse_media": "メディア付きトゥート",
+  "settings.auto_collapse_notifications": "通知",
+  "settings.auto_collapse_reblogs": "ブースト",
+  "settings.auto_collapse_replies": "返信",
+  "settings.close": "閉じる",
+  "settings.collapsed_statuses": "トゥート折りたたみ",
+  "settings.compose_box_opts": "コンポーズボックス設定",
+  "settings.confirm_before_clearing_draft": "作成しているメッセージが上書きされる前に確認ダイアログを表示する",
+  "settings.confirm_boost_missing_media_description": "メディアの説明が欠けているトゥートをブーストする前に確認ダイアログを表示する",
+  "settings.confirm_missing_media_description": "画像に対する補助記載がないときに投稿前の警告を表示する",
+  "settings.content_warnings": "コンテンツワーニング",
+  "settings.content_warnings.regexp": "正規表現",
+  "settings.content_warnings_filter": "説明に指定した文字が含まれているものを自動で展開しないようにする",
+  "settings.enable_collapsed": "トゥート折りたたみを有効にする",
+  "settings.enable_content_warnings_auto_unfold": "コンテンツワーニング指定されている投稿を常に表示する",
+  "settings.general": "一般",
+  "settings.hicolor_privacy_icons": "ハイカラーの公開範囲アイコン",
+  "settings.hicolor_privacy_icons.hint": "公開範囲アイコンを明るく表示し見分けやすい色にします",
+  "settings.image_backgrounds": "画像背景",
+  "settings.image_backgrounds_media": "折りたまれたメディア付きトゥートをプレビュー",
+  "settings.image_backgrounds_users": "折りたまれたトゥートの背景を変更する",
+  "settings.inline_preview_cards": "外部リンクに埋め込みプレビューを有効にする",
+  "settings.layout": "レイアウト",
+  "settings.layout_opts": "レイアウトの設定",
+  "settings.media": "メディア",
+  "settings.media_fullwidth": "全幅メディアプレビュー",
+  "settings.media_letterbox": "メディアをレターボックス式で表示",
+  "settings.media_reveal_behind_cw": "既定で警告指定されているトゥートの閲覧注意メディアを表示する",
+  "settings.notifications.favicon_badge": "通知アイコンに未読件数を表示する",
+  "settings.notifications.tab_badge": "未読の通知があるとき、通知アイコンにマークを表示する",
+  "settings.notifications_opts": "通知の設定",
+  "settings.pop_in_left": "左",
+  "settings.pop_in_player": "ポップインプレイヤーを有効化する",
+  "settings.pop_in_position": "ポップインプレーヤーの位置:",
+  "settings.pop_in_right": "右",
+  "settings.preferences": "ユーザー設定",
+  "settings.prepend_cw_re": "返信するとき警告に \"re: \"を付加する",
+  "settings.preselect_on_reply": "返信するときユーザー名を事前選択する",
+  "settings.rewrite_mentions": "表示されたトゥートの返信先表示を書き換える",
+  "settings.rewrite_mentions_acct": "ユーザー名とドメイン名(アカウントがリモートの場合)を表示するように書き換える",
+  "settings.rewrite_mentions_no": "書き換えない",
+  "settings.rewrite_mentions_username": "ユーザー名を表示するように書き換える",
+  "settings.show_action_bar": "アクションバーを表示",
+  "settings.show_content_type_choice": "トゥートを書くときコンテンツ形式の選択ボタンを表示する",
+  "settings.show_reply_counter": "投稿に対するリプライの数を表示する",
+  "settings.side_arm": "セカンダリートゥートボタン",
+  "settings.side_arm.none": "表示しない",
+  "settings.side_arm_reply_mode": "返信時の投稿範囲",
+  "settings.side_arm_reply_mode.copy": "返信先の投稿範囲を利用する",
+  "settings.side_arm_reply_mode.keep": "セカンダリートゥートボタンの設定を維持する",
+  "settings.side_arm_reply_mode.restrict": "返信先の投稿範囲に制限する",
+  "settings.swipe_to_change_columns": "スワイプでカラムを切り替え可能にする(モバイルのみ)",
+  "settings.tag_misleading_links": "誤解を招くリンクにタグをつける",
+  "settings.tag_misleading_links.hint": "明示的に言及していないすべてのリンクに、リンクターゲットホストを含む視覚的な表示を追加します",
+  "settings.wide_view": "ワイドビュー(デスクトップ レイアウトのみ)",
+  "status.collapse": "折りたたむ",
+  "status.uncollapse": "折りたたみを解除"
+}
diff --git a/app/javascript/flavours/glitch/locales/ka.js b/app/javascript/flavours/glitch/locales/ka.js
deleted file mode 100644
index 3e06f4282..000000000
--- a/app/javascript/flavours/glitch/locales/ka.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ka.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ka.json b/app/javascript/flavours/glitch/locales/ka.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ka.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/kab.js b/app/javascript/flavours/glitch/locales/kab.js
deleted file mode 100644
index 5ed1156ef..000000000
--- a/app/javascript/flavours/glitch/locales/kab.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/kab.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/kab.json b/app/javascript/flavours/glitch/locales/kab.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/kab.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/kk.js b/app/javascript/flavours/glitch/locales/kk.js
deleted file mode 100644
index 8d00fb035..000000000
--- a/app/javascript/flavours/glitch/locales/kk.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/kk.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/kk.json b/app/javascript/flavours/glitch/locales/kk.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/kk.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/kn.js b/app/javascript/flavours/glitch/locales/kn.js
deleted file mode 100644
index 1c50e3628..000000000
--- a/app/javascript/flavours/glitch/locales/kn.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/kn.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/kn.json b/app/javascript/flavours/glitch/locales/kn.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/kn.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/ko.js b/app/javascript/flavours/glitch/locales/ko.js
deleted file mode 100644
index a817044c1..000000000
--- a/app/javascript/flavours/glitch/locales/ko.js
+++ /dev/null
@@ -1,208 +0,0 @@
-import inherited from 'mastodon/locales/ko.json';
-
-const messages = {
-  'account.add_account_note': '@{name} 님에 대한 메모 추가',
-  'account.disclaimer_full': '아래에 있는 정보들은 사용자의 프로필을 완벽하게 나타내지 못하고 있을 수도 있습니다.',
-  'account.follows': '팔로우',
-  'account.suspended_disclaimer_full': '이 사용자는 중재자에 의해 정지되었습니다.',
-  'account.view_full_profile': '전체 프로필 보기',
-  'account_note.cancel': '취소',
-  'account_note.edit': '편집',
-  'account_note.glitch_placeholder': '코멘트가 없습니다',
-  'account_note.save': '저장',
-  'advanced_options.icon_title': '고급 옵션',
-  'advanced_options.local-only.long': '다른 서버에 게시하지 않기',
-  'advanced_options.local-only.short': '로컬 전용',
-  'advanced_options.local-only.tooltip': '이 게시물은 로컬 전용입니다',
-  'advanced_options.threaded_mode.long': '글을 작성하고 자동으로 답글 열기',
-  'advanced_options.threaded_mode.short': '글타래 모드',
-  'advanced_options.threaded_mode.tooltip': '글타래 모드 활성화됨',
-  'boost_modal.missing_description': '이 게시물은 설명이 없는 미디어를 포함하고 있습니다',
-  'column.favourited_by': '즐겨찾기 한 사람',
-  'column.heading': '기타',
-  'column.reblogged_by': '부스트 한 사람',
-  'column.subheading': '다양한 옵션',
-  'column.toot': '게시물과 답글',
-  'column_header.profile': '프로필',
-  'column_subheading.lists': '리스트',
-  'column_subheading.navigation': '탐색',
-  'community.column_settings.allow_local_only': '로컬 전용 글 보기',
-  'compose.attach': '첨부…',
-  'compose.attach.doodle': '뭔가 그려보세요',
-  'compose.attach.upload': '파일 업로드',
-  'compose.content-type.html': 'HTML',
-  'compose.content-type.markdown': '마크다운',
-  'compose.content-type.plain': '일반 텍스트',
-  'compose_form.poll.multiple_choices': '여러 개 선택 가능',
-  'compose_form.poll.single_choice': '하나만 선택 가능',
-  'compose_form.spoiler': '경고 메시지로 숨기기',
-  'confirmation_modal.do_not_ask_again': '다음부터 확인창을 띄우지 않기',
-  'confirmations.discard_edit_media.message': '저장하지 않은 미디어 설명이나 미리보기가 있습니다, 그냥 닫을까요?',
-  'confirmations.missing_media_description.confirm': '그냥 보내기',
-  'confirmations.missing_media_description.edit': '미디어 편집',
-  'confirmations.missing_media_description.message': '하나 이상의 미디어에 대해 설명을 작성하지 않았습니다. 시각장애인을 위해 모든 미디어에 설명을 추가하는 것을 고려해주세요.',
-  'confirmations.unfilter': '이 필터링 된 글에 대한 정보',
-  'confirmations.unfilter.author': '작성자',
-  'confirmations.unfilter.confirm': '보기',
-  'confirmations.unfilter.edit_filter': '필터 편집',
-  'confirmations.unfilter.filters': '적용된 {count, plural, one {필터} other {필터들}}',
-  'content-type.change': '콘텐트 타입',
-  'direct.conversations_mode': '대화',
-  'direct.timeline_mode': '타임라인',
-  'endorsed_accounts_editor.endorsed_accounts': '추천하는 계정들',
-  'favourite_modal.combo': '다음엔 {combo}를 눌러 건너뛸 수 있습니다',
-  'getting_started.onboarding': '둘러보기',
-  'getting_started.open_source_notice': '글리치는 {Mastodon}의 자유 오픈소스 포크버전입니다. {github}에서 문제를 리포팅 하거나 기여를 할 수 있습니다.',
-  'home.column_settings.advanced': '고급',
-  'home.column_settings.filter_regex': '정규표현식으로 필터',
-  'home.column_settings.show_direct': 'DM 보여주기',
-  'home.settings': '컬럼 설정',
-  'keyboard_shortcuts.bookmark': '북마크',
-  'keyboard_shortcuts.secondary_toot': '보조 프라이버시 설정으로 글 보내기',
-  'keyboard_shortcuts.toggle_collapse': '글 접거나 펼치기',
-  'layout.auto': '자동',
-  'layout.current_is': '현재 레이아웃:',
-  'layout.desktop': '데스크탑',
-  'layout.hint.auto': '“고급 웹 인터페이스 활성화” 설정과 화면 크기에 따라 자동으로 레이아웃을 고릅니다.',
-  'layout.hint.desktop': '“고급 웹 인터페이스 활성화” 설정이나 화면 크기에 관계 없이 멀티 컬럼 레이아웃을 사용합니다.',
-  'layout.hint.single': '“고급 웹 인터페이스 활성화” 설정이나 화면 크기에 관계 없이 싱글 컬럼 레이아웃을 사용합니다.',
-  'layout.single': '모바일',
-  'media_gallery.sensitive': '민감함',
-  'moved_to_warning': '이 계정은 {moved_to_link}로 이동한 것으로 표시되었고, 새 팔로우를 받지 않는 것 같습니다.',
-  'navigation_bar.app_settings': '앱 설정',
-  'navigation_bar.featured_users': '추천된 계정들',
-  'navigation_bar.misc': '다양한 옵션들',
-  'notification.markForDeletion': '삭제하기 위해 표시',
-  'notification_purge.btn_all': '전체선택',
-  'notification_purge.btn_apply': '선택된 알림 삭제',
-  'notification_purge.btn_invert': '선택반전',
-  'notification_purge.btn_none': '전체선택해제',
-  'notification_purge.start': '알림 삭제모드로 들어가기',
-  'notifications.clear': '내 알림 모두 지우기',
-  'notifications.marked_clear': '선택된 알림 모두 삭제',
-  'notifications.marked_clear_confirmation': '정말로 선택된 알림들을 영구적으로 삭제할까요?',
-  'onboarding.done': '완료',
-  'onboarding.next': '다음',
-  'onboarding.page_five.public_timelines': '로컬 타임라인은 {domain}에 있는 모든 사람의 공개글을 보여줍니다. 연합 타임라인은 {domain}에 있는 사람들이 팔로우 하는 모든 사람의 공개글을 보여줍니다. 이것들은 공개 타임라인이라고 불리며, 새로운 사람들을 발견할 수 있는 좋은 방법입니다.',
-  'onboarding.page_four.home': '홈 타임라인은 당신이 팔로우 한 사람들의 글을 보여줍니다.',
-  'onboarding.page_four.notifications': '알림 컬럼은 누군가가 당신과 상호작용한 것들을 보여줍니다.',
-  'onboarding.page_one.federation': '{domain}은 마스토돈의 \'인스턴스\'입니다. 마스토돈은 하나의 거대한 소셜 네트워크를 만들기 위해 참여한 서버들의 네트워크입니다. 우린 이 서버들을 인스턴스라고 부릅니다.',
-  'onboarding.page_one.handle': '당신은 {domain}에 속해 있으며, 전체 핸들은 {handle} 입니다.',
-  'onboarding.page_one.welcome': '{domain}에 오신 것을 환영합니다!',
-  'onboarding.page_six.admin': '우리 서버의 관리자는 {admin} 님입니다.',
-  'onboarding.page_six.almost_done': '거의 다 되었습니다…',
-  'onboarding.page_six.appetoot': '본 아페툿!',
-  'onboarding.page_six.apps_available': 'iOS, 안드로이드, 그리고 다른 플랫폼들을 위한 {apps}이 존재합니다.',
-  'onboarding.page_six.github': '{domain}은 글리치를 통해 구동 됩니다. 글리치는 {Mastodon}의 {fork}입니다, 그리고 어떤 마스토돈 인스턴스나 앱과도 호환 됩니다. 글리치는 완전한 자유 오픈소스입니다. {github}에서 버그를 리포팅 하거나, 기능을 제안하거나, 코드를 기여할 수 있습니다.',
-  'onboarding.page_six.guidelines': '커뮤니티 가이드라인',
-  'onboarding.page_six.read_guidelines': '{domain}의 {guidelines}을 읽어주세요!',
-  'onboarding.page_six.various_app': '모바일 앱',
-  'onboarding.page_three.profile': '프로필을 수정해 아바타, 바이오, 표시되는 이름을 설정하세요. 거기에서 다른 설정들도 찾을 수 있습니다.',
-  'onboarding.page_three.search': '검색창을 사용해 사람들과 해시태그를 찾아보세요. 예를 들면 {illustration}이라든지 {introcustions} 같은 것으로요. 이 인스턴스에 있지 않은 사람을 찾으려면, 전체 핸들을 사용하세요.',
-  'onboarding.page_two.compose': '작성 컬럼에서 게시물을 작성하세요. 그림을 업로드 할 수 있고, 공개설정을 바꿀 수도 있으며, 아래 아이콘을 통해 열람주의 텍스트를 설정할 수 있습니다.',
-  'onboarding.skip': '건너뛰기',
-  'settings.always_show_spoilers_field': '열람주의 항목을 언제나 활성화',
-  'settings.auto_collapse': '자동으로 접기',
-  'settings.auto_collapse_all': '모두',
-  'settings.auto_collapse_lengthy': '긴 글',
-  'settings.auto_collapse_media': '미디어 포함 글',
-  'settings.auto_collapse_notifications': '알림',
-  'settings.auto_collapse_reblogs': '부스트',
-  'settings.auto_collapse_replies': '답글',
-  'settings.close': '닫기',
-  'settings.collapsed_statuses': '접힌 글',
-  'settings.compose_box_opts': '작성 상자',
-  'settings.confirm_before_clearing_draft': '작성 중인 메시지를 덮어씌우기 전에 확인창을 보여주기',
-  'settings.confirm_boost_missing_media_description': '미디어 설명이 없는 글을 부스트하려 할 때 확인창을 보여주기',
-  'settings.confirm_missing_media_description': '미디어 설명이 없는 글을 작성하려 할 때 확인창을 보여주기',
-  'settings.content_warnings': '열람주의',
-  'settings.content_warnings.regexp': '정규표현식',
-  'settings.content_warnings_filter': '자동으로 펼치지 않을 열람주의 문구:',
-  'settings.deprecated_setting': '이 설정은 마스토돈의 {settings_page_link}에서 관리됩니다',
-  'settings.enable_collapsed': '접힌 글 활성화',
-  'settings.enable_content_warnings_auto_unfold': '자동으로 열람주의 펼치기',
-  'settings.filtering_behavior': '필터링 동작',
-  'settings.filtering_behavior.cw': '게시물을 보여주되, 필터된 단어를 열람주의에 추가합니다',
-  'settings.filtering_behavior.drop': '완전히 숨깁니다',
-  'settings.filtering_behavior.hide': '\'필터됨\'이라고 표시하고 이유를 표시하는 버튼을 추가합니다',
-  'settings.filtering_behavior.upstream': '\'필터됨\'이라고 일반 마스토돈처럼 표시합니다',
-  'settings.filters': '필터',
-  'settings.general': '일반',
-  'settings.hicolor_privacy_icons': '높은 채도의 공개설정 아이콘',
-  'settings.hicolor_privacy_icons.hint': '공개설정 아이콘들을 밝고 구분하기 쉬운 색으로 표시합니다',
-  'settings.image_backgrounds': '이미지 배경',
-  'settings.image_backgrounds_media': '접힌 글의 미디어 미리보기',
-  'settings.image_backgrounds_users': '접힌 글에 이미지 배경 주기',
-  'settings.inline_preview_cards': '외부 링크에 대한 미리보기 카드를 같이 표시',
-  'settings.layout': '레이아웃:',
-  'settings.layout_opts': '레이아웃 옵션',
-  'settings.media': '미디어',
-  'settings.media_fullwidth': '최대폭 미디어 미리보기',
-  'settings.media_letterbox': '레터박스 미디어',
-  'settings.media_letterbox_hint': '확대하고 자르는 대신 축소하고 레터박스에 넣어 이미지를 보여줍니다',
-  'settings.media_reveal_behind_cw': '열람주의로 가려진 미디어를 기본으로 펼쳐 둡니다',
-  'settings.navbar_under': '내비바를 하단에 (모바일 전용)',
-  'settings.notifications.favicon_badge': '읽지 않은 알림 파비콘 배지',
-  'settings.notifications.favicon_badge.hint': '읽지 않은 알림 배지를 파비콘에 추가합니다',
-  'settings.notifications.tab_badge': '읽지 않은 알림 배지',
-  'settings.notifications.tab_badge.hint': '알림 컬럼이 열려 있지 않을 때 알림 컬럼에 알림이 있다는 배지를 표시합니다',
-  'settings.notifications_opts': '알림 옵션',
-  'settings.pop_in_left': '왼쪽',
-  'settings.pop_in_player': '떠있는 재생기 활성화',
-  'settings.pop_in_position': '떠있는 재생기 위치:',
-  'settings.pop_in_right': '오른쪽',
-  'settings.preferences': '사용자 설정',
-  'settings.prepend_cw_re': '열람주의가 달린 글에 답장을 할 때 열람주의 문구 앞에 “re: ”를 추가합니다',
-  'settings.preselect_on_reply': '답글 달 때 사용자명 미리 선택',
-  'settings.preselect_on_reply_hint': '답글을 달 때 이미 멘션 된 사람의 사용자명을 미리 블럭으로 설정해 놓습니다',
-  'settings.rewrite_mentions': '표시되는 게시물의 멘션 표시 바꾸기',
-  'settings.rewrite_mentions_acct': '사용자명과 도메인으로 바꾸기(계정이 원격일 때)',
-  'settings.rewrite_mentions_no': '멘션을 그대로 두기',
-  'settings.rewrite_mentions_username': '사용자명으로 바꾸기',
-  'settings.shared_settings_link': '사용자 설정',
-  'settings.show_action_bar': '접힌 글에 액션 버튼들 보이기',
-  'settings.show_content_type_choice': '글을 작성할 때 콘텐트 타입을 고를 수 있도록 합니다',
-  'settings.show_reply_counter': '대략적인 답글 개수를 표시합니다',
-  'settings.side_arm': '보조 작성 버튼:',
-  'settings.side_arm.none': '없음',
-  'settings.side_arm_reply_mode': '답글을 작성할 때:',
-  'settings.side_arm_reply_mode.copy': '답글을 달려는 글의 공개설정을 복사합니다',
-  'settings.side_arm_reply_mode.keep': '보조 작성 버튼의 공개설정을 유지합니다',
-  'settings.side_arm_reply_mode.restrict': '답글을 달려는 글의 공개설정에 맞게 제한합니다',
-  'settings.status_icons': '게시물 아이콘',
-  'settings.status_icons_language': '언어 표시',
-  'settings.status_icons_local_only': '로컬 전용 표시',
-  'settings.status_icons_media': '미디어와 투표 표시',
-  'settings.status_icons_reply': '답글 표시',
-  'settings.status_icons_visibility': '툿 공개설정 표시',
-  'settings.swipe_to_change_columns': '스와이프하여 컬럼간 전환을 허용합니다 (모바일 전용)',
-  'settings.tag_misleading_links': '오해의 소지가 있는 링크를 표시합니다',
-  'settings.tag_misleading_links.hint': '링크에 명시적으로 주소가 없는 경우엔 대상 호스트를 보이도록 표시합니다',
-  'settings.wide_view': '넓은 뷰 (데스크탑 모드 전용)',
-  'settings.wide_view_hint': '컬럼들을 늘려서 활용 가능한 공간을 사용합니다.',
-  'status.collapse': '접기',
-  'status.has_audio': '소리 파일이 첨부되어 있습니다',
-  'status.has_pictures': '그림 파일이 첨부되어 있습니다',
-  'status.has_preview_card': '미리보기 카드가 첨부되어 있습니다',
-  'status.has_video': '영상이 첨부되어 있습니다',
-  'status.hide': '글 가리기',
-  'status.in_reply_to': '이 글은 답글입니다',
-  'status.is_poll': '이 글은 설문입니다',
-  'status.local_only': '당신의 서버에서만 보입니다',
-  'status.sensitive_toggle': '클릭해서 보기',
-  'status.show_filter_reason': '(이유 보기)',
-  'status.uncollapse': '펼치기',
-  'upload_modal.applying': '적용중…',
-  'web_app_crash.change_your_settings': '{settings}을 바꾸세요',
-  'web_app_crash.content': '이것들을 시도해 볼 수 있습니다:',
-  'web_app_crash.debug_info': '디버그 정보',
-  'web_app_crash.disable_addons': '브라우저 애드온이나 기본 번역 도구를 비활성화 합니다',
-  'web_app_crash.issue_tracker': '이슈 트래커',
-  'web_app_crash.reload': '새로고침',
-  'web_app_crash.reload_page': '이 페이지를 {reload}',
-  'web_app_crash.report_issue': '{issuetracker}에 버그 제보',
-  'web_app_crash.settings': '설정',
-  'web_app_crash.title': '죄송합니다, 하지만 마스토돈 앱이 뭔가 잘못되었습니다.',
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ko.json b/app/javascript/flavours/glitch/locales/ko.json
new file mode 100644
index 000000000..f17f32a9d
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ko.json
@@ -0,0 +1,200 @@
+{
+  "about.fork_disclaimer": "글리치는 마스토돈에서 포크한 자유 오픈소스 소프트웨어입니다.",
+  "account.add_account_note": "@{name} 님에 대한 메모 추가",
+  "account.disclaimer_full": "아래에 있는 정보들은 사용자의 프로필을 완벽하게 나타내지 못하고 있을 수도 있습니다.",
+  "account.follows": "팔로우",
+  "account.joined": "{date}에 가입함",
+  "account.suspended_disclaimer_full": "이 사용자는 중재자에 의해 정지되었습니다.",
+  "account.view_full_profile": "전체 프로필 보기",
+  "account_note.cancel": "취소",
+  "account_note.edit": "편집",
+  "account_note.glitch_placeholder": "코멘트가 없습니다",
+  "account_note.save": "저장",
+  "advanced_options.icon_title": "고급 옵션",
+  "advanced_options.local-only.long": "다른 서버에 게시하지 않기",
+  "advanced_options.local-only.short": "로컬 전용",
+  "advanced_options.local-only.tooltip": "이 게시물은 로컬 전용입니다",
+  "advanced_options.threaded_mode.long": "글을 작성하고 자동으로 답글 열기",
+  "advanced_options.threaded_mode.short": "글타래 모드",
+  "advanced_options.threaded_mode.tooltip": "글타래 모드 활성화됨",
+  "boost_modal.missing_description": "이 게시물은 설명이 없는 미디어를 포함하고 있습니다",
+  "column.favourited_by": "즐겨찾기 한 사람",
+  "column.heading": "기타",
+  "column.reblogged_by": "부스트 한 사람",
+  "column.subheading": "다양한 옵션",
+  "column_header.profile": "프로필",
+  "column_subheading.lists": "리스트",
+  "column_subheading.navigation": "탐색",
+  "community.column_settings.allow_local_only": "로컬 전용 글 보기",
+  "compose.attach": "첨부…",
+  "compose.attach.doodle": "뭔가 그려보세요",
+  "compose.attach.upload": "파일 업로드",
+  "compose.content-type.html": "HTML",
+  "compose.content-type.markdown": "마크다운",
+  "compose.content-type.plain": "일반 텍스트",
+  "compose_form.poll.multiple_choices": "여러 개 선택 가능",
+  "compose_form.poll.single_choice": "하나만 선택 가능",
+  "compose_form.spoiler": "경고 메시지로 숨기기",
+  "confirmation_modal.do_not_ask_again": "다음부터 확인창을 띄우지 않기",
+  "confirmations.deprecated_settings.confirm": "마스토돈 설정 사용",
+  "confirmations.deprecated_settings.message": "사용하던 몇몇 기기별 글리치 {app_settings}은 마스토돈 {preferences}으로 대체되었습니다:",
+  "confirmations.missing_media_description.confirm": "그냥 보내기",
+  "confirmations.missing_media_description.edit": "미디어 편집",
+  "confirmations.missing_media_description.message": "하나 이상의 미디어에 대해 설명을 작성하지 않았습니다. 시각장애인을 위해 모든 미디어에 설명을 추가하는 것을 고려해주세요.",
+  "confirmations.unfilter.author": "작성자",
+  "confirmations.unfilter.confirm": "보기",
+  "confirmations.unfilter.edit_filter": "필터 편집",
+  "confirmations.unfilter.filters": "적용된 {count, plural, one {필터} other {필터들}}",
+  "content-type.change": "콘텐트 타입",
+  "direct.group_by_conversations": "대화별로 묶기",
+  "endorsed_accounts_editor.endorsed_accounts": "추천하는 계정들",
+  "favourite_modal.combo": "다음엔 {combo}를 눌러 건너뛸 수 있습니다",
+  "getting_started.onboarding": "둘러보기",
+  "home.column_settings.advanced": "고급",
+  "home.column_settings.filter_regex": "정규표현식으로 필터",
+  "home.column_settings.show_direct": "DM 보여주기",
+  "home.settings": "컬럼 설정",
+  "keyboard_shortcuts.bookmark": "북마크",
+  "keyboard_shortcuts.secondary_toot": "보조 프라이버시 설정으로 글 보내기",
+  "keyboard_shortcuts.toggle_collapse": "글 접거나 펼치기",
+  "layout.auto": "자동",
+  "layout.desktop": "데스크탑",
+  "layout.hint.auto": "“고급 웹 인터페이스 활성화” 설정과 화면 크기에 따라 자동으로 레이아웃을 고릅니다.",
+  "layout.hint.desktop": "“고급 웹 인터페이스 활성화” 설정이나 화면 크기에 관계 없이 멀티 컬럼 레이아웃을 사용합니다.",
+  "layout.hint.single": "“고급 웹 인터페이스 활성화” 설정이나 화면 크기에 관계 없이 싱글 컬럼 레이아웃을 사용합니다.",
+  "layout.single": "모바일",
+  "media_gallery.sensitive": "민감함",
+  "moved_to_warning": "이 계정은 {moved_to_link}로 이동한 것으로 표시되었고, 새 팔로우를 받지 않는 것 같습니다.",
+  "navigation_bar.app_settings": "앱 설정",
+  "navigation_bar.featured_users": "추천된 계정들",
+  "navigation_bar.info": "추가 정보",
+  "navigation_bar.keyboard_shortcuts": "키보드 단축기",
+  "navigation_bar.misc": "다양한 옵션들",
+  "notification.markForDeletion": "삭제하기 위해 표시",
+  "notification_purge.btn_all": "전체선택",
+  "notification_purge.btn_apply": "선택된 알림 삭제",
+  "notification_purge.btn_invert": "선택반전",
+  "notification_purge.btn_none": "전체선택해제",
+  "notification_purge.start": "알림 삭제모드로 들어가기",
+  "notifications.marked_clear": "선택된 알림 모두 삭제",
+  "notifications.marked_clear_confirmation": "정말로 선택된 알림들을 영구적으로 삭제할까요?",
+  "onboarding.done": "완료",
+  "onboarding.next": "다음",
+  "onboarding.page_five.public_timelines": "로컬 타임라인은 {domain}에 있는 모든 사람의 공개글을 보여줍니다. 연합 타임라인은 {domain}에 있는 사람들이 팔로우 하는 모든 사람의 공개글을 보여줍니다. 이것들은 공개 타임라인이라고 불리며, 새로운 사람들을 발견할 수 있는 좋은 방법입니다.",
+  "onboarding.page_four.home": "홈 타임라인은 당신이 팔로우 한 사람들의 글을 보여줍니다.",
+  "onboarding.page_four.notifications": "알림 컬럼은 누군가가 당신과 상호작용한 것들을 보여줍니다.",
+  "onboarding.page_one.federation": "{domain}은 마스토돈의 '인스턴스'입니다. 마스토돈은 하나의 거대한 소셜 네트워크를 만들기 위해 참여한 서버들의 네트워크입니다. 우린 이 서버들을 인스턴스라고 부릅니다.",
+  "onboarding.page_one.handle": "당신은 {domain}에 속해 있으며, 전체 핸들은 {handle} 입니다.",
+  "onboarding.page_one.welcome": "{domain}에 오신 것을 환영합니다!",
+  "onboarding.page_six.admin": "우리 서버의 관리자는 {admin} 님입니다.",
+  "onboarding.page_six.almost_done": "거의 다 되었습니다…",
+  "onboarding.page_six.appetoot": "본 아페툿!",
+  "onboarding.page_six.apps_available": "iOS, 안드로이드, 그리고 다른 플랫폼들을 위한 {apps}이 존재합니다.",
+  "onboarding.page_six.github": "{domain}은 글리치를 통해 구동 됩니다. 글리치는 {Mastodon}의 {fork}입니다, 그리고 어떤 마스토돈 인스턴스나 앱과도 호환 됩니다. 글리치는 완전한 자유 오픈소스입니다. {github}에서 버그를 리포팅 하거나, 기능을 제안하거나, 코드를 기여할 수 있습니다.",
+  "onboarding.page_six.guidelines": "커뮤니티 가이드라인",
+  "onboarding.page_six.read_guidelines": "{domain}의 {guidelines}을 읽어주세요!",
+  "onboarding.page_six.various_app": "모바일 앱",
+  "onboarding.page_three.profile": "프로필을 수정해 아바타, 바이오, 표시되는 이름을 설정하세요. 거기에서 다른 설정들도 찾을 수 있습니다.",
+  "onboarding.page_three.search": "검색창을 사용해 사람들과 해시태그를 찾아보세요. 예를 들면 {illustration}이라든지 {introcustions} 같은 것으로요. 이 인스턴스에 있지 않은 사람을 찾으려면, 전체 핸들을 사용하세요.",
+  "onboarding.page_two.compose": "작성 컬럼에서 게시물을 작성하세요. 그림을 업로드 할 수 있고, 공개설정을 바꿀 수도 있으며, 아래 아이콘을 통해 열람주의 텍스트를 설정할 수 있습니다.",
+  "onboarding.skip": "건너뛰기",
+  "settings.always_show_spoilers_field": "열람주의 항목을 언제나 활성화",
+  "settings.auto_collapse": "자동으로 접기",
+  "settings.auto_collapse_all": "모두",
+  "settings.auto_collapse_lengthy": "긴 글",
+  "settings.auto_collapse_media": "미디어 포함 글",
+  "settings.auto_collapse_notifications": "알림",
+  "settings.auto_collapse_reblogs": "부스트",
+  "settings.auto_collapse_replies": "답글",
+  "settings.close": "닫기",
+  "settings.collapsed_statuses": "접힌 글",
+  "settings.compose_box_opts": "작성 상자",
+  "settings.confirm_before_clearing_draft": "작성 중인 메시지를 덮어씌우기 전에 확인창을 보여주기",
+  "settings.confirm_boost_missing_media_description": "미디어 설명이 없는 글을 부스트하려 할 때 확인창을 보여주기",
+  "settings.confirm_missing_media_description": "미디어 설명이 없는 글을 작성하려 할 때 확인창을 보여주기",
+  "settings.content_warnings": "열람주의",
+  "settings.content_warnings.regexp": "정규표현식",
+  "settings.content_warnings_filter": "자동으로 펼치지 않을 열람주의 문구:",
+  "settings.content_warnings_media_outside": "미디어 첨부를 열람주의 바깥에 보이기",
+  "settings.content_warnings_media_outside_hint": "마스토돈 원본처럼 열람주의 토글이 미디어 첨부에는 영향을 미치지 않게 합니다",
+  "settings.content_warnings_shared_state": "동일한 글의 열람주의를 한번에 열고 닫기",
+  "settings.content_warnings_shared_state_hint": "마스토돈 원본처럼 열람주의 버튼이 동일한 모든 글에 대해 영향을 미치게 합니다. 펼쳐진 열람주의 글이 자동으로 다시 접히는 것을 방지합니다",
+  "settings.content_warnings_unfold_opts": "자동 펼치기 옵션",
+  "settings.deprecated_setting": "이 설정은 마스토돈의 {settings_page_link}에서 관리됩니다",
+  "settings.enable_collapsed": "접힌 글 활성화",
+  "settings.enable_collapsed_hint": "접힌 게시물을 콘텐츠의 일부분을 가려서 공간을 적게 차지합니다. 열람주의 기능과는 다릅니다",
+  "settings.enable_content_warnings_auto_unfold": "자동으로 열람주의 펼치기",
+  "settings.general": "일반",
+  "settings.hicolor_privacy_icons": "높은 채도의 공개설정 아이콘",
+  "settings.hicolor_privacy_icons.hint": "공개설정 아이콘들을 밝고 구분하기 쉬운 색으로 표시합니다",
+  "settings.image_backgrounds": "이미지 배경",
+  "settings.image_backgrounds_media": "접힌 글의 미디어 미리보기",
+  "settings.image_backgrounds_media_hint": "게시물이 미디어 첨부를 포함한다면, 첫번째를 배경으로 사용합니다",
+  "settings.image_backgrounds_users": "접힌 글에 이미지 배경 주기",
+  "settings.inline_preview_cards": "외부 링크에 대한 미리보기 카드를 같이 표시",
+  "settings.layout": "레이아웃:",
+  "settings.layout_opts": "레이아웃 옵션",
+  "settings.media": "미디어",
+  "settings.media_fullwidth": "최대폭 미디어 미리보기",
+  "settings.media_letterbox": "레터박스 미디어",
+  "settings.media_letterbox_hint": "확대하고 자르는 대신 축소하고 레터박스에 넣어 이미지를 보여줍니다",
+  "settings.media_reveal_behind_cw": "열람주의로 가려진 미디어를 기본으로 펼쳐 둡니다",
+  "settings.notifications.favicon_badge": "읽지 않은 알림 파비콘 배지",
+  "settings.notifications.favicon_badge.hint": "읽지 않은 알림 배지를 파비콘에 추가합니다",
+  "settings.notifications.tab_badge": "읽지 않은 알림 배지",
+  "settings.notifications.tab_badge.hint": "알림 컬럼이 열려 있지 않을 때 알림 컬럼에 알림이 있다는 배지를 표시합니다",
+  "settings.notifications_opts": "알림 옵션",
+  "settings.pop_in_left": "왼쪽",
+  "settings.pop_in_player": "떠있는 재생기 활성화",
+  "settings.pop_in_position": "떠있는 재생기 위치:",
+  "settings.pop_in_right": "오른쪽",
+  "settings.preferences": "사용자 설정",
+  "settings.prepend_cw_re": "열람주의가 달린 글에 답장을 할 때 열람주의 문구 앞에 “re: ”를 추가합니다",
+  "settings.preselect_on_reply": "답글 달 때 사용자명 미리 선택",
+  "settings.preselect_on_reply_hint": "답글을 달 때 이미 멘션 된 사람의 사용자명을 미리 블럭으로 설정해 놓습니다",
+  "settings.rewrite_mentions": "표시되는 게시물의 멘션 표시 바꾸기",
+  "settings.rewrite_mentions_acct": "사용자명과 도메인으로 바꾸기(계정이 원격일 때)",
+  "settings.rewrite_mentions_no": "멘션을 그대로 두기",
+  "settings.rewrite_mentions_username": "사용자명으로 바꾸기",
+  "settings.shared_settings_link": "사용자 설정",
+  "settings.show_action_bar": "접힌 글에 액션 버튼들 보이기",
+  "settings.show_content_type_choice": "글을 작성할 때 콘텐트 타입을 고를 수 있도록 합니다",
+  "settings.show_reply_counter": "대략적인 답글 개수를 표시합니다",
+  "settings.side_arm": "보조 작성 버튼:",
+  "settings.side_arm.none": "없음",
+  "settings.side_arm_reply_mode": "답글을 작성할 때:",
+  "settings.side_arm_reply_mode.copy": "답글을 달려는 글의 공개설정을 복사합니다",
+  "settings.side_arm_reply_mode.keep": "보조 작성 버튼의 공개설정을 유지합니다",
+  "settings.side_arm_reply_mode.restrict": "답글을 달려는 글의 공개설정에 맞게 제한합니다",
+  "settings.status_icons": "게시물 아이콘",
+  "settings.status_icons_language": "언어 표시",
+  "settings.status_icons_local_only": "로컬 전용 표시",
+  "settings.status_icons_media": "미디어와 투표 표시",
+  "settings.status_icons_reply": "답글 표시",
+  "settings.status_icons_visibility": "툿 공개설정 표시",
+  "settings.swipe_to_change_columns": "스와이프하여 컬럼간 전환을 허용합니다 (모바일 전용)",
+  "settings.tag_misleading_links": "오해의 소지가 있는 링크를 표시합니다",
+  "settings.tag_misleading_links.hint": "링크에 명시적으로 주소가 없는 경우엔 대상 호스트를 보이도록 표시합니다",
+  "settings.wide_view": "넓은 뷰 (데스크탑 모드 전용)",
+  "settings.wide_view_hint": "컬럼들을 늘려서 활용 가능한 공간을 사용합니다.",
+  "status.collapse": "접기",
+  "status.has_audio": "소리 파일이 첨부되어 있습니다",
+  "status.has_pictures": "그림 파일이 첨부되어 있습니다",
+  "status.has_preview_card": "미리보기 카드가 첨부되어 있습니다",
+  "status.has_video": "영상이 첨부되어 있습니다",
+  "status.in_reply_to": "이 글은 답글입니다",
+  "status.is_poll": "이 글은 설문입니다",
+  "status.local_only": "당신의 서버에서만 보입니다",
+  "status.sensitive_toggle": "클릭해서 보기",
+  "status.uncollapse": "펼치기",
+  "web_app_crash.change_your_settings": "{settings}을 바꾸세요",
+  "web_app_crash.content": "이것들을 시도해 볼 수 있습니다:",
+  "web_app_crash.debug_info": "디버그 정보",
+  "web_app_crash.disable_addons": "브라우저 애드온이나 기본 번역 도구를 비활성화 합니다",
+  "web_app_crash.issue_tracker": "이슈 트래커",
+  "web_app_crash.reload": "새로고침",
+  "web_app_crash.reload_page": "이 페이지를 {reload}",
+  "web_app_crash.report_issue": "{issuetracker}에 버그 제보",
+  "web_app_crash.settings": "설정",
+  "web_app_crash.title": "죄송합니다, 하지만 마스토돈 앱이 뭔가 잘못되었습니다."
+}
diff --git a/app/javascript/flavours/glitch/locales/ku.js b/app/javascript/flavours/glitch/locales/ku.js
deleted file mode 100644
index 19e0e95aa..000000000
--- a/app/javascript/flavours/glitch/locales/ku.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ku.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ku.json b/app/javascript/flavours/glitch/locales/ku.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ku.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/kw.js b/app/javascript/flavours/glitch/locales/kw.js
deleted file mode 100644
index 1325ca825..000000000
--- a/app/javascript/flavours/glitch/locales/kw.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/kw.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/kw.json b/app/javascript/flavours/glitch/locales/kw.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/kw.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/la.json b/app/javascript/flavours/glitch/locales/la.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/la.json
@@ -0,0 +1 @@
+{}
diff --git a/app/javascript/flavours/glitch/locales/lt.js b/app/javascript/flavours/glitch/locales/lt.js
deleted file mode 100644
index 47453aeeb..000000000
--- a/app/javascript/flavours/glitch/locales/lt.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/lt.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/lt.json b/app/javascript/flavours/glitch/locales/lt.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/lt.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/lv.js b/app/javascript/flavours/glitch/locales/lv.js
deleted file mode 100644
index cdbcdf799..000000000
--- a/app/javascript/flavours/glitch/locales/lv.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/lv.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/lv.json b/app/javascript/flavours/glitch/locales/lv.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/lv.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/mk.js b/app/javascript/flavours/glitch/locales/mk.js
deleted file mode 100644
index 55e510b59..000000000
--- a/app/javascript/flavours/glitch/locales/mk.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/mk.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/mk.json b/app/javascript/flavours/glitch/locales/mk.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/mk.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/ml.js b/app/javascript/flavours/glitch/locales/ml.js
deleted file mode 100644
index d00331a1a..000000000
--- a/app/javascript/flavours/glitch/locales/ml.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ml.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ml.json b/app/javascript/flavours/glitch/locales/ml.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ml.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/mr.js b/app/javascript/flavours/glitch/locales/mr.js
deleted file mode 100644
index fb3cde92a..000000000
--- a/app/javascript/flavours/glitch/locales/mr.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/mr.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/mr.json b/app/javascript/flavours/glitch/locales/mr.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/mr.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/ms.js b/app/javascript/flavours/glitch/locales/ms.js
deleted file mode 100644
index 61033c521..000000000
--- a/app/javascript/flavours/glitch/locales/ms.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ms.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ms.json b/app/javascript/flavours/glitch/locales/ms.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ms.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/my.json b/app/javascript/flavours/glitch/locales/my.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/my.json
@@ -0,0 +1 @@
+{}
diff --git a/app/javascript/flavours/glitch/locales/nl.js b/app/javascript/flavours/glitch/locales/nl.js
deleted file mode 100644
index 17c371c58..000000000
--- a/app/javascript/flavours/glitch/locales/nl.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/nl.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/nl.json b/app/javascript/flavours/glitch/locales/nl.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/nl.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/nn.js b/app/javascript/flavours/glitch/locales/nn.js
deleted file mode 100644
index 4c42368cb..000000000
--- a/app/javascript/flavours/glitch/locales/nn.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/nn.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/nn.json b/app/javascript/flavours/glitch/locales/nn.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/nn.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/no.js b/app/javascript/flavours/glitch/locales/no.js
deleted file mode 100644
index 794b1da25..000000000
--- a/app/javascript/flavours/glitch/locales/no.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/no.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/no.json b/app/javascript/flavours/glitch/locales/no.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/no.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/oc.js b/app/javascript/flavours/glitch/locales/oc.js
deleted file mode 100644
index 8f161fd8c..000000000
--- a/app/javascript/flavours/glitch/locales/oc.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/oc.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/oc.json b/app/javascript/flavours/glitch/locales/oc.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/oc.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/pa.js b/app/javascript/flavours/glitch/locales/pa.js
deleted file mode 100644
index c3e0e2b84..000000000
--- a/app/javascript/flavours/glitch/locales/pa.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/pa.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/pa.json b/app/javascript/flavours/glitch/locales/pa.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/pa.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/pl.js b/app/javascript/flavours/glitch/locales/pl.js
deleted file mode 100644
index f430bf577..000000000
--- a/app/javascript/flavours/glitch/locales/pl.js
+++ /dev/null
@@ -1,79 +0,0 @@
-import inherited from 'mastodon/locales/pl.json';
-
-const messages = {
-  'getting_started.open_source_notice': 'Glitchsoc jest wolnym i otwartoźródłowym forkiem oprogramowania {Mastodon}. Możesz współtworzyć projekt lub zgłaszać błędy na GitHubie pod adresem {github}.',
-  'layout.auto': 'Automatyczny',
-  'layout.current_is': 'Twój obecny układ to:',
-  'layout.desktop': 'Desktopowy',
-  'layout.mobile': 'Mobilny',
-  'navigation_bar.app_settings': 'Ustawienia aplikacji',
-  'navigation_bar.bookmarks': 'Zakładki',
-  'getting_started.onboarding': 'Rozejrzyj się',
-  'onboarding.page_one.federation': '{domain} jest \'instancją\' Mastodona. Mastodon to sieć działających niezależnie serwerów tworzących jedną sieć społecznościową. Te serwery nazywane są instancjami.',
-  'onboarding.page_one.welcome': 'Witamy na {domain}!',
-  'onboarding.page_six.github': '{domain} jest oparty na Glitchsoc. Glitchsoc jest {forkiem} {Mastodon}a kompatybilnym z każdym klientem i aplikacją Mastodona. Glitchsoc jest całkowicie wolnym i otwartoźródłowym oprogramowaniem. Możesz zgłaszać błędy i sugestie funkcji oraz współtworzyć projekt na {github}.',
-  'settings.auto_collapse': 'Automatyczne zwijanie',
-  'settings.auto_collapse_all': 'Wszystko',
-  'settings.auto_collapse_lengthy': 'Długie wpisy',
-  'settings.auto_collapse_media': 'Wpisy z zawartością multimedialną',
-  'settings.auto_collapse_notifications': 'Powiadomienia',
-  'settings.auto_collapse_reblogs': 'Podbicia',
-  'settings.auto_collapse_replies': 'Odpowiedzi',
-  'settings.close': 'Zamknij',
-  'settings.collapsed_statuses': 'Zwijanie wpisów',
-  'settings.enable_collapsed': 'Włącz zwijanie wpisów',
-  'settings.general': 'Ogólne',
-  'settings.image_backgrounds': 'Obrazy w tle',
-  'settings.image_backgrounds_media': 'Wyświetlaj zawartość multimedialną zwiniętych wpisów',
-  'settings.image_backgrounds_users': 'Nadaj tło zwiniętym wpisom',
-  'settings.layout': 'Układ',
-  'settings.media': 'Zawartość multimedialna',
-  'settings.media_letterbox': 'Letterbox media',
-  'settings.media_fullwidth': 'Podgląd zawartości multimedialnej o pełnej szerokości',
-  'settings.navbar_under': 'Pasek nawigacji na dole (tylko w trybie mobilnym)',
-  'settings.preferences': 'Preferencje użytkownika',
-  'settings.side_arm': 'Drugi przycisk wysyłania',
-  'settings.side_arm.none': 'Żaden',
-  'settings.wide_view': 'Szeroki widok (tylko w trybie desktopowym)',
-  'status.bookmark': 'Dodaj do zakładek',
-  'status.collapse': 'Zwiń',
-  'status.uncollapse': 'Rozwiń',
-
-  'media_gallery.sensitive': 'Zawartość wrażliwa',
-
-  'favourite_modal.combo': 'Możesz nacisnąć {combo}, aby pominąć to następnym razem',
-
-  'home.column_settings.show_direct': 'Pokaż wiadomości bezpośrednie',
-
-  'notification.markForDeletion': 'Oznacz do usunięcia',
-  'notifications.clear': 'Wyczyść wszystkie powiadomienia',
-  'notifications.marked_clear_confirmation': 'Czy na pewno chcesz bezpowrtonie usunąć wszystkie powiadomienia?',
-  'notifications.marked_clear': 'Usuń zaznaczone powiadomienia',
-
-  'notification_purge.btn_all': 'Zaznacz\nwszystkie',
-  'notification_purge.btn_none': 'Odznacz\nwszystkie',
-  'notification_purge.btn_invert': 'Odwróć\nzaznaczenie',
-  'notification_purge.btn_apply': 'Usuń\nzaznaczone',
-  'notification_purge.start': 'Przejdź do trybu usuwania powiadomień',
-
-  'compose.attach.upload': 'Wyślij plik',
-  'compose.attach.doodle': 'Narysuj coś',
-  'compose.attach': 'Załącz coś',
-
-  'advanced_options.local-only.short': 'Tylko lokalnie',
-  'advanced_options.local-only.long': 'Nie wysyłaj na inne instancje',
-  'advanced_options.local-only.tooltip': 'Ten wpis jest widoczny tylko lokalnie',
-  'advanced_options.icon_title': 'Ustawienia zaawansowane',
-  'advanced_options.threaded_mode.short': 'Tryb wątków',
-  'advanced_options.threaded_mode.long': 'Przechodzi do tworzenia odpowiedzi po publikacji wpisu',
-  'advanced_options.threaded_mode.tooltip': 'Włączono tryb wątków',
-  
-  'column.bookmarks': 'Zakładki',
-  'compose_form.sensitive': 'Oznacz zawartość multimedialną jako wrażliwą',
-  'compose_form.spoiler': 'Ukryj tekst za ostrzeżeniem',
-  'favourite_modal.combo': 'Możesz nacisnąć {combo}, aby pominąć to następnym razem',
-  'tabs_bar.compose': 'Napisz',
-  
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/pl.json b/app/javascript/flavours/glitch/locales/pl.json
new file mode 100644
index 000000000..09acd098e
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/pl.json
@@ -0,0 +1,55 @@
+{
+  "advanced_options.icon_title": "Ustawienia zaawansowane",
+  "advanced_options.local-only.long": "Nie wysyłaj na inne instancje",
+  "advanced_options.local-only.short": "Tylko lokalnie",
+  "advanced_options.local-only.tooltip": "Ten wpis jest widoczny tylko lokalnie",
+  "advanced_options.threaded_mode.long": "Przechodzi do tworzenia odpowiedzi po publikacji wpisu",
+  "advanced_options.threaded_mode.short": "Tryb wątków",
+  "advanced_options.threaded_mode.tooltip": "Włączono tryb wątków",
+  "compose.attach": "Załącz coś",
+  "compose.attach.doodle": "Narysuj coś",
+  "compose.attach.upload": "Wyślij plik",
+  "compose_form.spoiler": "Ukryj tekst za ostrzeżeniem",
+  "favourite_modal.combo": "Możesz nacisnąć {combo}, aby pominąć to następnym razem",
+  "getting_started.onboarding": "Rozejrzyj się",
+  "home.column_settings.show_direct": "Pokaż wiadomości bezpośrednie",
+  "layout.auto": "Automatyczny",
+  "layout.desktop": "Desktopowy",
+  "media_gallery.sensitive": "Zawartość wrażliwa",
+  "navigation_bar.app_settings": "Ustawienia aplikacji",
+  "notification.markForDeletion": "Oznacz do usunięcia",
+  "notification_purge.btn_all": "Zaznacz\nwszystkie",
+  "notification_purge.btn_apply": "Usuń\nzaznaczone",
+  "notification_purge.btn_invert": "Odwróć\nzaznaczenie",
+  "notification_purge.btn_none": "Odznacz\nwszystkie",
+  "notification_purge.start": "Przejdź do trybu usuwania powiadomień",
+  "notifications.marked_clear": "Usuń zaznaczone powiadomienia",
+  "notifications.marked_clear_confirmation": "Czy na pewno chcesz bezpowrtonie usunąć wszystkie powiadomienia?",
+  "onboarding.page_one.federation": "{domain} jest 'instancją' Mastodona. Mastodon to sieć działających niezależnie serwerów tworzących jedną sieć społecznościową. Te serwery nazywane są instancjami.",
+  "onboarding.page_one.welcome": "Witamy na {domain}!",
+  "onboarding.page_six.github": "{domain} jest oparty na Glitchsoc. Glitchsoc jest {forkiem} {Mastodon}a kompatybilnym z każdym klientem i aplikacją Mastodona. Glitchsoc jest całkowicie wolnym i otwartoźródłowym oprogramowaniem. Możesz zgłaszać błędy i sugestie funkcji oraz współtworzyć projekt na {github}.",
+  "settings.auto_collapse": "Automatyczne zwijanie",
+  "settings.auto_collapse_all": "Wszystko",
+  "settings.auto_collapse_lengthy": "Długie wpisy",
+  "settings.auto_collapse_media": "Wpisy z zawartością multimedialną",
+  "settings.auto_collapse_notifications": "Powiadomienia",
+  "settings.auto_collapse_reblogs": "Podbicia",
+  "settings.auto_collapse_replies": "Odpowiedzi",
+  "settings.close": "Zamknij",
+  "settings.collapsed_statuses": "Zwijanie wpisów",
+  "settings.content_warnings": "Content warnings",
+  "settings.enable_collapsed": "Włącz zwijanie wpisów",
+  "settings.general": "Ogólne",
+  "settings.image_backgrounds": "Obrazy w tle",
+  "settings.image_backgrounds_media": "Wyświetlaj zawartość multimedialną zwiniętych wpisów",
+  "settings.image_backgrounds_users": "Nadaj tło zwiniętym wpisom",
+  "settings.layout": "Układ",
+  "settings.media": "Zawartość multimedialna",
+  "settings.media_fullwidth": "Podgląd zawartości multimedialnej o pełnej szerokości",
+  "settings.preferences": "Preferencje użytkownika",
+  "settings.side_arm": "Drugi przycisk wysyłania",
+  "settings.side_arm.none": "Żaden",
+  "settings.wide_view": "Szeroki widok (tylko w trybie desktopowym)",
+  "status.collapse": "Zwiń",
+  "status.uncollapse": "Rozwiń"
+}
diff --git a/app/javascript/flavours/glitch/locales/pt-BR.js b/app/javascript/flavours/glitch/locales/pt-BR.js
deleted file mode 100644
index 6fed635f8..000000000
--- a/app/javascript/flavours/glitch/locales/pt-BR.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/pt-BR.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/pt-BR.json b/app/javascript/flavours/glitch/locales/pt-BR.json
new file mode 100644
index 000000000..0bc0d2bea
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/pt-BR.json
@@ -0,0 +1,200 @@
+{
+  "about.fork_disclaimer": "O Glitch-soc é um software gratuito de código aberto bifurcado a partir do Mastodon.",
+  "account.add_account_note": "Adicionar nota para @{name}",
+  "account.disclaimer_full": "As informações abaixo podem refletir o perfil do usuário de forma incompleta.",
+  "account.follows": "Seguidores",
+  "account.joined": "Entrou em {date}",
+  "account.suspended_disclaimer_full": "Este usuário foi suspenso por um moderador.",
+  "account.view_full_profile": "Ver o perfil completo",
+  "account_note.cancel": "Cancelar",
+  "account_note.edit": "Editar",
+  "account_note.glitch_placeholder": "Nenhum comentário fornecido",
+  "account_note.save": "Salvar",
+  "advanced_options.icon_title": "Opções avançadas",
+  "advanced_options.local-only.long": "Não publicar em outras instâncias",
+  "advanced_options.local-only.short": "Apenas localmente",
+  "advanced_options.local-only.tooltip": "Este post é somente local",
+  "advanced_options.threaded_mode.long": "Abrir automaticamente uma resposta ao postar",
+  "advanced_options.threaded_mode.short": "Modo de discussão",
+  "advanced_options.threaded_mode.tooltip": "Modo de discussão ativado",
+  "boost_modal.missing_description": "Este toot contém algumas mídias sem descrição",
+  "column.favourited_by": "Favoritado por",
+  "column.heading": "Diversos",
+  "column.reblogged_by": "Inpulsionado por",
+  "column.subheading": "Opções diversas",
+  "column_header.profile": "Perfil",
+  "column_subheading.lists": "Listas",
+  "column_subheading.navigation": "Navegação",
+  "community.column_settings.allow_local_only": "Mostrar os toots apenas locais",
+  "compose.attach": "Anexar...",
+  "compose.attach.doodle": "Desenhe algo",
+  "compose.attach.upload": "Enviar um arquivo",
+  "compose.content-type.html": "HTML",
+  "compose.content-type.markdown": "Markdown",
+  "compose.content-type.plain": "Texto sem formatação",
+  "compose_form.poll.multiple_choices": "Permitir múltipla escolha",
+  "compose_form.poll.single_choice": "Permitir uma escolha",
+  "compose_form.spoiler": "Ocultar texto atrás do aviso",
+  "confirmation_modal.do_not_ask_again": "Não pedir confirmação novamente",
+  "confirmations.deprecated_settings.confirm": "Usar preferências do Mastodon",
+  "confirmations.deprecated_settings.message": "Alguns dos {app_settings} específicos do dispositivo que você está usando foram substituídos por Mastodon {preferences} e serão substituídos:",
+  "confirmations.missing_media_description.confirm": "Enviar mesmo assim",
+  "confirmations.missing_media_description.edit": "Editar mídia",
+  "confirmations.missing_media_description.message": "Pelo menos um anexo de mídia não tem uma descrição. Considere descrever todos os anexos de mídia para deficientes visuais antes de enviar seu toot.",
+  "confirmations.unfilter.author": "Autor",
+  "confirmations.unfilter.confirm": "Exibir",
+  "confirmations.unfilter.edit_filter": "Editar filtro",
+  "confirmations.unfilter.filters": "Correspondência de {count, plural, one {filtro} other {filtros}}",
+  "content-type.change": "Tipo de conteúdo",
+  "direct.group_by_conversations": "Agrupar por conversa",
+  "endorsed_accounts_editor.endorsed_accounts": "Contas em destaque",
+  "favourite_modal.combo": "Você pode pressionar {combo} para pular isso da próxima vez",
+  "getting_started.onboarding": "Mostre-me ao redor",
+  "home.column_settings.advanced": "Avançado",
+  "home.column_settings.filter_regex": "Filtrar com uma expressão regular",
+  "home.column_settings.show_direct": "Mostrar DMs",
+  "home.settings": "Configurações da coluna",
+  "keyboard_shortcuts.bookmark": "para marcar",
+  "keyboard_shortcuts.secondary_toot": "para enviar toot usando a configuração de privacidade secundária",
+  "keyboard_shortcuts.toggle_collapse": "para recolher/mostrar toots",
+  "layout.auto": "Automático",
+  "layout.desktop": "Área de trabalho",
+  "layout.hint.auto": "Escolher automaticamente o layout baseado na configuração \"Habilitar interface web avançada\" e o tamanho da tela.",
+  "layout.hint.desktop": "Use o layout de várias colunas independentemente da configuração \"Habilitar interface web avançada\" ou do tamanho da tela.",
+  "layout.hint.single": "Use o layout de uma coluna independentemente da configuração \"Habilitar interface web avançada\" ou do tamanho da tela.",
+  "layout.single": "Celular",
+  "media_gallery.sensitive": "Sensível",
+  "moved_to_warning": "Esta conta foi como movida para {moved_to_link} e, portanto, pode não aceitar novos seguidores.",
+  "navigation_bar.app_settings": "Configurações do aplicativo",
+  "navigation_bar.featured_users": "Usuários em destaque",
+  "navigation_bar.info": "Informação estendida",
+  "navigation_bar.keyboard_shortcuts": "Atalhos de teclado",
+  "navigation_bar.misc": "Diversos",
+  "notification.markForDeletion": "Marcar para exclusão",
+  "notification_purge.btn_all": "Selecionar\ntudo",
+  "notification_purge.btn_apply": "Limpar\nselecionados",
+  "notification_purge.btn_invert": "Inverter\nseleção",
+  "notification_purge.btn_none": "Selecionar\nnenhum",
+  "notification_purge.start": "Entrar no modo de limpeza de notificação",
+  "notifications.marked_clear": "Limpar as notificações selecionadas",
+  "notifications.marked_clear_confirmation": "Tem certeza que deseja limpar todas as notificações selecionadas permanentemente?",
+  "onboarding.done": "Feito",
+  "onboarding.next": "Próximo",
+  "onboarding.page_five.public_timelines": "A linha do tempo local mostra publicações públicas de todos em {domain}. A linha do tempo federada mostra publicações públicas de todos que as pessoas seguem em {domain}. Estas são as linhas do tempo públicas, uma ótima maneira de descobrir novas pessoas.",
+  "onboarding.page_four.home": "A linha do tempo da casa mostra publicações de pessoas que você segue.",
+  "onboarding.page_four.notifications": "A coluna de notificações mostra quando alguém interage com você.",
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_one.handle": "Você está em {domain}, então o seu identificador completo é {handle}",
+  "onboarding.page_one.welcome": "Bem-vindo ao {domain}!",
+  "onboarding.page_six.admin": "O administrador da sua instância é {admin}.",
+  "onboarding.page_six.almost_done": "Quase pronto...",
+  "onboarding.page_six.appetoot": "Bom Appetoot!",
+  "onboarding.page_six.apps_available": "Há {apps} disponíveis para iOS, Android e outras plataformas.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "onboarding.page_six.guidelines": "diretrizes da comunidade",
+  "onboarding.page_six.read_guidelines": "Por favor, leia {domain} {guidelines}!",
+  "onboarding.page_six.various_app": "aplicativos móveis",
+  "onboarding.page_three.profile": "Edite seu perfil para alterar seu avatar, bio e nome de exibição. Lá você também encontrará outras preferências.",
+  "onboarding.page_three.search": "Use a barra de busca para encontrar pessoas e procure hashtags, tais como {illustration} e {introductions}. Para procurar uma pessoa que não esteja neste caso, use o identificador completo.",
+  "onboarding.page_two.compose": "Escreva as postagens a partir da coluna de composição. Você pode enviar imagens, alterar as configurações de privacidade e adicionar avisos de conteúdo com os ícones abaixo.",
+  "onboarding.skip": "Pular",
+  "settings.always_show_spoilers_field": "Sempre ativar o campo Aviso de Conteúdo",
+  "settings.auto_collapse": "Colapso automático",
+  "settings.auto_collapse_all": "Tudo",
+  "settings.auto_collapse_lengthy": "Toots longos",
+  "settings.auto_collapse_media": "Toots com mídia",
+  "settings.auto_collapse_notifications": "Notificações",
+  "settings.auto_collapse_reblogs": "Impulsos",
+  "settings.auto_collapse_replies": "Respostas",
+  "settings.close": "Fechar",
+  "settings.collapsed_statuses": "Toots recolhidos",
+  "settings.compose_box_opts": "Caixa de composição",
+  "settings.confirm_before_clearing_draft": "Mostrar diálogo de confirmação antes de sobrescrever a mensagem que está sendo composta",
+  "settings.confirm_boost_missing_media_description": "Mostrar diálogo antes de inpulsionar os toots sem descrições de mídia",
+  "settings.confirm_missing_media_description": "Mostrar diálogo antes de enviar toots sem descrições de mídia",
+  "settings.content_warnings": "Content warnings",
+  "settings.content_warnings.regexp": "Expressão regular",
+  "settings.content_warnings_filter": "Avisos de conteúdo para não revelar automaticamente:",
+  "settings.content_warnings_media_outside": "Exibir anexos de mídia fora avisos de conteúdo",
+  "settings.content_warnings_media_outside_hint": "Reproduzir o comportamento do Mastodonte, fazendo com que a alternância do Aviso de Conteúdo não afete os anexos de mídia",
+  "settings.content_warnings_shared_state": "Mostrar/ocultar o conteúdo de todas as cópias de uma só vez",
+  "settings.content_warnings_shared_state_hint": "Reproduzir o comportamento do Mastodonte fazendo com que o botão de Aviso de Conteúdo afete todas as cópias de um post de uma só vez. Isto evitará o colapso automático de qualquer cópia de um toon com Aviso de Conteúdo revelado",
+  "settings.content_warnings_unfold_opts": "Opções de auto-revelar",
+  "settings.deprecated_setting": "Essa configuração agora é controlada pelo {settings_page_link} do Mastodon",
+  "settings.enable_collapsed": "Habilitar toots recolhidos",
+  "settings.enable_collapsed_hint": "Posts recolhidos têm partes dos seus conteúdos ocultos para ocupar menos espaço na tela. Isto é diferente do recurso 'Aviso de Conteúdo'",
+  "settings.enable_content_warnings_auto_unfold": "Revelar automaticamente os avisos de conteúdo",
+  "settings.general": "Geral",
+  "settings.hicolor_privacy_icons": "Ícones de privacidade com cores de alto contraste",
+  "settings.hicolor_privacy_icons.hint": "Exibir ícones de privacidade em cores brilhantes e facilmente distinguíveis",
+  "settings.image_backgrounds": "Fundos de imagem",
+  "settings.image_backgrounds_media": "Pré-visualização da mídia de toots colapsados",
+  "settings.image_backgrounds_media_hint": "Se o post tiver algum anexo de mídia, use o primeiro em um plano de fundo",
+  "settings.image_backgrounds_users": "Dar a toots recolhidos uma imagem de fundo",
+  "settings.inline_preview_cards": "Cartões de pré-visualização em linha para links externos",
+  "settings.layout": "Layout:",
+  "settings.layout_opts": "Opções de layout",
+  "settings.media": "Mídia",
+  "settings.media_fullwidth": "Pré-visualização da mídia em largura total",
+  "settings.media_letterbox": "Caixa de mensagens",
+  "settings.media_letterbox_hint": "Escala para baixo para encher os recipientes de imagem em vez de esticá-los e cortá-los",
+  "settings.media_reveal_behind_cw": "Revelar mídia sensível por trás de um Aviso de Conteúdo por padrão",
+  "settings.notifications.favicon_badge": "Notificações não lidas como emblema do favicon",
+  "settings.notifications.favicon_badge.hint": "Adicionar um emblema para notificações não lidas ao favicon",
+  "settings.notifications.tab_badge": "Emblema de notificações não lidas",
+  "settings.notifications.tab_badge.hint": "Exibir um emblema para notificações não lidas nos ícones de coluna quando a coluna de notificações não estiver aberta",
+  "settings.notifications_opts": "Opções de notificações",
+  "settings.pop_in_left": "Esquerda",
+  "settings.pop_in_player": "Ativar player pop-in",
+  "settings.pop_in_position": "Posição do player:",
+  "settings.pop_in_right": "Direita",
+  "settings.preferences": "Preferences",
+  "settings.prepend_cw_re": "Preparar \"re: \" para avisos de conteúdo quando responder",
+  "settings.preselect_on_reply": "Nome de usuário pré-selecionado na resposta",
+  "settings.preselect_on_reply_hint": "Ao responder a uma conversa com vários participantes, pré-selecionar nomes de usuários após o primeiro",
+  "settings.rewrite_mentions": "Reescrever as menções nos status exibidos",
+  "settings.rewrite_mentions_acct": "Reescrever com nome de usuário e domínio (quando a conta for remota)",
+  "settings.rewrite_mentions_no": "Não reescrever menções",
+  "settings.rewrite_mentions_username": "Reescreva com nome de usuário",
+  "settings.shared_settings_link": "preferências do usuário",
+  "settings.show_action_bar": "Mostrar botões de ação em toots recolhidos",
+  "settings.show_content_type_choice": "Exibir opção do tipo de conteúdo ao autorar toots",
+  "settings.show_reply_counter": "Exibir uma estimativa da contagem de respostas",
+  "settings.side_arm": "Botão de toot secundário:",
+  "settings.side_arm.none": "Nenhum",
+  "settings.side_arm_reply_mode": "Ao responder a um toot, o botão secundário de toot deve:",
+  "settings.side_arm_reply_mode.copy": "Copiar configuração de privacidade do toot sendo respondido a",
+  "settings.side_arm_reply_mode.keep": "Mantenha sua privacidade definida",
+  "settings.side_arm_reply_mode.restrict": "Restringir configuração de privacidade ao toot sendo respondido a",
+  "settings.status_icons": "Ícones de toot",
+  "settings.status_icons_language": "Indicador de idioma",
+  "settings.status_icons_local_only": "Indicador somente local",
+  "settings.status_icons_media": "Indicadores de mídia e enquete",
+  "settings.status_icons_reply": "Indicador de resposta",
+  "settings.status_icons_visibility": "Indicador de privacidade",
+  "settings.swipe_to_change_columns": "Permitir deslizar para alterar colunas (apenas celular)",
+  "settings.tag_misleading_links": "Marcar links enganosos",
+  "settings.tag_misleading_links.hint": "Acrescentar uma indicação visual com o link hospedeiro alvo a cada link que não o mencione explicitamente",
+  "settings.wide_view": "Visualização ampla (apenas no Modo desktop)",
+  "settings.wide_view_hint": "Estica as colunas para preencher melhor o espaço disponível.",
+  "status.collapse": "Recolher",
+  "status.has_audio": "Possui um arquivo de áudio anexado",
+  "status.has_pictures": "Possui uma imagem anexada",
+  "status.has_preview_card": "Possui uma pré-visualização anexada",
+  "status.has_video": "Possui um vídeo anexado",
+  "status.in_reply_to": "Este toot é uma resposta",
+  "status.is_poll": "Este toot é uma enquete",
+  "status.local_only": "Visível apenas em sua instância",
+  "status.sensitive_toggle": "Clique para ver",
+  "status.uncollapse": "Revelar",
+  "web_app_crash.change_your_settings": "Altere suas {settings}",
+  "web_app_crash.content": "Você poderia tentar qualquer uma das seguintes opções:",
+  "web_app_crash.debug_info": "Informações de depuração",
+  "web_app_crash.disable_addons": "Desativar complementos do navegador ou ferramentas de tradução integradas",
+  "web_app_crash.issue_tracker": "rastreador de problemas",
+  "web_app_crash.reload": "Recarregar",
+  "web_app_crash.reload_page": "{reload} a página atual",
+  "web_app_crash.report_issue": "Relatar um erro no {issuetracker}",
+  "web_app_crash.settings": "configurações",
+  "web_app_crash.title": "Desculpe, mas algo deu errado com o aplicativo Mastodon."
+}
diff --git a/app/javascript/flavours/glitch/locales/pt-PT.js b/app/javascript/flavours/glitch/locales/pt-PT.js
deleted file mode 100644
index cf7afd17a..000000000
--- a/app/javascript/flavours/glitch/locales/pt-PT.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/pt-PT.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/pt-PT.json b/app/javascript/flavours/glitch/locales/pt-PT.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/pt-PT.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/ro.js b/app/javascript/flavours/glitch/locales/ro.js
deleted file mode 100644
index a16446c6a..000000000
--- a/app/javascript/flavours/glitch/locales/ro.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ro.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ro.json b/app/javascript/flavours/glitch/locales/ro.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ro.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/ru.js b/app/javascript/flavours/glitch/locales/ru.js
deleted file mode 100644
index 0e9f1de71..000000000
--- a/app/javascript/flavours/glitch/locales/ru.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ru.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ru.json b/app/javascript/flavours/glitch/locales/ru.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ru.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/sa.js b/app/javascript/flavours/glitch/locales/sa.js
deleted file mode 100644
index 4cade0a07..000000000
--- a/app/javascript/flavours/glitch/locales/sa.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/sa.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sa.json b/app/javascript/flavours/glitch/locales/sa.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sa.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/sc.js b/app/javascript/flavours/glitch/locales/sc.js
deleted file mode 100644
index 88a83aa53..000000000
--- a/app/javascript/flavours/glitch/locales/sc.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/sc.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sc.json b/app/javascript/flavours/glitch/locales/sc.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sc.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/sco.json b/app/javascript/flavours/glitch/locales/sco.json
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sco.json
@@ -0,0 +1 @@
+{}
diff --git a/app/javascript/flavours/glitch/locales/si.js b/app/javascript/flavours/glitch/locales/si.js
deleted file mode 100644
index d43266254..000000000
--- a/app/javascript/flavours/glitch/locales/si.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/si.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/si.json b/app/javascript/flavours/glitch/locales/si.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/si.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/sk.js b/app/javascript/flavours/glitch/locales/sk.js
deleted file mode 100644
index 5fba6ab97..000000000
--- a/app/javascript/flavours/glitch/locales/sk.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/sk.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sk.json b/app/javascript/flavours/glitch/locales/sk.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sk.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/sl.js b/app/javascript/flavours/glitch/locales/sl.js
deleted file mode 100644
index c53c1bae8..000000000
--- a/app/javascript/flavours/glitch/locales/sl.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/sl.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sl.json b/app/javascript/flavours/glitch/locales/sl.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sl.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/sq.js b/app/javascript/flavours/glitch/locales/sq.js
deleted file mode 100644
index 2fb7a2973..000000000
--- a/app/javascript/flavours/glitch/locales/sq.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/sq.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sq.json b/app/javascript/flavours/glitch/locales/sq.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sq.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/sr-Latn.js b/app/javascript/flavours/glitch/locales/sr-Latn.js
deleted file mode 100644
index b42d5eaaf..000000000
--- a/app/javascript/flavours/glitch/locales/sr-Latn.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/sr-Latn.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sr-Latn.json b/app/javascript/flavours/glitch/locales/sr-Latn.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sr-Latn.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/sr.js b/app/javascript/flavours/glitch/locales/sr.js
deleted file mode 100644
index 8793d8d1e..000000000
--- a/app/javascript/flavours/glitch/locales/sr.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/sr.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sr.json b/app/javascript/flavours/glitch/locales/sr.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sr.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/sv.js b/app/javascript/flavours/glitch/locales/sv.js
deleted file mode 100644
index b62c353fe..000000000
--- a/app/javascript/flavours/glitch/locales/sv.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/sv.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sv.json b/app/javascript/flavours/glitch/locales/sv.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sv.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/szl.js b/app/javascript/flavours/glitch/locales/szl.js
deleted file mode 100644
index 0b50afe45..000000000
--- a/app/javascript/flavours/glitch/locales/szl.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/szl.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/szl.json b/app/javascript/flavours/glitch/locales/szl.json
new file mode 100644
index 000000000..807ed8207
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/szl.json
@@ -0,0 +1,201 @@
+{
+  "about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
+  "account.add_account_note": "Add note for @{name}",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
+  "account.follows": "Follows",
+  "account.joined": "Joined {date}",
+  "account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
+  "account.view_full_profile": "View full profile",
+  "account_note.cancel": "Cancel",
+  "account_note.edit": "Edit",
+  "account_note.glitch_placeholder": "No comment provided",
+  "account_note.save": "Save",
+  "advanced_options.icon_title": "Advanced options",
+  "advanced_options.local-only.long": "Do not post to other instances",
+  "advanced_options.local-only.short": "Local-only",
+  "advanced_options.local-only.tooltip": "This post is local-only",
+  "advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
+  "advanced_options.threaded_mode.short": "Threaded mode",
+  "advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
+  "boost_modal.missing_description": "This toot contains some media without description",
+  "column.favourited_by": "Favourited by",
+  "column.heading": "Misc",
+  "column.reblogged_by": "Boosted by",
+  "column.subheading": "Miscellaneous options",
+  "column_header.profile": "Profile",
+  "column_subheading.lists": "Lists",
+  "column_subheading.navigation": "Navigation",
+  "community.column_settings.allow_local_only": "Show local-only toots",
+  "compose.attach": "Attach...",
+  "compose.attach.doodle": "Draw something",
+  "compose.attach.upload": "Upload a file",
+  "compose.content-type.html": "HTML",
+  "compose.content-type.markdown": "Markdown",
+  "compose.content-type.plain": "Plain text",
+  "compose_form.poll.multiple_choices": "Allow multiple choices",
+  "compose_form.poll.single_choice": "Allow one choice",
+  "compose_form.spoiler": "Hide text behind warning",
+  "confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
+  "confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
+  "confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
+  "confirmations.missing_media_description.confirm": "Send anyway",
+  "confirmations.missing_media_description.edit": "Edit media",
+  "confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
+  "confirmations.unfilter.author": "Author",
+  "confirmations.unfilter.confirm": "Show",
+  "confirmations.unfilter.edit_filter": "Edit filter",
+  "confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
+  "content-type.change": "Content type",
+  "direct.group_by_conversations": "Group by conversation",
+  "endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
+  "favourite_modal.combo": "You can press {combo} to skip this next time",
+  "getting_started.onboarding": "Show me around",
+  "home.column_settings.advanced": "Advanced",
+  "home.column_settings.filter_regex": "Filter out by regular expressions",
+  "home.column_settings.show_direct": "Show DMs",
+  "home.settings": "Column settings",
+  "keyboard_shortcuts.bookmark": "to bookmark",
+  "keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
+  "keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
+  "layout.auto": "Auto",
+  "layout.desktop": "Desktop",
+  "layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
+  "layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
+  "layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
+  "layout.single": "Mobile",
+  "media_gallery.sensitive": "Sensitive",
+  "moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
+  "navigation_bar.app_settings": "App settings",
+  "navigation_bar.featured_users": "Featured users",
+  "navigation_bar.info": "Extended information",
+  "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
+  "navigation_bar.misc": "Misc",
+  "notification.markForDeletion": "Mark for deletion",
+  "notification_purge.btn_all": "Select\nall",
+  "notification_purge.btn_apply": "Clear\nselected",
+  "notification_purge.btn_invert": "Invert\nselection",
+  "notification_purge.btn_none": "Select\nnone",
+  "notification_purge.start": "Enter notification cleaning mode",
+  "notifications.marked_clear": "Clear selected notifications",
+  "notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
+  "onboarding.done": "Done",
+  "onboarding.next": "Next",
+  "onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
+  "onboarding.page_four.home": "The home timeline shows posts from people you follow.",
+  "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
+  "onboarding.page_one.welcome": "Welcome to {domain}!",
+  "onboarding.page_six.admin": "Your instance's admin is {admin}.",
+  "onboarding.page_six.almost_done": "Almost done...",
+  "onboarding.page_six.appetoot": "Bon Appetoot!",
+  "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "onboarding.page_six.guidelines": "community guidelines",
+  "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
+  "onboarding.page_six.various_app": "mobile apps",
+  "onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
+  "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
+  "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
+  "onboarding.skip": "Skip",
+  "settings.always_show_spoilers_field": "Always enable the Content Warning field",
+  "settings.auto_collapse": "Automatic collapsing",
+  "settings.auto_collapse_all": "Everything",
+  "settings.auto_collapse_lengthy": "Lengthy toots",
+  "settings.auto_collapse_media": "Toots with media",
+  "settings.auto_collapse_notifications": "Notifications",
+  "settings.auto_collapse_reblogs": "Boosts",
+  "settings.auto_collapse_replies": "Replies",
+  "settings.close": "Close",
+  "settings.collapsed_statuses": "Collapsed toots",
+  "settings.compose_box_opts": "Compose box",
+  "settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
+  "settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
+  "settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
+  "settings.content_warnings": "Content warnings",
+  "settings.content_warnings.regexp": "Regular expression",
+  "settings.content_warnings_filter": "Content warnings to not automatically unfold:",
+  "settings.content_warnings_media_outside": "Display media attachments outside content warnings",
+  "settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
+  "settings.content_warnings_shared_state": "Show/hide content of all copies at once",
+  "settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
+  "settings.content_warnings_unfold_opts": "Auto-unfolding options",
+  "settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
+  "settings.enable_collapsed": "Enable collapsed toots",
+  "settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
+  "settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
+  "settings.filters": "Filters",
+  "settings.general": "General",
+  "settings.hicolor_privacy_icons": "High color privacy icons",
+  "settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
+  "settings.image_backgrounds": "Image backgrounds",
+  "settings.image_backgrounds_media": "Preview collapsed toot media",
+  "settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
+  "settings.image_backgrounds_users": "Give collapsed toots an image background",
+  "settings.inline_preview_cards": "Inline preview cards for external links",
+  "settings.layout": "Layout:",
+  "settings.layout_opts": "Layout options",
+  "settings.media": "Media",
+  "settings.media_fullwidth": "Full-width media previews",
+  "settings.media_letterbox": "Letterbox media",
+  "settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
+  "settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
+  "settings.notifications.favicon_badge": "Unread notifications favicon badge",
+  "settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
+  "settings.notifications.tab_badge": "Unread notifications badge",
+  "settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
+  "settings.notifications_opts": "Notifications options",
+  "settings.pop_in_left": "Left",
+  "settings.pop_in_player": "Enable pop-in player",
+  "settings.pop_in_position": "Pop-in player position:",
+  "settings.pop_in_right": "Right",
+  "settings.preferences": "Preferences",
+  "settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
+  "settings.preselect_on_reply": "Pre-select usernames on reply",
+  "settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
+  "settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
+  "settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
+  "settings.rewrite_mentions_no": "Do not rewrite mentions",
+  "settings.rewrite_mentions_username": "Rewrite with username",
+  "settings.shared_settings_link": "user preferences",
+  "settings.show_action_bar": "Show action buttons in collapsed toots",
+  "settings.show_content_type_choice": "Show content-type choice when authoring toots",
+  "settings.show_reply_counter": "Display an estimate of the reply count",
+  "settings.side_arm": "Secondary toot button:",
+  "settings.side_arm.none": "None",
+  "settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
+  "settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
+  "settings.side_arm_reply_mode.keep": "Keep its set privacy",
+  "settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
+  "settings.status_icons": "Toot icons",
+  "settings.status_icons_language": "Language indicator",
+  "settings.status_icons_local_only": "Local-only indicator",
+  "settings.status_icons_media": "Media and poll indicators",
+  "settings.status_icons_reply": "Reply indicator",
+  "settings.status_icons_visibility": "Toot privacy indicator",
+  "settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
+  "settings.tag_misleading_links": "Tag misleading links",
+  "settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
+  "settings.wide_view": "Wide view (Desktop mode only)",
+  "settings.wide_view_hint": "Stretches columns to better fill the available space.",
+  "status.collapse": "Collapse",
+  "status.has_audio": "Features attached audio files",
+  "status.has_pictures": "Features attached pictures",
+  "status.has_preview_card": "Features an attached preview card",
+  "status.has_video": "Features attached videos",
+  "status.in_reply_to": "This toot is a reply",
+  "status.is_poll": "This toot is a poll",
+  "status.local_only": "Only visible from your instance",
+  "status.sensitive_toggle": "Click to view",
+  "status.uncollapse": "Uncollapse",
+  "web_app_crash.change_your_settings": "Change your {settings}",
+  "web_app_crash.content": "You could try any of the following:",
+  "web_app_crash.debug_info": "Debug information",
+  "web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
+  "web_app_crash.issue_tracker": "issue tracker",
+  "web_app_crash.reload": "Reload",
+  "web_app_crash.reload_page": "{reload} the current page",
+  "web_app_crash.report_issue": "Report a bug in the {issuetracker}",
+  "web_app_crash.settings": "settings",
+  "web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
+}
diff --git a/app/javascript/flavours/glitch/locales/ta.js b/app/javascript/flavours/glitch/locales/ta.js
deleted file mode 100644
index d6ecdcb1b..000000000
--- a/app/javascript/flavours/glitch/locales/ta.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ta.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ta.json b/app/javascript/flavours/glitch/locales/ta.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ta.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/tai.js b/app/javascript/flavours/glitch/locales/tai.js
deleted file mode 100644
index f26cec5bd..000000000
--- a/app/javascript/flavours/glitch/locales/tai.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/tai.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/tai.json b/app/javascript/flavours/glitch/locales/tai.json
new file mode 100644
index 000000000..807ed8207
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/tai.json
@@ -0,0 +1,201 @@
+{
+  "about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
+  "account.add_account_note": "Add note for @{name}",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
+  "account.follows": "Follows",
+  "account.joined": "Joined {date}",
+  "account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
+  "account.view_full_profile": "View full profile",
+  "account_note.cancel": "Cancel",
+  "account_note.edit": "Edit",
+  "account_note.glitch_placeholder": "No comment provided",
+  "account_note.save": "Save",
+  "advanced_options.icon_title": "Advanced options",
+  "advanced_options.local-only.long": "Do not post to other instances",
+  "advanced_options.local-only.short": "Local-only",
+  "advanced_options.local-only.tooltip": "This post is local-only",
+  "advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
+  "advanced_options.threaded_mode.short": "Threaded mode",
+  "advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
+  "boost_modal.missing_description": "This toot contains some media without description",
+  "column.favourited_by": "Favourited by",
+  "column.heading": "Misc",
+  "column.reblogged_by": "Boosted by",
+  "column.subheading": "Miscellaneous options",
+  "column_header.profile": "Profile",
+  "column_subheading.lists": "Lists",
+  "column_subheading.navigation": "Navigation",
+  "community.column_settings.allow_local_only": "Show local-only toots",
+  "compose.attach": "Attach...",
+  "compose.attach.doodle": "Draw something",
+  "compose.attach.upload": "Upload a file",
+  "compose.content-type.html": "HTML",
+  "compose.content-type.markdown": "Markdown",
+  "compose.content-type.plain": "Plain text",
+  "compose_form.poll.multiple_choices": "Allow multiple choices",
+  "compose_form.poll.single_choice": "Allow one choice",
+  "compose_form.spoiler": "Hide text behind warning",
+  "confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
+  "confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
+  "confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
+  "confirmations.missing_media_description.confirm": "Send anyway",
+  "confirmations.missing_media_description.edit": "Edit media",
+  "confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
+  "confirmations.unfilter.author": "Author",
+  "confirmations.unfilter.confirm": "Show",
+  "confirmations.unfilter.edit_filter": "Edit filter",
+  "confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
+  "content-type.change": "Content type",
+  "direct.group_by_conversations": "Group by conversation",
+  "endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
+  "favourite_modal.combo": "You can press {combo} to skip this next time",
+  "getting_started.onboarding": "Show me around",
+  "home.column_settings.advanced": "Advanced",
+  "home.column_settings.filter_regex": "Filter out by regular expressions",
+  "home.column_settings.show_direct": "Show DMs",
+  "home.settings": "Column settings",
+  "keyboard_shortcuts.bookmark": "to bookmark",
+  "keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
+  "keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
+  "layout.auto": "Auto",
+  "layout.desktop": "Desktop",
+  "layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
+  "layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
+  "layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
+  "layout.single": "Mobile",
+  "media_gallery.sensitive": "Sensitive",
+  "moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
+  "navigation_bar.app_settings": "App settings",
+  "navigation_bar.featured_users": "Featured users",
+  "navigation_bar.info": "Extended information",
+  "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
+  "navigation_bar.misc": "Misc",
+  "notification.markForDeletion": "Mark for deletion",
+  "notification_purge.btn_all": "Select\nall",
+  "notification_purge.btn_apply": "Clear\nselected",
+  "notification_purge.btn_invert": "Invert\nselection",
+  "notification_purge.btn_none": "Select\nnone",
+  "notification_purge.start": "Enter notification cleaning mode",
+  "notifications.marked_clear": "Clear selected notifications",
+  "notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
+  "onboarding.done": "Done",
+  "onboarding.next": "Next",
+  "onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
+  "onboarding.page_four.home": "The home timeline shows posts from people you follow.",
+  "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
+  "onboarding.page_one.welcome": "Welcome to {domain}!",
+  "onboarding.page_six.admin": "Your instance's admin is {admin}.",
+  "onboarding.page_six.almost_done": "Almost done...",
+  "onboarding.page_six.appetoot": "Bon Appetoot!",
+  "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "onboarding.page_six.guidelines": "community guidelines",
+  "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
+  "onboarding.page_six.various_app": "mobile apps",
+  "onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
+  "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
+  "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
+  "onboarding.skip": "Skip",
+  "settings.always_show_spoilers_field": "Always enable the Content Warning field",
+  "settings.auto_collapse": "Automatic collapsing",
+  "settings.auto_collapse_all": "Everything",
+  "settings.auto_collapse_lengthy": "Lengthy toots",
+  "settings.auto_collapse_media": "Toots with media",
+  "settings.auto_collapse_notifications": "Notifications",
+  "settings.auto_collapse_reblogs": "Boosts",
+  "settings.auto_collapse_replies": "Replies",
+  "settings.close": "Close",
+  "settings.collapsed_statuses": "Collapsed toots",
+  "settings.compose_box_opts": "Compose box",
+  "settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
+  "settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
+  "settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
+  "settings.content_warnings": "Content warnings",
+  "settings.content_warnings.regexp": "Regular expression",
+  "settings.content_warnings_filter": "Content warnings to not automatically unfold:",
+  "settings.content_warnings_media_outside": "Display media attachments outside content warnings",
+  "settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
+  "settings.content_warnings_shared_state": "Show/hide content of all copies at once",
+  "settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
+  "settings.content_warnings_unfold_opts": "Auto-unfolding options",
+  "settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
+  "settings.enable_collapsed": "Enable collapsed toots",
+  "settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
+  "settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
+  "settings.filters": "Filters",
+  "settings.general": "General",
+  "settings.hicolor_privacy_icons": "High color privacy icons",
+  "settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
+  "settings.image_backgrounds": "Image backgrounds",
+  "settings.image_backgrounds_media": "Preview collapsed toot media",
+  "settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
+  "settings.image_backgrounds_users": "Give collapsed toots an image background",
+  "settings.inline_preview_cards": "Inline preview cards for external links",
+  "settings.layout": "Layout:",
+  "settings.layout_opts": "Layout options",
+  "settings.media": "Media",
+  "settings.media_fullwidth": "Full-width media previews",
+  "settings.media_letterbox": "Letterbox media",
+  "settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
+  "settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
+  "settings.notifications.favicon_badge": "Unread notifications favicon badge",
+  "settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
+  "settings.notifications.tab_badge": "Unread notifications badge",
+  "settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
+  "settings.notifications_opts": "Notifications options",
+  "settings.pop_in_left": "Left",
+  "settings.pop_in_player": "Enable pop-in player",
+  "settings.pop_in_position": "Pop-in player position:",
+  "settings.pop_in_right": "Right",
+  "settings.preferences": "Preferences",
+  "settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
+  "settings.preselect_on_reply": "Pre-select usernames on reply",
+  "settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
+  "settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
+  "settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
+  "settings.rewrite_mentions_no": "Do not rewrite mentions",
+  "settings.rewrite_mentions_username": "Rewrite with username",
+  "settings.shared_settings_link": "user preferences",
+  "settings.show_action_bar": "Show action buttons in collapsed toots",
+  "settings.show_content_type_choice": "Show content-type choice when authoring toots",
+  "settings.show_reply_counter": "Display an estimate of the reply count",
+  "settings.side_arm": "Secondary toot button:",
+  "settings.side_arm.none": "None",
+  "settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
+  "settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
+  "settings.side_arm_reply_mode.keep": "Keep its set privacy",
+  "settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
+  "settings.status_icons": "Toot icons",
+  "settings.status_icons_language": "Language indicator",
+  "settings.status_icons_local_only": "Local-only indicator",
+  "settings.status_icons_media": "Media and poll indicators",
+  "settings.status_icons_reply": "Reply indicator",
+  "settings.status_icons_visibility": "Toot privacy indicator",
+  "settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
+  "settings.tag_misleading_links": "Tag misleading links",
+  "settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
+  "settings.wide_view": "Wide view (Desktop mode only)",
+  "settings.wide_view_hint": "Stretches columns to better fill the available space.",
+  "status.collapse": "Collapse",
+  "status.has_audio": "Features attached audio files",
+  "status.has_pictures": "Features attached pictures",
+  "status.has_preview_card": "Features an attached preview card",
+  "status.has_video": "Features attached videos",
+  "status.in_reply_to": "This toot is a reply",
+  "status.is_poll": "This toot is a poll",
+  "status.local_only": "Only visible from your instance",
+  "status.sensitive_toggle": "Click to view",
+  "status.uncollapse": "Uncollapse",
+  "web_app_crash.change_your_settings": "Change your {settings}",
+  "web_app_crash.content": "You could try any of the following:",
+  "web_app_crash.debug_info": "Debug information",
+  "web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
+  "web_app_crash.issue_tracker": "issue tracker",
+  "web_app_crash.reload": "Reload",
+  "web_app_crash.reload_page": "{reload} the current page",
+  "web_app_crash.report_issue": "Report a bug in the {issuetracker}",
+  "web_app_crash.settings": "settings",
+  "web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
+}
diff --git a/app/javascript/flavours/glitch/locales/te.js b/app/javascript/flavours/glitch/locales/te.js
deleted file mode 100644
index afd6e4f7b..000000000
--- a/app/javascript/flavours/glitch/locales/te.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/te.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/te.json b/app/javascript/flavours/glitch/locales/te.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/te.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/th.js b/app/javascript/flavours/glitch/locales/th.js
deleted file mode 100644
index e939f8631..000000000
--- a/app/javascript/flavours/glitch/locales/th.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/th.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/th.json b/app/javascript/flavours/glitch/locales/th.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/th.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/tr.js b/app/javascript/flavours/glitch/locales/tr.js
deleted file mode 100644
index c2b740617..000000000
--- a/app/javascript/flavours/glitch/locales/tr.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/tr.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/tr.json b/app/javascript/flavours/glitch/locales/tr.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/tr.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/tt.js b/app/javascript/flavours/glitch/locales/tt.js
deleted file mode 100644
index ff74f6c29..000000000
--- a/app/javascript/flavours/glitch/locales/tt.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/tt.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/tt.json b/app/javascript/flavours/glitch/locales/tt.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/tt.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/ug.js b/app/javascript/flavours/glitch/locales/ug.js
deleted file mode 100644
index ab7ee0761..000000000
--- a/app/javascript/flavours/glitch/locales/ug.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ug.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ug.json b/app/javascript/flavours/glitch/locales/ug.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ug.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/uk.js b/app/javascript/flavours/glitch/locales/uk.js
deleted file mode 100644
index ab6d9a7dc..000000000
--- a/app/javascript/flavours/glitch/locales/uk.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/uk.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/uk.json b/app/javascript/flavours/glitch/locales/uk.json
new file mode 100644
index 000000000..b21584659
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/uk.json
@@ -0,0 +1,48 @@
+{
+  "advanced_options.local-only.long": "Не дмухати це на інші сервери",
+  "advanced_options.local-only.short": "Лише локальне",
+  "advanced_options.local-only.tooltip": "Цей дмух лише локальний",
+  "compose.attach": "Вкласти...",
+  "compose.attach.doodle": "Помалювати",
+  "compose.attach.upload": "Завантажити сюди файл",
+  "favourite_modal.combo": "Ви можете натиснути {combo}, щоб пропустити це наступного разу",
+  "getting_started.onboarding": "Шо тут",
+  "home.column_settings.show_direct": "Показати прямі повідомлення",
+  "layout.auto": "Автоматичний",
+  "layout.desktop": "Настільний",
+  "media_gallery.sensitive": "Чутливі",
+  "navigation_bar.app_settings": "Налаштування програми",
+  "notification.markForDeletion": "Позначити для видалення",
+  "notification_purge.btn_all": "Вибрати\nвсе",
+  "notification_purge.btn_apply": "Очистити\nвибір",
+  "notification_purge.btn_invert": "Інвертувати\nвибір",
+  "notification_purge.btn_none": "Вибрати\nнічого",
+  "notifications.marked_clear": "Очистити вибрані сповіщення",
+  "notifications.marked_clear_confirmation": "Ви впевнені, що хочете незворотньо очистити всі вибрані сповіщення?",
+  "onboarding.page_one.federation": "{domain} є сервером of Mastodon. Mastodon — мережа незалежних серверів, які працюють разом великою соціяльною мережою. Сервери Mastodon також називають „інстансами“.",
+  "onboarding.page_one.welcome": "Ласкаво просимо до {domain}!",
+  "onboarding.page_six.github": "{domain} використовує Glitchsoc. Glitchsoc — дружній {fork} {Mastodon}, сумісний з будь-яким сервером Mastodon або програмою для нього. Glitchsoc повністю вільний та відкритий. Повідомляти про баги, просити фічі, або працювати з кодом можна на {github}.",
+  "settings.auto_collapse": "Автоматичне згортання",
+  "settings.auto_collapse_all": "Все",
+  "settings.auto_collapse_lengthy": "Довгі дмухи",
+  "settings.auto_collapse_media": "Дмухи з медіафайлами",
+  "settings.auto_collapse_notifications": "Сповіщення",
+  "settings.auto_collapse_reblogs": "Передмухи",
+  "settings.auto_collapse_replies": "Відповіді",
+  "settings.close": "Закрити",
+  "settings.collapsed_statuses": "Згорнуті дмухи",
+  "settings.content_warnings": "Content warnings",
+  "settings.enable_collapsed": "Увімкути згорнутання дмухів",
+  "settings.general": "Основне",
+  "settings.image_backgrounds": "Картинки на тлі",
+  "settings.image_backgrounds_media": "Підглядати медіа зі схованих дмухів",
+  "settings.image_backgrounds_users": "Давати схованим дмухам тло-картинку",
+  "settings.media": "Медіа",
+  "settings.media_fullwidth": "Показувати медіа повною шириною",
+  "settings.media_letterbox": "Обрізати медіа",
+  "settings.preferences": "Користувацькі налаштування",
+  "settings.show_action_bar": "Показувати кнопки у згорнутих дмухах",
+  "settings.wide_view": "Широкий вид (тільки в режимі для комп'ютерів)",
+  "status.collapse": "Згорнути",
+  "status.uncollapse": "Розгорнути"
+}
diff --git a/app/javascript/flavours/glitch/locales/ur.js b/app/javascript/flavours/glitch/locales/ur.js
deleted file mode 100644
index 97ba291b0..000000000
--- a/app/javascript/flavours/glitch/locales/ur.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/ur.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ur.json b/app/javascript/flavours/glitch/locales/ur.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ur.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/vi.js b/app/javascript/flavours/glitch/locales/vi.js
deleted file mode 100644
index 499a96727..000000000
--- a/app/javascript/flavours/glitch/locales/vi.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/vi.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/vi.json b/app/javascript/flavours/glitch/locales/vi.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/vi.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/whitelist_af.json b/app/javascript/flavours/glitch/locales/whitelist_af.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_af.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ar.json b/app/javascript/flavours/glitch/locales/whitelist_ar.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ar.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ast.json b/app/javascript/flavours/glitch/locales/whitelist_ast.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ast.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_bg.json b/app/javascript/flavours/glitch/locales/whitelist_bg.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_bg.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_bn.json b/app/javascript/flavours/glitch/locales/whitelist_bn.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_bn.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_br.json b/app/javascript/flavours/glitch/locales/whitelist_br.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_br.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ca.json b/app/javascript/flavours/glitch/locales/whitelist_ca.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ca.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ckb.json b/app/javascript/flavours/glitch/locales/whitelist_ckb.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ckb.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_co.json b/app/javascript/flavours/glitch/locales/whitelist_co.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_co.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_cs.json b/app/javascript/flavours/glitch/locales/whitelist_cs.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_cs.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_cy.json b/app/javascript/flavours/glitch/locales/whitelist_cy.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_cy.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_da.json b/app/javascript/flavours/glitch/locales/whitelist_da.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_da.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_de.json b/app/javascript/flavours/glitch/locales/whitelist_de.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_de.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_el.json b/app/javascript/flavours/glitch/locales/whitelist_el.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_el.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_en.json b/app/javascript/flavours/glitch/locales/whitelist_en.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_en.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_eo.json b/app/javascript/flavours/glitch/locales/whitelist_eo.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_eo.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_es-AR.json b/app/javascript/flavours/glitch/locales/whitelist_es-AR.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_es-AR.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_es-MX.json b/app/javascript/flavours/glitch/locales/whitelist_es-MX.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_es-MX.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_es.json b/app/javascript/flavours/glitch/locales/whitelist_es.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_es.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_et.json b/app/javascript/flavours/glitch/locales/whitelist_et.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_et.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_eu.json b/app/javascript/flavours/glitch/locales/whitelist_eu.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_eu.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_fa.json b/app/javascript/flavours/glitch/locales/whitelist_fa.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_fa.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_fi.json b/app/javascript/flavours/glitch/locales/whitelist_fi.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_fi.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_fr.json b/app/javascript/flavours/glitch/locales/whitelist_fr.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_fr.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ga.json b/app/javascript/flavours/glitch/locales/whitelist_ga.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ga.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_gd.json b/app/javascript/flavours/glitch/locales/whitelist_gd.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_gd.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_gl.json b/app/javascript/flavours/glitch/locales/whitelist_gl.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_gl.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_he.json b/app/javascript/flavours/glitch/locales/whitelist_he.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_he.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_hi.json b/app/javascript/flavours/glitch/locales/whitelist_hi.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_hi.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_hr.json b/app/javascript/flavours/glitch/locales/whitelist_hr.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_hr.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_hu.json b/app/javascript/flavours/glitch/locales/whitelist_hu.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_hu.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_hy.json b/app/javascript/flavours/glitch/locales/whitelist_hy.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_hy.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_id.json b/app/javascript/flavours/glitch/locales/whitelist_id.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_id.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_io.json b/app/javascript/flavours/glitch/locales/whitelist_io.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_io.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_is.json b/app/javascript/flavours/glitch/locales/whitelist_is.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_is.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_it.json b/app/javascript/flavours/glitch/locales/whitelist_it.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_it.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ja.json b/app/javascript/flavours/glitch/locales/whitelist_ja.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ja.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ka.json b/app/javascript/flavours/glitch/locales/whitelist_ka.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ka.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_kab.json b/app/javascript/flavours/glitch/locales/whitelist_kab.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_kab.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_kk.json b/app/javascript/flavours/glitch/locales/whitelist_kk.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_kk.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_kn.json b/app/javascript/flavours/glitch/locales/whitelist_kn.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_kn.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ko.json b/app/javascript/flavours/glitch/locales/whitelist_ko.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ko.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ku.json b/app/javascript/flavours/glitch/locales/whitelist_ku.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ku.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_kw.json b/app/javascript/flavours/glitch/locales/whitelist_kw.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_kw.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_lt.json b/app/javascript/flavours/glitch/locales/whitelist_lt.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_lt.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_lv.json b/app/javascript/flavours/glitch/locales/whitelist_lv.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_lv.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_mk.json b/app/javascript/flavours/glitch/locales/whitelist_mk.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_mk.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ml.json b/app/javascript/flavours/glitch/locales/whitelist_ml.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ml.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_mr.json b/app/javascript/flavours/glitch/locales/whitelist_mr.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_mr.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ms.json b/app/javascript/flavours/glitch/locales/whitelist_ms.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ms.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_nl.json b/app/javascript/flavours/glitch/locales/whitelist_nl.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_nl.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_nn.json b/app/javascript/flavours/glitch/locales/whitelist_nn.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_nn.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_no.json b/app/javascript/flavours/glitch/locales/whitelist_no.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_no.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_oc.json b/app/javascript/flavours/glitch/locales/whitelist_oc.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_oc.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_pa.json b/app/javascript/flavours/glitch/locales/whitelist_pa.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_pa.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_pl.json b/app/javascript/flavours/glitch/locales/whitelist_pl.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_pl.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_pt-BR.json b/app/javascript/flavours/glitch/locales/whitelist_pt-BR.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_pt-BR.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_pt-PT.json b/app/javascript/flavours/glitch/locales/whitelist_pt-PT.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_pt-PT.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ro.json b/app/javascript/flavours/glitch/locales/whitelist_ro.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ro.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ru.json b/app/javascript/flavours/glitch/locales/whitelist_ru.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ru.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_sa.json b/app/javascript/flavours/glitch/locales/whitelist_sa.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_sa.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_sc.json b/app/javascript/flavours/glitch/locales/whitelist_sc.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_sc.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_si.json b/app/javascript/flavours/glitch/locales/whitelist_si.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_si.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_sk.json b/app/javascript/flavours/glitch/locales/whitelist_sk.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_sk.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_sl.json b/app/javascript/flavours/glitch/locales/whitelist_sl.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_sl.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_sq.json b/app/javascript/flavours/glitch/locales/whitelist_sq.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_sq.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_sr-Latn.json b/app/javascript/flavours/glitch/locales/whitelist_sr-Latn.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_sr-Latn.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_sr.json b/app/javascript/flavours/glitch/locales/whitelist_sr.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_sr.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_sv.json b/app/javascript/flavours/glitch/locales/whitelist_sv.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_sv.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_szl.json b/app/javascript/flavours/glitch/locales/whitelist_szl.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_szl.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ta.json b/app/javascript/flavours/glitch/locales/whitelist_ta.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ta.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_tai.json b/app/javascript/flavours/glitch/locales/whitelist_tai.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_tai.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_te.json b/app/javascript/flavours/glitch/locales/whitelist_te.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_te.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_th.json b/app/javascript/flavours/glitch/locales/whitelist_th.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_th.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_tr.json b/app/javascript/flavours/glitch/locales/whitelist_tr.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_tr.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_tt.json b/app/javascript/flavours/glitch/locales/whitelist_tt.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_tt.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ug.json b/app/javascript/flavours/glitch/locales/whitelist_ug.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ug.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_uk.json b/app/javascript/flavours/glitch/locales/whitelist_uk.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_uk.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_ur.json b/app/javascript/flavours/glitch/locales/whitelist_ur.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_ur.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_vi.json b/app/javascript/flavours/glitch/locales/whitelist_vi.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_vi.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_zgh.json b/app/javascript/flavours/glitch/locales/whitelist_zgh.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_zgh.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_zh-CN.json b/app/javascript/flavours/glitch/locales/whitelist_zh-CN.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_zh-CN.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_zh-HK.json b/app/javascript/flavours/glitch/locales/whitelist_zh-HK.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_zh-HK.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/whitelist_zh-TW.json b/app/javascript/flavours/glitch/locales/whitelist_zh-TW.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/whitelist_zh-TW.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/flavours/glitch/locales/zgh.js b/app/javascript/flavours/glitch/locales/zgh.js
deleted file mode 100644
index f2f15b1a4..000000000
--- a/app/javascript/flavours/glitch/locales/zgh.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/zgh.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/zgh.json b/app/javascript/flavours/glitch/locales/zgh.json
new file mode 100644
index 000000000..807ed8207
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/zgh.json
@@ -0,0 +1,201 @@
+{
+  "about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
+  "account.add_account_note": "Add note for @{name}",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
+  "account.follows": "Follows",
+  "account.joined": "Joined {date}",
+  "account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
+  "account.view_full_profile": "View full profile",
+  "account_note.cancel": "Cancel",
+  "account_note.edit": "Edit",
+  "account_note.glitch_placeholder": "No comment provided",
+  "account_note.save": "Save",
+  "advanced_options.icon_title": "Advanced options",
+  "advanced_options.local-only.long": "Do not post to other instances",
+  "advanced_options.local-only.short": "Local-only",
+  "advanced_options.local-only.tooltip": "This post is local-only",
+  "advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
+  "advanced_options.threaded_mode.short": "Threaded mode",
+  "advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
+  "boost_modal.missing_description": "This toot contains some media without description",
+  "column.favourited_by": "Favourited by",
+  "column.heading": "Misc",
+  "column.reblogged_by": "Boosted by",
+  "column.subheading": "Miscellaneous options",
+  "column_header.profile": "Profile",
+  "column_subheading.lists": "Lists",
+  "column_subheading.navigation": "Navigation",
+  "community.column_settings.allow_local_only": "Show local-only toots",
+  "compose.attach": "Attach...",
+  "compose.attach.doodle": "Draw something",
+  "compose.attach.upload": "Upload a file",
+  "compose.content-type.html": "HTML",
+  "compose.content-type.markdown": "Markdown",
+  "compose.content-type.plain": "Plain text",
+  "compose_form.poll.multiple_choices": "Allow multiple choices",
+  "compose_form.poll.single_choice": "Allow one choice",
+  "compose_form.spoiler": "Hide text behind warning",
+  "confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
+  "confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
+  "confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
+  "confirmations.missing_media_description.confirm": "Send anyway",
+  "confirmations.missing_media_description.edit": "Edit media",
+  "confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
+  "confirmations.unfilter.author": "Author",
+  "confirmations.unfilter.confirm": "Show",
+  "confirmations.unfilter.edit_filter": "Edit filter",
+  "confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
+  "content-type.change": "Content type",
+  "direct.group_by_conversations": "Group by conversation",
+  "endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
+  "favourite_modal.combo": "You can press {combo} to skip this next time",
+  "getting_started.onboarding": "Show me around",
+  "home.column_settings.advanced": "Advanced",
+  "home.column_settings.filter_regex": "Filter out by regular expressions",
+  "home.column_settings.show_direct": "Show DMs",
+  "home.settings": "Column settings",
+  "keyboard_shortcuts.bookmark": "to bookmark",
+  "keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
+  "keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
+  "layout.auto": "Auto",
+  "layout.desktop": "Desktop",
+  "layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
+  "layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
+  "layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
+  "layout.single": "Mobile",
+  "media_gallery.sensitive": "Sensitive",
+  "moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
+  "navigation_bar.app_settings": "App settings",
+  "navigation_bar.featured_users": "Featured users",
+  "navigation_bar.info": "Extended information",
+  "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
+  "navigation_bar.misc": "Misc",
+  "notification.markForDeletion": "Mark for deletion",
+  "notification_purge.btn_all": "Select\nall",
+  "notification_purge.btn_apply": "Clear\nselected",
+  "notification_purge.btn_invert": "Invert\nselection",
+  "notification_purge.btn_none": "Select\nnone",
+  "notification_purge.start": "Enter notification cleaning mode",
+  "notifications.marked_clear": "Clear selected notifications",
+  "notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
+  "onboarding.done": "Done",
+  "onboarding.next": "Next",
+  "onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
+  "onboarding.page_four.home": "The home timeline shows posts from people you follow.",
+  "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
+  "onboarding.page_one.welcome": "Welcome to {domain}!",
+  "onboarding.page_six.admin": "Your instance's admin is {admin}.",
+  "onboarding.page_six.almost_done": "Almost done...",
+  "onboarding.page_six.appetoot": "Bon Appetoot!",
+  "onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "onboarding.page_six.guidelines": "community guidelines",
+  "onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
+  "onboarding.page_six.various_app": "mobile apps",
+  "onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
+  "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
+  "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
+  "onboarding.skip": "Skip",
+  "settings.always_show_spoilers_field": "Always enable the Content Warning field",
+  "settings.auto_collapse": "Automatic collapsing",
+  "settings.auto_collapse_all": "Everything",
+  "settings.auto_collapse_lengthy": "Lengthy toots",
+  "settings.auto_collapse_media": "Toots with media",
+  "settings.auto_collapse_notifications": "Notifications",
+  "settings.auto_collapse_reblogs": "Boosts",
+  "settings.auto_collapse_replies": "Replies",
+  "settings.close": "Close",
+  "settings.collapsed_statuses": "Collapsed toots",
+  "settings.compose_box_opts": "Compose box",
+  "settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
+  "settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
+  "settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
+  "settings.content_warnings": "Content warnings",
+  "settings.content_warnings.regexp": "Regular expression",
+  "settings.content_warnings_filter": "Content warnings to not automatically unfold:",
+  "settings.content_warnings_media_outside": "Display media attachments outside content warnings",
+  "settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
+  "settings.content_warnings_shared_state": "Show/hide content of all copies at once",
+  "settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
+  "settings.content_warnings_unfold_opts": "Auto-unfolding options",
+  "settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
+  "settings.enable_collapsed": "Enable collapsed toots",
+  "settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
+  "settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
+  "settings.filters": "Filters",
+  "settings.general": "General",
+  "settings.hicolor_privacy_icons": "High color privacy icons",
+  "settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
+  "settings.image_backgrounds": "Image backgrounds",
+  "settings.image_backgrounds_media": "Preview collapsed toot media",
+  "settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
+  "settings.image_backgrounds_users": "Give collapsed toots an image background",
+  "settings.inline_preview_cards": "Inline preview cards for external links",
+  "settings.layout": "Layout:",
+  "settings.layout_opts": "Layout options",
+  "settings.media": "Media",
+  "settings.media_fullwidth": "Full-width media previews",
+  "settings.media_letterbox": "Letterbox media",
+  "settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
+  "settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
+  "settings.notifications.favicon_badge": "Unread notifications favicon badge",
+  "settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
+  "settings.notifications.tab_badge": "Unread notifications badge",
+  "settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
+  "settings.notifications_opts": "Notifications options",
+  "settings.pop_in_left": "Left",
+  "settings.pop_in_player": "Enable pop-in player",
+  "settings.pop_in_position": "Pop-in player position:",
+  "settings.pop_in_right": "Right",
+  "settings.preferences": "Preferences",
+  "settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
+  "settings.preselect_on_reply": "Pre-select usernames on reply",
+  "settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
+  "settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
+  "settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
+  "settings.rewrite_mentions_no": "Do not rewrite mentions",
+  "settings.rewrite_mentions_username": "Rewrite with username",
+  "settings.shared_settings_link": "user preferences",
+  "settings.show_action_bar": "Show action buttons in collapsed toots",
+  "settings.show_content_type_choice": "Show content-type choice when authoring toots",
+  "settings.show_reply_counter": "Display an estimate of the reply count",
+  "settings.side_arm": "Secondary toot button:",
+  "settings.side_arm.none": "None",
+  "settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
+  "settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
+  "settings.side_arm_reply_mode.keep": "Keep its set privacy",
+  "settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
+  "settings.status_icons": "Toot icons",
+  "settings.status_icons_language": "Language indicator",
+  "settings.status_icons_local_only": "Local-only indicator",
+  "settings.status_icons_media": "Media and poll indicators",
+  "settings.status_icons_reply": "Reply indicator",
+  "settings.status_icons_visibility": "Toot privacy indicator",
+  "settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
+  "settings.tag_misleading_links": "Tag misleading links",
+  "settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
+  "settings.wide_view": "Wide view (Desktop mode only)",
+  "settings.wide_view_hint": "Stretches columns to better fill the available space.",
+  "status.collapse": "Collapse",
+  "status.has_audio": "Features attached audio files",
+  "status.has_pictures": "Features attached pictures",
+  "status.has_preview_card": "Features an attached preview card",
+  "status.has_video": "Features attached videos",
+  "status.in_reply_to": "This toot is a reply",
+  "status.is_poll": "This toot is a poll",
+  "status.local_only": "Only visible from your instance",
+  "status.sensitive_toggle": "Click to view",
+  "status.uncollapse": "Uncollapse",
+  "web_app_crash.change_your_settings": "Change your {settings}",
+  "web_app_crash.content": "You could try any of the following:",
+  "web_app_crash.debug_info": "Debug information",
+  "web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
+  "web_app_crash.issue_tracker": "issue tracker",
+  "web_app_crash.reload": "Reload",
+  "web_app_crash.reload_page": "{reload} the current page",
+  "web_app_crash.report_issue": "Report a bug in the {issuetracker}",
+  "web_app_crash.settings": "settings",
+  "web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
+}
diff --git a/app/javascript/flavours/glitch/locales/zh-CN.js b/app/javascript/flavours/glitch/locales/zh-CN.js
deleted file mode 100644
index 21a68fc01..000000000
--- a/app/javascript/flavours/glitch/locales/zh-CN.js
+++ /dev/null
@@ -1,201 +0,0 @@
-import inherited from 'mastodon/locales/zh-CN.json';
-
-const messages = {
-  'account.add_account_note': '为 @{name} 添加备注',
-  'account.disclaimer_full': '以下信息可能无法完整代表你的个人资料。',
-  'account.follows': '正在关注',
-  'account.suspended_disclaimer_full': '该用户已被封禁。',
-  'account.view_full_profile': '查看完整资料',
-  'account_note.cancel': '取消',
-  'account_note.edit': '编辑',
-  'account_note.glitch_placeholder': '暂无备注',
-  'account_note.save': '保存',
-  'advanced_options.icon_title': '高级选项',
-  'advanced_options.local-only.long': '不要发布嘟文到其他实例',
-  'advanced_options.local-only.short': '本地模式',
-  'advanced_options.local-only.tooltip': '这条嘟文仅限于本实例',
-  'advanced_options.threaded_mode.long': '发嘟时自动打开回复',
-  'advanced_options.threaded_mode.short': '线程模式',
-  'advanced_options.threaded_mode.tooltip': '线程模式已启用',
-  'boost_modal.missing_description': '这条嘟文未包含媒体描述',
-  'column.favourited_by': '喜欢',
-  'column.heading': '标题',
-  'column.reblogged_by': '转嘟',
-  'column.subheading': '其他选项',
-  'column.toot': '嘟文和回复',
-  'column_header.profile': '个人资料',
-  'column_subheading.lists': '列表',
-  'column_subheading.navigation': '导航',
-  'community.column_settings.allow_local_only': '只显示本地模式嘟文',
-  'compose.attach': '附上...',
-  'compose.attach.doodle': '画点什么',
-  'compose.attach.upload': '上传文件',
-  'compose.content-type.html': 'HTML',
-  'compose.content-type.markdown': 'Markdown',
-  'compose.content-type.plain': '纯文本',
-  'compose_form.poll.multiple_choices': '允许多选',
-  'compose_form.poll.single_choice': '允许单选',
-  'compose_form.spoiler': '隐藏为内容警告',
-  'confirmation_modal.do_not_ask_again': '下次不显示确认窗口',
-  'confirmations.discard_edit_media.confirm': '确认',
-  'confirmations.discard_edit_media.message': '有未保存的媒体描述或预览,确认要关闭?',
-  'confirmations.missing_media_description.confirm': '确认',
-  'confirmations.missing_media_description.edit': '编辑',
-  'confirmations.missing_media_description.message': '你没有为一种或多种媒体撰写描述。请考虑为视障人士添加描述。',
-  'confirmations.unfilter': '关于此过滤后嘟文的信息',
-  'confirmations.unfilter.author': '作者',
-  'confirmations.unfilter.confirm': '查看',
-  'confirmations.unfilter.edit_filter': '编辑过滤器',
-  'confirmations.unfilter.filters': '应用 {count, plural, one {过滤器} other {过滤器}}',
-  'content-type.change': '内容类型 ',
-  'direct.conversations_mode': '对话模式',
-  'direct.timeline_mode': '时间线模式',
-  'endorsed_accounts_editor.endorsed_accounts': '推荐用户',
-  'favourite_modal.combo': '下次你可以按 {combo} 跳过这个',
-  'getting_started.onboarding': '参观一下',
-  'getting_started.open_source_notice': 'Glitchsoc 是由 {Mastodon} 分叉出来的免费开源软件。你可以在 GitHub 上贡献或报告问题,地址是 {github}。',
-  'home.column_settings.advanced': '高级',
-  'home.column_settings.filter_regex': '按正则表达式过滤',
-  'home.column_settings.show_direct': '显示私信',
-  'home.settings': '列表设置',
-  'keyboard_shortcuts.bookmark': '书签',
-  'keyboard_shortcuts.secondary_toot': '使用二级隐私设置发送嘟文',
-  'keyboard_shortcuts.toggle_collapse': '折叠或展开嘟文',
-  'layout.auto': '自动模式',
-  'layout.current_is': '你目前的布局是:',
-  'layout.desktop': '桌面模式',
-  'layout.hint.auto': '根据“启用高级 Web 界面”设置和屏幕大小自动选择布局。',
-  'layout.hint.desktop': '“使用多列布局,无论“启用高级 Web 界面”设置和屏幕大小如何。',
-  'layout.hint.single': '使用单列布局,无论“启用高级 Web 界面”设置和屏幕大小如何。',
-  'layout.single': '移动模式',
-  'media_gallery.sensitive': '敏感内容',
-  'moved_to_warning': '此帐户已被标记为移至 {moved_to_link},并且似乎没有收到新关注者。',
-  'navigation_bar.app_settings': '应用选项',
-  'navigation_bar.featured_users': '推荐用户',
-  'navigation_bar.misc': '杂项',
-  'notification.markForDeletion': '标记以删除',
-  'notification_purge.btn_all': '全选',
-  'notification_purge.btn_apply': '清除已选',
-  'notification_purge.btn_invert': '反向选择',
-  'notification_purge.btn_none': '取消全选',
-  'notification_purge.start': '进入通知清除模式',
-  'notifications.clear': '清除所有通知',
-  'notifications.marked_clear': '清除选择的通知',
-  'notifications.marked_clear_confirmation': '你确定要永久清除所有选择的通知吗?',
-  'onboarding.done': '完成',
-  'onboarding.next': '下一个',
-  'onboarding.page_five.public_timelines': '本地时间线显示来自 {domain} 中所有人的公开嘟文。跨站时间线显示了 {domain} 用户关注的每个人的公开嘟文。这些被称为公共时间线,是发现新朋友的好方法。',
-  'onboarding.page_four.home': '你的主页时间线会显示你关注的人的嘟文。',
-  'onboarding.page_four.notifications': '通知栏显示某人与你互动的内容。',
-  'onboarding.page_one.federation': '{domain} 是 Mastodon 的一个“实例”。Mastodon 是一个由独立服务器组成的,通过不断联合形成的社交网络。我们称这些服务器为实例。',
-  'onboarding.page_one.handle': '你位于 {domain},因此你的完整用户名是 {handle} 。',
-  'onboarding.page_one.welcome': '欢迎来到 {domain}!',
-  'onboarding.page_six.admin': '实例的管理员是 {admin}。',
-  'onboarding.page_six.almost_done': '就快完成了...',
-  'onboarding.page_six.appetoot': '尽情享用吧!',
-  'onboarding.page_six.apps_available': '有适用于 iOS、Android 和其他平台的应用程序。',
-  'onboarding.page_six.github': '{domain} 在 Glitchsoc 上运行。Glitchsoc 是 {Mastodon} 的一个友好 {fork},与任何 Mastodon 实例或应用兼容。Glitchsoc 是完全免费和开源的。你可以在 {github} 上报告错误、请求功能或贡献代码。',
-  'onboarding.page_six.guidelines': '社区准则',
-  'onboarding.page_six.read_guidelines': '请阅读 {domain} 的 {guidelines}!',
-  'onboarding.page_six.various_app': '应用程序',
-  'onboarding.page_three.profile': '编辑你的个人资料,更改你的头像、个人简介和昵称。在那里,你还会发现其他设置。',
-  'onboarding.page_three.search': '使用搜索栏查找用户并查看标签,例如 #illustration 和 #introductions。要查找不在此实例中的用户,请使用他们的完整用户名。',
-  'onboarding.page_two.compose': '在撰写框中撰写嘟文。你可以使用下方图标上传图像、更改隐私设置和添加内容警告。',
-  'onboarding.skip': '跳过',
-  'settings.always_show_spoilers_field': '始终显示内容警告框',
-  'settings.auto_collapse': '自动折叠',
-  'settings.auto_collapse_all': '所有',
-  'settings.auto_collapse_lengthy': '长嘟文',
-  'settings.auto_collapse_media': '带媒体文件的嘟文',
-  'settings.auto_collapse_notifications': '通知',
-  'settings.auto_collapse_reblogs': '转嘟',
-  'settings.auto_collapse_replies': '回复',
-  'settings.close': '关闭',
-  'settings.collapsed_statuses': '折叠嘟文',
-  'settings.compose_box_opts': '撰写框',
-  'settings.confirm_before_clearing_draft': '在覆盖正在写入的嘟文之前显示确认对话框',
-  'settings.confirm_boost_missing_media_description': '在转嘟缺少媒体描述的嘟文之前显示确认对话框',
-  'settings.confirm_missing_media_description': '在发送缺少媒体描述的嘟文之前显示确认对话框',
-  'settings.content_warnings': '内容警告',
-  'settings.content_warnings.regexp': '正则表达式',
-  'settings.content_warnings_filter': '不会自动展开的内容警告:',
-  'settings.enable_collapsed': '启用折叠嘟文',
-  'settings.enable_content_warnings_auto_unfold': '自动展开内容警告',
-  'settings.filtering_behavior': '过滤器行为',
-  'settings.filtering_behavior.cw': '仍然显示嘟文,并在内容警告中添加过滤词',
-  'settings.filtering_behavior.drop': '完全隐藏过滤的嘟文',
-  'settings.filtering_behavior.hide': '显示“已过滤”并添加一个按钮来显示原因',
-  'settings.filtering_behavior.upstream': '像原版 Mastodon 一样显示“已过滤”',
-  'settings.filters': '过滤器',
-  'settings.general': '一般',
-  'settings.hicolor_privacy_icons': '彩色隐私图标 ',
-  'settings.hicolor_privacy_icons.hint': '以明亮且易于区分的颜色显示隐私图标',
-  'settings.image_backgrounds': '图片背景',
-  'settings.image_backgrounds_media': '预览折叠嘟文的媒体文件',
-  'settings.image_backgrounds_users': '为折叠嘟文附加图片背景',
-  'settings.inline_preview_cards': '外部链接的内嵌预览卡片',
-  'settings.layout': '布局:',
-  'settings.layout_opts': '布局选项',
-  'settings.media': '媒体',
-  'settings.media_fullwidth': '全宽媒体预览',
-  'settings.media_letterbox': '信箱媒体',
-  'settings.media_letterbox_hint': '缩小媒体以填充图像容器而不是拉伸和裁剪它们',
-  'settings.media_reveal_behind_cw': '默认显示内容警告后的敏感媒体',
-  'settings.navbar_under': '底部导航栏(仅限于移动模式)',
-  'settings.notifications.favicon_badge': '未读通知网站图标',
-  'settings.notifications.favicon_badge.hint': '将未读通知添加到网站图标',
-  'settings.notifications.tab_badge': '未读通知图标',
-  'settings.notifications.tab_badge.hint': '当通知栏未打开时,显示未读通知图标',
-  'settings.notifications_opts': '通知选项',
-  'settings.pop_in_left': '左边',
-  'settings.pop_in_player': '启用悬浮播放器',
-  'settings.pop_in_position': '悬浮播放器位置:',
-  'settings.pop_in_right': '右边',
-  'settings.preferences': '用户选项',
-  'settings.prepend_cw_re': '回复时在内容警告前加上“re:”',
-  'settings.preselect_on_reply': '回复时预先选择用户名',
-  'settings.preselect_on_reply_hint': '回复与多个参与者的对话时,预先选择第一个用户名',
-  'settings.rewrite_mentions': '重写嘟文中的提及',
-  'settings.rewrite_mentions_acct': '重写为用户名和域名(当帐户为远程时)',
-  'settings.rewrite_mentions_no': '不要重写',
-  'settings.rewrite_mentions_username': '重写为用户名',
-  'settings.show_action_bar': '在折叠的嘟文中显示操作按钮',
-  'settings.show_content_type_choice': '允许你在撰写嘟文时选择格式类型',
-  'settings.show_reply_counter': '显示回复的大致数量',
-  'settings.side_arm': '辅助发嘟按钮:',
-  'settings.side_arm.none': '无',
-  'settings.side_arm_reply_mode': '当回复嘟文时:',
-  'settings.side_arm_reply_mode.copy': '复制被回复嘟文的隐私设置',
-  'settings.side_arm_reply_mode.keep': '保留辅助发嘟按钮以设置隐私',
-  'settings.side_arm_reply_mode.restrict': '将隐私设置限制为正在回复的那条嘟文',
-  'settings.swipe_to_change_columns': '允许滑动以在列之间切换(仅限移动模式)',
-  'settings.tag_misleading_links': '标记误导性链接',
-  'settings.tag_misleading_links.hint': '将带有目标网页链接的视觉指示添加到每个未明确的链接',
-  'settings.wide_view': '宽视图(仅限于桌面模式)',
-  'settings.wide_view_hint': '拉伸列宽以更好地填充可用空间。',
-  'status.collapse': '折叠',
-  'status.has_audio': '附带音频文件',
-  'status.has_pictures': '附带图片文件',
-  'status.has_preview_card': '附带预览卡片',
-  'status.has_video': '附带视频文件',
-  'status.hide': '隐藏内容',
-  'status.in_reply_to': '此嘟文是回复',
-  'status.is_poll': '此嘟文是投票',
-  'status.local_only': '此嘟文仅本实例可见',
-  'status.sensitive_toggle': '点击查看',
-  'status.show_filter_reason': '(显示原因)',
-  'status.uncollapse': '不折叠',
-  'upload_modal.applying': '正在应用...',
-  'web_app_crash.change_your_settings': '更改 {settings}',
-  'web_app_crash.content': '你可以尝试这些:',
-  'web_app_crash.debug_info': '调试信息',
-  'web_app_crash.disable_addons': '禁用浏览器插件或本地翻译工具',
-  'web_app_crash.issue_tracker': '问题追踪器',
-  'web_app_crash.reload': '刷新',
-  'web_app_crash.reload_page': '{reload} 此页面',
-  'web_app_crash.report_issue': '将错误报告给 {issuetracker}',
-  'web_app_crash.settings': '设置',
-  'web_app_crash.title': '抱歉,Mastodon 出了点问题。',
-};
-
-export default Object.assign({}, inherited, messages);
\ No newline at end of file
diff --git a/app/javascript/flavours/glitch/locales/zh-CN.json b/app/javascript/flavours/glitch/locales/zh-CN.json
new file mode 100644
index 000000000..9b5a7713f
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/zh-CN.json
@@ -0,0 +1,176 @@
+{
+  "account.add_account_note": "为 @{name} 添加备注",
+  "account.disclaimer_full": "以下信息可能无法完整代表你的个人资料。",
+  "account.follows": "正在关注",
+  "account.suspended_disclaimer_full": "该用户已被封禁。",
+  "account.view_full_profile": "查看完整资料",
+  "account_note.cancel": "取消",
+  "account_note.edit": "编辑",
+  "account_note.glitch_placeholder": "暂无备注",
+  "account_note.save": "保存",
+  "advanced_options.icon_title": "高级选项",
+  "advanced_options.local-only.long": "不要发布嘟文到其他实例",
+  "advanced_options.local-only.short": "本地模式",
+  "advanced_options.local-only.tooltip": "这条嘟文仅限于本实例",
+  "advanced_options.threaded_mode.long": "发嘟时自动打开回复",
+  "advanced_options.threaded_mode.short": "线程模式",
+  "advanced_options.threaded_mode.tooltip": "线程模式已启用",
+  "boost_modal.missing_description": "这条嘟文未包含媒体描述",
+  "column.favourited_by": "喜欢",
+  "column.heading": "标题",
+  "column.reblogged_by": "转嘟",
+  "column.subheading": "其他选项",
+  "column_header.profile": "个人资料",
+  "column_subheading.lists": "列表",
+  "column_subheading.navigation": "导航",
+  "community.column_settings.allow_local_only": "只显示本地模式嘟文",
+  "compose.attach": "附上...",
+  "compose.attach.doodle": "画点什么",
+  "compose.attach.upload": "上传文件",
+  "compose.content-type.plain": "纯文本",
+  "compose_form.poll.multiple_choices": "允许多选",
+  "compose_form.poll.single_choice": "允许单选",
+  "compose_form.spoiler": "隐藏为内容警告",
+  "confirmation_modal.do_not_ask_again": "下次不显示确认窗口",
+  "confirmations.missing_media_description.confirm": "确认",
+  "confirmations.missing_media_description.edit": "编辑",
+  "confirmations.missing_media_description.message": "你没有为一种或多种媒体撰写描述。请考虑为视障人士添加描述。",
+  "confirmations.unfilter.author": "作者",
+  "confirmations.unfilter.confirm": "查看",
+  "confirmations.unfilter.edit_filter": "编辑过滤器",
+  "confirmations.unfilter.filters": "应用 {count, plural, one {过滤器} other {过滤器}}",
+  "content-type.change": "内容类型 ",
+  "endorsed_accounts_editor.endorsed_accounts": "推荐用户",
+  "favourite_modal.combo": "下次你可以按 {combo} 跳过这个",
+  "getting_started.onboarding": "参观一下",
+  "home.column_settings.advanced": "高级",
+  "home.column_settings.filter_regex": "按正则表达式过滤",
+  "home.column_settings.show_direct": "显示私信",
+  "home.settings": "列表设置",
+  "keyboard_shortcuts.bookmark": "书签",
+  "keyboard_shortcuts.secondary_toot": "使用二级隐私设置发送嘟文",
+  "keyboard_shortcuts.toggle_collapse": "折叠或展开嘟文",
+  "layout.auto": "自动模式",
+  "layout.desktop": "桌面模式",
+  "layout.hint.auto": "根据“启用高级 Web 界面”设置和屏幕大小自动选择布局。",
+  "layout.hint.desktop": "“使用多列布局,无论“启用高级 Web 界面”设置和屏幕大小如何。",
+  "layout.hint.single": "使用单列布局,无论“启用高级 Web 界面”设置和屏幕大小如何。",
+  "layout.single": "移动模式",
+  "media_gallery.sensitive": "敏感内容",
+  "moved_to_warning": "此帐户已被标记为移至 {moved_to_link},并且似乎没有收到新关注者。",
+  "navigation_bar.app_settings": "应用选项",
+  "navigation_bar.featured_users": "推荐用户",
+  "navigation_bar.misc": "杂项",
+  "notification.markForDeletion": "标记以删除",
+  "notification_purge.btn_all": "全选",
+  "notification_purge.btn_apply": "清除已选",
+  "notification_purge.btn_invert": "反向选择",
+  "notification_purge.btn_none": "取消全选",
+  "notification_purge.start": "进入通知清除模式",
+  "notifications.marked_clear": "清除选择的通知",
+  "notifications.marked_clear_confirmation": "你确定要永久清除所有选择的通知吗?",
+  "onboarding.done": "完成",
+  "onboarding.next": "下一个",
+  "onboarding.page_five.public_timelines": "本地时间线显示来自 {domain} 中所有人的公开嘟文。跨站时间线显示了 {domain} 用户关注的每个人的公开嘟文。这些被称为公共时间线,是发现新朋友的好方法。",
+  "onboarding.page_four.home": "你的主页时间线会显示你关注的人的嘟文。",
+  "onboarding.page_four.notifications": "通知栏显示某人与你互动的内容。",
+  "onboarding.page_one.federation": "{domain} 是 Mastodon 的一个“实例”。Mastodon 是一个由独立服务器组成的,通过不断联合形成的社交网络。我们称这些服务器为实例。",
+  "onboarding.page_one.handle": "你位于 {domain},因此你的完整用户名是 {handle} 。",
+  "onboarding.page_one.welcome": "欢迎来到 {domain}!",
+  "onboarding.page_six.admin": "实例的管理员是 {admin}。",
+  "onboarding.page_six.almost_done": "就快完成了...",
+  "onboarding.page_six.appetoot": "尽情享用吧!",
+  "onboarding.page_six.apps_available": "有适用于 iOS、Android 和其他平台的应用程序。",
+  "onboarding.page_six.github": "{domain} 在 Glitchsoc 上运行。Glitchsoc 是 {Mastodon} 的一个友好 {fork},与任何 Mastodon 实例或应用兼容。Glitchsoc 是完全免费和开源的。你可以在 {github} 上报告错误、请求功能或贡献代码。",
+  "onboarding.page_six.guidelines": "社区准则",
+  "onboarding.page_six.read_guidelines": "请阅读 {domain} 的 {guidelines}!",
+  "onboarding.page_six.various_app": "应用程序",
+  "onboarding.page_three.profile": "编辑你的个人资料,更改你的头像、个人简介和昵称。在那里,你还会发现其他设置。",
+  "onboarding.page_three.search": "使用搜索栏查找用户并查看标签,例如 #illustration 和 #introductions。要查找不在此实例中的用户,请使用他们的完整用户名。",
+  "onboarding.page_two.compose": "在撰写框中撰写嘟文。你可以使用下方图标上传图像、更改隐私设置和添加内容警告。",
+  "onboarding.skip": "跳过",
+  "settings.always_show_spoilers_field": "始终显示内容警告框",
+  "settings.auto_collapse": "自动折叠",
+  "settings.auto_collapse_all": "所有",
+  "settings.auto_collapse_lengthy": "长嘟文",
+  "settings.auto_collapse_media": "带媒体文件的嘟文",
+  "settings.auto_collapse_notifications": "通知",
+  "settings.auto_collapse_reblogs": "转嘟",
+  "settings.auto_collapse_replies": "回复",
+  "settings.close": "关闭",
+  "settings.collapsed_statuses": "折叠嘟文",
+  "settings.compose_box_opts": "撰写框",
+  "settings.confirm_before_clearing_draft": "在覆盖正在写入的嘟文之前显示确认对话框",
+  "settings.confirm_boost_missing_media_description": "在转嘟缺少媒体描述的嘟文之前显示确认对话框",
+  "settings.confirm_missing_media_description": "在发送缺少媒体描述的嘟文之前显示确认对话框",
+  "settings.content_warnings": "内容警告",
+  "settings.content_warnings.regexp": "正则表达式",
+  "settings.content_warnings_filter": "不会自动展开的内容警告:",
+  "settings.enable_collapsed": "启用折叠嘟文",
+  "settings.enable_content_warnings_auto_unfold": "自动展开内容警告",
+  "settings.general": "一般",
+  "settings.hicolor_privacy_icons": "彩色隐私图标 ",
+  "settings.hicolor_privacy_icons.hint": "以明亮且易于区分的颜色显示隐私图标",
+  "settings.image_backgrounds": "图片背景",
+  "settings.image_backgrounds_media": "预览折叠嘟文的媒体文件",
+  "settings.image_backgrounds_users": "为折叠嘟文附加图片背景",
+  "settings.inline_preview_cards": "外部链接的内嵌预览卡片",
+  "settings.layout": "布局:",
+  "settings.layout_opts": "布局选项",
+  "settings.media": "媒体",
+  "settings.media_fullwidth": "全宽媒体预览",
+  "settings.media_letterbox": "信箱媒体",
+  "settings.media_letterbox_hint": "缩小媒体以填充图像容器而不是拉伸和裁剪它们",
+  "settings.media_reveal_behind_cw": "默认显示内容警告后的敏感媒体",
+  "settings.notifications.favicon_badge": "未读通知网站图标",
+  "settings.notifications.favicon_badge.hint": "将未读通知添加到网站图标",
+  "settings.notifications.tab_badge": "未读通知图标",
+  "settings.notifications.tab_badge.hint": "当通知栏未打开时,显示未读通知图标",
+  "settings.notifications_opts": "通知选项",
+  "settings.pop_in_left": "左边",
+  "settings.pop_in_player": "启用悬浮播放器",
+  "settings.pop_in_position": "悬浮播放器位置:",
+  "settings.pop_in_right": "右边",
+  "settings.preferences": "用户选项",
+  "settings.prepend_cw_re": "回复时在内容警告前加上“re:”",
+  "settings.preselect_on_reply": "回复时预先选择用户名",
+  "settings.preselect_on_reply_hint": "回复与多个参与者的对话时,预先选择第一个用户名",
+  "settings.rewrite_mentions": "重写嘟文中的提及",
+  "settings.rewrite_mentions_acct": "重写为用户名和域名(当帐户为远程时)",
+  "settings.rewrite_mentions_no": "不要重写",
+  "settings.rewrite_mentions_username": "重写为用户名",
+  "settings.show_action_bar": "在折叠的嘟文中显示操作按钮",
+  "settings.show_content_type_choice": "允许你在撰写嘟文时选择格式类型",
+  "settings.show_reply_counter": "显示回复的大致数量",
+  "settings.side_arm": "辅助发嘟按钮:",
+  "settings.side_arm.none": "无",
+  "settings.side_arm_reply_mode": "当回复嘟文时:",
+  "settings.side_arm_reply_mode.copy": "复制被回复嘟文的隐私设置",
+  "settings.side_arm_reply_mode.keep": "保留辅助发嘟按钮以设置隐私",
+  "settings.side_arm_reply_mode.restrict": "将隐私设置限制为正在回复的那条嘟文",
+  "settings.swipe_to_change_columns": "允许滑动以在列之间切换(仅限移动模式)",
+  "settings.tag_misleading_links": "标记误导性链接",
+  "settings.tag_misleading_links.hint": "将带有目标网页链接的视觉指示添加到每个未明确的链接",
+  "settings.wide_view": "宽视图(仅限于桌面模式)",
+  "settings.wide_view_hint": "拉伸列宽以更好地填充可用空间。",
+  "status.collapse": "折叠",
+  "status.has_audio": "附带音频文件",
+  "status.has_pictures": "附带图片文件",
+  "status.has_preview_card": "附带预览卡片",
+  "status.has_video": "附带视频文件",
+  "status.in_reply_to": "此嘟文是回复",
+  "status.is_poll": "此嘟文是投票",
+  "status.local_only": "此嘟文仅本实例可见",
+  "status.sensitive_toggle": "点击查看",
+  "status.uncollapse": "不折叠",
+  "web_app_crash.change_your_settings": "更改 {settings}",
+  "web_app_crash.content": "你可以尝试这些:",
+  "web_app_crash.debug_info": "调试信息",
+  "web_app_crash.disable_addons": "禁用浏览器插件或本地翻译工具",
+  "web_app_crash.issue_tracker": "问题追踪器",
+  "web_app_crash.reload": "刷新",
+  "web_app_crash.reload_page": "{reload} 此页面",
+  "web_app_crash.report_issue": "将错误报告给 {issuetracker}",
+  "web_app_crash.settings": "设置",
+  "web_app_crash.title": "抱歉,Mastodon 出了点问题。"
+}
diff --git a/app/javascript/flavours/glitch/locales/zh-HK.js b/app/javascript/flavours/glitch/locales/zh-HK.js
deleted file mode 100644
index b71c81f2b..000000000
--- a/app/javascript/flavours/glitch/locales/zh-HK.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/zh-HK.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/zh-HK.json b/app/javascript/flavours/glitch/locales/zh-HK.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/zh-HK.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/locales/zh-TW.js b/app/javascript/flavours/glitch/locales/zh-TW.js
deleted file mode 100644
index de2b7769c..000000000
--- a/app/javascript/flavours/glitch/locales/zh-TW.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import inherited from 'mastodon/locales/zh-TW.json';
-
-const messages = {
-  //  No translations available.
-};
-
-export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/zh-TW.json b/app/javascript/flavours/glitch/locales/zh-TW.json
new file mode 100644
index 000000000..4d243f94c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/zh-TW.json
@@ -0,0 +1,6 @@
+{
+  "onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
+  "onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
+  "settings.content_warnings": "Content warnings",
+  "settings.preferences": "Preferences"
+}
diff --git a/app/javascript/flavours/glitch/packs/public.js b/app/javascript/flavours/glitch/packs/public.js
index 843fd5163..b256fdbd5 100644
--- a/app/javascript/flavours/glitch/packs/public.js
+++ b/app/javascript/flavours/glitch/packs/public.js
@@ -42,6 +42,18 @@ function main() {
       minute: 'numeric',
     });
 
+    const dateFormat = new Intl.DateTimeFormat(locale, {
+      year: 'numeric',
+      month: 'short',
+      day: 'numeric',
+      timeFormat: false,
+    });
+
+    const timeFormat = new Intl.DateTimeFormat(locale, {
+      timeStyle: 'short',
+      hour12: false,
+    });
+
     [].forEach.call(document.querySelectorAll('.emojify'), (content) => {
       content.innerHTML = emojify(content.innerHTML);
     });
@@ -54,6 +66,32 @@ function main() {
       content.textContent = formattedDate;
     });
 
+    const isToday = date => {
+      const today = new Date();
+
+      return date.getDate() === today.getDate() &&
+        date.getMonth() === today.getMonth() &&
+        date.getFullYear() === today.getFullYear();
+    };
+    const todayFormat = new IntlMessageFormat(messages['relative_format.today'] || 'Today at {time}', locale);
+
+    [].forEach.call(document.querySelectorAll('time.relative-formatted'), (content) => {
+      const datetime = new Date(content.getAttribute('datetime'));
+
+      let formattedContent;
+
+      if (isToday(datetime)) {
+        const formattedTime = timeFormat.format(datetime);
+
+        formattedContent = todayFormat.format({ time: formattedTime });
+      } else {
+        formattedContent = dateFormat.format(datetime);
+      }
+
+      content.title = formattedContent;
+      content.textContent = formattedContent;
+    });
+
     [].forEach.call(document.querySelectorAll('time.time-ago'), (content) => {
       const datetime = new Date(content.getAttribute('datetime'));
       const now      = new Date();
diff --git a/app/javascript/flavours/glitch/permissions.js b/app/javascript/flavours/glitch/permissions.js
index 752ddd6c5..9ea149e5f 100644
--- a/app/javascript/flavours/glitch/permissions.js
+++ b/app/javascript/flavours/glitch/permissions.js
@@ -1,3 +1,4 @@
-export const PERMISSION_INVITE_USERS   = 0x0000000000010000;
-export const PERMISSION_MANAGE_USERS   = 0x0000000000000400;
-export const PERMISSION_MANAGE_REPORTS = 0x0000000000000010;
+export const PERMISSION_INVITE_USERS      = 0x0000000000010000;
+export const PERMISSION_MANAGE_USERS      = 0x0000000000000400;
+export const PERMISSION_MANAGE_FEDERATION = 0x0000000000000020;
+export const PERMISSION_MANAGE_REPORTS    = 0x0000000000000010;
diff --git a/app/javascript/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js
index 9b50ec23a..814b6a1a7 100644
--- a/app/javascript/flavours/glitch/reducers/compose.js
+++ b/app/javascript/flavours/glitch/reducers/compose.js
@@ -421,8 +421,10 @@ export default function compose(state = initialState, action) {
       map.set('preselectDate', new Date());
       map.set('idempotencyKey', uuid());
 
-      if (action.status.get('language')) {
+      if (action.status.get('language') && !action.status.has('translation')) {
         map.set('language', action.status.get('language'));
+      } else {
+        map.set('language', state.get('default_language'));
       }
 
       if (action.status.get('spoiler_text').length > 0) {
@@ -536,6 +538,8 @@ export default function compose(state = initialState, action) {
   case TIMELINE_DELETE:
     if (action.id === state.get('in_reply_to')) {
       return state.set('in_reply_to', null);
+    } else if (action.id === state.get('id')) {
+      return state.set('id', null);
     } else {
       return state;
     }
diff --git a/app/javascript/flavours/glitch/reducers/dropdown_menu.js b/app/javascript/flavours/glitch/reducers/dropdown_menu.js
index a78a11acc..51bf9375b 100644
--- a/app/javascript/flavours/glitch/reducers/dropdown_menu.js
+++ b/app/javascript/flavours/glitch/reducers/dropdown_menu.js
@@ -4,12 +4,12 @@ import {
   DROPDOWN_MENU_CLOSE,
 } from '../actions/dropdown_menu';
 
-const initialState = Immutable.Map({ openId: null, placement: null, keyboard: false, scroll_key: null });
+const initialState = Immutable.Map({ openId: null, keyboard: false, scroll_key: null });
 
 export default function dropdownMenu(state = initialState, action) {
   switch (action.type) {
   case DROPDOWN_MENU_OPEN:
-    return state.merge({ openId: action.id, placement: action.placement, keyboard: action.keyboard, scroll_key: action.scroll_key });
+    return state.merge({ openId: action.id, keyboard: action.keyboard, scroll_key: action.scroll_key });
   case DROPDOWN_MENU_CLOSE:
     return state.get('openId') === action.id ? state.set('openId', null).set('scroll_key', null) : state;
   default:
diff --git a/app/javascript/flavours/glitch/reducers/relationships.js b/app/javascript/flavours/glitch/reducers/relationships.js
index 49dd77ef5..e4b9acea2 100644
--- a/app/javascript/flavours/glitch/reducers/relationships.js
+++ b/app/javascript/flavours/glitch/reducers/relationships.js
@@ -1,4 +1,7 @@
 import {
+  NOTIFICATIONS_UPDATE,
+} from '../actions/notifications';
+import {
   ACCOUNT_FOLLOW_SUCCESS,
   ACCOUNT_FOLLOW_REQUEST,
   ACCOUNT_FOLLOW_FAIL,
@@ -12,6 +15,8 @@ import {
   ACCOUNT_PIN_SUCCESS,
   ACCOUNT_UNPIN_SUCCESS,
   RELATIONSHIPS_FETCH_SUCCESS,
+  FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
+  FOLLOW_REQUEST_REJECT_SUCCESS,
 } from 'flavours/glitch/actions/accounts';
 import {
   DOMAIN_BLOCK_SUCCESS,
@@ -44,6 +49,12 @@ const initialState = ImmutableMap();
 
 export default function relationships(state = initialState, action) {
   switch(action.type) {
+  case FOLLOW_REQUEST_AUTHORIZE_SUCCESS:
+    return state.setIn([action.id, 'followed_by'], true).setIn([action.id, 'requested_by'], false);
+  case FOLLOW_REQUEST_REJECT_SUCCESS:
+    return state.setIn([action.id, 'followed_by'], false).setIn([action.id, 'requested_by'], false);
+  case NOTIFICATIONS_UPDATE:
+    return action.notification.type === 'follow_request' ? state.setIn([action.notification.account.id, 'requested_by'], true) : state;
   case ACCOUNT_FOLLOW_REQUEST:
     return state.getIn([action.id, 'following']) ? state : state.setIn([action.id, action.locked ? 'requested' : 'following'], true);
   case ACCOUNT_FOLLOW_FAIL:
diff --git a/app/javascript/flavours/glitch/selectors/index.js b/app/javascript/flavours/glitch/selectors/index.js
index df46b58a8..83f8783d9 100644
--- a/app/javascript/flavours/glitch/selectors/index.js
+++ b/app/javascript/flavours/glitch/selectors/index.js
@@ -1,6 +1,6 @@
 import escapeTextContentForBrowser from 'escape-html';
 import { createSelector } from 'reselect';
-import { List as ImmutableList } from 'immutable';
+import { List as ImmutableList, Map as ImmutableMap, is } from 'immutable';
 import { toServerSideType } from 'flavours/glitch/utils/filters';
 import { me } from 'flavours/glitch/initial_state';
 
@@ -74,6 +74,16 @@ export const makeGetStatus = () => {
   );
 };
 
+export const makeGetPictureInPicture = () => {
+  return createSelector([
+    (state, { id }) => state.get('picture_in_picture').statusId === id,
+    (state) => state.getIn(['meta', 'layout']) !== 'mobile',
+  ], (inUse, available) => ImmutableMap({
+    inUse: inUse && available,
+    available,
+  }));
+};
+
 const getAlertsBase = state => state.get('alerts');
 
 export const getAlerts = createSelector([getAlertsBase], (base) => {
diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss
index c2426944b..8ddf815c3 100644
--- a/app/javascript/flavours/glitch/styles/admin.scss
+++ b/app/javascript/flavours/glitch/styles/admin.scss
@@ -254,10 +254,8 @@ $content-width: 840px;
 
       &__actions {
         display: inline-flex;
-
-        & > :not(:first-child) {
-          margin-left: 5px;
-        }
+        flex-flow: wrap;
+        gap: 5px;
       }
 
       h2 small {
@@ -1681,6 +1679,15 @@ a.sparkline {
   box-sizing: border-box;
   min-height: 100%;
 
+  a {
+    color: $highlight-text-color;
+    text-decoration: none;
+
+    &:hover {
+      text-decoration: underline;
+    }
+  }
+
   p {
     margin-bottom: 20px;
     unicode-bidi: plaintext;
diff --git a/app/javascript/flavours/glitch/styles/components/accounts.scss b/app/javascript/flavours/glitch/styles/components/accounts.scss
index ac2d642a8..5b3e1db1b 100644
--- a/app/javascript/flavours/glitch/styles/components/accounts.scss
+++ b/app/javascript/flavours/glitch/styles/components/accounts.scss
@@ -523,7 +523,6 @@
       display: block;
       flex: 0 0 auto;
       width: 94px;
-      margin-left: -2px;
 
       .account__avatar {
         background: darken($ui-base-color, 8%);
@@ -540,6 +539,7 @@
     margin-top: -55px;
     gap: 8px;
     overflow: hidden;
+    margin-left: -2px; // aligns the pfp with content below
 
     &__buttons {
       display: flex;
@@ -593,6 +593,10 @@
           font-weight: 400;
           overflow: hidden;
           text-overflow: ellipsis;
+
+          span {
+            user-select: all;
+          }
         }
       }
     }
@@ -752,3 +756,37 @@
     }
   }
 }
+
+.moved-account-banner,
+.follow-request-banner {
+  padding: 20px;
+  background: lighten($ui-base-color, 4%);
+  display: flex;
+  align-items: center;
+  flex-direction: column;
+  &__message {
+    color: $darker-text-color;
+    padding: 8px 0;
+    padding-top: 0;
+    padding-bottom: 4px;
+    font-size: 14px;
+    font-weight: 500;
+    text-align: center;
+    margin-bottom: 16px;
+  }
+  &__action {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    gap: 15px;
+    width: 100%;
+  }
+
+  .detailed-status__display-name {
+    margin-bottom: 0;
+  }
+}
+
+.follow-request-banner .button {
+  width: 100%;
+}
diff --git a/app/javascript/flavours/glitch/styles/components/compose_form.scss b/app/javascript/flavours/glitch/styles/components/compose_form.scss
index 72d3aad1d..aa2d52ed0 100644
--- a/app/javascript/flavours/glitch/styles/components/compose_form.scss
+++ b/app/javascript/flavours/glitch/styles/components/compose_form.scss
@@ -586,7 +586,6 @@
 }
 
 .privacy-dropdown__dropdown {
-  position: absolute;
   border-radius: 4px;
   box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
   background: $simple-background-color;
@@ -653,7 +652,6 @@
 
 .language-dropdown {
   &__dropdown {
-    position: absolute;
     background: $simple-background-color;
     box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
     border-radius: 4px;
diff --git a/app/javascript/flavours/glitch/styles/components/emoji.scss b/app/javascript/flavours/glitch/styles/components/emoji.scss
index 9dfee346a..c037e03f9 100644
--- a/app/javascript/flavours/glitch/styles/components/emoji.scss
+++ b/app/javascript/flavours/glitch/styles/components/emoji.scss
@@ -13,7 +13,7 @@
 
 .emoji-picker-dropdown__menu {
   background: $simple-background-color;
-  position: absolute;
+  position: relative;
   box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);
   border-radius: 4px;
   margin-top: 5px;
diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss
index 84aca2ebc..d50316366 100644
--- a/app/javascript/flavours/glitch/styles/components/index.scss
+++ b/app/javascript/flavours/glitch/styles/components/index.scss
@@ -141,6 +141,30 @@
     &:disabled {
       opacity: 0.5;
     }
+
+    &.button--confirmation {
+      color: $valid-value-color;
+      border-color: $valid-value-color;
+
+      &:active,
+      &:focus,
+      &:hover {
+        background: $valid-value-color;
+        color: $primary-text-color;
+      }
+    }
+
+    &.button--destructive {
+      color: $error-value-color;
+      border-color: $error-value-color;
+
+      &:active,
+      &:focus,
+      &:hover {
+        background: $error-value-color;
+        color: $primary-text-color;
+      }
+    }
   }
 
   &.button--block {
@@ -322,9 +346,8 @@
   }
 }
 
-.dropdown-menu {
-  position: absolute;
-  transform-origin: 50% 0;
+body > [data-popper-placement] {
+  z-index: 3;
 }
 
 .invisible {
@@ -508,6 +531,42 @@
   }
 }
 
+.dropdown-animation {
+  animation: dropdown 300ms cubic-bezier(0.1, 0.7, 0.1, 1);
+
+  @keyframes dropdown {
+    from {
+      opacity: 0;
+      transform: scaleX(0.85) scaleY(0.75);
+    }
+
+    to {
+      opacity: 1;
+      transform: scaleX(1) scaleY(1);
+    }
+  }
+
+  &.top {
+    transform-origin: bottom;
+  }
+
+  &.right {
+    transform-origin: left;
+  }
+
+  &.bottom {
+    transform-origin: top;
+  }
+
+  &.left {
+    transform-origin: right;
+  }
+
+  .reduce-motion & {
+    animation: none;
+  }
+}
+
 .dropdown {
   display: inline-block;
 }
@@ -576,36 +635,42 @@
 
 .dropdown-menu__arrow {
   position: absolute;
-  width: 0;
-  height: 0;
-  border: 0 solid transparent;
 
-  &.left {
-    right: -5px;
-    margin-top: -5px;
-    border-width: 5px 0 5px 5px;
-    border-left-color: $ui-secondary-color;
+  &::before {
+    content: '';
+    display: block;
+    width: 14px;
+    height: 5px;
+    background-color: $ui-secondary-color;
+    mask-image: url("data:image/svg+xml;utf8,<svg width='14' height='5' xmlns='http://www.w3.org/2000/svg'><path d='M7 0L0 5h14L7 0z' fill='white'/></svg>");
   }
 
   &.top {
     bottom: -5px;
-    margin-left: -7px;
-    border-width: 5px 7px 0;
-    border-top-color: $ui-secondary-color;
+
+    &::before {
+      transform: rotate(180deg);
+    }
+  }
+
+  &.right {
+    left: -9px;
+
+    &::before {
+      transform: rotate(-90deg);
+    }
   }
 
   &.bottom {
     top: -5px;
-    margin-left: -7px;
-    border-width: 0 7px 5px;
-    border-bottom-color: $ui-secondary-color;
   }
 
-  &.right {
-    left: -5px;
-    margin-top: -5px;
-    border-width: 5px 5px 5px 0;
-    border-right-color: $ui-secondary-color;
+  &.left {
+    right: -9px;
+
+    &::before {
+      transform: rotate(90deg);
+    }
   }
 }
 
diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss
index 8ba8bec10..972e01e7d 100644
--- a/app/javascript/flavours/glitch/styles/components/modal.scss
+++ b/app/javascript/flavours/glitch/styles/components/modal.scss
@@ -37,7 +37,6 @@
 .modal-root__modal {
   pointer-events: auto;
   display: flex;
-  z-index: 9999;
 }
 
 .media-modal__zoom-button {
diff --git a/app/javascript/flavours/glitch/styles/components/search.scss b/app/javascript/flavours/glitch/styles/components/search.scss
index 70af0f651..b8078bdb6 100644
--- a/app/javascript/flavours/glitch/styles/components/search.scss
+++ b/app/javascript/flavours/glitch/styles/components/search.scss
@@ -1,4 +1,5 @@
 .search {
+  margin-bottom: 10px;
   position: relative;
 }
 
diff --git a/app/javascript/flavours/glitch/styles/components/single_column.scss b/app/javascript/flavours/glitch/styles/components/single_column.scss
index 45d57aedd..74e5d0884 100644
--- a/app/javascript/flavours/glitch/styles/components/single_column.scss
+++ b/app/javascript/flavours/glitch/styles/components/single_column.scss
@@ -227,8 +227,7 @@
     height: calc(100% - 10px) !important;
   }
 
-  .getting-started__wrapper,
-  .search {
+  .getting-started__wrapper {
     margin-bottom: 10px;
   }
 
@@ -281,7 +280,7 @@
     }
   }
 
-  .ui__header {
+  .layout-single-column .ui__header {
     display: flex;
     background: $ui-base-color;
     border-bottom: 1px solid lighten($ui-base-color, 8%);
diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index 64dbc3cf0..a46fb94b2 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -448,7 +448,6 @@
 
 .status__relative-time {
   display: inline-block;
-  flex-grow: 1;
   color: $dark-text-color;
   font-size: 14px;
   text-align: right;
@@ -598,6 +597,10 @@
   width: 23.15px;
 }
 
+.status__action-bar-spacer {
+  flex-grow: 1;
+}
+
 .detailed-status__action-bar-dropdown {
   flex: 1 1 auto;
   display: flex;
@@ -1075,7 +1078,7 @@ a.status-card.compact:hover {
       pointer-events: 0;
       width: 100%;
       height: 100%;
-      border-left: 2px solid $highlight-text-color;
+      border-left: 4px solid $highlight-text-color;
       pointer-events: none;
     }
   }
diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
index 9fc1aed2a..2ec2da833 100644
--- a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
+++ b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
@@ -285,22 +285,8 @@ html {
 .dropdown-menu {
   background: $white;
 
-  &__arrow {
-    &.left {
-      border-left-color: $white;
-    }
-
-    &.top {
-      border-top-color: $white;
-    }
-
-    &.bottom {
-      border-bottom-color: $white;
-    }
-
-    &.right {
-      border-right-color: $white;
-    }
+  &__arrow::before {
+    background-color: $white;
   }
 
   &__item {
diff --git a/app/javascript/flavours/glitch/styles/modal.scss b/app/javascript/flavours/glitch/styles/modal.scss
index 6c6de4206..a333926dd 100644
--- a/app/javascript/flavours/glitch/styles/modal.scss
+++ b/app/javascript/flavours/glitch/styles/modal.scss
@@ -1,5 +1,5 @@
 .modal-layout {
-  background: $ui-base-color url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}"/></svg>') repeat-x bottom fixed;
+  background: $ui-base-color url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}33"/></svg>') repeat-x bottom fixed;
   display: flex;
   flex-direction: column;
   height: 100vh;
diff --git a/app/javascript/flavours/glitch/styles/polls.scss b/app/javascript/flavours/glitch/styles/polls.scss
index 0847c8f4c..43924829d 100644
--- a/app/javascript/flavours/glitch/styles/polls.scss
+++ b/app/javascript/flavours/glitch/styles/polls.scss
@@ -289,10 +289,10 @@
   color: $dark-text-color;
 
   &__chart {
-    background: rgba(darken($ui-primary-color, 14%), 0.2);
+    background: rgba(darken($ui-primary-color, 14%), 0.7);
 
     &.leading {
-      background: rgba($ui-highlight-color, 0.2);
+      background: rgba($ui-highlight-color, 0.5);
     }
   }
 }
diff --git a/app/javascript/flavours/glitch/theme.yml b/app/javascript/flavours/glitch/theme.yml
index e85dd74e1..2a2cf30b5 100644
--- a/app/javascript/flavours/glitch/theme.yml
+++ b/app/javascript/flavours/glitch/theme.yml
@@ -12,10 +12,10 @@ pack:
   home:
     filename: packs/home.js
     preload:
-    - flavours/glitch/async/compose
-    - flavours/glitch/async/getting_started
-    - flavours/glitch/async/home_timeline
-    - flavours/glitch/async/notifications
+      - flavours/glitch/async/compose
+      - flavours/glitch/async/getting_started
+      - flavours/glitch/async/home_timeline
+      - flavours/glitch/async/notifications
   mailer:
   modal:
   public: packs/public.js
@@ -24,10 +24,13 @@ pack:
 
 #  (OPTIONAL) The directory which contains localization files for
 #  the flavour, relative to this directory. The contents of this
-#  directory must be `.js` or `.json` files whose names correspond to
+#  directory must be `.json` files whose names correspond to
 #  language tags and whose default exports are a messages object.
 locales: locales
 
+#  (OPTIONAL) Which flavour to inherit locales from
+inherit_locales: vanilla
+
 #  (OPTIONAL) A file to use as the preview screenshot for the flavour,
 #  or an array thereof. These are the full path from `app/javascript/`.
 screenshot: flavours/glitch/images/glitch-preview.jpg
diff --git a/app/javascript/flavours/vanilla/theme.yml b/app/javascript/flavours/vanilla/theme.yml
index 5cb76b721..3f0b27899 100644
--- a/app/javascript/flavours/vanilla/theme.yml
+++ b/app/javascript/flavours/vanilla/theme.yml
@@ -12,10 +12,10 @@ pack:
   home:
     filename: application.js
     preload:
-    - features/getting_started
-    - features/compose
-    - features/home_timeline
-    - features/notifications
+      - features/getting_started
+      - features/compose
+      - features/home_timeline
+      - features/notifications
   mailer:
   modal:
   public: public.js
diff --git a/app/javascript/images/logo-symbol-icon.svg b/app/javascript/images/logo-symbol-icon.svg
index 56cf03921..c4c14f098 100644
--- a/app/javascript/images/logo-symbol-icon.svg
+++ b/app/javascript/images/logo-symbol-icon.svg
@@ -1,2 +1,2 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="79" height="79" viewBox="0 0 79 75"><symbol id="logo-symbol-icon"><path d="M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z" fill="currentColor"/></symbol><use xlink:href="#logo-symbol-icon" style="color:#fff" /></svg>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="79" height="79" viewBox="0 0 79 75"><symbol id="logo-symbol-icon"><path d="M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z" fill="currentColor"/></symbol><use xlink:href="#logo-symbol-icon"/></svg>
 
diff --git a/app/javascript/images/logo-symbol-wordmark.svg b/app/javascript/images/logo-symbol-wordmark.svg
index 7e7f7b087..ee0b636d9 100644
--- a/app/javascript/images/logo-symbol-wordmark.svg
+++ b/app/javascript/images/logo-symbol-wordmark.svg
@@ -7,5 +7,5 @@
 <stop stop-color="#6364FF"/>
 <stop offset="1" stop-color="#563ACC"/>
 </linearGradient>
-</defs></symbol><use xlink:href="#logo-symbol-wordmark" style="color:#fff"/>
+</defs></symbol><use xlink:href="#logo-symbol-wordmark"/>
 </svg>
diff --git a/app/javascript/mastodon/actions/account_notes.js b/app/javascript/mastodon/actions/account_notes.js
index d17441000..72b943300 100644
--- a/app/javascript/mastodon/actions/account_notes.js
+++ b/app/javascript/mastodon/actions/account_notes.js
@@ -14,24 +14,24 @@ export function submitAccountNote(id, value) {
       dispatch(submitAccountNoteSuccess(response.data));
     }).catch(error => dispatch(submitAccountNoteFail(error)));
   };
-};
+}
 
 export function submitAccountNoteRequest() {
   return {
     type: ACCOUNT_NOTE_SUBMIT_REQUEST,
   };
-};
+}
 
 export function submitAccountNoteSuccess(relationship) {
   return {
     type: ACCOUNT_NOTE_SUBMIT_SUCCESS,
     relationship,
   };
-};
+}
 
 export function submitAccountNoteFail(error) {
   return {
     type: ACCOUNT_NOTE_SUBMIT_FAIL,
     error,
   };
-};
+}
diff --git a/app/javascript/mastodon/actions/accounts.js b/app/javascript/mastodon/actions/accounts.js
index f61f06e40..88407ae6c 100644
--- a/app/javascript/mastodon/actions/accounts.js
+++ b/app/javascript/mastodon/actions/accounts.js
@@ -91,7 +91,7 @@ export function fetchAccount(id) {
       dispatch(fetchAccountFail(id, error));
     });
   };
-};
+}
 
 export const lookupAccount = acct => (dispatch, getState) => {
   dispatch(lookupAccountRequest(acct));
@@ -126,13 +126,13 @@ export function fetchAccountRequest(id) {
     type: ACCOUNT_FETCH_REQUEST,
     id,
   };
-};
+}
 
 export function fetchAccountSuccess() {
   return {
     type: ACCOUNT_FETCH_SUCCESS,
   };
-};
+}
 
 export function fetchAccountFail(id, error) {
   return {
@@ -141,7 +141,7 @@ export function fetchAccountFail(id, error) {
     error,
     skipAlert: true,
   };
-};
+}
 
 export function followAccount(id, options = { reblogs: true }) {
   return (dispatch, getState) => {
@@ -156,7 +156,7 @@ export function followAccount(id, options = { reblogs: true }) {
       dispatch(followAccountFail(error, locked));
     });
   };
-};
+}
 
 export function unfollowAccount(id) {
   return (dispatch, getState) => {
@@ -168,7 +168,7 @@ export function unfollowAccount(id) {
       dispatch(unfollowAccountFail(error));
     });
   };
-};
+}
 
 export function followAccountRequest(id, locked) {
   return {
@@ -177,7 +177,7 @@ export function followAccountRequest(id, locked) {
     locked,
     skipLoading: true,
   };
-};
+}
 
 export function followAccountSuccess(relationship, alreadyFollowing) {
   return {
@@ -186,7 +186,7 @@ export function followAccountSuccess(relationship, alreadyFollowing) {
     alreadyFollowing,
     skipLoading: true,
   };
-};
+}
 
 export function followAccountFail(error, locked) {
   return {
@@ -195,7 +195,7 @@ export function followAccountFail(error, locked) {
     locked,
     skipLoading: true,
   };
-};
+}
 
 export function unfollowAccountRequest(id) {
   return {
@@ -203,7 +203,7 @@ export function unfollowAccountRequest(id) {
     id,
     skipLoading: true,
   };
-};
+}
 
 export function unfollowAccountSuccess(relationship, statuses) {
   return {
@@ -212,7 +212,7 @@ export function unfollowAccountSuccess(relationship, statuses) {
     statuses,
     skipLoading: true,
   };
-};
+}
 
 export function unfollowAccountFail(error) {
   return {
@@ -220,7 +220,7 @@ export function unfollowAccountFail(error) {
     error,
     skipLoading: true,
   };
-};
+}
 
 export function blockAccount(id) {
   return (dispatch, getState) => {
@@ -233,7 +233,7 @@ export function blockAccount(id) {
       dispatch(blockAccountFail(id, error));
     });
   };
-};
+}
 
 export function unblockAccount(id) {
   return (dispatch, getState) => {
@@ -245,14 +245,14 @@ export function unblockAccount(id) {
       dispatch(unblockAccountFail(id, error));
     });
   };
-};
+}
 
 export function blockAccountRequest(id) {
   return {
     type: ACCOUNT_BLOCK_REQUEST,
     id,
   };
-};
+}
 
 export function blockAccountSuccess(relationship, statuses) {
   return {
@@ -260,35 +260,35 @@ export function blockAccountSuccess(relationship, statuses) {
     relationship,
     statuses,
   };
-};
+}
 
 export function blockAccountFail(error) {
   return {
     type: ACCOUNT_BLOCK_FAIL,
     error,
   };
-};
+}
 
 export function unblockAccountRequest(id) {
   return {
     type: ACCOUNT_UNBLOCK_REQUEST,
     id,
   };
-};
+}
 
 export function unblockAccountSuccess(relationship) {
   return {
     type: ACCOUNT_UNBLOCK_SUCCESS,
     relationship,
   };
-};
+}
 
 export function unblockAccountFail(error) {
   return {
     type: ACCOUNT_UNBLOCK_FAIL,
     error,
   };
-};
+}
 
 
 export function muteAccount(id, notifications, duration=0) {
@@ -302,7 +302,7 @@ export function muteAccount(id, notifications, duration=0) {
       dispatch(muteAccountFail(id, error));
     });
   };
-};
+}
 
 export function unmuteAccount(id) {
   return (dispatch, getState) => {
@@ -314,14 +314,14 @@ export function unmuteAccount(id) {
       dispatch(unmuteAccountFail(id, error));
     });
   };
-};
+}
 
 export function muteAccountRequest(id) {
   return {
     type: ACCOUNT_MUTE_REQUEST,
     id,
   };
-};
+}
 
 export function muteAccountSuccess(relationship, statuses) {
   return {
@@ -329,35 +329,35 @@ export function muteAccountSuccess(relationship, statuses) {
     relationship,
     statuses,
   };
-};
+}
 
 export function muteAccountFail(error) {
   return {
     type: ACCOUNT_MUTE_FAIL,
     error,
   };
-};
+}
 
 export function unmuteAccountRequest(id) {
   return {
     type: ACCOUNT_UNMUTE_REQUEST,
     id,
   };
-};
+}
 
 export function unmuteAccountSuccess(relationship) {
   return {
     type: ACCOUNT_UNMUTE_SUCCESS,
     relationship,
   };
-};
+}
 
 export function unmuteAccountFail(error) {
   return {
     type: ACCOUNT_UNMUTE_FAIL,
     error,
   };
-};
+}
 
 
 export function fetchFollowers(id) {
@@ -374,14 +374,14 @@ export function fetchFollowers(id) {
       dispatch(fetchFollowersFail(id, error));
     });
   };
-};
+}
 
 export function fetchFollowersRequest(id) {
   return {
     type: FOLLOWERS_FETCH_REQUEST,
     id,
   };
-};
+}
 
 export function fetchFollowersSuccess(id, accounts, next) {
   return {
@@ -390,7 +390,7 @@ export function fetchFollowersSuccess(id, accounts, next) {
     accounts,
     next,
   };
-};
+}
 
 export function fetchFollowersFail(id, error) {
   return {
@@ -399,7 +399,7 @@ export function fetchFollowersFail(id, error) {
     error,
     skipNotFound: true,
   };
-};
+}
 
 export function expandFollowers(id) {
   return (dispatch, getState) => {
@@ -421,14 +421,14 @@ export function expandFollowers(id) {
       dispatch(expandFollowersFail(id, error));
     });
   };
-};
+}
 
 export function expandFollowersRequest(id) {
   return {
     type: FOLLOWERS_EXPAND_REQUEST,
     id,
   };
-};
+}
 
 export function expandFollowersSuccess(id, accounts, next) {
   return {
@@ -437,7 +437,7 @@ export function expandFollowersSuccess(id, accounts, next) {
     accounts,
     next,
   };
-};
+}
 
 export function expandFollowersFail(id, error) {
   return {
@@ -445,7 +445,7 @@ export function expandFollowersFail(id, error) {
     id,
     error,
   };
-};
+}
 
 export function fetchFollowing(id) {
   return (dispatch, getState) => {
@@ -461,14 +461,14 @@ export function fetchFollowing(id) {
       dispatch(fetchFollowingFail(id, error));
     });
   };
-};
+}
 
 export function fetchFollowingRequest(id) {
   return {
     type: FOLLOWING_FETCH_REQUEST,
     id,
   };
-};
+}
 
 export function fetchFollowingSuccess(id, accounts, next) {
   return {
@@ -477,7 +477,7 @@ export function fetchFollowingSuccess(id, accounts, next) {
     accounts,
     next,
   };
-};
+}
 
 export function fetchFollowingFail(id, error) {
   return {
@@ -486,7 +486,7 @@ export function fetchFollowingFail(id, error) {
     error,
     skipNotFound: true,
   };
-};
+}
 
 export function expandFollowing(id) {
   return (dispatch, getState) => {
@@ -508,14 +508,14 @@ export function expandFollowing(id) {
       dispatch(expandFollowingFail(id, error));
     });
   };
-};
+}
 
 export function expandFollowingRequest(id) {
   return {
     type: FOLLOWING_EXPAND_REQUEST,
     id,
   };
-};
+}
 
 export function expandFollowingSuccess(id, accounts, next) {
   return {
@@ -524,7 +524,7 @@ export function expandFollowingSuccess(id, accounts, next) {
     accounts,
     next,
   };
-};
+}
 
 export function expandFollowingFail(id, error) {
   return {
@@ -532,7 +532,7 @@ export function expandFollowingFail(id, error) {
     id,
     error,
   };
-};
+}
 
 export function fetchRelationships(accountIds) {
   return (dispatch, getState) => {
@@ -553,7 +553,7 @@ export function fetchRelationships(accountIds) {
       dispatch(fetchRelationshipsFail(error));
     });
   };
-};
+}
 
 export function fetchRelationshipsRequest(ids) {
   return {
@@ -561,7 +561,7 @@ export function fetchRelationshipsRequest(ids) {
     ids,
     skipLoading: true,
   };
-};
+}
 
 export function fetchRelationshipsSuccess(relationships) {
   return {
@@ -569,7 +569,7 @@ export function fetchRelationshipsSuccess(relationships) {
     relationships,
     skipLoading: true,
   };
-};
+}
 
 export function fetchRelationshipsFail(error) {
   return {
@@ -578,7 +578,7 @@ export function fetchRelationshipsFail(error) {
     skipLoading: true,
     skipNotFound: true,
   };
-};
+}
 
 export function fetchFollowRequests() {
   return (dispatch, getState) => {
@@ -590,13 +590,13 @@ export function fetchFollowRequests() {
       dispatch(fetchFollowRequestsSuccess(response.data, next ? next.uri : null));
     }).catch(error => dispatch(fetchFollowRequestsFail(error)));
   };
-};
+}
 
 export function fetchFollowRequestsRequest() {
   return {
     type: FOLLOW_REQUESTS_FETCH_REQUEST,
   };
-};
+}
 
 export function fetchFollowRequestsSuccess(accounts, next) {
   return {
@@ -604,14 +604,14 @@ export function fetchFollowRequestsSuccess(accounts, next) {
     accounts,
     next,
   };
-};
+}
 
 export function fetchFollowRequestsFail(error) {
   return {
     type: FOLLOW_REQUESTS_FETCH_FAIL,
     error,
   };
-};
+}
 
 export function expandFollowRequests() {
   return (dispatch, getState) => {
@@ -629,13 +629,13 @@ export function expandFollowRequests() {
       dispatch(expandFollowRequestsSuccess(response.data, next ? next.uri : null));
     }).catch(error => dispatch(expandFollowRequestsFail(error)));
   };
-};
+}
 
 export function expandFollowRequestsRequest() {
   return {
     type: FOLLOW_REQUESTS_EXPAND_REQUEST,
   };
-};
+}
 
 export function expandFollowRequestsSuccess(accounts, next) {
   return {
@@ -643,14 +643,14 @@ export function expandFollowRequestsSuccess(accounts, next) {
     accounts,
     next,
   };
-};
+}
 
 export function expandFollowRequestsFail(error) {
   return {
     type: FOLLOW_REQUESTS_EXPAND_FAIL,
     error,
   };
-};
+}
 
 export function authorizeFollowRequest(id) {
   return (dispatch, getState) => {
@@ -661,21 +661,21 @@ export function authorizeFollowRequest(id) {
       .then(() => dispatch(authorizeFollowRequestSuccess(id)))
       .catch(error => dispatch(authorizeFollowRequestFail(id, error)));
   };
-};
+}
 
 export function authorizeFollowRequestRequest(id) {
   return {
     type: FOLLOW_REQUEST_AUTHORIZE_REQUEST,
     id,
   };
-};
+}
 
 export function authorizeFollowRequestSuccess(id) {
   return {
     type: FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
     id,
   };
-};
+}
 
 export function authorizeFollowRequestFail(id, error) {
   return {
@@ -683,7 +683,7 @@ export function authorizeFollowRequestFail(id, error) {
     id,
     error,
   };
-};
+}
 
 
 export function rejectFollowRequest(id) {
@@ -695,21 +695,21 @@ export function rejectFollowRequest(id) {
       .then(() => dispatch(rejectFollowRequestSuccess(id)))
       .catch(error => dispatch(rejectFollowRequestFail(id, error)));
   };
-};
+}
 
 export function rejectFollowRequestRequest(id) {
   return {
     type: FOLLOW_REQUEST_REJECT_REQUEST,
     id,
   };
-};
+}
 
 export function rejectFollowRequestSuccess(id) {
   return {
     type: FOLLOW_REQUEST_REJECT_SUCCESS,
     id,
   };
-};
+}
 
 export function rejectFollowRequestFail(id, error) {
   return {
@@ -717,7 +717,7 @@ export function rejectFollowRequestFail(id, error) {
     id,
     error,
   };
-};
+}
 
 export function pinAccount(id) {
   return (dispatch, getState) => {
@@ -729,7 +729,7 @@ export function pinAccount(id) {
       dispatch(pinAccountFail(error));
     });
   };
-};
+}
 
 export function unpinAccount(id) {
   return (dispatch, getState) => {
@@ -741,49 +741,49 @@ export function unpinAccount(id) {
       dispatch(unpinAccountFail(error));
     });
   };
-};
+}
 
 export function pinAccountRequest(id) {
   return {
     type: ACCOUNT_PIN_REQUEST,
     id,
   };
-};
+}
 
 export function pinAccountSuccess(relationship) {
   return {
     type: ACCOUNT_PIN_SUCCESS,
     relationship,
   };
-};
+}
 
 export function pinAccountFail(error) {
   return {
     type: ACCOUNT_PIN_FAIL,
     error,
   };
-};
+}
 
 export function unpinAccountRequest(id) {
   return {
     type: ACCOUNT_UNPIN_REQUEST,
     id,
   };
-};
+}
 
 export function unpinAccountSuccess(relationship) {
   return {
     type: ACCOUNT_UNPIN_SUCCESS,
     relationship,
   };
-};
+}
 
 export function unpinAccountFail(error) {
   return {
     type: ACCOUNT_UNPIN_FAIL,
     error,
   };
-};
+}
 
 export const revealAccount = id => ({
   type: ACCOUNT_REVEAL,
diff --git a/app/javascript/mastodon/actions/alerts.js b/app/javascript/mastodon/actions/alerts.js
index 1670f9c10..0220b0af5 100644
--- a/app/javascript/mastodon/actions/alerts.js
+++ b/app/javascript/mastodon/actions/alerts.js
@@ -17,13 +17,13 @@ export function dismissAlert(alert) {
     type: ALERT_DISMISS,
     alert,
   };
-};
+}
 
 export function clearAlert() {
   return {
     type: ALERT_CLEAR,
   };
-};
+}
 
 export function showAlert(title = messages.unexpectedTitle, message = messages.unexpectedMessage, message_values = undefined) {
   return {
@@ -32,7 +32,7 @@ export function showAlert(title = messages.unexpectedTitle, message = messages.u
     message,
     message_values,
   };
-};
+}
 
 export function showAlertForError(error, skipNotFound = false) {
   if (error.response) {
diff --git a/app/javascript/mastodon/actions/announcements.js b/app/javascript/mastodon/actions/announcements.js
index 1bdea909f..586dcfd33 100644
--- a/app/javascript/mastodon/actions/announcements.js
+++ b/app/javascript/mastodon/actions/announcements.js
@@ -102,7 +102,7 @@ export const addReaction = (announcementId, name) => (dispatch, getState) => {
     dispatch(addReactionRequest(announcementId, name, alreadyAdded));
   }
 
-  api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => {
+  api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => {
     dispatch(addReactionSuccess(announcementId, name, alreadyAdded));
   }).catch(err => {
     if (!alreadyAdded) {
@@ -136,7 +136,7 @@ export const addReactionFail = (announcementId, name, error) => ({
 export const removeReaction = (announcementId, name) => (dispatch, getState) => {
   dispatch(removeReactionRequest(announcementId, name));
 
-  api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => {
+  api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${encodeURIComponent(name)}`).then(() => {
     dispatch(removeReactionSuccess(announcementId, name));
   }).catch(err => {
     dispatch(removeReactionFail(announcementId, name, err));
diff --git a/app/javascript/mastodon/actions/blocks.js b/app/javascript/mastodon/actions/blocks.js
index fd9881302..192aa3ce4 100644
--- a/app/javascript/mastodon/actions/blocks.js
+++ b/app/javascript/mastodon/actions/blocks.js
@@ -24,13 +24,13 @@ export function fetchBlocks() {
       dispatch(fetchRelationships(response.data.map(item => item.id)));
     }).catch(error => dispatch(fetchBlocksFail(error)));
   };
-};
+}
 
 export function fetchBlocksRequest() {
   return {
     type: BLOCKS_FETCH_REQUEST,
   };
-};
+}
 
 export function fetchBlocksSuccess(accounts, next) {
   return {
@@ -38,14 +38,14 @@ export function fetchBlocksSuccess(accounts, next) {
     accounts,
     next,
   };
-};
+}
 
 export function fetchBlocksFail(error) {
   return {
     type: BLOCKS_FETCH_FAIL,
     error,
   };
-};
+}
 
 export function expandBlocks() {
   return (dispatch, getState) => {
@@ -64,13 +64,13 @@ export function expandBlocks() {
       dispatch(fetchRelationships(response.data.map(item => item.id)));
     }).catch(error => dispatch(expandBlocksFail(error)));
   };
-};
+}
 
 export function expandBlocksRequest() {
   return {
     type: BLOCKS_EXPAND_REQUEST,
   };
-};
+}
 
 export function expandBlocksSuccess(accounts, next) {
   return {
@@ -78,14 +78,14 @@ export function expandBlocksSuccess(accounts, next) {
     accounts,
     next,
   };
-};
+}
 
 export function expandBlocksFail(error) {
   return {
     type: BLOCKS_EXPAND_FAIL,
     error,
   };
-};
+}
 
 export function initBlockModal(account) {
   return dispatch => {
diff --git a/app/javascript/mastodon/actions/bookmarks.js b/app/javascript/mastodon/actions/bookmarks.js
index 544ed2ff2..3c8eec546 100644
--- a/app/javascript/mastodon/actions/bookmarks.js
+++ b/app/javascript/mastodon/actions/bookmarks.js
@@ -25,13 +25,13 @@ export function fetchBookmarkedStatuses() {
       dispatch(fetchBookmarkedStatusesFail(error));
     });
   };
-};
+}
 
 export function fetchBookmarkedStatusesRequest() {
   return {
     type: BOOKMARKED_STATUSES_FETCH_REQUEST,
   };
-};
+}
 
 export function fetchBookmarkedStatusesSuccess(statuses, next) {
   return {
@@ -39,14 +39,14 @@ export function fetchBookmarkedStatusesSuccess(statuses, next) {
     statuses,
     next,
   };
-};
+}
 
 export function fetchBookmarkedStatusesFail(error) {
   return {
     type: BOOKMARKED_STATUSES_FETCH_FAIL,
     error,
   };
-};
+}
 
 export function expandBookmarkedStatuses() {
   return (dispatch, getState) => {
@@ -66,13 +66,13 @@ export function expandBookmarkedStatuses() {
       dispatch(expandBookmarkedStatusesFail(error));
     });
   };
-};
+}
 
 export function expandBookmarkedStatusesRequest() {
   return {
     type: BOOKMARKED_STATUSES_EXPAND_REQUEST,
   };
-};
+}
 
 export function expandBookmarkedStatusesSuccess(statuses, next) {
   return {
@@ -80,11 +80,11 @@ export function expandBookmarkedStatusesSuccess(statuses, next) {
     statuses,
     next,
   };
-};
+}
 
 export function expandBookmarkedStatusesFail(error) {
   return {
     type: BOOKMARKED_STATUSES_EXPAND_FAIL,
     error,
   };
-};
+}
diff --git a/app/javascript/mastodon/actions/columns.js b/app/javascript/mastodon/actions/columns.js
index 9b87415fb..302c3f0f9 100644
--- a/app/javascript/mastodon/actions/columns.js
+++ b/app/javascript/mastodon/actions/columns.js
@@ -15,7 +15,7 @@ export function addColumn(id, params) {
 
     dispatch(saveSettings());
   };
-};
+}
 
 export function removeColumn(uuid) {
   return dispatch => {
@@ -26,7 +26,7 @@ export function removeColumn(uuid) {
 
     dispatch(saveSettings());
   };
-};
+}
 
 export function moveColumn(uuid, direction) {
   return dispatch => {
@@ -38,7 +38,7 @@ export function moveColumn(uuid, direction) {
 
     dispatch(saveSettings());
   };
-};
+}
 
 export function changeColumnParams(uuid, path, value) {
   return dispatch => {
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index 26d389648..12d25490b 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -94,14 +94,14 @@ export function setComposeToStatus(status, text, spoiler_text) {
     text,
     spoiler_text,
   };
-};
+}
 
 export function changeCompose(text) {
   return {
     type: COMPOSE_CHANGE,
     text: text,
   };
-};
+}
 
 export function replyCompose(status, routerHistory) {
   return (dispatch, getState) => {
@@ -112,19 +112,19 @@ export function replyCompose(status, routerHistory) {
 
     ensureComposeIsVisible(getState, routerHistory);
   };
-};
+}
 
 export function cancelReplyCompose() {
   return {
     type: COMPOSE_REPLY_CANCEL,
   };
-};
+}
 
 export function resetCompose() {
   return {
     type: COMPOSE_RESET,
   };
-};
+}
 
 export function mentionCompose(account, routerHistory) {
   return (dispatch, getState) => {
@@ -135,7 +135,7 @@ export function mentionCompose(account, routerHistory) {
 
     ensureComposeIsVisible(getState, routerHistory);
   };
-};
+}
 
 export function directCompose(account, routerHistory) {
   return (dispatch, getState) => {
@@ -146,7 +146,7 @@ export function directCompose(account, routerHistory) {
 
     ensureComposeIsVisible(getState, routerHistory);
   };
-};
+}
 
 export function submitCompose(routerHistory) {
   return function (dispatch, getState) {
@@ -213,27 +213,27 @@ export function submitCompose(routerHistory) {
       dispatch(submitComposeFail(error));
     });
   };
-};
+}
 
 export function submitComposeRequest() {
   return {
     type: COMPOSE_SUBMIT_REQUEST,
   };
-};
+}
 
 export function submitComposeSuccess(status) {
   return {
     type: COMPOSE_SUBMIT_SUCCESS,
     status: status,
   };
-};
+}
 
 export function submitComposeFail(error) {
   return {
     type: COMPOSE_SUBMIT_FAIL,
     error: error,
   };
-};
+}
 
 export function uploadCompose(files) {
   return function (dispatch, getState) {
@@ -296,9 +296,9 @@ export function uploadCompose(files) {
           }
         });
       }).catch(error => dispatch(uploadComposeFail(error)));
-    };
+    }
   };
-};
+}
 
 export const uploadComposeProcessing = () => ({
   type: COMPOSE_UPLOAD_PROCESSING,
@@ -356,14 +356,14 @@ export function initMediaEditModal(id) {
 
     dispatch(openModal('FOCAL_POINT', { id }));
   };
-};
+}
 
 export function onChangeMediaDescription(description) {
   return {
     type: COMPOSE_CHANGE_MEDIA_DESCRIPTION,
     description,
   };
-};
+}
 
 export function onChangeMediaFocus(focusX, focusY) {
   return {
@@ -371,7 +371,7 @@ export function onChangeMediaFocus(focusX, focusY) {
     focusX,
     focusY,
   };
-};
+}
 
 export function changeUploadCompose(id, params) {
   return (dispatch, getState) => {
@@ -383,14 +383,14 @@ export function changeUploadCompose(id, params) {
       dispatch(changeUploadComposeFail(id, error));
     });
   };
-};
+}
 
 export function changeUploadComposeRequest() {
   return {
     type: COMPOSE_UPLOAD_CHANGE_REQUEST,
     skipLoading: true,
   };
-};
+}
 
 export function changeUploadComposeSuccess(media) {
   return {
@@ -398,7 +398,7 @@ export function changeUploadComposeSuccess(media) {
     media: media,
     skipLoading: true,
   };
-};
+}
 
 export function changeUploadComposeFail(error) {
   return {
@@ -406,14 +406,14 @@ export function changeUploadComposeFail(error) {
     error: error,
     skipLoading: true,
   };
-};
+}
 
 export function uploadComposeRequest() {
   return {
     type: COMPOSE_UPLOAD_REQUEST,
     skipLoading: true,
   };
-};
+}
 
 export function uploadComposeProgress(loaded, total) {
   return {
@@ -421,7 +421,7 @@ export function uploadComposeProgress(loaded, total) {
     loaded: loaded,
     total: total,
   };
-};
+}
 
 export function uploadComposeSuccess(media, file) {
   return {
@@ -430,7 +430,7 @@ export function uploadComposeSuccess(media, file) {
     file: file,
     skipLoading: true,
   };
-};
+}
 
 export function uploadComposeFail(error) {
   return {
@@ -438,14 +438,14 @@ export function uploadComposeFail(error) {
     error: error,
     skipLoading: true,
   };
-};
+}
 
 export function undoUploadCompose(media_id) {
   return {
     type: COMPOSE_UPLOAD_UNDO,
     media_id: media_id,
   };
-};
+}
 
 export function clearComposeSuggestions() {
   if (fetchComposeSuggestionsAccountsController) {
@@ -454,7 +454,7 @@ export function clearComposeSuggestions() {
   return {
     type: COMPOSE_SUGGESTIONS_CLEAR,
   };
-};
+}
 
 const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => {
   if (fetchComposeSuggestionsAccountsController) {
@@ -532,7 +532,7 @@ export function fetchComposeSuggestions(token) {
       break;
     }
   };
-};
+}
 
 export function readyComposeSuggestionsEmojis(token, emojis) {
   return {
@@ -540,7 +540,7 @@ export function readyComposeSuggestionsEmojis(token, emojis) {
     token,
     emojis,
   };
-};
+}
 
 export function readyComposeSuggestionsAccounts(token, accounts) {
   return {
@@ -548,7 +548,7 @@ export function readyComposeSuggestionsAccounts(token, accounts) {
     token,
     accounts,
   };
-};
+}
 
 export const readyComposeSuggestionsTags = (token, tags) => ({
   type: COMPOSE_SUGGESTIONS_READY,
@@ -593,7 +593,7 @@ export function selectComposeSuggestion(position, token, suggestion, path) {
       });
     }
   };
-};
+}
 
 export function updateSuggestionTags(token) {
   return {
@@ -654,19 +654,19 @@ export function mountCompose() {
   return {
     type: COMPOSE_MOUNT,
   };
-};
+}
 
 export function unmountCompose() {
   return {
     type: COMPOSE_UNMOUNT,
   };
-};
+}
 
 export function changeComposeSensitivity() {
   return {
     type: COMPOSE_SENSITIVITY_CHANGE,
   };
-};
+}
 
 export const changeComposeLanguage = language => ({
   type: COMPOSE_LANGUAGE_CHANGE,
@@ -677,21 +677,21 @@ export function changeComposeSpoilerness() {
   return {
     type: COMPOSE_SPOILERNESS_CHANGE,
   };
-};
+}
 
 export function changeComposeSpoilerText(text) {
   return {
     type: COMPOSE_SPOILER_TEXT_CHANGE,
     text,
   };
-};
+}
 
 export function changeComposeVisibility(value) {
   return {
     type: COMPOSE_VISIBILITY_CHANGE,
     value,
   };
-};
+}
 
 export function insertEmojiCompose(position, emoji, needsSpace) {
   return {
@@ -700,33 +700,33 @@ export function insertEmojiCompose(position, emoji, needsSpace) {
     emoji,
     needsSpace,
   };
-};
+}
 
 export function changeComposing(value) {
   return {
     type: COMPOSE_COMPOSING_CHANGE,
     value,
   };
-};
+}
 
 export function addPoll() {
   return {
     type: COMPOSE_POLL_ADD,
   };
-};
+}
 
 export function removePoll() {
   return {
     type: COMPOSE_POLL_REMOVE,
   };
-};
+}
 
 export function addPollOption(title) {
   return {
     type: COMPOSE_POLL_OPTION_ADD,
     title,
   };
-};
+}
 
 export function changePollOption(index, title) {
   return {
@@ -734,14 +734,14 @@ export function changePollOption(index, title) {
     index,
     title,
   };
-};
+}
 
 export function removePollOption(index) {
   return {
     type: COMPOSE_POLL_OPTION_REMOVE,
     index,
   };
-};
+}
 
 export function changePollSettings(expiresIn, isMultiple) {
   return {
@@ -749,4 +749,4 @@ export function changePollSettings(expiresIn, isMultiple) {
     expiresIn,
     isMultiple,
   };
-};
+}
diff --git a/app/javascript/mastodon/actions/custom_emojis.js b/app/javascript/mastodon/actions/custom_emojis.js
index 7b7d0091b..9ec8156b1 100644
--- a/app/javascript/mastodon/actions/custom_emojis.js
+++ b/app/javascript/mastodon/actions/custom_emojis.js
@@ -14,14 +14,14 @@ export function fetchCustomEmojis() {
       dispatch(fetchCustomEmojisFail(error));
     });
   };
-};
+}
 
 export function fetchCustomEmojisRequest() {
   return {
     type: CUSTOM_EMOJIS_FETCH_REQUEST,
     skipLoading: true,
   };
-};
+}
 
 export function fetchCustomEmojisSuccess(custom_emojis) {
   return {
@@ -29,7 +29,7 @@ export function fetchCustomEmojisSuccess(custom_emojis) {
     custom_emojis,
     skipLoading: true,
   };
-};
+}
 
 export function fetchCustomEmojisFail(error) {
   return {
@@ -37,4 +37,4 @@ export function fetchCustomEmojisFail(error) {
     error,
     skipLoading: true,
   };
-};
+}
diff --git a/app/javascript/mastodon/actions/domain_blocks.js b/app/javascript/mastodon/actions/domain_blocks.js
index 34a33a654..d06de20a2 100644
--- a/app/javascript/mastodon/actions/domain_blocks.js
+++ b/app/javascript/mastodon/actions/domain_blocks.js
@@ -29,14 +29,14 @@ export function blockDomain(domain) {
       dispatch(blockDomainFail(domain, err));
     });
   };
-};
+}
 
 export function blockDomainRequest(domain) {
   return {
     type: DOMAIN_BLOCK_REQUEST,
     domain,
   };
-};
+}
 
 export function blockDomainSuccess(domain, accounts) {
   return {
@@ -44,7 +44,7 @@ export function blockDomainSuccess(domain, accounts) {
     domain,
     accounts,
   };
-};
+}
 
 export function blockDomainFail(domain, error) {
   return {
@@ -52,7 +52,7 @@ export function blockDomainFail(domain, error) {
     domain,
     error,
   };
-};
+}
 
 export function unblockDomain(domain) {
   return (dispatch, getState) => {
@@ -66,14 +66,14 @@ export function unblockDomain(domain) {
       dispatch(unblockDomainFail(domain, err));
     });
   };
-};
+}
 
 export function unblockDomainRequest(domain) {
   return {
     type: DOMAIN_UNBLOCK_REQUEST,
     domain,
   };
-};
+}
 
 export function unblockDomainSuccess(domain, accounts) {
   return {
@@ -81,7 +81,7 @@ export function unblockDomainSuccess(domain, accounts) {
     domain,
     accounts,
   };
-};
+}
 
 export function unblockDomainFail(domain, error) {
   return {
@@ -89,7 +89,7 @@ export function unblockDomainFail(domain, error) {
     domain,
     error,
   };
-};
+}
 
 export function fetchDomainBlocks() {
   return (dispatch, getState) => {
@@ -102,13 +102,13 @@ export function fetchDomainBlocks() {
       dispatch(fetchDomainBlocksFail(err));
     });
   };
-};
+}
 
 export function fetchDomainBlocksRequest() {
   return {
     type: DOMAIN_BLOCKS_FETCH_REQUEST,
   };
-};
+}
 
 export function fetchDomainBlocksSuccess(domains, next) {
   return {
@@ -116,14 +116,14 @@ export function fetchDomainBlocksSuccess(domains, next) {
     domains,
     next,
   };
-};
+}
 
 export function fetchDomainBlocksFail(error) {
   return {
     type: DOMAIN_BLOCKS_FETCH_FAIL,
     error,
   };
-};
+}
 
 export function expandDomainBlocks() {
   return (dispatch, getState) => {
@@ -142,13 +142,13 @@ export function expandDomainBlocks() {
       dispatch(expandDomainBlocksFail(err));
     });
   };
-};
+}
 
 export function expandDomainBlocksRequest() {
   return {
     type: DOMAIN_BLOCKS_EXPAND_REQUEST,
   };
-};
+}
 
 export function expandDomainBlocksSuccess(domains, next) {
   return {
@@ -156,11 +156,11 @@ export function expandDomainBlocksSuccess(domains, next) {
     domains,
     next,
   };
-};
+}
 
 export function expandDomainBlocksFail(error) {
   return {
     type: DOMAIN_BLOCKS_EXPAND_FAIL,
     error,
   };
-};
+}
diff --git a/app/javascript/mastodon/actions/dropdown_menu.js b/app/javascript/mastodon/actions/dropdown_menu.js
index fb6e55612..023151d4b 100644
--- a/app/javascript/mastodon/actions/dropdown_menu.js
+++ b/app/javascript/mastodon/actions/dropdown_menu.js
@@ -1,8 +1,8 @@
 export const DROPDOWN_MENU_OPEN = 'DROPDOWN_MENU_OPEN';
 export const DROPDOWN_MENU_CLOSE = 'DROPDOWN_MENU_CLOSE';
 
-export function openDropdownMenu(id, placement, keyboard, scroll_key) {
-  return { type: DROPDOWN_MENU_OPEN, id, placement, keyboard, scroll_key };
+export function openDropdownMenu(id, keyboard, scroll_key) {
+  return { type: DROPDOWN_MENU_OPEN, id, keyboard, scroll_key };
 }
 
 export function closeDropdownMenu(id) {
diff --git a/app/javascript/mastodon/actions/emojis.js b/app/javascript/mastodon/actions/emojis.js
index 7cd9d4b7b..3b5d53996 100644
--- a/app/javascript/mastodon/actions/emojis.js
+++ b/app/javascript/mastodon/actions/emojis.js
@@ -11,4 +11,4 @@ export function useEmoji(emoji) {
 
     dispatch(saveSettings());
   };
-};
+}
diff --git a/app/javascript/mastodon/actions/favourites.js b/app/javascript/mastodon/actions/favourites.js
index 9448b1efe..7388e0c58 100644
--- a/app/javascript/mastodon/actions/favourites.js
+++ b/app/javascript/mastodon/actions/favourites.js
@@ -25,14 +25,14 @@ export function fetchFavouritedStatuses() {
       dispatch(fetchFavouritedStatusesFail(error));
     });
   };
-};
+}
 
 export function fetchFavouritedStatusesRequest() {
   return {
     type: FAVOURITED_STATUSES_FETCH_REQUEST,
     skipLoading: true,
   };
-};
+}
 
 export function fetchFavouritedStatusesSuccess(statuses, next) {
   return {
@@ -41,7 +41,7 @@ export function fetchFavouritedStatusesSuccess(statuses, next) {
     next,
     skipLoading: true,
   };
-};
+}
 
 export function fetchFavouritedStatusesFail(error) {
   return {
@@ -49,7 +49,7 @@ export function fetchFavouritedStatusesFail(error) {
     error,
     skipLoading: true,
   };
-};
+}
 
 export function expandFavouritedStatuses() {
   return (dispatch, getState) => {
@@ -69,13 +69,13 @@ export function expandFavouritedStatuses() {
       dispatch(expandFavouritedStatusesFail(error));
     });
   };
-};
+}
 
 export function expandFavouritedStatusesRequest() {
   return {
     type: FAVOURITED_STATUSES_EXPAND_REQUEST,
   };
-};
+}
 
 export function expandFavouritedStatusesSuccess(statuses, next) {
   return {
@@ -83,11 +83,11 @@ export function expandFavouritedStatusesSuccess(statuses, next) {
     statuses,
     next,
   };
-};
+}
 
 export function expandFavouritedStatusesFail(error) {
   return {
     type: FAVOURITED_STATUSES_EXPAND_FAIL,
     error,
   };
-};
+}
diff --git a/app/javascript/mastodon/actions/height_cache.js b/app/javascript/mastodon/actions/height_cache.js
index 4c752993f..a8645410c 100644
--- a/app/javascript/mastodon/actions/height_cache.js
+++ b/app/javascript/mastodon/actions/height_cache.js
@@ -8,10 +8,10 @@ export function setHeight (key, id, height) {
     id,
     height,
   };
-};
+}
 
 export function clearHeight () {
   return {
     type: HEIGHT_CACHE_CLEAR,
   };
-};
+}
diff --git a/app/javascript/mastodon/actions/interactions.js b/app/javascript/mastodon/actions/interactions.js
index d60ccc1fb..bc35736ff 100644
--- a/app/javascript/mastodon/actions/interactions.js
+++ b/app/javascript/mastodon/actions/interactions.js
@@ -54,7 +54,7 @@ export function reblog(status, visibility) {
       dispatch(reblogFail(status, error));
     });
   };
-};
+}
 
 export function unreblog(status) {
   return (dispatch, getState) => {
@@ -67,7 +67,7 @@ export function unreblog(status) {
       dispatch(unreblogFail(status, error));
     });
   };
-};
+}
 
 export function reblogRequest(status) {
   return {
@@ -75,7 +75,7 @@ export function reblogRequest(status) {
     status: status,
     skipLoading: true,
   };
-};
+}
 
 export function reblogSuccess(status) {
   return {
@@ -83,7 +83,7 @@ export function reblogSuccess(status) {
     status: status,
     skipLoading: true,
   };
-};
+}
 
 export function reblogFail(status, error) {
   return {
@@ -92,7 +92,7 @@ export function reblogFail(status, error) {
     error: error,
     skipLoading: true,
   };
-};
+}
 
 export function unreblogRequest(status) {
   return {
@@ -100,7 +100,7 @@ export function unreblogRequest(status) {
     status: status,
     skipLoading: true,
   };
-};
+}
 
 export function unreblogSuccess(status) {
   return {
@@ -108,7 +108,7 @@ export function unreblogSuccess(status) {
     status: status,
     skipLoading: true,
   };
-};
+}
 
 export function unreblogFail(status, error) {
   return {
@@ -117,7 +117,7 @@ export function unreblogFail(status, error) {
     error: error,
     skipLoading: true,
   };
-};
+}
 
 export function favourite(status) {
   return function (dispatch, getState) {
@@ -130,7 +130,7 @@ export function favourite(status) {
       dispatch(favouriteFail(status, error));
     });
   };
-};
+}
 
 export function unfavourite(status) {
   return (dispatch, getState) => {
@@ -143,7 +143,7 @@ export function unfavourite(status) {
       dispatch(unfavouriteFail(status, error));
     });
   };
-};
+}
 
 export function favouriteRequest(status) {
   return {
@@ -151,7 +151,7 @@ export function favouriteRequest(status) {
     status: status,
     skipLoading: true,
   };
-};
+}
 
 export function favouriteSuccess(status) {
   return {
@@ -159,7 +159,7 @@ export function favouriteSuccess(status) {
     status: status,
     skipLoading: true,
   };
-};
+}
 
 export function favouriteFail(status, error) {
   return {
@@ -168,7 +168,7 @@ export function favouriteFail(status, error) {
     error: error,
     skipLoading: true,
   };
-};
+}
 
 export function unfavouriteRequest(status) {
   return {
@@ -176,7 +176,7 @@ export function unfavouriteRequest(status) {
     status: status,
     skipLoading: true,
   };
-};
+}
 
 export function unfavouriteSuccess(status) {
   return {
@@ -184,7 +184,7 @@ export function unfavouriteSuccess(status) {
     status: status,
     skipLoading: true,
   };
-};
+}
 
 export function unfavouriteFail(status, error) {
   return {
@@ -193,7 +193,7 @@ export function unfavouriteFail(status, error) {
     error: error,
     skipLoading: true,
   };
-};
+}
 
 export function bookmark(status) {
   return function (dispatch, getState) {
@@ -206,7 +206,7 @@ export function bookmark(status) {
       dispatch(bookmarkFail(status, error));
     });
   };
-};
+}
 
 export function unbookmark(status) {
   return (dispatch, getState) => {
@@ -219,14 +219,14 @@ export function unbookmark(status) {
       dispatch(unbookmarkFail(status, error));
     });
   };
-};
+}
 
 export function bookmarkRequest(status) {
   return {
     type: BOOKMARK_REQUEST,
     status: status,
   };
-};
+}
 
 export function bookmarkSuccess(status, response) {
   return {
@@ -234,7 +234,7 @@ export function bookmarkSuccess(status, response) {
     status: status,
     response: response,
   };
-};
+}
 
 export function bookmarkFail(status, error) {
   return {
@@ -242,14 +242,14 @@ export function bookmarkFail(status, error) {
     status: status,
     error: error,
   };
-};
+}
 
 export function unbookmarkRequest(status) {
   return {
     type: UNBOOKMARK_REQUEST,
     status: status,
   };
-};
+}
 
 export function unbookmarkSuccess(status, response) {
   return {
@@ -257,7 +257,7 @@ export function unbookmarkSuccess(status, response) {
     status: status,
     response: response,
   };
-};
+}
 
 export function unbookmarkFail(status, error) {
   return {
@@ -265,7 +265,7 @@ export function unbookmarkFail(status, error) {
     status: status,
     error: error,
   };
-};
+}
 
 export function fetchReblogs(id) {
   return (dispatch, getState) => {
@@ -278,14 +278,14 @@ export function fetchReblogs(id) {
       dispatch(fetchReblogsFail(id, error));
     });
   };
-};
+}
 
 export function fetchReblogsRequest(id) {
   return {
     type: REBLOGS_FETCH_REQUEST,
     id,
   };
-};
+}
 
 export function fetchReblogsSuccess(id, accounts) {
   return {
@@ -293,14 +293,14 @@ export function fetchReblogsSuccess(id, accounts) {
     id,
     accounts,
   };
-};
+}
 
 export function fetchReblogsFail(id, error) {
   return {
     type: REBLOGS_FETCH_FAIL,
     error,
   };
-};
+}
 
 export function fetchFavourites(id) {
   return (dispatch, getState) => {
@@ -313,14 +313,14 @@ export function fetchFavourites(id) {
       dispatch(fetchFavouritesFail(id, error));
     });
   };
-};
+}
 
 export function fetchFavouritesRequest(id) {
   return {
     type: FAVOURITES_FETCH_REQUEST,
     id,
   };
-};
+}
 
 export function fetchFavouritesSuccess(id, accounts) {
   return {
@@ -328,14 +328,14 @@ export function fetchFavouritesSuccess(id, accounts) {
     id,
     accounts,
   };
-};
+}
 
 export function fetchFavouritesFail(id, error) {
   return {
     type: FAVOURITES_FETCH_FAIL,
     error,
   };
-};
+}
 
 export function pin(status) {
   return (dispatch, getState) => {
@@ -348,7 +348,7 @@ export function pin(status) {
       dispatch(pinFail(status, error));
     });
   };
-};
+}
 
 export function pinRequest(status) {
   return {
@@ -356,7 +356,7 @@ export function pinRequest(status) {
     status,
     skipLoading: true,
   };
-};
+}
 
 export function pinSuccess(status) {
   return {
@@ -364,7 +364,7 @@ export function pinSuccess(status) {
     status,
     skipLoading: true,
   };
-};
+}
 
 export function pinFail(status, error) {
   return {
@@ -373,7 +373,7 @@ export function pinFail(status, error) {
     error,
     skipLoading: true,
   };
-};
+}
 
 export function unpin (status) {
   return (dispatch, getState) => {
@@ -386,7 +386,7 @@ export function unpin (status) {
       dispatch(unpinFail(status, error));
     });
   };
-};
+}
 
 export function unpinRequest(status) {
   return {
@@ -394,7 +394,7 @@ export function unpinRequest(status) {
     status,
     skipLoading: true,
   };
-};
+}
 
 export function unpinSuccess(status) {
   return {
@@ -402,7 +402,7 @@ export function unpinSuccess(status) {
     status,
     skipLoading: true,
   };
-};
+}
 
 export function unpinFail(status, error) {
   return {
@@ -411,4 +411,4 @@ export function unpinFail(status, error) {
     error,
     skipLoading: true,
   };
-};
+}
diff --git a/app/javascript/mastodon/actions/markers.js b/app/javascript/mastodon/actions/markers.js
index b7f406cb8..16ec7fe77 100644
--- a/app/javascript/mastodon/actions/markers.js
+++ b/app/javascript/mastodon/actions/markers.js
@@ -101,7 +101,7 @@ export function submitMarkersSuccess({ home, notifications }) {
     home: (home || {}).last_read_id,
     notifications: (notifications || {}).last_read_id,
   };
-};
+}
 
 export function submitMarkers(params = {}) {
   const result = (dispatch, getState) => debouncedSubmitMarkers(dispatch, getState);
@@ -111,7 +111,7 @@ export function submitMarkers(params = {}) {
   }
 
   return result;
-};
+}
 
 export const fetchMarkers = () => (dispatch, getState) => {
   const params = { timeline: ['notifications'] };
@@ -130,7 +130,7 @@ export function fetchMarkersRequest() {
     type: MARKERS_FETCH_REQUEST,
     skipLoading: true,
   };
-};
+}
 
 export function fetchMarkersSuccess(markers) {
   return {
@@ -138,7 +138,7 @@ export function fetchMarkersSuccess(markers) {
     markers,
     skipLoading: true,
   };
-};
+}
 
 export function fetchMarkersFail(error) {
   return {
@@ -147,4 +147,4 @@ export function fetchMarkersFail(error) {
     skipLoading: true,
     skipAlert: true,
   };
-};
+}
diff --git a/app/javascript/mastodon/actions/modal.js b/app/javascript/mastodon/actions/modal.js
index 3e576fab8..ef2ae0e4c 100644
--- a/app/javascript/mastodon/actions/modal.js
+++ b/app/javascript/mastodon/actions/modal.js
@@ -7,7 +7,7 @@ export function openModal(type, props) {
     modalType: type,
     modalProps: props,
   };
-};
+}
 
 export function closeModal(type, options = { ignoreFocus: false }) {
   return {
@@ -15,4 +15,4 @@ export function closeModal(type, options = { ignoreFocus: false }) {
     modalType: type,
     ignoreFocus: options.ignoreFocus,
   };
-};
+}
diff --git a/app/javascript/mastodon/actions/mutes.js b/app/javascript/mastodon/actions/mutes.js
index d8874f353..cbc42a67e 100644
--- a/app/javascript/mastodon/actions/mutes.js
+++ b/app/javascript/mastodon/actions/mutes.js
@@ -26,13 +26,13 @@ export function fetchMutes() {
       dispatch(fetchRelationships(response.data.map(item => item.id)));
     }).catch(error => dispatch(fetchMutesFail(error)));
   };
-};
+}
 
 export function fetchMutesRequest() {
   return {
     type: MUTES_FETCH_REQUEST,
   };
-};
+}
 
 export function fetchMutesSuccess(accounts, next) {
   return {
@@ -40,14 +40,14 @@ export function fetchMutesSuccess(accounts, next) {
     accounts,
     next,
   };
-};
+}
 
 export function fetchMutesFail(error) {
   return {
     type: MUTES_FETCH_FAIL,
     error,
   };
-};
+}
 
 export function expandMutes() {
   return (dispatch, getState) => {
@@ -66,13 +66,13 @@ export function expandMutes() {
       dispatch(fetchRelationships(response.data.map(item => item.id)));
     }).catch(error => dispatch(expandMutesFail(error)));
   };
-};
+}
 
 export function expandMutesRequest() {
   return {
     type: MUTES_EXPAND_REQUEST,
   };
-};
+}
 
 export function expandMutesSuccess(accounts, next) {
   return {
@@ -80,14 +80,14 @@ export function expandMutesSuccess(accounts, next) {
     accounts,
     next,
   };
-};
+}
 
 export function expandMutesFail(error) {
   return {
     type: MUTES_EXPAND_FAIL,
     error,
   };
-};
+}
 
 export function initMuteModal(account) {
   return dispatch => {
diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js
index d4588db2c..93588d3c0 100644
--- a/app/javascript/mastodon/actions/notifications.js
+++ b/app/javascript/mastodon/actions/notifications.js
@@ -118,7 +118,7 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
       });
     }
   };
-};
+}
 
 const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS();
 
@@ -197,14 +197,14 @@ export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) {
       done();
     });
   };
-};
+}
 
 export function expandNotificationsRequest(isLoadingMore) {
   return {
     type: NOTIFICATIONS_EXPAND_REQUEST,
     skipLoading: !isLoadingMore,
   };
-};
+}
 
 export function expandNotificationsSuccess(notifications, next, isLoadingMore, isLoadingRecent, usePendingItems) {
   return {
@@ -215,7 +215,7 @@ export function expandNotificationsSuccess(notifications, next, isLoadingMore, i
     usePendingItems,
     skipLoading: !isLoadingMore,
   };
-};
+}
 
 export function expandNotificationsFail(error, isLoadingMore) {
   return {
@@ -224,7 +224,7 @@ export function expandNotificationsFail(error, isLoadingMore) {
     skipLoading: !isLoadingMore,
     skipAlert: !isLoadingMore || error.name === 'AbortError',
   };
-};
+}
 
 export function clearNotifications() {
   return (dispatch, getState) => {
@@ -234,14 +234,14 @@ export function clearNotifications() {
 
     api(getState).post('/api/v1/notifications/clear');
   };
-};
+}
 
 export function scrollTopNotifications(top) {
   return {
     type: NOTIFICATIONS_SCROLL_TOP,
     top,
   };
-};
+}
 
 export function setFilter (filterType) {
   return dispatch => {
@@ -253,7 +253,7 @@ export function setFilter (filterType) {
     dispatch(expandNotifications({ forceLoad: true }));
     dispatch(saveSettings());
   };
-};
+}
 
 export const mountNotifications = () => ({
   type: NOTIFICATIONS_MOUNT,
@@ -291,7 +291,7 @@ export function requestBrowserPermission(callback = noOp) {
       callback(permission);
     });
   };
-};
+}
 
 export function setBrowserSupport (value) {
   return {
diff --git a/app/javascript/mastodon/actions/pin_statuses.js b/app/javascript/mastodon/actions/pin_statuses.js
index 77abba7b5..e2de98ca9 100644
--- a/app/javascript/mastodon/actions/pin_statuses.js
+++ b/app/javascript/mastodon/actions/pin_statuses.js
@@ -18,13 +18,13 @@ export function fetchPinnedStatuses() {
       dispatch(fetchPinnedStatusesFail(error));
     });
   };
-};
+}
 
 export function fetchPinnedStatusesRequest() {
   return {
     type: PINNED_STATUSES_FETCH_REQUEST,
   };
-};
+}
 
 export function fetchPinnedStatusesSuccess(statuses, next) {
   return {
@@ -32,11 +32,11 @@ export function fetchPinnedStatusesSuccess(statuses, next) {
     statuses,
     next,
   };
-};
+}
 
 export function fetchPinnedStatusesFail(error) {
   return {
     type: PINNED_STATUSES_FETCH_FAIL,
     error,
   };
-};
+}
diff --git a/app/javascript/mastodon/actions/search.js b/app/javascript/mastodon/actions/search.js
index e333c0ea7..666c6c223 100644
--- a/app/javascript/mastodon/actions/search.js
+++ b/app/javascript/mastodon/actions/search.js
@@ -19,13 +19,13 @@ export function changeSearch(value) {
     type: SEARCH_CHANGE,
     value,
   };
-};
+}
 
 export function clearSearch() {
   return {
     type: SEARCH_CLEAR,
   };
-};
+}
 
 export function submitSearch() {
   return (dispatch, getState) => {
@@ -60,13 +60,13 @@ export function submitSearch() {
       dispatch(fetchSearchFail(error));
     });
   };
-};
+}
 
 export function fetchSearchRequest() {
   return {
     type: SEARCH_FETCH_REQUEST,
   };
-};
+}
 
 export function fetchSearchSuccess(results, searchTerm) {
   return {
@@ -74,14 +74,14 @@ export function fetchSearchSuccess(results, searchTerm) {
     results,
     searchTerm,
   };
-};
+}
 
 export function fetchSearchFail(error) {
   return {
     type: SEARCH_FETCH_FAIL,
     error,
   };
-};
+}
 
 export const expandSearch = type => (dispatch, getState) => {
   const value  = getState().getIn(['search', 'value']);
diff --git a/app/javascript/mastodon/actions/settings.js b/app/javascript/mastodon/actions/settings.js
index 6bf85e464..6ae001b6f 100644
--- a/app/javascript/mastodon/actions/settings.js
+++ b/app/javascript/mastodon/actions/settings.js
@@ -15,7 +15,7 @@ export function changeSetting(path, value) {
 
     dispatch(saveSettings());
   };
-};
+}
 
 const debouncedSave = debounce((dispatch, getState) => {
   if (getState().getIn(['settings', 'saved'])) {
@@ -31,4 +31,4 @@ const debouncedSave = debounce((dispatch, getState) => {
 
 export function saveSettings() {
   return (dispatch, getState) => debouncedSave(dispatch, getState);
-};
+}
diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js
index 4ae1b21e0..275280a53 100644
--- a/app/javascript/mastodon/actions/statuses.js
+++ b/app/javascript/mastodon/actions/statuses.js
@@ -45,7 +45,7 @@ export function fetchStatusRequest(id, skipLoading) {
     id,
     skipLoading,
   };
-};
+}
 
 export function fetchStatus(id, forceFetch = false) {
   return (dispatch, getState) => {
@@ -66,14 +66,14 @@ export function fetchStatus(id, forceFetch = false) {
       dispatch(fetchStatusFail(id, error, skipLoading));
     });
   };
-};
+}
 
 export function fetchStatusSuccess(skipLoading) {
   return {
     type: STATUS_FETCH_SUCCESS,
     skipLoading,
   };
-};
+}
 
 export function fetchStatusFail(id, error, skipLoading) {
   return {
@@ -83,7 +83,7 @@ export function fetchStatusFail(id, error, skipLoading) {
     skipLoading,
     skipAlert: true,
   };
-};
+}
 
 export function redraft(status, raw_text) {
   return {
@@ -91,7 +91,7 @@ export function redraft(status, raw_text) {
     status,
     raw_text,
   };
-};
+}
 
 export const editStatus = (id, routerHistory) => (dispatch, getState) => {
   let status = getState().getIn(['statuses', id]);
@@ -147,21 +147,21 @@ export function deleteStatus(id, routerHistory, withRedraft = false) {
       dispatch(deleteStatusFail(id, error));
     });
   };
-};
+}
 
 export function deleteStatusRequest(id) {
   return {
     type: STATUS_DELETE_REQUEST,
     id: id,
   };
-};
+}
 
 export function deleteStatusSuccess(id) {
   return {
     type: STATUS_DELETE_SUCCESS,
     id: id,
   };
-};
+}
 
 export function deleteStatusFail(id, error) {
   return {
@@ -169,7 +169,7 @@ export function deleteStatusFail(id, error) {
     id: id,
     error: error,
   };
-};
+}
 
 export const updateStatus = status => dispatch =>
   dispatch(importFetchedStatus(status));
@@ -190,14 +190,14 @@ export function fetchContext(id) {
       dispatch(fetchContextFail(id, error));
     });
   };
-};
+}
 
 export function fetchContextRequest(id) {
   return {
     type: CONTEXT_FETCH_REQUEST,
     id,
   };
-};
+}
 
 export function fetchContextSuccess(id, ancestors, descendants) {
   return {
@@ -207,7 +207,7 @@ export function fetchContextSuccess(id, ancestors, descendants) {
     descendants,
     statuses: ancestors.concat(descendants),
   };
-};
+}
 
 export function fetchContextFail(id, error) {
   return {
@@ -216,7 +216,7 @@ export function fetchContextFail(id, error) {
     error,
     skipAlert: true,
   };
-};
+}
 
 export function muteStatus(id) {
   return (dispatch, getState) => {
@@ -228,21 +228,21 @@ export function muteStatus(id) {
       dispatch(muteStatusFail(id, error));
     });
   };
-};
+}
 
 export function muteStatusRequest(id) {
   return {
     type: STATUS_MUTE_REQUEST,
     id,
   };
-};
+}
 
 export function muteStatusSuccess(id) {
   return {
     type: STATUS_MUTE_SUCCESS,
     id,
   };
-};
+}
 
 export function muteStatusFail(id, error) {
   return {
@@ -250,7 +250,7 @@ export function muteStatusFail(id, error) {
     id,
     error,
   };
-};
+}
 
 export function unmuteStatus(id) {
   return (dispatch, getState) => {
@@ -262,21 +262,21 @@ export function unmuteStatus(id) {
       dispatch(unmuteStatusFail(id, error));
     });
   };
-};
+}
 
 export function unmuteStatusRequest(id) {
   return {
     type: STATUS_UNMUTE_REQUEST,
     id,
   };
-};
+}
 
 export function unmuteStatusSuccess(id) {
   return {
     type: STATUS_UNMUTE_SUCCESS,
     id,
   };
-};
+}
 
 export function unmuteStatusFail(id, error) {
   return {
@@ -284,7 +284,7 @@ export function unmuteStatusFail(id, error) {
     id,
     error,
   };
-};
+}
 
 export function hideStatus(ids) {
   if (!Array.isArray(ids)) {
@@ -295,7 +295,7 @@ export function hideStatus(ids) {
     type: STATUS_HIDE,
     ids,
   };
-};
+}
 
 export function revealStatus(ids) {
   if (!Array.isArray(ids)) {
@@ -306,7 +306,7 @@ export function revealStatus(ids) {
     type: STATUS_REVEAL,
     ids,
   };
-};
+}
 
 export function toggleStatusCollapse(id, isCollapsed) {
   return {
@@ -314,7 +314,7 @@ export function toggleStatusCollapse(id, isCollapsed) {
     id,
     isCollapsed,
   };
-};
+}
 
 export const translateStatus = id => (dispatch, getState) => {
   dispatch(translateStatusRequest(id));
diff --git a/app/javascript/mastodon/actions/store.js b/app/javascript/mastodon/actions/store.js
index 34dcafc51..b3030467b 100644
--- a/app/javascript/mastodon/actions/store.js
+++ b/app/javascript/mastodon/actions/store.js
@@ -21,4 +21,4 @@ export function hydrateStore(rawState) {
     dispatch(hydrateCompose());
     dispatch(importFetchedAccounts(Object.values(rawState.accounts)));
   };
-};
+}
diff --git a/app/javascript/mastodon/actions/suggestions.js b/app/javascript/mastodon/actions/suggestions.js
index 1f1116e75..9e8cd1ea4 100644
--- a/app/javascript/mastodon/actions/suggestions.js
+++ b/app/javascript/mastodon/actions/suggestions.js
@@ -21,14 +21,14 @@ export function fetchSuggestions(withRelationships = false) {
       }
     }).catch(error => dispatch(fetchSuggestionsFail(error)));
   };
-};
+}
 
 export function fetchSuggestionsRequest() {
   return {
     type: SUGGESTIONS_FETCH_REQUEST,
     skipLoading: true,
   };
-};
+}
 
 export function fetchSuggestionsSuccess(suggestions) {
   return {
@@ -36,7 +36,7 @@ export function fetchSuggestionsSuccess(suggestions) {
     suggestions,
     skipLoading: true,
   };
-};
+}
 
 export function fetchSuggestionsFail(error) {
   return {
@@ -45,7 +45,7 @@ export function fetchSuggestionsFail(error) {
     skipLoading: true,
     skipAlert: true,
   };
-};
+}
 
 export const dismissSuggestion = accountId => (dispatch, getState) => {
   dispatch({
diff --git a/app/javascript/mastodon/actions/timelines.js b/app/javascript/mastodon/actions/timelines.js
index a3434908f..4f772a55f 100644
--- a/app/javascript/mastodon/actions/timelines.js
+++ b/app/javascript/mastodon/actions/timelines.js
@@ -51,7 +51,7 @@ export function updateTimeline(timeline, status, accept) {
       dispatch(submitMarkers());
     }
   };
-};
+}
 
 export function deleteFromTimelines(id) {
   return (dispatch, getState) => {
@@ -67,13 +67,13 @@ export function deleteFromTimelines(id) {
       reblogOf,
     });
   };
-};
+}
 
 export function clearTimeline(timeline) {
   return (dispatch) => {
     dispatch({ type: TIMELINE_CLEAR, timeline });
   };
-};
+}
 
 const noOp = () => {};
 
@@ -122,7 +122,7 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) {
       done();
     });
   };
-};
+}
 
 export function fillTimelineGaps(timelineId, path, params = {}, done = noOp) {
   return (dispatch, getState) => {
@@ -168,7 +168,7 @@ export function expandTimelineRequest(timeline, isLoadingMore) {
     timeline,
     skipLoading: !isLoadingMore,
   };
-};
+}
 
 export function expandTimelineSuccess(timeline, statuses, next, partial, isLoadingRecent, isLoadingMore, usePendingItems) {
   return {
@@ -181,7 +181,7 @@ export function expandTimelineSuccess(timeline, statuses, next, partial, isLoadi
     usePendingItems,
     skipLoading: !isLoadingMore,
   };
-};
+}
 
 export function expandTimelineFail(timeline, error, isLoadingMore) {
   return {
@@ -191,7 +191,7 @@ export function expandTimelineFail(timeline, error, isLoadingMore) {
     skipLoading: !isLoadingMore,
     skipNotFound: timeline.startsWith('account:'),
   };
-};
+}
 
 export function scrollTopTimeline(timeline, top) {
   return {
@@ -199,7 +199,7 @@ export function scrollTopTimeline(timeline, top) {
     timeline,
     top,
   };
-};
+}
 
 export function connectTimeline(timeline) {
   return {
@@ -207,7 +207,7 @@ export function connectTimeline(timeline) {
     timeline,
     usePendingItems: preferPendingItems,
   };
-};
+}
 
 export const disconnectTimeline = timeline => ({
   type: TIMELINE_DISCONNECT,
diff --git a/app/javascript/mastodon/common.js b/app/javascript/mastodon/common.js
index 6818aa5d5..8f3505303 100644
--- a/app/javascript/mastodon/common.js
+++ b/app/javascript/mastodon/common.js
@@ -9,4 +9,4 @@ export function start() {
   } catch (e) {
     // If called twice
   }
-};
+}
diff --git a/app/javascript/mastodon/compare_id.js b/app/javascript/mastodon/compare_id.js
index 66cf51c4b..d2bd74f44 100644
--- a/app/javascript/mastodon/compare_id.js
+++ b/app/javascript/mastodon/compare_id.js
@@ -8,4 +8,4 @@ export default function compareId (id1, id2) {
   } else {
     return id1.length > id2.length ? 1 : -1;
   }
-};
+}
diff --git a/app/javascript/mastodon/components/admin/Retention.js b/app/javascript/mastodon/components/admin/Retention.js
index 47c9e7151..f312a45eb 100644
--- a/app/javascript/mastodon/components/admin/Retention.js
+++ b/app/javascript/mastodon/components/admin/Retention.js
@@ -137,7 +137,7 @@ export default class Retention extends React.PureComponent {
       break;
     default:
       title = <FormattedMessage id='admin.dashboard.monthly_retention' defaultMessage='User retention rate by month after sign-up' />;
-    };
+    }
 
     return (
       <div className='retention'>
diff --git a/app/javascript/mastodon/components/dropdown_menu.js b/app/javascript/mastodon/components/dropdown_menu.js
index 4b4ad8355..5897aada8 100644
--- a/app/javascript/mastodon/components/dropdown_menu.js
+++ b/app/javascript/mastodon/components/dropdown_menu.js
@@ -2,9 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import IconButton from './icon_button';
-import Overlay from 'react-overlays/lib/Overlay';
-import Motion from '../features/ui/util/optional_motion';
-import spring from 'react-motion/lib/spring';
+import Overlay from 'react-overlays/Overlay';
 import { supportsPassiveEvents } from 'detect-passive-events';
 import classNames from 'classnames';
 import { CircularProgress } from 'mastodon/components/loading_indicator';
@@ -24,9 +22,6 @@ class DropdownMenu extends React.PureComponent {
     scrollable: PropTypes.bool,
     onClose: PropTypes.func.isRequired,
     style: PropTypes.object,
-    placement: PropTypes.string,
-    arrowOffsetLeft: PropTypes.string,
-    arrowOffsetTop: PropTypes.string,
     openedViaKeyboard: PropTypes.bool,
     renderItem: PropTypes.func,
     renderHeader: PropTypes.func,
@@ -35,11 +30,6 @@ class DropdownMenu extends React.PureComponent {
 
   static defaultProps = {
     style: {},
-    placement: 'bottom',
-  };
-
-  state = {
-    mounted: false,
   };
 
   handleDocumentClick = e => {
@@ -56,8 +46,6 @@ class DropdownMenu extends React.PureComponent {
     if (this.focusedItem && this.props.openedViaKeyboard) {
       this.focusedItem.focus({ preventScroll: true });
     }
-
-    this.setState({ mounted: true });
   }
 
   componentWillUnmount () {
@@ -139,40 +127,28 @@ class DropdownMenu extends React.PureComponent {
   }
 
   render () {
-    const { items, style, placement, arrowOffsetLeft, arrowOffsetTop, scrollable, renderHeader, loading } = this.props;
-    const { mounted } = this.state;
+    const { items, scrollable, renderHeader, loading } = this.props;
 
     let renderItem = this.props.renderItem || this.renderItem;
 
     return (
-      <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>
-        {({ opacity, scaleX, scaleY }) => (
-          // It should not be transformed when mounting because the resulting
-          // size will be used to determine the coordinate of the menu by
-          // react-overlays
-          <div className={`dropdown-menu ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null }} ref={this.setRef}>
-            <div className={`dropdown-menu__arrow ${placement}`} style={{ left: arrowOffsetLeft, top: arrowOffsetTop }} />
-
-            <div className={classNames('dropdown-menu__container', { 'dropdown-menu__container--loading': loading })}>
-              {loading && (
-                <CircularProgress size={30} strokeWidth={3.5} />
-              )}
-
-              {!loading && renderHeader && (
-                <div className='dropdown-menu__container__header'>
-                  {renderHeader(items)}
-                </div>
-              )}
-
-              {!loading && (
-                <ul className={classNames('dropdown-menu__container__list', { 'dropdown-menu__container__list--scrollable': scrollable })}>
-                  {items.map((option, i) => renderItem(option, i, { onClick: this.handleClick, onKeyPress: this.handleItemKeyPress }))}
-                </ul>
-              )}
-            </div>
+      <div className={classNames('dropdown-menu__container', { 'dropdown-menu__container--loading': loading })} ref={this.setRef}>
+        {loading && (
+          <CircularProgress size={30} strokeWidth={3.5} />
+        )}
+
+        {!loading && renderHeader && (
+          <div className='dropdown-menu__container__header'>
+            {renderHeader(items)}
           </div>
         )}
-      </Motion>
+
+        {!loading && (
+          <ul className={classNames('dropdown-menu__container__list', { 'dropdown-menu__container__list--scrollable': scrollable })}>
+            {items.map((option, i) => renderItem(option, i, { onClick: this.handleClick, onKeyPress: this.handleItemKeyPress }))}
+          </ul>
+        )}
+      </div>
     );
   }
 
@@ -197,7 +173,6 @@ export default class Dropdown extends React.PureComponent {
     isUserTouching: PropTypes.func,
     onOpen: PropTypes.func.isRequired,
     onClose: PropTypes.func.isRequired,
-    dropdownPlacement: PropTypes.string,
     openDropdownId: PropTypes.number,
     openedViaKeyboard: PropTypes.bool,
     renderItem: PropTypes.func,
@@ -213,13 +188,11 @@ export default class Dropdown extends React.PureComponent {
     id: id++,
   };
 
-  handleClick = ({ target, type }) => {
+  handleClick = ({ type }) => {
     if (this.state.id === this.props.openDropdownId) {
       this.handleClose();
     } else {
-      const { top } = target.getBoundingClientRect();
-      const placement = top * 2 < innerHeight ? 'bottom' : 'top';
-      this.props.onOpen(this.state.id, this.handleItemClick, placement, type !== 'click');
+      this.props.onOpen(this.state.id, this.handleItemClick, type !== 'click');
     }
   }
 
@@ -303,7 +276,6 @@ export default class Dropdown extends React.PureComponent {
       disabled,
       loading,
       scrollable,
-      dropdownPlacement,
       openDropdownId,
       openedViaKeyboard,
       children,
@@ -314,7 +286,6 @@ export default class Dropdown extends React.PureComponent {
     const open = this.state.id === openDropdownId;
 
     const button = children ? React.cloneElement(React.Children.only(children), {
-      ref: this.setTargetRef,
       onClick: this.handleClick,
       onMouseDown: this.handleMouseDown,
       onKeyDown: this.handleButtonKeyDown,
@@ -326,7 +297,6 @@ export default class Dropdown extends React.PureComponent {
         active={open}
         disabled={disabled}
         size={size}
-        ref={this.setTargetRef}
         onClick={this.handleClick}
         onMouseDown={this.handleMouseDown}
         onKeyDown={this.handleButtonKeyDown}
@@ -336,19 +306,27 @@ export default class Dropdown extends React.PureComponent {
 
     return (
       <React.Fragment>
-        {button}
-
-        <Overlay show={open} placement={dropdownPlacement} target={this.findTarget}>
-          <DropdownMenu
-            items={items}
-            loading={loading}
-            scrollable={scrollable}
-            onClose={this.handleClose}
-            openedViaKeyboard={openedViaKeyboard}
-            renderItem={renderItem}
-            renderHeader={renderHeader}
-            onItemClick={this.handleItemClick}
-          />
+        <span ref={this.setTargetRef}>
+          {button}
+        </span>
+        <Overlay show={open} offset={[5, 5]} placement={'bottom'} flip target={this.findTarget} popperConfig={{ strategy: 'fixed' }}>
+          {({ props, arrowProps, placement }) => (
+            <div {...props}>
+              <div className={`dropdown-animation dropdown-menu ${placement}`}>
+                <div className={`dropdown-menu__arrow ${placement}`} {...arrowProps} />
+                <DropdownMenu
+                  items={items}
+                  loading={loading}
+                  scrollable={scrollable}
+                  onClose={this.handleClose}
+                  openedViaKeyboard={openedViaKeyboard}
+                  renderItem={renderItem}
+                  renderHeader={renderHeader}
+                  onItemClick={this.handleItemClick}
+                />
+              </div>
+            </div>
+          )}
         </Overlay>
       </React.Fragment>
     );
diff --git a/app/javascript/mastodon/components/edited_timestamp/containers/dropdown_menu_container.js b/app/javascript/mastodon/components/edited_timestamp/containers/dropdown_menu_container.js
index e30c18372..16fe77a73 100644
--- a/app/javascript/mastodon/components/edited_timestamp/containers/dropdown_menu_container.js
+++ b/app/javascript/mastodon/components/edited_timestamp/containers/dropdown_menu_container.js
@@ -4,7 +4,6 @@ import { fetchHistory } from 'mastodon/actions/history';
 import DropdownMenu from 'mastodon/components/dropdown_menu';
 
 const mapStateToProps = (state, { statusId }) => ({
-  dropdownPlacement: state.getIn(['dropdown_menu', 'placement']),
   openDropdownId: state.getIn(['dropdown_menu', 'openId']),
   openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']),
   items: state.getIn(['history', statusId, 'items']),
@@ -13,9 +12,9 @@ const mapStateToProps = (state, { statusId }) => ({
 
 const mapDispatchToProps = (dispatch, { statusId }) => ({
 
-  onOpen (id, onItemClick, dropdownPlacement, keyboard) {
+  onOpen (id, onItemClick, keyboard) {
     dispatch(fetchHistory(statusId));
-    dispatch(openDropdownMenu(id, dropdownPlacement, keyboard));
+    dispatch(openDropdownMenu(id, keyboard));
   },
 
   onClose (id) {
diff --git a/app/javascript/mastodon/components/icon_button.js b/app/javascript/mastodon/components/icon_button.js
index 49858f2e2..b7daf82a4 100644
--- a/app/javascript/mastodon/components/icon_button.js
+++ b/app/javascript/mastodon/components/icon_button.js
@@ -27,6 +27,7 @@ export default class IconButton extends React.PureComponent {
     counter: PropTypes.number,
     obfuscateCount: PropTypes.bool,
     href: PropTypes.string,
+    ariaHidden: PropTypes.bool,
   };
 
   static defaultProps = {
@@ -36,6 +37,7 @@ export default class IconButton extends React.PureComponent {
     animate: false,
     overlay: false,
     tabIndex: '0',
+    ariaHidden: false,
   };
 
   state = {
@@ -102,6 +104,7 @@ export default class IconButton extends React.PureComponent {
       counter,
       obfuscateCount,
       href,
+      ariaHidden,
     } = this.props;
 
     const {
@@ -142,6 +145,7 @@ export default class IconButton extends React.PureComponent {
         type='button'
         aria-label={title}
         aria-expanded={expanded}
+        aria-hidden={ariaHidden}
         title={title}
         className={classes}
         onClick={this.handleClick}
diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/mastodon/components/media_gallery.js
index bf7982cea..e4a8be338 100644
--- a/app/javascript/mastodon/components/media_gallery.js
+++ b/app/javascript/mastodon/components/media_gallery.js
@@ -345,7 +345,7 @@ class MediaGallery extends React.PureComponent {
         </button>
       );
     } else if (visible) {
-      spoilerButton = <IconButton title={intl.formatMessage(messages.toggle_visible, { number: size })} icon='eye-slash' overlay onClick={this.handleOpen} />;
+      spoilerButton = <IconButton title={intl.formatMessage(messages.toggle_visible, { number: size })} icon='eye-slash' overlay onClick={this.handleOpen} ariaHidden />;
     } else {
       spoilerButton = (
         <button type='button' onClick={this.handleOpen} className='spoiler-button__overlay'>
diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js
index 2a1fedb93..00fc94358 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/mastodon/components/status_action_bar.js
@@ -8,7 +8,7 @@ import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { me } from '../initial_state';
 import classNames from 'classnames';
-import { PERMISSION_MANAGE_USERS } from 'mastodon/permissions';
+import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
 
 const messages = defineMessages({
   delete: { id: 'status.delete', defaultMessage: 'Delete' },
@@ -37,9 +37,10 @@ const messages = defineMessages({
   unpin: { id: 'status.unpin', defaultMessage: 'Unpin from profile' },
   embed: { id: 'status.embed', defaultMessage: 'Embed' },
   admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
-  admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
-  copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },
-  hide: { id: 'status.hide', defaultMessage: 'Hide toot' },
+  admin_status: { id: 'status.admin_status', defaultMessage: 'Open this post in the moderation interface' },
+  admin_domain: { id: 'status.admin_domain', defaultMessage: 'Open moderation interface for {domain}' },
+  copy: { id: 'status.copy', defaultMessage: 'Copy link to post' },
+  hide: { id: 'status.hide', defaultMessage: 'Hide post' },
   blockDomain: { id: 'account.block_domain', defaultMessage: 'Block domain {domain}' },
   unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unblock domain {domain}' },
   unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
@@ -232,7 +233,7 @@ class StatusActionBar extends ImmutablePureComponent {
 
   render () {
     const { status, relationship, intl, withDismiss, withCounters, scrollKey } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn, permissions } = this.context.identity;
 
     const anonymousAccess    = !signedIn;
     const publicStatus       = ['public', 'unlisted'].includes(status.get('visibility'));
@@ -246,12 +247,13 @@ class StatusActionBar extends ImmutablePureComponent {
 
     menu.push({ text: intl.formatMessage(messages.open), action: this.handleOpen });
 
-    if (publicStatus) {
-      if (isRemote) {
-        menu.push({ text: intl.formatMessage(messages.openOriginalPage), href: status.get('url') });
-      }
+    if (publicStatus && isRemote) {
+      menu.push({ text: intl.formatMessage(messages.openOriginalPage), href: status.get('url') });
+    }
 
-      menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
+    menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
+
+    if (publicStatus) {
       menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
     }
 
@@ -311,10 +313,16 @@ class StatusActionBar extends ImmutablePureComponent {
         }
       }
 
-      if ((this.context.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) {
+      if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS || (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION)) {
         menu.push(null);
-        menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });
-        menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses/${status.get('id')}` });
+        if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) {
+          menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });
+          menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses/${status.get('id')}` });
+        }
+        if (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION) {
+          const domain = account.get('acct').split('@')[1];
+          menu.push({ text: intl.formatMessage(messages.admin_domain, { domain: domain }), href: `/admin/instances/${domain}` });
+        }
       }
     }
 
diff --git a/app/javascript/mastodon/containers/dropdown_menu_container.js b/app/javascript/mastodon/containers/dropdown_menu_container.js
index c45bab40b..bedd1c63f 100644
--- a/app/javascript/mastodon/containers/dropdown_menu_container.js
+++ b/app/javascript/mastodon/containers/dropdown_menu_container.js
@@ -6,13 +6,12 @@ import DropdownMenu from '../components/dropdown_menu';
 import { isUserTouching } from '../is_mobile';
 
 const mapStateToProps = state => ({
-  dropdownPlacement: state.getIn(['dropdown_menu', 'placement']),
   openDropdownId: state.getIn(['dropdown_menu', 'openId']),
   openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']),
 });
 
 const mapDispatchToProps = (dispatch, { status, items, scrollKey }) => ({
-  onOpen(id, onItemClick, dropdownPlacement, keyboard) {
+  onOpen(id, onItemClick, keyboard) {
     if (status) {
       dispatch(fetchRelationships([status.getIn(['account', 'id'])]));
     }
@@ -21,7 +20,7 @@ const mapDispatchToProps = (dispatch, { status, items, scrollKey }) => ({
       status,
       actions: items,
       onClick: onItemClick,
-    }) : openDropdownMenu(id, dropdownPlacement, keyboard, scrollKey));
+    }) : openDropdownMenu(id, keyboard, scrollKey));
   },
 
   onClose(id) {
diff --git a/app/javascript/mastodon/containers/mastodon.js b/app/javascript/mastodon/containers/mastodon.js
index 724719f74..002b71e93 100644
--- a/app/javascript/mastodon/containers/mastodon.js
+++ b/app/javascript/mastodon/containers/mastodon.js
@@ -23,7 +23,9 @@ export const store = configureStore();
 const hydrateAction = hydrateStore(initialState);
 
 store.dispatch(hydrateAction);
-store.dispatch(fetchCustomEmojis());
+if (initialState.meta.me) {
+  store.dispatch(fetchCustomEmojis());
+}
 
 const createIdentityContext = state => ({
   signedIn: !!state.meta.me,
diff --git a/app/javascript/mastodon/extra_polyfills.js b/app/javascript/mastodon/extra_polyfills.js
index 395f1ed05..6e8004f07 100644
--- a/app/javascript/mastodon/extra_polyfills.js
+++ b/app/javascript/mastodon/extra_polyfills.js
@@ -1,6 +1,3 @@
 import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only';
 import 'intersection-observer';
 import 'requestidlecallback';
-import objectFitImages from 'object-fit-images';
-
-objectFitImages();
diff --git a/app/javascript/mastodon/features/account/components/follow_request_note.js b/app/javascript/mastodon/features/account/components/follow_request_note.js
new file mode 100644
index 000000000..300ae4266
--- /dev/null
+++ b/app/javascript/mastodon/features/account/components/follow_request_note.js
@@ -0,0 +1,37 @@
+import React from 'react';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { FormattedMessage } from 'react-intl';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import Icon from 'mastodon/components/icon';
+
+export default class FollowRequestNote extends ImmutablePureComponent {
+
+  static propTypes = {
+    account: ImmutablePropTypes.map.isRequired,
+  };
+
+  render () {
+    const { account, onAuthorize, onReject } = this.props;
+
+    return (
+      <div className='follow-request-banner'>
+        <div className='follow-request-banner__message'>
+          <FormattedMessage id='account.requested_follow' defaultMessage='{name} has requested to follow you' values={{ name: <bdi><strong dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }} /></bdi> }} />
+        </div>
+
+        <div className='follow-request-banner__action'>
+          <button type='button' className='button button-tertiary button--confirmation' onClick={onAuthorize}>
+            <Icon id='check' fixedWidth />
+            <FormattedMessage id='follow_request.authorize' defaultMessage='Authorize' />
+          </button>
+
+          <button type='button' className='button button-tertiary button--destructive' onClick={onReject}>
+            <Icon id='times' fixedWidth />
+            <FormattedMessage id='follow_request.reject' defaultMessage='Reject' />
+          </button>
+        </div>
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js
index 5eb89c0ea..2481e4783 100644
--- a/app/javascript/mastodon/features/account/components/header.js
+++ b/app/javascript/mastodon/features/account/components/header.js
@@ -14,7 +14,8 @@ import ShortNumber from 'mastodon/components/short_number';
 import { NavLink } from 'react-router-dom';
 import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container';
 import AccountNoteContainer from '../containers/account_note_container';
-import { PERMISSION_MANAGE_USERS } from 'mastodon/permissions';
+import FollowRequestNoteContainer from '../containers/follow_request_note_container';
+import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
 import { Helmet } from 'react-helmet';
 
 const messages = defineMessages({
@@ -52,6 +53,7 @@ const messages = defineMessages({
   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}' },
+  admin_domain: { id: 'status.admin_domain', defaultMessage: 'Open moderation interface for {domain}' },
   languages: { id: 'account.languages', defaultMessage: 'Change subscribed languages' },
   openOriginalPage: { id: 'account.open_original_page', defaultMessage: 'Open original page' },
 });
@@ -162,7 +164,7 @@ class Header extends ImmutablePureComponent {
 
   render () {
     const { account, hidden, intl, domain } = this.props;
-    const { signedIn } = this.context.identity;
+    const { signedIn, permissions } = this.context.identity;
 
     if (!account) {
       return null;
@@ -287,9 +289,14 @@ class Header extends ImmutablePureComponent {
       }
     }
 
-    if (account.get('id') !== me && (this.context.identity.permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) {
+    if ((account.get('id') !== me && (permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) || (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION)) {
       menu.push(null);
-      menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: `/admin/accounts/${account.get('id')}` });
+      if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) {
+        menu.push({ text: intl.formatMessage(messages.admin_account, { name: account.get('username') }), href: `/admin/accounts/${account.get('id')}` });
+      }
+        if (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION) {
+          menu.push({ text: intl.formatMessage(messages.admin_domain, { domain: remoteDomain }), href: `/admin/instances/${remoteDomain}` });
+        }
     }
 
     const content         = { __html: account.get('note_emojified') };
@@ -311,6 +318,8 @@ class Header extends ImmutablePureComponent {
 
     return (
       <div className={classNames('account__header', { inactive: !!account.get('moved') })} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
+        {!(suspended || hidden || account.get('moved')) && account.getIn(['relationship', 'requested_by']) && <FollowRequestNoteContainer account={account} />}
+
         <div className='account__header__image'>
           <div className='account__header__info'>
             {!suspended && info}
@@ -342,7 +351,9 @@ class Header extends ImmutablePureComponent {
           <div className='account__header__tabs__name'>
             <h1>
               <span dangerouslySetInnerHTML={displayNameHtml} /> {badge}
-              <small>@{acct} {lockedIcon}</small>
+              <small>
+                <span>@{acct}</span> {lockedIcon}
+              </small>
             </h1>
           </div>
 
diff --git a/app/javascript/mastodon/features/account/containers/follow_request_note_container.js b/app/javascript/mastodon/features/account/containers/follow_request_note_container.js
new file mode 100644
index 000000000..c33c3de59
--- /dev/null
+++ b/app/javascript/mastodon/features/account/containers/follow_request_note_container.js
@@ -0,0 +1,15 @@
+import { connect } from 'react-redux';
+import FollowRequestNote from '../components/follow_request_note';
+import { authorizeFollowRequest, rejectFollowRequest } from 'mastodon/actions/accounts';
+
+const mapDispatchToProps = (dispatch, { account }) => ({
+  onAuthorize () {
+    dispatch(authorizeFollowRequest(account.get('id')));
+  },
+
+  onReject () {
+    dispatch(rejectFollowRequest(account.get('id')));
+  },
+});
+
+export default connect(null, mapDispatchToProps)(FollowRequestNote);
diff --git a/app/javascript/mastodon/features/account_gallery/components/media_item.js b/app/javascript/mastodon/features/account_gallery/components/media_item.js
index f16fe07f1..13fd7fe03 100644
--- a/app/javascript/mastodon/features/account_gallery/components/media_item.js
+++ b/app/javascript/mastodon/features/account_gallery/components/media_item.js
@@ -104,6 +104,7 @@ export default class MediaItem extends ImmutablePureComponent {
           <video
             className='media-gallery__item-gifv-thumbnail'
             aria-label={attachment.get('description')}
+            title={attachment.get('description')}
             role='application'
             src={attachment.get('url')}
             onMouseEnter={this.handleMouseEnter}
diff --git a/app/javascript/mastodon/features/closed_registrations_modal/index.js b/app/javascript/mastodon/features/closed_registrations_modal/index.js
index 275bd50aa..e6540e825 100644
--- a/app/javascript/mastodon/features/closed_registrations_modal/index.js
+++ b/app/javascript/mastodon/features/closed_registrations_modal/index.js
@@ -72,4 +72,4 @@ class ClosedRegistrationsModal extends ImmutablePureComponent {
     );
   }
 
-};
+}
diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js
index 55ffecb49..ebdd55d33 100644
--- a/app/javascript/mastodon/features/compose/components/compose_form.js
+++ b/app/javascript/mastodon/features/compose/components/compose_form.js
@@ -16,7 +16,6 @@ import PollFormContainer from '../containers/poll_form_container';
 import UploadFormContainer from '../containers/upload_form_container';
 import WarningContainer from '../containers/warning_container';
 import LanguageDropdown from '../containers/language_dropdown_container';
-import { isMobile } from '../../../is_mobile';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { length } from 'stringz';
 import { countableText } from '../util/counter';
@@ -62,14 +61,14 @@ class ComposeForm extends ImmutablePureComponent {
     onChangeSpoilerText: PropTypes.func.isRequired,
     onPaste: PropTypes.func.isRequired,
     onPickEmoji: PropTypes.func.isRequired,
-    showSearch: PropTypes.bool,
+    autoFocus: PropTypes.bool,
     anyMedia: PropTypes.bool,
     isInReply: PropTypes.bool,
     singleColumn: PropTypes.bool,
   };
 
   static defaultProps = {
-    showSearch: false,
+    autoFocus: false,
   };
 
   handleChange = (e) => {
@@ -155,7 +154,7 @@ class ComposeForm extends ImmutablePureComponent {
     //     - Replying to zero or one users, places the cursor at the end of the textbox.
     //     - Replying to more than one user, selects any usernames past the first;
     //       this provides a convenient shortcut to drop everyone else from the conversation.
-    if (this.props.focusDate !== prevProps.focusDate) {
+    if (this.props.focusDate && this.props.focusDate !== prevProps.focusDate) {
       let selectionEnd, selectionStart;
 
       if (this.props.preselectDate !== prevProps.preselectDate && this.props.isInReply) {
@@ -181,7 +180,7 @@ class ComposeForm extends ImmutablePureComponent {
     } else if (this.props.spoiler !== prevProps.spoiler) {
       if (this.props.spoiler) {
         this.spoilerText.input.focus();
-      } else {
+      } else if (prevProps.spoiler) {
         this.autosuggestTextarea.textarea.focus();
       }
     }
@@ -208,7 +207,7 @@ class ComposeForm extends ImmutablePureComponent {
   }
 
   render () {
-    const { intl, onPaste, showSearch } = this.props;
+    const { intl, onPaste, autoFocus } = this.props;
     const disabled = this.props.isSubmitting;
 
     let publishText = '';
@@ -227,7 +226,7 @@ class ComposeForm extends ImmutablePureComponent {
 
         <ReplyIndicatorContainer />
 
-        <div className={`spoiler-input ${this.props.spoiler ? 'spoiler-input--visible' : ''}`} ref={this.setRef}>
+        <div className={`spoiler-input ${this.props.spoiler ? 'spoiler-input--visible' : ''}`} ref={this.setRef} aria-hidden={!this.props.spoiler}>
           <AutosuggestInput
             placeholder={intl.formatMessage(messages.spoiler_placeholder)}
             value={this.props.spoilerText}
@@ -258,7 +257,7 @@ class ComposeForm extends ImmutablePureComponent {
           onSuggestionsClearRequested={this.onSuggestionsClearRequested}
           onSuggestionSelected={this.onSuggestionSelected}
           onPaste={onPaste}
-          autoFocus={!showSearch && !isMobile(window.innerWidth)}
+          autoFocus={autoFocus}
         >
           <EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} />
 
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 8cca8af2a..76c9cda81 100644
--- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
@@ -2,7 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import { EmojiPicker as EmojiPickerAsync } from '../../ui/util/async-components';
-import Overlay from 'react-overlays/lib/Overlay';
+import Overlay from 'react-overlays/Overlay';
 import classNames from 'classnames';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import { supportsPassiveEvents } from 'detect-passive-events';
@@ -154,9 +154,6 @@ class EmojiPickerMenu extends React.PureComponent {
     onClose: PropTypes.func.isRequired,
     onPick: PropTypes.func.isRequired,
     style: PropTypes.object,
-    placement: PropTypes.string,
-    arrowOffsetLeft: PropTypes.string,
-    arrowOffsetTop: PropTypes.string,
     intl: PropTypes.object.isRequired,
     skinTone: PropTypes.number.isRequired,
     onSkinTone: PropTypes.func.isRequired,
@@ -324,14 +321,13 @@ class EmojiPickerDropdown extends React.PureComponent {
   state = {
     active: false,
     loading: false,
-    placement: null,
   };
 
   setRef = (c) => {
     this.dropdown = c;
   }
 
-  onShowDropdown = ({ target }) => {
+  onShowDropdown = () => {
     this.setState({ active: true });
 
     if (!EmojiPicker) {
@@ -346,9 +342,6 @@ class EmojiPickerDropdown extends React.PureComponent {
         this.setState({ loading: false, active: false });
       });
     }
-
-    const { top } = target.getBoundingClientRect();
-    this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });
   }
 
   onHideDropdown = () => {
@@ -382,7 +375,7 @@ class EmojiPickerDropdown extends React.PureComponent {
   render () {
     const { intl, onPickEmoji, onSkinTone, skinTone, frequentlyUsedEmojis, button } = this.props;
     const title = intl.formatMessage(messages.emoji);
-    const { active, loading, placement } = this.state;
+    const { active, loading } = this.state;
 
     return (
       <div className='emoji-picker-dropdown' onKeyDown={this.handleKeyDown}>
@@ -394,16 +387,22 @@ class EmojiPickerDropdown extends React.PureComponent {
           />}
         </div>
 
-        <Overlay show={active} placement={placement} target={this.findTarget}>
-          <EmojiPickerMenu
-            custom_emojis={this.props.custom_emojis}
-            loading={loading}
-            onClose={this.onHideDropdown}
-            onPick={onPickEmoji}
-            onSkinTone={onSkinTone}
-            skinTone={skinTone}
-            frequentlyUsedEmojis={frequentlyUsedEmojis}
-          />
+        <Overlay show={active} placement={'bottom'} target={this.findTarget} popperConfig={{ strategy: 'fixed' }}>
+          {({ props, placement })=> (
+            <div {...props} style={{ ...props.style, width: 299 }}>
+              <div className={`dropdown-animation ${placement}`}>
+                <EmojiPickerMenu
+                  custom_emojis={this.props.custom_emojis}
+                  loading={loading}
+                  onClose={this.onHideDropdown}
+                  onPick={onPickEmoji}
+                  onSkinTone={onSkinTone}
+                  skinTone={skinTone}
+                  frequentlyUsedEmojis={frequentlyUsedEmojis}
+                />
+              </div>
+            </div>
+          )}
         </Overlay>
       </div>
     );
diff --git a/app/javascript/mastodon/features/compose/components/language_dropdown.js b/app/javascript/mastodon/features/compose/components/language_dropdown.js
index bf56fd0fa..2dd406b4b 100644
--- a/app/javascript/mastodon/features/compose/components/language_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/language_dropdown.js
@@ -2,9 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { injectIntl, defineMessages } from 'react-intl';
 import TextIconButton from './text_icon_button';
-import Overlay from 'react-overlays/lib/Overlay';
-import Motion from 'mastodon/features/ui/util/optional_motion';
-import spring from 'react-motion/lib/spring';
+import Overlay from 'react-overlays/Overlay';
 import { supportsPassiveEvents } from 'detect-passive-events';
 import classNames from 'classnames';
 import { languages as preloadedLanguages } from 'mastodon/initial_state';
@@ -22,10 +20,8 @@ const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
 class LanguageDropdownMenu extends React.PureComponent {
 
   static propTypes = {
-    style: PropTypes.object,
     value: PropTypes.string.isRequired,
     frequentlyUsedLanguages: PropTypes.arrayOf(PropTypes.string).isRequired,
-    placement: PropTypes.string.isRequired,
     onClose: PropTypes.func.isRequired,
     onChange: PropTypes.func.isRequired,
     languages: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)),
@@ -37,7 +33,6 @@ class LanguageDropdownMenu extends React.PureComponent {
   };
 
   state = {
-    mounted: false,
     searchValue: '',
   };
 
@@ -50,7 +45,6 @@ class LanguageDropdownMenu extends React.PureComponent {
   componentDidMount () {
     document.addEventListener('click', this.handleDocumentClick, false);
     document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
-    this.setState({ mounted: true });
 
     // Because of https://github.com/react-bootstrap/react-bootstrap/issues/2614 we need
     // to wait for a frame before focusing
@@ -222,29 +216,22 @@ class LanguageDropdownMenu extends React.PureComponent {
   }
 
   render () {
-    const { style, placement, intl } = this.props;
-    const { mounted, searchValue } = this.state;
+    const { intl } = this.props;
+    const { searchValue } = this.state;
     const isSearching = searchValue !== '';
     const results = this.search();
 
     return (
-      <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>
-        {({ opacity, scaleX, scaleY }) => (
-          // It should not be transformed when mounting because the resulting
-          // size will be used to determine the coordinate of the menu by
-          // react-overlays
-          <div className={`language-dropdown__dropdown ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null }} ref={this.setRef}>
-            <div className='emoji-mart-search'>
-              <input type='search' value={searchValue} onChange={this.handleSearchChange} onKeyDown={this.handleSearchKeyDown} placeholder={intl.formatMessage(messages.search)} />
-              <button type='button' className='emoji-mart-search-icon' disabled={!isSearching} aria-label={intl.formatMessage(messages.clear)} onClick={this.handleClear}>{!isSearching ? loupeIcon : deleteIcon}</button>
-            </div>
+      <div ref={this.setRef}>
+        <div className='emoji-mart-search'>
+          <input type='search' value={searchValue} onChange={this.handleSearchChange} onKeyDown={this.handleSearchKeyDown} placeholder={intl.formatMessage(messages.search)} />
+          <button type='button' className='emoji-mart-search-icon' disabled={!isSearching} aria-label={intl.formatMessage(messages.clear)} onClick={this.handleClear}>{!isSearching ? loupeIcon : deleteIcon}</button>
+        </div>
 
-            <div className='language-dropdown__dropdown__results emoji-mart-scroll' role='listbox' ref={this.setListRef}>
-              {results.map(this.renderItem)}
-            </div>
-          </div>
-        )}
-      </Motion>
+        <div className='language-dropdown__dropdown__results emoji-mart-scroll' role='listbox' ref={this.setListRef}>
+          {results.map(this.renderItem)}
+        </div>
+      </div>
     );
   }
 
@@ -266,14 +253,11 @@ class LanguageDropdown extends React.PureComponent {
     placement: 'bottom',
   };
 
-  handleToggle = ({ target }) => {
-    const { top } = target.getBoundingClientRect();
-
+  handleToggle = () => {
     if (this.state.open && this.activeElement) {
       this.activeElement.focus({ preventScroll: true });
     }
 
-    this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });
     this.setState({ open: !this.state.open });
   }
 
@@ -293,13 +277,25 @@ class LanguageDropdown extends React.PureComponent {
     onChange(value);
   }
 
+  setTargetRef = c => {
+    this.target = c;
+  }
+
+  findTarget = () => {
+    return this.target;
+  }
+
+  handleOverlayEnter = (state) => {
+    this.setState({ placement: state.placement });
+  }
+
   render () {
     const { value, intl, frequentlyUsedLanguages } = this.props;
     const { open, placement } = this.state;
 
     return (
-      <div className={classNames('privacy-dropdown', { active: open })}>
-        <div className='privacy-dropdown__value'>
+      <div className={classNames('privacy-dropdown', placement, { active: open })}>
+        <div className='privacy-dropdown__value' ref={this.setTargetRef} >
           <TextIconButton
             className='privacy-dropdown__value-icon'
             label={value && value.toUpperCase()}
@@ -309,15 +305,20 @@ class LanguageDropdown extends React.PureComponent {
           />
         </div>
 
-        <Overlay show={open} placement={placement} target={this}>
-          <LanguageDropdownMenu
-            value={value}
-            frequentlyUsedLanguages={frequentlyUsedLanguages}
-            onClose={this.handleClose}
-            onChange={this.handleChange}
-            placement={placement}
-            intl={intl}
-          />
+        <Overlay show={open} placement={'bottom'} flip target={this.findTarget} popperConfig={{ strategy: 'fixed', onFirstUpdate: this.handleOverlayEnter }}>
+          {({ props, placement }) => (
+            <div {...props}>
+              <div className={`dropdown-animation language-dropdown__dropdown ${placement}`} >
+                <LanguageDropdownMenu
+                  value={value}
+                  frequentlyUsedLanguages={frequentlyUsedLanguages}
+                  onClose={this.handleClose}
+                  onChange={this.handleChange}
+                  intl={intl}
+                />
+              </div>
+            </div>
+          )}
         </Overlay>
       </div>
     );
diff --git a/app/javascript/mastodon/features/compose/components/poll_form.js b/app/javascript/mastodon/features/compose/components/poll_form.js
index 47ba2fdc3..3aa527161 100644
--- a/app/javascript/mastodon/features/compose/components/poll_form.js
+++ b/app/javascript/mastodon/features/compose/components/poll_form.js
@@ -165,6 +165,7 @@ class PollForm extends ImmutablePureComponent {
             <option value={1800}>{intl.formatMessage(messages.minutes, { number: 30 })}</option>
             <option value={3600}>{intl.formatMessage(messages.hours, { number: 1 })}</option>
             <option value={21600}>{intl.formatMessage(messages.hours, { number: 6 })}</option>
+            <option value={43200}>{intl.formatMessage(messages.hours, { number: 12 })}</option>
             <option value={86400}>{intl.formatMessage(messages.days, { number: 1 })}</option>
             <option value={259200}>{intl.formatMessage(messages.days, { number: 3 })}</option>
             <option value={604800}>{intl.formatMessage(messages.days, { number: 7 })}</option>
diff --git a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
index 1f0e998d3..545b67eda 100644
--- a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
@@ -2,9 +2,7 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { injectIntl, defineMessages } from 'react-intl';
 import IconButton from '../../../components/icon_button';
-import Overlay from 'react-overlays/lib/Overlay';
-import Motion from '../../ui/util/optional_motion';
-import spring from 'react-motion/lib/spring';
+import Overlay from 'react-overlays/Overlay';
 import { supportsPassiveEvents } from 'detect-passive-events';
 import classNames from 'classnames';
 import Icon from 'mastodon/components/icon';
@@ -29,15 +27,10 @@ class PrivacyDropdownMenu extends React.PureComponent {
     style: PropTypes.object,
     items: PropTypes.array.isRequired,
     value: PropTypes.string.isRequired,
-    placement: PropTypes.string.isRequired,
     onClose: PropTypes.func.isRequired,
     onChange: PropTypes.func.isRequired,
   };
 
-  state = {
-    mounted: false,
-  };
-
   handleDocumentClick = e => {
     if (this.node && !this.node.contains(e.target)) {
       this.props.onClose();
@@ -101,7 +94,6 @@ class PrivacyDropdownMenu extends React.PureComponent {
     document.addEventListener('click', this.handleDocumentClick, false);
     document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
     if (this.focusedItem) this.focusedItem.focus({ preventScroll: true });
-    this.setState({ mounted: true });
   }
 
   componentWillUnmount () {
@@ -118,31 +110,23 @@ class PrivacyDropdownMenu extends React.PureComponent {
   }
 
   render () {
-    const { mounted } = this.state;
-    const { style, items, placement, value } = this.props;
+    const { style, items, value } = this.props;
 
     return (
-      <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>
-        {({ opacity, scaleX, scaleY }) => (
-          // It should not be transformed when mounting because the resulting
-          // size will be used to determine the coordinate of the menu by
-          // react-overlays
-          <div className={`privacy-dropdown__dropdown ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null }} role='listbox' ref={this.setRef}>
-            {items.map(item => (
-              <div role='option' tabIndex='0' key={item.value} data-index={item.value} onKeyDown={this.handleKeyDown} onClick={this.handleClick} className={classNames('privacy-dropdown__option', { active: item.value === value })} aria-selected={item.value === value} ref={item.value === value ? this.setFocusRef : null}>
-                <div className='privacy-dropdown__option__icon'>
-                  <Icon id={item.icon} fixedWidth />
-                </div>
-
-                <div className='privacy-dropdown__option__content'>
-                  <strong>{item.text}</strong>
-                  {item.meta}
-                </div>
-              </div>
-            ))}
+      <div style={{ ...style }} role='listbox' ref={this.setRef}>
+        {items.map(item => (
+          <div role='option' tabIndex='0' key={item.value} data-index={item.value} onKeyDown={this.handleKeyDown} onClick={this.handleClick} className={classNames('privacy-dropdown__option', { active: item.value === value })} aria-selected={item.value === value} ref={item.value === value ? this.setFocusRef : null}>
+            <div className='privacy-dropdown__option__icon'>
+              <Icon id={item.icon} fixedWidth />
+            </div>
+
+            <div className='privacy-dropdown__option__content'>
+              <strong>{item.text}</strong>
+              {item.meta}
+            </div>
           </div>
-        )}
-      </Motion>
+        ))}
+      </div>
     );
   }
 
@@ -168,7 +152,7 @@ class PrivacyDropdown extends React.PureComponent {
     placement: 'bottom',
   };
 
-  handleToggle = ({ target }) => {
+  handleToggle = () => {
     if (this.props.isUserTouching && this.props.isUserTouching()) {
       if (this.state.open) {
         this.props.onModalClose();
@@ -179,11 +163,9 @@ class PrivacyDropdown extends React.PureComponent {
         });
       }
     } else {
-      const { top } = target.getBoundingClientRect();
       if (this.state.open && this.activeElement) {
         this.activeElement.focus({ preventScroll: true });
       }
-      this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });
       this.setState({ open: !this.state.open });
     }
   }
@@ -247,6 +229,18 @@ class PrivacyDropdown extends React.PureComponent {
     }
   }
 
+  setTargetRef = c => {
+    this.target = c;
+  }
+
+  findTarget = () => {
+    return this.target;
+  }
+
+  handleOverlayEnter = (state) => {
+    this.setState({ placement: state.placement });
+  }
+
   render () {
     const { value, container, disabled, intl } = this.props;
     const { open, placement } = this.state;
@@ -255,7 +249,7 @@ class PrivacyDropdown extends React.PureComponent {
 
     return (
       <div className={classNames('privacy-dropdown', placement, { active: open })} onKeyDown={this.handleKeyDown}>
-        <div className={classNames('privacy-dropdown__value', { active: this.options.indexOf(valueOption) === (placement === 'bottom' ? 0 : (this.options.length - 1)) })}>
+        <div className={classNames('privacy-dropdown__value', { active: this.options.indexOf(valueOption) === (placement === 'bottom' ? 0 : (this.options.length - 1)) })} ref={this.setTargetRef}>
           <IconButton
             className='privacy-dropdown__value-icon'
             icon={valueOption.icon}
@@ -272,14 +266,19 @@ class PrivacyDropdown extends React.PureComponent {
           />
         </div>
 
-        <Overlay show={open} placement={placement} target={this} container={container}>
-          <PrivacyDropdownMenu
-            items={this.options}
-            value={value}
-            onClose={this.handleClose}
-            onChange={this.handleChange}
-            placement={placement}
-          />
+        <Overlay show={open} placement={'bottom'} flip target={this.findTarget} container={container} popperConfig={{ strategy: 'fixed', onFirstUpdate: this.handleOverlayEnter }}>
+          {({ props, placement }) => (
+            <div {...props}>
+              <div className={`dropdown-animation privacy-dropdown__dropdown ${placement}`}>
+                <PrivacyDropdownMenu
+                  items={this.options}
+                  value={value}
+                  onClose={this.handleClose}
+                  onChange={this.handleChange}
+                />
+              </div>
+            </div>
+          )}
         </Overlay>
       </div>
     );
diff --git a/app/javascript/mastodon/features/compose/components/search.js b/app/javascript/mastodon/features/compose/components/search.js
index ebb23d92f..5820f8ca2 100644
--- a/app/javascript/mastodon/features/compose/components/search.js
+++ b/app/javascript/mastodon/features/compose/components/search.js
@@ -1,9 +1,7 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
-import Overlay from 'react-overlays/lib/Overlay';
-import Motion from '../../ui/util/optional_motion';
-import spring from 'react-motion/lib/spring';
+import Overlay from 'react-overlays/Overlay';
 import { searchEnabled } from '../../../initial_state';
 import Icon from 'mastodon/components/icon';
 
@@ -14,31 +12,20 @@ const messages = defineMessages({
 
 class SearchPopout extends React.PureComponent {
 
-  static propTypes = {
-    style: PropTypes.object,
-  };
-
   render () {
-    const { style } = this.props;
     const extraInformation = searchEnabled ? <FormattedMessage id='search_popout.tips.full_text' defaultMessage='Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.' /> : <FormattedMessage id='search_popout.tips.text' defaultMessage='Simple text returns matching display names, usernames and hashtags' />;
     return (
-      <div style={{ ...style, position: 'absolute', width: 285, zIndex: 2 }}>
-        <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>
-          {({ opacity, scaleX, scaleY }) => (
-            <div className='search-popout' style={{ opacity: opacity, transform: `scale(${scaleX}, ${scaleY})` }}>
-              <h4><FormattedMessage id='search_popout.search_format' defaultMessage='Advanced search format' /></h4>
-
-              <ul>
-                <li><em>#example</em> <FormattedMessage id='search_popout.tips.hashtag' defaultMessage='hashtag' /></li>
-                <li><em>@username@domain</em> <FormattedMessage id='search_popout.tips.user' defaultMessage='user' /></li>
-                <li><em>URL</em> <FormattedMessage id='search_popout.tips.user' defaultMessage='user' /></li>
-                <li><em>URL</em> <FormattedMessage id='search_popout.tips.status' defaultMessage='status' /></li>
-              </ul>
-
-              {extraInformation}
-            </div>
-          )}
-        </Motion>
+      <div className='search-popout'>
+        <h4><FormattedMessage id='search_popout.search_format' defaultMessage='Advanced search format' /></h4>
+
+        <ul>
+          <li><em>#example</em> <FormattedMessage id='search_popout.tips.hashtag' defaultMessage='hashtag' /></li>
+          <li><em>@username@domain</em> <FormattedMessage id='search_popout.tips.user' defaultMessage='user' /></li>
+          <li><em>URL</em> <FormattedMessage id='search_popout.tips.user' defaultMessage='user' /></li>
+          <li><em>URL</em> <FormattedMessage id='search_popout.tips.status' defaultMessage='status' /></li>
+        </ul>
+
+        {extraInformation}
       </div>
     );
   }
@@ -115,6 +102,10 @@ class Search extends React.PureComponent {
     this.setState({ expanded: false });
   }
 
+  findTarget = () => {
+    return this.searchForm;
+  }
+
   render () {
     const { intl, value, submitted } = this.props;
     const { expanded } = this.state;
@@ -123,28 +114,31 @@ class Search extends React.PureComponent {
 
     return (
       <div className='search'>
-        <label>
-          <span style={{ display: 'none' }}>{intl.formatMessage(messages.placeholder)}</span>
-          <input
-            ref={this.setRef}
-            className='search__input'
-            type='text'
-            placeholder={intl.formatMessage(signedIn ? messages.placeholderSignedIn : messages.placeholder)}
-            value={value}
-            onChange={this.handleChange}
-            onKeyUp={this.handleKeyUp}
-            onFocus={this.handleFocus}
-            onBlur={this.handleBlur}
-          />
-        </label>
+        <input
+          ref={this.setRef}
+          className='search__input'
+          type='text'
+          placeholder={intl.formatMessage(signedIn ? messages.placeholderSignedIn : messages.placeholder)}
+          aria-label={intl.formatMessage(signedIn ? messages.placeholderSignedIn : messages.placeholder)}
+          value={value}
+          onChange={this.handleChange}
+          onKeyUp={this.handleKeyUp}
+          onFocus={this.handleFocus}
+          onBlur={this.handleBlur}
+        />
 
         <div role='button' tabIndex='0' className='search__icon' onClick={this.handleClear}>
           <Icon id='search' className={hasValue ? '' : 'active'} />
           <Icon id='times-circle' className={hasValue ? 'active' : ''} aria-label={intl.formatMessage(messages.placeholder)} />
         </div>
-
-        <Overlay show={expanded && !hasValue} placement='bottom' target={this}>
-          <SearchPopout />
+        <Overlay show={expanded && !hasValue} placement='bottom' target={this.findTarget} popperConfig={{ strategy: 'fixed' }}>
+          {({ props, placement }) => (
+            <div {...props} style={{ ...props.style, width: 285, zIndex: 2 }}>
+              <div className={`dropdown-animation ${placement}`}>
+                <SearchPopout />
+              </div>
+            </div>
+          )}
         </Overlay>
       </div>
     );
diff --git a/app/javascript/mastodon/features/compose/containers/compose_form_container.js b/app/javascript/mastodon/features/compose/containers/compose_form_container.js
index 1be7633cc..14cf9230b 100644
--- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js
+++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js
@@ -24,7 +24,6 @@ const mapStateToProps = state => ({
   isEditing: state.getIn(['compose', 'id']) !== null,
   isChangingUpload: state.getIn(['compose', 'is_changing_upload']),
   isUploading: state.getIn(['compose', 'is_uploading']),
-  showSearch: state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']),
   anyMedia: state.getIn(['compose', 'media_attachments']).size > 0,
   isInReply: state.getIn(['compose', 'in_reply_to']) !== null,
 });
diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js
index f744fc611..aead7776a 100644
--- a/app/javascript/mastodon/features/compose/index.js
+++ b/app/javascript/mastodon/features/compose/index.js
@@ -18,6 +18,7 @@ import Icon from 'mastodon/components/icon';
 import { logOut } from 'mastodon/utils/log_out';
 import Column from 'mastodon/components/column';
 import { Helmet } from 'react-helmet';
+import { isMobile } from '../../is_mobile';
 
 const messages = defineMessages({
   start: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
@@ -115,7 +116,7 @@ class Compose extends React.PureComponent {
             <div className='drawer__inner' onFocus={this.onFocus}>
               <NavigationContainer onClose={this.onBlur} />
 
-              <ComposeFormContainer />
+              <ComposeFormContainer autoFocus={!isMobile(window.innerWidth)} />
 
               <div className='drawer__inner__mastodon'>
                 <img alt='' draggable='false' src={mascot || elephantUIPlane} />
diff --git a/app/javascript/mastodon/features/compose/util/counter.js b/app/javascript/mastodon/features/compose/util/counter.js
index 7aa9e87b1..5a68bad99 100644
--- a/app/javascript/mastodon/features/compose/util/counter.js
+++ b/app/javascript/mastodon/features/compose/util/counter.js
@@ -6,4 +6,4 @@ export function countableText(inputText) {
   return inputText
     .replace(urlRegex, urlPlaceholder)
     .replace(/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/ig, '$1@$3');
-};
+}
diff --git a/app/javascript/mastodon/features/explore/index.js b/app/javascript/mastodon/features/explore/index.js
index 286170c9f..1ae249f45 100644
--- a/app/javascript/mastodon/features/explore/index.js
+++ b/app/javascript/mastodon/features/explore/index.js
@@ -24,16 +24,6 @@ const mapStateToProps = state => ({
   isSearching: state.getIn(['search', 'submitted']) || !showTrends,
 });
 
-// Fix strange bug on Safari where <span> (rendered by FormattedMessage) disappears
-// after clicking around Explore top bar (issue #20885).
-// Removing width=100% from <a> also fixes it, as well as replacing <span> with <div>
-// We're choosing to wrap span with div to keep the changes local only to this tool bar.
-const WrapFormattedMessage = ({ children, ...props }) => <div><FormattedMessage {...props}>{children}</FormattedMessage></div>;
-WrapFormattedMessage.propTypes = {
-  children: PropTypes.any,
-};
-
-
 export default @connect(mapStateToProps)
 @injectIntl
 class Explore extends React.PureComponent {
@@ -78,12 +68,22 @@ class Explore extends React.PureComponent {
           {isSearching ? (
             <SearchResults />
           ) : (
-            <React.Fragment>
+            <>
               <div className='account__section-headline'>
-                <NavLink exact to='/explore'><WrapFormattedMessage id='explore.trending_statuses' defaultMessage='Posts' /></NavLink>
-                <NavLink exact to='/explore/tags'><WrapFormattedMessage id='explore.trending_tags' defaultMessage='Hashtags' /></NavLink>
-                <NavLink exact to='/explore/links'><WrapFormattedMessage id='explore.trending_links' defaultMessage='News' /></NavLink>
-                {signedIn && <NavLink exact to='/explore/suggestions'><WrapFormattedMessage id='explore.suggested_follows' defaultMessage='For you' /></NavLink>}
+                <NavLink exact to='/explore'>
+                  <FormattedMessage tagName='div' id='explore.trending_statuses' defaultMessage='Posts' />
+                </NavLink>
+                <NavLink exact to='/explore/tags'>
+                  <FormattedMessage tagName='div' id='explore.trending_tags' defaultMessage='Hashtags' />
+                </NavLink>
+                <NavLink exact to='/explore/links'>
+                  <FormattedMessage tagName='div' id='explore.trending_links' defaultMessage='News' />
+                </NavLink>
+                {signedIn && (
+                  <NavLink exact to='/explore/suggestions'>
+                    <FormattedMessage tagName='div' id='explore.suggested_follows' defaultMessage='For you' />
+                  </NavLink>
+                )}
               </div>
 
               <Switch>
@@ -97,7 +97,7 @@ class Explore extends React.PureComponent {
                 <title>{intl.formatMessage(messages.title)}</title>
                 <meta name='robots' content={isSearching ? 'noindex' : 'all'} />
               </Helmet>
-            </React.Fragment>
+            </>
           )}
         </div>
       </Column>
diff --git a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js
index ede8907e5..ac7863ed3 100644
--- a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js
+++ b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js
@@ -38,7 +38,7 @@ class ColumnSettings extends React.PureComponent {
     } else {
       return tags;
     }
-  };
+  }
 
   onSelect = mode => value => {
     const oldValue = this.tags(mode);
@@ -98,7 +98,7 @@ class ColumnSettings extends React.PureComponent {
     default:
       return '';
     }
-  };
+  }
 
   render () {
     const { settings, onChange } = this.props;
diff --git a/app/javascript/mastodon/features/hashtag_timeline/index.js b/app/javascript/mastodon/features/hashtag_timeline/index.js
index b635c3529..733f54ff3 100644
--- a/app/javascript/mastodon/features/hashtag_timeline/index.js
+++ b/app/javascript/mastodon/features/hashtag_timeline/index.js
@@ -194,7 +194,7 @@ class HashtagTimeline extends React.PureComponent {
       const following = tag.get('following');
 
       followButton = (
-        <button className={classNames('column-header__button')} onClick={this.handleFollow} disabled={!signedIn} title={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)} aria-label={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)}>
+        <button className={classNames('column-header__button')} onClick={this.handleFollow} disabled={!signedIn} active={following} title={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)} aria-label={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)}>
           <Icon id={following ? 'user-times' : 'user-plus'} fixedWidth className='column-header__icon' />
         </button>
       );
diff --git a/app/javascript/mastodon/features/list_timeline/index.js b/app/javascript/mastodon/features/list_timeline/index.js
index f1829d34d..c2e72e2e9 100644
--- a/app/javascript/mastodon/features/list_timeline/index.js
+++ b/app/javascript/mastodon/features/list_timeline/index.js
@@ -126,7 +126,7 @@ class ListTimeline extends React.PureComponent {
       onConfirm: () => {
         dispatch(deleteList(id));
 
-        if (!!columnId) {
+        if (columnId) {
           dispatch(removeColumn(columnId));
         } else {
           this.context.router.history.push('/lists');
diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js
index c1242754c..46ee9f6c1 100644
--- a/app/javascript/mastodon/features/status/components/action_bar.js
+++ b/app/javascript/mastodon/features/status/components/action_bar.js
@@ -7,7 +7,7 @@ import DropdownMenuContainer from '../../../containers/dropdown_menu_container';
 import { defineMessages, injectIntl } from 'react-intl';
 import { me } from '../../../initial_state';
 import classNames from 'classnames';
-import { PERMISSION_MANAGE_USERS } from 'mastodon/permissions';
+import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions';
 
 const messages = defineMessages({
   delete: { id: 'status.delete', defaultMessage: 'Delete' },
@@ -34,6 +34,7 @@ const messages = defineMessages({
   embed: { id: 'status.embed', defaultMessage: 'Embed' },
   admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
   admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
+  admin_domain: { id: 'status.admin_domain', defaultMessage: 'Open moderation interface for {domain}' },
   copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },
   blockDomain: { id: 'account.block_domain', defaultMessage: 'Block domain {domain}' },
   unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unblock domain {domain}' },
@@ -243,10 +244,16 @@ class ActionBar extends React.PureComponent {
         }
       }
 
-      if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) {
+      if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS || (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION)) {
         menu.push(null);
-        menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });
-        menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses/${status.get('id')}` });
+        if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) {
+          menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });
+          menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses/${status.get('id')}` });
+        }
+        if (isRemote && (permissions & PERMISSION_MANAGE_FEDERATION) === PERMISSION_MANAGE_FEDERATION) {
+          const domain = account.get('acct').split('@')[1];
+          menu.push({ text: intl.formatMessage(messages.admin_domain, { domain: domain }), href: `/admin/instances/${domain}` });
+        }
       }
     }
 
diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js
index f4824f045..e7def800e 100644
--- a/app/javascript/mastodon/features/ui/components/columns_area.js
+++ b/app/javascript/mastodon/features/ui/components/columns_area.js
@@ -97,7 +97,7 @@ export default class ColumnsArea extends ImmutablePureComponent {
       if (this.mediaQuery.removeEventListener) {
         this.mediaQuery.removeEventListener('change', this.handleLayoutChange);
       } else {
-        this.mediaQuery.removeListener(this.handleLayouteChange);
+        this.mediaQuery.removeListener(this.handleLayoutChange);
       }
     }
   }
diff --git a/app/javascript/mastodon/features/ui/components/disabled_account_banner.js b/app/javascript/mastodon/features/ui/components/disabled_account_banner.js
index cc8cc3285..038cc3553 100644
--- a/app/javascript/mastodon/features/ui/components/disabled_account_banner.js
+++ b/app/javascript/mastodon/features/ui/components/disabled_account_banner.js
@@ -89,4 +89,4 @@ class DisabledAccountBanner extends React.PureComponent {
     );
   }
 
-};
+}
diff --git a/app/javascript/mastodon/features/ui/components/focal_point_modal.js b/app/javascript/mastodon/features/ui/components/focal_point_modal.js
index ba8aa8f03..479f4abd2 100644
--- a/app/javascript/mastodon/features/ui/components/focal_point_modal.js
+++ b/app/javascript/mastodon/features/ui/components/focal_point_modal.js
@@ -291,11 +291,11 @@ class FocalPointModal extends ImmutablePureComponent {
     let descriptionLabel = null;
 
     if (media.get('type') === 'audio') {
-      descriptionLabel = <FormattedMessage id='upload_form.audio_description' defaultMessage='Describe for people with hearing loss' />;
+      descriptionLabel = <FormattedMessage id='upload_form.audio_description' defaultMessage='Describe for people who are hard of hearing' />;
     } else if (media.get('type') === 'video') {
-      descriptionLabel = <FormattedMessage id='upload_form.video_description' defaultMessage='Describe for people with hearing loss or visual impairment' />;
+      descriptionLabel = <FormattedMessage id='upload_form.video_description' defaultMessage='Describe for people who are deaf, hard of hearing, blind or have low vision' />;
     } else {
-      descriptionLabel = <FormattedMessage id='upload_form.description' defaultMessage='Describe for the visually impaired' />;
+      descriptionLabel = <FormattedMessage id='upload_form.description' defaultMessage='Describe for people who are blind or have low vision' />;
     }
 
     let ocrMessage = '';
diff --git a/app/javascript/mastodon/features/ui/components/link_footer.js b/app/javascript/mastodon/features/ui/components/link_footer.js
index c29aac418..3664a05bf 100644
--- a/app/javascript/mastodon/features/ui/components/link_footer.js
+++ b/app/javascript/mastodon/features/ui/components/link_footer.js
@@ -52,6 +52,8 @@ class LinkFooter extends React.PureComponent {
     const canInvite = signedIn && ((permissions & PERMISSION_INVITE_USERS) === PERMISSION_INVITE_USERS);
     const canProfileDirectory = profileDirectory;
 
+    const DividingCircle = <span aria-hidden>{' · '}</span>;
+
     return (
       <div className='link-footer'>
         <p>
@@ -60,17 +62,17 @@ class LinkFooter extends React.PureComponent {
           <Link key='about' to='/about'><FormattedMessage id='footer.about' defaultMessage='About' /></Link>
           {canInvite && (
             <>
-              {' · '}
+              {DividingCircle}
               <a key='invites' href='/invites' target='_blank'><FormattedMessage id='footer.invite' defaultMessage='Invite people' /></a>
             </>
           )}
           {canProfileDirectory && (
             <>
-              {' · '}
+              {DividingCircle}
               <Link key='directory' to='/directory'><FormattedMessage id='footer.directory' defaultMessage='Profiles directory' /></Link>
             </>
           )}
-          {' · '}
+          {DividingCircle}
           <Link key='privacy-policy' to='/privacy-policy'><FormattedMessage id='footer.privacy_policy' defaultMessage='Privacy policy' /></Link>
         </p>
 
@@ -78,17 +80,17 @@ class LinkFooter extends React.PureComponent {
           <strong>Mastodon</strong>:
           {' '}
           <a href='https://joinmastodon.org' target='_blank'><FormattedMessage id='footer.about' defaultMessage='About' /></a>
-          {' · '}
+          {DividingCircle}
           <a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='footer.get_app' defaultMessage='Get the app' /></a>
-          {' · '}
+          {DividingCircle}
           <Link to='/keyboard-shortcuts'><FormattedMessage id='footer.keyboard_shortcuts' defaultMessage='Keyboard shortcuts' /></Link>
-          {' · '}
+          {DividingCircle}
           <a href={source_url} rel='noopener noreferrer' target='_blank'><FormattedMessage id='footer.source_code' defaultMessage='View source code' /></a>
-          {' · '}
+          {DividingCircle}
           v{version}
         </p>
       </div>
     );
   }
 
-};
+}
diff --git a/app/javascript/mastodon/features/ui/components/video_modal.js b/app/javascript/mastodon/features/ui/components/video_modal.js
index d3bd034cb..a1533eba0 100644
--- a/app/javascript/mastodon/features/ui/components/video_modal.js
+++ b/app/javascript/mastodon/features/ui/components/video_modal.js
@@ -40,6 +40,7 @@ export default class VideoModal extends ImmutablePureComponent {
             autoPlay={options.autoPlay}
             volume={options.defaultVolume}
             onCloseVideo={onClose}
+            autoFocus
             detailed
             alt={media.get('description')}
           />
diff --git a/app/javascript/mastodon/features/ui/util/react_router_helpers.js b/app/javascript/mastodon/features/ui/util/react_router_helpers.js
index 2ee06c3ff..205dd6f10 100644
--- a/app/javascript/mastodon/features/ui/util/react_router_helpers.js
+++ b/app/javascript/mastodon/features/ui/util/react_router_helpers.js
@@ -46,7 +46,7 @@ export class WrappedRoute extends React.Component {
     return {
       hasError: true,
     };
-  };
+  }
 
   state = {
     hasError: false,
diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js
index 4f90e955f..1c35ca9d1 100644
--- a/app/javascript/mastodon/features/video/index.js
+++ b/app/javascript/mastodon/features/video/index.js
@@ -122,6 +122,7 @@ class Video extends React.PureComponent {
     volume: PropTypes.number,
     muted: PropTypes.bool,
     componentIndex: PropTypes.number,
+    autoFocus: PropTypes.bool,
   };
 
   static defaultProps = {
@@ -523,7 +524,7 @@ class Video extends React.PureComponent {
   }
 
   render () {
-    const { preview, src, inline, onOpenVideo, onCloseVideo, intl, alt, detailed, sensitive, editable, blurhash } = this.props;
+    const { preview, src, inline, onOpenVideo, onCloseVideo, intl, alt, detailed, sensitive, editable, blurhash, autoFocus } = this.props;
     const { containerWidth, currentTime, duration, volume, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state;
     const progress = Math.min((currentTime / duration) * 100, 100);
     const playerStyle = {};
@@ -617,7 +618,7 @@ class Video extends React.PureComponent {
 
           <div className='video-player__buttons-bar'>
             <div className='video-player__buttons left'>
-              <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} className='player-button' onClick={this.togglePlay} autoFocus={detailed}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
+              <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} className='player-button' onClick={this.togglePlay} autoFocus={autoFocus}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
               <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
 
               <div className={classNames('video-player__volume', { active: this.state.hovered })} onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}>
diff --git a/app/javascript/mastodon/load_polyfills.js b/app/javascript/mastodon/load_polyfills.js
index cc5bcd18f..f5a897f75 100644
--- a/app/javascript/mastodon/load_polyfills.js
+++ b/app/javascript/mastodon/load_polyfills.js
@@ -23,15 +23,14 @@ function loadPolyfills() {
   );
 
   // Latest version of Firefox and Safari do not have IntersectionObserver.
-  // Edge does not have requestIdleCallback and object-fit CSS property.
+  // Edge does not have requestIdleCallback.
   // This avoids shipping them all the polyfills.
   const needsExtraPolyfills = !(
     window.AbortController &&
     window.IntersectionObserver &&
     window.IntersectionObserverEntry &&
     'isIntersecting' in IntersectionObserverEntry.prototype &&
-    window.requestIdleCallback &&
-    'object-fit' in (new Image()).style
+    window.requestIdleCallback
   );
 
   return Promise.all([
diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json
index 60a814373..abd664fc8 100644
--- a/app/javascript/mastodon/locales/af.json
+++ b/app/javascript/mastodon/locales/af.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Plasings en antwoorde",
   "account.report": "Rapporteer @{name}",
   "account.requested": "Wag op goedkeuring. Klik om volgversoek te kanselleer",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Deel @{name} se profiel",
   "account.show_reblogs": "Wys aangestuurde plasings van @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Plaas} other {{counter} Plasings}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Soek tale...",
   "compose_form.direct_message_warning_learn_more": "Leer meer",
   "compose_form.encryption_warning": "Plasings op Mastodon is nie van punt tot punt versleutel nie. Moet geen sensitiewe inligting op Mastodon deel nie.",
-  "compose_form.hashtag_warning": "Hierdie plasing is ongelys en sal dus onder geen hutsetiket verskyn nie. Slegs openbare plasings is vindbaar wanneer daar na hutsetikette gesoek word.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Jou rekening is nie {locked} nie. Enigiemand kan jou volg en sien wat jy vir jou volgers plaas.",
   "compose_form.lock_disclaimer.lock": "gesluit",
   "compose_form.placeholder": "Wat wil jy deel?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Soekresultate",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open hierdie plasing as moderator",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/an.json b/app/javascript/mastodon/locales/an.json
index 83722156b..0a86e32ef 100644
--- a/app/javascript/mastodon/locales/an.json
+++ b/app/javascript/mastodon/locales/an.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Publicacions y respuestas",
   "account.report": "Denunciar a @{name}",
   "account.requested": "Esperando l'aprebación",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Compartir lo perfil de @{name}",
   "account.show_reblogs": "Amostrar retutz de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Publicación} other {{counter} Publicaciones}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Buscar idiomas...",
   "compose_form.direct_message_warning_learn_more": "Aprender mas",
   "compose_form.encryption_warning": "Las publicacions en Mastodon no son zifradas de cabo a cabo. No comparta garra información sensible en Mastodon.",
-  "compose_form.hashtag_warning": "Esta publicación no s'amostrará baixo garra hashtag perque no ye listada. Nomás las publicacions publicas se pueden buscar per hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "La tuya cuenta no ye {locked}. Totz pueden seguir-te pa veyer las tuyas publicacions nomás pa seguidores.",
   "compose_form.lock_disclaimer.lock": "blocau",
   "compose_form.placeholder": "En qué yes pensando?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copiar lo seguimiento de pila en o portafuellas",
   "errors.unexpected_crash.report_issue": "Informar d'un problema/error",
   "explore.search_results": "Resultaus de busqueda",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explorar",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro no s'aplica a lo contexto en o qual ha accediu a esta publlicación. Si quiers que la publicación sía filtrada tamién en este contexto, habrás d'editar lo filtro.",
   "filter_modal.added.context_mismatch_title": "Lo contexto no coincide!",
   "filter_modal.added.expired_explanation": "Esta categoría de filtro ha caducau, amenesterá cambiar la calendata de caducidat pa que s'aplique.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Iniciar sesión",
   "sign_in_banner.text": "Inicia sesión en este servidor pa seguir perfils u etiquetas, alzar, compartir y responder a mensaches. Tamién puetz interactuar dende unatra cuenta en un servidor diferent.",
   "status.admin_account": "Ubrir interficie de moderación pa @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Ubrir este estau en a interficie de moderación",
   "status.block": "Blocar a @{name}",
   "status.bookmark": "Anyadir marcador",
@@ -553,7 +559,7 @@
   "status.favourite": "Favorito",
   "status.filter": "Filtrar esta publicación",
   "status.filtered": "Filtrau",
-  "status.hide": "Amagar publicación",
+  "status.hide": "Hide post",
   "status.history.created": "{name} creyó {date}",
   "status.history.edited": "{name} editó {date}",
   "status.load_more": "Cargar mas",
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 6c95d47d6..87804ab07 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "المنشورات والرُدود",
   "account.report": "الإبلاغ عن @{name}",
   "account.requested": "في انتظار القبول. اضغط لإلغاء طلب المُتابعة",
+  "account.requested_follow": "لقد طلب {name} متابعتك",
   "account.share": "شارِك الملف التعريفي لـ @{name}",
   "account.show_reblogs": "عرض مشاركات @{name}",
   "account.statuses_counter": "{count, plural, zero {لَا منشورات} one {منشور واحد} two {منشوران إثنان} few {{counter} منشورات} many {{counter} منشورًا} other {{counter} منشور}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "البحث عن لغة…",
   "compose_form.direct_message_warning_learn_more": "تَعَلَّم المَزيد",
   "compose_form.encryption_warning": "إنّ المنشورات على ماستدون ليست مشفرة من النهاية إلى النهاية. لا تشارك أي معلومات حساسة عبر ماستدون.",
-  "compose_form.hashtag_warning": "لن يُدرَج هذا المنشور تحت أي وسم بما أنَّه غير مُدرَج. فقط المنشورات العامة يُمكن البحث عنها بواسطة الوسم.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "حسابُك غير {locked}. يُمكن لأي شخص مُتابعتك لرؤية (منشورات المتابعين فقط).",
   "compose_form.lock_disclaimer.lock": "مُقفَل",
   "compose_form.placeholder": "فِيمَ تُفكِّر؟",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "انسخ تتبع الارتباطات إلى الحافظة",
   "errors.unexpected_crash.report_issue": "الإبلاغ عن خلل",
   "explore.search_results": "نتائج البحث",
+  "explore.suggested_follows": "لك",
   "explore.title": "استكشف",
+  "explore.trending_links": "الأخبار",
+  "explore.trending_statuses": "المنشورات",
+  "explore.trending_tags": "هاشتاجات",
   "filter_modal.added.context_mismatch_explanation": "فئة عامل التصفية هذه لا تنطبق على السياق الذي وصلت فيه إلى هذه المشاركة. إذا كنت ترغب في تصفية المنشور في هذا السياق أيضا، فسيتعين عليك تعديل عامل التصفية.",
   "filter_modal.added.context_mismatch_title": "عدم تطابق السياق!",
   "filter_modal.added.expired_explanation": "انتهت صلاحية فئة عامل التصفية هذه، سوف تحتاج إلى تغيير تاريخ انتهاء الصلاحية لتطبيقها.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "تسجيل الدخول",
   "sign_in_banner.text": "قم بالولوج بحسابك لمتابعة الصفحات الشخصية أو الوسوم، أو لإضافة الرسائل إلى المفضلة ومشاركتها والرد عليها أو التفاعل بواسطة حسابك المتواجد على خادم مختلف.",
   "status.admin_account": "افتح الواجهة الإدارية لـ @{name}",
+  "status.admin_domain": "فتح واجهة الإشراف لـ {domain}",
   "status.admin_status": "افتح هذا المنشور على واجهة الإشراف",
   "status.block": "احجب @{name}",
   "status.bookmark": "أضفه إلى الفواصل المرجعية",
@@ -553,7 +559,7 @@
   "status.favourite": "أضف إلى المفضلة",
   "status.filter": "تصفية هذه الرسالة",
   "status.filtered": "مُصفّى",
-  "status.hide": "اخف التبويق",
+  "status.hide": "إخفاء المنشور",
   "status.history.created": "أنشأه {name} {date}",
   "status.history.edited": "عدله {name} {date}",
   "status.load_more": "حمّل المزيد",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index e287b9a46..484a263cf 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Artículos ya rempuestes",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval. Click to cancel follow request",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Amosar los artículos compartíos de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} artículu} other {{counter} artículos}}",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Resultaos de la busca",
+  "explore.suggested_follows": "Pa ti",
   "explore.title": "Esploración",
+  "explore.trending_links": "Noticies",
+  "explore.trending_statuses": "Artículos",
+  "explore.trending_tags": "Etiquetes",
   "filter_modal.added.context_mismatch_explanation": "Esta categoría de peñera nun s'aplica al contestu nel qu'accediesti a esti artículu. Si tamién quies que se peñere l'artículu nesti contestu, tienes d'editar la peñera.",
   "filter_modal.added.context_mismatch_title": "¡El contestu nun coincide!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -257,7 +262,7 @@
   "follow_recommendations.lead": "Los artículos de los perfiles que sigas van apaecer n'orde cronolóxicu nel to feed d'aniciu. ¡Nun tengas mieu d'enquivocate, pues dexar de siguilos con facilidá en cualesquier momentu!",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Refugar",
-  "follow_requests.unlocked_explanation": "Magar que la cuenta nun tea bloquiada, ye posible que'l personal del dominiu {domain} quiera revisar manualmente les solicitúes de siguimientu d'estes cuentes.",
+  "follow_requests.unlocked_explanation": "Magar que la to cuenta nun seya privada, el personal del dominiu «{domain}» pensó qu'a lo meyor quies revisar manualmente les solicitúes de siguimientu d'estes cuentes.",
   "footer.about": "Tocante a",
   "footer.directory": "Direutoriu de perfiles",
   "footer.get_app": "Consiguir l'aplicación",
@@ -387,7 +392,7 @@
   "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.",
   "notification.admin.report": "{name} informó de: {target}",
   "notification.admin.sign_up": "{name} rexistróse",
-  "notification.favourite": "{name} favourited your status",
+  "notification.favourite": "{name} marcó'l to artículu como favoritu",
   "notification.follow": "{name} siguióte",
   "notification.follow_request": "{name} solicitó siguite",
   "notification.mention": "{name} mentóte",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Anicia la sesión pa siguir a perfiles o etiquetes, marcar como favoritu, compartir o responder a artículos, o interactuar cola to cuenta nun sirvidor diferente.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Meter en Marcadores",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Anubrir l'artículu",
   "status.history.created": "{name} creó {date}",
   "status.history.edited": "{name} editó {date}",
   "status.load_more": "Cargar más",
@@ -617,13 +623,13 @@
   "upload_button.label": "Add images, a video or an audio file",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "La xuba de ficheros nun ta permitida coles encuestes.",
-  "upload_form.audio_description": "Descripción pa persones con perda auditiva",
-  "upload_form.description": "Descripción pa persones con discapacidá visual",
+  "upload_form.audio_description": "Describe for people who are hard of hearing",
+  "upload_form.description": "Describe for people who are blind or have low vision",
   "upload_form.description_missing": "Nun s'amestó la descripción",
   "upload_form.edit": "Editar",
   "upload_form.thumbnail": "Change thumbnail",
   "upload_form.undo": "Desaniciar",
-  "upload_form.video_description": "Descripción pa persones con perda auditiva o discapacidá visual",
+  "upload_form.video_description": "Describe for people who are deaf, hard of hearing, blind or have low vision",
   "upload_modal.analyzing_picture": "Analizando la semeya…",
   "upload_modal.apply": "Aplicar",
   "upload_modal.applying": "Aplicando…",
diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json
index 0e84db718..ff99ec6e4 100644
--- a/app/javascript/mastodon/locales/be.json
+++ b/app/javascript/mastodon/locales/be.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Допісы і адказы",
   "account.report": "Паскардзіцца на @{name}",
   "account.requested": "Чакаецца ўхваленне. Націсніце, каб скасаваць запыт на падпіску",
+  "account.requested_follow": "{name} адправіў запыт на падпіску",
   "account.share": "Абагуліць профіль @{name}",
   "account.show_reblogs": "Паказаць падштурхоўванні ад @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} допіс} few {{counter} допісы} many {{counter} допісаў} other {{counter} допісу}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Шукаць мовы...",
   "compose_form.direct_message_warning_learn_more": "Даведацца больш",
   "compose_form.encryption_warning": "Допісы ў Mastodon не абаронены скразным шыфраваннем. Не дзяліцеся ніякай канфідэнцыяльнай інфармацыяй в Mastodon.",
-  "compose_form.hashtag_warning": "Гэты допіс не будзе паказаны пад аніякім хэштэгам, так як ён мае тып \"Не паказваць у стужках\". Толькі публічныя допісы могуць быць знойдзены па хэштэгу.",
+  "compose_form.hashtag_warning": "Гэты допіс не будзе паказаны пад аніякім хэштэгам, бо ён не публічны. Толькі публічныя допісы можна знайсці па хэштэгу.",
   "compose_form.lock_disclaimer": "Ваш уліковы запіс не {locked}. Усе могуць падпісацца на вас, каб бачыць допісы толькі для падпісчыкаў.",
   "compose_form.lock_disclaimer.lock": "закрыты",
   "compose_form.placeholder": "Што здарылася?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Дадаць дыягнастычны стэк у буфер абмену",
   "errors.unexpected_crash.report_issue": "Паведаміць аб праблеме",
   "explore.search_results": "Вынікі пошуку",
+  "explore.suggested_follows": "Для вас",
   "explore.title": "Агляд",
+  "explore.trending_links": "Навіны",
+  "explore.trending_statuses": "Допісы",
+  "explore.trending_tags": "Хэштэгі",
   "filter_modal.added.context_mismatch_explanation": "Гэтая катэгорыя фільтра не прымяняецца да кантэксту, у якім вы адкрылі гэты пост. Калі вы хочаце, каб паведамленне таксама было адфільтравана ў гэтым кантэксце, вам трэба будзе адрэдагаваць фільтр",
   "filter_modal.added.context_mismatch_title": "Неадпаведны кантэкст!",
   "filter_modal.added.expired_explanation": "Тэрмін дзеяння гэтай катэгорыі фільтраў скончыўся, вам трэба будзе змяніць дату заканчэння тэрміну дзеяння, каб яна прымянялася",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Увайсці",
   "sign_in_banner.text": "Увайдзіце, каб падпісацца на людзей і тэгі, каб адказваць на допісы, дзяліцца імі і падабаць іх, альбо кантактаваць з вашага ўліковага запісу на іншым серверы.",
   "status.admin_account": "Адкрыць інтэрфейс мадэратара для @{name}",
+  "status.admin_domain": "Адкрыць інтэрфейс мадэратара для {domain}",
   "status.admin_status": "Адкрыць гэты допіс у інтэрфейсе мадэрацыі",
   "status.block": "Заблакаваць @{name}",
   "status.bookmark": "Дадаць закладку",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index f04f6054d..284d162b1 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -12,7 +12,7 @@
   "about.powered_by": "Децентрализирана социална мрежа, захранвана от {mastodon}",
   "about.rules": "Правила на сървъра",
   "account.account_note_header": "Бележка",
-  "account.add_or_remove_from_list": "Добави или премахни от списъците",
+  "account.add_or_remove_from_list": "Добавяне или премахване от списъци",
   "account.badges.bot": "Бот",
   "account.badges.group": "Група",
   "account.block": "Блокиране на @{name}",
@@ -36,11 +36,11 @@
   "account.following": "Последвани",
   "account.following_counter": "{count, plural, one {{counter} последван} other {{counter} последвани}}",
   "account.follows.empty": "Потребителят още никого не следва.",
-  "account.follows_you": "Ваш последовател",
+  "account.follows_you": "Следва ви",
   "account.go_to_profile": "Към профила",
-  "account.hide_reblogs": "Скриване на споделяния от @{name}",
+  "account.hide_reblogs": "Скриване на подсилвания от @{name}",
   "account.joined_short": "Дата на присъединяване",
-  "account.languages": "Смяна на показваните езици",
+  "account.languages": "Промяна на езиците, за които сте абонирани",
   "account.link_verified_on": "Собствеността върху тази връзка е проверена на {date}",
   "account.locked_info": "Състоянието за поверителността на акаунта е зададено заключено. Собственикът преглежда ръчно от кого може да се следва.",
   "account.media": "Мултимедия",
@@ -49,21 +49,22 @@
   "account.mute": "Заглушаване на @{name}",
   "account.mute_notifications": "Заглушаване на известия от @{name}",
   "account.muted": "Заглушено",
-  "account.open_original_page": "Отваряне на оригиналната страница",
+  "account.open_original_page": "Отваряне на първообразната страница",
   "account.posts": "Публикации",
-  "account.posts_with_replies": "С отговори",
+  "account.posts_with_replies": "Публ. и отговори",
   "account.report": "Докладване на @{name}",
   "account.requested": "Чака се одобрение. Щракнете за отмяна на заявката за последване",
-  "account.share": "Изпращане на профила на @{name}",
-  "account.show_reblogs": "Показване на споделяния от @{name}",
+  "account.requested_follow": "{name} поиска да ви последва",
+  "account.share": "Споделяне на профила на @{name}",
+  "account.show_reblogs": "Показване на подсилвания от @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} публикация} other {{counter} публикации}}",
   "account.unblock": "Отблокиране на @{name}",
   "account.unblock_domain": "Отблокиране на домейн {domain}",
-  "account.unblock_short": "Отблокирване",
+  "account.unblock_short": "Отблокиране",
   "account.unendorse": "Не включвайте в профила",
-  "account.unfollow": "Не следвай",
+  "account.unfollow": "Стоп на следването",
   "account.unmute": "Без заглушаване на @{name}",
-  "account.unmute_notifications": "Без заглушаване на известия от @{name}",
+  "account.unmute_notifications": "Изпращане на известия от @{name}",
   "account.unmute_short": "Без заглушаване",
   "account_note.placeholder": "Щракнете, за да добавите бележка",
   "admin.dashboard.daily_retention": "Ниво на задържани на потребители след регистрация, в дни",
@@ -92,7 +93,7 @@
   "bundle_modal_error.close": "Затваряне",
   "bundle_modal_error.message": "Нещо се обърка, зареждайки компонента.",
   "bundle_modal_error.retry": "Нов опит",
-  "closed_registrations.other_server_instructions": "Поради това че Mastodon е децентрализиран, можеш да създадеш акаунт на друг сървър, от който можеш да комуникираш с този.",
+  "closed_registrations.other_server_instructions": "Oткак e децентрализиранa Mastodon, може да създадете акаунт на друг сървър и още може да взаимодействате с този.",
   "closed_registrations_modal.description": "Създаването на акаунт в {domain} сега не е възможно, но обърнете внимание, че нямате нужда от акаунт конкретно на {domain}, за да ползвате Mastodon.",
   "closed_registrations_modal.find_another_server": "Намиране на друг сървър",
   "closed_registrations_modal.preamble": "Mastodon е децентрализиран, така че няма значение къде създавате акаунта си, ще може да последвате и взаимодействате с всеки на този сървър. Може дори да стартирате свой собствен сървър!",
@@ -127,14 +128,14 @@
   "compose.language.search": "Търсене на езици...",
   "compose_form.direct_message_warning_learn_more": "Още информация",
   "compose_form.encryption_warning": "Публикациите в Mastodon не са криптирани от край до край. Не споделяйте никаква чувствителна информация там.",
-  "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": "Добавяне на избор",
   "compose_form.poll.duration": "Времетраене на анкетата",
   "compose_form.poll.option_placeholder": "Избор {number}",
-  "compose_form.poll.remove_option": "Премахване на избора",
+  "compose_form.poll.remove_option": "Премахване на този избор",
   "compose_form.poll.switch_to_multiple": "Промяна на анкетата, за да се позволят множество възможни избора",
   "compose_form.poll.switch_to_single": "Промяна на анкетата, за да се позволи един възможен избор",
   "compose_form.publish": "Публикуване",
@@ -142,11 +143,11 @@
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Запазване на промените",
   "compose_form.sensitive.hide": "{count, plural, one {Маркиране на мултимедията като деликатна} other {Маркиране на мултимедиите като деликатни}}",
-  "compose_form.sensitive.marked": "{count, plural, one {Мултимедията е маркирана като деликатна} other {Мултимедиите са маркирани като деликатни}}",
+  "compose_form.sensitive.marked": "{count, plural, one {мултимедия е означена като деликатна} other {мултимедии са означени като деликатни}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Мултимедията не е маркирана като деликатна} other {Мултимедиите не са маркирани като деликатни}}",
   "compose_form.spoiler.marked": "Премахване на предупреждението за съдържание",
   "compose_form.spoiler.unmarked": "Добавяне на предупреждение за съдържание",
-  "compose_form.spoiler_placeholder": "Напишете предупреждение",
+  "compose_form.spoiler_placeholder": "Тук напишете предупреждението си",
   "confirmation_modal.cancel": "Отказ",
   "confirmations.block.block_and_report": "Блокиране и докладване",
   "confirmations.block.confirm": "Блокиране",
@@ -167,7 +168,7 @@
   "confirmations.mute.explanation": "Това ще скрие публикациите от тях и публикации, които ги споменават, но все още ще им позволява да виждат публикациите ви и да ви следват.",
   "confirmations.mute.message": "Наистина ли искате да заглушите {name}?",
   "confirmations.redraft.confirm": "Изтриване и преработване",
-  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
+  "confirmations.redraft.message": "Сигурни ли сте, че искате да изтриете тази публикация и да я върнете в чернова? Ще загубите подсилванията и означаванията като любима, и отговорите към оригинала ще останат висящи.",
   "confirmations.reply.confirm": "Отговор",
   "confirmations.reply.message": "Отговарянето сега ще замени съобщението, което в момента съставяте. Сигурни ли сте, че искате да продължите?",
   "confirmations.unfollow.confirm": "Без следване",
@@ -178,13 +179,13 @@
   "conversation.with": "С {names}",
   "copypaste.copied": "Копирано",
   "copypaste.copy": "Копиране",
-  "directory.federated": "От познатата федивселена",
+  "directory.federated": "От позната федивселена",
   "directory.local": "Само от {domain}",
   "directory.new_arrivals": "Новодошли",
   "directory.recently_active": "Наскоро дейни",
   "disabled_account_banner.account_settings": "Настройки на акаунта",
   "disabled_account_banner.text": "Вашият акаунт {disabledAccount} сега е изключен.",
-  "dismissable_banner.community_timeline": "Ето най-скорошните публични публикации, създадени от акаунти в {domain}.",
+  "dismissable_banner.community_timeline": "Ето най-скорошните публични публикации от хора, чиито акаунти са разположени в {domain}.",
   "dismissable_banner.dismiss": "Отхвърляне",
   "dismissable_banner.explore_links": "Тези новини се разказват от хората в този и други сървъри на децентрализираната мрежа точно сега.",
   "dismissable_banner.explore_statuses": "Тези публикации от този и други сървъри в децентрализираната мрежа набират популярност сега на този сървър.",
@@ -194,7 +195,7 @@
   "embed.preview": "Ето как ще изглежда:",
   "emoji_button.activity": "Дейност",
   "emoji_button.clear": "Изчистване",
-  "emoji_button.custom": "Персонализирани",
+  "emoji_button.custom": "Персонализирано",
   "emoji_button.flags": "Знамена",
   "emoji_button.food": "Храна и напитки",
   "emoji_button.label": "Вмъкване на емоджи",
@@ -207,35 +208,39 @@
   "emoji_button.search_results": "Резултати от търсене",
   "emoji_button.symbols": "Символи",
   "emoji_button.travel": "Пътуване и места",
-  "empty_column.account_suspended": "Профилът е спрян",
+  "empty_column.account_suspended": "Спрян акаунт",
   "empty_column.account_timeline": "Тук няма публикации!",
-  "empty_column.account_unavailable": "Няма достъп до профила",
+  "empty_column.account_unavailable": "Профилът не е наличен",
   "empty_column.blocks": "Още не сте блокирали никакви потребители.",
   "empty_column.bookmarked_statuses": "Още не сте отметнали публикации. Отметвайки някоя, то тя ще се покаже тук.",
   "empty_column.community": "Локалният инфопоток е празен. Публикувайте нещо, за да започнете!",
   "empty_column.direct": "Все още нямате лични съобщения. Когато изпратите или получите някое, то ще се покаже тук.",
   "empty_column.domain_blocks": "Още няма блокирани домейни.",
-  "empty_column.explore_statuses": "Няма нищо популярно в момента. Проверете пак по-късно!",
+  "empty_column.explore_statuses": "Няма нищо налагащо се в момента. Проверете пак по-късно!",
   "empty_column.favourited_statuses": "Още нямате любими публикации. Поставяйки някоя в любими, то тя ще се покаже тук.",
   "empty_column.favourites": "Още никой не е поставил публикацията в любими. Когато някой го направи, този човек ще се покаже тук.",
-  "empty_column.follow_recommendations": "Изглежда, че няма генерирани предложения за вас. Можете да опитате да търсите за хора, които знаете или да разгледате популярните тагове.",
-  "empty_column.follow_requests": "Все още нямате заявки за последване. Когато получите такава, тя ще се покаже тук.",
+  "empty_column.follow_recommendations": "Изглежда, че няма предложения, които може да се породят за вас. Може да опитате да потърсите хора, които познавате или да разгледате налагащи се хаштагове.",
+  "empty_column.follow_requests": "Още нямате заявки за последване. Получавайки такава, то тя ще се покаже тук.",
   "empty_column.hashtag": "Още няма нищо в този хаштаг.",
-  "empty_column.home": "Вашият личен инфопоток е празен! Последвайте повече хора, за да го запълните. {suggestions}",
+  "empty_column.home": "Вашата начална часова ос е празна! Последвайте повече хора, за да я запълните. {suggestions}",
   "empty_column.home.suggestions": "Преглед на някои предложения",
-  "empty_column.list": "Още няма нищо в този списък. Когато членовете на списъка публикуват нови публикации, то те ще се появят тук.",
+  "empty_column.list": "Все още списъкът е празен. Членуващите на списъка, публикуващи нови публикации, ще се появят тук.",
   "empty_column.lists": "Все още нямате списъци. Когато създадете такъв, той ще се покаже тук.",
   "empty_column.mutes": "Още не сте заглушавали потребители.",
   "empty_column.notifications": "Все още нямате известия. Взаимодействайте с другите, за да започнете разговора.",
   "empty_column.public": "Тук няма нищо! Публикувайте нещо или последвайте потребители от други сървъри, за да го напълните",
   "error.unexpected_crash.explanation": "Поради грешка в нашия код или проблем със съвместимостта на браузъра, тази страница не може да се покаже правилно.",
-  "error.unexpected_crash.explanation_addons": "Тази страница не може да се покаже правилно. Тази грешка вероятно е причинена от добавка на браузъра или инструменти за автоматичен превод.",
+  "error.unexpected_crash.explanation_addons": "Страницата не можа да се покаже правилно. Тази грешка вероятно е причинена от добавка на браузъра или от средства за автоматичен превод.",
   "error.unexpected_crash.next_steps": "Опитайте да опресните страницата. Ако това не помогне, все още можете да използвате Mastodon чрез различен браузър или приложение.",
   "error.unexpected_crash.next_steps_addons": "Опитайте се да ги изключите и да опресните страницата. Ако това не помогне, то още може да използвате Mastodon чрез различен браузър или приложение.",
-  "errors.unexpected_crash.copy_stacktrace": "Копиране на stacktrace-а в клипборда",
+  "errors.unexpected_crash.copy_stacktrace": "Копиране на трасето на стека в буферната памет",
   "errors.unexpected_crash.report_issue": "Сигнал за проблем",
   "explore.search_results": "Резултати от търсенето",
+  "explore.suggested_follows": "За вас",
   "explore.title": "Разглеждане",
+  "explore.trending_links": "Новини",
+  "explore.trending_statuses": "Публикации",
+  "explore.trending_tags": "Хаштагове",
   "filter_modal.added.context_mismatch_explanation": "Тази категория филтър не е приложима към контекста, в който достъпвате тази публикация. Ако желаете да филтрирате публикациите в този контекст, трябва да изберете друг филтър.",
   "filter_modal.added.context_mismatch_title": "Несъвпадащ контекст!",
   "filter_modal.added.expired_explanation": "Валидността на тази категория филтър е изтекла. Сменете срока на валидност, за да я приложите.",
@@ -245,7 +250,7 @@
   "filter_modal.added.settings_link": "страница с настройки",
   "filter_modal.added.short_explanation": "Тази публикация е добавена към следната категория на филтъра: {title}.",
   "filter_modal.added.title": "Филтърът е добавен!",
-  "filter_modal.select_filter.context_mismatch": "не е приложимо за този контекст",
+  "filter_modal.select_filter.context_mismatch": "неприложимо за контекста",
   "filter_modal.select_filter.expired": "изтекло",
   "filter_modal.select_filter.prompt_new": "Нова категория: {name}",
   "filter_modal.select_filter.search": "Търсене или създаване",
@@ -260,7 +265,7 @@
   "follow_requests.unlocked_explanation": "Въпреки че акаунтът ви не е заключен, служителите на {domain} помислиха, че може да искате да преглеждате ръчно заявките за последване на тези профили.",
   "footer.about": "Относно",
   "footer.directory": "Директория на профилите",
-  "footer.get_app": "Изтегли приложението",
+  "footer.get_app": "Вземане на приложението",
   "footer.invite": "Поканване на хора",
   "footer.keyboard_shortcuts": "Клавишни комбинации",
   "footer.privacy_policy": "Политика за поверителност",
@@ -279,43 +284,43 @@
   "hashtag.follow": "Следване на хаштаг",
   "hashtag.unfollow": "Спиране на следване на хаштаг",
   "home.column_settings.basic": "Основно",
-  "home.column_settings.show_reblogs": "Показване на споделяния",
-  "home.column_settings.show_replies": "Показване на отговори",
-  "home.hide_announcements": "Скриване на оповестявания",
-  "home.show_announcements": "Показване на оповестявания",
-  "interaction_modal.description.favourite": "Ако имате профил в Mastodon, можете да маркирате публикация като любима, за да уведомите автора, че я оценявате, и да я запазите за по-късно.",
-  "interaction_modal.description.follow": "Ако имате профил в Mastodon, можете да последвате {name}, за да виждате постовете от този профил в своя основен инфопоток.",
-  "interaction_modal.description.reblog": "Ако имате профил в Mastodon, можете да споделите тази публикация със своите последователи.",
-  "interaction_modal.description.reply": "Ако имате профил в Mastodon, можете да добавите отговор към тази публикация.",
+  "home.column_settings.show_reblogs": "Показване на подсилванията",
+  "home.column_settings.show_replies": "Показване на отговорите",
+  "home.hide_announcements": "Скриване на оповестяванията",
+  "home.show_announcements": "Показване на оповестяванията",
+  "interaction_modal.description.favourite": "С акаунт в Mastodon може да направите тази публикация като любима, за да известите автора, че я цените, и да я запазите за по-късно.",
+  "interaction_modal.description.follow": "С акаунт в Mastodon може да последвате {name}, за да получавате публикациите от този акаунт в началния си инфоканал.",
+  "interaction_modal.description.reblog": "С акаунт в Mastodon може да подсилите тази публикация, за да я споделите с последователите си.",
+  "interaction_modal.description.reply": "С акаунт в Mastodon може да добавите отговор към тази публикация.",
   "interaction_modal.on_another_server": "На различен сървър",
   "interaction_modal.on_this_server": "На този сървър",
   "interaction_modal.other_server_instructions": "Копипейстнете този URL адрес в полето за търсене на любимото си приложение Mastodon или мрежови интерфейс на своя Mastodon сървър.",
   "interaction_modal.preamble": "Откак Mastodon е децентрализиран, може да употребявате съществуващ акаунт, разположен на друг сървър на Mastodon или съвместима платформа, ако нямате акаунт на този сървър.",
   "interaction_modal.title.favourite": "Любими публикации на {name}",
   "interaction_modal.title.follow": "Последване на {name}",
-  "interaction_modal.title.reblog": "Споделете публикацията от {name}",
+  "interaction_modal.title.reblog": "Подсилване на публикацията на {name}",
   "interaction_modal.title.reply": "Отговаряне на публикацията на {name}",
   "intervals.full.days": "{number, plural, one {# ден} other {# дни}}",
   "intervals.full.hours": "{number, plural, one {# час} other {# часа}}",
   "intervals.full.minutes": "{number, plural, one {# минута} other {# минути}}",
   "keyboard_shortcuts.back": "Навигиране назад",
   "keyboard_shortcuts.blocked": "Отваряне на списъка с блокирани потребители",
-  "keyboard_shortcuts.boost": "за споделяне",
+  "keyboard_shortcuts.boost": "Подсилване на публикация",
   "keyboard_shortcuts.column": "Съсредоточение на колона",
-  "keyboard_shortcuts.compose": "Фокус на текстовото пространство за композиране",
+  "keyboard_shortcuts.compose": "Фокус на текстовата зона за съставяне",
   "keyboard_shortcuts.description": "Опис",
   "keyboard_shortcuts.direct": "за отваряне на колоната с лични съобщения",
   "keyboard_shortcuts.down": "Преместване надолу в списъка",
   "keyboard_shortcuts.enter": "Отваряне на публикация",
-  "keyboard_shortcuts.favourite": "Любима публикация",
+  "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.local": "Отваряне на местна часова ос",
+  "keyboard_shortcuts.mention": "Споменаване на автора",
   "keyboard_shortcuts.muted": "Отваряне на списъка със заглушени потребители",
   "keyboard_shortcuts.my_profile": "Отваряне на профила ви",
   "keyboard_shortcuts.notifications": "Отваряне на колоната с известия",
@@ -325,29 +330,29 @@
   "keyboard_shortcuts.reply": "Отговаряне на публикация",
   "keyboard_shortcuts.requests": "Отваряне на списъка със заявки за последване",
   "keyboard_shortcuts.search": "Фокус на лентата за търсене",
-  "keyboard_shortcuts.spoilers": "за показване/скриване на ПС полето",
+  "keyboard_shortcuts.spoilers": "Показване/скриване на полето за предупреждение на съдържание",
   "keyboard_shortcuts.start": "Отваряне на колоната \"първи стъпки\"",
-  "keyboard_shortcuts.toggle_hidden": "за показване/скриване на текст зад ПС",
+  "keyboard_shortcuts.toggle_hidden": "Показване/скриване на текст зад предупреждение на съдържание",
   "keyboard_shortcuts.toggle_sensitivity": "Показване/скриване на мултимедията",
   "keyboard_shortcuts.toot": "Начало на нова публикация",
-  "keyboard_shortcuts.unfocus": "Разфокусиране на текстовото поле за композиране/търсене",
+  "keyboard_shortcuts.unfocus": "Разфокусиране на текстовото поле за съставяне/търсене",
   "keyboard_shortcuts.up": "Преместване нагоре в списъка",
   "lightbox.close": "Затваряне",
   "lightbox.compress": "Свиване на полето за преглед на образи",
   "lightbox.expand": "Разгъване на полето за преглед на образи",
   "lightbox.next": "Напред",
   "lightbox.previous": "Назад",
-  "limited_account_hint.action": "Покажи профила въпреки това",
-  "limited_account_hint.title": "Този профил е бил скрит от модераторита на {domain}.",
+  "limited_account_hint.action": "Показване на профила въпреки това",
+  "limited_account_hint.title": "Този профил е бил скрит от модераторите на {domain}.",
   "lists.account.add": "Добавяне към списък",
-  "lists.account.remove": "Премахване от списък",
-  "lists.delete": "Изтриване на списък",
+  "lists.account.remove": "Премахване от списъка",
+  "lists.delete": "Изтриване на списъка",
   "lists.edit": "Промяна на списъка",
   "lists.edit.submit": "Промяна на заглавие",
   "lists.new.create": "Добавяне на списък",
   "lists.new.title_placeholder": "Име на нов списък",
   "lists.replies_policy.followed": "Някой последван потребител",
-  "lists.replies_policy.list": "Членове на списъка",
+  "lists.replies_policy.list": "Членуващите в списъка",
   "lists.replies_policy.none": "Никого",
   "lists.replies_policy.title": "Показване на отговори на:",
   "lists.search": "Търсене измежду последваните",
@@ -361,7 +366,7 @@
   "mute_modal.duration": "Времетраене",
   "mute_modal.hide_notifications": "Скривате ли известията от този потребител?",
   "mute_modal.indefinite": "Неопределено",
-  "navigation_bar.about": "За тази инстанция",
+  "navigation_bar.about": "Относно",
   "navigation_bar.blocks": "Блокирани потребители",
   "navigation_bar.bookmarks": "Отметки",
   "navigation_bar.community_timeline": "Локален инфопоток",
@@ -381,19 +386,19 @@
   "navigation_bar.personal": "Лично",
   "navigation_bar.pins": "Закачени публикации",
   "navigation_bar.preferences": "Предпочитания",
-  "navigation_bar.public_timeline": "Федериран инфопоток",
+  "navigation_bar.public_timeline": "Федеративна хронология",
   "navigation_bar.search": "Търсене",
   "navigation_bar.security": "Сигурност",
-  "not_signed_in_indicator.not_signed_in": "Трябва да влезете за достъп до този ресурс.",
+  "not_signed_in_indicator.not_signed_in": "Трябва да влезете, за да имате достъп до този ресурс.",
   "notification.admin.report": "{name} докладва {target}",
   "notification.admin.sign_up": "{name} се регистрира",
-  "notification.favourite": "{name} хареса ваша публикация",
+  "notification.favourite": "{name} сложи в любими ваша публикация",
   "notification.follow": "{name} ви последва",
   "notification.follow_request": "{name} поиска да ви последва",
   "notification.mention": "{name} ви спомена",
   "notification.own_poll": "Анкетата ви приключи",
   "notification.poll": "Анкета, в която гласувахте, приключи",
-  "notification.reblog": "{name} сподели вашата публикация",
+  "notification.reblog": "{name} подсили ваша публикация",
   "notification.status": "{name} току-що публикува",
   "notification.update": "{name} промени публикация",
   "notifications.clear": "Изчистване на известията",
@@ -410,15 +415,15 @@
   "notifications.column_settings.mention": "Споменавания:",
   "notifications.column_settings.poll": "Резултати от анкета:",
   "notifications.column_settings.push": "Изскачащи известия",
-  "notifications.column_settings.reblog": "Споделяния:",
+  "notifications.column_settings.reblog": "Подсилвания:",
   "notifications.column_settings.show": "Показване в колоната",
   "notifications.column_settings.sound": "Пускане на звук",
   "notifications.column_settings.status": "Нови публикации:",
   "notifications.column_settings.unread_notifications.category": "Непрочетени известия",
   "notifications.column_settings.unread_notifications.highlight": "Изтъкване на непрочетените известия",
-  "notifications.column_settings.update": "Редакции:",
+  "notifications.column_settings.update": "Промени:",
   "notifications.filter.all": "Всичко",
-  "notifications.filter.boosts": "Споделяния",
+  "notifications.filter.boosts": "Подсилвания",
   "notifications.filter.favourites": "Любими",
   "notifications.filter.follows": "Последвания",
   "notifications.filter.mentions": "Споменавания",
@@ -428,7 +433,7 @@
   "notifications.group": "{count} известия",
   "notifications.mark_as_read": "Отбелязване на всички известия като прочетени",
   "notifications.permission_denied": "Известията на работния плот не са налични поради предварително отказана заявка за разрешение в браузъра",
-  "notifications.permission_denied_alert": "Известията на работния плот не могат да бъдат активирани, тъй като разрешението на браузъра е отказвано преди",
+  "notifications.permission_denied_alert": "Известията на работния плот не могат да се включат, тъй като разрешението на браузъра е отказвано преди",
   "notifications.permission_required": "Известията на работния плот ги няма, щото няма дадено нужното позволение.",
   "notifications_permission_banner.enable": "Включване на известията на работния плот",
   "notifications_permission_banner.how_to_control": "За да получавате известия, когато Mastodon не е отворен, включете известията на работния плот. Може да управлявате точно кои видове взаимодействия пораждат известия на работния плот чрез бутона {icon} по-горе, след като бъдат включени.",
@@ -436,7 +441,7 @@
   "picture_in_picture.restore": "Връщане обратно",
   "poll.closed": "Затворено",
   "poll.refresh": "Опресняване",
-  "poll.total_people": "{count, plural, one {# човек} other {# човека}}",
+  "poll.total_people": "{count, plural, one {# човек} other {# души}}",
   "poll.total_votes": "{count, plural, one {# глас} other {# гласа}}",
   "poll.vote": "Гласуване",
   "poll.voted": "Гласувахте за този отговор",
@@ -451,21 +456,21 @@
   "privacy.public.long": "Видимо за всички",
   "privacy.public.short": "Публично",
   "privacy.unlisted.long": "Видимо за всички, но не чрез възможността за откриване",
-  "privacy.unlisted.short": "Скрито",
+  "privacy.unlisted.short": "Несписъчно",
   "privacy_policy.last_updated": "Последно осъвременяване на {date}",
   "privacy_policy.title": "Политика за поверителност",
   "refresh": "Опресняване",
   "regeneration_indicator.label": "Зареждане…",
-  "regeneration_indicator.sublabel": "Вашият основен инфопоток се подготвя!",
+  "regeneration_indicator.sublabel": "Подготовка на началния ви инфоканал!",
   "relative_time.days": "{number} д.",
   "relative_time.full.days": "преди {number, plural, one {# ден} other {# дни}}",
   "relative_time.full.hours": "преди {number, plural, one {# час} other {# часа}}",
   "relative_time.full.just_now": "току-що",
   "relative_time.full.minutes": "преди {number, plural, one {# минута} other {# минути}}",
   "relative_time.full.seconds": "преди {number, plural, one {# секунда} other {# секунди}}",
-  "relative_time.hours": "{number} ч.",
+  "relative_time.hours": "{number}ч.",
   "relative_time.just_now": "сега",
-  "relative_time.minutes": "{number} мин.",
+  "relative_time.minutes": "{number}м.",
   "relative_time.seconds": "{number}с.",
   "relative_time.today": "днес",
   "reply_indicator.cancel": "Отказ",
@@ -481,23 +486,23 @@
   "report.close": "Готово",
   "report.comment.title": "Има ли нещо друго, което смятате, че трябва да знаем?",
   "report.forward": "Препращане до {target}",
-  "report.forward_hint": "Акаунтът е от друг сървър. Ще изпратите ли анонимно копие на доклада и там?",
+  "report.forward_hint": "Акаунтът е от друг сървър. Ще изпратите ли безимено копие на доклада и там?",
   "report.mute": "Заглушаване",
   "report.mute_explanation": "Няма да виждате публикациите на това лице. То още може да ви следва и да вижда публикациите ви и няма да знае, че е заглушено.",
   "report.next": "Напред",
   "report.placeholder": "Допълнителни коментари",
   "report.reasons.dislike": "Не ми харесва",
-  "report.reasons.dislike_description": "Не е нещо, които искам да виждам",
+  "report.reasons.dislike_description": "Не е нещо, което искате да виждате",
   "report.reasons.other": "Нещо друго е",
   "report.reasons.other_description": "Проблемът не попада в нито една от другите категории",
   "report.reasons.spam": "Спам е",
-  "report.reasons.spam_description": "Зловредни връзки, фалшиви взаимодействия, или повтарящи се отговори",
+  "report.reasons.spam_description": "Зловредни връзки, фалшиви ангажименти, или повтарящи се отговори",
   "report.reasons.violation": "Нарушава правилата на сървъра",
   "report.reasons.violation_description": "Знаете, че нарушава особени правила",
   "report.rules.subtitle": "Изберете всичко, което да се прилага",
   "report.rules.title": "Кои правила са нарушени?",
   "report.statuses.subtitle": "Изберете всичко, което да се прилага",
-  "report.statuses.title": "Има ли някакви публикации, подкрепящи този доклад?",
+  "report.statuses.title": "Има ли някакви публикации, подкрепящи доклада?",
   "report.submit": "Подаване",
   "report.target": "Докладване на {target}",
   "report.thanks.take_action": "Ето възможностите ви за управление какво виждате в Mastodon:",
@@ -505,8 +510,8 @@
   "report.thanks.title": "Не искате ли да виждате това?",
   "report.thanks.title_actionable": "Благодарности за докладването, ще го прегледаме.",
   "report.unfollow": "Стоп на следването на @{name}",
-  "report.unfollow_explanation": "Последвали сте този акаунт. За да не виждате повече публикациите му в основния си инфопоток, то спрете да го следвате.",
-  "report_notification.attached_statuses": "прикачено {count, plural, one {{count} публикация} other {{count} публикации}}",
+  "report.unfollow_explanation": "Последвали сте този акаунт. За да не виждате повече публикациите му в началния си инфопоток, спрете да го следвате.",
+  "report_notification.attached_statuses": "{count, plural, one {прикаченa {count} публикация} other {прикачени {count} публикации}}",
   "report_notification.categories.other": "Друго",
   "report_notification.categories.spam": "Спам",
   "report_notification.categories.violation": "Нарушение на правилото",
@@ -514,7 +519,7 @@
   "search.placeholder": "Търсене",
   "search.search_or_paste": "Търсене или поставяне на URL адрес",
   "search_popout.search_format": "Формат за разширено търсене",
-  "search_popout.tips.full_text": "Търсене с обикновен текст връща публикации, които сте написали, харесали, споделили, или в които сте били споменати, както и съвпадащи потребителски имена, показвани имена и хаштагове.",
+  "search_popout.tips.full_text": "Търсене с обикновен текст връща публикации, които сте написали, поставили в любими, споделили, или в които сте били споменати, както и съвпадащи потребителски имена, показвани имена и хаштагове.",
   "search_popout.tips.hashtag": "хаштаг",
   "search_popout.tips.status": "публикация",
   "search_popout.tips.text": "Обикновеният текст връща съответстващи показвани имена, потребителски имена и хаштагове",
@@ -524,7 +529,7 @@
   "search_results.hashtags": "Хаштагове",
   "search_results.nothing_found": "Не може да се намери каквото и да било за тези термини при търсене",
   "search_results.statuses": "Публикации",
-  "search_results.statuses_fts_disabled": "Търсенето на публикации по тяхното съдържание не е активирано за този Mastodon сървър.",
+  "search_results.statuses_fts_disabled": "Търсенето на публикации по съдържанието им не е включено в този сървър на Mastodon.",
   "search_results.title": "Търсене за {q}",
   "search_results.total": "{count, number} {count, plural, one {резултат} other {резултата}}",
   "server_banner.about_active_users": "Ползващите сървъра през последните 30 дни (дейните месечно потребители)",
@@ -537,11 +542,12 @@
   "sign_in_banner.sign_in": "Вход",
   "sign_in_banner.text": "Влезте, за да последвате профили или хаштагове, любимо, споделяне и отговаряне на публикации или взаимодействие от акаунта ви на друг сървър.",
   "status.admin_account": "Отваряне на интерфейс за модериране за @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_domain": "Отваряне на модериращия интерфейс за {domain}",
+  "status.admin_status": "Отваряне на публикацията в интерфейса за модериране",
   "status.block": "Блокиране на @{name}",
   "status.bookmark": "Отмятане",
-  "status.cancel_reblog_private": "Отсподеляне",
-  "status.cannot_reblog": "Тази публикация не може да бъде споделена",
+  "status.cancel_reblog_private": "Край на подсилването",
+  "status.cannot_reblog": "Публикация не може да се подсили",
   "status.copy": "Копиране на връзката към публикация",
   "status.delete": "Изтриване",
   "status.detailed_status": "Подробен изглед на разговора",
@@ -566,17 +572,17 @@
   "status.pin": "Закачане в профила",
   "status.pinned": "Закачена публикация",
   "status.read_more": "Още за четене",
-  "status.reblog": "Споделяне",
-  "status.reblog_private": "Споделяне с оригинална видимост",
-  "status.reblogged_by": "{name} сподели",
-  "status.reblogs.empty": "Все още никой не е споделил тази публикация. Когато някой го направи, ще се покаже тук.",
+  "status.reblog": "Подсилване",
+  "status.reblog_private": "Подсилване с оригиналната видимост",
+  "status.reblogged_by": "{name} подсили",
+  "status.reblogs.empty": "Още никого не е подсилвал публикацията. Подсилващият ще се покаже тук.",
   "status.redraft": "Изтриване и преработване",
   "status.remove_bookmark": "Премахване на отметката",
   "status.replied_to": "В отговор до {name}",
   "status.reply": "Отговор",
-  "status.replyAll": "Отговор на тема",
+  "status.replyAll": "Отговор на нишка",
   "status.report": "Докладване на @{name}",
-  "status.sensitive_warning": "Чувствително съдържание",
+  "status.sensitive_warning": "Деликатно съдържание",
   "status.share": "Споделяне",
   "status.show_filter_reason": "Покажи въпреки това",
   "status.show_less": "Показване на по-малко",
@@ -587,20 +593,20 @@
   "status.translate": "Превод",
   "status.translated_from_with": "Преведено от {lang}, използвайки {provider}",
   "status.uncached_media_warning": "Не е налично",
-  "status.unmute_conversation": "Раззаглушаване на разговор",
+  "status.unmute_conversation": "Без заглушаването на разговора",
   "status.unpin": "Разкачане от профила",
   "subscribed_languages.lead": "Публикации само на избрани езици ще се явяват в началото ви и в списъка с часови оси след промяната. Изберете \"нищо\", за да получавате публикации на всички езици.",
   "subscribed_languages.save": "Запазване на промените",
   "subscribed_languages.target": "Смяна на езика за {target}",
   "suggestions.dismiss": "Отхвърляне на предложение",
-  "suggestions.header": "Може да се интересувате от…",
-  "tabs_bar.federated_timeline": "Федерална",
+  "suggestions.header": "Може да имате интерес от…",
+  "tabs_bar.federated_timeline": "Федеративен",
   "tabs_bar.home": "Начало",
   "tabs_bar.local_timeline": "Местни",
   "tabs_bar.notifications": "Известия",
-  "time_remaining.days": "{number, plural, one {# ден} other {# дни}} остава",
-  "time_remaining.hours": "{number, plural, one {# час} other {# часа}} остава",
-  "time_remaining.minutes": "{number, plural, one {# минута} other {# минути}} остава",
+  "time_remaining.days": "{number, plural, one {остава # ден} other {остават # дни}}",
+  "time_remaining.hours": "{number, plural, one {остава # час} other {остават # часа}}",
+  "time_remaining.minutes": "{number, plural, one {остава # минута} other {остават # минути}}",
   "time_remaining.moments": "Оставащи моменти",
   "time_remaining.seconds": "{number, plural, one {# секунда} other {# секунди}} остава",
   "timeline_hint.remote_resource_not_displayed": "{resource} от други сървъри не се показват.",
@@ -615,22 +621,22 @@
   "units.short.thousand": "{count}хил",
   "upload_area.title": "Влачене и пускане за качване",
   "upload_button.label": "Добавете файл с образ, видео или звук",
-  "upload_error.limit": "Превишено ограничение за качване на файлове.",
+  "upload_error.limit": "Превишено ограничението за качване на файлове.",
   "upload_error.poll": "Качването на файлове не е позволено с анкети.",
-  "upload_form.audio_description": "Опишете за хора със загубен слух",
-  "upload_form.description": "Опишете за хора със зрително увреждане",
-  "upload_form.description_missing": "Няма добавено описание",
+  "upload_form.audio_description": "Опишете за хора, които са глухи или трудно чуват",
+  "upload_form.description": "Опишете за хора, които са слепи или имат слабо зрение",
+  "upload_form.description_missing": "Няма добавен опис",
   "upload_form.edit": "Редактиране",
   "upload_form.thumbnail": "Промяна на миниобраза",
   "upload_form.undo": "Изтриване",
-  "upload_form.video_description": "Опишете за хора със загубен слух или зрително увреждане",
-  "upload_modal.analyzing_picture": "Анализ на снимка…",
+  "upload_form.video_description": "Опишете за хора, които са глухи или трудно чуват, слепи или имат слабо зрение",
+  "upload_modal.analyzing_picture": "Снимков анализ…",
   "upload_modal.apply": "Прилагане",
   "upload_modal.applying": "Прилагане…",
   "upload_modal.choose_image": "Избор на образ",
   "upload_modal.description_placeholder": "Ах, чудна българска земьо, полюшвай цъфтящи жита",
   "upload_modal.detect_text": "Откриване на текст от картина",
-  "upload_modal.edit_media": "Редакция на мултимедия",
+  "upload_modal.edit_media": "Промяна на мултимедия",
   "upload_modal.hint": "Щракнете или плъзнете кръга на визуализацията, за да изберете фокусна точка, която винаги ще бъде видима на всички миниатюри.",
   "upload_modal.preparing_ocr": "Подготовка за оптично разпознаване на знаци…",
   "upload_modal.preview_label": "Нагледно ({ratio})",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index 6e33bf789..e4e240423 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "টুট এবং মতামত",
   "account.report": "@{name} কে রিপোর্ট করুন",
   "account.requested": "অনুমতির অপেক্ষা। অনুসরণ করার অনুরোধ বাতিল করতে এখানে ক্লিক করুন",
+  "account.requested_follow": "{name} আপনাকে অনুসরণ করার জন্য অনুরোধ করেছে",
   "account.share": "@{name} র প্রোফাইল অন্যদের দেখান",
   "account.show_reblogs": "@{name} র সমর্থনগুলো দেখান",
   "account.statuses_counter": "{count, plural,one {{counter} টুট} other {{counter} টুট}}",
@@ -70,7 +71,7 @@
   "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
   "admin.dashboard.retention.average": "Average",
   "admin.dashboard.retention.cohort": "Sign-up month",
-  "admin.dashboard.retention.cohort_size": "New users",
+  "admin.dashboard.retention.cohort_size": "নতুন ব্যবহারকারী",
   "alert.rate_limited.message": "{retry_time, time, medium} -এর পরে আবার প্রচেষ্টা করুন।",
   "alert.rate_limited.title": "হার সীমিত",
   "alert.unexpected.message": "সমস্যা অপ্রত্যাশিত.",
@@ -123,11 +124,11 @@
   "community.column_settings.local_only": "শুধুমাত্র স্থানীয়",
   "community.column_settings.media_only": "শুধুমাত্র ছবি বা ভিডিও",
   "community.column_settings.remote_only": "শুধুমাত্র দূরবর্তী",
-  "compose.language.change": "Change language",
+  "compose.language.change": "ভাষা পরিবর্তন করুন",
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "আরো জানুন",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "কোনো হ্যাশট্যাগের ভেতরে এই টুটটি থাকবেনা কারণ এটি তালিকাবহির্ভূত। শুধুমাত্র প্রকাশ্য ঠোটগুলো হ্যাশট্যাগের ভেতরে খুঁজে পাওয়া যাবে।",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "আপনার নিবন্ধনে তালা দেওয়া নেই, যে কেও আপনাকে অনুসরণ করতে পারবে এবং অনুশারকদের জন্য লেখা দেখতে পারবে।",
   "compose_form.lock_disclaimer.lock": "তালা দেওয়া",
   "compose_form.placeholder": "আপনি কি ভাবছেন ?",
@@ -137,7 +138,7 @@
   "compose_form.poll.remove_option": "এই বিকল্পটি মুছে ফেলুন",
   "compose_form.poll.switch_to_multiple": "একাধিক পছন্দ অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
   "compose_form.poll.switch_to_single": "একটি একক পছন্দের অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
-  "compose_form.publish": "Publish",
+  "compose_form.publish": "প্রকাশ করুন",
   "compose_form.publish_form": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "স্টেকট্রেস ক্লিপবোর্ডে কপি করুন",
   "errors.unexpected_crash.report_issue": "সমস্যার প্রতিবেদন করুন",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "সংবাদ",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -269,7 +274,7 @@
   "getting_started.heading": "শুরু করা",
   "hashtag.column_header.tag_mode.all": "এবং {additional}",
   "hashtag.column_header.tag_mode.any": "অথবা {additional}",
-  "hashtag.column_header.tag_mode.none": "বাদ দিয়ে {additional}",
+  "hashtag.column_header.tag_mode.none": "{additional} বাদ দিয়ে",
   "hashtag.column_settings.select.no_options_message": "কোনটা পাওয়া যায় নি",
   "hashtag.column_settings.select.placeholder": "হ্যাশট্যাগের ভেতরে ঢুকুন…",
   "hashtag.column_settings.tag_mode.all": "এগুলো সব",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "@{name} র জন্য পরিচালনার ইন্টারফেসে ঢুকুন",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "যায় লেখাটি পরিচালনার ইন্টারফেসে খুলুন",
   "status.block": "@{name} কে ব্লক করুন",
   "status.bookmark": "বুকমার্ক",
@@ -553,7 +559,7 @@
   "status.favourite": "পছন্দের করতে",
   "status.filter": "Filter this post",
   "status.filtered": "ছাঁকনিদিত",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "আরো দেখুন",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index e046824b6..51523ab22 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Toudoù ha respontoù",
   "account.report": "Disklêriañ @{name}",
   "account.requested": "O c'hortoz an asant. Klikit evit nullañ ar goulenn heuliañ",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Skignañ profil @{name}",
   "account.show_reblogs": "Diskouez skignadennoù @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toud} two {{counter} Doud} other {{counter} a Doudoù}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Klask yezhoù...",
   "compose_form.direct_message_warning_learn_more": "Gouzout hiroc'h",
   "compose_form.encryption_warning": "Toudoù war Mastodon na vezont ket sifret penn-da-benn. Na rannit ket titouroù kizidik dre Mastodon.",
-  "compose_form.hashtag_warning": "Ne vo ket listennet an toud-mañ dindan gerioù-klik ebet dre m'eo anlistennet. N'eus nemet an toudoù foran a c'hall bezañ klasket dre c'her-klik.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "N'eo ket {locked} ho kont. An holl a c'hal ho heuliañ evit gwelet ho toudoù prevez.",
   "compose_form.lock_disclaimer.lock": "prennet",
   "compose_form.placeholder": "Petra emaoc'h o soñjal e-barzh ?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Eilañ ar roudoù diveugañ er golver",
   "errors.unexpected_crash.report_issue": "Danevellañ ur fazi",
   "explore.search_results": "Disoc'hoù an enklask",
+  "explore.suggested_follows": "For you",
   "explore.title": "Furchal",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Kenarroud digenglotus !",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Kevreañ",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Digeriñ etrefas evezherezh evit @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Digeriñ an toud e-barzh an etrefas evezherezh",
   "status.block": "Berzañ @{name}",
   "status.bookmark": "Ouzhpennañ d'ar sinedoù",
@@ -553,7 +559,7 @@
   "status.favourite": "Muiañ-karet",
   "status.filter": "Silañ ar c'hannad-mañ",
   "status.filtered": "Silet",
-  "status.hide": "Kuzhat ar c'hannad",
+  "status.hide": "Hide post",
   "status.history.created": "Krouet gant {name} {date}",
   "status.history.edited": "Kemmet gant {name} {date}",
   "status.load_more": "Kargañ muioc'h",
diff --git a/app/javascript/mastodon/locales/bs.json b/app/javascript/mastodon/locales/bs.json
index 3e3a5243e..ef30c76da 100644
--- a/app/javascript/mastodon/locales/bs.json
+++ b/app/javascript/mastodon/locales/bs.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Posts and replies",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval. Click to cancel follow request",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 6b1743d61..dbc1af4b1 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -21,18 +21,18 @@
   "account.browse_more_on_origin_server": "Navega més en el perfil original",
   "account.cancel_follow_request": "Retira la sol·licitud de seguiment",
   "account.direct": "Missatge directe a @{name}",
-  "account.disable_notifications": "No em notifiquis les publicacions de @{name}",
+  "account.disable_notifications": "Deixa de notificar-me els tuts de @{name}",
   "account.domain_blocked": "Domini blocat",
   "account.edit_profile": "Edita el perfil",
-  "account.enable_notifications": "Notifica'm les publicacions de @{name}",
+  "account.enable_notifications": "Notifica'm els tuts de @{name}",
   "account.endorse": "Recomana en el perfil",
   "account.featured_tags.last_status_at": "Darrera publicació el {date}",
-  "account.featured_tags.last_status_never": "No hi ha publicacions",
+  "account.featured_tags.last_status_never": "No hi ha tuts",
   "account.featured_tags.title": "etiquetes destacades de {name}",
   "account.follow": "Segueix",
   "account.followers": "Seguidors",
   "account.followers.empty": "A aquest usuari encara no el segueix ningú.",
-  "account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidors}}",
+  "account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidors}}",
   "account.following": "Seguint",
   "account.following_counter": "{count, plural, other {Seguint-ne {counter}}}",
   "account.follows.empty": "Aquest usuari encara no segueix ningú.",
@@ -54,9 +54,10 @@
   "account.posts_with_replies": "Tuts i respostes",
   "account.report": "Informa sobre @{name}",
   "account.requested": "S'espera l'aprovació. Clica per a cancel·lar la petició de seguiment",
+  "account.requested_follow": "{name} ha demanat de seguir-te",
   "account.share": "Comparteix el perfil de @{name}",
   "account.show_reblogs": "Mostra els impulsos de @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Publicació} other {{counter} Publicacions}}",
+  "account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}",
   "account.unblock": "Desbloca @{name}",
   "account.unblock_domain": "Desbloca el domini {domain}",
   "account.unblock_short": "Desbloca",
@@ -104,7 +105,7 @@
   "column.direct": "Missatges directes",
   "column.directory": "Navega pels perfils",
   "column.domain_blocks": "Dominis blocats",
-  "column.favourites": "Preferits",
+  "column.favourites": "Favorits",
   "column.follow_requests": "Peticions de seguir-te",
   "column.home": "Inici",
   "column.lists": "Llistes",
@@ -126,9 +127,9 @@
   "compose.language.change": "Canvia d'idioma",
   "compose.language.search": "Cerca idiomes...",
   "compose_form.direct_message_warning_learn_more": "Més informació",
-  "compose_form.encryption_warning": "Les publicacions a Mastodon no estant xifrades punt a punt. No comparteixis informació sensible mitjançant Mastodon.",
-  "compose_form.hashtag_warning": "Aquesta publicació no es mostrarà en cap etiqueta, ja que no està llistada. Només les publicacions públiques es poden cercar per etiqueta.",
-  "compose_form.lock_disclaimer": "El teu compte no està {locked}. Tothom pot seguir-te i veure les publicacions de només per a seguidors.",
+  "compose_form.encryption_warning": "Els tuts a Mastodon no estant xifrats punt a punt. No comparteixis informació sensible mitjançant Mastodon.",
+  "compose_form.hashtag_warning": "Aquest tut no es mostrarà en cap etiqueta, ja que no és públic. Només els tuts públics es poden cercar per etiqueta.",
+  "compose_form.lock_disclaimer": "El teu compte no està {locked}. Tothom pot seguir-te i veure els tuts de només per a seguidors.",
   "compose_form.lock_disclaimer.lock": "blocat",
   "compose_form.placeholder": "Què et passa pel cap?",
   "compose_form.poll.add_option": "Afegeix una opció",
@@ -137,11 +138,11 @@
   "compose_form.poll.remove_option": "Elimina aquesta opció",
   "compose_form.poll.switch_to_multiple": "Canvia l’enquesta per a permetre diverses opcions",
   "compose_form.poll.switch_to_single": "Canvia l’enquesta per a permetre una única opció",
-  "compose_form.publish": "Publica",
+  "compose_form.publish": "Tut",
   "compose_form.publish_form": "Publica",
-  "compose_form.publish_loud": "{publish}!",
+  "compose_form.publish_loud": "Tut!",
   "compose_form.save_changes": "Desa els canvis",
-  "compose_form.sensitive.hide": "{count, plural, one {Marca el contingut com a sensible} other {Marca el contingut com a sensible}}",
+  "compose_form.sensitive.hide": "{count, plural, one {Marca mèdia com a sensible} other {Marca mèdia com a sensible}}",
   "compose_form.sensitive.marked": "{count, plural, one {Contingut marcat com a sensible} other {Contingut marcat com a sensible}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Contingut no marcat com a sensible} other {Contingut no marcat com a sensible}}",
   "compose_form.spoiler.marked": "Elimina l'avís de contingut",
@@ -164,7 +165,7 @@
   "confirmations.logout.confirm": "Tanca la sessió",
   "confirmations.logout.message": "Segur que vols tancar la sessió?",
   "confirmations.mute.confirm": "Silencia",
-  "confirmations.mute.explanation": "Això amagarà les seves publicacions i les que els mencionen, però encara els permetrà veure les teves i seguir-te.",
+  "confirmations.mute.explanation": "Això amagarà els tuts d'ells i els d'els que els mencionin, però encara els permetrà veure els teus tuts i seguir-te.",
   "confirmations.mute.message": "Segur que vols silenciar {name}?",
   "confirmations.redraft.confirm": "Elimina i reescriu-la",
   "confirmations.redraft.message": "Segur que vols eliminar aquesta publicació i tornar-la a escriure? Es perdran tots els impulsos i els favorits, i les respostes a la publicació original quedaran aïllades.",
@@ -181,16 +182,16 @@
   "directory.federated": "Del fedivers conegut",
   "directory.local": "Només de {domain}",
   "directory.new_arrivals": "Arribades noves",
-  "directory.recently_active": "Recentment actius",
+  "directory.recently_active": "Actius recentment",
   "disabled_account_banner.account_settings": "Paràmetres del compte",
-  "disabled_account_banner.text": "El teu compte {disabledAccount} està actualment desactivat.",
-  "dismissable_banner.community_timeline": "Aquestes són les publicacions més recents d'usuaris amb el compte a {domain}.",
+  "disabled_account_banner.text": "El teu compte {disabledAccount} està desactivat.",
+  "dismissable_banner.community_timeline": "Aquests són els tuts públics més recents d'usuaris amb els seus comptes a {domain}.",
   "dismissable_banner.dismiss": "Ometre",
   "dismissable_banner.explore_links": "Gent d'aquest i d'altres servidors de la xarxa descentralitzada estan comentant ara mateix aquestes notícies.",
-  "dismissable_banner.explore_statuses": "Aquestes publicacions d'aquest i altres servidors de la xarxa descentralitzada estan guanyant l'atenció ara mateix en aquest servidor.",
+  "dismissable_banner.explore_statuses": "Aquests tuts d'aquest i altres servidors de la xarxa descentralitzada estan guanyant l'atenció ara mateix en aquest servidor.",
   "dismissable_banner.explore_tags": "Aquestes etiquetes estan guanyant ara mateix l'atenció dels usuaris d'aquest i altres servidors de la xarxa descentralitzada.",
-  "dismissable_banner.public_timeline": "Aquestes són les publicacions públiques més recents de persones en aquest i altres servidors de la xarxa descentralitzada que aquest servidor coneix.",
-  "embed.instructions": "Incrusta aquesta publicació a la teva pàgina web copiant el codi següent.",
+  "dismissable_banner.public_timeline": "Aquestes són els tuts públics més recents de persones en aquest i altres servidors de la xarxa descentralitzada que aquest servidor coneix.",
+  "embed.instructions": "Incrusta aquest tut a la teva pàgina web copiant el codi següent.",
   "embed.preview": "Aquest aspecte tindrà:",
   "emoji_button.activity": "Activitat",
   "emoji_button.clear": "Neteja",
@@ -211,19 +212,19 @@
   "empty_column.account_timeline": "No hi ha tuts aquí!",
   "empty_column.account_unavailable": "Perfil no disponible",
   "empty_column.blocks": "Encara no has blocat cap usuari.",
-  "empty_column.bookmarked_statuses": "Encara no has marcat cap publicació com a preferida. Quan en marquis una, apareixerà aquí.",
+  "empty_column.bookmarked_statuses": "Encara no tens marcada cap publicació. Quan en marquis una apareixerà aquí.",
   "empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per posar-ho tot en marxa!",
-  "empty_column.direct": "Encara no teniu missatges directes. Quan n'envieu o en rebeu, sortiran aquí.",
+  "empty_column.direct": "Encara no tens missatges directes. Quan n'enviïs o en rebis un, sortirà aquí.",
   "empty_column.domain_blocks": "Encara no hi ha dominis blocats.",
   "empty_column.explore_statuses": "No hi ha res en tendència ara mateix. Revisa-ho més tard!",
-  "empty_column.favourited_statuses": "Encara no has afavorit cap publicació. Quan ho facis, apareixerà aquí.",
+  "empty_column.favourited_statuses": "Encara no has afavorit cap tut. Quan ho facis, apareixerà aquí.",
   "empty_column.favourites": "Encara no ha marcat ningú aquesta publicació com a preferida. Quan ho faci algú apareixerà aquí.",
-  "empty_column.follow_recommendations": "Sembla que no s'han pogut generar suggeriments per a tu. Pots provar d'usar la cerca per trobar persones que vulguis conèixer o explorar les etiquetes en tendència.",
+  "empty_column.follow_recommendations": "Sembla que no s'han pogut generar suggeriments per a tu. Pots provar d'usar la cerca per a trobar persones que vulguis conèixer o explorar les etiquetes en tendència.",
   "empty_column.follow_requests": "Encara no tens cap petició de seguiment. Quan en rebis una, apareixerà aquí.",
   "empty_column.hashtag": "Encara no hi ha res en aquesta etiqueta.",
   "empty_column.home": "La teva línia de temps és buida! Segueix més gent per a emplenar-la. {suggestions}",
   "empty_column.home.suggestions": "Mostra alguns suggeriments",
-  "empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres facin noves publicacions, apareixeran aquí.",
+  "empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres facin nous tuts, apareixeran aquí.",
   "empty_column.lists": "Encara no tens cap llista. Quan en facis una, apareixerà aquí.",
   "empty_column.mutes": "Encara no has silenciat cap usuari.",
   "empty_column.notifications": "Encara no tens notificacions. Quan altre gent interactuï amb tu, les veuràs aquí.",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copia stacktrace al porta-retalls",
   "errors.unexpected_crash.report_issue": "Informa d'un problema",
   "explore.search_results": "Resultats de la cerca",
+  "explore.suggested_follows": "Per a tu",
   "explore.title": "Explora",
+  "explore.trending_links": "Notícies",
+  "explore.trending_statuses": "Tuts",
+  "explore.trending_tags": "Etiquetes",
   "filter_modal.added.context_mismatch_explanation": "Aquesta categoria de filtre no s'aplica al context en què has accedit a aquesta publicació. Si també vols que la publicació es filtri en aquest context, hauràs d'editar el filtre.",
   "filter_modal.added.context_mismatch_title": "El context no coincideix!",
   "filter_modal.added.expired_explanation": "La categoria d'aquest filtre ha caducat, necessitaràs canviar la seva data de caducitat per a aplicar-la.",
@@ -251,10 +256,10 @@
   "filter_modal.select_filter.search": "Cerca o crea",
   "filter_modal.select_filter.subtitle": "Usa una categoria existent o crea'n una de nova",
   "filter_modal.select_filter.title": "Filtra aquesta publicació",
-  "filter_modal.title.status": "Filtra una publicació",
+  "filter_modal.title.status": "Filtra un tut",
   "follow_recommendations.done": "Fet",
   "follow_recommendations.heading": "Segueix a la gent de la que t'agradaria veure els seus tuts! Aquí hi ha algunes recomanacions.",
-  "follow_recommendations.lead": "Les publicacions dels usuaris que segueixes es mostraran en ordre cronològic en la teva línia de temps d'Inici. No tinguis por de cometre errors, pots deixar de seguir-los en qualsevol moment!",
+  "follow_recommendations.lead": "Els tuts dels usuaris que segueixes es mostraran en ordre cronològic en la teva línia de temps Inici. No tinguis por en cometre errors, pots fàcilment deixar de seguir-los en qualsevol moment!",
   "follow_request.authorize": "Autoritza",
   "follow_request.reject": "Rebutja",
   "follow_requests.unlocked_explanation": "Tot i que el teu compte no està blocat, el personal de {domain} ha pensat que és possible que vulguis revisar manualment les sol·licituds de seguiment d’aquests comptes.",
@@ -284,14 +289,14 @@
   "home.hide_announcements": "Amaga els anuncis",
   "home.show_announcements": "Mostra els anuncis",
   "interaction_modal.description.favourite": "Amb un compte a Mastodon pots afavorir aquesta publicació, que l'autor sàpiga que t'ha agradat i desar-la per a més endavant.",
-  "interaction_modal.description.follow": "Amb un compte a Mastodon, pots seguir a {name} per a rebre les seves publicacions en la teva línia de temps d'Inici.",
+  "interaction_modal.description.follow": "Amb un compte a Mastodon, pots seguir a {name} per a rebre els seus tuts en la teva línia de temps d'Inici.",
   "interaction_modal.description.reblog": "Amb un compte a Mastodon, pots impulsar aquesta publicació per a compartir-la amb els teus seguidors.",
-  "interaction_modal.description.reply": "Amb un compte a Mastodon, pots respondre aquesta publicació.",
-  "interaction_modal.on_another_server": "En un servidor diferent",
+  "interaction_modal.description.reply": "Amb un compte a Mastodon, pots respondre aquest tut.",
+  "interaction_modal.on_another_server": "A un altre servidor",
   "interaction_modal.on_this_server": "En aquest servidor",
-  "interaction_modal.other_server_instructions": "Copia i enganxa aquesta URL en el camp de cerca de la teva aplicació Mastodon preferida o en l'interfície web del teu servidor Mastodon.",
+  "interaction_modal.other_server_instructions": "Copia i enganxa aquest URL en el camp de cerca de la teva aplicació Mastodon preferida o a la interfície web del teu servidor Mastodon.",
   "interaction_modal.preamble": "Com que Mastodon és descentralitzat, pots fer servir el teu compte existent en un altre servidor Mastodon o plataforma compatible si no tens compte en aquest.",
-  "interaction_modal.title.favourite": "Marca la publicació de {name}",
+  "interaction_modal.title.favourite": "Marca el tut de {name}",
   "interaction_modal.title.follow": "Segueix {name}",
   "interaction_modal.title.reblog": "Impulsa la publicació de {name}",
   "interaction_modal.title.reply": "Respon a la publicació de {name}",
@@ -300,15 +305,15 @@
   "intervals.full.minutes": "{number, plural, one {# minut} other {# minuts}}",
   "keyboard_shortcuts.back": "Vés enrere",
   "keyboard_shortcuts.blocked": "Obre la llista d'usuaris blocats",
-  "keyboard_shortcuts.boost": "Impulsa la publicació",
+  "keyboard_shortcuts.boost": "Impulsa el tut",
   "keyboard_shortcuts.column": "Centra la columna",
   "keyboard_shortcuts.compose": "Centra l'àrea de composició de text",
   "keyboard_shortcuts.description": "Descripció",
-  "keyboard_shortcuts.direct": "per a obrir la columna de missatges directes",
+  "keyboard_shortcuts.direct": "Obre la columna de missatges directes",
   "keyboard_shortcuts.down": "Abaixa a la llista",
   "keyboard_shortcuts.enter": "Obre la publicació",
   "keyboard_shortcuts.favourite": "Afavoreix la publicació",
-  "keyboard_shortcuts.favourites": "Obre la llista de favorits",
+  "keyboard_shortcuts.favourites": "Obre la llista de preferits",
   "keyboard_shortcuts.federated": "Obre la línia de temps federada",
   "keyboard_shortcuts.heading": "Dreceres de teclat",
   "keyboard_shortcuts.home": "Obre la línia de temps de l'Inici",
@@ -319,10 +324,10 @@
   "keyboard_shortcuts.muted": "Obre la llista d'usuaris silenciats",
   "keyboard_shortcuts.my_profile": "Obre el teu perfil",
   "keyboard_shortcuts.notifications": "Obre la columna de notificacions",
-  "keyboard_shortcuts.open_media": "Obre el contingut",
-  "keyboard_shortcuts.pinned": "Obre la llista de publicacions fixades",
+  "keyboard_shortcuts.open_media": "Obre mèdia",
+  "keyboard_shortcuts.pinned": "Obre la llista de tuts fixats",
   "keyboard_shortcuts.profile": "Obre el perfil de l'autor",
-  "keyboard_shortcuts.reply": "Respon a la publicació",
+  "keyboard_shortcuts.reply": "Respon al tut",
   "keyboard_shortcuts.requests": "Obre la llista de sol·licituds de seguiment",
   "keyboard_shortcuts.search": "Centra la barra de cerca",
   "keyboard_shortcuts.spoilers": "Mostra/amaga el camp CW",
@@ -365,7 +370,7 @@
   "navigation_bar.blocks": "Usuaris blocats",
   "navigation_bar.bookmarks": "Marcadors",
   "navigation_bar.community_timeline": "Línia de temps local",
-  "navigation_bar.compose": "Redacta una nova publicació",
+  "navigation_bar.compose": "Redacta un tut",
   "navigation_bar.direct": "Missatges directes",
   "navigation_bar.discover": "Descobreix",
   "navigation_bar.domain_blocks": "Dominis blocats",
@@ -401,7 +406,7 @@
   "notifications.column_settings.admin.report": "Nous informes:",
   "notifications.column_settings.admin.sign_up": "Nous registres:",
   "notifications.column_settings.alert": "Notificacions d'escriptori",
-  "notifications.column_settings.favourite": "Preferits:",
+  "notifications.column_settings.favourite": "Favorits:",
   "notifications.column_settings.filter_bar.advanced": "Mostra totes les categories",
   "notifications.column_settings.filter_bar.category": "Barra ràpida de filtres",
   "notifications.column_settings.filter_bar.show_bar": "Mostra la barra de filtres",
@@ -413,7 +418,7 @@
   "notifications.column_settings.reblog": "Impulsos:",
   "notifications.column_settings.show": "Mostra a la columna",
   "notifications.column_settings.sound": "Reprodueix so",
-  "notifications.column_settings.status": "Noves publicacions:",
+  "notifications.column_settings.status": "Nous tuts:",
   "notifications.column_settings.unread_notifications.category": "Notificacions no llegides",
   "notifications.column_settings.unread_notifications.highlight": "Destaca les notificacions no llegides",
   "notifications.column_settings.update": "Edicions:",
@@ -470,20 +475,20 @@
   "relative_time.today": "avui",
   "reply_indicator.cancel": "Cancel·la",
   "report.block": "Bloca",
-  "report.block_explanation": "No veuràs les seves publicacions. Ell no podran veure les teves ni seguir-te. Podran saber que estan blocats.",
+  "report.block_explanation": "No veuràs els seus tuts. Ells no podran veure els teus tuts ni et podran seguir. Podran saber que estan blocats.",
   "report.categories.other": "Altres",
   "report.categories.spam": "Brossa",
   "report.categories.violation": "El contingut viola una o més regles del servidor",
   "report.category.subtitle": "Tria la millor coincidència",
   "report.category.title": "Explica'ns què passa amb això ({type})",
   "report.category.title_account": "perfil",
-  "report.category.title_status": "publicació",
+  "report.category.title_status": "tut",
   "report.close": "Fet",
   "report.comment.title": "Hi ha res més que creguis que hauríem de saber?",
   "report.forward": "Reenvia a {target}",
   "report.forward_hint": "El compte és d'un altre servidor. Vols enviar-hi també una còpia anònima de l'informe?",
   "report.mute": "Silencia",
-  "report.mute_explanation": "No veuràs les seves publicacions. Encara pot seguir-te i veure les teves publicacions, però no sabrà que ha estat silenciat.",
+  "report.mute_explanation": "No veuràs els seus tuts. Encara poden seguir-te i veure els teus tuts, però no sabran que han estat silenciats.",
   "report.next": "Següent",
   "report.placeholder": "Comentaris addicionals",
   "report.reasons.dislike": "No m'agrada",
@@ -497,7 +502,7 @@
   "report.rules.subtitle": "Selecciona totes les aplicables",
   "report.rules.title": "Quines regles s'han violat?",
   "report.statuses.subtitle": "Selecciona totes les aplicables",
-  "report.statuses.title": "Hi ha cap publicació que doni suport a aquest informe?",
+  "report.statuses.title": "Hi ha cap tut que doni suport a aquest informe?",
   "report.submit": "Envia",
   "report.target": "Es reporta {target}",
   "report.thanks.take_action": "Aquestes són les teves opcions per a controlar el que veus a Mastodon:",
@@ -505,8 +510,8 @@
   "report.thanks.title": "No ho vols veure?",
   "report.thanks.title_actionable": "Gràcies per informar, ho investigarem.",
   "report.unfollow": "Deixa de seguir @{name}",
-  "report.unfollow_explanation": "Segueixes aquest compte. Per no veure les seves publicacions a la teva línia de temps d'Inici deixa de seguir-lo.",
-  "report_notification.attached_statuses": "{count, plural, one {{count} publicació adjunta} other {{count} publicacions adjuntes}}",
+  "report.unfollow_explanation": "Estàs seguint aquest compte. Per no veure els seus tuts a la teva línia de temps d'Inici, deixa de seguir-lo.",
+  "report_notification.attached_statuses": "{count, plural, one {{count} tut} other {{count} tuts}} adjunts",
   "report_notification.categories.other": "Altres",
   "report_notification.categories.spam": "Brossa",
   "report_notification.categories.violation": "Violació de norma",
@@ -514,17 +519,17 @@
   "search.placeholder": "Cerca",
   "search.search_or_paste": "Cerca o escriu l'URL",
   "search_popout.search_format": "Format de cerca avançada",
-  "search_popout.tips.full_text": "Text simple recupera publicacions que has escrit, les marcades com a preferides, les impulsades o en les que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.",
+  "search_popout.tips.full_text": "Text simple recupera tuts que has escrit, els marcats com a favorits, els impulsats o en els que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.",
   "search_popout.tips.hashtag": "etiqueta",
-  "search_popout.tips.status": "publicació",
+  "search_popout.tips.status": "tut",
   "search_popout.tips.text": "El text simple recupera coincidències amb els usuaris, els noms d'usuari i les etiquetes",
   "search_popout.tips.user": "usuari",
   "search_results.accounts": "Gent",
   "search_results.all": "Tots",
   "search_results.hashtags": "Etiquetes",
   "search_results.nothing_found": "No s'ha pogut trobar res per a aquests termes de cerca",
-  "search_results.statuses": "Publicacions",
-  "search_results.statuses_fts_disabled": "La cerca de publicacions pel seu contingut no està habilitada en aquest servidor Mastodon.",
+  "search_results.statuses": "Tuts",
+  "search_results.statuses_fts_disabled": "La cerca de tuts pel seu contingut no està habilitada en aquest servidor Mastodon.",
   "search_results.title": "Cerca de {q}",
   "search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
   "server_banner.about_active_users": "Gent que ha fet servir aquest servidor en els darrers 30 dies (Usuaris Actius Mensuals)",
@@ -533,16 +538,17 @@
   "server_banner.introduction": "{domain} és part de la xarxa social descentralitzada, potenciat per {mastodon}.",
   "server_banner.learn_more": "Més informació",
   "server_banner.server_stats": "Estadístiques del servidor:",
-  "sign_in_banner.create_account": "Crea un compte",
+  "sign_in_banner.create_account": "Registra'm",
   "sign_in_banner.sign_in": "Inicia sessió",
-  "sign_in_banner.text": "Inicia la sessió per seguir perfils o etiquetes, afavorir, compartir i respondre a publicacions o interactuar des del teu compte en un servidor diferent.",
+  "sign_in_banner.text": "Inicia la sessió per a seguir perfils o etiquetes, afavorir, compartir i respondre tuts o interactuar des del teu compte en un servidor diferent.",
   "status.admin_account": "Obre la interfície de moderació per a @{name}",
-  "status.admin_status": "Obre aquesta publicació a la interfície de moderació",
+  "status.admin_domain": "Obre la interfície de moderació per a @{domain}",
+  "status.admin_status": "Obrir aquest tut a la interfície de moderació",
   "status.block": "Bloca @{name}",
   "status.bookmark": "Marca",
   "status.cancel_reblog_private": "Desfés l'impuls",
-  "status.cannot_reblog": "No es pot impulsar aquesta publicació",
-  "status.copy": "Copia l'enllaç a la publicació",
+  "status.cannot_reblog": "No es pot impulsar aquest tut",
+  "status.copy": "Copia l'enllaç al tut",
   "status.delete": "Elimina",
   "status.detailed_status": "Vista detallada de la conversa",
   "status.direct": "Missatge directe a @{name}",
@@ -550,10 +556,10 @@
   "status.edited": "Editat {date}",
   "status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}",
   "status.embed": "Incrusta",
-  "status.favourite": "Preferit",
-  "status.filter": "Filtra aquesta publicació",
+  "status.favourite": "Favorit",
+  "status.filter": "Filtra aquest tut",
   "status.filtered": "Filtrada",
-  "status.hide": "Amaga la publicació",
+  "status.hide": "Amaga el tut",
   "status.history.created": "creat per {name} {date}",
   "status.history.edited": "editat per {name} {date}",
   "status.load_more": "Carrega'n més",
@@ -562,9 +568,9 @@
   "status.more": "Més",
   "status.mute": "Silencia @{name}",
   "status.mute_conversation": "Silencia la conversa",
-  "status.open": "Amplia la publicació",
+  "status.open": "Amplia el tut",
   "status.pin": "Fixa en el perfil",
-  "status.pinned": "Publicació fixada",
+  "status.pinned": "Tut fixat",
   "status.read_more": "Més informació",
   "status.reblog": "Impulsa",
   "status.reblog_private": "Impulsa amb la visibilitat original",
@@ -589,7 +595,7 @@
   "status.uncached_media_warning": "No està disponible",
   "status.unmute_conversation": "Deixa de silenciar la conversa",
   "status.unpin": "Desfixa del perfil",
-  "subscribed_languages.lead": "Només les publicacions en les llengües seleccionades apareixeran en les teves línies de temps \"Inici\" i \"Llistes\" després del canvi. No en seleccionis cap per a rebre publicacions en totes les llengües.",
+  "subscribed_languages.lead": "Només els tuts en les llengües seleccionades apareixeran en les teves línies de temps \"Inici\" i \"Llistes\" després del canvi. No en seleccionis cap per a rebre tuts en totes les llengües.",
   "subscribed_languages.save": "Desa els canvis",
   "subscribed_languages.target": "Canvia les llengües subscrites per a {target}",
   "suggestions.dismiss": "Ignora el suggeriment",
@@ -610,27 +616,27 @@
   "trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} persones}} en {days, plural, one {el passat dia} other {els passats {days} dies}}",
   "trends.trending_now": "És tendència",
   "ui.beforeunload": "El teu esborrany es perdrà si surts de Mastodon.",
-  "units.short.billion": "{count} B",
-  "units.short.million": "{count} M",
-  "units.short.thousand": "{count} K",
+  "units.short.billion": "{count}B",
+  "units.short.million": "{count}M",
+  "units.short.thousand": "{count}K",
   "upload_area.title": "Arrossega i deixa anar per a carregar",
   "upload_button.label": "Afegeix imatges, un vídeo o un fitxer d'àudio",
   "upload_error.limit": "S'ha superat el límit de càrrega d'arxius.",
   "upload_error.poll": "No es permet carregar fitxers a les enquestes.",
-  "upload_form.audio_description": "Descripció per a persones amb discapacitat auditiva",
-  "upload_form.description": "Descripció per a persones amb discapacitat visual",
+  "upload_form.audio_description": "Descriu-ho per a persones amb problemes d'audició",
+  "upload_form.description": "Descriu-ho per a persones amb problemes de visió",
   "upload_form.description_missing": "No s'hi ha afegit cap descripció",
   "upload_form.edit": "Edita",
   "upload_form.thumbnail": "Canvia la miniatura",
   "upload_form.undo": "Elimina",
-  "upload_form.video_description": "Descripció per a persones amb discapacitat auditiva o amb discapacitat visual",
+  "upload_form.video_description": "Descriu-ho per a persones amb problemes de visió o audició",
   "upload_modal.analyzing_picture": "S'analitza la imatge…",
   "upload_modal.apply": "Aplica",
   "upload_modal.applying": "S'aplica…",
   "upload_modal.choose_image": "Tria la imatge",
-  "upload_modal.description_placeholder": "Jove xef, porti whisky amb quinze glaçons d’hidrogen, coi!",
+  "upload_modal.description_placeholder": "Setze jutges d'un jutjat mengen fetge d'un penjat",
   "upload_modal.detect_text": "Detecta el text de la imatge",
-  "upload_modal.edit_media": "Edita el contingut",
+  "upload_modal.edit_media": "Edita el Mèdia",
   "upload_modal.hint": "Fes clic o arrossega el cercle en la previsualització per a triar el punt focal que sempre serà visible en totes les miniatures.",
   "upload_modal.preparing_ocr": "Es prepara l'OCR…",
   "upload_modal.preview_label": "Previsualitza ({ratio})",
diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json
index f2879ca6e..62c24583d 100644
--- a/app/javascript/mastodon/locales/ckb.json
+++ b/app/javascript/mastodon/locales/ckb.json
@@ -6,11 +6,11 @@
   "about.domain_blocks.preamble": "ماستۆدۆن بە گشتی ڕێگەت پێدەدات بە پیشاندانی ناوەڕۆکەکان و کارلێک کردن لەگەڵ بەکارهێنەران لە هەر ڕاژەیەکی تر بە گشتی. ئەمانە ئەو بەدەرکردنانەن کە کراون لەسەر ئەم ڕاژە تایبەتە.",
   "about.domain_blocks.silenced.explanation": "بە گشتی ناتوانی زانیاریە تایبەتەکان و ناوەڕۆکی ئەم ڕاژەیە ببینی، مەگەر بە ڕوونی بەدوایدا بگەڕێیت یان هەڵیبژێریت بۆ شوێنکەوتنی.",
   "about.domain_blocks.silenced.title": "سنووردار",
-  "about.domain_blocks.suspended.explanation": "No data from this server will be processed, stored or exchanged, making any interaction or communication with users from this server impossible.",
+  "about.domain_blocks.suspended.explanation": "هیچ داتایەک لەم سێرڤەرەوە پرۆسێس ناکرێت، هەڵناگیرێت یان ئاڵوگۆڕ ناکرێت، ئەمەش وا دەکات هیچ کارلێکێک یان پەیوەندییەک لەگەڵ بەکارهێنەران لەم سێرڤەرەوە مەحاڵ بێت.",
   "about.domain_blocks.suspended.title": "هەڵپەسێردراوە",
-  "about.not_available": "This information has not been made available on this server.",
-  "about.powered_by": "Decentralized social media powered by {mastodon}",
-  "about.rules": "Server rules",
+  "about.not_available": "ئەم زانیاریانە لەسەر ئەم سێرڤەرە بەردەست نەکراون.",
+  "about.powered_by": "سۆشیال میدیای لامەرکەزی کە لەلایەن {mastodon} ەوە بەهێز دەکرێت",
+  "about.rules": "یاساکانی سێرڤەر",
   "account.account_note_header": "تێبینی    ",
   "account.add_or_remove_from_list": "زیادکردن یان سڕینەوە لە پێرستەکان",
   "account.badges.bot": "بوت",
@@ -19,16 +19,16 @@
   "account.block_domain": "بلۆکی هەموو شتێک لە {domain}",
   "account.blocked": "بلۆککرا",
   "account.browse_more_on_origin_server": "گەڕانی فرەتر لە سەر پرۆفایلی سەرەکی",
-  "account.cancel_follow_request": "Withdraw follow request",
+  "account.cancel_follow_request": "داواکاری فۆڵۆو بکشێنەوە",
   "account.direct": "پەیامی تایبەت بە @{name}",
   "account.disable_notifications": "ئاگانامە مەنێرە بۆم کاتێک @{name} پۆست دەکرێت",
   "account.domain_blocked": "دۆمەین قەپاتکرا",
   "account.edit_profile": "دەستکاری پرۆفایل",
   "account.enable_notifications": "ئاگادارم بکەوە کاتێک @{name} بابەتەکان",
   "account.endorse": "ناساندن لە پرۆفایل",
-  "account.featured_tags.last_status_at": "Last post on {date}",
-  "account.featured_tags.last_status_never": "No posts",
-  "account.featured_tags.title": "{name}'s featured hashtags",
+  "account.featured_tags.last_status_at": "دوایین پۆست لە {date}",
+  "account.featured_tags.last_status_never": "هیچ پۆستێک نییە",
+  "account.featured_tags.title": "هاشتاگە تایبەتەکانی {name}",
   "account.follow": "شوێنکەوتن",
   "account.followers": "شوێنکەوتووان",
   "account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە",
@@ -37,23 +37,24 @@
   "account.following_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
   "account.follows.empty": "ئەم بەکارهێنەرە تا ئێستا شوێن کەس نەکەوتووە.",
   "account.follows_you": "شوێنکەوتووەکانت",
-  "account.go_to_profile": "Go to profile",
+  "account.go_to_profile": "بڕۆ بۆ پڕۆفایلی",
   "account.hide_reblogs": "داشاردنی بووستەکان لە @{name}",
-  "account.joined_short": "Joined",
-  "account.languages": "Change subscribed languages",
+  "account.joined_short": "بەشداری کردووە",
+  "account.languages": "گۆڕینی زمانە بەشداربووەکان",
   "account.link_verified_on": "خاوەنداریەتی ئەم لینکە لە {date} چێک کراوە",
   "account.locked_info": "تایبەتمەندی ئەم هەژمارەیە ڕیکخراوە بۆ قوفڵدراوە. خاوەنەکە بە دەستی پێداچوونەوە دەکات کە کێ دەتوانێت شوێنیان بکەوێت.",
   "account.media": "میدیا",
   "account.mention": "ئاماژە @{name}",
-  "account.moved_to": "{name} has indicated that their new account is now:",
+  "account.moved_to": "{name} ئاماژەی بەوە کردووە کە ئەکاونتە نوێیەکەیان ئێستا:",
   "account.mute": "بێدەنگکردن @{name}",
   "account.mute_notifications": "هۆشیارکەرەوەکان لاببە لە @{name}",
   "account.muted": "بێ دەنگ",
-  "account.open_original_page": "Open original page",
+  "account.open_original_page": "لاپەڕەی ئەسڵی بکەرەوە",
   "account.posts": "توتس",
   "account.posts_with_replies": "توتس و وەڵامەکان",
   "account.report": "گوزارشت @{name}",
   "account.requested": "چاوەڕێی ڕەزامەندین. کرتە بکە بۆ هەڵوەشاندنەوەی داواکاری شوێنکەوتن",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "پرۆفایلی @{name} هاوبەش بکە",
   "account.show_reblogs": "پیشاندانی بەرزکردنەوەکان لە @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
@@ -77,27 +78,27 @@
   "alert.unexpected.title": "تەححح!",
   "announcement.announcement": "بانگەواز",
   "attachments_list.unprocessed": "(unprocessed)",
-  "audio.hide": "Hide audio",
+  "audio.hide": "شاردنەوەی دەنگ",
   "autosuggest_hashtag.per_week": "{count} هەرهەفتە",
   "boost_modal.combo": "دەتوانیت دەست بنێی بە سەر {combo} بۆ بازدان لە جاری داهاتوو",
-  "bundle_column_error.copy_stacktrace": "Copy error report",
-  "bundle_column_error.error.body": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.",
-  "bundle_column_error.error.title": "Oh, no!",
-  "bundle_column_error.network.body": "There was an error when trying to load this page. This could be due to a temporary problem with your internet connection or this server.",
-  "bundle_column_error.network.title": "Network error",
+  "bundle_column_error.copy_stacktrace": "ڕاپۆرتی هەڵەی کۆپی بکە",
+  "bundle_column_error.error.body": "لاپەڕەی داواکراو نەتوانرا ڕەندەر بکرێت. دەکرێت بەهۆی هەڵەیەکی کۆدەکەمانەوە بێت، یان کێشەی گونجانی وێبگەڕ.",
+  "bundle_column_error.error.title": "ئای نا!",
+  "bundle_column_error.network.body": "لە کاتی هەوڵدان بۆ بارکردنی ئەم لاپەڕەیە هەڵەیەک ڕوویدا. ئەمەش دەتوانێت بەهۆی کێشەیەکی کاتی هێڵی ئینتەرنێتەکەت یان ئەم سێرڤەرە بێت.",
+  "bundle_column_error.network.title": "هەڵەی تۆڕ",
   "bundle_column_error.retry": "دووبارە هەوڵبدە",
-  "bundle_column_error.return": "Go back home",
-  "bundle_column_error.routing.body": "The requested page could not be found. Are you sure the URL in the address bar is correct?",
-  "bundle_column_error.routing.title": "404",
+  "bundle_column_error.return": "بگەڕێرەوە ماڵەوە",
+  "bundle_column_error.routing.body": "پەیجی داواکراو ناتوانرێت بدۆزرێتەوە. ئایا دڵنیای کە URL ی ناو ناونیشانەکان ڕاستە?",
+  "bundle_column_error.routing.title": "٤٠٤",
   "bundle_modal_error.close": "داخستن",
   "bundle_modal_error.message": "هەڵەیەک ڕوویدا لەکاتی بارکردنی ئەم پێکهاتەیە.",
   "bundle_modal_error.retry": "دووبارە تاقی بکەوە",
-  "closed_registrations.other_server_instructions": "Since Mastodon is decentralized, you can create an account on another server and still interact with this one.",
-  "closed_registrations_modal.description": "Creating an account on {domain} is currently not possible, but please keep in mind that you do not need an account specifically on {domain} to use Mastodon.",
-  "closed_registrations_modal.find_another_server": "Find another server",
-  "closed_registrations_modal.preamble": "Mastodon is decentralized, so no matter where you create your account, you will be able to follow and interact with anyone on this server. You can even self-host it!",
-  "closed_registrations_modal.title": "Signing up on Mastodon",
-  "column.about": "About",
+  "closed_registrations.other_server_instructions": "بەو پێیەی ماستۆدۆن لامەرکەزییە، دەتوانیت ئەکاونتێک لەسەر سێرڤەرێکی تر دروست بکەیت و هێشتا کارلێک لەگەڵ ئەم سێرڤەرەدا بکەیت.",
+  "closed_registrations_modal.description": "دروستکردنی ئەکاونت لەسەر {domain} لە ئێستادا ناتوانرێت، بەڵام تکایە ئەوەت لەبەرچاو بێت کە پێویستت بە ئەکاونتێک نییە بە تایبەتی لەسەر {domain} بۆ بەکارهێنانی ماستۆدۆن.",
+  "closed_registrations_modal.find_another_server": "سێرڤەرێکی تر بدۆزەرەوە",
+  "closed_registrations_modal.preamble": "ماستۆدۆن لامەرکەزییە، بۆیە گرنگ نییە لە کوێ ئەکاونتەکەت دروست بکەیت، دەتوانیت فۆڵۆوی هەر کەسێک بکەیت و کارلێک لەگەڵیدا بکەیت لەسەر ئەم سێرڤەرە. تەنانەت دەتوانیت خۆت میوانداری بکەیت!",
+  "closed_registrations_modal.title": "ناو تۆمارکردن لە ماستۆدۆن",
+  "column.about": "دەربارە",
   "column.blocks": "بەکارهێنەرە بلۆککراوەکان",
   "column.bookmarks": "نیشانەکان",
   "column.community": "هێڵی کاتی ناوخۆیی",
@@ -123,11 +124,11 @@
   "community.column_settings.local_only": "تەنها خۆماڵی",
   "community.column_settings.media_only": "تەنها میدیا",
   "community.column_settings.remote_only": "تەنها بۆ دوور",
-  "compose.language.change": "Change language",
-  "compose.language.search": "Search languages...",
+  "compose.language.change": "گۆڕینی زمان",
+  "compose.language.search": "گەڕان بە زمانەکان...",
   "compose_form.direct_message_warning_learn_more": "زیاتر فێربه",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "ئەم توتە لە ژێر هیچ هاشتاگییەک دا ناکرێت وەک ئەوەی لە لیستەکەدا نەریزراوە. تەنها توتی گشتی دەتوانرێت بە هاشتاگی بگەڕێت.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "هەژمێرەکەی لە حاڵەتی {locked}. هەر کەسێک دەتوانێت شوێنت بکەوێت بۆ پیشاندانی بابەتەکانی تەنها دوایخۆی.",
   "compose_form.lock_disclaimer.lock": "قفڵ دراوە",
   "compose_form.placeholder": "چی لە مێشکتدایە?",
@@ -137,8 +138,8 @@
   "compose_form.poll.remove_option": "لابردنی ئەم هەڵبژاردەیە",
   "compose_form.poll.switch_to_multiple": "ڕاپرسی بگۆڕە بۆ ڕێگەدان بە چەند هەڵبژاردنێک",
   "compose_form.poll.switch_to_single": "گۆڕینی ڕاپرسی بۆ ڕێگەدان بە تاکە هەڵبژاردنێک",
-  "compose_form.publish": "Publish",
-  "compose_form.publish_form": "Publish",
+  "compose_form.publish": "بڵاوی بکەوە",
+  "compose_form.publish_form": "بڵاوی بکەوە",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "پاشکەوتی گۆڕانکاریەکان",
   "compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار",
@@ -151,8 +152,8 @@
   "confirmations.block.block_and_report": "بلۆک & گوزارشت",
   "confirmations.block.confirm": "بلۆک",
   "confirmations.block.message": "ئایا دڵنیایت لەوەی دەتەوێت {name} بلۆک بکەیت?",
-  "confirmations.cancel_follow_request.confirm": "Withdraw request",
-  "confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?",
+  "confirmations.cancel_follow_request.confirm": "داواکاری کشانەوە",
+  "confirmations.cancel_follow_request.message": "ئایا دڵنیای کە دەتەوێت داواکارییەکەت بۆ شوێنکەوتنی {ناو} بکشێنیتەوە؟",
   "confirmations.delete.confirm": "سڕینەوە",
   "confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?",
   "confirmations.delete_list.confirm": "سڕینەوە",
@@ -176,20 +177,20 @@
   "conversation.mark_as_read": "نیشانەکردن وەک خوێندراوە",
   "conversation.open": "نیشاندان گفتوگۆ",
   "conversation.with": "لەگەڵ{names}",
-  "copypaste.copied": "Copied",
-  "copypaste.copy": "Copy",
+  "copypaste.copied": "کۆپی کراوە",
+  "copypaste.copy": "ڕوونووس",
   "directory.federated": "لە ڕاژەکانی ناسراو",
   "directory.local": "تەنها لە {domain}",
   "directory.new_arrivals": "تازە گەیشتنەکان",
   "directory.recently_active": "بەم دواییانە چالاکە",
-  "disabled_account_banner.account_settings": "Account settings",
-  "disabled_account_banner.text": "Your account {disabledAccount} is currently disabled.",
-  "dismissable_banner.community_timeline": "These are the most recent public posts from people whose accounts are hosted by {domain}.",
-  "dismissable_banner.dismiss": "Dismiss",
-  "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.",
-  "dismissable_banner.explore_statuses": "These posts from this and other servers in the decentralized network are gaining traction on this server right now.",
-  "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.",
-  "dismissable_banner.public_timeline": "These are the most recent public posts from people on this and other servers of the decentralized network that this server knows about.",
+  "disabled_account_banner.account_settings": "ڕێکخستنەکانی هەژمارە",
+  "disabled_account_banner.text": "ئەکاونتەکەت {disabledAccount} لە ئێستادا لەکارخراوە.",
+  "dismissable_banner.community_timeline": "ئەمانە دوایین پۆستی گشتی ئەو کەسانەن کە ئەکاونتەکانیان لەلایەن {domain}ەوە هۆست کراوە.",
+  "dismissable_banner.dismiss": "بەلاوە نان",
+  "dismissable_banner.explore_links": "ئەم هەواڵانە لە ئێستادا لەلایەن کەسانێکەوە لەسەر ئەم سێرڤەرە و سێرڤەرەکانی تری تۆڕی لامەرکەزی باس دەکرێن.",
+  "dismissable_banner.explore_statuses": "ئەم پۆستانەی ئەم سێرڤەرە و سێرڤەرەکانی تری ناو تۆڕی لامەرکەزی لە ئێستادا خەریکە کێشکردن لەسەر ئەم سێرڤەرە بەدەست دەهێنن.",
+  "dismissable_banner.explore_tags": "ئەم هاشتاگانە لە ئێستادا لە نێو خەڵکی سەر ئەم سێرڤەرە و سێرڤەرەکانی تری تۆڕی لامەرکەزیدا جێگەی خۆیان دەگرن.",
+  "dismissable_banner.public_timeline": "ئەمانە دوایین پۆستە گشتیەکانن لە کەسانی سەر ئەم سێرڤەرە و سێرڤەرەکانی تری تۆڕی لامەرکەزی کە ئەم سێرڤەرە دەزانێت.",
   "embed.instructions": "ئەم توتە بنچین بکە لەسەر وێب سایتەکەت بە کۆپیکردنی کۆدەکەی خوارەوە.",
   "embed.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:",
   "emoji_button.activity": "چالاکی",
@@ -235,12 +236,16 @@
   "errors.unexpected_crash.copy_stacktrace": "کۆپیکردنی ستێکتراسی بۆ کلیپ بۆرد",
   "errors.unexpected_crash.report_issue": "کێشەی گوزارشت",
   "explore.search_results": "ئەنجامەکانی گەڕان",
+  "explore.suggested_follows": "For you",
   "explore.title": "گەڕان",
-  "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
-  "filter_modal.added.context_mismatch_title": "Context mismatch!",
-  "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
-  "filter_modal.added.expired_title": "Expired filter!",
-  "filter_modal.added.review_and_configure": "To review and further configure this filter category, go to the {settings_link}.",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
+  "filter_modal.added.context_mismatch_explanation": "ئەم پۆلە فلتەرە ئەو چوارچێوەیە ناگرێتەوە کە تۆ تێیدا دەستت بەم پۆستە کردووە. ئەگەر بتەوێت پۆستەکە لەم چوارچێوەیەشدا فلتەر بکرێت، دەبێت دەستکاری فلتەرەکە بکەیت.",
+  "filter_modal.added.context_mismatch_title": "ناتەبایی دەقی نووسراو!",
+  "filter_modal.added.expired_explanation": "ئەم پۆلە فلتەرە بەسەرچووە، پێویستە بەرواری بەسەرچوونی بگۆڕیت بۆ ئەوەی جێبەجێی بکات.",
+  "filter_modal.added.expired_title": "فلتەری بەسەرچووە!",
+  "filter_modal.added.review_and_configure": "بۆ پێداچوونەوە و ڕێکخستنی زیاتری ئەم پۆلە فلتەرە، بچۆ بۆ {settings_link}.",
   "filter_modal.added.review_and_configure_title": "Filter settings",
   "filter_modal.added.settings_link": "settings page",
   "filter_modal.added.short_explanation": "This post has been added to the following filter category: {title}.",
@@ -528,15 +533,16 @@
   "search_results.title": "Search for {q}",
   "search_results.total": "{count, number} {count, plural, one {دەرئەنجام} other {دەرئەنجام}}",
   "server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)",
-  "server_banner.active_users": "active users",
-  "server_banner.administered_by": "Administered by:",
-  "server_banner.introduction": "{domain} is part of the decentralized social network powered by {mastodon}.",
-  "server_banner.learn_more": "Learn more",
-  "server_banner.server_stats": "Server stats:",
-  "sign_in_banner.create_account": "Create account",
-  "sign_in_banner.sign_in": "Sign in",
-  "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
+  "server_banner.active_users": "بەکارهێنەرانی چالاک",
+  "server_banner.administered_by": "بەڕێوەبردن لەلایەن:",
+  "server_banner.introduction": "{domain} بەشێکە لەو تۆڕە کۆمەڵایەتییە لامەرکەزییەی کە لەلایەن {mastodon}ەوە بەهێز دەکرێت.",
+  "server_banner.learn_more": "زیاتر فێربه",
+  "server_banner.server_stats": "دۆخی ڕاژەکار:",
+  "sign_in_banner.create_account": "هەژمار دروستبکە",
+  "sign_in_banner.sign_in": "بچۆ ژوورەوە",
+  "sign_in_banner.text": "چوونەژوورەوە بۆ فۆڵۆوکردنی پڕۆفایلی یان هاشتاگەکان، دڵخوازکردن، هاوبەشکردن و وەڵامدانەوەی پۆستەکان، یان کارلێککردن لە ئەکاونتەکەتەوە لەسەر سێرڤەرێکی جیاواز.",
   "status.admin_account": "کردنەوەی میانڕەوی بەڕێوەبەر بۆ @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "ئەم توتە بکەوە لە ناو ڕووکاری بەڕیوەبەر",
   "status.block": "@{name} ئاستەنگ بکە",
   "status.bookmark": "نیشانه",
@@ -551,9 +557,9 @@
   "status.edited_x_times": "دەستکاریکراوە {count, plural, one {{count} کات} other {{count} کات}}",
   "status.embed": "نیشتەجێ بکە",
   "status.favourite": "دڵخواز",
-  "status.filter": "Filter this post",
+  "status.filter": "ئەم پۆستە فلتەر بکە",
   "status.filtered": "پاڵاوتن",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} دروستکراوە لە{date}",
   "status.history.edited": "{name} دروستکاریکراوە لە{date}",
   "status.load_more": "زیاتر بار بکە",
@@ -572,26 +578,26 @@
   "status.reblogs.empty": "کەس ئەم توتەی دووبارە نەتوتاندوە ،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
   "status.redraft": "سڕینەوەی و دووبارە ڕەشنووس",
   "status.remove_bookmark": "لابردنی نیشانه",
-  "status.replied_to": "Replied to {name}",
+  "status.replied_to": "لە وەڵامدا بۆ {name}",
   "status.reply": "وەڵام",
   "status.replyAll": "بە نووسراوە وەڵام بدەوە",
   "status.report": "گوزارشت @{name}",
   "status.sensitive_warning": "ناوەڕۆکی هەستیار",
   "status.share": "هاوبەشی بکە",
-  "status.show_filter_reason": "Show anyway",
+  "status.show_filter_reason": "بە هەر حاڵ نیشان بدە",
   "status.show_less": "کەمتر نیشان بدە",
   "status.show_less_all": "هەمووی بچووک بکەوە",
   "status.show_more": "زیاتر نیشان بدە",
   "status.show_more_all": "زیاتر نیشان بدە بۆ هەمووی",
-  "status.show_original": "Show original",
-  "status.translate": "Translate",
-  "status.translated_from_with": "Translated from {lang} using {provider}",
+  "status.show_original": "پیشاندانی شێوه‌ی ڕاسته‌قینه‌",
+  "status.translate": "وەریبگێرە",
+  "status.translated_from_with": "لە {lang} وەرگێڕدراوە بە بەکارهێنانی {provider}",
   "status.uncached_media_warning": "بەردەست نیە",
   "status.unmute_conversation": "گفتوگۆی بێدەنگ",
   "status.unpin": "لە سەرەوە لایبە",
-  "subscribed_languages.lead": "Only posts in selected languages will appear on your home and list timelines after the change. Select none to receive posts in all languages.",
-  "subscribed_languages.save": "Save changes",
-  "subscribed_languages.target": "Change subscribed languages for {target}",
+  "subscribed_languages.lead": "تەنها پۆستەکان بە زمانە هەڵبژێردراوەکان لە ماڵەکەتدا دەردەکەون و هێڵەکانی کاتی لیستەکەت دوای گۆڕانکارییەکە. هیچیان هەڵبژێرە بۆ وەرگرتنی پۆست بە هەموو زمانەکان.",
+  "subscribed_languages.save": "پاشکەوتی گۆڕانکاریەکان",
+  "subscribed_languages.target": "گۆڕینی زمانە بەشداربووەکان بۆ {target}",
   "suggestions.dismiss": "ڕەتکردنەوەی پێشنیار",
   "suggestions.header": "لەوانەیە حەزت لەمەش بێت…",
   "tabs_bar.federated_timeline": "گشتی",
@@ -635,7 +641,7 @@
   "upload_modal.preparing_ocr": "نووسینەکە دەستنیشان دەکرێت…",
   "upload_modal.preview_label": "پێشبینین ({ratio})",
   "upload_progress.label": "بار دەکرێت...",
-  "upload_progress.processing": "Processing…",
+  "upload_progress.processing": "جێبەجێکردن...",
   "video.close": "داخستنی ڤیدیۆ",
   "video.download": "داگرتنی فایل",
   "video.exit_fullscreen": "دەرچوون لە پڕ شاشە",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 743d577d7..1820e511c 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Statuti è risposte",
   "account.report": "Palisà @{name}",
   "account.requested": "In attesa d'apprubazione. Cliccate per annullà a dumanda",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Sparte u prufile di @{name}",
   "account.show_reblogs": "Vede spartere da @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Statutu} other {{counter} Statuti}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Amparà di più",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "Stu statutu ùn hè \"Micca listatu\" è ùn sarà micca listatu indè e circate da hashtag. Per esse vistu in quesse, u statutu deve esse \"Pubblicu\".",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "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?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Cupià stacktrace nant'à u fermacarta",
   "errors.unexpected_crash.report_issue": "Palisà prublemu",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Apre l'interfaccia di muderazione per @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Apre stu statutu in l'interfaccia di muderazione",
   "status.block": "Bluccà @{name}",
   "status.bookmark": "Segnalibru",
@@ -553,7 +559,7 @@
   "status.favourite": "Aghjunghje à i favuriti",
   "status.filter": "Filter this post",
   "status.filtered": "Filtratu",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Vede di più",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index f153d823b..0559cebf8 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Příspěvky a odpovědi",
   "account.report": "Nahlásit @{name}",
   "account.requested": "Čeká na schválení. Kliknutím žádost o sledování zrušíte",
+  "account.requested_follow": "{name} tě požádal o sledování",
   "account.share": "Sdílet profil @{name}",
   "account.show_reblogs": "Zobrazit boosty od @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Příspěvek} few {{counter} Příspěvky} many {{counter} Příspěvků} other {{counter} Příspěvků}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Prohledat jazyky...",
   "compose_form.direct_message_warning_learn_more": "Zjistit více",
   "compose_form.encryption_warning": "Příspěvky na Mastodonu nejsou end-to-end šifrovány. Nesdílejte přes Mastodon žádné citlivé informace.",
-  "compose_form.hashtag_warning": "Tento příspěvek nebude zobrazen pod žádným hashtagem, neboť je neveřejný. Pouze veřejné příspěvky mohou být vyhledány podle hashtagu.",
+  "compose_form.hashtag_warning": "Tento příspěvek nebude zobrazen pod žádným hashtagem, protože není veřejný. Podle hashtagu lze vyhledávat jen veřejné příspěvky.",
   "compose_form.lock_disclaimer": "Váš účet není {locked}. Kdokoliv vás může sledovat a vidět vaše příspěvky učené pouze pro sledující.",
   "compose_form.lock_disclaimer.lock": "zamčený",
   "compose_form.placeholder": "Co se vám honí hlavou?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Zkopírovat stacktrace do schránky",
   "errors.unexpected_crash.report_issue": "Nahlásit problém",
   "explore.search_results": "Výsledky hledání",
+  "explore.suggested_follows": "Pro vás",
   "explore.title": "Objevit",
+  "explore.trending_links": "Zprávy",
+  "explore.trending_statuses": "Příspěvky",
+  "explore.trending_tags": "Hashtagy",
   "filter_modal.added.context_mismatch_explanation": "Tato kategorie filtrů se nevztahuje na kontext, ve kterém jste tento příspěvek otevřeli. Pokud chcete, aby byl příspěvek filtrován i v tomto kontextu, budete muset filtr upravit.",
   "filter_modal.added.context_mismatch_title": "Kontext se neshoduje!",
   "filter_modal.added.expired_explanation": "Tato kategorie filtrů vypršela, budete muset změnit datum vypršení platnosti, aby mohla být použita.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Přihlásit se",
   "sign_in_banner.text": "Přihlaste se pro sledování profilů nebo hashtagů, oblíbení, sdílení a odpovědí na příspěvky nebo interakci z vašeho účtu na jiném serveru.",
   "status.admin_account": "Otevřít moderátorské rozhraní pro @{name}",
+  "status.admin_domain": "Otevřít moderátorské rozhraní pro {domain}",
   "status.admin_status": "Otevřít tento příspěvek v moderátorském rozhraní",
   "status.block": "Blokovat @{name}",
   "status.bookmark": "Přidat do záložek",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index 0f29be2c9..c854501fa 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Postiadau ac atebion",
   "account.report": "Adrodd @{name}",
   "account.requested": "Aros am gymeradwyaeth. Cliciwch er mwyn canslo cais dilyn",
+  "account.requested_follow": "Mae {name} wedi gwneud cais i'ch dilyn",
   "account.share": "Rhannwch broffil @{name}",
   "account.show_reblogs": "Dangos hybiau gan @{name}",
   "account.statuses_counter": "{count, plural, one {Postiad: {counter}} other {Postiad: {counter}}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Chwilio ieithoedd...",
   "compose_form.direct_message_warning_learn_more": "Dysgu mwy",
   "compose_form.encryption_warning": "Dyw postiadau ar Mastodon ddim wedi'u hamgryptio o ben i ben. Peidiwch â rhannu unrhyw wybodaeth sensitif dros Mastodon.",
-  "compose_form.hashtag_warning": "Ni fydd y post hwn wedi ei restru o dan unrhyw hashnod gan ei fod heb ei restru. Dim ond postiadau cyhoeddus gellid chwilio amdanynt drwy hashnod.",
+  "compose_form.hashtag_warning": "Ni fydd y postiad hwn wedi ei restru o dan unrhyw hashnod gan nad yw'n gyhoeddus. Dim ond postiadau cyhoeddus y mae modd eu chwilio drwy hashnod.",
   "compose_form.lock_disclaimer": "Nid yw eich cyfri wedi'i {locked}. Gall unrhyw un eich dilyn i weld eich postiadau dilynwyr-yn-unig.",
   "compose_form.lock_disclaimer.lock": "wedi ei gloi",
   "compose_form.placeholder": "Beth sydd ar eich meddwl?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copïo'r olrhain stac i'r clipfwrdd",
   "errors.unexpected_crash.report_issue": "Rhoi gwybod am broblem",
   "explore.search_results": "Canlyniadau chwilio",
+  "explore.suggested_follows": "I chi",
   "explore.title": "Archwilio",
+  "explore.trending_links": "Newyddion",
+  "explore.trending_statuses": "Postiadau",
+  "explore.trending_tags": "Hashnodau",
   "filter_modal.added.context_mismatch_explanation": "Nid yw'r categori hidlo hwn yn berthnasol i'r cyd-destun yr ydych wedi cyrchu'r postiad hwn ynddo. Os ydych chi am i'r postiad gael ei hidlo yn y cyd-destun hwn hefyd, bydd yn rhaid i chi olygu'r hidlydd.",
   "filter_modal.added.context_mismatch_title": "Diffyg cyfatebiaeth cyd-destun!",
   "filter_modal.added.expired_explanation": "Mae'r categori hidlydd hwn wedi dod i ben, bydd angen i chi newid y dyddiad dod i ben er mwyn iddo fod yn berthnasol.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Mewngofnodi",
   "sign_in_banner.text": "Mewngofnodwch i ddilyn proffiliau neu hashnodau, ffefrynnau, rhannu ac ymateb i bostiadau, neu ryngweithio o'ch cyfrif ar weinydd gwahanol.",
   "status.admin_account": "Agor rhyngwyneb cymedroli ar gyfer @{name}",
+  "status.admin_domain": "Agor rhyngwyneb cymedroli {domain}",
   "status.admin_status": "Agor y post hwn yn y rhyngwyneb goruwchwylio",
   "status.block": "Blocio @{name}",
   "status.bookmark": "Nod Tudalen",
@@ -553,7 +559,7 @@
   "status.favourite": "Ffefryn",
   "status.filter": "Hidlo'r postiad hwn",
   "status.filtered": "Wedi'i hidlo",
-  "status.hide": "Cuddio postiad",
+  "status.hide": "Cuddio'r postiad",
   "status.history.created": "Crëwyd gan {name} {date}",
   "status.history.edited": "Golygwyd gan {name} {date}",
   "status.load_more": "Llwythwch ragor",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 684f308a6..743822366 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Indlæg og svar",
   "account.report": "Anmeld @{name}",
   "account.requested": "Afventer godkendelse. Tryk for at annullere følgeanmodning",
+  "account.requested_follow": "{name} har anmodet om at følge dig",
   "account.share": "Del @{name}s profil",
   "account.show_reblogs": "Vis fremhævelser fra @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Indlæg} other {{counter} Indlæg}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Søg efter sprog...",
   "compose_form.direct_message_warning_learn_more": "Få mere at vide",
   "compose_form.encryption_warning": "Indlæg på Mastodon er ikke ende-til-ende krypteret. Del derfor ikke sensitiv information via Mastodon.",
-  "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under noget hashtag, idet kun offentlige indlæg kan søges via hashtags.",
+  "compose_form.hashtag_warning": "Da indlægget ikke er offentligt, vises det ikke under noget hashtag, da kun offentlige indlæg er søgbare via hashtags.",
   "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Enhver kan følge dig og se indlæg kun beregnet for følgere.",
   "compose_form.lock_disclaimer.lock": "låst",
   "compose_form.placeholder": "Hvad tænker du på?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Kopiér stacktrace til udklipsholderen",
   "errors.unexpected_crash.report_issue": "Anmeld problem",
   "explore.search_results": "Søgeresultater",
+  "explore.suggested_follows": "Til dig",
   "explore.title": "Udforsk",
+  "explore.trending_links": "Nyheder",
+  "explore.trending_statuses": "Indlæg",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "Denne filterkategori omfatter ikke konteksten, hvorunder dette indlæg er tilgået. Redigér filteret, hvis indlægget også ønskes filtreret i denne kontekst.",
   "filter_modal.added.context_mismatch_title": "Kontekstmisforhold!",
   "filter_modal.added.expired_explanation": "Denne filterkategori er udløbet. Ændr dens udløbsdato, for at anvende den.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Log ind",
   "sign_in_banner.text": "Log ind for at følge profiler eller hashtags, markere som favorit, dele og svare på indlæg eller interagere fra din konto på en anden server.",
   "status.admin_account": "Åbn modereringsbrugerflade for @{name}",
+  "status.admin_domain": "Åbn modereringsbrugerflade for {domain}",
   "status.admin_status": "Åbn dette indlæg i modereringsbrugerfladen",
   "status.block": "Blokér @{name}",
   "status.bookmark": "Bogmærk",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 8e3a6c65d..c43ff56f7 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -3,8 +3,8 @@
   "about.contact": "Kontakt:",
   "about.disclaimer": "Mastodon ist eine freie, quelloffene Software und eine Marke der Mastodon gGmbH.",
   "about.domain_blocks.no_reason_available": "Grund unbekannt",
-  "about.domain_blocks.preamble": "Mastodon erlaubt es dir grundsätzlich, alle Inhalte von allen Nutzer*innen auf allen Servern im Fediversum zu sehen und mit ihnen zu interagieren. Für diese Instanz gibt es aber ein paar Ausnahmen.",
-  "about.domain_blocks.silenced.explanation": "Alle Inhalte dieses Servers sind stumm geschaltet und werden zunächst nicht angezeigt. Du kannst die Profile und anderen Inhalte aber dennoch manuell aufrufen – oder Du folgst einer Person dieser Mastodon-Instanz.",
+  "about.domain_blocks.preamble": "Mastodon erlaubt es dir grundsätzlich, alle Inhalte von allen Nutzer*innen auf allen Servern im Fediversum zu sehen und mit ihnen zu interagieren. Für diesen Server gibt es aber ein paar Ausnahmen.",
+  "about.domain_blocks.silenced.explanation": "Alle Inhalte und Profile dieses Servers werden zunächst nicht angezeigt. Du kannst die Profile und Inhalte aber dennoch sehen, wenn du explizit nach diesen suchst oder diesen folgst.",
   "about.domain_blocks.silenced.title": "Stummgeschaltet",
   "about.domain_blocks.suspended.explanation": "Es werden keine Daten von diesem Server verarbeitet, gespeichert oder ausgetauscht, sodass eine Interaktion oder Kommunikation mit Nutzer*innen dieses Servers nicht möglich ist.",
   "about.domain_blocks.suspended.title": "Gesperrt",
@@ -49,15 +49,16 @@
   "account.mute": "@{name} stummschalten",
   "account.mute_notifications": "Benachrichtigungen von @{name} stummschalten",
   "account.muted": "Stummgeschaltet",
-  "account.open_original_page": "Auf ursprünglicher Instanz anzeigen",
+  "account.open_original_page": "Ursprüngliche Seite öffnen",
   "account.posts": "Beiträge",
   "account.posts_with_replies": "Beiträge und Antworten",
   "account.report": "@{name} melden",
   "account.requested": "Warte auf Genehmigung. Klicke hier, um die Anfrage zum Folgen abzubrechen",
+  "account.requested_follow": "{name} hat angefragt, dir folgen zu dürfen",
   "account.share": "Profil von @{name} teilen",
   "account.show_reblogs": "Geteilte Beiträge von @{name} wieder anzeigen",
   "account.statuses_counter": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}",
-  "account.unblock": "@{name} entsperren",
+  "account.unblock": "@{name} Sperre aufheben",
   "account.unblock_domain": "Sperre von {domain} aufheben",
   "account.unblock_short": "Sperre aufheben",
   "account.unendorse": "Im Profil nicht mehr empfehlen",
@@ -120,14 +121,14 @@
   "column_header.show_settings": "Einstellungen anzeigen",
   "column_header.unpin": "Lösen",
   "column_subheading.settings": "Einstellungen",
-  "community.column_settings.local_only": "Nur lokale Instanz",
+  "community.column_settings.local_only": "Nur lokal",
   "community.column_settings.media_only": "Nur Beiträge mit angehängten Medien",
-  "community.column_settings.remote_only": "Nur andere Mastodon-Instanzen anzeigen",
+  "community.column_settings.remote_only": "Nur andere Mastodon-Server anzeigen",
   "compose.language.change": "Sprache festlegen",
   "compose.language.search": "Sprachen suchen …",
   "compose_form.direct_message_warning_learn_more": "Mehr erfahren",
   "compose_form.encryption_warning": "Beiträge auf Mastodon sind nicht Ende-zu-Ende-verschlüsselt. Teile keine sensiblen Informationen über Mastodon.",
-  "compose_form.hashtag_warning": "Dieser Beitrag ist über Hashtags nicht zu finden, weil er nicht gelistet ist. Nur öffentliche Beiträge tauchen in den Hashtag-Timelines auf.",
+  "compose_form.hashtag_warning": "Dieser Beitrag wird unter keinem Hashtag sichtbar sein, weil er nicht öffentlich ist. Nur öffentliche Beiträge können nach Hashtags durchsucht werden.",
   "compose_form.lock_disclaimer": "Dein Profil ist nicht {locked}. Andere können dir folgen und deine Beiträge sehen, die nur für Follower bestimmt sind.",
   "compose_form.lock_disclaimer.lock": "geschützt",
   "compose_form.placeholder": "Was gibt's Neues?",
@@ -189,7 +190,7 @@
   "dismissable_banner.explore_links": "Diese Nachrichten werden gerade von Leuten auf diesem und anderen Servern des dezentralen Netzwerks besprochen.",
   "dismissable_banner.explore_statuses": "Diese Beiträge von diesem und anderen Servern im dezentralen Netzwerk gewinnen gerade an Reichweite auf diesem Server.",
   "dismissable_banner.explore_tags": "Diese Hashtags gewinnen gerade unter den Leuten auf diesem und anderen Servern des dezentralen Netzwerkes an Reichweite.",
-  "dismissable_banner.public_timeline": "Dies sind die neuesten öffentlichen Beiträge von Profilen auf dieser Mastodon-Instanz und auf anderen Servern des dezentralen Netzwerks, von denen dieser Server Kenntnis hat.",
+  "dismissable_banner.public_timeline": "Dies sind die neuesten öffentlichen Beiträge von Profilen auf diesem und anderen Servern des dezentralen Netzwerks, von denen dieser Server Kenntnis hat.",
   "embed.instructions": "Du kannst diesen Beitrag außerhalb des Fediverse (z. B. auf deiner Website) einbetten, indem du diesen iFrame-Code einfügst.",
   "embed.preview": "Vorschau:",
   "emoji_button.activity": "Aktivitäten",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Fehlerdiagnose in die Zwischenablage kopieren",
   "errors.unexpected_crash.report_issue": "Fehler melden",
   "explore.search_results": "Suchergebnisse",
+  "explore.suggested_follows": "Für dich",
   "explore.title": "Entdecken",
+  "explore.trending_links": "Neuigkeiten",
+  "explore.trending_statuses": "Beiträge",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "Diese Filterkategorie gilt nicht für den Kontext, in welchem du auf diesen Beitrag zugegriffen hast. Wenn der Beitrag auch in diesem Kontext gefiltert werden soll, musst du den Filter bearbeiten.",
   "filter_modal.added.context_mismatch_title": "Kontext stimmt nicht überein!",
   "filter_modal.added.expired_explanation": "Diese Filterkategorie ist abgelaufen. Du musst das Ablaufdatum für diese Kategorie ändern.",
@@ -248,10 +253,10 @@
   "filter_modal.select_filter.context_mismatch": "gilt nicht für diesen Kontext",
   "filter_modal.select_filter.expired": "abgelaufen",
   "filter_modal.select_filter.prompt_new": "Neue Kategorie: {name}",
-  "filter_modal.select_filter.search": "Suchen oder Erstellen",
+  "filter_modal.select_filter.search": "Filter suchen oder erstellen",
   "filter_modal.select_filter.subtitle": "Einem vorhandenen Filter hinzufügen oder einen neuen erstellen",
   "filter_modal.select_filter.title": "Diesen Beitrag filtern",
-  "filter_modal.title.status": "Beitrag filtern",
+  "filter_modal.title.status": "Beitrag per Filter ausblenden",
   "follow_recommendations.done": "Fertig",
   "follow_recommendations.heading": "Folge Leuten, deren Beiträge du sehen möchtest! Hier sind einige Vorschläge.",
   "follow_recommendations.lead": "Beiträge von Personen, denen du folgst, werden in chronologischer Reihenfolge auf deiner Startseite angezeigt. Hab keine Angst, Fehler zu machen, du kannst den Leuten jederzeit wieder entfolgen!",
@@ -338,7 +343,7 @@
   "lightbox.next": "Vor",
   "lightbox.previous": "Zurück",
   "limited_account_hint.action": "Profil trotzdem anzeigen",
-  "limited_account_hint.title": "Dieses Profil wurde von den Moderator*innen der Mastodon-Instanz {domain} ausgeblendet.",
+  "limited_account_hint.title": "Dieses Profil wurde von den Moderator*innen von {domain} ausgeblendet.",
   "lists.account.add": "Zur Liste hinzufügen",
   "lists.account.remove": "Von der Liste entfernen",
   "lists.delete": "Liste löschen",
@@ -493,7 +498,7 @@
   "report.reasons.spam": "Das ist Spam",
   "report.reasons.spam_description": "Bösartige Links, gefälschtes Engagement oder wiederholte Antworten",
   "report.reasons.violation": "Es verstößt gegen Serverregeln",
-  "report.reasons.violation_description": "Du weißt, welche Regeln verletzt werden",
+  "report.reasons.violation_description": "Du bist dir bewusst, dass es gegen bestimmte Regeln verstößt",
   "report.rules.subtitle": "Wähle alle zutreffenden Inhalte aus",
   "report.rules.title": "Welche Regeln werden verletzt?",
   "report.statuses.subtitle": "Wähle alle zutreffenden Inhalte aus",
@@ -517,7 +522,7 @@
   "search_popout.tips.full_text": "Einfache Texteingabe gibt Beiträge, die du geschrieben, favorisiert und geteilt hast, zurück; außerdem auch Beiträge, in denen du erwähnt wurdest, aber auch passende Nutzernamen, Anzeigenamen oder Hashtags.",
   "search_popout.tips.hashtag": "Hashtag",
   "search_popout.tips.status": "Beitrag",
-  "search_popout.tips.text": "Einfache Texteingabe gibt Anzeigenamen, Benutzernamen und Hashtags zurück",
+  "search_popout.tips.text": "Einfache Texteingabe gibt Anzeigenamen, Profilnamen und Hashtags zurück",
   "search_popout.tips.user": "Profil",
   "search_results.accounts": "Profile",
   "search_results.all": "Alles",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Anmelden",
   "sign_in_banner.text": "Melde dich an, um Profilen oder Hashtags zu folgen, Beiträge zu favorisieren, zu teilen und auf sie zu antworten oder um von deinem Konto aus auf einem anderen Server zu interagieren.",
   "status.admin_account": "Moderationsoberfläche für @{name} öffnen",
+  "status.admin_domain": "Moderationsoberfläche für {domain} öffnen",
   "status.admin_status": "Diesen Beitrag in der Moderationsoberfläche öffnen",
   "status.block": "@{name} blockieren",
   "status.bookmark": "Beitrag als Lesezeichen setzen",
@@ -553,7 +559,7 @@
   "status.favourite": "Favorisieren",
   "status.filter": "Beitrag filtern",
   "status.filtered": "Gefiltert",
-  "status.hide": "Beitrag verbergen",
+  "status.hide": "Beitrag ausblenden",
   "status.history.created": "{name} erstellte {date}",
   "status.history.edited": "{name} bearbeitete {date}",
   "status.load_more": "Weitere laden",
@@ -617,13 +623,13 @@
   "upload_button.label": "Bilder, Videos oder Audios hinzufügen",
   "upload_error.limit": "Dateiupload-Limit überschritten.",
   "upload_error.poll": "Medien-Anhänge sind zusammen mit Umfragen nicht erlaubt.",
-  "upload_form.audio_description": "Beschreibung für Gehörlose und hörbehinderte Menschen",
-  "upload_form.description": "Bildbeschreibung für blinde und sehbehinderte Menschen",
+  "upload_form.audio_description": "Für Gehörlose und hörbehinderte Menschen beschreiben",
+  "upload_form.description": "Beschreibe für Menschen mit Sehbehinderung",
   "upload_form.description_missing": "Keine Beschreibung hinzugefügt",
   "upload_form.edit": "Beschreiben",
   "upload_form.thumbnail": "Vorschaubild ändern",
   "upload_form.undo": "Löschen",
-  "upload_form.video_description": "Beschreibe das Video für Menschen mit einer Hör- oder Sehbehinderung",
+  "upload_form.video_description": "Beschreibe für Menschen mit einer Hör- oder Sehbehinderung",
   "upload_modal.analyzing_picture": "Bild wird analysiert …",
   "upload_modal.apply": "Übernehmen",
   "upload_modal.applying": "Wird angewendet …",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 265466695..6f3c5e1a0 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -652,15 +652,19 @@
         "id": "status.admin_account"
       },
       {
-        "defaultMessage": "Open this status in the moderation interface",
+        "defaultMessage": "Open this post in the moderation interface",
         "id": "status.admin_status"
       },
       {
-        "defaultMessage": "Copy link to status",
+        "defaultMessage": "Open moderation interface for {domain}",
+        "id": "status.admin_domain"
+      },
+      {
+        "defaultMessage": "Copy link to post",
         "id": "status.copy"
       },
       {
-        "defaultMessage": "Hide toot",
+        "defaultMessage": "Hide post",
         "id": "status.hide"
       },
       {
@@ -1044,6 +1048,23 @@
   {
     "descriptors": [
       {
+        "defaultMessage": "{name} has requested to follow you",
+        "id": "account.requested_follow"
+      },
+      {
+        "defaultMessage": "Authorize",
+        "id": "follow_request.authorize"
+      },
+      {
+        "defaultMessage": "Reject",
+        "id": "follow_request.reject"
+      }
+    ],
+    "path": "app/javascript/mastodon/features/account/components/follow_request_note.json"
+  },
+  {
+    "descriptors": [
+      {
         "defaultMessage": "Unfollow",
         "id": "account.unfollow"
       },
@@ -1180,6 +1201,10 @@
         "id": "status.admin_account"
       },
       {
+        "defaultMessage": "Open moderation interface for {domain}",
+        "id": "status.admin_domain"
+      },
+      {
         "defaultMessage": "Change subscribed languages",
         "id": "account.languages"
       },
@@ -2014,6 +2039,22 @@
       {
         "defaultMessage": "Search results",
         "id": "explore.search_results"
+      },
+      {
+        "defaultMessage": "Posts",
+        "id": "explore.trending_statuses"
+      },
+      {
+        "defaultMessage": "Hashtags",
+        "id": "explore.trending_tags"
+      },
+      {
+        "defaultMessage": "News",
+        "id": "explore.trending_links"
+      },
+      {
+        "defaultMessage": "For you",
+        "id": "explore.suggested_follows"
       }
     ],
     "path": "app/javascript/mastodon/features/explore/index.json"
@@ -3564,6 +3605,10 @@
         "id": "status.admin_status"
       },
       {
+        "defaultMessage": "Open moderation interface for {domain}",
+        "id": "status.admin_domain"
+      },
+      {
         "defaultMessage": "Copy link to status",
         "id": "status.copy"
       },
@@ -3918,15 +3963,15 @@
         "id": "confirmations.discard_edit_media.confirm"
       },
       {
-        "defaultMessage": "Describe for people with hearing loss",
+        "defaultMessage": "Describe for people who are hard of hearing",
         "id": "upload_form.audio_description"
       },
       {
-        "defaultMessage": "Describe for people with hearing loss or visual impairment",
+        "defaultMessage": "Describe for people who are deaf, hard of hearing, blind or have low vision",
         "id": "upload_form.video_description"
       },
       {
-        "defaultMessage": "Describe for the visually impaired",
+        "defaultMessage": "Describe for people who are blind or have low vision",
         "id": "upload_form.description"
       },
       {
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 8026e6cdb..ad88129e9 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Τουτ και απαντήσεις",
   "account.report": "Κατάγγειλε @{name}",
   "account.requested": "Εκκρεμεί έγκριση. Κάνε κλικ για να ακυρώσεις το αίτημα παρακολούθησης",
+  "account.requested_follow": "Ο/Η {name} αιτήθηκε να σε ακολουθήσει",
   "account.share": "Μοίρασμα του προφίλ @{name}",
   "account.show_reblogs": "Εμφάνιση προωθήσεων από @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Τουτ} other {{counter} Τουτ}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Αναζήτηση γλωσσών...",
   "compose_form.direct_message_warning_learn_more": "Μάθετε περισσότερα",
   "compose_form.encryption_warning": "Οι δημοσιεύσεις στο Mastodon δεν είναι κρυπτογραφημένες από άκρο σε άκρο. Μην μοιράζεστε ευαίσθητες πληροφορίες μέσω του Mastodon.",
-  "compose_form.hashtag_warning": "Αυτό το τουτ δεν θα εμφανίζεται κάτω από κανένα hashtag καθώς είναι αφανές. Μόνο τα δημόσια τουτ μπορούν να αναζητηθούν ανά hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Ο λογαριασμός σου δεν είναι {locked}. Οποιοσδήποτε μπορεί να σε ακολουθήσει για να δει τις δημοσιεύσεις σας προς τους ακολούθους σας.",
   "compose_form.lock_disclaimer.lock": "κλειδωμένο",
   "compose_form.placeholder": "Τι σκέφτεσαι;",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Αντιγραφή μηνυμάτων κώδικα στο πρόχειρο",
   "errors.unexpected_crash.report_issue": "Αναφορά προβλήματος",
   "explore.search_results": "Κανένα αποτέλεσμα.",
+  "explore.suggested_follows": "Για σένα",
   "explore.title": "Εξερεύνηση",
+  "explore.trending_links": "Νέα",
+  "explore.trending_statuses": "Αναρτήσεις",
+  "explore.trending_tags": "Ετικέτες",
   "filter_modal.added.context_mismatch_explanation": "Αυτή η κατηγορία φίλτρων δεν ισχύει για το πλαίσιο εντός του οποίου προσπελάσατε αυτή την ανάρτηση. Αν θέλετε να φιλτραριστεί η δημοσίευση και εντός αυτού του πλαισίου, θα πρέπει να τροποποιήσετε το φίλτρο.",
   "filter_modal.added.context_mismatch_title": "Συνοδευτικά",
   "filter_modal.added.expired_explanation": "Αυτή η κατηγορία φίλτρων έχει λήξει, πρέπει να αλλάξετε την ημερομηνία λήξης για να ισχύσει.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Σύνδεση",
   "sign_in_banner.text": "Συνδεθείτε για να ακολουθήσετε προφίλ ή ταμπέλες, αγαπημένα, να μοιραστείτε και να απαντήσετε σε δημοσιεύσεις ή να αλληλεπιδράσετε από το λογαριασμό σας σε διαφορετικό διακομιστή.",
   "status.admin_account": "Άνοιγμα λειτουργίας διαμεσολάβησης για τον/την @{name}",
+  "status.admin_domain": "Άνοιγμα λειτουργίας διαμεσολάβησης για {domain}",
   "status.admin_status": "Άνοιγμα αυτής της δημοσίευσης στη λειτουργία διαμεσολάβησης",
   "status.block": "Αποκλεισμός @{name}",
   "status.bookmark": "Σελιδοδείκτης",
@@ -553,7 +559,7 @@
   "status.favourite": "Σημείωσε ως αγαπημένο",
   "status.filter": "Φίλτρο...",
   "status.filtered": "Φιλτραρισμένα",
-  "status.hide": "Απόκρυψη toot",
+  "status.hide": "Απόκρυψη ανάρτησης",
   "status.history.created": "Δημιουργήθηκε από",
   "status.history.edited": "Τελευταία επεξεργασία από:",
   "status.load_more": "Φόρτωσε περισσότερα",
@@ -618,7 +624,7 @@
   "upload_error.limit": "Υπέρβαση ορίου μεγέθους ανεβασμένων αρχείων.",
   "upload_error.poll": "Στις δημοσκοπήσεις δεν επιτρέπεται η μεταφόρτωση αρχείου.",
   "upload_form.audio_description": "Περιγραφή για άτομα με προβλήματα ακοής",
-  "upload_form.description": "Περιέγραψε για όσους & όσες έχουν προβλήματα όρασης",
+  "upload_form.description": "Περιγραφή για όσους & όσες έχουν προβλήματα όρασης",
   "upload_form.description_missing": "Δεν προστέθηκε περιγραφή",
   "upload_form.edit": "Ενημέρωση",
   "upload_form.thumbnail": "Αλλαγή μικρογραφίας",
diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json
index 666ac0e4c..242569c4d 100644
--- a/app/javascript/mastodon/locales/en-GB.json
+++ b/app/javascript/mastodon/locales/en-GB.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Posts and replies",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval. Click to cancel follow request",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -255,7 +260,7 @@
   "follow_recommendations.done": "Done",
   "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
   "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
-  "follow_request.authorize": "Authorize",
+  "follow_request.authorize": "Authorise",
   "follow_request.reject": "Reject",
   "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
   "footer.about": "About",
@@ -290,7 +295,7 @@
   "interaction_modal.on_another_server": "On a different server",
   "interaction_modal.on_this_server": "On this server",
   "interaction_modal.other_server_instructions": "Copy and paste this URL into the search field of your favourite Mastodon app or the web interface of your Mastodon server.",
-  "interaction_modal.preamble": "Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don't have an account on this one.",
+  "interaction_modal.preamble": "Since Mastodon is decentralised, you can use your existing account hosted by another Mastodon server or compatible platform if you don't have an account on this one.",
   "interaction_modal.title.favourite": "Favourite {name}'s post",
   "interaction_modal.title.follow": "Follow {name}",
   "interaction_modal.title.reblog": "Boost {name}'s post",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index ce5fee3cb..8175c2bdf 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Posts and replies",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval. Click to cancel follow request",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
@@ -131,7 +132,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any sensitive information over Mastodon.",
-  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is not public. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "locked",
   "compose_form.placeholder": "What's on your mind?",
@@ -239,7 +240,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -542,6 +547,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this post in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -558,7 +564,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
@@ -622,13 +628,13 @@
   "upload_button.label": "Add images, a video or an audio file",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
-  "upload_form.audio_description": "Describe for people with hearing loss",
-  "upload_form.description": "Describe for the visually impaired",
+  "upload_form.audio_description": "Describe for people who are deaf or hard of hearing",
+  "upload_form.description": "Describe for people who are blind or have low vision",
   "upload_form.description_missing": "No description added",
   "upload_form.edit": "Describe",
   "upload_form.thumbnail": "Change thumbnail",
   "upload_form.undo": "Delete",
-  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
+  "upload_form.video_description": "Describe for people who are deaf, hard of hearing, blind or have low vision",
   "upload_modal.analyzing_picture": "Analyzing picture…",
   "upload_modal.apply": "Apply",
   "upload_modal.applying": "Applying…",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 0c8857a69..de2f7e670 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -27,7 +27,7 @@
   "account.enable_notifications": "Sciigi min, kiam @{name} mesaĝas",
   "account.endorse": "Rekomendi ĉe via profilo",
   "account.featured_tags.last_status_at": "Lasta afîŝo je {date}",
-  "account.featured_tags.last_status_never": "Neniuj afiŝoj",
+  "account.featured_tags.last_status_never": "Neniu afiŝo",
   "account.featured_tags.title": "Rekomendataj kradvortoj de {name}",
   "account.follow": "Sekvi",
   "account.followers": "Sekvantoj",
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Mesaĝoj kaj respondoj",
   "account.report": "Raporti @{name}",
   "account.requested": "Atendo de aprobo. Klaku por nuligi la peton por sekvado",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Diskonigi la profilon de @{name}",
   "account.show_reblogs": "Montri diskonigojn de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Afiŝo} other {{counter} Afiŝoj}}",
@@ -80,7 +81,7 @@
   "audio.hide": "Kaŝi aŭdion",
   "autosuggest_hashtag.per_week": "po {count} por semajno",
   "boost_modal.combo": "Vi povas premi {combo} por preterpasi sekvafoje",
-  "bundle_column_error.copy_stacktrace": "Kopii la raporto de error",
+  "bundle_column_error.copy_stacktrace": "Kopii la eraran raporton",
   "bundle_column_error.error.body": "La petita paĝo ne povas redonitis. Eble estas eraro.",
   "bundle_column_error.error.title": "Ho, ve!",
   "bundle_column_error.network.body": "Okazis eraro dum ŝarĝado de ĉi tiu paĝo. Tion povas kaŭzi portempa problemo pri via retkonektado aŭ pri ĉi tiu servilo.",
@@ -91,7 +92,7 @@
   "bundle_column_error.routing.title": "404",
   "bundle_modal_error.close": "Fermi",
   "bundle_modal_error.message": "Io misfunkciis en la ŝargado de ĉi tiu elemento.",
-  "bundle_modal_error.retry": "Provu refoje",
+  "bundle_modal_error.retry": "Bonvolu reprovi",
   "closed_registrations.other_server_instructions": "Ĉar Mastodon estas malcentraliza, vi povas krei konton ĉe alia servilo kaj ankoraŭ komuniki kun ĉi tiu.",
   "closed_registrations_modal.description": "Krei konton ĉe {domain} aktuale ne eblas, tamen bonvole rimarku, ke vi ne bezonas konton specife ĉe {domain} por uzi Mastodon.",
   "closed_registrations_modal.find_another_server": "Trovi alian servilon",
@@ -110,7 +111,7 @@
   "column.lists": "Listoj",
   "column.mutes": "Silentigitaj uzantoj",
   "column.notifications": "Sciigoj",
-  "column.pins": "Alpinglitaj mesaĝoj",
+  "column.pins": "Alpinglitaj afiŝoj",
   "column.public": "Fratara templinio",
   "column_back_button.label": "Reveni",
   "column_header.hide_settings": "Kaŝi la agordojn",
@@ -126,9 +127,9 @@
   "compose.language.change": "Ŝanĝi lingvon",
   "compose.language.search": "Serĉi lingvojn...",
   "compose_form.direct_message_warning_learn_more": "Lerni pli",
-  "compose_form.encryption_warning": "La mesaĵoj en Mastodon ne estas tutvoje ĉifritaj. Ne kundividu tiklajn informojn ĉe Mastodon.",
-  "compose_form.hashtag_warning": "Ĉi tiu mesaĝo ne estos listigita per ajna kradvorto. Nur publikaj mesaĝoj estas serĉeblaj per kradvortoj.",
-  "compose_form.lock_disclaimer": "Via konto ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn mesaĝojn nur al la sekvantoj.",
+  "compose_form.encryption_warning": "La afiŝoj en Mastodon ne estas tutvoje ĉifritaj. Ne kunhavigu tiklajn informojn ĉe Mastodon.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
+  "compose_form.lock_disclaimer": "Via konto ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn afiŝojn nur al la sekvantoj.",
   "compose_form.lock_disclaimer.lock": "ŝlosita",
   "compose_form.placeholder": "Kion vi pensas?",
   "compose_form.poll.add_option": "Aldoni elekteblon",
@@ -154,7 +155,7 @@
   "confirmations.cancel_follow_request.confirm": "Eksigi peton",
   "confirmations.cancel_follow_request.message": "Ĉu vi certas ke vi volas eksigi vian peton por sekvi {name}?",
   "confirmations.delete.confirm": "Forigi",
-  "confirmations.delete.message": "Ĉu vi certas, ke vi volas forigi ĉi tiun mesaĝon?",
+  "confirmations.delete.message": "Ĉu vi certas, ke vi volas forigi ĉi tiun afiŝon?",
   "confirmations.delete_list.confirm": "Forigi",
   "confirmations.delete_list.message": "Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston?",
   "confirmations.discard_edit_media.confirm": "Forĵeti",
@@ -167,7 +168,7 @@
   "confirmations.mute.explanation": "Tio kaŝos la mesaĝojn de la uzanto kaj la mesaĝojn kiuj mencias rin, sed ri ankoraŭ rajtos vidi viajn mesaĝojn kaj sekvi vin.",
   "confirmations.mute.message": "Ĉu vi certas, ke vi volas silentigi {name}?",
   "confirmations.redraft.confirm": "Forigi kaj reskribi",
-  "confirmations.redraft.message": "Ĉu vi certas ke vi volas forigi tiun mesaĝon kaj reskribi ĝin? Ĉiuj diskonigoj kaj stelumoj estos perditaj, kaj respondoj al la originala mesaĝo estos senparentaj.",
+  "confirmations.redraft.message": "Ĉu vi certas ke vi volas forigi tiun afiŝon kaj reskribi ĝin? Ĉiuj diskonigoj kaj stelumoj estos perditaj, kaj respondoj al la originala mesaĝo estos senparentaj.",
   "confirmations.reply.confirm": "Respondi",
   "confirmations.reply.message": "Respondi nun anstataŭigos la mesaĝon, kiun vi nun skribas. Ĉu vi certas, ke vi volas daŭrigi?",
   "confirmations.unfollow.confirm": "Ne plu sekvi",
@@ -186,7 +187,7 @@
   "disabled_account_banner.text": "Via konto {disabledAccount} estas nune malvalidigita.",
   "dismissable_banner.community_timeline": "Jen la plej novaj publikaj afiŝoj de uzantoj, kies kontojn gastigas {domain}.",
   "dismissable_banner.dismiss": "Eksigi",
-  "dismissable_banner.explore_links": "Tiuj novaĵoj estas aktuale priparolataj de uzantoj el ĉi tiu servilo, kaj el aliaj, sur la malcentralizita reto.",
+  "dismissable_banner.explore_links": "Tiuj novaĵoj estas aktuale priparolataj de uzantoj en tiu ĉi kaj aliaj serviloj, sur la malcentrigita reto.",
   "dismissable_banner.explore_statuses": "Ĉi tiuj mesaĝoj de ĉi tiu kaj aliaj serviloj en la malcentra reto pli populariĝas en ĉi tiu servilo nun.",
   "dismissable_banner.explore_tags": "Ĉi tiuj kradvostoj populariĝas en ĉi tiu kaj aliaj serviloj en la malcentraliza reto nun.",
   "dismissable_banner.public_timeline": "Ĉi tiuj estas plej lastaj publika mesaĝoj de personoj ĉe ĉi tiu kaj aliaj serviloj de la malcentra reto kiun ĉi tiu servilo scias.",
@@ -216,7 +217,7 @@
   "empty_column.direct": "Vi ankoraŭ ne havas rektan mesaĝon. Kiam vi sendos aŭ ricevos iun, ĝi aperos ĉi tie.",
   "empty_column.domain_blocks": "Ankoraŭ neniu domajno estas blokita.",
   "empty_column.explore_statuses": "Nenio tendencas nun. Rekontrolu poste!",
-  "empty_column.favourited_statuses": "Vi ankoraŭ ne stelumis mesaĝon. Kiam vi stelumos iun, ĝi aperos ĉi tie.",
+  "empty_column.favourited_statuses": "Vi ankoraŭ ne stelumis afiŝon. Kiam vi stelumos iun, ĝi aperos ĉi tie.",
   "empty_column.favourites": "Ankoraŭ neniu stelumis tiun mesaĝon. Kiam iu faros tion, tiu aperos ĉi tie.",
   "empty_column.follow_recommendations": "Ŝajnas, ke neniuj sugestoj povis esti generitaj por vi. Vi povas provi uzi serĉon por serĉi homojn, kiujn vi eble konas, aŭ esplori tendencajn kradvortojn.",
   "empty_column.follow_requests": "Vi ne ankoraŭ havas iun peton de sekvado. Kiam vi ricevos unu, ĝi aperos ĉi tie.",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Kopii stakspuron en tondujo",
   "errors.unexpected_crash.report_issue": "Raporti problemon",
   "explore.search_results": "Serĉaj rezultoj",
+  "explore.suggested_follows": "For you",
   "explore.title": "Esplori",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Afiŝoj",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "Ĉi tiu filtrilkategorio ne kongruas la kuntekston de ĉi tiu mesaĝo. Vi devas redakti la filtrilon.",
   "filter_modal.added.context_mismatch_title": "Ne kongruas la kunteksto!",
   "filter_modal.added.expired_explanation": "Ĉi tiu filtrilkategorio eksvalidiĝis, vu bezonos ŝanĝi la eksvaliddaton por ĝi.",
@@ -387,7 +392,7 @@
   "not_signed_in_indicator.not_signed_in": "Necesas saluti por aliri tiun rimedon.",
   "notification.admin.report": "{name} raportis {target}",
   "notification.admin.sign_up": "{name} kreis konton",
-  "notification.favourite": "{name} stelumis vian mesaĝon",
+  "notification.favourite": "{name} stelumis vian afiŝon",
   "notification.follow": "{name} eksekvis vin",
   "notification.follow_request": "{name} petis sekvi vin",
   "notification.mention": "{name} menciis vin",
@@ -505,7 +510,7 @@
   "report.thanks.title": "Ĉu vi ne volas vidi ĉi tion?",
   "report.thanks.title_actionable": "Dankon pro raporti, ni esploros ĉi tion.",
   "report.unfollow": "Malsekvi @{name}",
-  "report.unfollow_explanation": "Vi sekvas ĉi tiun konton. Por ne plu vidi ĝiajn abonfluojn en via hejma templinio, ĉesu sekvi ĝin.",
+  "report.unfollow_explanation": "Vi sekvas ĉi tiun konton. Por ne plu vidi ĝiajn afiŝojn en via hejma templinio, ĉesu sekvi ĝin.",
   "report_notification.attached_statuses": "{count, plural, one {{count} afiŝo almetita} other {{count} afiŝoj almetitaj}}",
   "report_notification.categories.other": "Alia",
   "report_notification.categories.spam": "Trudmesaĝo",
@@ -516,7 +521,7 @@
   "search_popout.search_format": "Detala serĉo",
   "search_popout.tips.full_text": "Simplaj tekstoj montras la mesaĝojn, kiujn vi skribis, stelumis, diskonigis, aŭ en kiuj vi estis menciita, sed ankaŭ kongruajn uzantnomojn, montratajn nomojn, kaj kradvortojn.",
   "search_popout.tips.hashtag": "kradvorto",
-  "search_popout.tips.status": "mesaĝoj",
+  "search_popout.tips.status": "afiŝoj",
   "search_popout.tips.text": "Simpla teksto montras la kongruajn afiŝitajn nomojn, uzantnomojn kaj kradvortojn",
   "search_popout.tips.user": "uzanto",
   "search_results.accounts": "Homoj",
@@ -524,7 +529,7 @@
   "search_results.hashtags": "Kradvortoj",
   "search_results.nothing_found": "Povis trovi nenion por ĉi tiuj serĉaj terminoj",
   "search_results.statuses": "Mesaĝoj",
-  "search_results.statuses_fts_disabled": "Serĉi mesaĝojn laŭ enhavo ne estas ebligita en ĉi tiu Mastodon-servilo.",
+  "search_results.statuses_fts_disabled": "Serĉi afiŝojn laŭ enhavo ne estas ebligita en ĉi tiu Mastodon-servilo.",
   "search_results.title": "Serĉ-rezultoj por {q}",
   "search_results.total": "{count, number} {count, plural, one {rezulto} other {rezultoj}}",
   "server_banner.about_active_users": "Personoj uzantaj ĉi tiun servilon dum la lastaj 30 tagoj (Aktivaj Uzantoj Monate)",
@@ -535,8 +540,9 @@
   "server_banner.server_stats": "Statistikoj de la servilo:",
   "sign_in_banner.create_account": "Krei konton",
   "sign_in_banner.sign_in": "Saluti",
-  "sign_in_banner.text": "Ensalutu por sekvi profilojn aŭ kradvortojn, stelumi, kunhavigi kaj respondi afiŝojn aŭ interagi per via konto de alia servilo.",
+  "sign_in_banner.text": "Ensalutu por sekvi profilojn aŭ kradvortojn, stelumi, diskonigi afiŝojn kaj respondi al ili, aŭ interagi per via konto de alia servilo.",
   "status.admin_account": "Malfermi fasadon de moderigado por @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Malfermi ĉi tiun mesaĝon en la kontrola interfaco",
   "status.block": "Bloki @{name}",
   "status.bookmark": "Aldoni al la legosignoj",
@@ -618,7 +624,7 @@
   "upload_error.limit": "Limo de dosiera alŝutado transpasita.",
   "upload_error.poll": "Alŝuto de dosiero ne permesita kun balotenketo.",
   "upload_form.audio_description": "Priskribi por homoj kiuj malfacile aŭdi",
-  "upload_form.description": "Priskribi por misvidantaj homoj",
+  "upload_form.description": "Priskribi por personoj, kiuj estas blindaj aŭ havas vidmalsufiĉon",
   "upload_form.description_missing": "Neniu priskribo aldonita",
   "upload_form.edit": "Redakti",
   "upload_form.thumbnail": "Ŝanĝi etigita bildo",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index 4540ab5d0..cd6e91e67 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Mnsjs y resp. públicas",
   "account.report": "Denunciar a @{name}",
   "account.requested": "Esperando aprobación. Hacé clic para cancelar la solicitud de seguimiento",
+  "account.requested_follow": "{name} solicitó seguirte",
   "account.share": "Compartir el perfil de @{name}",
   "account.show_reblogs": "Mostrar adhesiones de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Mensaje} other {{counter} Mensajes}}",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copiar stacktrace al portapapeles",
   "errors.unexpected_crash.report_issue": "Informar problema",
   "explore.search_results": "Resultados de búsqueda",
+  "explore.suggested_follows": "Para vos",
   "explore.title": "Explorá",
+  "explore.trending_links": "Novedades",
+  "explore.trending_statuses": "Mensajes",
+  "explore.trending_tags": "Etiquetas",
   "filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro no se aplica al contexto en el que accediste a este mensaje. Si querés que el mensaje sea filtrado también en este contexto, vas a tener que editar el filtro.",
   "filter_modal.added.context_mismatch_title": "¡El contexto no coincide!",
   "filter_modal.added.expired_explanation": "Esta categoría de filtro caducó; vas a necesitar cambiar la fecha de caducidad para que se aplique.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Iniciar sesión",
   "sign_in_banner.text": "Iniciá sesión para seguir cuentas o etiquetas, marcar mensajes como favoritos, compartirlos y responderlos o interactuar desde tu cuenta en un servidor diferente.",
   "status.admin_account": "Abrir interface de moderación para @{name}",
+  "status.admin_domain": "Abrir interface de moderación para {domain}",
   "status.admin_status": "Abrir este mensaje en la interface de moderación",
   "status.block": "Bloquear a @{name}",
   "status.bookmark": "Marcar",
diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json
index c5ec5d098..00c815554 100644
--- a/app/javascript/mastodon/locales/es-MX.json
+++ b/app/javascript/mastodon/locales/es-MX.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Publicaciones y respuestas",
   "account.report": "Denunciar a @{name}",
   "account.requested": "Esperando aprobación. Haga clic para cancelar la solicitud de seguimiento",
+  "account.requested_follow": "{name} ha solicitado seguirte",
   "account.share": "Compartir el perfil de @{name}",
   "account.show_reblogs": "Mostrar retoots de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Buscar idiomas...",
   "compose_form.direct_message_warning_learn_more": "Aprender mas",
   "compose_form.encryption_warning": "Las publicaciones en Mastodon no están cifradas de extremo a extremo. No comparta ninguna información sensible en Mastodon.",
-  "compose_form.hashtag_warning": "Esta publicación no se mostrará bajo ningún hashtag porque no está listada. Sólo las publicaciones públicas se pueden buscar por hashtag.",
+  "compose_form.hashtag_warning": "Este toot no será listado bajo ningún hashtag dado que no es público. Solo toots públicos pueden ser buscados por hashtag.",
   "compose_form.lock_disclaimer": "Tu cuenta no está bloqueada. Todos pueden seguirte para ver tus toots solo para seguidores.",
   "compose_form.lock_disclaimer.lock": "bloqueado",
   "compose_form.placeholder": "¿En qué estás pensando?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copiar el seguimiento de pila en el portapapeles",
   "errors.unexpected_crash.report_issue": "Informar problema",
   "explore.search_results": "Resultados de búsqueda",
+  "explore.suggested_follows": "Para ti",
   "explore.title": "Descubrir",
+  "explore.trending_links": "Noticias",
+  "explore.trending_statuses": "Publicaciones",
+  "explore.trending_tags": "Etiquetas",
   "filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro no se aplica al contexto en el que has accedido a esta publlicación. Si quieres que la publicación sea filtrada también en este contexto, tendrás que editar el filtro.",
   "filter_modal.added.context_mismatch_title": "¡El contexto no coincide!",
   "filter_modal.added.expired_explanation": "Esta categoría de filtro ha caducado, necesitaras cambiar la fecha de caducidad para que se aplique.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Iniciar sesión",
   "sign_in_banner.text": "Inicia sesión para seguir perfiles o etiquetas, marcar favorito, compartir y responder a publicaciones, o interactua desde tu cuenta en un servidor diferente.",
   "status.admin_account": "Abrir interfaz de moderación para @{name}",
+  "status.admin_domain": "Abrir interfaz de moderación para {domain}",
   "status.admin_status": "Abrir este estado en la interfaz de moderación",
   "status.block": "Bloquear a @{name}",
   "status.bookmark": "Añadir marcador",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 53dd4c387..0c1b3c690 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Publicaciones y respuestas",
   "account.report": "Reportar a @{name}",
   "account.requested": "Esperando aprobación. Clica para cancelar la solicitud de seguimiento",
+  "account.requested_follow": "{name} ha solicitado seguirte",
   "account.share": "Compartir el perfil de @{name}",
   "account.show_reblogs": "Mostrar impulsos de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Publicación} other {{counter} Publicaciones}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Buscar idiomas...",
   "compose_form.direct_message_warning_learn_more": "Aprender más",
   "compose_form.encryption_warning": "Las publicaciones en Mastodon no están cifradas de extremo a extremo. No comparta ninguna información sensible en Mastodon.",
-  "compose_form.hashtag_warning": "Esta publicación no se mostrará bajo ningún hashtag porque no está listada. Sólo las publicaciones públicas se pueden buscar por hashtag.",
+  "compose_form.hashtag_warning": "Esta publicación no se mostrará bajo ningún hashtag no está pública. Solo las publicaciones públicas se pueden buscar por hashtag.",
   "compose_form.lock_disclaimer": "Tu cuenta no está {locked}. Todos pueden seguirte para ver tus publicaciones solo para seguidores.",
   "compose_form.lock_disclaimer.lock": "bloqueado",
   "compose_form.placeholder": "¿En qué estás pensando?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copiar el seguimiento de pila en el portapapeles",
   "errors.unexpected_crash.report_issue": "Informar de un problema/error",
   "explore.search_results": "Resultados de búsqueda",
+  "explore.suggested_follows": "Para ti",
   "explore.title": "Explorar",
+  "explore.trending_links": "Noticias",
+  "explore.trending_statuses": "Publicaciones",
+  "explore.trending_tags": "Etiquetas",
   "filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro no se aplica al contexto en el que ha accedido a esta publlicación. Si quieres que la publicación sea filtrada también en este contexto, tendrás que editar el filtro.",
   "filter_modal.added.context_mismatch_title": "¡El contexto no coincide!",
   "filter_modal.added.expired_explanation": "Esta categoría de filtro ha caducado, necesitará cambiar la fecha de caducidad para que se aplique.",
@@ -272,7 +277,7 @@
   "hashtag.column_header.tag_mode.none": "sin {additional}",
   "hashtag.column_settings.select.no_options_message": "No se encontraron sugerencias",
   "hashtag.column_settings.select.placeholder": "Introduzca hashtags…",
-  "hashtag.column_settings.tag_mode.all": "Cualquiera de estos",
+  "hashtag.column_settings.tag_mode.all": "Todos estos",
   "hashtag.column_settings.tag_mode.any": "Cualquiera de estos",
   "hashtag.column_settings.tag_mode.none": "Ninguno de estos",
   "hashtag.column_settings.tag_toggle": "Incluir etiquetas adicionales en esta columna",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Iniciar sesión",
   "sign_in_banner.text": "Inicia sesión en este servidor para seguir perfiles o etiquetas, guardar, compartir y responder a mensajes. También puedes interactuar desde otra cuenta en un servidor diferente.",
   "status.admin_account": "Abrir interfaz de moderación para @{name}",
+  "status.admin_domain": "Abrir interfaz de moderación para {domain}",
   "status.admin_status": "Abrir este estado en la interfaz de moderación",
   "status.block": "Bloquear a @{name}",
   "status.bookmark": "Añadir marcador",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index 19064ec04..5b36f41e4 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -3,11 +3,11 @@
   "about.contact": "Kontakt:",
   "about.disclaimer": "Mastodon on tasuta ja vaba tarkvara ning Mastodon gGmbH kaubamärk.",
   "about.domain_blocks.no_reason_available": "Mittesaadavuse põhjus",
-  "about.domain_blocks.preamble": "Mastodon tavaliselt lubab Teil vaadata sisu ning suhelda kasutajatega üks kõik millisest teisest serverist fediversumis. Need on erandid, mis on paika pandud sellel kindlal serveril.",
+  "about.domain_blocks.preamble": "Mastodon lubab tavaliselt vaadata sisu ning suhelda kasutajatega ükskõik millisest teisest fediversumi serverist. Need on erandid, mis on paika pandud sellel kindlal serveril.",
   "about.domain_blocks.silenced.explanation": "Sa ei näe üldiselt profiile ja sisu sellelt serverilt, kui sa just tahtlikult seda ei otsi või jälgimise moel nõusolekut ei anna.",
   "about.domain_blocks.silenced.title": "Piiratud",
-  "about.domain_blocks.suspended.explanation": "Mitte mingeid andmeid sellelt serveritl ei töödelda, salvestata ega vahetata, tehes igasuguse interaktsiooni või kirjavahetuse kasutajatega sellelt serverilt võimatuks.",
-  "about.domain_blocks.suspended.title": "Kustutatud",
+  "about.domain_blocks.suspended.explanation": "Mitte mingeid andmeid sellelt serverilt ei töödelda, salvestata ega vahetata, tehes igasuguse interaktsiooni või kirjavahetuse selle serveri kasutajatega võimatuks.",
+  "about.domain_blocks.suspended.title": "Peatatud",
   "about.not_available": "See info ei ole sellel serveril saadavaks tehtud.",
   "about.powered_by": "Hajutatud sotsiaalmeedia, mille taga on {mastodon}",
   "about.rules": "Serveri reeglid",
@@ -19,12 +19,12 @@
   "account.block_domain": "Peida kõik domeenist {domain}",
   "account.blocked": "Blokeeritud",
   "account.browse_more_on_origin_server": "Vaata rohkem algsel profiilil",
-  "account.cancel_follow_request": "Võta tagasi jälgimistaotlus",
-  "account.direct": "Saada otsesõnum @{name}'ile",
-  "account.disable_notifications": "Ära teavita, kui @{name} postitab",
+  "account.cancel_follow_request": "Võta jälgimistaotlus tagasi",
+  "account.direct": "Otsesõnum kasutajale @{name}",
+  "account.disable_notifications": "Peata teavitused @{name} postitustest",
   "account.domain_blocked": "Domeen peidetud",
   "account.edit_profile": "Muuda profiili",
-  "account.enable_notifications": "Teavita mind, kui @{name} postitab",
+  "account.enable_notifications": "Teavita mind @{name} postitustest",
   "account.endorse": "Too profiilil esile",
   "account.featured_tags.last_status_at": "Viimane postitus {date}",
   "account.featured_tags.last_status_never": "Postitusi pole",
@@ -36,13 +36,13 @@
   "account.following": "Jälgib",
   "account.following_counter": "{count, plural, one {{counter} jälgitav} other {{counter} jälgitavat}}",
   "account.follows.empty": "See kasutaja ei jälgi veel kedagi.",
-  "account.follows_you": "Jälgib",
+  "account.follows_you": "Jälgib sind",
   "account.go_to_profile": "Mine profiilile",
   "account.hide_reblogs": "Peida @{name} jagamised",
   "account.joined_short": "Liitus",
   "account.languages": "Muuda tellitud keeli",
   "account.link_verified_on": "Selle lingi autorsust kontrolliti {date}",
-  "account.locked_info": "Selle konto privaatsussätteks on lukustatud. Omanik vaatab manuaalselt üle, kes teda jägida saab.",
+  "account.locked_info": "Selle konto privaatsussätteks on lukustatud. Omanik vaatab käsitsi üle, kes teda jälgida saab.",
   "account.media": "Meedia",
   "account.mention": "Maini @{name}",
   "account.moved_to": "{name} on teada andnud, et ta uus konto on nüüd:",
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Postitused ja vastused",
   "account.report": "Raporteeri @{name}",
   "account.requested": "Ootab kinnitust. Klõpsa jälgimise soovi tühistamiseks",
+  "account.requested_follow": "{name} on taodelnud sinu jälgimist",
   "account.share": "Jaga @{name} profiili",
   "account.show_reblogs": "Näita @{name} jagamisi",
   "account.statuses_counter": "{count, plural, one {{counter} postitus} other {{counter} postitust}}",
@@ -64,7 +65,7 @@
   "account.unfollow": "Jälgid",
   "account.unmute": "Ära vaigista @{name}",
   "account.unmute_notifications": "Ära vaigista teateid kasutajalt @{name}",
-  "account.unmute_short": "Lõpeta vaigistus",
+  "account.unmute_short": "Lõpeta vaigistamine",
   "account_note.placeholder": "Klõpsa märkme lisamiseks",
   "admin.dashboard.daily_retention": "Kasutajate päevane allesjäämine peale registreerumist",
   "admin.dashboard.monthly_retention": "Kasutajate kuine allesjäämine peale registreerumist",
@@ -72,7 +73,7 @@
   "admin.dashboard.retention.cohort": "Registreerumiskuu",
   "admin.dashboard.retention.cohort_size": "Uued kasutajad",
   "alert.rate_limited.message": "Palun proovi uuesti pärast {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Piiratud",
+  "alert.rate_limited.title": "Kiiruspiirang",
   "alert.unexpected.message": "Tekkis ootamatu viga.",
   "alert.unexpected.title": "Oih!",
   "announcement.announcement": "Teadaanne",
@@ -81,21 +82,21 @@
   "autosuggest_hashtag.per_week": "{count} nädalas",
   "boost_modal.combo": "Vajutades {combo}, saab selle edaspidi vahele jätta",
   "bundle_column_error.copy_stacktrace": "Kopeeri veateade",
-  "bundle_column_error.error.body": "Soovitud lehte ei suudetud esitleda. See võib olla mingi koodivea tagajärg või probleem brauseri ühilduvusega.",
+  "bundle_column_error.error.body": "Soovitud lehte ei õnnestunud esitada. See võib olla meie koodiviga või probleem brauseri ühilduvusega.",
   "bundle_column_error.error.title": "Oh, ei!",
-  "bundle_column_error.network.body": "Selle lehe laadimisel tekkis tõrge. See võib olla ajutine probleem internetiühendusega või selle serveriga.",
+  "bundle_column_error.network.body": "Lehe laadimisel tekkis tõrge. See võib olla ajutine probleem internetiühendusega või selle serveriga.",
   "bundle_column_error.network.title": "Võrguühenduse viga",
   "bundle_column_error.retry": "Proovi uuesti",
   "bundle_column_error.return": "Tagasi koju",
-  "bundle_column_error.routing.body": "Päritud lehte ei leitud. Kas URL aadressiribal on õige?",
+  "bundle_column_error.routing.body": "Päritud lehte ei leitud. Kas URL on aadressiribal õige?",
   "bundle_column_error.routing.title": "404",
   "bundle_modal_error.close": "Sulge",
   "bundle_modal_error.message": "Selle komponendi laadimisel läks midagi viltu.",
   "bundle_modal_error.retry": "Proovi uuesti",
   "closed_registrations.other_server_instructions": "Kuna Mastodon on detsentraliseeritud, võib konto teha teise serverisse ja sellegipoolest siinse kontoga suhelda.",
-  "closed_registrations_modal.description": "Praegu ei ole võimalik teha {domain} peale kontot, aga pidage meeles, et teil ei pea olema just {domain} konto, et Mastodoni kasutada.",
+  "closed_registrations_modal.description": "Praegu ei ole võimalik teha {domain} peale kontot, aga pea meeles, et sul ei pea olema just {domain} konto, et Mastodoni kasutada.",
   "closed_registrations_modal.find_another_server": "Leia teine server",
-  "closed_registrations_modal.preamble": "Mastodon on detsentraliseeritud, mis tähendab seda, et ükskõik kuhu konto luua, võib jälgida ja suhelda igaühega sellel serveril. Võib isegi oma serveri püsti panna!",
+  "closed_registrations_modal.preamble": "Mastodon on detsentraliseeritud, mis tähendab, et konto võib luua ükskõik kuhu, kuid ikkagi saab jälgida ja suhelda igaühega sellel serveril. Võib isegi oma serveri püsti panna!",
   "closed_registrations_modal.title": "Mastodoni registreerumine",
   "column.about": "Teave",
   "column.blocks": "Blokeeritud kasutajad",
@@ -107,7 +108,7 @@
   "column.favourites": "Lemmikud",
   "column.follow_requests": "Jälgimistaotlused",
   "column.home": "Kodu",
-  "column.lists": "Nimistud",
+  "column.lists": "Nimekirjad",
   "column.mutes": "Vaigistatud kasutajad",
   "column.notifications": "Teated",
   "column.pins": "Kinnitatud postitused",
@@ -126,52 +127,52 @@
   "compose.language.change": "Muuda keelt",
   "compose.language.search": "Otsi keeli...",
   "compose_form.direct_message_warning_learn_more": "Vaata täpsemalt",
-  "compose_form.encryption_warning": "Postitused Mastodonis ei ole otsast-otsani krüpteeritud. Ärge jagage mingeid delikaatseid andmeid Mastodoni kaudu.",
-  "compose_form.hashtag_warning": "Seda postitust ei kuvata ühegi sildi all, sest see ei ole leitav avastustoimingute kaudu. Ainult avalikud postitused on sildi järgi otsitavad.",
-  "compose_form.lock_disclaimer": "Teie konto ei ole {locked}. Igaüks saab teid jälgida ja näha teie ainult-jälgijatele postitusi.",
+  "compose_form.encryption_warning": "Postitused Mastodonis ei ole otsast-otsani krüpteeritud. Ära jaga mingeid delikaatseid andmeid Mastodoni kaudu.",
+  "compose_form.hashtag_warning": "See postitus ei ilmu ühegi märksõna all, kuna pole avalik. Vaid avalikud postitused on märksõnade kaudu leitavad.",
+  "compose_form.lock_disclaimer": "Su konto ei ole {locked}. Igaüks saab sind jälgida, et näha su ainult-jälgijatele postitusi.",
   "compose_form.lock_disclaimer.lock": "lukus",
   "compose_form.placeholder": "Millest mõtled?",
   "compose_form.poll.add_option": "Lisa valik",
   "compose_form.poll.duration": "Küsitluse kestus",
   "compose_form.poll.option_placeholder": "Valik {number}",
   "compose_form.poll.remove_option": "Eemalda see valik",
-  "compose_form.poll.switch_to_multiple": "Muuda küsitlust lubamaks mitut valikut",
-  "compose_form.poll.switch_to_single": "Muuda küsitlust lubamaks ainult ühte valikut",
+  "compose_form.poll.switch_to_multiple": "Muuda küsitlust mitmikvaliku lubamiseks",
+  "compose_form.poll.switch_to_single": "Muuda küsitlust ainult ühe valiku lubamiseks",
   "compose_form.publish": "Postita",
   "compose_form.publish_form": "Postita",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Salvesta muudatused",
-  "compose_form.sensitive.hide": "Märgista meedia tundlikuks",
-  "compose_form.sensitive.marked": "Meedia on sensitiivseks märgitud",
-  "compose_form.sensitive.unmarked": "Meedia ei ole sensitiivseks märgitud",
-  "compose_form.spoiler.marked": "Tekst on hoiatuse taha peidetud",
+  "compose_form.sensitive.hide": "{count, plural, one {Märgi meedia tundlikuks} other {Märgi meediad tundlikuks}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Meedia on märgitud tundlikuks} other {Meediad on märgitud tundlikuks}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Meedia ei ole tundlikuks märgitud} other {Meediad ei ole märgitud tundlikuks}}",
+  "compose_form.spoiler.marked": "Tekst on peidetud hoiatuse taha",
   "compose_form.spoiler.unmarked": "Märgi sisu tundlikuks",
-  "compose_form.spoiler_placeholder": "Kirjutage oma hoiatus siia",
+  "compose_form.spoiler_placeholder": "Kirjuta hoiatus siia",
   "confirmation_modal.cancel": "Katkesta",
   "confirmations.block.block_and_report": "Blokeeri ja teata",
   "confirmations.block.confirm": "Blokeeri",
-  "confirmations.block.message": "Kindel, et blokeerida {name}?",
+  "confirmations.block.message": "Oled kindel, et soovid blokeerida {name}?",
   "confirmations.cancel_follow_request.confirm": "Tühista taotlus",
-  "confirmations.cancel_follow_request.message": "Olete kindel, et tahate võtta tagasi taotluse jälgida kasutajat {name}?",
+  "confirmations.cancel_follow_request.message": "Oled kindel, et soovid kasutaja {name} jälgimistaotluse tagasi võtta?",
   "confirmations.delete.confirm": "Kustuta",
-  "confirmations.delete.message": "Olete kindel, et soovite selle staatuse kustutada?",
+  "confirmations.delete.message": "Oled kindel, et soovid postituse kustutada?",
   "confirmations.delete_list.confirm": "Kustuta",
-  "confirmations.delete_list.message": "Olete kindel, et soovite selle nimekirja pöördumatult kustutada?",
+  "confirmations.delete_list.message": "Oled kindel, et soovid selle loetelu pöördumatult kustutada?",
   "confirmations.discard_edit_media.confirm": "Hülga",
-  "confirmations.discard_edit_media.message": "Teil on salvestamata muudatused meediakirjelduses või eelvaates, kas hülgame need?",
+  "confirmations.discard_edit_media.message": "Sul on salvestamata muudatusi meediakirjelduses või eelvaates, kas hülgad need?",
   "confirmations.domain_block.confirm": "Peida terve domeen",
-  "confirmations.domain_block.message": "Olete ikka päris kindel, et soovite blokeerida terve {domain}? Enamikul juhtudel piisab mõnest sihitud blokist või vaigistusest, mis on eelistatav. Te ei näe selle domeeni sisu üheski avalikus ajajoones või teadetes. Teie jälgijad sellest domeenist eemaldatakse.",
+  "confirmations.domain_block.message": "Oled ikka päris-päris kindel, et soovid blokeerida terve {domain}? Enamikel juhtudel piisab mõnest sihitud blokist või vaigistusest, mis on eelistatavam. Sa ei näe selle domeeni sisu ühelgi avalikul ajajoonel või enda teadetes. Su jälgijad sellest domeenist eemaldatakse.",
   "confirmations.logout.confirm": "Välju",
-  "confirmations.logout.message": "Kas olete kindel, et soovite välja logida?",
+  "confirmations.logout.message": "Kas oled kindel, et soovid välja logida?",
   "confirmations.mute.confirm": "Vaigista",
-  "confirmations.mute.explanation": "See peidab postitusi temalt ning postitusi, kus mainitakse neid, kuid see lubab neil ikka näha teie postitusi ning teid jälgida.",
-  "confirmations.mute.message": "Olete kindel, et soovite {name} vaigistada?",
+  "confirmations.mute.explanation": "See peidab tema postitused ning postitused, milles teda mainitakse, kuid lubab tal ikkagi sinu postitusi näha ning sind jälgida.",
+  "confirmations.mute.message": "Oled kindel, et soovid {name} vaigistada?",
   "confirmations.redraft.confirm": "Kustuta & taasalusta",
   "confirmations.redraft.message": "Kas kustutada postitus ja võtta uue aluseks? Meeldimised ja jagamised lähevad kaotsi ning vastused jäävad ilma algse postituseta.",
   "confirmations.reply.confirm": "Vasta",
-  "confirmations.reply.message": "Praegu vastamine kirjutab üle sõnumi, mida hetkel koostate. Olete kindel, et soovite jätkata?",
+  "confirmations.reply.message": "Praegu vastamine kirjutab hetkel koostatava sõnumi üle. Oled kindel, et soovid jätkata?",
   "confirmations.unfollow.confirm": "Ära jälgi",
-  "confirmations.unfollow.message": "Olete kindel, et ei soovi rohkem jälgida kasutajat {name}?",
+  "confirmations.unfollow.message": "Oled kindel, et ei soovi rohkem jälgida kasutajat {name}?",
   "conversation.delete": "Kustuta vestlus",
   "conversation.mark_as_read": "Märgi loetuks",
   "conversation.open": "Vaata vestlust",
@@ -183,14 +184,14 @@
   "directory.new_arrivals": "Uustulijad",
   "directory.recently_active": "Hiljuti aktiivne",
   "disabled_account_banner.account_settings": "Kontosätted",
-  "disabled_account_banner.text": "Teie konto {disabledAccount} ei ole praegu kasutusvõimeline.",
+  "disabled_account_banner.text": "Su konto {disabledAccount} on hetkel keelatud.",
   "dismissable_banner.community_timeline": "Need on kõige viimased avalikud postitused inimestelt, kelle kontosid majutab {domain}.",
   "dismissable_banner.dismiss": "Sulge",
   "dismissable_banner.explore_links": "Need on uudised, millest inimesed siin ja teistes serverites üle detsentraliseeritud võrgu praegu räägivad.",
   "dismissable_banner.explore_statuses": "Need postitused siit ja teistes serveritest detsentraliseeritud võrgus koguvad tähelepanu just praegu selles serveris.",
   "dismissable_banner.explore_tags": "Need sildid siit ja teistes serveritest detsentraliseeritud võrgus koguvad tähelepanu just praegu selles serveris.",
   "dismissable_banner.public_timeline": "Need on kõige uuemad avalikud postitused inimestelt selles ja teistes serverites üle detsentraliseeritud võrgu, millest see server on teadlik.",
-  "embed.instructions": "Manusta see staatus oma veebilehele, kopeerides alloleva koodi.",
+  "embed.instructions": "Lisa see postitus oma veebilehele, kopeerides alloleva koodi.",
   "embed.preview": "Nii näeb see välja:",
   "emoji_button.activity": "Tegevus",
   "emoji_button.clear": "Tühjenda",
@@ -211,38 +212,42 @@
   "empty_column.account_timeline": "Siin postitusi ei ole!",
   "empty_column.account_unavailable": "Profiil pole saadaval",
   "empty_column.blocks": "Blokeeritud kasutajaid pole.",
-  "empty_column.bookmarked_statuses": "Teil pole veel järjehoidjatesse lisatud postitusi. Kui lisate mõne, näete neid siin.",
-  "empty_column.community": "Kohalik ajajoon on tühi. Kirjutage midagi avalikult, et pall veerema ajada!",
-  "empty_column.direct": "Teil ei ole veel otsesõnumeid. Kui saadate või võtate mõne vastu, ilmuvad nad siia.",
+  "empty_column.bookmarked_statuses": "Järjehoidjatesse pole veel lisatud postitusi. Kui lisad mõne, näed neid siin.",
+  "empty_column.community": "Kohalik ajajoon on tühi. Kirjuta midagi avalikult, et pall veerema ajada!",
+  "empty_column.direct": "Ei ole veel otsesõnumeid. Kui saadad või võtad mõne vastu, ilmuvad nad siia.",
   "empty_column.domain_blocks": "Siin ei ole veel peidetud domeene.",
   "empty_column.explore_statuses": "Praegu pole ühtegi trendi. Tule hiljem tagasi!",
-  "empty_column.favourited_statuses": "Teil pole veel lemmikpostitusi. Kui märgite mõne, näete neid siin.",
+  "empty_column.favourited_statuses": "Pole veel lemmikpostitusi. Kui märgid mõne, näed neid siin.",
   "empty_column.favourites": "Keegi pole veel seda postitust lemmikuks märkinud. Kui seegi seda teeb, näed seda siin.",
-  "empty_column.follow_recommendations": "Tundub, et teie jaoks ei ole võimalik soovitusi tekitada. Proovige kasutada otsingut, et leida inimesi, keda te teate või sirvida trendivaid silte.",
-  "empty_column.follow_requests": "Teil pole hetkel ühtegi jälgimistaotlust. Kui saate mõne, näete neid siin.",
+  "empty_column.follow_recommendations": "Tundub, et sinu jaoks ei ole võimalik soovitusi luua. Proovi kasutada otsingut, et leida tuttavaid inimesi, või sirvi populaarseid silte.",
+  "empty_column.follow_requests": "Pole hetkel ühtegi jälgimistaotlust. Kui saad mõne, näed neid siin.",
   "empty_column.hashtag": "Seda sildi all ei ole ühtegi postitust.",
-  "empty_column.home": "Teie kodu ajajoon on tühi! Külastage {public} või kasutage otsingut alustamaks ja kohtamaks teisi kasutajaid.",
+  "empty_column.home": "Su koduajajoon on tühi. Jälgi rohkemaid inimesi, et seda täita {suggestions}",
   "empty_column.home.suggestions": "Vaata mõndasid soovitusi",
-  "empty_column.list": "Siin nimistus pole veel midagi. Kui nimistu liikmed teevad uusi postitusi, näed neid siin.",
-  "empty_column.lists": "Teil pole veel ühtegi nimekirja. Kui loote mõne, näete neid siin.",
-  "empty_column.mutes": "Te pole veel ühtegi kasutajat vaigistanud.",
-  "empty_column.notifications": "Teil ei ole veel teateid. Suhelge teistega alustamaks vestlust.",
-  "empty_column.public": "Siin pole midagi! Kirjuta midagi avalikut või jälgi ise kasutajaid täitmaks seda ruumi",
-  "error.unexpected_crash.explanation": "Meie poolse probleemi või veebilehitseja ühilduvus probleemi tõttu ei suutnud me teile seda lehekülge korrektselt näidata.",
-  "error.unexpected_crash.explanation_addons": "Seda lehte ei suudetud õigesti kuvada. See viga arvatavasti põhjustas mingi brauseri lisand või automaattõlke tööriist.",
-  "error.unexpected_crash.next_steps": "Proovige lehekülge uuesti avada. Kui see ei aita, võite proovida kasutada Mastodoni mõne muu veebilehitseja või äppi kaudu.",
-  "error.unexpected_crash.next_steps_addons": "Proovige need välja lülitada ja leht uuesti laadida. Kui sellest pole abi, võib olla võimalik Mastodoni kasutada mingi teise brauseri või rakendusega.",
+  "empty_column.list": "Siin loetelus pole veel midagi. Kui loetelu liikmed teevad uusi postitusi, näed neid siin.",
+  "empty_column.lists": "Pole veel ühtegi nimekirja. Kui lood mõne, näed neid siin.",
+  "empty_column.mutes": "Sa pole veel ühtegi kasutajat vaigistanud.",
+  "empty_column.notifications": "Ei ole veel teateid. Kui keegi suhtleb sinuga, näed seda siin.",
+  "empty_column.public": "Siin pole midagi! Kirjuta midagi avalikku või jälgi ise kasutajaid täitmaks seda ruumi",
+  "error.unexpected_crash.explanation": "Meie poolse probleemi või veebilehitseja ühilduvusprobleemi tõttu ei suutnud me seda lehekülge korrektselt näidata.",
+  "error.unexpected_crash.explanation_addons": "Seda lehte ei suudetud õigesti kuvada. Selle vea põhjustas arvatavasti mõni lehitseja lisand või automaattõlke tööriist.",
+  "error.unexpected_crash.next_steps": "Proovi lehekülge uuesti avada. Kui see ei aita, võib proovida kasutada Mastodoni mõne muu veebilehitseja või äpi kaudu.",
+  "error.unexpected_crash.next_steps_addons": "Proovi need välja lülitada ja leht uuesti laadida. Kui sellest pole abi, võib siiski võimalik olla Mastodoni kasutada mõne teise lehitseja või rakendusega.",
   "errors.unexpected_crash.copy_stacktrace": "Kopeeri stacktrace lõikelauale",
   "errors.unexpected_crash.report_issue": "Teavita veast",
   "explore.search_results": "Otsitulemused",
+  "explore.suggested_follows": "Kasutajad",
   "explore.title": "Avasta",
-  "filter_modal.added.context_mismatch_explanation": "See filtrikategooria ei rakendu selles kontekstis, kuidas te postitusele jõudsite. Kui tahate postitust ka selles kontekstis filtreerida, võite muuta filtrit.",
+  "explore.trending_links": "Uudised",
+  "explore.trending_statuses": "Postitused",
+  "explore.trending_tags": "Sildid",
+  "filter_modal.added.context_mismatch_explanation": "See filtrikategooria ei rakendu kontekstis, kuidas postituseni jõudsid. Kui tahad postitust ka selles kontekstis filtreerida, pead muutma filtrit.",
   "filter_modal.added.context_mismatch_title": "Konteksti mittesobivus!",
-  "filter_modal.added.expired_explanation": "Selle filtri kategooria on aegunud, peate muutma aegumiskuupäeva, kui tahate, et filter kehtiks.",
+  "filter_modal.added.expired_explanation": "Selle filtri kategooria on aegunud. pead muutma aegumiskuupäeva, kui tahad, et filter kehtiks.",
   "filter_modal.added.expired_title": "Aegunud filter!",
-  "filter_modal.added.review_and_configure": "Et vaadata üle ja täpsemalt seadistada seda filtrikategooriat, minge lehele {settings_link}.",
+  "filter_modal.added.review_and_configure": "Et vaadata üle ja täpsemalt seadistada seda filtrikategooriat, mine lehele {settings_link}.",
   "filter_modal.added.review_and_configure_title": "Filtrite sätted",
-  "filter_modal.added.settings_link": "sättete leht",
+  "filter_modal.added.settings_link": "sätete leht",
   "filter_modal.added.short_explanation": "See postitus on lisatud järgmisesse filtrikategooriasse: {title}.",
   "filter_modal.added.title": "Filter lisatud!",
   "filter_modal.select_filter.context_mismatch": "ei avaldu selles kontekstis",
@@ -253,16 +258,16 @@
   "filter_modal.select_filter.title": "Filtreeri seda postitust",
   "filter_modal.title.status": "Postituse filtreerimine",
   "follow_recommendations.done": "Valmis",
-  "follow_recommendations.heading": "Jälgi inimesi, kelle postituse tahaksite näha! Mõned soovitused on siin.",
-  "follow_recommendations.lead": "Postitused inimestelt, keda te jälgite ilmuvad ajalises järjekorras teie kodu ajajoonel. Ärge kartke eksida, alati saate inimeste jälgimist ka lõpetada!",
+  "follow_recommendations.heading": "Jälgi inimesi, kelle postitusi tahaksid näha! Mõned soovitused on siin.",
+  "follow_recommendations.lead": "Postitused inimestelt, keda jälgid, ilmuvad ajalises järjestuses kodu ajajoonel. Ära karda eksida, alati saab inimeste jälgimist ka lõpetada!",
   "follow_request.authorize": "Autoriseeri",
   "follow_request.reject": "Hülga",
-  "follow_requests.unlocked_explanation": "Kuigi teie konto pole lukustatud, soovitab {domain} personal siiski manuaalselt üle vaadata jälgimistaotlused nendelt kontodelt.",
+  "follow_requests.unlocked_explanation": "Kuigi su konto pole lukustatud, soovitab {domain} personal siiski nende kontode jälgimistaotlused käsitsi üle vaadata.",
   "footer.about": "Teave",
   "footer.directory": "Profiilikataloog",
   "footer.get_app": "Tõmba äpp",
-  "footer.invite": "Liituma kutsumine",
-  "footer.keyboard_shortcuts": "Klaviatuuri otseteed",
+  "footer.invite": "Kutsu liituma",
+  "footer.keyboard_shortcuts": "Kiirklahvid",
   "footer.privacy_policy": "Isikuandmete kaitse",
   "footer.source_code": "Lähtekood",
   "generic.saved": "Salvestatud",
@@ -283,55 +288,55 @@
   "home.column_settings.show_replies": "Näita vastuseid",
   "home.hide_announcements": "Peida teadaanded",
   "home.show_announcements": "Kuva teadaandeid",
-  "interaction_modal.description.favourite": "Mastodoni kontoga saate seda postitust lemmikuks märkida, et autor teaks, et te seda hindate ja hiljemaks alles jätta.",
-  "interaction_modal.description.follow": "Mastodoni kontoga saate jälgida kasutajat {name}, et tema postitusi oma kodu ajajoonel näha.",
-  "interaction_modal.description.reblog": "Mastodoni kontoga saate jagada seda postitust oma jälgijatele.",
-  "interaction_modal.description.reply": "Mastodoni kontoga saate sellele postitusele vastata.",
+  "interaction_modal.description.favourite": "Mastodoni kontoga saad selle postituse lemmikuks märkida, et autor teaks, et sa hindad seda, ja hiljemaks alles jätta.",
+  "interaction_modal.description.follow": "Mastodoni kontoga saad jälgida kasutajat {name}, et tema postitusi oma kodu ajajoonel näha.",
+  "interaction_modal.description.reblog": "Mastodoni kontoga saad seda postitust levitada, jagades seda oma jälgijatele.",
+  "interaction_modal.description.reply": "Mastodoni kontoga saad sellele postitusele vastata.",
   "interaction_modal.on_another_server": "Teises serveris",
   "interaction_modal.on_this_server": "Selles serveris",
-  "interaction_modal.other_server_instructions": "Kopeeri ja aseta see URL oma lemmikusse Mastodoni äppi või oma Mastodoni serveri veebiliidesesse.",
-  "interaction_modal.preamble": "Kuna Mastodon on detsentraliseeritud, võite kasutada olemasolevat kontot, mis on teises Mastodoni servers või ühilduval platvormil, kui teil siin kontot ei ole.",
+  "interaction_modal.other_server_instructions": "Kopeeri ja kleebi see URL oma Mastodoni lemmikäppi või Mastodoni serveri veebiliidesesse.",
+  "interaction_modal.preamble": "Kuna Mastodon on detsentraliseeritud, saab kasutada teises Mastodoni serveris olevat kontot või ka ühilduval platvormil, kui siin serveril kontot ei ole.",
   "interaction_modal.title.favourite": "Lisa konto {name} postitus lemmikuks",
   "interaction_modal.title.follow": "Jälgi kontot {name}",
   "interaction_modal.title.reblog": "Jaga {name} postitust",
   "interaction_modal.title.reply": "Vasta kasutaja {name} postitusele",
-  "intervals.full.days": "{number, plural, one {# päev} other {# päevad}}",
+  "intervals.full.days": "{number, plural, one {# päev} other {# päeva}}",
   "intervals.full.hours": "{number, plural, one {# tund} other {# tundi}}",
   "intervals.full.minutes": "{number, plural, one {# minut} other {# minutit}}",
-  "keyboard_shortcuts.back": "tagasiminekuks",
+  "keyboard_shortcuts.back": "Liigu tagasi",
   "keyboard_shortcuts.blocked": "avamaks blokeeritud kasutajate nimistut",
   "keyboard_shortcuts.boost": "Jaga",
-  "keyboard_shortcuts.column": "fokuseerimaks staatust ühele tulpadest",
-  "keyboard_shortcuts.compose": "fokuseerimaks tekstikoostamise alale",
+  "keyboard_shortcuts.column": "Fookus veerule",
+  "keyboard_shortcuts.compose": "Fookus teksti koostamise alale",
   "keyboard_shortcuts.description": "Kirjeldus",
-  "keyboard_shortcuts.direct": "avamaks otsesõnumite tulpa",
-  "keyboard_shortcuts.down": "liikumaks nimstus alla",
+  "keyboard_shortcuts.direct": "ava otsesõnumite veerg",
+  "keyboard_shortcuts.down": "Liigu loetelus alla",
   "keyboard_shortcuts.enter": "Ava postitus",
-  "keyboard_shortcuts.favourite": "lemmikuks märkimiseks",
-  "keyboard_shortcuts.favourites": "avamaks lemmikute nimistut",
-  "keyboard_shortcuts.federated": "avamaks föderatsiooni ajajoont",
-  "keyboard_shortcuts.heading": "Klaviatuuri kiirkäsud",
-  "keyboard_shortcuts.home": "avamaks kodu ajajoont",
+  "keyboard_shortcuts.favourite": "Märgi lemmikuks",
+  "keyboard_shortcuts.favourites": "Ava lemmikute loetelu",
+  "keyboard_shortcuts.federated": "Ava föderatsiooni ajajoon",
+  "keyboard_shortcuts.heading": "Kiirklahvid",
+  "keyboard_shortcuts.home": "Ava kodu ajajoon",
   "keyboard_shortcuts.hotkey": "Kiirklahv",
-  "keyboard_shortcuts.legend": "selle legendi kuvamiseks",
-  "keyboard_shortcuts.local": "avamaks kohalikku ajajoont",
-  "keyboard_shortcuts.mention": "autori mainimiseks",
-  "keyboard_shortcuts.muted": "avamaks vaigistatud kasutajate nimistut",
-  "keyboard_shortcuts.my_profile": "avamaks profiili",
-  "keyboard_shortcuts.notifications": "avamaks teadete tulpa",
-  "keyboard_shortcuts.open_media": "et avada meedia",
-  "keyboard_shortcuts.pinned": "Ava kinnitatud postituste nimekiri",
-  "keyboard_shortcuts.profile": "avamaks autori profiili",
-  "keyboard_shortcuts.reply": "vastamiseks",
-  "keyboard_shortcuts.requests": "avamaks jälgimistaotluste nimistut",
-  "keyboard_shortcuts.search": "otsingu fokuseerimiseks",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
-  "keyboard_shortcuts.start": "avamaks \"Alusta\" tulpa",
-  "keyboard_shortcuts.toggle_hidden": "näitamaks/peitmaks teksti CW taga",
-  "keyboard_shortcuts.toggle_sensitivity": "et peita/näidata meediat",
+  "keyboard_shortcuts.legend": "Kuva see legend",
+  "keyboard_shortcuts.local": "Ava kohalik ajajoon",
+  "keyboard_shortcuts.mention": "Maini autorit",
+  "keyboard_shortcuts.muted": "Ava vaigistatud kasutajate loetelu",
+  "keyboard_shortcuts.my_profile": "Ava oma profiil",
+  "keyboard_shortcuts.notifications": "Ava teadete veerg",
+  "keyboard_shortcuts.open_media": "Ava meedia",
+  "keyboard_shortcuts.pinned": "Ava kinnitatud postituste loetelu",
+  "keyboard_shortcuts.profile": "Ava autori profiil",
+  "keyboard_shortcuts.reply": "Vasta postitusele",
+  "keyboard_shortcuts.requests": "Ava jälgimistaotluste loetelu",
+  "keyboard_shortcuts.search": "Fookus otsingule",
+  "keyboard_shortcuts.spoilers": "Näita/peida CW väli",
+  "keyboard_shortcuts.start": "Ava veerg \"Alusta\"",
+  "keyboard_shortcuts.toggle_hidden": "Näida/peida teksti CW taga",
+  "keyboard_shortcuts.toggle_sensitivity": "Näita/peida meediat",
   "keyboard_shortcuts.toot": "Alusta uut postitust",
-  "keyboard_shortcuts.unfocus": "tekstiala/otsingu koostamise mittefokuseerimiseks",
-  "keyboard_shortcuts.up": "liikumaks nimistus üles",
+  "keyboard_shortcuts.unfocus": "Fookus tekstialalt/otsingult ära",
+  "keyboard_shortcuts.up": "Liigu loetelus üles",
   "lightbox.close": "Sulge",
   "lightbox.compress": "Suru kokku pildi vaatamise kast",
   "lightbox.expand": "Laienda pildi vaatamise kast",
@@ -339,25 +344,25 @@
   "lightbox.previous": "Eelmine",
   "limited_account_hint.action": "Näita profilli sellegipoolest",
   "limited_account_hint.title": "See profiil on peidetud {domain} moderaatorite poolt.",
-  "lists.account.add": "Lisa nimistusse",
-  "lists.account.remove": "Eemalda nimistust",
-  "lists.delete": "Kustuta nimistu",
-  "lists.edit": "Muuda nimistut",
+  "lists.account.add": "Lisa nimekirja",
+  "lists.account.remove": "Eemalda nimekirjast",
+  "lists.delete": "Kustuta nimekiri",
+  "lists.edit": "Muuda nimekirja",
   "lists.edit.submit": "Pealkirja muutmine",
-  "lists.new.create": "Lisa nimistu",
-  "lists.new.title_placeholder": "Uue nimistu pealkiri",
+  "lists.new.create": "Lisa nimekiri",
+  "lists.new.title_placeholder": "Uue nimekirja pealkiri",
   "lists.replies_policy.followed": "Igalt jälgitud kasutajalt",
   "lists.replies_policy.list": "Listi liikmetelt",
-  "lists.replies_policy.none": "Mitte kellegilt",
+  "lists.replies_policy.none": "Mitte kelleltki",
   "lists.replies_policy.title": "Näita vastuseid nendele:",
-  "lists.search": "Otsige teie poolt jälgitavate inimese hulgast",
-  "lists.subheading": "Teie nimistud",
+  "lists.search": "Otsi enda jälgitavate inimeste hulgast",
+  "lists.subheading": "Sinu nimekirjad",
   "load_pending": "{count, plural, one {# uus kirje} other {# uut kirjet}}",
   "loading_indicator.label": "Laeb..",
   "media_gallery.toggle_visible": "{number, plural, one {Varja pilt} other {Varja pildid}}",
   "missing_indicator.label": "Ei leitud",
   "missing_indicator.sublabel": "Seda ressurssi ei leitud",
-  "moved_to_account_banner.text": "Teie kontot {disabledAccount} ei ole praegu võimalik kasutada, sest te kolisite kontole {movedToAccount}.",
+  "moved_to_account_banner.text": "Kontot {disabledAccount} ei ole praegu võimalik kasutada, sest kolisid kontole {movedToAccount}.",
   "mute_modal.duration": "Kestus",
   "mute_modal.hide_notifications": "Kas peita teated sellelt kasutajalt?",
   "mute_modal.indefinite": "Lõpmatu",
@@ -375,7 +380,7 @@
   "navigation_bar.filters": "Vaigistatud sõnad",
   "navigation_bar.follow_requests": "Jälgimistaotlused",
   "navigation_bar.follows_and_followers": "Jälgitavad ja jälgijad",
-  "navigation_bar.lists": "Nimistud",
+  "navigation_bar.lists": "Nimekirjad",
   "navigation_bar.logout": "Logi välja",
   "navigation_bar.mutes": "Vaigistatud kasutajad",
   "navigation_bar.personal": "Isiklik",
@@ -384,20 +389,20 @@
   "navigation_bar.public_timeline": "Föderatiivne ajajoon",
   "navigation_bar.search": "Otsing",
   "navigation_bar.security": "Turvalisus",
-  "not_signed_in_indicator.not_signed_in": "Peate logima sisse, et saada ligipääsu sellele ressursile.",
+  "not_signed_in_indicator.not_signed_in": "Pead sisse logima, et saada ligipääsu sellele ressursile.",
   "notification.admin.report": "{name} saatis teavituse {target} kohta",
   "notification.admin.sign_up": "{name} registreerus",
-  "notification.favourite": "{name} märkis teie staatuse lemmikuks",
-  "notification.follow": "{name} jälgib nüüd teid",
+  "notification.favourite": "{name} märkis su postituse lemmikuks",
+  "notification.follow": "{name} alustas su jälgimist",
   "notification.follow_request": "{name} soovib teid jälgida",
   "notification.mention": "{name} mainis teid",
-  "notification.own_poll": "Teie küsitlus on lõppenud",
-  "notification.poll": "Küsitlus, milles osalesite, on lõppenud",
-  "notification.reblog": "{name} jagas postitust",
+  "notification.own_poll": "Su küsitlus on lõppenud",
+  "notification.poll": "Küsitlus, milles osalesid, on lõppenud",
+  "notification.reblog": "{name} jagas edasi postitust",
   "notification.status": "{name} just postitas",
   "notification.update": "{name} muutis postitust",
   "notifications.clear": "Puhasta teated",
-  "notifications.clear_confirmation": "Olete kindel, et soovite püsivalt kõik oma teated eemaldada?",
+  "notifications.clear_confirmation": "Oled kindel, et soovid püsivalt kõik oma teated eemaldada?",
   "notifications.column_settings.admin.report": "Uued teavitused:",
   "notifications.column_settings.admin.sign_up": "Uued kasutajad:",
   "notifications.column_settings.alert": "Töölauateated",
@@ -423,23 +428,23 @@
   "notifications.filter.follows": "Jälgib",
   "notifications.filter.mentions": "Mainimised",
   "notifications.filter.polls": "Küsitluse tulemused",
-  "notifications.filter.statuses": "Uuendused inimestelt, keda te jälgite",
+  "notifications.filter.statuses": "Uuendused inimestelt, keda jälgid",
   "notifications.grant_permission": "Anna luba.",
   "notifications.group": "{count} teated",
   "notifications.mark_as_read": "Märgi kõik teated loetuks",
-  "notifications.permission_denied": "Töölaua märguanded pole seadaval, kuna eelnevalt keelduti brauserile teavituste luba anda",
+  "notifications.permission_denied": "Töölauamärguanded pole saadaval, kuna eelnevalt keelduti lehitsejale teavituste luba andmast",
   "notifications.permission_denied_alert": "Töölaua märguandeid ei saa lubada, kuna brauseri luba on varem keeldutud",
   "notifications.permission_required": "Töölaua märguanded ei ole saadaval, kuna vajalik luba pole antud.",
   "notifications_permission_banner.enable": "Luba töölaua märguanded",
-  "notifications_permission_banner.how_to_control": "Et saada teateid, kui Mastodon pole avatud, lubage töölaua märguanded. Saate määrata täpselt, mis tüüpi läbikäimised tekitavad töölauale märguandeid kasutates {icon} nuppu üleval, kui need on sisse lülitatud.",
-  "notifications_permission_banner.title": "Ärge jääge millestki ilma",
+  "notifications_permission_banner.how_to_control": "Et saada teateid, ajal mil Mastodon pole avatud, luba töölauamärguanded. Saad täpselt määrata, mis tüüpi tegevused tekitavad märguandeid, kasutates peale teadaannete sisse lülitamist üleval olevat nuppu {icon}.",
+  "notifications_permission_banner.title": "Ära jää millestki ilma",
   "picture_in_picture.restore": "Pane tagasi",
   "poll.closed": "Suletud",
   "poll.refresh": "Värskenda",
   "poll.total_people": "{count, plural,one {# inimene} other {# inimest}}",
   "poll.total_votes": "{count, plural, one {# hääl} other {# häält}}",
   "poll.vote": "Hääleta",
-  "poll.voted": "Teie hääletasite selle poolt",
+  "poll.voted": "Hääletasid selle poolt",
   "poll.votes": "{votes, plural, one {# hääl} other {# häält}}",
   "poll_button.add_poll": "Lisa küsitlus",
   "poll_button.remove_poll": "Eemalda küsitlus",
@@ -456,7 +461,7 @@
   "privacy_policy.title": "Isikuandmete kaitse",
   "refresh": "Värskenda",
   "regeneration_indicator.label": "Laeb…",
-  "regeneration_indicator.sublabel": "Teie kodu voog on ettevalmistamisel!",
+  "regeneration_indicator.sublabel": "Su koduvoog on ettevalmistamisel!",
   "relative_time.days": "{number}p",
   "relative_time.full.days": "{number, plural, one {# päev} other {# päeva}} tagasi",
   "relative_time.full.hours": "{number, plural, one {# tund} other {# tundi}} tagasi",
@@ -470,53 +475,53 @@
   "relative_time.today": "täna",
   "reply_indicator.cancel": "Tühista",
   "report.block": "Blokeeri",
-  "report.block_explanation": "Te ei näe tema postitusi. Tema ei saa näha teie postitusi ega teid jälgida. Talle on näha, et ta on blokeeritud.",
+  "report.block_explanation": "Sa ei näe tema postitusi. Tema ei saa näha sinu postitusi ega sind jälgida. Talle on näha, et ta on blokeeritud.",
   "report.categories.other": "Muud",
   "report.categories.spam": "Rämpspost",
   "report.categories.violation": "Sisu, mis rikub ühte või enamat serveri reeglit",
-  "report.category.subtitle": "Valige parim vaste",
-  "report.category.title": "Öelge, mis on sellel {type} valesti",
-  "report.category.title_account": "profiilil",
-  "report.category.title_status": "postitusel",
+  "report.category.subtitle": "Vali parim vaste",
+  "report.category.title": "Selgita, mis on selle {type} valesti",
+  "report.category.title_account": "kontoga",
+  "report.category.title_status": "postitusega",
   "report.close": "Valmis",
-  "report.comment.title": "Kas on midagi veel, mis te arvate, et me peaks teadma?",
+  "report.comment.title": "Kas arvad, et on veel midagi, mida me peaks teadma?",
   "report.forward": "Edasta kasutajale {target}",
   "report.forward_hint": "See kasutaja on teisest serverist. Kas saadan anonümiseeritud koopia sellest teatest sinna ka?",
   "report.mute": "Vaigista",
-  "report.mute_explanation": "Te ei näe tema postitusi. Ta võib ikka teil jälgida ja näha teie postitusi ja ta ei saa teada, et ta on vaigistatud.",
+  "report.mute_explanation": "Sa ei näe tema postitusi. Ta võib ikka sind jälgida ja su postitusi näha. Ta ei saa teada, et ta on vaigistatud.",
   "report.next": "Järgmine",
   "report.placeholder": "Lisaks kommentaarid",
   "report.reasons.dislike": "Mulle ei meeldi see",
-  "report.reasons.dislike_description": "Midagi sellist, mida te ei taha näha",
+  "report.reasons.dislike_description": "See on midagi sellist, mida sa näha ei taha",
   "report.reasons.other": "Midagi muud",
   "report.reasons.other_description": "Probleem ei sobi teistesse kategooriatesse",
   "report.reasons.spam": "See on rämpspost",
   "report.reasons.spam_description": "Pahatahtlikud lingid, võltssuhtlus või korduvad vastused",
   "report.reasons.violation": "Rikub serveri reegleid",
-  "report.reasons.violation_description": "Teate, et see rikub teatud reegleid",
-  "report.rules.subtitle": "Valige kõik, mis sobivad",
+  "report.reasons.violation_description": "Tead, et see rikub teatud reegleid",
+  "report.rules.subtitle": "Vali kõik, mis sobivad",
   "report.rules.title": "Milliseid reegleid rikutakse?",
-  "report.statuses.subtitle": "Valige kõik, mis sobivad",
+  "report.statuses.subtitle": "Vali kõik, mis sobivad",
   "report.statuses.title": "Kas on olemas postitusi, mis on sellele teavitusele tõenduseks?",
   "report.submit": "Esita",
   "report.target": "Teatamine {target} kohta",
-  "report.thanks.take_action": "Need on võimalused, mis teil on, et juhtida, mida Mastodonis näete:",
-  "report.thanks.take_action_actionable": "Kuniks me seda üle vaatame, võite teha need tegevused @{name} vastu:",
+  "report.thanks.take_action": "Need on su võimalused määrata, mida Mastodonis näed:",
+  "report.thanks.take_action_actionable": "Kuniks me seda üle vaatame, võid @{name} vastu teha need tegevused:",
   "report.thanks.title": "Ei taha seda näha?",
   "report.thanks.title_actionable": "Täname teavitamise eest, uurime seda.",
   "report.unfollow": "Lõpeta @{name} jälgimine",
-  "report.unfollow_explanation": "Te jälgite seda kontot. Et mitte näha tema postitusi oma kodu ajajoonel, lõpetage tema jälgimine.",
+  "report.unfollow_explanation": "Jälgid seda kontot. Et mitte näha tema postitusi oma kodu ajajoonel, lõpeta ta jälgimine.",
   "report_notification.attached_statuses": "{count, plural, one {{count} postitus} other {{count} postitust}} listatud",
   "report_notification.categories.other": "Muu",
   "report_notification.categories.spam": "Rämpspost",
   "report_notification.categories.violation": "Reeglite rikkumine",
   "report_notification.open": "Ava teavitus",
   "search.placeholder": "Otsi",
-  "search.search_or_paste": "Otsi või aseta URL",
+  "search.search_or_paste": "Otsi või kleebi URL",
   "search_popout.search_format": "Täiustatud otsiformaat",
-  "search_popout.tips.full_text": "Lihttekst annab vastuseks postitused, mida olete kirjutanud, lisanud lemmikuks, jaganud või kus mainitud, ning lisaks kattuvad kasutajanimed, kuvanimed ja sildid.",
+  "search_popout.tips.full_text": "Lihttekst annab vastuseks postitused, mille oled kirjutanud, lisanud lemmikuks, jaganud või kus on sind mainitud, ning lisaks kokkusobivad kasutajanimed, profiili kuvanimed ja sildid.",
   "search_popout.tips.hashtag": "silt",
-  "search_popout.tips.status": "staatus",
+  "search_popout.tips.status": "postitus",
   "search_popout.tips.text": "Lihtne tekst toob esile kattuvad kuvanimed, kasutajanimed ning sildid",
   "search_popout.tips.user": "kasutaja",
   "search_results.accounts": "Inimesed",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Logi sisse",
   "sign_in_banner.text": "Logi sisse, et jälgida profiile või silte, märkida lemmikuks, jagada ja vastata postitustele või kasutada suhtlemiseks kontot teises serveris.",
   "status.admin_account": "Ava @{name} moderaatorivaates",
+  "status.admin_domain": "Ava {domain} modeereerimisliides",
   "status.admin_status": "Ava postitus moderaatorivaates",
   "status.block": "Blokeeri @{name}",
   "status.bookmark": "Järjehoidja",
@@ -562,7 +568,7 @@
   "status.more": "Veel",
   "status.mute": "Vaigista @{name}",
   "status.mute_conversation": "Vaigista vestlus",
-  "status.open": "Laienda see postitus",
+  "status.open": "Laienda postitus",
   "status.pin": "Kinnita profiilile",
   "status.pinned": "Kinnitatud postitus",
   "status.read_more": "Loe veel",
@@ -579,19 +585,19 @@
   "status.sensitive_warning": "Tundlik sisu",
   "status.share": "Jaga",
   "status.show_filter_reason": "Näita ikka",
-  "status.show_less": "Näita vähem",
-  "status.show_less_all": "Näita vähem kõigile",
-  "status.show_more": "Näita veel",
-  "status.show_more_all": "Näita enam kõigile",
+  "status.show_less": "Peida sisu",
+  "status.show_less_all": "Peida kogu tundlik sisu",
+  "status.show_more": "Näita sisu",
+  "status.show_more_all": "Näita kogu tundlikku sisu",
   "status.show_original": "Näita algset",
   "status.translate": "Tõlgi",
   "status.translated_from_with": "Tõlgitud {lang} keelest kasutades teenust {provider}",
   "status.uncached_media_warning": "Pole saadaval",
   "status.unmute_conversation": "Ära vaigista vestlust",
   "status.unpin": "Eemalda profiilile kinnitus",
-  "subscribed_languages.lead": "Pärast muudatust näidatakse kodu ja nimistute ajajoontel postitusi valitud keeltes. Jäta tühjaks, kui tahad näha postitusi keelest sõltumata.",
+  "subscribed_languages.lead": "Pärast muudatust näed koduvaates ja loetelude ajajoontel postitusi valitud keeltes. Ära vali midagi, kui tahad näha postitusi kõikides keeltes.",
   "subscribed_languages.save": "Salvesta muudatused",
-  "subscribed_languages.target": "Muutke tellitud keeli {target} jaoks",
+  "subscribed_languages.target": "Muuda tellitud keeli {target} jaoks",
   "suggestions.dismiss": "Eira soovitust",
   "suggestions.header": "Teid võib huvitada…",
   "tabs_bar.federated_timeline": "Föderatiivne",
@@ -609,7 +615,7 @@
   "timeline_hint.resources.statuses": "Eelnevaid postitusi",
   "trends.counter_by_accounts": "{count, plural, one {{counter} inimene} other {{counter} inimest}} viimase {days, plural, one {päeva} other {{days} päeva}} jooksul",
   "trends.trending_now": "Hetkel populaarne",
-  "ui.beforeunload": "Teie mustand läheb kaotsi, kui lahkute Mastodonist.",
+  "ui.beforeunload": "Mustand läheb kaotsi, kui lahkud Mastodonist.",
   "units.short.billion": "{count} mld",
   "units.short.million": "{count} mln",
   "units.short.thousand": "{count} tuh",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index fd17288b3..9f771a811 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Bidalketak eta erantzunak",
   "account.report": "Salatu @{name}",
   "account.requested": "Onarpenaren zain. Klikatu jarraitzeko eskaera ezeztatzeko",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "@{name}(e)ren profila elkarbanatu",
   "account.show_reblogs": "Erakutsi @{name}(r)en bultzadak",
   "account.statuses_counter": "{count, plural, one {Bidalketa {counter}} other {{counter} bidalketa}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Bilatu hizkuntzak...",
   "compose_form.direct_message_warning_learn_more": "Ikasi gehiago",
   "compose_form.encryption_warning": "Mastodoneko bidalketak ez daude muturretik muturrera enkriptatuta. Ez partekatu informazio sentikorrik Mastodonen.",
-  "compose_form.hashtag_warning": "Bidalketa hau ez da traoletan agertuko zerrendatu gabekoa baita. Traoletan bidalketa publikoak besterik ez dira agertzen.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Zure kontua ez dago {locked}. Edonork jarraitu zaitzake zure jarraitzaileentzako soilik diren bidalketak ikusteko.",
   "compose_form.lock_disclaimer.lock": "giltzapetuta",
   "compose_form.placeholder": "Zer duzu buruan?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Kopiatu irteera arbelera",
   "errors.unexpected_crash.report_issue": "Eman arazoaren berri",
   "explore.search_results": "Bilaketaren emaitzak",
+  "explore.suggested_follows": "Zuretzako",
   "explore.title": "Arakatu",
+  "explore.trending_links": "Berriak",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "Iragazki-kategoria hau ez zaio aplikatzen bidalketa honetara sartzeko erabili duzun testuinguruari. Bidalketa testuinguru horretan ere iragaztea nahi baduzu, iragazkia editatu beharko duzu.",
   "filter_modal.added.context_mismatch_title": "Testuingurua ez dator bat!",
   "filter_modal.added.expired_explanation": "Iragazki kategoria hau iraungi da, eragina izan dezan bere iraungitze-data aldatu beharko duzu.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Hasi saioa",
   "sign_in_banner.text": "Hasi saioa beste zerbitzari bateko zure kontuarekin profilak edo traolak jarraitu, bidalketei erantzun, gogoko egin edo partekatzeko.",
   "status.admin_account": "Ireki @{name} erabiltzailearen moderazio interfazea",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Ireki bidalketa hau moderazio interfazean",
   "status.block": "Blokeatu @{name}",
   "status.bookmark": "Laster-marka",
@@ -553,7 +559,7 @@
   "status.favourite": "Gogokoa",
   "status.filter": "Iragazi bidalketa hau",
   "status.filtered": "Iragazita",
-  "status.hide": "Ezkutatu bidalketa hau",
+  "status.hide": "Hide post",
   "status.history.created": "{name} erabiltzaileak sortua {date}",
   "status.history.edited": "{name} erabiltzaileak editatua {date}",
   "status.load_more": "Kargatu gehiago",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 13382d67a..a58d9824a 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "فرسته‌ها و پاسخ‌ها",
   "account.report": "گزارش ‎@{name}",
   "account.requested": "منتظر پذیرش است. برای لغو درخواست پی‌گیری کلیک کنید",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "هم‌رسانی نمایهٔ ‎@{name}",
   "account.show_reblogs": "نمایش تقویت‌های ‎@{name}",
   "account.statuses_counter": "{count, plural, one {{counter} فرسته} other {{counter} فرسته}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "جست‌وجوی زبان‌ها…",
   "compose_form.direct_message_warning_learn_more": "بیشتر بدانید",
   "compose_form.encryption_warning": "فرسته‌های ماستودون رمزگذاری سرتاسری نشده‌اند. هیچ اطّلاعات حساسی را روی ماستودون هم‌رسانی نکنید.",
-  "compose_form.hashtag_warning": "از آن‌جا که این فرسته فهرست نشده است، در نتایج جست‌وجوی هشتگ‌ها پیدا نخواهد شد. تنها فرسته‌های عمومی را می‌توان با جست‌وجوی هشتگ یافت.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "حسابتان {locked} نیست. هر کسی می‌تواند پی‌گیرتان شده و فرسته‌های ویژهٔ پی‌گیرانتان را ببیند.",
   "compose_form.lock_disclaimer.lock": "قفل‌شده",
   "compose_form.placeholder": "تازه چه خبر؟",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "رونوشت از جزئیات اشکال",
   "errors.unexpected_crash.report_issue": "گزارش مشکل",
   "explore.search_results": "نتایج جست‌وجو",
+  "explore.suggested_follows": "برای شما",
   "explore.title": "کاوش",
+  "explore.trending_links": "اخبار",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "هشتگ‌ها",
   "filter_modal.added.context_mismatch_explanation": "این دستهٔ پالایه به بافتاری که در آن به این فرسته دسترسی دارید اعمال نمی‌شود. اگر می‌خواهید فرسته در این بافتار هم پالوده شود، باید پالایه را ویرایش کنید.",
   "filter_modal.added.context_mismatch_title": "بافتار نامطابق!",
   "filter_modal.added.expired_explanation": "این دستهٔ پالایه منقضی شده است. برای اعمالش باید تاریخ انقضا را عوض کنید.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "ورود",
   "sign_in_banner.text": "برای پی‌گیری نمایه‌ها یا برچسب‌ها، هم‌رسانی و پاسخ به فرسته‌ها یا تعامل از حسابتان روی کارسازی دیگر، وارد شوید.",
   "status.admin_account": "گشودن واسط مدیریت برای ‎@{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "گشودن این فرسته در واسط مدیریت",
   "status.block": "مسدود کردن ‎@{name}",
   "status.bookmark": "نشانک",
@@ -553,7 +559,7 @@
   "status.favourite": "پسندیدن",
   "status.filter": "پالایش این فرسته",
   "status.filtered": "پالوده",
-  "status.hide": "نهفتن بوق",
+  "status.hide": "Hide post",
   "status.history.created": "توسط {name} در {date} ایجاد شد",
   "status.history.edited": "توسط {name} در {date} ویرایش شد",
   "status.load_more": "بار کردن بیش‌تر",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 91a2bbbfd..5f3f7a416 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -3,11 +3,11 @@
   "about.contact": "Yhteystiedot:",
   "about.disclaimer": "Mastodon on vapaa avoimen lähdekoodin ohjelmisto ja Mastodon gGmbH:n tavaramerkki.",
   "about.domain_blocks.no_reason_available": "Syytä ei ole ilmoitettu",
-  "about.domain_blocks.preamble": "Mastodonin avulla voit yleensä tarkastella sisältöä ja olla vuorovaikutuksessa käyttäjien kanssa millä tahansa muulla palvelimella fediversessä. Nämä ovat poikkeuksia, jotka on tehty tälle palvelimelle.",
-  "about.domain_blocks.silenced.explanation": "Et yleensä näe profiileja ja sisältöä tältä palvelimelta, ellet nimenomaisesti etsi tai valitse sitä seuraamalla.",
+  "about.domain_blocks.preamble": "Yleisesti Mastodonin avulla voidaan tarkastella minkä tahansa muun fediverse-palvelinten sisältöä ja vuorovaikuttaa eri palvelinten käyttäjien kanssa. Nämä ovat tälle palvelimelle määritetyt poikkeukset.",
+  "about.domain_blocks.silenced.explanation": "Et yleensä näe tämän palvelimen profiileja ja sisältöä, jollet erityisesti etsi juuri sitä tai liity siihen seuraamalla.",
   "about.domain_blocks.silenced.title": "Rajoitettu",
-  "about.domain_blocks.suspended.explanation": "Tämän palvelimen tietoja ei käsitellä, tallenneta tai vaihdeta, mikä tekee käyttäjän kanssa vuorovaikutuksen tai yhteydenpidon mahdottomaksi tällä palvelimella.",
-  "about.domain_blocks.suspended.title": "Keskeytetty",
+  "about.domain_blocks.suspended.explanation": "Mitään tämän palvelimen tietoja ei käsitellä, tallenneta tai vaihdeta, mikä tekee vuorovaikutuksesta ja viestinnästä sen käyttäjien kanssa mahdotonta.",
+  "about.domain_blocks.suspended.title": "Jäädytetty",
   "about.not_available": "Näitä tietoja ei ole julkaistu tällä palvelimella.",
   "about.powered_by": "Hajautettu sosiaalinen media, tarjoaa {mastodon}",
   "about.rules": "Palvelimen säännöt",
@@ -16,7 +16,7 @@
   "account.badges.bot": "Botti",
   "account.badges.group": "Ryhmä",
   "account.block": "Estä @{name}",
-  "account.block_domain": "Estä verkkotunnus {domain}",
+  "account.block_domain": "Estä palvelu {domain}",
   "account.blocked": "Estetty",
   "account.browse_more_on_origin_server": "Selaile lisää alkuperäisellä palvelimella",
   "account.cancel_follow_request": "Peruuta seurantapyyntö",
@@ -28,8 +28,8 @@
   "account.endorse": "Suosittele profiilissasi",
   "account.featured_tags.last_status_at": "Viimeisin viesti {date}",
   "account.featured_tags.last_status_never": "Ei viestejä",
-  "account.featured_tags.title": "{name} esillä olevat hashtagit",
-  "account.follow": "Seuraa",
+  "account.featured_tags.title": "Käyttäjän {name} esillä olevat aihetunnisteet",
+  "account.follow": "Seuratut",
   "account.followers": "Seuraajat",
   "account.followers.empty": "Kukaan ei seuraa tätä käyttäjää vielä.",
   "account.followers_counter": "{count, plural, one {{counter} seuraaja} other {{counter} seuraajaa}}",
@@ -54,11 +54,12 @@
   "account.posts_with_replies": "Viestit ja vastaukset",
   "account.report": "Ilmoita käyttäjästä @{name}",
   "account.requested": "Odottaa hyväksyntää. Peruuta seuraamispyyntö klikkaamalla",
+  "account.requested_follow": "{name} on pyytänyt lupaa seurata sinua",
   "account.share": "Jaa käyttäjän @{name} profiili",
   "account.show_reblogs": "Näytä buustaukset käyttäjältä @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} viesti} other {{counter} viestiä}}",
+  "account.statuses_counter": "{count, plural, one {{counter} julkaisu} other {{counter} julkaisua}}",
   "account.unblock": "Salli @{name}",
-  "account.unblock_domain": "Salli {domain}",
+  "account.unblock_domain": "Salli palvelu {domain}",
   "account.unblock_short": "Poista esto",
   "account.unendorse": "Poista suosittelu profiilistasi",
   "account.unfollow": "Lopeta seuraaminen",
@@ -93,7 +94,7 @@
   "bundle_modal_error.message": "Jotain meni pieleen komponenttia ladattaessa.",
   "bundle_modal_error.retry": "Yritä uudelleen",
   "closed_registrations.other_server_instructions": "Koska Mastodon on hajautettu, voit luoda tilin toiselle palvelimelle ja silti olla vuorovaikutuksessa tämän kanssa.",
-  "closed_registrations_modal.description": "Tilin luominen palvelimeen {domain} ei ole tällä hetkellä mahdollista, mutta huomioi, että et tarvitse tiliä erityisesti palvelimeen {domain} käyttääksesi Mastodonia.",
+  "closed_registrations_modal.description": "Tilin luonti palveluun {domain} ei tällä hetkellä ole mahdollista, mutta huomioi, ettei Mastodonin käyttö edellytä juuri kyseisen palvelun tiliä.",
   "closed_registrations_modal.find_another_server": "Etsi toinen palvelin",
   "closed_registrations_modal.preamble": "Mastodon on hajautettu, joten riippumatta siitä, missä luot tilisi, voit seurata ja olla vuorovaikutuksessa kenen tahansa kanssa tällä palvelimella. Voit jopa isännöidä palvelinta!",
   "closed_registrations_modal.title": "Rekisteröityminen Mastodoniin",
@@ -127,7 +128,7 @@
   "compose.language.search": "Hae kieliä...",
   "compose_form.direct_message_warning_learn_more": "Lisätietoja",
   "compose_form.encryption_warning": "Mastodonin viestit eivät ole päästä päähän salattuja. Älä jaa arkaluonteisia tietoja Mastodonissa.",
-  "compose_form.hashtag_warning": "Tätä julkaisua listata minkään hastagin alle, koska se on listaamaton. Ainoastaan julkisia julkaisuja etsiä hastageilla.",
+  "compose_form.hashtag_warning": "Tätä julkaisua ei voi liittää aihetunnisteisiin, koska se ei ole julkinen. Vain näkyvyydeltään julkisiksi määritettyjä julkaisuja voidaan hakea aihetunnisteiden avulla.",
   "compose_form.lock_disclaimer": "Tilisi ei ole {locked}. Kuka tahansa voi seurata tiliäsi ja nähdä vain seuraajille rajaamasi julkaisut.",
   "compose_form.lock_disclaimer.lock": "lukittu",
   "compose_form.placeholder": "Mitä sinulla on mielessäsi?",
@@ -159,8 +160,8 @@
   "confirmations.delete_list.message": "Haluatko varmasti poistaa tämän listan kokonaan?",
   "confirmations.discard_edit_media.confirm": "Hylkää",
   "confirmations.discard_edit_media.message": "Onko sinulla tallentamattomia muutoksia kuvaukseen tai esikatseluun, hylätäänkö ne silti?",
-  "confirmations.domain_block.confirm": "Piilota koko verkko-osoite",
-  "confirmations.domain_block.message": "Oletko todella varma, että haluat estää koko {domain}? Useimmissa tapauksissa muutama kohdennettu lohko tai mykistys on riittävä ja parempi. Et näe kyseisen verkkotunnuksen sisältöä missään julkisessa aikajanassa tai ilmoituksissa. Seuraajasi tältä verkkotunnukselta poistetaan.",
+  "confirmations.domain_block.confirm": "Estä koko palvelu",
+  "confirmations.domain_block.message": "Haluatko aivan varmasti estää palvelun {domain} täysin? Useimmiten muutama kohdistettu esto tai mykistys on riittävä ja suositeltava toimenpide. Et näe kyseisen sisältöä kyseiseltä verkkoalueelta missään julkisissa aikajanoissa tai ilmoituksissa. Tälle verkkoalueelle kuuluvat seuraajasi poistetaan.",
   "confirmations.logout.confirm": "Kirjaudu ulos",
   "confirmations.logout.message": "Oletko varma, että haluat kirjautua ulos?",
   "confirmations.mute.confirm": "Mykistä",
@@ -179,16 +180,16 @@
   "copypaste.copied": "Kopioitu",
   "copypaste.copy": "Kopioi",
   "directory.federated": "Koko tunnettu fediverse",
-  "directory.local": "Vain palvelimelta {domain}",
+  "directory.local": "Vain palvelusta {domain}",
   "directory.new_arrivals": "Äskettäin saapuneet",
   "directory.recently_active": "Hiljattain aktiiviset",
   "disabled_account_banner.account_settings": "Tilin asetukset",
   "disabled_account_banner.text": "Tilisi {disabledAccount} on tällä hetkellä poissa käytöstä.",
-  "dismissable_banner.community_timeline": "Nämä ovat uusimmat julkiset viestit ihmisiltä, joiden tilejä isännöi {domain}.",
+  "dismissable_banner.community_timeline": "Nämä ovat uusimmat julkiset julkaisut käyttäjiltä, joiden tilejä isännöi {domain}.",
   "dismissable_banner.dismiss": "Hylkää",
   "dismissable_banner.explore_links": "Näistä uutisista puhuvat ihmiset juuri nyt tällä ja muilla hajautetun verkon palvelimilla.",
   "dismissable_banner.explore_statuses": "Nämä viestit juuri nyt tältä ja muilta hajautetun verkon palvelimilta ovat saamassa vetoa tältä palvelimelta.",
-  "dismissable_banner.explore_tags": "Nämä hashtagit juuri nyt ovat saamassa vetovoimaa tällä ja muilla hajautetun verkon palvelimilla olevien ihmisten keskuudessa.",
+  "dismissable_banner.explore_tags": "Nämä aihetunnisteet saavat juuri nyt vetovoimaa tällä ja muilla hajautetun verkon palvelimilla olevien ihmisten keskuudessa.",
   "dismissable_banner.public_timeline": "Nämä ovat viimeisimpiä julkisia viestejä ihmisiltä, jotka ovat tällä ja muilla hajautetun verkon palvelimilla, joista tämä palvelin tietää.",
   "embed.instructions": "Upota julkaisu verkkosivullesi kopioimalla alla oleva koodi.",
   "embed.preview": "Se tulee näyttämään tältä:",
@@ -214,12 +215,12 @@
   "empty_column.bookmarked_statuses": "Et ole vielä lisännyt viestejä kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.",
   "empty_column.community": "Paikallinen aikajana on tyhjä. Kirjoita jotain julkista, niin homma lähtee käyntiin!",
   "empty_column.direct": "Sinulla ei ole vielä yksityisviestejä. Kun lähetät tai vastaanotat sellaisen, se näkyy tässä.",
-  "empty_column.domain_blocks": "Verkkotunnuksia ei ole vielä estetty.",
+  "empty_column.domain_blocks": "Palveluita ei ole vielä estetty.",
   "empty_column.explore_statuses": "Mikään ei ole nyt trendi. Tarkista myöhemmin!",
   "empty_column.favourited_statuses": "Et ole vielä lisännyt viestejä kirjanmerkkeihisi. Kun lisäät yhden, se näkyy tässä.",
   "empty_column.favourites": "Kukaan ei ole vielä lisännyt tätä viestiä suosikkeihinsa. Kun joku tekee niin, näkyy kyseinen henkilö tässä.",
-  "empty_column.follow_recommendations": "Näyttää siltä, että sinulle ei voi luoda ehdotuksia. Voit yrittää etsiä ihmisiä, jotka saatat tuntea tai tutkia trendaavia aihesanoja.",
-  "empty_column.follow_requests": "Sinulla ei ole vielä seurauspyyntöjä. Kun saat sellaisen, näkyy se tässä.",
+  "empty_column.follow_recommendations": "Näyttää siltä, että sinulle ei voi luoda ehdotuksia. Voit yrittää etsiä ihmisiä, jotka saatat tuntea tai tutkia trendaavia aihetunnisteita.",
+  "empty_column.follow_requests": "Et ole vielä vastaanottanut seurauspyyntöjä. Saamasi pyynnöt näytetään täällä.",
   "empty_column.hashtag": "Tällä hashtagilla ei ole vielä mitään.",
   "empty_column.home": "Kotisi aikajana on tyhjä! Seuraa lisää ihmisiä täyttääksesi sen. {suggestions}",
   "empty_column.home.suggestions": "Katso joitakin ehdotuksia",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Kopioi pinon jäljitys leikepöydälle",
   "errors.unexpected_crash.report_issue": "Ilmoita ongelmasta",
   "explore.search_results": "Hakutulokset",
+  "explore.suggested_follows": "Sinulle",
   "explore.title": "Selaa",
+  "explore.trending_links": "Uutiset",
+  "explore.trending_statuses": "Julkaisut",
+  "explore.trending_tags": "Aihetunnisteet",
   "filter_modal.added.context_mismatch_explanation": "Tämä suodatinluokka ei koske asiayhteyttä, jossa olet käyttänyt tätä viestiä. Jos haluat, että viesti suodatetaan myös tässä yhteydessä, sinun on muokattava suodatinta.",
   "filter_modal.added.context_mismatch_title": "Asiayhteys ei täsmää!",
   "filter_modal.added.expired_explanation": "Tämä suodatinluokka on vanhentunut ja sinun on muutettava viimeistä voimassaolon päivää, jotta sitä voidaan käyttää.",
@@ -276,8 +281,8 @@
   "hashtag.column_settings.tag_mode.any": "Mikä tahansa näistä",
   "hashtag.column_settings.tag_mode.none": "Ei mitään näistä",
   "hashtag.column_settings.tag_toggle": "Sisällytä lisätunnisteet tähän sarakkeeseen",
-  "hashtag.follow": "Seuraa hashtagia",
-  "hashtag.unfollow": "Lopeta seuraaminen hashtagilla",
+  "hashtag.follow": "Seuraa aihetunnistetta",
+  "hashtag.unfollow": "Lopeta aihetunnisteen seuraaminen",
   "home.column_settings.basic": "Perusasetukset",
   "home.column_settings.show_reblogs": "Näytä buustaukset",
   "home.column_settings.show_replies": "Näytä vastaukset",
@@ -338,7 +343,7 @@
   "lightbox.next": "Seuraava",
   "lightbox.previous": "Edellinen",
   "limited_account_hint.action": "Näytä profiili joka tapauksessa",
-  "limited_account_hint.title": "Palvelun {domain} moderaattorit ovat piilottaneet tämän profiilin.",
+  "limited_account_hint.title": "Palvelun {domain} ylläpito on piilottanut tämän profiilin.",
   "lists.account.add": "Lisää listaan",
   "lists.account.remove": "Poista listasta",
   "lists.delete": "Poista lista",
@@ -368,7 +373,7 @@
   "navigation_bar.compose": "Luo uusi viesti",
   "navigation_bar.direct": "Yksityisviestit",
   "navigation_bar.discover": "Löydä uutta",
-  "navigation_bar.domain_blocks": "Estetyt verkkotunnukset",
+  "navigation_bar.domain_blocks": "Estetyt palvelut",
   "navigation_bar.edit_profile": "Muokkaa profiilia",
   "navigation_bar.explore": "Selaa",
   "navigation_bar.favourites": "Suosikit",
@@ -413,7 +418,7 @@
   "notifications.column_settings.reblog": "Buustit:",
   "notifications.column_settings.show": "Näytä sarakkeessa",
   "notifications.column_settings.sound": "Äänimerkki",
-  "notifications.column_settings.status": "Uudet viestit:",
+  "notifications.column_settings.status": "Uudet julkaisut:",
   "notifications.column_settings.unread_notifications.category": "Lukemattomat ilmoitukset",
   "notifications.column_settings.unread_notifications.highlight": "Korosta lukemattomat ilmoitukset",
   "notifications.column_settings.update": "Muokkaukset:",
@@ -514,29 +519,30 @@
   "search.placeholder": "Hae",
   "search.search_or_paste": "Etsi tai kirjoita URL-osoite",
   "search_popout.search_format": "Tarkennettu haku",
-  "search_popout.tips.full_text": "Tekstihaku listaa tilapäivitykset, jotka olet kirjoittanut, lisännyt suosikkeihisi, boostannut tai joissa sinut mainitaan, sekä tekstin sisältävät käyttäjänimet, nimimerkit ja hastagit.",
+  "search_popout.tips.full_text": "Tekstihaku listaa tilapäivitykset, jotka olet kirjoittanut, lisännyt suosikkeihisi, boostannut tai joissa sinut mainitaan, sekä tekstin sisältävät käyttäjänimet, nimimerkit ja aihetunnisteet.",
   "search_popout.tips.hashtag": "aihetunnisteet",
   "search_popout.tips.status": "julkaisu",
-  "search_popout.tips.text": "Tekstihaku listaa hakua vastaavat nimimerkit, käyttäjänimet ja hastagit",
+  "search_popout.tips.text": "Tekstihaku listaa hakua vastaavat nimimerkit, käyttäjänimet ja aihetunnisteet",
   "search_popout.tips.user": "käyttäjä",
   "search_results.accounts": "Ihmiset",
   "search_results.all": "Kaikki",
   "search_results.hashtags": "Aihetunnisteet",
   "search_results.nothing_found": "Näille hakusanoille ei löytynyt mitään",
-  "search_results.statuses": "Viestit",
+  "search_results.statuses": "Julkaisut",
   "search_results.statuses_fts_disabled": "Viestien haku sisällön perusteella ei ole käytössä tällä Mastodon-palvelimella.",
   "search_results.title": "Etsi {q}",
   "search_results.total": "{count, number} {count, plural, one {tulos} other {tulosta}}",
   "server_banner.about_active_users": "Palvelinta käyttäneet ihmiset viimeisen 30 päivän aikana (kuukauden aktiiviset käyttäjät)",
-  "server_banner.active_users": "aktiiviset käyttäjät",
+  "server_banner.active_users": "aktiivista käyttäjää",
   "server_banner.administered_by": "Ylläpitäjä:",
-  "server_banner.introduction": "{domain} on osa hajautettua sosiaalista verkostoa, jonka tarjoaa {mastodon}.",
+  "server_banner.introduction": "{domain} kuuluu hajautettuun sosiaaliseen verkostoon, jonka voimanlähde on {mastodon}.",
   "server_banner.learn_more": "Lue lisää",
   "server_banner.server_stats": "Palvelimen tilastot:",
   "sign_in_banner.create_account": "Luo tili",
   "sign_in_banner.sign_in": "Kirjaudu sisään",
-  "sign_in_banner.text": "Kirjaudu sisään seurataksesi profiileja tai hashtageja, lisätäksesi suosikkeihin, jakaaksesi viestejä ja vastataksesi niihin tai ollaksesi vuorovaikutuksessa tililläsi toisella palvelimella.",
+  "sign_in_banner.text": "Kirjaudu sisään seurataksesi profiileja tai aihetunnisteita, lisätäksesi suosikkeihin, jakaaksesi julkaisuja ja vastataksesi niihin tai ollaksesi vuorovaikutuksessa tililläsi toisella palvelimella.",
   "status.admin_account": "Avaa moderaattorinäkymä tilistä @{name}",
+  "status.admin_domain": "Avaa palvelimen {domain} moderointitoiminnot",
   "status.admin_status": "Avaa julkaisu moderointinäkymässä",
   "status.block": "Estä @{name}",
   "status.bookmark": "Tallenna kirjanmerkki",
@@ -553,7 +559,7 @@
   "status.favourite": "Lisää suosikkeihin",
   "status.filter": "Suodata tämä viesti",
   "status.filtered": "Suodatettu",
-  "status.hide": "Piilota toot",
+  "status.hide": "Piilota viesti",
   "status.history.created": "{name} luotu {date}",
   "status.history.edited": "{name} muokkasi {date}",
   "status.load_more": "Lataa lisää",
@@ -604,8 +610,8 @@
   "time_remaining.moments": "Hetki jäljellä",
   "time_remaining.seconds": "{number, plural, one {# sekunti} other {# sekuntia}} jäljellä",
   "timeline_hint.remote_resource_not_displayed": "{resource} muilta palvelimilta ei näytetä.",
-  "timeline_hint.resources.followers": "Seuraajat",
-  "timeline_hint.resources.follows": "seurattua",
+  "timeline_hint.resources.followers": "Seuraajia",
+  "timeline_hint.resources.follows": "Seurattuja",
   "timeline_hint.resources.statuses": "Vanhemmat julkaisut",
   "trends.counter_by_accounts": "{count, plural, one {{counter} henkilö} other {{counter} henkilöä}} viimeisten {days, plural, one {päivän} other {{days} päivän}}",
   "trends.trending_now": "Suosittua nyt",
@@ -617,13 +623,13 @@
   "upload_button.label": "Lisää mediaa",
   "upload_error.limit": "Tiedostolatauksien raja ylitetty.",
   "upload_error.poll": "Tiedon lataaminen ei ole sallittua kyselyissä.",
-  "upload_form.audio_description": "Kuvaile kuulovammaisille",
-  "upload_form.description": "Anna kuvaus näkörajoitteisia varten",
+  "upload_form.audio_description": "Kuvaile sisältöä kuuroille ja kuulorajoitteisille",
+  "upload_form.description": "Kuvaile sisältöä sokeille ja näkörajoitteisille",
   "upload_form.description_missing": "Kuvausta ei ole lisätty",
   "upload_form.edit": "Kuvaile",
   "upload_form.thumbnail": "Vaihda pikkukuva",
   "upload_form.undo": "Peru",
-  "upload_form.video_description": "Kuvaile kuulo- tai näkövammaisille",
+  "upload_form.video_description": "Kuvaile sisältöä kuuroille, kuulorajoitteisille, sokeille tai näkörajoitteisille",
   "upload_modal.analyzing_picture": "Analysoidaan kuvaa…",
   "upload_modal.apply": "Käytä",
   "upload_modal.applying": "Asetetaan…",
diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json
index f716b6373..1841df058 100644
--- a/app/javascript/mastodon/locales/fo.json
+++ b/app/javascript/mastodon/locales/fo.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Uppsløg og svar",
   "account.report": "Melda @{name}",
   "account.requested": "Bíðar eftir góðkenning. Trýst fyri at angra umbønina",
+  "account.requested_follow": "{name} hevur biðið um at fylgja tær",
   "account.share": "Deil vanga @{name}'s",
   "account.show_reblogs": "Vís lyft frá @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} postur} other {{counter} postar}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Leita eftir málum...",
   "compose_form.direct_message_warning_learn_more": "Fleiri upplýsingar",
   "compose_form.encryption_warning": "Postar á Mastodon eru ikki bronglaðir úr enda í annan. Lat vera við at deila viðkvæmar upplýsingar á Mastodon.",
-  "compose_form.hashtag_warning": "Hesin posturin verður ikki listaður undir nøkrum frámerki, tí hann er ólistaður. Tað ber einans til at leita eftir almennum postum eftir frámerki.",
+  "compose_form.hashtag_warning": "Hesin posturin verður ikki listaður undir nøkrum frámerki, tí hann er ikki almennur. Tað ber einans til at leita eftir almennum postum eftir frámerki.",
   "compose_form.lock_disclaimer": "Kontoin hjá tær er ikki {locked}. Øll kunnu fylgja tær og lesa tað, tú bert letur fyljgarar lesa.",
   "compose_form.lock_disclaimer.lock": "læst",
   "compose_form.placeholder": "Hvat hevur tú í huga?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Avrita stakkaslóðina til setiborðið",
   "errors.unexpected_crash.report_issue": "Fráboða trupulleika",
   "explore.search_results": "Leitiúrslit",
+  "explore.suggested_follows": "Til tín",
   "explore.title": "Rannsaka",
+  "explore.trending_links": "Tíðindi",
+  "explore.trending_statuses": "Postar",
+  "explore.trending_tags": "Frámerki",
   "filter_modal.added.context_mismatch_explanation": "Hesin filturbólkurin viðvíkur ikki kontekstinum, sum tú hevur fingið atgongd til hendan postin. Ynskir tú at posturin verður filtreraður í hesum kontekstinum eisini, so er neyðugt at tú rættar filtrið.",
   "filter_modal.added.context_mismatch_title": "Ósamsvar við kontekst!",
   "filter_modal.added.expired_explanation": "Hesin filturbólkurin er útgingin, og tú mást broyta dagfestingina fyri at hann skal virka.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Rita inn",
   "sign_in_banner.text": "Innrita fyri at fylgja vangum og frámerkjum, seta yndismerki á, deila og svara postum, ella at brúka kontuna til at samvirka á einum øðrum ambætara.",
   "status.admin_account": "Lat kjakleiðaramarkamót upp fyri @{name}",
+  "status.admin_domain": "Lat umsjónarmarkamót upp fyri {domain}",
   "status.admin_status": "Lat hendan postin upp í kjakleiðaramarkamótinum",
   "status.block": "Blokera @{name}",
   "status.bookmark": "Goym",
@@ -617,13 +623,13 @@
   "upload_button.label": "Legg myndir, sjónfílu ella ljóðfílu afturat",
   "upload_error.limit": "Farið er um markið fyri fíluuppsending.",
   "upload_error.poll": "Ikki loyvt at leggja fílur upp í spurnarkanningum.",
-  "upload_form.audio_description": "Lýsing, av innihaldi, fyri deyv",
-  "upload_form.description": "Lýsing, av innihaldi, fyri blind og sjónveik",
+  "upload_form.audio_description": "Lýs fyri teimum, sum eru deyv ella hava ringa hoyrn",
+  "upload_form.description": "Lýs fyri teimum, sum eru blind ella eru sjónveik",
   "upload_form.description_missing": "Lýsing vantar",
   "upload_form.edit": "Rætta",
   "upload_form.thumbnail": "Broyt smámynd",
   "upload_form.undo": "Strika",
-  "upload_form.video_description": "Lýsing fyri deyv, blind og sjónveik",
+  "upload_form.video_description": "Lýs fyri teimum, sum eru deyv, hava ringa hoyrn, eru blind ella eru sjónveik",
   "upload_modal.analyzing_picture": "Greini mynd…",
   "upload_modal.apply": "Ger virkið",
   "upload_modal.applying": "Geri virkið…",
diff --git a/app/javascript/mastodon/locales/fr-QC.json b/app/javascript/mastodon/locales/fr-QC.json
index d0d84fa4a..89c3e7644 100644
--- a/app/javascript/mastodon/locales/fr-QC.json
+++ b/app/javascript/mastodon/locales/fr-QC.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Publications et réponses",
   "account.report": "Signaler @{name}",
   "account.requested": "En attente d’approbation. Cliquez pour annuler la demande",
+  "account.requested_follow": "{name} a demandé à vous suivre",
   "account.share": "Partager le profil de @{name}",
   "account.show_reblogs": "Afficher les boosts de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Publication} other {{counter} Publications}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Rechercher des langues…",
   "compose_form.direct_message_warning_learn_more": "En savoir plus",
   "compose_form.encryption_warning": "Les publications sur Mastodon ne sont pas chiffrées de bout en bout. Veuillez ne partager aucune information sensible sur Mastodon.",
-  "compose_form.hashtag_warning": "Cette publication ne sera pas listée dans les recherches par hashtag car sa visibilité est réglée sur « non listée ». Seuls les publications avec visibilité « publique » peuvent être recherchées par hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Votre compte n’est pas {locked}. Tout le monde peut vous suivre et voir vos publications privés.",
   "compose_form.lock_disclaimer.lock": "verrouillé",
   "compose_form.placeholder": "À quoi pensez-vous?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copier la trace d'appels dans le presse-papier",
   "errors.unexpected_crash.report_issue": "Signaler un problème",
   "explore.search_results": "Résultats",
+  "explore.suggested_follows": "Pour vous",
   "explore.title": "Explorer",
+  "explore.trending_links": "Nouvelles",
+  "explore.trending_statuses": "Messages",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "Cette catégorie de filtre ne s'applique pas au contexte dans lequel vous avez accédé à cette publication. Si vous voulez que la publication soit filtrée dans ce contexte également, vous devrez modifier le filtre.",
   "filter_modal.added.context_mismatch_title": "Incompatibilité du contexte!",
   "filter_modal.added.expired_explanation": "Cette catégorie de filtre a expiré, vous devrez modifier la date d'expiration pour qu'elle soit appliquée.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Se connecter",
   "sign_in_banner.text": "Connectez-vous pour suivre les profils ou les hashtags, ajouter aux favoris, partager et répondre aux publications, ou interagir depuis votre compte sur un autre serveur.",
   "status.admin_account": "Ouvrir l’interface de modération pour @{name}",
+  "status.admin_domain": "Ouvrir l’interface de modération pour {domain}",
   "status.admin_status": "Ouvrir ce message dans l’interface de modération",
   "status.block": "Bloquer @{name}",
   "status.bookmark": "Ajouter aux signets",
@@ -553,7 +559,7 @@
   "status.favourite": "Ajouter aux favoris",
   "status.filter": "Filtrer cette publication",
   "status.filtered": "Filtrée",
-  "status.hide": "Cacher la publication",
+  "status.hide": "Masquer la publication",
   "status.history.created": "créé par {name} {date}",
   "status.history.edited": "modifié par {name} {date}",
   "status.load_more": "Charger plus",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index bc4231bf8..d9c77089a 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Messages et réponses",
   "account.report": "Signaler @{name}",
   "account.requested": "En attente d’approbation. Cliquez pour annuler la demande",
+  "account.requested_follow": "{name} a demandé à vous suivre",
   "account.share": "Partager le profil de @{name}",
   "account.show_reblogs": "Afficher les partages de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Message} other {{counter} Messages}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Rechercher des langues …",
   "compose_form.direct_message_warning_learn_more": "En savoir plus",
   "compose_form.encryption_warning": "Les messages sur Mastodon ne sont pas chiffrés de bout en bout. Ne partagez aucune information sensible sur Mastodon.",
-  "compose_form.hashtag_warning": "Ce pouet ne sera pas listé dans les recherches par hashtag car sa visibilité est réglée sur « non listé ». Seuls les pouets avec une visibilité « publique » peuvent être recherchés par hashtag.",
+  "compose_form.hashtag_warning": "Ce message n'apparaîtra pas dans les listes de hashtags, car il n'est pas public. Seuls les messages publics peuvent appaître dans les recherches par hashtags.",
   "compose_form.lock_disclaimer": "Votre compte n’est pas {locked}. Tout le monde peut vous suivre et voir vos messages privés.",
   "compose_form.lock_disclaimer.lock": "verrouillé",
   "compose_form.placeholder": "Qu’avez-vous en tête ?",
@@ -186,7 +187,7 @@
   "disabled_account_banner.text": "Votre compte {disabledAccount} est actuellement désactivé.",
   "dismissable_banner.community_timeline": "Voici les messages publics les plus récents des personnes dont les comptes sont hébergés par {domain}.",
   "dismissable_banner.dismiss": "Rejeter",
-  "dismissable_banner.explore_links": "Ces nouvelles sont actuellement en cours de discussion par des personnes sur d'autres serveurs du réseau décentralisé ainsi que sur celui-ci.",
+  "dismissable_banner.explore_links": "On parle actuellement de ces nouvelles sur ce serveur, ainsi que sur d'autres serveurs du réseau décentralisé.",
   "dismissable_banner.explore_statuses": "Ces publications depuis les serveurs du réseau décentralisé, dont celui-ci, sont actuellement en train de gagner de l'ampleur sur ce serveur.",
   "dismissable_banner.explore_tags": "Ces hashtags sont actuellement en train de gagner de l'ampleur parmi les personnes sur les serveurs du réseau décentralisé dont celui-ci.",
   "dismissable_banner.public_timeline": "Voici les publications publiques les plus récentes des personnes de ce serveur et des autres du réseau décentralisé que ce serveur connait.",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copier la trace d'appels dans le presse-papier",
   "errors.unexpected_crash.report_issue": "Signaler le problème",
   "explore.search_results": "Résultats de la recherche",
+  "explore.suggested_follows": "Pour vous",
   "explore.title": "Explorer",
+  "explore.trending_links": "Nouvelles",
+  "explore.trending_statuses": "Messages",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "Cette catégorie de filtre ne s'applique pas au contexte dans lequel vous avez accédé à ce message. Si vous voulez que le message soit filtré dans ce contexte également, vous devrez modifier le filtre.",
   "filter_modal.added.context_mismatch_title": "Incompatibilité du contexte !",
   "filter_modal.added.expired_explanation": "Cette catégorie de filtre a expiré, vous devrez modifier la date d'expiration pour qu'elle soit appliquée.",
@@ -386,7 +391,7 @@
   "navigation_bar.security": "Sécurité",
   "not_signed_in_indicator.not_signed_in": "Vous devez vous connecter pour accéder à cette ressource.",
   "notification.admin.report": "{name} a signalé {target}",
-  "notification.admin.sign_up": "{name} s'est inscrit·e",
+  "notification.admin.sign_up": "{name} s'est inscrit",
   "notification.favourite": "{name} a aimé votre publication",
   "notification.follow": "{name} vous suit",
   "notification.follow_request": "{name} a demandé à vous suivre",
@@ -518,7 +523,7 @@
   "search_popout.tips.hashtag": "hashtag",
   "search_popout.tips.status": "message",
   "search_popout.tips.text": "Un texte simple renvoie les noms affichés, les identifiants et les hashtags correspondants",
-  "search_popout.tips.user": "utilisateur·ice",
+  "search_popout.tips.user": "utilisateur",
   "search_results.accounts": "Comptes",
   "search_results.all": "Tous les résultats",
   "search_results.hashtags": "Hashtags",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Se connecter",
   "sign_in_banner.text": "Connectez-vous pour suivre les profils ou les hashtags, ajouter aux favoris, partager et répondre aux messages, ou interagir depuis votre compte sur un autre serveur.",
   "status.admin_account": "Ouvrir l’interface de modération pour @{name}",
+  "status.admin_domain": "Ouvrir l’interface de modération pour {domain}",
   "status.admin_status": "Ouvrir ce message dans l’interface de modération",
   "status.block": "Bloquer @{name}",
   "status.bookmark": "Ajouter aux marque-pages",
@@ -553,7 +559,7 @@
   "status.favourite": "Ajouter aux favoris",
   "status.filter": "Filtrer ce message",
   "status.filtered": "Filtré",
-  "status.hide": "Cacher le pouet",
+  "status.hide": "Masquer la publication",
   "status.history.created": "créé par {name} {date}",
   "status.history.edited": "édité par {name} {date}",
   "status.load_more": "Charger plus",
@@ -618,7 +624,7 @@
   "upload_error.limit": "Taille maximale d'envoi de fichier dépassée.",
   "upload_error.poll": "L’envoi de fichiers n’est pas autorisé avec les sondages.",
   "upload_form.audio_description": "Décrire pour les personnes ayant des difficultés d’audition",
-  "upload_form.description": "Décrire pour les malvoyant·e·s",
+  "upload_form.description": "Décrire pour les malvoyants",
   "upload_form.description_missing": "Description manquante",
   "upload_form.edit": "Décrire",
   "upload_form.thumbnail": "Changer la vignette",
diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json
index 86cfe64ad..9cbf32e5c 100644
--- a/app/javascript/mastodon/locales/fy.json
+++ b/app/javascript/mastodon/locales/fy.json
@@ -3,8 +3,8 @@
   "about.contact": "Kontakt:",
   "about.disclaimer": "Mastodon is frije, iepenboarnesoftware en in hannelsmerk fan Mastodon gGmbH.",
   "about.domain_blocks.no_reason_available": "Reden net beskikber",
-  "about.domain_blocks.preamble": "Yn it algemien kinsto mei Mastodon berjochten ûntfange fan, en ynteraksje hawwe mei brûkers fan elke server yn de fediverse. Dit binne de útsûnderingen dy’t op dizze spesifike server jilde.",
-  "about.domain_blocks.silenced.explanation": "Yn it algemien sjochsto gjin berjochten en accounts fan dizze server, útsein do berjochten eksplisyt opsikest of derfoar kiest om in account fan dizze server te folgjen.",
+  "about.domain_blocks.preamble": "Yn it algemien kinne jo mei Mastodon berjochten ûntfange fan, en ynteraksje hawwe mei brûkers fan elke server yn de fediverse. Dit binne de útsûnderingen dy’t op dizze spesifike server jilde.",
+  "about.domain_blocks.silenced.explanation": "Yn it algemien sjogge jo gjin berjochten en accounts fan dizze server, útsein as jo berjochten eksplisyt opsikje of derfoar kieze om in account fan dizze server te folgjen.",
   "about.domain_blocks.silenced.title": "Beheind",
   "about.domain_blocks.suspended.explanation": "Der wurde gjin gegevens fan dizze server ferwurke, bewarre of útwiksele, wat ynteraksje of kommunikaasje mei brûkers fan dizze server ûnmooglik makket.",
   "about.domain_blocks.suspended.title": "Utsteld",
@@ -12,7 +12,7 @@
   "about.powered_by": "Desintralisearre sosjale media, mooglik makke troch {mastodon}",
   "about.rules": "Serverrigels",
   "account.account_note_header": "Opmerking",
-  "account.add_or_remove_from_list": "Tafoegje of fuortsmite fan listen út",
+  "account.add_or_remove_from_list": "Tafoegje oan of fuortsmite út listen",
   "account.badges.bot": "Bot",
   "account.badges.group": "Groep",
   "account.block": "@{name} blokkearje",
@@ -36,7 +36,7 @@
   "account.following": "Folgjend",
   "account.following_counter": "{count, plural, one {{counter} folgjend} other {{counter} folgjend}}",
   "account.follows.empty": "Dizze brûker folget noch net ien.",
-  "account.follows_you": "Folget dy",
+  "account.follows_you": "Folget jo",
   "account.go_to_profile": "Gean nei profyl",
   "account.hide_reblogs": "Boosts fan @{name} ferstopje",
   "account.joined_short": "Registrearre op",
@@ -45,15 +45,16 @@
   "account.locked_info": "De privacysteat fan dizze account is op beskoattele set. De eigener bepaalt hânmjittich wa’t dyjinge folgje kin.",
   "account.media": "Media",
   "account.mention": "@{name} fermelde",
-  "account.moved_to": "{name} is ferhuze net:",
+  "account.moved_to": "{name} is ferhuze nei:",
   "account.mute": "@{name} negearje",
   "account.mute_notifications": "Meldingen fan @{name} negearje",
   "account.muted": "Negearre",
-  "account.open_original_page": "Iepenje orizjinele side",
+  "account.open_original_page": "Orizjinele side iepenje",
   "account.posts": "Berjochten",
   "account.posts_with_replies": "Berjochten en reaksjes",
   "account.report": "@{name} rapportearje",
   "account.requested": "Wacht op goedkarring. Klik om it folchfersyk te annulearjen",
+  "account.requested_follow": "{name} hat dy in folchfersyk stjoerd",
   "account.share": "Profyl fan @{name} diele",
   "account.show_reblogs": "Boosts fan @{name} toane",
   "account.statuses_counter": "{count, plural, one {{counter} berjocht} other {{counter} berjochten}}",
@@ -63,39 +64,39 @@
   "account.unendorse": "Net op profyl werjaan",
   "account.unfollow": "Net mear folgje",
   "account.unmute": "@{name} net langer negearje",
-  "account.unmute_notifications": "Notifikaasjes fan @{name} ynskeakelje",
+  "account.unmute_notifications": "Meldingen fan @{name} ynskeakelje",
   "account.unmute_short": "Net mear negearje",
   "account_note.placeholder": "Klik om notysje ta te foegjen",
-  "admin.dashboard.daily_retention": "Meidogger retinsjegraad per dei nei oanmelding",
-  "admin.dashboard.monthly_retention": "Meidogger retinsjegraad per moanne nei oanmelding",
+  "admin.dashboard.daily_retention": "Brûkerretinsjegraad per dei nei oanmelding",
+  "admin.dashboard.monthly_retention": "Brûkerretinsjegraad per moanne nei oanmelding",
   "admin.dashboard.retention.average": "Gemiddelde",
-  "admin.dashboard.retention.cohort": "Moanne fan registraasje",
+  "admin.dashboard.retention.cohort": "Registraasjemoanne",
   "admin.dashboard.retention.cohort_size": "Nije brûkers",
-  "alert.rate_limited.message": "Besykje asjebleaft opnij nei {retry_time, time, medium}.",
+  "alert.rate_limited.message": "Opnij probearje nei {retry_time, time, medium}.",
   "alert.rate_limited.title": "Dataferkear beheind",
-  "alert.unexpected.message": "Der barde in ûnferwachte flater.",
+  "alert.unexpected.message": "Der is in ûnferwachte flater bard.",
   "alert.unexpected.title": "Oepsy!",
-  "announcement.announcement": "Meidieling",
+  "announcement.announcement": "Oankundiging",
   "attachments_list.unprocessed": "(net ferwurke)",
   "audio.hide": "Audio ferstopje",
   "autosuggest_hashtag.per_week": "{count} yn ’e wike",
-  "boost_modal.combo": "Jo kinne op {combo} drukke om dit in oare kear oer te slaan",
-  "bundle_column_error.copy_stacktrace": "Kopiearje flaterrapport",
+  "boost_modal.combo": "Jo kinne op {combo} drukke om dit de folgjende kear oer te slaan",
+  "bundle_column_error.copy_stacktrace": "Flaterrapport kopiearje",
   "bundle_column_error.error.body": "De opfrege side koe net werjûn wurde. It kin wêze troch in flater yn ús koade, of in probleem mei browserkompatibiliteit.",
   "bundle_column_error.error.title": "Oh nee!",
-  "bundle_column_error.network.body": "Der wie in flater by it laden fan dizze side. Dit kin komme troch in tydlik probleem mei jo ynternetferbining of dizze server.",
+  "bundle_column_error.network.body": "Der is in flater bard by it laden fan dizze side. Dit kin komme troch in tydlik probleem mei jo ynternetferbining of dizze server.",
   "bundle_column_error.network.title": "Netwurkflater",
   "bundle_column_error.retry": "Opnij probearje",
   "bundle_column_error.return": "Tebek nei startside",
-  "bundle_column_error.routing.body": "De opfrege side kin net fûn wurde. Binne jo wis dat de URL yn 'e adresbalke goed is?",
+  "bundle_column_error.routing.body": "De opfrege side kin net fûn wurde. Binne jo wis dat de URL yn de adresbalke goed is?",
   "bundle_column_error.routing.title": "404",
   "bundle_modal_error.close": "Slute",
-  "bundle_modal_error.message": "Der gie der mis by it laden fan dizze komponint.",
+  "bundle_modal_error.message": "Der gie wat mis by it laden fan dizze komponint.",
   "bundle_modal_error.retry": "Opnij probearje",
-  "closed_registrations.other_server_instructions": "Sûnt Mastodon desintralisearre is, kinne jo in akkount meitsje op in oare server en noch hieltyd ynteraksje hawwe mei dizze.",
-  "closed_registrations_modal.description": "It oanmeitsjen fan in akkount op {domain} is op it stuit net mooglik, mar hâld asjebleaft yn gedachten dat jo gjin akkount spesifyk op {domain} nedich hawwe om Mastodon te brûken.",
+  "closed_registrations.other_server_instructions": "Omdat Mastodon desintralisearre is, kinne jo in account meitsje op in oare server en noch hieltyd ynteraksje hawwe mei dizze.",
+  "closed_registrations_modal.description": "It oanmeitsjen fan in account op {domain} is op dit stuit net mooglik, mar hâld asjebleaft yn gedachten dat jo gjin account spesifyk op {domain} nedich hawwe om Mastodon te brûken.",
   "closed_registrations_modal.find_another_server": "Sykje in oare server",
-  "closed_registrations_modal.preamble": "Mastodon is desintralisearre, dus nettsjinsteande wêr't jo jo akkount oanmeitsje, jo kinne elkenien op dizze server folgje en ynteraksje mei hawwe. Jo kinne it sels sels hoste!",
+  "closed_registrations_modal.preamble": "Mastodon is desintralisearre, dus nettsjinsteande wêr't jo jo account oanmeitsje, jo kinne elkenien op dizze server folgje en der ynteraksje mei hawwe. Jo kinne it sels sels hoste!",
   "closed_registrations_modal.title": "Oanmelde op Mastodon",
   "column.about": "Oer",
   "column.blocks": "Blokkearre brûkers",
@@ -103,7 +104,7 @@
   "column.community": "Lokale tiidline",
   "column.direct": "Direkte berjochten",
   "column.directory": "Profilen trochsykje",
-  "column.domain_blocks": "Blokkeare domeinen",
+  "column.domain_blocks": "Blokkearre domeinen",
   "column.favourites": "Favoriten",
   "column.follow_requests": "Folchfersiken",
   "column.home": "Startside",
@@ -112,13 +113,13 @@
   "column.notifications": "Meldingen",
   "column.pins": "Fêstsette berjochten",
   "column.public": "Globale tiidline",
-  "column_back_button.label": "Werom",
+  "column_back_button.label": "Tebek",
   "column_header.hide_settings": "Ynstellingen ferstopje",
   "column_header.moveLeft_settings": "Kolom nei links ferpleatse",
   "column_header.moveRight_settings": "Kolom nei rjochts ferpleatse",
   "column_header.pin": "Fêstsette",
   "column_header.show_settings": "Ynstellingen toane",
-  "column_header.unpin": "Los helje",
+  "column_header.unpin": "Losmeitsje",
   "column_subheading.settings": "Ynstellingen",
   "community.column_settings.local_only": "Allinnich lokaal",
   "community.column_settings.media_only": "Allinnich media",
@@ -127,49 +128,49 @@
   "compose.language.search": "Talen sykje…",
   "compose_form.direct_message_warning_learn_more": "Mear ynfo",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
-  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
+  "compose_form.hashtag_warning": "Dit berjocht falt net ûnder in hashtag te besjen, omdat dizze net op iepenbier is. Allinnich iepenbiere berjochten kinne fia hashtags fûn wurde.",
+  "compose_form.lock_disclaimer": "Jo account is net {locked}. Elkenien kin jo folgje en kin de berjochten sjen dy’t jo allinnich oan jo folgers rjochte hawwe.",
   "compose_form.lock_disclaimer.lock": "beskoattele",
-  "compose_form.placeholder": "Wat wolsto kwyt?",
+  "compose_form.placeholder": "Wat wolle jo kwyt?",
   "compose_form.poll.add_option": "Kar tafoegje",
-  "compose_form.poll.duration": "Doer fan de poll",
-  "compose_form.poll.option_placeholder": "Keuze {number}",
+  "compose_form.poll.duration": "Doer fan de enkête",
+  "compose_form.poll.option_placeholder": "Kar {number}",
   "compose_form.poll.remove_option": "Dizze kar fuortsmite",
-  "compose_form.poll.switch_to_multiple": "Poll wizigje om meardere karren ta te stean",
-  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
+  "compose_form.poll.switch_to_multiple": "Enkête wizigje om meardere karren ta te stean",
+  "compose_form.poll.switch_to_single": "Enkête wizigje om in inkelde kar ta te stean",
   "compose_form.publish": "Publisearje",
-  "compose_form.publish_form": "Publish",
+  "compose_form.publish_form": "Publisearje",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Wizigingen bewarje",
   "compose_form.sensitive.hide": "{count, plural, one {Media as gefoelich markearje} other {Media as gefoelich markearje}}",
-  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
-  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media as gefoelich markearre} other {Media as gefoelich markearre}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is net as gefoelich markearre} other {Media is net as gefoelich markearre}}",
   "compose_form.spoiler.marked": "Ynhâldswarskôging fuortsmite",
   "compose_form.spoiler.unmarked": "Ynhâldswarskôging tafoegje",
-  "compose_form.spoiler_placeholder": "Write your warning here",
+  "compose_form.spoiler_placeholder": "Warskôgingstekst",
   "confirmation_modal.cancel": "Annulearje",
   "confirmations.block.block_and_report": "Blokkearje en rapportearje",
   "confirmations.block.confirm": "Blokkearje",
   "confirmations.block.message": "Bisto wis datsto {name} blokkearje wolst?",
-  "confirmations.cancel_follow_request.confirm": "Withdraw request",
-  "confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?",
+  "confirmations.cancel_follow_request.confirm": "Fersyk annulearje",
+  "confirmations.cancel_follow_request.message": "Binne jo wis dat jo jo fersyk om {name} te folgjen annulearje wolle?",
   "confirmations.delete.confirm": "Fuortsmite",
-  "confirmations.delete.message": "Bisto wis datsto dit berjocht fuortsmite wolst?",
+  "confirmations.delete.message": "Binne jo wis dat jo dit berjocht fuortsmite wolle?",
   "confirmations.delete_list.confirm": "Fuortsmite",
   "confirmations.delete_list.message": "Bisto wis datsto dizze list foar permanint fuortsmite wolst?",
   "confirmations.discard_edit_media.confirm": "Fuortsmite",
-  "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+  "confirmations.discard_edit_media.message": "Jo hawwe net-bewarre wizigingen yn de mediabeskriuwing of foarfertoaning, wolle jo dizze dochs fuortsmite?",
   "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.domain_block.message": "Binne jo echt wis dat jo alles fan {domain} negearje wolle? Yn de measte gefallen is it blokkearjen of negearjen fan in pear spesifike persoanen genôch en better. Jo sille gjin berjochten fan dizze server op iepenbiere tiidlinen sjen of yn jo meldingen. Jo folgers fan dizze server wurde fuortsmiten.",
   "confirmations.logout.confirm": "Ofmelde",
   "confirmations.logout.message": "Bisto wis datsto ôfmelde wolst?",
   "confirmations.mute.confirm": "Negearje",
-  "confirmations.mute.explanation": "Dit sil berjochten fan harren en berjochten wêr’t se yn fermeld wurden ûnsichtber meitsje, mar se sille dyn berjochten noch hieltyd sjen kinne en dy folgje kinne.",
-  "confirmations.mute.message": "Bisto wis datsto {name} negearje wolst?",
+  "confirmations.mute.explanation": "Dit sil berjochten fan harren en berjochten dêr’t se yn fermeld wurde ûnsichtber meitsje, mar se sille berjochten noch hieltyd sjen kinne en jo folgje kinne.",
+  "confirmations.mute.message": "Binne jo wis dat jo {name} negearje wolle?",
   "confirmations.redraft.confirm": "Fuortsmite en opnij opstelle",
-  "confirmations.redraft.message": "Wolsto dit berjocht wurklik fuortsmite en opnij opstelle? Favoriten en boosts geane dan ferlern en reaksjes op it oarspronklike berjocht rekkesto kwyt.",
+  "confirmations.redraft.message": "Wolle jo dit berjocht wurklik fuortsmite en opnij opstelle? Favoriten en boosts geane dan ferlern en reaksjes op it oarspronklike berjocht reitsje jo kwyt.",
   "confirmations.reply.confirm": "Reagearje",
-  "confirmations.reply.message": "Troch no te reagearjen sil it berjocht watsto no oan it skriuwen binne oerskreaun wurde. Wolsto trochgean?",
+  "confirmations.reply.message": "Troch no te reagearjen sil it berjocht dat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo trochgean?",
   "confirmations.unfollow.confirm": "Net mear folgje",
   "confirmations.unfollow.message": "Bisto wis datsto {name} net mear folgje wolst?",
   "conversation.delete": "Petear fuortsmite",
@@ -182,16 +183,16 @@
   "directory.local": "Allinnich fan {domain}",
   "directory.new_arrivals": "Nije accounts",
   "directory.recently_active": "Resint aktyf",
-  "disabled_account_banner.account_settings": "Account settings",
-  "disabled_account_banner.text": "Your account {disabledAccount} is currently disabled.",
-  "dismissable_banner.community_timeline": "These are the most recent public posts from people whose accounts are hosted by {domain}.",
+  "disabled_account_banner.account_settings": "Accountynstellingen",
+  "disabled_account_banner.text": "Jo account {disabledAccount} is op dit stuit útskeakele.",
+  "dismissable_banner.community_timeline": "Dit binne de meast resinte iepenbiere berjochten fan accounts op {domain}.",
   "dismissable_banner.dismiss": "Slute",
-  "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.",
-  "dismissable_banner.explore_statuses": "These posts from this and other servers in the decentralized network are gaining traction on this server right now.",
-  "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.",
-  "dismissable_banner.public_timeline": "These are the most recent public posts from people on this and other servers of the decentralized network that this server knows about.",
+  "dismissable_banner.explore_links": "Dizze nijsberjochten winne oan populariteit op dizze en oare servers binnen it desintrale netwurk.",
+  "dismissable_banner.explore_statuses": "Dizze berjochten winne oan populariteit op dizze en oare servers binnen it desintrale netwurk.",
+  "dismissable_banner.explore_tags": "Dizze hashtags winne oan populariteit op dizze en oare servers binnen it desintrale netwurk.",
+  "dismissable_banner.public_timeline": "Dit binne de meast resinte iepenbiere berjochten fan accounts op dizze en oare servers binnen it desintrale netwurk. Jo kinne ûnder ‘Ynstellingen > Foarkarren > Oars’ kieze hokker talen jo sjen wolle.",
   "embed.instructions": "Embed this status on your website by copying the code below.",
-  "embed.preview": "Here is what it will look like:",
+  "embed.preview": "Sa komt it der út te sjen:",
   "emoji_button.activity": "Aktiviteiten",
   "emoji_button.clear": "Wiskje",
   "emoji_button.custom": "Oanpast",
@@ -199,7 +200,7 @@
   "emoji_button.food": "Iten en drinken",
   "emoji_button.label": "Emoji tafoegje",
   "emoji_button.nature": "Natuer",
-  "emoji_button.not_found": "No matching emojis found",
+  "emoji_button.not_found": "Gjin oerienkommende emoji fûn",
   "emoji_button.objects": "Objekten",
   "emoji_button.people": "Minsken",
   "emoji_button.recent": "Faaks brûkt",
@@ -211,41 +212,45 @@
   "empty_column.account_timeline": "Hjir binne gjin berjochten!",
   "empty_column.account_unavailable": "Profyl net beskikber",
   "empty_column.blocks": "Do hast noch gjin brûkers blokkearre.",
-  "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.",
-  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
-  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.bookmarked_statuses": "Jo hawwe noch gjin berjochten oan jo blêdwizers tafoege. Wannear’t jo der ien oan jo blêdwizers tafoegje, falt dizze hjir te sjen.",
+  "empty_column.community": "De lokale tiidline is noch leech. Pleats in iepenbier berjocht om de spits ôf te biten!",
+  "empty_column.direct": "Jo hawwe noch gjin direkte berjochten. Wannear’t jo der ien ferstjoere of ûntfang, komt dizze hjir te stean.",
   "empty_column.domain_blocks": "Der binne noch gjin blokkearre domeinen.",
-  "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
-  "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.",
-  "empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.",
-  "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
-  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
-  "empty_column.hashtag": "There is nothing in this hashtag yet.",
-  "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}",
+  "empty_column.explore_statuses": "Op dit stuit binne der gjin trends. Kom letter werom!",
+  "empty_column.favourited_statuses": "Jo hawwe noch gjin favorite berjochten. Wannear’t jo ien as favoryt markearje, falt dizze hjir te sjen.",
+  "empty_column.favourites": "Net ien hat dit berjocht noch as favoryt markearre. Wannear’t ien dit docht, falt dat hjir te sjen.",
+  "empty_column.follow_recommendations": "It liket der op dat der gjin oanrekommandaasjes foar jo oanmakke wurde kinne. Jo kinne probearje te sykjen nei minsken dy’t jo miskien kinne, sykje op hashtags, de lokale en globale tiidlinen besjen of de brûkersgids trochblêdzje.",
+  "empty_column.follow_requests": "Jo hawwe noch gjin folchfersiken ûntfongen. Wannear’t jo der ien ûntfange, falt dat hjir te sjen.",
+  "empty_column.hashtag": "Der is noch neat te finen ûnder dizze hashtag.",
+  "empty_column.home": "Dizze tiidline is leech! Folgje mear minsken om it te foljen. {suggestions}",
   "empty_column.home.suggestions": "Suggestjes besjen",
   "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": "Do hast noch gjin brûkers negearre.",
+  "empty_column.lists": "Jo hawwe noch gjin inkelde list. Wannear’t jo der ien oanmakke hawwe, falt dat hjir te sjen.",
+  "empty_column.mutes": "Jo hawwe noch gjin brûkers negearre.",
   "empty_column.notifications": "Do hast noch gjin meldingen. Ynteraksjes mei oare minsken sjochsto hjir.",
   "empty_column.public": "Der is hjir neat! Skriuw eat publyklik, of folgje sels brûkers fan oare servers om it hjir te foljen",
   "error.unexpected_crash.explanation": "Troch in bug in ús koade of in probleem mei de komptabiliteit fan jo browser, koe dizze side net toand wurde.",
   "error.unexpected_crash.explanation_addons": "Dizze side kin net goed toand wurde. Dit probleem komt faaks troch in browserútwreiding of ark foar automatysk oersetten.",
-  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "error.unexpected_crash.next_steps": "Probearje dizze side te fernijen. Wannear’t dit net helpt is it noch hieltyd mooglik om Mastodon yn in oare browser of mobile app te brûken.",
+  "error.unexpected_crash.next_steps_addons": "Probearje dizze út te skeakeljen en de side te fernijen. Wannear’t dit net helpt is it noch hieltyd mooglik om Mastodon yn in oare browser of mobile app te brûken.",
+  "errors.unexpected_crash.copy_stacktrace": "Stacktrace nei klamboerd kopiearje",
   "errors.unexpected_crash.report_issue": "Technysk probleem melde",
   "explore.search_results": "Sykresultaten",
+  "explore.suggested_follows": "Foar jo",
   "explore.title": "Ferkenne",
-  "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
-  "filter_modal.added.context_mismatch_title": "Context mismatch!",
-  "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
-  "filter_modal.added.expired_title": "Expired filter!",
-  "filter_modal.added.review_and_configure": "To review and further configure this filter category, go to the {settings_link}.",
+  "explore.trending_links": "Nijs",
+  "explore.trending_statuses": "Berjochten",
+  "explore.trending_tags": "Hashtags",
+  "filter_modal.added.context_mismatch_explanation": "Dizze filterkategory is net fan tapassing op de kontekst wêryn jo dit berjocht benadere hawwe. As jo wolle dat it berjocht ek yn dizze kontekst filtere wurdt, moatte jo it filter bewurkje.",
+  "filter_modal.added.context_mismatch_title": "Kontekst komt net oerien!",
+  "filter_modal.added.expired_explanation": "Dizze filterkategory is ferrûn. Jo moatte de ferrindatum wizigje om de kategory tapasse te kinnen.",
+  "filter_modal.added.expired_title": "Filter ferrûn!",
+  "filter_modal.added.review_and_configure": "Gean nei {settings_link} om dizze filterkategory opnij te besjen en fierder te konfigurearjen.",
   "filter_modal.added.review_and_configure_title": "Filterynstellingen",
   "filter_modal.added.settings_link": "ynstellingenside",
-  "filter_modal.added.short_explanation": "This post has been added to the following filter category: {title}.",
+  "filter_modal.added.short_explanation": "Dit berjocht is tafoege oan de folgjende filterkategory: {title}.",
   "filter_modal.added.title": "Filter tafoege!",
-  "filter_modal.select_filter.context_mismatch": "does not apply to this context",
+  "filter_modal.select_filter.context_mismatch": "is net fan tapassing op dizze kontekst",
   "filter_modal.select_filter.expired": "ferrûn",
   "filter_modal.select_filter.prompt_new": "Nije kategory: {name}",
   "filter_modal.select_filter.search": "Sykje of tafoegje",
@@ -253,11 +258,11 @@
   "filter_modal.select_filter.title": "Dit berjocht filterje",
   "filter_modal.title.status": "In berjocht filterje",
   "follow_recommendations.done": "Klear",
-  "follow_recommendations.heading": "Folgje minsken dêr’tsto graach berjochten fan sjen wolst! Hjir binne wat suggestjes.",
-  "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+  "follow_recommendations.heading": "Folgje minsken dêr’t jo graach berjochten fan sjen wolle! Hjir binne wat suggestjes.",
+  "follow_recommendations.lead": "Berjochten fan minsken dy’t jo folgje sille yn gronologyske folchoarder op jo starttiidline ferskine. Wês net bang om hjiryn flaters te meitsjen, want jo kinne minsken op elk momint krekt sa ienfâldich ûntfolgje!",
   "follow_request.authorize": "Goedkarre",
   "follow_request.reject": "Wegerje",
-  "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
+  "follow_requests.unlocked_explanation": "Ek al is jo account net besletten, de meiwurkers fan {domain} tinke dat jo miskien de folgjende folchfersiken hânmjittich kontrolearje.",
   "footer.about": "Oer",
   "footer.directory": "Profylmap",
   "footer.get_app": "App downloade",
@@ -270,41 +275,41 @@
   "hashtag.column_header.tag_mode.all": "en {additional}",
   "hashtag.column_header.tag_mode.any": "of {additional}",
   "hashtag.column_header.tag_mode.none": "sûnder {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.select.no_options_message": "Gjin suggestjes fûn",
+  "hashtag.column_settings.select.placeholder": "Folje hashtags yn…",
+  "hashtag.column_settings.tag_mode.all": "Allegearre",
+  "hashtag.column_settings.tag_mode.any": "Ien fan dizze",
+  "hashtag.column_settings.tag_mode.none": "Gjin fan dizze",
   "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
-  "hashtag.follow": "Follow hashtag",
-  "hashtag.unfollow": "Unfollow hashtag",
+  "hashtag.follow": "Hashtag folgje",
+  "hashtag.unfollow": "Hashtag ûntfolgje",
   "home.column_settings.basic": "Algemien",
   "home.column_settings.show_reblogs": "Boosts toane",
   "home.column_settings.show_replies": "Reaksjes toane",
   "home.hide_announcements": "Meidielingen ferstopje",
   "home.show_announcements": "Meidielingen toane",
-  "interaction_modal.description.favourite": "With an account on Mastodon, you can favourite this post to let the author know you appreciate it and save it for later.",
-  "interaction_modal.description.follow": "With an account on Mastodon, you can follow {name} to receive their posts in your home feed.",
-  "interaction_modal.description.reblog": "With an account on Mastodon, you can boost this post to share it with your own followers.",
-  "interaction_modal.description.reply": "With an account on Mastodon, you can respond to this post.",
-  "interaction_modal.on_another_server": "On a different server",
+  "interaction_modal.description.favourite": "Jo kinne mei in Mastodon-account dit berjocht as favoryt markearje, om dy brûker witte te litten dat jo it berjocht wurdearje en om it te bewarjen.",
+  "interaction_modal.description.follow": "Jo kinne mei in Mastodon-account {name} folgje, om sa harren berjochten op jo starttiidline te ûntfangen.",
+  "interaction_modal.description.reblog": "Jo kinne mei in Mastodon-account dit berjocht booste, om it sa mei jo folgers te dielen.",
+  "interaction_modal.description.reply": "Jo kinne mei in Mastodon-account op dit berjocht reagearje.",
+  "interaction_modal.on_another_server": "Op een oare server",
   "interaction_modal.on_this_server": "Op dizze server",
-  "interaction_modal.other_server_instructions": "Copy and paste this URL into the search field of your favourite Mastodon app or the web interface of your Mastodon server.",
-  "interaction_modal.preamble": "Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don't have an account on this one.",
-  "interaction_modal.title.favourite": "Favourite {name}'s post",
+  "interaction_modal.other_server_instructions": "Kopiearje en plak ienfâldich dizze URL yn it sykfjild fan de troch jo brûkte Mastodon-app of op de website fan de Mastodon-server wêrop jo oanmeld binne.",
+  "interaction_modal.preamble": "Mastodon is desintralisearre. Dêrom hawwe jo gjin account op dizze Mastodon-server nedich, wannear’t jo al in account op in oare Mastodon-server of kompatibel platfoarm hawwe.",
+  "interaction_modal.title.favourite": "Berjocht fan {name} as favoryt markearje",
   "interaction_modal.title.follow": "{name} folgje",
-  "interaction_modal.title.reblog": "Boost {name}'s post",
-  "interaction_modal.title.reply": "Reply to {name}'s post",
-  "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}}",
+  "interaction_modal.title.reblog": "Berjocht fan {name} booste",
+  "interaction_modal.title.reply": "Op it berjocht fan {name} reagearje",
+  "intervals.full.days": "{number, plural, one {# dei} other {# dagen}} lyn",
+  "intervals.full.hours": "{number, plural, one {# oere} other {# oeren}} lyn",
+  "intervals.full.minutes": "{number, plural, one {# minút} other {# minuten}} lyn",
   "keyboard_shortcuts.back": "to navigate back",
   "keyboard_shortcuts.blocked": "to open blocked users list",
   "keyboard_shortcuts.boost": "Berjocht booste",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
   "keyboard_shortcuts.description": "Omskriuwing",
-  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.direct": "Direkte berjochten toane",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "Berjocht iepenje",
   "keyboard_shortcuts.favourite": "As favoryt markearje",
@@ -333,38 +338,38 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "Nei boppe yn list ferpleatse",
   "lightbox.close": "Slute",
-  "lightbox.compress": "Compress image view box",
-  "lightbox.expand": "Expand image view box",
+  "lightbox.compress": "Ofbylding passend werjaan",
+  "lightbox.expand": "Ofbylding grut werjaan",
   "lightbox.next": "Folgjende",
   "lightbox.previous": "Foarige",
   "limited_account_hint.action": "Profyl dochs besjen",
-  "limited_account_hint.title": "This profile has been hidden by the moderators of {domain}.",
+  "limited_account_hint.title": "Dit profyl is troch de behearders fan {domain} ferstoppe.",
   "lists.account.add": "Oan list tafoegje",
   "lists.account.remove": "Ut list fuortsmite",
   "lists.delete": "List fuortsmite",
-  "lists.edit": "Edit list",
+  "lists.edit": "List bewurkje",
   "lists.edit.submit": "Titel wizigje",
-  "lists.new.create": "Add list",
+  "lists.new.create": "List tafoegje",
   "lists.new.title_placeholder": "Nije listtitel",
   "lists.replies_policy.followed": "Elke folge brûker",
   "lists.replies_policy.list": "Leden fan de list",
   "lists.replies_policy.none": "Net ien",
   "lists.replies_policy.title": "Reaksjes toane oan:",
-  "lists.search": "Search among people you follow",
-  "lists.subheading": "Dyn listen",
-  "load_pending": "{count, plural, one {# new item} other {# new items}}",
-  "loading_indicator.label": "Loading...",
-  "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}",
+  "lists.search": "Sykje nei minsken dy’t jo folgje",
+  "lists.subheading": "Jo listen",
+  "load_pending": "{count, plural, one {# nij item} other {# nije items}}",
+  "loading_indicator.label": "Lade…",
+  "media_gallery.toggle_visible": "{number, plural, one {ôfbylding ferstopje} other {ôfbyldingen ferstopje}}",
   "missing_indicator.label": "Net fûn",
-  "missing_indicator.sublabel": "This resource could not be found",
-  "moved_to_account_banner.text": "Your account {disabledAccount} is currently disabled because you moved to {movedToAccount}.",
-  "mute_modal.duration": "Duration",
+  "missing_indicator.sublabel": "Dizze boarne kin net fûn wurde",
+  "moved_to_account_banner.text": "Omdat jo nei {movedToAccount} ferhuze binne is jo account {disabledAccount} op dit stuit útskeakele.",
+  "mute_modal.duration": "Doer",
   "mute_modal.hide_notifications": "Meldingen fan dizze brûker ferstopje?",
-  "mute_modal.indefinite": "Indefinite",
-  "navigation_bar.about": "About",
+  "mute_modal.indefinite": "Foar ûnbepaalde tiid",
+  "navigation_bar.about": "Oer",
   "navigation_bar.blocks": "Blokkearre brûkers",
   "navigation_bar.bookmarks": "Blêdwizers",
-  "navigation_bar.community_timeline": "Local timeline",
+  "navigation_bar.community_timeline": "Lokale tiidline",
   "navigation_bar.compose": "Nij berjocht skriuwe",
   "navigation_bar.direct": "Direkte berjochten",
   "navigation_bar.discover": "Untdekke",
@@ -387,13 +392,13 @@
   "not_signed_in_indicator.not_signed_in": "Do moatst oanmelde om tagong ta dizze ynformaasje te krijen.",
   "notification.admin.report": "{name} hat {target} rapportearre",
   "notification.admin.sign_up": "{name} hat harren registrearre",
-  "notification.favourite": "{name} hat dyn berjocht as favoryt markearre",
+  "notification.favourite": "{name} hat jo berjocht as favoryt markearre",
   "notification.follow": "{name} folget dy",
   "notification.follow_request": "{name} hat dy in folchfersyk stjoerd",
   "notification.mention": "{name} hat dy fermeld",
   "notification.own_poll": "Dyn poll is beëinige",
-  "notification.poll": "In poll wêr’tsto yn stimd hast is beëinige",
-  "notification.reblog": "{name} hat dyn berjocht boost",
+  "notification.poll": "In enkête dêr’t jo yn stimd hawwe is beëinige",
+  "notification.reblog": "{name} hat jo berjocht boost",
   "notification.status": "{name} hat in berjocht pleatst",
   "notification.update": "{name} hat in berjocht bewurke",
   "notifications.clear": "Meldingen wiskje",
@@ -408,7 +413,7 @@
   "notifications.column_settings.follow": "Nije folgers:",
   "notifications.column_settings.follow_request": "Nij folchfersyk:",
   "notifications.column_settings.mention": "Fermeldingen:",
-  "notifications.column_settings.poll": "Pollresultaten:",
+  "notifications.column_settings.poll": "Enkêteresultaten:",
   "notifications.column_settings.push": "Pushmeldingen",
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Yn kolom toane",
@@ -423,26 +428,26 @@
   "notifications.filter.follows": "Folget",
   "notifications.filter.mentions": "Fermeldingen",
   "notifications.filter.polls": "Pollresultaten",
-  "notifications.filter.statuses": "Updates from people you follow",
-  "notifications.grant_permission": "Grant permission.",
-  "notifications.group": "{count} notifications",
-  "notifications.mark_as_read": "Mark every notification as read",
-  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
-  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
-  "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
-  "notifications_permission_banner.enable": "Enable desktop notifications",
-  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
-  "notifications_permission_banner.title": "Never miss a thing",
-  "picture_in_picture.restore": "Put it back",
+  "notifications.filter.statuses": "Fernijingen fan minsken dy’t jo folgje",
+  "notifications.grant_permission": "Tastimming jaan.",
+  "notifications.group": "{count} meldingen",
+  "notifications.mark_as_read": "Alle meldingen as lêzen markearje",
+  "notifications.permission_denied": "Desktopmeldingen binne net beskikber, omdat in eardere browsertastimming wegere waard",
+  "notifications.permission_denied_alert": "Desktopmeldingen kinne net ynskeakele wurde, omdat in eardere browsertastimming wegere waard",
+  "notifications.permission_required": "Desktopmeldingen binne net beskikber, omdat de nedige tastimming net ferliend is.",
+  "notifications_permission_banner.enable": "Desktopmeldingen ynskeakelje",
+  "notifications_permission_banner.how_to_control": "Om meldingen te ûntfangen wannear’t Mastodon net iepen stiet. Jo kinne krekt bepale hokker soarte fan ynteraksjes wol of gjin desktopmeldingen jouwe fia de boppesteande {icon} knop.",
+  "notifications_permission_banner.title": "Mis neat",
+  "picture_in_picture.restore": "Tebeksette",
   "poll.closed": "Sluten",
   "poll.refresh": "Ferfarskje",
   "poll.total_people": "{count, plural, one {# persoan} other {# persoanen}}",
   "poll.total_votes": "{count, plural, one {# stim} other {# stimmen}}",
   "poll.vote": "Stimme",
-  "poll.voted": "Do hast hjir op stimd",
+  "poll.voted": "Jo hawwe hjir op stimd",
   "poll.votes": "{votes, plural, one {# stim} other {# stimmen}}",
   "poll_button.add_poll": "Poll tafoegje",
-  "poll_button.remove_poll": "Poll fuortsmite",
+  "poll_button.remove_poll": "Enkête fuortsmite",
   "privacy.change": "Sichtberheid fan berjocht oanpasse",
   "privacy.direct.long": "Allinnich sichtber foar fermelde brûkers",
   "privacy.direct.short": "Allinnich fermelde minsken",
@@ -450,13 +455,13 @@
   "privacy.private.short": "Allinnich folgers",
   "privacy.public.long": "Sichtber foar elkenien",
   "privacy.public.short": "Iepenbier",
-  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
-  "privacy.unlisted.short": "Unlisted",
-  "privacy_policy.last_updated": "Last updated {date}",
-  "privacy_policy.title": "Privacy Policy",
-  "refresh": "Fernije",
+  "privacy.unlisted.long": "Foar elkenien sichtber, mar net ûnder trends, hashtags en op iepenbiere tiidlinen",
+  "privacy.unlisted.short": "Minder iepenbier",
+  "privacy_policy.last_updated": "Lêst bywurke op {date}",
+  "privacy_policy.title": "Privacybelied",
+  "refresh": "Ferfarskje",
   "regeneration_indicator.label": "Lade…",
-  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "regeneration_indicator.sublabel": "Jo starttiidline wurdt oanmakke!",
   "relative_time.days": "{number}d",
   "relative_time.full.days": "{number, plural, one {# dei} other {# dagen}} lyn",
   "relative_time.full.hours": "{number, plural, one {# oere} other {# oeren}} lyn",
@@ -470,7 +475,7 @@
   "relative_time.today": "hjoed",
   "reply_indicator.cancel": "Annulearje",
   "report.block": "Blokkearje",
-  "report.block_explanation": "Do silst harren berjochten net sjen kinne. Se sille dyn berjochten net sjen kinne en do net folgje kinne. Se sille wol sjen kinne dat se blokkearre binne.",
+  "report.block_explanation": "Jo sille harren berjochten net sjen kinne. Se sille jo berjochten net sjen kinne en jo net folgje kinne. Se sille wol sjen kinne dat se blokkearre binne.",
   "report.categories.other": "Oars",
   "report.categories.spam": "Spam",
   "report.categories.violation": "De ynhâld oertrêdet ien of mear serverrigels",
@@ -481,71 +486,72 @@
   "report.close": "Klear",
   "report.comment.title": "Tinksto dat wy noch mear witte moatte?",
   "report.forward": "Nei {target} trochstjoere",
-  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.forward_hint": "De account stiet op in oare server. Wolle jo dêr ek in anonimisearre kopy fan dizze rapportaazje nei ta stjoere?",
   "report.mute": "Negearje",
-  "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+  "report.mute_explanation": "Jo kinne harren berjochten net sjen. Jo kinne noch wol folge wurde en jo berjochten binne noch sichtber, mar dyjinge kin net sjen dat dy negearre wurdt.",
   "report.next": "Folgjende",
   "report.placeholder": "Type or paste additional comments",
   "report.reasons.dislike": "Ik fyn der neat oan",
   "report.reasons.dislike_description": "It is net eat watsto sjen wolst",
   "report.reasons.other": "It is wat oars",
   "report.reasons.other_description": "It probleem stiet der net tusken",
-  "report.reasons.spam": "It's spam",
-  "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
-  "report.reasons.violation": "It violates server rules",
-  "report.reasons.violation_description": "You are aware that it breaks specific rules",
-  "report.rules.subtitle": "Select all that apply",
-  "report.rules.title": "Which rules are being violated?",
-  "report.statuses.subtitle": "Select all that apply",
-  "report.statuses.title": "Are there any posts that back up this report?",
+  "report.reasons.spam": "It is spam",
+  "report.reasons.spam_description": "Skeadlike keppelingen, reklame, mislieding of werheljende antwurden",
+  "report.reasons.violation": "It skeint de serverregels",
+  "report.reasons.violation_description": "Jo witte dat it spesifike regels skeint",
+  "report.rules.subtitle": "Selektearje wat fan tapassing is",
+  "report.rules.title": "Hokker regels wurde skeind?",
+  "report.statuses.subtitle": "Selektearje wat fan tapassing is",
+  "report.statuses.title": "Binne der berjochten dy’t dizze rapportaazje stypje?",
   "report.submit": "Submit report",
   "report.target": "Report {target}",
-  "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
-  "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
-  "report.thanks.title": "Don't want to see this?",
-  "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
-  "report.unfollow": "Unfollow @{name}",
-  "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
-  "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached",
-  "report_notification.categories.other": "Other",
+  "report.thanks.take_action": "Hjir binne jo opsjes wêrmei’t jo bepale kinne wat jo yn Mastodon sjen wolle:",
+  "report.thanks.take_action_actionable": "Wylst wy jo rapportaazje beoardiele, kinne jo dizze maatregels tsjin @{name} nimme:",
+  "report.thanks.title": "Wolle jo dit net sjen?",
+  "report.thanks.title_actionable": "Tank foar it rapportearjen. Wy sille der nei sjen.",
+  "report.unfollow": "{name} ûntfolgje",
+  "report.unfollow_explanation": "Jo folgje dizze account. Om harren berjochten net mear op jo starttiidline te sjen, kinne jo dyjinge ûntfolgje.",
+  "report_notification.attached_statuses": "{count, plural, one {{count} berjocht} other {{count} berjochten}} tafoege",
+  "report_notification.categories.other": "Oars",
   "report_notification.categories.spam": "Spam",
-  "report_notification.categories.violation": "Rule violation",
-  "report_notification.open": "Open report",
-  "search.placeholder": "Search",
-  "search.search_or_paste": "Search or paste URL",
-  "search_popout.search_format": "Advanced search format",
+  "report_notification.categories.violation": "Skeinde regels",
+  "report_notification.open": "Rapport iepenje",
+  "search.placeholder": "Sykje",
+  "search.search_or_paste": "Sykje of fier URL yn",
+  "search_popout.search_format": "Avansearre sykje",
   "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
   "search_popout.tips.hashtag": "hashtag",
   "search_popout.tips.status": "status",
-  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
-  "search_popout.tips.user": "user",
-  "search_results.accounts": "People",
-  "search_results.all": "All",
+  "search_popout.tips.text": "Brûk gewoane tekst om te sykjen op werjeftenammen, brûkersnammen en hashtags",
+  "search_popout.tips.user": "brûker",
+  "search_results.accounts": "Minsken",
+  "search_results.all": "Alles",
   "search_results.hashtags": "Hashtags",
-  "search_results.nothing_found": "Could not find anything for these search terms",
+  "search_results.nothing_found": "Dizze syktermen leverje gjin resultaat op",
   "search_results.statuses": "Berjochten",
-  "search_results.statuses_fts_disabled": "Searching posts by their content is not enabled on this Mastodon server.",
+  "search_results.statuses_fts_disabled": "It sykjen yn berjochten is op dizze Mastodon-server net ynskeakele.",
   "search_results.title": "Nei {q} sykje",
-  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)",
+  "search_results.total": "{count, number} {count, plural, one {resultaat} other {resultaten}}",
+  "server_banner.about_active_users": "Oantal brûkers yn de ôfrûne 30 dagen (MAU)",
   "server_banner.active_users": "warbere brûkers",
   "server_banner.administered_by": "Beheard troch:",
-  "server_banner.introduction": "{domain} is part of the decentralized social network powered by {mastodon}.",
+  "server_banner.introduction": "{domain} is ûnderdiel fan it desintralisearre sosjale netwurk {mastodon}.",
   "server_banner.learn_more": "Mear ynfo",
   "server_banner.server_stats": "Serverstatistiken:",
   "sign_in_banner.create_account": "Account registrearje",
   "sign_in_banner.sign_in": "Oanmelde",
-  "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
-  "status.admin_account": "Open moderation interface for @{name}",
+  "sign_in_banner.text": "Wannear’t jo in account op dizze server hawwe, kinne jo oanmelde om minsken of hashtags te folgjen, op berjochten te reagearjen of om dizze te dielen. Wannear’t jo in account op in oare server hawwe, kinne jo dêr oanmelde en dêr ynteraksje mei minsken op dizze server hawwe.",
+  "status.admin_account": "Moderaasje-omjouwing fan @{name} iepenje",
+  "status.admin_domain": "Moderaasje-omjouwing fan {domain} iepenje",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "@{name} blokkearje",
   "status.bookmark": "Blêdwizer tafoegje",
   "status.cancel_reblog_private": "Net langer booste",
-  "status.cannot_reblog": "This post cannot be boosted",
+  "status.cannot_reblog": "Dit berjocht kin net boost wurde",
   "status.copy": "Copy link to status",
   "status.delete": "Fuortsmite",
   "status.detailed_status": "Detaillearre petearoersjoch",
-  "status.direct": "Direct message @{name}",
+  "status.direct": "@{name} in direkt berjocht stjoere",
   "status.edit": "Bewurkje",
   "status.edited": "Bewurke op {date}",
   "status.edited_x_times": "{count, plural, one {{count} kear} other {{count} kearen}} bewurke",
@@ -567,9 +573,9 @@
   "status.pinned": "Fêstset berjocht",
   "status.read_more": "Mear ynfo",
   "status.reblog": "Booste",
-  "status.reblog_private": "Boost with original visibility",
+  "status.reblog_private": "Boost nei oarspronklike ûntfangers",
   "status.reblogged_by": "{name} hat boost",
-  "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.",
+  "status.reblogs.empty": "Net ien hat dit berjocht noch boost. Wannear’t ien dit docht, falt dat hjir te sjen.",
   "status.redraft": "Fuortsmite en opnij opstelle",
   "status.remove_bookmark": "Blêdwizer fuortsmite",
   "status.replied_to": "Antwurde op {name}",
@@ -589,12 +595,12 @@
   "status.uncached_media_warning": "Net beskikber",
   "status.unmute_conversation": "Petear net mear negearje",
   "status.unpin": "Fan profylside losmeitsje",
-  "subscribed_languages.lead": "Only posts in selected languages will appear on your home and list timelines after the change. Select none to receive posts in all languages.",
-  "subscribed_languages.save": "Save changes",
-  "subscribed_languages.target": "Change subscribed languages for {target}",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
-  "tabs_bar.federated_timeline": "Federated",
+  "subscribed_languages.lead": "Nei de wiziging wurde allinnich berjochten fan selektearre talen op jo starttiidline en yn listen werjaan.",
+  "subscribed_languages.save": "Wizigingen bewarje",
+  "subscribed_languages.target": "Toande talen foar {target} wizigje",
+  "suggestions.dismiss": "Oanrekommandaasje ferwerpe",
+  "suggestions.header": "Jo binne wierskynlik ek ynteressearre yn…",
+  "tabs_bar.federated_timeline": "Globaal",
   "tabs_bar.home": "Startside",
   "tabs_bar.local_timeline": "Lokaal",
   "tabs_bar.notifications": "Meldingen",
@@ -609,37 +615,37 @@
   "timeline_hint.resources.statuses": "Aldere berjochten",
   "trends.counter_by_accounts": "{count, plural, one {{counter} persoan} other {{counter} persoanen}} {days, plural, one {de ôfrûne dei} other {de ôfrûne {days} dagen}}",
   "trends.trending_now": "Aktuele trends",
-  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
-  "units.short.billion": "{count}B",
-  "units.short.million": "{count}M",
-  "units.short.thousand": "{count}K",
-  "upload_area.title": "Drag & drop to upload",
-  "upload_button.label": "Add images, a video or an audio file",
-  "upload_error.limit": "File upload limit exceeded.",
-  "upload_error.poll": "File upload not allowed with polls.",
+  "ui.beforeunload": "Jo konsept giet ferlern wannear’t jo Mastodon ferlitte.",
+  "units.short.billion": "{count} mrd.",
+  "units.short.million": "{count} mln.",
+  "units.short.thousand": "{count}k",
+  "upload_area.title": "Hjir nei ta slepe om op te laden",
+  "upload_button.label": "Ofbyldingen, in fideo- of in lûdsbestân tafoegje",
+  "upload_error.limit": "Oer de oplaadlimyt fan bestân.",
+  "upload_error.poll": "It opladen fan bestannen is yn enkêten net tastien.",
   "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
-  "upload_form.description_missing": "No description added",
-  "upload_form.edit": "Edit",
-  "upload_form.thumbnail": "Change thumbnail",
-  "upload_form.undo": "Delete",
+  "upload_form.description_missing": "Gjin omskriuwing tafoege",
+  "upload_form.edit": "Bewurkje",
+  "upload_form.thumbnail": "Miniatuerôfbylding wizigje",
+  "upload_form.undo": "Fuortsmite",
   "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
-  "upload_modal.applying": "Applying…",
-  "upload_modal.choose_image": "Choose image",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preparing_ocr": "Preparing OCR…",
-  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_modal.analyzing_picture": "Ofbylding analysearje…",
+  "upload_modal.apply": "Tapasse",
+  "upload_modal.applying": "Oan it tapassen…",
+  "upload_modal.choose_image": "Kies in ôfbylding",
+  "upload_modal.description_placeholder": "Heit syn wize foks ljept tûk oar de loaie hûn",
+  "upload_modal.detect_text": "Tekst yn in ôfbylding detektearje",
+  "upload_modal.edit_media": "Media bewurkje",
+  "upload_modal.hint": "Klik of sleep de sirkel yn de foarfertoaning nei in sintraal fokuspunt dat op elke thumbnail sichtber bliuwe moat.",
+  "upload_modal.preparing_ocr": "OCR tariede…",
+  "upload_modal.preview_label": "Foarfertoaning ({ratio})",
   "upload_progress.label": "Uploading…",
-  "upload_progress.processing": "Processing…",
-  "video.close": "Close video",
-  "video.download": "Download file",
-  "video.exit_fullscreen": "Exit full screen",
-  "video.expand": "Expand video",
+  "upload_progress.processing": "Dwaande…",
+  "video.close": "Fideo slute",
+  "video.download": "Bestân downloade",
+  "video.exit_fullscreen": "Folslein skerm slute",
+  "video.expand": "Fideo grutter meitsje",
   "video.fullscreen": "Folslein skerm",
   "video.hide": "Fideo ferstopje",
   "video.mute": "Lûd dôvje",
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index eac6d9dbc..b5e2fbd8c 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Postálacha agus freagraí",
   "account.report": "Tuairiscigh @{name}",
   "account.requested": "Ag fanacht le ceadú. Cliceáil chun an iarratas leanúnaí a chealú",
+  "account.requested_follow": "D'iarr {name} ort do chuntas a leanúint",
   "account.share": "Roinn próifíl @{name}",
   "account.show_reblogs": "Taispeáin moltaí ó @{name}",
   "account.statuses_counter": "{count, plural, one {Postáil amháin} other {{counter} Postáil}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Cuardaigh teangacha...",
   "compose_form.direct_message_warning_learn_more": "Tuilleadh eolais",
   "compose_form.encryption_warning": "Ní criptiú taobh-go-taobh déanta ar theachtaireachtaí ar Mhastodon. Ná roinn eolas íogair ar Mhastodon.",
-  "compose_form.hashtag_warning": "Ní áireofar an teachtaireacht seo faoi haischlib ar bith mar go bhfuil sí neamhliostaithe. Ní féidir ach teachtaireachtaí poiblí a chuardach de réir haischlib.",
+  "compose_form.hashtag_warning": "Ní áireofar an teachtaireacht seo faoi haischlib ar bith mar níl sí ar fáil don phobal. Ní féidir ach teachtaireachtaí poiblí a chuardach de réir haischlib.",
   "compose_form.lock_disclaimer": "Níl an cuntas seo {locked}. Féadfaidh duine ar bith tú a leanúint agus na postálacha atá dírithe agat ar do lucht leanúna amháin a fheiceáil.",
   "compose_form.lock_disclaimer.lock": "faoi ghlas",
   "compose_form.placeholder": "Cad atá ag tarlú?",
@@ -211,7 +212,7 @@
   "empty_column.account_timeline": "Níl postálacha ar bith anseo!",
   "empty_column.account_unavailable": "Níl an phróifíl ar fáil",
   "empty_column.blocks": "Níl aon úsáideoir bactha agat fós.",
-  "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.",
+  "empty_column.bookmarked_statuses": "Níl aon phostáil leabharmharcaithe agat fós. Nuair a dhéanann tú leabharmharc, beidh sé le feiceáil anseo.",
   "empty_column.community": "Tá an amlíne áitiúil folamh. Foilsigh rud éigin go poiblí le tús a chur le cúrsaí!",
   "empty_column.direct": "Níl aon teachtaireacht dírithe agat fós. Nuair a sheolann tú nó nuair a fhaigheann tú ceann, feicfear anseo í.",
   "empty_column.domain_blocks": "Níl aon fearainn bhactha ann go fóill.",
@@ -219,23 +220,27 @@
   "empty_column.favourited_statuses": "Níor roghnaigh tú postáil ar bith fós. Nuair a roghnaigh tú ceann, beidh sí le feiceáil anseo.",
   "empty_column.favourites": "Níor thogh éinne an phostáil seo fós. Nuair a thoghfaidh duine éigin í, taispeánfar anseo é sin.",
   "empty_column.follow_recommendations": "Is cosúil nár fhéadfaí moltaí a ghineadh. D'fhéadfá cuardach a úsáid le teacht ar dhaoine a bhfuil aithne agat orthu, nó iniúchadh ar haischlibeanna atá ag treochtáil a dhéanamh.",
-  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.follow_requests": "Níl aon phostáil leabharmharcaithe agat fós. Nuair a dhéanann tú leabharmharc, feicfear anseo é.",
   "empty_column.hashtag": "Níl rud ar bith faoin haischlib seo go fóill.",
   "empty_column.home": "Tá d'amlíne baile folamh! B'fhiú duit cúpla duine eile a leanúint lena líonadh! {suggestions}",
   "empty_column.home.suggestions": "Féach ar roinnt moltaí",
   "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.lists": "Níl aon liostaí fós agat. Nuair a chruthaíonn tú ceann, feicfear anseo é.",
   "empty_column.mutes": "Níl aon úsáideoir balbhaithe agat fós.",
-  "empty_column.notifications": "You don't have any notifications yet. When other people interact with you, you will see it here.",
-  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
+  "empty_column.notifications": "Níl aon fógraí agat fós. Nuair a dhéanann daoine eile idirghníomhú leat, feicfear anseo é.",
+  "empty_column.public": "Faic anseo! Scríobh rud éigin go poiblí, nó lean úsáideoirí ar fhreastalaithe eile chun é a líonadh",
+  "error.unexpected_crash.explanation": "De bharr fabht inár gcód, nó fadhb le chomhoiriúnacht brabhsálaí, níorbh fhéadfadh an leathanach seo a léiriú i gceart.",
+  "error.unexpected_crash.explanation_addons": "Ní taispeántar an leathanach seo mar is ceart. Is dócha go gcruthaíonn breiseán brabhsálaí nó uirlisí uathaistriúcháin an fhadhb seo.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Tuairiscigh deacracht",
   "explore.search_results": "Torthaí cuardaigh",
+  "explore.suggested_follows": "Duitse",
   "explore.title": "Féach thart",
+  "explore.trending_links": "Nuacht",
+  "explore.trending_statuses": "Postálacha",
+  "explore.trending_tags": "Haischlibeanna",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -533,10 +538,11 @@
   "server_banner.introduction": "{domain} is part of the decentralized social network powered by {mastodon}.",
   "server_banner.learn_more": "Tuilleadh eolais",
   "server_banner.server_stats": "Server stats:",
-  "sign_in_banner.create_account": "Create account",
+  "sign_in_banner.create_account": "Cruthaigh cuntas",
   "sign_in_banner.sign_in": "Sinigh isteach",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Bac @{name}",
   "status.bookmark": "Leabharmharcanna",
@@ -551,7 +557,7 @@
   "status.edited_x_times": "Curtha in eagar {count, plural, one {{count} uair amháin} two {{count} uair} few {{count} uair} many {{count} uair} other {{count} uair}}",
   "status.embed": "Leabaigh",
   "status.favourite": "Rogha",
-  "status.filter": "Filter this post",
+  "status.filter": "Déan scagadh ar an bpostáil seo",
   "status.filtered": "Filtered",
   "status.hide": "Cuir postáil i bhfolach",
   "status.history.created": "{name} created {date}",
@@ -564,7 +570,7 @@
   "status.mute_conversation": "Balbhaigh comhrá",
   "status.open": "Expand this status",
   "status.pin": "Pionnáil ar do phróifíl",
-  "status.pinned": "Pinned post",
+  "status.pinned": "Postáil pionnáilte",
   "status.read_more": "Léan a thuilleadh",
   "status.reblog": "Mol",
   "status.reblog_private": "Mol le léargas bunúsach",
@@ -626,7 +632,7 @@
   "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
   "upload_modal.analyzing_picture": "Ag anailísiú íomhá…",
   "upload_modal.apply": "Cuir i bhFeidhm",
-  "upload_modal.applying": "Applying…",
+  "upload_modal.applying": "Á gcur i bhfeidhm…",
   "upload_modal.choose_image": "Roghnaigh íomhá",
   "upload_modal.description_placeholder": "Chuaigh bé mhórsách le dlúthspád fíorfhinn trí hata mo dhea-phorcáin bhig",
   "upload_modal.detect_text": "Detect text from picture",
diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json
index 8aa06ffe7..995bb585d 100644
--- a/app/javascript/mastodon/locales/gd.json
+++ b/app/javascript/mastodon/locales/gd.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Postaichean ’s freagairtean",
   "account.report": "Dèan gearan mu @{name}",
   "account.requested": "A’ feitheamh air aontachadh. Briog airson sgur dhen iarrtas leantainn",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Co-roinn a’ phròifil aig @{name}",
   "account.show_reblogs": "Seall na brosnachaidhean o @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} phost} two {{counter} phost} few {{counter} postaichean} other {{counter} post}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Lorg cànan…",
   "compose_form.direct_message_warning_learn_more": "Barrachd fiosrachaidh",
   "compose_form.encryption_warning": "Chan eil crioptachadh ceann gu ceann air postaichean Mhastodon. Na co-roinn fiosrachadh dìomhair idir le Mastodon.",
-  "compose_form.hashtag_warning": "Cha nochd am post seo fon taga hais on a tha e falaichte o liostaichean. Cha ghabh ach postaichean poblach a lorg a-rèir an tagaichean hais.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Chan eil an cunntas agad {locked}. ’S urrainn do dhuine sam bith ’gad leantainn is na postaichean agad a tha ag amas air an luchd-leantainn agad a-mhàin a shealltainn.",
   "compose_form.lock_disclaimer.lock": "glaiste",
   "compose_form.placeholder": "Dè tha air d’ aire?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Cuir lethbhreac dhen stacktrace air an stòr-bhòrd",
   "errors.unexpected_crash.report_issue": "Dèan aithris air an duilgheadas",
   "explore.search_results": "Toraidhean an luirg",
+  "explore.suggested_follows": "For you",
   "explore.title": "Rùraich",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "Chan eil an roinn-seòrsa criathraidh iom seo chaidh dhan cho-theacs san do dh’inntrig thu am post seo. Ma tha thu airson am post a chriathradh sa cho-theacs seo cuideachd, feumaidh tu a’ chriathrag a dheasachadh.",
   "filter_modal.added.context_mismatch_title": "Co-theacsa neo-iomchaidh!",
   "filter_modal.added.expired_explanation": "Dh’fhalbh an ùine air an roinn-seòrsa criathraidh seo agus feumaidh tu an ceann-là crìochnachaidh atharrachadh mus cuir thu an sàs i.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Clàraich a-steach",
   "sign_in_banner.text": "Clàraich a-steach a leantainn phròifilean no thagaichean hais, a’ cur postaichean ris na h-annsachdan ’s ’gan co-roinneadh is freagairt dhaibh no gabh gnìomh le cunntas o fhrithealaiche eile.",
   "status.admin_account": "Fosgail eadar-aghaidh na maorsainneachd dha @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Fosgail am post seo ann an eadar-aghaidh na maorsainneachd",
   "status.block": "Bac @{name}",
   "status.bookmark": "Cuir ris na comharran-lìn",
@@ -553,7 +559,7 @@
   "status.favourite": "Cuir ris na h-annsachdan",
   "status.filter": "Criathraich am post seo",
   "status.filtered": "Criathraichte",
-  "status.hide": "Falaich am post",
+  "status.hide": "Hide post",
   "status.history.created": "Chruthaich {name} {date} e",
   "status.history.edited": "Dheasaich {name} {date} e",
   "status.load_more": "Luchdaich barrachd dheth",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 2e1f4684f..d430a5a8d 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Publicacións e respostas",
   "account.report": "Informar sobre @{name}",
   "account.requested": "Agardando aprobación. Preme para desbotar a solicitude",
+  "account.requested_follow": "{name} solicitou seguirte",
   "account.share": "Compartir o perfil de @{name}",
   "account.show_reblogs": "Amosar compartidos de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Publicación} other {{counter} Publicacións}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Buscar idiomas...",
   "compose_form.direct_message_warning_learn_more": "Saber máis",
   "compose_form.encryption_warning": "As publicacións en Mastodon non están cifradas de extremo-a-extremo. Non compartas información sensible en Mastodon.",
-  "compose_form.hashtag_warning": "Esta publicación non aparecerá baixo ningún cancelo (hashtag) porque non está listada. Só se poden procurar publicacións públicas por cancelos.",
+  "compose_form.hashtag_warning": "Esta publicación non aparecerá incluída na lista dos cancelos xa que non é pública. Só se poden buscar cancelos nas publicacións públicas.",
   "compose_form.lock_disclaimer": "A túa conta non está {locked}. Todas poden seguirte para ollar os teus toots só para seguidoras.",
   "compose_form.lock_disclaimer.lock": "bloqueada",
   "compose_form.placeholder": "Que contas?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copiar trazas (stacktrace) ó portapapeis",
   "errors.unexpected_crash.report_issue": "Informar sobre un problema",
   "explore.search_results": "Resultados da busca",
+  "explore.suggested_follows": "Para ti",
   "explore.title": "Descubrir",
+  "explore.trending_links": "Novas",
+  "explore.trending_statuses": "Publicacións",
+  "explore.trending_tags": "Cancelos",
   "filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro non se aplica ao contexto no que accedeches a esta publicación. Se queres que a publicación se filtre nese contexto tamén, terás que editar o filtro.",
   "filter_modal.added.context_mismatch_title": "Non concorda o contexto!",
   "filter_modal.added.expired_explanation": "Esta categoría de filtro caducou, terás que cambiar a data de caducidade para que se aplique.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Acceder",
   "sign_in_banner.text": "Inicia sesión para seguir perfís ou etiquetas, marcar como favorita, responder a publicacións ou interactuar con outro servidor desde a túa conta.",
   "status.admin_account": "Abrir interface de moderación para @{name}",
+  "status.admin_domain": "Abrir interface de moderación para {domain}",
   "status.admin_status": "Abrir esta publicación na interface de moderación",
   "status.block": "Bloquear a @{name}",
   "status.bookmark": "Marcar",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index 3307e3ed7..eb558a863 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -35,14 +35,14 @@
   "account.followers_counter": "{count, plural,one {עוקב אחד} other {{counter} עוקבים}}",
   "account.following": "נעקבים",
   "account.following_counter": "{count, plural,one {עוקב אחרי {counter}}other {עוקב אחרי {counter}}}",
-  "account.follows.empty": "משתמש זה לא עוקב אחר אף אחד עדיין.",
+  "account.follows.empty": "משתמש זה עדיין לא עוקב אחרי אף אחד.",
   "account.follows_you": "במעקב אחריך",
   "account.go_to_profile": "מעבר לפרופיל",
   "account.hide_reblogs": "להסתיר הידהודים מאת @{name}",
   "account.joined_short": "תאריך הצטרפות",
   "account.languages": "שנה שפת הרשמה",
   "account.link_verified_on": "בעלות על הקישור הזה נבדקה לאחרונה ב{date}",
-  "account.locked_info": "מצב הפרטיות של החשבון הנוכחי הוגדר כנעול. בעל החשבון קובע באופן פרטני מי יכול לעקוב אחריו.",
+  "account.locked_info": "החשבון הזה הוגדר כנעול. צריך לקבל אישור כדי לעקוב אחריו.",
   "account.media": "מדיה",
   "account.mention": "אזכור של @{name}",
   "account.moved_to": "{name} ציינו שהחשבון החדש שלהם הוא:",
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "הודעות ותגובות",
   "account.report": "דווח על @{name}",
   "account.requested": "בהמתנה לאישור. לחצי כדי לבטל בקשת מעקב",
+  "account.requested_follow": "{name} ביקשו לעקוב אחריך",
   "account.share": "שתף את הפרופיל של @{name}",
   "account.show_reblogs": "הצג הדהודים מאת @{name}",
   "account.statuses_counter": "{count, plural, one {הודעה} two {הודעותיים} many {{count} הודעות} other {{count} הודעות}}",
@@ -119,7 +120,7 @@
   "column_header.pin": "הצמדה",
   "column_header.show_settings": "הצגת העדפות",
   "column_header.unpin": "שחרור הצמדה",
-  "column_subheading.settings": "אפשרויות",
+  "column_subheading.settings": "הגדרות",
   "community.column_settings.local_only": "מקומי בלבד",
   "community.column_settings.media_only": "מדיה בלבד",
   "community.column_settings.remote_only": "מרוחק בלבד",
@@ -127,7 +128,7 @@
   "compose.language.search": "חיפוש שפות...",
   "compose_form.direct_message_warning_learn_more": "מידע נוסף",
   "compose_form.encryption_warning": "הודעות במסטודון לא מוצפנות מקצה לקצה. אל תשתפו מידע רגיש במסטודון.",
-  "compose_form.hashtag_warning": "הודעה זו לא תרשם תחת תגיות הקבצה (האשטאגים) היות והנראות שלה היא 'לא רשום'. רק הודעות ציבוריות יכולות להימצא באמצעות תגיות הקבצה.",
+  "compose_form.hashtag_warning": "הודעה זו לא תרשם תחת תגיות הקבצה היות והנראות שלה איננה 'ציבורית'. רק הודעות ציבוריות ימצאו בחיפוש תגיות הקבצה.",
   "compose_form.lock_disclaimer": "חשבונך אינו {locked}. כל אחד יוכל לעקוב אחריך כדי לקרוא את הודעותיך המיועדות לעוקבים בלבד.",
   "compose_form.lock_disclaimer.lock": "נעול",
   "compose_form.placeholder": "על מה את/ה חושב/ת ?",
@@ -161,7 +162,7 @@
   "confirmations.discard_edit_media.message": "יש לך שינויים לא שמורים לתיאור המדיה. להשליך אותם בכל זאת?",
   "confirmations.domain_block.confirm": "חסמו לגמרי את שם המתחם (דומיין)",
   "confirmations.domain_block.message": "בטוחה שברצונך באמת לחסום את קהילת {domain}? ברב המקרים השתקה וחסימה של מספר משתמשים עשוייה להספיק. לא תראי תוכל מכלל שם המתחם בפידים הציבוריים או בהתראות שלך. העוקבים שלך מהקהילה הזאת יוסרו",
-  "confirmations.logout.confirm": "להתנתק",
+  "confirmations.logout.confirm": "התנתקות",
   "confirmations.logout.message": "האם אתם בטוחים שאתם רוצים להתנתק?",
   "confirmations.mute.confirm": "להשתיק",
   "confirmations.mute.explanation": "זה יסתיר הודעות שלהם והודעות שמאזכרות אותם, אבל עדיין יתיר להם לראות הודעות שלך ולעקוב אחריך.",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "להעתיק את הקוד ללוח הכתיבה",
   "errors.unexpected_crash.report_issue": "דווח על בעיה",
   "explore.search_results": "תוצאות חיפוש",
+  "explore.suggested_follows": "עבורך",
   "explore.title": "סיור",
+  "explore.trending_links": "חדשות",
+  "explore.trending_statuses": "הודעות",
+  "explore.trending_tags": "תגיות",
   "filter_modal.added.context_mismatch_explanation": "קטגוריית הסנן הזאת לא חלה על ההקשר שממנו הגעת אל ההודעה הזו. אם תרצה/י שההודעה תסונן גם בהקשר זה, תצטרך/י לערוך את הסנן.",
   "filter_modal.added.context_mismatch_title": "אין התאמה להקשר!",
   "filter_modal.added.expired_explanation": "פג תוקפה של קטגוריית הסינון הזו, יש צורך לשנות את תאריך התפוגה כדי שהסינון יוחל.",
@@ -273,7 +278,7 @@
   "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.any": "לפחות אחד מאלה",
   "hashtag.column_settings.tag_mode.none": "אף אחד מאלה",
   "hashtag.column_settings.tag_toggle": "כלול תגיות נוספות בטור זה",
   "hashtag.follow": "מעקב אחר תגית",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "התחברות",
   "sign_in_banner.text": "יש להתחבר כדי לעקוב אחרי משתמשים או תגיות, לחבב, לשתף ולענות לחצרוצים, או לנהל תקשורת מהחשבון שלך על שרת אחר.",
   "status.admin_account": "פתח/י ממשק ניהול עבור @{name}",
+  "status.admin_domain": "פתיחת ממשק ניהול עבור {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "חסימת @{name}",
   "status.bookmark": "סימניה",
@@ -553,7 +559,7 @@
   "status.favourite": "חיבוב",
   "status.filter": "סנן הודעה זו",
   "status.filtered": "סונן",
-  "status.hide": "הסתר חצרוץ",
+  "status.hide": "הסתר הודעה",
   "status.history.created": "{name} יצר/ה {date}",
   "status.history.edited": "{name} ערך/ה {date}",
   "status.load_more": "עוד",
@@ -572,7 +578,7 @@
   "status.reblogs.empty": "עוד לא הידהדו את ההודעה הזו. כאשר זה יקרה, ההדהודים יופיעו כאן.",
   "status.redraft": "מחיקה ועריכה מחדש",
   "status.remove_bookmark": "הסרת סימניה",
-  "status.replied_to": "הגב לחשבון {name}",
+  "status.replied_to": "בתגובה לחשבון {name}",
   "status.reply": "תגובה",
   "status.replyAll": "תגובה לשרשור",
   "status.report": "דיווח על @{name}",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index c8e23e399..70edbbe5e 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "टूट्स एवं जवाब",
   "account.report": "रिपोर्ट @{name}",
   "account.requested": "मंजूरी का इंतजार। फॉलो रिक्वेस्ट को रद्द करने के लिए क्लिक करें",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "@{name} की प्रोफाइल शेयर करे",
   "account.show_reblogs": "@{name} के बूस्ट दिखाए",
   "account.statuses_counter": "{count, plural, one {{counter} भोंपू} other {{counter} भोंपू}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "भाषाएँ खोजें...",
   "compose_form.direct_message_warning_learn_more": "और जानें",
   "compose_form.encryption_warning": "मास्टोडॉन पर पोस्ट एन्ड-टू-एन्ड एन्क्रिप्टेड नहीं है। कोई भी व्यक्तिगत जानकारी मास्टोडॉन पर मत भेजें।",
-  "compose_form.hashtag_warning": "यह टूट् किसी भी हैशटैग के तहत सूचीबद्ध नहीं होगा क्योंकि यह अनलिस्टेड है। हैशटैग द्वारा केवल सार्वजनिक टूट्स खोजे जा सकते हैं।",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "आपका खाता {locked} नहीं है। आपको केवल फॉलोवर्स को दिखाई दिए जाने वाले पोस्ट देखने के लिए कोई भी फॉलो कर सकता है।",
   "compose_form.lock_disclaimer.lock": "लॉक्ड",
   "compose_form.placeholder": "What is on your mind?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "स्टैकट्रेस को क्लिपबोर्ड पर कॉपी करें",
   "errors.unexpected_crash.report_issue": "समस्या सूचित करें",
   "explore.search_results": "सर्च रिजल्ट्स",
+  "explore.suggested_follows": "For you",
   "explore.title": "एक्स्प्लोर",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "यह फ़िल्टर श्रेणी उस संदर्भ पर लागू नहीं होती जिसमें आपने इस पोस्ट को एक्सेस किया है। यदि आप चाहते हैं कि इस संदर्भ में भी पोस्ट को फ़िल्टर किया जाए, तो आपको फ़िल्टर को एडिट करना होगा।",
   "filter_modal.added.context_mismatch_title": "कंटेंट मिसमैच!",
   "filter_modal.added.expired_explanation": "यह फ़िल्टर श्रेणी समाप्त हो गई है, इसे लागू करने के लिए आपको समाप्ति तिथि बदलनी होगी।",
@@ -295,8 +300,8 @@
   "interaction_modal.title.follow": "फॉलो {name}",
   "interaction_modal.title.reblog": "बूस्ट {name} की पोस्ट",
   "interaction_modal.title.reply": "{name} की पोस्ट पे रिप्लाई करें",
-  "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}}",
   "keyboard_shortcuts.back": "वापस जाने के लिए",
   "keyboard_shortcuts.blocked": "अवरुद्ध उपयोगकर्ताओं की सूची खोलने के लिए",
@@ -349,7 +354,7 @@
   "lists.replies_policy.followed": "अन्य फोल्लोवेद यूजर",
   "lists.replies_policy.list": "सूची के सदस्य",
   "lists.replies_policy.none": "कोई नहीं",
-  "lists.replies_policy.title": "Show replies to:",
+  "lists.replies_policy.title": "इसके जवाब दिखाएं:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "आपकी सूचियाँ",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -358,21 +363,21 @@
   "missing_indicator.label": "नहीं मिला",
   "missing_indicator.sublabel": "यह संसाधन नहीं मिल सका।",
   "moved_to_account_banner.text": "Your account {disabledAccount} is currently disabled because you moved to {movedToAccount}.",
-  "mute_modal.duration": "Duration",
+  "mute_modal.duration": "अवधि",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "mute_modal.indefinite": "Indefinite",
-  "navigation_bar.about": "About",
+  "navigation_bar.about": "विवरण",
   "navigation_bar.blocks": "ब्लॉक्ड यूज़र्स",
   "navigation_bar.bookmarks": "पुस्तकचिह्न:",
   "navigation_bar.community_timeline": "लोकल टाइम्लाइन",
   "navigation_bar.compose": "नया टूट् लिखें",
-  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.direct": "प्रत्यक्ष संदेश",
   "navigation_bar.discover": "खोजें",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "प्रोफ़ाइल संपादित करें",
-  "navigation_bar.explore": "Explore",
-  "navigation_bar.favourites": "Favourites",
-  "navigation_bar.filters": "Muted words",
+  "navigation_bar.explore": "अन्वेषण करें",
+  "navigation_bar.favourites": "पसंदीदा",
+  "navigation_bar.filters": "वारित शब्द",
   "navigation_bar.follow_requests": "अनुसरण करने के अनुरोध",
   "navigation_bar.follows_and_followers": "Follows and followers",
   "navigation_bar.lists": "सूचियाँ",
@@ -398,7 +403,7 @@
   "notification.update": "{name} edited a post",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
-  "notifications.column_settings.admin.report": "New reports:",
+  "notifications.column_settings.admin.report": "नई रिपोर्ट:",
   "notifications.column_settings.admin.sign_up": "New sign-ups:",
   "notifications.column_settings.alert": "Desktop notifications",
   "notifications.column_settings.favourite": "Favourites:",
@@ -416,7 +421,7 @@
   "notifications.column_settings.status": "New toots:",
   "notifications.column_settings.unread_notifications.category": "Unread notifications",
   "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
-  "notifications.column_settings.update": "Edits:",
+  "notifications.column_settings.update": "संपादन:",
   "notifications.filter.all": "सभी",
   "notifications.filter.boosts": "बूस्ट",
   "notifications.filter.favourites": "पसंदीदा",
@@ -448,7 +453,7 @@
   "privacy.direct.short": "Direct",
   "privacy.private.long": "Post to followers only",
   "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Visible for all",
+  "privacy.public.long": "सब को दिखाई देगा",
   "privacy.public.short": "सार्वजनिक",
   "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
   "privacy.unlisted.short": "अनलिस्टेड",
@@ -471,15 +476,15 @@
   "reply_indicator.cancel": "रद्द करें",
   "report.block": "Block",
   "report.block_explanation": "आपको उनकी पोस्टें नहीं दिखेंगे। वे आपकी पोस्टें को देख नहीं पाएंगे और आपको फ़ॉलो नहीं कर पाएंगे। उन्हे पता लगेगा कि वे blocked हैं।",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
+  "report.categories.other": "अन्य",
+  "report.categories.spam": "अवांछित",
   "report.categories.violation": "Content violates one or more server rules",
   "report.category.subtitle": "Choose the best match",
   "report.category.title": "Tell us what's going on with this {type}",
-  "report.category.title_account": "profile",
+  "report.category.title_account": "रूपरेखा",
   "report.category.title_status": "post",
-  "report.close": "Done",
-  "report.comment.title": "Is there anything else you think we should know?",
+  "report.close": "स्वीकार करें",
+  "report.comment.title": "क्या और कुछ है जिसके बारे में आपको लगता है कि हमें सूचित होना चाहिए?",
   "report.forward": "Forward to {target}",
   "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
   "report.mute": "Mute",
@@ -515,7 +520,7 @@
   "search.search_or_paste": "Search or paste URL",
   "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.hashtag": "हैशटैग",
   "search_popout.tips.status": "status",
   "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
   "search_popout.tips.user": "user",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index 8216e6303..5d38728b1 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -1,6 +1,6 @@
 {
   "about.blocks": "Moderated servers",
-  "about.contact": "Contact:",
+  "about.contact": "Kontakt:",
   "about.disclaimer": "Mastodon is free, open-source software, and a trademark of Mastodon gGmbH.",
   "about.domain_blocks.no_reason_available": "Reason not available",
   "about.domain_blocks.preamble": "Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server.",
@@ -50,16 +50,17 @@
   "account.mute_notifications": "Utišaj obavijesti od @{name}",
   "account.muted": "Utišano",
   "account.open_original_page": "Open original page",
-  "account.posts": "Tootovi",
-  "account.posts_with_replies": "Tootovi i odgovori",
+  "account.posts": "Objave",
+  "account.posts_with_replies": "Objave i odgovori",
   "account.report": "Prijavi @{name}",
-  "account.requested": "Čekanje na potvrdu. Kliknite za otkazivanje zahtjeva za praćenje",
+  "account.requested": "Čekanje na potvrdu. Kliknite za poništavanje zahtjeva za praćenje",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Podijeli profil @{name}",
   "account.show_reblogs": "Prikaži boostove od @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} toot} other {{counter} toota}}",
   "account.unblock": "Deblokiraj @{name}",
   "account.unblock_domain": "Deblokiraj domenu {domain}",
-  "account.unblock_short": "Unblock",
+  "account.unblock_short": "Deblokiraj",
   "account.unendorse": "Ne ističi na profilu",
   "account.unfollow": "Prestani pratiti",
   "account.unmute": "Poništi utišavanje @{name}",
@@ -82,9 +83,9 @@
   "boost_modal.combo": "Možete pritisnuti {combo} kako biste preskočili ovo sljedeći put",
   "bundle_column_error.copy_stacktrace": "Copy error report",
   "bundle_column_error.error.body": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.",
-  "bundle_column_error.error.title": "Oh, no!",
+  "bundle_column_error.error.title": "Oh, ne!",
   "bundle_column_error.network.body": "There was an error when trying to load this page. This could be due to a temporary problem with your internet connection or this server.",
-  "bundle_column_error.network.title": "Network error",
+  "bundle_column_error.network.title": "Greška mreže",
   "bundle_column_error.retry": "Pokušajte ponovno",
   "bundle_column_error.return": "Go back home",
   "bundle_column_error.routing.body": "The requested page could not be found. Are you sure the URL in the address bar is correct?",
@@ -123,11 +124,11 @@
   "community.column_settings.local_only": "Samo lokalno",
   "community.column_settings.media_only": "Samo medijski sadržaj",
   "community.column_settings.remote_only": "Samo udaljeno",
-  "compose.language.change": "Change language",
-  "compose.language.search": "Search languages...",
+  "compose.language.change": "Promijeni jezik",
+  "compose.language.search": "Pretraži jezike...",
   "compose_form.direct_message_warning_learn_more": "Saznajte više",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "Ovaj toot neće biti prikazan ni pod jednim hashtagom jer je postavljen kao neprikazan. Samo javni tootovi mogu biti pretraživani pomoći hashtagova.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Vaš račun nije {locked}. Svatko Vas može pratiti kako bi vidjeli objave namijenjene Vašim pratiteljima.",
   "compose_form.lock_disclaimer.lock": "zaključan",
   "compose_form.placeholder": "Što ti je na umu?",
@@ -137,10 +138,10 @@
   "compose_form.poll.remove_option": "Ukloni ovu opciju",
   "compose_form.poll.switch_to_multiple": "Omogući višestruki odabir opcija ankete",
   "compose_form.poll.switch_to_single": "Omogući odabir samo jedne opcije ankete",
-  "compose_form.publish": "Publish",
-  "compose_form.publish_form": "Publish",
+  "compose_form.publish": "Objavi",
+  "compose_form.publish_form": "Objavi",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Spremi promjene",
   "compose_form.sensitive.hide": "Označi medijski sadržaj kao osjetljiv",
   "compose_form.sensitive.marked": "Medijski sadržaj označen je kao osjetljiv",
   "compose_form.sensitive.unmarked": "Medijski sadržaj nije označen kao osjetljiv",
@@ -151,7 +152,7 @@
   "confirmations.block.block_and_report": "Blokiraj i prijavi",
   "confirmations.block.confirm": "Blokiraj",
   "confirmations.block.message": "Sigurno želite blokirati {name}?",
-  "confirmations.cancel_follow_request.confirm": "Withdraw request",
+  "confirmations.cancel_follow_request.confirm": "Povuci zahtjev",
   "confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?",
   "confirmations.delete.confirm": "Obriši",
   "confirmations.delete.message": "Stvarno želite obrisati ovaj toot?",
@@ -234,24 +235,28 @@
   "error.unexpected_crash.next_steps_addons": "Pokušaj ih onemogućiti i osvježiti stranicu. Ako to ne pomogne, i dalje ćeš biti u mogućnosti koristiti Mastodon preko nekog drugog preglednika ili izvornog app-a.",
   "errors.unexpected_crash.copy_stacktrace": "Kopiraj stacktrace u međuspremnik",
   "errors.unexpected_crash.report_issue": "Prijavi problem",
-  "explore.search_results": "Search results",
+  "explore.search_results": "Rezultati pretrage",
+  "explore.suggested_follows": "Za vas",
   "explore.title": "Explore",
+  "explore.trending_links": "Novosti",
+  "explore.trending_statuses": "Objave",
+  "explore.trending_tags": "Hashtagovi",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
   "filter_modal.added.expired_title": "Expired filter!",
   "filter_modal.added.review_and_configure": "To review and further configure this filter category, go to the {settings_link}.",
-  "filter_modal.added.review_and_configure_title": "Filter settings",
+  "filter_modal.added.review_and_configure_title": "Postavke filtara",
   "filter_modal.added.settings_link": "settings page",
   "filter_modal.added.short_explanation": "This post has been added to the following filter category: {title}.",
-  "filter_modal.added.title": "Filter added!",
+  "filter_modal.added.title": "Filtar dodan!",
   "filter_modal.select_filter.context_mismatch": "does not apply to this context",
   "filter_modal.select_filter.expired": "expired",
-  "filter_modal.select_filter.prompt_new": "New category: {name}",
-  "filter_modal.select_filter.search": "Search or create",
-  "filter_modal.select_filter.subtitle": "Use an existing category or create a new one",
-  "filter_modal.select_filter.title": "Filter this post",
-  "filter_modal.title.status": "Filter a post",
+  "filter_modal.select_filter.prompt_new": "Nova kategorija: {name}",
+  "filter_modal.select_filter.search": "Pretraži ili stvori",
+  "filter_modal.select_filter.subtitle": "Odaberite postojeću kategoriju ili stvorite novu",
+  "filter_modal.select_filter.title": "Filtriraj ovu objavu",
+  "filter_modal.title.status": "Filtriraj objavu",
   "follow_recommendations.done": "Učinjeno",
   "follow_recommendations.heading": "Zaprati osobe čije objave želiš vidjeti! Evo nekoliko prijedloga.",
   "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
@@ -260,11 +265,11 @@
   "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
   "footer.about": "About",
   "footer.directory": "Profiles directory",
-  "footer.get_app": "Get the app",
+  "footer.get_app": "Preuzmi aplikaciju",
   "footer.invite": "Invite people",
-  "footer.keyboard_shortcuts": "Keyboard shortcuts",
-  "footer.privacy_policy": "Privacy policy",
-  "footer.source_code": "View source code",
+  "footer.keyboard_shortcuts": "Tipkovni prečaci",
+  "footer.privacy_policy": "Pravila o zaštiti privatnosti",
+  "footer.source_code": "Prikaz izvornog koda",
   "generic.saved": "Spremljeno",
   "getting_started.heading": "Počnimo",
   "hashtag.column_header.tag_mode.all": "i {additional}",
@@ -276,8 +281,8 @@
   "hashtag.column_settings.tag_mode.any": "Bilo koji navedeni",
   "hashtag.column_settings.tag_mode.none": "Nijedan navedeni",
   "hashtag.column_settings.tag_toggle": "Uključi dodatne oznake za ovaj stupac",
-  "hashtag.follow": "Follow hashtag",
-  "hashtag.unfollow": "Unfollow hashtag",
+  "hashtag.follow": "Prati hashtag",
+  "hashtag.unfollow": "Prestani pratiti hashtag",
   "home.column_settings.basic": "Osnovno",
   "home.column_settings.show_reblogs": "Pokaži boostove",
   "home.column_settings.show_replies": "Pokaži odgovore",
@@ -448,19 +453,19 @@
   "privacy.direct.short": "Direct",
   "privacy.private.long": "Vidljivo samo pratiteljima",
   "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Visible for all",
+  "privacy.public.long": "Vidljivo svima",
   "privacy.public.short": "Javno",
   "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
   "privacy.unlisted.short": "Neprikazano",
-  "privacy_policy.last_updated": "Last updated {date}",
-  "privacy_policy.title": "Privacy Policy",
+  "privacy_policy.last_updated": "Zadnje ažurirannje {date}",
+  "privacy_policy.title": "Pravila o zaštiti privatnosti",
   "refresh": "Osvježi",
   "regeneration_indicator.label": "Učitavanje…",
   "regeneration_indicator.sublabel": "Priprema se Vaša početna stranica!",
   "relative_time.days": "{number}d",
   "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
   "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
+  "relative_time.full.just_now": "upravo sad",
   "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
   "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
   "relative_time.hours": "{number}h",
@@ -469,29 +474,29 @@
   "relative_time.seconds": "{number}s",
   "relative_time.today": "danas",
   "reply_indicator.cancel": "Otkaži",
-  "report.block": "Block",
-  "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
-  "report.categories.other": "Other",
+  "report.block": "Blokiraj",
+  "report.block_explanation": "Nećete vidjeti njihove objave. Oni neće vidjeti vaše objave i neće vas moći pratiti. Moći će vidjeti da su blokirani.",
+  "report.categories.other": "Drugo",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "Sadržaj krši jedno ili više pravila poslužitelja",
   "report.category.subtitle": "Choose the best match",
-  "report.category.title": "Tell us what's going on with this {type}",
-  "report.category.title_account": "profile",
-  "report.category.title_status": "post",
-  "report.close": "Done",
-  "report.comment.title": "Is there anything else you think we should know?",
+  "report.category.title": "Recite nam što nije u redu s {type}",
+  "report.category.title_account": "profilom",
+  "report.category.title_status": "objavom",
+  "report.close": "Gotovo",
+  "report.comment.title": "Postoji li još nešto što bismo trebali znati?",
   "report.forward": "Proslijedi {target}",
   "report.forward_hint": "Račun je s drugog poslužitelja. Poslati anonimiziranu kopiju prijave i tamo?",
-  "report.mute": "Mute",
-  "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
-  "report.next": "Next",
+  "report.mute": "Utišaj",
+  "report.mute_explanation": "Nećete vidjeti njihove objave. Oni će vas i dalje moći pratiti i vidjeti vaše objave i neće znati da su utišani.",
+  "report.next": "Sljedeće",
   "report.placeholder": "Dodatni komentari",
-  "report.reasons.dislike": "I don't like it",
-  "report.reasons.dislike_description": "It is not something you want to see",
-  "report.reasons.other": "It's something else",
-  "report.reasons.other_description": "The issue does not fit into other categories",
-  "report.reasons.spam": "It's spam",
-  "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+  "report.reasons.dislike": "Ne sviđa mi se",
+  "report.reasons.dislike_description": "Nije nešto što želiš vidjeti",
+  "report.reasons.other": "Nešto drugo",
+  "report.reasons.other_description": "Problem ne spada u nijednu drugu kategoriju",
+  "report.reasons.spam": "Spam je",
+  "report.reasons.spam_description": "Zlonamjerne poveznice, lažni angažman ili repetitivni odgovori",
   "report.reasons.violation": "It violates server rules",
   "report.reasons.violation_description": "You are aware that it breaks specific rules",
   "report.rules.subtitle": "Select all that apply",
@@ -528,42 +533,43 @@
   "search_results.title": "Search for {q}",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)",
-  "server_banner.active_users": "active users",
+  "server_banner.active_users": "aktivni korisnici",
   "server_banner.administered_by": "Administered by:",
   "server_banner.introduction": "{domain} is part of the decentralized social network powered by {mastodon}.",
-  "server_banner.learn_more": "Learn more",
+  "server_banner.learn_more": "Saznaj više",
   "server_banner.server_stats": "Server stats:",
-  "sign_in_banner.create_account": "Create account",
-  "sign_in_banner.sign_in": "Sign in",
+  "sign_in_banner.create_account": "Stvori račun",
+  "sign_in_banner.sign_in": "Prijavi se",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
-  "status.bookmark": "Bookmark",
+  "status.bookmark": "Dodaj u favorite",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Ova objava ne može biti boostana",
   "status.copy": "Copy link to status",
   "status.delete": "Obriši",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
+  "status.edit": "Uredi",
+  "status.edited": "Uređeno {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
-  "status.embed": "Embed",
+  "status.embed": "Umetni",
   "status.favourite": "Označi favoritom",
-  "status.filter": "Filter this post",
-  "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.filter": "Filtriraj ovu objavu",
+  "status.filtered": "Filtrirano",
+  "status.hide": "Sakrij objavu",
+  "status.history.created": "Kreirao/la {name} prije {date}",
+  "status.history.edited": "Uredio/la {name} prije {date}",
   "status.load_more": "Učitaj više",
   "status.media_hidden": "Sakriven medijski sadržaj",
   "status.mention": "Spomeni @{name}",
-  "status.more": "More",
-  "status.mute": "Mute @{name}",
+  "status.more": "Više",
+  "status.mute": "Utišaj @{name}",
   "status.mute_conversation": "Utišaj razgovor",
   "status.open": "Proširi ovaj toot",
-  "status.pin": "Pin on profile",
+  "status.pin": "Prikvači na profil",
   "status.pinned": "Pinned toot",
   "status.read_more": "Pročitajte više",
   "status.reblog": "Boostaj",
@@ -572,25 +578,25 @@
   "status.reblogs.empty": "Nitko još nije boostao ovaj toot. Kada netko to učini, ovdje će biti prikazani.",
   "status.redraft": "Izbriši i ponovno uredi",
   "status.remove_bookmark": "Ukloni knjižnu oznaku",
-  "status.replied_to": "Replied to {name}",
+  "status.replied_to": "Odgovorio/la je {name}",
   "status.reply": "Odgovori",
   "status.replyAll": "Odgovori na niz",
   "status.report": "Prijavi @{name}",
   "status.sensitive_warning": "Osjetljiv sadržaj",
   "status.share": "Podijeli",
-  "status.show_filter_reason": "Show anyway",
+  "status.show_filter_reason": "Svejedno prikaži",
   "status.show_less": "Pokaži manje",
   "status.show_less_all": "Show less for all",
   "status.show_more": "Pokaži više",
   "status.show_more_all": "Show more for all",
-  "status.show_original": "Show original",
-  "status.translate": "Translate",
-  "status.translated_from_with": "Translated from {lang} using {provider}",
+  "status.show_original": "Prikaži original",
+  "status.translate": "Prevedi",
+  "status.translated_from_with": "Prevedno s {lang} koristeći {provider}",
   "status.uncached_media_warning": "Nije dostupno",
   "status.unmute_conversation": "Poništi utišavanje razgovora",
   "status.unpin": "Otkvači s profila",
   "subscribed_languages.lead": "Only posts in selected languages will appear on your home and list timelines after the change. Select none to receive posts in all languages.",
-  "subscribed_languages.save": "Save changes",
+  "subscribed_languages.save": "Spremi promjene",
   "subscribed_languages.target": "Change subscribed languages for {target}",
   "suggestions.dismiss": "Odbaci prijedlog",
   "suggestions.header": "Možda Vas zanima…",
@@ -619,23 +625,23 @@
   "upload_error.poll": "Prijenos datoteka nije dopušten kod anketa.",
   "upload_form.audio_description": "Opišite za ljude sa slabim sluhom",
   "upload_form.description": "Opišite za ljude sa slabim vidom",
-  "upload_form.description_missing": "No description added",
+  "upload_form.description_missing": "Bez opisa",
   "upload_form.edit": "Uredi",
   "upload_form.thumbnail": "Promijeni pretpregled",
   "upload_form.undo": "Obriši",
   "upload_form.video_description": "Opišite za ljude sa slabim sluhom ili vidom",
   "upload_modal.analyzing_picture": "Analiza slike…",
   "upload_modal.apply": "Primijeni",
-  "upload_modal.applying": "Applying…",
+  "upload_modal.applying": "Primjenjivanje…",
   "upload_modal.choose_image": "Odaberite sliku",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+  "upload_modal.description_placeholder": "Gojazni đačić s biciklom drži hmelj i finu vatu u džepu nošnje",
   "upload_modal.detect_text": "Detektiraj tekst sa slike",
   "upload_modal.edit_media": "Uređivanje medija",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
   "upload_modal.preparing_ocr": "Preparing OCR…",
-  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_modal.preview_label": "Pretpregled ({ratio})",
   "upload_progress.label": "Prenošenje...",
-  "upload_progress.processing": "Processing…",
+  "upload_progress.processing": "Obrada…",
   "video.close": "Zatvori video",
   "video.download": "Preuzmi datoteku",
   "video.exit_fullscreen": "Izađi iz cijelog zaslona",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index f16841923..7c91ff568 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Bejegyzések és válaszok",
   "account.report": "@{name} jelentése",
   "account.requested": "Jóváhagysára vár. Kattints a követési kérés visszavonásához",
+  "account.requested_follow": "{name} kérte, hogy követhessen téged",
   "account.share": "@{name} profiljának megosztása",
   "account.show_reblogs": "@{name} megtolásainak mutatása",
   "account.statuses_counter": "{count, plural, one {{counter} Bejegyzés} other {{counter} Bejegyzés}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Nyelv keresése...",
   "compose_form.direct_message_warning_learn_more": "Tudj meg többet",
   "compose_form.encryption_warning": "A bejegyzések Mastodonon nem használnak végpontok közötti titkosítást. Ne ossz meg semmilyen érzékeny információt Mastodonon.",
-  "compose_form.hashtag_warning": "Ez a bejegyzésed nem fog megjelenni semmilyen hashtag alatt, mivel listázatlan. Csak a nyilvános bejegyzések kereshetők hashtaggel.",
+  "compose_form.hashtag_warning": "Ez a bejegyzésed nem fog megjelenni semmilyen hashtag alatt, mivel nem nyilvános. Csak a nyilvános bejegyzések kereshetők hashtaggel.",
   "compose_form.lock_disclaimer": "A fiókod nincs {locked}. Bárki követni tud, hogy megtekintse a kizárólag követőknek szánt bejegyzéseket.",
   "compose_form.lock_disclaimer.lock": "lezárva",
   "compose_form.placeholder": "Mi jár a fejedben?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Veremkiíratás vágólapra másolása",
   "errors.unexpected_crash.report_issue": "Probléma jelentése",
   "explore.search_results": "Keresési találatok",
+  "explore.suggested_follows": "Neked",
   "explore.title": "Felfedezés",
+  "explore.trending_links": "Hírek",
+  "explore.trending_statuses": "Bejegyzések",
+  "explore.trending_tags": "Hashtagek",
   "filter_modal.added.context_mismatch_explanation": "Ez a szűrőkategória nem érvényes abban a környezetben, amelyből elérted ezt a bejegyzést. Ha ebben a környezetben is szűrni szeretnéd a bejegyzést, akkor szerkesztened kell a szűrőt.",
   "filter_modal.added.context_mismatch_title": "Környezeti eltérés.",
   "filter_modal.added.expired_explanation": "Ez a szűrőkategória elévült, a használatához módosítanod kell az elévülési dátumot.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Bejelentkezés",
   "sign_in_banner.text": "Jelentkezz be profilok vagy hashtagek követéséhez, bejegyzések megosztásához, megválaszolásához, vagy kommunikálj a fiókodból más kiszolgálókkal.",
   "status.admin_account": "Moderációs felület megnyitása @{name} fiókhoz",
+  "status.admin_domain": "A következő moderációs felületének megnyitása: @{domain}",
   "status.admin_status": "Bejegyzés megnyitása a moderációs felületen",
   "status.block": "@{name} letiltása",
   "status.bookmark": "Könyvjelzőzés",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 285e96636..137983cbc 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Գրառումներ եւ պատասխաններ",
   "account.report": "Բողոքել @{name}֊ի մասին",
   "account.requested": "Հաստատման կարիք ունի։ Սեղմիր՝ հետեւելու հայցը չեղարկելու համար։",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Կիսուել @{name}֊ի էջով",
   "account.show_reblogs": "Ցուցադրել @{name}֊ի տարածածները",
   "account.statuses_counter": "{count, plural, one {{counter} Գրառում} other {{counter} Գրառումներ}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Իմանալ աւելին",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "Այս գրառումը չի հաշուառուի որեւէ պիտակի տակ, քանզի այն ծածուկ է։ Միայն հրապարակային թթերը հնարաւոր է որոնել պիտակներով։",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Քո հաշիւը {locked} չէ։ Իւրաքանչիւրութիւն ոք կարող է հետեւել քեզ եւ տեսնել միայն հետեւողների համար նախատեսուած գրառումները։",
   "compose_form.lock_disclaimer.lock": "փակ",
   "compose_form.placeholder": "Ի՞նչ կայ մտքիդ",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Պատճենել սթաքթրեյսը սեղմատախտակին",
   "errors.unexpected_crash.report_issue": "Զեկուցել խնդրի մասին",
   "explore.search_results": "Որոնման արդիւնքներ",
+  "explore.suggested_follows": "For you",
   "explore.title": "Բացայայտել",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Բացել @{name} օգտատիրոջ մոդերացիայի դիմերէսը։",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Բացել այս գրառումը մոդերատորի դիմերէսի մէջ",
   "status.block": "Արգելափակել @{name}֊ին",
   "status.bookmark": "Էջանիշ",
@@ -553,7 +559,7 @@
   "status.favourite": "Հաւանել",
   "status.filter": "Filter this post",
   "status.filtered": "Զտուած",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Բեռնել աւելին",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index ae633965a..7ed8a02ab 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Kiriman dan balasan",
   "account.report": "Laporkan @{name}",
   "account.requested": "Menunggu persetujuan. Klik untuk membatalkan permintaan",
+  "account.requested_follow": "{name} ingin mengikuti Anda",
   "account.share": "Bagikan profil @{name}",
   "account.show_reblogs": "Tampilkan boost dari @{name}",
   "account.statuses_counter": "{count, plural, other {{counter} Kiriman}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Telusuri bahasa...",
   "compose_form.direct_message_warning_learn_more": "Pelajari selengkapnya",
   "compose_form.encryption_warning": "Kiriman di Mastodon tidak dienkripsi end-to-end. Jangan bagikan informasi sensitif melalui Mastodon.",
-  "compose_form.hashtag_warning": "Kiriman ini tidak akan ada dalam daftar tagar mana pun karena telah diatur sebagai tidak terdaftar. Hanya kiriman publik yang bisa dicari dengan tagar.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Akun Anda tidak {locked}. Semua orang dapat mengikuti Anda untuk melihat kiriman khusus untuk pengikut Anda.",
   "compose_form.lock_disclaimer.lock": "terkunci",
   "compose_form.placeholder": "Apa yang ada di pikiran Anda?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Salin stacktrace ke papan klip",
   "errors.unexpected_crash.report_issue": "Laporkan masalah",
   "explore.search_results": "Hasil pencarian",
+  "explore.suggested_follows": "Untuk Anda",
   "explore.title": "Jelajahi",
+  "explore.trending_links": "Berita",
+  "explore.trending_statuses": "Kiriman",
+  "explore.trending_tags": "Tagar",
   "filter_modal.added.context_mismatch_explanation": "Indonesia Translate",
   "filter_modal.added.context_mismatch_title": "Konteks tidak cocok!",
   "filter_modal.added.expired_explanation": "Kategori saringan ini telah kedaluwarsa, Anda harus mengubah tanggal kedaluwarsa untuk diterapkan.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Masuk",
   "sign_in_banner.text": "Masuk untuk mengikuti profil atau tagar, favorit, bagikan, dan balas ke kiriman, atau berinteraksi dari akun Anda di server yang lain.",
   "status.admin_account": "Buka antarmuka moderasi untuk @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Buka kiriman ini dalam antar muka moderasi",
   "status.block": "Blokir @{name}",
   "status.bookmark": "Markah",
@@ -553,7 +559,7 @@
   "status.favourite": "Difavoritkan",
   "status.filter": "Saring kiriman ini",
   "status.filtered": "Disaring",
-  "status.hide": "Sembunyikan toot",
+  "status.hide": "Sembunyikan pos",
   "status.history.created": "{name} membuat {date}",
   "status.history.edited": "{name} mengedit {date}",
   "status.load_more": "Tampilkan semua",
diff --git a/app/javascript/mastodon/locales/ig.json b/app/javascript/mastodon/locales/ig.json
index bf7c7baae..68ba6e91e 100644
--- a/app/javascript/mastodon/locales/ig.json
+++ b/app/javascript/mastodon/locales/ig.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Posts and replies",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval. Click to cancel follow request",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Kpesa nsogbu",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Kee ebenrụtụakā",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index d14750f98..e57d37787 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Posti e respondi",
   "account.report": "Denuncar @{name}",
   "account.requested": "Vartante aprobo",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Partigez profilo di @{name}",
   "account.show_reblogs": "Montrez busti de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Posto} other {{counter} Posti}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Trovez linguo...",
   "compose_form.direct_message_warning_learn_more": "Lernez pluse",
   "compose_form.encryption_warning": "Posti en Mastodon ne intersequante chifrigesas. Ne partigez irga privata informo che Mastodon.",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Vua konto ne esas {locked}. Irgu povas sequar vu por vidar vua sequanto-nura posti.",
   "compose_form.lock_disclaimer.lock": "klefagesas",
   "compose_form.placeholder": "Quo esas en tua spirito?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Kopiez amastraso a klipplanko",
   "errors.unexpected_crash.report_issue": "Reportigez problemo",
   "explore.search_results": "Trovuri",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explorez",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "Ca filtrilgrupo ne relatesas kun informo de ca acesesita posto. Se vu volas posto filtresar kun ca informo anke, vu bezonas modifikar filtrilo.",
   "filter_modal.added.context_mismatch_title": "Kontenajneparigeso!",
   "filter_modal.added.expired_explanation": "Ca filtrilgrupo expiris, vu bezonas chanjar expirtempo por apliko.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Enirez",
   "sign_in_banner.text": "Enirez por sequar profili o hashtagi, favorizar, partigar e respondizar posti, o interagar de vua konto de diferanta servilo.",
   "status.admin_account": "Apertez jerintervizajo por @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Restriktez @{name}",
   "status.bookmark": "Libromarko",
@@ -553,7 +559,7 @@
   "status.favourite": "Favorizar",
   "status.filter": "Filtragez ca posto",
   "status.filtered": "Filtrita",
-  "status.hide": "Celez posto",
+  "status.hide": "Hide post",
   "status.history.created": "{name} kreis ye {date}",
   "status.history.edited": "{name} modifikis ye {date}",
   "status.load_more": "Kargar pluse",
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index 74211279a..f5271f245 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Færslur og svör",
   "account.report": "Kæra @{name}",
   "account.requested": "Bíður eftir samþykki. Smelltu til að hætta við beiðni um að fylgjast með",
+  "account.requested_follow": "{name} hefur beðið um að fylgjast með þér",
   "account.share": "Deila notandasniði fyrir @{name}",
   "account.show_reblogs": "Sýna endurbirtingar frá @{name}",
   "account.statuses_counter": "{count, plural, one {Færsla: {counter}} other {Færslur: {counter}}}",
@@ -127,10 +128,10 @@
   "compose.language.search": "Leita að tungumálum...",
   "compose_form.direct_message_warning_learn_more": "Kanna nánar",
   "compose_form.encryption_warning": "Færslur á Mastodon eru ekki enda-í-enda dulritaðar. Ekki deila viðkvæmum upplýsingum á Mastodon.",
-  "compose_form.hashtag_warning": "Þessi færsla verður ekki talin með undir nokkru myllumerki þar sem það er óskráð. Einungis er hægt að leita að opinberum færslum eftir myllumerkjum.",
+  "compose_form.hashtag_warning": "Þessi færsla verður ekki talin með undir nokkru myllumerki þar sem það er ekki opinbert. Einungis er hægt að leita að opinberum færslum eftir myllumerkjum.",
   "compose_form.lock_disclaimer": "Aðgangurinn þinn er ekki {locked}. Hver sem er getur fylgst með þér til að sjá þær færslur sem einungis eru til fylgjenda þinna.",
   "compose_form.lock_disclaimer.lock": "læstur",
-  "compose_form.placeholder": "Hvað varstu að hugsa?",
+  "compose_form.placeholder": "Hvað liggur þér á hjarta?",
   "compose_form.poll.add_option": "Bæta við valkosti",
   "compose_form.poll.duration": "Tímalengd könnunar",
   "compose_form.poll.option_placeholder": "Valkostur {number}",
@@ -224,7 +225,7 @@
   "empty_column.home": "Heimatímalínan þín er tóm! Fylgstu með fleira fólki til að fylla hana. {suggestions}",
   "empty_column.home.suggestions": "Skoðaðu nokkrar tillögur",
   "empty_column.list": "Það er ennþá ekki neitt á þessum lista. Þegar meðlimir á listanum senda inn nýjar færslur, munu þær birtast hér.",
-  "empty_column.lists": "Þú ert ennþá ekki með neina lista. Þegar þú byrð til einhvern lista, munu hann birtast hér.",
+  "empty_column.lists": "Þú ert ennþá ekki með neina lista. Þegar þú býrð til einhvern lista, munu hann birtast hér.",
   "empty_column.mutes": "Þú hefur ekki þaggað niður í neinum notendum ennþá.",
   "empty_column.notifications": "Þú ert ekki ennþá með neinar tilkynningar. Vertu í samskiptum við aðra til að umræður fari af stað.",
   "empty_column.public": "Það er ekkert hér! Skrifaðu eitthvað opinberlega, eða fylgstu með notendum á öðrum netþjónum til að fylla upp í þetta",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Afrita rakningarupplýsingar (stacktrace) á klippispjald",
   "errors.unexpected_crash.report_issue": "Tilkynna vandamál",
   "explore.search_results": "Leitarniðurstöður",
+  "explore.suggested_follows": "Fyrir þig",
   "explore.title": "Kanna",
+  "explore.trending_links": "Fréttir",
+  "explore.trending_statuses": "Færslur",
+  "explore.trending_tags": "Myllumerki",
   "filter_modal.added.context_mismatch_explanation": "Þessi síuflokkur á ekki við í því samhengi sem aðgangur þinn að þessari færslu felur í sér. Ef þú vilt að færslan sé einnig síuð í þessu samhengi, þá þarftu að breyta síunni.",
   "filter_modal.added.context_mismatch_title": "Misræmi í samhengi!",
   "filter_modal.added.expired_explanation": "Þessi síuflokkur er útrunninn, þú þarft að breyta gidistímanum svo hann geti átt við.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Skrá inn",
   "sign_in_banner.text": "Skráðu þig inn til að fylgjast með notendum eða myllumerkjum, svara færslum, deila þeim eða setja í eftirlæti, eða eiga í samskiptum á aðgangnum þínum á öðrum netþjónum.",
   "status.admin_account": "Opna umsjónarviðmót fyrir @{name}",
+  "status.admin_domain": "Opna umsjónarviðmót fyrir @{domain}",
   "status.admin_status": "Opna þessa færslu í umsjónarviðmótinu",
   "status.block": "Útiloka @{name}",
   "status.bookmark": "Bókamerki",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 2e6c9e1e3..080bfafbd 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -12,7 +12,7 @@
   "about.powered_by": "Social media decentralizzato alimentato da {mastodon}",
   "about.rules": "Regole del server",
   "account.account_note_header": "Nota",
-  "account.add_or_remove_from_list": "Aggiungi o togli dalle liste",
+  "account.add_or_remove_from_list": "Aggiungi o Rimuovi dalle liste",
   "account.badges.bot": "Bot",
   "account.badges.group": "Gruppo",
   "account.block": "Blocca @{name}",
@@ -32,7 +32,7 @@
   "account.follow": "Segui",
   "account.followers": "Follower",
   "account.followers.empty": "Ancora nessuno segue questo utente.",
-  "account.followers_counter": "{count, plural, one {{counter} Seguace} other {{counter} Seguaci}}",
+  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Follower}}",
   "account.following": "Seguiti",
   "account.following_counter": "{count, plural, one {{counter} Seguiti} other {{counter} Seguiti}}",
   "account.follows.empty": "Questo utente non segue ancora nessuno.",
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Post e risposte",
   "account.report": "Segnala @{name}",
   "account.requested": "In attesa d'approvazione. Clicca per annullare la richiesta di seguire",
+  "account.requested_follow": "{name} ha richiesto di seguirti",
   "account.share": "Condividi il profilo di @{name}",
   "account.show_reblogs": "Mostra potenziamenti da @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Post}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Cerca lingue...",
   "compose_form.direct_message_warning_learn_more": "Scopri di più",
   "compose_form.encryption_warning": "I post su Mastodon non sono crittografati end-to-end. Non condividere alcuna informazione sensibile su Mastodon.",
-  "compose_form.hashtag_warning": "Questo post non sarà elencato sotto alcun hashtag, non avendo una lista. Solo i post pubblici possono esser cercati per hashtag.",
+  "compose_form.hashtag_warning": "Questo post non sarà elencato sotto alcun hashtag, poiché non è pubblico. Solo i post pubblici possono essere cercati per hashtag.",
   "compose_form.lock_disclaimer": "Il tuo profilo non è {locked}. Chiunque può seguirti per visualizzare i tuoi post per soli seguaci.",
   "compose_form.lock_disclaimer.lock": "bloccato",
   "compose_form.placeholder": "Cos'hai in mente?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copia stacktrace negli appunti",
   "errors.unexpected_crash.report_issue": "Segnala un problema",
   "explore.search_results": "Risultati della ricerca",
+  "explore.suggested_follows": "Per te",
   "explore.title": "Esplora",
+  "explore.trending_links": "Novità",
+  "explore.trending_statuses": "Post",
+  "explore.trending_tags": "Hashtag",
   "filter_modal.added.context_mismatch_explanation": "La categoria di questo filtro non si applica al contesto in cui hai acceduto a questo post. Se desideri che il post sia filtrato anche in questo contesto, dovrai modificare il filtro.",
   "filter_modal.added.context_mismatch_title": "Contesto non corrispondente!",
   "filter_modal.added.expired_explanation": "La categoria di questo filtro è scaduta, dovrvai modificarne la data di scadenza per applicarlo.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Accedi",
   "sign_in_banner.text": "Accedi per seguire profili o hashtag, salvare tra i preferiti, condividere e rispondere ai post, o interagire dal tuo profilo su un server differente.",
   "status.admin_account": "Apri interfaccia di moderazione per @{name}",
+  "status.admin_domain": "Apri l'interfaccia di moderazione per {domain}",
   "status.admin_status": "Apri questo post nell'interfaccia di moderazione",
   "status.block": "Blocca @{name}",
   "status.bookmark": "Aggiungi segnalibro",
@@ -553,8 +559,8 @@
   "status.favourite": "Salva preferito",
   "status.filter": "Filtra questo post",
   "status.filtered": "Filtrato",
-  "status.hide": "Nascondi toot",
-  "status.history.created": "{name} ha creato {date}",
+  "status.hide": "Nascondi il post",
+  "status.history.created": "Creato da {name} il {date}",
   "status.history.edited": "Modificato da {name} il {date}",
   "status.load_more": "Carica altro",
   "status.media_hidden": "Media nascosto",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index ea4810318..2a24e6934 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "投稿と返信",
   "account.report": "@{name}さんを通報",
   "account.requested": "フォロー承認待ちです。クリックしてキャンセル",
+  "account.requested_follow": "{name} さんがあなたにフォローリクエストしました",
   "account.share": "@{name}さんのプロフィールを共有する",
   "account.show_reblogs": "@{name}さんからのブーストを表示",
   "account.statuses_counter": "{counter} 投稿",
@@ -131,7 +132,7 @@
   "compose.language.search": "言語を検索...",
   "compose_form.direct_message_warning_learn_more": "もっと詳しく",
   "compose_form.encryption_warning": "Mastodonの投稿はエンドツーエンド暗号化に対応していません。安全に送受信されるべき情報をMastodonで共有しないでください。",
-  "compose_form.hashtag_warning": "この投稿は公開設定ではないのでハッシュタグの一覧に表示されません。公開投稿だけがハッシュタグで検索できます。",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "あなたのアカウントは{locked}になっていません。誰でもあなたをフォローすることができ、フォロワー限定の投稿を見ることができます。",
   "compose_form.lock_disclaimer.lock": "承認制",
   "compose_form.placeholder": "今なにしてる?",
@@ -239,7 +240,11 @@
   "errors.unexpected_crash.copy_stacktrace": "スタックトレースをクリップボードにコピー",
   "errors.unexpected_crash.report_issue": "問題を報告",
   "explore.search_results": "検索結果",
+  "explore.suggested_follows": "おすすめ",
   "explore.title": "エクスプローラー",
+  "explore.trending_links": "ニュース",
+  "explore.trending_statuses": "投稿",
+  "explore.trending_tags": "ハッシュタグ",
   "filter_modal.added.context_mismatch_explanation": "このフィルターカテゴリーはあなたがアクセスした投稿のコンテキストには適用されません。この投稿のコンテキストでもフィルターを適用するにはフィルターを編集する必要があります。",
   "filter_modal.added.context_mismatch_title": "コンテキストが一致しません!",
   "filter_modal.added.expired_explanation": "このフィルターカテゴリーは有効期限が切れています。適用するには有効期限を更新してください。",
@@ -365,7 +370,7 @@
   "mute_modal.duration": "ミュートする期間",
   "mute_modal.hide_notifications": "このユーザーからの通知を隠しますか?",
   "mute_modal.indefinite": "無期限",
-  "navigation_bar.about": "About",
+  "navigation_bar.about": "概要",
   "navigation_bar.blocks": "ブロックしたユーザー",
   "navigation_bar.bookmarks": "ブックマーク",
   "navigation_bar.community_timeline": "ローカルタイムライン",
@@ -541,6 +546,7 @@
   "sign_in_banner.sign_in": "ログイン",
   "sign_in_banner.text": "ログインしてプロファイルやハッシュタグ、お気に入りをフォローしたり、投稿を共有したり、返信したり、別のサーバーのアカウントと交流したりできます。",
   "status.admin_account": "@{name}さんのモデレーション画面を開く",
+  "status.admin_domain": "{domain}のモデレーション画面を開く",
   "status.admin_status": "この投稿をモデレーション画面で開く",
   "status.block": "@{name}さんをブロック",
   "status.bookmark": "ブックマーク",
@@ -622,7 +628,7 @@
   "upload_error.limit": "アップロードできる上限を超えています。",
   "upload_error.poll": "アンケートではファイルをアップロードできません。",
   "upload_form.audio_description": "聴き取りが難しいユーザーへの説明",
-  "upload_form.description": "閲覧が難しいユーザーへの説明",
+  "upload_form.description": "視覚障害者向けの説明",
   "upload_form.description_missing": "説明を追加していません",
   "upload_form.edit": "説明",
   "upload_form.thumbnail": "サムネイルを変更",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index ffdd38cfd..64e726321 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "ტუტები და პასუხები",
   "account.report": "დაარეპორტე @{name}",
   "account.requested": "დამტკიცების მოლოდინში. დააწკაპუნეთ რომ უარყოთ დადევნების მოთხონვა",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "გააზიარე @{name}-ის პროფილი",
   "account.show_reblogs": "აჩვენე ბუსტები @{name}-სგან",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "გაიგე მეტი",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "ეს ტუტი არ მოექცევა ჰეშტეგების ქვეს, რამეთუ ის არაა მითითებული. მხოლოდ ღია ტუტები მოიძებნება ჰეშტეგით.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "თქვენი ანგარიში არაა {locked}. ნებისმიერს შეიძლია გამოგყვეთ, რომ იხილოს თქვენი მიმდევრებზე გათვლილი პოსტები.",
   "compose_form.lock_disclaimer.lock": "ჩაკეტილი",
   "compose_form.placeholder": "რაზე ფიქრობ?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "დაბლოკე @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "ფავორიტი",
   "status.filter": "Filter this post",
   "status.filtered": "ფილტრირებული",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "მეტის ჩატვირთვა",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index f823a55dd..609c29540 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Tisuffaɣ d tririyin",
   "account.report": "Cetki ɣef @{name}",
   "account.requested": "Di laɛḍil ad yettwaqbel. Ssit i wakken ad yefsex usuter n uḍfar",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Bḍu amaɣnu n @{name}",
   "account.show_reblogs": "Ssken-d inebḍa n @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} n tsuffeɣt} other {{counter} n tsuffaɣ}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Nadi tutlayin …",
   "compose_form.direct_message_warning_learn_more": "Issin ugar",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Amiḍan-ik·im ur yelli ara {locked}. Menwala yezmer ad k·kem-yeḍfeṛ akken ad iẓer acu tbeṭṭuḍ akked yimeḍfaṛen-ik·im.",
   "compose_form.lock_disclaimer.lock": "yettwacekkel",
   "compose_form.placeholder": "D acu i itezzin deg wallaɣ?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Nɣel stacktrace ɣef wafus",
   "errors.unexpected_crash.report_issue": "Mmel ugur",
   "explore.search_results": "Igemmaḍ n unadi",
+  "explore.suggested_follows": "For you",
   "explore.title": "Snirem",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Qqen",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Seḥbes @{name}",
   "status.bookmark": "Creḍ",
@@ -553,7 +559,7 @@
   "status.favourite": "Rnu ɣer yismenyifen",
   "status.filter": "Filter this post",
   "status.filtered": "Yettwasizdeg",
-  "status.hide": "Ffer tajewwiqt",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Sali ugar",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index e3b2a436c..d1f5faf6d 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Жазбалар мен жауаптар",
   "account.report": "Шағымдану @{name}",
   "account.requested": "Растауын күтіңіз. Жазылудан бас тарту үшін басыңыз",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "@{name} профилін бөлісу\"",
   "account.show_reblogs": "@{name} бөліскендерін көрсету",
   "account.statuses_counter": "{count, plural, one {{counter} Пост} other {{counter} Пост}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Көбірек білу",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "Бұл пост іздеуде хэштегпен шықпайды, өйткені ол бәріне ашық емес. Тек ашық жазбаларды ғана хэштег арқылы іздеп табуға болады.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Аккаунтыңыз {locked} емес. Кез келген адам жазылып, сізді оқи алады.",
   "compose_form.lock_disclaimer.lock": "жабық",
   "compose_form.placeholder": "Не бөліскіңіз келеді?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Жиынтықты көшіріп ал клипбордқа",
   "errors.unexpected_crash.report_issue": "Мәселені хабарла",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "@{name} үшін модерация интерфейсін аш",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Бұл жазбаны модерация интерфейсінде аш",
   "status.block": "Бұғаттау @{name}",
   "status.bookmark": "Бетбелгі",
@@ -553,7 +559,7 @@
   "status.favourite": "Таңдаулы",
   "status.filter": "Filter this post",
   "status.filtered": "Фильтрленген",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Тағы әкел",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index 4e1bcbdc6..c6f8322df 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -1,9 +1,9 @@
 {
-  "about.blocks": "Moderated servers",
-  "about.contact": "Contact:",
-  "about.disclaimer": "Mastodon is free, open-source software, and a trademark of Mastodon gGmbH.",
-  "about.domain_blocks.no_reason_available": "Reason not available",
-  "about.domain_blocks.preamble": "Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server.",
+  "about.blocks": "ನಿಯಂತ್ರಿತ ಸರ್ವರ್‌ಗಳು",
+  "about.contact": "ಸಂಪರ್ಕ:",
+  "about.disclaimer": "ಮಾಸ್ಟೋಡಾನ್ ಇದು ಉಚಿತ, ಮುಕ್ತ ತಂತ್ರಾಂಶ ಮತ್ತು Mastodon gGmbH ಇದರ ನೊಂದಾಯಿತ ಗುರುತು.",
+  "about.domain_blocks.no_reason_available": "ಕಾರಣ ಲಭ್ಯವಿಲ್ಲ",
+  "about.domain_blocks.preamble": "ಸಾಮಾನ್ಯವಾಗಿ ಮಾಸ್ಟೊಡಾನ್ ನಿಮಗೆ ಇತರೆ ಬಳಕೆದಾರರಿಂದ ಹಂಚಲ್ಪಟ್ಟ ವಿಷಯಗಳನ್ನು ನೋಡಲು ಮತ್ತು ಅವರೊಂದಿಗೆ ಸಂಭಾಷಿಸಲು ಅನುಮತಿಸುತ್ತದೆ.\nಆದರೆ ಈ ಸರ್ವ್ರರ್‌ನಲ್ಲಿ ಅಳವಡಿಸಲಾದ ಕೆಲವು ವಿನಾಯಿತಿಗಳು ಇಂತಿವೆ.",
   "about.domain_blocks.silenced.explanation": "You will generally not see profiles and content from this server, unless you explicitly look it up or opt into it by following.",
   "about.domain_blocks.silenced.title": "Limited",
   "about.domain_blocks.suspended.explanation": "No data from this server will be processed, stored or exchanged, making any interaction or communication with users from this server impossible.",
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Toots and replies",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "locked",
   "compose_form.placeholder": "What is on your mind?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 30a1bfe94..a94801ad8 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -9,7 +9,7 @@
   "about.domain_blocks.suspended.explanation": "이 서버의 어떤 데이터도 처리되거나, 저장 되거나 공유되지 않고, 이 서버의 어떤 유저와도 상호작용 하거나 대화할 수 없습니다.",
   "about.domain_blocks.suspended.title": "정지됨",
   "about.not_available": "이 정보는 이 서버에서 사용할 수 없습니다.",
-  "about.powered_by": "{mastodon}에 의해 구동되는 분산화된 소셜 미디어",
+  "about.powered_by": "{mastodon}으로 구동되는 분산 소셜 미디어",
   "about.rules": "서버 규칙",
   "account.account_note_header": "노트",
   "account.add_or_remove_from_list": "리스트에 추가 혹은 삭제",
@@ -48,12 +48,13 @@
   "account.moved_to": "{name} 님은 자신의 새 계정이 다음과 같다고 표시했습니다:",
   "account.mute": "@{name} 뮤트",
   "account.mute_notifications": "@{name}의 알림을 뮤트",
-  "account.muted": "뮤트 됨",
+  "account.muted": "뮤트됨",
   "account.open_original_page": "원본 페이지 열기",
   "account.posts": "게시물",
   "account.posts_with_replies": "게시물과 답장",
   "account.report": "@{name} 신고",
   "account.requested": "승인 대기 중. 클릭해서 취소하기",
+  "account.requested_follow": "{name} 님이 팔로우 요청을 보냈습니다",
   "account.share": "@{name}의 프로필 공유",
   "account.show_reblogs": "@{name}의 부스트 보기",
   "account.statuses_counter": "{counter} 게시물",
@@ -127,7 +128,7 @@
   "compose.language.search": "언어 검색...",
   "compose_form.direct_message_warning_learn_more": "더 알아보기",
   "compose_form.encryption_warning": "마스토돈의 게시물들은 종단간 암호화가 되지 않습니다. 민감한 정보를 마스토돈을 통해 전달하지 마세요.",
-  "compose_form.hashtag_warning": "이 게시물은 어떤 해시태그로도 검색 되지 않습니다. 전체공개로 게시 된 게시물만이 해시태그로 검색 될 수 있습니다.",
+  "compose_form.hashtag_warning": "이 게시물은 전체공개가 아니기 때문에 어떤 해시태그로도 검색 되지 않습니다. 전체공개로 게시 된 게시물만이 해시태그로 검색될 수 있습니다.",
   "compose_form.lock_disclaimer": "이 계정은 {locked}상태가 아닙니다. 누구나 이 계정을 팔로우 하여 팔로워 전용의 게시물을 볼 수 있습니다.",
   "compose_form.lock_disclaimer.lock": "비공개",
   "compose_form.placeholder": "지금 무슨 생각을 하고 있나요?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "에러 내용을 클립보드에 복사",
   "errors.unexpected_crash.report_issue": "문제 신고",
   "explore.search_results": "검색 결과",
+  "explore.suggested_follows": "추천",
   "explore.title": "둘러보기",
+  "explore.trending_links": "소식",
+  "explore.trending_statuses": "게시물",
+  "explore.trending_tags": "해시태그",
   "filter_modal.added.context_mismatch_explanation": "이 필터 카테고리는 당신이 이 게시물에 접근한 문맥에 적용되지 않습니다. 만약 이 문맥에서도 필터되길 원한다면, 필터를 수정해야 합니다.",
   "filter_modal.added.context_mismatch_title": "문맥 불일치!",
   "filter_modal.added.expired_explanation": "이 필터 카테고리는 만료되었습니다, 적용하려면 만료 일자를 변경할 필요가 있습니다.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "로그인",
   "sign_in_banner.text": "로그인을 통해 프로필이나 해시태그를 팔로우하거나 마음에 들어하거나 공유하고 답글을 달 수 있습니다, 혹은 다른 서버에 있는 본인의 계정을 통해 참여할 수도 있습니다.",
   "status.admin_account": "@{name}에 대한 중재 화면 열기",
+  "status.admin_domain": "{domain}에 대한 중재 화면 열기",
   "status.admin_status": "중재 화면에서 이 게시물 열기",
   "status.block": "@{name} 차단",
   "status.bookmark": "북마크",
@@ -553,7 +559,7 @@
   "status.favourite": "좋아요",
   "status.filter": "이 게시물을 필터",
   "status.filtered": "필터로 걸러짐",
-  "status.hide": "툿 숨기기",
+  "status.hide": "게시물 숨기기",
   "status.history.created": "{name} 님이 {date}에 생성함",
   "status.history.edited": "{name} 님이 {date}에 수정함",
   "status.load_more": "더 보기",
diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json
index 02ac43d57..7dbb34591 100644
--- a/app/javascript/mastodon/locales/ku.json
+++ b/app/javascript/mastodon/locales/ku.json
@@ -18,7 +18,7 @@
   "account.block": "@{name} asteng bike",
   "account.block_domain": "Navpera {domain} asteng bike",
   "account.blocked": "Astengkirî",
-  "account.browse_more_on_origin_server": "Li pelên resen bêhtir bigere",
+  "account.browse_more_on_origin_server": "Li pelên resen bêtir bigere",
   "account.cancel_follow_request": "Daxwaza şopandinê vekişîne",
   "account.direct": "Peyamekê bişîne @{name}",
   "account.disable_notifications": "Êdî min agahdar neke gava @{name} diweşîne",
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Şandî û bersiv",
   "account.report": "@{name} ragihîne",
   "account.requested": "Li benda erêkirinê ye. Ji bo betal kirina daxwazê pêl bikin",
+  "account.requested_follow": "{name} dixwaze te bişopîne",
   "account.share": "Profîla @{name} parve bike",
   "account.show_reblogs": "Bilindkirinên ji @{name} nîşan bike",
   "account.statuses_counter": "{count, plural,one {{counter} Şandî}other {{counter} Şandî}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Li zimanan bigere...",
   "compose_form.direct_message_warning_learn_more": "Bêtir fêr bibe",
   "compose_form.encryption_warning": "Şandiyên li ser Mastodon dawî-bi-dawî ne şîfrekirî ne. Li ser Mastodon zanyariyên hestyar parve neke.",
-  "compose_form.hashtag_warning": "Ev şandî ji ber ku nehatiye tomarkirin dê di binê hashtagê de neyê tomar kirin. Tenê peyamên gelemperî dikarin bi hashtagê werin lêgerîn.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Ajimêrê te ne {locked}. Herkes dikare te bişopîne da ku şandiyên te yên tenê ji şopînerên re têne xuyakirin bibînin.",
   "compose_form.lock_disclaimer.lock": "girtî ye",
   "compose_form.placeholder": "Çi di hişê te derbas dibe?",
@@ -190,8 +191,8 @@
   "dismissable_banner.explore_statuses": "Ev şandiyên ji vê û rajekarên din ên di tora nenavendî de niha li ser vê rajekarê balê dikşînin.",
   "dismissable_banner.explore_tags": "Ev hashtagên ji vê û rajekarên din ên di tora nenavendî de niha li ser vê rajekarê balê dikşînin.",
   "dismissable_banner.public_timeline": "Ev şandiyên gelemperî herî dawî yên mirovên li ser vê û rajekarên din ên tora nenavendî ne ku ev rajekar pê tê nasîn.",
-  "embed.instructions": "Bi jêgirtina koda jêrîn vê şandiyê li ser malpera xwe bicîh bikin.",
-  "embed.preview": "Wa ye wê wusa xuya bike:",
+  "embed.instructions": "Bi jêgirtina koda jêrîn vê şandiyê li ser malpera xwe bi cih bike.",
+  "embed.preview": "Ew ê çawa xuya bibe li vir tê nîşandan:",
   "emoji_button.activity": "Çalakî",
   "emoji_button.clear": "Pak bike",
   "emoji_button.custom": "Kesanekirî",
@@ -230,12 +231,16 @@
   "empty_column.public": "Li vir tiştekî tuneye! Ji raya giştî re tiştekî binivîsîne, an ji bo tijîkirinê ji rajekerên din bikarhêneran bi destan bişopînin",
   "error.unexpected_crash.explanation": "Ji ber xeletîyeke di koda me da an jî ji ber mijara lihevhatina gerokan, ev rûpel rast nehat nîşandan.",
   "error.unexpected_crash.explanation_addons": "Ev rûpel bi awayekî rast nehat nîşandan. Ev çewtî mimkûn e ji ber lêzêdekirina gerokan an jî amûrên wergera xweberî pêk tê.",
-  "error.unexpected_crash.next_steps": "Nûkirina rûpelê biceribîne. Heke ev bi kêr neyê, dibe ku te hîn jî bi riya gerokeke cuda an jî sepana xwecîhê Mastodonê bi kar bîne.",
-  "error.unexpected_crash.next_steps_addons": "Ne çalak kirin û nûkirina rûpelê biceribîne. Heke ev bi kêr neyê, dibe ku te hîn jî bi riya gerokeke cuda an jî sepana xwecîhê Mastodonê bi kar bîne.",
+  "error.unexpected_crash.next_steps": "Nûkirina rûpelê biceribîne. Ku ev bi kêr neyê, dibe ku te hîn jî bi riya gerokeke cuda an jî sepana xwecîhî ya Mastodon bi kar bînî.",
+  "error.unexpected_crash.next_steps_addons": "Neçalakkirin û nûkirina rûpelê biceribîne. Ku ev bi kêr neyê, dibe ku te hîn jî bi riya gerokeke cuda an jî sepana xwecihî ya Mastodon bi kar bînî.",
   "errors.unexpected_crash.copy_stacktrace": "Şopa gemara (stacktrace) tûrikê ra jê bigire",
   "errors.unexpected_crash.report_issue": "Pirsgirêkekê ragihîne",
   "explore.search_results": "Encamên lêgerînê",
+  "explore.suggested_follows": "Ji bo te",
   "explore.title": "Vekole",
+  "explore.trending_links": "Nûçe",
+  "explore.trending_statuses": "Şandî",
+  "explore.trending_tags": "Hashtag",
   "filter_modal.added.context_mismatch_explanation": "Ev beşa parzûnê ji bo naveroka ku te tê de xwe gihandiye vê şandiyê nayê sepandin. Ku tu dixwazî şandî di vê naverokê de jî werê parzûnkirin, divê tu parzûnê biguherînî.",
   "filter_modal.added.context_mismatch_title": "Naverok li hev nagire!",
   "filter_modal.added.expired_explanation": "Ev beşa parzûnê qediya ye, ji bo ku tu bikaribe wê biguherîne divê tu dema qedandinê biguherînî.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Têkeve",
   "sign_in_banner.text": "Têkeve ji bo şopandina profîlan an hashtagan, bijartekirin, parvekirin û bersivdana şandiyan, an ji ajimêrê xwe li ser rajekarek cuda têkilî deyine.",
   "status.admin_account": "Ji bo @{name} navrûya venihêrtinê veke",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Vê şandîyê di navrûya venihêrtinê de veke",
   "status.block": "@{name} asteng bike",
   "status.bookmark": "Şûnpel",
@@ -549,11 +555,11 @@
   "status.edit": "Serrast bike",
   "status.edited": "Di {date} de hate serrastkirin",
   "status.edited_x_times": "{count, plural, one {{count} car} other {{count} car}} hate serrastkirin",
-  "status.embed": "Hedimandî",
+  "status.embed": "Bi cih bike",
   "status.favourite": "Bijarte bike",
   "status.filter": "Vê şandiyê parzûn bike",
   "status.filtered": "Parzûnkirî",
-  "status.hide": "Şandiyê veşêre",
+  "status.hide": "Hide post",
   "status.history.created": "{name} {date} afirand",
   "status.history.edited": "{name} {date} serrast kir",
   "status.load_more": "Bêtir bar bike",
diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json
index 8e937979f..f56974d2b 100644
--- a/app/javascript/mastodon/locales/kw.json
+++ b/app/javascript/mastodon/locales/kw.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Postow ha gorthebow",
   "account.report": "Reportya @{name}",
   "account.requested": "Ow kortos komendyans. Klyckyewgh dhe hedhi govyn holya",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Kevrenna profil @{name}",
   "account.show_reblogs": "Diskwedhes kenerthow a @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Tout} other {{counter} Tout}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Dyski moy",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "Ny vydh an post ma diskwedhys yn-dann vòlnos vyth awos y vos mes a rol. Ny yllir hwilas saw poblow postek dre vòlnos.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Nyns yw agas akont {locked}. Piwpynag a yll agas holya dhe weles agas postow holyoryon-hepken.",
   "compose_form.lock_disclaimer.lock": "Alhwedhys",
   "compose_form.placeholder": "Pyth eus yn agas brys?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Dasskrifa daslergh dhe'n astel glypp",
   "errors.unexpected_crash.report_issue": "Reportya kudyn",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Ygeri ynterfas koswa rag @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Ygeri an post ma y'n ynterfas koswa",
   "status.block": "Lettya @{name}",
   "status.bookmark": "Folennos",
@@ -553,7 +559,7 @@
   "status.favourite": "Merkya vel drudh",
   "status.filter": "Filter this post",
   "status.filtered": "Sidhlys",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Karga moy",
diff --git a/app/javascript/mastodon/locales/la.json b/app/javascript/mastodon/locales/la.json
new file mode 100644
index 000000000..1a54cc90d
--- /dev/null
+++ b/app/javascript/mastodon/locales/la.json
@@ -0,0 +1,655 @@
+{
+  "about.blocks": "Moderated servers",
+  "about.contact": "Ratio:",
+  "about.disclaimer": "Mastodon is free, open-source software, and a trademark of Mastodon gGmbH.",
+  "about.domain_blocks.no_reason_available": "Reason not available",
+  "about.domain_blocks.preamble": "Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server.",
+  "about.domain_blocks.silenced.explanation": "You will generally not see profiles and content from this server, unless you explicitly look it up or opt into it by following.",
+  "about.domain_blocks.silenced.title": "Limited",
+  "about.domain_blocks.suspended.explanation": "No data from this server will be processed, stored or exchanged, making any interaction or communication with users from this server impossible.",
+  "about.domain_blocks.suspended.title": "Suspended",
+  "about.not_available": "This information has not been made available on this server.",
+  "about.powered_by": "Decentralized social media powered by {mastodon}",
+  "about.rules": "Server rules",
+  "account.account_note_header": "Annotatio",
+  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.badges.bot": "Robotum",
+  "account.badges.group": "Congregatio",
+  "account.block": "Impedire @{name}",
+  "account.block_domain": "Imperire dominium {domain}",
+  "account.blocked": "Impeditum est",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.cancel_follow_request": "Withdraw follow request",
+  "account.direct": "Direct message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
+  "account.domain_blocked": "Dominium impeditum",
+  "account.edit_profile": "Recolere notionem",
+  "account.enable_notifications": "Notify me when @{name} posts",
+  "account.endorse": "Feature on profile",
+  "account.featured_tags.last_status_at": "Last post on {date}",
+  "account.featured_tags.last_status_never": "Nulla contributa",
+  "account.featured_tags.title": "{name}'s featured hashtags",
+  "account.follow": "Follow",
+  "account.followers": "Followers",
+  "account.followers.empty": "No one follows this user yet.",
+  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+  "account.following": "Following",
+  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows_you": "Follows you",
+  "account.go_to_profile": "Go to profile",
+  "account.hide_reblogs": "Hide boosts from @{name}",
+  "account.joined_short": "Joined",
+  "account.languages": "Change subscribed languages",
+  "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 indicated that their new account is now:",
+  "account.mute": "Mute @{name}",
+  "account.mute_notifications": "Mute notifications from @{name}",
+  "account.muted": "Confutatus",
+  "account.open_original_page": "Open original page",
+  "account.posts": "Posts",
+  "account.posts_with_replies": "Posts and replies",
+  "account.report": "Report @{name}",
+  "account.requested": "Awaiting approval. Click to cancel follow request",
+  "account.requested_follow": "{name} has requested to follow you",
+  "account.share": "Share @{name}'s profile",
+  "account.show_reblogs": "Show boosts from @{name}",
+  "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
+  "account.unblock": "Unblock @{name}",
+  "account.unblock_domain": "Unblock domain {domain}",
+  "account.unblock_short": "Solvere impedimentum",
+  "account.unendorse": "Don't feature on profile",
+  "account.unfollow": "Unfollow",
+  "account.unmute": "Unmute @{name}",
+  "account.unmute_notifications": "Unmute notifications from @{name}",
+  "account.unmute_short": "Unmute",
+  "account_note.placeholder": "Click to add a note",
+  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.retention.average": "Mediocritas",
+  "admin.dashboard.retention.cohort": "Sign-up month",
+  "admin.dashboard.retention.cohort_size": "New users",
+  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Rate limited",
+  "alert.unexpected.message": "An unexpected error occurred.",
+  "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Proclamatio",
+  "attachments_list.unprocessed": "(unprocessed)",
+  "audio.hide": "Hide audio",
+  "autosuggest_hashtag.per_week": "{count} per week",
+  "boost_modal.combo": "You can press {combo} to skip this next time",
+  "bundle_column_error.copy_stacktrace": "Copy error report",
+  "bundle_column_error.error.body": "The requested page could not be rendered. It could be due to a bug in our code, or a browser compatibility issue.",
+  "bundle_column_error.error.title": "Eheu!",
+  "bundle_column_error.network.body": "There was an error when trying to load this page. This could be due to a temporary problem with your internet connection or this server.",
+  "bundle_column_error.network.title": "Network error",
+  "bundle_column_error.retry": "Retemptare",
+  "bundle_column_error.return": "Go back home",
+  "bundle_column_error.routing.body": "The requested page could not be found. Are you sure the URL in the address bar is correct?",
+  "bundle_column_error.routing.title": "CCCCIIII",
+  "bundle_modal_error.close": "Claudere",
+  "bundle_modal_error.message": "Something went wrong while loading this component.",
+  "bundle_modal_error.retry": "Retemptare",
+  "closed_registrations.other_server_instructions": "Since Mastodon is decentralized, you can create an account on another server and still interact with this one.",
+  "closed_registrations_modal.description": "Creating an account on {domain} is currently not possible, but please keep in mind that you do not need an account specifically on {domain} to use Mastodon.",
+  "closed_registrations_modal.find_another_server": "Find another server",
+  "closed_registrations_modal.preamble": "Mastodon is decentralized, so no matter where you create your account, you will be able to follow and interact with anyone on this server. You can even self-host it!",
+  "closed_registrations_modal.title": "Signing up on Mastodon",
+  "column.about": "De",
+  "column.blocks": "Blocked users",
+  "column.bookmarks": "Signa paginales",
+  "column.community": "Local timeline",
+  "column.direct": "Direct messages",
+  "column.directory": "Browse profiles",
+  "column.domain_blocks": "Blocked domains",
+  "column.favourites": "Dilecti",
+  "column.follow_requests": "Follow requests",
+  "column.home": "Domi",
+  "column.lists": "Catalogi",
+  "column.mutes": "Muted users",
+  "column.notifications": "Notifications",
+  "column.pins": "Pinned post",
+  "column.public": "Federated timeline",
+  "column_back_button.label": "Back",
+  "column_header.hide_settings": "Hide settings",
+  "column_header.moveLeft_settings": "Move column to the left",
+  "column_header.moveRight_settings": "Move column to the right",
+  "column_header.pin": "Pin",
+  "column_header.show_settings": "Show settings",
+  "column_header.unpin": "Unpin",
+  "column_subheading.settings": "Settings",
+  "community.column_settings.local_only": "Local only",
+  "community.column_settings.media_only": "Media only",
+  "community.column_settings.remote_only": "Remote only",
+  "compose.language.change": "Mutare linguam",
+  "compose.language.search": "Quaerere linguas...",
+  "compose_form.direct_message_warning_learn_more": "Discere plura",
+  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
+  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
+  "compose_form.lock_disclaimer.lock": "clausum",
+  "compose_form.placeholder": "What is on your mind?",
+  "compose_form.poll.add_option": "Add a choice",
+  "compose_form.poll.duration": "Poll duration",
+  "compose_form.poll.option_placeholder": "Choice {number}",
+  "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
+  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
+  "compose_form.publish": "Barrire",
+  "compose_form.publish_form": "Barrire",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.save_changes": "Save changes",
+  "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
+  "compose_form.spoiler.marked": "Text is hidden behind warning",
+  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.spoiler_placeholder": "Write your warning here",
+  "confirmation_modal.cancel": "Cancel",
+  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.confirm": "Impedire",
+  "confirmations.block.message": "Are you sure you want to block {name}?",
+  "confirmations.cancel_follow_request.confirm": "Withdraw request",
+  "confirmations.cancel_follow_request.message": "Are you sure you want to withdraw your request to follow {name}?",
+  "confirmations.delete.confirm": "Oblitterare",
+  "confirmations.delete.message": "Are you sure you want to delete this status?",
+  "confirmations.delete_list.confirm": "Oblitterare",
+  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
+  "confirmations.discard_edit_media.confirm": "Discard",
+  "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+  "confirmations.domain_block.confirm": "Hide entire domain",
+  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
+  "confirmations.logout.confirm": "Log out",
+  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.mute.confirm": "Confutare",
+  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.message": "Are you sure you want to mute {name}?",
+  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
+  "confirmations.reply.confirm": "Respondere",
+  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+  "confirmations.unfollow.confirm": "Unfollow",
+  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "conversation.delete": "Delete conversation",
+  "conversation.mark_as_read": "Mark as read",
+  "conversation.open": "View conversation",
+  "conversation.with": "With {names}",
+  "copypaste.copied": "Copied",
+  "copypaste.copy": "Copy",
+  "directory.federated": "From known fediverse",
+  "directory.local": "From {domain} only",
+  "directory.new_arrivals": "New arrivals",
+  "directory.recently_active": "Recently active",
+  "disabled_account_banner.account_settings": "Account settings",
+  "disabled_account_banner.text": "Your account {disabledAccount} is currently disabled.",
+  "dismissable_banner.community_timeline": "These are the most recent public posts from people whose accounts are hosted by {domain}.",
+  "dismissable_banner.dismiss": "Dismiss",
+  "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.",
+  "dismissable_banner.explore_statuses": "These posts from this and other servers in the decentralized network are gaining traction on this server right now.",
+  "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.",
+  "dismissable_banner.public_timeline": "These are the most recent public posts from people on this and other servers of the decentralized network that this server knows about.",
+  "embed.instructions": "Embed this status on your website by copying the code below.",
+  "embed.preview": "Here is what it will look like:",
+  "emoji_button.activity": "Activity",
+  "emoji_button.clear": "Clear",
+  "emoji_button.custom": "Custom",
+  "emoji_button.flags": "Flags",
+  "emoji_button.food": "Food & Drink",
+  "emoji_button.label": "Insert emoji",
+  "emoji_button.nature": "Nature",
+  "emoji_button.not_found": "No matching emojis found",
+  "emoji_button.objects": "Objects",
+  "emoji_button.people": "Homines",
+  "emoji_button.recent": "Frequently used",
+  "emoji_button.search": "Quaerere...",
+  "emoji_button.search_results": "Search results",
+  "emoji_button.symbols": "Symbols",
+  "emoji_button.travel": "Travel & Places",
+  "empty_column.account_suspended": "Account suspended",
+  "empty_column.account_timeline": "Hic nulla contributa!",
+  "empty_column.account_unavailable": "Notio non impetrabilis",
+  "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.",
+  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.domain_blocks": "There are no blocked domains yet.",
+  "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+  "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.",
+  "empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.",
+  "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.hashtag": "There is nothing in this hashtag yet.",
+  "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}",
+  "empty_column.home.suggestions": "See some suggestions",
+  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
+  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.notifications": "You don't have any notifications yet. When other people interact with you, you will see it here.",
+  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
+  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
+  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "errors.unexpected_crash.report_issue": "Report issue",
+  "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
+  "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Contributa",
+  "explore.trending_tags": "Hashtags",
+  "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
+  "filter_modal.added.context_mismatch_title": "Context mismatch!",
+  "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
+  "filter_modal.added.expired_title": "Expired filter!",
+  "filter_modal.added.review_and_configure": "To review and further configure this filter category, go to the {settings_link}.",
+  "filter_modal.added.review_and_configure_title": "Filter settings",
+  "filter_modal.added.settings_link": "settings page",
+  "filter_modal.added.short_explanation": "This post has been added to the following filter category: {title}.",
+  "filter_modal.added.title": "Filter added!",
+  "filter_modal.select_filter.context_mismatch": "does not apply to this context",
+  "filter_modal.select_filter.expired": "expired",
+  "filter_modal.select_filter.prompt_new": "New category: {name}",
+  "filter_modal.select_filter.search": "Search or create",
+  "filter_modal.select_filter.subtitle": "Use an existing category or create a new one",
+  "filter_modal.select_filter.title": "Filter this post",
+  "filter_modal.title.status": "Filter a post",
+  "follow_recommendations.done": "Confectum",
+  "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
+  "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+  "follow_request.authorize": "Authorize",
+  "follow_request.reject": "Reject",
+  "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
+  "footer.about": "About",
+  "footer.directory": "Profiles directory",
+  "footer.get_app": "Get the app",
+  "footer.invite": "Invite people",
+  "footer.keyboard_shortcuts": "Keyboard shortcuts",
+  "footer.privacy_policy": "Privacy policy",
+  "footer.source_code": "View source code",
+  "generic.saved": "Saved",
+  "getting_started.heading": "Getting started",
+  "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",
+  "hashtag.follow": "Follow hashtag",
+  "hashtag.unfollow": "Unfollow hashtag",
+  "home.column_settings.basic": "Basic",
+  "home.column_settings.show_reblogs": "Show boosts",
+  "home.column_settings.show_replies": "Show replies",
+  "home.hide_announcements": "Hide announcements",
+  "home.show_announcements": "Show announcements",
+  "interaction_modal.description.favourite": "With an account on Mastodon, you can favourite this post to let the author know you appreciate it and save it for later.",
+  "interaction_modal.description.follow": "With an account on Mastodon, you can follow {name} to receive their posts in your home feed.",
+  "interaction_modal.description.reblog": "With an account on Mastodon, you can boost this post to share it with your own followers.",
+  "interaction_modal.description.reply": "With an account on Mastodon, you can respond to this post.",
+  "interaction_modal.on_another_server": "On a different server",
+  "interaction_modal.on_this_server": "On this server",
+  "interaction_modal.other_server_instructions": "Copy and paste this URL into the search field of your favourite Mastodon app or the web interface of your Mastodon server.",
+  "interaction_modal.preamble": "Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don't have an account on this one.",
+  "interaction_modal.title.favourite": "Favourite {name}'s post",
+  "interaction_modal.title.follow": "Follow {name}",
+  "interaction_modal.title.reblog": "Boost {name}'s post",
+  "interaction_modal.title.reply": "Reply to {name}'s post",
+  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
+  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
+  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.boost": "to boost",
+  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.description": "Descriptio",
+  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.down": "to move down in the list",
+  "keyboard_shortcuts.enter": "Aperire contributum",
+  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourites": "to open favourites list",
+  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.legend": "to display this legend",
+  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.mention": "to mention author",
+  "keyboard_shortcuts.muted": "to open muted users list",
+  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
+  "keyboard_shortcuts.pinned": "to open pinned posts list",
+  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.reply": "Respondere ad contributum",
+  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.start": "to open \"get started\" column",
+  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+  "keyboard_shortcuts.toot": "to start a brand new post",
+  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.up": "to move up in the list",
+  "lightbox.close": "Claudere",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
+  "lightbox.next": "Secundum",
+  "lightbox.previous": "Previous",
+  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.title": "This profile has been hidden by the moderators of {domain}.",
+  "lists.account.add": "Add to list",
+  "lists.account.remove": "Remove from list",
+  "lists.delete": "Delete list",
+  "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
+  "lists.new.create": "Add list",
+  "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.followed": "Any followed user",
+  "lists.replies_policy.list": "Members of the list",
+  "lists.replies_policy.none": "No one",
+  "lists.replies_policy.title": "Show replies to:",
+  "lists.search": "Search among people you follow",
+  "lists.subheading": "Your lists",
+  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "loading_indicator.label": "Loading...",
+  "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}",
+  "missing_indicator.label": "Not found",
+  "missing_indicator.sublabel": "This resource could not be found",
+  "moved_to_account_banner.text": "Your account {disabledAccount} is currently disabled because you moved to {movedToAccount}.",
+  "mute_modal.duration": "Duration",
+  "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
+  "navigation_bar.about": "About",
+  "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.bookmarks": "Bookmarks",
+  "navigation_bar.community_timeline": "Local timeline",
+  "navigation_bar.compose": "Compose new post",
+  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.discover": "Discover",
+  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.edit_profile": "Edit profile",
+  "navigation_bar.explore": "Explore",
+  "navigation_bar.favourites": "Favourites",
+  "navigation_bar.filters": "Muted words",
+  "navigation_bar.follow_requests": "Follow requests",
+  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.lists": "Lists",
+  "navigation_bar.logout": "Logout",
+  "navigation_bar.mutes": "Muted users",
+  "navigation_bar.personal": "Personal",
+  "navigation_bar.pins": "Pinned posts",
+  "navigation_bar.preferences": "Preferences",
+  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.search": "Search",
+  "navigation_bar.security": "Security",
+  "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.",
+  "notification.admin.report": "{name} reported {target}",
+  "notification.admin.sign_up": "{name} signed up",
+  "notification.favourite": "{name} favourited your status",
+  "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
+  "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
+  "notification.poll": "A poll you have voted in has ended",
+  "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
+  "notification.update": "{name} edited a post",
+  "notifications.clear": "Clear notifications",
+  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "notifications.column_settings.admin.report": "New reports:",
+  "notifications.column_settings.admin.sign_up": "New sign-ups:",
+  "notifications.column_settings.alert": "Desktop notifications",
+  "notifications.column_settings.favourite": "Favourites:",
+  "notifications.column_settings.filter_bar.advanced": "Display all categories",
+  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+  "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
+  "notifications.column_settings.mention": "Mentions:",
+  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.show": "Show in column",
+  "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New posts:",
+  "notifications.column_settings.unread_notifications.category": "Unread notifications",
+  "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.update": "Edits:",
+  "notifications.filter.all": "Omnia",
+  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.follows": "Follows",
+  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Eventus electionis",
+  "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
+  "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
+  "poll.closed": "Clausum",
+  "poll.refresh": "Refresh",
+  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
+  "poll.vote": "Eligere",
+  "poll.voted": "Elegisti hoc responsum",
+  "poll.votes": "{votes, plural, one {# vote} other {# votes}}",
+  "poll_button.add_poll": "Addere electionem",
+  "poll_button.remove_poll": "Auferre electionem",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Visible for mentioned users only",
+  "privacy.direct.short": "Direct",
+  "privacy.private.long": "Visible for followers only",
+  "privacy.private.short": "Followers-only",
+  "privacy.public.long": "Coram publico",
+  "privacy.public.short": "Coram publico",
+  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+  "privacy.unlisted.short": "Unlisted",
+  "privacy_policy.last_updated": "Last updated {date}",
+  "privacy_policy.title": "Privacy Policy",
+  "refresh": "Refresh",
+  "regeneration_indicator.label": "Loading…",
+  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "relative_time.days": "{number}d",
+  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
+  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+  "relative_time.full.just_now": "nunc",
+  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
+  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.hours": "{number}h",
+  "relative_time.just_now": "nunc",
+  "relative_time.minutes": "{number}m",
+  "relative_time.seconds": "{number}s",
+  "relative_time.today": "hodie",
+  "reply_indicator.cancel": "Cancel",
+  "report.block": "Impedimentum",
+  "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+  "report.categories.other": "Altera",
+  "report.categories.spam": "Spam",
+  "report.categories.violation": "Content violates one or more server rules",
+  "report.category.subtitle": "Choose the best match",
+  "report.category.title": "Tell us what's going on with this {type}",
+  "report.category.title_account": "notio",
+  "report.category.title_status": "contributum",
+  "report.close": "Confectum",
+  "report.comment.title": "Is there anything else you think we should know?",
+  "report.forward": "Forward to {target}",
+  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.mute": "Confutare",
+  "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+  "report.next": "Secundum",
+  "report.placeholder": "Type or paste additional comments",
+  "report.reasons.dislike": "I don't like it",
+  "report.reasons.dislike_description": "It is not something you want to see",
+  "report.reasons.other": "It's something else",
+  "report.reasons.other_description": "The issue does not fit into other categories",
+  "report.reasons.spam": "It's spam",
+  "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+  "report.reasons.violation": "It violates server rules",
+  "report.reasons.violation_description": "You are aware that it breaks specific rules",
+  "report.rules.subtitle": "Select all that apply",
+  "report.rules.title": "Which rules are being violated?",
+  "report.statuses.subtitle": "Select all that apply",
+  "report.statuses.title": "Are there any posts that back up this report?",
+  "report.submit": "Mittere",
+  "report.target": "Report {target}",
+  "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+  "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+  "report.thanks.title": "Don't want to see this?",
+  "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+  "report.unfollow": "Unfollow @{name}",
+  "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+  "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached",
+  "report_notification.categories.other": "Altera",
+  "report_notification.categories.spam": "Spam",
+  "report_notification.categories.violation": "Rule violation",
+  "report_notification.open": "Open report",
+  "search.placeholder": "Quaerere",
+  "search.search_or_paste": "Search or paste URL",
+  "search_popout.search_format": "Advanced search format",
+  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.status": "status",
+  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.user": "user",
+  "search_results.accounts": "People",
+  "search_results.all": "All",
+  "search_results.hashtags": "Hashtags",
+  "search_results.nothing_found": "Could not find anything for these search terms",
+  "search_results.statuses": "Posts",
+  "search_results.statuses_fts_disabled": "Searching posts by their content is not enabled on this Mastodon server.",
+  "search_results.title": "Search for {q}",
+  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+  "server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)",
+  "server_banner.active_users": "active users",
+  "server_banner.administered_by": "Administered by:",
+  "server_banner.introduction": "{domain} is part of the decentralized social network powered by {mastodon}.",
+  "server_banner.learn_more": "Discere plura",
+  "server_banner.server_stats": "Server stats:",
+  "sign_in_banner.create_account": "Create account",
+  "sign_in_banner.sign_in": "Sign in",
+  "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
+  "status.admin_status": "Open this status in the moderation interface",
+  "status.block": "Impedire @{name}",
+  "status.bookmark": "Signa paginaris",
+  "status.cancel_reblog_private": "Unboost",
+  "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
+  "status.delete": "Oblitterare",
+  "status.detailed_status": "Detailed conversation view",
+  "status.direct": "Direct message @{name}",
+  "status.edit": "Recolere",
+  "status.edited": "Recultum {date}",
+  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.embed": "Embed",
+  "status.favourite": "Favourite",
+  "status.filter": "Filter this post",
+  "status.filtered": "Filtered",
+  "status.hide": "Hide post",
+  "status.history.created": "{name} created {date}",
+  "status.history.edited": "{name} edited {date}",
+  "status.load_more": "Load more",
+  "status.media_hidden": "Media hidden",
+  "status.mention": "Mention @{name}",
+  "status.more": "More",
+  "status.mute": "Mute @{name}",
+  "status.mute_conversation": "Mute conversation",
+  "status.open": "Expand this status",
+  "status.pin": "Pin on profile",
+  "status.pinned": "Pinned post",
+  "status.read_more": "Read more",
+  "status.reblog": "Boost",
+  "status.reblog_private": "Boost with original visibility",
+  "status.reblogged_by": "{name} boosted",
+  "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.",
+  "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
+  "status.replied_to": "Replied to {name}",
+  "status.reply": "Reply",
+  "status.replyAll": "Reply to thread",
+  "status.report": "Report @{name}",
+  "status.sensitive_warning": "Sensitive content",
+  "status.share": "Share",
+  "status.show_filter_reason": "Show anyway",
+  "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_original": "Show original",
+  "status.translate": "Translate",
+  "status.translated_from_with": "Translated from {lang} using {provider}",
+  "status.uncached_media_warning": "Not available",
+  "status.unmute_conversation": "Unmute conversation",
+  "status.unpin": "Unpin from profile",
+  "subscribed_languages.lead": "Only posts in selected languages will appear on your home and list timelines after the change. Select none to receive posts in all languages.",
+  "subscribed_languages.save": "Save changes",
+  "subscribed_languages.target": "Change subscribed languages for {target}",
+  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.header": "You might be interested in…",
+  "tabs_bar.federated_timeline": "Foederatum",
+  "tabs_bar.home": "Domi",
+  "tabs_bar.local_timeline": "Local",
+  "tabs_bar.notifications": "Notifications",
+  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
+  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
+  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
+  "time_remaining.moments": "Moments remaining",
+  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Contributa pristina",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} in the past {days, plural, one {day} other {{days} days}}",
+  "trends.trending_now": "Trending now",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "units.short.billion": "{count}B",
+  "units.short.million": "{count}M",
+  "units.short.thousand": "{count}K",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add images, a video or an audio file",
+  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people who are hard of hearing",
+  "upload_form.description": "Describe for people who are blind or have low vision",
+  "upload_form.description_missing": "No description added",
+  "upload_form.edit": "Recolere",
+  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.undo": "Oblitterare",
+  "upload_form.video_description": "Describe for people who are deaf, hard of hearing, blind or have low vision",
+  "upload_modal.analyzing_picture": "Analyzing picture…",
+  "upload_modal.apply": "Apply",
+  "upload_modal.applying": "Applying…",
+  "upload_modal.choose_image": "Choose image",
+  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+  "upload_modal.detect_text": "Detect text from picture",
+  "upload_modal.edit_media": "Edit media",
+  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
+  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_progress.label": "Uploading…",
+  "upload_progress.processing": "Processing…",
+  "video.close": "Close video",
+  "video.download": "Download file",
+  "video.exit_fullscreen": "Exit full screen",
+  "video.expand": "Expand video",
+  "video.fullscreen": "Full screen",
+  "video.hide": "Hide video",
+  "video.mute": "Confutare soni",
+  "video.pause": "Pause",
+  "video.play": "Play",
+  "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index bff4aaedd..1d4923254 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Toots and replies",
   "account.report": "Pranešti apie @{name}",
   "account.requested": "Awaiting approval",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "locked",
   "compose_form.placeholder": "What is on your mind?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 3949654f5..a593ab501 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -1,19 +1,19 @@
 {
   "about.blocks": "Moderētie serveri",
   "about.contact": "Kontakts:",
-  "about.disclaimer": "Mastodon ir bezmaksas atvērtā pirmkoda programmatūra un Mastodon gGmbH preču zīme.",
+  "about.disclaimer": "Mastodon ir bezmaksas atklātā pirmkoda programmatūra un Mastodon gGmbH preču zīme.",
   "about.domain_blocks.no_reason_available": "Iemesls nav norādīts",
   "about.domain_blocks.preamble": "Mastodon parasti ļauj apskatīt saturu un mijiedarboties ar lietotājiem no jebkura cita federācijas servera. Šie ir izņēmumi, kas veikti šajā konkrētajā serverī.",
   "about.domain_blocks.silenced.explanation": "Parasti tu neredzēsi profilus un saturu no šī servera, ja vien tu nepārprotami izvēlēsies to pārskatīt vai sekot.",
-  "about.domain_blocks.silenced.title": "Ierobežotās",
+  "about.domain_blocks.silenced.title": "Ierobežotie",
   "about.domain_blocks.suspended.explanation": "Nekādi dati no šī servera netiks apstrādāti, uzglabāti vai apmainīti, padarot neiespējamu mijiedarbību vai saziņu ar lietotājiem no šī servera.",
   "about.domain_blocks.suspended.title": "Apturētie",
   "about.not_available": "Šī informācija šajā serverī nav bijusi pieejama.",
-  "about.powered_by": "Decentralizētu sociālo multividi nodrošina {mastodon}",
+  "about.powered_by": "Decentralizētu sociālo tīklu nodrošina {mastodon}",
   "about.rules": "Servera noteikumi",
   "account.account_note_header": "Piezīme",
   "account.add_or_remove_from_list": "Pievienot vai noņemt no saraksta",
-  "account.badges.bot": "Bots",
+  "account.badges.bot": "Robots",
   "account.badges.group": "Grupa",
   "account.block": "Bloķēt @{name}",
   "account.block_domain": "Bloķēt domēnu {domain}",
@@ -34,14 +34,14 @@
   "account.followers.empty": "Šim lietotājam vēl nav sekotāju.",
   "account.followers_counter": "{count, plural, zero {{counter} sekotāju} one {{counter} sekotājs} other {{counter} sekotāji}}",
   "account.following": "Seko",
-  "account.following_counter": "{count, plural, one {{counter} Sekojamais} other {{counter} Sekojamie}}",
+  "account.following_counter": "{count, plural, one {{counter} sekojamais} other {{counter} sekojamie}}",
   "account.follows.empty": "Šis lietotājs pagaidām nevienam neseko.",
   "account.follows_you": "Seko tev",
   "account.go_to_profile": "Doties uz profilu",
-  "account.hide_reblogs": "Paslēpt pastiprinātos ierakstus no lietotāja @{name}",
+  "account.hide_reblogs": "Slēpt @{name} izceltas ziņas",
   "account.joined_short": "Pievienojās",
   "account.languages": "Mainīt abonētās valodas",
-  "account.link_verified_on": "Šīs saites piederība ir pārbaudīta {date}",
+  "account.link_verified_on": "Šīs saites piederība tika pārbaudīta {date}",
   "account.locked_info": "Šī konta privātuma statuss ir slēgts. Īpašnieks izskatīs, kurš viņam drīkst sekot.",
   "account.media": "Multivide",
   "account.mention": "Pieminēt @{name}",
@@ -53,11 +53,12 @@
   "account.posts": "Ieraksti",
   "account.posts_with_replies": "Ieraksti un atbildes",
   "account.report": "Sūdzēties par @{name}",
-  "account.requested": "Gaidām apstiprinājumu. Nospied lai atceltu sekošanas pieparasījumu",
+  "account.requested": "Gaida apstiprinājumu. Nospied, lai atceltu sekošanas pieparasījumu",
+  "account.requested_follow": "{name} nosūtīja tev sekošanas pieprasījumu",
   "account.share": "Dalīties ar @{name} profilu",
   "account.show_reblogs": "Parādīt @{name} pastiprinātos ierakstus",
   "account.statuses_counter": "{count, plural, zero {{counter} ierakstu} one {{counter} ieraksts} other {{counter} ieraksti}}",
-  "account.unblock": "Atbloķēt lietotāju @{name}",
+  "account.unblock": "Atbloķēt @{name}",
   "account.unblock_domain": "Atbloķēt domēnu {domain}",
   "account.unblock_short": "Atbloķēt",
   "account.unendorse": "Neizcelt profilā",
@@ -65,7 +66,7 @@
   "account.unmute": "Noņemt apklusinājumu @{name}",
   "account.unmute_notifications": "Rādīt paziņojumus no @{name}",
   "account.unmute_short": "Noņemt apklusinājumu",
-  "account_note.placeholder": "Noklikšķiniet, lai pievienotu piezīmi",
+  "account_note.placeholder": "Noklikšķini, lai pievienotu piezīmi",
   "admin.dashboard.daily_retention": "Lietotāju saglabāšanas rādītājs dienā pēc reģistrēšanās",
   "admin.dashboard.monthly_retention": "Lietotāju saglabāšanas rādītājs mēnesī pēc reģistrēšanās",
   "admin.dashboard.retention.average": "Vidēji",
@@ -127,8 +128,8 @@
   "compose.language.search": "Meklēt valodas...",
   "compose_form.direct_message_warning_learn_more": "Uzzināt vairāk",
   "compose_form.encryption_warning": "Ziņas vietnē Mastodon nav pilnībā šifrētas. Nedalies ar sensitīvu informāciju caur Mastodon.",
-  "compose_form.hashtag_warning": "Šo ziņu nebūs iespējams atrast tēmturos, jo tā ir nerindota. Tēmturos ir redzamas tikai publiskas ziņas.",
-  "compose_form.lock_disclaimer": "Tavs konts nav {locked}. Ikviens var Tev sekot lai apskatītu tikai sekotājiem paredzētos ziņojumus.",
+  "compose_form.hashtag_warning": "Šī ziņa netiks norādīta zem nevienas atsauces, jo tā nav publiska. Tikai publiskās ziņās var meklēt pēc atsauces.",
+  "compose_form.lock_disclaimer": "Tavs konts nav {locked}. Ikviens var tev piesekot un redzēt tikai sekotājiem paredzētos ziņojumus.",
   "compose_form.lock_disclaimer.lock": "slēgts",
   "compose_form.placeholder": "Kas tev padomā?",
   "compose_form.poll.add_option": "Pievienot izvēli",
@@ -206,7 +207,7 @@
   "emoji_button.search": "Meklēt...",
   "emoji_button.search_results": "Meklēšanas rezultāti",
   "emoji_button.symbols": "Simboli",
-  "emoji_button.travel": "Ceļošana & Vietas",
+  "emoji_button.travel": "Ceļošana un vietas",
   "empty_column.account_suspended": "Konta darbība ir apturēta",
   "empty_column.account_timeline": "Šeit ziņojumu nav!",
   "empty_column.account_unavailable": "Profils nav pieejams",
@@ -216,10 +217,10 @@
   "empty_column.direct": "Pašreiz tev nav privātu ziņu. Tiklīdz tādu nosūtīsi vai saņemsi, tās parādīsies šeit.",
   "empty_column.domain_blocks": "Vēl nav neviena bloķēta domēna.",
   "empty_column.explore_statuses": "Pašlaik nekā aktuāla nav. Pārbaudi vēlāk!",
-  "empty_column.favourited_statuses": "Patreiz tev nav neviena izceltā ieraksta. Kad kādu izcelsi, tas parādīsies šeit.",
+  "empty_column.favourited_statuses": "Pašreiz tev nav neviena izceltā ieraksta. Kad kādu izcelsi, tas parādīsies šeit.",
   "empty_column.favourites": "Neviens šo ziņojumu vel nav izcēlis. Kad kāds to izdarīs, tas parādīsies šeit.",
   "empty_column.follow_recommendations": "Neizdevās ģenerēt tev pielāgotus ieteikumus. Vari mēģināt izmantot meklēšanu, lai meklētu cilvēkus, kurus tu varētu pazīt, vai izpētīt populārākos tēmturus.",
-  "empty_column.follow_requests": "Šobrīd neviens nav pieteicies tev sekot. Kad kāds pieteiksies tas parādīsies šeit.",
+  "empty_column.follow_requests": "Šobrīd tev nav sekošanas pieprasījumu. Kad kāds pieteiksies tev sekot, pieprasījums parādīsies šeit.",
   "empty_column.hashtag": "Ar šo tēmturi nekas nav atrodams.",
   "empty_column.home": "Tava mājas laika līnija ir tukša! Lai to aizpildītu, pieseko vairāk cilvēkiem. {suggestions}",
   "empty_column.home.suggestions": "Apskatīt dažus ieteikumus",
@@ -230,16 +231,20 @@
   "empty_column.public": "Šeit vēl nekā nav! Ieraksti ko publiski vai pieseko lietotājiem no citiem serveriem",
   "error.unexpected_crash.explanation": "Koda kļūdas vai pārlūkprogrammas saderības problēmas dēļ šo lapu nevarēja parādīt pareizi.",
   "error.unexpected_crash.explanation_addons": "Šo lapu nevarēja parādīt pareizi. Šo kļūdu, iespējams, izraisīja pārlūkprogrammas papildinājums vai automātiskās tulkošanas rīki.",
-  "error.unexpected_crash.next_steps": "Mēģini atsvaidzināt lapu. Ja tas nepalīdz, iespējams, varēsi lietot Mastodon, izmantojot citu pārlūkprogrammu vai vietējo lietotni.",
-  "error.unexpected_crash.next_steps_addons": "Mēģini tos atspējot un atsvaidzināt lapu. Ja tas nepalīdz, iespējams, varēsi lietot Mastodon, izmantojot citu pārlūkprogrammu vai vietējo lietotni.",
+  "error.unexpected_crash.next_steps": "Mēģini atsvaidzināt lapu. Ja tas nepalīdz, iespējams, varēsi lietot Mastodon, izmantojot citu pārlūkprogrammu vai lietotni.",
+  "error.unexpected_crash.next_steps_addons": "Mēģini tos atspējot un atsvaidzināt lapu. Ja tas nepalīdz, iespējams, varēsi lietot Mastodon, izmantojot citu pārlūkprogrammu vai lietotni.",
   "errors.unexpected_crash.copy_stacktrace": "Kopēt stacktrace uz starpliktuvi",
   "errors.unexpected_crash.report_issue": "Ziņot par problēmu",
   "explore.search_results": "Meklēšanas rezultāti",
+  "explore.suggested_follows": "Tev",
   "explore.title": "Pārlūkot",
+  "explore.trending_links": "Jaunumi",
+  "explore.trending_statuses": "Ziņas",
+  "explore.trending_tags": "Tēmturi",
   "filter_modal.added.context_mismatch_explanation": "Šī filtra kategorija neattiecas uz kontekstu, kurā esi piekļuvis šai ziņai. Ja vēlies, lai ziņa tiktu filtrēta arī šajā kontekstā, tev būs jārediģē filtrs.",
   "filter_modal.added.context_mismatch_title": "Konteksta neatbilstība!",
   "filter_modal.added.expired_explanation": "Šai filtra kategorijai ir beidzies derīguma termiņš. Lai to lietotu, tev būs jāmaina derīguma termiņš.",
-  "filter_modal.added.expired_title": "Filtrs beidzies!",
+  "filter_modal.added.expired_title": "Filtra termiņš beidzies!",
   "filter_modal.added.review_and_configure": "Lai pārskatītu un tālāk konfigurētu šo filtru kategoriju, dodies uz {settings_link}.",
   "filter_modal.added.review_and_configure_title": "Filtra iestatījumi",
   "filter_modal.added.settings_link": "iestatījumu lapu",
@@ -281,11 +286,11 @@
   "home.column_settings.basic": "Pamata",
   "home.column_settings.show_reblogs": "Rādīt pastiprinātos ierakstus",
   "home.column_settings.show_replies": "Rādīt atbildes",
-  "home.hide_announcements": "Slēpt paziņojumus",
-  "home.show_announcements": "Rādīt paziņojumus",
+  "home.hide_announcements": "Slēpt anonsus",
+  "home.show_announcements": "Rādīt anonsus",
   "interaction_modal.description.favourite": "Ar Mastodon kontu tu vari pievienot šo ziņu izlasei, lai informētu autoru, ka to novērtē, un saglabātu to vēlākai lasīšanai.",
   "interaction_modal.description.follow": "Ar Mastodon kontu tu vari sekot {name}, lai saņemtu viņu ziņas savā mājas plūsmā.",
-  "interaction_modal.description.reblog": "Ar Mastodon kontu tu vari pastiprināt šo ierakstu, lai kopīgotu to ar saviem sekotājiem.",
+  "interaction_modal.description.reblog": "Izmantojot kontu Mastodon, tu vari izcelt šo ziņu, lai kopīgotu to ar saviem sekotājiem.",
   "interaction_modal.description.reply": "Ar Mastodon kontu tu vari atbildēt uz šo ziņu.",
   "interaction_modal.on_another_server": "Citā serverī",
   "interaction_modal.on_this_server": "Šajā serverī",
@@ -305,7 +310,7 @@
   "keyboard_shortcuts.compose": "Fokusēt veidojamā teksta lauku",
   "keyboard_shortcuts.description": "Apraksts",
   "keyboard_shortcuts.direct": "lai atvērtu privāto ziņojumu kolonnu",
-  "keyboard_shortcuts.down": "Pārvietot sarakstā uz leju",
+  "keyboard_shortcuts.down": "Pārvietoties lejup sarakstā",
   "keyboard_shortcuts.enter": "Atvērt ziņu",
   "keyboard_shortcuts.favourite": "Pievienot izlasei",
   "keyboard_shortcuts.favourites": "Atvērt izlašu sarakstu",
@@ -331,7 +336,7 @@
   "keyboard_shortcuts.toggle_sensitivity": "Rādīt/slēpt multividi",
   "keyboard_shortcuts.toot": "Sākt jaunu ziņu",
   "keyboard_shortcuts.unfocus": "Atfokusēt veidojamā teksta/meklēšanas lauku",
-  "keyboard_shortcuts.up": "Pārvietot sarakstā uz augšu",
+  "keyboard_shortcuts.up": "Pārvietoties augšup sarakstā",
   "lightbox.close": "Aizvērt",
   "lightbox.compress": "Saspiest attēla skata lodziņu",
   "lightbox.expand": "Izvērst attēla skata lodziņu",
@@ -408,7 +413,7 @@
   "notifications.column_settings.follow": "Jauni sekotāji:",
   "notifications.column_settings.follow_request": "Jauni sekošanas pieprasījumi:",
   "notifications.column_settings.mention": "Pieminējumi:",
-  "notifications.column_settings.poll": "Aptaujas rezultāti:",
+  "notifications.column_settings.poll": "Aptauju rezultāti:",
   "notifications.column_settings.push": "Uznirstošie paziņojumi",
   "notifications.column_settings.reblog": "Pastiprinātie ieraksti:",
   "notifications.column_settings.show": "Rādīt kolonnā",
@@ -420,18 +425,18 @@
   "notifications.filter.all": "Visi",
   "notifications.filter.boosts": "Pastiprinātie ieraksti",
   "notifications.filter.favourites": "Izlases",
-  "notifications.filter.follows": "Seko",
+  "notifications.filter.follows": "Sekošana",
   "notifications.filter.mentions": "Pieminējumi",
-  "notifications.filter.polls": "Aptaujas rezultāti",
+  "notifications.filter.polls": "Aptauju rezultāti",
   "notifications.filter.statuses": "Jaunumi no cilvēkiem, kuriem tu seko",
   "notifications.grant_permission": "Piešķirt atļauju.",
   "notifications.group": "{count} paziņojumi",
-  "notifications.mark_as_read": "Atzīmēt katru paziņojumu kā izlasītu",
+  "notifications.mark_as_read": "Atzīmēt visus paziņojumus kā izlasītus",
   "notifications.permission_denied": "Darbvirsmas paziņojumi nav pieejami, jo iepriekš tika noraidīts pārlūka atļauju pieprasījums",
   "notifications.permission_denied_alert": "Darbvirsmas paziņojumus nevar iespējot, jo pārlūkprogrammai atļauja tika iepriekš atteikta",
   "notifications.permission_required": "Darbvirsmas paziņojumi nav pieejami, jo nav piešķirta nepieciešamā atļauja.",
   "notifications_permission_banner.enable": "Iespējot darbvirsmas paziņojumus",
-  "notifications_permission_banner.how_to_control": "Lai saņemtu paziņojumus, kad Mastodon nav atvērts, iespējo darbvirsmas paziņojumus. Vari precīzi kontrolēt, kāda veida mijiedarbības ģenerē darbvirsmas paziņojumus, izmantojot augstāk redzamo pogu {icon}, kad tie būs iespējoti.",
+  "notifications_permission_banner.how_to_control": "Lai saņemtu paziņojumus, kad Mastodon nav atvērts, iespējo darbvirsmas paziņojumus. Vari precīzi kontrolēt, kāda veida mijiedarbības rada darbvirsmas paziņojumus, izmantojot augstāk redzamo pogu {icon}, kad tie būs iespējoti.",
   "notifications_permission_banner.title": "Nekad nepalaid neko garām",
   "picture_in_picture.restore": "Novietot atpakaļ",
   "poll.closed": "Pabeigta",
@@ -448,9 +453,9 @@
   "privacy.direct.short": "Tikai minētie cilvēki",
   "privacy.private.long": "Redzama tikai sekotājiem",
   "privacy.private.short": "Tikai sekotājiem",
-  "privacy.public.long": "Redzama visiem",
+  "privacy.public.long": "Redzams visiem",
   "privacy.public.short": "Publiska",
-  "privacy.unlisted.long": "Redzama visiem, bet izslēgta no satura atklāšanas funkcijām",
+  "privacy.unlisted.long": "Redzams visiem, bet izslēgts no satura atklāšanas funkcijām",
   "privacy.unlisted.short": "Nerindota",
   "privacy_policy.last_updated": "Pēdējo reizi atjaunināta {date}",
   "privacy_policy.title": "Privātuma politika",
@@ -477,7 +482,7 @@
   "report.category.subtitle": "Izvēlieties labāko atbilstību",
   "report.category.title": "Pastāsti mums, kas notiek ar šo {type}",
   "report.category.title_account": "profilu",
-  "report.category.title_status": "ierakstu",
+  "report.category.title_status": "ziņu",
   "report.close": "Darīts",
   "report.comment.title": "Vai, tavuprāt, mums vēl būtu kas jāzina?",
   "report.forward": "Pārsūtīt {target}",
@@ -487,7 +492,7 @@
   "report.next": "Tālāk",
   "report.placeholder": "Papildu komentāri",
   "report.reasons.dislike": "Man tas nepatīk",
-  "report.reasons.dislike_description": "Tas nav kaut kas, ko tu vēlies redzēt",
+  "report.reasons.dislike_description": "Tas ir kaut kas, ko tu nevēlies redzēt",
   "report.reasons.other": "Tas ir kaut kas cits",
   "report.reasons.other_description": "Šī sūdzība neatbilst pārējām kategorijām",
   "report.reasons.spam": "Tas ir spams",
@@ -497,16 +502,16 @@
   "report.rules.subtitle": "Atlasi visus atbilstošos",
   "report.rules.title": "Kuri noteikumi tiek pārkāpti?",
   "report.statuses.subtitle": "Atlasi visus atbilstošos",
-  "report.statuses.title": "Vai ir kādas ziņas, kas atbalsta šo sūdzību?",
+  "report.statuses.title": "Vai ir kādi ieraksti, kas atbalsta šo sūdzību?",
   "report.submit": "Iesniegt",
   "report.target": "Sūdzība par {target}",
-  "report.thanks.take_action": "Tālāk ir norādītas iespējas, kā kontrolēt Mastodon redzamo saturu:",
+  "report.thanks.take_action": "Vari veikt šīs darbības, lai kontrolētu Mastodon redzamo saturu:",
   "report.thanks.take_action_actionable": "Kamēr mēs to izskatām, tu vari veikt darbības pret @{name}:",
   "report.thanks.title": "Vai nevēlies to redzēt?",
   "report.thanks.title_actionable": "Paldies, ka ziņoji, mēs to izskatīsim.",
-  "report.unfollow": "Pārtraukt sekošanu @{name}",
+  "report.unfollow": "Pārtraukt sekot @{name}",
   "report.unfollow_explanation": "Tu seko šim kontam. Lai vairs neredzētu viņu ziņas savā mājas plūsmā, pārtrauc viņiem sekot.",
-  "report_notification.attached_statuses": "{count, plural, zero {Pievienota {count} ierakstu} one {Pievienots {count} ieraksts} other {Pievienoti {count} ieraksti}}",
+  "report_notification.attached_statuses": "{count, plural, one {Pievienots {count} ieraksts} other {Pievienoti {count} ieraksti}}",
   "report_notification.categories.other": "Cita",
   "report_notification.categories.spam": "Spams",
   "report_notification.categories.violation": "Noteikumu pārkāpums",
@@ -537,11 +542,12 @@
   "sign_in_banner.sign_in": "Pierakstīties",
   "sign_in_banner.text": "Pieraksties, lai sekotu profiliem vai atsaucēm, pievienotu ziņas izlasei, kopīgotu ziņas un atbildētu uz tām vai mijiedarbotos no sava konta citā serverī.",
   "status.admin_account": "Atvērt @{name} moderēšanas saskarni",
+  "status.admin_domain": "Atvērt {domain} moderēšanas saskarni",
   "status.admin_status": "Atvērt šo ziņu moderācijas saskarnē",
   "status.block": "Bloķēt @{name}",
   "status.bookmark": "Grāmatzīme",
-  "status.cancel_reblog_private": "Noņemt pastiprinājumu",
-  "status.cannot_reblog": "Nevar pastiprināt šo ierakstu",
+  "status.cancel_reblog_private": "Neizcelt",
+  "status.cannot_reblog": "Šo ziņu nevar izcelt",
   "status.copy": "Kopēt saiti uz ziņu",
   "status.delete": "Dzēst",
   "status.detailed_status": "Detalizēts sarunas skats",
@@ -557,14 +563,14 @@
   "status.history.created": "{name} izveidoja {date}",
   "status.history.edited": "{name} rediģēja {date}",
   "status.load_more": "Ielādēt vairāk",
-  "status.media_hidden": "Medijs ir paslēpts",
+  "status.media_hidden": "Multivides ir paslēpts",
   "status.mention": "Pieminēt @{name}",
   "status.more": "Vairāk",
   "status.mute": "Apklusināt @{name}",
   "status.mute_conversation": "Apklusināt sarunu",
   "status.open": "Paplašināt šo ziņu",
   "status.pin": "Piespraust profilam",
-  "status.pinned": "Piespraustā ziņa",
+  "status.pinned": "Piespraustais ieraksts",
   "status.read_more": "Lasīt vairāk",
   "status.reblog": "Pastiprināt",
   "status.reblog_private": "Pastiprināt, nemainot redzamību",
@@ -574,7 +580,7 @@
   "status.remove_bookmark": "Noņemt grāmatzīmi",
   "status.replied_to": "Atbildēja {name}",
   "status.reply": "Atbildēt",
-  "status.replyAll": "Atbildēt uz tematu",
+  "status.replyAll": "Atbildēt uz pavedienu",
   "status.report": "Sūdzēties par @{name}",
   "status.sensitive_warning": "Sensitīvs saturs",
   "status.share": "Kopīgot",
@@ -588,12 +594,12 @@
   "status.translated_from_with": "Tulkots no {lang}, izmantojot {provider}",
   "status.uncached_media_warning": "Nav pieejams",
   "status.unmute_conversation": "Noņemt sarunas apklusinājumu",
-  "status.unpin": "Noņemt no profila",
+  "status.unpin": "Noņemt profila piespraudumu",
   "subscribed_languages.lead": "Pēc izmaiņu veikšanas tavā mājas un sarakstu laika līnijā tiks rādītas tikai ziņas atlasītajās valodās. Neatlasi nevienu, lai saņemtu ziņas visās valodās.",
   "subscribed_languages.save": "Saglabāt izmaiņas",
   "subscribed_languages.target": "Mainīt abonētās valodas priekš {target}",
   "suggestions.dismiss": "Noraidīt ieteikumu",
-  "suggestions.header": "Jūs varētu interesēt arī…",
+  "suggestions.header": "Tevi varētu interesēt arī…",
   "tabs_bar.federated_timeline": "Apvienotā",
   "tabs_bar.home": "Sākums",
   "tabs_bar.local_timeline": "Vietējā",
@@ -630,7 +636,7 @@
   "upload_modal.choose_image": "Izvēlēties attēlu",
   "upload_modal.description_placeholder": "Raibais runcis Rīgā ratu rumbā rūc",
   "upload_modal.detect_text": "Noteikt tekstu no attēla",
-  "upload_modal.edit_media": "Rediģēt mediju",
+  "upload_modal.edit_media": "Rediģēt multividi",
   "upload_modal.hint": "Noklikšķini vai velc apli priekšskatījumā, lai izvēlētos fokusa punktu, kas vienmēr būs redzams visos sīktēlos.",
   "upload_modal.preparing_ocr": "Sagatavo OCR…",
   "upload_modal.preview_label": "Priekšskatīt ({ratio})",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index 2acf78bbc..62be86557 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Тутови и реплики",
   "account.report": "Пријави @{name}",
   "account.requested": "Се чека одобрување. Кликни за да одкажиш барање за следење",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Сподели @{name} профил",
   "account.show_reblogs": "Прикажи бустови од @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Научи повеќе",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "заклучен",
   "compose_form.placeholder": "Што имате на ум?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Пријавете проблем",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index a936c8dba..ee33be4a4 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "പോസ്റ്റുകളും മറുപടികളും",
   "account.report": "റിപ്പോർട്ട് ചെയ്യുക @{name}",
   "account.requested": "അനുവാദത്തിനായി കാത്തിരിക്കുന്നു. പിന്തുടരാനുള്ള അപേക്ഷ റദ്ദാക്കുവാൻ ഞെക്കുക",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "@{name} ന്റെ പ്രൊഫൈൽ പങ്കിടുക",
   "account.show_reblogs": "@{name} ൽ നിന്നുള്ള ബൂസ്റ്റുകൾ കാണിക്കുക",
   "account.statuses_counter": "{count, plural, one {{counter} ടൂട്ട്} other {{counter} ടൂട്ടുകൾ}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "ഭാഷകൾ തിരയുക...",
   "compose_form.direct_message_warning_learn_more": "കൂടുതൽ പഠിക്കുക",
   "compose_form.encryption_warning": "Mastodon-ലെ പോസ്റ്റുകൾ എൻഡ്-ടു-എൻഡ് എൻക്രിപ്റ്റ് ചെയ്തവയല്ല. അതിനാൽ Mastodon-ൽ പ്രധാനപ്പെട്ട വിവരങ്ങളൊന്നും പങ്കിടരുത്.",
-  "compose_form.hashtag_warning": "ഈ ടൂട്ട് പട്ടികയിൽ ഇല്ലാത്തതിനാൽ ഒരു ചർച്ചാവിഷയത്തിന്റെ പട്ടികയിലും പെടുകയില്ല. പരസ്യമായ ടൂട്ടുകൾ മാത്രമേ ചർച്ചാവിഷയം അടിസ്ഥാനമാക്കി തിരയുവാൻ സാധിക്കുകയുള്ളു.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "ലോക്കുചെയ്തു",
   "compose_form.placeholder": "നിങ്ങളുടെ മനസ്സിൽ എന്താണ്?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "പ്രശ്നം അറിയിക്കുക",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "പര്യവേക്ഷണം നടത്തുക",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "@{name} -നെ തടയുക",
   "status.bookmark": "ബുക്ക്മാർക്ക്",
@@ -553,7 +559,7 @@
   "status.favourite": "പ്രിയപ്പെട്ടത്",
   "status.filter": "Filter this post",
   "status.filtered": "ഫിൽട്ടർ ചെയ്‌തു",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "കൂടുതൽ ലോഡു ചെയ്യുക",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index 65a4cd8af..c0028e2d4 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -1,81 +1,82 @@
 {
-  "about.blocks": "Moderated servers",
-  "about.contact": "Contact:",
-  "about.disclaimer": "Mastodon is free, open-source software, and a trademark of Mastodon gGmbH.",
-  "about.domain_blocks.no_reason_available": "Reason not available",
-  "about.domain_blocks.preamble": "Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server.",
-  "about.domain_blocks.silenced.explanation": "You will generally not see profiles and content from this server, unless you explicitly look it up or opt into it by following.",
-  "about.domain_blocks.silenced.title": "Limited",
-  "about.domain_blocks.suspended.explanation": "No data from this server will be processed, stored or exchanged, making any interaction or communication with users from this server impossible.",
-  "about.domain_blocks.suspended.title": "Suspended",
-  "about.not_available": "This information has not been made available on this server.",
-  "about.powered_by": "Decentralized social media powered by {mastodon}",
-  "about.rules": "Server rules",
-  "account.account_note_header": "Note",
+  "about.blocks": "नियंत्रित सर्व्हर",
+  "about.contact": "संपर्क:",
+  "about.disclaimer": "Mastodon हे विनामूल्य, मुक्त-स्रोत सॉफ्टवेअर आहे आणि Mastodon gGmbH चे ट्रेडमार्क आहे.",
+  "about.domain_blocks.no_reason_available": "कारण उपलब्ध नाही",
+  "about.domain_blocks.preamble": "मास्टोडॉन तुम्हाला सामान्यत: फेडिव्हर्समधील इतर कोणत्याही सर्व्हरवरील वापरकर्त्यांवरील मजकूर पाहण्याची आणि त्यांच्याशी संवाद साधण्याची परवानगी देते. या विशिष्ट सर्व्हरवर केलेले हे अपवाद आहेत.",
+  "about.domain_blocks.silenced.explanation": "जोपर्यंत तुम्ही ते स्पष्टपणे शोधत नाही किंवा अनुसरण करून निवड करत नाही तोपर्यंत तुम्हाला या सर्व्हरवरील प्रोफाइल आणि मजकूर दिसणार नाही.",
+  "about.domain_blocks.silenced.title": "मर्यादित",
+  "about.domain_blocks.suspended.explanation": "या सर्व्हरवरील कोणत्याही डेटावर प्रक्रिया, संचयित किंवा देवाणघेवाण केली जाणार नाही, ज्यामुळे या सर्व्हरवरील वापरकर्त्यांशी कोणताही संवाद किंवा परस्पर क्रिया अशक्य होईल.",
+  "about.domain_blocks.suspended.title": "निलंबित",
+  "about.not_available": "ही माहिती या सर्व्हरवर उपलब्ध करून देण्यात आलेली नाही.",
+  "about.powered_by": "{mastodon} द्वारा समर्थित विकेंद्रित सोशल मीडिया",
+  "about.rules": "सर्व्हर नियम",
+  "account.account_note_header": "नोंद",
   "account.add_or_remove_from_list": "यादीत घाला किंवा यादीतून काढून टाका",
   "account.badges.bot": "स्वयंचलित खाते",
-  "account.badges.group": "Group",
+  "account.badges.group": "गट",
   "account.block": "@{name} यांना ब्लॉक करा",
   "account.block_domain": "{domain} पासून सर्व लपवा",
   "account.blocked": "ब्लॉक केले आहे",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
-  "account.cancel_follow_request": "Withdraw follow request",
+  "account.browse_more_on_origin_server": "मूळ प्रोफाइलवर अधिक ब्राउझ करा",
+  "account.cancel_follow_request": "फॉलो विनंती मागे घ्या",
   "account.direct": "थेट संदेश @{name}",
-  "account.disable_notifications": "Stop notifying me when @{name} posts",
+  "account.disable_notifications": "जेव्हा @{name} पोस्ट करतात तेव्हा मला सूचित करणे थांबवा",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "प्रोफाइल एडिट करा",
-  "account.enable_notifications": "Notify me when @{name} posts",
-  "account.endorse": "Feature on profile",
-  "account.featured_tags.last_status_at": "Last post on {date}",
-  "account.featured_tags.last_status_never": "No posts",
-  "account.featured_tags.title": "{name}'s featured hashtags",
+  "account.enable_notifications": "जेव्हा @{name} पोस्ट करते तेव्हा मला सूचित करा",
+  "account.endorse": "प्रोफाइलवरील वैशिष्ट्य",
+  "account.featured_tags.last_status_at": "शेवटचे पोस्ट {date} रोजी",
+  "account.featured_tags.last_status_never": "पोस्ट नाहीत",
+  "account.featured_tags.title": "{name} चे वैशिष्ट्यीकृत हॅशटॅग",
   "account.follow": "अनुयायी व्हा",
   "account.followers": "अनुयायी",
   "account.followers.empty": "ह्या वापरकर्त्याचा आतापर्यंत कोणी अनुयायी नाही.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following": "Following",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.following": "अनुसरण",
+  "account.following_counter": "{count, plural, one {{counter} following} other {{counter} following}}",
   "account.follows.empty": "हा वापरकर्ता अजूनपर्यंत कोणाचा अनुयायी नाही.",
   "account.follows_you": "तुमचा अनुयायी आहे",
-  "account.go_to_profile": "Go to profile",
+  "account.go_to_profile": "प्रोफाइल वर जा",
   "account.hide_reblogs": "@{name} पासून सर्व बूस्ट लपवा",
-  "account.joined_short": "Joined",
-  "account.languages": "Change subscribed languages",
-  "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.joined_short": "सामील झाले",
+  "account.languages": "सदस्यता घेतलेल्या भाषा बदला",
+  "account.link_verified_on": "या लिंकची मालकी {date} रोजी तपासली गेली",
+  "account.locked_info": "या खात्याची गोपनीयता स्थिती लॉक वर सेट केली आहे. त्यांचे अनुसरण कोण करू शकते याचे मालक स्वतः पुनरावलोकन करतात.",
   "account.media": "दृक्‌‌श्राव्य मजकूर",
   "account.mention": "@{name} चा उल्लेख करा",
-  "account.moved_to": "{name} has indicated that their new account is now:",
+  "account.moved_to": "{name} ने सूचित केले आहे की त्यांचे नवीन खाते आता आहे:",
   "account.mute": "@{name} ला मूक कारा",
-  "account.mute_notifications": "Mute notifications from @{name}",
-  "account.muted": "Muted",
-  "account.open_original_page": "Open original page",
+  "account.mute_notifications": "@{name} कडील सूचना नि: शब्द करा",
+  "account.muted": "मौन",
+  "account.open_original_page": "मूळ पृष्ठ उघडा",
   "account.posts": "Toots",
   "account.posts_with_replies": "Toots and replies",
-  "account.report": "Report @{name}",
+  "account.report": "@{name} ची तक्रार करा",
   "account.requested": "Awaiting approval",
-  "account.share": "Share @{name}'s profile",
+  "account.requested_follow": "{name} has requested to follow you",
+  "account.share": "@{name} चे प्रोफाइल शेअर करा",
   "account.show_reblogs": "{name}चे सर्व बुस्ट्स दाखवा",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
   "account.unblock": "@{name} ला ब्लॉक करा",
   "account.unblock_domain": "उघड करा {domain}",
-  "account.unblock_short": "Unblock",
-  "account.unendorse": "Don't feature on profile",
+  "account.unblock_short": "अनब्लॉक करा",
+  "account.unendorse": "प्रोफाइलवर वैशिष्ट्य देऊ नका",
   "account.unfollow": "अनुयायी असणे थांबवा",
-  "account.unmute": "Unmute @{name}",
-  "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account.unmute_short": "Unmute",
+  "account.unmute": "@{name} अनम्यूट करा",
+  "account.unmute_notifications": "@{name} कडील सूचना अनम्यूट करा",
+  "account.unmute_short": "अनम्यूट करा",
   "account_note.placeholder": "Click to add a note",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
-  "admin.dashboard.retention.average": "Average",
-  "admin.dashboard.retention.cohort": "Sign-up month",
-  "admin.dashboard.retention.cohort_size": "New users",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
-  "alert.unexpected.message": "An unexpected error occurred.",
+  "admin.dashboard.daily_retention": "साइन अप केल्यानंतर दिवसा वापरकर्ता धारणा दर",
+  "admin.dashboard.monthly_retention": "साइन अप केल्यानंतर महिन्यानुसार वापरकर्ता धारणा दर",
+  "admin.dashboard.retention.average": "सरासरी",
+  "admin.dashboard.retention.cohort": "साइन-अप महिना",
+  "admin.dashboard.retention.cohort_size": "नवीन वापरकर्ता",
+  "alert.rate_limited.message": "कृपया {retry_time, time, medium} नंतर पुन्हा प्रयत्न करा.",
+  "alert.rate_limited.title": "दर मर्यादित",
+  "alert.unexpected.message": "एक अनपेक्षित त्रुटी आली.",
   "alert.unexpected.title": "अरेरे!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "घोषणा",
   "attachments_list.unprocessed": "(unprocessed)",
   "audio.hide": "Hide audio",
   "autosuggest_hashtag.per_week": "{count} प्रतिसप्ताह",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "अधिक जाणून घ्या",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "locked",
   "compose_form.placeholder": "आपल्या मनात काय आहे?",
@@ -162,8 +163,8 @@
   "confirmations.domain_block.confirm": "संपूर्ण डोमेन लपवा",
   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
   "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
-  "confirmations.mute.confirm": "Mute",
+  "confirmations.logout.message": "तुमची खात्री आहे की तुम्ही लॉग आउट करू इच्छिता?",
+  "confirmations.mute.confirm": "आवाज बंद करा",
   "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
   "confirmations.mute.message": "Are you sure you want to mute {name}?",
   "confirmations.redraft.confirm": "Delete & redraft",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -272,29 +277,29 @@
   "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_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.follow": "Follow hashtag",
-  "hashtag.unfollow": "Unfollow hashtag",
-  "home.column_settings.basic": "Basic",
-  "home.column_settings.show_reblogs": "Show boosts",
-  "home.column_settings.show_replies": "Show replies",
-  "home.hide_announcements": "Hide announcements",
-  "home.show_announcements": "Show announcements",
-  "interaction_modal.description.favourite": "With an account on Mastodon, you can favourite this post to let the author know you appreciate it and save it for later.",
-  "interaction_modal.description.follow": "With an account on Mastodon, you can follow {name} to receive their posts in your home feed.",
-  "interaction_modal.description.reblog": "With an account on Mastodon, you can boost this post to share it with your own followers.",
-  "interaction_modal.description.reply": "With an account on Mastodon, you can respond to this post.",
-  "interaction_modal.on_another_server": "On a different server",
-  "interaction_modal.on_this_server": "On this server",
-  "interaction_modal.other_server_instructions": "Copy and paste this URL into the search field of your favourite Mastodon app or the web interface of your Mastodon server.",
-  "interaction_modal.preamble": "Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don't have an account on this one.",
-  "interaction_modal.title.favourite": "Favourite {name}'s post",
-  "interaction_modal.title.follow": "Follow {name}",
-  "interaction_modal.title.reblog": "Boost {name}'s post",
-  "interaction_modal.title.reply": "Reply to {name}'s post",
+  "hashtag.follow": "हॅशटॅग फॉलो करा",
+  "hashtag.unfollow": "हॅशटॅग अनफॉलो करा",
+  "home.column_settings.basic": "मूळ",
+  "home.column_settings.show_reblogs": "बूस्ट दाखवा",
+  "home.column_settings.show_replies": "उत्तरे दाखवा",
+  "home.hide_announcements": "घोषणा लपवा",
+  "home.show_announcements": "घोषणा दाखवा",
+  "interaction_modal.description.favourite": "मॅस्टोडॉनवरील खात्यासह, तुम्ही हे पोस्ट आवडते म्हणून लेखकाला कळवून तुम्ही त्याचे कौतुक करू शकता आणि ते नंतरसाठी जतन करू शकता.",
+  "interaction_modal.description.follow": "मॅस्टोडॉन वरील खात्यासह, तुम्ही त्यांच्या पोस्ट तुमच्या होम फीडमध्ये प्राप्त करण्यासाठी {name} चे अनुसरण करू शकता.",
+  "interaction_modal.description.reblog": "मॅस्टोडॉन वरील खात्यासह, तुम्ही ही पोस्ट तुमच्या स्वतःच्या अनुयायांसह शेअर करण्यासाठी बूस्ट करू शकता.",
+  "interaction_modal.description.reply": "मॅस्टोडॉनवरील खात्यासह, तुम्ही या पोस्टला प्रतिसाद देऊ शकता.",
+  "interaction_modal.on_another_server": "वेगळ्या सर्व्हरवर",
+  "interaction_modal.on_this_server": "या सर्व्हरवर",
+  "interaction_modal.other_server_instructions": "तुमच्या आवडत्या मॅस्टोडॉन अँपच्या सर्च फिल्डमध्ये किंवा तुमच्या मॅस्टोडॉन सर्व्हरच्या वेब इंटरफेसमध्ये ही URL कॉपी आणि पेस्ट करा.",
+  "interaction_modal.preamble": "मास्टोडॉन विकेंद्रित असल्याने, तुमचे खाते नसेल तर तुम्ही दुसरे मॅस्टोडॉन सर्व्हर किंवा सुसंगत प्लॅटफॉर्मद्वारे होस्ट केलेले तुमचे विद्यमान खाते वापरू शकता.",
+  "interaction_modal.title.favourite": "आवडत्या {name} ची पोस्ट",
+  "interaction_modal.title.follow": "{name} चे अनुसरण करा",
+  "interaction_modal.title.reblog": "{name} ची पोस्ट बूस्ट करा",
+  "interaction_modal.title.reply": "{name} च्या पोस्टला उत्तर द्या",
   "intervals.full.days": "{number, plural, one {# day} other {# days}}",
   "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
   "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
@@ -303,8 +308,8 @@
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.description": "Description",
-  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.description": "वर्णन",
+  "keyboard_shortcuts.direct": "थेट संदेश स्तंभ उघडण्यासाठी",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
@@ -312,7 +317,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",
@@ -332,28 +337,28 @@
   "keyboard_shortcuts.toot": "to start a brand new toot",
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
-  "lightbox.close": "Close",
-  "lightbox.compress": "Compress image view box",
-  "lightbox.expand": "Expand image view box",
-  "lightbox.next": "Next",
-  "lightbox.previous": "Previous",
-  "limited_account_hint.action": "Show profile anyway",
-  "limited_account_hint.title": "This profile has been hidden by the moderators of {domain}.",
-  "lists.account.add": "Add to list",
-  "lists.account.remove": "Remove from list",
-  "lists.delete": "Delete list",
-  "lists.edit": "Edit list",
-  "lists.edit.submit": "Change title",
-  "lists.new.create": "Add list",
-  "lists.new.title_placeholder": "New list title",
-  "lists.replies_policy.followed": "Any followed user",
-  "lists.replies_policy.list": "Members of the list",
-  "lists.replies_policy.none": "No one",
-  "lists.replies_policy.title": "Show replies to:",
-  "lists.search": "Search among people you follow",
-  "lists.subheading": "Your lists",
+  "lightbox.close": "बंद करा",
+  "lightbox.compress": "प्रतिमा दृश्य बॉक्स कॉम्प्रेस करा",
+  "lightbox.expand": "प्रतिमा दृश्य बॉक्स विस्तृत करा",
+  "lightbox.next": "पुढे",
+  "lightbox.previous": "मागील",
+  "limited_account_hint.action": "तरीही प्रोफाइल दाखवा",
+  "limited_account_hint.title": "हे प्रोफाइल {domain} च्या नियंत्रकांनी लपवले आहे.",
+  "lists.account.add": "यादीमध्ये जोडा",
+  "lists.account.remove": "यादीमधून काढा",
+  "lists.delete": "सूची हटवा",
+  "lists.edit": "सूची संपादित करा",
+  "lists.edit.submit": "शीर्षक बदला",
+  "lists.new.create": "यादी जोडा",
+  "lists.new.title_placeholder": "नवीन सूची शीर्षक",
+  "lists.replies_policy.followed": "कोणताही फॉलो केलेला वापरकर्ता",
+  "lists.replies_policy.list": "यादीतील सदस्य",
+  "lists.replies_policy.none": "कोणीच नाही",
+  "lists.replies_policy.title": "यांना उत्तरे दाखवा:",
+  "lists.search": "तुम्ही फॉलो करत असलेल्या लोकांमध्ये शोधा",
+  "lists.subheading": "तुमच्या याद्या",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
-  "loading_indicator.label": "Loading...",
+  "loading_indicator.label": "लोड करत आहे...",
   "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
@@ -409,21 +414,21 @@
   "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mentions:",
   "notifications.column_settings.poll": "Poll results:",
-  "notifications.column_settings.push": "Push notifications",
-  "notifications.column_settings.reblog": "Boosts:",
-  "notifications.column_settings.show": "Show in column",
-  "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.push": "सूचना",
+  "notifications.column_settings.reblog": "बूस्ट:",
+  "notifications.column_settings.show": "स्तंभात दाखवा",
+  "notifications.column_settings.sound": "ध्वनी प्ले करा",
   "notifications.column_settings.status": "New toots:",
-  "notifications.column_settings.unread_notifications.category": "Unread notifications",
-  "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
-  "notifications.column_settings.update": "Edits:",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
-  "notifications.filter.polls": "Poll results",
-  "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.column_settings.unread_notifications.category": "अपठित अधिसूचना",
+  "notifications.column_settings.unread_notifications.highlight": "न वाचलेल्या सूचना हायलाइट करा",
+  "notifications.column_settings.update": "संपादने:",
+  "notifications.filter.all": "सर्व",
+  "notifications.filter.boosts": "बूस्ट",
+  "notifications.filter.favourites": "आवडते",
+  "notifications.filter.follows": "अनुयायी आहे",
+  "notifications.filter.mentions": "उल्लेख केलेले",
+  "notifications.filter.polls": "मतदान परिणाम",
+  "notifications.filter.statuses": "तुम्ही फॉलो करत असलेल्या लोकांकडून अपडेट",
   "notifications.grant_permission": "Grant permission.",
   "notifications.group": "{count} notifications",
   "notifications.mark_as_read": "Mark every notification as read",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index e3dcf46a1..715c59f7e 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Hantaran dan balasan",
   "account.report": "Laporkan @{name}",
   "account.requested": "Menunggu kelulusan. Klik untuk batalkan permintaan ikut",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Kongsi profil @{name}",
   "account.show_reblogs": "Tunjukkan galakan daripada @{name}",
   "account.statuses_counter": "{count, plural, other {{counter} kiriman}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Cari bahasa...",
   "compose_form.direct_message_warning_learn_more": "Ketahui lebih lanjut",
   "compose_form.encryption_warning": "Hantaran pada Mastodon tidak disulitkan hujung ke hujung. Jangan berkongsi sebarang maklumat sensitif melalui Mastodon.",
-  "compose_form.hashtag_warning": "Hantaran ini tidak akan disenaraikan di bawah mana-mana tanda pagar kerana ia tidak tersenarai. Hanya hantaran awam sahaja boleh dicari menggunakan tanda pagar.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Akaun anda tidak {locked}. Sesiapa pun boleh mengikuti anda untuk melihat hantaran pengikut-sahaja anda.",
   "compose_form.lock_disclaimer.lock": "dikunci",
   "compose_form.placeholder": "Apakah yang sedang anda fikirkan?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Salin surih tindanan ke papan keratan",
   "errors.unexpected_crash.report_issue": "Laporkan masalah",
   "explore.search_results": "Hasil carian",
+  "explore.suggested_follows": "For you",
   "explore.title": "Terokai",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "Kumpulan penapis ini tidak terpakai pada konteks di mana anda mengakses hantaran ini. Jika anda ingin hantaran ini untuk ditapis dalam konteks ini juga, anda perlu menyunting penapis tersebut.",
   "filter_modal.added.context_mismatch_title": "Konteks tidak sepadan!",
   "filter_modal.added.expired_explanation": "Kumpulan filter ini telah tamat tempoh, anda perlu mengubah tarikh luput untuk melaksanakannya.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Daftar masuk",
   "sign_in_banner.text": "Daftar masuk untuk mengikut profil atau tanda pagar, menggemari, mengkongsi dan membalas kepada hantaran, atau berinteraksi daripada akaun anda pada pelayan lain.",
   "status.admin_account": "Buka antara muka penyederhanaan untuk @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Buka hantaran ini dalam antara muka penyederhanaan",
   "status.block": "Sekat @{name}",
   "status.bookmark": "Tanda buku",
@@ -553,7 +559,7 @@
   "status.favourite": "Kegemaran",
   "status.filter": "Tapiskan hantaran ini",
   "status.filtered": "Ditapis",
-  "status.hide": "Sembunyikan siaran",
+  "status.hide": "Hide post",
   "status.history.created": "{name} mencipta pada {date}",
   "status.history.edited": "{name} menyunting pada {date}",
   "status.load_more": "Muatkan lagi",
diff --git a/app/javascript/mastodon/locales/my.json b/app/javascript/mastodon/locales/my.json
index 1e55e8dee..31e250047 100644
--- a/app/javascript/mastodon/locales/my.json
+++ b/app/javascript/mastodon/locales/my.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Posts and replies",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval. Click to cancel follow request",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index 4e2579c57..479573e84 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -16,7 +16,7 @@
   "account.badges.bot": "Bot",
   "account.badges.group": "Groep",
   "account.block": "@{name} blokkeren",
-  "account.block_domain": "Alles van {domain} verbergen",
+  "account.block_domain": "Alles van {domain} blokkeren",
   "account.blocked": "Geblokkeerd",
   "account.browse_more_on_origin_server": "Zie meer op het originele profiel",
   "account.cancel_follow_request": "Volgverzoek annuleren",
@@ -54,11 +54,12 @@
   "account.posts_with_replies": "Berichten en reacties",
   "account.report": "@{name} rapporteren",
   "account.requested": "Wachten op goedkeuring. Klik om het volgverzoek te annuleren",
+  "account.requested_follow": "{name} wil je graag volgen",
   "account.share": "Profiel van @{name} delen",
   "account.show_reblogs": "Boosts van @{name} tonen",
   "account.statuses_counter": "{count, plural, one {{counter} bericht} other {{counter} berichten}}",
   "account.unblock": "@{name} deblokkeren",
-  "account.unblock_domain": "{domain} niet langer verbergen",
+  "account.unblock_domain": "{domain} niet langer blokkeren",
   "account.unblock_short": "Deblokkeren",
   "account.unendorse": "Niet op profiel weergeven",
   "account.unfollow": "Ontvolgen",
@@ -127,7 +128,7 @@
   "compose.language.search": "Talen zoeken...",
   "compose_form.direct_message_warning_learn_more": "Meer leren",
   "compose_form.encryption_warning": "Berichten op Mastodon worden, net zoals op andere social media, niet end-to-end versleuteld. Deel daarom geen gevoelige informatie via Mastodon.",
-  "compose_form.hashtag_warning": "Dit bericht valt niet onder een hashtag te bekijken, omdat deze niet op openbare tijdlijnen wordt getoond. Alleen openbare berichten kunnen via hashtags gevonden worden.",
+  "compose_form.hashtag_warning": "Dit bericht valt niet onder een hashtag te bekijken, omdat deze niet op openbaar is. Alleen openbare berichten kunnen via hashtags gevonden worden.",
   "compose_form.lock_disclaimer": "Jouw account is niet {locked}. Iedereen kan jou volgen en kan de berichten zien die je alleen aan jouw volgers hebt gericht.",
   "compose_form.lock_disclaimer.lock": "besloten",
   "compose_form.placeholder": "Wat wil je kwijt?",
@@ -159,8 +160,8 @@
   "confirmations.delete_list.message": "Weet je zeker dat je deze lijst definitief wilt verwijderen?",
   "confirmations.discard_edit_media.confirm": "Weggooien",
   "confirmations.discard_edit_media.message": "Je hebt niet-opgeslagen wijzigingen in de mediabeschrijving of voorvertonning, wil je deze toch weggooien?",
-  "confirmations.domain_block.confirm": "Verberg alles van deze server",
-  "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt negeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je zult geen berichten van deze server op openbare tijdlijnen zien of in jouw meldingen. Jouw volgers van deze server worden verwijderd.",
+  "confirmations.domain_block.confirm": "Blokkeer alles van deze server",
+  "confirmations.domain_block.message": "Weet je het echt heel erg zeker dat je alles van {domain} wilt blokkeren? In de meeste gevallen is het blokkeren of negeren van een paar specifieke personen voldoende en beter. Je zult geen berichten van deze server op openbare tijdlijnen zien of in jouw meldingen. Jouw volgers van deze server worden verwijderd.",
   "confirmations.logout.confirm": "Uitloggen",
   "confirmations.logout.message": "Weet je zeker dat je wilt uitloggen?",
   "confirmations.mute.confirm": "Negeren",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Stacktrace naar klembord kopiëren",
   "errors.unexpected_crash.report_issue": "Technisch probleem melden",
   "explore.search_results": "Zoekresultaten",
+  "explore.suggested_follows": "Voor jou",
   "explore.title": "Verkennen",
+  "explore.trending_links": "Nieuws",
+  "explore.trending_statuses": "Berichten",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "Deze filtercategorie is niet van toepassing op de context waarin je dit bericht hebt benaderd. Als je wilt dat het bericht ook in deze context wordt gefilterd, moet je het filter bewerken.",
   "filter_modal.added.context_mismatch_title": "Context komt niet overeen!",
   "filter_modal.added.expired_explanation": "Deze filtercategorie is verlopen. Je moet de vervaldatum wijzigen om de categorie toe te kunnen passen.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Inloggen",
   "sign_in_banner.text": "Wanneer je een account op deze server hebt, kun je inloggen om mensen of hashtags te volgen, op berichten te reageren of om deze te delen. Wanneer je een account op een andere server hebt, kun je daar inloggen en daar interactie met mensen op deze server hebben.",
   "status.admin_account": "Moderatie-omgeving van @{name} openen",
+  "status.admin_domain": "Moderatie-omgeving van {domain} openen",
   "status.admin_status": "Dit bericht in de moderatie-omgeving tonen",
   "status.block": "@{name} blokkeren",
   "status.bookmark": "Bladwijzer toevoegen",
@@ -617,13 +623,13 @@
   "upload_button.label": "Afbeeldingen, een video- of een geluidsbestand toevoegen",
   "upload_error.limit": "Uploadlimiet van bestand overschreden.",
   "upload_error.poll": "Het uploaden van bestanden is in polls niet toegestaan.",
-  "upload_form.audio_description": "Omschrijf dit voor mensen met een auditieve beperking",
-  "upload_form.description": "Omschrijf dit voor mensen met een visuele beperking",
+  "upload_form.audio_description": "Omschrijf dit voor dove of slechthorende mensen",
+  "upload_form.description": "Omschrijf dit voor blinde of slechtziende mensen",
   "upload_form.description_missing": "Geen omschrijving toegevoegd",
   "upload_form.edit": "Omschrijf",
   "upload_form.thumbnail": "Miniatuurafbeelding wijzigen",
   "upload_form.undo": "Verwijderen",
-  "upload_form.video_description": "Omschrijf dit voor mensen met een auditieve of visuele beperking",
+  "upload_form.video_description": "Omschrijf dit voor dove, slechthorende, blinde of slechtziende mensen",
   "upload_modal.analyzing_picture": "Afbeelding analyseren…",
   "upload_modal.apply": "Toepassen",
   "upload_modal.applying": "Aan het toepassen…",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index 0342b66c7..e158f67b0 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -34,7 +34,7 @@
   "account.followers.empty": "Ingen fylgjer denne brukaren enno.",
   "account.followers_counter": "{count, plural, one {{counter} fylgjar} other {{counter} fylgjarar}}",
   "account.following": "Fylgjer",
-  "account.following_counter": "{count, plural, one {{counter} fylgjar} other {{counter} fylgjar}}",
+  "account.following_counter": "{count, plural, one {Fylgjar {counter}} other {Fylgjar {counter}}}",
   "account.follows.empty": "Denne brukaren fylgjer ikkje nokon enno.",
   "account.follows_you": "Fylgjer deg",
   "account.go_to_profile": "Gå til profil",
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Tut og svar",
   "account.report": "Rapporter @{name}",
   "account.requested": "Ventar på aksept. Klikk for å avbryta fylgjeførespurnaden",
+  "account.requested_follow": "{name} har bedt om å få fylgja deg",
   "account.share": "Del @{name} sin profil",
   "account.show_reblogs": "Vis framhevingar frå @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} tut} other {{counter} tut}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Søk språk...",
   "compose_form.direct_message_warning_learn_more": "Lær meir",
   "compose_form.encryption_warning": "Innlegg på Mastodon er ikkje ende-til-ende-krypterte. Ikkje del eventuell ømtolig informasjon via Mastodon.",
-  "compose_form.hashtag_warning": "Dette tutet vert ikkje oppført under nokon emneknagg sidan ingen emneknagg er oppført. Det er kun emneknaggar som er søkbare i offentlege tutar.",
+  "compose_form.hashtag_warning": "Dette innlegget vert ikkje lista under nokre emneknaggar av di det ikkje er offentleg. Berre offentlege innlegg kan verte søkt opp med emneknagg.",
   "compose_form.lock_disclaimer": "Kontoen din er ikkje {locked}. Kven som helst kan fylgja deg for å sjå innlegga dine.",
   "compose_form.lock_disclaimer.lock": "låst",
   "compose_form.placeholder": "Kva har du på hjarta?",
@@ -137,10 +138,10 @@
   "compose_form.poll.remove_option": "Fjern dette valet",
   "compose_form.poll.switch_to_multiple": "Endre rundspørjinga til å tillate fleire val",
   "compose_form.poll.switch_to_single": "Endre rundspørjinga til å tillate berre eitt val",
-  "compose_form.publish": "Publisér",
-  "compose_form.publish_form": "Publisér",
+  "compose_form.publish": "Legg ut",
+  "compose_form.publish_form": "Legg ut",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Lagre endringar",
+  "compose_form.save_changes": "Gøym",
   "compose_form.sensitive.hide": "{count, plural, one {Marker mediet som ømtolig} other {Marker media som ømtolige}}",
   "compose_form.sensitive.marked": "{count, plural, one {Mediet er markert som ømtolig} other {Media er markerte som ømtolige}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Mediet er ikkje markert som ømtolig} other {Media er ikkje markerte som ømtolige}}",
@@ -177,7 +178,7 @@
   "conversation.open": "Sjå samtale",
   "conversation.with": "Med {names}",
   "copypaste.copied": "Kopiert",
-  "copypaste.copy": "Kopiér",
+  "copypaste.copy": "Kopier",
   "directory.federated": "Frå den kjende allheimen",
   "directory.local": "Berre frå {domain}",
   "directory.new_arrivals": "Nyleg tilkomne",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Kopier stacktrace til utklippstavla",
   "errors.unexpected_crash.report_issue": "Rapporter problem",
   "explore.search_results": "Søkeresultat",
+  "explore.suggested_follows": "For deg",
   "explore.title": "Utforsk",
+  "explore.trending_links": "Nytt",
+  "explore.trending_statuses": "Innlegg",
+  "explore.trending_tags": "Emneknaggar",
   "filter_modal.added.context_mismatch_explanation": "Denne filterkategorien gjeld ikkje i den samanhengen du har lese dette innlegget. Viss du vil at innlegget skal filtrerast i denne samanhengen òg, må du endra filteret.",
   "filter_modal.added.context_mismatch_title": "Konteksten passar ikkje!",
   "filter_modal.added.expired_explanation": "Denne filterkategorien har gått ut på dato. Du må endre best før datoen for at den skal gjelde.",
@@ -265,7 +270,7 @@
   "footer.keyboard_shortcuts": "Snøggtastar",
   "footer.privacy_policy": "Personvernsreglar",
   "footer.source_code": "Vis kjeldekode",
-  "generic.saved": "Lagra",
+  "generic.saved": "Gøymt",
   "getting_started.heading": "Kom i gang",
   "hashtag.column_header.tag_mode.all": "og {additional}",
   "hashtag.column_header.tag_mode.any": "eller {additional}",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Logg inn",
   "sign_in_banner.text": "Logg inn for å fylgje profiler eller emneknaggar, markere, framheve og svare på innlegg – eller samhandle med aktivitet på denne tenaren frå kontoen din på ein annan tenar.",
   "status.admin_account": "Opne moderasjonsgrensesnitt for @{name}",
+  "status.admin_domain": "Opna moderatorgrensesnittet for {domain}",
   "status.admin_status": "Opne denne statusen i moderasjonsgrensesnittet",
   "status.block": "Blokker @{name}",
   "status.bookmark": "Set bokmerke",
@@ -553,7 +559,7 @@
   "status.favourite": "Favoritt",
   "status.filter": "Filtrer dette innlegget",
   "status.filtered": "Filtrert",
-  "status.hide": "Gøym innlegg",
+  "status.hide": "Skjul innlegget",
   "status.history.created": "{name} oppretta {date}",
   "status.history.edited": "{name} redigerte {date}",
   "status.load_more": "Last inn meir",
@@ -590,7 +596,7 @@
   "status.unmute_conversation": "Opphev målbinding av samtalen",
   "status.unpin": "Løys frå profil",
   "subscribed_languages.lead": "Kun innlegg på valde språk vil bli dukke opp i heimestraumen din og i listene dine etter denne endringa. For å motta innlegg på alle språk, la vere å velje nokon.",
-  "subscribed_languages.save": "Lagre endringar",
+  "subscribed_languages.save": "Gøym",
   "subscribed_languages.target": "Endre abonnerte språk for {target}",
   "suggestions.dismiss": "Avslå forslag",
   "suggestions.header": "Du er kanskje interessert i…",
@@ -618,7 +624,7 @@
   "upload_error.limit": "Du har gått over opplastingsgrensa.",
   "upload_error.poll": "Filopplasting er ikkje lov for rundspørjingar.",
   "upload_form.audio_description": "Skildre for dei med nedsett høyrsel",
-  "upload_form.description": "Skildre for dei om har redusert syn",
+  "upload_form.description": "Skildre for blinde og svaksynte",
   "upload_form.description_missing": "Inga skildring er lagt til",
   "upload_form.edit": "Rediger",
   "upload_form.thumbnail": "Bytt miniatyrbilete",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 1c33c8a99..53de4ce00 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -2,21 +2,21 @@
   "about.blocks": "Modererte tjenere",
   "about.contact": "Kontakt:",
   "about.disclaimer": "Mastodon er gratis, åpen kildekode-programvare og et varemerke fra Mastodon gGmbH.",
-  "about.domain_blocks.no_reason_available": "Årsak ikke oppgitt",
-  "about.domain_blocks.preamble": "Mastodon lar deg normalt sett se innholdet fra og samhandle med brukere fra enhver annen server i fødiverset. Dette er unntakene som har blitt lagt inn på denne serveren.",
-  "about.domain_blocks.silenced.explanation": "Du vil vanligvis ikke se profiler og innhold fra denne serveren, med mindre du eksplisitt søker dem opp eller velger å følge dem.",
+  "about.domain_blocks.no_reason_available": "Årsak ikke tilgjengelig",
+  "about.domain_blocks.preamble": "Mastodon lar deg normalt sett se innholdet fra og samhandle med brukere fra enhver annen tjener i fødiverset. Dette er unntakene som har blitt lagt inn på denne tjeneren.",
+  "about.domain_blocks.silenced.explanation": "Du vil vanligvis ikke se profiler og innhold fra denne tjeneren, med mindre du eksplisitt søker dem opp eller velger å følge dem.",
   "about.domain_blocks.silenced.title": "Begrenset",
-  "about.domain_blocks.suspended.explanation": "Ikke noe innhold fra denne serveren vil bli behandlet, lagret eller utvekslet. Det gjør det umulig å samhandle eller kommunisere med brukere fra denne serveren.",
+  "about.domain_blocks.suspended.explanation": "Ikke noe innhold fra denne tjeneren vil bli behandlet, lagret eller utvekslet. Det gjør det umulig å samhandle eller kommunisere med brukere fra denne tjeneren.",
   "about.domain_blocks.suspended.title": "Suspendert",
-  "about.not_available": "Denne informasjonen er ikke gjort tilgjengelig på denne serveren.",
+  "about.not_available": "Denne informasjonen er ikke gjort tilgjengelig på denne tjeneren.",
   "about.powered_by": "Desentraliserte sosiale medier drevet av {mastodon}",
-  "about.rules": "Regler for serveren",
+  "about.rules": "Regler for tjeneren",
   "account.account_note_header": "Notat",
   "account.add_or_remove_from_list": "Legg til eller fjern fra lister",
   "account.badges.bot": "Bot",
   "account.badges.group": "Gruppe",
-  "account.block": "Blokkér @{name}",
-  "account.block_domain": "Blokkér domenet {domain}",
+  "account.block": "Blokker @{name}",
+  "account.block_domain": "Blokker domenet {domain}",
   "account.blocked": "Blokkert",
   "account.browse_more_on_origin_server": "Bla mer på den opprinnelige profilen",
   "account.cancel_follow_request": "Trekk tilbake følge-forespørselen",
@@ -52,8 +52,9 @@
   "account.open_original_page": "Gå til originalsiden",
   "account.posts": "Innlegg",
   "account.posts_with_replies": "Innlegg med svar",
-  "account.report": "Rapportér @{name}",
+  "account.report": "Rapporter @{name}",
   "account.requested": "Venter på godkjennelse. Klikk for å avbryte forespørselen",
+  "account.requested_follow": "{name} har bedt om å få følge deg",
   "account.share": "Del @{name}s profil",
   "account.show_reblogs": "Vis fremhevinger fra @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} innlegg} other {{counter} innlegg}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Søk etter språk...",
   "compose_form.direct_message_warning_learn_more": "Lær mer",
   "compose_form.encryption_warning": "Innlegg på Mastodon er ikke ende-til-ende-krypterte. Ikke del sensitive opplysninger via Mastodon.",
-  "compose_form.hashtag_warning": "Dette innlegget blir vist under noen emneknagger da det er uoppført. Kun offentlige innlegg kan søkes opp med emneknagg.",
+  "compose_form.hashtag_warning": "Dette innlegget blir ikke vist under noen emneknagger siden det ikke er offentlig. Bare offentlige innlegg kan søkes opp med emneknagger.",
   "compose_form.lock_disclaimer": "Din konto er ikke {locked}. Hvem som helst kan følge deg og se dine private poster.",
   "compose_form.lock_disclaimer.lock": "låst",
   "compose_form.placeholder": "Hva har du på hjertet?",
@@ -166,7 +167,7 @@
   "confirmations.mute.confirm": "Demp",
   "confirmations.mute.explanation": "Dette vil skjule innlegg fra dem og innlegg som nevner dem, men det vil fortsatt la dem se dine innlegg og å følge deg.",
   "confirmations.mute.message": "Er du sikker på at du vil dempe {name}?",
-  "confirmations.redraft.confirm": "Slett og drøft på nytt",
+  "confirmations.redraft.confirm": "Slett og skriv på nytt",
   "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": "Svar",
   "confirmations.reply.message": "Å svare nå vil overskrive meldingen du skriver for øyeblikket. Er du sikker på at du vil fortsette?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Kopier stacktrace-en til utklippstavlen",
   "errors.unexpected_crash.report_issue": "Rapporter en feil",
   "explore.search_results": "Søkeresultater",
+  "explore.suggested_follows": "For deg",
   "explore.title": "Utforsk",
+  "explore.trending_links": "Nyheter",
+  "explore.trending_statuses": "Innlegg",
+  "explore.trending_tags": "Emneknagger",
   "filter_modal.added.context_mismatch_explanation": "Denne filterkategorien gjelder ikke for den konteksten du har åpnet dette innlegget i. Hvis du vil at innlegget skal filtreres i denne konteksten også, må du redigere filteret.",
   "filter_modal.added.context_mismatch_title": "Feil sammenheng!",
   "filter_modal.added.expired_explanation": "Denne filterkategorien er utløpt, du må endre utløpsdato for at den skal gjelde.",
@@ -255,13 +260,13 @@
   "follow_recommendations.done": "Utført",
   "follow_recommendations.heading": "Følg folk du ønsker å se innlegg fra! Her er noen forslag.",
   "follow_recommendations.lead": "Innlegg fra mennesker du følger vil vises i kronologisk rekkefølge på hjemmefeed. Ikke vær redd for å gjøre feil, du kan slutte å følge folk like enkelt som alt!",
-  "follow_request.authorize": "Autorisér",
+  "follow_request.authorize": "Autoriser",
   "follow_request.reject": "Avvis",
   "follow_requests.unlocked_explanation": "Selv om kontoen din ikke er låst, tror {domain} ansatte at du kanskje vil gjennomgå forespørsler fra disse kontoene manuelt.",
   "footer.about": "Om",
   "footer.directory": "Profilkatalog",
   "footer.get_app": "Last ned appen",
-  "footer.invite": "Invitér folk",
+  "footer.invite": "Inviter folk",
   "footer.keyboard_shortcuts": "Hurtigtaster",
   "footer.privacy_policy": "Personvernregler",
   "footer.source_code": "Vis kildekode",
@@ -344,7 +349,7 @@
   "lists.delete": "Slett listen",
   "lists.edit": "Rediger listen",
   "lists.edit.submit": "Endre tittel",
-  "lists.new.create": "Ligg til liste",
+  "lists.new.create": "Legg til liste",
   "lists.new.title_placeholder": "Ny listetittel",
   "lists.replies_policy.followed": "Enhver fulgt bruker",
   "lists.replies_policy.list": "Medlemmer i listen",
@@ -443,7 +448,7 @@
   "poll.votes": "{votes, plural, one {# stemme} other {# stemmer}}",
   "poll_button.add_poll": "Legg til en avstemning",
   "poll_button.remove_poll": "Fjern avstemningen",
-  "privacy.change": "Justér synlighet",
+  "privacy.change": "Juster synlighet",
   "privacy.direct.long": "Post kun til nevnte brukere",
   "privacy.direct.short": "Kun nevnte personer",
   "privacy.private.long": "Post kun til følgere",
@@ -537,8 +542,9 @@
   "sign_in_banner.sign_in": "Logg inn",
   "sign_in_banner.text": "Logg inn for å følge profiler eller hashtags, like, dele og svare på innlegg eller interagere fra din konto på en annen server.",
   "status.admin_account": "Åpne moderatorgrensesnittet for @{name}",
+  "status.admin_domain": "Åpne moderatorgrensesnittet for {domain}",
   "status.admin_status": "Åpne denne statusen i moderatorgrensesnittet",
-  "status.block": "Blokkér @{name}",
+  "status.block": "Blokker @{name}",
   "status.bookmark": "Bokmerke",
   "status.cancel_reblog_private": "Fjern fremheving",
   "status.cannot_reblog": "Denne posten kan ikke fremheves",
@@ -546,7 +552,7 @@
   "status.delete": "Slett",
   "status.detailed_status": "Detaljert samtalevisning",
   "status.direct": "Send direktemelding til @{name}",
-  "status.edit": "Redigér",
+  "status.edit": "Rediger",
   "status.edited": "Redigert {date}",
   "status.edited_x_times": "Redigert {count, plural,one {{count} gang} other {{count} ganger}}",
   "status.embed": "Bygge inn",
@@ -570,7 +576,7 @@
   "status.reblog_private": "Fremhev til det opprinnelige publikummet",
   "status.reblogged_by": "Fremhevet av {name}",
   "status.reblogs.empty": "Ingen har fremhevet dette innlegget enda. Når noen gjør det, vil de dukke opp her.",
-  "status.redraft": "Slett og drøft på nytt",
+  "status.redraft": "Slett og skriv på nytt",
   "status.remove_bookmark": "Fjern bokmerke",
   "status.replied_to": "Som svar til {name}",
   "status.reply": "Svar",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 446e0cd22..4865843dd 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -2,7 +2,7 @@
   "about.blocks": "Servidors moderats",
   "about.contact": "Contacte :",
   "about.disclaimer": "Mastodon es gratuit, un logicial libre e una marca de Mastodon gGmbH.",
-  "about.domain_blocks.no_reason_available": "Reason not available",
+  "about.domain_blocks.no_reason_available": "Rason pas disponibla",
   "about.domain_blocks.preamble": "Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server.",
   "about.domain_blocks.silenced.explanation": "You will generally not see profiles and content from this server, unless you explicitly look it up or opt into it by following.",
   "about.domain_blocks.silenced.title": "Limitats",
@@ -49,11 +49,12 @@
   "account.mute": "Rescondre @{name}",
   "account.mute_notifications": "Rescondre las notificacions de @{name}",
   "account.muted": "Mes en silenci",
-  "account.open_original_page": "Open original page",
+  "account.open_original_page": "Dobrir la pagina d’origina",
   "account.posts": "Tuts",
   "account.posts_with_replies": "Tuts e responsas",
   "account.report": "Senhalar @{name}",
   "account.requested": "Invitacion mandada. Clicatz per anullar",
+  "account.requested_follow": "{name} a demandat a vos sègre",
   "account.share": "Partejar lo perfil a @{name}",
   "account.show_reblogs": "Mostrar los partatges de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Recercar de lengas...",
   "compose_form.direct_message_warning_learn_more": "Ne saber mai",
   "compose_form.encryption_warning": "Las publicacions sus Mastodon son pas chifradas del cap a la fin. Partegetz pas d’informacions sensiblas sus Mastodon.",
-  "compose_form.hashtag_warning": "Aqueste tut serà pas ligat a cap d’etiqueta estant qu’es pas listat. Òm pòt pas cercar que los tuts publics per etiqueta.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Vòstre compte es pas {locked}. Tot lo mond 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 ?",
@@ -138,7 +139,7 @@
   "compose_form.poll.switch_to_multiple": "Cambiar lo sondatge per permetre de causidas multiplas",
   "compose_form.poll.switch_to_single": "Cambiar lo sondatge per permetre una sola causida",
   "compose_form.publish": "Publicar",
-  "compose_form.publish_form": "Publish",
+  "compose_form.publish_form": "Publicar",
   "compose_form.publish_loud": "{publish} !",
   "compose_form.save_changes": "Salvar los cambiaments",
   "compose_form.sensitive.hide": "Marcar coma sensible",
@@ -184,12 +185,12 @@
   "directory.recently_active": "Actius fa res",
   "disabled_account_banner.account_settings": "Paramètres de compte",
   "disabled_account_banner.text": "Vòstre compte {disabledAccount} es actualament desactivat.",
-  "dismissable_banner.community_timeline": "These are the most recent public posts from people whose accounts are hosted by {domain}.",
+  "dismissable_banner.community_timeline": "Vaquí las publicacions mai recentas del monde amb un compte albergat per {domain}.",
   "dismissable_banner.dismiss": "Ignorar",
-  "dismissable_banner.explore_links": "These news stories are being talked about by people on this and other servers of the decentralized network right now.",
-  "dismissable_banner.explore_statuses": "These posts from this and other servers in the decentralized network are gaining traction on this server right now.",
+  "dismissable_banner.explore_links": "Aquestas istòrias ne parlan lo monde d’aqueste servidor e dels autres servidors del malhum descentralizat d’aquesta passa.",
+  "dismissable_banner.explore_statuses": "Aquí las publicacions d’aqueste servidor e dels autres del malhum descentralizat que ganhan en popularitat d’aquesta passa.",
   "dismissable_banner.explore_tags": "These hashtags are gaining traction among people on this and other servers of the decentralized network right now.",
-  "dismissable_banner.public_timeline": "These are the most recent public posts from people on this and other servers of the decentralized network that this server knows about.",
+  "dismissable_banner.public_timeline": "Vaquí las publicacions mai recentas del monde d’aqueste servidor e dels servidors descentralizats del malhum qu’aqueste servidor coneis.",
   "embed.instructions": "Embarcar aqueste estatut per lo far veire sus un site Internet en copiar lo còdi çai-jos.",
   "embed.preview": "Semblarà aquò :",
   "emoji_button.activity": "Activitats",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copiar las traças al quichapapièrs",
   "errors.unexpected_crash.report_issue": "Senhalar un problèma",
   "explore.search_results": "Resultats de recèrca",
+  "explore.suggested_follows": "Per vos",
   "explore.title": "Explorar",
+  "explore.trending_links": "Novèlas",
+  "explore.trending_statuses": "Publicacions",
+  "explore.trending_tags": "Etiquetas",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -496,7 +501,7 @@
   "report.reasons.violation_description": "You are aware that it breaks specific rules",
   "report.rules.subtitle": "Select all that apply",
   "report.rules.title": "Which rules are being violated?",
-  "report.statuses.subtitle": "Select all that apply",
+  "report.statuses.subtitle": "Seleccionatz çò que s’aplica",
   "report.statuses.title": "Are there any posts that back up this report?",
   "report.submit": "Mandar",
   "report.target": "Senhalar {target}",
@@ -508,8 +513,8 @@
   "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
   "report_notification.attached_statuses": "{count, plural, one {{count} publicacion junta} other {{count} publicacions juntas}}",
   "report_notification.categories.other": "Autre",
-  "report_notification.categories.spam": "Spam",
-  "report_notification.categories.violation": "Rule violation",
+  "report_notification.categories.spam": "Messatge indesirable",
+  "report_notification.categories.violation": "Violacion de las règlas",
   "report_notification.open": "Dobrir lo senhalament",
   "search.placeholder": "Recercar",
   "search.search_or_paste": "Recercar o picar una URL",
@@ -534,9 +539,10 @@
   "server_banner.learn_more": "Ne saber mai",
   "server_banner.server_stats": "Estatisticas del servidor :",
   "sign_in_banner.create_account": "Crear un compte",
-  "sign_in_banner.sign_in": "Se marcar",
+  "sign_in_banner.sign_in": "Se connectar",
   "sign_in_banner.text": "Connectatz-vos per sègre perfils o etiquetas, apondre als favorits, partejar e respondre als messatges o interagir de vòstre compte estant d’un autre servidor.",
   "status.admin_account": "Dobrir l’interfàcia de moderacion per @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Dobrir aqueste estatut dins l’interfàcia de moderacion",
   "status.block": "Blocar @{name}",
   "status.bookmark": "Marcador",
@@ -553,7 +559,7 @@
   "status.favourite": "Apondre als favorits",
   "status.filter": "Filtrar aquesta publicacion",
   "status.filtered": "Filtrat",
-  "status.hide": "Amagar aqueste tut",
+  "status.hide": "Hide post",
   "status.history.created": "{name} o creèt lo {date}",
   "status.history.edited": "{name} o modifiquèt lo {date}",
   "status.load_more": "Cargar mai",
diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json
index 693991651..e646ef83c 100644
--- a/app/javascript/mastodon/locales/pa.json
+++ b/app/javascript/mastodon/locales/pa.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Toots and replies",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "locked",
   "compose_form.placeholder": "What is on your mind?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 9de1ccf16..eff34bcdd 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -43,7 +43,7 @@
   "account.languages": "Zmień subskrybowane języki",
   "account.link_verified_on": "Własność tego odnośnika została potwierdzona {date}",
   "account.locked_info": "To konto jest prywatne. Właściciel ręcznie wybiera kto może go obserwować.",
-  "account.media": "Zawartość multimedialna",
+  "account.media": "Multimedia",
   "account.mention": "Wspomnij o @{name}",
   "account.moved_to": "{name} jako swoje nowe konto wskazał/a:",
   "account.mute": "Wycisz @{name}",
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Wpisy i odpowiedzi",
   "account.report": "Zgłoś @{name}",
   "account.requested": "Oczekująca prośba, kliknij aby anulować",
+  "account.requested_follow": "{name} poprosił(a) o możliwość zaobserwowania twojego profilu",
   "account.share": "Udostępnij profil @{name}",
   "account.show_reblogs": "Pokazuj podbicia od @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} wpis} few {{counter} wpisy} many {{counter} wpisów} other {{counter} wpisów}}",
@@ -125,13 +126,13 @@
   "column_subheading.navigation": "Nawigacja",
   "column_subheading.settings": "Ustawienia",
   "community.column_settings.local_only": "Tylko Lokalne",
-  "community.column_settings.media_only": "Tylko zawartość multimedialna",
+  "community.column_settings.media_only": "Tylko multimedia",
   "community.column_settings.remote_only": "Tylko Zdalne",
   "compose.language.change": "Zmień język",
   "compose.language.search": "Szukaj języków...",
   "compose_form.direct_message_warning_learn_more": "Dowiedz się więcej",
   "compose_form.encryption_warning": "Posty na Mastodon nie są szyfrowane end-to-end. Nie udostępniaj żadnych wrażliwych informacji przez Mastodon.",
-  "compose_form.hashtag_warning": "Ten wpis nie będzie widoczny pod podanymi hasztagami, ponieważ jest oznaczony jako niewidoczny. Tylko publiczne wpisy mogą zostać znalezione z użyciem hasztagów.",
+  "compose_form.hashtag_warning": "Ten wpis nie będzie widoczny pod podanymi hasztagami, ponieważ jest oznaczony jako niepubliczny. Tylko publiczne wpisy mogą zostać znalezione z użyciem hasztagów.",
   "compose_form.lock_disclaimer": "Twoje konto nie jest {locked}. Każdy, kto Cię obserwuje, może wyświetlać Twoje wpisy przeznaczone tylko dla obserwujących.",
   "compose_form.lock_disclaimer.lock": "zablokowane",
   "compose_form.placeholder": "Co Ci chodzi po głowie?",
@@ -145,9 +146,9 @@
   "compose_form.publish_form": "Publikuj",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Zapisz zmiany",
-  "compose_form.sensitive.hide": "Oznacz multimedia jako wrażliwe",
-  "compose_form.sensitive.marked": "Zawartość multimedia jest oznaczona jako wrażliwa",
-  "compose_form.sensitive.unmarked": "Zawartość multimedialna nie jest oznaczona jako wrażliwa",
+  "compose_form.sensitive.hide": "{count, plural, one {Oznacz treść multimedialną jako wrażliwą} other {Oznacz treści multimedialne jako wrażliwe}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Treść multimedialna jest oznaczona jako wrażliwa} other {Treści multimedialne są oznaczone jako wrażliwe}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Treść multimedialna nie jest oznaczona jako wrażliwa} other {Treści multimedialne nie są oznaczone jako wrażliwe}}",
   "compose_form.spoiler.marked": "Tekst jest ukryty za ostrzeżeniem",
   "compose_form.spoiler.unmarked": "Tekst nie jest ukryty",
   "compose_form.spoiler_placeholder": "Wprowadź swoje ostrzeżenie o zawartości",
@@ -239,7 +240,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Skopiuj ślad stosu do schowka",
   "errors.unexpected_crash.report_issue": "Zgłoś problem",
   "explore.search_results": "Wyniki wyszukiwania",
+  "explore.suggested_follows": "Dla Ciebie",
   "explore.title": "Odkrywaj",
+  "explore.trending_links": "Aktualności",
+  "explore.trending_statuses": "Posty",
+  "explore.trending_tags": "Hasztagi",
   "filter_modal.added.context_mismatch_explanation": "Ta kategoria filtrów nie ma zastosowania do kontekstu, w którym uzyskałeś dostęp do tego wpisu. Jeśli chcesz, aby wpis został przefiltrowany również w tym kontekście, będziesz musiał edytować filtr.",
   "filter_modal.added.context_mismatch_title": "Niezgodność kontekstów!",
   "filter_modal.added.expired_explanation": "Ta kategoria filtra wygasła, będziesz musiał zmienić datę wygaśnięcia, aby ją zastosować.",
@@ -323,7 +328,7 @@
   "keyboard_shortcuts.muted": "aby przejść do listy wyciszonych użytkowników",
   "keyboard_shortcuts.my_profile": "aby otworzyć własny profil",
   "keyboard_shortcuts.notifications": "aby otworzyć kolumnę powiadomień",
-  "keyboard_shortcuts.open_media": "aby otworzyć zawartość multimedialną",
+  "keyboard_shortcuts.open_media": "Otwórz multimedia",
   "keyboard_shortcuts.pinned": "aby przejść do listy przypiętych wpisów",
   "keyboard_shortcuts.profile": "aby przejść do profilu autora wpisu",
   "keyboard_shortcuts.reply": "aby odpowiedzieć",
@@ -332,7 +337,7 @@
   "keyboard_shortcuts.spoilers": "aby pokazać/ukryć pole CW",
   "keyboard_shortcuts.start": "aby otworzyć kolumnę „Rozpocznij”",
   "keyboard_shortcuts.toggle_hidden": "aby wyświetlić lub ukryć wpis spod CW",
-  "keyboard_shortcuts.toggle_sensitivity": "by pokazać/ukryć multimedia",
+  "keyboard_shortcuts.toggle_sensitivity": "Pokaż/ukryj multimedia",
   "keyboard_shortcuts.toot": "Stwórz nowy post",
   "keyboard_shortcuts.unfocus": "aby opuścić pole wyszukiwania/pisania",
   "keyboard_shortcuts.up": "aby przejść na górę listy",
@@ -475,7 +480,7 @@
   "relative_time.today": "dzisiaj",
   "reply_indicator.cancel": "Anuluj",
   "report.block": "Zablokuj",
-  "report.block_explanation": "Nie zobaczysz ich postów. Nie będą mogli zobaczyć Twoich postów ani cię obserwować. Będą mogli domyślić się, że są zablokowani.",
+  "report.block_explanation": "Nie zobaczysz ich wpisów. Nie będą mogli zobaczyć Twoich postów ani cię obserwować. Będą mogli domyślić się, że są zablokowani.",
   "report.categories.other": "Inne",
   "report.categories.spam": "Spam",
   "report.categories.violation": "Zawartość narusza co najmniej jedną zasadę serwera",
@@ -542,6 +547,7 @@
   "sign_in_banner.sign_in": "Zaloguj się",
   "sign_in_banner.text": "Zaloguj się, aby obserwować profile lub hasztagi, jak również dodawaj wpisy do ulubionych, udostępniaj je dalej i odpowiadaj na nie lub wchodź w interakcje z kontem na innym serwerze.",
   "status.admin_account": "Otwórz interfejs moderacyjny dla @{name}",
+  "status.admin_domain": "Otwórz interfejs moderacyjny dla {domain}",
   "status.admin_status": "Otwórz ten wpis w interfejsie moderacyjnym",
   "status.block": "Zablokuj @{name}",
   "status.bookmark": "Dodaj zakładkę",
@@ -558,11 +564,11 @@
   "status.favourite": "Dodaj do ulubionych",
   "status.filter": "Filtruj ten wpis",
   "status.filtered": "Filtrowany(-a)",
-  "status.hide": "Schowaj toota",
+  "status.hide": "Ukryj post",
   "status.history.created": "{name} utworzył(a) {date}",
   "status.history.edited": "{name} edytował(a) {date}",
   "status.load_more": "Załaduj więcej",
-  "status.media_hidden": "Zawartość multimedialna ukryta",
+  "status.media_hidden": "Multimedia ukryte",
   "status.mention": "Wspomnij o @{name}",
   "status.more": "Więcej",
   "status.mute": "Wycisz @{name}",
@@ -619,7 +625,7 @@
   "units.short.million": "{count} mln",
   "units.short.thousand": "{count} tys.",
   "upload_area.title": "Przeciągnij i upuść aby wysłać",
-  "upload_button.label": "Dodaj zawartość multimedialną (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_button.label": "Dodaj zdjęcia, filmy lub audio",
   "upload_error.limit": "Przekroczono limit plików do wysłania.",
   "upload_error.poll": "Dołączanie plików nie dozwolone z głosowaniami.",
   "upload_form.audio_description": "Opisz dla osób niesłyszących i niedosłyszących",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index b42871558..c1ab913d9 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Com respostas",
   "account.report": "Denunciar @{name}",
   "account.requested": "Aguardando aprovação. Clique para cancelar a solicitação",
+  "account.requested_follow": "{name} quer te seguir",
   "account.share": "Compartilhar perfil de @{name}",
   "account.show_reblogs": "Mostrar boosts de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -88,7 +89,7 @@
   "bundle_column_error.retry": "Tente novamente",
   "bundle_column_error.return": "Voltar à página inicial",
   "bundle_column_error.routing.body": "A página solicitada não foi encontrada. Tem certeza de que a URL na barra de endereços está correta?",
-  "bundle_column_error.routing.title": "Erro 404",
+  "bundle_column_error.routing.title": "404",
   "bundle_modal_error.close": "Fechar",
   "bundle_modal_error.message": "Erro ao carregar este componente.",
   "bundle_modal_error.retry": "Tente novamente",
@@ -127,7 +128,7 @@
   "compose.language.search": "Pesquisar idiomas...",
   "compose_form.direct_message_warning_learn_more": "Saiba mais",
   "compose_form.encryption_warning": "As publicações no Mastodon não são criptografadas de ponta-a-ponta. Não compartilhe nenhuma informação sensível no Mastodon.",
-  "compose_form.hashtag_warning": "Este toot não aparecerá em nenhuma hashtag porque está como não-listado. Somente toots públicos podem ser pesquisados por hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Seu perfil não está {locked}. Qualquer um pode te seguir e ver os toots privados.",
   "compose_form.lock_disclaimer.lock": "trancado",
   "compose_form.placeholder": "No que você está pensando?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copiar dados do erro para área de transferência",
   "errors.unexpected_crash.report_issue": "Reportar problema",
   "explore.search_results": "Resultado da pesquisa",
+  "explore.suggested_follows": "Para você",
   "explore.title": "Explorar",
+  "explore.trending_links": "Notícias",
+  "explore.trending_statuses": "Publicações",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "Esta categoria de filtro não se aplica ao contexto no qual você acessou esta publicação. Se quiser que a publicação seja filtrada nesse contexto também, você terá que editar o filtro.",
   "filter_modal.added.context_mismatch_title": "Incompatibilidade de contexto!",
   "filter_modal.added.expired_explanation": "Esta categoria de filtro expirou, você precisará alterar a data de expiração para aplicar.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Entrar",
   "sign_in_banner.text": "Entre para seguir perfis ou hashtags, favoritar, compartilhar e responder publicações, interagir a partir da sua conta em um servidor diferente.",
   "status.admin_account": "Abrir interface de moderação para @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Abrir este toot na interface de moderação",
   "status.block": "Bloquear @{name}",
   "status.bookmark": "Salvar",
@@ -553,7 +559,7 @@
   "status.favourite": "Favoritar",
   "status.filter": "Filtrar esta publicação",
   "status.filtered": "Filtrado",
-  "status.hide": "Ocultar publicação",
+  "status.hide": "Hide post",
   "status.history.created": "{name} criou {date}",
   "status.history.edited": "{name} editou {date}",
   "status.load_more": "Ver mais",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index 8dd5b446c..6a7560262 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -28,7 +28,7 @@
   "account.endorse": "Destacar no perfil",
   "account.featured_tags.last_status_at": "Última publicação em {date}",
   "account.featured_tags.last_status_never": "Sem publicações",
-  "account.featured_tags.title": "Hashtags destacadas por {name}",
+  "account.featured_tags.title": "#Etiquetas destacadas por {name}",
   "account.follow": "Seguir",
   "account.followers": "Seguidores",
   "account.followers.empty": "Ainda ninguém segue este utilizador.",
@@ -40,8 +40,8 @@
   "account.go_to_profile": "Ir para o perfil",
   "account.hide_reblogs": "Esconder partilhas de @{name}",
   "account.joined_short": "Juntou-se a",
-  "account.languages": "Alterar idiomas subscritos",
-  "account.link_verified_on": "A posse deste link foi verificada em {date}",
+  "account.languages": "Alterar línguas subscritas",
+  "account.link_verified_on": "A posse desta ligação foi verificada em {date}",
   "account.locked_info": "Esta conta é privada. O proprietário revê manualmente quem a pode seguir.",
   "account.media": "Média",
   "account.mention": "Mencionar @{name}",
@@ -50,19 +50,20 @@
   "account.mute_notifications": "Silenciar notificações de @{name}",
   "account.muted": "Silenciada",
   "account.open_original_page": "Abrir a página original",
-  "account.posts": "Toots",
+  "account.posts": "Publicações",
   "account.posts_with_replies": "Publicações e respostas",
   "account.report": "Denunciar @{name}",
-  "account.requested": "A aguardar aprovação. Clique para cancelar o pedido de seguidor",
+  "account.requested": "A aguardar aprovação. Clique para cancelar o pedido para seguir",
+  "account.requested_follow": "{name} pediu para segui-lo",
   "account.share": "Partilhar o perfil @{name}",
   "account.show_reblogs": "Mostrar partilhas de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
   "account.unblock": "Desbloquear @{name}",
-  "account.unblock_domain": "Mostrar {domain}",
+  "account.unblock_domain": "Desbloquear o domínio {domain}",
   "account.unblock_short": "Desbloquear",
-  "account.unendorse": "Não mostrar no perfil",
+  "account.unendorse": "Não destacar no perfil",
   "account.unfollow": "Deixar de seguir",
-  "account.unmute": "Não silenciar @{name}",
+  "account.unmute": "Deixar de silenciar @{name}",
   "account.unmute_notifications": "Deixar de silenciar @{name}",
   "account.unmute_short": "Deixar de silenciar",
   "account_note.placeholder": "Clique para adicionar nota",
@@ -81,8 +82,8 @@
   "autosuggest_hashtag.per_week": "{count} por semana",
   "boost_modal.combo": "Pode clicar {combo} para não voltar a ver",
   "bundle_column_error.copy_stacktrace": "Copiar relatório de erros",
-  "bundle_column_error.error.body": "A página solicitada não pôde ser renderizada. Isto pode ser devido a uma falha no nosso código ou a um problema de compatibilidade com o navegador.",
-  "bundle_column_error.error.title": "Oh, não!",
+  "bundle_column_error.error.body": "A página solicitada não pôde ser sintetizada. Isto pode ser devido a uma falha no nosso código ou a um problema de compatibilidade com o navegador.",
+  "bundle_column_error.error.title": "Ó, não!",
   "bundle_column_error.network.body": "Houve um erro ao tentar carregar esta página. Isto pode ocorrer devido a um problema temporário com a sua conexão à internet ou a este servidor.",
   "bundle_column_error.network.title": "Erro de rede",
   "bundle_column_error.retry": "Tente de novo",
@@ -95,48 +96,48 @@
   "closed_registrations.other_server_instructions": "Visto que o Mastodon é descentralizado, pode criar uma conta noutro servidor e interagir com este na mesma.",
   "closed_registrations_modal.description": "Neste momento não é possível criar uma conta em {domain}, mas lembramos que não é preciso ter uma conta especificamente em {domain} para usar o Mastodon.",
   "closed_registrations_modal.find_another_server": "Procurar outro servidor",
-  "closed_registrations_modal.preamble": "O Mastodon é descentralizado, por isso não importa onde a sua conta é criada, continuará a poder acompanhar e interagir com qualquer um neste servidor. Pode até alojar o seu próprio servidor!",
+  "closed_registrations_modal.preamble": "O Mastodon é descentralizado, por isso não importa onde a sua conta é criada, pois continuará a poder acompanhar e interagir com qualquer um neste servidor. Pode até alojar o seu próprio servidor!",
   "closed_registrations_modal.title": "Inscrevendo-se no Mastodon",
   "column.about": "Sobre",
   "column.blocks": "Utilizadores Bloqueados",
-  "column.bookmarks": "Itens salvos",
+  "column.bookmarks": "Marcadores",
   "column.community": "Cronologia local",
   "column.direct": "Mensagens diretas",
-  "column.directory": "Procurar perfis",
-  "column.domain_blocks": "Domínios escondidos",
-  "column.favourites": "Favoritos",
+  "column.directory": "Explorar perfis",
+  "column.domain_blocks": "Domínios bloqueados",
+  "column.favourites": "Preferidos",
   "column.follow_requests": "Seguidores pendentes",
   "column.home": "Início",
   "column.lists": "Listas",
   "column.mutes": "Utilizadores silenciados",
   "column.notifications": "Notificações",
-  "column.pins": "Publicações fixas",
+  "column.pins": "Publicações afixadas",
   "column.public": "Cronologia federada",
-  "column_back_button.label": "Voltar",
+  "column_back_button.label": "Retroceder",
   "column_header.hide_settings": "Esconder configurações",
   "column_header.moveLeft_settings": "Mover coluna para a esquerda",
   "column_header.moveRight_settings": "Mover coluna para a direita",
-  "column_header.pin": "Fixar",
+  "column_header.pin": "Afixar",
   "column_header.show_settings": "Mostrar configurações",
   "column_header.unpin": "Desafixar",
   "column_subheading.settings": "Configurações",
-  "community.column_settings.local_only": "Local apenas",
-  "community.column_settings.media_only": "Somente media",
-  "community.column_settings.remote_only": "Remoto apenas",
-  "compose.language.change": "Alterar idioma",
-  "compose.language.search": "Pesquisar idiomas...",
+  "community.column_settings.local_only": "Apenas local",
+  "community.column_settings.media_only": "Apenas média",
+  "community.column_settings.remote_only": "Apenas remoto",
+  "compose.language.change": "Alterar língua",
+  "compose.language.search": "Pesquisar línguas...",
   "compose_form.direct_message_warning_learn_more": "Conhecer mais",
-  "compose_form.encryption_warning": "As publicações no Mastodon não são encriptadas ponta a ponta. Não partilhe nenhuma informação sensível através do Mastodon.",
-  "compose_form.hashtag_warning": "Este toot não será listado em nenhuma hashtag por ser não listado. Apenas toots públics podem ser pesquisados por hashtag.",
+  "compose_form.encryption_warning": "As publicações no Mastodon não são criptografadas de ponta a ponta. Não partilhe nenhuma informação sensível através do Mastodon.",
+  "compose_form.hashtag_warning": "Esta publicação não será listada em qualquer etiqueta, pois não é pública. Apenas as publicações públicas podem ser pesquisadas por etiquetas.",
   "compose_form.lock_disclaimer": "A sua conta não é {locked}. Qualquer pessoa pode segui-lo e ver as publicações direcionadas apenas a seguidores.",
-  "compose_form.lock_disclaimer.lock": "bloqueado",
+  "compose_form.lock_disclaimer.lock": "fechada",
   "compose_form.placeholder": "Em que está a pensar?",
   "compose_form.poll.add_option": "Adicionar uma opção",
-  "compose_form.poll.duration": "Duração da votação",
+  "compose_form.poll.duration": "Duração do inquérito",
   "compose_form.poll.option_placeholder": "Opção {number}",
   "compose_form.poll.remove_option": "Eliminar esta opção",
-  "compose_form.poll.switch_to_multiple": "Alterar a votação para permitir múltiplas escolhas",
-  "compose_form.poll.switch_to_single": "Alterar a votação para permitir uma única escolha",
+  "compose_form.poll.switch_to_multiple": "Alterar o inquérito para permitir várias respostas",
+  "compose_form.poll.switch_to_single": "Alterar o inquérito para permitir uma única resposta",
   "compose_form.publish": "Publicar",
   "compose_form.publish_form": "Publicar",
   "compose_form.publish_loud": "{publish}!",
@@ -145,7 +146,7 @@
   "compose_form.sensitive.marked": "Media marcada como sensível",
   "compose_form.sensitive.unmarked": "Media não está marcada como sensível",
   "compose_form.spoiler.marked": "Texto escondido atrás de aviso",
-  "compose_form.spoiler.unmarked": "O texto não está escondido",
+  "compose_form.spoiler.unmarked": "Juntar um aviso de conteúdo",
   "compose_form.spoiler_placeholder": "Escreva o seu aviso aqui",
   "confirmation_modal.cancel": "Cancelar",
   "confirmations.block.block_and_report": "Bloquear e Denunciar",
@@ -158,16 +159,16 @@
   "confirmations.delete_list.confirm": "Eliminar",
   "confirmations.delete_list.message": "Tens a certeza de que deseja eliminar permanentemente esta lista?",
   "confirmations.discard_edit_media.confirm": "Descartar",
-  "confirmations.discard_edit_media.message": "Tem alterações não salvas na descrição ou pré-visualização da media. Descartar mesmo assim?",
+  "confirmations.discard_edit_media.message": "Tem alterações por guardar na descrição ou pré-visualização do conteúdo. Descartar mesmo assim?",
   "confirmations.domain_block.confirm": "Esconder tudo deste domínio",
   "confirmations.domain_block.message": "De certeza que queres bloquear completamente o domínio {domain}? Na maioria dos casos, silenciar ou bloquear alguns utilizadores é suficiente e é o recomendado. Não irás ver conteúdo daquele domínio em cronologia alguma nem nas tuas notificações. Os teus seguidores daquele domínio serão removidos.",
   "confirmations.logout.confirm": "Terminar sessão",
-  "confirmations.logout.message": "Deseja terminar a sessão?",
+  "confirmations.logout.message": "Tem a certeza de que quer terminar a sessão?",
   "confirmations.mute.confirm": "Silenciar",
   "confirmations.mute.explanation": "Isto irá esconder publicações deles ou publicações que os mencionem, mas irá permitir que vejam as suas publicações e sejam seus seguidores.",
   "confirmations.mute.message": "De certeza que queres silenciar {name}?",
   "confirmations.redraft.confirm": "Eliminar & reescrever",
-  "confirmations.redraft.message": "Tem a certeza que quer eliminar e reescrever esta publicação? Os favoritos e partilhas perder-se-ão e as respostas à publicação original ficarão órfãs.",
+  "confirmations.redraft.message": "Tem a certeza de que quer eliminar e reescrever esta publicação? Os favoritos e partilhas perder-se-ão e as respostas à publicação original ficarão órfãs.",
   "confirmations.reply.confirm": "Responder",
   "confirmations.reply.message": "Responder agora irá reescrever a mensagem que está a compor actualmente. Tem a certeza que quer continuar?",
   "confirmations.unfollow.confirm": "Deixar de seguir",
@@ -183,12 +184,12 @@
   "directory.new_arrivals": "Recém chegados",
   "directory.recently_active": "Com actividade recente",
   "disabled_account_banner.account_settings": "Definições da conta",
-  "disabled_account_banner.text": "A sua conta {disabledAccount} está, no momento, desativada.",
+  "disabled_account_banner.text": "A sua conta {disabledAccount} está presentemente desativada.",
   "dismissable_banner.community_timeline": "Estas são as publicações públicas mais recentes de pessoas cujas contas são hospedadas por {domain}.",
   "dismissable_banner.dismiss": "Descartar",
   "dismissable_banner.explore_links": "Essas histórias de notícias estão, no momento, a ser faladas por pessoas neste e noutros servidores da rede descentralizada.",
   "dismissable_banner.explore_statuses": "Estas publicações, deste e de outros servidores na rede descentralizada, estão, neste momento, a ganhar atenção neste servidor.",
-  "dismissable_banner.explore_tags": "Estas hashtags estão, neste momento, a ganhar atenção entre as pessoas neste e outros servidores da rede descentralizada.",
+  "dismissable_banner.explore_tags": "Estas #etiquetas estão presentemente a ganhar atenção entre as pessoas neste e noutros servidores da rede descentralizada.",
   "dismissable_banner.public_timeline": "Estas são as publicações públicas mais recentes de pessoas neste e outros servidores da rede descentralizada que esse servidor conhece.",
   "embed.instructions": "Incorpore esta publicação no seu site copiando o código abaixo.",
   "embed.preview": "Podes ver aqui como irá ficar:",
@@ -199,7 +200,7 @@
   "emoji_button.food": "Comida & Bebida",
   "emoji_button.label": "Inserir Emoji",
   "emoji_button.nature": "Natureza",
-  "emoji_button.not_found": "Não tem emojis!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "Nenhum emoji correspondente encontrado",
   "emoji_button.objects": "Objectos",
   "emoji_button.people": "Pessoas",
   "emoji_button.recent": "Utilizados regularmente",
@@ -208,19 +209,19 @@
   "emoji_button.symbols": "Símbolos",
   "emoji_button.travel": "Viagens & Lugares",
   "empty_column.account_suspended": "Conta suspensa",
-  "empty_column.account_timeline": "Sem toots por aqui!",
+  "empty_column.account_timeline": "Sem publicações por aqui!",
   "empty_column.account_unavailable": "Perfil indisponível",
   "empty_column.blocks": "Ainda não bloqueaste qualquer utilizador.",
-  "empty_column.bookmarked_statuses": "Ainda não adicionou nenhum toot aos Itens salvos. Quando adicionar, eles serão exibidos aqui.",
-  "empty_column.community": "A timeline local está vazia. Escreve algo publicamente para começar!",
+  "empty_column.bookmarked_statuses": "Ainda não tem nenhuma publicação nos seus marcadores. Quando tiver, serão exibidas aqui.",
+  "empty_column.community": "A cronologia local está vazia. Escreve algo público para começar!",
   "empty_column.direct": "Ainda não tem qualquer mensagem direta. Quando enviar ou receber alguma, ela irá aparecer aqui.",
   "empty_column.domain_blocks": "Ainda não há qualquer domínio escondido.",
-  "empty_column.explore_statuses": "Nada em destaque por agora. Volte mais tarde!",
-  "empty_column.favourited_statuses": "Ainda não tens quaisquer toots favoritos. Quando tiveres algum, ele irá aparecer aqui.",
-  "empty_column.favourites": "Ainda ninguém marcou este toot como favorito. Quando alguém o fizer, ele irá aparecer aqui.",
-  "empty_column.follow_recommendations": "Parece que não foi possível gerar nenhuma sugestão para si. Pode tentar utilizar a pesquisa para procurar pessoas que conheça ou explorar as hashtags em destaque.",
+  "empty_column.explore_statuses": "Nada está em alta no momento. Volte mais tarde!",
+  "empty_column.favourited_statuses": "Ainda não tens quaisquer publicações nos marcadores. Quando tiveres, aparecerão aqui.",
+  "empty_column.favourites": "Ainda ninguém tem esta publicação nos seus marcadores. Quando alguém o tiver, ele irá aparecer aqui.",
+  "empty_column.follow_recommendations": "Parece que não foi possível gerar nenhuma sugestão para si. Pode tentar utilizar a pesquisa para procurar pessoas que conheça ou explorar as #etiquetas em destaque.",
   "empty_column.follow_requests": "Ainda não tens nenhum pedido de seguidor. Quando receberes algum, ele irá aparecer aqui.",
-  "empty_column.hashtag": "Não foram encontradas publicações com essa hashtag.",
+  "empty_column.hashtag": "Não foram encontradas publicações com essa #etiqueta.",
   "empty_column.home": "Ainda não segues qualquer utilizador. Visita {public} ou utiliza a pesquisa para procurar outros utilizadores.",
   "empty_column.home.suggestions": "Ver algumas sugestões",
   "empty_column.list": "Ainda não existem publicações nesta lista. Quando membros desta lista fizerem novas publicações, elas aparecerão aqui.",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copiar a stacktrace para o clipboard",
   "errors.unexpected_crash.report_issue": "Reportar problema",
   "explore.search_results": "Resultados da pesquisa",
+  "explore.suggested_follows": "Para si",
   "explore.title": "Explorar",
+  "explore.trending_links": "Notícias",
+  "explore.trending_statuses": "Publicações",
+  "explore.trending_tags": "#Etiquetas",
   "filter_modal.added.context_mismatch_explanation": "Esta categoria de filtro não se aplica ao contexto em que acedeu a esta publicação. Se pretender que esta publicação seja filtrada também neste contexto, terá que editar o filtro.",
   "filter_modal.added.context_mismatch_title": "Contexto incoerente!",
   "filter_modal.added.expired_explanation": "Esta categoria de filtro expirou, necessita alterar a data de validade para que ele seja aplicado.",
@@ -271,27 +276,27 @@
   "hashtag.column_header.tag_mode.any": "ou {additional}",
   "hashtag.column_header.tag_mode.none": "sem {additional}",
   "hashtag.column_settings.select.no_options_message": "Não foram encontradas sugestões",
-  "hashtag.column_settings.select.placeholder": "Introduzir as hashtags…",
+  "hashtag.column_settings.select.placeholder": "Inserir #etiquetas…",
   "hashtag.column_settings.tag_mode.all": "Todos estes",
   "hashtag.column_settings.tag_mode.any": "Qualquer destes",
   "hashtag.column_settings.tag_mode.none": "Nenhum destes",
   "hashtag.column_settings.tag_toggle": "Incluir etiquetas adicionais para esta coluna",
-  "hashtag.follow": "Seguir hashtag",
-  "hashtag.unfollow": "Parar de seguir hashtag",
+  "hashtag.follow": "Seguir #etiqueta",
+  "hashtag.unfollow": "Deixar de seguir #etiqueta",
   "home.column_settings.basic": "Básico",
-  "home.column_settings.show_reblogs": "Mostrar boosts",
+  "home.column_settings.show_reblogs": "Mostrar impulsos",
   "home.column_settings.show_replies": "Mostrar respostas",
-  "home.hide_announcements": "Ocultar anúncios",
-  "home.show_announcements": "Exibir anúncios",
-  "interaction_modal.description.favourite": "Com uma conta no Mastodon, pode adicionar esta publicação aos favoritos para que o autor saiba que gostou e salvá-la para mais tarde.",
+  "home.hide_announcements": "Ocultar comunicações",
+  "home.show_announcements": "Exibir comunicações",
+  "interaction_modal.description.favourite": "Com uma conta no Mastodon, pode adicionar esta publicação aos marcadores para que o autor saiba que gostou e guardá-la para mais tarde.",
   "interaction_modal.description.follow": "Com uma conta no Mastodon, pode seguir {name} para receber as suas publicações na sua página inicial.",
   "interaction_modal.description.reblog": "Com uma conta no Mastodon, pode impulsionar esta publicação para compartilhá-lo com os seus seguidores.",
   "interaction_modal.description.reply": "Com uma conta no Mastodon, pode responder a esta publicação.",
   "interaction_modal.on_another_server": "Num servidor diferente",
   "interaction_modal.on_this_server": "Neste servidor",
-  "interaction_modal.other_server_instructions": "Copie e cole este URL no campo de pesquisa do seu aplicativo Mastodon favorito ou da interface web do seu servidor Mastodon.",
-  "interaction_modal.preamble": "Uma vez que o Mastodon é descentralizado, pode utilizar a sua conta existente, hospedada em outro servidor Mastodon ou plataforma compatível, se não tiver uma conta neste servidor.",
-  "interaction_modal.title.favourite": "Adicionar a publicação de {name} aos favoritos",
+  "interaction_modal.other_server_instructions": "Copie e cole este URL no campo de pesquisa da sua aplicação Mastodon preferida, ou da interface web do seu servidor Mastodon.",
+  "interaction_modal.preamble": "Uma vez que o Mastodon é descentralizado, caso não tenha uma conta neste servidor, pode utilizar a sua conta existente noutro servidor Mastodon ou plataforma compatível.",
+  "interaction_modal.title.favourite": "Adicionar a publicação de {name} aos marcadores",
   "interaction_modal.title.follow": "Seguir {name}",
   "interaction_modal.title.reblog": "Impulsionar a publicação de {name}",
   "interaction_modal.title.reply": "Responder à publicação de {name}",
@@ -300,17 +305,17 @@
   "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}",
   "keyboard_shortcuts.back": "para voltar",
   "keyboard_shortcuts.blocked": "para abrir a lista de utilizadores bloqueados",
-  "keyboard_shortcuts.boost": "para partilhar",
+  "keyboard_shortcuts.boost": "Impulsionar a publicação",
   "keyboard_shortcuts.column": "para focar uma publicação numa das colunas",
   "keyboard_shortcuts.compose": "para focar na área de publicação",
   "keyboard_shortcuts.description": "Descrição",
   "keyboard_shortcuts.direct": "para abrir a coluna das mensagens diretas",
   "keyboard_shortcuts.down": "para mover para baixo na lista",
   "keyboard_shortcuts.enter": "para expandir uma publicação",
-  "keyboard_shortcuts.favourite": "para adicionar aos favoritos",
-  "keyboard_shortcuts.favourites": "para abrir a lista dos favoritos",
+  "keyboard_shortcuts.favourite": "Juntar aos marcadores",
+  "keyboard_shortcuts.favourites": "Abrir lista de marcadores",
   "keyboard_shortcuts.federated": "para abrir a cronologia federada",
-  "keyboard_shortcuts.heading": "Atalhos do teclado",
+  "keyboard_shortcuts.heading": "Atalhos de teclado",
   "keyboard_shortcuts.home": "para abrir a cronologia inicial",
   "keyboard_shortcuts.hotkey": "Atalho",
   "keyboard_shortcuts.legend": "para mostrar esta legenda",
@@ -393,7 +398,7 @@
   "notification.mention": "{name} mencionou-te",
   "notification.own_poll": "A sua votação terminou",
   "notification.poll": "Uma votação em que participaste chegou ao fim",
-  "notification.reblog": "{name} partilhou a tua publicação",
+  "notification.reblog": "{name} reforçou a tua publicação",
   "notification.status": "{name} acabou de publicar",
   "notification.update": "{name} editou uma publicação",
   "notifications.clear": "Limpar notificações",
@@ -401,34 +406,34 @@
   "notifications.column_settings.admin.report": "Novas denúncias:",
   "notifications.column_settings.admin.sign_up": "Novas inscrições:",
   "notifications.column_settings.alert": "Notificações no ambiente de trabalho",
-  "notifications.column_settings.favourite": "Favoritos:",
+  "notifications.column_settings.favourite": "Marcadores:",
   "notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorias",
   "notifications.column_settings.filter_bar.category": "Barra de filtros rápidos",
   "notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros",
   "notifications.column_settings.follow": "Novos seguidores:",
   "notifications.column_settings.follow_request": "Novos pedidos de seguidor:",
   "notifications.column_settings.mention": "Menções:",
-  "notifications.column_settings.poll": "Resultados da votação:",
+  "notifications.column_settings.poll": "Resultados do inquérito:",
   "notifications.column_settings.push": "Notificações Push",
-  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.reblog": "Reforços:",
   "notifications.column_settings.show": "Mostrar na coluna",
   "notifications.column_settings.sound": "Reproduzir som",
-  "notifications.column_settings.status": "Novos toots:",
-  "notifications.column_settings.unread_notifications.category": "Notificações não lidas",
-  "notifications.column_settings.unread_notifications.highlight": "Destacar notificações não lidas",
+  "notifications.column_settings.status": "Novas publicações:",
+  "notifications.column_settings.unread_notifications.category": "Notificações por ler",
+  "notifications.column_settings.unread_notifications.highlight": "Destacar notificações por ler",
   "notifications.column_settings.update": "Edições:",
   "notifications.filter.all": "Todas",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favoritos",
+  "notifications.filter.boosts": "Reforços",
+  "notifications.filter.favourites": "Marcadores",
   "notifications.filter.follows": "Seguidores",
   "notifications.filter.mentions": "Menções",
-  "notifications.filter.polls": "Votações",
+  "notifications.filter.polls": "Resultados do inquérito",
   "notifications.filter.statuses": "Atualizações de pessoas que você segue",
-  "notifications.grant_permission": "Conceder permissões.",
+  "notifications.grant_permission": "Conceder permissão.",
   "notifications.group": "{count} notificações",
   "notifications.mark_as_read": "Marcar todas as notificações como lidas",
   "notifications.permission_denied": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão, solicitada pelo navegador, foi recusada anteriormente",
-  "notifications.permission_denied_alert": "Notificações no ambinente de trabalho não podem ser ativadas, pois a permissão do navegador foi recusada anteriormente",
+  "notifications.permission_denied_alert": "Notificações no ambiente de trabalho não podem ser ativadas, pois a permissão do navegador foi recusada anteriormente",
   "notifications.permission_required": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão necessária não foi concedida.",
   "notifications_permission_banner.enable": "Ativar notificações no ambiente de trabalho",
   "notifications_permission_banner.how_to_control": "Para receber notificações quando o Mastodon não estiver aberto, ative as notificações no ambiente de trabalho. Depois da sua ativação, pode controlar precisamente quais tipos de interações geram notificações, através do botão {icon} acima.",
@@ -442,7 +447,7 @@
   "poll.voted": "Votaste nesta resposta",
   "poll.votes": "{votes, plural, one {# voto } other {# votos}}",
   "poll_button.add_poll": "Adicionar votação",
-  "poll_button.remove_poll": "Remover votação",
+  "poll_button.remove_poll": "Remover sondagem",
   "privacy.change": "Ajustar a privacidade da publicação",
   "privacy.direct.long": "Apenas para utilizadores mencionados",
   "privacy.direct.short": "Apenas pessoas mencionadas",
@@ -453,7 +458,7 @@
   "privacy.unlisted.long": "Visível para todos, mas não incluir em funcionalidades de divulgação",
   "privacy.unlisted.short": "Não listar",
   "privacy_policy.last_updated": "Última atualização em {date}",
-  "privacy_policy.title": "Política de Privacidade",
+  "privacy_policy.title": "Política de privacidade",
   "refresh": "Actualizar",
   "regeneration_indicator.label": "A carregar…",
   "regeneration_indicator.sublabel": "A tua página inicial está a ser preparada!",
@@ -470,7 +475,7 @@
   "relative_time.today": "hoje",
   "reply_indicator.cancel": "Cancelar",
   "report.block": "Bloquear",
-  "report.block_explanation": "Não verá as publicações deles. Eles não serão capazes de ver suas publicações ou de o seguir. Eles vão conseguir saber que estão bloqueados.",
+  "report.block_explanation": "Não verá as suas publicações. Eles deixarão de poder ver suas publicações ou segui-lo. Eles poderão perceber que estão bloqueados.",
   "report.categories.other": "Outro",
   "report.categories.spam": "Spam",
   "report.categories.violation": "O conteúdo viola uma ou mais regras do servidor",
@@ -479,19 +484,19 @@
   "report.category.title_account": "perfil",
   "report.category.title_status": "publicação",
   "report.close": "Concluído",
-  "report.comment.title": "Há algo mais que pensa que devemos saber?",
-  "report.forward": "Reenviar para {target}",
-  "report.forward_hint": "A conta é de outro servidor. Enviar uma cópia anónima da denúncia para lá também?",
+  "report.comment.title": "Há algo mais que ache de que deveríamos saber?",
+  "report.forward": "Reencaminhar para {target}",
+  "report.forward_hint": "A conta é de outro servidor. Enviar uma cópia da anónima da denúncia para lá também?",
   "report.mute": "Silenciar",
-  "report.mute_explanation": "Não verá as publicações deles. Eles ainda poderão segui-lo e ver as suas publicações e não saberão que estão silenciados.",
+  "report.mute_explanation": "Não verá as suas publicações. Eles ainda poderão segui-lo e ver as suas publicações, e não saberão que estão silenciados.",
   "report.next": "Seguinte",
   "report.placeholder": "Comentários adicionais",
-  "report.reasons.dislike": "Não gosto disso",
+  "report.reasons.dislike": "Não gosto disto",
   "report.reasons.dislike_description": "Não é algo que deseje ver",
   "report.reasons.other": "É outra coisa",
   "report.reasons.other_description": "O problema não se encaixa nas outras categorias",
   "report.reasons.spam": "É spam",
-  "report.reasons.spam_description": "Links maliciosos, contactos falsos, ou respostas repetitivas",
+  "report.reasons.spam_description": "Hiperligações maliciosas, contactos falsos, ou respostas repetitivas",
   "report.reasons.violation": "Viola as regras do servidor",
   "report.reasons.violation_description": "Está ciente de que infringe regras específicas",
   "report.rules.subtitle": "Selecione tudo o que se aplicar",
@@ -503,7 +508,7 @@
   "report.thanks.take_action": "Aqui estão as suas opções para controlar o que vê no Mastodon:",
   "report.thanks.take_action_actionable": "Enquanto revemos a sua denúncia, pode tomar medidas contra @{name}:",
   "report.thanks.title": "Não quer ver isto?",
-  "report.thanks.title_actionable": "Obrigado por reportar, vamos analisar.",
+  "report.thanks.title_actionable": "Obrigado por denunciar. Iremos analisar.",
   "report.unfollow": "Deixar de seguir @{name}",
   "report.unfollow_explanation": "Está a seguir esta conta. Para não ver mais as publicações desta conta na sua página inicial, deixe de segui-la.",
   "report_notification.attached_statuses": "{count, plural,one {{count} publicação} other {{count} publicações}} em anexo",
@@ -514,17 +519,17 @@
   "search.placeholder": "Pesquisar",
   "search.search_or_paste": "Pesquisar ou introduzir URL",
   "search_popout.search_format": "Formato avançado de pesquisa",
-  "search_popout.tips.full_text": "Texto simples devolve publicações que escreveu, marcou como favorita, partilhou ou em que foi mencionado, tal como nomes de utilizador, alcunhas e hashtags.",
-  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.full_text": "Texto simples devolve publicações que escreveu, marcou, reforçou, ou em que foi mencionado, tal como nomes de utilizador, alcunhas e #etiquetas.",
+  "search_popout.tips.hashtag": "etiqueta",
   "search_popout.tips.status": "publicação",
-  "search_popout.tips.text": "O texto simples retorna a correspondência de nomes, utilizadores e hashtags",
+  "search_popout.tips.text": "O texto simples retorna a correspondência de nomes, utilizadores e #etiquetas",
   "search_popout.tips.user": "utilizador",
   "search_results.accounts": "Pessoas",
   "search_results.all": "Tudo",
-  "search_results.hashtags": "Hashtags",
+  "search_results.hashtags": "Etiquetas",
   "search_results.nothing_found": "Não foi possível encontrar resultados para as expressões pesquisadas",
-  "search_results.statuses": "Toots",
-  "search_results.statuses_fts_disabled": "A pesquisa de toots pelo seu conteúdo não está disponível nesta instância Mastodon.",
+  "search_results.statuses": "Publicações",
+  "search_results.statuses_fts_disabled": "A pesquisa de publicações pelo seu conteúdo não está disponível nesta instância Mastodon.",
   "search_results.title": "Pesquisar por {q}",
   "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
   "server_banner.about_active_users": "Pessoas que utilizaram este servidor nos últimos 30 dias (Utilizadores Ativos Mensais)",
@@ -535,25 +540,26 @@
   "server_banner.server_stats": "Estatísticas do servidor:",
   "sign_in_banner.create_account": "Criar conta",
   "sign_in_banner.sign_in": "Iniciar sessão",
-  "sign_in_banner.text": "Inicie sessão para seguir perfis ou hashtags, favoritos, partilhar e responder às publicações ou interagir através da sua conta noutro servidor.",
+  "sign_in_banner.text": "Inicie sessão para seguir perfis ou #etiquetas, ou marcadores, para partilhar ou responder às publicações, ou interagir através da sua conta noutro servidor.",
   "status.admin_account": "Abrir a interface de moderação para @{name}",
+  "status.admin_domain": "Abrir interface de moderação para {domain}",
   "status.admin_status": "Abrir esta publicação na interface de moderação",
   "status.block": "Bloquear @{name}",
-  "status.bookmark": "Salvar",
-  "status.cancel_reblog_private": "Remover boost",
-  "status.cannot_reblog": "Não é possível fazer boost a esta publicação",
-  "status.copy": "Copiar o link para a publicação",
+  "status.bookmark": "Guardar nos marcadores",
+  "status.cancel_reblog_private": "Deixar de reforçar",
+  "status.cannot_reblog": "Não é possível reforçar esta publicação",
+  "status.copy": "Copiar ligação para a publicação",
   "status.delete": "Eliminar",
-  "status.detailed_status": "Vista de conversação detalhada",
+  "status.detailed_status": "Vista pormenorizada da conversa",
   "status.direct": "Mensagem direta @{name}",
   "status.edit": "Editar",
   "status.edited": "Editado em {date}",
   "status.edited_x_times": "Editado {count, plural,one {{count} vez} other {{count} vezes}}",
-  "status.embed": "Incorporar",
-  "status.favourite": "Adicionar aos favoritos",
+  "status.embed": "Embutir",
+  "status.favourite": "Adicionar aos marcadores",
   "status.filter": "Filtrar esta publicação",
   "status.filtered": "Filtrada",
-  "status.hide": "Esconder publicação",
+  "status.hide": "Ocultar publicação",
   "status.history.created": "{name} criado em {date}",
   "status.history.edited": "{name} editado em {date}",
   "status.load_more": "Carregar mais",
@@ -563,20 +569,20 @@
   "status.mute": "Silenciar @{name}",
   "status.mute_conversation": "Silenciar conversa",
   "status.open": "Expandir",
-  "status.pin": "Fixar no perfil",
-  "status.pinned": "Publicação fixa",
+  "status.pin": "Afixar no perfil",
+  "status.pinned": "Publicação afixada",
   "status.read_more": "Ler mais",
-  "status.reblog": "Partilhar",
-  "status.reblog_private": "Fazer boost com a audiência original",
-  "status.reblogged_by": "{name} fez boost",
-  "status.reblogs.empty": "Ainda ninguém fez boost a este toot. Quando alguém o fizer, ele irá aparecer aqui.",
+  "status.reblog": "Reforçar",
+  "status.reblog_private": "Reforçar com a visibilidade de origem",
+  "status.reblogged_by": "{name} reforçou",
+  "status.reblogs.empty": "Ainda ninguém reforçou esta publicação. Quando alguém o fizer, ele irá aparecer aqui.",
   "status.redraft": "Apagar & reescrever",
-  "status.remove_bookmark": "Remover dos itens salvos",
+  "status.remove_bookmark": "Retirar dos marcadores",
   "status.replied_to": "Respondeu a {name}",
   "status.reply": "Responder",
   "status.replyAll": "Responder à conversa",
   "status.report": "Denunciar @{name}",
-  "status.sensitive_warning": "Conteúdo sensível",
+  "status.sensitive_warning": "Conteúdo problemático",
   "status.share": "Partilhar",
   "status.show_filter_reason": "Mostrar mesmo assim",
   "status.show_less": "Mostrar menos",
@@ -586,14 +592,14 @@
   "status.show_original": "Mostrar original",
   "status.translate": "Traduzir",
   "status.translated_from_with": "Traduzido do {lang} usando {provider}",
-  "status.uncached_media_warning": "Não disponível",
+  "status.uncached_media_warning": "Indisponível",
   "status.unmute_conversation": "Deixar de silenciar esta conversa",
-  "status.unpin": "Não fixar no perfil",
-  "subscribed_languages.lead": "Após a alteração, apenas as publicações nos idiomas selecionados aparecerão na sua página inicial e listas. Não selecione nenhuma para receber publicações de todos os idiomas.",
+  "status.unpin": "Desafixar do perfil",
+  "subscribed_languages.lead": "Após a alteração, apenas as publicações nas línguas seleccionadas aparecerão na sua página inicial e listas. Não selecione nenhuma para receber publicações de todas as línguas.",
   "subscribed_languages.save": "Guardar alterações",
-  "subscribed_languages.target": "Alterar idiomas subscritos para {target}",
+  "subscribed_languages.target": "Alterar línguas assinadas para {target}",
   "suggestions.dismiss": "Dispensar a sugestão",
-  "suggestions.header": "Tu podes estar interessado em…",
+  "suggestions.header": "Poderá estar interessado em…",
   "tabs_bar.federated_timeline": "Federada",
   "tabs_bar.home": "Início",
   "tabs_bar.local_timeline": "Local",
@@ -606,19 +612,19 @@
   "timeline_hint.remote_resource_not_displayed": "{resource} de outros servidores não são exibidos.",
   "timeline_hint.resources.followers": "Seguidores",
   "timeline_hint.resources.follows": "Seguindo",
-  "timeline_hint.resources.statuses": "Toots antigos",
+  "timeline_hint.resources.statuses": "Publicações mais antigas",
   "trends.counter_by_accounts": "{count, plural, one {{counter} pessoa} other {{counter} pessoas}} {days, plural, one {no último dia} other {nos últimos {days} dias}}",
-  "trends.trending_now": "Tendências atuais",
+  "trends.trending_now": "Em alta neste momento",
   "ui.beforeunload": "O teu rascunho será perdido se abandonares o Mastodon.",
   "units.short.billion": "{count}MM",
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}m",
   "upload_area.title": "Arraste e solte para enviar",
-  "upload_button.label": "Adicionar media",
+  "upload_button.label": "Juntar imagens, um vídeo, ou um ficheiro de som",
   "upload_error.limit": "Limite máximo do ficheiro a carregar excedido.",
-  "upload_error.poll": "Carregamento de ficheiros não é permitido em votações.",
+  "upload_error.poll": "O carregamento de ficheiros não é permitido em sondagens.",
   "upload_form.audio_description": "Descreva para pessoas com diminuição da acuidade auditiva",
-  "upload_form.description": "Descrição da imagem para pessoas com dificuldades visuais",
+  "upload_form.description": "Descreva para pessoas com diminuição da acuidade visual",
   "upload_form.description_missing": "Nenhuma descrição adicionada",
   "upload_form.edit": "Editar",
   "upload_form.thumbnail": "Alterar miniatura",
@@ -632,18 +638,18 @@
   "upload_modal.detect_text": "Detectar texto na imagem",
   "upload_modal.edit_media": "Editar media",
   "upload_modal.hint": "Clique ou arraste o círculo na pré-visualização para escolher o ponto focal que será sempre visível em todas as miniaturas.",
-  "upload_modal.preparing_ocr": "A preparar OCR…",
+  "upload_modal.preparing_ocr": "A preparar o reconhecimento de caracteres (OCR)…",
   "upload_modal.preview_label": "Pré-visualizar ({ratio})",
   "upload_progress.label": "A enviar...",
   "upload_progress.processing": "A processar…",
   "video.close": "Fechar vídeo",
   "video.download": "Descarregar ficheiro",
-  "video.exit_fullscreen": "Sair de full screen",
+  "video.exit_fullscreen": "Sair do modo ecrã inteiro",
   "video.expand": "Expandir vídeo",
   "video.fullscreen": "Ecrã completo",
   "video.hide": "Esconder vídeo",
   "video.mute": "Silenciar",
   "video.pause": "Pausar",
   "video.play": "Reproduzir",
-  "video.unmute": "Remover de silêncio"
+  "video.unmute": "Deixar de silenciar"
 }
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index 69ab4fb9b..6e5674bd1 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Postări și răspunsuri",
   "account.report": "Raportează pe @{name}",
   "account.requested": "Se așteaptă aprobarea. Apasă pentru a anula cererea de urmărire",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Distribuie profilul lui @{name}",
   "account.show_reblogs": "Arată impulsurile de la @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Căutare limbi…",
   "compose_form.direct_message_warning_learn_more": "Află mai multe",
   "compose_form.encryption_warning": "Postările pe Mastodon nu sunt criptate în ambele părți. Nu împărtășiți nici o informație sensibilă pe Mastodon.",
-  "compose_form.hashtag_warning": "Această postare nu va fi listată sub niciun hashtag deoarece este nelistată. Doar postările publice pot fi căutate cu un hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Contul tău nu este {locked}. Oricine se poate abona la tine pentru a îți vedea postările numai pentru abonați.",
   "compose_form.lock_disclaimer.lock": "privat",
   "compose_form.placeholder": "La ce te gândești?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copiere stacktrace în clipboard",
   "errors.unexpected_crash.report_issue": "Raportează o problemă",
   "explore.search_results": "Rezultatele căutării",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explorează",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "Această categorie de filtre nu se aplică în contextul în care ați accesat acestă postare. Dacă doriți ca postarea să fie filtrată și în acest context, va trebui să editați filtrul.",
   "filter_modal.added.context_mismatch_title": "Nepotrivire contextuală!",
   "filter_modal.added.expired_explanation": "Această categorie de filtre a expirat, va trebui să modifici data de expirare pentru ca aceasta să se aplice.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Conectează-te",
   "sign_in_banner.text": "Conectează-te pentru a te abona la profiluri și haștaguri, pentru a aprecia, distribui și a răspunde postărilor, sau interacționează folosindu-ți contul de pe un alt server.",
   "status.admin_account": "Deschide interfața de moderare pentru @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Deschide această stare în interfața de moderare",
   "status.block": "Blochează pe @{name}",
   "status.bookmark": "Marchează",
@@ -553,7 +559,7 @@
   "status.favourite": "Favorite",
   "status.filter": "Filtrează această postare",
   "status.filtered": "Sortate",
-  "status.hide": "Ascunde postarea",
+  "status.hide": "Hide post",
   "status.history.created": "creată de {name} pe {date}",
   "status.history.edited": "modificată de {name} pe {date}",
   "status.load_more": "Încarcă mai multe",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 506622e7f..890b62bf4 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Посты и ответы",
   "account.report": "Пожаловаться на @{name}",
   "account.requested": "Ожидает подтверждения. Нажмите для отмены запроса",
+  "account.requested_follow": "{name} отправил(а) вам запрос на подписку",
   "account.share": "Поделиться профилем @{name}",
   "account.show_reblogs": "Показывать продвижения от @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} пост} many {{counter} постов} other {{counter} поста}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Поиск языков...",
   "compose_form.direct_message_warning_learn_more": "Подробнее",
   "compose_form.encryption_warning": "Посты в Mastodon не защищены сквозным шифрованием. Не делитесь конфиденциальной информацией через Mastodon.",
-  "compose_form.hashtag_warning": "Так как этот пост не публичный, он не отобразится в поиске по хэштегам.",
+  "compose_form.hashtag_warning": "Этот пост не будет виден ни под одним из хэштегов, так как он не публичный. Только публичные посты можно найти по хэштегу.",
   "compose_form.lock_disclaimer": "Ваша учётная запись {locked}. Любой пользователь сможет подписаться на вас и просматривать посты для подписчиков.",
   "compose_form.lock_disclaimer.lock": "не закрыта",
   "compose_form.placeholder": "О чём думаете?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Скопировать диагностическую информацию",
   "errors.unexpected_crash.report_issue": "Сообщить о проблеме",
   "explore.search_results": "Результаты поиска",
+  "explore.suggested_follows": "Для вас",
   "explore.title": "Обзор",
+  "explore.trending_links": "Новости",
+  "explore.trending_statuses": "Посты",
+  "explore.trending_tags": "Хэштеги",
   "filter_modal.added.context_mismatch_explanation": "Эта категория не применяется к контексту, в котором вы получили доступ к этому посту. Если вы хотите, чтобы пост был отфильтрован в этом контексте, вам придётся отредактировать фильтр.",
   "filter_modal.added.context_mismatch_title": "Несоответствие контекста!",
   "filter_modal.added.expired_explanation": "Эта категория фильтра устарела, вам нужно изменить дату окончания фильтра, чтобы применить его.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Войти",
   "sign_in_banner.text": "Войдите, чтобы следить за профилями, хэштегами или избранным, делиться сообщениями и отвечать на них или взаимодействовать с вашей учётной записью на другом сервере.",
   "status.admin_account": "Открыть интерфейс модератора для @{name}",
+  "status.admin_domain": "Открыть интерфейс модерации {domain}",
   "status.admin_status": "Открыть этот пост в интерфейсе модератора",
   "status.block": "Заблокировать @{name}",
   "status.bookmark": "Сохранить в закладки",
diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json
index 0507010cc..c4e51431b 100644
--- a/app/javascript/mastodon/locales/sa.json
+++ b/app/javascript/mastodon/locales/sa.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "दौत्यानि प्रत्युत्तराणि च",
   "account.report": "आविद्यताम् @{name}",
   "account.requested": "स्वीकृतिः प्रतीक्ष्यते । नश्यतामित्यस्मिन्नुद्यतां निराकर्तुम् ।",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "@{name} मित्रस्य विवरणं विभाज्यताम्",
   "account.show_reblogs": "@{name} मित्रस्य प्रकाशनानि दृश्यन्ताम्",
   "account.statuses_counter": "{count, plural, one {{counter} दौत्यम्} two {{counter} दौत्ये} other {{counter} दौत्यानि}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "अधिकं ज्ञायताम्",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "न कस्मिन्नपि प्रचलितवस्तुषु सूचितमिदं दौत्यम् । केवलं सार्वजनिकदौत्यानि प्रचलितवस्तुचिह्नेन अन्वेषयितुं शक्यते ।",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "तव लेखा न प्रवेष्टुमशक्या {locked} । कोऽप्यनुसर्ता ते केवलमनुसर्तृृणां कृते स्थितानि दौत्यानि द्रष्टुं शक्नोति ।",
   "compose_form.lock_disclaimer.lock": "अवरुद्धः",
   "compose_form.placeholder": "मनसि ते किमस्ति?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json
index 4990d6813..f56f2d5bd 100644
--- a/app/javascript/mastodon/locales/sc.json
+++ b/app/javascript/mastodon/locales/sc.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Publicatziones e rispostas",
   "account.report": "Signala @{name}",
   "account.requested": "Abetende s'aprovatzione. Incarca pro annullare sa rechesta de sighidura",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Cumpartzi su profilu de @{name}",
   "account.show_reblogs": "Ammustra is cumpartziduras de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} publicatzione} other {{counter} publicatziones}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Àteras informatziones",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "Custa publicatzione no at a èssere ammustrada in peruna eticheta, dae chi no est listada. Isceti is publicatziones pùblicas podent èssere chircadas cun etichetas.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Su contu tuo no est {locked}. Cale si siat persone ti podet sighire pro bìdere is messàgios tuos chi imbies a sa gente chi ti sighit.",
   "compose_form.lock_disclaimer.lock": "blocadu",
   "compose_form.placeholder": "A ite ses pensende?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Còpia stacktrace in punta de billete",
   "errors.unexpected_crash.report_issue": "Sinnala unu problema",
   "explore.search_results": "Resurtados de sa chirca",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Aberi s'interfache de moderatzione pro @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Aberi custa publicatzione in s'interfache de moderatzione",
   "status.block": "Bloca a @{name}",
   "status.bookmark": "Sinnalibru",
@@ -553,7 +559,7 @@
   "status.favourite": "Preferidos",
   "status.filter": "Filter this post",
   "status.filtered": "Filtradu",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Càrriga·nde àteros",
diff --git a/app/javascript/mastodon/locales/sco.json b/app/javascript/mastodon/locales/sco.json
index deb2aca76..5e13c89a5 100644
--- a/app/javascript/mastodon/locales/sco.json
+++ b/app/javascript/mastodon/locales/sco.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Posts an repones",
   "account.report": "Clype @{name}",
   "account.requested": "Haudin fir approval. Chap tae cancel follae request",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Shaw heezes frae @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Seirch leids...",
   "compose_form.direct_message_warning_learn_more": "Lairn mair",
   "compose_form.encryption_warning": "Posts on Mastodon isnae en-tae-en encryptit. Dinnae share onie sensitive information ower Mastodon.",
-  "compose_form.hashtag_warning": "This post wulnae be listit unner onie hashtag seein it is no listit. Ainly public posts kin be seirchit oot bi hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Yer accoont isnae {locked}. Awbody kin follae ye for tae luik at yer follaer-ainly posts.",
   "compose_form.lock_disclaimer.lock": "lockit",
   "compose_form.placeholder": "Whit's on yer mind?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace tae yer clipboord",
   "errors.unexpected_crash.report_issue": "Sen in a issue",
   "explore.search_results": "Seirch finnins",
+  "explore.suggested_follows": "For you",
   "explore.title": "Splore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter caitegory disnae apply tae the context thit ye'v uised tae access this post. Gin ye'r wantin the post tae be filtert in this context tae, ye'll hae tae edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context disnae match!",
   "filter_modal.added.expired_explanation": "This filter caitegory haes expirit, ye'll hae tae chynge the expiration date fir it tae apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in fir tae follae profiles o hashtags, favourite, shaire an reply tae posts, or interack fae yer accoont on a different server.",
   "status.admin_account": "Open moderation interface fir @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this post in the moderation interface",
   "status.block": "Dingie @{name}",
   "status.bookmark": "Buikmairk",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtert",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} creatit {date}",
   "status.history.edited": "{name} editit {date}",
   "status.load_more": "Load mair",
diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json
index a7d66a25f..631fe3f31 100644
--- a/app/javascript/mastodon/locales/si.json
+++ b/app/javascript/mastodon/locales/si.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "ටූට්ස් සහ පිළිතුරු",
   "account.report": "@{name} වාර්තා කරන්න",
   "account.requested": "අනුමැතිය බලාපොරොත්තුවෙන්",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "@{name} ගේ පැතිකඩ බෙදාගන්න",
   "account.show_reblogs": "@{name}සිට බූස්ට් පෙන්වන්න",
   "account.statuses_counter": "{count, plural, one {{counter} ටූට්} other {{counter} ටූට්ස්}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "භාෂා සොයන්න...",
   "compose_form.direct_message_warning_learn_more": "තව දැනගන්න",
   "compose_form.encryption_warning": "Mastodon හි පළ කිරීම් අන්තයේ සිට අවසානය දක්වා සංකේතනය කර නොමැත. Mastodon හරහා කිසිදු සංවේදී තොරතුරක් බෙදා නොගන්න.",
-  "compose_form.hashtag_warning": "මෙම මෙවලම ලැයිස්තුගත කර නොමැති බැවින් කිසිදු හැෂ් ටැගය යටතේ ලැයිස්තුගත නොකෙරේ. හැෂ් ටැග් මගින් සෙවිය හැක්කේ පොදු මෙවලම් පමණි.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "ඔබගේ ගිණුම {locked}නොවේ. ඔබගේ අනුගාමිකයින්ට පමණක් පළ කිරීම් බැලීමට ඕනෑම කෙනෙකුට ඔබව අනුගමනය කළ හැක.",
   "compose_form.lock_disclaimer.lock": "අගුළු දමා ඇත",
   "compose_form.placeholder": "ඔබගේ සිතුවිලි මොනවාද?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "ස්ටැක්ට්රේස් පසුරු පුවරුවට පිටපත් කරන්න",
   "errors.unexpected_crash.report_issue": "ගැටළුව වාර්තාව",
   "explore.search_results": "සෙවුම් ප්‍රතිඵල",
+  "explore.suggested_follows": "For you",
   "explore.title": "ගවේශණය",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "@{name}සඳහා මධ්‍යස්ථ අතුරුමුහුණත විවෘත කරන්න",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "මධ්‍යස්ථ අතුරුමුහුණතෙහි මෙම තත්ත්වය විවෘත කරන්න",
   "status.block": "@{name} අවහිර",
   "status.bookmark": "පොත්යොමුවක්",
@@ -553,7 +559,7 @@
   "status.favourite": "ප්‍රියතම",
   "status.filter": "Filter this post",
   "status.filtered": "පෙරන ලද",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} නිර්මාණය {date}",
   "status.history.edited": "{name} සංස්කරණය {date}",
   "status.load_more": "තව පූරණය",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 2dc44367d..efbccdc38 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Príspevky a odpovede",
   "account.report": "Nahlás @{name}",
   "account.requested": "Čaká na schválenie. Klikni pre zrušenie žiadosti",
+  "account.requested_follow": "{name} ťa žiada nasledovať",
   "account.share": "Zdieľaj @{name} profil",
   "account.show_reblogs": "Ukáž vyzdvihnutia od @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Hľadaj medzi jazykmi...",
   "compose_form.direct_message_warning_learn_more": "Zisti viac",
   "compose_form.encryption_warning": "Príspevky na Mastodon nie sú end-to-end šifrované. Nezdieľajte cez Mastodon žiadne citlivé informácie.",
-  "compose_form.hashtag_warning": "Tento toot nebude zobrazený pod žiadným haštagom lebo nieje listovaný. Iba verejné tooty môžu byť nájdené podľa haštagu.",
+  "compose_form.hashtag_warning": "Tento príspevok nebude zobrazený pod žiadným haštagom, lebo nieje verejne listovaný. Iba verejné príspevky môžu byť nájdené podľa haštagu.",
   "compose_form.lock_disclaimer": "Tvoj úč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?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Skopíruj stacktrace do schránky",
   "errors.unexpected_crash.report_issue": "Nahlás problém",
   "explore.search_results": "Výsledky hľadania",
+  "explore.suggested_follows": "Pre teba",
   "explore.title": "Objavuj",
+  "explore.trending_links": "Novinky",
+  "explore.trending_statuses": "Príspevky",
+  "explore.trending_tags": "Haštagy",
   "filter_modal.added.context_mismatch_explanation": "Táto kategória filtrov sa nevzťahuje na kontext, v ktorom ste získali prístup k tomuto príspevku. Ak chcete, aby sa príspevok filtroval aj v tomto kontexte, budete musieť filter upraviť.",
   "filter_modal.added.context_mismatch_title": "Nesúlad kontextu!",
   "filter_modal.added.expired_explanation": "Platnosť tejto kategórie filtra vypršala, aby sa použila, je potrebné zmeniť dátum vypršania platnosti.",
@@ -509,10 +514,10 @@
   "report_notification.attached_statuses": "{count, plural, one {{count} post} other {{count} posts}} attached",
   "report_notification.categories.other": "Ostatné",
   "report_notification.categories.spam": "Spam",
-  "report_notification.categories.violation": "Rule violation",
-  "report_notification.open": "Open report",
+  "report_notification.categories.violation": "Porušenie pravidla",
+  "report_notification.open": "Otvor hlásenie",
   "search.placeholder": "Hľadaj",
-  "search.search_or_paste": "Search or paste URL",
+  "search.search_or_paste": "Hľadaj, alebo vlož URL adresu",
   "search_popout.search_format": "Pokročilé vyhľadávanie",
   "search_popout.tips.full_text": "Vráti jednoduchý textový výpis príspevkov ktoré si napísal/a, ktoré si obľúbil/a, povýšil/a, alebo aj tých, v ktorých si bol/a spomenutý/á, a potom všetky zadaniu odpovedajúce prezývky, mená a haštagy.",
   "search_popout.tips.hashtag": "haštag",
@@ -525,10 +530,10 @@
   "search_results.nothing_found": "Could not find anything for these search terms",
   "search_results.statuses": "Príspevky",
   "search_results.statuses_fts_disabled": "Vyhľadávanie v obsahu príspevkov nieje na tomto Mastodon serveri povolené.",
-  "search_results.title": "Search for {q}",
+  "search_results.title": "Hľadaj {q}",
   "search_results.total": "{count, number} {count, plural, one {výsledok} many {výsledkov} other {výsledky}}",
   "server_banner.about_active_users": "People using this server during the last 30 days (Monthly Active Users)",
-  "server_banner.active_users": "active users",
+  "server_banner.active_users": "aktívni užívatelia",
   "server_banner.administered_by": "Správcom je:",
   "server_banner.introduction": "{domain} is part of the decentralized social network powered by {mastodon}.",
   "server_banner.learn_more": "Zisti viac",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Prihlás sa",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Otvor moderovacie rozhranie užívateľa @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Otvor tento príspevok v moderovacom rozhraní",
   "status.block": "Blokuj @{name}",
   "status.bookmark": "Záložka",
@@ -551,7 +557,7 @@
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
   "status.embed": "Vložiť",
   "status.favourite": "Páči sa mi",
-  "status.filter": "Filter this post",
+  "status.filter": "Filtrovanie tohto príspevku",
   "status.filtered": "Filtrované",
   "status.hide": "Skry príspevok",
   "status.history.created": "{name} vytvoril/a {date}",
@@ -635,7 +641,7 @@
   "upload_modal.preparing_ocr": "Pripravujem OCR…",
   "upload_modal.preview_label": "Náhľad ({ratio})",
   "upload_progress.label": "Nahráva sa...",
-  "upload_progress.processing": "Processing…",
+  "upload_progress.processing": "Spracovávanie…",
   "video.close": "Zavri video",
   "video.download": "Stiahni súbor",
   "video.exit_fullscreen": "Vypni zobrazenie na celú obrazovku",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index b49db119b..0c9125acd 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Objave in odgovori",
   "account.report": "Prijavi @{name}",
   "account.requested": "Čakanje na odobritev. Kliknite, da prekličete prošnjo za sledenje",
+  "account.requested_follow": "{name} vam želi slediti",
   "account.share": "Deli profil osebe @{name}",
   "account.show_reblogs": "Pokaži izpostavitve osebe @{name}",
   "account.statuses_counter": "{count, plural, one {{count} tut} two {{count} tuta} few {{count} tuti} other {{count} tutov}}",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Kopiraj sledenje skladu na odložišče",
   "errors.unexpected_crash.report_issue": "Prijavi težavo",
   "explore.search_results": "Rezultati iskanja",
+  "explore.suggested_follows": "Za vas",
   "explore.title": "Razišči",
+  "explore.trending_links": "Novice",
+  "explore.trending_statuses": "Objave",
+  "explore.trending_tags": "Ključniki",
   "filter_modal.added.context_mismatch_explanation": "Ta kategorija filtra ne velja za kontekst, v katerem ste dostopali do te objave. Če želite, da je objava filtrirana tudi v tem kontekstu, morate urediti filter.",
   "filter_modal.added.context_mismatch_title": "Neujemanje konteksta!",
   "filter_modal.added.expired_explanation": "Ta kategorija filtra je pretekla, morali boste spremeniti datum veljavnosti, da bo veljal še naprej.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Prijava",
   "sign_in_banner.text": "Prijavite se, da sledite profilom ali ključnikom, dodajate med priljubljene, delite z drugimi ter odgovarjate na objave, pa tudi ostajate v interakciji iz svojega računa na drugem strežniku.",
   "status.admin_account": "Odpri vmesnik za moderiranje za @{name}",
+  "status.admin_domain": "Odpri vmesnik za moderiranje za {domain}",
   "status.admin_status": "Odpri to objavo v vmesniku za moderiranje",
   "status.block": "Blokiraj @{name}",
   "status.bookmark": "Dodaj med zaznamke",
@@ -553,7 +559,7 @@
   "status.favourite": "Priljubljen",
   "status.filter": "Filtriraj to objavo",
   "status.filtered": "Filtrirano",
-  "status.hide": "Skrij tut",
+  "status.hide": "Skrij objavo",
   "status.history.created": "{name}: ustvarjeno {date}",
   "status.history.edited": "{name}: urejeno {date}",
   "status.load_more": "Naloži več",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index a09da3af6..10176e3bc 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Mesazhe dhe përgjigje",
   "account.report": "Raportojeni @{name}",
   "account.requested": "Në pritje të miratimit. Që të anuloni kërkesën për ndjekje, klikojeni",
+  "account.requested_follow": "{name} ka kërkuar t’ju ndjekë",
   "account.share": "Ndajeni profilin e @{name} me të tjerët",
   "account.show_reblogs": "Shfaq përforcime nga @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Mesazh} other {{counter} Mesazhe}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Kërkoni te gjuhët…",
   "compose_form.direct_message_warning_learn_more": "Mësoni më tepër",
   "compose_form.encryption_warning": "Postimet në Mastodon nuk fshehtëzohen skaj-më-skaj. Mos ndani me të tjerë gjëra me spec në Mastodon.",
-  "compose_form.hashtag_warning": "Ky mesazh s’do të paraqitet nën ndonjë hashtag, ngaqë s’i është caktuar ndonjë. Vetëm mesazhet publike mund të kërkohen sipas hashtagësh.",
+  "compose_form.hashtag_warning": "Ky postim s’do të paraqitet nën ndonjë hashtag, ngaqë s’është publik. Vetëm postimet publike mund të kërkohen sipas hashtag-ësh.",
   "compose_form.lock_disclaimer": "Llogaria juaj s’është {locked}. Mund ta ndjekë cilido, për të parë postimet tuaja vetëm për ndjekësit.",
   "compose_form.lock_disclaimer.lock": "e kyçur",
   "compose_form.placeholder": "Ç’bluani në mendje?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Kopjo stacktrace-in në të papastër",
   "errors.unexpected_crash.report_issue": "Raportoni problemin",
   "explore.search_results": "Përfundime kërkimi",
+  "explore.suggested_follows": "Për ju",
   "explore.title": "Eksploroni",
+  "explore.trending_links": "Lajme",
+  "explore.trending_statuses": "Postime",
+  "explore.trending_tags": "Hashtagë",
   "filter_modal.added.context_mismatch_explanation": "Kjo kategori filtrash nuk aplikohet për kontekstin nën të cilin po merreni me këtë postim. Nëse doni që postimi të filtrohet edhe në këtë kontekst, do t’ju duhet të përpunoni filtrin.",
   "filter_modal.added.context_mismatch_title": "Mospërputhje kontekstesh!",
   "filter_modal.added.expired_explanation": "Kjo kategori filtrash ka skaduar, do t’ju duhet të ndryshoni datën e skadimit për të, pa të aplikohet.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Hyni",
   "sign_in_banner.text": "Që të ndiqni profile ose hashtag-ë, të pëlqeni, të ndani me të tjerë dhe të përgjigjeni në postime, apo të ndërveproni me llogarinë tuaj nga një shërbyes tjetër, bëni hyrjen.",
   "status.admin_account": "Hap ndërfaqe moderimi për @{name}",
+  "status.admin_domain": "Hap ndërfaqe moderimi për {domain}",
   "status.admin_status": "Hape këtë mesazh te ndërfaqja e moderimit",
   "status.block": "Blloko @{name}",
   "status.bookmark": "Faqeruaje",
@@ -553,7 +559,7 @@
   "status.favourite": "I parapëlqyer",
   "status.filter": "Filtroje këtë postim",
   "status.filtered": "I filtruar",
-  "status.hide": "Fshihe mesazhin",
+  "status.hide": "Fshihe postimin",
   "status.history.created": "{name} u krijua më {date}",
   "status.history.edited": "{name} u përpunua më {date}",
   "status.load_more": "Ngarko më tepër",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index bb9b4ee0f..0feb79691 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Objave i odgovori",
   "account.report": "Prijavi @{name}",
   "account.requested": "Čekanje odobrenja. Kliknite za otkazivanje zahteva za praćenje",
+  "account.requested_follow": "{name} je zatražio da vas prati",
   "account.share": "Podeli profil korisnika @{name}",
   "account.show_reblogs": "Prikaži podržavanja od korisnika @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} objavio} few {{counter} objavio} other {{counter} objavio}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Pretraga jezika...",
   "compose_form.direct_message_warning_learn_more": "Saznajte više",
   "compose_form.encryption_warning": "Objave na Mastodon-u nisu potpuno šifrovane. Nemojte deliti nikakve osetljive informacije preko Mastodon-a.",
-  "compose_form.hashtag_warning": "Ova objava neće biti navedena ni pod jednom heš oznakom jer je nenavedena. Samo javne objave mogu se pretraživati po heš oznakama.",
+  "compose_form.hashtag_warning": "Ova objava neće biti navedena ni pod jednom heš oznakom jer nije javna. Samo javne objave se mogu pretraživati po heš oznakama.",
   "compose_form.lock_disclaimer": "Vaš nalog nije {locked}. Svako može da vas prati i da vidi vaše objave namenjene samo za vaše pratioce.",
   "compose_form.lock_disclaimer.lock": "zaključan",
   "compose_form.placeholder": "O čemu razmišljate?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Kopiraj „stacktrace” u klipbord",
   "errors.unexpected_crash.report_issue": "Prijavi problem",
   "explore.search_results": "Rezultati pretrage",
+  "explore.suggested_follows": "Za tebe",
   "explore.title": "Istraži",
+  "explore.trending_links": "Vesti",
+  "explore.trending_statuses": "Objave",
+  "explore.trending_tags": "Heš oznake",
   "filter_modal.added.context_mismatch_explanation": "Ova kategorija filtera se ne odnosi na kontekst u kojem ste pristupili ovoj objavi. Ako želite da se objava filtrira i u ovom kontekstu, morate urediti filter.",
   "filter_modal.added.context_mismatch_title": "Kontekst se ne podudara!",
   "filter_modal.added.expired_explanation": "Ova kategorija filtera je istekla, morate promeniti datum isteka da bi se primenjivala.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Prijavi se",
   "sign_in_banner.text": "Prijavite se da pratite profile ili heštegove, stavite objave kao omiljene, delite i odgovarate na njih ili komunicirate sa svog naloga sa drugog servera.",
   "status.admin_account": "Otvori moderatorsko okruženje za @{name}",
+  "status.admin_domain": "Otvori moderatorsko okruženje za {domain}",
   "status.admin_status": "Otvori ovu objavu u moderatorskom okruženju",
   "status.block": "Blokiraj @{name}",
   "status.bookmark": "Dodaj u obeleživače",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index 5660c94ac..ca0f04b34 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Објаве и одговори",
   "account.report": "Пријави @{name}",
   "account.requested": "Чекање одобрења. Кликните за отказивање захтева за праћење",
+  "account.requested_follow": "{name} је затражио да вас прати",
   "account.share": "Подели профил корисника @{name}",
   "account.show_reblogs": "Прикажи подржавања од корисника @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} објавио} few {{counter} објавио} other {{counter} објавио}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Претрага језика...",
   "compose_form.direct_message_warning_learn_more": "Сазнајте више",
   "compose_form.encryption_warning": "Објаве на Mastodon-у нису потпуно шифроване. Немојте делити никакве осетљиве информације преко Mastodon-а.",
-  "compose_form.hashtag_warning": "Ова објава неће бити наведена ни под једном хеш ознаком јер је ненаведена. Само јавне објаве могу се претраживати по хеш ознакама.",
+  "compose_form.hashtag_warning": "Ова објава неће бити наведена ни под једном хеш ознаком јер није јавна. Само јавне објаве се могу претраживати по хеш ознакама.",
   "compose_form.lock_disclaimer": "Ваш налог није {locked}. Свако може да вас прати и да види ваше објаве намењене само за ваше пратиоце.",
   "compose_form.lock_disclaimer.lock": "закључан",
   "compose_form.placeholder": "О чему размишљате?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Копирај „stacktrace” у клипборд",
   "errors.unexpected_crash.report_issue": "Пријави проблем",
   "explore.search_results": "Резултати претраге",
+  "explore.suggested_follows": "За тебе",
   "explore.title": "Истражи",
+  "explore.trending_links": "Вести",
+  "explore.trending_statuses": "Објаве",
+  "explore.trending_tags": "Хеш ознаке",
   "filter_modal.added.context_mismatch_explanation": "Ова категорија филтера се не односи на контекст у којем сте приступили овој објави. Ако желите да се објава филтрира и у овом контексту, морате уредити филтер.",
   "filter_modal.added.context_mismatch_title": "Контекст се не подудара!",
   "filter_modal.added.expired_explanation": "Ова категорија филтера је истекла, морате променити датум истека да би се примењивала.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Пријави се",
   "sign_in_banner.text": "Пријавите се да пратите профиле или хештегове, ставите објаве као омиљене, делите и одговарате на њих или комуницирате са свог налога са другог сервера.",
   "status.admin_account": "Отвори модераторско окружење за @{name}",
+  "status.admin_domain": "Отвори модераторско окружење за {domain}",
   "status.admin_status": "Отвори ову објаву у модераторском окружењу",
   "status.block": "Блокирај @{name}",
   "status.bookmark": "Додај у обележиваче",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 5e4da3e55..878911c87 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Inlägg och svar",
   "account.report": "Rapportera @{name}",
   "account.requested": "Inväntar godkännande. Klicka för att ta tillbaka din begäran om att få följa",
+  "account.requested_follow": "{name} har begärt att följa dig",
   "account.share": "Dela @{name}s profil",
   "account.show_reblogs": "Visa boostar från @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Inlägg} other {{counter} Inlägg}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Sök språk...",
   "compose_form.direct_message_warning_learn_more": "Läs mer",
   "compose_form.encryption_warning": "Inlägg på Mastodon är inte obrutet krypterade. Dela inte känslig information på Mastodon.",
-  "compose_form.hashtag_warning": "Detta inlägg kommer inte listas under någon hashtagg eftersom det är olistat. Endast offentliga inlägg kan eftersökas med hashtagg.",
+  "compose_form.hashtag_warning": "Inlägget listas inte under någon hashtag eftersom det inte är offentligt. Endast offentliga inlägg går att söka med en hashtag.",
   "compose_form.lock_disclaimer": "Ditt konto är inte {locked}. Vem som helst kan följa dig för att se dina inlägg som endast är för följare.",
   "compose_form.lock_disclaimer.lock": "låst",
   "compose_form.placeholder": "Vad tänker du på?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Kopiera stacktrace till urklipp",
   "errors.unexpected_crash.report_issue": "Rapportera problem",
   "explore.search_results": "Sökresultat",
+  "explore.suggested_follows": "För dig",
   "explore.title": "Utforska",
+  "explore.trending_links": "Nyheter",
+  "explore.trending_statuses": "Inlägg",
+  "explore.trending_tags": "Hashtaggar",
   "filter_modal.added.context_mismatch_explanation": "Denna filterkategori gäller inte för det sammanhang där du har tillgång till det här inlägget. Om du vill att inlägget ska filtreras även i detta sammanhang måste du redigera filtret.",
   "filter_modal.added.context_mismatch_title": "Misspassning av sammanhang!",
   "filter_modal.added.expired_explanation": "Denna filterkategori har utgått, du måste ändra utgångsdatum för att den ska kunna tillämpas.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Logga in",
   "sign_in_banner.text": "Logga in för att följa profiler eller hashtaggar, favoritmarkera, dela och svara på inlägg eller interagera från ditt konto på en annan server.",
   "status.admin_account": "Öppet modereringsgränssnitt för @{name}",
+  "status.admin_domain": "Öppet modereringsgränssnitt för @{domain}",
   "status.admin_status": "Öppna detta inlägg i modereringsgränssnittet",
   "status.block": "Blockera @{name}",
   "status.bookmark": "Bokmärk",
@@ -553,7 +559,7 @@
   "status.favourite": "Favorit",
   "status.filter": "Filtrera detta inlägg",
   "status.filtered": "Filtrerat",
-  "status.hide": "Göm inlägg",
+  "status.hide": "Dölj inlägg",
   "status.history.created": "{name} skapade {date}",
   "status.history.edited": "{name} redigerade {date}",
   "status.load_more": "Ladda fler",
diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json
index 693991651..e646ef83c 100644
--- a/app/javascript/mastodon/locales/szl.json
+++ b/app/javascript/mastodon/locales/szl.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Toots and replies",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "locked",
   "compose_form.placeholder": "What is on your mind?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index c3eaf02f3..7013fdbb8 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Toots மற்றும் பதில்கள்",
   "account.report": "@{name} -ஐப் புகாரளி",
   "account.requested": "ஒப்புதலுக்காகக் காத்திருக்கிறது. பின்தொடரும் கோரிக்கையை நீக்க அழுத்தவும்",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "@{name} உடைய விவரத்தை பகிர்",
   "account.show_reblogs": "காட்டு boosts இருந்து @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} டூட்} other {{counter} டூட்டுகள்}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "தேடல் மொழிகள்...",
   "compose_form.direct_message_warning_learn_more": "மேலும் அறிய",
   "compose_form.encryption_warning": "Mastodonல் உள்ள பதிவுகள் முறையாக என்க்ரிப்ட்(encrypt) செய்யபடவில்லை. அதனால் முக்கிய தகவல்களை இங்கே பகிர வேண்டாம்.",
-  "compose_form.hashtag_warning": "இது ஒரு பட்டியலிடப்படாத டூட் என்பதால் எந்த ஹேஷ்டேகின் கீழும் வராது. ஹேஷ்டேகின் மூலம் பொதுவில் உள்ள டூட்டுகளை மட்டுமே தேட முடியும்.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "உங்கள் கணக்கு {locked} செய்யப்படவில்லை. உங்கள் பதிவுகளை யார் வேண்டுமானாலும் பின்தொடர்ந்து காணலாம்.",
   "compose_form.lock_disclaimer.lock": "பூட்டப்பட்டது",
   "compose_form.placeholder": "உங்கள் மனதில் என்ன இருக்கிறது?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Stacktrace-ஐ clipboard-ல் நகலெடு",
   "errors.unexpected_crash.report_issue": "புகாரளி",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "மிதமான இடைமுகத்தை திறக்க @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "மிதமான இடைமுகத்தில் இந்த நிலையை திறக்கவும்",
   "status.block": "@{name} -ஐத் தடு",
   "status.bookmark": "அடையாளம் குறி",
@@ -553,7 +559,7 @@
   "status.favourite": "விருப்பத்துக்குகந்த",
   "status.filter": "Filter this post",
   "status.filtered": "வடிகட்டு",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "அதிகமாய் ஏற்று",
diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json
index bf5ad7a4e..d39ca62eb 100644
--- a/app/javascript/mastodon/locales/tai.json
+++ b/app/javascript/mastodon/locales/tai.json
@@ -1,7 +1,7 @@
 {
-  "about.blocks": "Moderated servers",
-  "about.contact": "Contact:",
-  "about.disclaimer": "Mastodon is free, open-source software, and a trademark of Mastodon gGmbH.",
+  "about.blocks": "Siū kuán-tsè ê su-hāu-khì",
+  "about.contact": "Liân-lo̍k:",
+  "about.disclaimer": "Ling-khí-tshiūnn sī tsi̍t-ê khai-guân nńg-thé,i ê siong-phiau sī Mastodon gGmbH.",
   "about.domain_blocks.no_reason_available": "Reason not available",
   "about.domain_blocks.preamble": "Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server.",
   "about.domain_blocks.silenced.explanation": "You will generally not see profiles and content from this server, unless you explicitly look it up or opt into it by following.",
@@ -44,7 +44,7 @@
   "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": "Mûi-thé",
-  "account.mention": "Mention @{name}",
+  "account.mention": "Thê-khí @{name}",
   "account.moved_to": "{name} has indicated that their new account is now:",
   "account.mute": "Mute @{name}",
   "account.mute_notifications": "Mute notifications from @{name}",
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Toots and replies",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "locked",
   "compose_form.placeholder": "What is on your mind?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 0000ffc91..2e199fd39 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "టూట్లు మరియు ప్రత్యుత్తరములు",
   "account.report": "@{name}పై ఫిర్యాదుచేయు",
   "account.requested": "ఆమోదం కోసం వేచి ఉంది. అభ్యర్థనను రద్దు చేయడానికి క్లిక్ చేయండి",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "@{name} యొక్క ప్రొఫైల్ను పంచుకోండి",
   "account.show_reblogs": "@{name}నుంచి బూస్ట్ లను చూపించు",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "మరింత తెలుసుకోండి",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "ఈ టూట్ అన్లిస్టెడ్ కాబట్టి ఏ హాష్ ట్యాగ్ క్రిందకూ రాదు. పబ్లిక్ టూట్ లను మాత్రమే హాష్ ట్యాగ్ ద్వారా శోధించవచ్చు.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "మీ ఖాతా {locked} చేయబడలేదు. ఎవరైనా మిమ్మల్ని అనుసరించి మీ అనుచరులకు-మాత్రమే పోస్ట్లను వీక్షించవచ్చు.",
   "compose_form.lock_disclaimer.lock": "బిగించబడినది",
   "compose_form.placeholder": "మీ మనస్సులో ఏముంది?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "@{name} కొరకు సమన్వయ వినిమయసీమను తెరువు",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "సమన్వయ వినిమయసీమలో ఈ స్టేటస్ ను తెరవండి",
   "status.block": "@{name} ను బ్లాక్ చేయి",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "ఇష్టపడు",
   "status.filter": "Filter this post",
   "status.filtered": "వడకట్టబడిన",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "మరిన్ని లోడ్ చేయి",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 6c3788d51..a0247891f 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "โพสต์และการตอบกลับ",
   "account.report": "รายงาน @{name}",
   "account.requested": "กำลังรอการอนุมัติ คลิกเพื่อยกเลิกคำขอติดตาม",
+  "account.requested_follow": "{name} ได้ขอติดตามคุณ",
   "account.share": "แบ่งปันโปรไฟล์ของ @{name}",
   "account.show_reblogs": "แสดงการดันจาก @{name}",
   "account.statuses_counter": "{count, plural, other {{counter} โพสต์}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "ค้นหาภาษา...",
   "compose_form.direct_message_warning_learn_more": "เรียนรู้เพิ่มเติม",
   "compose_form.encryption_warning": "โพสต์ใน Mastodon ไม่ได้เข้ารหัสแบบต้นทางถึงปลายทาง อย่าแบ่งปันข้อมูลที่ละเอียดอ่อนใด ๆ ผ่าน Mastodon",
-  "compose_form.hashtag_warning": "จะไม่แสดงรายการโพสต์นี้ภายใต้แฮชแท็กใด ๆ เนื่องจากโพสต์ไม่อยู่ในรายการ เฉพาะโพสต์สาธารณะเท่านั้นที่สามารถค้นหาได้โดยแฮชแท็ก",
+  "compose_form.hashtag_warning": "จะไม่แสดงรายการโพสต์นี้ภายใต้แฮชแท็กใด ๆ เนื่องจากโพสต์ไม่อยู่ในรายการไม่เป็นสาธารณะ เฉพาะโพสต์สาธารณะเท่านั้นที่สามารถค้นหาได้โดยแฮชแท็ก",
   "compose_form.lock_disclaimer": "บัญชีของคุณไม่ได้ {locked} ใครก็ตามสามารถติดตามคุณเพื่อดูโพสต์สำหรับผู้ติดตามเท่านั้นของคุณ",
   "compose_form.lock_disclaimer.lock": "ล็อคอยู่",
   "compose_form.placeholder": "คุณกำลังคิดอะไรอยู่?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "คัดลอกการติดตามสแตกไปยังคลิปบอร์ด",
   "errors.unexpected_crash.report_issue": "รายงานปัญหา",
   "explore.search_results": "ผลลัพธ์การค้นหา",
+  "explore.suggested_follows": "สำหรับคุณ",
   "explore.title": "สำรวจ",
+  "explore.trending_links": "ข่าว",
+  "explore.trending_statuses": "โพสต์",
+  "explore.trending_tags": "แฮชแท็ก",
   "filter_modal.added.context_mismatch_explanation": "หมวดหมู่ตัวกรองนี้ไม่ได้นำไปใช้กับบริบทที่คุณได้เข้าถึงโพสต์นี้ หากคุณต้องการกรองโพสต์ในบริบทนี้ด้วย คุณจะต้องแก้ไขตัวกรอง",
   "filter_modal.added.context_mismatch_title": "บริบทไม่ตรงกัน!",
   "filter_modal.added.expired_explanation": "หมวดหมู่ตัวกรองนี้หมดอายุแล้ว คุณจะต้องเปลี่ยนวันหมดอายุสำหรับหมวดหมู่เพื่อนำไปใช้",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "ลงชื่อเข้า",
   "sign_in_banner.text": "ลงชื่อเข้าเพื่อติดตามโปรไฟล์หรือแฮชแท็ก ชื่นชอบ แบ่งปัน และตอบกลับโพสต์ หรือโต้ตอบจากบัญชีของคุณในเซิร์ฟเวอร์อื่น",
   "status.admin_account": "เปิดส่วนติดต่อการควบคุมสำหรับ @{name}",
+  "status.admin_domain": "เปิดส่วนติดต่อการควบคุมสำหรับ {domain}",
   "status.admin_status": "เปิดโพสต์นี้ในส่วนติดต่อการควบคุม",
   "status.block": "ปิดกั้น @{name}",
   "status.bookmark": "เพิ่มที่คั่นหน้า",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index cfd542e47..287ba5e63 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Gönderiler ve yanıtlar",
   "account.report": "@{name} adlı kişiyi bildir",
   "account.requested": "Onay bekleniyor. Takip isteğini iptal etmek için tıklayın",
+  "account.requested_follow": "{name} size takip isteği gönderdi",
   "account.share": "@{name} adlı kişinin profilini paylaş",
   "account.show_reblogs": "@{name} kişisinin boostlarını göster",
   "account.statuses_counter": "{count, plural, one {{counter} Gönderi} other {{counter} Gönderi}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Dilleri ara...",
   "compose_form.direct_message_warning_learn_more": "Daha fazla bilgi edinin",
   "compose_form.encryption_warning": "Mastodon gönderileri uçtan uca şifrelemeli değildir. Hassas olabilecek herhangi bir bilgiyi Mastodon'da paylaşmayın.",
-  "compose_form.hashtag_warning": "Bu gönderi liste dışı olduğu için hiç bir etikette yer almayacak. Sadece herkese açık gönderiler etiketlerde bulunabilir.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Hesabın {locked} değil. Yalnızca takipçilere özel gönderilerini görüntülemek için herkes seni takip edebilir.",
   "compose_form.lock_disclaimer.lock": "kilitli",
   "compose_form.placeholder": "Aklında ne var?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Yığın izlemeyi (stacktrace) panoya kopyala",
   "errors.unexpected_crash.report_issue": "Sorun bildir",
   "explore.search_results": "Arama sonuçları",
+  "explore.suggested_follows": "Sizin için",
   "explore.title": "Keşfet",
+  "explore.trending_links": "Haberler",
+  "explore.trending_statuses": "Gönderiler",
+  "explore.trending_tags": "Etiketler",
   "filter_modal.added.context_mismatch_explanation": "Bu filtre kategorisi, bu gönderide eriştiğin bağlama uymuyor. Eğer gönderinin bu bağlamda da filtrelenmesini istiyorsanız, filtreyi düzenlemeniz gerekiyor.",
   "filter_modal.added.context_mismatch_title": "Bağlam uyumsuzluğu!",
   "filter_modal.added.expired_explanation": "Bu filtre kategorisinin süresi dolmuş, filtreyi uygulamak için bitiş tarihini değiştirmeniz gerekiyor.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Giriş yap",
   "sign_in_banner.text": "Profilleri veya etiketleri izlemek, gönderileri beğenmek, paylaşmak ve yanıtlamak için veya başka bir sunucunuzdaki hesabınızla etkileşmek için giriş yapın.",
   "status.admin_account": "@{name} için denetim arayüzünü açın",
+  "status.admin_domain": "{domain} için denetim arayüzünü açın",
   "status.admin_status": "Denetim arayüzünde bu gönderiyi açın",
   "status.block": "@{name} adlı kişiyi engelle",
   "status.bookmark": "Yer işareti ekle",
diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json
index 536940a36..d0aaba7e9 100644
--- a/app/javascript/mastodon/locales/tt.json
+++ b/app/javascript/mastodon/locales/tt.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Toots and replies",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "locked",
   "compose_form.placeholder": "What is on your mind?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "@{name} блоклау",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json
index 693991651..e646ef83c 100644
--- a/app/javascript/mastodon/locales/ug.json
+++ b/app/javascript/mastodon/locales/ug.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Toots and replies",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "locked",
   "compose_form.placeholder": "What is on your mind?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index ed1e1ad75..8276908b1 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Дописи й відповіді",
   "account.report": "Поскаржитися на @{name}",
   "account.requested": "Очікує підтвердження. Натисніть, щоб скасувати запит на підписку",
+  "account.requested_follow": "{name} надсилає запит на стеження",
   "account.share": "Поділитися профілем @{name}",
   "account.show_reblogs": "Показати поширення від @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} допис} few {{counter} дописи} many {{counter} дописів} other {{counter} дописи}}",
@@ -101,7 +102,7 @@
   "column.blocks": "Заблоковані користувачі",
   "column.bookmarks": "Закладки",
   "column.community": "Локальна стрічка",
-  "column.direct": "Прямі повідомлення",
+  "column.direct": "Особисті повідомлення",
   "column.directory": "Переглянути профілі",
   "column.domain_blocks": "Заблоковані домени",
   "column.favourites": "Вподобане",
@@ -147,7 +148,7 @@
   "compose_form.spoiler.marked": "Прибрати попередження про вміст",
   "compose_form.spoiler.unmarked": "Додати попередження про вміст",
   "compose_form.spoiler_placeholder": "Напишіть своє попередження тут",
-  "confirmation_modal.cancel": "Відмінити",
+  "confirmation_modal.cancel": "Скасувати",
   "confirmations.block.block_and_report": "Заблокувати та поскаржитися",
   "confirmations.block.confirm": "Заблокувати",
   "confirmations.block.message": "Ви впевнені, що хочете заблокувати {name}?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Скопіювати трасування стека у буфер обміну",
   "errors.unexpected_crash.report_issue": "Повідомити про проблему",
   "explore.search_results": "Результати пошуку",
+  "explore.suggested_follows": "Для вас",
   "explore.title": "Огляд",
+  "explore.trending_links": "Новини",
+  "explore.trending_statuses": "Дописи",
+  "explore.trending_tags": "Хештеґи",
   "filter_modal.added.context_mismatch_explanation": "Ця категорія фільтра не застосовується до контексту, в якому ви отримали доступ до цього допису. Якщо ви хочете, щоб дописи також фільтрувалися за цим контекстом, вам доведеться редагувати фільтр.",
   "filter_modal.added.context_mismatch_title": "Невідповідність контексту!",
   "filter_modal.added.expired_explanation": "Категорія цього фільтра застаріла, Вам потрібно змінити дату закінчення терміну дії, щоб застосувати її.",
@@ -366,7 +371,7 @@
   "navigation_bar.bookmarks": "Закладки",
   "navigation_bar.community_timeline": "Локальна стрічка",
   "navigation_bar.compose": "Написати новий допис",
-  "navigation_bar.direct": "Прямі повідомлення",
+  "navigation_bar.direct": "Особисті повідомлення",
   "navigation_bar.discover": "Дослідити",
   "navigation_bar.domain_blocks": "Заблоковані домени",
   "navigation_bar.edit_profile": "Редагувати профіль",
@@ -468,7 +473,7 @@
   "relative_time.minutes": "{number}х",
   "relative_time.seconds": "{number}с",
   "relative_time.today": "сьогодні",
-  "reply_indicator.cancel": "Відмінити",
+  "reply_indicator.cancel": "Скасувати",
   "report.block": "Заблокувати",
   "report.block_explanation": "Ви не будете бачити дописи цього користувача, а вони не зможуть бачити ваші дописи або підписуватися на вас. Вони будуть бачити, що ви їх заблокували.",
   "report.categories.other": "Інше",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Увійти",
   "sign_in_banner.text": "Увійдіть, щоб слідкувати за профілями або хештеґами, вподобаними, ділитися і відповідати на повідомлення або взаємодіяти з вашого облікового запису на іншому сервері.",
   "status.admin_account": "Відкрити інтерфейс модерації для @{name}",
+  "status.admin_domain": "Відкрити інтерфейс модерації для {domain}",
   "status.admin_status": "Відкрити цей допис в інтерфейсі модерації",
   "status.block": "Заблокувати @{name}",
   "status.bookmark": "Додати до закладок",
@@ -553,7 +559,7 @@
   "status.favourite": "Подобається",
   "status.filter": "Фільтрувати цей допис",
   "status.filtered": "Відфільтровано",
-  "status.hide": "Сховати дмух",
+  "status.hide": "Сховати допис",
   "status.history.created": "{name} створює {date}",
   "status.history.edited": "{name} змінює {date}",
   "status.load_more": "Завантажити більше",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index d9881abeb..e411e6015 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "ٹوٹ اور جوابات",
   "account.report": "@{name} اطلاع کریں",
   "account.requested": "منظوری کا منتظر۔ درخواستِ پیروی منسوخ کرنے کیلئے کلک کریں",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "@{name} کے مشخص کو بانٹیں",
   "account.show_reblogs": "@{name} کی افزائشات کو دکھائیں",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "زبان تلاش کریں...",
   "compose_form.direct_message_warning_learn_more": "مزید جانیں",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "چونکہ یہ ٹوٹ غیر مندرجہ ہے لہذا یہ کسی بھی ہیش ٹیگ کے تحت درج نہیں کیا جائے گا. ہیش ٹیگ کے تحت صرف \nعمومی ٹوٹ تلاش کئے جا سکتے ہیں.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "آپ کا اکاؤنٹ {locked} نہیں ہے. کوئی بھی آپ کے مخصوص برائے پیروکار ٹوٹ دیکھنے کی خاطر آپ کی پیروی کر سکتا ہے.",
   "compose_form.lock_disclaimer.lock": "مقفل",
   "compose_form.placeholder": "آپ کیا سوچ رہے ہیں؟",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "مسئلہ کی اطلاع کریں",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "Load more",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index 1b9b34454..7bc505474 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -10,7 +10,7 @@
   "about.domain_blocks.suspended.title": "Vô hiệu hóa",
   "about.not_available": "Máy chủ này chưa cung cấp thông tin.",
   "about.powered_by": "Mạng xã hội liên hợp {mastodon}",
-  "about.rules": "Quy tắc máy chủ",
+  "about.rules": "Nội quy máy chủ",
   "account.account_note_header": "Ghi chú",
   "account.add_or_remove_from_list": "Thêm hoặc xóa khỏi danh sách",
   "account.badges.bot": "Bot",
@@ -21,7 +21,7 @@
   "account.browse_more_on_origin_server": "Truy cập trang của người này",
   "account.cancel_follow_request": "Thu hồi yêu cầu theo dõi",
   "account.direct": "Nhắn riêng @{name}",
-  "account.disable_notifications": "Tắt thông báo khi @{name} đăng bài viết",
+  "account.disable_notifications": "Tắt thông báo khi @{name} đăng tút",
   "account.domain_blocked": "Tên miền đã chặn",
   "account.edit_profile": "Sửa hồ sơ",
   "account.enable_notifications": "Nhận thông báo khi @{name} đăng tút",
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Trả lời",
   "account.report": "Báo cáo @{name}",
   "account.requested": "Đang chờ chấp thuận. Nhấp vào đây để hủy yêu cầu theo dõi",
+  "account.requested_follow": "{name} yêu cầu theo dõi bạn",
   "account.share": "Chia sẻ trang @{name}",
   "account.show_reblogs": "Hiện tút do @{name} đăng lại",
   "account.statuses_counter": "{count, plural, one {{counter} Tút} other {{counter} Tút}}",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Sao chép stacktrace vào clipboard",
   "errors.unexpected_crash.report_issue": "Báo cáo lỗi",
   "explore.search_results": "Kết quả tìm kiếm",
+  "explore.suggested_follows": "Đề xuất",
   "explore.title": "Khám phá",
+  "explore.trending_links": "Tin tức",
+  "explore.trending_statuses": "Tút",
+  "explore.trending_tags": "Hashtag",
   "filter_modal.added.context_mismatch_explanation": "Danh mục bộ lọc này không áp dụng cho ngữ cảnh mà bạn đã truy cập tút này. Nếu bạn muốn tút cũng được lọc trong ngữ cảnh này, bạn sẽ phải chỉnh sửa bộ lọc.",
   "filter_modal.added.context_mismatch_title": "Bối cảnh không phù hợp!",
   "filter_modal.added.expired_explanation": "Danh mục bộ lọc này đã hết hạn, bạn sẽ cần thay đổi ngày hết hạn để áp dụng.",
@@ -394,7 +399,7 @@
   "notification.own_poll": "Cuộc bình chọn của bạn đã kết thúc",
   "notification.poll": "Cuộc bình chọn đã kết thúc",
   "notification.reblog": "{name} đăng lại tút của bạn",
-  "notification.status": "{name} vừa đăng",
+  "notification.status": "{name} đăng tút mới",
   "notification.update": "{name} đã viết lại một tút",
   "notifications.clear": "Xóa hết thông báo",
   "notifications.clear_confirmation": "Bạn thật sự muốn xóa vĩnh viễn tất cả thông báo của mình?",
@@ -473,7 +478,7 @@
   "report.block_explanation": "Bạn sẽ không thấy tút của họ nữa. Họ cũng không thể theo dõi hoặc thấy tút của bạn. Họ sẽ biết là họ đã bị chặn.",
   "report.categories.other": "Khác",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Vi phạm quy tắc máy chủ",
+  "report.categories.violation": "Vi phạm nội quy máy chủ",
   "report.category.subtitle": "Chọn mục gần khớp nhất",
   "report.category.title": "Có vấn đề gì với {type}",
   "report.category.title_account": "người này",
@@ -492,10 +497,10 @@
   "report.reasons.other_description": "Vấn đề không nằm trong những mục trên",
   "report.reasons.spam": "Đây là spam",
   "report.reasons.spam_description": "Liên kết độc hại, tạo tương tác giả hoặc trả lời lặp đi lặp lại",
-  "report.reasons.violation": "Vi phạm quy tắc máy chủ",
-  "report.reasons.violation_description": "Bạn nhận thấy nó vi phạm quy tắc máy chủ",
+  "report.reasons.violation": "Vi phạm nội quy máy chủ",
+  "report.reasons.violation_description": "Bạn nhận thấy nó vi phạm nội quy máy chủ",
   "report.rules.subtitle": "Chọn tất cả những gì phù hợp",
-  "report.rules.title": "Vi phạm quy tắc nào?",
+  "report.rules.title": "Vi phạm nội quy nào?",
   "report.statuses.subtitle": "Chọn tất cả những gì phù hợp",
   "report.statuses.title": "Bạn muốn gửi tút nào kèm báo cáo này?",
   "report.submit": "Gửi đi",
@@ -509,7 +514,7 @@
   "report_notification.attached_statuses": "{count, plural, other {{count} tút}} đính kèm",
   "report_notification.categories.other": "Khác",
   "report_notification.categories.spam": "Spam",
-  "report_notification.categories.violation": "Vi phạm quy tắc",
+  "report_notification.categories.violation": "Vi phạm nội quy",
   "report_notification.open": "Mở báo cáo",
   "search.placeholder": "Tìm kiếm",
   "search.search_or_paste": "Tìm kiếm hoặc nhập URL",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Đăng nhập",
   "sign_in_banner.text": "Đăng nhập để theo dõi người hoặc hashtag; cũng như thích, chia sẻ và trả lời tút.",
   "status.admin_account": "Mở giao diện quản trị @{name}",
+  "status.admin_domain": "Mở giao diện quản trị @{domain}",
   "status.admin_status": "Mở tút này trong giao diện quản trị",
   "status.block": "Chặn @{name}",
   "status.bookmark": "Lưu",
diff --git a/app/javascript/mastodon/locales/whitelist_la.json b/app/javascript/mastodon/locales/whitelist_la.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_la.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json
index dd2bd7a06..9b620cde8 100644
--- a/app/javascript/mastodon/locales/zgh.json
+++ b/app/javascript/mastodon/locales/zgh.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "Toots and replies",
   "account.report": "Report @{name}",
   "account.requested": "Awaiting approval",
+  "account.requested_follow": "{name} has requested to follow you",
   "account.share": "ⴱⴹⵓ ⵉⴼⵔⵙ ⵏ @{name}",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
@@ -127,7 +128,7 @@
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "ⵙⵙⵏ ⵓⴳⴳⴰⵔ",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "ⵉⵜⵜⵓⵔⴳⵍ",
   "compose_form.placeholder": "ⵎⴰⵢⴷ ⵉⵍⵍⴰⵏ ⴳ ⵉⵅⴼ ⵏⵏⴽ?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "explore.search_results": "Search results",
+  "explore.suggested_follows": "For you",
   "explore.title": "Explore",
+  "explore.trending_links": "News",
+  "explore.trending_statuses": "Posts",
+  "explore.trending_tags": "Hashtags",
   "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.",
   "filter_modal.added.context_mismatch_title": "Context mismatch!",
   "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "Sign in",
   "sign_in_banner.text": "Sign in to follow profiles or hashtags, favourite, share and reply to posts, or interact from your account on a different server.",
   "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "ⴳⴷⵍ @{name}",
   "status.bookmark": "Bookmark",
@@ -553,7 +559,7 @@
   "status.favourite": "Favourite",
   "status.filter": "Filter this post",
   "status.filtered": "Filtered",
-  "status.hide": "Hide toot",
+  "status.hide": "Hide post",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "ⵙⵙⵉⵍⵉ ⵓⴳⴳⴰⵔ",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 3d9c0ee1a..195c63198 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -37,7 +37,7 @@
   "account.following_counter": "正在关注 {counter} 人",
   "account.follows.empty": "此用户目前尚未关注任何人。",
   "account.follows_you": "关注了你",
-  "account.go_to_profile": "转到个人资料",
+  "account.go_to_profile": "转到个人资料界面",
   "account.hide_reblogs": "隐藏来自 @{name} 的转贴",
   "account.joined_short": "加入于",
   "account.languages": "更改订阅语言",
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "嘟文和回复",
   "account.report": "举报 @{name}",
   "account.requested": "正在等待对方同意。点击以取消发送关注请求",
+  "account.requested_follow": "{name} 已经向你发送了关注请求",
   "account.share": "分享 @{name} 的个人资料页",
   "account.show_reblogs": "显示来自 @{name} 的转嘟",
   "account.statuses_counter": "{counter} 条嘟文",
@@ -199,7 +200,7 @@
   "emoji_button.food": "食物和饮料",
   "emoji_button.label": "插入表情符号",
   "emoji_button.nature": "自然",
-  "emoji_button.not_found": "没有找到匹配的表情符号",
+  "emoji_button.not_found": "木有这个表情符号!(╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "物体",
   "emoji_button.people": "人物",
   "emoji_button.recent": "常用",
@@ -207,7 +208,7 @@
   "emoji_button.search_results": "搜索结果",
   "emoji_button.symbols": "符号",
   "emoji_button.travel": "旅行和地点",
-  "empty_column.account_suspended": "账户已停用",
+  "empty_column.account_suspended": "账户已被停用",
   "empty_column.account_timeline": "这里没有嘟文!",
   "empty_column.account_unavailable": "个人资料不可用",
   "empty_column.blocks": "你还未屏蔽任何用户。",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "把堆栈跟踪信息复制到剪贴板",
   "errors.unexpected_crash.report_issue": "报告问题",
   "explore.search_results": "搜索结果",
+  "explore.suggested_follows": "为你推荐",
   "explore.title": "探索",
+  "explore.trending_links": "新闻",
+  "explore.trending_statuses": "嘟文",
+  "explore.trending_tags": "话题标签",
   "filter_modal.added.context_mismatch_explanation": "此过滤器分类不适用访问过嘟文的环境中。如果你想要在环境中过滤嘟文,你必须编辑此过滤器。",
   "filter_modal.added.context_mismatch_title": "环境不匹配!",
   "filter_modal.added.expired_explanation": "此过滤器分类已过期,你需要修改到期日期才能应用。",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "登录",
   "sign_in_banner.text": "登录以关注个人资料或话题标签、喜欢、分享和嘟文,或与在不同服务器上的账号进行互动。",
   "status.admin_account": "打开 @{name} 的管理界面",
+  "status.admin_domain": "打开 {domain} 的管理界面",
   "status.admin_status": "打开此帖的管理界面",
   "status.block": "屏蔽 @{name}",
   "status.bookmark": "添加到书签",
@@ -553,7 +559,7 @@
   "status.favourite": "喜欢",
   "status.filter": "过滤此嘟文",
   "status.filtered": "已过滤",
-  "status.hide": "屏蔽嘟文",
+  "status.hide": "隐藏嘟文",
   "status.history.created": "{name} 创建于 {date}",
   "status.history.edited": "{name} 编辑于 {date}",
   "status.load_more": "加载更多",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 6c967f414..aa0530da3 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "帖文與回覆",
   "account.report": "檢舉 @{name}",
   "account.requested": "正在等待核准。按一下以取消追蹤請求",
+  "account.requested_follow": "{name} 要求追蹤你",
   "account.share": "分享 @{name} 的個人檔案",
   "account.show_reblogs": "顯示 @{name} 的轉推",
   "account.statuses_counter": "{count, plural,one {{counter} 篇}other {{counter} 篇}}帖文",
@@ -127,7 +128,7 @@
   "compose.language.search": "搜尋語言...",
   "compose_form.direct_message_warning_learn_more": "了解更多",
   "compose_form.encryption_warning": "Mastodon 上的帖文並未端對端加密。請不要透過 Mastodon 分享任何敏感資訊。",
-  "compose_form.hashtag_warning": "這文章因為不是公開,所以不會被標籤搜索。只有公開的文章才會被標籤搜索。",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
   "compose_form.lock_disclaimer": "你的用戶狀態沒有{locked},任何人都能立即關注你,然後看到「只有關注者能看」的文章。",
   "compose_form.lock_disclaimer.lock": "鎖定",
   "compose_form.placeholder": "你在想甚麼?",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "複製 stacktrace 到剪貼簿",
   "errors.unexpected_crash.report_issue": "舉報問題",
   "explore.search_results": "搜尋結果",
+  "explore.suggested_follows": "為您推薦",
   "explore.title": "探索",
+  "explore.trending_links": "最新消息",
+  "explore.trending_statuses": "帖文",
+  "explore.trending_tags": "標籤",
   "filter_modal.added.context_mismatch_explanation": "此過濾器類別不適用於您所存取帖文的情境。如果您想要此帖文被於此情境被過濾,您必須編輯過濾器。",
   "filter_modal.added.context_mismatch_title": "情境不符合!",
   "filter_modal.added.expired_explanation": "此過濾器類別已失效,您需要更新過期日期才能套用。",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "登入",
   "sign_in_banner.text": "登入以追蹤個人檔案、標籤、最愛、分享和回覆帖文,或用你在其他伺服器的帳號進行互動。",
   "status.admin_account": "開啟 @{name} 的管理介面",
+  "status.admin_domain": "Open moderation interface for {domain}",
   "status.admin_status": "在管理介面開啟這篇文章",
   "status.block": "封鎖 @{name}",
   "status.bookmark": "書籤",
@@ -553,7 +559,7 @@
   "status.favourite": "最愛",
   "status.filter": "篩選此帖文",
   "status.filtered": "已過濾",
-  "status.hide": "隱藏帖文",
+  "status.hide": "Hide post",
   "status.history.created": "{name} 於 {date} 建立",
   "status.history.edited": "{name} 於 {date} 編輯",
   "status.load_more": "載入更多",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index a8d6cb25e..75e423d1c 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -39,9 +39,9 @@
   "account.follows_you": "跟隨了您",
   "account.go_to_profile": "前往個人檔案",
   "account.hide_reblogs": "隱藏來自 @{name} 的轉嘟",
-  "account.joined_short": "已加入",
+  "account.joined_short": "加入時間",
   "account.languages": "變更訂閱的語言",
-  "account.link_verified_on": "已在 {date} 檢查此連結的擁有者權限",
+  "account.link_verified_on": "已於 {date} 檢查此連結的擁有者權限",
   "account.locked_info": "此帳號的隱私狀態被設為鎖定。該擁有者會手動審核能跟隨此帳號的人。",
   "account.media": "媒體",
   "account.mention": "提及 @{name}",
@@ -54,6 +54,7 @@
   "account.posts_with_replies": "嘟文與回覆",
   "account.report": "檢舉 @{name}",
   "account.requested": "正在等待核准。按一下以取消跟隨請求",
+  "account.requested_follow": "{name} 要求跟隨您",
   "account.share": "分享 @{name} 的個人檔案",
   "account.show_reblogs": "顯示來自 @{name} 的嘟文",
   "account.statuses_counter": "{count, plural,one {{counter} 則}other {{counter} 則}}嘟文",
@@ -110,7 +111,7 @@
   "column.lists": "列表",
   "column.mutes": "已靜音的使用者",
   "column.notifications": "通知",
-  "column.pins": "釘選的嘟文",
+  "column.pins": "釘選嘟文",
   "column.public": "聯邦時間軸",
   "column_back_button.label": "上一頁",
   "column_header.hide_settings": "隱藏設定",
@@ -187,7 +188,7 @@
   "dismissable_banner.community_timeline": "這些是 {domain} 上面託管帳號之最新公開嘟文。",
   "dismissable_banner.dismiss": "關閉",
   "dismissable_banner.explore_links": "這些新聞故事正在被此伺服器以及去中心化網路上的人們熱烈討論著。",
-  "dismissable_banner.explore_statuses": "這些於這裡以及去中心化網路中其他伺服器發出的嘟文正在被此伺服器上的人們熱烈討論著。",
+  "dismissable_banner.explore_statuses": "這些於這個伺服器以及去中心化網路中其他伺服器發出的嘟文正在被此伺服器上的人們熱烈討論著。",
   "dismissable_banner.explore_tags": "這些主題標籤正在被此伺服器以及去中心化網路上的人們熱烈討論著。",
   "dismissable_banner.public_timeline": "這些是來自這裡以及去中心化網路中其他已知伺服器之最新公開嘟文。",
   "embed.instructions": "要在您的網站嵌入此嘟文,請複製以下程式碼。",
@@ -225,7 +226,7 @@
   "empty_column.home.suggestions": "檢視部份建議",
   "empty_column.list": "這份列表下什麼也沒有。當此列表的成員嘟出了新的嘟文時,它們就會顯示於此。",
   "empty_column.lists": "您還沒有建立任何列表。當您建立列表時,它將於此顯示。",
-  "empty_column.mutes": "您尚未靜音任何使用者。",
+  "empty_column.mutes": "您還沒有靜音任何使用者。",
   "empty_column.notifications": "您還沒有收到任何通知,當您和別人開始互動時,它將於此顯示。",
   "empty_column.public": "這裡什麼都沒有!嘗試寫些公開的嘟文,或著自己跟隨其他伺服器的使用者後就會有嘟文出現了",
   "error.unexpected_crash.explanation": "由於發生系統故障或瀏覽器相容性問題,無法正常顯示此頁面。",
@@ -235,7 +236,11 @@
   "errors.unexpected_crash.copy_stacktrace": "複製 stacktrace 到剪貼簿",
   "errors.unexpected_crash.report_issue": "回報問題",
   "explore.search_results": "搜尋結果",
+  "explore.suggested_follows": "為您推薦",
   "explore.title": "探索",
+  "explore.trending_links": "最新消息",
+  "explore.trending_statuses": "嘟文",
+  "explore.trending_tags": "主題標籤",
   "filter_modal.added.context_mismatch_explanation": "此過濾器類別不是用您所存取嘟文的情境。若您想要此嘟文被於此情境被過濾,您必須編輯過濾器。",
   "filter_modal.added.context_mismatch_title": "不符合情境!",
   "filter_modal.added.expired_explanation": "此過濾器類別已失效,您需要更新過期日期以套用。",
@@ -320,7 +325,7 @@
   "keyboard_shortcuts.my_profile": "開啟個人檔案頁面",
   "keyboard_shortcuts.notifications": "開啟通知欄",
   "keyboard_shortcuts.open_media": "開啟媒體",
-  "keyboard_shortcuts.pinned": "開啟釘選的嘟文列表",
+  "keyboard_shortcuts.pinned": "開啟釘選嘟文列表",
   "keyboard_shortcuts.profile": "開啟作者的個人檔案頁面",
   "keyboard_shortcuts.reply": "回應嘟文",
   "keyboard_shortcuts.requests": "開啟跟隨請求列表",
@@ -379,7 +384,7 @@
   "navigation_bar.logout": "登出",
   "navigation_bar.mutes": "靜音的使用者",
   "navigation_bar.personal": "個人",
-  "navigation_bar.pins": "釘選的嘟文",
+  "navigation_bar.pins": "釘選嘟文",
   "navigation_bar.preferences": "偏好設定",
   "navigation_bar.public_timeline": "聯邦時間軸",
   "navigation_bar.search": "搜尋",
@@ -537,6 +542,7 @@
   "sign_in_banner.sign_in": "登入",
   "sign_in_banner.text": "登入以追蹤個人檔案、主題標籤、最愛,分享和回覆嘟文,或以您其他伺服器之帳號進行互動:",
   "status.admin_account": "開啟 @{name} 的管理介面",
+  "status.admin_domain": "開啟 {domain} 的管理介面",
   "status.admin_status": "在管理介面開啟此嘟文",
   "status.block": "封鎖 @{name}",
   "status.bookmark": "書籤",
@@ -564,7 +570,7 @@
   "status.mute_conversation": "靜音對話",
   "status.open": "展開此嘟文",
   "status.pin": "釘選到個人檔案頁面",
-  "status.pinned": "釘選的嘟文",
+  "status.pinned": "釘選嘟文",
   "status.read_more": "閱讀更多",
   "status.reblog": "轉嘟",
   "status.reblog_private": "依照原嘟可見性轉嘟",
@@ -617,13 +623,13 @@
   "upload_button.label": "上傳圖像、影片、或音樂檔案",
   "upload_error.limit": "已達到檔案上傳限制。",
   "upload_error.poll": "不允許在投票中上傳檔案。",
-  "upload_form.audio_description": "描述內容給聽障人士",
+  "upload_form.audio_description": "為聽障人士增加文字說明",
   "upload_form.description": "為視障人士增加文字說明",
   "upload_form.description_missing": "沒有任何描述",
   "upload_form.edit": "編輯",
   "upload_form.thumbnail": "更改預覽圖",
   "upload_form.undo": "刪除",
-  "upload_form.video_description": "描述內容給聽障或視障人士",
+  "upload_form.video_description": "為聽障或視障人士增加文字說明",
   "upload_modal.analyzing_picture": "正在分析圖片…",
   "upload_modal.apply": "套用",
   "upload_modal.applying": "正在套用⋯⋯",
diff --git a/app/javascript/mastodon/middleware/errors.js b/app/javascript/mastodon/middleware/errors.js
index 0a65fd321..708df6bb8 100644
--- a/app/javascript/mastodon/middleware/errors.js
+++ b/app/javascript/mastodon/middleware/errors.js
@@ -14,4 +14,4 @@ export default function errorsMiddleware() {
 
     return next(action);
   };
-};
+}
diff --git a/app/javascript/mastodon/middleware/loading_bar.js b/app/javascript/mastodon/middleware/loading_bar.js
index a98f1bb2b..da8cc4c7d 100644
--- a/app/javascript/mastodon/middleware/loading_bar.js
+++ b/app/javascript/mastodon/middleware/loading_bar.js
@@ -22,4 +22,4 @@ export default function loadingBarMiddleware(config = {}) {
 
     return next(action);
   };
-};
+}
diff --git a/app/javascript/mastodon/middleware/sounds.js b/app/javascript/mastodon/middleware/sounds.js
index 9f1bc02b9..7f2388983 100644
--- a/app/javascript/mastodon/middleware/sounds.js
+++ b/app/javascript/mastodon/middleware/sounds.js
@@ -43,4 +43,4 @@ export default function soundsMiddleware() {
 
     return next(action);
   };
-};
+}
diff --git a/app/javascript/mastodon/permissions.js b/app/javascript/mastodon/permissions.js
index 752ddd6c5..9ea149e5f 100644
--- a/app/javascript/mastodon/permissions.js
+++ b/app/javascript/mastodon/permissions.js
@@ -1,3 +1,4 @@
-export const PERMISSION_INVITE_USERS   = 0x0000000000010000;
-export const PERMISSION_MANAGE_USERS   = 0x0000000000000400;
-export const PERMISSION_MANAGE_REPORTS = 0x0000000000000010;
+export const PERMISSION_INVITE_USERS      = 0x0000000000010000;
+export const PERMISSION_MANAGE_USERS      = 0x0000000000000400;
+export const PERMISSION_MANAGE_FEDERATION = 0x0000000000000020;
+export const PERMISSION_MANAGE_REPORTS    = 0x0000000000000010;
diff --git a/app/javascript/mastodon/reducers/accounts.js b/app/javascript/mastodon/reducers/accounts.js
index b5589668c..44973e939 100644
--- a/app/javascript/mastodon/reducers/accounts.js
+++ b/app/javascript/mastodon/reducers/accounts.js
@@ -35,4 +35,4 @@ export default function accounts(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/accounts_counters.js b/app/javascript/mastodon/reducers/accounts_counters.js
index 9ebf72af9..4e1256d1b 100644
--- a/app/javascript/mastodon/reducers/accounts_counters.js
+++ b/app/javascript/mastodon/reducers/accounts_counters.js
@@ -35,4 +35,4 @@ export default function accountsCounters(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/accounts_map.js b/app/javascript/mastodon/reducers/accounts_map.js
index 444bbda19..8412ad4d0 100644
--- a/app/javascript/mastodon/reducers/accounts_map.js
+++ b/app/javascript/mastodon/reducers/accounts_map.js
@@ -17,4 +17,4 @@ export default function accountsMap(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/alerts.js b/app/javascript/mastodon/reducers/alerts.js
index c62ab0dfd..5b3010a59 100644
--- a/app/javascript/mastodon/reducers/alerts.js
+++ b/app/javascript/mastodon/reducers/alerts.js
@@ -23,4 +23,4 @@ export default function alerts(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/announcements.js b/app/javascript/mastodon/reducers/announcements.js
index 34e08eac8..b53f93a4a 100644
--- a/app/javascript/mastodon/reducers/announcements.js
+++ b/app/javascript/mastodon/reducers/announcements.js
@@ -99,4 +99,4 @@ export default function announcementsReducer(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js
index 1dafb07fd..9ce7e97ed 100644
--- a/app/javascript/mastodon/reducers/compose.js
+++ b/app/javascript/mastodon/reducers/compose.js
@@ -108,7 +108,7 @@ function statusToTextMentions(state, status) {
   }
 
   return set.union(status.get('mentions').filterNot(mention => mention.get('id') === me).map(mention => `@${mention.get('acct')} `)).join('');
-};
+}
 
 function clearAll(state) {
   return state.withMutations(map => {
@@ -126,7 +126,7 @@ function clearAll(state) {
     map.set('poll', null);
     map.set('idempotencyKey', uuid());
   });
-};
+}
 
 function appendMedia(state, media, file) {
   const prevSize = state.get('media_attachments').size;
@@ -146,7 +146,7 @@ function appendMedia(state, media, file) {
       map.set('sensitive', true);
     }
   });
-};
+}
 
 function removeMedia(state, mediaId) {
   const prevSize = state.get('media_attachments').size;
@@ -159,7 +159,7 @@ function removeMedia(state, mediaId) {
       map.set('sensitive', false);
     }
   });
-};
+}
 
 const insertSuggestion = (state, position, token, completion, path) => {
   return state.withMutations(map => {
@@ -330,8 +330,10 @@ export default function compose(state = initialState, action) {
       map.set('preselectDate', new Date());
       map.set('idempotencyKey', uuid());
 
-      if (action.status.get('language')) {
+      if (action.status.get('language') && !action.status.has('translation')) {
         map.set('language', action.status.get('language'));
+      } else {
+        map.set('language', state.get('default_language'));
       }
 
       if (action.status.get('spoiler_text').length > 0) {
@@ -429,6 +431,8 @@ export default function compose(state = initialState, action) {
   case TIMELINE_DELETE:
     if (action.id === state.get('in_reply_to')) {
       return state.set('in_reply_to', null);
+    } else if (action.id === state.get('id')) {
+      return state.set('id', null);
     } else {
       return state;
     }
@@ -520,4 +524,4 @@ export default function compose(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/contexts.js b/app/javascript/mastodon/reducers/contexts.js
index 4c2d6cc8a..7aa95b5d5 100644
--- a/app/javascript/mastodon/reducers/contexts.js
+++ b/app/javascript/mastodon/reducers/contexts.js
@@ -103,4 +103,4 @@ export default function replies(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/conversations.js b/app/javascript/mastodon/reducers/conversations.js
index 975418eda..feccf18f0 100644
--- a/app/javascript/mastodon/reducers/conversations.js
+++ b/app/javascript/mastodon/reducers/conversations.js
@@ -113,4 +113,4 @@ export default function conversations(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/custom_emojis.js b/app/javascript/mastodon/reducers/custom_emojis.js
index d2c801ade..0338c2e53 100644
--- a/app/javascript/mastodon/reducers/custom_emojis.js
+++ b/app/javascript/mastodon/reducers/custom_emojis.js
@@ -12,4 +12,4 @@ export default function custom_emojis(state = initialState, action) {
   }
 
   return state;
-};
+}
diff --git a/app/javascript/mastodon/reducers/domain_lists.js b/app/javascript/mastodon/reducers/domain_lists.js
index eff97fbd6..6bf8cee68 100644
--- a/app/javascript/mastodon/reducers/domain_lists.js
+++ b/app/javascript/mastodon/reducers/domain_lists.js
@@ -22,4 +22,4 @@ export default function domainLists(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/dropdown_menu.js b/app/javascript/mastodon/reducers/dropdown_menu.js
index a78a11acc..51bf9375b 100644
--- a/app/javascript/mastodon/reducers/dropdown_menu.js
+++ b/app/javascript/mastodon/reducers/dropdown_menu.js
@@ -4,12 +4,12 @@ import {
   DROPDOWN_MENU_CLOSE,
 } from '../actions/dropdown_menu';
 
-const initialState = Immutable.Map({ openId: null, placement: null, keyboard: false, scroll_key: null });
+const initialState = Immutable.Map({ openId: null, keyboard: false, scroll_key: null });
 
 export default function dropdownMenu(state = initialState, action) {
   switch (action.type) {
   case DROPDOWN_MENU_OPEN:
-    return state.merge({ openId: action.id, placement: action.placement, keyboard: action.keyboard, scroll_key: action.scroll_key });
+    return state.merge({ openId: action.id, keyboard: action.keyboard, scroll_key: action.scroll_key });
   case DROPDOWN_MENU_CLOSE:
     return state.get('openId') === action.id ? state.set('openId', null).set('scroll_key', null) : state;
   default:
diff --git a/app/javascript/mastodon/reducers/filters.js b/app/javascript/mastodon/reducers/filters.js
index f4f97cd3a..e1f014046 100644
--- a/app/javascript/mastodon/reducers/filters.js
+++ b/app/javascript/mastodon/reducers/filters.js
@@ -41,4 +41,4 @@ export default function filters(state = ImmutableMap(), action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/height_cache.js b/app/javascript/mastodon/reducers/height_cache.js
index 2f5716fae..77a59c8c5 100644
--- a/app/javascript/mastodon/reducers/height_cache.js
+++ b/app/javascript/mastodon/reducers/height_cache.js
@@ -20,4 +20,4 @@ export default function statuses(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/list_adder.js b/app/javascript/mastodon/reducers/list_adder.js
index b8c1b0e26..b144610a5 100644
--- a/app/javascript/mastodon/reducers/list_adder.js
+++ b/app/javascript/mastodon/reducers/list_adder.js
@@ -44,4 +44,4 @@ export default function listAdderReducer(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/list_editor.js b/app/javascript/mastodon/reducers/list_editor.js
index 91e524dd5..6e020dbe6 100644
--- a/app/javascript/mastodon/reducers/list_editor.js
+++ b/app/javascript/mastodon/reducers/list_editor.js
@@ -93,4 +93,4 @@ export default function listEditorReducer(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/lists.js b/app/javascript/mastodon/reducers/lists.js
index f30ffbcbd..ba3e2b3cb 100644
--- a/app/javascript/mastodon/reducers/lists.js
+++ b/app/javascript/mastodon/reducers/lists.js
@@ -34,4 +34,4 @@ export default function lists(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/markers.js b/app/javascript/mastodon/reducers/markers.js
index fb1572ff5..e3d1b1936 100644
--- a/app/javascript/mastodon/reducers/markers.js
+++ b/app/javascript/mastodon/reducers/markers.js
@@ -22,4 +22,4 @@ export default function markers(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/media_attachments.js b/app/javascript/mastodon/reducers/media_attachments.js
index 24119f628..7a155b77f 100644
--- a/app/javascript/mastodon/reducers/media_attachments.js
+++ b/app/javascript/mastodon/reducers/media_attachments.js
@@ -12,4 +12,4 @@ export default function meta(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/meta.js b/app/javascript/mastodon/reducers/meta.js
index 5040a340f..755dd7390 100644
--- a/app/javascript/mastodon/reducers/meta.js
+++ b/app/javascript/mastodon/reducers/meta.js
@@ -19,4 +19,4 @@ export default function meta(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/missed_updates.js b/app/javascript/mastodon/reducers/missed_updates.js
index b71d62d82..a3141d854 100644
--- a/app/javascript/mastodon/reducers/missed_updates.js
+++ b/app/javascript/mastodon/reducers/missed_updates.js
@@ -18,4 +18,4 @@ export default function missed_updates(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/modal.js b/app/javascript/mastodon/reducers/modal.js
index 3eab07d9d..edde2f947 100644
--- a/app/javascript/mastodon/reducers/modal.js
+++ b/app/javascript/mastodon/reducers/modal.js
@@ -36,4 +36,4 @@ export default function modal(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js
index eb5368198..44fa1c613 100644
--- a/app/javascript/mastodon/reducers/notifications.js
+++ b/app/javascript/mastodon/reducers/notifications.js
@@ -303,4 +303,4 @@ export default function notifications(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/picture_in_picture.js b/app/javascript/mastodon/reducers/picture_in_picture.js
index 48772ae7f..10fbc1695 100644
--- a/app/javascript/mastodon/reducers/picture_in_picture.js
+++ b/app/javascript/mastodon/reducers/picture_in_picture.js
@@ -22,4 +22,4 @@ export default function pictureInPicture(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/push_notifications.js b/app/javascript/mastodon/reducers/push_notifications.js
index c48cfb705..6a62ecb81 100644
--- a/app/javascript/mastodon/reducers/push_notifications.js
+++ b/app/javascript/mastodon/reducers/push_notifications.js
@@ -50,4 +50,4 @@ export default function push_subscriptions(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/relationships.js b/app/javascript/mastodon/reducers/relationships.js
index 53949258a..a3b01a0f6 100644
--- a/app/javascript/mastodon/reducers/relationships.js
+++ b/app/javascript/mastodon/reducers/relationships.js
@@ -1,4 +1,7 @@
 import {
+  NOTIFICATIONS_UPDATE,
+} from '../actions/notifications';
+import {
   ACCOUNT_FOLLOW_SUCCESS,
   ACCOUNT_FOLLOW_REQUEST,
   ACCOUNT_FOLLOW_FAIL,
@@ -12,6 +15,8 @@ import {
   ACCOUNT_PIN_SUCCESS,
   ACCOUNT_UNPIN_SUCCESS,
   RELATIONSHIPS_FETCH_SUCCESS,
+  FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
+  FOLLOW_REQUEST_REJECT_SUCCESS,
 } from '../actions/accounts';
 import {
   DOMAIN_BLOCK_SUCCESS,
@@ -44,6 +49,12 @@ const initialState = ImmutableMap();
 
 export default function relationships(state = initialState, action) {
   switch(action.type) {
+  case FOLLOW_REQUEST_AUTHORIZE_SUCCESS:
+    return state.setIn([action.id, 'followed_by'], true).setIn([action.id, 'requested_by'], false);
+  case FOLLOW_REQUEST_REJECT_SUCCESS:
+    return state.setIn([action.id, 'followed_by'], false).setIn([action.id, 'requested_by'], false);
+  case NOTIFICATIONS_UPDATE:
+    return action.notification.type === 'follow_request' ? state.setIn([action.notification.account.id, 'requested_by'], true) : state;
   case ACCOUNT_FOLLOW_REQUEST:
     return state.getIn([action.id, 'following']) ? state : state.setIn([action.id, action.locked ? 'requested' : 'following'], true);
   case ACCOUNT_FOLLOW_FAIL:
@@ -71,4 +82,4 @@ export default function relationships(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/search.js b/app/javascript/mastodon/reducers/search.js
index 7dceac6b9..d3e71da9d 100644
--- a/app/javascript/mastodon/reducers/search.js
+++ b/app/javascript/mastodon/reducers/search.js
@@ -64,4 +64,4 @@ export default function search(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js
index f9d3236e4..f48d58bdc 100644
--- a/app/javascript/mastodon/reducers/settings.js
+++ b/app/javascript/mastodon/reducers/settings.js
@@ -171,4 +171,4 @@ export default function settings(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/status_lists.js b/app/javascript/mastodon/reducers/status_lists.js
index 106f64d32..b1716e9cf 100644
--- a/app/javascript/mastodon/reducers/status_lists.js
+++ b/app/javascript/mastodon/reducers/status_lists.js
@@ -145,4 +145,4 @@ export default function statusLists(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/statuses.js b/app/javascript/mastodon/reducers/statuses.js
index c30c1e2cc..a39ac6b64 100644
--- a/app/javascript/mastodon/reducers/statuses.js
+++ b/app/javascript/mastodon/reducers/statuses.js
@@ -92,4 +92,4 @@ export default function statuses(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/suggestions.js b/app/javascript/mastodon/reducers/suggestions.js
index 1a6e66ee7..0b4bc7789 100644
--- a/app/javascript/mastodon/reducers/suggestions.js
+++ b/app/javascript/mastodon/reducers/suggestions.js
@@ -34,4 +34,4 @@ export default function suggestionsReducer(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/tags.js b/app/javascript/mastodon/reducers/tags.js
index d24098e39..ea73af452 100644
--- a/app/javascript/mastodon/reducers/tags.js
+++ b/app/javascript/mastodon/reducers/tags.js
@@ -22,4 +22,4 @@ export default function tags(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/timelines.js b/app/javascript/mastodon/reducers/timelines.js
index d72109e69..973e3cf18 100644
--- a/app/javascript/mastodon/reducers/timelines.js
+++ b/app/javascript/mastodon/reducers/timelines.js
@@ -223,4 +223,4 @@ export default function timelines(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/trends.js b/app/javascript/mastodon/reducers/trends.js
index 3e01bd07d..3d5f6ecd6 100644
--- a/app/javascript/mastodon/reducers/trends.js
+++ b/app/javascript/mastodon/reducers/trends.js
@@ -43,4 +43,4 @@ export default function trendsReducer(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/reducers/user_lists.js b/app/javascript/mastodon/reducers/user_lists.js
index 88b51fb63..2a80cf639 100644
--- a/app/javascript/mastodon/reducers/user_lists.js
+++ b/app/javascript/mastodon/reducers/user_lists.js
@@ -187,4 +187,4 @@ export default function userLists(state = initialState, action) {
   default:
     return state;
   }
-};
+}
diff --git a/app/javascript/mastodon/store/configureStore.js b/app/javascript/mastodon/store/configureStore.js
index e18af842f..0e0d45c66 100644
--- a/app/javascript/mastodon/store/configureStore.js
+++ b/app/javascript/mastodon/store/configureStore.js
@@ -12,4 +12,4 @@ export default function configureStore() {
     errorsMiddleware(),
     soundsMiddleware(),
   ), window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__() : f => f));
-};
+}
diff --git a/app/javascript/mastodon/uuid.js b/app/javascript/mastodon/uuid.js
index be1899305..0d2cfaa77 100644
--- a/app/javascript/mastodon/uuid.js
+++ b/app/javascript/mastodon/uuid.js
@@ -1,3 +1,3 @@
 export default function uuid(a) {
   return a ? (a^Math.random() * 16 >> a / 4).toString(16) : ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, uuid);
-};
+}
diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js
index ab7c4a3f3..8017734d5 100644
--- a/app/javascript/packs/public.js
+++ b/app/javascript/packs/public.js
@@ -46,6 +46,18 @@ function main() {
       minute: 'numeric',
     });
 
+    const dateFormat = new Intl.DateTimeFormat(locale, {
+      year: 'numeric',
+      month: 'short',
+      day: 'numeric',
+      timeFormat: false,
+    });
+
+    const timeFormat = new Intl.DateTimeFormat(locale, {
+      timeStyle: 'short',
+      hour12: false,
+    });
+
     [].forEach.call(document.querySelectorAll('.emojify'), (content) => {
       content.innerHTML = emojify(content.innerHTML);
     });
@@ -58,6 +70,32 @@ function main() {
       content.textContent = formattedDate;
     });
 
+    const isToday = date => {
+      const today = new Date();
+
+      return date.getDate() === today.getDate() &&
+        date.getMonth() === today.getMonth() &&
+        date.getFullYear() === today.getFullYear();
+    };
+    const todayFormat = new IntlMessageFormat(messages['relative_format.today'] || 'Today at {time}', locale);
+
+    [].forEach.call(document.querySelectorAll('time.relative-formatted'), (content) => {
+      const datetime = new Date(content.getAttribute('datetime'));
+
+      let formattedContent;
+
+      if (isToday(datetime)) {
+        const formattedTime = timeFormat.format(datetime);
+
+        formattedContent = todayFormat.format({ time: formattedTime });
+      } else {
+        formattedContent = dateFormat.format(datetime);
+      }
+
+      content.title = formattedContent;
+      content.textContent = formattedContent;
+    });
+
     [].forEach.call(document.querySelectorAll('time.time-ago'), (content) => {
       const datetime = new Date(content.getAttribute('datetime'));
       const now      = new Date();
diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss
index 30c8320bf..7449cc785 100644
--- a/app/javascript/styles/mastodon-light/diff.scss
+++ b/app/javascript/styles/mastodon-light/diff.scss
@@ -285,22 +285,8 @@ html {
 .dropdown-menu {
   background: $white;
 
-  &__arrow {
-    &.left {
-      border-left-color: $white;
-    }
-
-    &.top {
-      border-top-color: $white;
-    }
-
-    &.bottom {
-      border-bottom-color: $white;
-    }
-
-    &.right {
-      border-right-color: $white;
-    }
+  &__arrow::before {
+    background-color: $white;
   }
 
   &__item {
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index 2372573d5..4250cf2b6 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -254,10 +254,8 @@ $content-width: 840px;
 
       &__actions {
         display: inline-flex;
-
-        & > :not(:first-child) {
-          margin-left: 5px;
-        }
+        flex-flow: wrap;
+        gap: 5px;
       }
 
       h2 small {
@@ -1218,7 +1216,7 @@ a.name-tag,
 
     path:first-child {
       fill: rgba($highlight-text-color, 0.25) !important;
-      fill-opacity: 100% !important;
+      fill-opacity: 1 !important;
     }
 
     path:last-child {
@@ -1681,6 +1679,15 @@ a.sparkline {
   box-sizing: border-box;
   min-height: 100%;
 
+  a {
+    color: $highlight-text-color;
+    text-decoration: none;
+
+    &:hover {
+      text-decoration: underline;
+    }
+  }
+
   p {
     margin-bottom: 20px;
     unicode-bidi: plaintext;
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 3650e3ec8..d5937643f 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -166,6 +166,30 @@
     &:disabled {
       opacity: 0.5;
     }
+
+    &.button--confirmation {
+      color: $valid-value-color;
+      border-color: $valid-value-color;
+
+      &:active,
+      &:focus,
+      &:hover {
+        background: $valid-value-color;
+        color: $primary-text-color;
+      }
+    }
+
+    &.button--destructive {
+      color: $error-value-color;
+      border-color: $error-value-color;
+
+      &:active,
+      &:focus,
+      &:hover {
+        background: $error-value-color;
+        color: $primary-text-color;
+      }
+    }
   }
 
   &.button--block {
@@ -339,8 +363,8 @@
   }
 }
 
-.dropdown-menu {
-  position: absolute;
+body > [data-popper-placement] {
+  z-index: 3;
 }
 
 .invisible {
@@ -1908,6 +1932,42 @@ a.account__display-name {
   text-decoration: none;
 }
 
+.dropdown-animation {
+  animation: dropdown 300ms cubic-bezier(0.1, 0.7, 0.1, 1);
+
+  @keyframes dropdown {
+    from {
+      opacity: 0;
+      transform: scaleX(0.85) scaleY(0.75);
+    }
+
+    to {
+      opacity: 1;
+      transform: scaleX(1) scaleY(1);
+    }
+  }
+
+  &.top {
+    transform-origin: bottom;
+  }
+
+  &.right {
+    transform-origin: left;
+  }
+
+  &.bottom {
+    transform-origin: top;
+  }
+
+  &.left {
+    transform-origin: right;
+  }
+
+  .reduce-motion & {
+    animation: none;
+  }
+}
+
 .dropdown {
   display: inline-block;
 }
@@ -1992,36 +2052,42 @@ a.account__display-name {
 
 .dropdown-menu__arrow {
   position: absolute;
-  width: 0;
-  height: 0;
-  border: 0 solid transparent;
 
-  &.left {
-    right: -5px;
-    margin-top: -5px;
-    border-width: 5px 0 5px 5px;
-    border-left-color: $ui-secondary-color;
+  &::before {
+    content: '';
+    display: block;
+    width: 14px;
+    height: 5px;
+    background-color: $ui-secondary-color;
+    mask-image: url("data:image/svg+xml;utf8,<svg width='14' height='5' xmlns='http://www.w3.org/2000/svg'><path d='M7 0L0 5h14L7 0z' fill='white'/></svg>");
   }
 
   &.top {
     bottom: -5px;
-    margin-left: -7px;
-    border-width: 5px 7px 0;
-    border-top-color: $ui-secondary-color;
+
+    &::before {
+      transform: rotate(180deg);
+    }
+  }
+
+  &.right {
+    left: -9px;
+
+    &::before {
+      transform: rotate(-90deg);
+    }
   }
 
   &.bottom {
     top: -5px;
-    margin-left: -7px;
-    border-width: 0 7px 5px;
-    border-bottom-color: $ui-secondary-color;
   }
 
-  &.right {
-    left: -5px;
-    margin-top: -5px;
-    border-width: 5px 5px 5px 0;
-    border-right-color: $ui-secondary-color;
+  &.left {
+    right: -9px;
+
+    &::before {
+      transform: rotate(90deg);
+    }
   }
 }
 
@@ -2474,8 +2540,7 @@ $ui-header-height: 55px;
     height: calc(100% - 10px) !important;
   }
 
-  .getting-started__wrapper,
-  .search {
+  .getting-started__wrapper {
     margin-bottom: 10px;
   }
 
@@ -2528,7 +2593,7 @@ $ui-header-height: 55px;
     }
   }
 
-  .ui__header {
+  .layout-single-column .ui__header {
     display: flex;
     background: $ui-base-color;
     border-bottom: 1px solid lighten($ui-base-color, 8%);
@@ -4245,7 +4310,7 @@ a.status-card.compact:hover {
 }
 
 @keyframes heartbeat {
-  from {
+  0% {
     transform: scale(1);
     animation-timing-function: ease-out;
   }
@@ -4315,7 +4380,7 @@ a.status-card.compact:hover {
 
 .emoji-picker-dropdown__menu {
   background: $simple-background-color;
-  position: absolute;
+  position: relative;
   box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);
   border-radius: 4px;
   margin-top: 5px;
@@ -4501,7 +4566,6 @@ a.status-card.compact:hover {
 }
 
 .privacy-dropdown__dropdown {
-  position: absolute;
   background: $simple-background-color;
   box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
   border-radius: 4px;
@@ -4607,7 +4671,6 @@ a.status-card.compact:hover {
 
 .language-dropdown {
   &__dropdown {
-    position: absolute;
     background: $simple-background-color;
     box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
     border-radius: 4px;
@@ -4671,6 +4734,7 @@ a.status-card.compact:hover {
 }
 
 .search {
+  margin-bottom: 10px;
   position: relative;
 }
 
@@ -4853,7 +4917,6 @@ a.status-card.compact:hover {
 .modal-root__modal {
   pointer-events: auto;
   display: flex;
-  z-index: 9999;
 }
 
 .video-modal__container {
@@ -6722,7 +6785,8 @@ noscript {
   }
 }
 
-.moved-account-banner {
+.moved-account-banner,
+.follow-request-banner {
   padding: 20px;
   background: lighten($ui-base-color, 4%);
   display: flex;
@@ -6745,6 +6809,7 @@ noscript {
     justify-content: space-between;
     align-items: center;
     gap: 15px;
+    width: 100%;
   }
 
   .detailed-status__display-name {
@@ -6752,6 +6817,10 @@ noscript {
   }
 }
 
+.follow-request-banner .button {
+  width: 100%;
+}
+
 .column-inline-form {
   padding: 15px;
   display: flex;
@@ -7021,7 +7090,6 @@ noscript {
       display: block;
       flex: 0 0 auto;
       width: 94px;
-      margin-left: -2px;
 
       .account__avatar {
         background: darken($ui-base-color, 8%);
@@ -7038,6 +7106,7 @@ noscript {
     padding-top: 10px;
     gap: 8px;
     overflow: hidden;
+    margin-left: -2px; // aligns the pfp with content below
 
     &__buttons {
       display: flex;
@@ -7092,6 +7161,10 @@ noscript {
           font-weight: 400;
           overflow: hidden;
           text-overflow: ellipsis;
+
+          span {
+            user-select: all;
+          }
         }
       }
     }
@@ -7309,7 +7382,7 @@ noscript {
 
       path:first-child {
         fill: rgba($highlight-text-color, 0.25) !important;
-        fill-opacity: 100% !important;
+        fill-opacity: 1 !important;
       }
 
       path:last-child {
@@ -7662,7 +7735,7 @@ noscript {
       left: 0;
       width: 100%;
       height: 100%;
-      border-left: 2px solid $highlight-text-color;
+      border-left: 4px solid $highlight-text-color;
       pointer-events: none;
     }
   }
diff --git a/app/javascript/styles/mastodon/modal.scss b/app/javascript/styles/mastodon/modal.scss
index 6c6de4206..a333926dd 100644
--- a/app/javascript/styles/mastodon/modal.scss
+++ b/app/javascript/styles/mastodon/modal.scss
@@ -1,5 +1,5 @@
 .modal-layout {
-  background: $ui-base-color url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}"/></svg>') repeat-x bottom fixed;
+  background: $ui-base-color url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 234.80078 31.757813" width="234.80078" height="31.757812"><path d="M19.599609 0c-1.05 0-2.10039.375-2.90039 1.125L0 16.925781v14.832031h234.80078V17.025391l-16.5-15.900391c-1.6-1.5-4.20078-1.5-5.80078 0l-13.80078 13.099609c-1.6 1.5-4.19883 1.5-5.79883 0L179.09961 1.125c-1.6-1.5-4.19883-1.5-5.79883 0L159.5 14.224609c-1.6 1.5-4.20078 1.5-5.80078 0L139.90039 1.125c-1.6-1.5-4.20078-1.5-5.80078 0l-13.79883 13.099609c-1.6 1.5-4.20078 1.5-5.80078 0L100.69922 1.125c-1.600001-1.5-4.198829-1.5-5.798829 0l-13.59961 13.099609c-1.6 1.5-4.200781 1.5-5.800781 0L61.699219 1.125c-1.6-1.5-4.198828-1.5-5.798828 0L42.099609 14.224609c-1.6 1.5-4.198828 1.5-5.798828 0L22.5 1.125C21.7.375 20.649609 0 19.599609 0z" fill="#{hex-color($ui-base-lighter-color)}33"/></svg>') repeat-x bottom fixed;
   display: flex;
   flex-direction: column;
   height: 100vh;
diff --git a/app/javascript/styles/mastodon/polls.scss b/app/javascript/styles/mastodon/polls.scss
index f553c5501..6812d5462 100644
--- a/app/javascript/styles/mastodon/polls.scss
+++ b/app/javascript/styles/mastodon/polls.scss
@@ -279,10 +279,10 @@
   color: $dark-text-color;
 
   &__chart {
-    background: rgba(darken($ui-primary-color, 14%), 0.2);
+    background: rgba(darken($ui-primary-color, 14%), 0.7);
 
     &.leading {
-      background: rgba($ui-highlight-color, 0.2);
+      background: rgba($ui-highlight-color, 0.5);
     }
   }
 }
diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss
index 0e39dc87b..7a25d121b 100644
--- a/app/javascript/styles/mastodon/widgets.scss
+++ b/app/javascript/styles/mastodon/widgets.scss
@@ -39,6 +39,8 @@
       width: 20px;
       height: 20px;
       margin: -3px 0 0;
+      margin-left: 0.075em;
+      margin-right: 0.075em;
     }
 
     p {
diff --git a/app/lib/admin/system_check/elasticsearch_check.rb b/app/lib/admin/system_check/elasticsearch_check.rb
index 8aee18267..7f922978f 100644
--- a/app/lib/admin/system_check/elasticsearch_check.rb
+++ b/app/lib/admin/system_check/elasticsearch_check.rb
@@ -13,7 +13,14 @@ class Admin::SystemCheck::ElasticsearchCheck < Admin::SystemCheck::BaseCheck
 
   def message
     if running_version.present?
-      Admin::SystemCheck::Message.new(:elasticsearch_version_check, I18n.t('admin.system_checks.elasticsearch_version_check.version_comparison', running_version: running_version, required_version: required_version))
+      Admin::SystemCheck::Message.new(
+        :elasticsearch_version_check,
+        I18n.t(
+          'admin.system_checks.elasticsearch_version_check.version_comparison',
+          running_version: running_version,
+          required_version: required_version
+        )
+      )
     else
       Admin::SystemCheck::Message.new(:elasticsearch_running_check)
     end
@@ -23,7 +30,8 @@ class Admin::SystemCheck::ElasticsearchCheck < Admin::SystemCheck::BaseCheck
 
   def running_version
     @running_version ||= begin
-      Chewy.client.info['version']['number']
+      Chewy.client.info['version']['minimum_wire_compatibility_version'] ||
+        Chewy.client.info['version']['number']
     rescue Faraday::ConnectionFailed
       nil
     end
@@ -34,6 +42,7 @@ class Admin::SystemCheck::ElasticsearchCheck < Admin::SystemCheck::BaseCheck
   end
 
   def compatible_version?
+    return false if running_version.nil?
     Gem::Version.new(running_version) >= Gem::Version.new(required_version)
   end
 end
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index 9fe9ec346..14208e557 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -414,6 +414,7 @@ class FeedManager
     end
 
     return true if check_for_blocks.any? { |target_account_id| crutches[:blocking][target_account_id] || crutches[:muting][target_account_id] }
+    return true if crutches[:blocked_by][status.account_id]
 
     if status.reply? && !status.in_reply_to_account_id.nil?                                                                      # Filter out if it's a reply
       should_filter   = !crutches[:following][status.in_reply_to_account_id]                                                     # and I'm not following the person it's a reply to
@@ -606,7 +607,7 @@ class FeedManager
     crutches[:blocking]        = Block.where(account_id: receiver_id, target_account_id: check_for_blocks).pluck(:target_account_id).index_with(true)
     crutches[:muting]          = Mute.where(account_id: receiver_id, target_account_id: check_for_blocks).pluck(:target_account_id).index_with(true)
     crutches[:domain_blocking] = AccountDomainBlock.where(account_id: receiver_id, domain: statuses.flat_map { |s| [s.account.domain, s.reblog&.account&.domain] }.compact).pluck(:domain).index_with(true)
-    crutches[:blocked_by]      = Block.where(target_account_id: receiver_id, account_id: statuses.map { |s| s.reblog&.account_id }.compact).pluck(:account_id).index_with(true)
+    crutches[:blocked_by]      = Block.where(target_account_id: receiver_id, account_id: statuses.map { |s| [s.account_id, s.reblog&.account_id] }.flatten.compact).pluck(:account_id).index_with(true)
 
     crutches
   end
diff --git a/app/lib/request.rb b/app/lib/request.rb
index 96d934a8f..0508169dc 100644
--- a/app/lib/request.rb
+++ b/app/lib/request.rb
@@ -30,7 +30,8 @@ class Request
     @verb        = verb
     @url         = Addressable::URI.parse(url).normalize
     @http_client = options.delete(:http_client)
-    @options     = options.merge(socket_class: use_proxy? ? ProxySocket : Socket)
+    @allow_local = options.delete(:allow_local)
+    @options     = options.merge(socket_class: use_proxy? || @allow_local ? ProxySocket : Socket)
     @options     = @options.merge(proxy_url) if use_proxy?
     @headers     = {}
 
@@ -153,9 +154,7 @@ class Request
   end
 
   module ClientLimit
-    def body_with_limit(limit = 1.megabyte)
-      raise Mastodon::LengthValidationError if content_length.present? && content_length > limit
-
+    def truncated_body(limit = 1.megabyte)
       if charset.nil?
         encoding = Encoding::BINARY
       else
@@ -172,11 +171,19 @@ class Request
         contents << chunk
         chunk.clear
 
-        raise Mastodon::LengthValidationError if contents.bytesize > limit
+        break if contents.bytesize > limit
       end
 
       contents
     end
+
+    def body_with_limit(limit = 1.megabyte)
+      raise Mastodon::LengthValidationError if content_length.present? && content_length > limit
+
+      contents = truncated_body(limit)
+      raise Mastodon::LengthValidationError if contents.bytesize > limit
+      contents
+    end
   end
 
   if ::HTTP::Response.methods.include?(:body_with_limit) && !Rails.env.production?
diff --git a/app/lib/status_reach_finder.rb b/app/lib/status_reach_finder.rb
index ccf1e9e3a..36fb0e80f 100644
--- a/app/lib/status_reach_finder.rb
+++ b/app/lib/status_reach_finder.rb
@@ -70,7 +70,7 @@ class StatusReachFinder
 
   def followers_inboxes
     if @status.in_reply_to_local_account? && distributable?
-      @status.account.followers.or(@status.thread.account.followers).inboxes
+      @status.account.followers.or(@status.thread.account.followers.not_domain_blocked_by_account(@status.account)).inboxes
     elsif @status.direct_visibility? || @status.limited_visibility?
       []
     else
diff --git a/app/lib/translation_service/libre_translate.rb b/app/lib/translation_service/libre_translate.rb
index 43576e306..4ebe21e45 100644
--- a/app/lib/translation_service/libre_translate.rb
+++ b/app/lib/translation_service/libre_translate.rb
@@ -27,7 +27,7 @@ class TranslationService::LibreTranslate < TranslationService
 
   def request(text, source_language, target_language)
     body = Oj.dump(q: text, source: source_language.presence || 'auto', target: target_language, format: 'html', api_key: @api_key)
-    req = Request.new(:post, "#{@base_url}/translate", body: body)
+    req = Request.new(:post, "#{@base_url}/translate", body: body, allow_local: true)
     req.add_headers('Content-Type': 'application/json')
     req
   end
diff --git a/app/lib/vacuum/feeds_vacuum.rb b/app/lib/vacuum/feeds_vacuum.rb
index 00b9fd646..b0246bc0d 100644
--- a/app/lib/vacuum/feeds_vacuum.rb
+++ b/app/lib/vacuum/feeds_vacuum.rb
@@ -10,14 +10,14 @@ class Vacuum::FeedsVacuum
   private
 
   def vacuum_inactive_home_feeds!
-    inactive_users.select(:id, :account_id).find_in_batches do |users|
-      feed_manager.clean_feeds!(:home, users.map(&:account_id))
+    inactive_users.select(:id, :account_id).in_batches do |users|
+      feed_manager.clean_feeds!(:home, users.pluck(:account_id))
     end
   end
 
   def vacuum_inactive_list_feeds!
-    inactive_users_lists.select(:id).find_in_batches do |lists|
-      feed_manager.clean_feeds!(:list, lists.map(&:id))
+    inactive_users_lists.select(:id).in_batches do |lists|
+      feed_manager.clean_feeds!(:list, lists.ids)
     end
   end
 
diff --git a/app/lib/vacuum/statuses_vacuum.rb b/app/lib/vacuum/statuses_vacuum.rb
index d1c4e7197..28c087b1c 100644
--- a/app/lib/vacuum/statuses_vacuum.rb
+++ b/app/lib/vacuum/statuses_vacuum.rb
@@ -19,10 +19,7 @@ class Vacuum::StatusesVacuum
       # as the search index, must be handled first.
       statuses.direct_visibility
               .includes(mentions: :account)
-              .find_each do |status|
-        # TODO: replace temporary solution - call of private model method
-        status.send(:unlink_from_conversations)
-      end
+              .find_each(&:unlink_from_conversations!)
       remove_from_search_index(statuses.ids) if Chewy.enabled?
 
       # Foreign keys take care of most associated records for us.
diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb
index 09e2b7c53..2889d13b5 100644
--- a/app/mailers/user_mailer.rb
+++ b/app/mailers/user_mailer.rb
@@ -11,7 +11,7 @@ class UserMailer < Devise::Mailer
 
   helper RoutingHelper
 
-  def confirmation_instructions(user, token, **)
+  def confirmation_instructions(user, token, *, **)
     @resource = user
     @token    = token
     @instance = Rails.configuration.x.local_domain
@@ -25,7 +25,7 @@ class UserMailer < Devise::Mailer
     end
   end
 
-  def reset_password_instructions(user, token, **)
+  def reset_password_instructions(user, token, *, **)
     @resource = user
     @token    = token
     @instance = Rails.configuration.x.local_domain
@@ -37,7 +37,7 @@ class UserMailer < Devise::Mailer
     end
   end
 
-  def password_change(user, **)
+  def password_change(user, *, **)
     @resource = user
     @instance = Rails.configuration.x.local_domain
 
@@ -48,7 +48,7 @@ class UserMailer < Devise::Mailer
     end
   end
 
-  def email_changed(user, **)
+  def email_changed(user, *, **)
     @resource = user
     @instance = Rails.configuration.x.local_domain
 
@@ -59,7 +59,7 @@ class UserMailer < Devise::Mailer
     end
   end
 
-  def two_factor_enabled(user, **)
+  def two_factor_enabled(user, *, **)
     @resource = user
     @instance = Rails.configuration.x.local_domain
 
@@ -70,7 +70,7 @@ class UserMailer < Devise::Mailer
     end
   end
 
-  def two_factor_disabled(user, **)
+  def two_factor_disabled(user, *, **)
     @resource = user
     @instance = Rails.configuration.x.local_domain
 
@@ -81,7 +81,7 @@ class UserMailer < Devise::Mailer
     end
   end
 
-  def two_factor_recovery_codes_changed(user, **)
+  def two_factor_recovery_codes_changed(user, *, **)
     @resource = user
     @instance = Rails.configuration.x.local_domain
 
@@ -92,7 +92,7 @@ class UserMailer < Devise::Mailer
     end
   end
 
-  def webauthn_enabled(user, **)
+  def webauthn_enabled(user, *, **)
     @resource = user
     @instance = Rails.configuration.x.local_domain
 
@@ -103,7 +103,7 @@ class UserMailer < Devise::Mailer
     end
   end
 
-  def webauthn_disabled(user, **)
+  def webauthn_disabled(user, *, **)
     @resource = user
     @instance = Rails.configuration.x.local_domain
 
diff --git a/app/models/account.rb b/app/models/account.rb
index 6b3bd3af5..d9511999b 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -339,9 +339,15 @@ class Account < ApplicationRecord
 
   def save_with_optional_media!
     save!
-  rescue ActiveRecord::RecordInvalid
-    self.avatar = nil
-    self.header = nil
+  rescue ActiveRecord::RecordInvalid => e
+    errors = e.record.errors.errors
+    errors.each do |err|
+      if err.attribute == :avatar
+        self.avatar = nil
+      elsif err.attribute == :header
+        self.header = nil
+      end
+    end
 
     save!
   end
@@ -498,7 +504,8 @@ class Account < ApplicationRecord
         <<-SQL.squish
           SELECT
             accounts.*,
-            (count(f.id) + 1) * ts_rank_cd(#{TEXTSEARCH}, to_tsquery('simple', :tsquery), 32) AS rank
+            (count(f.id) + 1) * ts_rank_cd(#{TEXTSEARCH}, to_tsquery('simple', :tsquery), 32) AS rank,
+            count(f.id) AS followed
           FROM accounts
           LEFT OUTER JOIN follows AS f ON (accounts.id = f.account_id AND f.target_account_id = :id) OR (accounts.id = f.target_account_id AND f.account_id = :id)
           LEFT JOIN users ON accounts.id = users.account_id
@@ -506,8 +513,8 @@ class Account < ApplicationRecord
             AND accounts.suspended_at IS NULL
             AND accounts.moved_to_account_id IS NULL
             AND (accounts.domain IS NOT NULL OR (users.approved = TRUE AND users.confirmed_at IS NOT NULL))
-          GROUP BY accounts.id
-          ORDER BY rank DESC
+          GROUP BY accounts.id, s.id
+          ORDER BY followed DESC, rank DESC
           LIMIT :limit OFFSET :offset
         SQL
       end
diff --git a/app/models/account_filter.rb b/app/models/account_filter.rb
index 3a4ac0492..d27bb46fc 100644
--- a/app/models/account_filter.rb
+++ b/app/models/account_filter.rb
@@ -81,7 +81,7 @@ class AccountFilter
     when 'suspended'
       Account.suspended
     when 'disabled'
-      accounts_with_users.merge(User.disabled)
+      accounts_with_users.merge(User.disabled).without_suspended
     when 'silenced'
       Account.silenced
     when 'sensitized'
diff --git a/app/models/admin/status_batch_action.rb b/app/models/admin/status_batch_action.rb
index 0f019b854..39cd7d0eb 100644
--- a/app/models/admin/status_batch_action.rb
+++ b/app/models/admin/status_batch_action.rb
@@ -73,7 +73,7 @@ class Admin::StatusBatchAction
     # Can't use a transaction here because UpdateStatusService queues
     # Sidekiq jobs
     statuses.includes(:media_attachments, :preview_cards).find_each do |status|
-      next unless status.with_media? || status.with_preview_card?
+      next if status.discarded? || !(status.with_media? || status.with_preview_card?)
 
       authorize([:admin, status], :update?)
 
@@ -89,15 +89,15 @@ class Admin::StatusBatchAction
         report.resolve!(current_account)
         log_action(:resolve, report)
       end
-
-      @warning = target_account.strikes.create!(
-        action: :mark_statuses_as_sensitive,
-        account: current_account,
-        report: report,
-        status_ids: status_ids
-      )
     end
 
+    @warning = target_account.strikes.create!(
+      action: :mark_statuses_as_sensitive,
+      account: current_account,
+      report: report,
+      status_ids: status_ids
+    )
+
     UserMailer.warning(target_account.user, @warning).deliver_later! if warnable?
   end
 
diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb
index 15c49f2fe..de8bf338f 100644
--- a/app/models/concerns/account_interactions.rb
+++ b/app/models/concerns/account_interactions.rb
@@ -44,6 +44,10 @@ module AccountInteractions
       end
     end
 
+    def requested_by_map(target_account_ids, account_id)
+      follow_mapping(FollowRequest.where(account_id: target_account_ids, target_account_id: account_id), :account_id)
+    end
+
     def endorsed_map(target_account_ids, account_id)
       follow_mapping(AccountPin.where(account_id: account_id, target_account_id: target_account_ids), :target_account_id)
     end
diff --git a/app/models/concerns/omniauthable.rb b/app/models/concerns/omniauthable.rb
index a90d5d888..feac0a1f5 100644
--- a/app/models/concerns/omniauthable.rb
+++ b/app/models/concerns/omniauthable.rb
@@ -55,7 +55,14 @@ module Omniauthable
 
       user = User.new(user_params_from_auth(email, auth))
 
-      user.account.avatar_remote_url = auth.info.image if /\A#{URI::DEFAULT_PARSER.make_regexp(%w(http https))}\z/.match?(auth.info.image)
+      begin
+        if /\A#{URI::DEFAULT_PARSER.make_regexp(%w(http https))}\z/.match?(auth.info.image)
+          user.account.avatar_remote_url = auth.info.image
+        end
+      rescue Mastodon::UnexpectedResponseError
+        user.account.avatar_remote_url = nil
+      end
+
       user.skip_confirmation! if email_is_verified
       user.save!
       user
diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb
index b53a82db2..b595529f8 100644
--- a/app/models/form/admin_settings.rb
+++ b/app/models/form/admin_settings.rb
@@ -83,6 +83,7 @@ class Form::AdminSettings
   validates :show_domain_blocks_rationale, inclusion: { in: %w(disabled users all) }, if: -> { defined?(@show_domain_blocks_rationale) }
   validates :media_cache_retention_period, :content_cache_retention_period, :backups_retention_period, numericality: { only_integer: true }, allow_blank: true, if: -> { defined?(@media_cache_retention_period) || defined?(@content_cache_retention_period) || defined?(@backups_retention_period) }
   validates :site_short_description, length: { maximum: 200 }, if: -> { defined?(@site_short_description) }
+  validate :validate_site_uploads
 
   KEYS.each do |key|
     define_method(key) do
@@ -104,11 +105,16 @@ class Form::AdminSettings
     define_method("#{key}=") do |file|
       value = public_send(key)
       value.file = file
+    rescue Mastodon::DimensionsValidationError => e
+      errors.add(key.to_sym, e.message)
     end
   end
 
   def save
-    return false unless valid?
+    # NOTE: Annoyingly, files are processed and can error out before
+    # validations are called, and `valid?` clears errors…
+    # So for now, return early if errors aren't empty.
+    return false unless errors.empty? && valid?
 
     KEYS.each do |key|
       next if PSEUDO_KEYS.include?(key) || !instance_variable_defined?("@#{key}")
@@ -141,4 +147,16 @@ class Form::AdminSettings
       value
     end
   end
+
+  def validate_site_uploads
+    UPLOAD_KEYS.each do |key|
+      next unless instance_variable_defined?("@#{key}")
+      upload = instance_variable_get("@#{key}")
+      next if upload.valid?
+
+      upload.errors.each do |error|
+        errors.import(error, attribute: key)
+      end
+    end
+  end
 end
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index f2b34e4cd..4dd3042ab 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -210,6 +210,8 @@ class MediaAttachment < ApplicationRecord
 
   default_scope { order(id: :asc) }
 
+  attr_accessor :skip_download
+
   def local?
     remote_url.blank?
   end
diff --git a/app/models/relay.rb b/app/models/relay.rb
index d6ddd30ed..c66bfe4ff 100644
--- a/app/models/relay.rb
+++ b/app/models/relay.rb
@@ -18,6 +18,7 @@ class Relay < ApplicationRecord
 
   scope :enabled, -> { accepted }
 
+  before_validation :strip_url
   before_destroy :ensure_disabled
 
   alias enabled? accepted?
@@ -74,4 +75,8 @@ class Relay < ApplicationRecord
   def ensure_disabled
     disable! if enabled?
   end
+
+  def strip_url
+    inbox_url&.strip!
+  end
 end
diff --git a/app/models/status.rb b/app/models/status.rb
index 6cfe19d23..14b7a39fe 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -31,7 +31,7 @@
 #
 
 class Status < ApplicationRecord
-  before_destroy :unlink_from_conversations
+  before_destroy :unlink_from_conversations!
 
   include Discard::Model
   include Paginable
@@ -314,15 +314,14 @@ class Status < ApplicationRecord
   after_create_commit :store_uri, if: :local?
   after_create_commit :update_statistics, if: :local?
 
-  around_create Mastodon::Snowflake::Callbacks
-
-  before_create :set_locality
-
   before_validation :prepare_contents, if: :local?
   before_validation :set_reblog
   before_validation :set_visibility
   before_validation :set_conversation
   before_validation :set_local
+  before_create :set_locality
+
+  around_create Mastodon::Snowflake::Callbacks
 
   after_create :set_poll_id
 
@@ -504,6 +503,17 @@ class Status < ApplicationRecord
     update_attribute(:deleted_at, discard_time)
   end
 
+  def unlink_from_conversations!
+    return unless direct_visibility?
+
+    inbox_owners = mentioned_accounts.local
+    inbox_owners += [account] if account.local?
+
+    inbox_owners.each do |inbox_owner|
+      AccountConversation.remove_status(inbox_owner, self)
+    end
+  end
+
   private
 
   def update_status_stat!(attrs)
@@ -587,15 +597,4 @@ class Status < ApplicationRecord
     reblog&.decrement_count!(:reblogs_count) if reblog?
     thread&.decrement_count!(:replies_count) if in_reply_to_id.present? && distributable?
   end
-
-  def unlink_from_conversations
-    return unless direct_visibility?
-
-    inbox_owners = mentioned_accounts.local
-    inbox_owners += [account] if account.local?
-
-    inbox_owners.each do |inbox_owner|
-      AccountConversation.remove_status(inbox_owner, self)
-    end
-  end
 end
diff --git a/app/models/tag.rb b/app/models/tag.rb
index b66f85423..47a05d00a 100644
--- a/app/models/tag.rb
+++ b/app/models/tag.rb
@@ -26,8 +26,12 @@ class Tag < ApplicationRecord
   has_many :featured_tags, dependent: :destroy, inverse_of: :tag
   has_many :followers, through: :passive_relationships, source: :account
 
-  HASHTAG_SEPARATORS = "_\u00B7\u200c"
-  HASHTAG_NAME_PAT = "([[:word:]_][[:word:]#{HASHTAG_SEPARATORS}]*[[:alpha:]#{HASHTAG_SEPARATORS}][[:word:]#{HASHTAG_SEPARATORS}]*[[:word:]_])|([[:word:]_]*[[:alpha:]][[:word:]_]*)"
+  HASHTAG_SEPARATORS = "_\u00B7\u30FB\u200c"
+  HASHTAG_FIRST_SEQUENCE_CHUNK_ONE = "[[:word:]_][[:word:]#{HASHTAG_SEPARATORS}]*[[:alpha:]#{HASHTAG_SEPARATORS}]"
+  HASHTAG_FIRST_SEQUENCE_CHUNK_TWO = "[[:word:]#{HASHTAG_SEPARATORS}]*[[:word:]_]"
+  HASHTAG_FIRST_SEQUENCE = "(#{HASHTAG_FIRST_SEQUENCE_CHUNK_ONE}#{HASHTAG_FIRST_SEQUENCE_CHUNK_TWO})"
+  HASTAG_LAST_SEQUENCE = '([[:word:]_]*[[:alpha:]][[:word:]_]*)'
+  HASHTAG_NAME_PAT = "#{HASHTAG_FIRST_SEQUENCE}|#{HASTAG_LAST_SEQUENCE}"
 
   HASHTAG_RE = /(?:^|[^\/\)\w])#(#{HASHTAG_NAME_PAT})/i
   HASHTAG_NAME_RE = /\A(#{HASHTAG_NAME_PAT})\z/i
@@ -45,7 +49,11 @@ class Tag < ApplicationRecord
   scope :listable, -> { where(listable: [true, nil]) }
   scope :trendable, -> { Setting.trendable_by_default ? where(trendable: [true, nil]) : where(trendable: true) }
   scope :not_trendable, -> { where(trendable: false) }
-  scope :recently_used, ->(account) { joins(:statuses).where(statuses: { id: account.statuses.select(:id).limit(1000) }).group(:id).order(Arel.sql('count(*) desc')) }
+  scope :recently_used, ->(account) {
+                          joins(:statuses)
+                            .where(statuses: { id: account.statuses.select(:id).limit(1000) })
+                            .group(:id).order(Arel.sql('count(*) desc'))
+                        }
   scope :matches_name, ->(term) { where(arel_table[:name].lower.matches(arel_table.lower("#{sanitize_sql_like(Tag.normalize(term))}%"), nil, true)) } # Search with case-sensitive to use B-tree index
 
   update_index('tags', :self)
@@ -105,7 +113,8 @@ class Tag < ApplicationRecord
       names = Array(name_or_names).map { |str| [normalize(str), str] }.uniq(&:first)
 
       names.map do |(normalized_name, display_name)|
-        tag = matching_name(normalized_name).first || create(name: normalized_name, display_name: display_name.gsub(HASHTAG_INVALID_CHARS_RE, ''))
+        tag = matching_name(normalized_name).first || create(name: normalized_name,
+                                                             display_name: display_name.gsub(HASHTAG_INVALID_CHARS_RE, ''))
 
         yield tag if block_given?
 
@@ -154,6 +163,9 @@ class Tag < ApplicationRecord
   end
 
   def validate_display_name_change
-    errors.add(:display_name, I18n.t('tags.does_not_match_previous_name')) unless HashtagNormalizer.new.normalize(display_name).casecmp(name.mb_chars).zero?
+    unless HashtagNormalizer.new.normalize(display_name).casecmp(name.mb_chars).zero?
+      errors.add(:display_name,
+                 I18n.t('tags.does_not_match_previous_name'))
+    end
   end
 end
diff --git a/app/models/user.rb b/app/models/user.rb
index 209bfa521..2e3c067ec 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -386,6 +386,15 @@ class User < ApplicationRecord
     super
   end
 
+  def revoke_access!
+    Doorkeeper::AccessGrant.by_resource_owner(self).update_all(revoked_at: Time.now.utc)
+
+    Doorkeeper::AccessToken.by_resource_owner(self).in_batches do |batch|
+      batch.update_all(revoked_at: Time.now.utc)
+      Web::PushSubscription.where(access_token_id: batch).delete_all
+    end
+  end
+
   def reset_password!
     # First, change password to something random and deactivate all sessions
     transaction do
@@ -394,12 +403,7 @@ class User < ApplicationRecord
     end
 
     # Then, remove all authorized applications and connected push subscriptions
-    Doorkeeper::AccessGrant.by_resource_owner(self).in_batches.update_all(revoked_at: Time.now.utc)
-
-    Doorkeeper::AccessToken.by_resource_owner(self).in_batches do |batch|
-      batch.update_all(revoked_at: Time.now.utc)
-      Web::PushSubscription.where(access_token_id: batch).delete_all
-    end
+    revoke_access!
 
     # Finally, send a reset password prompt to the user
     send_reset_password_instructions
@@ -494,6 +498,7 @@ class User < ApplicationRecord
     BootstrapTimelineWorker.perform_async(account_id)
     ActivityTracker.increment('activity:accounts:local')
     UserMailer.welcome(self).deliver_later
+    TriggerWebhookWorker.perform_async('account.approved', 'Account', account_id)
   end
 
   def prepare_returning_user!
diff --git a/app/models/webhook.rb b/app/models/webhook.rb
index 431edd75d..4aafb1257 100644
--- a/app/models/webhook.rb
+++ b/app/models/webhook.rb
@@ -15,6 +15,7 @@
 
 class Webhook < ApplicationRecord
   EVENTS = %w(
+    account.approved
     account.created
     report.created
   ).freeze
diff --git a/app/presenters/account_relationships_presenter.rb b/app/presenters/account_relationships_presenter.rb
index d662380f6..ab8bac412 100644
--- a/app/presenters/account_relationships_presenter.rb
+++ b/app/presenters/account_relationships_presenter.rb
@@ -2,7 +2,7 @@
 
 class AccountRelationshipsPresenter
   attr_reader :following, :followed_by, :blocking, :blocked_by,
-              :muting, :requested, :domain_blocking,
+              :muting, :requested, :requested_by, :domain_blocking,
               :endorsed, :account_note
 
   def initialize(account_ids, current_account_id, **options)
@@ -15,6 +15,7 @@ class AccountRelationshipsPresenter
     @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))
+    @requested_by    = cached[:requested_by].merge(Account.requested_by_map(@uncached_account_ids, @current_account_id))
     @domain_blocking = cached[:domain_blocking].merge(Account.domain_blocking_map(@uncached_account_ids, @current_account_id))
     @endorsed        = cached[:endorsed].merge(Account.endorsed_map(@uncached_account_ids, @current_account_id))
     @account_note    = cached[:account_note].merge(Account.account_note_map(@uncached_account_ids, @current_account_id))
@@ -27,6 +28,7 @@ class AccountRelationshipsPresenter
     @blocked_by.merge!(options[:blocked_by_map] || {})
     @muting.merge!(options[:muting_map] || {})
     @requested.merge!(options[:requested_map] || {})
+    @requested_by.merge!(options[:requested_by_map] || {})
     @domain_blocking.merge!(options[:domain_blocking_map] || {})
     @endorsed.merge!(options[:endorsed_map] || {})
     @account_note.merge!(options[:account_note_map] || {})
@@ -44,6 +46,7 @@ class AccountRelationshipsPresenter
       blocked_by: {},
       muting: {},
       requested: {},
+      requested_by: {},
       domain_blocking: {},
       endorsed: {},
       account_note: {},
@@ -73,6 +76,7 @@ class AccountRelationshipsPresenter
         blocked_by:      { account_id => blocked_by[account_id] },
         muting:          { account_id => muting[account_id] },
         requested:       { account_id => requested[account_id] },
+        requested_by:    { account_id => requested_by[account_id] },
         domain_blocking: { account_id => domain_blocking[account_id] },
         endorsed:        { account_id => endorsed[account_id] },
         account_note:    { account_id => account_note[account_id] },
diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb
index d23daaf85..d753fa51a 100644
--- a/app/serializers/initial_state_serializer.rb
+++ b/app/serializers/initial_state_serializer.rb
@@ -30,7 +30,7 @@ class InitialStateSerializer < ActiveModel::Serializer
       streaming_api_base_url: Rails.configuration.x.streaming_api_base_url,
       access_token: object.token,
       locale: I18n.locale,
-      domain: instance_presenter.domain,
+      domain: Addressable::IDNA.to_unicode(instance_presenter.domain),
       title: instance_presenter.title,
       admin: object.admin&.id&.to_s,
       search_enabled: Chewy.enabled?,
diff --git a/app/serializers/rest/preferences_serializer.rb b/app/serializers/rest/preferences_serializer.rb
index 874bd990d..e1c654460 100644
--- a/app/serializers/rest/preferences_serializer.rb
+++ b/app/serializers/rest/preferences_serializer.rb
@@ -7,6 +7,7 @@ class REST::PreferencesSerializer < ActiveModel::Serializer
 
   attribute :reading_default_sensitive_media, key: 'reading:expand:media'
   attribute :reading_default_sensitive_text, key: 'reading:expand:spoilers'
+  attribute :reading_autoplay_gifs, key: 'reading:autoplay:gifs'
 
   def posting_default_privacy
     object.user.setting_default_privacy
@@ -27,4 +28,8 @@ class REST::PreferencesSerializer < ActiveModel::Serializer
   def reading_default_sensitive_text
     object.user.setting_expand_spoilers
   end
+
+  def reading_autoplay_gifs
+    object.user.setting_auto_play_gif
+  end
 end
diff --git a/app/serializers/rest/relationship_serializer.rb b/app/serializers/rest/relationship_serializer.rb
index 31fc60eb2..b53387401 100644
--- a/app/serializers/rest/relationship_serializer.rb
+++ b/app/serializers/rest/relationship_serializer.rb
@@ -2,8 +2,8 @@
 
 class REST::RelationshipSerializer < ActiveModel::Serializer
   attributes :id, :following, :showing_reblogs, :notifying, :languages, :followed_by,
-             :blocking, :blocked_by, :muting, :muting_notifications, :requested,
-             :domain_blocking, :endorsed, :note
+             :blocking, :blocked_by, :muting, :muting_notifications,
+             :requested, :requested_by, :domain_blocking, :endorsed, :note
 
   def id
     object.id.to_s
@@ -54,6 +54,10 @@ class REST::RelationshipSerializer < ActiveModel::Serializer
     instance_options[:relationships].requested[object.id] ? true : false
   end
 
+  def requested_by
+    instance_options[:relationships].requested_by[object.id] ? true : false
+  end
+
   def domain_blocking
     instance_options[:relationships].domain_blocking[object.id] || false
   end
diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb
index fad19f87f..11b38ab92 100644
--- a/app/services/activitypub/process_status_update_service.rb
+++ b/app/services/activitypub/process_status_update_service.rb
@@ -45,6 +45,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
         create_edits!
       end
 
+      download_media_files!
       queue_poll_notifications!
 
       next unless significant_changes?
@@ -66,12 +67,12 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
   def update_media_attachments!
     previous_media_attachments     = @status.media_attachments.to_a
     previous_media_attachments_ids = @status.ordered_media_attachment_ids || previous_media_attachments.map(&:id)
-    next_media_attachments         = []
+    @next_media_attachments        = []
 
     as_array(@json['attachment']).each do |attachment|
       media_attachment_parser = ActivityPub::Parser::MediaAttachmentParser.new(attachment)
 
-      next if media_attachment_parser.remote_url.blank? || next_media_attachments.size > 4
+      next if media_attachment_parser.remote_url.blank? || @next_media_attachments.size > 4
 
       begin
         media_attachment   = previous_media_attachments.find { |previous_media_attachment| previous_media_attachment.remote_url == media_attachment_parser.remote_url }
@@ -87,34 +88,39 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
         media_attachment.focus                = media_attachment_parser.focus
         media_attachment.thumbnail_remote_url = media_attachment_parser.thumbnail_remote_url
         media_attachment.blurhash             = media_attachment_parser.blurhash
+        media_attachment.status_id            = @status.id
+        media_attachment.skip_download        = unsupported_media_type?(media_attachment_parser.file_content_type) || skip_download?
         media_attachment.save!
 
-        next_media_attachments << media_attachment
-
-        next if unsupported_media_type?(media_attachment_parser.file_content_type) || skip_download?
-
-        begin
-          media_attachment.download_file! if media_attachment.remote_url_previously_changed?
-          media_attachment.download_thumbnail! if media_attachment.thumbnail_remote_url_previously_changed?
-          media_attachment.save
-        rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError
-          RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id)
-        end
+        @next_media_attachments << media_attachment
       rescue Addressable::URI::InvalidURIError => e
         Rails.logger.debug "Invalid URL in attachment: #{e}"
       end
     end
 
-    added_media_attachments = next_media_attachments - previous_media_attachments
+    added_media_attachments = @next_media_attachments - previous_media_attachments
 
-    MediaAttachment.where(id: added_media_attachments.map(&:id)).update_all(status_id: @status.id)
-
-    @status.ordered_media_attachment_ids = next_media_attachments.map(&:id)
-    @status.media_attachments.reload
+    @status.ordered_media_attachment_ids = @next_media_attachments.map(&:id)
 
     @media_attachments_changed = true if @status.ordered_media_attachment_ids != previous_media_attachments_ids
   end
 
+  def download_media_files!
+    @next_media_attachments.each do |media_attachment|
+      next if media_attachment.skip_download
+
+      media_attachment.download_file! if media_attachment.remote_url_previously_changed?
+      media_attachment.download_thumbnail! if media_attachment.thumbnail_remote_url_previously_changed?
+      media_attachment.save
+    rescue Mastodon::UnexpectedResponseError, HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError
+      RedownloadMediaWorker.perform_in(rand(30..600).seconds, media_attachment.id)
+    rescue Seahorse::Client::NetworkingError => e
+      Rails.logger.warn "Error storing media attachment: #{e}"
+    end
+
+    @status.media_attachments.reload
+  end
+
   def update_poll!(allow_significant_changes: true)
     previous_poll        = @status.preloadable_poll
     @previous_expires_at = previous_poll&.expires_at
diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb
index 2b649ee22..e2c370057 100644
--- a/app/services/batched_remove_status_service.rb
+++ b/app/services/batched_remove_status_service.rb
@@ -20,7 +20,7 @@ class BatchedRemoveStatusService < BaseService
     ActiveRecord::Associations::Preloader.new.preload(statuses_with_account_conversations, [mentions: :account])
 
     statuses_with_account_conversations.each do |status|
-      status.send(:unlink_from_conversations)
+      status.unlink_from_conversations!
       unpush_from_direct_timelines(status)
     end
 
diff --git a/app/services/fetch_oembed_service.rb b/app/services/fetch_oembed_service.rb
index 4cbaa04c6..7d0879c79 100644
--- a/app/services/fetch_oembed_service.rb
+++ b/app/services/fetch_oembed_service.rb
@@ -28,7 +28,7 @@ class FetchOEmbedService
     page    = Nokogiri::HTML(html)
 
     if @format.nil? || @format == :json
-      @endpoint_url ||= page.at_xpath('//link[@type="application/json+oembed"]')&.attribute('href')&.value
+      @endpoint_url ||= page.at_xpath('//link[@type="application/json+oembed"]|//link[@type="text/json+oembed"]')&.attribute('href')&.value
       @format       ||= :json if @endpoint_url
     end
 
@@ -100,7 +100,7 @@ class FetchOEmbedService
   end
 
   def validate(oembed)
-    oembed if oembed[:version] == '1.0' && oembed[:type].present?
+    oembed if oembed[:version].to_s == '1.0' && oembed[:type].present?
   end
 
   def html
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index 36592a531..bcda001f5 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -37,12 +37,15 @@ class PostStatusService < BaseService
       schedule_status!
     else
       process_status!
-      postprocess_status!
-      bump_potential_friendship!
     end
 
     redis.setex(idempotency_key, 3_600, @status.id) if idempotency_given?
 
+    unless scheduled?
+      postprocess_status!
+      bump_potential_friendship!
+    end
+
     @status
   end
 
@@ -75,9 +78,6 @@ class PostStatusService < BaseService
     ApplicationRecord.transaction do
       @status = @account.statuses.create!(status_attributes)
     end
-
-    process_hashtags_service.call(@status)
-    process_mentions_service.call(@status)
   end
 
   def schedule_status!
@@ -101,6 +101,8 @@ class PostStatusService < BaseService
   end
 
   def postprocess_status!
+    process_hashtags_service.call(@status)
+    process_mentions_service.call(@status)
     Trends.tags.register(@status)
     LinkCrawlWorker.perform_async(@status.id)
     DistributionWorker.perform_async(@status.id)
diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb
index b8dc8d5e0..211544fea 100644
--- a/app/services/suspend_account_service.rb
+++ b/app/services/suspend_account_service.rb
@@ -3,10 +3,13 @@
 class SuspendAccountService < BaseService
   include Payloadable
 
+  # Carry out the suspension of a recently-suspended account
+  # @param [Account] account Account to suspend
   def call(account)
+    return unless account.suspended?
+
     @account = account
 
-    suspend!
     reject_remote_follows!
     distribute_update_actor!
     unmerge_from_home_timelines!
@@ -16,10 +19,6 @@ class SuspendAccountService < BaseService
 
   private
 
-  def suspend!
-    @account.suspend! unless @account.suspended?
-  end
-
   def reject_remote_follows!
     return if @account.local? || !@account.activitypub?
 
@@ -76,10 +75,15 @@ class SuspendAccountService < BaseService
         styles.each do |style|
           case Paperclip::Attachment.default_options[:storage]
           when :s3
+            # Prevent useless S3 calls if ACLs are disabled
+            next if ENV['S3_PERMISSION'] == ''
+
             begin
               attachment.s3_object(style).acl.put(acl: 'private')
             rescue Aws::S3::Errors::NoSuchKey
               Rails.logger.warn "Tried to change acl on non-existent key #{attachment.s3_object(style).key}"
+            rescue Aws::S3::Errors::NotImplemented => e
+              Rails.logger.error "Error trying to change ACL on #{attachment.s3_object(style).key}: #{e.message}"
             end
           when :fog
             # Not supported
diff --git a/app/services/tag_search_service.rb b/app/services/tag_search_service.rb
index b78d65625..b66ccced9 100644
--- a/app/services/tag_search_service.rb
+++ b/app/services/tag_search_service.rb
@@ -76,11 +76,27 @@ class TagSearchService < BaseService
     definition = TagsIndex.query(query)
     definition = definition.filter(filter) if @options[:exclude_unreviewed]
 
-    definition.limit(@limit).offset(@offset).objects.compact
+    ensure_exact_match(definition.limit(@limit).offset(@offset).objects.compact)
   rescue Faraday::ConnectionFailed, Parslet::ParseFailed
     nil
   end
 
+  # Since the ElasticSearch Query doesn't guarantee the exact match will be the
+  # first result or that it will even be returned, patch the results accordingly
+  def ensure_exact_match(results)
+    return results unless @offset.nil? || @offset.zero?
+
+    normalized_query = Tag.normalize(@query)
+    exact_match = results.find { |tag| tag.name.downcase == normalized_query }
+    exact_match ||= Tag.find_normalized(normalized_query)
+    unless exact_match.nil?
+      results.delete(exact_match)
+      results = [exact_match] + results
+    end
+
+    results
+  end
+
   def from_database
     Tag.search_for(@query, @limit, @offset, @options)
   end
diff --git a/app/services/unsuspend_account_service.rb b/app/services/unsuspend_account_service.rb
index 39d8a6ba7..70667308e 100644
--- a/app/services/unsuspend_account_service.rb
+++ b/app/services/unsuspend_account_service.rb
@@ -2,10 +2,12 @@
 
 class UnsuspendAccountService < BaseService
   include Payloadable
+
+  # Restores a recently-unsuspended account
+  # @param [Account] account Account to restore
   def call(account)
     @account = account
 
-    unsuspend!
     refresh_remote_account!
 
     return if @account.nil? || @account.suspended?
@@ -18,10 +20,6 @@ class UnsuspendAccountService < BaseService
 
   private
 
-  def unsuspend!
-    @account.unsuspend! if @account.suspended?
-  end
-
   def refresh_remote_account!
     return if @account.local?
 
@@ -73,10 +71,15 @@ class UnsuspendAccountService < BaseService
         styles.each do |style|
           case Paperclip::Attachment.default_options[:storage]
           when :s3
+            # Prevent useless S3 calls if ACLs are disabled
+            next if ENV['S3_PERMISSION'] == ''
+
             begin
               attachment.s3_object(style).acl.put(acl: Paperclip::Attachment.default_options[:s3_permissions])
             rescue Aws::S3::Errors::NoSuchKey
               Rails.logger.warn "Tried to change acl on non-existent key #{attachment.s3_object(style).key}"
+            rescue Aws::S3::Errors::NotImplemented => e
+              Rails.logger.error "Error trying to change ACL on #{attachment.s3_object(style).key}: #{e.message}"
             end
           when :fog
             # Not supported
diff --git a/app/services/verify_link_service.rb b/app/services/verify_link_service.rb
index 7496fe2d5..d049b52d1 100644
--- a/app/services/verify_link_service.rb
+++ b/app/services/verify_link_service.rb
@@ -26,7 +26,7 @@ class VerifyLinkService < BaseService
   def link_back_present?
     return false if @body.blank?
 
-    links = Nokogiri::HTML(@body).xpath('//a[contains(concat(" ", normalize-space(@rel), " "), " me ")]|//link[contains(concat(" ", normalize-space(@rel), " "), " me ")]')
+    links = Nokogiri::HTML5(@body).xpath('//a[contains(concat(" ", normalize-space(@rel), " "), " me ")]|//link[contains(concat(" ", normalize-space(@rel), " "), " me ")]')
 
     if links.any? { |link| link['href']&.downcase == @link_back.downcase }
       true
diff --git a/app/validators/url_validator.rb b/app/validators/url_validator.rb
index 75d1edb87..a90fb6958 100644
--- a/app/validators/url_validator.rb
+++ b/app/validators/url_validator.rb
@@ -10,5 +10,7 @@ class URLValidator < ActiveModel::EachValidator
   def compliant?(url)
     parsed_url = Addressable::URI.parse(url)
     parsed_url && %w(http https).include?(parsed_url.scheme) && parsed_url.host
+  rescue Addressable::URI::InvalidURIError
+    false
   end
 end
diff --git a/app/views/admin/accounts/index.html.haml b/app/views/admin/accounts/index.html.haml
index 9571f27b4..63a88ded2 100644
--- a/app/views/admin/accounts/index.html.haml
+++ b/app/views/admin/accounts/index.html.haml
@@ -10,7 +10,7 @@
     .filter-subset.filter-subset--with-select
       %strong= t('admin.accounts.moderation.title')
       .input.select.optional
-        = select_tag :status, options_for_select([[t('admin.accounts.moderation.active'), 'active'], [t('admin.accounts.moderation.silenced'), 'silenced'], [t('admin.accounts.moderation.suspended'), 'suspended'], [safe_join([t('admin.accounts.moderation.pending'), "(#{number_with_delimiter(User.pending.count)})"], ' '), 'pending']], params[:status]), prompt: I18n.t('generic.all')
+        = select_tag :status, options_for_select([[t('admin.accounts.moderation.active'), 'active'], [t('admin.accounts.moderation.silenced'), 'silenced'], [t('admin.accounts.moderation.disabled'), 'disabled'], [t('admin.accounts.moderation.suspended'), 'suspended'], [safe_join([t('admin.accounts.moderation.pending'), "(#{number_with_delimiter(User.pending.count)})"], ' '), 'pending']], params[:status]), prompt: I18n.t('generic.all')
     .filter-subset.filter-subset--with-select
       %strong= t('admin.accounts.role')
       .input.select.optional
diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml
index dc3b35956..db5c255c9 100644
--- a/app/views/admin/accounts/show.html.haml
+++ b/app/views/admin/accounts/show.html.haml
@@ -195,9 +195,13 @@
   - if @account.suspended?
     %hr.spacer/
 
-    %p.muted-hint= @deletion_request.present? ? t('admin.accounts.suspension_reversible_hint_html', date: content_tag(:strong, l(@deletion_request.due_at.to_date))) : t('admin.accounts.suspension_irreversible')
+    - if @account.suspension_origin_remote?
+      %p.muted-hint= @deletion_request.present? ? t('admin.accounts.remote_suspension_reversible_hint_html', date: content_tag(:strong, l(@deletion_request.due_at.to_date))) : t('admin.accounts.remote_suspension_irreversible')
+    - else
+      %p.muted-hint= @deletion_request.present? ? t('admin.accounts.suspension_reversible_hint_html', date: content_tag(:strong, l(@deletion_request.due_at.to_date))) : t('admin.accounts.suspension_irreversible')
 
     = link_to t('admin.accounts.undo_suspension'), unsuspend_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unsuspend, @account)
+    = link_to t('admin.accounts.redownload'), redownload_admin_account_path(@account.id), method: :post, class: 'button' if can?(:redownload, @account) && @account.suspension_origin_remote?
 
     - if @deletion_request.present?
       = link_to t('admin.accounts.delete'), admin_account_path(@account.id), method: :delete, class: 'button button--destructive', data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, @account)
diff --git a/app/views/admin/report_notes/_report_note.html.haml b/app/views/admin/report_notes/_report_note.html.haml
index 3bccd3b4b..54c252ee8 100644
--- a/app/views/admin/report_notes/_report_note.html.haml
+++ b/app/views/admin/report_notes/_report_note.html.haml
@@ -4,11 +4,8 @@
   .report-notes__item__header
     %span.username
       = link_to report_note.account.username, admin_account_path(report_note.account_id)
-    %time{ datetime: report_note.created_at.iso8601, title: l(report_note.created_at) }
-      - if report_note.created_at.today?
-        = t('admin.report_notes.today_at', time: l(report_note.created_at, format: :time))
-      - else
-        = l report_note.created_at.to_date
+    %time.relative-formatted{ datetime: report_note.created_at.iso8601 }
+      = l report_note.created_at.to_date
 
   .report-notes__item__content
     = simple_format(h(report_note.content))
diff --git a/app/views/admin/reports/_actions.html.haml b/app/views/admin/reports/_actions.html.haml
index 404d53a77..486eb486c 100644
--- a/app/views/admin/reports/_actions.html.haml
+++ b/app/views/admin/reports/_actions.html.haml
@@ -5,7 +5,7 @@
         = link_to t('admin.reports.mark_as_resolved'), resolve_admin_report_path(@report), method: :post, class: 'button'
       .report-actions__item__description
         = t('admin.reports.actions.resolve_description_html')
-    - if @statuses.any? { |status| status.with_media? || status.with_preview_card? }
+    - if @statuses.any? { |status| (status.with_media? || status.with_preview_card?) && !status.discarded? }
       .report-actions__item
         .report-actions__item__button
           = button_tag t('admin.reports.mark_as_sensitive'), name: :mark_as_sensitive, class: 'button'
diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml
index e5ea56779..9d1c561d7 100644
--- a/app/views/admin/reports/show.html.haml
+++ b/app/views/admin/reports/show.html.haml
@@ -140,11 +140,8 @@
             = link_to @report.account.username, admin_account_path(@report.account_id)
           - else
             = link_to @report.account.domain, admin_instance_path(@report.account.domain)
-        %time{ datetime: @report.created_at.iso8601, title: l(@report.created_at) }
-          - if @report.created_at.today?
-            = t('admin.report_notes.today_at', time: l(@report.created_at, format: :time))
-          - else
-            = l @report.created_at.to_date
+        %time.relative-formatted{ datetime: @report.created_at.iso8601 }
+          = l @report.created_at.to_date
 
       .report-notes__item__content
         = simple_format(h(@report.comment))
@@ -180,7 +177,7 @@
 - if @report.unresolved?
   %hr.spacer/
 
-  %p#actions= t 'admin.reports.actions_description_html'
+  %p#actions= t(@report.target_account.local? ? 'admin.reports.actions_description_html' : 'admin.reports.actions_description_remote_html')
 
   = render partial: 'admin/reports/actions'
 
diff --git a/app/views/admin/settings/discovery/show.html.haml b/app/views/admin/settings/discovery/show.html.haml
index 25b34acef..01e3124cf 100644
--- a/app/views/admin/settings/discovery/show.html.haml
+++ b/app/views/admin/settings/discovery/show.html.haml
@@ -29,6 +29,16 @@
   .fields-group
     = f.input :noindex, as: :boolean, wrapper: :with_label, label: t('admin.settings.default_noindex.title'), hint: t('admin.settings.default_noindex.desc_html')
 
+  %h4= t('admin.settings.discovery.publish_statistics')
+
+  .fields-group
+    = f.input :activity_api_enabled, as: :boolean, wrapper: :with_label, recommended: :recommended
+
+  %h4= t('admin.settings.discovery.publish_discovered_servers')
+
+  .fields-group
+    = f.input :peers_api_enabled, as: :boolean, wrapper: :with_label, recommended: :recommended
+
   %h4= t('admin.settings.discovery.follow_recommendations')
 
   .fields-group
diff --git a/app/views/admin/trends/tags/index.html.haml b/app/views/admin/trends/tags/index.html.haml
index ac9bf91db..4730d20c1 100644
--- a/app/views/admin/trends/tags/index.html.haml
+++ b/app/views/admin/trends/tags/index.html.haml
@@ -20,7 +20,7 @@
   - Trends::TagFilter::KEYS.each do |key|
     = hidden_field_tag key, params[key] if params[key].present?
 
-  .batch-table.optional
+  .batch-table
     .batch-table__toolbar
       %label.batch-table__toolbar__select.batch-checkbox-all
         = check_box_tag :batch_checkbox_all, nil, false
diff --git a/app/views/auth/sessions/new.html.haml b/app/views/auth/sessions/new.html.haml
index 304e3ab84..e98c1ff3d 100644
--- a/app/views/auth/sessions/new.html.haml
+++ b/app/views/auth/sessions/new.html.haml
@@ -6,6 +6,8 @@
 
 - unless omniauth_only?
   = simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f|
+    %h1.title= t('auth.sign_in.title', domain: site_hostname)
+    %p.lead= t('auth.sign_in.preamble_html', domain: site_hostname)
     .fields-group
       - if use_seamless_external_login?
         = f.input :email, autofocus: true, wrapper: :with_label, label: t('simple_form.labels.defaults.username_or_email'), input_html: { 'aria-label': t('simple_form.labels.defaults.username_or_email') }, hint: false
diff --git a/app/views/disputes/strikes/show.html.haml b/app/views/disputes/strikes/show.html.haml
index 4a3005f72..7797348dd 100644
--- a/app/views/disputes/strikes/show.html.haml
+++ b/app/views/disputes/strikes/show.html.haml
@@ -110,11 +110,8 @@
       .report-notes__item__header
         %span.username
           = link_to @appeal.account.username, can?(:show, @appeal.account) ? admin_account_path(@appeal.account_id) : short_account_url(@appeal.account)
-        %time{ datetime: @appeal.created_at.iso8601, title: l(@appeal.created_at) }
-          - if @appeal.created_at.today?
-            = t('admin.report_notes.today_at', time: l(@appeal.created_at, format: :time))
-          - else
-            = l @appeal.created_at.to_date
+        %time.relative-formatted{ datetime: @appeal.created_at.iso8601 }
+          = l @appeal.created_at.to_date
 
       .report-notes__item__content
         = simple_format(h(@appeal.text))
diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml
index d02454fc9..1d0840dc1 100644
--- a/app/views/layouts/mailer.html.haml
+++ b/app/views/layouts/mailer.html.haml
@@ -4,8 +4,6 @@
     %meta{ 'http-equiv' => 'Content-Type', 'content' => 'text/html; charset=utf-8' }/
     %meta{ name: 'viewport', content: 'width=device-width, initial-scale=1.0, shrink-to-fit=no' }
 
-    %title/
-
     = stylesheet_pack_tag 'core/mailer'
   %body{ dir: locale_direction }
     %table.email-table{ cellspacing: 0, cellpadding: 0 }
diff --git a/app/views/layouts/modal.html.haml b/app/views/layouts/modal.html.haml
index dee7c63d9..cf608766b 100644
--- a/app/views/layouts/modal.html.haml
+++ b/app/views/layouts/modal.html.haml
@@ -5,7 +5,7 @@
       .name
         = t 'users.signed_in_as'
         %span.username @#{current_account.local_username_and_domain}
-      = link_to destroy_user_session_path(continue: true), method: :delete, class: 'logout-link icon-button' do
+      = link_to destroy_user_session_path(continue: true), method: :delete, class: 'logout-link icon-button', title: t('applications.logout'), 'aria-label': t('applications.logout') do
         = fa_icon 'sign-out'
 
   .container-alt= yield
diff --git a/app/views/relationships/show.html.haml b/app/views/relationships/show.html.haml
index 7ad4e08f6..e1ead6945 100644
--- a/app/views/relationships/show.html.haml
+++ b/app/views/relationships/show.html.haml
@@ -39,11 +39,11 @@
       %label.batch-table__toolbar__select.batch-checkbox-all
         = check_box_tag :batch_checkbox_all, nil, false
       .batch-table__toolbar__actions
-        = f.button safe_join([fa_icon('user-plus'), t('relationships.follow_selected_followers')]), name: :follow, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } if followed_by_relationship? && !mutual_relationship?
+        = f.button safe_join([fa_icon('user-plus'), t('relationships.follow_selected_followers')]), name: :follow, class: 'table-action-link', type: :submit, data: { confirm: t('relationships.confirm_follow_selected_followers') } if followed_by_relationship? && !mutual_relationship?
 
-        = f.button safe_join([fa_icon('user-times'), t('relationships.remove_selected_follows')]), name: :unfollow, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } unless followed_by_relationship?
+        = f.button safe_join([fa_icon('user-times'), t('relationships.remove_selected_follows')]), name: :unfollow, class: 'table-action-link', type: :submit, data: { confirm: t('relationships.confirm_remove_selected_follows') } unless followed_by_relationship?
 
-        = f.button safe_join([fa_icon('trash'), t('relationships.remove_selected_followers')]), name: :remove_from_followers, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } unless following_relationship?
+        = f.button safe_join([fa_icon('trash'), t('relationships.remove_selected_followers')]), name: :remove_from_followers, class: 'table-action-link', type: :submit, data: { confirm: t('relationships.confirm_remove_selected_followers') } unless following_relationship?
 
         = f.button safe_join([fa_icon('trash'), t('relationships.remove_selected_domains')]), name: :block_domains, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } if followed_by_relationship?
     .batch-table__body
diff --git a/app/views/settings/featured_tags/index.html.haml b/app/views/settings/featured_tags/index.html.haml
index 595094fc7..078abd788 100644
--- a/app/views/settings/featured_tags/index.html.haml
+++ b/app/views/settings/featured_tags/index.html.haml
@@ -26,6 +26,6 @@
           - if featured_tag.last_status_at.nil?
             = t('accounts.nothing_here')
           - else
-            %time{ datetime: featured_tag.last_status_at.iso8601, title: l(featured_tag.last_status_at) }= l featured_tag.last_status_at
+            %time.formatted{ datetime: featured_tag.last_status_at.iso8601, title: l(featured_tag.last_status_at) }= l featured_tag.last_status_at
           = table_link_to 'trash', t('filters.index.delete'), settings_featured_tag_path(featured_tag), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') }
       .trends__item__current= friendly_number_to_human featured_tag.statuses_count
diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml
index 0e7266788..0eec44534 100644
--- a/app/views/settings/preferences/appearance/show.html.haml
+++ b/app/views/settings/preferences/appearance/show.html.haml
@@ -11,6 +11,8 @@
   - unless I18n.locale == :en
     .flash-message.translation-prompt
       #{t 'appearance.localization.body'} #{content_tag(:a, t('appearance.localization.guide_link_text'), href: t('appearance.localization.guide_link'), target: "_blank", rel: "noopener")}
+      = link_to t('appearance.localization.glitch_guide_link'), target: '_blank', rel: 'noopener noreferrer' do
+        = t('appearance.localization.glitch_guide_link_text')
 
   %h4= t 'appearance.advanced_web_interface'
 
diff --git a/app/workers/scheduler/suspended_user_cleanup_scheduler.rb b/app/workers/scheduler/suspended_user_cleanup_scheduler.rb
index 50768f83c..87e22161b 100644
--- a/app/workers/scheduler/suspended_user_cleanup_scheduler.rb
+++ b/app/workers/scheduler/suspended_user_cleanup_scheduler.rb
@@ -9,7 +9,7 @@ class Scheduler::SuspendedUserCleanupScheduler
   MAX_PULL_SIZE = 50
 
   # Since account deletion is very expensive, we want to avoid
-  # overloading the server by queing too much at once.
+  # overloading the server by queuing too much at once.
   # This job runs approximately once per 2 minutes, so with a
   # value of `MAX_DELETIONS_PER_JOB` of 10, a server can
   # handle the deletion of 7200 accounts per day, provided it
diff --git a/config/application.rb b/config/application.rb
index 1db6d0900..47988d9d0 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -94,6 +94,7 @@ module Mastodon
       :fa,
       :fi,
       :fr,
+      :fy,
       :ga,
       :gd,
       :gl,
diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml
index 666b3a08b..72f9e4eb7 100644
--- a/config/i18n-tasks.yml
+++ b/config/i18n-tasks.yml
@@ -4,12 +4,19 @@
 base_locale: en
 data:
   read:
-    - config/locales/%{locale}.yml
-    - config/locales/**/*.%{locale}.yml
+    - config/locales-glitch/%{locale}.yml
+    - config/locales-glitch/*.%{locale}.yml
 
   write:
-    - ['{devise, simple_form, doorkeeper}.*', 'config/locales/\1.%{locale}.yml']
+    - [
+        '{devise, simple_form, doorkeeper}.*',
+        'config/locales-glitch/\1.%{locale}.yml',
+      ]
+    - config/locales-glitch/%{locale}.yml
+
+  external:
     - config/locales/%{locale}.yml
+    - config/locales/**/*.%{locale}.yml
 
   yaml:
     write:
@@ -50,7 +57,7 @@ ignore_unused:
   - 'activerecord.errors.*'
   - '{devise,pagination,doorkeeper}.*'
   - '{date,datetime,time,number}.*'
-  - 'simple_form.{yes,no}'
+  - 'simple_form.{yes,no,glitch_only}'
   - 'simple_form.{placeholders,hints,labels}.*'
   - 'simple_form.{error_notification,required}.:'
   - 'errors.messages.*'
diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb
index c55bea7a7..d7b252c3f 100644
--- a/config/initializers/devise.rb
+++ b/config/initializers/devise.rb
@@ -159,7 +159,7 @@ Devise.setup do |config|
   # config.request_keys = []
 
   # Configure which authentication keys should be case-insensitive.
-  # These keys will be downcased upon creating or modifying a user and when used
+  # These keys will be lowercased upon creating or modifying a user and when used
   # to authenticate or find a user. Default is :email.
   config.case_insensitive_keys = [:email]
 
diff --git a/config/locales-glitch/af.yml b/config/locales-glitch/af.yml
new file mode 100644
index 000000000..252f9fd5a
--- /dev/null
+++ b/config/locales-glitch/af.yml
@@ -0,0 +1 @@
+af:
diff --git a/config/locales-glitch/an.yml b/config/locales-glitch/an.yml
new file mode 100644
index 000000000..76cc0689b
--- /dev/null
+++ b/config/locales-glitch/an.yml
@@ -0,0 +1 @@
+an:
diff --git a/config/locales-glitch/ar.yml b/config/locales-glitch/ar.yml
new file mode 100644
index 000000000..c257bc08a
--- /dev/null
+++ b/config/locales-glitch/ar.yml
@@ -0,0 +1 @@
+ar:
diff --git a/config/locales-glitch/ast.yml b/config/locales-glitch/ast.yml
new file mode 100644
index 000000000..d762c9399
--- /dev/null
+++ b/config/locales-glitch/ast.yml
@@ -0,0 +1 @@
+ast:
diff --git a/config/locales-glitch/be.yml b/config/locales-glitch/be.yml
new file mode 100644
index 000000000..91ccc2d7e
--- /dev/null
+++ b/config/locales-glitch/be.yml
@@ -0,0 +1 @@
+be:
diff --git a/config/locales-glitch/bg.yml b/config/locales-glitch/bg.yml
new file mode 100644
index 000000000..d0e375da9
--- /dev/null
+++ b/config/locales-glitch/bg.yml
@@ -0,0 +1 @@
+bg:
diff --git a/config/locales-glitch/bn.yml b/config/locales-glitch/bn.yml
new file mode 100644
index 000000000..152c69829
--- /dev/null
+++ b/config/locales-glitch/bn.yml
@@ -0,0 +1 @@
+bn:
diff --git a/config/locales-glitch/br.yml b/config/locales-glitch/br.yml
new file mode 100644
index 000000000..c7677c850
--- /dev/null
+++ b/config/locales-glitch/br.yml
@@ -0,0 +1 @@
+br:
diff --git a/config/locales-glitch/bs.yml b/config/locales-glitch/bs.yml
new file mode 100644
index 000000000..e9e174462
--- /dev/null
+++ b/config/locales-glitch/bs.yml
@@ -0,0 +1 @@
+bs:
diff --git a/config/locales-glitch/ca.yml b/config/locales-glitch/ca.yml
new file mode 100644
index 000000000..f0c487273
--- /dev/null
+++ b/config/locales-glitch/ca.yml
@@ -0,0 +1 @@
+ca:
diff --git a/config/locales-glitch/ckb.yml b/config/locales-glitch/ckb.yml
new file mode 100644
index 000000000..cc251e86a
--- /dev/null
+++ b/config/locales-glitch/ckb.yml
@@ -0,0 +1 @@
+ckb-IR:
diff --git a/config/locales-glitch/co.yml b/config/locales-glitch/co.yml
new file mode 100644
index 000000000..5330938e0
--- /dev/null
+++ b/config/locales-glitch/co.yml
@@ -0,0 +1 @@
+co:
diff --git a/config/locales-glitch/cs.yml b/config/locales-glitch/cs.yml
index 08c56ef3e..940df937b 100644
--- a/config/locales-glitch/cs.yml
+++ b/config/locales-glitch/cs.yml
@@ -8,20 +8,17 @@ cs:
       captcha_enabled:
         desc_html: Tato funkce používá externí skripty služby hCaptcha, což může být problém z hlediska bezpečí a ochrany dat. Také to může <strong>některým (hlavně postiženým) lidem registrační proces výrazně zkomplikovat</strong>. Z tohoto důvodu prosím raději zvažte jiné možnosti, jako je schvalování registrací nebo registrace pouze pro zvané.<br>Uživatelům pozvaným skrze omezenou pozvánku se CAPTCHA nezobrazí.
         title: Vyžadovat po nových uživatelích opsání textu z obrázku (CAPTCHA)
-      enable_keybase:
-        desc_html: Uživatelé budou moci potvrdit svou identitu pomocí Keybase
-        title: Zapnout potvrzování pomocí Keybase
       flavour_and_skin:
         title: Rozhraní a styl
+      hide_followers_count:
+        desc_html: Nezobrazovat na uživatelských profilech počet sledujících
+        title: Schovat počet sledujících
       other:
         preamble: Různá nastavení glitch-soc, která se nevešla do jiných kategorií.
         title: Jiné
       outgoing_spoilers:
         desc_html: Při federování příspěvků se přidá toto varování o obsahu příspěvkům, které žádné nemají. To může být užitečné, pokud je váš server zaměřen na specifický obsah, pro který by jiné servery mohly varování o obsahu vyžadovat. Připojená média budou označena jako citlivá.
         title: Varování o obsahu pro odesílané příspěvky
-      hide_followers_count:
-        desc_html: Nezobrazovat na uživatelských profilech počet sledujících
-        title: Schovat počet sledujících
       show_reblogs_in_public_timelines:
         desc_html: Veřejné boosty veřejných příspěvků se zobrazí na místní a federované časové ose.
         title: Zobrazovat ve veřejných časových osách boosty
diff --git a/config/locales-glitch/cy.yml b/config/locales-glitch/cy.yml
new file mode 100644
index 000000000..deefc9438
--- /dev/null
+++ b/config/locales-glitch/cy.yml
@@ -0,0 +1 @@
+cy:
diff --git a/config/locales-glitch/da.yml b/config/locales-glitch/da.yml
new file mode 100644
index 000000000..347c94d5e
--- /dev/null
+++ b/config/locales-glitch/da.yml
@@ -0,0 +1 @@
+da:
diff --git a/config/locales-glitch/de.yml b/config/locales-glitch/de.yml
new file mode 100644
index 000000000..a2ea8248c
--- /dev/null
+++ b/config/locales-glitch/de.yml
@@ -0,0 +1,42 @@
+---
+de:
+  admin:
+    custom_emojis:
+      batch_copy_error: 'Fehler ist beim Kopieren einiger der ausgewählten Emoji aufgetreten: %{message}'
+      batch_error: 'Ein Fehler ist aufgetreten: %{message}'
+    settings:
+      captcha_enabled:
+        desc_html: Dies beruht auf externen Skripts von hCaptcha, was Sicherheits- und Datenschutz-Bedenken auslösen kann. Zusätzlich <strong>kann das den Registrierungsprozess für manche (besonders behinderte) Leute signifikant weniger zugänglich machen</strong>. Aus diesen Gründen, bitte ziehe alternative Maßnahmen, wie Zulassungs- oder Einladungs-basierte Registrierung, in Erwägung.<br>Nutzer, die durch eine Einladung mit eingeschränkter Verwendungsanzahl eingeladen wurden, werden kein CAPTCHA lösen müssen
+        title: Neue Benutzer sollen ein CAPTCHA lösen müssen, um ihr Konto zu bestätigen
+      flavour_and_skin:
+        title: Variante und Skin
+      hide_followers_count:
+        desc_html: Follower nicht auf Nutzerprofilen anzeigen
+        title: Anzahl der Follower verbergen
+      other:
+        preamble: Verschiedene glitch-soc-Einstellungen, die nicht in andere Kategorien passen.
+        title: Sonstiges
+      outgoing_spoilers:
+        desc_html: Füge diese Inhaltswarnung bei föderierten Toots hinzu, wenn sie noch keine haben. Nützlich, wenn dein Server auf bestimmte Inhalte spezialisiert ist, die andere Server hinter einer Inhaltswarnung haben wollen. Medien werden auch als empfindlich markiert werden.
+        title: Inhaltswarnung für ausgehende Toots
+      show_reblogs_in_public_timelines:
+        desc_html: Zeige öffentlich geteilte Toots in lokalen und öffentlichen Timelines.
+        title: Zeige geteilte Toots in öffentlichen Timelines
+      show_replies_in_public_timelines:
+        desc_html: Neben öffentlichen Selbst-Antworten (Threads), öffentliche Antworten in lokalen und öffentlichen Timelines anzeigen.
+        title: Antworten in öffentlichen Timelines anzeigen
+      trending_status_cw:
+        desc_html: Erlaube Posts mit Inhaltswarnungen zu trenden, wenn angesagte Beiträge aktiviert sind. Änderungen an dieser Einstellung sind nicht rückwirkend.
+        title: Erlaube Posts mit Inhaltswarnungen zu trenden
+  appearance:
+    localization:
+      glitch_guide_link: https://crowdin.com/project/glitch-soc
+      glitch_guide_link_text: Und auch für glitch-soc!
+  auth:
+    captcha_confirmation:
+      hint_html: Nur noch ein weiterer Schritt! Um dein Konto zu bestätigen, erfordert dieser Server das Lösen eines CAPTCHA von dir. Bei Fragen oder Problemen mit der Bestätigung kannst du <a href="/about/more">den Server-Administrator kontaktieren</a>.
+      title: Benutzer-Verifizierung
+  generic:
+    use_this: Benutze das
+  settings:
+    flavours: Varianten
diff --git a/config/locales-glitch/el.yml b/config/locales-glitch/el.yml
new file mode 100644
index 000000000..419ec705c
--- /dev/null
+++ b/config/locales-glitch/el.yml
@@ -0,0 +1 @@
+el:
diff --git a/config/locales-glitch/en-GB.yml b/config/locales-glitch/en-GB.yml
new file mode 100644
index 000000000..ef03d1810
--- /dev/null
+++ b/config/locales-glitch/en-GB.yml
@@ -0,0 +1 @@
+en-GB:
diff --git a/config/locales-glitch/en.yml b/config/locales-glitch/en.yml
index 23c566153..e60a89e18 100644
--- a/config/locales-glitch/en.yml
+++ b/config/locales-glitch/en.yml
@@ -8,20 +8,17 @@ en:
       captcha_enabled:
         desc_html: This relies on external scripts from hCaptcha, which may be a security and privacy concern. In addition, <strong>this can make the registration process significantly less accessible to some (especially disabled) people</strong>. For these reasons, please consider alternative measures such as approval-based or invite-based registration.<br>Users that have been invited through a limited-use invite will not need to solve a CAPTCHA
         title: Require new users to solve a CAPTCHA to confirm their account
-      enable_keybase:
-        desc_html: Allow your users to prove their identity via keybase
-        title: Enable keybase integration
       flavour_and_skin:
         title: Flavour and skin
+      hide_followers_count:
+        desc_html: Do not show followers count on user profiles
+        title: Hide followers count
       other:
         preamble: Various glitch-soc settings not fitting in other categories.
         title: Other
       outgoing_spoilers:
         desc_html: When federating toots, add this content warning to toots that do not have one. It is useful if your server is specialized in content other servers might want to have under a Content Warning. Media will also be marked as sensitive.
         title: Content warning for outgoing toots
-      hide_followers_count:
-        desc_html: Do not show followers count on user profiles
-        title: Hide followers count
       show_reblogs_in_public_timelines:
         desc_html: Show public boosts of public toots in local and public timelines.
         title: Show boosts in public timelines
@@ -31,6 +28,10 @@ en:
       trending_status_cw:
         desc_html: When trending posts are enabled, allow posts with Content Warnings to be eligible. Changes to this setting are not retroactive.
         title: Allow posts with Content Warnings to trend
+  appearance:
+    localization:
+      glitch_guide_link: https://crowdin.com/project/glitch-soc
+      glitch_guide_link_text: And likewise for glitch-soc!
   auth:
     captcha_confirmation:
       hint_html: Just one more step! To confirm your account, this server requires you to solve a CAPTCHA. You can <a href="/about/more">contact the server administrator</a> if you have questions or need assistance with confirming your account.
diff --git a/config/locales-glitch/eo.yml b/config/locales-glitch/eo.yml
new file mode 100644
index 000000000..759981404
--- /dev/null
+++ b/config/locales-glitch/eo.yml
@@ -0,0 +1 @@
+eo:
diff --git a/config/locales-glitch/es-AR.yml b/config/locales-glitch/es-AR.yml
new file mode 100644
index 000000000..fd38e165e
--- /dev/null
+++ b/config/locales-glitch/es-AR.yml
@@ -0,0 +1,20 @@
+---
+es-AR:
+  admin:
+    settings:
+      hide_followers_count:
+        desc_html: No mostrar el conteo de seguidorxs en perfiles de usuarix
+        title: Ocultar conteo de seguidorxs
+      outgoing_spoilers:
+        desc_html: Cuando los toots federen, agrega esta etiqueta de contenido a los toots que no tengan. Es útil si tu servidor se especializa en contenido que otros servidores desearían tener con una advertencia de contenido. Los medios también se marcarán como sensibles.
+        title: Advertencia de contenido para los toots salientes
+      show_reblogs_in_public_timelines:
+        desc_html: Mostrar retoots públicos en las línea de tiempo local y pública.
+        title: Mostrar retoots en líneas de tiempo públicas
+      show_replies_in_public_timelines:
+        desc_html: Además de auto-respuestas públicas (hilos), mostrar respuestas públicas en las línea de tiempo local y pública.
+        title: Mostrar respuestas en líneas de tiempo públicas
+  generic:
+    use_this: Usar
+  settings:
+    flavours: Ediciones
diff --git a/config/locales-glitch/es-MX.yml b/config/locales-glitch/es-MX.yml
new file mode 100644
index 000000000..48e24be76
--- /dev/null
+++ b/config/locales-glitch/es-MX.yml
@@ -0,0 +1,20 @@
+---
+es-MX:
+  admin:
+    settings:
+      hide_followers_count:
+        desc_html: No mostrar el conteo de seguidorxs en perfiles de usuarix
+        title: Ocultar conteo de seguidorxs
+      outgoing_spoilers:
+        desc_html: Cuando los toots federen, agrega esta etiqueta de contenido a los toots que no tengan. Es útil si tu servidor se especializa en contenido que otros servidores desearían tener con una advertencia de contenido. Los medios también se marcarán como sensibles.
+        title: Advertencia de contenido para los toots salientes
+      show_reblogs_in_public_timelines:
+        desc_html: Mostrar retoots públicos en las línea de tiempo local y pública.
+        title: Mostrar retoots en líneas de tiempo públicas
+      show_replies_in_public_timelines:
+        desc_html: Además de auto-respuestas públicas (hilos), mostrar respuestas públicas en las línea de tiempo local y pública.
+        title: Mostrar respuestas en líneas de tiempo públicas
+  generic:
+    use_this: Usar
+  settings:
+    flavours: Ediciones
diff --git a/config/locales-glitch/es.yml b/config/locales-glitch/es.yml
index ad942a0c0..d842deb67 100644
--- a/config/locales-glitch/es.yml
+++ b/config/locales-glitch/es.yml
@@ -2,15 +2,12 @@
 es:
   admin:
     settings:
-      enable_keybase:
-        desc_html: Permite a tus usuarixs comprobar su identidad por medio de keybase
-        title: Habilitar la integración con keybase
-      outgoing_spoilers:
-        desc_html: Cuando los toots federen, agrega esta etiqueta de contenido a los toots que no tengan. Es útil si tu servidor se especializa en contenido que otros servidores desearían tener con una advertencia de contenido. Los medios también se marcarán como sensibles.
-        title: Advertencia de contenido para los toots salientes
       hide_followers_count:
         desc_html: No mostrar el conteo de seguidorxs en perfiles de usuarix
         title: Ocultar conteo de seguidorxs
+      outgoing_spoilers:
+        desc_html: Cuando los toots federen, agrega esta etiqueta de contenido a los toots que no tengan. Es útil si tu servidor se especializa en contenido que otros servidores desearían tener con una advertencia de contenido. Los medios también se marcarán como sensibles.
+        title: Advertencia de contenido para los toots salientes
       show_reblogs_in_public_timelines:
         desc_html: Mostrar retoots públicos en las línea de tiempo local y pública.
         title: Mostrar retoots en líneas de tiempo públicas
diff --git a/config/locales-glitch/et.yml b/config/locales-glitch/et.yml
new file mode 100644
index 000000000..e020c4ffc
--- /dev/null
+++ b/config/locales-glitch/et.yml
@@ -0,0 +1 @@
+et:
diff --git a/config/locales-glitch/eu.yml b/config/locales-glitch/eu.yml
new file mode 100644
index 000000000..566e176fc
--- /dev/null
+++ b/config/locales-glitch/eu.yml
@@ -0,0 +1 @@
+eu:
diff --git a/config/locales-glitch/fa.yml b/config/locales-glitch/fa.yml
new file mode 100644
index 000000000..88215f82c
--- /dev/null
+++ b/config/locales-glitch/fa.yml
@@ -0,0 +1 @@
+fa:
diff --git a/config/locales-glitch/fi.yml b/config/locales-glitch/fi.yml
new file mode 100644
index 000000000..23c538b19
--- /dev/null
+++ b/config/locales-glitch/fi.yml
@@ -0,0 +1 @@
+fi:
diff --git a/config/locales-glitch/fo.yml b/config/locales-glitch/fo.yml
new file mode 100644
index 000000000..69f792cca
--- /dev/null
+++ b/config/locales-glitch/fo.yml
@@ -0,0 +1 @@
+fo:
diff --git a/config/locales-glitch/fr-QC.yml b/config/locales-glitch/fr-QC.yml
new file mode 100644
index 000000000..6fa399b65
--- /dev/null
+++ b/config/locales-glitch/fr-QC.yml
@@ -0,0 +1,42 @@
+---
+fr-QC:
+  admin:
+    custom_emojis:
+      batch_copy_error: 'Une erreur est survenue lors de la copie de certains des émojis sélectionnés : %{message}'
+      batch_error: 'Une erreur est survenue : %{message}'
+    settings:
+      captcha_enabled:
+        desc_html: Ceci se base sur des scripts externes venant de hCaptcha, ce qui peut engendrer des soucis de sécurité et de confidentialité. De plus, <strong>cela peut rendre l'inscription beaucoup moins accessible pour certaines personnes (comme les personnes handicapées)</strong>. Pour ces raisons, veuillez préférer des mesures alternatives telles que l'inscription sur acceptation ou invitation. <br>Les utilisateurs qui ont été invités via une invitation à usage limité n'auront pas à résoudre un CAPTCHA
+        title: Obliger les nouveaux utilisateurs à résoudre un CAPTCHA pour vérifier leur compte
+      flavour_and_skin:
+        title: Apparence et thèmes
+      hide_followers_count:
+        desc_html: Ne pas afficher le nombre d'abonné·e·s sur les profils des utilisateurs
+        title: Cacher le nombre d'abonné·e·s
+      other:
+        preamble: Divers autres paramètres de glitch-soc.
+        title: Autres
+      outgoing_spoilers:
+        desc_html: Ajouter un avertissement de contenu à tous les messages lorsqu'ils sont fédérés s'ils n'en possèdent pas déjà. Cela peut être utile si votre serveur est spécialisé dans un type de contenu sur lequel les autres serveurs pourraient vouloir un Avertissement de Contenu. Les médias seront également marqués comme sensibles.
+        title: Avertissement de contenu pour les messages sortants
+      show_reblogs_in_public_timelines:
+        desc_html: Afficher les partages publics de posts publics dans le fil local et global.
+        title: Afficher les partages dans les fils publics
+      show_replies_in_public_timelines:
+        desc_html: En plus des réponses à soi-même (threads), afficher les réponses publiques dans le fil local et global.
+        title: Afficher les réponses dans les fils publics
+      trending_status_cw:
+        desc_html: Quand les posts en tendance sont activés, permettre aux posts avec des avertissements de contenu (CW) d'être éligibles. Les changements effectués sur ce paramètre ne sont pas rétroactifs.
+        title: Autoriser les posts avec des avertissements de contenu à être en tendances
+  appearance:
+    localization:
+      glitch_guide_link: https://fr.crowdin.com/project/glitch-soc
+      glitch_guide_link_text: Et c'est pareil avec glitch-soc !
+  auth:
+    captcha_confirmation:
+      hint_html: Plus qu'une étape ! Pour vérifier votre compte sur ce serveur, vous devez résoudre un CAPTCHA. Vous pouvez <a href="/about/more>contacter l'administrateur du serveur</a> si vous avez des questions ou besoin d'assistance dans la vérification de votre compte.
+      title: Vérification de l'utilisateur
+  generic:
+    use_this: Utiliser ceci
+  settings:
+    flavours: Thèmes
diff --git a/config/locales-glitch/fr.yml b/config/locales-glitch/fr.yml
new file mode 100644
index 000000000..44e032e66
--- /dev/null
+++ b/config/locales-glitch/fr.yml
@@ -0,0 +1,42 @@
+---
+fr:
+  admin:
+    custom_emojis:
+      batch_copy_error: 'Une erreur est survenue lors de la copie de certains des émojis sélectionnés : %{message}'
+      batch_error: 'Une erreur est survenue : %{message}'
+    settings:
+      captcha_enabled:
+        desc_html: Ceci se base sur des scripts externes venant de hCaptcha, ce qui peut engendrer des soucis de sécurité et de confidentialité. De plus, <strong>cela peut rendre l'inscription beaucoup moins accessible pour certaines personnes (comme les personnes handicapées)</strong>. Pour ces raisons, veuillez préférer des mesures alternatives telles que l'inscription sur acceptation ou invitation. <br>Les utilisateurs qui ont été invités via une invitation à usage limité n'auront pas à résoudre un CAPTCHA
+        title: Obliger les nouveaux utilisateurs à résoudre un CAPTCHA pour vérifier leur compte
+      flavour_and_skin:
+        title: Apparence et thèmes
+      hide_followers_count:
+        desc_html: Ne pas afficher le nombre d'abonné·e·s sur les profils des utilisateurs
+        title: Cacher le nombre d'abonné·e·s
+      other:
+        preamble: Divers autres paramètres de glitch-soc.
+        title: Autres
+      outgoing_spoilers:
+        desc_html: Ajouter un avertissement de contenu à tous les messages lorsqu'ils sont fédérés s'ils n'en possèdent pas déjà. Cela peut être utile si votre serveur est spécialisé dans un type de contenu sur lequel les autres serveurs pourraient vouloir un Avertissement de Contenu. Les médias seront également marqués comme sensibles.
+        title: Avertissement de contenu pour les messages sortants
+      show_reblogs_in_public_timelines:
+        desc_html: Afficher les partages publics de posts publics dans le fil local et global.
+        title: Afficher les partages dans les fils publics
+      show_replies_in_public_timelines:
+        desc_html: En plus des réponses à soi-même (threads), afficher les réponses publiques dans le fil local et global.
+        title: Afficher les réponses dans les fils publics
+      trending_status_cw:
+        desc_html: Quand les posts en tendance sont activés, permettre aux posts avec des avertissements de contenu (CW) d'être éligibles. Les changements effectués sur ce paramètre ne sont pas rétroactifs.
+        title: Autoriser les posts avec des avertissements de contenu à être en tendances
+  appearance:
+    localization:
+      glitch_guide_link: https://fr.crowdin.com/project/glitch-soc
+      glitch_guide_link_text: Et c'est pareil avec glitch-soc !
+  auth:
+    captcha_confirmation:
+      hint_html: Plus qu'une étape ! Pour vérifier votre compte sur ce serveur, vous devez résoudre un CAPTCHA. Vous pouvez <a href="/about/more>contacter l'administrateur du serveur</a> si vous avez des questions ou besoin d'assistance dans la vérification de votre compte.
+      title: Vérification de l'utilisateur
+  generic:
+    use_this: Utiliser ceci
+  settings:
+    flavours: Thèmes
diff --git a/config/locales-glitch/fy.yml b/config/locales-glitch/fy.yml
new file mode 100644
index 000000000..c05849f20
--- /dev/null
+++ b/config/locales-glitch/fy.yml
@@ -0,0 +1 @@
+fy:
diff --git a/config/locales-glitch/ga.yml b/config/locales-glitch/ga.yml
new file mode 100644
index 000000000..20a9da24e
--- /dev/null
+++ b/config/locales-glitch/ga.yml
@@ -0,0 +1 @@
+ga:
diff --git a/config/locales-glitch/gd.yml b/config/locales-glitch/gd.yml
new file mode 100644
index 000000000..1912f6c6a
--- /dev/null
+++ b/config/locales-glitch/gd.yml
@@ -0,0 +1 @@
+gd:
diff --git a/config/locales-glitch/gl.yml b/config/locales-glitch/gl.yml
new file mode 100644
index 000000000..8ec5fc81c
--- /dev/null
+++ b/config/locales-glitch/gl.yml
@@ -0,0 +1 @@
+gl:
diff --git a/config/locales-glitch/he.yml b/config/locales-glitch/he.yml
new file mode 100644
index 000000000..af6fa60a7
--- /dev/null
+++ b/config/locales-glitch/he.yml
@@ -0,0 +1 @@
+he:
diff --git a/config/locales-glitch/hi.yml b/config/locales-glitch/hi.yml
new file mode 100644
index 000000000..d758a5b53
--- /dev/null
+++ b/config/locales-glitch/hi.yml
@@ -0,0 +1 @@
+hi:
diff --git a/config/locales-glitch/hr.yml b/config/locales-glitch/hr.yml
new file mode 100644
index 000000000..f67f33c7e
--- /dev/null
+++ b/config/locales-glitch/hr.yml
@@ -0,0 +1 @@
+hr:
diff --git a/config/locales-glitch/hu.yml b/config/locales-glitch/hu.yml
new file mode 100644
index 000000000..52314c50c
--- /dev/null
+++ b/config/locales-glitch/hu.yml
@@ -0,0 +1 @@
+hu:
diff --git a/config/locales-glitch/hy.yml b/config/locales-glitch/hy.yml
new file mode 100644
index 000000000..c40654016
--- /dev/null
+++ b/config/locales-glitch/hy.yml
@@ -0,0 +1 @@
+hy:
diff --git a/config/locales-glitch/id.yml b/config/locales-glitch/id.yml
new file mode 100644
index 000000000..8446cbad9
--- /dev/null
+++ b/config/locales-glitch/id.yml
@@ -0,0 +1 @@
+id:
diff --git a/config/locales-glitch/ig.yml b/config/locales-glitch/ig.yml
new file mode 100644
index 000000000..7c264f0d7
--- /dev/null
+++ b/config/locales-glitch/ig.yml
@@ -0,0 +1 @@
+ig:
diff --git a/config/locales-glitch/io.yml b/config/locales-glitch/io.yml
new file mode 100644
index 000000000..c63dc0e8d
--- /dev/null
+++ b/config/locales-glitch/io.yml
@@ -0,0 +1 @@
+io:
diff --git a/config/locales-glitch/is.yml b/config/locales-glitch/is.yml
new file mode 100644
index 000000000..337c106df
--- /dev/null
+++ b/config/locales-glitch/is.yml
@@ -0,0 +1 @@
+is:
diff --git a/config/locales-glitch/it.yml b/config/locales-glitch/it.yml
new file mode 100644
index 000000000..85830635a
--- /dev/null
+++ b/config/locales-glitch/it.yml
@@ -0,0 +1 @@
+it:
diff --git a/config/locales-glitch/ja.yml b/config/locales-glitch/ja.yml
index 3ecb46ccd..54ebfaeca 100644
--- a/config/locales-glitch/ja.yml
+++ b/config/locales-glitch/ja.yml
@@ -2,15 +2,12 @@
 ja:
   admin:
     settings:
-      enable_keybase:
-        desc_html: Keybaseにより身元の証明が可能となります
-        title: Keybase統合を有効にする
-      outgoing_spoilers:
-        desc_html: トゥートが連合される際、閲覧注意としてマークされていないトゥートにこの警告が追加されます。これはあなたのインスタンスが他のインスタンスに警告をして欲しいとされる投稿に特化している場合に便利です。 メディアは閲覧注意にマークされます。
-        title: 発信するトゥートへの警告
       hide_followers_count:
         desc_html: プロフィールページのフォロワー数を見られないようにします
         title: フォロワー数を隠す
+      outgoing_spoilers:
+        desc_html: トゥートが連合される際、閲覧注意としてマークされていないトゥートにこの警告が追加されます。これはあなたのインスタンスが他のインスタンスに警告をして欲しいとされる投稿に特化している場合に便利です。 メディアは閲覧注意にマークされます。
+        title: 発信するトゥートへの警告
       show_reblogs_in_public_timelines:
         desc_html: ローカルタイムラインと連合タイムラインに公開投稿のブーストを表示します
         title: 公開タイムラインにブーストを表示
diff --git a/config/locales-glitch/ka.yml b/config/locales-glitch/ka.yml
new file mode 100644
index 000000000..57a95cb04
--- /dev/null
+++ b/config/locales-glitch/ka.yml
@@ -0,0 +1 @@
+ka:
diff --git a/config/locales-glitch/kab.yml b/config/locales-glitch/kab.yml
new file mode 100644
index 000000000..2109c04b3
--- /dev/null
+++ b/config/locales-glitch/kab.yml
@@ -0,0 +1 @@
+kab:
diff --git a/config/locales-glitch/kk.yml b/config/locales-glitch/kk.yml
new file mode 100644
index 000000000..1dcc9b127
--- /dev/null
+++ b/config/locales-glitch/kk.yml
@@ -0,0 +1 @@
+kk:
diff --git a/config/locales-glitch/kn.yml b/config/locales-glitch/kn.yml
new file mode 100644
index 000000000..d094088d8
--- /dev/null
+++ b/config/locales-glitch/kn.yml
@@ -0,0 +1 @@
+kn:
diff --git a/config/locales-glitch/ko.yml b/config/locales-glitch/ko.yml
index bc9c4e86b..dd8da3792 100644
--- a/config/locales-glitch/ko.yml
+++ b/config/locales-glitch/ko.yml
@@ -8,9 +8,17 @@ ko:
       captcha_enabled:
         desc_html: 이것은 hCaptcha의 외부 스크립트에 의존합니다, 이것은 개인정보 보호에 위협을 가할 수도 있습니다. 추가적으로, <strong>이것은 몇몇 사람들(특히나 장애인들)에게 가입 절차의 접근성을 심각하게 떨어트릴 수 있습니다</strong>. 이러한 이유로, 대체제로 승인 전용이나 초대제를 통한 가입을 고려해보세요.<br>한정된 사용만 가능한 초대장을 통한 가입자들은 CAPTCHA를 풀지 않아도 됩니다
         title: 새로운 사용자가 계정 확인을 위해서는 CAPTCHA를 풀어야 하도록 합니다
+      flavour_and_skin:
+        title: 풍미와 스킨
       hide_followers_count:
         desc_html: 사용자 프로필에 팔로워 수를 표시하지 않습니다
         title: 팔로워 수 숨기기
+      other:
+        preamble: 다른 곳에 맞지 않는 다양한 글리치 전용 설정들.
+        title: 기타
+      outgoing_spoilers:
+        desc_html: 툿을 연합할 때 열람주의가 없다면 여기 적힌 열람주의를 추가합니다. 다른 서버에서 열람주의를 설정하기를 요하는 주제에 특화된 서버라면 유용합니다. 미디어 또한 민감함으로 설정됩니다.
+        title: 나가는 툿에 대한 열람주의
       show_reblogs_in_public_timelines:
         desc_html: 공개글의 공개적인 부스트를 로컬과 공개 타임라인에 표시합니다.
         title: 부스트를 공개 타임라인에 표시
@@ -20,6 +28,10 @@ ko:
       trending_status_cw:
         desc_html: 유행하는 게시물이 활성화 되었을 때, 열람주의가 설정된 글도 허용합니다. 이 설정의 변경은 소급 적용되지 않습니다.
         title: 열람주의를 가진 글이 유행에 오를 수 있도록 허용
+  appearance:
+    localization:
+      glitch_guide_link: https://crowdin.com/project/glitch-soc
+      glitch_guide_link_text: 글리치도 마찬가지입니다!
   auth:
     captcha_confirmation:
       hint_html: 한가지 단계가 남았습니다! 계정을 확인하기 위해서는, CAPTCHA를 풀어야 합니다. 질문이 있거나 계정 확인 과정에서 도움을 받고 싶은 경우 <a href="/about/more">서버의 관리자에게 연락해서</a> 해결할 수 있습니다.
diff --git a/config/locales-glitch/ku.yml b/config/locales-glitch/ku.yml
new file mode 100644
index 000000000..aa87618e4
--- /dev/null
+++ b/config/locales-glitch/ku.yml
@@ -0,0 +1 @@
+kmr-TR:
diff --git a/config/locales-glitch/kw.yml b/config/locales-glitch/kw.yml
new file mode 100644
index 000000000..b2cfc12ff
--- /dev/null
+++ b/config/locales-glitch/kw.yml
@@ -0,0 +1 @@
+kw:
diff --git a/config/locales-glitch/la.yml b/config/locales-glitch/la.yml
new file mode 100644
index 000000000..3a7ba0d44
--- /dev/null
+++ b/config/locales-glitch/la.yml
@@ -0,0 +1 @@
+la:
diff --git a/config/locales-glitch/lt.yml b/config/locales-glitch/lt.yml
new file mode 100644
index 000000000..6c5cb837a
--- /dev/null
+++ b/config/locales-glitch/lt.yml
@@ -0,0 +1 @@
+lt:
diff --git a/config/locales-glitch/lv.yml b/config/locales-glitch/lv.yml
new file mode 100644
index 000000000..1be0eabc0
--- /dev/null
+++ b/config/locales-glitch/lv.yml
@@ -0,0 +1 @@
+lv:
diff --git a/config/locales-glitch/mk.yml b/config/locales-glitch/mk.yml
new file mode 100644
index 000000000..8b9144a98
--- /dev/null
+++ b/config/locales-glitch/mk.yml
@@ -0,0 +1 @@
+mk:
diff --git a/config/locales-glitch/ml.yml b/config/locales-glitch/ml.yml
new file mode 100644
index 000000000..6931a683d
--- /dev/null
+++ b/config/locales-glitch/ml.yml
@@ -0,0 +1 @@
+ml:
diff --git a/config/locales-glitch/mr.yml b/config/locales-glitch/mr.yml
new file mode 100644
index 000000000..fe1639c6a
--- /dev/null
+++ b/config/locales-glitch/mr.yml
@@ -0,0 +1 @@
+mr:
diff --git a/config/locales-glitch/ms.yml b/config/locales-glitch/ms.yml
new file mode 100644
index 000000000..2925688a0
--- /dev/null
+++ b/config/locales-glitch/ms.yml
@@ -0,0 +1 @@
+ms:
diff --git a/config/locales-glitch/my.yml b/config/locales-glitch/my.yml
new file mode 100644
index 000000000..5e1fc6bee
--- /dev/null
+++ b/config/locales-glitch/my.yml
@@ -0,0 +1 @@
+my:
diff --git a/config/locales-glitch/nl.yml b/config/locales-glitch/nl.yml
new file mode 100644
index 000000000..f009eadee
--- /dev/null
+++ b/config/locales-glitch/nl.yml
@@ -0,0 +1 @@
+nl:
diff --git a/config/locales-glitch/nn.yml b/config/locales-glitch/nn.yml
new file mode 100644
index 000000000..777f4e600
--- /dev/null
+++ b/config/locales-glitch/nn.yml
@@ -0,0 +1 @@
+nn:
diff --git a/config/locales-glitch/no.yml b/config/locales-glitch/no.yml
new file mode 100644
index 000000000..d2a4697e5
--- /dev/null
+++ b/config/locales-glitch/no.yml
@@ -0,0 +1 @@
+no:
diff --git a/config/locales-glitch/oc.yml b/config/locales-glitch/oc.yml
new file mode 100644
index 000000000..325b34889
--- /dev/null
+++ b/config/locales-glitch/oc.yml
@@ -0,0 +1 @@
+oc:
diff --git a/config/locales-glitch/pa.yml b/config/locales-glitch/pa.yml
new file mode 100644
index 000000000..bb8a6c834
--- /dev/null
+++ b/config/locales-glitch/pa.yml
@@ -0,0 +1 @@
+pa:
diff --git a/config/locales-glitch/pt-BR.yml b/config/locales-glitch/pt-BR.yml
new file mode 100644
index 000000000..95c1579ba
--- /dev/null
+++ b/config/locales-glitch/pt-BR.yml
@@ -0,0 +1,42 @@
+---
+pt-BR:
+  admin:
+    custom_emojis:
+      batch_copy_error: 'Ocorreu um erro ao copiar alguns dos emojis selecionados: %{message}'
+      batch_error: 'Ocorreu um erro: %{message}'
+    settings:
+      captcha_enabled:
+        desc_html: Isto se baseia em scripts externos de hCaptcha, o que pode ser uma preocupação de segurança e privacidade. Além disso, <strong>isto pode tornar o processo de registro significativamente menos acessível para algumas pessoas (especialmente deficientes)</strong>. Por estas razões, favor considerar medidas alternativas como o registro baseado em aprovação ou em convite.<br>Os usuários que tiverem sido convidados através de um convite de uso limitado não precisarão resolver um CAPTCHA
+        title: Exigir que novos usuários resolvam um CAPTCHA para confirmar sua conta
+      flavour_and_skin:
+        title: Sabor e tema
+      hide_followers_count:
+        desc_html: Não mostrar contagem de seguidores em perfis de usuário
+        title: Ocultar número de seguidores
+      other:
+        preamble: Várias configurações de glitch-soc que não se ajustam em outras categorias.
+        title: Outros
+      outgoing_spoilers:
+        desc_html: Ao federar toots, adicione este aviso de conteúdo aos toots que não possuem um. É útil se seu servidor for especializado em conteúdo que outros servidores podem querer ter sob um Aviso de Conteúdo. Os meios de comunicação também serão marcados como sensíveis.
+        title: Aviso de conteúdo para toots enviados
+      show_reblogs_in_public_timelines:
+        desc_html: Mostrar impulsos públicos de toots públicos nas linhas de tempo locais e públicas.
+        title: Mostrar impulsos em timelines públicas
+      show_replies_in_public_timelines:
+        desc_html: Além das auto-respostas públicas (tópicos), mostrar respostas públicas em linhas do tempo locais e públicas.
+        title: Mostrar respostas em linhas do tempo públicas
+      trending_status_cw:
+        desc_html: Quando as mensagens de tendência estiverem habilitadas, permitir que as mensagens com Avisos de Conteúdo sejam elegíveis. As alterações a esta configuração não são retroativas.
+        title: Permitir que mensagens com Avisos de Conteúdo tornem-se tendência
+  appearance:
+    localization:
+      glitch_guide_link: https://crowdin.com/project/glitch-soc
+      glitch_guide_link_text: E também para glitch-soc!
+  auth:
+    captcha_confirmation:
+      hint_html: Só mais um passo! Para confirmar a sua conta, este servidor requer que você resolva um CAPTCHA. Você pode <a href="/about/more">entrar em contato com o administrador do servidor</a> se você tiver dúvidas ou precisa de ajuda para confirmar sua conta.
+      title: Verificação de usuário
+  generic:
+    use_this: Use isto
+  settings:
+    flavours: Sabores
diff --git a/config/locales-glitch/pt-PT.yml b/config/locales-glitch/pt-PT.yml
new file mode 100644
index 000000000..a1a2dc36b
--- /dev/null
+++ b/config/locales-glitch/pt-PT.yml
@@ -0,0 +1 @@
+pt-PT:
diff --git a/config/locales-glitch/ro.yml b/config/locales-glitch/ro.yml
new file mode 100644
index 000000000..79dbaa871
--- /dev/null
+++ b/config/locales-glitch/ro.yml
@@ -0,0 +1 @@
+ro:
diff --git a/config/locales-glitch/ru.yml b/config/locales-glitch/ru.yml
new file mode 100644
index 000000000..ddc9d1e32
--- /dev/null
+++ b/config/locales-glitch/ru.yml
@@ -0,0 +1 @@
+ru:
diff --git a/config/locales-glitch/sa.yml b/config/locales-glitch/sa.yml
new file mode 100644
index 000000000..07ea4372a
--- /dev/null
+++ b/config/locales-glitch/sa.yml
@@ -0,0 +1 @@
+sa:
diff --git a/config/locales-glitch/sc.yml b/config/locales-glitch/sc.yml
new file mode 100644
index 000000000..91bd6d92f
--- /dev/null
+++ b/config/locales-glitch/sc.yml
@@ -0,0 +1 @@
+sc:
diff --git a/config/locales-glitch/sco.yml b/config/locales-glitch/sco.yml
new file mode 100644
index 000000000..8165e00a1
--- /dev/null
+++ b/config/locales-glitch/sco.yml
@@ -0,0 +1 @@
+sco:
diff --git a/config/locales-glitch/si.yml b/config/locales-glitch/si.yml
new file mode 100644
index 000000000..b0b50956e
--- /dev/null
+++ b/config/locales-glitch/si.yml
@@ -0,0 +1 @@
+si:
diff --git a/config/locales-glitch/simple_form.af.yml b/config/locales-glitch/simple_form.af.yml
new file mode 100644
index 000000000..252f9fd5a
--- /dev/null
+++ b/config/locales-glitch/simple_form.af.yml
@@ -0,0 +1 @@
+af:
diff --git a/config/locales-glitch/simple_form.an.yml b/config/locales-glitch/simple_form.an.yml
new file mode 100644
index 000000000..76cc0689b
--- /dev/null
+++ b/config/locales-glitch/simple_form.an.yml
@@ -0,0 +1 @@
+an:
diff --git a/config/locales-glitch/simple_form.ar.yml b/config/locales-glitch/simple_form.ar.yml
new file mode 100644
index 000000000..c257bc08a
--- /dev/null
+++ b/config/locales-glitch/simple_form.ar.yml
@@ -0,0 +1 @@
+ar:
diff --git a/config/locales-glitch/simple_form.ast.yml b/config/locales-glitch/simple_form.ast.yml
new file mode 100644
index 000000000..d762c9399
--- /dev/null
+++ b/config/locales-glitch/simple_form.ast.yml
@@ -0,0 +1 @@
+ast:
diff --git a/config/locales-glitch/simple_form.be.yml b/config/locales-glitch/simple_form.be.yml
new file mode 100644
index 000000000..91ccc2d7e
--- /dev/null
+++ b/config/locales-glitch/simple_form.be.yml
@@ -0,0 +1 @@
+be:
diff --git a/config/locales-glitch/simple_form.bg.yml b/config/locales-glitch/simple_form.bg.yml
new file mode 100644
index 000000000..d0e375da9
--- /dev/null
+++ b/config/locales-glitch/simple_form.bg.yml
@@ -0,0 +1 @@
+bg:
diff --git a/config/locales-glitch/simple_form.bn.yml b/config/locales-glitch/simple_form.bn.yml
new file mode 100644
index 000000000..152c69829
--- /dev/null
+++ b/config/locales-glitch/simple_form.bn.yml
@@ -0,0 +1 @@
+bn:
diff --git a/config/locales-glitch/simple_form.br.yml b/config/locales-glitch/simple_form.br.yml
new file mode 100644
index 000000000..c7677c850
--- /dev/null
+++ b/config/locales-glitch/simple_form.br.yml
@@ -0,0 +1 @@
+br:
diff --git a/config/locales-glitch/simple_form.bs.yml b/config/locales-glitch/simple_form.bs.yml
new file mode 100644
index 000000000..e9e174462
--- /dev/null
+++ b/config/locales-glitch/simple_form.bs.yml
@@ -0,0 +1 @@
+bs:
diff --git a/config/locales-glitch/simple_form.ca.yml b/config/locales-glitch/simple_form.ca.yml
new file mode 100644
index 000000000..f0c487273
--- /dev/null
+++ b/config/locales-glitch/simple_form.ca.yml
@@ -0,0 +1 @@
+ca:
diff --git a/config/locales-glitch/simple_form.ckb.yml b/config/locales-glitch/simple_form.ckb.yml
new file mode 100644
index 000000000..cc251e86a
--- /dev/null
+++ b/config/locales-glitch/simple_form.ckb.yml
@@ -0,0 +1 @@
+ckb-IR:
diff --git a/config/locales-glitch/simple_form.co.yml b/config/locales-glitch/simple_form.co.yml
new file mode 100644
index 000000000..5330938e0
--- /dev/null
+++ b/config/locales-glitch/simple_form.co.yml
@@ -0,0 +1 @@
+co:
diff --git a/config/locales-glitch/simple_form.cs.yml b/config/locales-glitch/simple_form.cs.yml
index f655fed9f..a0823d699 100644
--- a/config/locales-glitch/simple_form.cs.yml
+++ b/config/locales-glitch/simple_form.cs.yml
@@ -1,7 +1,6 @@
 ---
 cs:
   simple_form:
-    glitch_only: glitch-soc
     hints:
       defaults:
         fields: Na svém profilu můžete mít zobrazeno několik položek (max. %{count}) jako tabulku
@@ -14,14 +13,12 @@ cs:
     labels:
       defaults:
         setting_default_content_type: Výchozí formát příspěvků
-        setting_default_content_type_html: HTML
-        setting_default_content_type_markdown: Markdown
         setting_default_content_type_plain: Prostý text
         setting_favourite_modal: Před oblíbením příspěvku zobrazit potvrzovací dialog (pouze pro rozhraní Glitch)
         setting_hide_followers_count: Skrýt počet vašich sledujících
         setting_skin: Styl
         setting_system_emoji_font: Použít výchozí emoji systému (pouze pro rozhraní Glitch)
       notification_emails:
-        trending_tag: Nový populární hashtag vyžaduje schválení
         trending_link: Nový populární odkaz vyžaduje schválení
         trending_status: Nový populární příspěvek vyžaduje schválení
+        trending_tag: Nový populární hashtag vyžaduje schválení
diff --git a/config/locales-glitch/simple_form.cy.yml b/config/locales-glitch/simple_form.cy.yml
new file mode 100644
index 000000000..deefc9438
--- /dev/null
+++ b/config/locales-glitch/simple_form.cy.yml
@@ -0,0 +1 @@
+cy:
diff --git a/config/locales-glitch/simple_form.da.yml b/config/locales-glitch/simple_form.da.yml
new file mode 100644
index 000000000..347c94d5e
--- /dev/null
+++ b/config/locales-glitch/simple_form.da.yml
@@ -0,0 +1 @@
+da:
diff --git a/config/locales-glitch/simple_form.de.yml b/config/locales-glitch/simple_form.de.yml
new file mode 100644
index 000000000..0d92038c5
--- /dev/null
+++ b/config/locales-glitch/simple_form.de.yml
@@ -0,0 +1,27 @@
+---
+de:
+  simple_form:
+    glitch_only: glitch-soc
+    hints:
+      defaults:
+        fields: Du kannst bis zu %{count} Elemente auf deinem Profil anzeigen lassen, die als Tabelle dargestellt werden
+        setting_default_content_type_html: Beim Schreiben von Toots annehmen, dass sie in rohem HTML geschrieben sind, sofern nicht anders angegeben
+        setting_default_content_type_markdown: Beim Schreiben von Toots annehmen, dass sie in Markdown für Rich-Text-Formatierung geschrieben sind, sofern nicht anders angegeben
+        setting_default_content_type_plain: Beim Schreiben von Toots annehmen, dass sie in Klartext ohne spezielle Formatierung geschrieben sind, sofern nicht anders angegeben (standardmäßiges Mastodon-Verhalten)
+        setting_default_language: Die Sprache deiner Toots kann automatisch erkannt werden, aber sie ist nicht immer korrekt
+        setting_hide_followers_count: Verberge deine Follower-Anzahl vor allen, einschließlich dir. Manche Anwendungen könnten eine negative Follower-Anzahl anzeigen.
+        setting_skin: Verändert die ausgewählte Mastodon-Variante
+    labels:
+      defaults:
+        setting_default_content_type: Standardformat für Toots
+        setting_default_content_type_html: HTML
+        setting_default_content_type_markdown: Markdown
+        setting_default_content_type_plain: Unformatierter Text
+        setting_favourite_modal: Bestätigungsdialog vor dem Favorisieren anzeigen (gilt nur für Glitch-Variante)
+        setting_hide_followers_count: Anzahl der Follower verbergen
+        setting_skin: Skin
+        setting_system_emoji_font: Systemschriftart für Emojis verwenden (nur für Glitch-Variante)
+      notification_emails:
+        trending_link: Neuer angesagter Link muss überprüft werden
+        trending_status: Neuer angesagter Post muss überprüft werden
+        trending_tag: Neuer angesagter Tag muss überprüft werden
diff --git a/config/locales-glitch/simple_form.el.yml b/config/locales-glitch/simple_form.el.yml
new file mode 100644
index 000000000..419ec705c
--- /dev/null
+++ b/config/locales-glitch/simple_form.el.yml
@@ -0,0 +1 @@
+el:
diff --git a/config/locales-glitch/simple_form.en-GB.yml b/config/locales-glitch/simple_form.en-GB.yml
new file mode 100644
index 000000000..ef03d1810
--- /dev/null
+++ b/config/locales-glitch/simple_form.en-GB.yml
@@ -0,0 +1 @@
+en-GB:
diff --git a/config/locales-glitch/simple_form.en.yml b/config/locales-glitch/simple_form.en.yml
index c6e7d54ca..6930c09a6 100644
--- a/config/locales-glitch/simple_form.en.yml
+++ b/config/locales-glitch/simple_form.en.yml
@@ -22,6 +22,6 @@ en:
         setting_skin: Skin
         setting_system_emoji_font: Use system's default font for emojis (applies to Glitch flavour only)
       notification_emails:
-        trending_tag: New trending tag requires review
         trending_link: New trending link requires review
         trending_status: New trending post requires review
+        trending_tag: New trending tag requires review
diff --git a/config/locales-glitch/simple_form.eo.yml b/config/locales-glitch/simple_form.eo.yml
new file mode 100644
index 000000000..759981404
--- /dev/null
+++ b/config/locales-glitch/simple_form.eo.yml
@@ -0,0 +1 @@
+eo:
diff --git a/config/locales-glitch/simple_form.es-AR.yml b/config/locales-glitch/simple_form.es-AR.yml
new file mode 100644
index 000000000..affb4eae3
--- /dev/null
+++ b/config/locales-glitch/simple_form.es-AR.yml
@@ -0,0 +1,18 @@
+---
+es-AR:
+  simple_form:
+    hints:
+      defaults:
+        setting_default_content_type_html: Al escribir toots, asume que estás escritos en HTML, a menos que se especifique lo contrario
+        setting_default_content_type_markdown: Al escribir toots, asume que estás usando Markdown para dar formato de texto enriquecido, a menos que se especifique lo contrario
+        setting_default_content_type_plain: Al escribir toots, asume que estás usando texto sin formato, a menos que se especifique lo contrario (predeterminado de Mastodon)
+        setting_default_language: El idioma de tus toots se puede detectar automáticamente, pero no siempre es correcto
+        setting_skin: Cambia el diseño de la edición seleccionada de Mastodon
+    labels:
+      defaults:
+        setting_default_content_type: Formato predeterminado de tus toots
+        setting_default_content_type_plain: Sin formato
+        setting_favourite_modal: Mostrar diálogo de confirmación antes de marcar como favorito (sólo aplica a la edición Glich)
+        setting_hide_followers_count: Ocultar tu conteo de seguidorxs
+        setting_skin: Diseño
+        setting_system_emoji_font: Usar la fuente predeterminada del sistema para emojis (sólo aplica a la edición Glitch)
diff --git a/config/locales-glitch/simple_form.es-MX.yml b/config/locales-glitch/simple_form.es-MX.yml
new file mode 100644
index 000000000..561ca3b28
--- /dev/null
+++ b/config/locales-glitch/simple_form.es-MX.yml
@@ -0,0 +1,18 @@
+---
+es-MX:
+  simple_form:
+    hints:
+      defaults:
+        setting_default_content_type_html: Al escribir toots, asume que estás escritos en HTML, a menos que se especifique lo contrario
+        setting_default_content_type_markdown: Al escribir toots, asume que estás usando Markdown para dar formato de texto enriquecido, a menos que se especifique lo contrario
+        setting_default_content_type_plain: Al escribir toots, asume que estás usando texto sin formato, a menos que se especifique lo contrario (predeterminado de Mastodon)
+        setting_default_language: El idioma de tus toots se puede detectar automáticamente, pero no siempre es correcto
+        setting_skin: Cambia el diseño de la edición seleccionada de Mastodon
+    labels:
+      defaults:
+        setting_default_content_type: Formato predeterminado de tus toots
+        setting_default_content_type_plain: Sin formato
+        setting_favourite_modal: Mostrar diálogo de confirmación antes de marcar como favorito (sólo aplica a la edición Glich)
+        setting_hide_followers_count: Ocultar tu conteo de seguidorxs
+        setting_skin: Diseño
+        setting_system_emoji_font: Usar la fuente predeterminada del sistema para emojis (sólo aplica a la edición Glitch)
diff --git a/config/locales-glitch/simple_form.es.yml b/config/locales-glitch/simple_form.es.yml
index 977775be6..22277d30d 100644
--- a/config/locales-glitch/simple_form.es.yml
+++ b/config/locales-glitch/simple_form.es.yml
@@ -11,8 +11,6 @@ es:
     labels:
       defaults:
         setting_default_content_type: Formato predeterminado de tus toots
-        setting_default_content_type_html: HTML
-        setting_default_content_type_markdown: Markdown
         setting_default_content_type_plain: Sin formato
         setting_favourite_modal: Mostrar diálogo de confirmación antes de marcar como favorito (sólo aplica a la edición Glich)
         setting_hide_followers_count: Ocultar tu conteo de seguidorxs
diff --git a/config/locales-glitch/simple_form.et.yml b/config/locales-glitch/simple_form.et.yml
new file mode 100644
index 000000000..e020c4ffc
--- /dev/null
+++ b/config/locales-glitch/simple_form.et.yml
@@ -0,0 +1 @@
+et:
diff --git a/config/locales-glitch/simple_form.eu.yml b/config/locales-glitch/simple_form.eu.yml
new file mode 100644
index 000000000..566e176fc
--- /dev/null
+++ b/config/locales-glitch/simple_form.eu.yml
@@ -0,0 +1 @@
+eu:
diff --git a/config/locales-glitch/simple_form.fa.yml b/config/locales-glitch/simple_form.fa.yml
new file mode 100644
index 000000000..88215f82c
--- /dev/null
+++ b/config/locales-glitch/simple_form.fa.yml
@@ -0,0 +1 @@
+fa:
diff --git a/config/locales-glitch/simple_form.fi.yml b/config/locales-glitch/simple_form.fi.yml
new file mode 100644
index 000000000..23c538b19
--- /dev/null
+++ b/config/locales-glitch/simple_form.fi.yml
@@ -0,0 +1 @@
+fi:
diff --git a/config/locales-glitch/simple_form.fo.yml b/config/locales-glitch/simple_form.fo.yml
new file mode 100644
index 000000000..69f792cca
--- /dev/null
+++ b/config/locales-glitch/simple_form.fo.yml
@@ -0,0 +1 @@
+fo:
diff --git a/config/locales-glitch/simple_form.fr-QC.yml b/config/locales-glitch/simple_form.fr-QC.yml
new file mode 100644
index 000000000..70cade1f0
--- /dev/null
+++ b/config/locales-glitch/simple_form.fr-QC.yml
@@ -0,0 +1,27 @@
+---
+fr-QC:
+  simple_form:
+    glitch_only: glitch-soc
+    hints:
+      defaults:
+        fields: Vous pouvez avoir jusqu'à %{count} éléments affichés en tant que tableau sur votre profil
+        setting_default_content_type_html: Vos posts sont écrits en HTML brut, sauf indication contraire
+        setting_default_content_type_markdown: Vos posts utilisent Markdown pour un formatage de texte enrichi, sauf indication contraire
+        setting_default_content_type_plain: Vos posts sont écrits en texte brut sans formatage spécial, sauf indication contraire (comportement par défaut de Mastodon)
+        setting_default_language: La langue utilisée pour vos posts peut être automatiquement détectée, cependant cette détection n'est pas toujours fiable
+        setting_hide_followers_count: Cacher votre nombre d'abonné·e·s à tout le monde, y compris vous. Certaines applications peuvent afficher un nombre négatif d'abonné·e·s.
+        setting_skin: Relooke le mode de Mastodon choisi
+    labels:
+      defaults:
+        setting_default_content_type: Format par défaut pour les posts
+        setting_default_content_type_html: HTML
+        setting_default_content_type_markdown: Markdown
+        setting_default_content_type_plain: Texte brut
+        setting_favourite_modal: Afficher une fenêtre de confirmation avant de mettre en favori un post (s'applique uniquement au mode Glitch)
+        setting_hide_followers_count: Cacher votre nombre d'abonné·e·s
+        setting_skin: Thème
+        setting_system_emoji_font: Utiliser la police par défaut du système pour les émojis (s'applique uniquement au mode Glitch)
+      notification_emails:
+        trending_link: Un nouveau lien en tendances nécessite un examen
+        trending_status: Un nouveau post en tendances nécessite un examen
+        trending_tag: Un nouveau tag en tendances nécessite un examen
diff --git a/config/locales-glitch/simple_form.fr.yml b/config/locales-glitch/simple_form.fr.yml
new file mode 100644
index 000000000..bc6302cf8
--- /dev/null
+++ b/config/locales-glitch/simple_form.fr.yml
@@ -0,0 +1,27 @@
+---
+fr:
+  simple_form:
+    glitch_only: glitch-soc
+    hints:
+      defaults:
+        fields: Vous pouvez avoir jusqu'à %{count} éléments affichés en tant que tableau sur votre profil
+        setting_default_content_type_html: Vos posts sont écrits en HTML brut, sauf indication contraire
+        setting_default_content_type_markdown: Vos posts utilisent Markdown pour un formatage de texte enrichi, sauf indication contraire
+        setting_default_content_type_plain: Vos posts sont écrits en texte brut sans formatage spécial, sauf indication contraire (comportement par défaut de Mastodon)
+        setting_default_language: La langue utilisée pour vos posts peut être automatiquement détectée, cependant cette détection n'est pas toujours fiable
+        setting_hide_followers_count: Cacher votre nombre d'abonné·e·s à tout le monde, y compris vous. Certaines applications peuvent afficher un nombre négatif d'abonné·e·s.
+        setting_skin: Relooke le mode de Mastodon choisi
+    labels:
+      defaults:
+        setting_default_content_type: Format par défaut pour les posts
+        setting_default_content_type_html: HTML
+        setting_default_content_type_markdown: Markdown
+        setting_default_content_type_plain: Texte brut
+        setting_favourite_modal: Afficher une fenêtre de confirmation avant de mettre en favori un post (s'applique uniquement au mode Glitch)
+        setting_hide_followers_count: Cacher votre nombre d'abonné·e·s
+        setting_skin: Thème
+        setting_system_emoji_font: Utiliser la police par défaut du système pour les émojis (s'applique uniquement au mode Glitch)
+      notification_emails:
+        trending_link: Un nouveau lien en tendances nécessite un examen
+        trending_status: Un nouveau post en tendances nécessite un examen
+        trending_tag: Un nouveau tag en tendances nécessite un examen
diff --git a/config/locales-glitch/simple_form.fy.yml b/config/locales-glitch/simple_form.fy.yml
new file mode 100644
index 000000000..c05849f20
--- /dev/null
+++ b/config/locales-glitch/simple_form.fy.yml
@@ -0,0 +1 @@
+fy:
diff --git a/config/locales-glitch/simple_form.ga.yml b/config/locales-glitch/simple_form.ga.yml
new file mode 100644
index 000000000..20a9da24e
--- /dev/null
+++ b/config/locales-glitch/simple_form.ga.yml
@@ -0,0 +1 @@
+ga:
diff --git a/config/locales-glitch/simple_form.gd.yml b/config/locales-glitch/simple_form.gd.yml
new file mode 100644
index 000000000..1912f6c6a
--- /dev/null
+++ b/config/locales-glitch/simple_form.gd.yml
@@ -0,0 +1 @@
+gd:
diff --git a/config/locales-glitch/simple_form.gl.yml b/config/locales-glitch/simple_form.gl.yml
new file mode 100644
index 000000000..8ec5fc81c
--- /dev/null
+++ b/config/locales-glitch/simple_form.gl.yml
@@ -0,0 +1 @@
+gl:
diff --git a/config/locales-glitch/simple_form.he.yml b/config/locales-glitch/simple_form.he.yml
new file mode 100644
index 000000000..af6fa60a7
--- /dev/null
+++ b/config/locales-glitch/simple_form.he.yml
@@ -0,0 +1 @@
+he:
diff --git a/config/locales-glitch/simple_form.hi.yml b/config/locales-glitch/simple_form.hi.yml
new file mode 100644
index 000000000..d758a5b53
--- /dev/null
+++ b/config/locales-glitch/simple_form.hi.yml
@@ -0,0 +1 @@
+hi:
diff --git a/config/locales-glitch/simple_form.hr.yml b/config/locales-glitch/simple_form.hr.yml
new file mode 100644
index 000000000..f67f33c7e
--- /dev/null
+++ b/config/locales-glitch/simple_form.hr.yml
@@ -0,0 +1 @@
+hr:
diff --git a/config/locales-glitch/simple_form.hu.yml b/config/locales-glitch/simple_form.hu.yml
new file mode 100644
index 000000000..52314c50c
--- /dev/null
+++ b/config/locales-glitch/simple_form.hu.yml
@@ -0,0 +1 @@
+hu:
diff --git a/config/locales-glitch/simple_form.hy.yml b/config/locales-glitch/simple_form.hy.yml
new file mode 100644
index 000000000..c40654016
--- /dev/null
+++ b/config/locales-glitch/simple_form.hy.yml
@@ -0,0 +1 @@
+hy:
diff --git a/config/locales-glitch/simple_form.id.yml b/config/locales-glitch/simple_form.id.yml
new file mode 100644
index 000000000..8446cbad9
--- /dev/null
+++ b/config/locales-glitch/simple_form.id.yml
@@ -0,0 +1 @@
+id:
diff --git a/config/locales-glitch/simple_form.ig.yml b/config/locales-glitch/simple_form.ig.yml
new file mode 100644
index 000000000..7c264f0d7
--- /dev/null
+++ b/config/locales-glitch/simple_form.ig.yml
@@ -0,0 +1 @@
+ig:
diff --git a/config/locales-glitch/simple_form.io.yml b/config/locales-glitch/simple_form.io.yml
new file mode 100644
index 000000000..c63dc0e8d
--- /dev/null
+++ b/config/locales-glitch/simple_form.io.yml
@@ -0,0 +1 @@
+io:
diff --git a/config/locales-glitch/simple_form.is.yml b/config/locales-glitch/simple_form.is.yml
new file mode 100644
index 000000000..337c106df
--- /dev/null
+++ b/config/locales-glitch/simple_form.is.yml
@@ -0,0 +1 @@
+is:
diff --git a/config/locales-glitch/simple_form.it.yml b/config/locales-glitch/simple_form.it.yml
new file mode 100644
index 000000000..85830635a
--- /dev/null
+++ b/config/locales-glitch/simple_form.it.yml
@@ -0,0 +1 @@
+it:
diff --git a/config/locales-glitch/simple_form.ja.yml b/config/locales-glitch/simple_form.ja.yml
index dc9e0b579..558d9da9c 100644
--- a/config/locales-glitch/simple_form.ja.yml
+++ b/config/locales-glitch/simple_form.ja.yml
@@ -11,7 +11,6 @@ ja:
     labels:
       defaults:
         setting_default_content_type: 既定のトゥート形式
-        setting_default_content_type_html: HTML
         setting_default_content_type_markdown: マークダウン
         setting_default_content_type_plain: プレーンテキスト
         setting_favourite_modal: お気に入りをする前に確認ダイアログを表示する
diff --git a/config/locales-glitch/simple_form.ka.yml b/config/locales-glitch/simple_form.ka.yml
new file mode 100644
index 000000000..57a95cb04
--- /dev/null
+++ b/config/locales-glitch/simple_form.ka.yml
@@ -0,0 +1 @@
+ka:
diff --git a/config/locales-glitch/simple_form.kab.yml b/config/locales-glitch/simple_form.kab.yml
new file mode 100644
index 000000000..2109c04b3
--- /dev/null
+++ b/config/locales-glitch/simple_form.kab.yml
@@ -0,0 +1 @@
+kab:
diff --git a/config/locales-glitch/simple_form.kk.yml b/config/locales-glitch/simple_form.kk.yml
new file mode 100644
index 000000000..1dcc9b127
--- /dev/null
+++ b/config/locales-glitch/simple_form.kk.yml
@@ -0,0 +1 @@
+kk:
diff --git a/config/locales-glitch/simple_form.kn.yml b/config/locales-glitch/simple_form.kn.yml
new file mode 100644
index 000000000..d094088d8
--- /dev/null
+++ b/config/locales-glitch/simple_form.kn.yml
@@ -0,0 +1 @@
+kn:
diff --git a/config/locales-glitch/simple_form.ko.yml b/config/locales-glitch/simple_form.ko.yml
index f5575ed4c..0390b7043 100644
--- a/config/locales-glitch/simple_form.ko.yml
+++ b/config/locales-glitch/simple_form.ko.yml
@@ -1,12 +1,15 @@
 ---
 ko:
   simple_form:
+    glitch_only: 글리치
     hints:
       defaults:
+        fields: 최대 %{count}개의 항목을 프로필에 표 형태로 표시할 수 있습니다
         setting_default_content_type_html: 게시물을 작성할 때, 형식을 지정하지 않았다면, 생 HTML이라고 가정합니다
         setting_default_content_type_markdown: 게시물을 작성할 때, 형식을 지정하지 않았다면, 마크다운이라고 가정합니다
         setting_default_content_type_plain: 게시물을 작성할 때, 형식을 지정하지 않았다면, 일반적인 텍스트라고 가정합니다. (마스토돈의 기본 동작)
         setting_default_language: 작성하는 게시물의 언어는 자동으로 설정될 수 있습니다, 하지만 언제나 정확하지는 않습니다
+        setting_hide_followers_count: 나를 포함해서 모든 사람들에게서 내 팔로워 수를 숨깁니다. 몇몇 앱에서는 팔로워 수가 음수로 표시될 수 있습니다.
         setting_skin: 선택한 마스토돈 풍미의 스킨을 바꿉니다
     labels:
       defaults:
@@ -19,6 +22,6 @@ ko:
         setting_skin: 스킨
         setting_system_emoji_font: 에모지에 시스템 기본 폰트 적용하기 (글리치 풍미에만 적용됨)
       notification_emails:
-        trending_tag: 새로 유행중인 해시태그에 대한 리뷰가 필요할 때
         trending_link: 새로 유행중인 링크에 대한 리뷰가 필요할 때
         trending_status: 새로 유행중인 게시물에 대한 리뷰가 필요할 때
+        trending_tag: 새로 유행중인 해시태그에 대한 리뷰가 필요할 때
diff --git a/config/locales-glitch/simple_form.ku.yml b/config/locales-glitch/simple_form.ku.yml
new file mode 100644
index 000000000..aa87618e4
--- /dev/null
+++ b/config/locales-glitch/simple_form.ku.yml
@@ -0,0 +1 @@
+kmr-TR:
diff --git a/config/locales-glitch/simple_form.kw.yml b/config/locales-glitch/simple_form.kw.yml
new file mode 100644
index 000000000..b2cfc12ff
--- /dev/null
+++ b/config/locales-glitch/simple_form.kw.yml
@@ -0,0 +1 @@
+kw:
diff --git a/config/locales-glitch/simple_form.la.yml b/config/locales-glitch/simple_form.la.yml
new file mode 100644
index 000000000..3a7ba0d44
--- /dev/null
+++ b/config/locales-glitch/simple_form.la.yml
@@ -0,0 +1 @@
+la:
diff --git a/config/locales-glitch/simple_form.lt.yml b/config/locales-glitch/simple_form.lt.yml
new file mode 100644
index 000000000..6c5cb837a
--- /dev/null
+++ b/config/locales-glitch/simple_form.lt.yml
@@ -0,0 +1 @@
+lt:
diff --git a/config/locales-glitch/simple_form.lv.yml b/config/locales-glitch/simple_form.lv.yml
new file mode 100644
index 000000000..1be0eabc0
--- /dev/null
+++ b/config/locales-glitch/simple_form.lv.yml
@@ -0,0 +1 @@
+lv:
diff --git a/config/locales-glitch/simple_form.mk.yml b/config/locales-glitch/simple_form.mk.yml
new file mode 100644
index 000000000..8b9144a98
--- /dev/null
+++ b/config/locales-glitch/simple_form.mk.yml
@@ -0,0 +1 @@
+mk:
diff --git a/config/locales-glitch/simple_form.ml.yml b/config/locales-glitch/simple_form.ml.yml
new file mode 100644
index 000000000..6931a683d
--- /dev/null
+++ b/config/locales-glitch/simple_form.ml.yml
@@ -0,0 +1 @@
+ml:
diff --git a/config/locales-glitch/simple_form.mr.yml b/config/locales-glitch/simple_form.mr.yml
new file mode 100644
index 000000000..fe1639c6a
--- /dev/null
+++ b/config/locales-glitch/simple_form.mr.yml
@@ -0,0 +1 @@
+mr:
diff --git a/config/locales-glitch/simple_form.ms.yml b/config/locales-glitch/simple_form.ms.yml
new file mode 100644
index 000000000..2925688a0
--- /dev/null
+++ b/config/locales-glitch/simple_form.ms.yml
@@ -0,0 +1 @@
+ms:
diff --git a/config/locales-glitch/simple_form.my.yml b/config/locales-glitch/simple_form.my.yml
new file mode 100644
index 000000000..5e1fc6bee
--- /dev/null
+++ b/config/locales-glitch/simple_form.my.yml
@@ -0,0 +1 @@
+my:
diff --git a/config/locales-glitch/simple_form.nl.yml b/config/locales-glitch/simple_form.nl.yml
new file mode 100644
index 000000000..f009eadee
--- /dev/null
+++ b/config/locales-glitch/simple_form.nl.yml
@@ -0,0 +1 @@
+nl:
diff --git a/config/locales-glitch/simple_form.nn.yml b/config/locales-glitch/simple_form.nn.yml
new file mode 100644
index 000000000..777f4e600
--- /dev/null
+++ b/config/locales-glitch/simple_form.nn.yml
@@ -0,0 +1 @@
+nn:
diff --git a/config/locales-glitch/simple_form.no.yml b/config/locales-glitch/simple_form.no.yml
new file mode 100644
index 000000000..d2a4697e5
--- /dev/null
+++ b/config/locales-glitch/simple_form.no.yml
@@ -0,0 +1 @@
+no:
diff --git a/config/locales-glitch/simple_form.oc.yml b/config/locales-glitch/simple_form.oc.yml
new file mode 100644
index 000000000..325b34889
--- /dev/null
+++ b/config/locales-glitch/simple_form.oc.yml
@@ -0,0 +1 @@
+oc:
diff --git a/config/locales-glitch/simple_form.pa.yml b/config/locales-glitch/simple_form.pa.yml
new file mode 100644
index 000000000..bb8a6c834
--- /dev/null
+++ b/config/locales-glitch/simple_form.pa.yml
@@ -0,0 +1 @@
+pa:
diff --git a/config/locales-glitch/simple_form.pt-BR.yml b/config/locales-glitch/simple_form.pt-BR.yml
new file mode 100644
index 000000000..831f18d23
--- /dev/null
+++ b/config/locales-glitch/simple_form.pt-BR.yml
@@ -0,0 +1,27 @@
+---
+pt-BR:
+  simple_form:
+    glitch_only: glitch-soc
+    hints:
+      defaults:
+        fields: Você pode ter até %{count} itens exibidos como uma tabela no seu perfil
+        setting_default_content_type_html: Ao escrever toots, assume que estão escritos em HTML bruto, a menos que especificado de outra forma
+        setting_default_content_type_markdown: Ao escrever toots, assume que ele está usando Markdown para formatação de texto, a menos que especificado seja diferente
+        setting_default_content_type_plain: Ao escrever toots, assume que eles são textos simples sem formatação especial, a menos que esteja especificado de outra forma (comportamento padrão do Mastodon)
+        setting_default_language: O idioma dos seus toots pode ser detectado automaticamente, mas nem sempre é preciso
+        setting_hide_followers_count: Ocultar a contagem de seguidores de todos, incluindo você. Algumas aplicações podem exibir uma contagem de seguidores negativa.
+        setting_skin: Reaplica o sabor Mastodon selecionado
+    labels:
+      defaults:
+        setting_default_content_type: Formato padrão para toots
+        setting_default_content_type_html: HTML
+        setting_default_content_type_markdown: Markdown
+        setting_default_content_type_plain: Texto sem formatação
+        setting_favourite_modal: Mostrar diálogo antes de favoritar (aplica-se somente ao sabor Glitch)
+        setting_hide_followers_count: Ocultar sua contagem de seguidores
+        setting_skin: Tema
+        setting_system_emoji_font: Usar fonte padrão do sistema para emojis (aplica-se somente ao sabor Glitch)
+      notification_emails:
+        trending_link: Novo link em tendência requer revisão
+        trending_status: Nova postagem em tendência requer revisão
+        trending_tag: Nova tag em tendência requer revisão
diff --git a/config/locales-glitch/simple_form.pt-PT.yml b/config/locales-glitch/simple_form.pt-PT.yml
new file mode 100644
index 000000000..a1a2dc36b
--- /dev/null
+++ b/config/locales-glitch/simple_form.pt-PT.yml
@@ -0,0 +1 @@
+pt-PT:
diff --git a/config/locales-glitch/simple_form.ro.yml b/config/locales-glitch/simple_form.ro.yml
new file mode 100644
index 000000000..79dbaa871
--- /dev/null
+++ b/config/locales-glitch/simple_form.ro.yml
@@ -0,0 +1 @@
+ro:
diff --git a/config/locales-glitch/simple_form.ru.yml b/config/locales-glitch/simple_form.ru.yml
new file mode 100644
index 000000000..ddc9d1e32
--- /dev/null
+++ b/config/locales-glitch/simple_form.ru.yml
@@ -0,0 +1 @@
+ru:
diff --git a/config/locales-glitch/simple_form.sa.yml b/config/locales-glitch/simple_form.sa.yml
new file mode 100644
index 000000000..07ea4372a
--- /dev/null
+++ b/config/locales-glitch/simple_form.sa.yml
@@ -0,0 +1 @@
+sa:
diff --git a/config/locales-glitch/simple_form.sc.yml b/config/locales-glitch/simple_form.sc.yml
new file mode 100644
index 000000000..91bd6d92f
--- /dev/null
+++ b/config/locales-glitch/simple_form.sc.yml
@@ -0,0 +1 @@
+sc:
diff --git a/config/locales-glitch/simple_form.sco.yml b/config/locales-glitch/simple_form.sco.yml
new file mode 100644
index 000000000..8165e00a1
--- /dev/null
+++ b/config/locales-glitch/simple_form.sco.yml
@@ -0,0 +1 @@
+sco:
diff --git a/config/locales-glitch/simple_form.si.yml b/config/locales-glitch/simple_form.si.yml
new file mode 100644
index 000000000..b0b50956e
--- /dev/null
+++ b/config/locales-glitch/simple_form.si.yml
@@ -0,0 +1 @@
+si:
diff --git a/config/locales-glitch/simple_form.sk.yml b/config/locales-glitch/simple_form.sk.yml
new file mode 100644
index 000000000..f634a0282
--- /dev/null
+++ b/config/locales-glitch/simple_form.sk.yml
@@ -0,0 +1 @@
+sk:
diff --git a/config/locales-glitch/simple_form.sl.yml b/config/locales-glitch/simple_form.sl.yml
new file mode 100644
index 000000000..26c7ce2e3
--- /dev/null
+++ b/config/locales-glitch/simple_form.sl.yml
@@ -0,0 +1 @@
+sl:
diff --git a/config/locales-glitch/simple_form.sq.yml b/config/locales-glitch/simple_form.sq.yml
new file mode 100644
index 000000000..44ddadc95
--- /dev/null
+++ b/config/locales-glitch/simple_form.sq.yml
@@ -0,0 +1 @@
+sq:
diff --git a/config/locales-glitch/simple_form.sr-Latn.yml b/config/locales-glitch/simple_form.sr-Latn.yml
new file mode 100644
index 000000000..9e26af819
--- /dev/null
+++ b/config/locales-glitch/simple_form.sr-Latn.yml
@@ -0,0 +1 @@
+sr:
diff --git a/config/locales-glitch/simple_form.sr.yml b/config/locales-glitch/simple_form.sr.yml
new file mode 100644
index 000000000..9e26af819
--- /dev/null
+++ b/config/locales-glitch/simple_form.sr.yml
@@ -0,0 +1 @@
+sr:
diff --git a/config/locales-glitch/simple_form.sv.yml b/config/locales-glitch/simple_form.sv.yml
new file mode 100644
index 000000000..7e73a972a
--- /dev/null
+++ b/config/locales-glitch/simple_form.sv.yml
@@ -0,0 +1 @@
+sv:
diff --git a/config/locales-glitch/simple_form.ta.yml b/config/locales-glitch/simple_form.ta.yml
new file mode 100644
index 000000000..4320953ce
--- /dev/null
+++ b/config/locales-glitch/simple_form.ta.yml
@@ -0,0 +1 @@
+ta:
diff --git a/config/locales-glitch/simple_form.te.yml b/config/locales-glitch/simple_form.te.yml
new file mode 100644
index 000000000..34c54f18f
--- /dev/null
+++ b/config/locales-glitch/simple_form.te.yml
@@ -0,0 +1 @@
+te:
diff --git a/config/locales-glitch/simple_form.th.yml b/config/locales-glitch/simple_form.th.yml
new file mode 100644
index 000000000..a4431912a
--- /dev/null
+++ b/config/locales-glitch/simple_form.th.yml
@@ -0,0 +1 @@
+th:
diff --git a/config/locales-glitch/simple_form.tr.yml b/config/locales-glitch/simple_form.tr.yml
new file mode 100644
index 000000000..077d41667
--- /dev/null
+++ b/config/locales-glitch/simple_form.tr.yml
@@ -0,0 +1 @@
+tr:
diff --git a/config/locales-glitch/simple_form.tt.yml b/config/locales-glitch/simple_form.tt.yml
new file mode 100644
index 000000000..5eab4abff
--- /dev/null
+++ b/config/locales-glitch/simple_form.tt.yml
@@ -0,0 +1 @@
+tt:
diff --git a/config/locales-glitch/simple_form.ug.yml b/config/locales-glitch/simple_form.ug.yml
new file mode 100644
index 000000000..289acf241
--- /dev/null
+++ b/config/locales-glitch/simple_form.ug.yml
@@ -0,0 +1 @@
+ug:
diff --git a/config/locales-glitch/simple_form.uk.yml b/config/locales-glitch/simple_form.uk.yml
new file mode 100644
index 000000000..c256c3246
--- /dev/null
+++ b/config/locales-glitch/simple_form.uk.yml
@@ -0,0 +1 @@
+uk:
diff --git a/config/locales-glitch/simple_form.ur.yml b/config/locales-glitch/simple_form.ur.yml
new file mode 100644
index 000000000..2cace5883
--- /dev/null
+++ b/config/locales-glitch/simple_form.ur.yml
@@ -0,0 +1 @@
+ur:
diff --git a/config/locales-glitch/simple_form.vi.yml b/config/locales-glitch/simple_form.vi.yml
new file mode 100644
index 000000000..326506f0b
--- /dev/null
+++ b/config/locales-glitch/simple_form.vi.yml
@@ -0,0 +1 @@
+vi:
diff --git a/config/locales-glitch/simple_form.zh-CN.yml b/config/locales-glitch/simple_form.zh-CN.yml
index a82617fdb..63b9e9222 100644
--- a/config/locales-glitch/simple_form.zh-CN.yml
+++ b/config/locales-glitch/simple_form.zh-CN.yml
@@ -11,10 +11,8 @@ zh-CN:
     labels:
       defaults:
         setting_default_content_type: 嘟文的默认格式
-        setting_default_content_type_html: HTML
-        setting_default_content_type_markdown: Markdown
         setting_default_content_type_plain: 纯文本
         setting_favourite_modal: 在喜欢嘟文前询问我 (仅限于 Glitch 风味)
         setting_hide_followers_count: 隐藏你的关注者人数
         setting_skin: 皮肤
-        setting_system_emoji_font: 表情符号使用系统默认字体 (仅限于 Glitch 风味)
\ No newline at end of file
+        setting_system_emoji_font: 表情符号使用系统默认字体 (仅限于 Glitch 风味)
diff --git a/config/locales-glitch/simple_form.zh-HK.yml b/config/locales-glitch/simple_form.zh-HK.yml
new file mode 100644
index 000000000..35a3adbaf
--- /dev/null
+++ b/config/locales-glitch/simple_form.zh-HK.yml
@@ -0,0 +1 @@
+zh:
diff --git a/config/locales-glitch/simple_form.zh-TW.yml b/config/locales-glitch/simple_form.zh-TW.yml
new file mode 100644
index 000000000..cb82c0526
--- /dev/null
+++ b/config/locales-glitch/simple_form.zh-TW.yml
@@ -0,0 +1 @@
+zh-TW:
diff --git a/config/locales-glitch/sk.yml b/config/locales-glitch/sk.yml
new file mode 100644
index 000000000..f634a0282
--- /dev/null
+++ b/config/locales-glitch/sk.yml
@@ -0,0 +1 @@
+sk:
diff --git a/config/locales-glitch/sl.yml b/config/locales-glitch/sl.yml
new file mode 100644
index 000000000..26c7ce2e3
--- /dev/null
+++ b/config/locales-glitch/sl.yml
@@ -0,0 +1 @@
+sl:
diff --git a/config/locales-glitch/sq.yml b/config/locales-glitch/sq.yml
new file mode 100644
index 000000000..44ddadc95
--- /dev/null
+++ b/config/locales-glitch/sq.yml
@@ -0,0 +1 @@
+sq:
diff --git a/config/locales-glitch/sr-Latn.yml b/config/locales-glitch/sr-Latn.yml
new file mode 100644
index 000000000..9e26af819
--- /dev/null
+++ b/config/locales-glitch/sr-Latn.yml
@@ -0,0 +1 @@
+sr:
diff --git a/config/locales-glitch/sr.yml b/config/locales-glitch/sr.yml
new file mode 100644
index 000000000..9e26af819
--- /dev/null
+++ b/config/locales-glitch/sr.yml
@@ -0,0 +1 @@
+sr:
diff --git a/config/locales-glitch/sv.yml b/config/locales-glitch/sv.yml
new file mode 100644
index 000000000..7e73a972a
--- /dev/null
+++ b/config/locales-glitch/sv.yml
@@ -0,0 +1 @@
+sv:
diff --git a/config/locales-glitch/ta.yml b/config/locales-glitch/ta.yml
new file mode 100644
index 000000000..4320953ce
--- /dev/null
+++ b/config/locales-glitch/ta.yml
@@ -0,0 +1 @@
+ta:
diff --git a/config/locales-glitch/te.yml b/config/locales-glitch/te.yml
new file mode 100644
index 000000000..34c54f18f
--- /dev/null
+++ b/config/locales-glitch/te.yml
@@ -0,0 +1 @@
+te:
diff --git a/config/locales-glitch/th.yml b/config/locales-glitch/th.yml
new file mode 100644
index 000000000..a4431912a
--- /dev/null
+++ b/config/locales-glitch/th.yml
@@ -0,0 +1 @@
+th:
diff --git a/config/locales-glitch/tr.yml b/config/locales-glitch/tr.yml
new file mode 100644
index 000000000..077d41667
--- /dev/null
+++ b/config/locales-glitch/tr.yml
@@ -0,0 +1 @@
+tr:
diff --git a/config/locales-glitch/tt.yml b/config/locales-glitch/tt.yml
new file mode 100644
index 000000000..5eab4abff
--- /dev/null
+++ b/config/locales-glitch/tt.yml
@@ -0,0 +1 @@
+tt:
diff --git a/config/locales-glitch/ug.yml b/config/locales-glitch/ug.yml
new file mode 100644
index 000000000..289acf241
--- /dev/null
+++ b/config/locales-glitch/ug.yml
@@ -0,0 +1 @@
+ug:
diff --git a/config/locales-glitch/uk.yml b/config/locales-glitch/uk.yml
new file mode 100644
index 000000000..c256c3246
--- /dev/null
+++ b/config/locales-glitch/uk.yml
@@ -0,0 +1 @@
+uk:
diff --git a/config/locales-glitch/ur.yml b/config/locales-glitch/ur.yml
new file mode 100644
index 000000000..2cace5883
--- /dev/null
+++ b/config/locales-glitch/ur.yml
@@ -0,0 +1 @@
+ur:
diff --git a/config/locales-glitch/vi.yml b/config/locales-glitch/vi.yml
new file mode 100644
index 000000000..326506f0b
--- /dev/null
+++ b/config/locales-glitch/vi.yml
@@ -0,0 +1 @@
+vi:
diff --git a/config/locales-glitch/zh-CN.yml b/config/locales-glitch/zh-CN.yml
index 37a8307e8..40a09c1c9 100644
--- a/config/locales-glitch/zh-CN.yml
+++ b/config/locales-glitch/zh-CN.yml
@@ -2,15 +2,12 @@
 zh-CN:
   admin:
     settings:
-      enable_keybase:
-        desc_html: 允许你的用户使用 Keybase 证明身份
-        title: 启用 Keybase 集成
-      outgoing_spoilers:
-        desc_html: 在联邦化嘟文的时候,将这个内容警告添加到没有内容警告的嘟文中。如果你的服务器专用于其他服务器可能希望有内容警告的内容,它会很有用。媒体也将被标记为敏感。
-        title: 对外嘟文的内容警告
       hide_followers_count:
         desc_html: 不要在用户资料中显示关注者人数
         title: 隐藏关注者人数
+      outgoing_spoilers:
+        desc_html: 在联邦化嘟文的时候,将这个内容警告添加到没有内容警告的嘟文中。如果你的服务器专用于其他服务器可能希望有内容警告的内容,它会很有用。媒体也将被标记为敏感。
+        title: 对外嘟文的内容警告
       show_reblogs_in_public_timelines:
         desc_html: 在本地和跨站时间线中显示公开嘟文的公开转嘟。
         title: 在公共时间线中显示转嘟
diff --git a/config/locales-glitch/zh-HK.yml b/config/locales-glitch/zh-HK.yml
new file mode 100644
index 000000000..35a3adbaf
--- /dev/null
+++ b/config/locales-glitch/zh-HK.yml
@@ -0,0 +1 @@
+zh:
diff --git a/config/locales-glitch/zh-TW.yml b/config/locales-glitch/zh-TW.yml
new file mode 100644
index 000000000..cb82c0526
--- /dev/null
+++ b/config/locales-glitch/zh-TW.yml
@@ -0,0 +1 @@
+zh-TW:
diff --git a/config/locales/activerecord.bg.yml b/config/locales/activerecord.bg.yml
index 123e7cd9b..ddebd8f08 100644
--- a/config/locales/activerecord.bg.yml
+++ b/config/locales/activerecord.bg.yml
@@ -19,7 +19,7 @@ bg:
         account:
           attributes:
             username:
-              invalid: трябва да има само букви, цифри и долни черти
+              invalid: трябва да е само букви, цифри и долни черти
               reserved: е запазено
         admin/webhook:
           attributes:
@@ -40,14 +40,14 @@ bg:
         user:
           attributes:
             email:
-              blocked: използва се непозволен имейл доставчик
+              blocked: използва се непозволен доставчик на услуга за е-поща
               unreachable: изглежда, че не съществува
             role_id:
               elevated: не може да е по-висока от текущата ви роля
         user_role:
           attributes:
             permissions_as_keys:
-              dangerous: включва разрешения, които не са безопасни за базова роля
+              dangerous: включва разрешения, които не са безопасни за базовата роля
               elevated: не може да включва разрешения, които настоящата ви роля не притежава
               own_role: не може да се промени с текущата ви роля
             position:
diff --git a/config/locales/activerecord.ca.yml b/config/locales/activerecord.ca.yml
index 79db38a29..607dcd1ea 100644
--- a/config/locales/activerecord.ca.yml
+++ b/config/locales/activerecord.ca.yml
@@ -7,7 +7,7 @@ ca:
         options: Opcions
       user:
         agreement: Acord de servei
-        email: Adreça de correu-e
+        email: Adreça de correu electrònic
         locale: Idioma
         password: Contrasenya
       user/account:
diff --git a/config/locales/activerecord.ckb.yml b/config/locales/activerecord.ckb.yml
index 9983824c5..8bdad2173 100644
--- a/config/locales/activerecord.ckb.yml
+++ b/config/locales/activerecord.ckb.yml
@@ -48,3 +48,8 @@ ckb:
           attributes:
             permissions_as_keys:
               dangerous: ئەو مۆڵەتانەش لەخۆبگرێت کە سەلامەت نین بۆ ڕۆلی سەرەکی
+              elevated: ناتوانێت ئەو مۆڵەتانە لەخۆبگرێت کە ڕۆڵی ئێستات خاوەنی نییە
+              own_role: ناتوانرێت بە ڕۆڵی ئێستات بگۆڕدرێت
+            position:
+              elevated: ناتوانێت لە ڕۆڵی ئێستات بەرزتر بێت
+              own_role: ناتوانرێت بە ڕۆڵی ئێستات بگۆڕدرێت
diff --git a/config/locales/activerecord.de.yml b/config/locales/activerecord.de.yml
index 53a04e700..7e49ed1e1 100644
--- a/config/locales/activerecord.de.yml
+++ b/config/locales/activerecord.de.yml
@@ -4,7 +4,7 @@ de:
     attributes:
       poll:
         expires_at: Abstimmungsende
-        options: Wahlmöglichkeiten
+        options: Auswahlmöglichkeiten
       user:
         agreement: Service-Vereinbarung
         email: E-Mail-Adresse
@@ -13,7 +13,7 @@ de:
       user/account:
         username: Benutzername
       user/invite_request:
-        text: Grund
+        text: Begründung
     errors:
       models:
         account:
@@ -28,7 +28,7 @@ de:
         doorkeeper/application:
           attributes:
             website:
-              invalid: ist keine gültige URL
+              invalid: ist keine gültige Adresse
         import:
           attributes:
             data:
@@ -36,19 +36,19 @@ de:
         status:
           attributes:
             reblog:
-              taken: des Beitrags existiert schon
+              taken: des Beitrags existiert bereits
         user:
           attributes:
             email:
-              blocked: verwendet einen nicht erlaubten E-Mail-Anbieter
+              blocked: verwendet einen unerlaubten E-Mail-Anbieter
               unreachable: scheint nicht zu existieren
             role_id:
-              elevated: Kann nicht höher als Ihre aktuelle Rolle sein
+              elevated: kann nicht höher als Ihre aktuelle Rolle sein
         user_role:
           attributes:
             permissions_as_keys:
-              dangerous: enthalte Berechtigungen, die für die Basisrolle nicht sicher sind
-              elevated: kann keine Berechtigungen enthalten, die deine aktuelle Rolle nicht besitzt
+              dangerous: enthält Berechtigungen, welche nicht sicher sind für die Basisrolle
+              elevated: kann nicht Berechtigungen beinhalten, die deine aktuelle Rolle nicht besitzt
               own_role: kann nicht mit deiner aktuellen Rolle geändert werden
             position:
               elevated: kann nicht höher sein als deine aktuelle Rolle
diff --git a/config/locales/activerecord.es-MX.yml b/config/locales/activerecord.es-MX.yml
index 1c0313e5a..da7611005 100644
--- a/config/locales/activerecord.es-MX.yml
+++ b/config/locales/activerecord.es-MX.yml
@@ -3,7 +3,7 @@ es-MX:
   activerecord:
     attributes:
       poll:
-        expires_at: Vencimiento
+        expires_at: Fecha límite
         options: Opciones
       user:
         agreement: Contrato de servicio
diff --git a/config/locales/activerecord.et.yml b/config/locales/activerecord.et.yml
index 1496dedcb..d98c6b611 100644
--- a/config/locales/activerecord.et.yml
+++ b/config/locales/activerecord.et.yml
@@ -36,20 +36,20 @@ et:
         status:
           attributes:
             reblog:
-              taken: postitusel juba eksisteerib
+              taken: postitusel on juba
         user:
           attributes:
             email:
               blocked: kasutab mitte lubatud e-posti teenusepakkujat
               unreachable: ei paista eksisteerivat
             role_id:
-              elevated: ei saa olla kõrgem kui teie enda roll
+              elevated: ei saa olla kõrgem kui enda roll
         user_role:
           attributes:
             permissions_as_keys:
               dangerous: hõlmata õiguseid, mis ei ole turvalised baasrollile
-              elevated: ei saa hõlmata õiguseid, mida teie praegune roll ei sisalda
-              own_role: ei saa muuta teie praeguse rolliga
+              elevated: ei saa hõlmata õiguseid, mida sinu praegune roll ei sisalda
+              own_role: ei saa muuta sinu praeguse rolliga
             position:
-              elevated: ei saa olla kõrgem, kui teie praegune roll
-              own_role: ei saa muuta teie praeguse rolliga
+              elevated: ei saa olla kõrgem, kui sinu praegune roll
+              own_role: ei saa muuta sinu praeguse rolliga
diff --git a/config/locales/activerecord.io.yml b/config/locales/activerecord.io.yml
index 5c809ce2e..1adc664cd 100644
--- a/config/locales/activerecord.io.yml
+++ b/config/locales/activerecord.io.yml
@@ -29,6 +29,10 @@ io:
           attributes:
             website:
               invalid: ne esas valida URL
+        import:
+          attributes:
+            data:
+              malformed: esas misformaca
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.la.yml b/config/locales/activerecord.la.yml
new file mode 100644
index 000000000..3a7ba0d44
--- /dev/null
+++ b/config/locales/activerecord.la.yml
@@ -0,0 +1 @@
+la:
diff --git a/config/locales/an.yml b/config/locales/an.yml
index 6fb24cc8a..f3bb5a895 100644
--- a/config/locales/an.yml
+++ b/config/locales/an.yml
@@ -561,7 +561,6 @@ an:
     report_notes:
       created_msg: Lo rechistro d'a denuncia s'ha creyau correctament!
       destroyed_msg: Lo rechistro d'a denuncia s'ha borrau correctament!
-      today_at: Hue a las %{time}
     reports:
       account:
         notes:
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 97bbac031..2bf9bcf26 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -121,6 +121,8 @@ ar:
       redownloaded_msg: تم تحديث ملف %{username} التعريفي من الأصل
       reject: ارفض
       rejected_msg: تم رفض تطبيق تسجيل %{username} بنجاح
+      remote_suspension_irreversible: تم حذف بيانات هذا الحساب بشكل لا رجعة فيه.
+      remote_suspension_reversible_hint_html: تم تعليق الحساب على الخادم الخاص بهم، وسيتم إزالة البيانات بالكامل على %{date}. حتى ذلك الحين، يمكن للخادم آخر استعادة هذا الحساب دون أي تأثيرات سيئة. إذا كنت ترغب في إزالة جميع بيانات الحساب على الفور، يمكنك فعل ذلك أدناه.
       remove_avatar: حذف الصورة الرمزية
       remove_header: حذف الرأسية
       removed_avatar_msg: تمت إزالة صورة %{username} الرمزية بنجاح
@@ -556,7 +558,6 @@ ar:
     report_notes:
       created_msg: تم إنشاء ملاحظة الشكوى بنجاح!
       destroyed_msg: تم حذف ملاحظة الشكوى بنجاح!
-      today_at: اليوم على %{time}
     reports:
       account:
         notes:
@@ -673,7 +674,13 @@ ar:
         manage_user_access_description: يسمح للمستخدمين بتعطيل المصادقة الثنائية المستخدمين الآخرين، تغيير عنوان البريد الإلكتروني الخاص بهم، وإعادة تعيين كلمة المرور الخاصة بهم
         manage_users: إدارة المستخدمين
         manage_users_description: يسمح للمستخدمين بعرض تفاصيل المستخدمين الآخرين وتنفيذ إجراءات الإشراف ضدهم
+        manage_webhooks: إدارة الـWebhooks
+        manage_webhooks_description: يسمح للمستخدمين بإعداد Webhooks للأحداث الإدارية
+        view_audit_log: عرض سجل العمليات
+        view_audit_log_description: يسمح للمستخدمين برؤية سجل الإجراءات الإدارية على الخادم
         view_dashboard: عرض لوحة التحكم
+        view_dashboard_description: يسمح للمستخدمين بالوصول إلى لوحة التحكم وعدة مقاييس
+        view_devops: DevOps
         view_devops_description: السماح للمستخدمين بالوصول إلى لوحة Sidekiq و pgHero
       title: الأدوار
     rules:
@@ -686,16 +693,24 @@ ar:
     settings:
       about:
         manage_rules: إدارة قواعد الخادم
+        preamble: قدم معلومات متعمقة عن كيفية إدارة عمل الخادم، والإشراف، والتمويل.
+        rules_hint: هناك منطقة مخصصة للقواعد التي يتوقع من المستخدمين التقيد بها.
         title: عن
       appearance:
         preamble: تخصيص واجهة الويب لماستدون.
         title: المظهر
       branding:
+        preamble: العلامة التجارية للخادم الخاص بك تميزه عن الخوادم الأخرى في الشبكة. يمكن عرض هذه المعلومات عبر مجموعة متنوعة من البيئات، مثل واجهة الويب لماستدون, التطبيقات الأصلية، في معاينات الرابط على مواقع الويب الأخرى وداخل تطبيقات الرسائل، وما إلى ذلك. ولهذا السبب، من الأفضل إبقاء هذه المعلومات واضحة وقصيرة وموجزة.
         title: العلامة
       content_retention:
+        preamble: التحكم في كيفية تخزين المحتوى الذي ينشئه المستخدم في ماستدون.
         title: الاحتفاظ بالمحتوى
+      default_noindex:
+        desc_html: يؤثر على جميع المستخدمين الذين لم يغيروا هذا الإعداد بأنفسهم
+        title: عدم السماح مبدئيا لمحركات البحث بفهرسة الملفات التعريفية للمستخدمين
       discovery:
         follow_recommendations: اتبع التوصيات
+        preamble: تصفح المحتوى المثير للاهتمام أمر مهم في إستقبال المستخدمين الجدد الذين قد لا يعرفون أي شخص ماستدون. التحكم في كيفية عمل ميزات الاكتشاف المختلفة على الخادم الخاص بك.
         profile_directory: دليل الصفحات التعريفية
         public_timelines: الخيوط الزمنية العامة
         title: الاستكشاف
@@ -745,12 +760,21 @@ ar:
       actions:
         delete_statuses: حَذَفَ %{name} رسائل %{target}
         disable: جَمّدَ %{name} حساب %{target}
+        mark_statuses_as_sensitive: وَضَعَ %{name} علامة على منشورات %{target} على أنها حساسة
+        none: قام %{name} بإرسال تحذير إلى %{target}
+        sensitive: قام %{name} بوضع علامة حساس على حساب %{target}
+        silence: قام %{name} بكتم حساب %{target}
         suspend: قام %{name} بتعليق حساب %{target}
       appeal_approved: طُعِن فيه
       appeal_pending: طعن قيد المراجعة
     system_checks:
       database_schema_check:
         message_html: هناك عمليات هجرة معلقة لقواعد البيانات. يرجى تشغيلها لضمان تصرف التطبيق كما هو متوقع
+      elasticsearch_running_check:
+        message_html: تعذر الاتصال بـElasticsearch. الرجاء التحقق من أنه قيد التشغيل، أو تعطيل البحث عن النص الكامل
+      elasticsearch_version_check:
+        message_html: 'إصدار Elasticsearch غير المتوافق: %{value}'
+        version_comparison: يعمل Elasticsearch بإصدار %{running_version} بينما %{required_version} مطلوب
       rules_check:
         action: إدارة قواعد الخادم
         message_html: لم تقم بتحديد أي قواعد خادم.
@@ -767,20 +791,30 @@ ar:
       links:
         allow: السماح بالرابط
         allow_provider: السماح للناشر
+        description_html: هذه هي الروابط التي يتم حاليا مشاركتها بشكل كبير عن طريق الحسابات التي يرى الخادم الخاص بك المشاركات منها. يمكن أن يساعد مستخدميك في معرفة ما يحدث في العالم. لا تعرض روابط علنا حتى توافق على الناشر. يمكنك أيضًا السماح أو رفض بالروابط فردياً.
         disallow: رفض الرابط
         disallow_provider: عدم السماح للناشر
+        no_link_selected: لم يطرأ أي تغيير على أي رابط بما أنه لم يتم اختيار أي واحد
+        publishers:
+          no_publisher_selected: لم يطرأ أي تغيير على أي ناشر بما أنه لم يتم اختيار أي واحد
         title: الروابط المتداولة
         usage_comparison: تمت مشاركته %{today} مرات اليوم، مقارنة بـ %{yesterday} بالأمس
       only_allowed: من سُمِحَ لهم فقط
       pending_review: في انتظار المراجعة
       preview_card_providers:
+        allowed: الروابط من هذا الناشر يمكن أن تتداول
+        description_html: هذه هي النطاقات التي غالبا ما يتم مشاركة الروابط منها على الخادم الخاص بك. لن تتجه الروابط علنا ما لم تتم الموافقة على نطاق الرابط. الموافقة (أو الرفض) الخاص بك يمتد إلى النطاقات الفرعية.
+        rejected: الروابط من هذا الناشر لن تتداول
         title: الناشرون
       rejected: مرفوض
       statuses:
         allow: السماح بالمنشور
         allow_account: السماح للناشر
+        description_html: هذه هي المنشورات التي يعرفها خادمك التي يتم حاليا مشاركتها وتفضيلها كثيرا في الوقت الراهن. يمكن أن تساعد المستخدمين الجدد والعائدين للعثور على المزيد من الأشخاص للمتابعة. ولا تُعرض أي منشورات علناً حتى توافق على كاتبها، ويسمح الكاتب باقتراح حسابه للآخرين. يمكنك أيضًا السماح أو الرفض بالمنشورات فردياً.
         disallow: رفض المنشور
         disallow_account: رفض الناشر
+        no_status_selected: لم يتم تغيير أي منشورات متداوله حيث لم يتم اختيار أي منهم
+        not_discoverable: الكاتب لم يختار أن يكون قابلا للاكتشاف
         title: المنشورات المتداولة
       tags:
         current_score: التقييم الحالي %{score}
@@ -790,7 +824,9 @@ ar:
           tag_servers_dimension: الخوادم الأكثر نشاطا
           tag_servers_measure: خوادم أخرى
           tag_uses_measure: إجمالي الاستخدامات
+        description_html: هذه الوسوم التي تظهر حاليا في الكثير من المنشورات التي يراها الخادم الخاص بك. يمكن أن تساعد مستخدميك في معرفة ما يتحدث عنه الناس بكثرة حالياً. لا يتم عرض أي وسوم حتى توافق عليها.
         listable: يمكن اقتراحه
+        no_tag_selected: لم يطرأ أي تغيير على أي وسم بما أنه لم يتم اختيار أي واحد
         not_listable: لن يتم اقتراحه
         not_trendable: لن يظهر في المتداولة
         not_usable: لا يمكن استخدامه
@@ -811,15 +847,19 @@ ar:
     webhooks:
       add_new: إضافة نقطة نهاية
       delete: حذف
+      description_html: "<strong>webhook</strong> يمكّن ماستدون من إرسال <strong>إشعارات في الوقت الحقيقي</strong> حول الأحداث المختارة إلى التطبيق الخاص بك، حتى يمكن لتطبيقك <strong>تشغيل ردود الفعل تلقائياً</strong>."
       disable: تعطيل
       disabled: معطَّل
       edit: تعديل نقطة النهاية
+      empty: ليس لديك أي نقاط نهاية ويب هوك تم تكوينها بعد.
       enable: تشغيل
       enabled: نشِط
+      events: الأحداث
       new: رابط ويب جديد
       rotate_secret: تغيير الرمز
       secret: رمز تسجيل الدخول
       status: الحالة
+      title: الويب هوك
       webhook: رابط ويب
   admin_mailer:
     new_appeal:
@@ -849,7 +889,9 @@ ar:
         title: المنشورات الشائعة
       new_trending_tags:
         no_approved_tags: لا توجد حاليًا هاشات شائعة موافق عليها.
+        requirements: 'يمكن لأي من هؤلاء المرشحين أن يتجاوز علامة #%{rank} من الوسوم الموافق عليها، وهي حاليا #%{lowest_tag_name} مع نتيجة %{lowest_tag_score}.'
         title: الوسوم المتداولة
+      subject: تداولات جديدة في انتظار المراجعة على %{instance}
   aliases:
     add_new: أنشئ كُنية
     created_msg: تم إنشاء الكُنية الجديدة بنجاح. يمكنكم الآن الشروع في الإنتقال مِن حسابكم القديم.
@@ -913,6 +955,7 @@ ar:
     resend_confirmation: إعادة إرسال تعليمات التأكيد
     reset_password: إعادة تعيين كلمة المرور
     rules:
+      preamble: يتم تعيين هذه القوانين وفرضها من قبل مشرفي %{domain}.
       title: بعض القواعد الأساسية.
     security: الأمان
     set_new_password: إدخال كلمة مرور جديدة
@@ -920,7 +963,11 @@ ar:
       email_below_hint_html: إذا كان عنوان البريد الإلكتروني التالي غير صحيح، فيمكنك تغييره هنا واستلام بريد إلكتروني جديد للتأكيد.
       email_settings_hint_html: لقد تم إرسال رسالة بريد إلكترونية للتأكيد إلى %{email}. إن كان عنوان البريد الإلكتروني غير صحيح ، يمكنك تغييره في إعدادات حسابك.
       title: الضبط
+    sign_in:
+      preamble_html: قم بتسجيل الدخول باستخدام بيانات الاعتماد الخاصة بك علي <strong>%{domain}</strong> إذا تم استضافة حسابك على خادم مختلف، فلن تتمكن من تسجيل الدخول هنا.
+      title: تسجيل الدخول إلى %{domain}
     sign_up:
+      preamble: مع حساب على خادم ماستدون هذا، ستتمكن من متابعة أي شخص آخر على الشبكة، بغض النظر عن المكان الذي يستضيف فيه حسابهم.
       title: دعنا نجهّز %{domain}.
     status:
       account_status: حالة الحساب
@@ -928,6 +975,7 @@ ar:
       functional: حسابك يعمل بشكل كامل.
       pending: إن طلبك قيد المراجعة من قبل فريقنا. قد يستغرق هذا بعض الوقت. سوف تتلقى بريدا إلكترونيا إذا تمت الموافقة على طلبك.
       redirecting_to: حسابك غير نشط لأنه تم تحويله حاليا إلى %{acct}.
+      view_strikes: عرض السجلات السابقة ضد حسابك
     too_fast: تم إرسال النموذج بسرعة كبيرة، حاول مرة أخرى.
     use_security_key: استخدام مفتاح الأمان
   authorize_follow:
@@ -990,6 +1038,7 @@ ar:
     strikes:
       action_taken: الإجراء المتخذ
       appeal: طعن
+      appeal_approved: تم استئناف هذا السجل بنجاح ولم يعد صالحًا
       appeal_rejected: رُفِض الطعن
       appeal_submitted_at: طعن أرسِل في
       appealed_msg: تم تقديم طعنك. إذا تمت الموافقة عليه، سيتم إبلاغك.
@@ -998,14 +1047,18 @@ ar:
       approve_appeal: الموافقة على الطعن
       associated_report: التقرير المتربط
       created_at: بتاريخ
+      description_html: هذه هي الإجراءات المتخذة ضد حسابك والتحذيرات التي تم إرسالها إليك من قبل موظفي %{instance}.
       recipient: موجّه إلى
       reject_appeal: رفض الطعن
       status: 'المنشور #%{id}'
+      status_removed: تمت إزالة المنشور بالفعل من النظام
       title: "%{action} في %{date}"
       title_actions:
         delete_statuses: إزالة منشور
         disable: تجميد للحساب
+        mark_statuses_as_sensitive: تصنيف المنشورات كحساسة
         none: تحذير
+        sensitive: تصنيف الحساب كحساس
         silence: الحد من الحساب
         suspend: تعليق للحساب
       your_appeal_approved: تمت الموافقة على طعنك
@@ -1062,19 +1115,27 @@ ar:
       add_keyword: إضافة كلمة مفتاحية
       keywords: الكلمات المفتاحية
       statuses: المنشورات الفردية
+      statuses_hint_html: ينطبق هذا الفلتر على اختيار المنشورات فردياً بغض النظر عما إذا كانت تتطابق مع الكلمات الرئيسية أدناه. <a href="%{path}">مراجعة أو إزالة المنشورات من الفلتر</a>.
       title: تعديل عامل التصفية
     errors:
+      deprecated_api_multiple_keywords: لا يمكن تغيير هذه المعلمات من هذا التطبيق لأنها تنطبق على أكثر من كلمة فلتر واحدة. استخدم تطبيقاً أحدث أو واجهة ويب.
       invalid_context: لم تقم بتحديد أي مجال أو أنّ المجال غير صالح
     index:
+      contexts: فلترات في %{contexts}
       delete: إزالة
       empty: ليست لديك أية عوامل تصفية.
+      expires_in: تنتهي مدة صلاحيتها في غضون %{distance}
+      expires_on: تنتهي مدة صلاحيتها في %{date}
       title: عوامل التصفية
     new:
       save: حفظ عامل التصفية الجديد
       title: إضافة عامل تصفية جديد
     statuses:
       back_to_filter: العودة إلى عامل التصفية
+      batch:
+        remove: إزالة من الفلتر
       index:
+        hint: ينطبق الفلتر هذا على اختيار المنشورات الفردية بغض النظر عن المعايير الأخرى. يمكنك إضافة المزيد من المنشورات إلى هذا الفلتر من واجهة الويب.
         title: الرسائل المصفّاة
   footer:
     trending_now: المتداولة الآن
@@ -1083,6 +1144,7 @@ ar:
     changes_saved_msg: تم حفظ التعديلات بنجاح!
     copy: نسخ
     delete: احذف
+    deselect: إلغاء تحديد الكل
     none: لا شيء
     order_by: ترتيب بحسب
     save_changes: حفظ التغييرات
@@ -1098,6 +1160,7 @@ ar:
     invalid_markup: 'يحتوي على علامة HTML غير صالحة: %{error}'
   imports:
     errors:
+      invalid_csv_file: 'ملف CSV غير صالح. خطأ: %{error}'
       over_rows_processing_limit: يحتوي على أكثر من %{count} صف
     modes:
       merge: دمج
@@ -1195,8 +1258,12 @@ ar:
     carry_blocks_over_text: انتقل هذا المستخدم من %{acct}، الذي حَظرته أنت.
     carry_mutes_over_text: انتقل هذا المستخدم من %{acct}، الذي كتَمتَه أنت.
     copy_account_note_text: 'انتقل هذا المستخدم من %{acct}، إليك ملاحظاتك السابقة عنه:'
+  navigation:
+    toggle_menu: أظهار/أخفاء القائمة
   notification_mailer:
     admin:
+      report:
+        subject: "%{name} قام بإرسال تقرير"
       sign_up:
         subject: أنشأ %{name} حسابًا
     favourite:
@@ -1295,10 +1362,14 @@ ar:
     status: حالة الحساب
   remote_follow:
     missing_resource: تعذر العثور على رابط التحويل المطلوب الخاص بحسابك
+  reports:
+    errors:
+      invalid_rules: لا يشير إلى قواعد حقيقية
   rss:
     content_warning: 'تحذير عن المحتوى:'
     descriptions:
       account: منشورات للعلن مِن @%{acct}
+      tag: 'المنشورات العامة الموسومة #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: لقد تجاوزتَ حد الـ %{limit} منشورات مُبَرمَجة مسموح بها اليوم
     over_total_limit: لقد بلغت حد الـ %{limit} مِن المنشورات المبرمَجة
@@ -1331,6 +1402,7 @@ ar:
     platforms:
       adobe_air: أدوبي إيير
       android: أندرويد
+      blackberry: بلاك بيري
       chrome_os: نظام كروم أواس
       firefox_os: نظام فايرفكس أواس
       ios: نظام آي أواس
@@ -1512,9 +1584,11 @@ ar:
   user_mailer:
     appeal_approved:
       action: انتقل إلى حسابك
+      explanation: تمت الموافقة على استئناف السجل ضد حسابك في %{strike_date} الذي قدمته في %{appeal_date}. حسابك مرة أخرى في حالة جيدة.
       subject: تم قبول طعنك الذي قدمته بتاريخ %{date}
       title: تم قبول طعنك
     appeal_rejected:
+      explanation: تم رفض استئناف السجل ضد حسابك في %{strike_date} الذي قدمته في %{appeal_date}.
       subject: تم رفض طعنك الذي قدمته بتاريخ %{date}
       title: رُفض الاستئناف
     backup_ready:
@@ -1525,6 +1599,7 @@ ar:
       change_password: غيّر كلمتك السرية
       details: 'فيما يلي تفاصيل تسجيل الدخول:'
       explanation: لقد اكتشفنا تسجيل دخول إلى حسابك من عنوان IP جديد.
+      further_actions_html: إذا لم يكن هذا أنت، نوصي لك %{action} على الفور وتمكين المصادقة ذات العاملين للحفاظ على أمان حسابك.
       subject: تم النفاذ عبر حسابك من خلال عنوان إيبي جديد
       title: تسجيل دخول جديد
     warning:
@@ -1536,6 +1611,7 @@ ar:
       explanation:
         delete_statuses: لوحظ أنّ بعض منشوراتك تخالف واحدة أو أكثر من المبادئ التوجيهية للمجتمع وقد تم إزالتها إثر ذلك من قِبل مشرفي %{instance}.
         disable: تم إيقاف حسابك، لكن ملفك الشخصي وكافة بياناتك لا زالت سليمة. يمكنك طلب نسخة احتياطية من بياناتك وتغيير إعدادات حسابك أو حذفه.
+        mark_statuses_as_sensitive: بعض المنشورات الخاصة بك تم تمييزها على أنها حساسة من قبل مشرفي %{instance}. وهذا يعني أن الناس سيحتاجون إلى النقر على الوسائط في المنشورات قبل عرضها. يمكنك تصنيف الوسائط كحساسة عند نشرها في المستقبل.
         sensitive: من الآن فصاعدا، سيتم وضع علامة على جميع ملفات الوسائط التي يتم تحميلها على أنها حساسة وستكون مخفية خلف تحذير يُنقر.
         silence: لا يزال بإمكانك استخدام حسابك ولكن فقط الأشخاص الذين يتابعونك فقط يمكنهم رؤية منشوراتك على هذا الخادم، وقد يتم استبعادك من ميزات الاكتشاف المختلفة. قد يتبعك آخرون على كل حال يدوياً.
         suspend: لم يعد بإمكانك استخدام حسابك، والوصول إلى ملفك الشخصي والبيانات الأخرى. لا يزال بإمكانك تسجيل الدخول لطلب نسخة احتياطية من بياناتك حتى تتم إزالة البيانات بالكامل في غضون 30 يوما. ولكننا سنحتفظ ببعض البيانات الأساسية لمنعك من التهرب من عقوبة تعليق الحساب.
@@ -1544,19 +1620,25 @@ ar:
       subject:
         delete_statuses: تم إزالة منشوراتك على %{acct}
         disable: تم تجميد حسابك %{acct}
+        mark_statuses_as_sensitive: منشوراتك في %{acct} تم تصنيفها على أنها حساسة
         none: تحذير إلى %{acct}
+        sensitive: منشوراتك في %{acct} سيتم تمييزها على أنها حساسة من الآن فصاعدا
         silence: إنّ حسابك %{acct} محدود
         suspend: لقد تم تعليق حسابك %{acct}
       title:
         delete_statuses: منشورات محذوفة
         disable: الحساب مُجمَّد
+        mark_statuses_as_sensitive: منشورات مصنفه كحساسة
         none: تحذير
+        sensitive: حسابات مصنفه كحساسة
         silence: الحساب محدود
         suspend: الحساب مُعلَّق
     welcome:
       edit_profile_action: تهيئة الملف التعريفي
+      edit_profile_step: يمكنك تخصيص ملفك الشخصي عن طريق رفع صورة ملفك الشخصي, تغيير اسم العرض الخاص بك والمزيد. يمكنك اختيار مراجعة المتابعين الجدد قبل السماح لهم بمتابعتك.
       explanation: ها هي بعض النصائح قبل بداية الاستخدام
       final_action: اشرَع في النشر
+      final_step: 'ابدأ في النشر! حتى بدون متابعين، منشوراتك العامة قد يشاهدها آخرون، على سبيل المثال في التوقيت المحلي أو في الوسوم. قد ترغب في تقديم نفسك على وسم #introductions.'
       full_handle: عنوانك الكامل
       full_handle_hint: هذا هو ما يجب تقديمه لأصدقائك قصد أن يكون بإمكانهم متابَعتك أو مُراسَلتك حتى و إن كانت حساباتهم على خوادم أخرى.
       subject: أهلًا بك على ماستدون
diff --git a/config/locales/ast.yml b/config/locales/ast.yml
index 2236aaf88..0a85b4c9a 100644
--- a/config/locales/ast.yml
+++ b/config/locales/ast.yml
@@ -72,6 +72,7 @@ ast:
         enable_custom_emoji_html: "%{name} activó'l fustaxe «%{target}»"
         reject_user_html: "%{name} refugó'l rexistru de: %{target}"
         remove_avatar_user_html: "%{name} quitó l'avatar de: %{target}"
+        unblock_email_account_html: "%{name} desbloquió la direición de corréu electrónicu de: %{target}"
         update_announcement_html: "%{name} anovó l'anunciu «%{target}»"
         update_custom_emoji_html: "%{name} anovó'l fustaxe «%{target}»"
         update_status_html: "%{name} anovó l'artículu de: %{target}"
@@ -159,6 +160,8 @@ ast:
       no_file: Nun se seleicionó nengún ficheru
     follow_recommendations:
       language: Pa la llingua
+      status: Estáu
+      title: Recomendación de cuentes
     instances:
       availability:
         no_failures_recorded: Nun se rexistró nengún fallu.
@@ -311,6 +314,7 @@ ast:
       statuses:
         title: Artículos en tendencia
       tags:
+        current_score: 'Puntuación total: %{score}'
         dashboard:
           tag_accounts_measure: usos únicos
         listable: Pue suxerise
@@ -408,6 +412,7 @@ ast:
       web: Dir a la web
   challenge:
     hint_html: "<strong>Conseyu:</strong> nun vamos volver pidite la contraseña hasta dientro d'una hora."
+    prompt: Confirma la contraseña pa siguir
   crypto:
     errors:
       invalid_key: nun ye una clave ed25519 o curve25519 válida
@@ -759,6 +764,7 @@ ast:
     follow_limit_reached: Nun pues siguir a más de %{limit} persones
     invalid_otp_token: El códigu de l'autenticación en dos pasos nun ye válidu
     seamless_external_login: Aniciesti la sesión pente un serviciu esternu, polo que la configuración de la contraseña ya de la direición de corréu electrónicu nun tán disponibles.
+    signed_in_as: 'Aniciesti la sesión como:'
   verification:
     explanation_html: 'Pues <strong>verificate como la persona propietaria de los enllaces nos metadatos del to perfil</strong>. Pa ello, el sitiu web enllaciáu ha contener un enllaz al to perfil de Mastodon. Esti enllaz <strong>ha</strong> tener l''atributu <code>rel="me"</code>. El testu del enllaz nun importa. Equí tienes un exemplu:'
     verification: Verificación
diff --git a/config/locales/be.yml b/config/locales/be.yml
index 152f92ccc..de6ac186d 100644
--- a/config/locales/be.yml
+++ b/config/locales/be.yml
@@ -122,6 +122,8 @@ be:
       redownloaded_msg: Профіль %{username} паспяхова абноўлены за арыгіналу
       reject: Адхіліць
       rejected_msg: Заяўка на рэгістрацыю %{username} адхіленая
+      remote_suspension_irreversible: Даныя гэтага уліковага запісу былі незваротна выдалены.
+      remote_suspension_reversible_hint_html: Уліковы запіс быў прыпынены на сваім серверы і даныя будуць цалкам выдалены ад %{date}. Да гэтага аддалёны сервер можа аднавіць гэты уліковы запіс без якіх-небудзь шкодных наступстваў. Калі вы хочаце выдаліць усе даныя ўліковага запісу зараз, вы можаце зрабіць гэта ніжэй.
       remove_avatar: Выдаліць аватар
       remove_header: Выдаліць шапку
       removed_avatar_msg: Аватар %{username} выдалены
@@ -153,8 +155,8 @@ be:
       subscribe: Падпіска
       suspend: Прыпыніць
       suspended: Прыпынена
-      suspension_irreversible: Даныя гэтага ўліковага запісу былі канчаткова выдалены. Вы можаце аднавіць уліковы запіс каб зрабіць яго зноў працоўным, але гэта не адновіць даныя якія былі змешчаны на ім раней.
-      suspension_reversible_hint_html: Уліковы запіс быў прыпынены і даныя будуць цалкам выдалены ад %{date}. Дагэтуль уліковы запіс можа быць адноўлены без якіх-небудзь шкодных наступстваў. Калі вы хочаце вынішчыць усе даныя ўліковага запісу зараз, вы можаце зрабіць гэта ніжэй.
+      suspension_irreversible: Даныя гэтага ўліковага запісу былі канчаткова выдалены. Вы можаце аднавіць уліковы запіс, каб зрабіць яго зноў працоўным, але гэта не адновіць даныя якія былі змешчаны на ім раней.
+      suspension_reversible_hint_html: Уліковы запіс быў прыпынены і даныя будуць цалкам выдалены ад %{date}. Да гэтага ўліковы запіс можа быць адноўлены без якіх-небудзь шкодных наступстваў. Калі вы хочаце выдаліць усе даныя ўліковага запісу зараз, вы можаце зрабіць гэта ніжэй.
       title: Уліковыя запісы
       unblock_email: Разблакіраваць адрас эл. пошты
       unblocked_email_msg: Электронная пошта %{username} паспяхова разблакіраваная
@@ -425,6 +427,11 @@ be:
       view: Праглядзець новы блок дамену
     email_domain_blocks:
       add_new: Дадаць
+      attempts_over_week:
+        few: "%{count} спробы рэгіістрацыі за апошні тыдзень"
+        many: "%{count} спроб рэгіістрацыі за апошні тыдзень"
+        one: "%{count} спроба рэгістрацыі за апошні тыдзень"
+        other: "%{count} спроб рэгіістрацыі за апошні тыдзень"
       created_msg: Дамен эл. пошты паспяхова заблакіраваны
       delete: Выдаліць
       dns:
@@ -533,7 +540,7 @@ be:
       total_followed_by_us: Нашыя падпіскі
       total_reported: Скаргі на іх
       total_storage: Медыя дадаткі
-      totals_time_period_hint_html: Паказаныя агульныя значэнні ніжэй утрымліваюць дадзеныя за ўвесь час.
+      totals_time_period_hint_html: Паказаныя агульныя значэнні ніжэй уключаюць даныя за ўвесь час.
     invites:
       deactivate_all: Дэактываваць усё
       filter:
@@ -578,7 +585,6 @@ be:
     report_notes:
       created_msg: Скарга паспяхова створана!
       destroyed_msg: Скарга паспяхова выдалена!
-      today_at: Сёння а %{time}
     reports:
       account:
         notes:
@@ -727,6 +733,9 @@ be:
       content_retention:
         preamble: Кантралюйце, як створаны карыстальнікамі кантэнт захоўваецца ў Mastodon.
         title: Утрыманне кантэнту
+      default_noindex:
+        desc_html: Уплывае на ўсіх карыстальнікаў, якія не змянілі гэтую наладу самастойна
+        title: Перадвызначана выключыць карыстальнікаў з індэксацыі пашуковымі рухавікамі
       discovery:
         follow_recommendations: Выконвайце рэкамендацыі
         preamble: Прадстаўленне цікавага кантэнту дапамагае прыцягнуць новых карыстальнікаў, якія могуць не ведаць нікога на Mastodon. Кантралюйце працу розных функцый выяўлення на вашым серверы.
@@ -928,6 +937,7 @@ be:
         title: Папулярныя допісы
       new_trending_tags:
         no_approved_tags: Зараз няма зацверджаных папулярных хэштэгаў.
+        requirements: 'Кожны з гэтых кандыдатаў можа перавысіць #%{rank} зацверджаных папулярных хэштэгаў. Зараз гэта #%{lowest_tag_name} з лікам %{lowest_tag_score}.'
         title: Папулярныя хэштэгі
       subject: Новае ў папулярным для разгляду %{instance}
   aliases:
@@ -977,6 +987,7 @@ be:
     forgot_password: Забылі свой пароль?
     invalid_reset_password_token: Токен для скідвання пароля несапраўдны або састарэў. Зрабіце запыт на новы.
     link_to_otp: Увядзіце код двухфактарнай аўтэнтыфікацыі з вашага тэлефона або код аднаўлення
+    link_to_webauth: Скарыстайцеся вашай прыладай з ключом бяспекі
     log_in_with: Увайсці праз
     login: Увайсці
     logout: Выйсці
@@ -1000,8 +1011,12 @@ be:
       email_below_hint_html: Калі прыведзены ніжэй адрас эл. пошты няправільны, вы можаце змяніць яго тут і атрымаць новае пацвярджэнне па эл. пошце.
       email_settings_hint_html: Ліст з пацвярджэннем быў адпраўлены на %{email}. Калі гэты адрас эл. пошты няправільны, вы можаце змяніць яго ў наладах уліковага запісу.
       title: Налады
+    sign_in:
+      preamble_html: Уваход з уліковымі дадзенымі <strong>%{domain}</strong>. Калі ваш уліковы запіс знаходзіцца на іншым серверы, у вас не атрымаецца ўвайсці тут.
+      title: Уваход у %{domain}
     sign_up:
       preamble: Маючы ўліковы запіс на гэтым серверы Mastodon, вы будзеце мець магчымасць падпісацца на кожнага чалавека ў сетцы, незалежна ад таго, на якім серверы размешчаны ягоны ўліковы запіс.
+      title: Наладзьма вас на %{domain}.
     status:
       account_status: Стан уліковага запісу
       confirming: Чакаецца пацвярджэнне з электроннай пошты.
@@ -1136,6 +1151,7 @@ be:
     add_new: Дадаць новы
     errors:
       limit: Вы ўжо дадалі максімальную колькасць хэштэгаў
+    hint_html: "<strong>Што такое выбраныя хэштэгі?</strong> Яны паказваюцца на бачным месцы вашага профілю і дазваляюць людзям праглядаць вашыя публічныя пасты з гэтымі хэштэгамі. З іхняй дапамогай вельмі зручна сачыць за творчымі ці даўгатэрміновымі праектамі."
   filters:
     contexts:
       account: Профілі
@@ -1147,8 +1163,10 @@ be:
       add_keyword: Дадаць ключавое слова
       keywords: Ключавыя словы
       statuses: Асобныя допісы
+      statuses_hint_html: Гэты фільтр ужываецца каб абраць асобныя запісы незалежна ад таго, ці ўтрымліваюць яны ключавыя словы са спісу ніжэй.<a href="%{path}">Праверце ці выдаліце допісы з фільтру</a>.
       title: Рэдагаваць фільтр
     errors:
+      deprecated_api_multiple_keywords: Гэтыя параметры нельга памяняць з бягучай праграмы таму што яны ўжываюцца для больш чым аднаго ключавога слова. Скарыстайцеся навейшай версіяй праграмы ці вэб-інтэрфейсам.
       invalid_context: Дадзены кантэкст недастатковы альбо памылковы
     index:
       contexts: Фільтры ў %{contexts}
@@ -1287,6 +1305,7 @@ be:
       missing_also_known_as: гэта не псеўданім уліковага запісу
       move_to_self: не можа быць бягучым уліковым запісам
       not_found: не знойдзена
+      on_cooldown: Вас часова замарозілі
     followers_count: Падпісчыкі на момант перамяшчэння
     incoming_migrations: Пераязджаем з іншага ўліковага запісу
     incoming_migrations_html: Каб перайсці з іншага ўліковага запісу ў гэты, спачатку трэба <a href="%{path}">стварыць псеўданім уліковага запісу</a>.
@@ -1564,6 +1583,7 @@ be:
     ignore_favs: Ігнараваць упадабаныя
     ignore_reblogs: Ігнараваць пашырэнні
     interaction_exceptions: Выключэнні, заснаваныя на ўзаемадзеянні
+    interaction_exceptions_explanation: Звярніце ўвагу, што няма гарантыі выдалення пастоў, калі колькасць іх упадабанняў ці пашырэннняў упадзе ніжэй за ліміт, хаця некалі гэтая колькасць перавышала яго.
     keep_direct: Захаваць асабістыя паведамленні
     keep_direct_hint: Не выдаляць асабістыя паведамленні
     keep_media: Захоўваць допісы з медыя дадаткамі
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index 1d210f156..9608fdbfb 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -1,10 +1,10 @@
 ---
 bg:
   about:
-    about_mastodon_html: 'Социалната мрежа на бъдещето: Без реклами, без корпоративно наблюдение, с етичен дизайн и децентрализация! Притежавайте своите данни с Mastodon!'
+    about_mastodon_html: 'Социалната мрежа на бъдещето: Без реклами, без корпоративно наблюдение, с нравствено оформление и децентрализиране! Притежавайте данните си с Mastodon!'
     contact_missing: Не е зададено
     contact_unavailable: Не е приложимо
-    hosted_on: Mastodon е хостван на %{domain}
+    hosted_on: Mastodon е разположен на хост %{domain}
     title: Относно
   accounts:
     follow: Последвай
@@ -12,7 +12,7 @@ bg:
       one: Последовател
       other: Последователи
     following: Следва
-    instance_actor_flash: Този профил е виртуално действащо лице, представляващо сървъра, а не индивидуален потребител. Използва се за федериране и не бива да бъде преустановен.
+    instance_actor_flash: Акаунтът е виртуално действащо лице, представляващо сървъра, а не отделен потребител. Използва се за федерацията и не бива да се спира.
     last_active: последна дейност
     link_verified_on: Собствеността върху тази връзка е проверена на %{date}
     nothing_here: Тук няма нищо!
@@ -29,11 +29,11 @@ bg:
     account_moderation_notes:
       create: Оставяне на бележка
       created_msg: Бележката за модерация е създадена успешно!
-      destroyed_msg: Бележката за модерация е успешно унищожена!
+      destroyed_msg: Успешно унищожена бележка за модериране!
     accounts:
-      add_email_domain_block: Блокиране на имейл домейн
+      add_email_domain_block: Блокиране на домейн на имейл
       approve: Одобряване
-      approved_msg: Успешно одобрена заявка за регистрация на %{username}
+      approved_msg: Успешно одобрена заявка за регистриране на %{username}
       are_you_sure: Сигурни ли сте?
       avatar: Аватар
       by_domain: Домейн
@@ -59,7 +59,7 @@ bg:
       destroyed_msg: Данните на %{username} вече са на опашка за незабавно изтриване
       disable: Замразяване
       disable_sign_in_token_auth: Изключване на удостоверяването с маркер по имейл
-      disable_two_factor_authentication: Изключване на 2FA
+      disable_two_factor_authentication: Изключване на 2факт. удостов.
       disabled: Замразено
       display_name: Показвано име
       domain: Домейн
@@ -76,26 +76,26 @@ bg:
       inbox_url: Входящ URL
       invite_request_text: Причини за присъединяване
       invited_by: Покана от
-      ip: IP
+      ip: IP адрес
       joined: Присъединено
       location:
         all: Всичко
         local: Локално
-        remote: Дистанционно
+        remote: Отдалечено
         title: Местоположение
       login_status: Състояние на вход
       media_attachments: Прикачена мултимедия
       memorialize: Възпоминание
-      memorialized: Възпоминателен
+      memorialized: Възпоминато
       memorialized_msg: Успещно превръщане на %{username} във възпоминателен профил
       moderation:
-        active: Активно
+        active: Дейно
         all: Всичко
-        pending: Чакащо
+        pending: Чака
         silenced: Ограничено
         suspended: Спряно
-        title: Модерация
-      moderation_notes: Модераторни бележки
+        title: Модериране
+      moderation_notes: Бележки за модериране
       most_recent_activity: Последна дейност
       most_recent_ip: Последен IP
       no_account_selected: Нито един акаунт не е променен, тъй като нито един не е избран
@@ -104,26 +104,28 @@ bg:
       not_subscribed: Без абонамент
       pending: Изчаква преглед
       perform_full_suspension: Спиране
-      previous_strikes: Предишни провинения
+      previous_strikes: Предишни нарушения
       previous_strikes_description_html:
-        one: "Този профил има \n <strong>едно</strong> провинение."
-        other: Този профил има <strong>%{count}</strong> провинения.
+        one: Този акаунт има <strong>едно</strong> нарушение.
+        other: Този акунт има <strong>%{count}</strong> нарушения.
       promote: Повишаване
       protocol: Протокол
       public: Публично
       push_subscription_expires: PuSH абонаментът изтича
       redownload: Опресняване на профил
-      redownloaded_msg: Успешно обновяване на профила на %{username} от източника
+      redownloaded_msg: Успешно опреснен профил на %{username} от източника
       reject: Отхвърляне
-      rejected_msg: Успешно отхвърлена заявка за регистрация на %{username}
+      rejected_msg: Успешно отхвърлена заявка за регистрация на приложението на %{username}
+      remote_suspension_irreversible: Данните на този акаунт са необратимо изтрити.
+      remote_suspension_reversible_hint_html: Акаунтът е бил преустановен на своя сървър и данните ще бъдат напълно премахнати на %{date}. Дотогава отдалеченият сървър може да възстанови този акаунт без щети. Ако желаете да премахнете всички данни за акаунта незабавно, можете да го сторите по-долу.
       remove_avatar: Премахване на аватар
-      remove_header: Премахване на заглавна част
-      removed_avatar_msg: Успешно премахване на изображението на аватара на %{username}
-      removed_header_msg: Успешно премахване на заглавното изображение на %{username}
+      remove_header: Премахване на заглавката
+      removed_avatar_msg: Успешно премахнат образ на аватара на %{username}
+      removed_header_msg: Успешно премахнат образ на заглавката на %{username}
       resend_confirmation:
-        already_confirmed: Този потребител вече е потвърден
-        send: Повторно изпращане на имейла за потвърждение
-        success: Успешно изпращане на имейла за потвърждение!
+        already_confirmed: Потребителят вече е потвърден
+        send: Повторно изпращане на имейл за потвърждение
+        success: Успешно изпратено е-писмо за потвърждение!
       reset: Нулиране
       reset_password: Нулиране на паролата
       resubscribe: Абониране пак
@@ -134,8 +136,8 @@ bg:
       security_measures:
         only_password: Само парола
         password_and_2fa: Парола и двуфакторно удостоверяване
-      sensitive: Чувствителен
-      sensitized: Отбелязано като деликатно съдържание
+      sensitive: Деликатен
+      sensitized: Отбелязано като деликатно
       shared_inbox_url: URL адрес на споделена входяща кутия
       show:
         created_reports: Докладвания
@@ -147,69 +149,170 @@ bg:
       subscribe: Абониране
       suspend: Спиране
       suspended: Спряно
-      suspension_irreversible: Данните на този профил са безвъзвратно изтрити. Можете да възстановите достъпа на този профил, за да може да бъде отново използван, но данните отпреди няма да бъдат възстановени.
-      suspension_reversible_hint_html: Този профил е преустановен и данните от него ще бъдат напълно премахнати на %{date}. До тази дата профилът може да бъде възстановен без щети. Ако желаете, по-долу можете да премахнете всички данни от профила незабавно.
+      suspension_irreversible: Данните на този акаунт са безвъзвратно изтрити. Може да възстановите достъпа до акаунта, за да може да се използва пак, но предишните данни няма да се възстановят.
+      suspension_reversible_hint_html: Акаунтът е спрян и данните от него ще бъдат напълно премахнати на %{date}. До тогава акаунтът може да се възстанови без лоши ефекти. Ако желаете, по-долу може да премахнете всички данни от акаунта незабавно.
       title: Акаунти
       unblock_email: Отблокиране на адреса на имейла
-      unblocked_email_msg: Успешно разблокиране на имейл адреса на %{username}
+      unblocked_email_msg: Успешно отблокиран адрес на имейла на %{username}
       unconfirmed_email: Непотвърден имейл
       undo_sensitized: Нeчувствителен
       undo_silenced: Отмяна на ограничението
-      undo_suspension: Връщане на достъпа
-      unsilenced_msg: Успешно премахване на ограниченията върху профила на %{username}
-      unsubscribe: Отписване
-      unsuspended_msg: Успешно връщане на достъпа до профила на %{username}
+      undo_suspension: Отмяна на спирането
+      unsilenced_msg: Успешна отмяна на ограниченията върху акаунта на %{username}
+      unsubscribe: Без абонамент
+      unsuspended_msg: Успешно връщане на достъпа до акаунта на %{username}
       username: Потребителско име
-      view_domain: Виж резюмето на домейна
+      view_domain: Преглед на обобщение за домейна
       warn: Предупреждение
       web: Уеб
       whitelisted: Позволено за федерацията
     action_logs:
       action_types:
-        approve_appeal: Одобри иска
+        approve_appeal: Одобряване на обжалването
         approve_user: Одобряване на потребител
-        assigned_to_self_report: Назначи отчет
+        assigned_to_self_report: Назначете доклад
         change_email_user: Промяна на имейл за потребител
         change_role_user: Промяна на роля за потребител
         confirm_user: Потвърждаване на потребител
         create_account_warning: Създаване на предупреждение
         create_announcement: Създаване на оповестяване
-        create_canonical_email_block: Създаване на имейл блокировка
+        create_canonical_email_block: Създаване на блокировка на имейл
         create_custom_emoji: Създаване на персонализирано емоджи
-        create_ip_block: Създаване на IP правило
+        create_domain_allow: Създаване на позволение за домейна
+        create_domain_block: Създаване на блокиране за домейна
+        create_email_domain_block: Създаване за блокиране на имейл домейна
+        create_ip_block: Създаване на правило за IP
+        create_unavailable_domain: Създаване на недостъпен домейн
         create_user_role: Създаване на роля
         demote_user: Понижаване на потребител
         destroy_announcement: Изтриване на оповестяване
-        destroy_canonical_email_block: Изтриване на имейл блокировка
+        destroy_canonical_email_block: Изтриване на блокировка за имейл
         destroy_custom_emoji: Изтриване на персонализирано емоджи
+        destroy_domain_allow: Изтриване на позволението за домейн
+        destroy_domain_block: Изтриване на блокирането за домейна
+        destroy_email_domain_block: Изтриване на блокирането за домейн на имейла
+        destroy_instance: Чистка на домейна
         destroy_ip_block: Изтриване на правило за IP
-        destroy_status: Изтриване на статус
-        destroy_unavailable_domain: Изтриване на неналичен домейн
+        destroy_status: Изтриване на публикация
+        destroy_unavailable_domain: Изтриване на недостъпен домейн
         destroy_user_role: Унищожаване на роля
-        disable_2fa_user: Деактивиране на 2FA
+        disable_2fa_user: Изкл. на 2факт.удостов.
         disable_custom_emoji: Деактивиране на персонализирано емоджи
-        disable_user: Деактивиране на потребител
-        enable_custom_emoji: Активиране на персонализирано емоджи
+        disable_sign_in_token_auth_user: Изключване на удостоверяването с код по имейл за потребителя
+        disable_user: Изключване на потребител
+        enable_custom_emoji: Включване на персонализирано емоджи
+        enable_sign_in_token_auth_user: Включване на удостоверяването с код по имейл за потребителя
         enable_user: Активиране на потребител
-        memorialize_account: Запомни потребителя
+        memorialize_account: Възпоменаване на акаунта
         promote_user: Повишаване на потребител
-        remove_avatar_user: Премахване на аватар
-        reopen_report: Повторно отваряне на доклад
-        resend_user: Повторно изпращане на имейла за потвърждение
-        reset_password_user: Нулиране на парола
-        silence_account: Ограничи Акаунта
-        suspend_account: Прекрати акаунта
-        unblock_email_account: Разблокирай Email адреса
+        reject_appeal: Отхвърляне на обжалването
+        reject_user: Отхвърляне на потребителя
+        remove_avatar_user: Премахване на аватара
+        reopen_report: Отваряне пак на доклад
+        resend_user: Изпращане пак на е-писмо за потвърждение
+        reset_password_user: Задаване на нова парола
+        resolve_report: Отстраняване на доклада
+        sensitive_account: Деликатен акаунт
+        silence_account: Ограничаване на акаунта
+        suspend_account: Преустановяване на акаунта
+        unassigned_report: Оттегляне на доклада
+        unblock_email_account: Отблокиране на адреса на имейла
+        unsensitive_account: Отмяна на акаунта като деликатен
+        unsilence_account: Отмяна на ограничението за акаунта
+        unsuspend_account: Връщане на акаунта
+        update_announcement: Обновяване на оповестяването
+        update_custom_emoji: Обновяване на персонализираното емоджи
+        update_domain_block: Обновяване на блокирането за домейна
         update_ip_block: Обновяване на правило за IP
         update_status: Обновяване на публикация
-        update_user_role: Обновяване на роля
+        update_user_role: Обновяване на ролята
+      actions:
+        approve_appeal_html: "%{name} одобри обжалването на решение за модериране от %{target}"
+        approve_user_html: "%{name} одобри регистрирането от %{target}"
+        assigned_to_self_report_html: "%{name} назначете доклада %{target} на себе си"
+        change_email_user_html: "%{name} промени адреса на имейла на потребителя %{target}"
+        change_role_user_html: "%{name} промени ролята на %{target}"
+        confirm_user_html: "%{name} потвърди адреса на имейла на потребителя %{target}"
+        create_account_warning_html: "%{name} изпрати предупреждение до %{target}"
+        create_announcement_html: "%{name} създаде ново оповестяване %{target}"
+        create_canonical_email_block_html: "%{name} блокира имейл с хеш %{target}"
+        create_custom_emoji_html: "%{name} качи ново емоджи %{target}"
+        create_domain_allow_html: "%{name} позволи федерирането с домейн %{target}"
+        create_domain_block_html: "%{name} блокира домейн %{target}"
+        create_email_domain_block_html: "%{name} блокира домейн на имейл %{target}"
+        create_ip_block_html: "%{name} създаде правило за IP %{target}"
+        create_unavailable_domain_html: "%{name} спря доставянето до домейн %{target}"
+        create_user_role_html: "%{name} създаде роля %{target}"
+        demote_user_html: "%{name} понижи потребителя %{target}"
+        destroy_announcement_html: "%{name} изтри оповестяване %{target}"
+        destroy_canonical_email_block_html: "%{name} отблокира имейла с хеш %{target}"
+        destroy_custom_emoji_html: "%{name} изтри емоджито %{target}"
+        destroy_domain_allow_html: "%{name} забрани федерирация с домейн %{target}"
+        destroy_domain_block_html: "%{name} отблокира домейн %{target}"
+        destroy_email_domain_block_html: "%{name} отблокира домейн на имейл %{target}"
+        destroy_instance_html: "%{name} прочисти домейн %{target}"
+        destroy_ip_block_html: "%{name} изтри правило за IP %{target}"
+        destroy_status_html: "%{name} премахна публикация от %{target}"
+        destroy_unavailable_domain_html: "%{name} възобнови доставката до домейн %{target}"
+        destroy_user_role_html: "%{name} изтри роля %{target}"
+        disable_2fa_user_html: "%{name} изключи двуфакторното изискване за потребител %{target}"
+        disable_custom_emoji_html: "%{name} изключи емоджито %{target}"
+        disable_sign_in_token_auth_user_html: "%{name} деактивира удостоверението с код по имейл за %{target}"
+        disable_user_html: "%{name} изключи влизането за потребител %{target}"
+        enable_custom_emoji_html: "%{name} включи емоджито %{target}"
+        enable_sign_in_token_auth_user_html: "%{name} активира удостоверението с код по имейл за %{target}"
+        enable_user_html: "%{name} включи влизането за потребител %{target}"
+        memorialize_account_html: "%{name} превърна акаунта на %{target} във възпоменателна страница"
+        promote_user_html: "%{name} повиши потребителя %{target}"
+        reject_appeal_html: "%{name} отхвърли обжалването на решение за модериране от %{target}"
+        reject_user_html: "%{name} отхвърли регистрирането от %{target}"
+        remove_avatar_user_html: "%{name} премахна аватара на %{target}"
+        reopen_report_html: "%{name} отвори пак доклада на %{target}"
+        resend_user_html: "%{name} изпрати пак е-писмо за потвърждение за %{target}"
+        reset_password_user_html: "%{name} нулира паролата на потребител %{target}"
+        resolve_report_html: "%{name} разреши случая с доклада от %{target}"
+        sensitive_account_html: "%{name} означи мултимедия на %{target} като деликатна"
+        silence_account_html: "%{name} сложи ограничения на акаунта на %{target}"
+        suspend_account_html: "%{name} преустанови акаунта на %{target}"
+        unassigned_report_html: "%{name} оттегли доклада на %{target}"
+        unblock_email_account_html: "%{name} разблокира адреса на имейла на %{target}"
+        unsensitive_account_html: "%{name} размаркира мултимедия на %{target} като деликатна"
+        unsilence_account_html: "%{name} отмени ограниченията на акаунта на %{target}"
+        unsuspend_account_html: "%{name} върна обратно акаунта на %{target}"
+        update_announcement_html: "%{name} обнови оповестяването на %{target}"
+        update_custom_emoji_html: "%{name} обнови емоджито %{target}"
+        update_domain_block_html: "%{name} обнови блокирането на домейна за %{target}"
+        update_ip_block_html: "%{name} промени правило за IP на %{target}"
+        update_status_html: "%{name} обнови публикация от %{target}"
+        update_user_role_html: "%{name} промени ролята %{target}"
       deleted_account: изтрит акаунт
+      empty: Няма намерени дневници.
+      filter_by_action: Филтриране по действие
+      filter_by_user: Филтриране по потребител
+      title: Одитен дневник
     announcements:
+      destroyed_msg: Успешно изтрито оповестяване!
+      edit:
+        title: Редактиране на оповестянето
+      empty: Няма намерени оповестявания.
       live: На живо
+      new:
+        create: Създаване на оповестяване
+        title: Ново оповестяване
       publish: Публикуване
+      published_msg: Успешно публикувано оповестяване!
+      scheduled_for: Насрочено за %{time}
+      scheduled_msg: Насрочено оповестяване за публикуване!
+      title: Оповестявания
+      unpublish: Без публикуване
+      unpublished_msg: Успешно скрито оповестяване!
+      updated_msg: Успешно осъвременено оповестяване!
     custom_emojis:
+      assign_category: Категоризиране
       by_domain: Домейн
+      copied_msg: Успешно създадено локално копие на емоджито
       copy: Копиране
+      copy_failed_msg: Не можа да се направи локално копие на това емоджи
       create_new_category: Създаване на нова категория
       created_msg: Успешно сътворено емоджи!
       delete: Изтриване
@@ -226,12 +329,15 @@ bg:
       listed: В списъка
       new:
         title: Добавяне на ново потребителско емоджи
+      no_emoji_selected: Нито едно емоджи не е променено, тъй като нито едно не е избрано
       not_permitted: Нямате право да извършвате това действие
       overwrite: Презаписване
       shortcode: Кратък код
       shortcode_hint: Поне 2 символа, само азбучно-цифрови символи и долни черти
       title: Потребителски емоджита
       uncategorized: Некатегоризирано
+      unlist: Премахване от списъка
+      unlisted: Извънсписъчно
       update_failed_msg: Не може да се обнови това емоджи
       updated_msg: Успешно осъвременено емоджи!
       upload: Качване
@@ -241,9 +347,22 @@ bg:
       media_storage: Мултимедийно хранилище
       new_users: нови потребители
       opened_reports: отворени доклади
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> чакащо обжалване"
+        other: "<strong>%{count}</strong> чакащи обжалвания"
+      pending_reports_html:
+        one: "<strong>%{count}</strong> чакащ доклад"
+        other: "<strong>%{count}</strong> чакащи доклади"
+      pending_tags_html:
+        one: "<strong>%{count}</strong> чакащ хаштаг"
+        other: "<strong>%{count}</strong> чакащи хаштагове"
+      pending_users_html:
+        one: "<strong>%{count}</strong> чакащ потребител"
+        other: "<strong>%{count}</strong> чакащи потребители"
       resolved_reports: разрешени доклади
       software: Софтуер
-      space: Използвано пространство
+      sources: Източници на регистрации
+      space: Използвано място
       title: Табло за управление
       top_languages: Водещи дейни езици
       top_servers: Водещи дейни сървъри
@@ -252,13 +371,52 @@ bg:
       appeals:
         empty: Няма намерени обжалвания.
         title: Жалби
+    domain_allows:
+      add_new: Позволявам федерацията с домейна
+      created_msg: Домейнът е успешно позволен за федерацията
+      destroyed_msg: Домейнът е забранен от федерацията
+      export: Износ
+      import: Внос
+      undo: Забрана на федерацията с домейна
     domain_blocks:
+      add_new: Добавяне на ново блокиране за домейна
+      created_msg: Блокирането на домейна се обработва
+      destroyed_msg: Блокирането на домейна е отменено
       domain: Домейн
+      edit: Редактиране на блокирането на домейна
+      existing_domain_block: Вече сте наложили строги ограничения на %{name}.
+      existing_domain_block_html: Вече сте наложили строги ограничения за %{name} и трябва първо да <a href="%{unblock_url}">премахнете блокирането</a>.
+      export: Износ
+      import: Внос
+      new:
+        create: Създаване на блокада
+        hint: Блокирането на домейн няма да предотврати създаването на записи на акаунти в базата от данни, но със задна дата и автоматично ще се приложат определени методи за модериране на тези акаунти.
+        severity:
+          desc_html: "<strong>Ограничаване</strong> ще скрие публикациите от акаунти в този домейн за всеки, който не ги следва. <strong>Преустановяване</strong> ще премахне всякакво съдържание, мултимедия и профилни данни за акаунтите в този домейн от вашия сървър. Използвайте <strong>Без</strong>, ако искате просто да забраните мултимедийни файлове."
+          noop: Без
+          silence: Ограничаване
+          suspend: Преустановяване
+        title: Ново блокиране на домейн
+      no_domain_block_selected: Нищо не е променяно, защото няма избрани блокирания на домейн
+      not_permitted: Нямате право да извършвате действието
+      obfuscate: Замъгляване на името на домейна
+      obfuscate_hint: Частично замъгляване на името на домейна в списъка, ако е включено рекламирането на списъка с ограничения на домейни
       private_comment: Личен коментар
       private_comment_hint: Коментирането за това ограничение на домейна за вътрешна употреба от модераторите.
+      public_comment: Публичен коментар
+      public_comment_hint: Оставяне на коментар за ограничението на домейна за широката публика, ако рекламирането на списъка с ограниченията на домейни е включено.
+      reject_media: Отхвърляне на мултимедийните файлове
+      reject_media_hint: Премахва локално запазени мултимедийни файлове и отказва да сваля такива в бъдеще. Неподходящо в случай на преустановяване
+      reject_reports: Отхвърляне на докладите
+      reject_reports_hint: Пренебрегване на всички доклади, идващи от този домейн. Неподходящо в случай на преустановяване
       undo: Отмяна на блокиране на домейн
       view: Преглед на блокиране на домейн
     email_domain_blocks:
+      add_new: Добавяне на ново
+      attempts_over_week:
+        one: "%{count} опит за изминалата седмица"
+        other: "%{count} опита за регистрация през изминалата седмица"
+      created_msg: Успешно блокиран домейн на е-поща
       delete: Изтриване
       dns:
         types:
@@ -266,40 +424,101 @@ bg:
       domain: Домейн
       new:
         create: Добавяне на домейн
+        resolve: Преобразуване на домейна
+        title: Блокиране на нов домейн на имейл
+      no_email_domain_block_selected: Няма промяна, тъй като няма избрани блокирания на имейл домейн
+      resolved_dns_records_hint_html: Името на домейна се преобразува към следните MX домейни, които са основно отговорни за получаване на имейл. Блокирането на MX домейн блокира записването от всеки имейл, използващ същия MX домейн, дори видимото име на домейна да е различно. <strong>Бъдете внимателни и не блокирайте често-срещани доставчици на имейл</strong>
+      resolved_through_html: Преобразувано чрез %{domain}
       title: Блокирани домейни на имейл
+    export_domain_allows:
+      new:
+        title: Импортиране на позволенията на домейни
+      no_file: Няма избран файл
     export_domain_blocks:
       import:
-        existing_relationships_warning: Съществуващи последвания
+        description_html: На път сте да внесете списък с блокирания на домейни. Прегледайте списъка много внимателно, особено ако самите вие не сте автор на този списък.
+        existing_relationships_warning: Съществуващи отношения във вид на следване
+        private_comment_description_html: 'За по-лесно проследяване откъде идват внесените блокирания, те ще се създадат със следния личен коментар: <q>%{comment}</q>'
+        private_comment_template: Внесено от %{source} на %{date}
+        title: Внос на блокирания на домейни
+      new:
+        title: Внос на блокирания на домейни
+      no_file: Няма избран файл
     follow_recommendations:
+      description_html: "<strong>Препоръките за следване помагат на новите потребители бързо да намерят ново съдържание</strong>. Когато един потребител не е създавал достатъчно връзки, за да формира свои собствени препоръки за следване, тези акаунти ще бъдат препоръчани. Акаунтите ще бъдат генерирани всеки ден на базата на най-голяма скорошна ангажираност и най-голям брой местни последователи за даден език."
       language: За език
       status: Състояние
+      suppress: Забрана на препоръките за следване
+      suppressed: Забранени
+      title: Препоръки за следване
+      unsuppress: Възстановяване на препоръките за следване
     instances:
+      availability:
+        description_html:
+          one: Ако доставянето до домейна не е успешно за <strong>%{count} ден</strong>, няма да има последващи опити, докато не се получи доставка <em>от</em> домейна.
+          other: Ако доставянето до домейна не е успешно за <strong>%{count} дни</strong>, няма да има последващи опити, докато не се получи доставка <em>от</em> домейна.
+        failure_threshold_reached: Прагът за броя грешки е достигнат на %{date}.
+        failures_recorded:
+          one: Неуспешен опит в %{count} ден.
+          other: Неуспешни опити в %{count} различни дни.
+        no_failures_recorded: Няма записани неуспешни опити.
+        title: Наличност
+        warning: Последният опит за свързване с този сървър беше неуспешен
       back_to_all: Всичко
       back_to_limited: Ограничено
       back_to_warning: Предупреждение
       by_domain: Домейн
+      confirm_purge: Наистина ли искате завинаги да изтриете данните от този домейн?
       content_policies:
+        comment: Вътрешна бележка
+        description_html: Може да определите политиките за съдържание, които ще се приложат към всички акаунти от този домейн и всеки от поддомейните му.
         policies:
+          reject_media: Отхвърляне на мултимедия
+          reject_reports: Отхвърляне на докладите
           silence: Ограничение
+          suspend: Преустановяване
         policy: Политика
+        reason: Обществена причина
+        title: Политика на съдържанието
       dashboard:
+        instance_accounts_dimension: Най-следвани акаунти
+        instance_accounts_measure: запазени акаунти
+        instance_followers_measure: наши последователи там
+        instance_follows_measure: техни последователи тук
         instance_languages_dimension: Водещи езици
+        instance_media_attachments_measure: запазена прикачена мултимедия
+        instance_reports_measure: доклади за тях
+        instance_statuses_measure: съхранени публикации
       delivery:
+        all: Всичко
         clear: Изчистване на грешките за доставка
+        failing: Неуспех
         restart: Рестартиране на доставката
         stop: Спиране на доставката
         unavailable: Неналично
       delivery_available: Доставката е налична
       delivery_error_days: Грешни дни на доставяне
+      delivery_error_hint: Ако доставката не е възможна за %{count} дни, автоматично ще бъде маркирана като невъзможно за доставка.
+      destroyed_msg: Данните от %{domain} са добавени към опашката за незабавно изтриване.
       empty: Няма намерени домейни.
+      known_accounts:
+        one: "%{count} известен акаунт"
+        other: "%{count} известни акаунти"
       moderation:
         all: Всичко
         limited: Ограничено
         title: Mодериране
+      private_comment: Личен коментар
+      public_comment: Публичен коментар
+      purge: Чистка
+      purge_description_html: Ако считате, че този домейн е офлайн завинаги, можете да изтриете всички записи за акаунти и прилежащи данни за този домейн от вашата памет. Това може да отнеме известно време.
       title: Федерация
       total_blocked_by_us: Блокирано от нас
       total_followed_by_them: Последвани от тях
       total_followed_by_us: Последвано от нас
+      total_reported: Доклади за тях
+      total_storage: Прикачена мултимедия
+      totals_time_period_hint_html: Общите стойности, показани по-долу, включват данни за всички времена.
     invites:
       deactivate_all: Деактивиране на всички
       filter:
@@ -310,6 +529,7 @@ bg:
       title: Покани
     ip_blocks:
       add_new: Създаване на правило
+      created_msg: Успешно добавено ново правило за IP
       delete: Изтриване
       expires_in:
         '1209600': 2 седмици
@@ -318,72 +538,199 @@ bg:
         '31556952': 1 година
         '86400': 1 ден
         '94670856': 3 години
+      new:
+        title: Създаване на ново правило за IP
+      no_ip_block_selected: Няма променени правила за IP, тъй като нито едно не бе избрано
+      title: Правила за IP
     relationships:
       title: Отношения на %{acct}
     relays:
+      add_new: Добавяне на нов предаващ сървър
       delete: Изтриване
+      description_html: "<strong>Федериращ предаващ сървър</strong> е междинен сървър, който обменя огромни количества публични публикации между сървъри, които са записани и публикуват на него. <strong>Може да помогне на малки и средно-големи сървъри да открият съдържание от федивселената</strong>, който процес иначе би изискал от локалните потребители да следват хора от отдалечени сървъри."
       disable: Изключване
       disabled: Изключено
       enable: Включване
+      enable_hint: Щом бъде включена настройката, вашият сървър ще се запише за всички публични публикации от този предаващ сървър и ще започне да изпраща към него публичните публикации от вашия сървър.
       enabled: Включено
+      inbox_url: URL на предаващия сървър
+      pending: Изчакване на одобрение от предаващия сървър
+      save_and_enable: Запазване и включване
+      setup: Настройка на връзка с предаващия сървър
+      signatures_not_enabled: Предаващите сървъри може да не работят коректно, докато са включени режима за сигурност или режима за ограничено федериране
       status: Състояние
+      title: Препредаватели
     report_notes:
-      today_at: Днес от %{time}
+      created_msg: Успешно създадена бележка за доклад!
+      destroyed_msg: Успешно изтрита бележка за доклад!
     reports:
+      account:
+        notes:
+          one: "%{count} бележка"
+          other: "%{count} бележки"
+      action_log: Одитен дневник
+      action_taken_by: Действие, предприето от
+      actions:
+        delete_description_html: Докладваните публикации ще се изтрият и ще бъде записано нарушение, за да ви помогне при изострянето на бъдещи нарушения от същия акаунт.
+        mark_as_sensitive_description_html: Мултимедията в докладваните публикации ще се означи като деликатна, за да ви помогне при изострянето на бъдещи нарушения от същия акаунт.
+        other_description_html: Показване на повече възможности за управляване на поведението на акаунта и за персонализиране на комуникацията с доклвадвания акаунт.
+        resolve_description_html: Няма да се предприеме действие срещу докладвания акаунт, няма да се записва нарушение и докладът ще се затвори.
+        silence_description_html: Профилът ще е видим само за последователите му или търсещите го ръчно, което драстично ограничава обсега му. Настройката може да се промени по всяко време.
+        suspend_description_html: Профилът и цялото му съдържание ще бъдат недостъпни, до евентуалното му изтриване. Няма да може да се взаимодейства с акаунта. Настройката може да се отмени в рамките на 30 дни.
+      actions_description_html: Решете какво действие може да се предприеме, за да бъде отхвърлен докладът. Ако предприемете наказателно действие срещу докладвания акаунт, към него ще бъде изпратено известие по имейл, освен ако <strong>Спам</strong> категорията не е била избрана.
+      add_to_report: Добавяне на още към доклада
       are_you_sure: Сигурни ли сте?
+      assign_to_self: Назначаване на мен
+      assigned: Назначен модератор
+      by_target_domain: Домейн на докладвания акаунт
       category: Категория
+      category_description_html: Причината, поради която акаунтът и/или съдържанието е докладвано ще се цитира в комуникацията с докладвания акаунт
       comment:
         none: Нищо
+      comment_description_html: 'За да предостави повече информация, %{name} написа:'
       created_at: Докладвано
       delete_and_resolve: Изтриване на публикациите
       forwarded: Препратено
       forwarded_to: Препратено до %{domain}
       mark_as_resolved: Маркиране като решено
       mark_as_sensitive: Означаване като деликатно
+      mark_as_unresolved: Отбелязване като нерешено
+      no_one_assigned: Никого
       notes:
         create: Добавяне на бележка
+        create_and_resolve: Разрешаване с бележка
+        create_and_unresolve: Отваряне пак с бележка
         delete: Изтриване
+        placeholder: Опишете какви действия са били предприети или всякакви други свързани нови неща...
         title: Бележки
+      notes_description_html: Прегледайте и оставете бележки за други модератори и за вас самите след време
+      quick_actions_description_html: 'Предприемете бързо действие или превъртете надолу, за да видите докладваното съдържание:'
+      remote_user_placeholder: отдалеченият потребител от %{instance}
       reopen: Отваряне пак на доклад
+      report: 'Докладване на #%{id}'
       reported_account: Докладван акаунт
       reported_by: Докладвано от
       resolved: Разрешено
+      resolved_msg: Успешно разрешен доклад!
+      skip_to_actions: Прескок към действия
       status: Състояние
       statuses: Докладвано съдържание
+      statuses_description_html: Непристойно съдържание ще бъде цитирано в комуникацията с докладвания акаунт
+      target_origin: Произход на докладвания акаунт
       title: Доклади
+      unassign: Освобождаване
+      unresolved: Неразрешено
       updated_at: Обновено
       view_profile: Преглед на профила
     roles:
       add_new: Добавяне на роля
+      assigned_users:
+        one: "%{count} потребител"
+        other: "%{count} потребители"
       categories:
         administration: Администрация
+        devops: Развитие и операции
         invites: Покани
         moderation: Mодериране
+        special: Специални
       delete: Изтриване
+      description_html: С <strong>потребителските роли</strong> може да персонализирате до кои функции и области на Mastodon имат достъп потребителите ви.
+      edit: Промяна на ролята „%{name}“
+      everyone: Разрешения по подразбиране
+      everyone_full_description_html: Това е <strong>основната роля</strong>, засягаща <strong>всички потребители</strong>, дори тези без назначена роля. Всички други роли наследяват разрешения за достъп от нея.
+      permissions_count:
+        one: "%{count} разрешение"
+        other: "%{count} разрешения"
       privileges:
         administrator: Администратор
+        administrator_description: Потребители с това разрешение ще заобиколят всички разрешения
+        delete_user_data: Изтриване на потребителските данни
+        delete_user_data_description: Позволяване на потребителите да трият данни на други потребители без отлагане
+        invite_users: Поканване на потребители
+        invite_users_description: Позволява на потребителите да канят нови хора в сървъра
+        manage_announcements: Управляване на оповестяванията
+        manage_announcements_description: Позволява на потребителите да управляват оповестяванията в сървъра
+        manage_appeals: Управление на обжалванията
+        manage_appeals_description: Позволява на потребителите да разглеждат обжалвания срещу модераторски действия
+        manage_blocks: Управляване на блокиранията
+        manage_blocks_description: Позволява на потребителите да блокират доставчици на е-поща и IP адреси
+        manage_custom_emojis: Управляване на персонализирани емоджита
+        manage_custom_emojis_description: Позволява на потребителите да управляват персонализирани емоджита в сървъра
+        manage_federation: Управление на Федерацията
+        manage_federation_description: Позволява на потребители да блокират или позволяват федерация с други домейни, а и управление на доставаемостта
         manage_invites: Управление на поканите
+        manage_invites_description: Позволява на потребители да разглеждат и деактивират връзки за покана
         manage_reports: Управление на докладите
+        manage_reports_description: Позволява на потребители да преглеждат доклади и да извършват модериращи действия срещу тях
         manage_roles: Управление на ролите
+        manage_roles_description: Позволява на потребителите да управляват и назначават роли под техните
+        manage_rules: Управление на правилата
+        manage_rules_description: Позволява на потребителите да променят правилата на сървъра
+        manage_settings: Управление на настройките
+        manage_settings_description: Позволява на потребителите да променят настройки на сайта
+        manage_taxonomies: Управление на класификации
+        manage_taxonomies_description: Позволяване на потребителите да преглеждат нашумяло съдържание и да обновяват настройките за хаштагове
+        manage_user_access: Управление на потребителския достъп
+        manage_user_access_description: Позволяване на потребителите да изключват двуфакторното удостоверяване, да променят имейл адресите и да подновяват паролите на други потребители
+        manage_users: Управление на потребителите
+        manage_users_description: Позволяване на потребителите да виждат подробностите за други потребители и да извършват модераторски действия срещу тях
+        manage_webhooks: Управление на уебкуките
+        manage_webhooks_description: Позволява на потребителите да настройват уебкуки за административни събития
+        view_audit_log: Преглед на одитния дневник
+        view_audit_log_description: Позволява на потребителите да виждат историята на административни действия в сървъра
+        view_dashboard: Преглед на таблото
+        view_dashboard_description: Даване на потребителите достъп до таблото и различни метрики
+        view_devops: Развитие и операции
+        view_devops_description: Позволява на потребителите да имат достъп до таблото за управл. на Sidekiq и pgHero
       title: Роли
     rules:
       add_new: Добавяне на правило
       delete: Изтриване
+      description_html: Дори повечето хора да отбелязват, че са прочели и са съгласни с условията на услугата, обикновено хората не ги четат, докато не се сблъскат с проблем. <strong>Улеснете четенето на правилата за сървъра си, представяйки ги като списък с точки.</strong> Опитайте да се придържате към кратки и прости правила, но не ги разпилявайте в премного точки.
       edit: Промяна на правило
       empty: Още няма определени правила на сървъра.
       title: Правила на сървъра
     settings:
       about:
         manage_rules: Управление на правилата на сървъра
+        preamble: Предложете задълбочена информация за това как вашият сървър се управлява, модерира и финансира.
+        rules_hint: Съществува специална част за правилата, които се очаква вашите потребители да спазват.
+        title: Относно
       appearance:
+        preamble: Настройване на мрежовия интерфейс на Mastodon.
         title: Външен вид
+      branding:
+        preamble: Брандирането на вашия сървър го различава от другите сървъри в мрежата. Тази информация може да се види на различни места, като уеб интерфейса на Mastodon, собствени приложения, в прегледите на линкове от други сайтове и в приложения за съобщения, и т.н. По тази причина е добре тази информация да е кратка и ясна.
+        title: Брандиране
+      content_retention:
+        preamble: Управление на това как съдържание, породено от потребители, се съхранява в Mastodon.
+        title: Задържане на съдържание
+      default_noindex:
+        desc_html: Влияе на всички потребители, които не са променили тази настройка за себе си
+        title: По подразбиране изключете индексирането от търсачки за вашите потребители
       discovery:
-        public_timelines: Публични инфопотоци
+        follow_recommendations: Препоръки за следване
+        preamble: За потребители, които са нови и не познават никого в Mastodon, показването на интересно съдържание е ключово. Настройте начина, по който различни функции по откриване на съдържание работят на вашия сървър.
+        profile_directory: Директория на профила
+        public_timelines: Публични часови оси
         title: Откриване
-        trends: Актуални
+        trends: Налагащи се
+      domain_blocks:
+        all: До всеки
+        disabled: До никого
+        users: До влезнали локални потребители
       registrations:
+        preamble: Управлява кой може да създава акаунт на сървъра ви.
         title: Регистрации
+      registrations_mode:
+        modes:
+          approved: Нужно е одобрение за записване
+          none: Никой не може да се регистрира
+          open: Всеки може да се запише
       title: Настройки на сървъра
+    site_uploads:
+      delete: Изтриване на качения файл
+      destroyed_msg: Успешно изтриване на качването на сайта!
     statuses:
       account: Автор
       application: Приложение
@@ -395,48 +742,175 @@ bg:
       deleted: Изтрито
       favourites: Любими
       history: История на версиите
+      in_reply_to: Отговор до
       language: Език
       media:
         title: Мултимедия
       metadata: Метаданни
+      no_status_selected: Няма промяна, тъй като няма избрани публикации
       open: Отваряне на публикация
       original_status: Първообразна публикация
+      reblogs: Блогване пак
+      status_changed: Публикацията променена
+      title: Публикации на акаунта
+      trending: Изгряващи
       visibility: Видимост
+      with_media: С мултимедия
+    strikes:
+      actions:
+        delete_statuses: "%{name} изтри публикации на %{target}"
+        disable: "%{name} замрази акаунта на %{target}"
+        mark_statuses_as_sensitive: "%{name} означи публикациите на %{target} като деликатни"
+        none: "%{name} изпрати предупреждение до %{target}"
+        sensitive: "%{name} означи акаунта на %{target} като деликатен"
+        silence: "%{name} сложи ограничения на акаунта на %{target}"
+        suspend: "%{name} преустанови акаунта на %{target}"
+      appeal_approved: Обжалвано
+      appeal_pending: Чака се обжалването
+    system_checks:
+      database_schema_check:
+        message_html: Има миграции на базата данни, които чакат да бъдат изпълнени. Моля, изпълнете ги, за да осигурите изправността на приложението
+      elasticsearch_running_check:
+        message_html: Не можа да се свърже с Elasticsearch. Проверете дали работи или изключете пълнотекстовото търсене
+      elasticsearch_version_check:
+        message_html: 'Несъвместима версия на Elasticsearch: %{value}'
+        version_comparison: Работи Elasticsearch на %{running_version}, докато се изисква %{required_version}
+      rules_check:
+        action: Управление на правилата на сървъра
+        message_html: Не сте определили никакви правила на сървъра.
+      sidekiq_process_check:
+        message_html: Не работи процес Sidekiq за %{value} опашка/и. Прегледайте настройките си за Sidekiq
+    tags:
+      review: Преглед на състояние
+      updated_msg: Успешно осъвременени настройки на хаштага
+    title: Администрация
     trends:
+      allow: Позволяване
+      approved: Одобрено
+      disallow: Забранявам
       links:
+        allow: Позволяване на връзка
+        allow_provider: Позволяване на публикуващия
         description_html: Това са линкове, които в момента са често споделяни от акаунти, чиито публикации вашият сървър вижда. Може да помогне на вашите потребители да разберат какво се случва по света. Никой линк няма да се покаже публично, докато не одобрите автора. Можете също и да одобрявате или забранявате отделни линкове.
+        disallow: Забранявам връзката
+        disallow_provider: Забраняване на публикуващия
+        no_link_selected: Няма промяна, тъй като няма избрани линкове
+        publishers:
+          no_publisher_selected: Няма промяна, тъй като няма избрани публикуващи
         shared_by_over_week:
           one: Споделено от един човек през последната седмица
-          other: Споделено от %{count} хора през последната седмица
+          other: Споделено от %{count} души през последната седмица
+        title: Нашумели линкове
         usage_comparison: Споделено %{today} пъти днес, в сравнение с %{yesterday} пъти вчера
+      only_allowed: Само позволените
+      pending_review: В очакване на преглед
       preview_card_providers:
+        allowed: Линкове от този публикуващ може да са нашумели
         description_html: Това са домейни, линковете от които са често споделяни на вашия сървър. Линковете няма да се показват в нашумели, докато домейнът на линка не бъде одобрен. Вашите одобрения (забрани) влияят и на поддомейни.
+        rejected: Линкове от този автор няма да се включат в нашумели
+        title: Публикуващи
+      rejected: Отхвърлено
       statuses:
-        description_html: Това са публикациите, за които вашият сървър знае, че в момента са често споделяни или харесвани. Би помогнало на вашите нови и завръщащи се потребители да открият повече хора, които да последват. Никоя от публикациите няма да бъде показан публично, докато не одобрите автора и докато авторът не позволи акаунтът му да бъде предложен. Можете също да позволявате и забранявате отделни публикации.
+        allow: Позволяване на публикацията
+        allow_account: Позволяване на автора
+        description_html: Това са публикациите, за които вашият сървър знае, че в момента са често споделяни или маркирани като любими. Биха помогнали на вашите нови и завръщащи се потребители да открият повече хора, които да последват. Никоя от публикациите няма да бъде показана публично, докато не одобрите автора и докато авторът не позволи акаунтът му да бъде предложен. Можете също да позволявате и забранявате отделни публикации.
+        disallow: Забраняване на публикацията
+        disallow_account: Забрана на автора
+        no_status_selected: Няма промяна, тъй като няма избрана нашумяла публикация
+        not_discoverable: Авторът не е избрал да е откриваем
         shared_by:
-          one: Споделено или харесано един път
-          other: Споделено или харесано %{friendly_count} пъти
+          one: Споделено или сложено веднъж в любими
+          other: Споделено или сложено в любими %{friendly_count} пъти
+        title: Налагащи се публикации
       tags:
+        current_score: Текущ резултат %{score}
         dashboard:
           tag_accounts_measure: неповторими употреби
           tag_languages_dimension: Водещи езици
           tag_servers_dimension: Водещи сървъри
           tag_servers_measure: различни сървъри
           tag_uses_measure: обща употреба
+        description_html: Това са хаштагове, фигуриращи в момента в много публикации, които вашият сървър вижда. Помага на вашите потребители да виждат за какво говорят другите в момента. Хаштаговете няма да се покажат публично, докато не ги одобрите.
+        listable: Може да бъде предложено
+        no_tag_selected: Няма промяна, тъй като няма избран таг
+        not_listable: Няма да бъде препоръчан
+        not_trendable: Няма да се появи под налагащи се
         not_usable: Не може да се използва
+        peaked_on_and_decaying: Връх на актуалността на %{date}, сега е в спад
+        title: Налагащи се хаштагове
+        trendable: Може да се появи под налагащи се
+        trending_rank: 'Налагащи се #%{rank}'
         usable: Може да се употребява
+        usage_comparison: Използвано %{today} пъти днес, в сравнение с %{yesterday} пъти вчера
+        used_by_over_week:
+          one: Употребено от един човек през последната седмица
+          other: Използвано от %{count} души през последната седмица
+      title: Налагащи се
+      trending: Изгряващи
     warning_presets:
+      add_new: Добавяне на ново
       delete: Изтриване
+      edit_preset: Редакция на предварителните настройки
+      empty: Все още няма предварителни настройки за предупрежденията.
+      title: Управление на предварителните настройки
     webhooks:
       add_new: Добавяне на крайна точка
       delete: Изтриване
+      description_html: "<strong>Уеб обратно повикване</strong> позволява на Mastodon да насочи <strong>известия в реално време</strong> за избрани събития към вашето приложение, така че то да може да <strong>активира реакции автоматично</strong>."
+      disable: Деактивиране
+      disabled: Деактивирано
+      edit: Редактиране на крайната точка
+      empty: Все още нямате настроени крайни точки за уеб обратни повиквания.
+      enable: Включване
+      enabled: Активно
+      enabled_events:
+        one: Едно активирано събитие
+        other: "%{count} активирани събития"
       events: Събития
+      new: Ново уеб обратно повикване
+      rotate_secret: Смяна на тайната
+      secret: Записване на тайната
       status: Състояние
       title: Уебкуки
+      webhook: Уебкука
   admin_mailer:
     new_appeal:
       actions:
+        delete_statuses: за изтриване на публикациите им
+        disable: за замразяване на акаунтите им
+        mark_statuses_as_sensitive: за означаване на публикациите им като деликатни
         none: предупреждение
+        sensitive: за означаване на акаунтите като деликатни
+        silence: за слагане на органичение на акаунтите им
+        suspend: за спиране на акаунтите им
+      body: "%{target} обжалва модераторското решение от %{action_taken_by} на %{date}, което е било %{type}. Жалбата гласи:"
+      next_steps: Можете да одобрите жалбата и да отмените модераторското решение или да я игнорирате.
+      subject: "%{username} обжалва модераторското решение в %{instance}"
+    new_pending_account:
+      body: Подробностите за новия акаунт са по-долу. Може да одобрите или отхвърлите заявлението.
+      subject: Нов акаунт за преглед на %{instance} (%{username})
+    new_report:
+      body: "%{reporter} докладва %{target}"
+      body_remote: Някого от %{domain} докладва %{target}
+      subject: Нов доклад за %{instance} (#%{id})
+    new_trends:
+      body: 'Следните елементи се нуждаят от преглед преди да могат да бъдат показани публично:'
+      new_trending_links:
+        title: Налагащи се връзки
+      new_trending_statuses:
+        title: Налагащи се публикации
+      new_trending_tags:
+        no_approved_tags: Сега няма одобрени налагащи се хаштагове.
+        requirements: 'Всеки от тези кандидати може да надмине #%{rank} одобрен актуален хаштаг, който в момента е #%{lowest_tag_name} с резултат %{lowest_tag_score}.'
+        title: Нашумели хаштагове
+      subject: Нови нашумели, готови за преглед в %{instance}
+  aliases:
+    add_new: Създаване на псевдоним
+    created_msg: Успешно създадохте нов псевдоним. Сега вече може да започнете преместването от стария акаунт.
+    deleted_msg: Успешно премахнахте псевдонима. Преместването от онзи акаунт към този вече не е възможно.
+    empty: Нямате псевдоними.
+    hint_html: Ако желаете да се преместите от друг акаунт към този, тук можете да създадете псевдоним, което се изисква преди да можете да пристъпите към преместване на последователите си от стария акаунт към този. Това действие е <strong>безопасно и възстановимо</strong>. <strong>Миграцията към новия акаунт се инициира от стария акаунт</strong>.
+    remove: Разкачвне на псевдонима
   appearance:
     advanced_web_interface: Разширен уеб интерфейс
     advanced_web_interface_hint: 'Ако желаете да се възползвате от пълната ширина на своя екран, разширеният уеб интерфейс ще ви позволи да настроите най-различни колони, за да виждате едновременно множество информация: Начало, известия, федериран инфопоток, множество списъци и хаштагове.'
@@ -452,43 +926,74 @@ bg:
   application_mailer:
     notification_preferences: Промяна на предпочитанията за имейл
     salutation: "%{name},"
-    settings: 'Промяна на предпочитанията за e-mail: %{link}'
+    settings: 'Промяна на предпочитанията за имейл: %{link}'
     view: 'Преглед:'
     view_profile: Преглед на профила
     view_status: Преглед на публикацията
   applications:
+    created: Успешно създадено приложение
+    destroyed: Успешно изтрито приложение
+    regenerate_token: Регенериране на кода за достъп
+    token_regenerated: Успешно генериране на код за достъп
     warning: Бъдете внимателни с тези данни. Никога не ги споделяйте с никого!
+    your_token: Вашият код за достъп
   auth:
+    apply_for_account: Заявка за акаунт
     change_password: Парола
     delete_account: Изтриване на акаунта
-    delete_account_html: Ако желаете да изтриете акаунта си, можете <a href="%{path}">да сторите това тук</a>. Ще ви бъде поискано потвърждение.
+    delete_account_html: Ако желаете да изтриете акаунта си, може <a href="%{path}">да сторите това тук</a>. Ще ви се поиска потвърждение.
     description:
       prefix_invited_by_user: "@%{name} ви покани да се присъедините към този сървър на Mastodon!"
-    didnt_get_confirmation: Не получих инструкции за потвърждение
+      prefix_sign_up: Регистрирайте се днес в Mastodon!
+      suffix: Със свой акаунт ще можете да следвате хора, да публикувате актуализации, да обменяте съобщения с потребители от всеки сървър на Mastodon и много повече!
+    didnt_get_confirmation: Не сте ли получили указания за потвърждение?
     dont_have_your_security_key: Нямате ли си ключ за сигурност?
-    forgot_password: Забравих си паролата
+    forgot_password: Забравена парола
+    invalid_reset_password_token: Кодът за възстановяване на паролата е невалиден или с изтекъл срок. Моля, поръчайте нов.
     link_to_otp: Въведете двуфакторния код от телефона си или кода за възстановяване
     link_to_webauth: Използвайте ключа си за сигурност на устройството
+    log_in_with: Влизане с
     login: Влизане
     logout: Излизане
     migrate_account: Преместване в различен акаунт
     migrate_account_html: Ако желаете да пренасочите този акаунт към друг, можете да <a href="%{path}">настроите това тук</a>.
     or_log_in_with: Или влизане с помощта на
+    privacy_policy_agreement_html: Прочетох и има съгласието ми за <a href="%{privacy_policy_path}" target="_blank">политиката за поверителност</a>
+    providers:
+      cas: CAS
+      saml: SAML
     register: Регистрация
     registration_closed: "%{instance} не приема нови членуващи"
     resend_confirmation: Изпрати отново инструкции за потвърждение
-    reset_password: Подновяване на паролата
+    reset_password: Нулиране на паролата
+    rules:
+      preamble: Тези са зададени и наложени от модераторите на %{domain}.
+      title: Някои основни правила.
     security: Сигурност
     set_new_password: Задаване на нова парола
     setup:
+      email_below_hint_html: Ако имейл адресът по-долу е неправилен, можете да го промените тук и да получите ново имейл за потвърждение.
+      email_settings_hint_html: Имейл за потвърждение беше изпратен до %{email}. Ако този имейл адрес е грешен, можете да го промените в настройките на акаунта.
       title: Настройка
+    sign_in:
+      preamble_html: Влезте с идентификационните данни за <strong>%{domain}</strong>. Ако вашият акаунт е хостван на различен сървър, няма да можете да влезете в този.
+      title: Влизане в %{domain}
+    sign_up:
+      preamble: С акаунт на този съвър в Mastodon ще може да последвате всекиго в мрежата, независимо къде се намира акаунтът му.
+      title: Първоначални настройки за %{domain}.
     status:
       account_status: Състояние на акаунта
+      confirming: Чакане завършването на потвърждение на имейла.
       functional: Вашият акаунт е в изправност.
+      pending: Вашето приложение чака преглед от нашия екип. Това може да отнеме време. Ще получите имейл, ако приложението е одобрено.
+      redirecting_to: Вашият акаунт е бездеен, защото сега се пренасочва към %{acct}.
+      view_strikes: Преглед на предишните нарушения за вашия акаунт
+    too_fast: Образецът подаден пребързо, опитайте пак.
     use_security_key: Употреба на ключ за сигурност
   authorize_follow:
     already_following: Вече следвате този акаунт
-    error: Възникна грешка в откриването на потребителя
+    already_requested: Вече сте изпратили заявка за последване до този акаунт
+    error: Възникна грешка, търсейки отдалечения акаунт
     follow: Последвай
     follow_request: 'Изпратихте следната заявка до:'
     following: 'Успешно! Сега сте последвали:'
@@ -502,6 +1007,10 @@ bg:
     hint_html: "<strong>Съвет</strong>: няма да ви питаме пак за паролата през следващия час."
     invalid_password: Невалидна парола
     prompt: Потвърдете паролата, за да продължите
+  crypto:
+    errors:
+      invalid_key: не е валиден ключ Ed25519 или Curve25519
+      invalid_signature: не е валиден подпис Ed25519
   date:
     formats:
       default: "%b %d, %Y"
@@ -522,46 +1031,90 @@ bg:
       x_seconds: "%{count} сек"
   deletes:
     challenge_not_passed: Въвели сте неправилна информация
+    confirm_password: Въведете текущата си парола, за да потвърдите самоличността си
     confirm_username: Въведете потребителското си име, за да потвърдите процедурата
     proceed: Изтриване на акаунта
     success_msg: Вашият акаунт е успешно изтрит
     warning:
       before: 'Прочетете внимателно тези бележки преди да продължите:'
+      caches: Съдържание, което може да е кеширано от други сървъри, може да се задържи
       data_removal: Ваши публикации и други данни ще бъдат завинаги премахнати
+      email_change_html: Може да <a href="%{path}">промените адреса на имейла си</a>, без да изтривате акаунта си
+      email_contact_html: Ако все още не сте го получили, обърнете се за помощ към <a href="mailto:%{email}">%{email}</a>
+      email_reconfirmation_html: Ако не сте получили имейл за потвърждение, можете да го <a href="%{path}">заявите отново</a>
+      irreversible: Няма да може да възстановите или да задействате пак акаунта си
+      more_details_html: За повече детайли прегледайте <a href="%{terms_path}">декларацията за поверителност</a>.
       username_available: Вашето потребителско име ще стане налично отново
       username_unavailable: Вашето потребителско име ще остане неналично
   disputes:
     strikes:
+      action_taken: Предприето действие
+      appeal: Обжалване
+      appeal_approved: Това нарушение беше успешно обжалвано и е вече невалидно
+      appeal_rejected: Обжалването е отхвърлено
+      appeal_submitted_at: Подадено обжалване
+      appealed_msg: Вашето обжалване е отхвърлено. Ако е одобрено, то ще бъдете известени.
+      appeals:
+        submit: Изпращане на жалбата
+      approve_appeal: Одобряване на обжалването
+      associated_report: Свързан доклад
       created_at: Остаряло
+      description_html: Това са действията, предприети срещу вашия акаунт и предупрежденията, които са били изпратени до вас от екипа на %{instance}.
+      recipient: Адресирано до
+      reject_appeal: Отхвърляне на обжалването
       status: 'Публикация #%{id}'
+      status_removed: Публикацията вече е премахната от системата
       title: "%{action} от %{date}"
       title_actions:
+        delete_statuses: Премахване на публикацията
+        disable: Замразяване на акаунта
+        mark_statuses_as_sensitive: Означаване на публикациите като деликатни
         none: Предупреждение
+        sensitive: Означаване на акаунта като деликатен
+        silence: Ограничаване на акаунта
+        suspend: Преустановяване на акаунта
+      your_appeal_approved: Вашето обжалване е одобрено
+      your_appeal_pending: Подадохте обжалване
+      your_appeal_rejected: Вашето обжалване е отхвърлено
+  domain_validator:
+    invalid_domain: не е валидно име на домейн
   errors:
-    '400': The request you submitted was invalid or malformed.
+    '400': Подадохте невалидна или деформирана заявка.
     '403': Нямате позволение да разгледате тази страница.
     '404': Търсената от вас страница не е тук.
-    '406': This page is not available in the requested format.
-    '410': The page you were looking for doesn't exist here anymore.
+    '406': Страницата не е налична в искания формат.
+    '410': Страницата, която търсехте, вече не съществува тук.
     '422':
+      content: Провали се проверката за сигурността. Блокирате ли бисквитките?
       title: Неуспешна проверка за сигурност
     '429': Премного заявки
     '500':
+      content: Съжаляваме, но нещо се обърка в нашия край.
       title: Страницата не е правилна
-    '503': The page could not be served due to a temporary server failure.
+    '503': Страницата не може да се обслужва заради временен провал на сървъра.
+    noscript_html: Включете JavaScript, за да използвате уеб приложението Mastodon. Като алтернатива опитайте някое от <a href="%{apps_path}">естествените приложения</a> за Mastodon за платформата ви.
+  existing_username_validator:
+    not_found: не можа да се намери местен потребител с това потребителско име
+    not_found_multiple: не можа да намери %{usernames}
   exports:
     archive_takeout:
       date: Дата
       download: Изтегляне на архива ви
       hint_html: Можете да поръчате архив с вашите <strong>публикации и качена мултимедия</strong>. Експортираните данни ще бъдат във формат ActivityPub, който е четим от всеки съвместим софтуер. Можете да поръчате такъв архив на всеки 7 дни.
+      in_progress: Съставяне на архива ви...
+      request: Искане на архива ви
       size: Размер
     blocks: Вашите блокирания
     bookmarks: Отметки
+    csv: CSV
+    domain_blocks: Блокирания на домейна
     lists: Списъци
     mutes: Заглушавания
     storage: Съхранение на мултимедия
   featured_tags:
     add_new: Добавяне на нов
+    errors:
+      limit: Вече достигнахте максималния брой хаштагове
     hint_html: "<strong>Какво представляват актуалните хаштагове?</strong> Те се показват ясно на вашия публичен профил и позволяват на хората да преглеждат публичните ви публикации с тези хаштагове. Те са чудесен инструмент, с който може да се следи творческа работа или дългосрочни проекти."
   filters:
     contexts:
@@ -574,16 +1127,26 @@ bg:
       add_keyword: Добавяне на ключова дума
       keywords: Ключови думи
       statuses: Отделни публикации
+      statuses_hint_html: Филтърът се прилага за избрани отделни публикации независимо дали съвпада с ключовите думи по-долу. <a href="%{path}">Прегледайте или премахнете публикации от филтъра</a>.
       title: Редактиране на филтър
+    errors:
+      deprecated_api_multiple_keywords: Тези параметри не може да се променят от това приложение, защото се прилагат към повече от една ключова дума за филтър. Употребяйвате по-нови версии на приложението или уебинтерфейса.
+      invalid_context: Липсващ или неправилно снабден контекст
     index:
+      contexts: Филтри в %{contexts}
       delete: Изтриване
       empty: Нямате филтри.
+      expires_in: Изтича след %{distance}
+      expires_on: Изтича на %{date}
       keywords:
         one: "%{count} ключова дума"
         other: "%{count} ключови думи"
       statuses:
         one: "%{count} публикация"
         other: "%{count} публикации"
+      statuses_long:
+        one: "%{count} скрита отделна публикация"
+        other: "%{count} скрити отделни публикации"
       title: Филтри
     new:
       save: Запазване на нов филтър
@@ -593,17 +1156,38 @@ bg:
       batch:
         remove: Премахване от филтъра
       index:
+        hint: Този филтър се прилага за избор на отделни публикации, независимо от други критерии. Може да добавите още публикации в този филтър от уебинтерфейса.
         title: Филтрирани публикации
+  footer:
+    trending_now: Налагащи се сега
   generic:
     all: Всичко
+    all_items_on_page_selected_html:
+      one: "<strong>%{count}</strong> елемент от тази страница е избран."
+      other: Всички <strong>%{count}</strong> елементи от тази страница са избрани.
+    all_matching_items_selected_html:
+      one: "<strong>%{count}</strong> елементи, съвпадащи с вашето търсене, са избрани."
+      other: Всички <strong>%{count}</strong> елементи, съвпадащи с вашето търсене, са избрани.
     changes_saved_msg: Успешно запазване на промените!
     copy: Копиране
     delete: Изтриване
+    deselect: Размаркиране на всичко
     none: Нищо
     order_by: Подреждане по
     save_changes: Запази промените
+    select_all_matching_items:
+      one: Избор на %{count} елемент, съвпадащ с вашето търсене.
+      other: Избор на %{count} елементи, съвпадащи с вашето търсене.
     today: днес
+    validation_errors:
+      one: Нещо още не е напълно наред! Прегледайте грешката долу
+      other: Нещо още не е напълно наред! Прегледайте %{count} грешки долу
+  html_validator:
+    invalid_markup: 'съдържа невалидно HTML маркиране: %{error}'
   imports:
+    errors:
+      invalid_csv_file: 'Невалиден файл CSV. Грешка: %{error}'
+      over_rows_processing_limit: съдържа повече от %{count} реда
     modes:
       merge: Сливане
       merge_long: Пази текущите записи и добавя нови
@@ -614,6 +1198,7 @@ bg:
     types:
       blocking: Списък на блокираните
       bookmarks: Отметки
+      domain_blocking: Списък с блокирания на домейни
       following: Списък на последователите
       muting: Списък заглушавания
     upload: Качване
@@ -650,31 +1235,63 @@ bg:
       webauthn: ключове за сигурност
     description_html: Ако забележите неузнаваема дейност, то обмислете смяна на паролата си и включване на двуфакторното удостоверяване.
     empty: Няма налична история на удостоверяване
+    failed_sign_in_html: Неуспешен опит за влизане с %{method} от %{ip} (%{browser})
+    successful_sign_in_html: Успешно влизане с %{method} от %{ip} (%{browser})
     title: Историята на удостоверяване
   media_attachments:
     validations:
       images_and_video: Не мога да прикача видеоклип към публикация, която вече съдържа изображения
+      not_ready: Не е възможно закачането на файлове, който все още се обработват. Опитайте отново след малко!
       too_many: Не мога да прикача повече от 4 файла
   migrations:
+    acct: Преместено в
+    cancel: Отмяна на пренасочването
+    cancel_explanation: Отмяната на преместването ще активира наново текущия ви акаунт, но няма да върне последователите, преместени от него.
     cancelled_msg: Успешно отменено пренасочване.
     errors:
+      already_moved: е същият акаунт, към който вече сте се преместили
+      missing_also_known_as: не е псевдоним на този акаунт
       move_to_self: не може да е текущия акаунт
       not_found: не може да се намери
+      on_cooldown: В процес на охлаждане
     followers_count: Последователи по време на преместването
     incoming_migrations: Преместване от различен акаунт
     incoming_migrations_html: За да се преместите от друг акаунт към този, първо трябва да<a href="%{path}">създадете псевдоним за акаунта</a>.
+    moved_msg: Вашият акаунт се пренасочва и последователите ви биват преместени към %{acct}.
+    not_redirecting: В момента вашият акаунт не се пренасочва към друг.
+    on_cooldown: Пренасочили сте акаунта си наскоро. Това действие ще бъде отново достъпно след %{count} дни.
     past_migrations: Минали миграции
     proceed_with_move: Още последователи
     redirected_msg: Вашият акаунт сега се пренасочва към %{acct}.
     redirecting_to: Вашият акаунт е пренасочен към %{acct}.
     set_redirect: Задаване на пренасочване
+    warning:
+      backreference_required: Новият акаунт трябва да бъде настроен така че да препраща обратно към този
+      before: 'Прочетете внимателно тези бележки преди да продължите:'
+      cooldown: След едно преместване има период на изчакване, по време на който няма да можете да се преместите отново
+      disabled_account: След това, текущият ви акаунт няма да бъде напълно използваем. Но ще имате достъп до експортиране на данни от него и до повторното му активиране.
+      followers: Това действие ще премести всички последователи от текущия към новия акаунт
+      only_redirect_html: Иначе, можете да <a href="%{path}">просто да оставите пренасочване в своя профил</a>.
+      other_data: Други данни няма да бъдат автоматично пренасочени
+      redirect: Текущият профил на вашия акаунт ще бъде обновен с бележка за пренасочване и няма да се появява при търсене
   moderation:
     title: Mодериране
+  move_handler:
+    carry_blocks_over_text: Този потребител се премести от %{acct}, който сте блокирали.
+    carry_mutes_over_text: Този потребител се премести от %{acct}, който сте заглушили.
+    copy_account_note_text: 'Този потребител се премести от %{acct}; това са вашите бележки относно потребителя:'
+  navigation:
+    toggle_menu: Превключване на менюто
   notification_mailer:
+    admin:
+      report:
+        subject: "%{name} подаде доклад"
+      sign_up:
+        subject: "%{name} се регистрира"
     favourite:
-      body: 'Публикацията ти беше харесана от %{name}:'
-      subject: "%{name} хареса твоята публикация"
-      title: Ново любимо
+      body: 'Вашата публикация беше добавена в любими от %{name}:'
+      subject: "%{name} хареса вашата публикация"
+      title: Нова любима публикация
     follow:
       body: "%{name} те последва!"
       subject: "%{name} те последва"
@@ -683,6 +1300,7 @@ bg:
       action: Управляване на следните заявки
       body: "%{name} помоли за разрешение да те последва"
       subject: 'Чакащ последовател: %{name}'
+      title: Нови заявки за последване
     mention:
       action: Отговор
       body: "%{name} те спомена в:"
@@ -691,8 +1309,13 @@ bg:
     poll:
       subject: Анкетата от %{name} приключи
     reblog:
-      body: 'Твоята публикация беше споделена от %{name}:'
-      subject: "%{name} сподели публикацията ти"
+      body: 'Ваша публикация беше подсилена от %{name}:'
+      subject: "%{name} подсили ваша публикация"
+      title: Ново подсилване
+    status:
+      subject: "%{name} току-що публикува"
+    update:
+      subject: "%{name} промени публикация"
   notifications:
     email_events: Събития за известия по имейл
     email_events_hint: 'Изберете събития, за които искате да получавате известия:'
@@ -741,6 +1364,7 @@ bg:
   reactions:
     errors:
       limit_reached: Ограничението на различни реакции е достигнат
+      unrecognized_emoji: не е разпознато емоджи
   relationships:
     activity: Дейност на акаунта
     dormant: Неактивен
@@ -759,12 +1383,18 @@ bg:
     remove_selected_follows: Стоп на следването на избраните потребители
     status: Състояние на акаунта
   remote_follow:
-    missing_resource: Неуспешно търсене на нужния URL за пренасочване за твоя акаунт
+    missing_resource: Не можа да се намери искания URL за пренасочване за акаунта ви
+  reports:
+    errors:
+      invalid_rules: не се отнася до валидни правила
   rss:
     content_warning: 'Предупреждение за съдържанието:'
     descriptions:
       account: Публични публикации от @%{acct}
+      tag: 'Публични публикации с таг #%{hashtag}'
   scheduled_statuses:
+    over_daily_limit: Завишили сте ограничението от %{limit} планирани публикации за днес
+    over_total_limit: Завишили сте ограничението от %{limit} планирани публикации
     too_soon: Заплануваната дата трябва да е в бъдеще
   sessions:
     activity: Последна активност
@@ -805,11 +1435,13 @@ bg:
       windows_mobile: Windows Mobile
       windows_phone: Windows Phone
     revoke: Анулирaне
+    revoke_success: Успешно анулирана сесия
     title: Сесии
     view_authentication_history: Преглед на историята на удостоверяване на акаунта ви
   settings:
     account: Акаунт
     account_settings: Настройки на акаунта
+    aliases: Псевдоними за акаунта
     appearance: Външен вид
     authorized_apps: Упълномощени приложения
     back: Обратно към Mastodon
@@ -826,6 +1458,7 @@ bg:
     profile: Профил
     relationships: Последвания и последователи
     statuses_cleanup: Автоматично изтриване на публикации
+    strikes: Нарушения
     two_factor_authentication: Двустепенно удостоверяване
     webauthn_authentication: Ключове за сигурност
   statuses:
@@ -840,6 +1473,7 @@ bg:
       video:
         one: "%{count} видео"
         other: "%{count} видеозаписа"
+    boosted_from_html: Подсилено от %{acct_link}
     content_warning: 'Предупреждение за съдържание: %{warning}'
     default_language: Същият като езика на интерфейса
     disallowed_hashtags:
@@ -854,10 +1488,14 @@ bg:
       direct: Публикациите, които са видими само за споменати потребители не може да се закачат
       limit: Вече сте закачили максималния брой публикации
       ownership: Публикация на някого другиго не може да се закачи
+      reblog: Подсилване не може да се закача
     poll:
       total_people:
         one: "%{count} човек"
         other: "%{count} души"
+      total_votes:
+        one: "%{count} глас"
+        other: "%{count} гласа"
       vote: Гласуване
     show_more: Покажи повече
     show_newer: Показване на по-нови
@@ -875,19 +1513,24 @@ bg:
       unlisted_long: Всеки ги вижда, но са скрити от публичните инфопотоци
   statuses_cleanup:
     enabled: Автоматично изтриване на стари публикации
-    enabled_hint: Автоматично изтрива публикациите ви щом достигнат указания възрастов праг, освен ако не съвпадне с някое от изключенията долу
+    enabled_hint: Автоматично изтрива публикациите ви, щом достигнат указания възрастов праг, освен ако не съвпаднат с някое от изключенията долу
     exceptions: Изключения
     explanation: Тъй като изтриването на публикации е скъпа операция, това се прави бавно във времето, когато сървърът иначе не е зает. Поради тази причина публикациите ви може да се изтрият известно време след като достигнат възрастовия праг.
     ignore_favs: Игнориране на харесвания
-    ignore_reblogs: Игнориране на споделяния
+    ignore_reblogs: Игнориране на подсилвания
     interaction_exceptions: Изключения въз основа на взаимодействия
-    interaction_exceptions_explanation: Забележете, че няма гаранция, че публикации ще бъдат изтрити, ако паднат под прага на брой харесвания/споделяния, след като са го надвишили.
+    interaction_exceptions_explanation: Забележете, че няма гаранция, че публикацията ще се изтрият, ако паднат под прага на брой маркирания като любими/подсилвания, след като са го надвишили.
     keep_direct: Запазване на директните съобщения
     keep_direct_hint: Директните ви съобщения не се изтриват
+    keep_media: Задържане на публикации с прикачена мултимедия
+    keep_media_hint: Не изтрива публикации, които съдържат мултимедийни прикачвания
     keep_pinned: Запазване на закачените публикации
+    keep_pinned_hint: Не изтрива закачени публикации
+    keep_polls: Запазване на запитванията
+    keep_polls_hint: Не изтрива запитвания
     keep_self_bookmark: Запазване на публикации, добавени в отметки
     keep_self_bookmark_hint: Не се изтриват ваши публикации, ако сте ги добавили към отметки
-    keep_self_fav: Запазване на харесаните публикации
+    keep_self_fav: Запазване на публикации, които сте маркирали като любими
     keep_self_fav_hint: Не се изтриват публикации, които сте харесали
     min_age:
       '1209600': 2 седмици
@@ -899,14 +1542,19 @@ bg:
       '63113904': 2 години
       '7889238': 3 месеца
     min_age_label: Възрастов праг
-    min_favs: Запазване на публикации с поне толкова харесвания
-    min_favs_hint: Не се изтриват ваши публикации, харесани поне толкова пъти. Оставете празно, за да изтриете публикациите независимо от техния брой харесвания
+    min_favs: Запазване на публикации, маркирани като любими поне
+    min_favs_hint: Не се изтриват ваши публикации, маркирани като любими поне толкова пъти. Оставете празно, за да изтриете публикациите независимо от броя пъти маркирани като любими
     min_reblogs: Запазване на публикации с поне толкова споделяния
     min_reblogs_hint: Не се изтриват ваши публикации, споделени поне толкова пъти. Оставете празно, за да изтриете публикациите независимо от техния брой споделяния
   stream_entries:
     pinned: Закачена публикация
-    reblogged: споделено
+    reblogged: подсилено
     sensitive_content: Деликатно съдържание
+  strikes:
+    errors:
+      too_late: Късно е за обжалване на това нарушение
+  tags:
+    does_not_match_previous_name: не съвпада с предишното име
   themes:
     contrast: Mastodon (висок контраст)
     default: Mastodon (тъмно)
@@ -929,37 +1577,75 @@ bg:
     otp: Приложение за удостоверяване
     recovery_codes: Резервни кодове за възстановяване
     recovery_codes_regenerated: Успешно генериране на кодовете за възстановяване
-    recovery_instructions_html: Ако изгубите достъп до телефона си, можете да използвате кодовете за възстановяване по-долу, за да достъпите акаунта си. <strong>Запазете тези кодове на сигурно място</strong>. Например, можете да ги принтирате и да ги съхранявате заедно с други важни документи.
+    recovery_instructions_html: Ако изгубите достъп до телефона си, може да използвате долните кодовете за възстановяване, за да достъп до акаунта си. <strong>Запазете тези кодове на сигурно място</strong>. Например, можете да ги отпечатате и да ги складирате заедно с други важни документи.
     webauthn: Ключове за сигурност
   user_mailer:
     appeal_approved:
       action: Към акаунта ви
+      explanation: Жалбата, която изпратихте на %{appeal_date}, срещу нарушението за вашия акаунт, направено на %{strike_date}, е приета. Вашият акаунт е отново с добра репутация.
+      subject: Вашето обжалване от %{date} е било одобрено
+      title: Одобрено обжалване
+    appeal_rejected:
+      explanation: Жалбата, която изпратихте на %{appeal_date}, срещу нарушението за вашия акаунт, направено на %{strike_date}, е отхвърлена.
+      subject: Вашето обжалване от %{date} е било отхвърлено
+      title: Отхвърлено обжалване
     backup_ready:
+      explanation: Изискахте пълно резервно копиране на акаунта си в Mastodon. Вече е готово за изтегляне!
       subject: Вашият архив е готов за изтегляне
+      title: Сваляне на архива
+    suspicious_sign_in:
+      change_password: промяна на паролата ви
+      details: 'Ето подробности при вход:'
+      explanation: Засякохме влизане в акаунта ви от нов IP адрес.
+      further_actions_html: Ако това не сте били вие, препоръчваме да извършите действие %{action} незабавно и да включите двуфакторното удостоверяване, за да запазите сигурността на своя акаунт.
+      subject: Вашият акаунт е използвал достъп от нов IP адрес
+      title: Нов вход
     warning:
+      appeal: Подаване на обжалване
+      appeal_description: Ако вярвате, че това е грешка, то може да подадете обжалване до щаба на %{instance}.
       categories:
         spam: Спам
+        violation: Съдържанието нарушава следните ръководни линии
+      explanation:
+        delete_statuses: Някои от публикациите ви са нарушили една или повече от ръководните линии на общността и впоследствие бяха премахнати от модераторите на %{instance}.
+        disable: Не можете повече да използвате своя акаунт. Но профилът и другите ваши данни са непокътнати. Можете да подадете молба за архивиране на вашите данни, да промените настройките по акаунта или да го изтриете.
+        mark_statuses_as_sensitive: Някои от публикациите ви са отбелязани като деликатни от модераторите на %{instance}. Това означава, че хората трябва да почукнат на мултимедията в публикацията преди да се показва нагледно. Може сами да отбелязвате мултимедия като деликатна, публикувайки в бъдеще.
+        sensitive: От сега нататък, всички качени мултимедийни файлове ще се означават като деликатни и скрити зад предупреждение за щракване.
+        silence: Още може да употребявате акаунта си, но само хора, които вече са ви последвали ще виждат публикациите ви на този сървър, а и може да бъдете изключени от различни функции за откриване. Въпреки това, други все още могат да ви последват ръчно.
+        suspend: Не можете повече да използвате своя акаунт. Профилът и другите ви данни също са вече недостъпни. Все още можете да влезете и да подадете молба за архивиране на вашите данни, преди те да бъдат изтрити след около 30 дни. Част от основните ви данни ще бъдат запазени, за да не ви бъде позволено да избегнете преустановяването.
       reason: 'Причина:'
       statuses: 'Цитирани публ.:'
       subject:
         delete_statuses: Ваши публикации в %{acct} са били премахнати
         disable: Вашият акаунт %{acct} е бил замразен
+        mark_statuses_as_sensitive: Вашите публикации в %{acct} са означени като деликатни
         none: Предупреждение за %{acct}
+        sensitive: Вашите публикации в %{acct} ще се означават като деликатни от сега нататък
+        silence: Вашият акаунт %{acct} е бил ограничен
+        suspend: Вашият акаунт %{acct} е бил преустановен
       title:
         delete_statuses: Публикацията е премахната
         disable: Акаунтът е замразен
         mark_statuses_as_sensitive: Публикацията отбелязана като деликатна
         none: Предупреждение
+        sensitive: Акаунтът е означен като деликатен
+        silence: Акаунтът има ограничение
+        suspend: Акаунтът е спрян
     welcome:
       edit_profile_action: Настройване на профила
+      edit_profile_step: Може да настроите профила си, качвайки снимката на профила, променяйки показваното си име и други неща. Може да се включите за преглед на нови последователи преди да бъдат позволени да ви последват.
       explanation: Ето няколко стъпки за начало
       final_action: Начало на публикуване
       final_step: 'Публикувайте! Дори без последователи, вашите публични публикации ще бъдат видени от други, например в местния инфопоток или под хаштагове. Не забравяйте да се представите с хаштаг #introductions.'
+      full_handle: Пълното ви име
+      full_handle_hint: Ето какво бихте казали на приятелите си, за да могат да ви изпращат съобщения или да ви последват от друг сървър.
       subject: Добре дошли в Mastodon
       title: Добре дошли на борда, %{name}!
   users:
     follow_limit_reached: Не може да последвате повече от %{limit} души
     invalid_otp_token: Невалиден код
+    otp_lost_help_html: Ако загубите достъп до двете, то може да се свържете с %{email}
+    seamless_external_login: Влезли сте чрез външна услуга, така че настройките за парола и имейл не са налични.
     signed_in_as: 'Влезли като:'
   verification:
     explanation_html: 'Можете да <strong>удостоверите самоличността си като собственик на линковете в метаданните на своя профил</strong>. За целта сайтът, към който води линк от метаданните, трябва да съдържа линк обратно към вашия профил в Mastodon. Линкът от сайта <strong>трябва</strong> да съдържа атрибут <code>rel="me"</code>. Текстовото съдържание на линка няма значение. Ето пример:'
@@ -976,6 +1662,8 @@ bg:
       error: Възникна проблем, изтривайки ключа си за сигурност. Опитайте пак.
       success: Вашият ключ за сигурност беше изтрит успешно.
     invalid_credential: Невалиден ключ за сигурност
+    nickname_hint: Въведете прякор на новия си ключ за сигурност
+    not_enabled: Още не сте включили WebAuthn
     not_supported: Този браузър не поддържа ключове за сигурност
     otp_required: Първо включете двуфакторното удостоверяване, за да използвате ключовете за сигурност.
     registered_on: Регистрирано на %{date}
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index d40d17a2e..4bfb82f0a 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -19,9 +19,9 @@ ca:
     pin_errors:
       following: Has d'estar seguint la persona que vulguis avalar
     posts:
-      one: Publicació
-      other: Publicacions
-    posts_tab_heading: Publicacions
+      one: Tut
+      other: Tuts
+    posts_tab_heading: Tuts
   admin:
     account_actions:
       action: Realitza l'acció
@@ -116,6 +116,8 @@ ca:
       redownloaded_msg: El perfil de %{username} s’ha refrescat des de l’origen amb èxit
       reject: Rebutja
       rejected_msg: L’aplicació de registre de %{username} s’ha rebutjat amb èxit
+      remote_suspension_irreversible: Les dades d'aquest compte s'han esborrat irreversiblement.
+      remote_suspension_reversible_hint_html: El compte ha estat suspès en el seu servidor i les dades seran totalment suprimides el %{date}. Fins llavors, el servidor remot pot restaurar aquest compte sense efectes negatius. Si vols suprimir immediatament totes les dades del compte, ho pots fer a continuació.
       remove_avatar: Eliminar avatar
       remove_header: Treu la capçalera
       removed_avatar_msg: S’ha suprimit amb èxit l’imatge d’acabar de %{username}
@@ -142,7 +144,7 @@ ca:
         targeted_reports: Informes realitzats per altres
       silence: Silenci
       silenced: Silenciat
-      statuses: Publicacions
+      statuses: Tuts
       strikes: Accions anteriors
       subscribe: Subscriu
       suspend: Suspèn
@@ -390,7 +392,7 @@ ca:
         create: Crea un bloqueig
         hint: El bloqueig de domini no impedirà la creació de nous comptes en la base de dades, però s'aplicaran de manera retroactiva mètodes de moderació específics sobre aquests comptes.
         severity:
-          desc_html: "<strong>Limitar</strong> farà que les publicacions dels comptes d'aquest domini siguin invisibles per a qualsevol persona que no les segueixi. <strong>Suspendre</strong> eliminarà del vostre servidor tot el contingut, multimèdia i perfil dels comptes d'aquest domini. Utilitza <strong>Cap</strong> si només vols rebutjar fitxers multimèdia."
+          desc_html: "<strong>Limitar</strong> farà que els tuts dels comptes d'aquest domini siguin invisibles per a qualsevol persona que no els segueixi. <strong>Suspendre</strong> eliminarà del vostre servidor tot el contingut, multimèdia i perfil dels comptes d'aquest domini. Utilitza <strong>Cap</strong> si només vols rebutjar fitxers multimèdia."
           noop: Cap
           silence: Limitar
           suspend: Suspensió
@@ -486,7 +488,7 @@ ca:
         instance_languages_dimension: Idiomes principals
         instance_media_attachments_measure: adjunts multimèdia desats
         instance_reports_measure: informes sobre ells
-        instance_statuses_measure: publicacions desades
+        instance_statuses_measure: tuts desats
       delivery:
         all: Totes
         clear: Neteja els errors de lliurament
@@ -545,11 +547,11 @@ ca:
     relays:
       add_new: Afegiu un nou relay
       delete: Elimina
-      description_html: Un <strong>relay de federació</strong> és un servidor intermediari que intercanvia grans volums de publicacions públiques entre servidors que se subscriuen i publiquen en ell. <strong>Pot ajudar a servidors petits i mitjans a descobrir contingut del fedivers</strong>, no fent necessari que els usuaris locals manualment segueixin altres persones de servidors remots.
+      description_html: Un <strong>relay de federació</strong> és un servidor intermediari que intercanvia grans volums de tuts públics entre servidors que se subscriuen i publiquen en ell. <strong>Pot ajudar a servidors petits i mitjans a descobrir contingut del fedivers</strong>, no fent necessari que els usuaris locals manualment segueixin altres persones de servidors remots.
       disable: Inhabilita
       disabled: Desactivat
       enable: Activat
-      enable_hint: Una vegada habilitat, el teu servidor se subscriurà a totes les publicacions públiques d'aquest relay i començarà a enviar-hi totes les publicacions públiques d'aquest servidor.
+      enable_hint: Una vegada habilitat, el teu servidor es subscriurà a tots els tuts públics d'aquest relay i començarà a enviar-hi tots els tuts públics d'aquest servidor.
       enabled: Activat
       inbox_url: URL del Relay
       pending: S'està esperant l'aprovació del relay
@@ -561,7 +563,6 @@ ca:
     report_notes:
       created_msg: La nota del informe s'ha creat correctament!
       destroyed_msg: La nota del informe s'ha esborrat correctament!
-      today_at: Avui a les %{time}
     reports:
       account:
         notes:
@@ -570,8 +571,8 @@ ca:
       action_log: Registre d'auditoria
       action_taken_by: Mesures adoptades per
       actions:
-        delete_description_html: Les publicacions reportades seran eliminades i un cop serà gravat per a ajudar-te a escalar en futures infraccions des del mateix compte.
-        mark_as_sensitive_description_html: Els mèdia de les publicacions reportades seran marcats com a sensibles i una acció serà gravada per ajudar a escalar en futures infraccions del mateix compte.
+        delete_description_html: Els tuts reportats seran eliminats i un cop serà gravat per a ajudar-te a escalar en futures infraccions des del mateix compte.
+        mark_as_sensitive_description_html: Els mèdia dels tuts reportats seran marcats com a sensibles i una acció serà gravada per ajudar a escalar en futures infraccions del mateix compte.
         other_description_html: Veu més opcions controlant el comportament del compte i personalitza la comunicació al compte reportat.
         resolve_description_html: No serà presa cap acció contra el compte reportat, cap cop serà gravat i l'informe es tancarà.
         silence_description_html: El perfil serà visible només per aquells que ja el seguien o en cerca manual, limitant severament el seu alcanç. Sempre pot ser revertit.
@@ -704,6 +705,9 @@ ca:
       content_retention:
         preamble: Controla com es desa a Mastodon el contingut generat per l'usuari.
         title: Retenció de contingut
+      default_noindex:
+        desc_html: Afecta tothom qui no ha canviat per si mateix aquest paràmetre
+        title: Exclou per defecte els usuaris de la indexació dels motors de cerca
       discovery:
         follow_recommendations: Seguir les recomanacions
         preamble: L'aparició de contingut interessant és fonamental per atraure els nous usuaris que podrien no saber res de Mastodon. Controla com funcionen diverses opcions de descobriment en el teu servidor.
@@ -754,9 +758,9 @@ ca:
       with_media: Amb contingut multimèdia
     strikes:
       actions:
-        delete_statuses: "%{name} ha eliminat les publicacions de %{target}"
+        delete_statuses: "%{name} ha eliminat els tuts de %{target}"
         disable: "%{name} ha congelat el compte de %{target}"
-        mark_statuses_as_sensitive: "%{name} ha marcat les publicacions de %{target} com a sensibles"
+        mark_statuses_as_sensitive: "%{name} ha marcat els tuts de %{target} com a sensibles"
         none: "%{name} ha enviat un avís a %{target}"
         sensitive: "%{name} ha marcat el compte de %{target} com a sensible"
         silence: "%{name} ha limitat el compte de %{target}"
@@ -787,7 +791,7 @@ ca:
       links:
         allow: Permet enllaç
         allow_provider: Permet mitjà
-        description_html: Aquests són enllaços que ara mateix estan compartint molt els comptes dels quals el teu servidor veu les publicacions. Poden ajudar els teus usuaris a trobar què està passant en el món. Cap dels enllaços es mostra públicament fins que no aprovis el mitjà. També pots acceptar o rebutjar enllaços individuals.
+        description_html: Aquests són enllaços que ara mateix estan compartint molt els comptes dels quals el teu servidor veu els tuts. Poden ajudar els teus usuaris a trobar què està passant en el món. Cap dels enllaços es mostra públicament fins que no aprovis el mitjà. També pots acceptar o rebutjar enllaços individuals.
         disallow: No permetre l'enllaç
         disallow_provider: No permetre el mitjà
         no_link_selected: No s'ha canviat cap enllaç perquè cap ha estat seleccionat
@@ -812,12 +816,12 @@ ca:
         description_html: Aquests són tuts que el teu servidor veu i que ara mateix s'estan compartint i afavorint molt. Poden ajudar als teus nous usuaris i als que retornen a trobar més gent a qui seguir. Cap tut es mostra públicament fins que no aprovis l'autor i l'autor permeti que el seu compte sigui suggerit a altres. També pots acceptar o rebutjar tuts individualment.
         disallow: Rebutja tut
         disallow_account: Rebutja autor
-        no_status_selected: No s'han canviat les publicacions en tendència perquè cap ha estat seleccionada
+        no_status_selected: No s'han canviat els tuts en tendència perquè cap ha estat seleccionat
         not_discoverable: L'autor no ha activat poder ser detectable
         shared_by:
           one: Compartit o afavorit una vegada
           other: Compartit i afavorit %{friendly_count} vegades
-        title: Publicacions en tendència
+        title: Tuts en tendència
       tags:
         current_score: Puntuació actual %{score}
         dashboard:
@@ -826,7 +830,7 @@ ca:
           tag_servers_dimension: Els millors servidors
           tag_servers_measure: diferents servidors
           tag_uses_measure: total usos
-        description_html: Aquestes són les etiquetes que ara mateix estan apareixent en moltes publicacions que el teu servidor veu. Poden ajudar els teus usuaris a trobar de què està parlant majoritàriament la gent en aquest moment. Cap etiqueta es mostra públicament fins que no l'aprovis.
+        description_html: Aquestes són les etiquetes que ara mateix estan apareixent en molts tuts que el teu servidor veu. Poden ajudar els teus usuaris a trobar de què està parlant majoritàriament la gent en aquest moment. Cap etiqueta es mostra públicament fins que no l'aprovis.
         listable: Es pot suggerir
         no_tag_selected: No s'ha canviat cap etiqueta perquè cap ha estat seleccionada
         not_listable: No es pot suggerir
@@ -872,9 +876,9 @@ ca:
   admin_mailer:
     new_appeal:
       actions:
-        delete_statuses: eliminar les seves publicacions
+        delete_statuses: eliminar els seus tuts
         disable: congelar els seus comptes
-        mark_statuses_as_sensitive: marcar les seves publicacions com a sensibles
+        mark_statuses_as_sensitive: marcar els seus tuts com a sensibles
         none: un avís
         sensitive: marcar els seus comptes com a sensibles
         silence: limitar els seus comptes
@@ -894,7 +898,7 @@ ca:
       new_trending_links:
         title: Enllaços en tendència
       new_trending_statuses:
-        title: Publicacions en tendència
+        title: Tuts en tendència
       new_trending_tags:
         no_approved_tags: Actualment no hi ha etiquetes en tendència aprovades.
         requirements: 'Qualsevol d''aquests candidats podria superar el #%{rank} de la etiqueta en tendència aprovada, que actualment és "%{lowest_tag_name}" amb una puntuació de %{lowest_tag_score}.'
@@ -918,7 +922,7 @@ ca:
       guide_link: https://crowdin.com/project/mastodon
       guide_link_text: Tothom hi pot contribuir.
     sensitive_content: Contingut sensible
-    toot_layout: Disseny de les publicacions
+    toot_layout: Disseny dels tuts
   application_mailer:
     notification_preferences: Canvia les preferències de correu
     salutation: "%{name},"
@@ -971,6 +975,9 @@ ca:
       email_below_hint_html: Si l’adreça de correu electrònic següent és incorrecta, podeu canviar-la aquí i rebre un nou correu electrònic de confirmació.
       email_settings_hint_html: El correu electrònic de confirmació es va enviar a %{email}. Si aquesta adreça de correu electrònic no és correcta, la podeu canviar a la configuració del compte.
       title: Configuració
+    sign_in:
+      preamble_html: Inicia sessió amb les teves credencials <strong>%{domain}</strong>. Si el teu compte es troba a un servidor diferent, no podràs iniciar una sessió aquí.
+      title: Inicia sessió a %{domain}
     sign_up:
       preamble: Amb un compte en aquest servidor Mastodon, podràs seguir qualsevol altre persona de la xarxa, independentment d'on tingui el seu compte.
       title: Anem a configurar-te a %{domain}.
@@ -1031,7 +1038,7 @@ ca:
     warning:
       before: 'Abans de procedir si us plau llegeix amb cura aquestes notes:'
       caches: El contingut que ha estat memoritzat en la memòria cau per altres servidors pot persistir
-      data_removal: Les teves publicacions i altres dades seran permanentment eliminades
+      data_removal: Els teus tuts i altres dades seran permanentment eliminades
       email_change_html: Pots <a href="%{path}">canviar la teva adreça de correu electrònic</a> sense eliminar el teu compte
       email_contact_html: Si encara no arriba pots enviar un correu electrònic a <a href="mailto:%{email}">%{email}</a> per a demanar ajuda
       email_reconfirmation_html: Si no estàs rebent el correu electrònic de confirmació <a href="%{path}">pots demanar-lo un altre cop</a>
@@ -1061,7 +1068,7 @@ ca:
       title_actions:
         delete_statuses: Eliminació de publicació
         disable: Congelació del compte
-        mark_statuses_as_sensitive: Marcatge de les publicacions com a sensibles
+        mark_statuses_as_sensitive: Marcatge dels tuts com a sensibles
         none: Avís
         sensitive: Marcatge del compte com a sensible
         silence: Limitació del compte
@@ -1093,7 +1100,7 @@ ca:
     archive_takeout:
       date: Data
       download: Baixa l’arxiu
-      hint_html: Pots sol·licitar un arxiu de les teves <strong>publicacions i dels fitxers multimèdia pujats</strong>. Les dades exportades tindran el format ActivityPub, llegible per qualsevol programari compatible. Pots sol·licitar un arxiu cada 7 dies.
+      hint_html: Pots sol·licitar un arxiu dels teus <strong>tuts i dels fitxers multimèdia pujats</strong>. Les dades exportades tindran el format ActivityPub, llegible per qualsevol programari compatible. Pots sol·licitar un arxiu cada 7 dies.
       in_progress: S'està compilant el teu arxiu...
       request: Sol·licitar el teu arxiu
       size: Mida
@@ -1108,7 +1115,7 @@ ca:
     add_new: Afegir nova etiqueta
     errors:
       limit: Ja has mostrat la quantitat màxima d'etiquetes
-    hint_html: "<strong>Què son les etiquetes destacades?</strong> Es mostren de manera destacada en el teu perfil públic i permeten a les persones navegar per les teves publicacions gràcies a aquestes etiquetes. Són una gran eina per fer un seguiment de treballs creatius o de projectes a llarg termini."
+    hint_html: "<strong>Què son les etiquetes destacades?</strong> Es mostren de manera destacada en el teu perfil públic i permeten a les persones navegar per els teus tuts gràcies a aquestes etiquetes. Són una gran eina per fer un seguiment de treballs creatius o de projectes a llarg termini."
   filters:
     contexts:
       account: Perfils
@@ -1119,8 +1126,8 @@ ca:
     edit:
       add_keyword: Afegeix una paraula clau
       keywords: Paraules clau
-      statuses: Publicacions individuals
-      statuses_hint_html: Aquest filtre s'aplica a la selecció de publicacions individuals, independentment de si coincideixen amb les paraules clau següents. <a href="%{path}">Revisa o elimina publicacions del filtre</a>.
+      statuses: Tuts individuals
+      statuses_hint_html: Aquest filtre s'aplica a la selecció de tuts individuals, independentment de si coincideixen amb les paraules clau següents. <a href="%{path}">Revisa o elimina tuts del filtre</a>.
       title: Editar filtre
     errors:
       deprecated_api_multiple_keywords: Aquests paràmetres no poden ser canviats des d'aquesta aplicació perquè apliquen a més d'un filtre per paraula clau. Utilitza una aplicació més recent o la interfície web.
@@ -1135,11 +1142,11 @@ ca:
         one: "%{count} paraula clau"
         other: "%{count} paraules clau"
       statuses:
-        one: "%{count} publicació"
-        other: "%{count} publicacions"
+        one: "%{count} tut"
+        other: "%{count} tuts"
       statuses_long:
-        one: "%{count} publicació individual ocultada"
-        other: "%{count} publicacions individuals ocultades"
+        one: "%{count} tut individual ocultat"
+        other: "%{count} tuts individuals ocultats"
       title: Filtres
     new:
       save: Desa el filtre nou
@@ -1149,8 +1156,8 @@ ca:
       batch:
         remove: Eliminar del filtre
       index:
-        hint: Aquest filtre aplica als apunts seleccionats independentment d'altres criteris. Pots afegir més publicacions a aquest filtre des de la interfície Web.
-        title: Publicacions filtrades
+        hint: Aquest filtre aplica als tuts seleccionats independentment d'altres criteris. Pots afegir més tuts a aquest filtre des de la interfície Web.
+        title: Tuts filtrats
   footer:
     trending_now: En tendència
   generic:
@@ -1254,7 +1261,7 @@ ca:
     not_redirecting: El teu compte no està redirigint actualment a cap altre.
     on_cooldown: Recentment has emigrat el teu compte. Aquesta funció esdevindrà un altre cop disponible en %{count} dies.
     past_migrations: Migracions passades
-    proceed_with_move: Moure seguidors
+    proceed_with_move: Mou seguidors
     redirected_msg: El teu compte és ara redireccionat a %{acct}.
     redirecting_to: El teu compte està redirigint a %{acct}.
     set_redirect: Ajusta la redirecció
@@ -1373,7 +1380,7 @@ ca:
     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
+    remove_selected_follows: Deixa de seguir els usuaris seleccionats
     status: Estat del compte
   remote_follow:
     missing_resource: No s'ha pogut trobar l'URL de redirecció necessària per al compte
@@ -1384,10 +1391,10 @@ ca:
     content_warning: 'Avís de contingut:'
     descriptions:
       account: Publicacions des de @%{acct}
-      tag: 'Publicacions etiquetades #%{hashtag}'
+      tag: 'Tuts etiquetats #%{hashtag}'
   scheduled_statuses:
-    over_daily_limit: Has superat el límit de %{limit} publicacions programades per a avui
-    over_total_limit: Has superat el límit de %{limit} publicacions programades
+    over_daily_limit: Has superat el límit de %{limit} tuts programats per a avui
+    over_total_limit: Has superat el límit de %{limit} tuts programats
     too_soon: La data programada ha de ser futura
   sessions:
     activity: Última activitat
@@ -1450,7 +1457,7 @@ ca:
     preferences: Preferències
     profile: Perfil
     relationships: Seguits i seguidors
-    statuses_cleanup: Esborrat automàtic de publicacions
+    statuses_cleanup: Esborrat automàtic de tuts
     strikes: Accions de mediació
     two_factor_authentication: Autenticació de dos factors
     webauthn_authentication: Claus de seguretat
@@ -1478,8 +1485,8 @@ ca:
     open_in_web: Obre en la web
     over_character_limit: Límit de caràcters de %{max} superat
     pin_errors:
-      direct: Les publicacions que només són visibles per als usuaris mencionats no poden ser fixades
-      limit: Ja has fixat el màxim nombre de publicacions
+      direct: Els tuts que només són visibles per als usuaris mencionats no poden ser fixats
+      limit: Ja has fixat el màxim nombre de tuts
       ownership: No es pot fixar el tut d'algú altre
       reblog: No es pot fixar un impuls
     poll:
@@ -1505,26 +1512,26 @@ ca:
       unlisted: No llistat
       unlisted_long: Tothom ho pot veure, però no es mostra en les línies de temps públiques
   statuses_cleanup:
-    enabled: Esborra automàticament publicacions antigues
-    enabled_hint: Suprimeix automàticament les teves publicacions quan arribin a un llindar d’edat especificat, tret que coincideixin amb una de les excepcions següents
+    enabled: Esborra automàticament tuts antics
+    enabled_hint: Suprimeix automàticament els teus tuts quan arribin a un llindar d’edat especificat, tret que coincideixin amb una de les excepcions següents
     exceptions: Excepcions
-    explanation: Com que suprimir publicacions és una operació cara, es fa lentament amb el pas del temps i quan el servidor no està ocupat. Per aquest motiu, és possible que les teves publicacions se suprimeixin un temps després d’assolir el llindar d’edat.
+    explanation: Com que suprimir tuts és una operació cara, es fa lentament amb el pas del temps i quan el servidor no està ocupat. Per aquest motiu, és possible que els teus tuts se suprimeixin un temps després d’assolir el llindar d’edat.
     ignore_favs: Ignora favorits
     ignore_reblogs: Ignora impulsos
     interaction_exceptions: Excepcions basades en interaccions
-    interaction_exceptions_explanation: Has de tenir en compte que no es garanteix que es suprimeixen les publicacions si passen per sota del llindar de favorit o impuls després d'haver-lo superat.
+    interaction_exceptions_explanation: Has de tenir en compte que no es garanteix que es suprimeixen els tuts si passen per sota del llindar de favorit o impuls després d'haver-lo superat.
     keep_direct: Mantenir missatges directes
     keep_direct_hint: No esborra cap dels teus missatges directes
-    keep_media: Mantenir les publicacions amb contingut gràfic
-    keep_media_hint: No esborra cap de les teves publicacions que tinguin adjunts multimèdia
-    keep_pinned: Mantenir les publicacions fixades
-    keep_pinned_hint: No esborra cap de les teves publicacions fixades
+    keep_media: Mantenir els tuts amb contingut gràfic
+    keep_media_hint: No esborra cap dels teus tuts que tinguin adjunts multimèdia
+    keep_pinned: Mantenir els tuts fixats
+    keep_pinned_hint: No esborra cap dels teus tuts fixats
     keep_polls: Mantenir enquestes
     keep_polls_hint: No esborra cap de les teves enquestes
-    keep_self_bookmark: Mantenir les publicacions que has desat a les adreces d'interès
-    keep_self_bookmark_hint: No esborra les teves pròpies publicacions si les has desat en les adreces d'interès
-    keep_self_fav: Mantenir les publicacions que has afavorit
-    keep_self_fav_hint: No esborra les teves pròpies publicacions si les has afavorit
+    keep_self_bookmark: Mantenir els tuts que has desat a les adreces d'interès
+    keep_self_bookmark_hint: No esborra els teus propis tuts si els has desat en les adreces d'interès
+    keep_self_fav: Mantenir els tuts que has afavorit
+    keep_self_fav_hint: No esborra els teus propis tuts si les has afavorit
     min_age:
       '1209600': 2 setmanes
       '15778476': 6 mesos
@@ -1535,8 +1542,8 @@ ca:
       '63113904': 2 anys
       '7889238': 3 mesos
     min_age_label: Antiguitat
-    min_favs: Mantenir les publicacions afavorides més de
-    min_favs_hint: No suprimeix cap de les teves publicacions que hagin rebut més d'aquesta quantitat de favorits. Deixa-ho en blanc per suprimir publicacions independentment del nombre de favorits que tinguin
+    min_favs: Mantenir els tuts afavorits més de
+    min_favs_hint: No suprimeix cap dels teus tuts que hagin rebut més d'aquesta quantitat de favorits. Deixa-ho en blanc per a suprimir tuts independentment del nombre de favorits que tinguin
     min_reblogs: Mantenir les publicacions impulsades més de
     min_reblogs_hint: No suprimeix cap de les teves publicacions que s'hagin impulsat més que aquest nombre de vegades. Deixa-ho en blanc per a suprimir les publicacions independentment del nombre d'impulsos que tinguin.
   stream_entries:
diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml
index f774459f7..0c29bb437 100644
--- a/config/locales/ckb.yml
+++ b/config/locales/ckb.yml
@@ -454,7 +454,6 @@ ckb:
     report_notes:
       created_msg: تێبینی ڕاپۆرت کردن بە سەرکەوتوویی دروست کرا!
       destroyed_msg: تێبینی گوزارشت بە سەرکەوتوویی سڕاوەتەوە!
-      today_at: ئەمڕۆ لە %{time}
     reports:
       account:
         notes:
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 923b4cd29..21ba100ea 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -122,6 +122,8 @@ cs:
       redownloaded_msg: Profil účtu %{username} byl úspěšně obnoven ze zdroje
       reject: Zamítnout
       rejected_msg: Žádost o registraci uživatele %{username} úspěšně zamítnuta
+      remote_suspension_irreversible: Data tohoto účtu byla nevratně smazána.
+      remote_suspension_reversible_hint_html: Účet byl pozastaven na svém serveru a data budou plně odstraněna dne %{date}. Do té doby může vzdálený server obnovit tento účet bez jakýchkoliv špatných efektů. Pokud chcete okamžitě odstranit všechna data účtu, můžete tak učinit níže.
       remove_avatar: Odstranit avatar
       remove_header: Odstranit záhlaví
       removed_avatar_msg: Úspěšně odstraněn avatar uživatele %{username}
@@ -583,7 +585,6 @@ cs:
     report_notes:
       created_msg: Poznámka o hlášení úspěšně vytvořena!
       destroyed_msg: Poznámka o hlášení úspěšně smazána!
-      today_at: Dnes v %{time}
     reports:
       account:
         notes:
@@ -732,6 +733,9 @@ cs:
       content_retention:
         preamble: Určuje, jak je obsah generovaný uživatelem uložen v Mastodonu.
         title: Uchovávání obsahu
+      default_noindex:
+        desc_html: Ovlivňuje všechny uživatele, kteří toto nastavení sami nezměnili
+        title: Odhlásit uživatele ze standardního indexování vyhledávačů
       discovery:
         follow_recommendations: Doporučená sledování
         preamble: Povrchový zajímavý obsah je užitečný pro zapojení nových uživatelů, kteří možná neznají žádného Mastodona. Mějte pod kontrolou, jak různé objevovací funkce fungují na vašem serveru.
@@ -1007,6 +1011,9 @@ cs:
       email_below_hint_html: Pokud je níže uvedená e-mailová adresa nesprávná, můžete ji změnit zde a nechat si poslat nový potvrzovací e-mail.
       email_settings_hint_html: Potvrzovací e-mail byl odeslán na %{email}. Pokud je tato adresa nesprávná, můžete ji změnit v nastavení účtu.
       title: Nastavení
+    sign_in:
+      preamble_html: Přihlaste se se svýma <strong>%{domain}</strong> údajema. Pokud je váš účet hostován na jiném serveru, nemůžete se zde přihlásit.
+      title: Přihlásit se k %{domain}
     sign_up:
       preamble: S účtem na tomto serveru Mastodon budete moci sledovat jakoukoliv jinou osobu v síti bez ohledu na to, kde je jejich účet hostován.
       title: Pojďme vás nastavit na %{domain}.
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index 94e529afa..130a8b121 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -128,6 +128,8 @@ cy:
       redownloaded_msg: Adnewyddwyd proffil %{username} o'r gweinydd gwreiddiol
       reject: Gwrthod
       rejected_msg: Wedi gwrthod cais cofrestru %{username}
+      remote_suspension_irreversible: Mae data'r cyfrif hwn wedi'i ddileu'n ddiwrthdro.
+      remote_suspension_reversible_hint_html: Mae'r cyfrif wedi'i atal dros dro ar eu gweinydd, a bydd y data'n cael ei ddileu yn llawn ar %{date}. Tan hynny, gall y gweinydd pell adfer y cyfrif hwn heb unrhyw effeithiau gwael. Os dymunwch gael gwared ar holl ddata'r cyfrif ar unwaith, gallwch wneud hynny isod.
       remove_avatar: Dileu afatar
       remove_header: Dileu pennyn
       removed_avatar_msg: Llwyddwyd i ddileu delwedd afatar %{username}
@@ -605,7 +607,6 @@ cy:
     report_notes:
       created_msg: Llwyddwyd i greu nodyn adroddiad!
       destroyed_msg: Llwyddwyd i ddileu nodyn adroddiad!
-      today_at: Heddiw am %{time}
     reports:
       account:
         notes:
@@ -760,6 +761,9 @@ cy:
       content_retention:
         preamble: Rheoli sut mae cynnwys sy'n cael ei gynhyrchu gan ddefnyddwyr yn cael ei storio yn Mastodon.
         title: Cadw cynnwys
+      default_noindex:
+        desc_html: Yn effeithio pob defnyddwr sydd heb newid y gosodiad ei hun
+        title: Eithrio defnyddwyr o fynegai peiriannau chwilio, fel rhagosodiad
       discovery:
         follow_recommendations: Dilyn yr argymhellion
         preamble: Mae amlygu cynnwys diddorol yn allweddol ar gyfer derbyn defnyddwyr newydd nad ydynt efallai'n gyfarwydd ag unrhyw un Mastodon. Rheolwch sut mae nodweddion darganfod amrywiol yn gweithio ar eich gweinydd.
@@ -1043,6 +1047,9 @@ cy:
       email_below_hint_html: Os yw'r cyfeiriad e-bost isod yn anghywir, gallwch ei newid yma a derbyn e-bost cadarnhau newydd.
       email_settings_hint_html: Anfonwyd yr e-bost cadarnhau at %{email}. Os nad yw'r cyfeiriad e-bost hwnnw'n gywir, gallwch ei newid yng ngosodiadau'r cyfrif.
       title: Gosodiad
+    sign_in:
+      preamble_html: Mewngofnodwch gyda'ch manylion <strong>%{domain}</strong>. Os yw eich cyfrif yn cael ei gynnal ar weinydd gwahanol, ni fydd modd i chi fewngofnodi yma.
+      title: Mewngofnodi i %{domain}
     sign_up:
       preamble: Gyda chyfrif ar y gweinydd Mastodon hwn, byddwch yn gallu dilyn unrhyw berson arall ar y rhwydwaith, lle bynnag mae eu cyfrif yn cael ei gynnal.
       title: Gadewch i ni eich gosod ar %{domain}.
diff --git a/config/locales/da.yml b/config/locales/da.yml
index c66a01153..a66fdc5f2 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -116,6 +116,8 @@ da:
       redownloaded_msg: "%{username}s profil opfrisket fra oprindelsesserver"
       reject: Afvis
       rejected_msg: "%{username}s tilmeldingsansøgning afvist"
+      remote_suspension_irreversible: Denne kontos data er slettet permanent.
+      remote_suspension_reversible_hint_html: Kontoen er suspenderet på den pågældende server, og kontodata fjernes fuldstændig pr. %{date}. Indtil da vil fjernserveren kunne foretage en komplet reetablering af kontoen. Ønskes alle kontodata fjernet straks, kan dette gøres nedenfor.
       remove_avatar: Fjern profilbillede
       remove_header: Fjern overskrift
       removed_avatar_msg: "%{username}s profilbillede fjernet"
@@ -555,13 +557,12 @@ da:
       pending: Afventer videreformidlers godkendelse
       save_and_enable: Gem og aktivér
       setup: Opsæt en videreformidlerforbindelse
-      signatures_not_enabled: Videreformidlere fungerer ikke korrekt, mens sikker tilstand eller begrænset federeringstilstand er aktiveret
+      signatures_not_enabled: I sikker tilstand eller begrænset federeringstilstand fungerer videreformidlere muligvis ikke korrekt
       status: Status
       title: Videreformidlere
     report_notes:
       created_msg: Anmeldelsesnotat er oprettet!
       destroyed_msg: Anmeldelsesnotat er slettet!
-      today_at: I dag %{time}
     reports:
       account:
         notes:
@@ -704,6 +705,9 @@ da:
       content_retention:
         preamble: Styr, hvordan Mastodon gemmer brugergenereret indhold.
         title: Indholdsopbevaring
+      default_noindex:
+        desc_html: Påvirker alle brugere, som ikke selv har ændret denne indstilling
+        title: Fravælg som standard søgemaskineindeksering for brugere
       discovery:
         follow_recommendations: Følg-anbefalinger
         preamble: At vise interessant indhold er vitalt ifm. at få nye brugere om bord, som måske ikke kender nogen på Mastodon. Styr, hvordan forskellige opdagelsesfunktioner fungerer på serveren.
@@ -971,6 +975,9 @@ da:
       email_below_hint_html: Er nedenstående e-mailadresse forkert, kan du rette den hér og modtage en ny bekræftelses-e-mail.
       email_settings_hint_html: Bekræftelsese-mailen er sendt til %{email}. Er denne e-mailadresse forkert, kan du rette den via kontoindstillingerne.
       title: Opsætning
+    sign_in:
+      preamble_html: Log ind med dine <strong>%{domain}</strong>-legitimationsoplysninger. Hostes kontoen på en anden server, vil der ikke kunne logges ind her.
+      title: Log ind på %{domain}
     sign_up:
       preamble: Med en konto på denne Mastodon-server vil man kunne følge enhver anden person på netværket, uanset hvor vedkommendes konto hostes.
       title: Lad os få dig sat op på %{domain}.
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 8a12a3047..b6b2638fa 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -73,7 +73,7 @@ de:
       followers: Follower
       follows: Folge ich
       header: Titelbild
-      inbox_url: Posteingangs-URL
+      inbox_url: Posteingangsadresse
       invite_request_text: Begründung für das Beitreten
       invited_by: Eingeladen von
       ip: IP-Adresse
@@ -83,11 +83,11 @@ de:
         local: Lokal
         remote: Extern
         title: Herkunft
-      login_status: Loginstatus
+      login_status: Anmeldestatus
       media_attachments: Medienanhänge
-      memorialize: In Gedenkmal verwandeln
-      memorialized: Memorialisiert
-      memorialized_msg: "%{username} wurde erfolgreich in ein In-Memoriam-Konto umgewandelt"
+      memorialize: In Gedenkseite umwandeln
+      memorialized: Gedenkseite
+      memorialized_msg: "%{username} wurde erfolgreich in ein Gedenkseiten-Konto umgewandelt"
       moderation:
         active: Aktiv
         all: Alle
@@ -116,6 +116,8 @@ de:
       redownloaded_msg: Das Profil %{username} wurde vom externen Server erfolgreich aktualisiert
       reject: Ablehnen
       rejected_msg: Antrag zur Registrierung von %{username} erfolgreich abgelehnt
+      remote_suspension_irreversible: Die Daten dieses Kontos wurden unwiderruflich gelöscht.
+      remote_suspension_reversible_hint_html: Das Konto wurde auf dem Server gesperrt und sämtliche Daten werden am %{date} entfernt. Bis dahin kann der Server dieses Konto ohne negative Auswirkungen wiederherstellen. Wenn du schon jetzt alle Daten des Kontos unwiderruflich löschen möchtest, kannst du dies nachfolgend tun.
       remove_avatar: Profilbild entfernen
       remove_header: Titelbild entfernen
       removed_avatar_msg: Profilbild von %{username} erfolgreich entfernt
@@ -128,7 +130,7 @@ de:
       reset_password: Passwort zurücksetzen
       resubscribe: Wieder abonnieren
       role: Rolle
-      search: Suche
+      search: Suchen
       search_same_email_domain: Andere Benutzer*innen mit der gleichen E-Mail-Domain
       search_same_ip: Andere Benutzer*innen mit derselben IP-Adresse
       security_measures:
@@ -136,10 +138,10 @@ de:
         password_and_2fa: Passwort und 2FA
       sensitive: Inhaltswarnung
       sensitized: Mit Inhaltswarnung versehen
-      shared_inbox_url: Geteilte Posteingang-URL
+      shared_inbox_url: Geteilte Posteingangsadresse
       show:
         created_reports: Erstellte Meldungen
-        targeted_reports: Von anderen gemeldet
+        targeted_reports: Von Anderen gemeldet
       silence: Stummschalten
       silenced: Stummgeschaltet
       statuses: Beiträge
@@ -262,7 +264,7 @@ de:
         enable_user_html: "%{name} hat den Zugang für %{target} aktiviert"
         memorialize_account_html: "%{name} hat das Konto von %{target} in eine Gedenkseite umgewandelt"
         promote_user_html: "%{name} hat %{target} befördert"
-        reject_appeal_html: "%{name} hat die Moderationsbeschlüsse von %{target} abgelehnt"
+        reject_appeal_html: "%{name} hat den Moderations-Beschlussantrag von %{target} abgelehnt"
         reject_user_html: "%{name} hat die Registrierung von %{target} abgelehnt"
         remove_avatar_user_html: "%{name} hat das Profilbild von %{target} entfernt"
         reopen_report_html: "%{name} hat die Meldung %{target} wieder geöffnet"
@@ -298,17 +300,17 @@ de:
         create: Ankündigung erstellen
         title: Neue Ankündigung
       publish: Veröffentlichen
-      published_msg: Ankündigung erfolgreich erstellt!
+      published_msg: Ankündigung erfolgreich veröffentlicht!
       scheduled_for: Geplant für %{time}
       scheduled_msg: Ankündigung ist zur Veröffentlichung vorgemerkt!
       title: Ankündigungen
       unpublish: Veröffentlichung rückgängig machen
-      unpublished_msg: Ankündigung ist jetzt nicht mehr sichtbar!
-      updated_msg: Ankündigung erfolgreich geändert!
+      unpublished_msg: Ankündigung erfolgreich unveröffentlicht!
+      updated_msg: Ankündigung erfolgreich aktualisiert!
     custom_emojis:
       assign_category: Kategorie zuweisen
-      by_domain: Domain der externen Instanz
-      copied_msg: Eine lokale Kopie des Emojis wurde erstellt
+      by_domain: Domain
+      copied_msg: Lokale Kopie des Emoji erfolgreich erstellt
       copy: Kopieren
       copy_failed_msg: Es konnte keine lokale Kopie des Emojis erstellt werden
       create_new_category: Neue Kategorie erstellen
@@ -317,11 +319,11 @@ de:
       destroyed_msg: Emoji erfolgreich gelöscht!
       disable: Deaktivieren
       disabled: Deaktiviert
-      disabled_msg: Das Emoji wurde deaktiviert
+      disabled_msg: Das Emoji wurde erfolgreich deaktiviert
       emoji: Emoji
       enable: Aktivieren
       enabled: Aktiviert
-      enabled_msg: Das Emoji wurde aktiviert
+      enabled_msg: Das Emoji wurde erfolgreich aktiviert
       image_hint: PNG oder GIF bis %{size}
       list: Aufführen
       listed: Angezeigt
@@ -374,7 +376,7 @@ de:
       created_msg: Domain wurde erfolgreich zur Whitelist hinzugefügt
       destroyed_msg: Domain wurde von der Whitelist entfernt
       export: Exportieren
-      import: Importieren
+      import: Import
       undo: Von der Whitelist entfernen
     domain_blocks:
       add_new: Neue Domain-Sperre hinzufügen
@@ -510,7 +512,7 @@ de:
       public_comment: Öffentlicher Kommentar
       purge: Löschen
       purge_description_html: Wenn du glaubst, dass diese Domain endgültig offline ist, kannst du alle Account-Datensätze und zugehörigen Daten aus dieser Domain löschen. Das kann eine Weile dauern.
-      title: Externe Instanzen
+      title: Föderation
       total_blocked_by_us: Von uns gesperrt
       total_followed_by_them: Gefolgt von denen
       total_followed_by_us: Gefolgt von uns
@@ -561,7 +563,6 @@ de:
     report_notes:
       created_msg: Meldungs-Kommentar erfolgreich erstellt!
       destroyed_msg: Meldungs-Kommentar erfolgreich gelöscht!
-      today_at: Heute um %{time}
     reports:
       account:
         notes:
@@ -656,7 +657,7 @@ de:
         manage_custom_emojis: Eigene Emojis verwalten
         manage_custom_emojis_description: Erlaubt es Benutzer*innen, eigene Emojis auf dem Server zu verwalten
         manage_federation: Föderation verwalten
-        manage_federation_description: Erlaubt es Benutzer*innen, Domains anderer Mastodon-Instanzen zu sperren oder zuzulassen – und die Zustellbarkeit zu steuern.
+        manage_federation_description: Erlaubt Nutzer*innen, Domains anderer Mastodon-Server zu sperren oder zuzulassen – und die Zustellbarkeit zu steuern
         manage_invites: Einladungen verwalten
         manage_invites_description: Erlaubt es Benutzer*innen, Einladungslinks zu durchsuchen und zu deaktivieren
         manage_reports: Meldungen verwalten
@@ -666,7 +667,7 @@ de:
         manage_rules: Serverregeln verwalten
         manage_rules_description: Erlaubt es Benutzer*innen, Serverregeln zu ändern
         manage_settings: Einstellungen verwalten
-        manage_settings_description: Erlaubt es Benutzer*innen, Einstellungen dieser Instanz zu ändern
+        manage_settings_description: Erlaubt Nutzer*innen, Einstellungen dieses Servers zu ändern
         manage_taxonomies: Taxonomien verwalten
         manage_taxonomies_description: Ermöglicht Benutzer*innen, die Trends zu überprüfen und die Hashtag-Einstellungen zu aktualisieren
         manage_user_access: Benutzer*in-Zugriff verwalten
@@ -704,6 +705,9 @@ de:
       content_retention:
         preamble: Lege fest, wie lange nutzergenerierte Inhalte auf deiner Mastodon-Instanz gespeichert werden.
         title: Cache & Archive
+      default_noindex:
+        desc_html: Betrifft alle Benutzer, die diese Einstellung nicht selbst geändert haben
+        title: Benutzer standardmäßig von der Suchmaschinen-Indizierung ausnehmen
       discovery:
         follow_recommendations: Folgeempfehlungen
         preamble: Das Auffinden interessanter Inhalte ist wichtig, um neue Nutzer einzubinden, die Mastodon noch nicht kennen. Bestimme, wie verschiedene Suchfunktionen auf deinem Server funktionieren.
@@ -714,7 +718,7 @@ de:
       domain_blocks:
         all: Allen
         disabled: Niemandem
-        users: Benutzer*innen deiner Instanz
+        users: Für angemeldete lokale Benutzer*innen
       registrations:
         preamble: Lege fest, wer auf Deinem Server ein Konto erstellen darf.
         title: Registrierungen
@@ -816,7 +820,7 @@ de:
         not_discoverable: Autor*in hat sich dafür entschieden, nicht entdeckt zu werden
         shared_by:
           one: Einmal geteilt oder favorisiert
-          other: "%{friendly_count}-mal geteilt oder favorisiert"
+          other: "%{friendly_count} mal geteilt oder favorisiert"
         title: Angesagte Beiträge
       tags:
         current_score: Aktuelle Punktzahl %{score}
@@ -971,6 +975,9 @@ de:
       email_below_hint_html: Wenn die unten stehende E-Mail-Adresse falsch ist, kannst du sie hier ändern und eine neue Bestätigungs-E-Mail erhalten.
       email_settings_hint_html: Die Bestätigungs-E-Mail wurde an %{email} gesendet. Wenn diese E-Mail-Adresse nicht korrekt ist, kannst du sie in den Einstellungen ändern.
       title: Konfiguration
+    sign_in:
+      preamble_html: Melde dich mit deinen Zugangsdaten für <strong>%{domain}</strong> an. Solltest du dein Konto auf einem anderen Server registriert haben, ist eine Anmeldung hier nicht möglich.
+      title: Bei %{domain} anmelden
     sign_up:
       preamble: Mit einem Account auf diesem Mastodon-Server kannst du jeder anderen Person im Netzwerk folgen, unabhängig davon, wo ihr Account gehostet wird.
       title: Okay, lass uns mit %{domain} anfangen.
@@ -1602,7 +1609,7 @@ de:
       explanation:
         delete_statuses: Einige deiner Beiträge wurden als Verstoß gegen eine oder mehrere Gemeinschaftsrichtlinien erkannt und von den Moderator*innen von %{instance} entfernt.
         disable: Du kannst dein Konto nicht mehr verwenden, aber dein Profil und andere Daten bleiben unversehrt. Du kannst eine Sicherung deiner Daten anfordern, die Kontoeinstellungen ändern oder dein Konto löschen.
-        mark_statuses_as_sensitive: Ein oder mehrere deiner Beiträge wurden von den Moderator*innen der Instanz %{instance} mit einer Inhaltswarnung versehen. Das bedeutet, dass Besucher*innen diese Medien in den Beiträgen zunächst antippen müssen, um die Vorschau anzuzeigen. Beim Verfassen der nächsten Beiträge kannst du auch selbst eine Inhaltswarnung für hochgeladene Medien festlegen.
+        mark_statuses_as_sensitive: Ein oder mehrere deiner Beiträge wurden von den Moderator*innen von %{instance} mit einer Inhaltswarnung versehen. Das bedeutet, dass Besucher*innen diese Medien in den Beiträgen zunächst antippen müssen, um die Vorschau anzuzeigen. Beim Verfassen der nächsten Beiträge kannst du auch selbst eine Inhaltswarnung für hochgeladene Medien festlegen.
         sensitive: Von nun an werden alle deine hochgeladenen Mediendateien mit einer Inhaltswarnung versehen und hinter einer Warnung versteckt.
         silence: Solange dein Konto limitiert ist, können nur die Leute, die dir bereits folgen, deine Beiträge auf dem Server sehen, und es könnte sein, dass du von verschiedenen öffentlichen Listungen ausgeschlossen wirst. Andererseits können andere dir manuell folgen.
         suspend: Du kannst dein Konto nicht mehr verwenden und dein Profil und andere Daten sind nicht mehr verfügbar. Du kannst dich immer noch anmelden, um eine Sicherung deiner Daten anzufordern, bis die Daten innerhalb von 30 Tagen vollständig gelöscht wurden. Allerdings werden wir einige Daten speichern, um zu verhindern, dass du die Sperrung umgehst.
diff --git a/config/locales/devise.be.yml b/config/locales/devise.be.yml
index d9872b516..3bf35daed 100644
--- a/config/locales/devise.be.yml
+++ b/config/locales/devise.be.yml
@@ -31,7 +31,7 @@ be:
         subject: 'Mastodon: адрас электроннай пошты зменены'
         title: Новы адрас электроннай пошты
       password_change:
-        explanation: Пароль вашага акаўнту быў зменены.
+        explanation: Пароль для вашага ўліковага запісу быў зменены
         extra: Калі вы не змянялі свой пароль, верагодна, нехта атрымаў доступ да вашага ўліковага запісу. Калі ласка, неадкладна змяніце свой пароль або звярніцеся да адміністратара сервера, калі вы заблакаваны з вашага ўліковага запісу
         subject: 'Mastodon: пароль зменены'
         title: Пароль зменены
@@ -42,7 +42,7 @@ be:
         title: Пацвердзіце адрас электроннай пошты
       reset_password_instructions:
         action: Змяніць пароль
-        explanation: Запыт новага пароля для вашага акаўнту.
+        explanation: Вы запыталі новы пароль для свайго ўліковага запісу.
         extra: Калі вы не рабілі такога запыту, калі ласка, ігнаруйце гэты ліст. Ваш пароль не будзе зменены, пакуль вы не пяройдзеце па спасылцы вышэй і не створыце новы.
         subject: 'Mastodon: Інструкцыі па скіданню пароля'
         title: Скіданне пароля
diff --git a/config/locales/devise.bg.yml b/config/locales/devise.bg.yml
index 45e11ccd6..d3d5e9b70 100644
--- a/config/locales/devise.bg.yml
+++ b/config/locales/devise.bg.yml
@@ -2,9 +2,9 @@
 bg:
   devise:
     confirmations:
-      confirmed: Вашият адрес на имейл беше успешно потвърден.
-      send_instructions: Ще получите е-писмо с указания как да потвърдите адреса на имейла си за няколко минути. Проверете си папката за спам, ако не сте получили това е-писмо.
-      send_paranoid_instructions: Ако адресът на имейл ви съществува в базата ни данни, ще получите е-писмо с указания как да потвърдите адреса на имейла си за няколко минути. Проверете си папката за спам, ако не сте получили това е-писмо.
+      confirmed: Успешно потвърден е адресът на имейла ви.
+      send_instructions: Ще получите имейл с указания как да потвърдите своя имейл адреса след няколко минути. Моля, проверете спам папката си, ако не сте получили такъв имейл.
+      send_paranoid_instructions: Ако вашият имейл адрес съществува в нашата база данни, ще получите имейл с указания как да потвърдите имейл адреса си след няколко минути. Проверете спам папката си, ако не сте получили такъв имейл.
     failure:
       already_authenticated: Вече сте влезли.
       inactive: Акаунтът ви още не е задействан.
@@ -13,18 +13,18 @@ bg:
       locked: Вашият акаунт е заключен.
       not_found_in_database: Невалиден %{authentication_keys} или парола.
       pending: Вашият акаунт все още е в процес на проверка.
-      timeout: Сесията ви изтече. Влезте пак, за да продължите.
+      timeout: Заседанието ви изтече. Влезте пак, за да продължите.
       unauthenticated: Преди да продължите, трябва да влезете или да се регистрирате.
       unconfirmed: Преди да продължите, трябва да потвърдите имейл адреса си.
     mailer:
       confirmation_instructions:
-        action: Потвърдете своя имейл адрес
+        action: Потвърдете адреса на имейла
         action_with_app: Потвърдете и се върнете към %{app}
         explanation: Създали сте акаунт на %{host} с този имейл адрес. Само на едно щракване разстояние сте от активирането му. Ако това не сте били вие, моля, игнорирайте този имейл.
         explanation_when_pending: Кандидатствахте за покана до %{host} с този имейл адрес. След като потвърдите своя имейл адрес, ние ще разгледаме вашето заявление. Можете да влезете, за да промените данните си или да изтриете акаунта си, но нямате достъп до повечето функции, докато акаунтът ви не бъде одобрен. Ако вашето заявление бъде отхвърлено, вашите данни ще бъдат премахнати, така че няма да се изискват допълнителни действия от вас. Ако това не сте били вие, моля, игнорирайте този имейл.
-        extra_html: Моля, проверете <a href="%{terms_path}">правилата на сървъра</a> и <a href="%{policy_path}">нашите условия за обслужване</a>.
+        extra_html: Проверете <a href="%{terms_path}">правилата на сървъра</a> и <a href="%{policy_path}">условията ни за обслужване</a>.
         subject: 'Mastodon: Указания за потвърждаване за %{instance}'
-        title: Потвърдете своя имейл адрес
+        title: Потвърдете адреса на имейла
       email_changed:
         explanation: 'Имейл адресът на вашия акаунт се променя на:'
         extra: Ако не сте сменили имейла си, вероятно някой е получил достъп до вашия акаунт. Моля, сменете паролата си незабавно или се свържете с администратора на сървъра, ако сте блокирани от акаунта си.
@@ -37,7 +37,7 @@ bg:
         title: Паролата е променена
       reconfirmation_instructions:
         explanation: Потвърдете новия адрес, за да промените имейла си.
-        extra: Ако тази промяна не е инициирана от вас, моля, игнорирайте този имейл. Имейл адресът за акаунта на Mastodon няма да се промени, докато не влезете в линка по-горе.
+        extra: Ако тази промяна не е инициирана от вас, то игнорирайте този имейл. Адресът на имейл за акаунта в Mastodon няма да се промени, докато не влезете в горната връзка.
         subject: 'Mastodon: Потвърдете имейла за %{instance}'
         title: Потвърдете своя имейл адрес
       reset_password_instructions:
@@ -49,15 +49,15 @@ bg:
       two_factor_disabled:
         explanation: Двуфакторното удостоверяване за вашия акаунт е деактивирано. Влизането вече е възможно, като се използват само имейл адрес и парола.
         subject: 'Mastodon: Двуфакторното удостоверяване е деактивирано'
-        title: 2FA деактивирано
+        title: Двуфакторното изключено
       two_factor_enabled:
-        explanation: За вашия акаунт е активирано двуфакторно удостоверяване. За влизане ще е необходим ключ, генериран от сдвоеното приложение за TOTP.
-        subject: 'Mastodon: Двуфакторното удостоверяване е активирано'
+        explanation: За акаунта ви е включено двуфакторно удостоверяване. Отсега нататък ще ви трябва и временен код от сдвоеното приложение за удостоверяване TOTP, за да влезете.
+        subject: 'Mastodon: Включено двуфакторно удостоверяване'
         title: 2FA активирано
       two_factor_recovery_codes_changed:
-        explanation: Предишните кодове за възстановяване са анулирани и и се генерират нови.
-        subject: 'Mastodon: Възстановени са двуфакторни кодове за възстановяване'
-        title: 2FA кодове за възстановяване са променени
+        explanation: Предишните кодове за възстановяване са анулирани и се пораждат нови.
+        subject: 'Mastodon: Породени пак са двуфакторни кодове за възстановяване'
+        title: Кодове за 2 факт. удост. за възстановяване са променени
       unlock_instructions:
         subject: 'Mastodon: указания за отключване'
       webauthn_credential:
@@ -66,47 +66,47 @@ bg:
           subject: 'Mastodon: Нов ключ за сигурност'
           title: Добавен е нов ключ за сигурност
         deleted:
-          explanation: Следният ключ за сигурност е изтрит от вашия акаунт
+          explanation: Следният ключ за сигурност е изтрит от акаунта ви
           subject: 'Mastodon: Ключът за сигурност е изтрит'
-          title: Един от вашите ключове за сигурност е изтрит
+          title: Един от ключовете ви за сигурност е изтрит
       webauthn_disabled:
-        explanation: Удостоверяването с ключове за сигурност е деактивирано за вашия акаунт. Влизането вече е възможно, използвайки само ключа, генериран от сдвоеното приложение за TOTP.
-        subject: 'Mastodon: Удостоверяването с ключове за сигурност е деактивирано'
+        explanation: Удостоверяването с ключове за сигурност е изключено за акаунта ви. Влизането вече е възможно, използвайки само ключа, породен от сдвоеното приложение TOTP.
+        subject: 'Mastodon: Изключено удостоверяване с ключове за сигурност'
         title: Ключовете за сигурност са деактивирани
       webauthn_enabled:
         explanation: Удостоверяването с ключ за сигурност е активирано за вашия акаунт. Вашият ключ за сигурност вече може да се използва за вход.
         subject: 'Mastodon: Активирано удостоверяване с ключ за сигурност'
         title: Ключовете за сигурност са активирани
     omniauth_callbacks:
-      failure: Не успяхме да те упълномощим чрез %{kind}, защото "%{reason}".
-      success: Успешно упълномощаване чрез %{kind} профил.
+      failure: Не успяхме да ви упълномощим от %{kind}, защото "%{reason}".
+      success: Успешно упълномощаване от акаунт на %{kind}.
     passwords:
-      no_token: Може да достъпваш тази страница само от имейл за промяна на паролата. Ако тази страница е отворена от такъв имейл, увери се, че използваш целия URL-адрес, който сме ти изпратили.
-      send_instructions: Ако вашият имейл адрес съществува в нашата база данни, ще получите линк за възстановяване на парола на същия адрес до няколко минути. Моля, проверете спам папката си, ако не сте получили този имейл.
-      send_paranoid_instructions: Ако вашият имейл адрес съществува в нашата база данни, ще получите линк за възстановяване на парола на същия адрес до няколко минути. Моля, проверете спам папката си, ако не сте получили този имейл.
-      updated: Паролата ти беше променена успешно. Влизането в профила е успешно.
+      no_token: Не можете да осъществите достъп до тази страница, ако не сте я отворили чрез линк от получен имейл за възстановяване на паролата. Ако сте отворили линка за възстановяване на паролата от имейл, моля, уверете се, че сте използвали целия предоставен URL адрес.
+      send_instructions: Ако адресът на имейла ви съществува в базата ни данни, то ще получите връзка за възстановяване на парола на е-пощата си до няколко минути. Проверете си папката за спам, ако не сте получили това е-писмо.
+      send_paranoid_instructions: Ако адресът на имейла ви съществува в базата ни данни, то ще получите връзка за възстановяване на парола на е-пощата си до няколко минути. Проверете си папката за спам, ако не сте получили това е-писмо.
+      updated: Паролата ви беше променена успешно. Сега сте влезли.
       updated_not_active: Паролата ви беше променена успешно.
     registrations:
       destroyed: Довиждане! Вашият акаунт беше успешно изтрит. Надяваме се скоро да ви видим пак.
       signed_up: Добре дошли! Успешно се регистрирахте.
-      signed_up_but_inactive: Регистрирахте се успешно. Въпреки това, не можете да влезете, тъй като акаунтът ви все още не е активиран.
+      signed_up_but_inactive: Регистрирахте се успешно. Въпреки това, не може да влезете, тъй като акаунтът ви още не е задействан.
       signed_up_but_locked: Регистрирахте се успешно. Въпреки това, не можете да влезете, тъй като акаунтът ви е заключен.
-      signed_up_but_pending: На вашия имейл адрес е изпратено съобщение с връзка за потвърждение. След като щракнете върху линка, ние ще прегледаме вашето заявление. Ще бъдете уведомени, ако то е одобрено.
-      signed_up_but_unconfirmed: Писмо с връзка за потвърждаване профила ви беше изпратено на вашия имейл адрес. Моля, последвайте линка, за да активирате своя профил.
-      update_needs_confirmation: Профилът ви е успешно променен, но ние трябва да проверим вашия нов имейл адрес. Моля, проверете пощата си и отворете линка за потвърждаване на новия адрес.
-      updated: Профилът ти е успешно променен.
+      signed_up_but_pending: Изпратено е съобщение до адреса на имейла ви с връзка за потвърждение. След като щракнете върху линка, ние ще прегледаме заявлението ви. Ще бъдете уведомени при одобрение.
+      signed_up_but_unconfirmed: Съобщение с линк за потвърждение беше изпратено до вашия имейл адрес. Последвайте линка, за да задействате акаунта си. Проверете спам папката си, ако не сте получили такъв имейл.
+      update_needs_confirmation: Успешно обновихте акаунта си, но трябва да потвърдим вашия нов имейл адрес. Проверете електронната си поща и отворете отворете линка за потвърждение на новия си имейл адрес. Проверете спам папката си, ако не сте получили имейл за потвърждение.
+      updated: Акаунтът ви е успешно осъвременен.
     sessions:
       already_signed_out: Успешно излизане от профила.
       signed_in: Успешно влизане.
       signed_out: Успешно излизане.
     unlocks:
-      send_instructions: Ще получиш писмо с инструкции как да отключиш профила си до няколко минути.
-      send_paranoid_instructions: Ако твоят профил съществува в базата ни, на своя имейл адрес ще получиш инструкции за отключването му до няколко минути.
-      unlocked: Твоят профил беше отключен успешно. За да продължиш, влез в него.
+      send_instructions: Ще получите имейл с указания как да отключите акаунта си до няколко минути. Проверете папката си за спам, ако не сте получили такъв имейл.
+      send_paranoid_instructions: Ако вашият акаунт съществува, ще получите имейл с указания за отключването му до няколко минути. Проверете спам папката си, ако не сте получили такъв имейл.
+      unlocked: Акаунтът ви е успешно отключен. Влезте, за да продължите.
   errors:
     messages:
-      already_confirmed: е вече потвърден, моля опитай да влезеш в профила си с него
-      confirmation_period_expired: трябва да се потвърди в рамките на %{period}, моля направи нова заявка за потвърждение
+      already_confirmed: е вече потвърден, опитайте се да влезете
+      confirmation_period_expired: трябва да се потвърди в рамките на %{period}, направете нова заявка за потвърждение
       expired: е изтекъл, моля заяви нов
       not_found: не е намерен
       not_locked: не бе заключен
diff --git a/config/locales/devise.et.yml b/config/locales/devise.et.yml
index 4142eaec8..9fd54d142 100644
--- a/config/locales/devise.et.yml
+++ b/config/locales/devise.et.yml
@@ -2,43 +2,43 @@
 et:
   devise:
     confirmations:
-      confirmed: Teie e-postiaadress on edukalt kinnitatud.
-      send_instructions: Te saate paari minuti pärast e-kirja juhistega, kuidas oma e-posti aadressit kinnitada. Palun kontrollige oma rämpsposti kausta juhul, kui te ei saanud seda e-kirja.
-      send_paranoid_instructions: Kui teie e-postiaadress eksisteerib meie andmebaasis, saate paari minuti pärast e-kirja juhistega, kuidas oma e-posti aadressit kinnitada. Palun kontrollige oma rämpsposti kausta juhul, kui te ei saanud seda e-kirja.
+      confirmed: Sinu e-postiaadress on edukalt kinnitatud.
+      send_instructions: Saad paari minuti pärast juhistega e-kirja, kuidas oma e-posti aadress kinnitada. Palun kontrolli oma rämpsposti kausta, kui selline e-kiri ei saabunud.
+      send_paranoid_instructions: Kui sinu e-postiaadress on meie andmebaasis, saad paari minuti pärast juhistega e-kirja, kuidas oma e-posti aadress kinnitada. Palun kontrolli oma rämpsposti kausta, kui selline e-kiri ei saabunud.
     failure:
-      already_authenticated: Te olete juba sisse loginud.
-      inactive: Teie konto pole veel aktiveeritud.
+      already_authenticated: Oled juba sisse loginud.
+      inactive: Sinu konto pole veel aktiveeritud.
       invalid: Valed %{authentication_keys} või salasõna.
-      last_attempt: Teil on veel üks katse kuni teie konto on lukustatud.
-      locked: Teie konto on lukustatud.
+      last_attempt: Sul on veel üks katse, enne kui konto lukustatakse.
+      locked: Konto on lukustatud.
       not_found_in_database: Valed %{authentication_keys} või salasõna.
-      pending: Teie konto on siiani läbivaatlusel.
-      timeout: Teie sessioon on aegunud. Jätkamiseks palun sisenege uuesti.
-      unauthenticated: Te peate sisenema või looma konto enne jätkamist.
-      unconfirmed: Te peate kinnitama oma e-postiaadressi enne jätkamist.
+      pending: Sinu konto on siiani läbivaatamisel.
+      timeout: Sinu sessioon on aegunud. Jätkamiseks palun sisene uuesti.
+      unauthenticated: Pead sisenema või looma konto enne kui jätkad.
+      unconfirmed: Pead kinnitama oma e-postiaadressi enne kui jätkad.
     mailer:
       confirmation_instructions:
         action: Kinnita e-postiaadress
         action_with_app: Kinnita ja naase %{app}
-        explanation: Te olete loonud %{host} konto selle e-postiaadressiga. Te olete ühe kliki kaugusel selle aktiveerimisest. Kui see polnud teie, palun eirake seda kirja.
-        explanation_when_pending: Te esitasite taotluse liituda %{host} kasutajaks selle e-postiaadressiga. Palun kinnitage oma e-posti aadress ja siis vaatame me teie taotluse üle. Võite logida sisse, et oma andmeid muuta või konto kustutada, aga te ei saa ligi enamustele tegevustele enne, kui teie konto on kinnitatud moderaatorite poolt. Kui teie taotlus tagasi lükatakse, kustutatakse teie andmed, seega pole mingit järgevat tegevust teie poolt vaja. Kui see polnud teie, siis palun eirake seda kirja. Kui konto on kinnitatud, siis saate selle kohta eraldi e-kirja.
-        extra_html: Palun tutvuge <a href="%{terms_path}">meie serveri reeglitega</a> ning <a href="%{policy_path}">meie kasutustingimustega</a>.
+        explanation: Oled loonud %{host} konto selle e-postiaadressiga. Oled konto aktiveerimisest ühe kliki kaugusel. Kui see polnud sina, palun eira seda kirja.
+        explanation_when_pending: "Selle e-postiaadressiga on esitatud taotlus saada %{host} kasutajaks. E-postiaadress vajab kinnitamist. Pärast seda vaatame me taotluse üle. Saad siseneda, et oma andmeid muuta või konto kustutada, aga enamustele tegevustele ei pääse enne ligi, kui konto on meie moderaatorite poolt kinnitatud. Kui konto on kinnitatud, saabub selle kohta eraldi e-kiri.\nKui taotlus lükatakse aga tagasi, kustutatakse ka andmed ja mingit järeltegevust pole vaja. \nKui see polnud sina, siis palume seda kirja eirata."
+        extra_html: Palun tutvu <a href="%{terms_path}">meie serveri reeglitega</a> ning <a href="%{policy_path}">meie kasutustingimustega</a>.
         subject: 'Mastodon: %{instance} kinnitamisjuhised'
         title: Kinnita e-postiaadress
       email_changed:
-        explanation: 'Teie konto e-postiaadress muudetakse:'
-        extra: Kui te ei muutnud oma e-posti, on tõenäoline, et kellelgi on ligipääs teie kontole. Palun muutke oma salasõna koheselt või võtke ühendust oma serveri administraatoriga, kui olete oma kontost välja lukustatud.
+        explanation: 'Sinu konto e-postiaadress muudetakse:'
+        extra: Kui sa ei muutnud oma e-posti, on tõenäoline, et kellelgi on ligipääs su kontole. Palun muuda koheselt oma salasõna. Kui oled aga oma kontost välja lukustatud, võta ühendust oma serveri administraatoriga.
         subject: 'Mastodon: e-post muudetud'
         title: Uus e-postiaadress
       password_change:
         explanation: Konto salasõna on vahetatud.
-        extra: Kui Te ei muutnud oma salasõna, on tõenäoline, et keegi on teie kontole ligi pääsenud. Palun muutke viivitamata oma salasõna või võtke ühendust serveri haldajaga, kui oma kontole ligi ei pääse.
+        extra: Kui sa ei muutnud oma salasõna, on tõenäoline, et keegi on su kontole ligi pääsenud. Palun muuda viivitamata oma salasõna. Kui sa oma kontole ligi ei pääse, võta ühendust serveri haldajaga.
         subject: 'Mastodon: salasõna muudetud'
         title: Salasõna muudetud
       reconfirmation_instructions:
-        explanation: Kinnitage oma uus aadress, et muuta oma e-posti aadressi.
-        extra: Kui see muudatus pole teie poolt alustatud, palun eirake seda kirja. E-postiaadress sellele Mastodoni kontole ei muutu, kuni te vajutate üleval asuvale lingile.
-        subject: 'Mastodon: kinnitake e-postiaadress %{instance} jaoks'
+        explanation: Kinnita uus aadress, et oma e-posti aadress muuta.
+        extra: Kui see muudatus pole sinu poolt algatatud, palun eira seda kirja. Selle Mastodoni konto e-postiaadress ei muutu enne, kui vajutad üleval olevale lingile.
+        subject: 'Mastodon: kinnita e-postiaadress %{instance} jaoks'
         title: Kinnita e-postiaadress
       reset_password_instructions:
         action: Salasõna muutmine
@@ -47,11 +47,11 @@ et:
         subject: 'Mastodon: salasõna lähtestamisjuhendid'
         title: Salasõna lähtestamine
       two_factor_disabled:
-        explanation: Kontol on kahe-etapine autentimine välja lülitatud. Sisenemine on võimalik ainult kasutades e-postiaadressi ja salasõna.
+        explanation: Kontol on kaheastmeline autentimine välja lülitatud. Sisenemine on võimalik ainult kasutades e-postiaadressi ja salasõna.
         subject: 'Mastodon: Kahe-etapine autentimine välja lülitatud'
         title: 2FA keelatud
       two_factor_enabled:
-        explanation: Kontol on sisse lülitatud kahe-etapine autentimine. Sisenemiseks on vajalik ühekordne aeguv võti TOTP-rakenduse poolt.
+        explanation: Kontol on sisse lülitatud kaheastmeline autentimine. Sisenemiseks on vajalik ühekordne aeguv võti TOTP-rakenduse poolt.
         subject: 'Mastodon: Kahe-etapine autentimine sisse lülitatud'
         title: 2FA lubatud
       two_factor_recovery_codes_changed:
@@ -62,52 +62,52 @@ et:
         subject: 'Mastodon: Lahti lukustamis juhendid'
       webauthn_credential:
         added:
-          explanation: Järgnev turvavõti on lisatud teie kontole
+          explanation: Kontole on lisatud järgnev turvavõti
           subject: 'Mastodon: uus turvavõti'
           title: Uus turvavõti on lisatud
         deleted:
-          explanation: Järgnev turvavõti on teie kontolt kustutatud
+          explanation: Järgnev turvavõti on kontolt kustutatud
           subject: 'Mastodon: turvavõti kustutatud'
-          title: Üks teie turvavõtmetest on kustutatud
+          title: Üks sinu turvavõtmetest on kustutatud
       webauthn_disabled:
-        explanation: Autentimine turvavõtmetega on teie kontol välja lülitatud. Sisse logimine on nüüd võimalik ainult kasutades TOTP rakenduse poolt tekitatud võtmega.
+        explanation: Autentimine turvavõtmetega on kontol välja lülitatud. Sisse logimine on nüüd võimalik ainult kasutades seotud TOTP rakenduse poolt genereeritud võtit.
         subject: 'Mastodon: autentimine turvavõtmega on välja lülitatud'
         title: Turvavõtmed on välja lülitatud
       webauthn_enabled:
-        explanation: Turvavõtme autentimine on teie kontol nüüd sisse lülitatud. Teie turvavõtit saab nüüd kasutada sisse logimiseks.
+        explanation: Turvavõtmega autentimine on nüüd kontol sisse lülitatud. Nüüd saab kasutada sisse logimiseks sinu turvavõtit.
         subject: 'Mastodon: turvavõtme autentimine sisse lülitatud'
         title: Turvavõtmed on sisse lülitatud
     omniauth_callbacks:
       failure: Ei saanud teid tuvastada %{kind} kaudu, kuna "%{reason}".
       success: Tuvastamine %{kind} konto järgi õnnestus.
     passwords:
-      no_token: Te ei saa sellele leheküljele ligi ilma tulemata salasõna lähtestamis e-kirjast. Kui te tulete salasõna lähtestamise e-kirjast, palun olge kindel, et kasutasite tervet teile antud URLi.
-      send_instructions: Kui teie e-postiaadress eksisteerib meie andmebaasis, saate paari minuti pärast e-kirja juhistega, kuidas oma salasõna taastada. Palun kontrollige oma rämpsposti kausta juhul, kui te ei saanud seda e-kirja.
-      send_paranoid_instructions: Kui teie e-postiaadress eksisteerib meie andmebaasis, saate paari minuti pärast e-kirja juhistega, kuidas oma salasõna taastada. Palun kontrollige oma rämpsposti kausta juhul, kui te ei saanud seda e-kirja.
-      updated: Teie salasõna muutmine õnnestus. Te olete nüüd sisse loginud.
-      updated_not_active: Teie salasõna muutmine õnnestus.
+      no_token: Sellele leheküljele ei pääse tulemata salasõna lähtestamise e-kirjast. Kui tuled salasõna lähtestamise e-kirjast, palun veendu, et kasutasid tervet saadetud URLi.
+      send_instructions: Kui sinu e-postiaadress on meie andmebaasis, saad paari minuti pärast juhistega e-kirja, kuidas oma salasõna taastada. Palun kontrolli rämpsposti kausta, kui selline e-kiri ei saabunud.
+      send_paranoid_instructions: Kui sinu e-postiaadress on meie andmebaasis, saad paari minuti pärast juhistega e-kirja, kuidas oma salasõna taastada. Palun kontrolli rämpsposti kausta, kui selline e-kiri ei saabunud.
+      updated: Salasõna muutmine õnnestus. Oled nüüd sisse logitud.
+      updated_not_active: Sinu salasõna muutmine õnnestus.
     registrations:
-      destroyed: Nägemist! Teie konto sulgemine õnnestus. Me loodame teid varsti taas näha.
-      signed_up: Tere tulemast! Teie konto loomine õnnestus.
-      signed_up_but_inactive: Teie konto loodi edukalt, kuid me ei saanud teid sisse logida, kuna teie konto pole veel aktiveeritud.
-      signed_up_but_locked: Teie konto loodi edukalt, kuid me ei saanud teid sisse logida, kuna teie konto on lukustatud.
-      signed_up_but_pending: Kiri kinnituslingiga saadeti teie e-postile. Pärast seda, kui te vajutate lingile, vaatame me teie taotluse üle. Teid teavitatakse, kui see on vastu võetud.
-      signed_up_but_unconfirmed: Kiri kinnituslingiga saadeti teie e-postile. Palun järgige linki, et aktiveerida oma konto. Palun kontrollige oma rämpsposti, kui te ei saanud seda e-kirja.
-      update_needs_confirmation: Teie konto uuendamine õnnestus, kuid me peame teie e-postiaadressit kinnitama. Palun kontrollige oma e-posti ning järgige linki, et kinnitada oma e-postiaadress. Palun kontrollige oma rämpsposti, kui te ei saanud seda e-kirja.
-      updated: Teie konto uuendamine õnnestus.
+      destroyed: Nägemist! sinu konto sulgemine õnnestus. Me loodame sind varsti taas näha.
+      signed_up: Tere tulemast! Sinu konto loomine õnnestus.
+      signed_up_but_inactive: Sinu konto loodi edukalt, kuid me ei saanud sind sisse logida, kuna konto pole veel aktiveeritud.
+      signed_up_but_locked: Sinu konto loodi edukalt, kuid me ei saanud sind sisse logida, kuna konto on lukustatud.
+      signed_up_but_pending: Kiri kinnituslingiga saadeti sinu e-postile. Pärast seda, kui oled vajutanud kinnituslingile, vaatame me taotluse üle. Saad teavituse, kui taotlus on vastu võetud.
+      signed_up_but_unconfirmed: Kiri kinnituslingiga saadeti sinu e-postile. Palun järgi linki, et oma konto aktiveerida. Palun kontrolli rämpspostikausta, kui selline kiri ei saabunud.
+      update_needs_confirmation: Konto uuendamine õnnestus, kuid e-postiaadress tuleb veel kinnitada. Palun kontrolli oma e-posti ning järgi kirjas olevat kinnituslinki, et e-postiaadress kinnitada. Palun kontrolli rämpspostikausta, kui selline kiri ei saabunud.
+      updated: Konto uuendamine õnnestus.
     sessions:
       already_signed_out: Väljumine õnnestus.
       signed_in: Sisenemine õnnestus.
       signed_out: Väljumine õnnestus.
     unlocks:
-      send_instructions: Te saate paari minuti pärast e-kirja juhistega, kuidas oma konto lukust lahti teha. Palun kontrollige oma rämpsposti kausta juhul, kui te ei saanud seda e-kirja.
-      send_paranoid_instructions: Kui teie konto eksisteerib, saate te paari minuti pärast e-kirja juhistega, kuidas see lukust lahti teha. Palun kontrollige oma rämpsposti kausta juhul, kui te ei saanud seda e-kirja.
-      unlocked: Teie konto lukust lahti võtmine õnnestus. Jätkamiseks palun logige sisse.
+      send_instructions: Saad paari minuti pärast juhistega e-kirja, kuidas oma konto lukust lahti teha. Palun kontrolli oma rämpsposti kausta, kui selline kiri ei saabunud.
+      send_paranoid_instructions: Kui konto on olemas, saabub paari minuti pärast e-kiri juhistega, kuidas konto lukust lahti teha. Palun kontrolli rämpsposti kausta, kui selline e-kiri ei saabunud.
+      unlocked: Sinu konto avamine õnnestus. Jätkamiseks palun logi sisse.
   errors:
     messages:
-      already_confirmed: oli juba kinnitatud, palun proovige sisse logida
-      confirmation_period_expired: peab olema kinnitatud ajavahemikus %{period}, palun taotlege uuesti
-      expired: on aegunud, palun taotlege uuesti
+      already_confirmed: on juba kinnitatud, palun proovi sisse logida
+      confirmation_period_expired: peab olema kinnitatud ajavahemikus %{period}, palun taotle uuesti
+      expired: on aegunud, palun taotle uuesti
       not_found: ei leitud
       not_locked: ei olnud lukustatud
       not_saved:
diff --git a/config/locales/devise.fi.yml b/config/locales/devise.fi.yml
index 606be8d47..ce5a35efd 100644
--- a/config/locales/devise.fi.yml
+++ b/config/locales/devise.fi.yml
@@ -111,5 +111,5 @@ fi:
       not_found: ei löydy
       not_locked: ei ollut lukittu
       not_saved:
-        one: 'Yksi virhe esti kohteen %{resource} tallentamisen:'
-        other: "%{count} virhettä esti kohteen %{resource} tallentamisen:"
+        one: '1 virhe esti kohteen %{resource} tallennuksen:'
+        other: "%{count} virhettä esti kohteen %{resource} tallennuksen:"
diff --git a/config/locales/devise.fy.yml b/config/locales/devise.fy.yml
index 9cdc97dd7..3a7ead83e 100644
--- a/config/locales/devise.fy.yml
+++ b/config/locales/devise.fy.yml
@@ -7,14 +7,14 @@ fy:
       send_paranoid_instructions: As dyn e-mailadres yn de database stiet, ûntfangsto fia in e-mailberjocht ynstruksjes hoe’tsto dyn account befêstigje kinst. Sjoch yn de map net-winske wannear’t neat ûntfongen waard.
     failure:
       already_authenticated: Do bist al oanmeld.
-      inactive: Jo account is not net aktivearre.
+      inactive: Jo account is noch net aktivearre.
       invalid: "%{authentication_keys} of wachtwurd ûnjildich."
       last_attempt: Do hast noch ien besykjen oer eardat dyn account blokkearre wurdt.
       locked: Dyn account is blokkearre.
       not_found_in_database: "%{authentication_keys} of wachtwurd ûnjildich."
       pending: Dyn account moat noch hieltyd beoardiele wurde.
       timeout: Dyn sesje is ferrûn, meld dy opnij oan.
-      unauthenticated: Do moatst oanmelde of registrearje.
+      unauthenticated: Jo moatte oanmelde of registrearje.
       unconfirmed: Do moatst earst dyn account befêstigje.
     mailer:
       confirmation_instructions:
@@ -25,10 +25,93 @@ fy:
         extra_html: |-
           128 / 5.000
           Kontrolearje ek <a href="%{terms_path}">de regels fan de server</a> en <a href="%{policy_path}">ús tsjinstbetingsten</a>.
-        subject: 'Mastodon: Befêstiging ynstruksjes foar %{instance}'
-        title: E-mailadres neigean
+        subject: 'Mastodon: Befêstigingsynstruksjes foar %{instance}'
+        title: E-mailadres ferifiearje
       email_changed:
-        explanation: 'It e-mailadres foar jo akkount wurdt feroare yn:'
-        extra: As jo ​​jo mailadres net wizige hawwe, is it wierskynlik dat immen tagong hat ta jo akkount. Wizigje asjebleaft jo wachtwurd daliks of nim kontakt op mei de server-admin as jo útsletten binne fan jo akkount.
+        explanation: 'It e-mailadres foar jo account wurdt wizige yn:'
+        extra: As jo ​​jo e-mailadres net wizige hawwe, is it wierskynlik dat immen tagong hat ta jo account. Wizigje jo wachtwurd daliks of nim kontakt op mei de server-admin as jo útsletten binne fan jo account.
+        subject: 'Mastodon: E-mailadres is wizige'
+        title: Nij e-mailadres
+      password_change:
+        explanation: It wachtwurd fan dizze account is wizige.
+        extra: As jo ​​jo wachtwurd net wizige hawwe, is it wierskynlik dat immen tagong hat ta jo account. Wizigje jo wachtwurd daliks of nim kontakt op mei de serveradmin as jo útsletten binne fan jo account.
+        subject: 'Mastodon: Wachtwurd wizige'
+        title: Wachtwurd wizige
+      reconfirmation_instructions:
+        explanation: Befêstigje jo nije e-mailadres om dizze te wizigjen.
+        extra: Wannear’t jo dizze wiziging net útfierd hawwe, meie jo dit e-mailberjocht negearje. It e-mailadres fan jo Mastodon-account wurdt pas werklik wizige oant jo de keppeling hjirboppe oanklikke.
+        subject: 'Mastodon: Befêstigje it e-mailadres foar %{instance}'
+        title: E-mailadres ferifiearje
+      reset_password_instructions:
+        action: Wachtwurd wizigje
+        explanation: Jo hawwe in nij wachtwurd foar jo account oanfrege.
+        extra: Wannear’t jo dit net oanfrege hawwe, meie jo dit e-mailberjocht negearje. Jo wachtwurd wurdt pas wizige neidat jo de keppeling hjirboppe oanklikt hawwe en in nij wachtwurd oanmeitsje.
+        subject: 'Mastodon: Wachtwurd opnij ynstelle'
+        title: Wachtwurd opnij ynstelle
+      two_factor_disabled:
+        explanation: Twa-stapsferifikaasje foar jo account is útskeakele. Jo kinne no allinnich oanmelde mei in e-mailadres en wachtwurd.
+        subject: 'Mastodon: Twa-stapsferifikaasje útskeakele'
+        title: Twa-stapsferifikaasje útskeakele
+      two_factor_enabled:
+        explanation: Twa-stapsferifikaasje foar jo account is ynskeakele. Om oanmelde te kinnen is in troch in twa-stapsferifikaasje-app generearre tagongskoade nedich.
+        subject: 'Mastodon: Twa-stapsferifikaasje ynskeakele'
+        title: Twa-stapsferifikaasje ynskeakele
+      two_factor_recovery_codes_changed:
+        explanation: De foarige werstelkoaden binne ûnjildich makke en nije binne oanmakke.
+        subject: 'Mastodon: Twa-staps-werstelkoaden binne opnij oanmakke'
+        title: Werstelkoaden twa-stapsferifikaasje wizige
+      unlock_instructions:
+        subject: 'Mastodon: Ynstruksjes foar ûntskoatteljen'
+      webauthn_credential:
+        added:
+          explanation: De folgjende befeiligingskaai is oan jo account tafoege
+          subject: 'Mastodon: Nije befeiligingskaai'
+          title: In nije befeiligingskaai is tafoege
+        deleted:
+          explanation: De folgjende befeiligingskaai is út jo account fuortsmiten
+          subject: 'Mastodon: Befeiligingskaai fuortsmiten'
+          title: Ien fan jo befeiligingskaaien is fuortsmiten
+      webauthn_disabled:
+        explanation: Ferifikaasje mei befeiligingskaaien is útskeakele foar jo account. Oanmelden is no allinnich mooglik mei it gebrûk fan in troch in keppele TOTP-app generearre kaai.
+        subject: 'Mastodon: Ferifikaasje mei befeiligingskaaien is útskeakele'
+        title: Befeiligingskaaien útskeakele
+      webauthn_enabled:
+        explanation: Ferifikaasje mei befeiligingskaaien is ynskeakele foar jo account. Jo befeiligingskaai kin no brûkt wurde om oan te melden.
+        subject: 'Mastodon: Ferifikaasje mei befeiligingskaaien is ynskeakele'
+        title: Befeiligingskaaien ynskeakele
+    omniauth_callbacks:
+      failure: Oanmelden mei jo %{kind}-account mislearre, omdat ‘%{reason}’.
+      success: Mei sukses mei jo %{kind}-account oanmeld.
     passwords:
-      updated_not_active: Jo wachtwurd is mei sukses feroare.
+      no_token: Jo kinne dizze side net benaderje sûnder dat jo in e-mailberjocht om jo wachtwurd opnij yn te stellen ûntfongen hawwe.
+      send_instructions: Jo ûntfange fia in e-mailberjocht ynstruksjes hoe’t jo jo wachtwurd opnij ynstelle moatte. Sjoch tusken jo net-winske wannear neat ûntfongen waard.
+      send_paranoid_instructions: Jo ûntfange fia in e-mailberjocht ynstruksjes hoe’t jo jo wachtwurd opnij ynstelle moatte. Sjoch tusken jo net-winske wannear neat ûntfongen waard.
+      updated: Jo wachtwurd is wizige. Jo binne no oanmeld.
+      updated_not_active: Jo wachtwurd is mei sukses wizige.
+    registrations:
+      destroyed: Jo account is mei sukses fuortsmiten. Miskien oant sjen.
+      signed_up: Jo binne registrearre.
+      signed_up_but_inactive: Jo binne registrearre. Jo koene allinnich net automatysk oanmeld wurde, omdat jo account noch net aktivearre is.
+      signed_up_but_locked: Jo binne registrearre. Jo koene allinnich net automatysk oanmeld wurde, omdat jo account beskoattele is.
+      signed_up_but_pending: Der is in berjocht mei in befêstigingskeppeling nei jo e-mailadres ferstjoerd. Neidat jo op dizze keppeling klikt hawwe nimme wy jo oanfraach yn behanneling. Jo wurde op de hichte steld wannear’t dizze goedkard wurdt.
+      signed_up_but_unconfirmed: Jo ûntfange fia in e-mailberjocht ynstruksjes hoe’t jo jo account aktivearje kinne. Sjoch tusken jo net-winske wannear’t neat ûntfongen waard.
+      update_needs_confirmation: Jo hawwe jo e-mailadres mei sukses wizige, mar wy moatte jo nije e-mailadres noch befêstigje. Kontrolearje jo Postfek YN en klik op de keppeling yn it e-mailberjocht om jo e-mailadres te befêstigjen. Sjoch tusken jo net-winske wannear’t neat ûntfongen waard.
+      updated: Jo accountgegevens binne bewarre.
+    sessions:
+      already_signed_out: Mei sukses ôfmeld.
+      signed_in: Mei sukses oanmeld.
+      signed_out: Mei sukses ôfmeld.
+    unlocks:
+      send_instructions: Jo ûntfange fia in e-mailberjocht ynstruksjes hoe’t jo jo account ûntskoattelje kinne. Sjoch yn de map net-winske wannear’t neat ûntfongen waard.
+      send_paranoid_instructions: As jo account bestiet, ûntfange jo fia in e-mailberjocht ynstruksjes hoe’t jo jo account ûntskoattelje kinne. Sjoch yn de map net-winske wannear’t neat ûntfongen waard.
+      unlocked: Jo account is net mear beskoattele. Jo kinne no wer oanmelde.
+  errors:
+    messages:
+      already_confirmed: is al befêstige
+      confirmation_period_expired: moat befêstige wurde binnen %{period}, probearje it nochris
+      expired: is ferrûn, freegje in nije oan
+      not_found: net fûn
+      not_locked: is net beskoattele
+      not_saved:
+        one: '1 flater ferhindere it bewarjen fan dizze %{resource}:'
+        other: "%{count} flaters ferhinderje it bewarjen fan dizze %{resource}:"
diff --git a/config/locales/devise.ku.yml b/config/locales/devise.ku.yml
index d5d0105ef..6debd96e0 100644
--- a/config/locales/devise.ku.yml
+++ b/config/locales/devise.ku.yml
@@ -3,8 +3,8 @@ ku:
   devise:
     confirmations:
       confirmed: Navnîşana te ya e-nameyê bi awayekî serkeftî hat piştrastkirin.
-      send_instructions: Çend xulek şûnde ji bo navnîşana e-name ya te çawa were pejirandinê, tu yê e-name yek hildî. Heke ev e-name yê hilnedî ji kerema xwe re peldanka nexwestî binêre.
-      send_paranoid_instructions: Heger navnîşana e-name ya te danegeha me de hebe çend xulek şûnde ji bo navnîşana e-name ya te çawa were pejirandinê, tu yê e-name yek hildî. Heke ev e-name yê hilnedî ji kerema xwe re peldanka nexwestî binêrin.
+      send_instructions: Çend xulek şûnde ji bo navnîşana e-name ya te wê rênasînên pejirandinê were şandin. Ku ev e-name ji te re nehate ji kerema xwe re peldanka nexwestî (Spam) binêre.
+      send_paranoid_instructions: Ku navnîşana e-name ya te danegeha me de hebe çend xulek şûnde ji bo navnîşana e-name ya te çawa were pejirandinê, tu yê e-nameyek ji te re bê şandin. Ku te ev e-name nestand ji kerema xwe re peldanka nexwestî (Spam) binêre.
     failure:
       already_authenticated: Jixwe te berê têketin kiriye.
       inactive: Ajimêra te hîn nehatiye çalakkirin.
@@ -20,34 +20,34 @@ ku:
       confirmation_instructions:
         action: Navnîşana e-nameyê piştrast bike
         action_with_app: Piştrast bike û vegere bo %{app}
-        explanation: Te li ser %{host} ajimêrek çê kiriye bi navnîşana vê e-nameyê re. Tu ji çalakkirina wê bi tikandinekê dûr î. Heke ev ne tu bûya, ji kerema xwe guh nede vê e-nameyê.
+        explanation: Te li ser %{host} ajimêrek çê kiriye bi navnîşana vê e-nameyê re. Tu ji çalakkirina wê bi tikandinekê dûr î. Ku ev ne tu bûya, ji kerema xwe vê e-nameyê paşguh bike.
         explanation_when_pending: |-
           Te bi vê navnîşana e -nameyê serlêdana vexwendina %{host} kir. Gava ku tu navnîşana e-nameya xwe piştrast bikî, em ê serlêdana te binirxînin. Tu dikarî têkevî da ku hûrguliyên xwe biguherînî an ajimêra xwe jê bibî, lê heya ku ajimêra te neyê pejirandin tu nekarî piraniya fonksiyonan bi kar bînî
-           Heke serlêdana te werê red kirin, dê daneyên te werin jêbirin, ji ber vê yekê çalakîyek din ji te nayê xwestin. Heke ev ne tu bû, ji kerema xwe guh nede vê e-nameyê.
+          Ku serlêdana te neyê erêkirin, wê daneyên te werin jêbirin, ji ber vê yekê çalakîyek din ji te nayê xwestin. Ku ev ne tu bû, ji kerema xwe vê e-nameyê paşguh bike.
         extra_html: Jkx vê jî kontrol bike <a href="%{terms_path}"> rêbazên rajekar</a> û <a href="%{policy_path}">mercên me yên karûbaran</a>.
         subject: 'Mastodon: ji bo %{instance} pejirandinê rêwerzan'
         title: Navnîşana e-nameyê piştrast bike
       email_changed:
         explanation: 'Navnîşana e-nameyê ajimêra te hate guhertin bo:'
-        extra: Ku te ajimêra xwe neguhertiye. Ew tê wateya ku kesek ketiye ajimêrê te. Jkx pêborîna xwe zû biguherîne an jî bi rêveberiya rajekar re têkeve têkiliyê heke tu êdî nikare ajimêra xwe bi kar bînî.
+        extra: Ku te e-nameya xwe neguhertiye. Ew tê wateya ku kesek ketiye ajimêrê te. Ji kerema xwe borînpeyva xwe zû biguherîne an jî bi rêveberiya rajekar re têkeve têkiliyê ku tu êdî nikare ajimêra xwe bi kar bînî.
         subject: 'Mastodon: E-name hate guhertin'
         title: Navnîşana e-nameya nû
       password_change:
         explanation: Borînpeyva ajimêra te hate guhertin.
-        extra: Ku te ajimêra xwe neguhertiye. Ew tê wateya ku kesek ketiye ajimêrê te. Jkx pêborîna xwe zû biguherîne an jî bi rêveberiya rajekar re têkeve têkiliyê heke tu êdî nikare ajimêra xwe bi kar bînî.
+        extra: Ku te borînpeyva xwe neguhertiye. Ew tê wateya ku kesek ketiye ajimêrê te. Ji kerema xwe borînpeyva xwe zû biguherîne an jî bi rêveberiya rajekar re têkeve têkiliyê ku tu êdî nikarî ajimêra xwe bi kar bînî.
         subject: 'Mastodon: Borînpeyv hate guhertin'
         title: Borînpeyv hate guhertin
       reconfirmation_instructions:
         explanation: Navnîşana nû piştrast bike da ku tu e-nameya xwe biguherînî.
         extra: |-
-          Heke ev daxwaz ji aliyê te de nehate pêkanîn, jkx guh nede vê e-nameyê
-           Navnîşana e-nameyê bo ajimêra Mastodon wê tu guhertin pêk neyîne heya ku tu li girêdana Jêrin bitikînî.
+          Ku ev daxwaz ji aliyê te de nehate pêkanîn, ji kerema xwe vê e-nameyê paşguh bike.
+          Navnîşana e-nameyê bo ajimêra Mastodon wê tu guhertin pêk neyîne heya ku tu li girêdana jêrin bitikînî.
         subject: 'Mastodon: E-nameyê piştrast bike bo %{instance}'
         title: Navnîşana e-nameyê piştrast bike
       reset_password_instructions:
         action: Borînpeyvê biguherîne
         explanation: Te ji bo ajimêra xwe daxwaza pêborîneke nû kiriye.
-        extra: Heke te ev daxwaz nekir, jkx guh nede vê e-nameyê. Borînpeyva te wê neyê guhertin heya ku tu li girêdana Jêrin bitikînî û yeka nû çê bikî.
+        extra: Ku te ev daxwaz nekiriye, ji kerema xwe vê e-nameyê paşguh bike. Borînpeyva te wê neyê guhertin heya ku tu li girêdana jêrin bitikînî û yeka nû biafirînî.
         subject: 'Mastodon: rêwerzên jê birina pêborîn'
         title: Borînpeyv ji nû ve saz bike
       two_factor_disabled:
@@ -85,9 +85,9 @@ ku:
       failure: Nikare ji %{kind} rastandinê bikê ji bo " %{reason}".
       success: Ji ajimêra %{kind} bi serkeftî hate rastandin.
     passwords:
-      no_token: Tu nikarî xwe bigihînî vê rûpelê bêyî ku tu ji e-nameya ji nû ve sazkirina borînpeyvê wernegerî. Heke tu ji e-nameya ji nû ve sazkirina borînpeyvê tê, ji kerema xwe pê ewle be ku tu girêdanê ya tevahî bi kar tînî.
-      send_instructions: Heke navnîşana te ya e-nameyê di danegeha me da hebê, tu yê di navnîşana xwe ya e-nameyê da girêdana rizgarkirina borînpeyvê bistînî. Heke te ev e-name wernegirtibe, ji kerema xwe peldanka xwe ya spamê kontrol bike.
-      send_paranoid_instructions: Heke navnîşana te ya e-nameyê di danegeha me da hebê, tu yê di navnîşana xwe ya e-nameyê da girêdana rizgarkirina borînpeyvê bistînî di hundir çend xulkan de. Heke te ev e-name wernegirtibe, ji kerema xwe peldanka xwe ya spamê kontrol bike.
+      no_token: Tu nikarî xwe bigihînî vê rûpelê bêyî ku tu ji e-nameya ji nû ve sazkirina borînpeyvê wernegerî. Ku tu ji e-nameya ji nû ve sazkirina borînpeyvê tê, ji kerema xwe pê ewle be ku tu girêdanê ya tevahî bi kar tînî.
+      send_instructions: Ku navnîşana te ya e-nameyê di danegeha me da hebê, tu yê di navnîşana xwe ya e-nameyê da girêdana rizgarkirina borînpeyvê bistînî. Ku te ev e-name nestand, ji kerema xwe peldanka xwe ya spamê kontrol bike.
+      send_paranoid_instructions: Ku navnîşana te ya e-nameyê di danegeha me da hebê, tu yê di navnîşana xwe ya e-nameyê da girêdana rizgarkirina borînpeyvê bistînî di hundir çend xulekan de. Ku te ev e-name nestand, ji kerema xwe peldanka xwe ya nexwestî (spam) kontrol bike.
       updated: Borînpeyva te bi serkeftî hate guhertin. Niha tu têketî ye.
       updated_not_active: Borînpeyva te bi serkeftî hate guhertin.
     registrations:
@@ -95,17 +95,17 @@ ku:
       signed_up: Bi xêr hatî! Te bi serkeftî tomarkirin kir.
       signed_up_but_inactive: Te bi serkeftî tomarkirin kir. lê piştî ku tu çalak bikî em dikarin ku tu têketinê bikî.
       signed_up_but_locked: Te bi serkeftî tomarkirin kir. lê ajimêra te girtiye ber wê tu nikarî ku têketinê bikî.
-      signed_up_but_pending: Peyamek bi girêda pejirandinê ji navnîşana e-nameya te re hate şandin. Piştî ku tu girêdanê bitikînî, em ê serlêdana te binirxînin. Heke werê pejirandin tu yê bê agahdarkirin.
-      signed_up_but_unconfirmed: Peyamek bi girêda pejirandinê ji navnîşana e-nameya te re hate şandin. Ji kerema xwe girêdanê bişopîne da ku tu ajimêra xwe çalak bikî. Ji kerema xwe heke te ev e-name nestand peldanka spama xwe kontrol bike.
-      update_needs_confirmation: Te ajimêra xwe bi awayekî serkeftî rojane kir, lê pêdiviya me bi kontrolkirina navnîşana e -nameya te ya nû heye. Ji kerema xwe e -nameya xwe kontrol bike û girêdana piştrastkirinê bişopîne da ku navnîşana e -nameya xwe ya nû piştrast bikî. Ji kerema xwe heke te ev e -name nestand peldanka spama xwe kontrol bike.
+      signed_up_but_pending: Peyamek bi girêdana pejirandinê ji navnîşana e-nameya te re hate şandin. Piştî ku tu girêdanê bitikînî, em ê serlêdana te binirxînin. Ku were pejirandin tu yê bê agahdarkirin.
+      signed_up_but_unconfirmed: Peyamek bi girêdana pejirandinê ji navnîşana e-nameya te re hate şandin. Ji kerema xwe girêdanê bişopîne da ku tu ajimêra xwe çalak bikî. Ji kerema xwe ku te ev e-name nestand peldanka nexwestî (spam) ya xwe kontrol bike.
+      update_needs_confirmation: Te ajimêra xwe bi awayekî serkeftî rojane kir, lê pêdiviya me bi kontrolkirina navnîşana e -nameya te ya nû heye. Ji kerema xwe e -nameya xwe kontrol bike û girêdana piştrastkirinê bişopîne da ku navnîşana e -nameya xwe ya nû piştrast bikî. Ji kerema xwe ku te ev e-name nestand peldanka nexwestî (spam) ya xwe kontrol bike.
       updated: Ajimêra te bi awayekî serkeftî hate rojanekirin.
     sessions:
       already_signed_out: Derketina te serkeftî bû.
       signed_in: Têketina te serkeftî bû.
       signed_out: Derketina te serkeftî bû.
     unlocks:
-      send_instructions: Çend xulek şûnde ji bo navnîşana e-name ya te çawa were pejirandinê, tu yê e-name yek hildî. Heke ev e-name yê hilnedî ji kerema xwe re peldanka nexwestî binêrin.
-      send_paranoid_instructions: Hek ajimêra te hebe, tu yê e-nameyeke bi zanyariyan bistînî ka mirov çawa di çend xulekan de ajimêr vedikê. Ji kerema xwe heke te ev e-name nestand peldanka spama xwe kontrol bike.
+      send_instructions: Çend xulek şûnde ji bo navnîşana e-name ya te çawa were pejirandinê, tu yê e-nameyekê bistînî. Ku ev e-name yê nestand ki kerema xwe re peldanka nexwestî (Spam) ya xwe binêre.
+      send_paranoid_instructions: Ku ajimêra te hebe, tu yê e-nameyeke bi zanyariyan bistînî ka mirov çawa di çend xulekan de ajimêr vedikê. Ji kerema xwe ku te ev e-name nestand peldanka nexwestî (spam) ya xwe kontrol bike.
       unlocked: Ajimêra te bi serkeftî vebû. Ji kerema xwe têkeve da ku tu bidomînî.
   errors:
     messages:
diff --git a/config/locales/devise.la.yml b/config/locales/devise.la.yml
new file mode 100644
index 000000000..3a7ba0d44
--- /dev/null
+++ b/config/locales/devise.la.yml
@@ -0,0 +1 @@
+la:
diff --git a/config/locales/devise.sv.yml b/config/locales/devise.sv.yml
index c1696d3b4..e02983ad5 100644
--- a/config/locales/devise.sv.yml
+++ b/config/locales/devise.sv.yml
@@ -84,16 +84,16 @@ sv:
       no_token: Du kan inte komma åt den här sidan utan att komma från ett e-postmeddelande för lösenordsåterställning. Om du kommer från ett lösenordsåterställt e-postmeddelande, var vänlig och se till att du använde hela webbadressen.
       send_instructions: Om din e-postadress finns i vår databas, får du en länk för återställning av lösenord på din e-postadress om några minuter. Kontrollera din spammapp om du inte fick det här e-postmeddelandet.
       send_paranoid_instructions: Om din e-postadress finns i vår databas, får du en länk för återställning av lösenord på din e-postadress om några minuter. Kontrollera din spammapp om du inte fick det här e-postmeddelandet.
-      updated: Ditt lösenord har ändrats framgångsrikt. Du är nu inloggad.
+      updated: Ditt lösenord har ändrats. Du är nu inloggad.
       updated_not_active: Ditt lösenord har ändrats. Du är nu inloggad.
     registrations:
-      destroyed: Adjö! Ditt konto har blivit nerstängt. Vi hoppas att vi ses snart igen.
+      destroyed: Adjö! Ditt konto har blivit nedstängt. Vi hoppas att vi snart ses igen.
       signed_up: Välkommen! Du har nu registrerat dig.
       signed_up_but_inactive: Du har nu registrerat dig. Vi kunde dock inte logga in dig eftersom ditt konto ännu inte är aktiverat.
       signed_up_but_locked: Du har nu registrerat dig. Vi kunde dock inte logga in eftersom ditt konto är låst.
       signed_up_but_pending: Ett meddelande med en bekräftelselänk har skickats till din e-postadress. När du klickar på länken kommer vi att granska din ansökan. Du kommer att meddelas om den godkänns.
       signed_up_but_unconfirmed: Ett meddelande med en bekräftelselänk har skickats till din e-postadress. Vänligen följ länken för att aktivera ditt konto. Kontrollera din skräppostmapp om du inte fick det här e-postmeddelandet.
-      update_needs_confirmation: Du har uppdaterat ditt konto med framgång, men vi måste verifiera din nya e-postadress. Vänligen kolla din email och följ bekräfta länken för att bekräfta din nya e-postadress. Kontrollera din spammapp om du inte fick det här e-postmeddelandet.
+      update_needs_confirmation: Du har uppdaterat ditt konto, men vi måste verifiera din nya e-postadress. Vänligen kolla din e-post och följ bekräfta-länken för att bekräfta din nya e-postadress. Kontrollera din skräppost om du inte fick e-postmeddelandet.
       updated: Ditt konto har uppdaterats utan problem.
     sessions:
       already_signed_out: Utloggad.
diff --git a/config/locales/devise.vi.yml b/config/locales/devise.vi.yml
index 348f347e6..2139daca7 100644
--- a/config/locales/devise.vi.yml
+++ b/config/locales/devise.vi.yml
@@ -22,7 +22,7 @@ vi:
         action_with_app: Xác nhận và quay lại %{app}
         explanation: Bạn đã tạo một tài khoản trên %{host} với địa chỉ email này. Chỉ cần một cú nhấp chuột nữa để kích hoạt nó. Nếu đây không phải là bạn, xin vui lòng bỏ qua email này.
         explanation_when_pending: Bạn vừa đăng ký %{host} với địa chỉ email này. Chúng tôi chỉ xem xét đơn đăng ký sau khi bạn xác minh địa chỉ email. Bạn có thể đăng nhập để thay đổi chi tiết hoặc xóa tài khoản của mình, nhưng bạn không thể sử dụng đầy đủ tính năng cho đến khi tài khoản được xác minh. Nếu bạn bị từ chối, dữ liệu của bạn sẽ bị xóa, do đó bạn sẽ không cần phải làm gì thêm nữa. Nếu không phải do bạn đăng ký, xin vui lòng bỏ qua email này.
-        extra_html: Xin đọc kỹ <a href="%{terms_path}">quy tắc máy chủ</a> và <a href="%{policy_path}">chính sách riêng tư</a> của chúng tôi.
+        extra_html: Xin đọc kỹ <a href="%{terms_path}">nội quy máy chủ</a> và <a href="%{policy_path}">chính sách bảo mật</a> của chúng tôi.
         subject: 'Mastodon: Xác minh email cho %{instance}'
         title: Xác minh địa chỉ email
       email_changed:
diff --git a/config/locales/doorkeeper.ar.yml b/config/locales/doorkeeper.ar.yml
index 137ee3eae..88aaaa345 100644
--- a/config/locales/doorkeeper.ar.yml
+++ b/config/locales/doorkeeper.ar.yml
@@ -149,9 +149,19 @@ ar:
     scopes:
       admin:read: قراءة كافة البيانات على الخادم
       admin:read:accounts: قراءة المعلومات الحساسة عن كافة الحسابات
+      admin:read:canonical_email_blocks: قراءة معلومات حساسة عن كل بريد إلكتروني أساسي
+      admin:read:domain_allows: قراءة المعلومات الحساسة عن كافة النطاقات المسموحة
+      admin:read:domain_blocks: قراءة المعلومات الحساسة عن كافة النطاقات المحجوبة
+      admin:read:email_domain_blocks: قراءة المعلومات الحساسة عن كل بريد إلكتروني محجوبة
+      admin:read:ip_blocks: قراءة المعلومات الحساسة عن كافة العناوين IP المحجوبة
       admin:read:reports: قراءة المعلومات الحساسة الواردة في جميع التقارير والحسابات المبلغ عنها
       admin:write: تعديل كافة البيانات على الخادم
       admin:write:accounts: اتخاذ إجراءات إشراف على الحسابات
+      admin:write:canonical_email_blocks: اتخاذ إجراءات إشراف على البريد الإلكتروني الأساسيين المحجوبين
+      admin:write:domain_allows: اتخاذ إجراءات إشراف على النطاقات المسموحين
+      admin:write:domain_blocks: اتخاذ إجراءات إشراف على النطاقات المحجوبين
+      admin:write:email_domain_blocks: اتخاذ إجراءات إشراف على نطاقات البريد الإلكتروني المحجوبين
+      admin:write:ip_blocks: اتخاذ إجراءات إشراف على عناوين IP المحجوبين
       admin:write:reports: اتخاذ إجراءات إشراف على الإبلاغات
       crypto: استخدم التشفير من الطرف إلى نهاية الطرف
       follow: تعديل علاقات الحساب
diff --git a/config/locales/doorkeeper.ast.yml b/config/locales/doorkeeper.ast.yml
index d85c0bcea..445d1093c 100644
--- a/config/locales/doorkeeper.ast.yml
+++ b/config/locales/doorkeeper.ast.yml
@@ -39,6 +39,7 @@ ast:
         title: Prodúxose un error
       new:
         prompt_html: "%{client_name}, que ye una aplicación de terceros, quier tener accesu a la cuenta. <strong>Si nun t'enfotes nella, nun habríes autorizala.</strong>"
+        review_permissions: Revisión de los permisos
       show:
         title: Copia esti códigu d'autorización ya apiégalu na aplicación.
     authorized_applications:
diff --git a/config/locales/doorkeeper.be.yml b/config/locales/doorkeeper.be.yml
index 3f031904a..2a7447449 100644
--- a/config/locales/doorkeeper.be.yml
+++ b/config/locales/doorkeeper.be.yml
@@ -4,7 +4,7 @@ be:
     attributes:
       doorkeeper/application:
         name: Назва праграмы
-        redirect_uri: URI перанакіравання
+        redirect_uri: перанакіравць URI
         scopes: Дазволы
         website: Вэб-сайт праграмы
     errors:
@@ -13,7 +13,7 @@ be:
           attributes:
             redirect_uri:
               fragment_present: не можа ўтрымліваць фрагмент
-              invalid_uri: павінен быць сапраўдным URI
+              invalid_uri: URI павінен быць сапраўдным
               relative_uri: павінен быць абсалютным URI.
               secured_uri: павінен быць HTTPS/SSL URI.
   doorkeeper:
@@ -51,7 +51,7 @@ be:
         application_id: Ключ кліента
         callback_urls: URL зваротных выклікаў
         scopes: Дазволы
-        secret: Кліенцкая таямніца
+        secret: Кліенцкі сакрэт
         title: 'Праграма: %{name}'
     authorizations:
       buttons:
@@ -80,7 +80,7 @@ be:
         title: Вашы аўтарызаваныя праграмы
     errors:
       messages:
-        access_denied: Уласнік рэсурсу або сервер аўтарызацыі адхіліў ваш запыт.
+        access_denied: Уласнік рэсурсу або сэрвер аўтарызацыі адхіліў ваш запыт.
         credential_flow_not_configured: Resource Owner Password Credentials flow не прайшоў з-за таго, што ўласцівасць Doorkeeper.configure.resource_owner_from_credentials была не вызначана.
         invalid_client: Збой аўтэнтыфікацыі кліента з-за невядомага кліента, адсутнасці аўтэнтыфікацыі кліента або метаду аўтэнтыфікацыі, які не падтрымліваецца.
         invalid_grant: Прадастаўлены дазвол на аўтарызацыю несапраўдны, пратэрмінованы, быў адкліканы, не адпавядае URI перанакіравання, які выкарыстоўваецца ў запыце аўтарызацыі або быў выдадзены іншаму кліенту.
@@ -89,18 +89,18 @@ be:
           missing_param: 'Адсутнічае абавязковы параметр: %{value}.'
           request_not_authorized: Запыт павінен быць аўтарызаваны. Абавязковы параметр для запыту аўтарызацыі адсутнічае або несапраўдны.
           unknown: У запыце адсутнічае абавязковы параметр, уключае значэнне параметра, якое не падтрымліваецца, альбо ён сфарміраваны іншым няправільным чынам.
-        invalid_resource_owner: Прадастаўленыя ўліковыя дадзеныя ўладальніка рэсурсу несапраўдныя або немагчыма знайсці ўладальніка рэсурсу
-        invalid_scope: Запытаная обласць абмежаванняў несапраўдная, невядомая альбо няправільная.
+        invalid_resource_owner: Прадстаўленыя ўліковыя дадзеныя ўладальніка рэсурсу несапраўдныя або немагчыма знайсці ўладальніка рэсурсу
+        invalid_scope: Запытаная вобласць абмежаванняў несапраўдная, невядомая альбо няправільная.
         invalid_token:
           expired: Тэрмін дзеяння токена доступу скончыўся
           revoked: Токен доступу быў адкліканы
           unknown: Токен доступу з'яўляецца несапраўдным
-        resource_owner_authenticator_not_configured: Пошук уладальніка рэсурсу не прайшоў з-за таго, што ўласцівасць Doorkeeper.configure.resource_owner_authenticator была не вызначына.
-        server_error: Сервер аўтарызацыі сутыкнуўся з непрадбачанай умоваю, якая не дазваляе выканаць запыт.
+        resource_owner_authenticator_not_configured: Пошук уладальніка рэсурсу не прайшоў з-за таго, што ўласцівасць Doorkeeper.configure.resource_owner_authenticator была не вызначана.
+        server_error: Сэрвер аўтарызацыі сутыкнуўся з непрадбачанай умовай, якая не дазваляе выканаць запыт.
         temporarily_unavailable: Сервер аўтарызацыі зараз не можа апрацаваць запыт з-за часовага перагрузу або прафілактычных работ на серверы.
         unauthorized_client: Кліент не аўтарызаваны, каб выканаць такі запыт выкарыстоўваючы гэты метад.
-        unsupported_grant_type: Тып аўтарызацыі не падтрымліваецца серверам аўтарызацыі.
-        unsupported_response_type: Сервер аўтарызацыі не падтрымлівае такі тып адказу.
+        unsupported_grant_type: Тып аўтарызацыі не падтрымліваецца сэрверам аўтарызацыі.
+        unsupported_response_type: Сэрвер аўтарызацыі не падтрымлівае такі тып адказу.
     flash:
       applications:
         create:
@@ -119,15 +119,15 @@ be:
         write: Доступ толькі для запісу
       title:
         accounts: Уліковыя запісы
-        admin/accounts: Кіраванне ўліковымі запісамі
-        admin/all: Усе адміністратыўныя функцыі
-        admin/reports: Кіраванне справаздачамі
+        admin/accounts: Кіраванне акаўнтамі
+        admin/all: Усе кіравальныя функцыі
+        admin/reports: Кіраванне скардамі
         all: Усе
-        blocks: Блакіроўкі
+        blocks: Блакаванні
         bookmarks: Закладкі
         conversations: Размовы
         crypto: Скразное шыфраванне
-        favourites: Упадабаныя
+        favourites: Абраныя
         filters: Фільтры
         follow: Зносіны
         follows: Падпіскі
@@ -145,38 +145,48 @@ be:
           applications: Праграмы
           oauth2_provider: OAuth2 правайдар
       application:
-        title: Неабходна OAuth аўтарызацыя
+        title: Патрабуецца аўтарызацыя OAuth
     scopes:
-      admin:read: чытаць усе даныя на серверы
-      admin:read:accounts: бачыць канфідэнцыйную інфармацыю ўсіх акаўнтаў
-      admin:read:reports: чытаць далікатную інфармацыю са скарг і ўліковых запісаў, на якія пададзена скарга
+      admin:read: чытаць усе дадзеныя на серверы
+      admin:read:accounts: чытаць канфідэнцыйную інфармацыю ўсіх акаўнтаў
+      admin:read:canonical_email_blocks: чытаць канфідэнцыйную інфармацыю ўсіх кананічных блокаў электроннай пошты
+      admin:read:domain_allows: чытаць канфідэнцыйную інфармацыю ўсіх дазволеных даменаў
+      admin:read:domain_blocks: чытаць канфідэнцыйную інфармацыю ўсіх блакіраваных даменаў
+      admin:read:email_domain_blocks: чытаць канфідэнцыйную інфармацыю ўсіх блакіраваных даменаў эл. пошты
+      admin:read:ip_blocks: чытаць канфідэнцыяльную інфармацыю ўсіх блакіраваных IP
+      admin:read:reports: чытаць канфідэнцыйную інфармацыю ўсіх справаздач і справаздачных уліковых запісаў
       admin:write: змяняць усе даныя на серверы
-      admin:write:accounts: мадэраваць уліковыя запісы
+      admin:write:accounts: выконваць дзеянні па мадэрацыі акаўнтаў
+      admin:write:canonical_email_blocks: выконваць дзеянні па мадэрацыі кананічных блокаў электроннай пошты
+      admin:write:domain_allows: дазваляе праводзіць мадэрацыю ў дамене
+      admin:write:domain_blocks: мадэраваць блакіраваныя дамены
+      admin:write:email_domain_blocks: мадэраваць блакіраваныя дамены эл. пошты
+      admin:write:ip_blocks: мадэраваць блакіраваныя IP
       admin:write:reports: мадэраваць скаргі
-      crypto: выкарыстоўваць скразное шыфраванне
+      crypto: выкарыстоўваць скразное шыфраванне (end-to-end)
       follow: змяняць зносіны ўліковага запісу
       push: атрымліваць push-апавяшчэнні
       read: чытаць усе даныя вашага ўліковага запісу
       read:accounts: бачыць інфармацыю аб уліковых запісах
-      read:blocks: бачыць вашы блакіроўкі
-      read:bookmarks: бачыць вашы закладкі
-      read:favourites: бачыць ваш спіс упадабанага
-      read:filters: бачыць вашы фільтры
-      read:follows: бачыць вашы падпіскі
-      read:lists: бачыць вашы спісы
-      read:mutes: бачыць ваш спіс ігнараваных
-      read:notifications: бачыць вашы апавяшчэнні
-      read:reports: бачыць вашы скаргі
+      read:blocks: бачыць свае блакіроўкі
+      read:bookmarks: бачыць свае закладкі
+      read:favourites: Бачыць сваё абранае
+      read:filters: бачыць свае фільтры
+      read:follows: бачыць свае падпіскі
+      read:lists: бачыць свае спісы
+      read:mutes: бачыць свае ігнараванні
+      read:notifications: бачыць свае абвесткі
+      read:reports: бачыць свае скаргі
       read:search: шукаць ад вашага імя
       read:statuses: бачыць усе допісы
       write: змяняць усе даныя вашага ўліковага запісу
-      write:accounts: змяняць ваш профіль
+      write:accounts: змяняць свой профіль
       write:blocks: блакіраваць уліковыя запісы і дамены
-      write:bookmarks: дадаваць допісы ў закладкі
+      write:bookmarks: закладкі допісаў
       write:conversations: ігнараваць і выдаляць размовы
       write:favourites: дадаваць допісы ва ўпадабанае
       write:filters: ствараць фільтры
-      write:follows: падпісвацца на людзей
+      write:follows: Сачыць за людзьмі
       write:lists: ствараць спiсы
       write:media: запампоўваць медыяфайлы
       write:mutes: ігнараваць людзей і размовы
diff --git a/config/locales/doorkeeper.bg.yml b/config/locales/doorkeeper.bg.yml
index 4fe8a8781..9a6aaf92f 100644
--- a/config/locales/doorkeeper.bg.yml
+++ b/config/locales/doorkeeper.bg.yml
@@ -6,7 +6,7 @@ bg:
         name: Име на приложението
         redirect_uri: Пренасочващ URI
         scopes: Обхват
-        website: Уебсайт на приложение
+        website: Уебсайт на приложението
     errors:
       models:
         doorkeeper/application:
@@ -23,17 +23,17 @@ bg:
         cancel: Отказ
         destroy: Унищожаване
         edit: Редактиране
-        submit: Изпращане
+        submit: Подаване
       confirmations:
         destroy: Сигурни ли сте?
       edit:
         title: Редактиране на приложението
       form:
-        error: О, не! Провери формата за възможни грешки
+        error: Опа! Проверете формуляра си за възможни грешки
       help:
         native_redirect_uri: Изполвайте %{native_redirect_uri} за локални тестове
         redirect_uri: Използвайте един ред за всяко URI
-        scopes: Разделяй диапазоните с интервал. Остави празно, за да използваш диапазона по подразбиране.
+        scopes: Разделяйте обхватите с интервал. Оставете празно, за да употребявате стандартните обхвати.
       index:
         application: Приложение
         callback_url: URL за обратно повикване
@@ -43,15 +43,15 @@ bg:
         new: Ново приложение
         scopes: Обхват
         show: Показване
-        title: Твоите приложения
+        title: Вашите приложения
       new:
         title: Ново приложение
       show:
         actions: Действия
-        application_id: Идентификатор на приложението
+        application_id: Ключ на клиента
         callback_urls: URL-и за обратно повикване
-        scopes: Диапазони
-        secret: Тайна
+        scopes: Обхвати
+        secret: Тайна на клиента
         title: 'Приложение: %{name}'
     authorizations:
       buttons:
@@ -74,7 +74,7 @@ bg:
         authorized_at: Упълномощено на %{date}
         description_html: Има приложения, можещи да имат достъп до акаунта ви, използвайки API. Ако тук има приложения, които не знаете, или работещи неправилно, то може да им откажете достъпа.
         last_used_at: Последно обновено на %{date}
-        never_used: Не е използвано
+        never_used: Нивга ползвано
         scopes: Разрешения
         superapp: Вътрешно
         title: Упълномощените ви приложения
@@ -84,7 +84,7 @@ bg:
         credential_flow_not_configured: Resource Owner Password Credentials предизвика грешка, заради това, че настройките за Doorkeeper.configure.resource_owner_from_credentials липсват.
         invalid_client: Удостоверяването на клиента предизвика грешка, поради непознат клиент, липсващо клиентско удостоверяване, или заради това, че методът на удостоверяване не се поддържа.
         invalid_grant: Предоставеното удостоверение за достъп е невалидно, изтекло, отхвърлено, не съвпада с пренасочващото URI, използвано в заявката за удостоверение, или е бил издадено от друг клиент.
-        invalid_redirect_uri: Включеният пренасочващ URI адрес е невалиден.
+        invalid_redirect_uri: Включеният пренасочващ Uri е невалиден.
         invalid_request:
           missing_param: 'Липсва задължителен параметър: %{value}.'
           request_not_authorized: Заявката трябва да бъде упълномощена. Необходимият параметър за разрешаване на заявка липсва или е невалиден.
@@ -95,12 +95,12 @@ bg:
           expired: Маркерът за достъп изтече
           revoked: Маркерът за достъп беше отхвърлен
           unknown: Маркерът за достъп е невалиден
-        resource_owner_authenticator_not_configured: Намирането на Resource Owner се провали поради липса на конфигурация на Doorkeeper.configure.resource_owner_authenticator.
+        resource_owner_authenticator_not_configured: Намирането на собственика на ресурса се провали поради липса на конфигуриране на Doorkeeper.configure.resource_owner_authenticator.
         server_error: Сървърът за удостоверяване попадна на неочаквано условие, което предотврати изпълнението на заявката.
         temporarily_unavailable: Сървърът за удостоверяване не може да се справи със заявката в момента поради временно претоварване или профилактика на сървъра.
-        unauthorized_client: Клиентът не е удостоверен да изпълни заявката по този начин.
-        unsupported_grant_type: Типът на удостоврението за достъп не се поддържа от сървъра за удостоверяване.
-        unsupported_response_type: Удостоверяващият сървър не поддържа този тип отговор.
+        unauthorized_client: Клиентът не е упълномощен да изпълни заявката по този начин.
+        unsupported_grant_type: Типът за даване на пълномощно не се поддържа от сървъра за упълномощаване.
+        unsupported_response_type: Упълномощаващият сървър не поддържа този тип отговор.
     flash:
       applications:
         create:
@@ -111,7 +111,7 @@ bg:
           notice: Приложението е обновено.
       authorized_applications:
         destroy:
-          notice: Приложението е отказано.
+          notice: Анулирано приложение.
     grouped_scopes:
       access:
         read: Достъп само за четене
@@ -135,7 +135,7 @@ bg:
         media: Прикачена мултимедия
         mutes: Заглушения
         notifications: Известия
-        push: Push-известия
+        push: Изскачащи известия
         reports: Доклади
         search: Търсене
         statuses: Публикации
@@ -143,20 +143,30 @@ bg:
       admin:
         nav:
           applications: Приложения
-          oauth2_provider: OAuth2 доставчик
+          oauth2_provider: Доставчик OAuth2
       application:
         title: Нужно е упълномощаване по OAuth
     scopes:
       admin:read: прочит на всички данни на сървъра
       admin:read:accounts: прочит на деликатна информация от всички акаунти
+      admin:read:canonical_email_blocks: четене на деликатна информация на всички канонични блокирания на е-поща
+      admin:read:domain_allows: четене на деликатна информация на всички домейни позволено
+      admin:read:domain_blocks: четене на деликатна информация на всички домейни блокирано
+      admin:read:email_domain_blocks: четене на деликатна информация на всички домейни на е-поща блокирано
+      admin:read:ip_blocks: четене на деликатна информация на всички IP адреси блокирано
       admin:read:reports: прочит на деликатна информация от всички докладвания и докладвани акаунти
       admin:write: промяна на всички данни на сървъра
       admin:write:accounts: извършване на действия за модериране на акаунти
+      admin:write:canonical_email_blocks: извършване на модериращи действия в канонични блокирания на е-поща
+      admin:write:domain_allows: извършване на действия за модериране на акаунти в домейна позволено
+      admin:write:domain_blocks: извършване на действия за модериране на акаунти в домейна блокирано
+      admin:write:email_domain_blocks: извършване на действия за модериране на акаунти в домейна на е-поща блокирано
+      admin:write:ip_blocks: извършване на действия за модериране на IP адреси блокирано
       admin:write:reports: извършване на действия за модериране на докладвания
       crypto: употреба на цялостно шифроване
       follow: промяна на взаимоотношенията с други акаунти
       push: получаване на вашите изскачащи известия
-      read: четене на всички данни от вашия акаунт
+      read: четене на всички данни от акаунта ви
       read:accounts: преглед на информация за акаунти
       read:blocks: преглед на вашите блокирания
       read:bookmarks: преглед на вашите отметки
@@ -169,12 +179,12 @@ bg:
       read:reports: преглед на вашите докладвания
       read:search: търсене от ваше име
       read:statuses: преглед на всички публикации
-      write: промяна на всички данни от вашия акаунт
+      write: промяна на всички данни на акаунта ви
       write:accounts: промяна на вашия профил
       write:blocks: блокиране на акаунти и домейни
-      write:bookmarks: отмятане на състояния
+      write:bookmarks: отмятане на публикации
       write:conversations: заглушаване и изтриване на разговорите
-      write:favourites: харесани публикации
+      write:favourites: любими публикации
       write:filters: създаване на филтри
       write:follows: последване на хора
       write:lists: създаване на списъци
@@ -182,4 +192,4 @@ bg:
       write:mutes: заглушаване на хора и разговори
       write:notifications: изчистване на вашите известия
       write:reports: докладване на други хора
-      write:statuses: публикуване на състояния
+      write:statuses: публикуване на публикации
diff --git a/config/locales/doorkeeper.ca.yml b/config/locales/doorkeeper.ca.yml
index a0ad2d622..13f0dbef0 100644
--- a/config/locales/doorkeeper.ca.yml
+++ b/config/locales/doorkeeper.ca.yml
@@ -138,7 +138,7 @@ ca:
         push: Notificacions push
         reports: Informes
         search: Cerca
-        statuses: Publicacions
+        statuses: Tuts
     layouts:
       admin:
         nav:
@@ -149,12 +149,22 @@ ca:
     scopes:
       admin:read: llegeix totes les dades en el servidor
       admin:read:accounts: llegir informació confidencial de tots els comptes
+      admin:read:canonical_email_blocks: llegeix informació sensible de tots els blocs canònics de correu-e
+      admin:read:domain_allows: llegeix informació sensible de tots els dominis permesos
+      admin:read:domain_blocks: llegeix informació sensible de tots els blocs de domini
+      admin:read:email_domain_blocks: llegeix informació sensible de tots els blocs de domini de correu-e
+      admin:read:ip_blocks: llegeix informació sensible de tots els blocs d'IP
       admin:read:reports: llegir informació confidencial de tots els informes i comptes reportats
       admin:write: modificar totes les dades en el servidor
       admin:write:accounts: fer l'acció de moderació en els comptes
+      admin:write:canonical_email_blocks: executa accions de moderació en blocs canònics de correu-e
+      admin:write:domain_allows: executa accions de moderació en permisos de domini
+      admin:write:domain_blocks: executa accions de moderació en blocs de domini
+      admin:write:email_domain_blocks: executa accions de moderació en blocs de domini de correu-e
+      admin:write:ip_blocks: executa accions de moderació en blocs d'IP
       admin:write:reports: fer l'acció de moderació en els informes
       crypto: usa xifrat d'extrem a extrem
-      follow: modificar relacions dels comptes
+      follow: modifica les relacions del compte
       push: rebre notificacions push del teu compte
       read: llegir les dades del teu compte
       read:accounts: mira informació dels comptes
@@ -168,13 +178,13 @@ ca:
       read:notifications: mira les teves notificacions
       read:reports: mira els teus informes
       read:search: cerca en nom teu
-      read:statuses: mira tots les publicacions
+      read:statuses: veure tots els tuts
       write: modifica totes les dades del teu compte
       write:accounts: modifica el teu perfil
       write:blocks: bloca comptes i dominis
-      write:bookmarks: marca publicacions
+      write:bookmarks: marca tuts
       write:conversations: silencia i esborra converses
-      write:favourites: afavoreix publicacions
+      write:favourites: afavoreix tuts
       write:filters: crea filtres
       write:follows: segueix gent
       write:lists: crea llistes
@@ -182,4 +192,4 @@ ca:
       write:mutes: silencia usuaris i converses
       write:notifications: esborra les teves notificacions
       write:reports: informa sobre altres persones
-      write:statuses: fes publicacions
+      write:statuses: publica tuts
diff --git a/config/locales/doorkeeper.cs.yml b/config/locales/doorkeeper.cs.yml
index 5475114f6..c9f8777fa 100644
--- a/config/locales/doorkeeper.cs.yml
+++ b/config/locales/doorkeeper.cs.yml
@@ -149,9 +149,19 @@ cs:
     scopes:
       admin:read: číst všechna data na serveru
       admin:read:accounts: číst citlivé informace všech účtů
+      admin:read:canonical_email_blocks: číst citlivé informace všech kanonických e-mailových bloků
+      admin:read:domain_allows: číst citlivé informace ze všech povolených domén
+      admin:read:domain_blocks: číst citlivé informace ze všech bloků domén
+      admin:read:email_domain_blocks: číst citlivé informace ze všech bloků emailových domén
+      admin:read:ip_blocks: číst citlivé informace ze všech bloků IP
       admin:read:reports: číst citlivé informace všech nahlášení a nahlášených účtů
       admin:write: měnit všechna data na serveru
       admin:write:accounts: provádět moderátorské akce s účty
+      admin:write:canonical_email_blocks: provést akce moderace na kanonických emailových blocích
+      admin:write:domain_allows: provést akce moderace na povolených doménách
+      admin:write:domain_blocks: provést akce moderace na doménových blocích
+      admin:write:email_domain_blocks: provést akce moderace na blocích emailových domén
+      admin:write:ip_blocks: provést akce moderace na blocích IP
       admin:write:reports: provádět moderátorské akce s hlášeními
       crypto: používat end-to-end šifrování
       follow: upravovat vztahy mezi profily
diff --git a/config/locales/doorkeeper.da.yml b/config/locales/doorkeeper.da.yml
index 094faedba..43908f020 100644
--- a/config/locales/doorkeeper.da.yml
+++ b/config/locales/doorkeeper.da.yml
@@ -149,9 +149,19 @@ da:
     scopes:
       admin:read: læs alle data på serveren
       admin:read:accounts: læs sensitiv information fra alle konti
+      admin:read:canonical_email_blocks: læs følsomme oplysninger fra alle kanoniske e-mailblokeringer
+      admin:read:domain_allows: læs følsomme informationer fra alle tilladte domæner
+      admin:read:domain_blocks: læs følsomme informationer fra alle domæneblokeringer
+      admin:read:email_domain_blocks: læs følsomme informationer fra alle e-maildomæneblokeringer
+      admin:read:ip_blocks: læs følsomme informationer fra alle IP-blokeringer
       admin:read:reports: læs sensitiv information fra alle anmeldelser og anmeldte konti
       admin:write: redigér alle data på serveren
       admin:write:accounts: udfør modereringshandlinger på konti
+      admin:write:canonical_email_blocks: udfør modereringshandlinger på kanoniske e-mailblokeringer
+      admin:write:domain_allows: udfør modereringshandlinger på tilladte domæner
+      admin:write:domain_blocks: udfør modereringshandlinger på domæneblokeringer
+      admin:write:email_domain_blocks: udfør modereringshandlinger på e-maildomæneblokeringer
+      admin:write:ip_blocks: udfør modereringshandlinger på IP-blokeringer
       admin:write:reports: udfør modereringshandlinger på anmeldelser
       crypto: benyt ende-til-ende kryptering
       follow: ændre kontorelationer
diff --git a/config/locales/doorkeeper.de.yml b/config/locales/doorkeeper.de.yml
index 0e7ca2d55..6c68935a4 100644
--- a/config/locales/doorkeeper.de.yml
+++ b/config/locales/doorkeeper.de.yml
@@ -6,7 +6,7 @@ de:
         name: Name der Anwendung
         redirect_uri: Weiterleitungs-URI
         scopes: Befugnisse
-        website: Website der Anwendung
+        website: Webseite der Anwendung
     errors:
       models:
         doorkeeper/application:
@@ -72,7 +72,7 @@ de:
         revoke: Bist du sicher?
       index:
         authorized_at: Autorisiert am %{date}
-        description_html: Dies sind Anwendungen, die über die Programmierschnittstelle (API) dieser Mastodon-Instanz auf dein Konto zugreifen können. Sollten hier Apps aufgeführt sein, die du nicht erkennst oder die sich verdächtig verhalten, solltest du den Zugriff schnellstmöglich widerrufen.
+        description_html: Dies sind Anwendungen, die über die Programmierschnittstelle (API) auf dein Konto zugreifen können. Wenn es Anwendungen gibt, die du hier nicht zuordnen kannst oder wenn sich eine Anwendung verdächtig verhält, kannst du den Zugriff widerrufen.
         last_used_at: Zuletzt verwendet am %{date}
         never_used: Nie verwendet
         scopes: Berechtigungen
@@ -145,13 +145,23 @@ de:
           applications: Anwendungen
           oauth2_provider: OAuth2-Anbieter
       application:
-        title: OAuth-Autorisierung nötig
+        title: OAuth-Autorisierung erforderlich
     scopes:
       admin:read: alle Daten auf dem Server lesen
-      admin:read:accounts: sensible Daten aller Konten lesen
-      admin:read:reports: sensible Daten aller Meldungen und gemeldeten Konten lesen
+      admin:read:accounts: sensible Informationen aller Konten lesen
+      admin:read:canonical_email_blocks: sensible Informationen aller kanonischen E-Mail-Sperren lesen
+      admin:read:domain_allows: sensible Informationen aller zugelassenen Domains lesen
+      admin:read:domain_blocks: sensible Informationen aller Domain-Sperren lesen
+      admin:read:email_domain_blocks: sensible Informationen aller E-Mail-Domain-Sperren lesen
+      admin:read:ip_blocks: sensible Informationen aller IP-Sperren lesen
+      admin:read:reports: sensible Informationen aller Meldungen und gemeldeten Konten lesen
       admin:write: alle Daten auf dem Server ändern
       admin:write:accounts: Moderationsaktionen auf Konten ausführen
+      admin:write:canonical_email_blocks: Moderationsaktionen auf kanonischen E-Mail-Sperren ausführen
+      admin:write:domain_allows: Moderationsaktionen auf zugelassende Domains ausführen
+      admin:write:domain_blocks: Moderationsaktionen auf Domain-Sperren ausführen
+      admin:write:email_domain_blocks: Moderationsaktionen auf E-Mail-Domain-Sperren ausführen
+      admin:write:ip_blocks: Moderationsaktionen auf IP-Sperren ausführen
       admin:write:reports: Moderationsaktionen auf Meldungen ausführen
       crypto: Ende-zu-Ende-Verschlüsselung verwenden
       follow: Kontenbeziehungen verändern
diff --git a/config/locales/doorkeeper.en-GB.yml b/config/locales/doorkeeper.en-GB.yml
index 1f13709be..7d2716359 100644
--- a/config/locales/doorkeeper.en-GB.yml
+++ b/config/locales/doorkeeper.en-GB.yml
@@ -149,9 +149,19 @@ en-GB:
     scopes:
       admin:read: read all data on the server
       admin:read:accounts: read sensitive information of all accounts
+      admin:read:canonical_email_blocks: read sensitive information of all canonical email blocks
+      admin:read:domain_allows: read sensitive information of all domain allows
+      admin:read:domain_blocks: read sensitive information of all domain blocks
+      admin:read:email_domain_blocks: read sensitive information of all email domain blocks
+      admin:read:ip_blocks: read sensitive information of all IP blocks
       admin:read:reports: read sensitive information of all reports and reported accounts
       admin:write: modify all data on the server
       admin:write:accounts: perform moderation actions on accounts
+      admin:write:canonical_email_blocks: perform moderation actions on canonical email blocks
+      admin:write:domain_allows: perform moderation actions on domain allows
+      admin:write:domain_blocks: perform moderation actions on domain blocks
+      admin:write:email_domain_blocks: perform moderation actions on email domain blocks
+      admin:write:ip_blocks: perform moderation actions on IP blocks
       admin:write:reports: perform moderation actions on reports
       crypto: use end-to-end encryption
       follow: modify account relationships
diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml
index 5567724ae..a28f91c0e 100644
--- a/config/locales/doorkeeper.en.yml
+++ b/config/locales/doorkeeper.en.yml
@@ -122,14 +122,14 @@ en:
         admin/accounts: Administration of accounts
         admin/all: All administrative functions
         admin/reports: Administration of reports
-        all: Everything
+        all: Full access to your Mastodon account
         blocks: Blocks
         bookmarks: Bookmarks
         conversations: Conversations
         crypto: End-to-end encryption
         favourites: Favourites
         filters: Filters
-        follow: Relationships
+        follow: Follows, Mutes and Blocks
         follows: Follows
         lists: Lists
         media: Media attachments
@@ -149,9 +149,19 @@ en:
     scopes:
       admin:read: read all data on the server
       admin:read:accounts: read sensitive information of all accounts
+      admin:read:canonical_email_blocks: read sensitive information of all canonical email blocks
+      admin:read:domain_allows: read sensitive information of all domain allows
+      admin:read:domain_blocks: read sensitive information of all domain blocks
+      admin:read:email_domain_blocks: read sensitive information of all email domain blocks
+      admin:read:ip_blocks: read sensitive information of all IP blocks
       admin:read:reports: read sensitive information of all reports and reported accounts
       admin:write: modify all data on the server
       admin:write:accounts: perform moderation actions on accounts
+      admin:write:canonical_email_blocks: perform moderation actions on canonical email blocks
+      admin:write:domain_allows: perform moderation actions on domain allows
+      admin:write:domain_blocks: perform moderation actions on domain blocks
+      admin:write:email_domain_blocks: perform moderation actions on email domain blocks
+      admin:write:ip_blocks: perform moderation actions on IP blocks
       admin:write:reports: perform moderation actions on reports
       crypto: use end-to-end encryption
       follow: modify account relationships
diff --git a/config/locales/doorkeeper.es-AR.yml b/config/locales/doorkeeper.es-AR.yml
index 46210dbc4..789e7ab1d 100644
--- a/config/locales/doorkeeper.es-AR.yml
+++ b/config/locales/doorkeeper.es-AR.yml
@@ -149,9 +149,19 @@ es-AR:
     scopes:
       admin:read: leer todos los datos en el servidor
       admin:read:accounts: leer información sensible de todas las cuentas
+      admin:read:canonical_email_blocks: leer información sensible de todos los bloques canónicos de correo electrónico
+      admin:read:domain_allows: leer información sensible de todos los dominios permitidos
+      admin:read:domain_blocks: leer información sensible de todos los bloques de dominio
+      admin:read:email_domain_blocks: leer información sensible de todos los bloques de dominio de correo electrónico
+      admin:read:ip_blocks: leer información sensible de todos los bloques de direcciones IP
       admin:read:reports: leer información sensible de todos los informes y cuentas denunciadas
       admin:write: modificar todos los datos en el servidor
       admin:write:accounts: ejecutar acciones de moderación en cuentas
+      admin:write:canonical_email_blocks: ejecutar acciones de moderación en bloques canónicos de correo electrónico
+      admin:write:domain_allows: realizar acciones de moderación en el dominio permitido
+      admin:write:domain_blocks: ejecutar acciones de moderación en bloques de dominio
+      admin:write:email_domain_blocks: ejecutar acciones de moderación en bloques de dominio de correo electrónico
+      admin:write:ip_blocks: ejecutar acciones de moderación en bloques de direcciones IP
       admin:write:reports: ejecutar acciones de moderación en denuncias
       crypto: usar cifrado de extremo a extremo
       follow: modificar relaciones de cuenta
diff --git a/config/locales/doorkeeper.es-MX.yml b/config/locales/doorkeeper.es-MX.yml
index 58017d83a..8358ce9bc 100644
--- a/config/locales/doorkeeper.es-MX.yml
+++ b/config/locales/doorkeeper.es-MX.yml
@@ -6,7 +6,7 @@ es-MX:
         name: Nombre de aplicación
         redirect_uri: URI para redirección
         scopes: Ámbitos
-        website: Sitio web
+        website: Sitio web de la aplicación
     errors:
       models:
         doorkeeper/application:
@@ -60,7 +60,7 @@ es-MX:
       error:
         title: Ha ocurrido un error
       new:
-        prompt_html: "%{client_name} Requiere permisos para acceder a tu cuenta. Es una aplicación de terceros. <strong>Si no confías en ella, no deberías darle autorización.</strong>"
+        prompt_html: "%{client_name} requiere permiso para acceder a tu cuenta. Es una aplicación de terceros. <strong>Si no confías en esta, no deberías autorizarla.</strong>"
         review_permissions: Revisar permisos
         title: Se requiere autorización
       show:
@@ -77,18 +77,18 @@ es-MX:
         never_used: Nunca usado
         scopes: Permisos
         superapp: Interno
-        title: Sus aplicaciones autorizadas
+        title: Tus aplicaciones autorizadas
     errors:
       messages:
         access_denied: El propietario del recurso o servidor de autorización denegó la petición.
         credential_flow_not_configured: Las credenciales de contraseña del propietario del recurso falló debido a que Doorkeeper.configure.resource_owner_from_credentials está sin configurar.
-        invalid_client: La autentificación del cliente falló debido o a que es un cliente desconocido o no está incluída la autentificación del cliente o el método de autentificación no está confirmado.
+        invalid_client: La autentificación del cliente falló ya que es un cliente desconocido, no está incluída la autentificación del cliente o el método de autentificación no es compatible.
         invalid_grant: La concesión de autorización ofrecida es inválida, venció, se revocó, no coincide con la URI de redirección utilizada en la petición de autorización, o fue emitida para otro cliente.
         invalid_redirect_uri: La URI de redirección incluida no es válida.
         invalid_request:
           missing_param: 'Falta el parámetro requerido: %{value}.'
-          request_not_authorized: La solicitud debe ser autorizada. Parámetro requerido para la autorización de la solicitud falta o no es válido.
-          unknown: En la petición falta un parámetro necesario o incluye un valor de parámetro no soportado o tiene otro tipo de formato incorrecto.
+          request_not_authorized: La solicitud necesita ser autorizada. El parámetro requerido para la autorización de la solicitud está ausente o es inválido.
+          unknown: En la solicitud falta un parámetro necesario, incluye un valor de parámetro no soportado o tiene otro tipo de formato incorrecto.
         invalid_resource_owner: Las credenciales proporcionadas del propietario del recurso no son válidas, o el propietario del recurso no puede ser encontrado
         invalid_scope: El ámbito pedido es inválido, desconocido o erróneo.
         invalid_token:
@@ -149,9 +149,19 @@ es-MX:
     scopes:
       admin:read: leer todos los datos en el servidor
       admin:read:accounts: leer información sensible de todas las cuentas
+      admin:read:canonical_email_blocks: leer información sensible de todos los bloques de correo canónico
+      admin:read:domain_allows: leer información sensible de todos los dominios permitidos
+      admin:read:domain_blocks: leer información sensible de todos los bloques de dominio
+      admin:read:email_domain_blocks: leer información sensible de todos los bloques de dominio de correo electrónico
+      admin:read:ip_blocks: leer información sensible de todos los bloques de IP
       admin:read:reports: leer información sensible de todos los informes y cuentas reportadas
       admin:write: modificar todos los datos en el servidor
       admin:write:accounts: realizar acciones de moderación en cuentas
+      admin:write:canonical_email_blocks: realizar acciones de moderación en bloques de correo canónico
+      admin:write:domain_allows: realizar acciones de moderación en el dominio permitido
+      admin:write:domain_blocks: realizar acciones de moderación en bloques de dominio
+      admin:write:email_domain_blocks: realizar acciones de moderación en bloques de dominio de correo electrónico
+      admin:write:ip_blocks: realizar acciones de moderación en bloques de IP
       admin:write:reports: realizar acciones de moderación en informes
       crypto: usar cifrado de extremo a extremo
       follow: seguir, bloquear, desbloquear y dejar de seguir cuentas
diff --git a/config/locales/doorkeeper.es.yml b/config/locales/doorkeeper.es.yml
index 9b2eee652..dbd760f05 100644
--- a/config/locales/doorkeeper.es.yml
+++ b/config/locales/doorkeeper.es.yml
@@ -149,9 +149,19 @@ es:
     scopes:
       admin:read: leer todos los datos en el servidor
       admin:read:accounts: leer información sensible de todas las cuentas
+      admin:read:canonical_email_blocks: leer información sensible de todos los bloqueos de correo canónico
+      admin:read:domain_allows: leer información sensible de todos los dominios permitidos
+      admin:read:domain_blocks: leer información sensible de todos los bloqueos de dominio
+      admin:read:email_domain_blocks: leer información sensible de todos los bloqueos de dominio de correo electrónico
+      admin:read:ip_blocks: leer información sensible de todos los bloqueos de IP
       admin:read:reports: leer información sensible de todos los informes y cuentas reportadas
       admin:write: modificar todos los datos en el servidor
       admin:write:accounts: realizar acciones de moderación en cuentas
+      admin:write:canonical_email_blocks: ejecutar acciones de moderación en bloqueos canónicos de correo electrónico
+      admin:write:domain_allows: ejecutar acciones de moderación en los dominios permitidos
+      admin:write:domain_blocks: ejecutar acciones de moderación en bloqueos de dominio
+      admin:write:email_domain_blocks: ejecutar acciones de moderación en bloqueos de dominio de correo electrónico
+      admin:write:ip_blocks: ejecutar acciones de moderación en bloqueos de IP
       admin:write:reports: realizar acciones de moderación en informes
       crypto: usar cifrado de extremo a extremo
       follow: seguir, bloquear, desbloquear y dejar de seguir cuentas
diff --git a/config/locales/doorkeeper.et.yml b/config/locales/doorkeeper.et.yml
index 5660832a1..8749121e1 100644
--- a/config/locales/doorkeeper.et.yml
+++ b/config/locales/doorkeeper.et.yml
@@ -23,27 +23,27 @@ et:
         cancel: Katkesta
         destroy: Hävita
         edit: Muuda
-        submit: Saada
+        submit: Kinnita
       confirmations:
-        destroy: Olete kindel?
+        destroy: Oled kindel?
       edit:
         title: Avalduse muutmine
       form:
-        error: Oih! Kontrollige oma vormi võimalikest vigadest
+        error: Oih! Kontrolli vormi, ehk on mõni viga sees
       help:
-        native_redirect_uri: Kasutage %{native_redirect_uri} kohalikeks testideks
+        native_redirect_uri: Kasuta %{native_redirect_uri} kohalikeks testideks
         redirect_uri: Kasuta ühte rida iga URI jaoks
         scopes: Eralda ulatused tühikutega. Jäta tühjaks, et kasutada vaikimisi ulatusi.
       index:
         application: Rakendus
         callback_url: Ümbersuunamise URL
         delete: Kustuta
-        empty: Teil pole rakendusi.
+        empty: Sul pole rakendusi.
         name: Nimi
         new: Uus rakendus
         scopes: Ulatused
         show: Kuva
-        title: Teie rakendused
+        title: Kasutusel rakendused
       new:
         title: Uus rakendus
       show:
@@ -60,7 +60,7 @@ et:
       error:
         title: Ilmnes viga
       new:
-        prompt_html: "%{client_name} soovib luba kontole juurdepääsuks. See on kolmanda osapoole rakendus. <strong>Kui pole usaldusväärne, siis ei tohiks seda lubada.</strong>"
+        prompt_html: "%{client_name} soovib luba kontole juurdepääsuks. See on kolmanda osapoole rakendus. <strong>Kui see pole usaldusväärne, siis ei tohiks seda lubada.</strong>"
         review_permissions: Lubade ülevaade
         title: Autoriseerimine vajalik
       show:
@@ -69,7 +69,7 @@ et:
       buttons:
         revoke: Tühista
       confirmations:
-        revoke: Olete kindel?
+        revoke: Oled kindel?
       index:
         authorized_at: Autoriseeritud %{date}
         description_html: Need on rakendused, millel on API kaudu juurdepääs kontole. Kui on rakendusi, mis on tundmatud või rakendus käitub halvasti, saab selle juurdepääsu tühistada.
@@ -82,7 +82,7 @@ et:
       messages:
         access_denied: Ressursi omanik või autoriseerimisserver lükkas taotluse tagasi.
         credential_flow_not_configured: Resource Owner Password Credentials vool ebaõnnestus, kuna Doorkeeper.configure.resource_owner_from_credentials ei ole seadistatud.
-        invalid_client: Kliendi autentimine ebaõnnestus, kuna tundmatu klient, puudulik autentimine või mitte toetatud autentimismeetod.
+        invalid_client: Kliendi autentimine ebaõnnestus. Põhjus kas tundmatu klient, puudulik autentimine või toetamata autentimismeetod.
         invalid_grant: Antud autoriseerimisluba on vale, aegunud, tagasi võetud, ei kattu kasutatud ümbersuunamise URLid või oli antud teisele kliendile.
         invalid_redirect_uri: Antud ümbersuunamise URL ei ole õige.
         invalid_request:
@@ -131,7 +131,7 @@ et:
         filters: Filtrid
         follow: Seosed
         follows: Jälgimised
-        lists: Nimistud
+        lists: Nimekirjad
         media: Lisatud meedia
         mutes: Vaigistused
         notifications: Teavitused
@@ -149,37 +149,47 @@ et:
     scopes:
       admin:read: lugeda kõiki andmeid serveril
       admin:read:accounts: lugeda privaatset informatsiooni kõikidel kontodel
-      admin:read:reports: lugeda privaatset informatsiooni kõikide teavituste ja teavitatud kasutajate kohta
+      admin:read:canonical_email_blocks: loe kõigi kanooniliste e-posti blokeeringute tundlikku infot
+      admin:read:domain_allows: loe kõigi domeenide lubade tundliku infot
+      admin:read:domain_blocks: loe kõigi domeenide blokeeringute tundlikku infot
+      admin:read:email_domain_blocks: loe kõigi e-posti blokeeringute tundlikku infot
+      admin:read:ip_blocks: loe kõigi IP-blokeeringute tundlikku infot
+      admin:read:reports: lugeda privaatset infot kõikide teavituste ja teavitatud kasutajate kohta
       admin:write: muuta kõiki andmeid serveril
       admin:write:accounts: teostada moderaatori tegevusi kontodel
+      admin:write:canonical_email_blocks: modereeri kanoonilisi e-posti blokeeringuid
+      admin:write:domain_allows: modereeri domeeni lubasid
+      admin:write:domain_blocks: modereeri domeeni blokeeringuid
+      admin:write:email_domain_blocks: modereeri e-postidomeenide blokeeringuid
+      admin:write:ip_blocks: modereeri IP-blokeeringuid
       admin:write:reports: teostada moderaatori tegevusi teavitustel
       crypto: kasuta otspunktkrüpeerimist
       follow: muuta kontode suhteid
-      push: saada Teie teateid
-      read: lugeda kogu Teie konto andmeid
+      push: saab tõuketeateid
+      read: lugeda konto kõiki andmeid
       read:accounts: näha konto informatsiooni
-      read:blocks: näha Teie blokeeringuid
+      read:blocks: näha su blokeeringuid
       read:bookmarks: näha järjehoidjaid
       read:favourites: näha Teie lemmikuid
-      read:filters: näha Teie filtreid
-      read:follows: näha Teie jälgimisi
-      read:lists: näha Teie nimekirju
-      read:mutes: näha Teie vaigistusi
-      read:notifications: näha Teie teateid
-      read:reports: näha Teie teavitusi
-      read:search: otsida Teie nimel
-      read:statuses: näha kõiki staatuseid
+      read:filters: näha su filtreid
+      read:follows: näha su jälgimisi
+      read:lists: näha su nimekirju
+      read:mutes: näha su vaigistusi
+      read:notifications: näha teateid
+      read:reports: näha teavitusi
+      read:search: otsida sinu nimel
+      read:statuses: näha kõiki postitusi
       write: muuta kogu konto andmeid
       write:accounts: muuta profiili
       write:blocks: blokeerida kontosid ja domeene
-      write:bookmarks: lisada staatusele järjehoidjaid
+      write:bookmarks: lisada postitusele järjehoidja
       write:conversations: vaigista ja kustuta vestlused
-      write:favourites: lisada staatuseid lemmikuks
+      write:favourites: lisada postitusi lemmikuks
       write:filters: luua filtreid
       write:follows: jälgida inimesi
       write:lists: luua nimekirju
       write:media: üles laadida meediafaile
       write:mutes: vaigista inimesi ja vestluseid
-      write:notifications: puhasta Teie teateid
+      write:notifications: tühjendada teateid
       write:reports: teavitada teistest inimestest
-      write:statuses: avaldada staatuseid
+      write:statuses: avaldada postitusi
diff --git a/config/locales/doorkeeper.fi.yml b/config/locales/doorkeeper.fi.yml
index 5efa63bc9..b939431bf 100644
--- a/config/locales/doorkeeper.fi.yml
+++ b/config/locales/doorkeeper.fi.yml
@@ -149,9 +149,19 @@ fi:
     scopes:
       admin:read: lukea kaikkia tietoja palvelimelta
       admin:read:accounts: lue arkaluontoinen sisältö kaikilta tileiltä
+      admin:read:canonical_email_blocks: lue arkaluonteisia tietoja kaikista kanonisesti sallituista sähköpostiosoitteista
+      admin:read:domain_allows: lue arkaluonteisia tietoja kaikista sallituista verkkotunnuksista
+      admin:read:domain_blocks: lue arkaluonteisia tietoja kaikista estetyistä verkkotunnuksista
+      admin:read:email_domain_blocks: lue arkaluonteisia tietoja kaikista estetyistä sähköpostiverkkotunnuksista
+      admin:read:ip_blocks: lue arkaluonteisia tietoja kaikista estetyistä IP-osoitteista
       admin:read:reports: lue arkaluonteiset tiedot kaikista raporteista ja raportoiduista tileistä
       admin:write: muokata kaikkia tietoja palvelimella
       admin:write:accounts: suorita moderointitoiminnot tileillä
+      admin:write:canonical_email_blocks: toteuta moderointitoimenpiteitä kanonisille sähköpostiosoite-estoille
+      admin:write:domain_allows: toteuta moderointitoimenpiteitä sallituille verkkotunnuksille
+      admin:write:domain_blocks: toteuta moderointitoimenpiteitä estetyille verkkotunnuksille
+      admin:write:email_domain_blocks: toteuta moderointitoimenpiteitä estetyille sähköpostiverkkotunnuksille
+      admin:write:ip_blocks: toteuta moderointitoimenpiteitä estetyille IP-osoitteille
       admin:write:reports: suorita moderointitoiminnot raporteissa
       crypto: käytä päästä päähän salausta
       follow: seurata, estää, perua eston ja lopettaa tilien seuraaminen
diff --git a/config/locales/doorkeeper.fo.yml b/config/locales/doorkeeper.fo.yml
index d915ead3d..71fa73a0f 100644
--- a/config/locales/doorkeeper.fo.yml
+++ b/config/locales/doorkeeper.fo.yml
@@ -149,9 +149,19 @@ fo:
     scopes:
       admin:read: les allar dátur á ambætaranum
       admin:read:accounts: les viðkvæmar upplýsingar úr øllum kontum
+      admin:read:canonical_email_blocks: les viðkvæmar upplýsingar frá øllum fyrimyndarligum teldupostblokeringum
+      admin:read:domain_allows: les viðkvæmar upplýsingar frá øllum loyvdum navnaøkjum
+      admin:read:domain_blocks: les viðkvæmar upplýsingar frá øllum navnaøkjablokeringum
+      admin:read:email_domain_blocks: les viðkvæmar upplýsingar frá øllum telduposta-navnaøkjablokeringum
+      admin:read:ip_blocks: les viðkvæmar upplýsingar frá øllum IP blokeringum
       admin:read:reports: les viðkvæmar upplýsingar um allar meldingar og meldaðar kontur
       admin:write: broyta allar dátur á ambætaranum
       admin:write:accounts: útinna kjakleiðsluatgerðir á kontum
+      admin:write:canonical_email_blocks: før umsjón við øllum fyrimyndarligum teldupostablokeringum
+      admin:write:domain_allows: før umsjón á loyvdum navnaøkjum
+      admin:write:domain_blocks: før umsjón á navnaøkjablokeringum
+      admin:write:email_domain_blocks: før umsjón á telduposta-navnaøkjablokeringum
+      admin:write:ip_blocks: før umsjón á IP blokeringum
       admin:write:reports: útinna kjakleiðsluatgerðir á meldingum
       crypto: brúka enda-til-enda bronglan
       follow: broyta viðurskifti millum kontur
diff --git a/config/locales/doorkeeper.fr-QC.yml b/config/locales/doorkeeper.fr-QC.yml
index 073d5a0ee..45ad8f186 100644
--- a/config/locales/doorkeeper.fr-QC.yml
+++ b/config/locales/doorkeeper.fr-QC.yml
@@ -149,9 +149,19 @@ fr-QC:
     scopes:
       admin:read: lire toutes les données du serveur
       admin:read:accounts: lire les informations sensibles de tous les comptes
+      admin:read:canonical_email_blocks: lire les informations sensibles de tous les bloqueurs d'e-mails canoniques
+      admin:read:domain_allows: lire les informations sensibles de tous les domaines autorisés
+      admin:read:domain_blocks: lire les informations sensibles de tous les blocqueurs de domaines
+      admin:read:email_domain_blocks: lire les informations sensibles de tous les blocqueurs d'e-mails de domaines
+      admin:read:ip_blocks: lire les informations sensibles de tous les blocqueurs d'IP
       admin:read:reports: lire les informations sensibles de tous les signalements et des comptes signalés
       admin:write: modifier toutes les données sur le serveur
       admin:write:accounts: effectuer des actions de modération sur les comptes
+      admin:write:canonical_email_blocks: effectuer des actions de modération sur les bloqueurs d'e-mails canoniques
+      admin:write:domain_allows: effectuer des actions de modération sur les autorisations de domaines
+      admin:write:domain_blocks: effectuer des actions de modération sur des bloqueurs de domaines
+      admin:write:email_domain_blocks: effectuer des actions de modération sur des bloqueurs d'e-mails de domaines
+      admin:write:ip_blocks: effectuer des actions de modération sur des bloqueurs d'IP
       admin:write:reports: effectuer des actions de modération sur les signalements
       crypto: utiliser le chiffrement de bout-en-bout
       follow: modifier les relations du compte
diff --git a/config/locales/doorkeeper.fr.yml b/config/locales/doorkeeper.fr.yml
index bc4bd20bb..079842de3 100644
--- a/config/locales/doorkeeper.fr.yml
+++ b/config/locales/doorkeeper.fr.yml
@@ -3,8 +3,8 @@ fr:
   activerecord:
     attributes:
       doorkeeper/application:
-        name: Nom
-        redirect_uri: L’URL de redirection
+        name: Nom de l'application
+        redirect_uri: URI de redirection
         scopes: Étendues
         website: Site web de l’application
     errors:
@@ -149,9 +149,19 @@ fr:
     scopes:
       admin:read: lire toutes les données du serveur
       admin:read:accounts: lire les informations sensibles de tous les comptes
+      admin:read:canonical_email_blocks: lire les informations sensibles de tous les bloqueurs d'e-mails canoniques
+      admin:read:domain_allows: lire les informations sensibles de tous les domaines autorisés
+      admin:read:domain_blocks: lire les informations sensibles de tous les blocqueurs de domaines
+      admin:read:email_domain_blocks: lire les informations sensibles de tous les blocqueurs d'e-mails de domaines
+      admin:read:ip_blocks: lire les informations sensibles de tous les blocqueurs d'IP
       admin:read:reports: lire les informations sensibles de tous les signalements et des comptes signalés
       admin:write: modifier toutes les données sur le serveur
       admin:write:accounts: effectuer des actions de modération sur les comptes
+      admin:write:canonical_email_blocks: effectuer des actions de modération sur les bloqueurs d'e-mails canoniques
+      admin:write:domain_allows: effectuer des actions de modération sur les autorisations de domaines
+      admin:write:domain_blocks: effectuer des actions de modération sur des bloqueurs de domaines
+      admin:write:email_domain_blocks: effectuer des actions de modération sur des bloqueurs d'e-mails de domaines
+      admin:write:ip_blocks: effectuer des actions de modération sur des bloqueurs d'IP
       admin:write:reports: effectuer des actions de modération sur les signalements
       crypto: utiliser le chiffrement de bout-en-bout
       follow: modifier les relations du compte
diff --git a/config/locales/doorkeeper.fy.yml b/config/locales/doorkeeper.fy.yml
index 5e3f3c6c0..27637f39b 100644
--- a/config/locales/doorkeeper.fy.yml
+++ b/config/locales/doorkeeper.fy.yml
@@ -3,10 +3,10 @@ fy:
   activerecord:
     attributes:
       doorkeeper/application:
-        name: Namme fan applikaasje
+        name: Tapassingsnamme
         redirect_uri: Redirect-URI
         scopes: Tastimmingen
-        website: Webstee fan applikaasje
+        website: Tapassingswebsite
     errors:
       models:
         doorkeeper/application:
@@ -15,7 +15,7 @@ fy:
               fragment_present: mei gjin fragmint befetsje.
               invalid_uri: moat in jildige URI wêze.
               relative_uri: moat in absolute URI wêze.
-              secured_uri: moat in HTTPS/SSL URI wêze.
+              secured_uri: moat in HTTPS/SSL-URI wêze.
   doorkeeper:
     applications:
       buttons:
@@ -149,18 +149,28 @@ fy:
     scopes:
       admin:read: alle gegevens op de server lêze
       admin:read:accounts: gefoelige ynformaasje fan alle accounts lêze
+      admin:read:canonical_email_blocks: lês gefoelige ynformaasje fan alle kanonike e-mailblokken
+      admin:read:domain_allows: lês gefoelige ynformaasje fan alle domeinen
+      admin:read:domain_blocks: lês gefoelige ynformaasje fan alle domeinblokken
+      admin:read:email_domain_blocks: lês gefoelige ynformaasje fan alle e-maildomeinblokken
+      admin:read:ip_blocks: lês gefoelige ynformaasje fan alle IP-blokken
       admin:read:reports: gefoelige ynformaasje fan alle rapportaazjes en rapportearre accounts lêze
       admin:write: wizigje alle gegevens op de server
       admin:write:accounts: moderaasjemaatregelen tsjin accounts nimme
+      admin:write:canonical_email_blocks: fier moderaasje-aksjes út op kanonike e-mailblokken
+      admin:write:domain_allows: fier moderaasje-aksjes út op domeintastimmingen
+      admin:write:domain_blocks: fier moderaasje-aksjes út op domeinblokkaden
+      admin:write:email_domain_blocks: fier moderaasje-aksjes út op e-maildomeinen
+      admin:write:ip_blocks: fier moderaasje-aksjes út op IP-adresblokken
       admin:write:reports: moderaasjemaatregelen nimme yn rapportaazjes
-      crypto: end-to-end-encryptie brûke
+      crypto: ein-ta-ein-fersifering brûke
       follow: relaasjes tusken accounts bewurkje
       push: dyn pushmeldingen ûntfange
       read: alle gegevens fan dyn account lêze
       read:accounts: accountynformaasje besjen
       read:blocks: dyn blokkearre brûkers besjen
       read:bookmarks: dyn blêdwizers besjen
-      read:favourites: dyn favoriten besjen
+      read:favourites: jo favoriten besjen
       read:filters: dyn filters besjen
       read:follows: de accounts dy’tsto folgest besjen
       read:lists: dyn listen besjen
@@ -179,7 +189,7 @@ fy:
       write:follows: minsken folgje
       write:lists: listen oanmeitsje
       write:media: mediabestannen oplade
-      write:mutes: minsken en petearen negearre
+      write:mutes: minsken en petearen dôvje
       write:notifications: meldingen fuortsmite
       write:reports: oare minsken rapportearje
       write:statuses: berjochten pleatse
diff --git a/config/locales/doorkeeper.gl.yml b/config/locales/doorkeeper.gl.yml
index eb3b018bd..b71df1c77 100644
--- a/config/locales/doorkeeper.gl.yml
+++ b/config/locales/doorkeeper.gl.yml
@@ -60,7 +60,7 @@ gl:
       error:
         title: Algo fallou
       new:
-        prompt_html: "%{client_name} gostaría acceder á túa conta. É unha aplicación de terceiros. <strong>Se non confías nela, non deberías autorizala.</strong>"
+        prompt_html: "%{client_name} solicita permiso para acceder á túa conta. É unha aplicación de terceiros. <strong>Se non confías nela, non deberías autorizala.</strong>"
         review_permissions: Revisar permisos
         title: Autorización necesaria
       show:
@@ -74,7 +74,7 @@ gl:
         authorized_at: Autorizada o %{date}
         description_html: Estas aplicacións poden acceder á túa conta usando a API. Se ves aplicacións que non recoñeces, ou hai comportamentos non consentidos dalgunha delas, podes revogar o acceso.
         last_used_at: Último acceso o %{date}
-        never_used: Nunca utilizado
+        never_used: Nunca usada
         scopes: Permisos
         superapp: Interno
         title: As túas aplicacións autorizadas
@@ -120,20 +120,20 @@ gl:
       title:
         accounts: Contas
         admin/accounts: Administración das contas
-        admin/all: Tódas funcións administrativas
+        admin/all: Tódalas funcións administrativas
         admin/reports: Administración das denuncias
         all: Todo
         blocks: Bloqueos
         bookmarks: Marcadores
         conversations: Conversas
-        crypto: Cifrado E2E
+        crypto: Cifrado extremo-a-extremo
         favourites: Favoritas
         filters: Filtros
         follow: Relacións
         follows: Seguimentos
         lists: Listas
         media: Anexos multimedia
-        mutes: Silenciamentos
+        mutes: Acaladas
         notifications: Notificacións
         push: Notificacións Push
         reports: Denuncias
@@ -149,9 +149,19 @@ gl:
     scopes:
       admin:read: ler todos os datos no servidor
       admin:read:accounts: ler información sensible de todas as contas
+      admin:read:canonical_email_blocks: ler a información sensible de tódolos bloqueos de email canónicos
+      admin:read:domain_allows: ler a información sensible de tódolos dominios permitidos
+      admin:read:domain_blocks: ler a información sensible de tódolos bloqueos de dominio
+      admin:read:email_domain_blocks: ler a información sensible de tódolos dominios de email
+      admin:read:ip_blocks: ler a información sensible de tódolos bloqueos de IP
       admin:read:reports: ler información sensible de todos os informes e contas denunciadas
       admin:write: modificar todos os datos no servidor
       admin:write:accounts: executar accións de moderación nas contas
+      admin:write:canonical_email_blocks: realizar accións de moderación en bloqueos de email canónicos
+      admin:write:domain_allows: realizar accións de moderación en dominios permitidos
+      admin:write:domain_blocks: realizar accións de moderación en bloqueos de dominio
+      admin:write:email_domain_blocks: realizar accións de moderación en bloqueos de dominio de email
+      admin:write:ip_blocks: realizar accións de moderación en bloqueos de IPs
       admin:write:reports: executar accións de moderación nas denuncias
       crypto: usar cifrado extremo-a-extremo
       follow: modificar as relacións da conta
diff --git a/config/locales/doorkeeper.he.yml b/config/locales/doorkeeper.he.yml
index eda38153c..3e25e637f 100644
--- a/config/locales/doorkeeper.he.yml
+++ b/config/locales/doorkeeper.he.yml
@@ -149,9 +149,19 @@ he:
     scopes:
       admin:read: לקרוא את כל המידע על השרת
       admin:read:accounts: לקרוא מידע רגיש בכל החשבונות
+      admin:read:canonical_email_blocks: קריאת התכנים הרגישים של רשומות חסימות הדואל
+      admin:read:domain_allows: קריאת התכנים הרגישים של שמות המתחמים (דומיינים) הבלתי חסומים
+      admin:read:domain_blocks: קריאת התכנים הרגישים של שמות המתחמים (דומיינים) החסומים
+      admin:read:email_domain_blocks: קריאת התכנים הרגישים של שמות המתחמים (דומיינים) החסומים לדואל
+      admin:read:ip_blocks: קריאת התכנים הרגישים של חסימות כתובות IP
       admin:read:reports: לקרוא מידע רגיש בכל הדוחות וכל החשבונות המדווחים
       admin:write: לשנות את כל המידע על השרת
       admin:write:accounts: ביצוע פעולות הנהלה על חשבונות
+      admin:write:canonical_email_blocks: ביצוע פעולות מנחה על חסימות דואל
+      admin:write:domain_allows: ביצוע פעולות מנחה על שמות מתחם מורשים
+      admin:write:domain_blocks: ביצוע פעולות מנחה על שמות מתחם חסומים
+      admin:write:email_domain_blocks: ביצוע פעולות מנחה על חסימות שמות מתחם דואל
+      admin:write:ip_blocks: ביצוע פעולות מנחה על חסימות כתובות IP
       admin:write:reports: ביצוע פעולות הנהלה על חשבונות
       crypto: שימוש בהצפנה מקצה לקצה
       follow: לעקוב, לחסום, להסיר חסימה ולהפסיק לעקוב אחרי חשבונות
diff --git a/config/locales/doorkeeper.hu.yml b/config/locales/doorkeeper.hu.yml
index b394098a4..1157d0ee3 100644
--- a/config/locales/doorkeeper.hu.yml
+++ b/config/locales/doorkeeper.hu.yml
@@ -149,9 +149,19 @@ hu:
     scopes:
       admin:read: a kiszolgáló összes adatának olvasása
       admin:read:accounts: minden kényes fiókadat olvasása
+      admin:read:canonical_email_blocks: kanonikus emailblokkok érzékeny információinak olvasása
+      admin:read:domain_allows: minden domainengedély érzékeny információinak olvasása
+      admin:read:domain_blocks: minden domaintiltás érzékeny információinak olvasása
+      admin:read:email_domain_blocks: minden email-domainblokk érzékeny információinak olvasása
+      admin:read:ip_blocks: minden IP-blokk érzékeny információinak olvasása
       admin:read:reports: minden bejelentés és bejelentett fiók kényes adatainak olvasása
       admin:write: a kiszolgáló összes adatának módosítása
       admin:write:accounts: moderációs műveletek végzése fiókokon
+      admin:write:canonical_email_blocks: moderáció végrehajtása kanonikus emailblokkokon
+      admin:write:domain_allows: moderáció végrehajtása domainengedélyeken
+      admin:write:domain_blocks: moderáció végrehajtása domaintiltásokon
+      admin:write:email_domain_blocks: moderáció végrehajtása email-domainblokkokon
+      admin:write:ip_blocks: moderáció végrehajtása IP-blokkokon
       admin:write:reports: moderációs műveletek végzése bejelentéseken
       crypto: végpontok közti titkosítás használata
       follow: fiókok követése, letiltása, tiltás feloldása és követés abbahagyása
diff --git a/config/locales/doorkeeper.id.yml b/config/locales/doorkeeper.id.yml
index 9a3fed94d..019f33947 100644
--- a/config/locales/doorkeeper.id.yml
+++ b/config/locales/doorkeeper.id.yml
@@ -149,9 +149,16 @@ id:
     scopes:
       admin:read: baca semua data di server
       admin:read:accounts: baca informasi sensitif semua akun
+      admin:read:canonical_email_blocks: baca informasi sensitif dari semua domain surat elektronik kanonikal yang diblokir
+      admin:read:domain_allows: baca informasi sensitif dari semua domain yang diperbolehkan
+      admin:read:domain_blocks: baca informasi sensitif dari semua domain yang diblokir
+      admin:read:email_domain_blocks: baca informasi sensitif dari semua domain surat elektronik yang diblokir
+      admin:read:ip_blocks: baca informasi sensitif dari semua alamat IP yang diblokir
       admin:read:reports: baca informasi sensitif semua laporan dan akun terlapor
       admin:write: ubah semua data di server
       admin:write:accounts: lakukan aksi moderasi akun
+      admin:write:canonical_email_blocks: melakukan aksi moderasi pada email kanonikal yang diblokir
+      admin:write:ip_blocks: lakukan moderasi tindakan pada blokir IP
       admin:write:reports: lakukan aksi moderasi laporan
       crypto: menggunakan enkripsi end-to-end
       follow: mengikuti, blokir, menghapus blokir, dan berhenti mengikuti akun
diff --git a/config/locales/doorkeeper.is.yml b/config/locales/doorkeeper.is.yml
index e607901f7..243b45c80 100644
--- a/config/locales/doorkeeper.is.yml
+++ b/config/locales/doorkeeper.is.yml
@@ -149,9 +149,19 @@ is:
     scopes:
       admin:read: lesa öll gögn á netþjóninum
       admin:read:accounts: lesa viðkvæmar upplýsingar á öllum notendaaðgöngum
+      admin:read:canonical_email_blocks: lesa viðkvæmar upplýsingar um allar stafréttar útilokanir tölvupósts
+      admin:read:domain_allows: lesa viðkvæmar upplýsingar um öll leyfð lén
+      admin:read:domain_blocks: lesa viðkvæmar upplýsingar um öll útilokuð lén
+      admin:read:email_domain_blocks: lesa viðkvæmar upplýsingar um öll útilokuð tölvupóstlén
+      admin:read:ip_blocks: lesa viðkvæmar upplýsingar um allar útilokanir IP-vistfanga
       admin:read:reports: lesa viðkvæmar upplýsingar í öllum skýrslum og kærðum notendaaðgöngum
       admin:write: breyta öllum gögnum á netþjóninum
       admin:write:accounts: framkvæma umsjónaraðgerðir á notendaaðganga
+      admin:write:canonical_email_blocks: framkvæma umsjónaraðgerðir á stafréttar útilokanir tölvupósts
+      admin:write:domain_allows: framkvæma umsjónaraðgerðir á leyfð lén
+      admin:write:domain_blocks: framkvæma umsjónaraðgerðir á útilokuð lén
+      admin:write:email_domain_blocks: framkvæma umsjónaraðgerðir á útilokuð tölvupóstlén
+      admin:write:ip_blocks: framkvæma umsjónaraðgerðir á útilokuð IP-vistföng
       admin:write:reports: framkvæma umsjónaraðgerðir á kærur
       crypto: nota enda-í-enda dulritun
       follow: breyta venslum aðgangs
diff --git a/config/locales/doorkeeper.it.yml b/config/locales/doorkeeper.it.yml
index 4c48196a6..602c50fa9 100644
--- a/config/locales/doorkeeper.it.yml
+++ b/config/locales/doorkeeper.it.yml
@@ -149,9 +149,19 @@ it:
     scopes:
       admin:read: leggere tutti i dati sul server
       admin:read:accounts: leggere le informazioni sensibili su tutti i profili
+      admin:read:canonical_email_blocks: leggere le informazioni sensibili di tutti i blocchi canonici di posta elettronica
+      admin:read:domain_allows: leggere le informazioni sensibili di tutti i domini consentiti
+      admin:read:domain_blocks: leggere le informazioni sensibili di tutti i blocchi di dominio
+      admin:read:email_domain_blocks: leggi le informazioni sensibili di tutti i blocchi di dominio email
+      admin:read:ip_blocks: leggere le informazioni sensibili di tutti i blocchi IP
       admin:read:reports: leggere le informazioni sensibili di tutte le segnalazioni e tutti i profili segnalati
       admin:write: modificare tutti i dati sul server
       admin:write:accounts: eseguire azioni di moderazione sui profili
+      admin:write:canonical_email_blocks: eseguire azioni di moderazione sui blocchi canonici di posta elettronica
+      admin:write:domain_allows: consente di eseguire azioni di moderazione sul dominio
+      admin:write:domain_blocks: eseguire azioni di moderazione sui blocchi di dominio
+      admin:write:email_domain_blocks: eseguire azioni di moderazione sui blocchi di dominio email
+      admin:write:ip_blocks: eseguire azioni di moderazione sui blocchi IP
       admin:write:reports: eseguire azioni di moderazione sulle segnalazioni
       crypto: utilizzare la crittografia end-to-end
       follow: modifica le relazioni tra profili
diff --git a/config/locales/doorkeeper.ko.yml b/config/locales/doorkeeper.ko.yml
index 66668a70a..214e2c9d8 100644
--- a/config/locales/doorkeeper.ko.yml
+++ b/config/locales/doorkeeper.ko.yml
@@ -3,10 +3,10 @@ ko:
   activerecord:
     attributes:
       doorkeeper/application:
-        name: 어플리케이션 이름
+        name: 애플리케이션 이름
         redirect_uri: 리다이렉트 URI
         scopes: 범위
-        website: 어플리케이션 웹사이트
+        website: 애플리케이션 웹사이트
     errors:
       models:
         doorkeeper/application:
@@ -27,18 +27,18 @@ ko:
       confirmations:
         destroy: 정말로 실행하시겠습니까?
       edit:
-        title: 어플리케이션 수정
+        title: 애플리케이션 수정
       form:
         error: 이런! 오류를 확인하세요
       help:
         native_redirect_uri: "%{native_redirect_uri} 을/를 이용해 로컬 테스트를 할 수 있습니다"
-        redirect_uri: 한 줄에 하나의 URI 를 작성하세요
+        redirect_uri: 한 줄에 하나의 URI를 작성하세요
         scopes: 스페이스로 범위를 구분하세요. 빈 칸으로 놔두면 기본 범위를 사용합니다.
       index:
-        application: 어플리케이션
+        application: 애플리케이션
         callback_url: 콜백 URL
         delete: 삭제
-        empty: 어플리케이션이 없습니다.
+        empty: 애플리케이션이 없습니다.
         name: 이름
         new: 새 애플리케이션
         scopes: 범위
@@ -58,7 +58,7 @@ ko:
         authorize: 승인
         deny: 거부
       error:
-        title: 에러가 발생하였습니다
+        title: 오류가 발생하였습니다
       new:
         prompt_html: "%{client_name}이 당신의 계정에 대한 접근 권한을 요청합니다. 이것은 제3자의 응용프로그램입니다. <strong>이것을 신뢰하지 않는다면, 권한을 승인하지 말아야 합니다.</strong>"
         review_permissions: 권한 검토
@@ -149,9 +149,19 @@ ko:
     scopes:
       admin:read: 서버의 모든 데이터 읽기
       admin:read:accounts: 모든 계정의 민감한 정보 읽기
+      admin:read:canonical_email_blocks: 정규화된 이메일 차단 전부에 대한 민감한 정보를 읽습니다
+      admin:read:domain_allows: 도메인 허용에 대한 민감한 정보를 읽습니다
+      admin:read:domain_blocks: 도메인 차단에 대한 민감한 정보를 읽습니다
+      admin:read:email_domain_blocks: 이메일 도메인 차단에 대한 민감한 정보를 읽습니다
+      admin:read:ip_blocks: IP 차단에 대한 민감한 정보를 읽습니다
       admin:read:reports: 신고와 신고 된 계정의 민감한 정보 읽기
       admin:write: 서버의 모든 데이터 수정
       admin:write:accounts: 계정에 모더레이션 조치 취하기
+      admin:write:canonical_email_blocks: 정규화된 이메일 차단에 모더레이션 조치 취하기
+      admin:write:domain_allows: 도메인 허용에 모더레이션 조치 취하기
+      admin:write:domain_blocks: 도메인 차단에 모더레이션 조치 취하기
+      admin:write:email_domain_blocks: 이메일 도메인 차단에 모더레이션 조치 취하기
+      admin:write:ip_blocks: IP 차단에 모더레이션 조치 취하기
       admin:write:reports: 신고에 모더레이션 조치 취하기
       crypto: 종단간 암호화 사용
       follow: 계정의 관계를 수정
diff --git a/config/locales/doorkeeper.la.yml b/config/locales/doorkeeper.la.yml
new file mode 100644
index 000000000..3a7ba0d44
--- /dev/null
+++ b/config/locales/doorkeeper.la.yml
@@ -0,0 +1 @@
+la:
diff --git a/config/locales/doorkeeper.lv.yml b/config/locales/doorkeeper.lv.yml
index 940d6f5ef..d6fca1ff2 100644
--- a/config/locales/doorkeeper.lv.yml
+++ b/config/locales/doorkeeper.lv.yml
@@ -132,7 +132,7 @@ lv:
         follow: Attiecības
         follows: Seko
         lists: Saraksti
-        media: Mediju pielikumi
+        media: Multividesu pielikumi
         mutes: Apklusinātie
         notifications: Paziņojumi
         push: Uznirstošie paziņojumi
@@ -149,9 +149,19 @@ lv:
     scopes:
       admin:read: lasīt visus datus uz servera
       admin:read:accounts: lasīt sensitīvu informāciju no visiem kontiem
+      admin:read:canonical_email_blocks: lasīt sensitīvu informāciju par visiem kanoniskajiem e-pasta blokiem
+      admin:read:domain_allows: lasīt visu domēnu sensitīvo informāciju, ko atļauj
+      admin:read:domain_blocks: lasīt sensitīvu informāciju par visiem domēna blokiem
+      admin:read:email_domain_blocks: lasīt sensitīvu informāciju par visiem e-pasta domēna blokiem
+      admin:read:ip_blocks: lasīt sensitīvu informāciju par visiem IP blokiem
       admin:read:reports: lasīt sensitīvu informāciju no visiem pārskatiem un kontiem, par kuriem ziņots
       admin:write: modificēt visus datus uz servera
       admin:write:accounts: veikt moderācijas darbības kontos
+      admin:write:canonical_email_blocks: veikt regulēšanas darbības kanoniskajos e-pasta blokos
+      admin:write:domain_allows: veikt moderēšanas darbības domēna atļaujā
+      admin:write:domain_blocks: veikt moderēšanas darbības domēna blokos
+      admin:write:email_domain_blocks: veikt moderēšanas darbības e-pasta domēna blokos
+      admin:write:ip_blocks: veikt moderēšanas darbības IP blokos
       admin:write:reports: veikt moderācijas darbības pārskatos
       crypto: lieto pilnīgu šifrēšanu
       follow: mainīt konta attiecības
@@ -178,7 +188,7 @@ lv:
       write:filters: izveidot filtrus
       write:follows: seko cilvēkiem
       write:lists: izveido sarakstus
-      write:media: pievieno mediju datnes
+      write:media: pievieno multivides datnes
       write:mutes: apklusini cilvēkus un sarunas
       write:notifications: notīri savus paziņojumus
       write:reports: ziņo par citiem cilvēkiem
diff --git a/config/locales/doorkeeper.nl.yml b/config/locales/doorkeeper.nl.yml
index 38ae2f4f4..9c18e924a 100644
--- a/config/locales/doorkeeper.nl.yml
+++ b/config/locales/doorkeeper.nl.yml
@@ -71,7 +71,7 @@ nl:
       confirmations:
         revoke: Weet je het zeker?
       index:
-        authorized_at: Toestemming verleent op %{date}
+        authorized_at: Toestemming verleend op %{date}
         description_html: Dit zijn toepassingen die toegang hebben tot jouw account via de API. Als er toepassingen tussen staan die je niet herkent of een toepassing zich misdraagt, kun je de toegangsrechten van de toepassing intrekken.
         last_used_at: Voor het laatst gebruikt op %{date}
         never_used: Nooit gebruikt
@@ -149,10 +149,20 @@ nl:
     scopes:
       admin:read: alle gegevens op de server lezen
       admin:read:accounts: gevoelige informatie van alle accounts lezen
+      admin:read:canonical_email_blocks: gevoelige informatie van alle canoniek geblokkeerde e-mailadressen lezen
+      admin:read:domain_allows: gevoelige informatie van alle toegestane domeinen lezen
+      admin:read:domain_blocks: gevoelige informatie van alle geblokkeerde domeinen lezen
+      admin:read:email_domain_blocks: gevoelige informatie van alle geblokkeerde e-maildomeinen lezen
+      admin:read:ip_blocks: gevoelige informatie van alle geblokkeerde IP-adressen lezen
       admin:read:reports: gevoelige informatie van alle rapportages en gerapporteerde accounts lezen
       admin:write: wijzig alle gegevens op de server
-      admin:write:accounts: moderatiemaatregelen tegen accounts nemen
-      admin:write:reports: moderatiemaatregelen nemen in rapportages
+      admin:write:accounts: moderatieacties op accounts uitvoeren
+      admin:write:canonical_email_blocks: moderatieacties op canoniek geblokkeerde e-mailadressen uitvoeren
+      admin:write:domain_allows: moderatieacties op toegestane domeinen uitvoeren
+      admin:write:domain_blocks: moderatieacties op geblokkeerde domeinen uitvoeren
+      admin:write:email_domain_blocks: moderatieacties op geblokkeerde e-maildomeinen uitvoeren
+      admin:write:ip_blocks: moderatieacties op geblokkeerde IP-adressen uitvoeren
+      admin:write:reports: moderatieacties op rapportages uitvoeren
       crypto: end-to-end-encryptie gebruiken
       follow: relaties tussen accounts bewerken
       push: jouw pushmeldingen ontvangen
diff --git a/config/locales/doorkeeper.nn.yml b/config/locales/doorkeeper.nn.yml
index 4cc4ebace..10e7fbc1d 100644
--- a/config/locales/doorkeeper.nn.yml
+++ b/config/locales/doorkeeper.nn.yml
@@ -149,9 +149,19 @@ nn:
     scopes:
       admin:read: lese alle data på tjeneren
       admin:read:accounts: lese sensitiv informasjon om alle kontoar
+      admin:read:canonical_email_blocks: les ømtolig informasjon om alle kanoniske e-postblokkeringar
+      admin:read:domain_allows: les ømtolig informasjon om alle domeneløyve
+      admin:read:domain_blocks: les ømtolig informasjon om alle domeneblokkeringar
+      admin:read:email_domain_blocks: les ømtolig informasjon om alle e-postdomeneblokkeringar
+      admin:read:ip_blocks: les ømtolig informasjon om alle IP-blokkeringar
       admin:read:reports: lese sensitiv informasjon om alle rapportar og rapporterte kontoar
       admin:write: endre alle data på tenaren
       admin:write:accounts: utføre moderatorhandlingar på kontoar
+      admin:write:canonical_email_blocks: utføre modereringshandlingar på kanoniske e-postblokkeringar
+      admin:write:domain_allows: utføre modereringshandlingar på domeneløyve
+      admin:write:domain_blocks: utføre modereringshandlingar på domeneblokkeringar
+      admin:write:email_domain_blocks: utføre modereringshandlingar på e-postdomeneblokkeringar
+      admin:write:ip_blocks: utføre modereringshandlingar på IP-blokkeringar
       admin:write:reports: utføre moderatorhandlingar på rapportar
       crypto: bruk ende-til-ende-kryptering
       follow: fylg, blokkér, avblokkér, avfylg brukarar
diff --git a/config/locales/doorkeeper.no.yml b/config/locales/doorkeeper.no.yml
index 99faff5c7..1f45808c4 100644
--- a/config/locales/doorkeeper.no.yml
+++ b/config/locales/doorkeeper.no.yml
@@ -149,9 +149,19 @@
     scopes:
       admin:read: lese alle data på tjeneren
       admin:read:accounts: lese sensitive opplysninger for alle kontoer
+      admin:read:canonical_email_blocks: lese sensitiv informasjon om alle kanoniske e-postblokker
+      admin:read:domain_allows: lese sensitiv informasjon for alle domener tillater
+      admin:read:domain_blocks: lese sensitiv informasjon for alle domeneblokker
+      admin:read:email_domain_blocks: lese sensitiv informasjon for alle domeneblokker for e-post
+      admin:read:ip_blocks: les sensitiv informasjon for alle IP-blokker
       admin:read:reports: lese sensitive opplysninger for alle rapporter og rapporterte kontoer
       admin:write: modifisere alle data på tjeneren
       admin:write:accounts: utføre moderatorhandlinger på kontoer
+      admin:write:canonical_email_blocks: utføre moderasjonshandlinger på kanoniske e-postblokker
+      admin:write:domain_allows: utføre moderasjonshandlinger på domenet tillater
+      admin:write:domain_blocks: utfør moderasjonshandlinger på domeneblokker
+      admin:write:email_domain_blocks: utføre moderasjonshandlinger på e-post domeneblokker
+      admin:write:ip_blocks: utføre moderasjonshandlinger på IP-blokker
       admin:write:reports: utføre moderatorhandlinger på rapporter
       crypto: bruk ende-til-ende-kryptering
       follow: endre konto-relasjoner
diff --git a/config/locales/doorkeeper.pl.yml b/config/locales/doorkeeper.pl.yml
index 75af425de..4a9c6ae36 100644
--- a/config/locales/doorkeeper.pl.yml
+++ b/config/locales/doorkeeper.pl.yml
@@ -149,9 +149,19 @@ pl:
     scopes:
       admin:read: odczytaj wszystkie dane na serwerze
       admin:read:accounts: odczytaj wrażliwe informacje na wszystkich kontach
+      admin:read:canonical_email_blocks: odczytaj poufne informacje o wszystkich kanonicznych blokach poczty
+      admin:read:domain_allows: odczyt wrażliwych informacji z domen, które pozwalają
+      admin:read:domain_blocks: odczyt wrażliwych informacji ze wszystkich bloków domen
+      admin:read:email_domain_blocks: odczyt wrażliwych informacji ze wszystkich bloków domen email
+      admin:read:ip_blocks: odczyt wrażliwych informacji ze wszystkich bloków IP
       admin:read:reports: odczytaj wrażliwe informacje ze wszystkich zgłoszeń oraz zgłoszonych kont
       admin:write: zmodyfikuj wszystkie dane na serwerze
       admin:write:accounts: wykonaj działania moderacyjne na kontach
+      admin:write:canonical_email_blocks: wykonaj działania moderacyjne na kanonicznych blokach e-mail
+      admin:write:domain_allows: wykonaj działania moderacyjne na domenach, które zezwalają
+      admin:write:domain_blocks: wykonaj działania moderacyjne na blokach domen
+      admin:write:email_domain_blocks: wykonaj działania moderacyjne na blokach domen e-mail
+      admin:write:ip_blocks: wykonaj działania moderacyjne na blokach IP
       admin:write:reports: wykonaj działania moderacyjne na zgłoszeniach
       crypto: użyj szyfrowania end-to-end
       follow: możliwość zarządzania relacjami kont
diff --git a/config/locales/doorkeeper.pt-PT.yml b/config/locales/doorkeeper.pt-PT.yml
index 4336362ff..2648118d8 100644
--- a/config/locales/doorkeeper.pt-PT.yml
+++ b/config/locales/doorkeeper.pt-PT.yml
@@ -149,9 +149,19 @@ pt-PT:
     scopes:
       admin:read: ler todos os dados no servidor
       admin:read:accounts: ler informações sensíveis de todas as contas
+      admin:read:canonical_email_blocks: ler informações sensíveis de todos os bloqueios de endereços de e-mail canônicos
+      admin:read:domain_allows: ler informações sensíveis de todos os domínios permitios
+      admin:read:domain_blocks: ler informações sensíveis de todos os bloqueios de domínio
+      admin:read:email_domain_blocks: ler informações sensíveis de todos os bloqueios de domínio de e-mail
+      admin:read:ip_blocks: ler informações sensíveis de todos os bloqueios de IPs
       admin:read:reports: ler informações sensíveis de todas as denúnicas e contas denunciadas
       admin:write: modificar todos os dados no servidor
       admin:write:accounts: executar ações de moderação em contas
+      admin:write:canonical_email_blocks: executar ações de moderação no bloqueio de endereços de e-mail canônicos
+      admin:write:domain_allows: executar ações de moderação na permissão de domínios
+      admin:write:domain_blocks: executar ações de moderação no bloqueio de domínios
+      admin:write:email_domain_blocks: executar ações de moderação no bloqueio de domínios de e-mail
+      admin:write:ip_blocks: executar ações de moderação no bloqueio de IPs
       admin:write:reports: executar ações de moderação em denúncias
       crypto: usa encriptação ponta-a-ponta
       follow: siga, bloqueie, desbloqueie, e deixa de seguir contas
diff --git a/config/locales/doorkeeper.ro.yml b/config/locales/doorkeeper.ro.yml
index f3c6f4353..7ad11d13a 100644
--- a/config/locales/doorkeeper.ro.yml
+++ b/config/locales/doorkeeper.ro.yml
@@ -122,6 +122,8 @@ ro:
         admin/accounts: Administrarea conturilor
         admin/all: Toate funcțiile administrative
         admin/reports: Administrarea rapoartelor
+        all: Tot
+        blocks: Blocuri
         bookmarks: Marcaje
         conversations: Conversații
         crypto: Criptare în ambele părți
diff --git a/config/locales/doorkeeper.ru.yml b/config/locales/doorkeeper.ru.yml
index 86883bf14..97bf7fcc1 100644
--- a/config/locales/doorkeeper.ru.yml
+++ b/config/locales/doorkeeper.ru.yml
@@ -149,6 +149,8 @@ ru:
     scopes:
       admin:read: читать все данные на сервере
       admin:read:accounts: читать конфиденциальную информацию всех учётных записей
+      admin:read:canonical_email_blocks: чтение конфиденциальной информации всех канонических блоков электронной почты
+      admin:read:domain_allows: чтение конфиденциальной информации для всего домена позволяет
       admin:read:reports: читать конфиденциальную информацию о всех жалобах и учётных записях с жалобами
       admin:write: модифицировать все данные на сервере
       admin:write:accounts: производить модерацию учётных записей
diff --git a/config/locales/doorkeeper.sl.yml b/config/locales/doorkeeper.sl.yml
index 1a27f6232..ca689e8f1 100644
--- a/config/locales/doorkeeper.sl.yml
+++ b/config/locales/doorkeeper.sl.yml
@@ -149,9 +149,19 @@ sl:
     scopes:
       admin:read: preberi vse podatke na strežniku
       admin:read:accounts: preberi občutljive informacije vseh računov
+      admin:read:canonical_email_blocks: preberi občutljive informacije vseh blokad kanoničnih e-računov
+      admin:read:domain_allows: preberi občutljive informacije vseh dovolil domene
+      admin:read:domain_blocks: preberi občutljive informacije vseh blokad domen
+      admin:read:email_domain_blocks: preberi občutljive informacije vseh blokad domen e-računov
+      admin:read:ip_blocks: preberi občutljive informacije vseh blokad IP
       admin:read:reports: preberi občutljive informacije vseh prijav in prijavljenih računov
       admin:write: spremeni vse podatke na strežniku
       admin:write:accounts: izvedi moderirana dejanja na računih
+      admin:write:canonical_email_blocks: izvedi moderirana dejanja na blokadah kanoničnih e-računov
+      admin:write:domain_allows: izvedi moderirana dejanja na dovolilih domen
+      admin:write:domain_blocks: izvedi moderirana dejanja na blokadah domen
+      admin:write:email_domain_blocks: izvedi moderirana dejanja na blokadah domen e-računov
+      admin:write:ip_blocks: izvedi moderirana dejanja na blokadah IP
       admin:write:reports: izvedi moderirana dejanja na prijavah
       crypto: Uporabi šifriranje od konca do konca
       follow: spremeni razmerja med računi
diff --git a/config/locales/doorkeeper.sq.yml b/config/locales/doorkeeper.sq.yml
index 7b346efc9..c6c173187 100644
--- a/config/locales/doorkeeper.sq.yml
+++ b/config/locales/doorkeeper.sq.yml
@@ -149,9 +149,19 @@ sq:
     scopes:
       admin:read: të lexojë krejt të dhënat te shërbyesi
       admin:read:accounts: të lexojë krejt të dhënat rezervat të krejt llogarive
+      admin:read:canonical_email_blocks: të lexojë hollësi rezervat të krejt bllokimeve të zakonshëm të email-eve
+      admin:read:domain_allows: të lexojë hollësi rezervat të krejt lejimeve të përkatësive
+      admin:read:domain_blocks: të lexojë hollësi rezervat të krejt bllokimeve të përkatësive
+      admin:read:email_domain_blocks: të lexojë hollësi rezervat të krejt bllokimeve të përkatësive të email-eve
+      admin:read:ip_blocks: të lexojë hollësi rezervat të krejt bllokimeve të IP-eve
       admin:read:reports: të lexojë të dhëna rezervat të krejt raportimeve dhe të llogarive të raportuara
       admin:write: të përpunojë krejt të dhënat në shërbyes
       admin:write:accounts: të kryejë veprime moderimi në llogaritë
+      admin:write:canonical_email_blocks: të kryejë veprime moderimi në bllokime të zakonshëm të email-eve
+      admin:write:domain_allows: të kryejë veprime moderimi mbi lejime përkatësish
+      admin:write:domain_blocks: të kryejë veprime moderimi mbi bllokime përkatësish
+      admin:write:email_domain_blocks: të kryejë veprime moderimi mbi lejime përkatësish email
+      admin:write:ip_blocks: të kryejë veprime moderimi mbi bllokime IP-sh
       admin:write:reports: të kryejë veprime moderimi në raportime
       crypto: përdor fshehtëzim skaj-më-skaj
       follow: të ndryshojë marrëdhënie llogarish
diff --git a/config/locales/doorkeeper.sr-Latn.yml b/config/locales/doorkeeper.sr-Latn.yml
index 568e53d59..66ec102b1 100644
--- a/config/locales/doorkeeper.sr-Latn.yml
+++ b/config/locales/doorkeeper.sr-Latn.yml
@@ -149,9 +149,14 @@ sr-Latn:
     scopes:
       admin:read: čitanje svih podataka na serveru
       admin:read:accounts: čitanje osetljivih podataka za sve naloge
+      admin:read:domain_allows: pročitaj osetljive informacije za sve dozvole domena
+      admin:read:domain_blocks: pročitaj osetljive informacije za sve blokove domena
+      admin:read:ip_blocks: pročitaj osetljive informacije za sve IP blokove
       admin:read:reports: čitanje osetljivih podataka svih izveštaja i prijavljenih naloga
       admin:write: menjanje svih podataka na serveru
       admin:write:accounts: vršenje moderatorskih aktivnosti nad nalozima
+      admin:write:domain_blocks: izvrši moderatorske aktivnosti na blokovima domena
+      admin:write:ip_blocks: izvrši moderatorske aktivnosti na IP blokovima
       admin:write:reports: vršenje moderatorskih aktivnosti nad izveštajima
       crypto: korišćenje end-to-end enkripcije
       follow: prati, blokira, odblokira i otprati naloge
diff --git a/config/locales/doorkeeper.sr.yml b/config/locales/doorkeeper.sr.yml
index 805332051..20e39e1c0 100644
--- a/config/locales/doorkeeper.sr.yml
+++ b/config/locales/doorkeeper.sr.yml
@@ -149,9 +149,14 @@ sr:
     scopes:
       admin:read: читање свих података на серверу
       admin:read:accounts: читање осетљивих података за све налоге
+      admin:read:domain_allows: прочитај осетљиве информације за све дозволе домена
+      admin:read:domain_blocks: прочитај осетљиве информације за све блокове домена
+      admin:read:ip_blocks: прочитај осетљиве информације за све IP блокове
       admin:read:reports: читање осетљивих података свих извештаја и пријављених налога
       admin:write: мењање свих података на серверу
       admin:write:accounts: вршење модераторских активности над налозима
+      admin:write:domain_blocks: изврши модераторске активности на блоковима домена
+      admin:write:ip_blocks: изврши модераторске активности на IP блоковима
       admin:write:reports: вршење модераторских активности над извештајима
       crypto: коришћење end-to-end енкрипције
       follow: прати, блокира, одблокира и отпрати налоге
diff --git a/config/locales/doorkeeper.sv.yml b/config/locales/doorkeeper.sv.yml
index 0c934155e..9a7b53bcc 100644
--- a/config/locales/doorkeeper.sv.yml
+++ b/config/locales/doorkeeper.sv.yml
@@ -149,9 +149,19 @@ sv:
     scopes:
       admin:read: läsa all data på servern
       admin:read:accounts: läsa känslig information om alla konton
+      admin:read:canonical_email_blocks: läsa känslig information om alla kanoniska e-postblockeringar
+      admin:read:domain_allows: läsa känslig information om alla tillåtna domäner
+      admin:read:domain_blocks: läsa känslig information om alla domänblockeringar
+      admin:read:email_domain_blocks: läsa känslig information om alla blockerade e-postdomäner
+      admin:read:ip_blocks: läsa känslig information om alla IP-adressblockeringar
       admin:read:reports: läsa känslig information om alla rapporter och rapporterade konton
       admin:write: ändra all data på servern
       admin:write:accounts: utföra modereringsåtgärder på konton
+      admin:write:canonical_email_blocks: utföra modereringsåtgärder på kanoniska e-postblockeringar
+      admin:write:domain_allows: utföra modereringsåtgärder på tillåtna domäner
+      admin:write:domain_blocks: utföra modereringsåtgärder på domänblockeringar
+      admin:write:email_domain_blocks: utföra modereringsåtgärder på e-postdomänblockeringar
+      admin:write:ip_blocks: utföra modereringsåtgärder på IP-adressblockeringar
       admin:write:reports: utföra modereringsåtgärder på rapporter
       crypto: använd obruten kryptering
       follow: modifiera kontorelationer
diff --git a/config/locales/doorkeeper.th.yml b/config/locales/doorkeeper.th.yml
index a0913dc92..e4ca5b58f 100644
--- a/config/locales/doorkeeper.th.yml
+++ b/config/locales/doorkeeper.th.yml
@@ -149,9 +149,19 @@ th:
     scopes:
       admin:read: อ่านข้อมูลทั้งหมดในเซิร์ฟเวอร์
       admin:read:accounts: อ่านข้อมูลที่ละเอียดอ่อนของบัญชีทั้งหมด
+      admin:read:canonical_email_blocks: อ่านข้อมูลที่ละเอียดอ่อนของการปิดกั้นอีเมลมาตรฐานทั้งหมด
+      admin:read:domain_allows: อ่านข้อมูลที่ละเอียดอ่อนของการอนุญาตโดเมนทั้งหมด
+      admin:read:domain_blocks: อ่านข้อมูลที่ละเอียดอ่อนของการปิดกั้นโดเมนทั้งหมด
+      admin:read:email_domain_blocks: อ่านข้อมูลที่ละเอียดอ่อนของการปิดกั้นโดเมนอีเมลทั้งหมด
+      admin:read:ip_blocks: อ่านข้อมูลที่ละเอียดอ่อนของการปิดกั้น IP ทั้งหมด
       admin:read:reports: อ่านข้อมูลที่ละเอียดอ่อนของรายงานและบัญชีที่ได้รับการรายงานทั้งหมด
       admin:write: ปรับเปลี่ยนข้อมูลทั้งหมดในเซิร์ฟเวอร์
       admin:write:accounts: ทำการกระทำการควบคุมบัญชี
+      admin:write:canonical_email_blocks: ทำการกระทำการควบคุมการปิดกั้นอีเมลมาตรฐาน
+      admin:write:domain_allows: ทำการกระทำการควบคุมการอนุญาตโดเมน
+      admin:write:domain_blocks: ทำการกระทำการควบคุมการปิดกั้นโดเมน
+      admin:write:email_domain_blocks: ทำการกระทำการควบคุมการปิดกั้นโดเมนอีเมล
+      admin:write:ip_blocks: ทำการกระทำการควบคุมการปิดกั้น IP
       admin:write:reports: ทำการกระทำการควบคุมรายงาน
       crypto: ใช้การเข้ารหัสแบบต้นทางถึงปลายทาง
       follow: ปรับเปลี่ยนความสัมพันธ์ของบัญชี
diff --git a/config/locales/doorkeeper.tr.yml b/config/locales/doorkeeper.tr.yml
index 51d0dff08..704a5af07 100644
--- a/config/locales/doorkeeper.tr.yml
+++ b/config/locales/doorkeeper.tr.yml
@@ -149,9 +149,19 @@ tr:
     scopes:
       admin:read: sunucudaki tüm verileri okuma
       admin:read:accounts: tüm hesapların hassas bilgilerini okuma
+      admin:read:canonical_email_blocks: tüm kurallı e-posta engellerinin hassas bilgilerini okuma
+      admin:read:domain_allows: tüm alan adı izinlerinin hassas bilgilerini okuma
+      admin:read:domain_blocks: tüm alan adı engellerinin hassas bilgilerini okuma
+      admin:read:email_domain_blocks: tüm e-posta alan adı engellerinin hassas bilgilerini okuma
+      admin:read:ip_blocks: tüm IP engellerinin hassas bilgilerini okuma
       admin:read:reports: tüm raporların ve raporlanan hesapların hassas bilgilerini okuma
       admin:write: sunucudaki tüm verileri değiştirin
       admin:write:accounts: hesaplarda denetleme eylemleri gerçekleştirin
+      admin:write:canonical_email_blocks: kurallı e-posta engellemeleri için denetleme eylemleri gerçekleştirin
+      admin:write:domain_allows: alan adı izinleri için denetleme eylemleri gerçekleştirin
+      admin:write:domain_blocks: alan adı engellemeleri için denetleme eylemleri gerçekleştirin
+      admin:write:email_domain_blocks: e-posta alan adı engellemeleri için denetleme eylemleri gerçekleştirin
+      admin:write:ip_blocks: IP engellemeleri için denetleme eylemleri gerçekleştirin
       admin:write:reports: raporlarda denetleme eylemleri gerçekleştirin
       crypto: uçtan uca şifreleme kullan
       follow: hesap ilişkilerini değiştirin
diff --git a/config/locales/doorkeeper.uk.yml b/config/locales/doorkeeper.uk.yml
index 09c89cd10..0dd66cb37 100644
--- a/config/locales/doorkeeper.uk.yml
+++ b/config/locales/doorkeeper.uk.yml
@@ -149,9 +149,25 @@ uk:
     scopes:
       admin:read: читати всі дані на сервері
       admin:read:accounts: читати конфіденційну інформацію усіх акаунтів
+      admin:read:canonical_email_blocks: читати конфіденційну інформацію всіх канонічних блоків електронної пошти
+      admin:read:domain_allows: читати конфіденційну інформацію всіх доменів дозволено
+      admin:read:domain_blocks: читати конфіденційну інформацію всіх доменних блоків
+      admin:read:email_domain_blocks: читати конфіденційну інформацію всіх блоків доменів електронної пошти
+      admin:read:ip_blocks: читати конфіденційну інформацію всіх IP блоків
       admin:read:reports: читати дражливу інформацію усіх скарг та облікових записів зі скаргами
       admin:write: модифікувати всі дані на сервері
       admin:write:accounts: модерувати облікові записи
+      admin:write:canonical_email_blocks: 'здійснювати модераторські дії щодо канонічних поштових блоків
+
+        '
+      admin:write:domain_allows: модерувати домени дозволено
+      admin:write:domain_blocks: 'здійснювати модераторські дії щодо доменних блоків
+
+        '
+      admin:write:email_domain_blocks: здійснювати модераторські дії щодо блокування поштових доменів
+      admin:write:ip_blocks: 'здійснювати дії з модерації IP-блоків
+
+        '
       admin:write:reports: модерувати скарги
       crypto: використовувати наскрізне шифрування
       follow: змінювати стосунки облікового запису
diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml
index ce902a01c..d4808984f 100644
--- a/config/locales/doorkeeper.vi.yml
+++ b/config/locales/doorkeeper.vi.yml
@@ -149,9 +149,19 @@ vi:
     scopes:
       admin:read: đọc tất cả dữ liệu trên máy chủ
       admin:read:accounts: đọc thông tin nhạy cảm của tất cả các tài khoản
+      admin:read:canonical_email_blocks: đọc thông tin nhạy cảm của tất cả các khối email chuẩn
+      admin:read:domain_allows: đọc thông tin nhạy cảm của tất cả các tên miền cho phép
+      admin:read:domain_blocks: đọc thông tin nhạy cảm của tất cả các tên miền chặn
+      admin:read:email_domain_blocks: đọc thông tin nhạy cảm của tất cả các miền email chặn
+      admin:read:ip_blocks: đọc thông tin nhạy cảm của tất cả các IP chặn
       admin:read:reports: đọc thông tin của các báo cáo và các tài khoản bị báo cáo
       admin:write: sửa đổi tất cả dữ liệu trên máy chủ
       admin:write:accounts: áp đặt hành động kiểm duyệt trên tài khoản
+      admin:write:canonical_email_blocks: thực hiện các hành động kiểm duyệt đối với chặn email
+      admin:write:domain_allows: thực hiện các hành động kiểm duyệt đối với các email cho phép
+      admin:write:domain_blocks: thực hiện các hành động kiểm duyệt đối với các tên miền chặn
+      admin:write:email_domain_blocks: thực hiện các hành động kiểm duyệt đối với các tên miền email chặn
+      admin:write:ip_blocks: áp đặt kiểm duyệt với các IP chặn
       admin:write:reports: áp đặt kiểm duyệt với các báo cáo
       crypto: dùng mã hóa đầu cuối
       follow: sửa đổi các mối quan hệ tài khoản
diff --git a/config/locales/doorkeeper.zh-CN.yml b/config/locales/doorkeeper.zh-CN.yml
index 2ce18fe44..e74f46ad5 100644
--- a/config/locales/doorkeeper.zh-CN.yml
+++ b/config/locales/doorkeeper.zh-CN.yml
@@ -149,9 +149,19 @@ zh-CN:
     scopes:
       admin:read: 读取服务器上的所有数据
       admin:read:accounts: 读取所有账号的敏感信息
+      admin:read:canonical_email_blocks: 读取所有标准电子邮件块的敏感信息
+      admin:read:domain_allows: 读取所有域的敏感信息
+      admin:read:domain_blocks: 读取所有域块的敏感信息
+      admin:read:email_domain_blocks: 读取所有电子邮件域块的敏感信息
+      admin:read:ip_blocks: 读取所有IP块的敏感信息
       admin:read:reports: 读取所有举报和被举报账号的敏感信息
       admin:write: 修改服务器上的所有数据
       admin:write:accounts: 对账号执行管理操作
+      admin:write:canonical_email_blocks: 在标准电子邮件块上执行管理操作
+      admin:write:domain_allows: 在域上执行管理操作
+      admin:write:domain_blocks: 在域块上执行管理操作
+      admin:write:email_domain_blocks: 在电子邮件域块上执行管理操作
+      admin:write:ip_blocks: 在 IP 块上执行管理操作
       admin:write:reports: 对举报执行管理操作
       crypto: 使用端到端加密
       follow: 关注或屏蔽用户
diff --git a/config/locales/doorkeeper.zh-HK.yml b/config/locales/doorkeeper.zh-HK.yml
index 0bd60c08e..632d51183 100644
--- a/config/locales/doorkeeper.zh-HK.yml
+++ b/config/locales/doorkeeper.zh-HK.yml
@@ -149,9 +149,19 @@ zh-HK:
     scopes:
       admin:read: 讀取伺服器的所有資料
       admin:read:accounts: 讀取所有帳戶的敏感資訊
+      admin:read:canonical_email_blocks: 讀取所有已封鎖標準電郵的敏感資訊
+      admin:read:domain_allows: 讀取所有允許網域的敏感資訊
+      admin:read:domain_blocks: 讀取所有已封鎖網域的敏感資訊
+      admin:read:email_domain_blocks: 讀取所有已封鎖電郵網域的敏感資訊
+      admin:read:ip_blocks: 讀取所有已封鎖 IP 的敏感資訊
       admin:read:reports: 讀取所有回報 / 被回報之帳戶的敏感資訊
       admin:write: 修改伺服器的所有資料
       admin:write:accounts: 對帳號進行仲裁管理動作
+      admin:write:canonical_email_blocks: 對已封鎖的標準電郵執行審核動作
+      admin:write:domain_allows: 對已允許的網域進行審核動作
+      admin:write:domain_blocks: 對已封鎖的網域進行審核動作
+      admin:write:email_domain_blocks: 對已封鎖的電郵網域執行審核動作
+      admin:write:ip_blocks: 對已封鎖的 IP 執行審核動作
       admin:write:reports: 對回報進行仲裁管理動作
       crypto: 使用端到端加密
       follow: 修改帳號的對外聯繫
diff --git a/config/locales/doorkeeper.zh-TW.yml b/config/locales/doorkeeper.zh-TW.yml
index 07b617192..edafecf72 100644
--- a/config/locales/doorkeeper.zh-TW.yml
+++ b/config/locales/doorkeeper.zh-TW.yml
@@ -149,10 +149,20 @@ zh-TW:
     scopes:
       admin:read: 讀取伺服器的所有資料
       admin:read:accounts: 讀取所有帳號的敏感內容
+      admin:read:canonical_email_blocks: 讀取所有電子郵件黑名單之敏感內容
+      admin:read:domain_allows: 讀取所有網域白名單之敏感內容
+      admin:read:domain_blocks: 讀取所有網域黑名單之敏感內容
+      admin:read:email_domain_blocks: 讀取所有電子郵件黑名單之敏感內容
+      admin:read:ip_blocks: 讀取所有 IP 黑名單之敏感內容
       admin:read:reports: 讀取所有回報 / 被回報之帳號的敏感內容
       admin:write: 修改伺服器的所有資料
-      admin:write:accounts: 對帳號進行仲裁管理動作
-      admin:write:reports: 對報告進行仲裁管理動作
+      admin:write:accounts: 對帳號進行管理動作
+      admin:write:canonical_email_blocks: 對電子郵件黑名單進行管理動作
+      admin:write:domain_allows: 對網域白名單進行管理動作
+      admin:write:domain_blocks: 對網域黑名單進行管理動作
+      admin:write:email_domain_blocks: 對電子郵件黑名單進行管理動作
+      admin:write:ip_blocks: 對 IP 黑名單進行管理動作
+      admin:write:reports: 對報告進行管理動作
       crypto: 使用端到端加密
       follow: 修改帳號關係
       push: 接收帳號的推播通知
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 314e7320b..00bcdfd64 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -106,6 +106,8 @@ el:
       redownloaded_msg: Επιτυχής ανανέωη προφίλ του/της %{username} από την πηγή
       reject: Απόρριψη
       rejected_msg: Επιτυχής απόρριψη αίτησης εγγραφής του/της %{username}
+      remote_suspension_irreversible: Τα δεδομένα αυτού του λογαριασμού έχουν διαγραφεί αμετάκλητα.
+      remote_suspension_reversible_hint_html: Ο λογαριασμός έχει ανασταλλεί στον server του και τα δεδομένα του θα διαγραφούν πλήρως στις %{date}. Μέχρι τότε, ο απομακρυσμένος server μπορεί να επαναφέρει τον λογαριασμό χωρίς επιπτώσεις. Αν θέλεις να διαγράψεις αμέσως όλα τα δεδομένα του λογαριασμού, μπορείς να το κάνεις παρακάτω.
       remove_avatar: Απομακρυσμένο αβατάρ
       remove_header: Αφαίρεση επικεφαλίδας
       removed_avatar_msg: Επιτυχής αφαίρεση εικόνας προφίλ του/της%{username}
@@ -407,7 +409,6 @@ el:
     report_notes:
       created_msg: Επιτυχής δημιουργία σημείωσης καταγγελίας!
       destroyed_msg: Επιτυχής διαγραφή σημείωσης καταγγελίας!
-      today_at: Σήμερα στις %{time}
     reports:
       account:
         notes:
@@ -496,6 +497,9 @@ el:
         title: Εμφάνιση
       content_retention:
         title: Διατήρηση περιεχομένου
+      default_noindex:
+        desc_html: Επηρεάζει όσους χρήστες δεν έχουν αλλάξει αυτή τη ρύθμιση οι ίδιοι
+        title: Εξαίρεση χρηστών από τις μηχανές αναζήτησης
       discovery:
         profile_directory: Κατάλογος προφίλ
         public_timelines: Δημόσιες ροές
@@ -648,6 +652,8 @@ el:
       email_below_hint_html: Αν η παρακάτω διεύθυνση email είναι λανθασμένη, μπορείτε να την ενημερώσετε και να λάβετε νέο email επιβεβαίωσης.
       email_settings_hint_html: Το email επιβεβαίωσης στάλθηκε στο %{email}. Αν η διεύθυνση αυτή δεν είναι σωστή, μπορείτε να την ενημερώσετε στις ρυθμίσεις λογαριασμού.
       title: Ρυθμίσεις
+    sign_in:
+      title: Συνδεθείτε στο %{domain}
     sign_up:
       title: Ας ξεκινήσουμε τις ρυθμίσεις στο %{domain}.
     status:
diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml
index e67bb1fa7..4b0ee8773 100644
--- a/config/locales/en-GB.yml
+++ b/config/locales/en-GB.yml
@@ -63,6 +63,17 @@ en-GB:
       disabled: Frozen
       display_name: Display name
       domain: Domain
+      edit: Edit
+      email: Email
+      email_status: Email status
+      enable: Unfreeze
+      enable_sign_in_token_auth: Enable e-mail token authentication
+      enabled: Enabled
+    roles:
+      categories:
+        devops: DevOps
+      privileges:
+        view_devops: DevOps
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': You don't have permission to view this page.
@@ -73,3 +84,10 @@ en-GB:
     '429': Too many requests
     '500': 
     '503': The page could not be served due to a temporary server failure.
+  sessions:
+    browsers:
+      blackberry: BlackBerry
+      uc_browser: UC Browser
+    platforms:
+      blackberry: BlackBerry
+      chrome_os: ChromeOS
diff --git a/config/locales/en.yml b/config/locales/en.yml
index a045db1ab..763110c77 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -116,6 +116,8 @@ en:
       redownloaded_msg: Successfully refreshed %{username}'s profile from origin
       reject: Reject
       rejected_msg: Successfully rejected %{username}'s sign-up application
+      remote_suspension_irreversible: The data of this account has been irreversibly deleted.
+      remote_suspension_reversible_hint_html: The account has been suspended on their server, and the data will be fully removed on %{date}. Until then, the remote server can restore this account without any ill effects. If you wish to remove all of the account's data immediately, you can do so below.
       remove_avatar: Remove avatar
       remove_header: Remove header
       removed_avatar_msg: Successfully removed %{username}'s avatar image
@@ -555,13 +557,12 @@ en:
       pending: Waiting for relay's approval
       save_and_enable: Save and enable
       setup: Setup a relay connection
-      signatures_not_enabled: Relays will not work correctly while secure mode or limited federation mode is enabled
+      signatures_not_enabled: Relays may not work correctly while secure mode or limited federation mode is enabled
       status: Status
       title: Relays
     report_notes:
       created_msg: Report note successfully created!
       destroyed_msg: Report note successfully deleted!
-      today_at: Today at %{time}
     reports:
       account:
         notes:
@@ -574,9 +575,10 @@ en:
         mark_as_sensitive_description_html: The media in the reported posts will be marked as sensitive and a strike will be recorded to help you escalate on future infractions by the same account.
         other_description_html: See more options for controlling the account's behaviour and customize communication to the reported account.
         resolve_description_html: No action will be taken against the reported account, no strike recorded, and the report will be closed.
-        silence_description_html: The profile will be visible only to those who already follow it or manually look it up, severely limiting its reach. Can always be reverted.
-        suspend_description_html: The profile and all its contents will become inaccessible until it is eventually deleted. Interacting with the account will be impossible. Reversible within 30 days.
+        silence_description_html: The account will be visible only to those who already follow it or manually look it up, severely limiting its reach. Can always be reverted. Closes all reports against this account.
+        suspend_description_html: The account and all its contents will be inaccessible and eventually deleted, and interacting with it will be impossible. Reversible within 30 days. Closes all reports against this account.
       actions_description_html: Decide which action to take to resolve this report. If you take a punitive action against the reported account, an e-mail notification will be sent to them, except when the <strong>Spam</strong> category is selected.
+      actions_description_remote_html: Decide which action to take to resolve this report. This will only affect how <strong>your</strong> server communicates with this remote account and handle its content.
       add_to_report: Add more to report
       are_you_sure: Are you sure?
       assign_to_self: Assign to me
@@ -712,6 +714,8 @@ en:
         preamble: Surfacing interesting content is instrumental in onboarding new users who may not know anyone Mastodon. Control how various discovery features work on your server.
         profile_directory: Profile directory
         public_timelines: Public timelines
+        publish_discovered_servers: Publish discovered servers
+        publish_statistics: Publish statistics
         title: Discovery
         trends: Trends
       domain_blocks:
@@ -974,6 +978,9 @@ en:
       email_below_hint_html: If the below e-mail address is incorrect, you can change it here and receive a new confirmation e-mail.
       email_settings_hint_html: The confirmation e-mail was sent to %{email}. If that e-mail address is not correct, you can change it in account settings.
       title: Setup
+    sign_in:
+      preamble_html: Sign in with your <strong>%{domain}</strong> credentials. If your account is hosted on a different server, you will not be able to log in here.
+      title: Sign in to %{domain}
     sign_up:
       preamble: With an account on this Mastodon server, you'll be able to follow any other person on the network, regardless of where their account is hosted.
       title: Let's get you set up on %{domain}.
@@ -1364,6 +1371,9 @@ en:
       unrecognized_emoji: is not a recognized emoji
   relationships:
     activity: Account activity
+    confirm_follow_selected_followers: Are you sure you want to follow selected followers?
+    confirm_remove_selected_followers: Are you sure you want to remove selected followers?
+    confirm_remove_selected_follows: Are you sure you want to remove selected follows?
     dormant: Dormant
     follow_selected_followers: Follow selected followers
     followers: Followers
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index 629e1e4d6..031e9e6f9 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -116,9 +116,9 @@ eo:
       redownloaded_msg: Sukcese refreŝis profilon de %{username} de origino
       reject: Malakcepti
       rejected_msg: Sukcese malaprobis aliĝ-peton de %{username}
-      remove_avatar: Forigi profilbildon
+      remove_avatar: Forigi la profilbildon
       remove_header: Forigi kapan bildon
-      removed_avatar_msg: La profilbildo de %{username} estas sukcese forigita
+      removed_avatar_msg: La rolfiguro de %{username} estas sukcese forigita
       removed_header_msg: Sukcese forigis kapbildon de %{username}
       resend_confirmation:
         already_confirmed: Ĉi tiu uzanto jam estas konfirmita
@@ -264,7 +264,7 @@ eo:
         promote_user_html: "%{name} plirangigis uzanton %{target}"
         reject_appeal_html: "%{name} malakceptis kontroldecidapelacion de %{target}"
         reject_user_html: "%{name} malakceptis registriĝon de %{target}"
-        remove_avatar_user_html: "%{name} forigis profilbildon de %{target}"
+        remove_avatar_user_html: "%{name} forigis la profilbildon de %{target}"
         reopen_report_html: "%{name} remalfermis signalon %{target}"
         resend_user_html: "%{name} resendis konfirman retmesaĝon por %{target}"
         reset_password_user_html: "%{name} restarigis la pasvorton de la uzanto %{target}"
@@ -561,7 +561,6 @@ eo:
     report_notes:
       created_msg: Signala noto sukcese kreita!
       destroyed_msg: Signala noto sukcese forigita!
-      today_at: Hodiaŭ je %{time}
     reports:
       account:
         notes:
@@ -704,6 +703,9 @@ eo:
       content_retention:
         preamble: Regi kiel uzantogenerita enhavo konservitis en Mastodon.
         title: Enhavkonservo
+      default_noindex:
+        desc_html: Efektiviĝas por ĉiuj uzantoj, kiuj mem ne agordis ĉi tion
+        title: Defaŭltigi, ke uzantoj ne estu aŭtomate aldonitaj al la serĉilo-indekso sen sia konsento
       discovery:
         follow_recommendations: Sekvorekomendoj
         preamble: Interesa enhavo estas grava por novaj uzantoj kiuj eble ne konas ajn iun.
@@ -883,7 +885,7 @@ eo:
       next_steps: Vi povas aprobi apelacion por malfari kontroldecidon au ignori.
       subject: "%{username} apelacias kontroldecidon ĉe %{instance}"
     new_pending_account:
-      body: La detaloj de la nova konto estas sube. Vi povas aprobi aŭ Malakcepti ĉi kandidatiĝo.
+      body: La detaloj de la nova konto estas ĉi-sube. Vi povas akcepti aŭ malakcepti tiun aliĝilon.
       subject: Nova konto atendas por recenzo en %{instance} (%{username})
     new_report:
       body: "%{reporter} signalis %{target}"
@@ -1327,7 +1329,7 @@ eo:
           trillion: Dn
   otp_authentication:
     code_hint: Enmetu la kodon kreitan de via aŭtentiga aplikaĵo por konfirmi
-    description_html: Se vi ebligas <strong>dufaktoran aŭtentigon</strong> per autentilprogramaro, ensaluto bezonas vi havi vian telefonon.
+    description_html: Se vi ŝaltas <strong>dufaktoran aŭtentigon</strong> per aŭtentiga programo, saluti postulos ke vi havas vian telefonon, kiu generos ĵetonon por enigi.
     enable: Ŝalti
     instructions_html: "<strong>Skanu ĉi tiun QR-kodon per Google Authenticator aŭ per simila aplikaĵo en via poŝtelefono</strong>. De tiam, la aplikaĵo kreos nombrojn, kiujn vi devos enmeti."
     manual_instructions: 'Se vi ne povas skani la QR-kodon kaj bezonas enmeti ĝin mane, jen la tut-teksta sekreto:'
@@ -1542,7 +1544,7 @@ eo:
     min_reblogs: Konservi diskonitajn mesaĝojn almenau
     min_reblogs_hint: Oni ne forigas viajn afiŝojn kiuj estas diskonigitaj almenaŭ ĉi tiun nombron da fojoj. Lasu malplena por forigi afiŝojn sendepende de iliaj nombroj da diskonigoj
   stream_entries:
-    pinned: Alpinglita
+    pinned: Fiksita afiŝo
     reblogged: diskonigita
     sensitive_content: Tikla enhavo
   strikes:
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index 4b5966260..3f5ef4ede 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -116,6 +116,8 @@ es-AR:
       redownloaded_msg: Se refrescó exitosamente el perfil de %{username} desde el origen
       reject: Rechazar
       rejected_msg: Se rechazó exitosamente la solicitud de registro de %{username}
+      remote_suspension_irreversible: Los datos de esta cuenta fueron eliminados irreversiblemente.
+      remote_suspension_reversible_hint_html: La cuenta fue suspendida en su servidor y los datos se eliminarán completamente el %{date}. Hasta entonces, el servidor remoto puede restaurar esta cuenta sin ningún efecto perjudicial. Si querés eliminar todos los datos de la cuenta inmediatamente, podés hacerlo abajo.
       remove_avatar: Quitar avatar
       remove_header: Quitar cabecera
       removed_avatar_msg: Se quitó exitosamente el avatar de %{username}
@@ -555,13 +557,12 @@ es-AR:
       pending: Esperando aprobación del relé
       save_and_enable: Guardar y habilitar
       setup: Configurar una conexión de relé
-      signatures_not_enabled: Los relés no funcionarán correctamente mientras el modo seguro o el de federación limitada estén habilitados
+      signatures_not_enabled: Puede que los relés no funcionen correctamente mientras el modo seguro o el de federación limitada estén habilitados
       status: Estado
       title: Relés
     report_notes:
       created_msg: "¡La nota de denuncia fue creada exitosamente!"
       destroyed_msg: "¡La nota de denuncia fue eliminada exitosamente!"
-      today_at: Hoy a las %{time}
     reports:
       account:
         notes:
@@ -704,6 +705,9 @@ es-AR:
       content_retention:
         preamble: Controlá cómo el contenido generado por el usuario se almacena en Mastodon.
         title: Retención de contenido
+      default_noindex:
+        desc_html: Afecta a todos los usuarios que no cambiaron esta configuración por sí mismos
+        title: Quitar predeterminadamente a los usuarios de la indexación de los motores de búsqueda
       discovery:
         follow_recommendations: Recom. de cuentas a seguir
         preamble: Exponer contenido interesante a la superficie es fundamental para incorporar nuevos usuarios que pueden no conocer a nadie Mastodon. Controlá cómo funcionan varias opciones de descubrimiento en tu servidor.
@@ -971,6 +975,9 @@ es-AR:
       email_below_hint_html: Si la dirección de correo electrónico que aparece a continuación es incorrecta, podés cambiarla acá y recibir un nuevo correo electrónico de confirmación.
       email_settings_hint_html: Se envió el correo electrónico de confirmación a %{email}. Si esa dirección de correo electrónico no es correcta, podés cambiarla en la configuración de la cuenta.
       title: Configuración
+    sign_in:
+      preamble_html: Iniciá sesión con tus credenciales de <strong>%{domain}</strong>. Si tu cuenta está alojada en un servidor diferente, no vas a poder iniciar sesión acá.
+      title: Iniciar sesión en %{domain}
     sign_up:
       preamble: Con una cuenta en este servidor de Mastodon, podrás seguir a cualquier otra cuenta en la red, independientemente de en qué servidor esté alojada su cuenta.
       title: Dejá que te preparemos en %{domain}.
diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml
index 65074e0f0..132105848 100644
--- a/config/locales/es-MX.yml
+++ b/config/locales/es-MX.yml
@@ -4,7 +4,7 @@ es-MX:
     about_mastodon_html: 'La red social del futuro: ¡Sin anuncios, sin vigilancia corporativa, diseño ético, y descentralización! ¡Sé dueño de tu información con Mastodon!'
     contact_missing: No especificado
     contact_unavailable: No disponible
-    hosted_on: Mastodon hosteado en %{domain}
+    hosted_on: Mastodon alojado en %{domain}
     title: Acerca de
   accounts:
     follow: Seguir
@@ -116,6 +116,8 @@ es-MX:
       redownloaded_msg: Se actualizó correctamente el perfil de %{username} desde el origen
       reject: Rechazar
       rejected_msg: La solicitud de registro de %{username} ha sido rechazada con éxito
+      remote_suspension_irreversible: Los datos de esta cuenta han sido eliminados irreversiblemente.
+      remote_suspension_reversible_hint_html: La cuenta ha sido suspendida en su servidor, y los datos serán eliminados completamente el %{date}. Hasta entonces, el servidor remoto puede restaurar esta cuenta sin ningún efecto perjudicial. Si desea eliminar todos los datos de la cuenta inmediatamente, puede hacerlo a continuación.
       remove_avatar: Eliminar el avatar
       remove_header: Eliminar cabecera
       removed_avatar_msg: Se ha eliminado exitosamente la imagen del avatar de %{username}
@@ -441,7 +443,7 @@ es-MX:
         title: Importar bloqueos de dominio
       new:
         title: Importar bloqueos de dominio
-      no_file: Ningún archivo seleccionado
+      no_file: No hay archivo seleccionado
     follow_recommendations:
       description_html: "<strong>Las recomendaciones de cuentas ayudan a los nuevos usuarios a encontrar rápidamente contenido interesante</strong>. Cuando un usuario no ha interactuado con otros lo suficiente como para suscitar recomendaciones personalizadas de cuentas a las que seguir, en su lugar se le recomiendan estas cuentas. Se recalculan diariamente a partir de una mezcla de cuentas con el mayor número de interacciones recientes y con el mayor número de seguidores locales con un idioma determinado."
       language: Para el idioma
@@ -561,7 +563,6 @@ es-MX:
     report_notes:
       created_msg: "¡El registro de la denuncia se ha creado correctamente!"
       destroyed_msg: "¡El registro de la denuncia se ha borrado correctamente!"
-      today_at: Hoy a las %{time}
     reports:
       account:
         notes:
@@ -704,6 +705,9 @@ es-MX:
       content_retention:
         preamble: Controlar cómo el contenido generado por el usuario se almacena en Mastodon.
         title: Retención de contenido
+      default_noindex:
+        desc_html: Afecta a todos los usuarios que no han cambiado esta configuración por sí mismos
+        title: Optar por los usuarios fuera de la indexación en los motores de búsqueda por defecto
       discovery:
         follow_recommendations: Recomendaciones de cuentas
         preamble: Exponer contenido interesante a la superficie es fundamental para incorporar nuevos usuarios que pueden no conocer a nadie Mastodon. Controla cómo funcionan varias opciones de descubrimiento en tu servidor.
@@ -971,6 +975,9 @@ es-MX:
       email_below_hint_html: Si la dirección de correo electrónico que aparece a continuación es incorrecta, se puede cambiarla aquí y recibir un nuevo correo electrónico de confirmación.
       email_settings_hint_html: El correo electrónico de confirmación fue enviado a %{email}. Si esa dirección de correo electrónico no sea correcta, se puede cambiarla en la configuración de la cuenta.
       title: Configuración
+    sign_in:
+      preamble_html: Registrate con tus credenciales de <strong>%{domain}</strong>. Si tu cuenta está alojada en un servidor diferente, no podrás iniciar sesión aquí.
+      title: Registrate en %{domain}
     sign_up:
       preamble: Con una cuenta en este servidor de Mastodon, podrás seguir a cualquier otra persona en la red, independientemente del servidor en el que se encuentre.
       title: Crear cuenta de Mastodon en %{domain}.
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 3a350fba3..ad836bd4e 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -116,6 +116,8 @@ es:
       redownloaded_msg: Se actualizó correctamente el perfil de %{username} desde el origen
       reject: Rechazar
       rejected_msg: La solicitud de registro de %{username} ha sido rechazada con éxito
+      remote_suspension_irreversible: Los datos de esta cuenta han sido irreversiblemente eliminados.
+      remote_suspension_reversible_hint_html: La cuenta ha sido suspendida en su servidor, y los datos serán eliminados completamente el %{date}. Hasta entonces, el servidor remoto puede restaurar esta cuenta sin ningún efecto perjudicial. Si desea eliminar todos los datos de la cuenta inmediatamente, puede hacerlo a continuación.
       remove_avatar: Eliminar el avatar
       remove_header: Eliminar cabecera
       removed_avatar_msg: Se ha eliminado exitosamente la imagen del avatar de %{username}
@@ -561,7 +563,6 @@ es:
     report_notes:
       created_msg: "¡El registro de la denuncia se ha creado correctamente!"
       destroyed_msg: "¡El registro de la denuncia se ha borrado correctamente!"
-      today_at: Hoy a las %{time}
     reports:
       account:
         notes:
@@ -704,6 +705,9 @@ es:
       content_retention:
         preamble: Controlar cómo el contenido generado por el usuario se almacena en Mastodon.
         title: Retención de contenido
+      default_noindex:
+        desc_html: Afecta a todos los usuarios que no han cambiado esta configuración por sí mismos
+        title: Excluir por defecto a los usuarios de la indexación del motor de búsqueda
       discovery:
         follow_recommendations: Recomendaciones de cuentas
         preamble: Exponer contenido interesante a la superficie es fundamental para incorporar nuevos usuarios que pueden no conocer a nadie Mastodon. Controla cómo funcionan varias opciones de descubrimiento en tu servidor.
@@ -971,6 +975,9 @@ es:
       email_below_hint_html: Si la dirección de correo electrónico que aparece a continuación es incorrecta, se puede cambiarla aquí y recibir un nuevo correo electrónico de confirmación.
       email_settings_hint_html: El correo electrónico de confirmación fue enviado a %{email}. Si esa dirección de correo electrónico no sea correcta, se puede cambiarla en la configuración de la cuenta.
       title: Configuración
+    sign_in:
+      preamble_html: Inicia sesión con tus credenciales de <strong>%{domain}</strong>. Si tu cuenta está alojada en un servidor diferente, no podrás iniciar sesión aquí.
+      title: Iniciar sesión en %{domain}
     sign_up:
       preamble: Con una cuenta en este servidor de Mastodon, podrás seguir a cualquier otra persona en la red, independientemente del servidor en el que se encuentre.
       title: Crear cuenta de Mastodon en %{domain}.
diff --git a/config/locales/et.yml b/config/locales/et.yml
index 42432f020..61aefe6bd 100644
--- a/config/locales/et.yml
+++ b/config/locales/et.yml
@@ -17,7 +17,7 @@ et:
     link_verified_on: Selle lingi autorsust kontrolliti %{date}
     nothing_here: Siin pole midagi!
     pin_errors:
-      following: Te peate juba olema selle kasutaja jälgija, keda te soovitate
+      following: Pead olema juba selle kasutaja jälgija, keda soovitad
     posts:
       one: Postitus
       other: Postitused
@@ -34,7 +34,7 @@ et:
       add_email_domain_block: Keela e-posti domeen
       approve: Võta vastu
       approved_msg: Kasutaja %{username} liitumisavaldus rahuldatud
-      are_you_sure: Olete kindel?
+      are_you_sure: Oled kindel?
       avatar: Profiilipilt
       by_domain: Domeen
       change_email:
@@ -57,7 +57,7 @@ et:
       deleted: Kustutatud
       demote: Alanda
       destroyed_msg: "%{username} andmed on nüüd lõpliku kustutamise ootel"
-      disable: Keela
+      disable: Lukusta
       disable_sign_in_token_auth: Keela e-posti võtmetega autentimine
       disable_two_factor_authentication: Keela 2FA
       disabled: Keelatud
@@ -65,7 +65,7 @@ et:
       domain: Domeen
       edit: Muuda
       email: E-post
-      email_status: E-posti staatus
+      email_status: E-posti olek
       enable: Luba
       enable_sign_in_token_auth: Luba e-posti võtmetega autentimine
       enabled: Lubatud
@@ -96,10 +96,10 @@ et:
         suspended: Kustutatud
         title: Modereerimine
       moderation_notes: Modereerimisteated
-      most_recent_activity: Kõige hiljutisem aktiivsus
-      most_recent_ip: Kõige hiljutisem IP
-      no_account_selected: Mitte ühtegi kontot muudeti sest midagi polnud valitud
-      no_limits_imposed: Mitte ühtegi limiiti kehtestatud
+      most_recent_activity: Viimatine aktiivsus
+      most_recent_ip: Viimatine IP
+      no_account_selected: Ühtegi kontot ei muudetud, sest midagi polnud valitud
+      no_limits_imposed: Pole kehtestatud ühtegi piirangut
       no_role_assigned: Ühtegi rolli pole määratud
       not_subscribed: Ei ole tellitud
       pending: Ootab ülevaatamist
@@ -116,6 +116,8 @@ et:
       redownloaded_msg: "%{username} kasutajakonto algallikast värskendatud"
       reject: Hülga
       rejected_msg: "%{username} liitumisavaldus tagasi lükatud"
+      remote_suspension_irreversible: Selle konto andmed on pöördumatult kustutatud.
+      remote_suspension_reversible_hint_html: Konto on lukustatud ja andmed kustutatakse jäädavalt %{date}. Seni võib teine server konto probleemideta taastada. Kui soovid andmied kohe jäädavalt eemaldada, võid seda teha allpool.
       remove_avatar: Kustuta profiilipilt
       remove_header: Kustuta päis
       removed_avatar_msg: "%{username} tunnuspilt eemaldatud"
@@ -142,7 +144,7 @@ et:
         targeted_reports: Teavitusi teiste poolt
       silence: Vaigista
       silenced: Vaigistatud
-      statuses: Staatuseid
+      statuses: Postitused
       strikes: Eelnevad juhtumid
       subscribe: Telli
       suspend: Kustuta
@@ -155,7 +157,7 @@ et:
       unconfirmed_email: Kinnitamata e-post
       undo_sensitized: Eemalda tundliku sisu märge
       undo_silenced: Võta vaigistus tagasi
-      undo_suspension: Võta peatamine tagasi
+      undo_suspension: Võta kustutamine tagasi
       unsilenced_msg: Konto %{username} piirangud emaldatud
       unsubscribe: Tühista tellimus
       unsuspended_msg: Kasutaja %{username} konto taastatud
@@ -169,7 +171,7 @@ et:
         approve_appeal: Rahulda vaidlustus
         approve_user: Kinnita kasutaja
         assigned_to_self_report: Määras Teavituse
-        change_email_user: Kasutaja muutis e-postiaadressit
+        change_email_user: Kasutaja muutis e-postiaadressi
         change_role_user: Muuda kasutaja rolli
         confirm_user: Kasutaja kinnitatud
         create_account_warning: Lisas hoiatuse
@@ -191,7 +193,7 @@ et:
         destroy_email_domain_block: Eemaldas e-posti domeeni blokeeringu
         destroy_instance: Domeeni kustutamine
         destroy_ip_block: IP-reegli kustutamine
-        destroy_status: Eemaldas staatuse
+        destroy_status: Kustuta postitus
         destroy_unavailable_domain: Kättesaamatu domeeni kustutamine
         destroy_user_role: Rolli kustutamine
         disable_2fa_user: Keela 2FA
@@ -222,7 +224,7 @@ et:
         update_custom_emoji: Uuendas kohandatud emotikoni
         update_domain_block: Uuenda domeenipiirangut
         update_ip_block: IP-reegli uuendamine
-        update_status: Uuendas staatust
+        update_status: Uuenda postitust
         update_user_role: Uuenda rolli
       actions:
         approve_appeal_html: "%{name} kiitis heaks modereerimise otsuse vaidlustuse %{target} poolt"
@@ -310,7 +312,7 @@ et:
       by_domain: Domeen
       copied_msg: Kohaliku koopia loomine emotikonist õnnestus
       copy: Kopeeri
-      copy_failed_msg: Kohaliku koopia loomine sellest emotikonist ebaõnnestus
+      copy_failed_msg: Sellest emotikonist kohaliku koopia loomine nurjus
       create_new_category: Loo uus kategooria
       created_msg: Emotikoni loomine õnnestus!
       delete: Kustuta
@@ -328,7 +330,7 @@ et:
       new:
         title: Lisa uus emotikon
       no_emoji_selected: Emotikone ei muudetud, kuna ühtegi polnud valitud
-      not_permitted: Teil puudub õigus selle tegevuse jaoks
+      not_permitted: Sul puudub selle tegevuse jaoks õigus
       overwrite: Kirjuta üle
       shortcode: Lühikood
       shortcode_hint: Vähemalt 2 tähemärki, ainult tähted, numbrid ja alakriipsud
@@ -383,7 +385,7 @@ et:
       domain: Domeen
       edit: Muuda domeeniblokeeringut
       existing_domain_block: Kasutajale %{name} on juba karmimad piirangud kehtestatud.
-      existing_domain_block_html: Te olete juba lisanud domeenile %{name} piiranguid, palun <a href="%{unblock_url}">eemaldage blokeering</a> enne jätkamist.
+      existing_domain_block_html: Oled juba lisanud domeenile %{name} piiranguid, palun eemalda enne jätkamist <a href="%{unblock_url}">eemalda blokeering</a>.
       export: Eksport
       import: Import
       new:
@@ -398,7 +400,7 @@ et:
       no_domain_block_selected: Ühtegi domeeni keeldu ei muudetud, kuna midagi polnud valitud
       not_permitted: Puudub õigus seda teha
       obfuscate: Domeeninime varjamine
-      obfuscate_hint: Varja osaliselt domeeni nimi nimekirjas, kui domeenipiirangute nimistu avaldamine on sisse lülitatud
+      obfuscate_hint: Varja osaliselt domeeni nimi nimekirjas, kui domeenipiirangute nimekirja avaldamine on sisse lülitatud
       private_comment: Privaatne kommentaar
       private_comment_hint: Kommenteeri selle domeeni limiteerimise kohta moderaatoritele.
       public_comment: Avalik kommentaar
@@ -443,9 +445,9 @@ et:
         title: Domeenikeeldude import
       no_file: Faili pole valitud
     follow_recommendations:
-      description_html: "<strong>Jälgimissoovitused aitavad uutel kasutajatel kiirelt leida huvipakkuvat sisu</strong>. Kui kasutaja pole teistega piisavalt läbi käinud, et kujuneks personaalsed soovitused, soovitatakse neid kontosid. Need arvutatakse ümber igapäevaselt populaarseimate postituste ja enim jälgitavate kontode seast antud keeles."
+      description_html: "<strong>Jälgimissoovitused aitavad uutel kasutajatel kiirelt leida huvipakkuvat sisu</strong>. Kui kasutaja pole teistega piisavalt läbi käinud, et saaks luua personaalseid soovitusi, soovitatakse neid kontosid. Need arvutatakse ümber igapäevaselt konkreetse keele populaarseimate postituste ja enim jälgitavate kontode seast."
       language: Keel
-      status: Staatus
+      status: Olek
       suppress: Eemalda jälgimissoovitus
       suppressed: Eemaldatud
       title: Jälgimissoovitused
@@ -543,25 +545,24 @@ et:
     relationships:
       title: "%{acct}-i suhted"
     relays:
-      add_new: Lisa uus relee
+      add_new: Lisa uus vahendaja
       delete: Kustuta
-      description_html: "<strong>Födereerumisrelee</strong> on vahendav server, mis kannab üle suures koguses avalikke postitusi nende serverite vahel, mis on sellega liitunud ja edastavad sellele oma postitusi. <strong>See aitab väikestel ja keskmistel serveritel avastada födiversumi sellist sisu</strong>, mis muidu eeldaks kohalikelt kasutajatelt nende serverite kasutajate jälgitavaks märkimist."
+      description_html: "<strong>Födereerumisvahendaja</strong> on vahendav server, mis kannab üle suures koguses avalikke postitusi nende serverite vahel, mis on sellega liitunud ja edastavad sellele oma postitusi. <strong>See aitab väikestel ja keskmistel serveritel avastada födiversumi sellist sisu</strong>, mis muidu eeldaks kohalikelt kasutajatelt nende serverite kasutajate jälgitavaks märkimist."
       disable: Keela
       disabled: Keelatud
       enable: Luba
-      enable_hint: Kui lubatud, siis server tellib kõik avalikud postitused sellelt releelt ning hakkab ka enda avalikke postitusi sellele saatma.
+      enable_hint: Kui lubatud, siis server tellib sellelt vahendajalt kõik avalikud postitused ning hakkab ka enda avalikke postitusi sellele saatma.
       enabled: Lubatud
-      inbox_url: Relee URL
-      pending: Ootab relee nõusolekut
+      inbox_url: Vahendaja URL
+      pending: Ootab vahendaja nõusolekut
       save_and_enable: Salvesta ja luba
-      setup: Sea üles releeühendus
-      signatures_not_enabled: Releed ei tööta korrektselt kuniks turvarežiim või lubatud nimekirja režiim on sisse lülitatud
-      status: Staatus
-      title: Releed
+      setup: Sea üles vahendav ühendus
+      signatures_not_enabled: Vahendamine ei tööta korrektselt kuniks turvarežiim või lubatud nimekirja režiim on sisse lülitatud
+      status: Olek
+      title: Vahendajad
     report_notes:
       created_msg: Teade edukalt koostatud!
       destroyed_msg: Teade edukalt kustutatud!
-      today_at: Täna kell %{time}
     reports:
       account:
         notes:
@@ -578,7 +579,7 @@ et:
         suspend_description_html: Konto ja kogu sisu muutub lõpliku kustutamiseni kättesaamatuks. Kontoga suhtlemine pole võimalik. Tagasivõetav 30 päeva jooksul.
       actions_description_html: Otsustus, mida raporti lahendamiseks ette võtta. Karistava tegevuse korral saadetakse e-postiga teade, välja arvatud kategooria <strong>rämpspost</strong> puhul.
       add_to_report: Lisa raportile juurde
-      are_you_sure: Olete kindel?
+      are_you_sure: Oled kindel?
       assign_to_self: Määra mulle
       assigned: Määratud moderaator
       by_target_domain: Teavitatud konto domeen
@@ -588,7 +589,7 @@ et:
         none: Pole
       comment_description_html: 'Täiendava infona kirjutas %{name}:'
       created_at: Teavitatud
-      delete_and_resolve: Kustutatud postitused
+      delete_and_resolve: Kustuta postitused
       forwarded: Edastatud
       forwarded_to: Edastatud domeenile %{domain}
       mark_as_resolved: Märgi lahendatuks
@@ -612,7 +613,7 @@ et:
       resolved: Lahendatud
       resolved_msg: Teavituse lahendamine õnnestus!
       skip_to_actions: Otsuste juurde
-      status: Staatus
+      status: Olek
       statuses: Raporteeritud sisu
       statuses_description_html: Sobimatu sisu kaasatakse suhtlusse raporteeritud kontoga
       target_origin: Raporteeritud konto päritolu
@@ -666,13 +667,13 @@ et:
         manage_rules: Reeglite haldamine
         manage_rules_description: Lubab kasutajatel muuta serveri reegleid
         manage_settings: Halda sätteid
-        manage_settings_description: Lubab kasutajatel muute lehekülje sätteid
+        manage_settings_description: Lubab kasutajatel muuta lehekülje sätteid
         manage_taxonomies: Halda taksonoomiaid
         manage_taxonomies_description: Luba kasutajatel populaarset sisu üle vaadata ning uuendada siltide sätteid
-        manage_user_access: Halda kasutaja ligipääsu
-        manage_user_access_description: Lubab kasutajail eemaldada teiste kahe-etapise autentimise nõude, muuta nende e-postiaadresse ja lähtestada salasõnu
+        manage_user_access: Halda kasutajate ligipääsu
+        manage_user_access_description: Lubab kasutajail keelata teiste kaheastmelise autentimise, muuta nende e-postiaadresse ja lähtestada salasõnu
         manage_users: Kasutajate haldamine
-        manage_users_description: Lubab kasutajail näha teiste kasutajate detailandmeid ja teha modereerimisotsuseid
+        manage_users_description: Lubab kasutajail näha teiste kasutajate üksikasju ja teha nende suhtes modereerimisotsuseid
         manage_webhooks: Halda webhook'e
         manage_webhooks_description: Lubab kasutajatel administratiivseteks sündmusteks webhook'e seadistada
         view_audit_log: Auditilogi vaatamine
@@ -685,7 +686,7 @@ et:
     rules:
       add_new: Lisa reegel
       delete: Kustuta
-      description_html: Kuigi enamik väidab, et on teenusetingimused läbi lugenud ja nõustub nendega, loevad inimesed tavaliselt need läbi alles pärast probleemi tekkimist. <strong>Hõlbustage oma serveri reeglite ühe pilguga nägemist, esitades need lihtsa täpploendina.</strong> Püüdke hoida üksikud reeglid lühikesed ja lihtsad, kuid ärge jagage neid ka paljudeks eraldi üksusteks.
+      description_html: Kuigi enamik väidab, et on teenusetingimused läbi lugenud ja nõustub nendega, loevad inimesed tavaliselt need läbi alles pärast probleemi tekkimist. <strong>Muuda oma serveri reeglite ühe pilguga haaramine hõlpsaks, esitades need lihtsa täpploendina.</strong> Püüa hoida reegli punktid lühikesed ja lihtsad, kuid ära jaga neid ka paljudeks eraldi üksusteks.
       edit: Reegli muutmine
       empty: Serveri reegleid pole veel defineeritud.
       title: Serveri reeglid
@@ -702,14 +703,17 @@ et:
         preamble: Serveri bränding eristab seda teistest serveritest võrgus. Seda teavet võidakse kuvada erinevates keskkondades, näiteks Mastodoni veebiliideses, rakendustes, viitade eelvaadetes teistel veebisaitidel, sõnumsiderakendustes jne. Sel põhjusel on kõige parem hoida see teave selge, lühike ja ülevaatlik.
         title: Märgistus
       content_retention:
-        preamble: Juhi kuidas kasutajate loodud sisu Mastodon'is talletatakse.
+        preamble: Määra, kuidas kasutajate loodud sisu Mastodonis talletatakse.
         title: Sisu talletamine
+      default_noindex:
+        desc_html: Mõjub kasutajatele, kes pole seda sätet ise muutnud
+        title: Otsimootorite indeksitesse kasutajaid vaikimisi ei lisata
       discovery:
         follow_recommendations: Jälgi soovitusi
-        preamble: Huvitava sisu esiletoomine on oluline uute kasutajate kaasamisel, kes ei pruugi Mastodonist kedagi tunda. Kontrollige, kuidas erinevad avastamisfunktsioonid teie serveris töötavad.
+        preamble: Huvitava sisu esiletoomine on oluline uute kasutajate kaasamisel, kes ei pruugi Mastodonist kedagi tunda. Kontrolli, kuidas erinevad avastamisfunktsioonid serveris töötavad.
         profile_directory: Kasutajate kataloog
         public_timelines: Avalikud ajajooned
-        title: Avastus
+        title: Avastamine
         trends: Trendid
       domain_blocks:
         all: Kõigile
@@ -743,19 +747,19 @@ et:
       media:
         title: Meedia
       metadata: Metaandmed
-      no_status_selected: Mitte ühtegi staatust muudeti sest midagi polnud valitud
+      no_status_selected: Ühtegi postitust ei muudetud, sest ühtegi polnud valitud
       open: Ava postitus
       original_status: Algne postitus
       reblogs: Jagamised
       status_changed: Muudetud postitus
-      title: Konto staatused
+      title: Konto postitused
       trending: Populaarne
       visibility: Nähtavus
       with_media: Meediaga
     strikes:
       actions:
         delete_statuses: "%{name} kustutas %{target} postitused"
-        disable: "%{name} külmutas %{target} konto"
+        disable: "%{name} lukustas %{target} konto"
         mark_statuses_as_sensitive: "%{name} märkis %{target} postitused tundlikena"
         none: "%{name} saatis hoiatuse kasutajale %{target}"
         sensitive: "%{name} märkis %{target} konto kui tundlik sisu"
@@ -777,7 +781,7 @@ et:
       sidekiq_process_check:
         message_html: Ühtegi Sidekiq protsessi pole %{value} järjekorra jaoks. Sidekiq seadistus vajab üle vaatamist
     tags:
-      review: Staatuse ülevaade
+      review: Vaata olek üle
       updated_msg: Sildi sätted edukalt uuendatud
     title: Administreerimine
     trends:
@@ -787,7 +791,7 @@ et:
       links:
         allow: Luba viit
         allow_provider: Luba autor
-        description_html: Need on lingid, mida jagavad praegu palju kontod, mille postitusi teie server näeb. See võib aidata kasutajatel teada saada, mis maailmas toimub. Ühtegi linki ei kuvata avalikult enne, kui avaldaja on heaks kiidetud. Samuti saab üksikuid linke lubada või tagasi lükata.
+        description_html: Need on lingid, mida jagavad praegu paljud kontod, mille postitusi server näeb. See võib aidata kasutajatel teada saada, mis maailmas toimub. Ühtegi linki ei kuvata avalikult enne, kui avaldaja on heakskiidetud. Samuti saab üksikuid linke lubada või tagasi lükata.
         disallow: Keela viit
         disallow_provider: Keela autor
         no_link_selected: Viitasid ei muudetud, kuna ühtegi polnud valitud
@@ -852,7 +856,7 @@ et:
     webhooks:
       add_new: Lisa lõpp-punkt
       delete: Kustuta
-      description_html: "<strong>Veebihaak</strong> võimaldab Mastodonil edastada <strong>reaalajas märguandeid</strong> valitud sündmuste kohta teie enda rakendusele, et teie rakendus saaks <strong>automaatselt reaktsioone käivitada</strong>."
+      description_html: "<strong>Veebihaak</strong> võimaldab Mastodonil edastada valitud sündmuste kohta su rakendusele <strong>reaalajas märguandeid</strong>, et rakendus saaks <strong>automaatselt reaktsioone käivitada</strong>."
       disable: Keela
       disabled: Keelatud
       edit: Muuda lõpp-punkti
@@ -866,14 +870,14 @@ et:
       new: Uus veebikonks
       rotate_secret: Salavõtme rotatsioon
       secret: Salavõti allkirjastamiseks
-      status: Staatus
+      status: Olek
       title: Veebikonksud
       webhook: Veebikonks
   admin_mailer:
     new_appeal:
       actions:
         delete_statuses: kustutada postitused
-        disable: kustutada konto
+        disable: lukustada konto
         mark_statuses_as_sensitive: et märkida postitused kui tundlik sisu
         none: hoiatus
         sensitive: et märkida konto kui tundlik sisu
@@ -883,7 +887,7 @@ et:
       next_steps: Võid modereeringu tagasi pööramiseks vaidlustuse rahuldada, või ka mitte.
       subject: "%{username} on vaidlustanud %{instance} modereerimisotsuse"
     new_pending_account:
-      body: Uue konto üksikasjad on allpool. Te saate vastu võtta või tagasi lükata seda taotlust.
+      body: Uue konto üksikasjad on allpool. Saad taotluse vastu võtta või tagasi lükata.
       subject: Uus konto valmis ülevaatluseks serveril %{instance} (%{username})
     new_report:
       body: "%{reporter} teavitas kasutajast %{target}"
@@ -901,18 +905,18 @@ et:
         title: Trendikad sildid
       subject: Uued %{instance} trendid ülevaatuseks
   aliases:
-    add_new: Loo teine nimi
-    created_msg: Teine nimi on edukalt loodud. Te saate nüüd alustada kolimist vanalt kontolt.
+    add_new: Pane kolimiseks valmis
+    created_msg: Konto on valmis vastu võtma jälgijaid. Logi sisse oma vanale kontole ja käivita kolimine sealt.
     deleted_msg: Edukalt kustutasime teise nime. Kolimine sellelt kontolt praegusele on nüüdsest võimatu.
-    empty: Teil puuduvad teised nimed.
-    hint_html: Kui Te soovite kolida teiselt kontolt praegusele kontole, saate Te siin luua teise nime, mis on kohustuslik, enne kui saate kolida jälgijaid vanalt kontolt praegusele. See tegevus on iseenesest <strong>kahjutu ja taastatav</strong>. <strong>Konto ületoomine alustatakse vanalt kontolt</strong>.
-    remove: Eemalda teine nimi
+    empty: Sul pole aliaseid.
+    hint_html: Kui soovid konto siia üle kolida, pead esmalt siin määrama kolitava konto aadressi. Seejärel on konto valmis võtma vastu jälgijaid vanalt kontolt. Kolitava konto aadressi määramine on iseenesest <strong>kahjutu ja tagasipööratav</strong>. <strong>Jälgijate tegelik kolimine käivitatakse vanalt kontolt</strong>.
+    remove: Loobu suunamise vastuvõtmisest
   appearance:
     advanced_web_interface: Kohandatud veebiliides
-    advanced_web_interface_hint: 'Kui soovite kasutada terve ekraani laiust, lubab kohandatud veebiliides seadistada mitut erinevat veergu, et näha nii palju informatsiooni samal ajal, kui võimalik: Kodu, teavitused, föderatsiooni ajajoon ning mis iganes arv nimekirju ja silte.'
+    advanced_web_interface_hint: 'Kui soovid kasutada kogu ekraani laiust, saab kohandatud veebiliideses seadistada mitut veergu, nii et samal ajal oleks näha nii palju infot kui soovid: Kodu, teavitused, föderatsiooni ajajoon ning kuitahes palju nimekirju ja silte.'
     animations_and_accessibility: Animatsioonid ja ligipääs
     confirmation_dialogs: Kinnitusdialoogid
-    discovery: Avastus
+    discovery: Avastamine
     localization:
       body: Mastodoni tõlgivad vabatahtlikud.
       guide_link: https://crowdin.com/project/mastodon/et
@@ -925,36 +929,36 @@ et:
     settings: 'Muuda e-kirjade eelistusi: %{link}'
     view: 'Vaade:'
     view_profile: Vaata profiili
-    view_status: Vaata staatust
+    view_status: Vaata postitust
   applications:
     created: Rakenduse loomine õnnestus
     destroyed: Rakenduse kustutamine õnnestus
     regenerate_token: Loo uus access token
     token_regenerated: Access tokeni loomine õnnestus
-    warning: Olge nende andmetega ettevaatlikud. Ärge jagage neid kellegagi!
-    your_token: Teie access token
+    warning: Ole nende andmetega ettevaatlikud. Ära jaga neid kellegagi!
+    your_token: Su juurdepääsutunnus
   auth:
     apply_for_account: Konto taotluse esitamine
     change_password: Salasõna
     delete_account: Konto kustutamine
-    delete_account_html: Kui soovid oma konto kustutada, siis <a href="%{path}">jätka siit</a>. Pead selle eraldi kinnitama.
+    delete_account_html: Kui soovid oma konto kustutada, siis <a href="%{path}">jätka siit</a>. Pead kustutamise eraldi kinnitama.
     description:
       prefix_invited_by_user: "@%{name} kutsub Teid liituma selle Mastodoni serveriga!"
       prefix_sign_up: Loo Mastodoni konto juba täna!
-      suffix: Kasutajakontoga saate jälgida inimesi, postitada uudiseid ning teha kirjavahetust üks kõik millisest Mastodoni serverist kasutajatega ja muud!
+      suffix: Kasutajakontoga saad jälgida inimesi, postitada uudiseid ning pidada kirjavahetust ükskõik millise Mastodoni serveri kasutajatega ja muudki!
     didnt_get_confirmation: Ei saanud kinnituse juhendeid?
     dont_have_your_security_key: Pole turvavõtit?
     forgot_password: Salasõna ununenud?
     invalid_reset_password_token: Salasõna lähtestusvõti on vale või aegunud. Palun taotle uus.
-    link_to_otp: Kahe-etapine kood telefonist või taastekood
+    link_to_otp: Kaheastmeline kood telefonist või taastekood
     link_to_webauth: Turvavõtmete seadme kasutamine
     log_in_with: Sisene kasutades
     login: Logi sisse
     logout: Logi välja
     migrate_account: Teisele kontole ära kolimine
-    migrate_account_html: Kui soovid selle konto siit ära kolida, <a href="%{path}">saad seda teha siit</a>.
+    migrate_account_html: Kui soovid konto siit ära kolida, <a href="%{path}">saad seda teha siin</a>.
     or_log_in_with: Või logi sisse koos
-    privacy_policy_agreement_html: Olen lugenud ja nõustun <a href="%{privacy_policy_path}" target="_blank">privaatsuspoliitikaga</a>
+    privacy_policy_agreement_html: Olen tutvunud <a href="%{privacy_policy_path}" target="_blank">isikuandmete kaitse põhimõtetega</a> ja nõustun nendega
     providers:
       cas: CAS
       saml: SAML
@@ -968,30 +972,33 @@ et:
     security: Turvalisus
     set_new_password: Uue salasõna määramine
     setup:
-      email_below_hint_html: Kui allolev e-posti aadress on vale, saate Te muuta seda siin ning Teile saadetakse uus kinnituskiri.
-      email_settings_hint_html: Kinnituskiri saadeti e-posti aadressile %{email}. Kui see aadress pole õige, saate Te muuta seda oma konto sätetest.
+      email_below_hint_html: Kui allolev e-posti aadress on vale, saad seda muuta siin. Seejärel saadetakse uus kinnituskiri.
+      email_settings_hint_html: Kinnituskiri saadeti e-posti aadressile %{email}. Kui see aadress pole õige, saad muuta seda oma konto sätetest.
       title: Seadistamine
+    sign_in:
+      preamble_html: Logi sisse oma <strong>%{domain}</strong> volitustega. Kui konto asub teises serveris, ei saa siin sisse logida.
+      title: Logi sisse kohta %{domain}
     sign_up:
-      preamble: Selle kontoga saad jälgida ja suhelda kõigi teiste kasutajatega erivevates Mastodoni serverites.
+      preamble: Selle kontoga saad jälgida ja suhelda kõigi teiste kasutajatega erinevates Mastodoni serverites.
       title: Loo konto serverisse  %{domain}.
     status:
       account_status: Konto olek
       confirming: Ootan e-posti kinnitust.
       functional: Konto on täies mahus kasutatav.
-      pending: Teie taotlus ootab ülevaadet meie personali poolt. See võib võtta mõnda aega. Kui Teie taotlus on vastu võetud, saadetakse Teile e-kiri.
-      redirecting_to: Teie konto ei ole aktiivne, kuna hetkel suunatakse ümber kasutajale %{acct}.
+      pending: Taotlus ootab ülevaatamist meie personali poolt. See võib võtta mõne aja. Kui taotlus on vastu võetud, saadetakse sulle e-kiri.
+      redirecting_to: See konto pole aktiivne, sest on suunatud aadressile %{acct}.
       view_strikes: Vaata enda eelnevaid juhtumeid
     too_fast: Vorm esitatud liiga kiirelt, proovi uuesti.
     use_security_key: Kasuta turvavõtit
   authorize_follow:
-    already_following: Te juba jälgite seda kontot
-    already_requested: Te juba saatsite jälgimistaotluse sellele kontole
+    already_following: Juba jälgid seda kontot
+    already_requested: Saatsid juba sellele kontole jälgimistaotluse
     error: Kahjuks ilmus viga kasutaja kaugserverist otsimisel
     follow: Jälgi
-    follow_request: 'Te olete saatnud jälgimistaotluse kasutajale:'
-    following: 'Õnnestus! Te nüüd jälgite kasutajat:'
+    follow_request: 'Oled saatnud jälgimistaotluse kasutajale:'
+    following: 'Õnnestus! Jälgid nüüd kasutajat:'
     post_follow:
-      close: Või Te saate lihtsalt sulgeda seda akent.
+      close: Või sulge lihtsalt see aken.
       return: Näita kasutaja profiili
       web: Mine veebi
     title: Jälgi %{acct}
@@ -1023,22 +1030,22 @@ et:
       x_months: "%{count}k"
       x_seconds: "%{count}s"
   deletes:
-    challenge_not_passed: Informatsioon, mida sisestasite, oli vale
+    challenge_not_passed: Info, mille sisestasid, oli ebakorrektne
     confirm_password: Praegune salasõna isikusamasuse kinnitamiseks
-    confirm_username: Sisestage oma kasutajanimi protseduuri kinnitamiseks
+    confirm_username: Sisesta tegevuse kinnitamiseks oma kasutajanimi
     proceed: Kustuta konto
     success_msg: Konto kustutamine õnnestus
     warning:
-      before: 'Enne jätkamist palun lugege neid märkmeid hoolikalt:'
-      caches: Sisu, mis on salvestatud teiste serverite poolt, võib jääda alles
-      data_removal: Teie postitused ning muud andmed kustutatakse jäädavalt
-      email_change_html: Te saate <a href="%{path}">muuta oma e-postiaadressi</a> kontot kustutamata
-      email_contact_html: Kui see ikkagi ei saabu, saatke abi saamiseks kiri aadressile <a href="mailto:%{email}">%{email}</a>
-      email_reconfirmation_html: Kui Te ei saanud kinnituskirja, saate selle <a href="%{path}">uuesti küsida</a>
-      irreversible: Te ei saa taastada ega taasaktiveerida oma kontot
-      more_details_html: Rohkemate detailide jaoks palun lugege <a href="%{terms_path}">privaatsuspoliitikat</a>.
-      username_available: Teie kasutajanimi muutub uuesti kasutatavaks
-      username_unavailable: Teie kasutajanimi jääb mitte kasutatavaks
+      before: 'Veendu, et saad aru, mida toob plaanitav muudatus kaasa:'
+      caches: Teiste serverite poolt talletatud sisu võib jääda kättesaadavaks
+      data_removal: Sinu postitused ning kontoandmed kustutatakse jäädavalt
+      email_change_html: Saad <a href="%{path}">muuta oma e-postiaadressi</a> kontot kustutamata
+      email_contact_html: Kui see ikkagi ei saabu, saada abi saamiseks kiri aadressile <a href="mailto:%{email}">%{email}</a>
+      email_reconfirmation_html: Kui kinnituskiri ei saabunud, saab selle <a href="%{path}">uuesti küsida</a>
+      irreversible: Kustutatud kontot ei saa taastada ega uuesti aktiveerida
+      more_details_html: Konto kustutamise kohta loe täpsemalt <a href="%{terms_path}">isikuandmete kaitse põhimõtetest</a>.
+      username_available: Kasutajanimi muutub uuesti kasutatavaks
+      username_unavailable: Kasutajanimi jääb mittekasutatavaks
   disputes:
     strikes:
       action_taken: Tulemus
@@ -1052,7 +1059,7 @@ et:
       approve_appeal: Rahulda vaidlustus
       associated_report: Seotud raport
       created_at: Kuupäev
-      description_html: See on käesoleva konto hoiatuste ja tegevuste ajalugu, mis on %{instance} haldajate poolt ette võetud.
+      description_html: See on %{instance} haldajate poolt käesoleva konto suhtes tehtud hoiatuste ja tegevuste ajalugu.
       recipient: Adressaat
       reject_appeal: Lükka vaidlustus tagasi
       status: 'Postitus #%{id}'
@@ -1060,13 +1067,13 @@ et:
       title: "%{action} kuupäevaga %{date}"
       title_actions:
         delete_statuses: Postituste eemaldamine
-        disable: Konto külmutamine
-        mark_statuses_as_sensitive: Postituste tundlikena märkimine
+        disable: Konto lukustamine
+        mark_statuses_as_sensitive: Postituste märkimine tundlikena
         none: Hoiatus
         sensitive: Konto tundlikuna märkimine
         silence: Konto piirang
         suspend: Konto kustutamine
-      your_appeal_approved: Teie vaidlustus on rahuldatud
+      your_appeal_approved: Su vaidlustus on heakskiidetud
       your_appeal_pending: Vaidlustus on esitatud
       your_appeal_rejected: Vaidlustus on tagasi lükatud
   domain_validator:
@@ -1078,14 +1085,14 @@ et:
     '406': See lehekülg ei ole soovitavas formaadis saadaval.
     '410': Soovitud lehekülge pole enam siin.
     '422':
-      content: Turvalisuse kontroll ebaõnnestus. Kas Te blokeerite küpsiseid?
+      content: Turvalisuse kontroll ebaõnnestus. Kas blokeerid küpsiseid?
       title: Turvalisuse kontroll ebaõnnestus
     '429': Aeglustatud
     '500':
       content: Palume vabandust, midagi läks valesti meie pool.
       title: See lehekülg pole õige
     '503': Lehekülge ei saanud serveerida ajutise serveri vea tõttu.
-    noscript_html: Et kasutada Mastodoni veebirakendust, palun lubage JavaScript. Alternatiivselt, proovige mõnda <a href="%{apps_path}">rakendust</a> Teie platvormile.
+    noscript_html: Et kasutada Mastodoni veebirakendust, palun luba JavaScript. Teise võimalusena proovi mõnda <a href="%{apps_path}">rakendust</a> su platvormile.
   existing_username_validator:
     not_found: ei suutnud leida kohalikku kasutajat selle kasutajanimega
     not_found_multiple: ei suutnud leida %{usernames}
@@ -1094,21 +1101,21 @@ et:
       date: Kuupäev
       download: Lae alla oma arhiiv
       hint_html: "<strong>Postitustest ja üleslaetud meediast</strong> on võimalik saada koopia. Eksporditud andmed on ActivityPub-formaadis, loetav vastava tarkvara poolt. Koopia saamine on võimalik iga 7 päeva järel."
-      in_progress: Loome Teie arhiivi...
+      in_progress: Loome arhiivi...
       request: Taotle oma arhiivi
       size: Suurus
-    blocks: Teie blokeerite
+    blocks: Sa blokeerid
     bookmarks: Järjehoidjad
     csv: CSV
     domain_blocks: Domeeni blokeeringud
-    lists: Nimistud
-    mutes: Teie vaigistate
+    lists: Nimekirjad
+    mutes: Oled vaigistanud
     storage: Meedia hoidla
   featured_tags:
     add_new: Lisa uus
     errors:
-      limit: Olete jõudnud maksimum lubatud siltide arvuni
-    hint_html: "<strong>Mis on esile toodud sildid?</strong> Need sildid näidatakse nähtavalt Teie avalikul profiilil ning nad aitavad inimestel leida postitusi, millel on antud sildid. Nad on hea viis, kuidas näiteks hoida järge loovtöödel või pikaajalistel projektidel."
+      limit: Oled jõudnud siltide lubatud maksimumarvuni
+    hint_html: "<strong>Mis on esiletõstetud sildid?</strong> Neid silte näidatakse su avalikul profiilil esiletõstetult ning need aitavad teistel leida postitusi, millel on selline silt. See on hea viis, kuidas hoida järge loovtöödel või pikaajalistel projektidel."
   filters:
     contexts:
       account: Profiilid
@@ -1123,12 +1130,12 @@ et:
       statuses_hint_html: See filter rakendub üksikute postituste valimisel olenemata sellest, kas need vastavad allolevatele märksõnadele. <a href="%{path}">Filtri postituste ülevaatamine või kustutamine</a>.
       title: Muuda filtrit
     errors:
-      deprecated_api_multiple_keywords: Neid parameetreid ei saa selles rakenduses muuta, kuna need kehtivad rohkem kui ühele filtri märksõnale. Kasutage uuemat rakendust või veebiliidest.
+      deprecated_api_multiple_keywords: Neid parameetreid ei saa selles rakenduses muuta, kuna need kehtivad rohkem kui ühele filtri märksõnale. Kasuta uuemat rakendust või veebiliidest.
       invalid_context: Puudulik või vale kontekst
     index:
       contexts: Filtrid %{contexts}
       delete: Kustuta
-      empty: Teil pole filtreid.
+      empty: Sul pole filtreid.
       expires_in: Aegub %{distance}
       expires_on: Aegub %{date}
       keywords:
@@ -1173,8 +1180,8 @@ et:
       other: Vali kõik %{count} otsinguvastet.
     today: täna
     validation_errors:
-      one: Midagi pole ikka õigesti! Palun vaadake allolev veateade üle
-      other: Midagi pole ikka õigesti! Palun vaadake all olevad %{count} veateadet üle
+      one: Midagi pole ikka õigesti! Palun vaata allolev veateade üle
+      other: Midagi pole ikka õigesti! Palun vaata all olevad %{count} veateadet üle
   html_validator:
     invalid_markup: 'sisaldab valet HTMLi süntaksi: %{error}'
   imports:
@@ -1186,8 +1193,8 @@ et:
       merge_long: Hoia olemasolevad andmed ja lisa uusi
       overwrite: Kirjuta üle
       overwrite_long: Vaheta praegused andmed uute vastu
-    preface: Te saate importida mis tahes andmeid, mis on eksporditud teisest serverist. Näiteks nimekiri inimestest, keda jälgid ja keda blokeerid.
-    success: Teie andmete üleslaadimine õnnestus ning neid töödeldakse
+    preface: Saad importida mistahes andmeid, mis on eksporditud teisest serverist. Näiteks nimekirja inimestest, keda jälgid ja keda blokeerid.
+    success: Andmete üleslaadimine õnnestus ning neid töödeldakse
     types:
       blocking: Blokeeringute nimekiri
       bookmarks: Järjehoidjad
@@ -1219,54 +1226,54 @@ et:
     title: Kutsu inimesi
   lists:
     errors:
-      limit: Olete jõudnud maksimum lubatud nimekirjade arvuni
+      limit: Oled jõudnud loetelude lubatud maksimumarvuni
   login_activities:
     authentication_methods:
-      otp: kahe-etapise autentimise rakendus
+      otp: kaheastmelise autentimise rakendus
       password: salasõna
       sign_in_token: e-posti turvakood
       webauthn: turvavõtmed
-    description_html: Kui paistab tundmatauid tegevusi, tuleks vahetada salasõna ja aktiveerida kahe-etapine autentimine.
+    description_html: Kui paistab tundmatuid tegevusi, tuleks vahetada salasõna ja aktiveerida kaheastmeline autentimine.
     empty: Autentimisajalugu pole saadaval
     failed_sign_in_html: Nurjunud sisenemine meetodiga %{method} aadressilt %{ip} (%{browser})
     successful_sign_in_html: Edukas sisenemine meetodiga %{method} aadressilt %{ip} (%{browser})
     title: Autentimise ajalugu
   media_attachments:
     validations:
-      images_and_video: Ei saa lisada video staatusele, millel on juba pildid
-      not_ready: Ei saa lisada faile, mida hetkel töödeldakse. Proovige uuesti mõne hetke pärast!
+      images_and_video: Ei saa lisada video postitusele, milles on juba pildid
+      not_ready: Ei saa lisada faile, mida hetkel töödeldakse. Proovi uuesti mõne hetke pärast!
       too_many: Ei saa lisada rohkem, kui 4 faili
   migrations:
-    acct: uue konto kasutajanimi@domeen
+    acct: Kolitud aadressile
     cancel: Tühista ümbersuunamine
-    cancel_explanation: Ümbersuunamise tühistamine taasaktiveerib Teie praeguse konto, kuid ei too tagasi jälgijaid, mis on sellele kontole üle viidud.
+    cancel_explanation: Ümbersuunamise tühistamine aktiveerib siinse konto, kuid teisele kontole üle viidud jälgijaid tagasi ei too.
     cancelled_msg: Ümbersuunamise tühistamine õnnestus.
     errors:
-      already_moved: on sama konto, kuhu Te olete juba kolinud
+      already_moved: on sama konto, kuhu oled juba kolinud
       missing_also_known_as: ei viita tagasi sellele kontole
       move_to_self: ei saa olla praegune konto
       not_found: ei leitud
-      on_cooldown: Te olete hetkel ootel
+      on_cooldown: Oled hetkel ootel
     followers_count: Jälgijaid kolimise hetkel
-    incoming_migrations: Teiselt kontolt siia kolimine
-    incoming_migrations_html: Kui soovid kolida teise konto siia, pead esmalt määrama <a href="%{path}">kolitava konto nime</a>.
-    moved_msg: Teie konto on nüüd ümber suunamas kontole %{acct} ning Teie jälgijaid kolitakse üle.
-    not_redirecting: Teie kontot ei suunata hetkel ümber.
-    on_cooldown: Te olete hiljuti kolinud oma kontot. See funktsioon on jälle kättesaadav %{count} päeva pärast.
-    past_migrations: Eelmiseid kolimisi
-    proceed_with_move: Koli üle jälgijad
-    redirected_msg: Teie kontot suunatakse nüüd ümber kontole %{acct}.
-    redirecting_to: Teie konto suunatakse ümber kontole %{acct}.
-    set_redirect: Määra ümbersuunamine
+    incoming_migrations: Teise konto siia kolimine
+    incoming_migrations_html: Kui soovid kolida teise konto siia, pead esmalt määrama <a href="%{path}">kolitava konto aadressi</a>.
+    moved_msg: Su konto suunab nüüd ümber kontole %{acct}, jälgijaid kolitakse üle.
+    not_redirecting: See konto pole praegu kuhugi ümber suunatud.
+    on_cooldown: Oled oma kontot hiljuti kolinud. Uuesti saad seda teha %{count} päeva pärast.
+    past_migrations: Kolimisajalugu
+    proceed_with_move: Käivita kolimine
+    redirected_msg: Konto on suunatud ümber aadressile %{acct}.
+    redirecting_to: Konto on suunatud ümber aadressile %{acct}.
+    set_redirect: Suuna ümber
     warning:
-      backreference_required: Uus konto peab olema esmalt seadistatud tagasi viitama praegusele kontole
-      before: 'Enne jätkamist palun lugege neid märkmeid hoolikalt:'
-      cooldown: Pärast kolimist on ooteperiood, mille kestel ei saa Te uuesti kolida
-      disabled_account: Teie praegune konto ei ole täiesti kasutatav peale seda. Sellest hoolimata on Teil ligipääs andmete ekspordile ja taasaktiveerimisele.
-      followers: See tegevus kolib kõik jälgijad üle praeguselt kontolt uuele kontole
-      only_redirect_html: Alternatiivselt saate Te <a href="%{path}">seadistada ainult ümbersuunamise Teie profiilil</a>.
-      other_data: Muid andmeid ei liigutata automaatselt
-      redirect: Teie praegune konto eemaldatakse otsingutulemustest ning profiilile lisatakse ümbersuunamise märguanne
+      backreference_required: Uus konto peab olema esmalt seadistatud võtma vastu siinse konto jälgijaid
+      before: 'Veendu, et saad aru, mida toob plaanitav muudatus kaasa:'
+      cooldown: Kolimisele järgneb ooteaeg, mille vältel kontot mõnda aega ümber kolida ei saa
+      disabled_account: Pärast seda ei ole konto täielik kasutamine võimalik. Säilib andmete eksportimise ja konto taasaktiveerimise võimalus.
+      followers: See käsklus kolib kõik siinse konto jälgijad üle sinu uue konto jälgijateks
+      only_redirect_html: Teine võimalus on <a href="%{path}">märkida konto ümbersuunatuks</a>.
+      other_data: Muid kontoandmeid, sh postitusi automaatselt üle ei kanta
+      redirect: Konto eemaldatakse avalikust kataloogist ja märgitakse profiilis ümbersuunatuks
   moderation:
     title: Modereerimine
   move_handler:
@@ -1282,12 +1289,12 @@ et:
       sign_up:
         subject: "%{name} liitus"
     favourite:
-      body: "%{name} lisas Teie staatuse lemmikutesse:"
-      subject: "%{name} märkis su staatuse lemmikuks"
+      body: "%{name} lisas su postituse lemmikutesse:"
+      subject: "%{name} märkis su postituse lemmikuks"
       title: Uus lemmik
     follow:
-      body: "%{name} nüüd jälgib teid!"
-      subject: "%{name} nüüd jälgib teid"
+      body: "%{name} alustas su jälgimist!"
+      subject: "%{name} alustas su jälgimist"
       title: Uus jälgija
     follow_request:
       action: Halda jälgimistaotlusi
@@ -1302,7 +1309,7 @@ et:
     poll:
       subject: "%{name} küsitlus lõppes"
     reblog:
-      body: "%{name} jagas postitust:"
+      body: "%{name} jagas edasi postitust:"
       subject: "%{name} jagas postitust"
       title: Uus jagamine
     status:
@@ -1311,7 +1318,7 @@ et:
       subject: "%{name} muutis postitust"
   notifications:
     email_events: E-posti teadete sündmused
-    email_events_hint: 'Valige sündmused, millest soovite teavitusi:'
+    email_events_hint: 'Vali sündmused, mille kohta soovid teavitusi:'
     other_settings: Muud teadete sätted
   number:
     human:
@@ -1325,7 +1332,7 @@ et:
           trillion: trn
   otp_authentication:
     code_hint: Kinnituseks autentimisrakenduse loodud kood
-    description_html: Kui aktiveerda <strong>kahe-etapine autentimine</strong> autentimisrakenduse abil, on sisselogimiseks tarvis telefoni, mis loob sisenemiseks võtmeid.
+    description_html: Kui aktiveerida <strong>kaheastmeline autentimine</strong> autentimisrakenduse abil, on sisselogimiseks tarvis telefoni, mis loob sisenemiseks võtmeid.
     enable: Luba
     instructions_html: "<strong>See QR-kood on võimalik skannida telefoni Google Authenticatori või sarnasesse ühekordsete aeguvate salasõnade (TOTP) rakendusse</strong>. Nüüdsest genereerib see rakendus koode, mille peab sisenemisel sisestama."
     manual_instructions: 'Kui pole võimalik QR-koodi skaneerida, on salavõti võimalik sisestada tavatekstina:'
@@ -1339,7 +1346,7 @@ et:
     truncate: "&hellip;"
   polls:
     errors:
-      already_voted: Olete siin juba hääletanud
+      already_voted: Oled siin hääletusel juba hääletanud
       duplicate_options: sisaldab samu asju mitu korda
       duration_too_long: kestab liiga kaua
       duration_too_short: on liiga vara
@@ -1376,7 +1383,7 @@ et:
     remove_selected_follows: Lõpeta valitud kasutajate jälgimine
     status: Konto olek
   remote_follow:
-    missing_resource: Ei suutnud leida vajalikku suunamise URLi Teie konto jaoks
+    missing_resource: Ei ole võimalik leida konto jaoks vajalikku suunamise URLi
   reports:
     errors:
       invalid_rules: ei viita kehtivatele reeglitele
@@ -1387,7 +1394,7 @@ et:
       tag: 'Avalikud postitused sildiga #%{hashtag}'
   scheduled_statuses:
     over_daily_limit: Lubatud ajastatud postituste arv %{limit} päevas on tänaseks ületatud
-    over_total_limit: Te olete jõudnud maksimum lubatud ajastatud tuututuste arvuni %{limit}
+    over_total_limit: Oled jõudnud ajastatud postituste lubatud maksimumarvuni %{limit}
     too_soon: Ajastatud kuupäev peab olema tukevikus
   sessions:
     activity: Viimane aktiivsus
@@ -1412,7 +1419,7 @@ et:
       weibo: Weibo
     current_session: Praegune seanss
     description: "%{browser} platvormil %{platform}"
-    explanation: Need on veebilehitsejad on praegu sinu Mastodoni kontole sisse loginud.
+    explanation: Need veebilehitsejad on praegu su Mastodoni kontole sisse loginud.
     ip: IP
     platforms:
       adobe_air: Adobe Air
@@ -1434,7 +1441,7 @@ et:
   settings:
     account: Konto
     account_settings: Kontosätted
-    aliases: Konto teised nimed
+    aliases: Siia kolitavad kontod
     appearance: Välimus
     authorized_apps: Lubatud rakendused
     back: Tagasi Mastodoni
@@ -1445,14 +1452,14 @@ et:
     featured_tags: Esile toodud sildid
     import: Impordi
     import_and_export: Import / eksport
-    migrate: Konto migreerumine
+    migrate: Konto kolimine
     notifications: Teated
     preferences: Eelistused
     profile: Profiil
     relationships: Jälgitud ja jälgijad
     statuses_cleanup: Automaatne kustutamine
     strikes: Modereerimisjuhtumid
-    two_factor_authentication: Kahe-etapine autentimine
+    two_factor_authentication: Kaheastmeline autentimine
     webauthn_authentication: Turvavõtmed
   statuses:
     attached:
@@ -1474,12 +1481,12 @@ et:
       other: 'sisaldab ebasobivaid silte: %{tags}'
     edited_at_html: Muudetud %{date}
     errors:
-      in_reply_not_found: Staatus, millele üritate vastata, ei näi enam eksisteerivat.
+      in_reply_not_found: Postitus, millele üritad vastata, ei näi enam eksisteerivat.
     open_in_web: Ava veebis
     over_character_limit: tähtmärkide limiit %{max} ületatud
     pin_errors:
       direct: Ei saa kinnitada postitusi, mis on nähtavad vaid mainitud kasutajatele
-      limit: Maksimaalne arv postitusi on juba kinnitatud
+      limit: Kinnitatud on juba maksimaalne arv postitusi
       ownership: Kellegi teise postitust ei saa kinnitada
       reblog: Jagamist ei saa kinnitada
     poll:
@@ -1536,7 +1543,7 @@ et:
       '7889238': 3 kuud
     min_age_label: Ajalimiit
     min_favs: Säilita postitused, meeldimistega vähemalt
-    min_favs_hint: Ei kustuta ühtegi postitust, mis on saanud vähemalt nii palju lemmikuid. Postituste kustutamiseks, olenemata nende lemmikute arvust, jätke tühjaks
+    min_favs_hint: Ei kustuta ühtegi postitust, mis on saanud vähemalt nii palju lemmikuks märkimist. Postituste kustutamiseks olenemata nende lemmikuks märkimise arvust, jäta tühjaks
     min_reblogs: Säilita postitused jagatud vähemalt
     min_reblogs_hint: Ei kustuta postitusi, kui need on jagatud vähemalt nii mitu korda. Tühjaks jättes kustuvad postitused olenemata jagamistest
   stream_entries:
@@ -1560,13 +1567,13 @@ et:
   two_factor_authentication:
     add: Lisa
     disable: Keela 2FA
-    disabled_success: Kahe-etapine autentimine keelatud
+    disabled_success: Kaheastmeline autentimine keelatud
     edit: Muuda
-    enabled: Kahe-etapine autentimine on lubatud
-    enabled_success: Kahe-etapine autentimine lubatud
+    enabled: Kaheastmeline autentimine on lubatud
+    enabled_success: Kaheastmeline autentimine lubatud
     generate_recovery_codes: Loo taastekoodid
-    lost_recovery_codes: Taastekoodide abil on võimalik telefoni kaotsimineku puhul kontole siseneda. Taastekoodide puudumisel saab need siin luua. Eelnevad taasetkoodid kaotavad kehtivuse.
-    methods: Kahe-etapised meetodid
+    lost_recovery_codes: Taastekoodide abil on võimalik telefoni kaotsimineku puhul kontole siseneda. Taastekoodide puudumisel saab need siin luua. Eelnevad taastekoodid kaotavad kehtivuse.
+    methods: Kaheastmelised meetodid
     otp: Autentimisrakendus
     recovery_codes: Taastekoodide varundamine
     recovery_codes_regenerated: Taastekoodid edukalt taasloodud
@@ -1583,14 +1590,14 @@ et:
       subject: "%{date} esitatud vaidlustus on tagasi lükatud"
       title: Vaidlustus tagasi lükatud
     backup_ready:
-      explanation: Te taotlesite varukoopia oma Mastodoni kontost. See on nüüd valmis allalaadimiseks!
-      subject: Teie arhiiv on allalaadimiseks valmis
+      explanation: Taotlesid oma Mastodoni konto varukoopiat. See on nüüd valmis allalaadimiseks!
+      subject: Arhiiv on allalaadimiseks valmis
       title: Arhiivi väljavõte
     suspicious_sign_in:
       change_password: muuta oma salasõna
       details: 'Sisenemise üksikasjad:'
       explanation: Täheldasime kontole sisenemise uuelt IP-aadressilt.
-      further_actions_html: Kui see tuleb üllatusena, soovitame viivitamata %{action} ja lülitada konto turvamiseks sisse kahe-etapine autentimine.
+      further_actions_html: Kui see tuleb üllatusena, soovitame viivitamata %{action} ja lülitada konto turvamiseks sisse kaheastmeline autentimine.
       subject: Kontole sisenemine uuelt IP-aadressilt
       title: Uus sisenemine
     warning:
@@ -1600,22 +1607,22 @@ et:
         spam: Rämpspost
         violation: Sisu eirab järgmisi kogukonnajuhiseid
       explanation:
-        delete_statuses: Mõned postitused eiravad ühte või mitmeid kogukonnajuhiseid ja on seetõttu %{instance} moderaatorite poolt eemaldatud.
+        delete_statuses: Mõned su positustest eiravad serveri reegleid või tavasid ning on seetõttu %{instance} moderaatorite poolt eemaldatud.
         disable: Konto kasutamine pole enam võimalik, kuid profiil ja muud andmed säilivad. Andmetest on võimalik saada varukoopiat, muuta konto seadeid või konto kustutada.
         mark_statuses_as_sensitive: Mõned postitused märgiti %{instance} moderaatorite poolt kui tundlik sisu. See tähendab, et meedia eelvaadet vaikimisi ei kuvata. Edaspidi postitades on soovitatav seesugune meedia märkida kui tundlik sisu.
         sensitive: Praegusest alates saab kogu Su üleslaetav meedia tundliku sisu märke ja selle eelvaadet ei kuvata enne hoiatust.
-        silence: Konto kasutamine on võimalik, ent sel serveril näevad postitusi ainult need, kes on juba jälgijad ning erinevatest avastusvõimalustest võidakse välja jätta. Käsitsi jälgima asumine on siiski võimalik.
+        silence: Saad kontot kasutada, ent sel serveril näevad su postitusi ainult need, kes on juba jälgijad, ning võid välja jääda erinevatest avastamisvõimalustest. Käsitsi jälgima asumine on siiski võimalik.
         suspend: Konto kasutamine pole enam võimalik ja profiil ja muud andmed pole enam kättesaadavad. Sisenemine on võimalik andmetest varukoopia saamiseks kuni nende lõpliku kustutamiseni 30 päeva pärast, ent säiltame mõned põhiandmed kustutamisest mööda hiilimise vältimiseks.
       reason: 'Põhjus:'
       statuses: 'Tsiteeritud postitused:'
       subject:
         delete_statuses: Postitused kontol %{acct} on eemaldatud
-        disable: Teie konto %{acct} on lukustatud
+        disable: Su konto %{acct} on lukustatud
         mark_statuses_as_sensitive: Konto %{acct} postitused on märgitud kui tundlik sisu
         none: Hoiatus kasutajale %{acct}
         sensitive: Konto %{acct} postitused on nüüdsest märgitud kui tundlik sisu
-        silence: Teie kontole %{acct} on kehtestatud limiidid
-        suspend: Teie konto %{acct} on kustutatud
+        silence: Su kontole %{acct} on kehtestatud piirangud
+        suspend: Su konto %{acct} on peatatud
       title:
         delete_statuses: Postitused eemaldatud
         disable: Konto lukustatud
@@ -1626,22 +1633,25 @@ et:
         suspend: Konto kustutatud
     welcome:
       edit_profile_action: Seadista oma profiil
-      edit_profile_step: "Esmalt seadistage oma profiil. Kindlasti lisage pilt ning lühikirjeldus. Vaadake üle oma konto seaded. Saate ise otsustada kui nähtav on teie konto teiste jaoks, mis keeltes postitusi oma ajavoos näha soovite ning kui privaatne peaks olema teie konto seadistus.\n\nKui mõni asi arusaamatuks jääb, siis võte vaadata juhendvideot: https://youtu.be/J4ItbTOAw7Q. "
-      explanation: Siin on mõned nõuanded, mis aitavad sul alustada
-      final_action: Alusa postitamist
-      final_step: 'Nüüd tehke oma esimene postitus. Hea tava on uues kohas ennast tutvustada ning kindlasti kasutage selles postituses ka teemaviidet  #tutvustus. Isegi kui teil ei ole veel jälgijaid, siis teie postitusi nähevad kohalikul ajajoonel ka kõik teised serveri kasutajad.'
-      full_handle: Teie kasutajanimi Mastodon võrgustikus
-      full_handle_hint: Kui jagad oma kasutajat väljaspool serverit siis kindlasti kasuta pikka nime, sest eri serverites võib olla sama kasutajanimega liikmeid.
+      edit_profile_step: |-
+        Esmalt seadista oma profiil. Saad lisada profiilipildi, muuta ekraaninime, lisada lühikirjelduse ja teha paljut muud. Vaata üle oma konto seaded. Saad ise otsustada, kui nähtav on konto teiste jaoks, mis keeltes postitusi oma ajavoos näha soovid ning kui privaatne peaks konto olema.
+
+        Kui mõni asi arusaamatuks jääb, siis võib vaadata juhendvideot: https://youtu.be/J4ItbTOAw7Q
+      explanation: Siin on mõned nõuanded, mis aitavad alustada
+      final_action: Alusta postitamist
+      final_step: 'Nüüd tee oma esimene postitus. Hea tava on uues kohas ennast tutvustada ning kindlasti kasuta selles postituses ka teemaviidet #tutvustus. Isegi kui sul ei ole veel jälgijaid, siis su postitusi näevad kohalikul ajajoonel ka kõik teised serveri kasutajad.'
+      full_handle: Kasutajanimi Mastodon võrgustikus
+      full_handle_hint: Kui jagad kasutajanime väljaspool serverit, siis kasuta kindlasti pikka nime. Erinevates serverites võib olla sama kasutajanimega liikmeid.
       subject: Tere tulemast Mastodoni
       title: Tere tulemast, %{name}!
   users:
-    follow_limit_reached: Te ei saa jälgida rohkem kui %{limit} inimest
-    invalid_otp_token: Vale kahe-etapine võti
-    otp_lost_help_html: Kui Te kaotasite ligipääsu mõlemale, saate võtta ühendust %{email}-iga
-    seamless_external_login: Läbi välise teenuse sisse logides pole salasõna ja e-posti sätted saadaval.
+    follow_limit_reached: Ei saa jälgida rohkem kui %{limit} inimest
+    invalid_otp_token: Vale kaheastmeline võti
+    otp_lost_help_html: Kui kaotasid ligipääsu mõlemale, saad võtta ühendust %{email}-iga
+    seamless_external_login: Välise teenuse kaudu sisse logides pole salasõna ja e-posti sätted saadaval.
     signed_in_as: 'Sisse logitud kasutajana:'
   verification:
-    explanation_html: 'Te saate <strong>kinnitada ennast oma profiili veebiviidete omanikena</strong>. Et seda teha, peab Teie viidatud veebilehel olema link tagasi Teie Mastodoni profiilile. Tagasi saatval lingil <strong>peab</strong> olema <code>rel="me"</code> atribuut. Tekstisisu lingil ei loe. Siin on üks näide:'
+    explanation_html: 'Saad <strong>kinnitada ennast oma profiili veebiviidete omanikuna</strong>. Selleks peab viidatud veebilehel olema link tagasi su Mastodoni profiilile. Tagasi saatval lingil <strong>peab</strong> olema <code>rel="me"</code> atribuut. Lingi tekstiline sisu ei ole oluline. Siin on üks näide:'
     verification: Kinnitamine
   webauthn_credentials:
     add: Uue turvavõtme lisamine
@@ -1658,5 +1668,5 @@ et:
     nickname_hint: Uue turvavõtme hüüdnimi
     not_enabled: Veebiautentimine pole sisse lülitatud
     not_supported: See veebilehitseja ei toeta turvavõtmeid
-    otp_required: Turvavõtmete kasutamiseks tuleb eelnevalt sisse lülitada kahe-etapine autentimine.
+    otp_required: Turvavõtmete kasutamiseks tuleb eelnevalt sisse lülitada kaheastmeline autentimine.
     registered_on: Registreeritud %{date}
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 02a8390cd..b94f621dc 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -548,7 +548,6 @@ eu:
     report_notes:
       created_msg: Salaketa oharra ongi sortu da!
       destroyed_msg: Salaketa oharra ongi ezabatu da!
-      today_at: Gaur %{time}(e)tan
     reports:
       account:
         notes:
@@ -1165,6 +1164,7 @@ eu:
     invalid_markup: 'HTML markaketa baliogabea du: %{error}'
   imports:
     errors:
+      invalid_csv_file: 'CSV fitxategi baliogabea. Errorea: %{error}'
       over_rows_processing_limit: "%{count} lerro baina gehiago ditu"
     modes:
       merge: Bateratu
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 04a4d4141..0260e2e63 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -265,6 +265,7 @@ fa:
         update_custom_emoji_html: "%{name} شکلک %{target} را به‌روز کرد"
         update_domain_block_html: "%{name} مسدودسازی دامنه را برای %{target} به‌روزرسانی کرد"
         update_status_html: "%{name} نوشتهٔ %{target} را به‌روز کرد"
+      deleted_account: حساب حذف شد
       empty: هیچ گزارشی پیدا نشد.
       filter_by_action: پالایش بر اساس کنش
       filter_by_user: پالایش بر اساس کاربر
@@ -370,6 +371,7 @@ fa:
         hint: مسدودسازی دامنه جلوی ایجاد ورودی‌های حساب در پایگاه داده را نمی‌گیرد، بلکه به طور خودکار روش‌های مدیریتی را روی فعالیت‌های فعلی و گذشتهٔ آن حساب‌ها اعمال می‌کند.
         severity:
           noop: هیچ
+          silence: محدود
           suspend: تعلیق
         title: مسدودسازی دامین تازه
       obfuscate: مبهم‌سازی نام دامنهٔ
@@ -495,7 +497,6 @@ fa:
     report_notes:
       created_msg: یادداشت گزارش با موفقیت ساخته شد!
       destroyed_msg: یادداشت گزارش با موفقیت حذف شد!
-      today_at: امروز در %{time}
     reports:
       account:
         notes:
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index ef4f21671..00540a1d5 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -116,6 +116,8 @@ fi:
       redownloaded_msg: Käyttäjän %{username} profiilin päivittäminen alkuperästä onnistui
       reject: Hylkää
       rejected_msg: Käyttäjän %{username} rekisteröitymishakemus hylättiin
+      remote_suspension_irreversible: Tämän tilin tiedot on poistettu peruuttamattomasti.
+      remote_suspension_reversible_hint_html: Tili on jäädytetty heidän palvelimellaan, ja tilin kaikki tiedot poistetaan %{date}. Ennen tätä ajankohtaa on kyseessä olevan palvelimen ylläpidolla mahdollisuus palauttaa tili ongelmitta. Jos puolestaan haluat poistaa tilin tietoineen heti, onnistuu se alta.
       remove_avatar: Poista profiilikuva
       remove_header: Poista otsakekuva
       removed_avatar_msg: Käyttäjän %{username} avatar-kuva poistettu onnistuneesti
@@ -353,7 +355,7 @@ fi:
         other: "<strong>%{count}</strong> odottavat raportit"
       pending_tags_html:
         one: "<strong>%{count}</strong> odottava hashtagi"
-        other: "<strong>%{count}</strong> odottavat hashtagit"
+        other: "<strong>%{count}</strong> odottavaa aihetunnistetta"
       pending_users_html:
         one: "<strong>%{count}</strong> odottava käyttäjä"
         other: "<strong>%{count}</strong> odottavat käyttäjät"
@@ -543,25 +545,24 @@ fi:
     relationships:
       title: "%{acct}n suhteet"
     relays:
-      add_new: Lisää uusi rele
+      add_new: Lisää uusi välittäjä
       delete: Poista
-      description_html: "<strong>federation relay</strong> on välittäjä palvelin, joka vaihtaa suuria määriä julkisia viestejä palvelimien välillä, jotka tilaavat ja julkaisevat sitä. <strong>Tämä auttaa pieniä ja keskisuuria palvelimia löytämään monipuolista sisältöä</strong>, joka muuten vaatisi käyttäjiä seuraamaan manuaalisesti muita ihmisiä eri palvelimilla."
+      description_html: "<strong>federaatiovälittäjä</strong> on välityspalvelin, joka siirtää siihen liittyneiden palvelimien välillä suuria julksia viestimääriä. <strong>Tämä voi auttaa pieniä ja keskikokoisia palvelimia löytämään fediversen sisältöä</strong>, joka muutoin vaatisi paikallisia käyttäjiä seuraamaan etäpalvelimien käyttäjiä manuaalisesti."
       disable: Poista käytöstä
-      disabled: Poistettu käytöstä
+      disabled: Ei käytössä
       enable: Ota käyttöön
-      enable_hint: Kun käytössä, palvelimesi tilaa kaikki julkiset viestit tästä releestä ja alkaa lähettää tämän palvelimen julkisia viestejä siihen.
+      enable_hint: Kun tämä on otettu käyttöön, palvelimesi liittyy välittäjään ja vastaanottaa jatkossa kaikki sen jakelemat julkiset julkaisut sekä välittää omat julkiset julkaisunsa sille.
       enabled: Käytössä
-      inbox_url: Synkronoi URL
-      pending: Odotetaan releen hyväksyntää
+      inbox_url: Välittäjän URL
+      pending: Odotetaan välittäjän hyväksyntää
       save_and_enable: Tallenna ja ota käyttöön
-      setup: Määritä releyhteys
-      signatures_not_enabled: Releet eivät toimi oikein, kun turvallinen tila tai rajoitettu federaatio on käytössä
+      setup: Määritä yhteys välittäjään
+      signatures_not_enabled: Välittäjät eivät toimi oikein, kun turvallinen tai rajoitettu federaatio -tila on käytössä
       status: Tila
-      title: Releet
+      title: Välittäjät
     report_notes:
       created_msg: Muistiinpano onnistuneesti lisätty raporttiin!
       destroyed_msg: Muistiinpano onnistuneesti poistettu raportista!
-      today_at: Tänään klo %{time}
     reports:
       account:
         notes:
@@ -668,7 +669,7 @@ fi:
         manage_settings: Hallita asetuksia
         manage_settings_description: Salli käyttäjien muuttaa sivuston asetuksia
         manage_taxonomies: Hallita luokittelua
-        manage_taxonomies_description: Sallii käyttäjien tarkistaa trendillisen sisällön ja päivittää hashtag-asetuksia
+        manage_taxonomies_description: Sallii käyttäjien tarkistaa nousussa olevan sisällön ja päivittää aihetunnisteiden asetuksia
         manage_user_access: Hallita käyttäjän oikeuksia
         manage_user_access_description: Sallii käyttäjien poistaa käytöstä muiden käyttäjien kaksivaiheisen todennuksen, muuttaa heidän sähköpostiosoitettaan ja nollata heidän salasanansa
         manage_users: Hallita käyttäjiä
@@ -704,6 +705,9 @@ fi:
       content_retention:
         preamble: Määritä, miten käyttäjän luoma sisältö tallennetaan Mastodoniin.
         title: Sisällön säilyttäminen
+      default_noindex:
+        desc_html: Vaikuttaa kaikkiin käyttäjiin, jotka eivät ole muuttaneet tätä asetusta itse
+        title: Jätä käyttäjät oletusarvoisesti hakukoneindeksoinnin ulkopuolelle
       discovery:
         follow_recommendations: Noudata suosituksia
         preamble: Mielenkiintoisen sisällön esille tuominen auttaa saamaan uusia käyttäjiä, jotka eivät ehkä tunne ketään Mastodonista. Määrittele, kuinka erilaiset etsintäominaisuudet toimivat palvelimellasi.
@@ -778,7 +782,7 @@ fi:
         message_html: Ei ole Sidekiq-prosessia käynnissä jonossa %{value}. Tarkista Sidekiq-asetukset
     tags:
       review: Tarkista tila
-      updated_msg: Hashtagin asetukset päivitetty onnistuneesti
+      updated_msg: Aihetunnisteen asetukset päivitetty onnistuneesti
     title: Ylläpito
     trends:
       allow: Salli
@@ -826,7 +830,7 @@ fi:
           tag_servers_dimension: Suosituimmat palvelimet
           tag_servers_measure: eri palvelimet
           tag_uses_measure: käyttökerrat
-        description_html: Nämä ovat hashtageja, jotka näkyvät tällä hetkellä monissa viesteissä, jotka palvelimesi näkee. Tämä voi auttaa käyttäjiäsi selvittämään, mistä ihmiset puhuvat eniten tällä hetkellä. Mitään hashtageja ei näytetä julkisesti ennen kuin hyväksyt ne.
+        description_html: Nämä ovat aihetunnisteita, jotka näkyvät tällä hetkellä monissa julkaisuissa, jotka palvelimesi näkee. Tämä voi auttaa käyttäjiäsi selvittämään, mistä ihmiset puhuvat eniten tällä hetkellä. Mitään aihetunnisteita ei näytetä julkisesti, ennen kuin hyväksyt ne.
         listable: Voidaan ehdottaa
         no_tag_selected: Yhtään tagia ei muutettu, koska yhtään ei valittu
         not_listable: Ei tulla ehdottamaan
@@ -896,9 +900,9 @@ fi:
       new_trending_statuses:
         title: Suositut viestit
       new_trending_tags:
-        no_approved_tags: Tällä hetkellä ei ole hyväksyttyjä trendikkäitä hashtageja.
-        requirements: 'Mikä tahansa näistä ehdokkaista voisi ylittää #%{rank} hyväksytyn trendikkään hashtagin, joka on tällä hetkellä #%{lowest_tag_name} arvosanalla %{lowest_tag_score}.'
-        title: Suositut hashtagit
+        no_approved_tags: Tällä hetkellä ei ole hyväksyttyjä trendikkäitä aihetunnisteita.
+        requirements: 'Mikä tahansa näistä ehdokkaista voisi ylittää #%{rank} hyväksytyn trendikkään aihetunnisteen, joka on tällä hetkellä #%{lowest_tag_name} arvosanalla %{lowest_tag_score}.'
+        title: Suositut aihetunnisteet
       subject: Uusia trendejä tarkistettavaksi instanssissa %{instance}
   aliases:
     add_new: Luo alias
@@ -971,6 +975,9 @@ fi:
       email_below_hint_html: Jos alla oleva sähköpostiosoite on virheellinen, voit muuttaa sitä täällä ja tilata uuden vahvistussähköpostiviestin.
       email_settings_hint_html: Vahvistussähköposti lähetettiin osoitteeseen %{email}. Jos sähköpostiosoite ei ole oikea, voit muuttaa sitä tiliasetuksissa.
       title: Asetukset
+    sign_in:
+      preamble_html: Kirjaudu sisään <strong>%{domain}</strong>-tunnuksillasi. Jos tilisi sijaitsee eri palvelimella, et voi sisäänkirjautua täällä.
+      title: Kirjaudu palveluun %{domain}
     sign_up:
       preamble: Kun sinulla on tili tällä Mastodon-palvelimella, voit seurata kaikkia muita verkossa olevia henkilöitä riippumatta siitä, missä heidän tilinsä on.
       title: Otetaan sinulle käyttöön %{domain}.
@@ -1107,8 +1114,8 @@ fi:
   featured_tags:
     add_new: Lisää uusi
     errors:
-      limit: Olet jo lisännyt enimmäismäärän hashtageja
-    hint_html: "<strong>Mitkä ovat näkyvillä olevat hashtagit?</strong> Ne ovat näkyvästi julkisessa profiilissasi ja niiden avulla ihmiset voivat selata julkisia viestejäsi nimenomaan näiden hashtagien alla. Ne ovat loistava luovan työn työkalu tai pitkäaikaisten projektien seurantaan."
+      limit: Olet jo lisännyt enimmäismäärän aihetunnisteita
+    hint_html: "<strong>Mitä ovat näkyvillä olevat hashtagit eli aihetunnisteet?</strong> Ne ovat näkyvissä julkisessa profiilissasi ja niiden avulla ihmiset voivat selata julkisia viestejäsi nimenomaan näiden aihetunnisteiden alla. Ne auttavat esimerkiksi luovan työn tai pitkäaikaisten projektien seurannassa."
   filters:
     contexts:
       account: Profiilit
@@ -1590,7 +1597,7 @@ fi:
       change_password: vaihda salasanasi
       details: 'Tässä on tiedot kirjautumisesta:'
       explanation: Olemme havainneet kirjautumisen tilillesi uudesta IP-osoitteesta.
-      further_actions_html: Jos et ollut sinä, suosittelemme, että %{action} teet välittömästi ja otat kaksivaiheisen todennuksen käyttöön tilisi turvallisuuden varmistamiseksi.
+      further_actions_html: Jos tämä et ollut sinä, suosittelemme että %{action} välittömästi ja ota kaksivaiheinen todennus käyttöön säilyttääksesi tilisi turvallisena.
       subject: Tiliäsi on käytetty uudesta IP-osoitteesta
       title: Uusi kirjautuminen
     warning:
@@ -1629,7 +1636,7 @@ fi:
       edit_profile_step: Voit muokata profiiliasi lataamalla profiilikuvan, vaihtamalla näyttönimeä ja paljon muuta. Voit halutessasi arvioida uudet seuraajat ennen kuin he saavat seurata sinua.
       explanation: Näillä vinkeillä pääset alkuun
       final_action: Ala julkaista
-      final_step: 'Ala julkaista! Vaikkei sinulla olisi seuraajia, monet voivat nähdä julkiset viestisi esimerkiksi paikallisella aikajanalla ja hashtagien avulla. Kannattaa myös esittäytyä! Käytä hashtagia #esittely.'
+      final_step: 'Ala julkaista! Vaikkei sinulla olisi seuraajia, monet voivat nähdä julkiset viestisi esimerkiksi paikallisella aikajanalla ja aihetunnisteilla. Kannattaa myös esittäytyä! Käytä aihetunnistetta #esittely.'
       full_handle: Koko käyttäjätunnuksesi
       full_handle_hint: Kerro tämä ystävillesi, niin he voivat lähettää sinulle viestejä tai löytää sinut toisen instanssin kautta.
       subject: Tervetuloa Mastodoniin
@@ -1641,7 +1648,7 @@ fi:
     seamless_external_login: Olet kirjautunut ulkoisen palvelun kautta, joten salasana- ja sähköpostiasetukset eivät ole käytettävissä.
     signed_in_as: 'Kirjautunut henkilönä:'
   verification:
-    explanation_html: 'Voit <strong>vahvistaa itsesi profiilisi metatietojen linkkien omistajaksi.</strong>. Tätä varten linkitetyn verkkosivuston on sisällettävä linkki takaisin Mastodon -profiiliisi. Palauttavalla linkillä <strong>täytyy</strong> olla <code>rel="me"</code> tuntomerkki. Linkin tekstisisällöllä ei ole väliä. Tässä on esimerkki:'
+    explanation_html: 'Voit <strong>vahvistaa olevasi profiilisi metatiedoissa olevien linkkien omistaja.</strong>. Tätä varten linkitetyn verkkosivuston täytyy sisältää linkki takaisin Mastodon-profiiliisi. Palauttavalla linkillä <strong>täytyy</strong> olla <code>rel="me"</code>-arvo. Linkin tekstisisällöllä ei ole merkitystä. Tässä on esimerkki:'
     verification: Vahvistus
   webauthn_credentials:
     add: Lisää uusi suojausavain
diff --git a/config/locales/fo.yml b/config/locales/fo.yml
index 7d98d65cc..5145be40c 100644
--- a/config/locales/fo.yml
+++ b/config/locales/fo.yml
@@ -116,6 +116,8 @@ fo:
       redownloaded_msg: Tín vangamynd %{username}'s er nú endurnýggja
       reject: Nokta
       rejected_msg: Tað eydnaðist, at avvísa umsóknina frá %{username}'s um innskriving
+      remote_suspension_irreversible: Dáturnar hjá hesi kontuni eru strikaðar med alla.
+      remote_suspension_reversible_hint_html: Kontan er sett úr gildi á teirra ambætara og dáturnar verða endaliga strikaðar tann %{date}. Inntil tá kann fjarambætarin endurskapa kontuna uttan fylgjur. Ynskir tú at strika allar dátur hjá kontuni beinan vegin, so kanst tú gera tað niðanfyri.
       remove_avatar: Sletta avatar
       remove_header: Sletta headera
       removed_avatar_msg: Slettaði avatar myndina hjá %{username}
@@ -561,7 +563,6 @@ fo:
     report_notes:
       created_msg: Viðmerking til melding stovnað!
       destroyed_msg: Viðmerking til melding strikað!
-      today_at: Í dag kl. %{time}
     reports:
       account:
         notes:
@@ -704,6 +705,9 @@ fo:
       content_retention:
         preamble: Stýr hvussu brúkara-skapt tilfar er goymt í Mastodon.
         title: Varðveitsla av tilfari
+      default_noindex:
+        desc_html: Hevur ávirkan á allar brúkarar, sum ikki hava broytt hesa stillingina sjálvi
+        title: Tekur brúkarar úr leitimaskinu-indeksering, um ikki annað er valt
       discovery:
         follow_recommendations: Tilmæli um at fylgja
         preamble: At fáa áhugavert innihald í ljósmála er avgerandi fyri at nýggir brúkarar, sum kanska ongan kenna á Mastodon, kunnu koma væl umborð. Stýr, hvussu hentleikarnir at uppdaga ymiskt rigga á ambætaranum hjá tær.
@@ -971,6 +975,9 @@ fo:
       email_below_hint_html: Er telduposturin niðanfyri skeivur, so kanst tú broyta hann her og móttaka eitt nýtt váttanarteldubræv.
       email_settings_hint_html: Váttanarteldubrævið varð sent til %{email}. Um telduposturin er skeivur, so kanst tú broyta hann í kontustillingunum.
       title: Uppseting
+    sign_in:
+      preamble_html: Rita inn við tínum <strong>%{domain}</strong> heimildum. Er konta tín á einum øðrum ambætara, so er ikki gjørligt hjá tær at rita inn her.
+      title: Rita inn á %{domain}
     sign_up:
       preamble: Við eini kontu á hesum Mastodon ambætaranum ber til hjá tær at fylgja ein og hvønn annan persón á netverkinum, óansæð hvar teirra konta er hýst.
       title: Latum okkum fáa teg settan upp á %{domain}.
diff --git a/config/locales/fr-QC.yml b/config/locales/fr-QC.yml
index 91b496212..d48e188e4 100644
--- a/config/locales/fr-QC.yml
+++ b/config/locales/fr-QC.yml
@@ -116,6 +116,8 @@ fr-QC:
       redownloaded_msg: Le profil de %{username} a été actualisé avec succès depuis l’origine
       reject: Rejeter
       rejected_msg: La demande d’inscription de %{username} a été rejetée avec succès
+      remote_suspension_irreversible: Les données de ce compte ont été supprimées définitivement.
+      remote_suspension_reversible_hint_html: Ce compte a été suspendu par son serveur d'accueil, et les données rattachées seront supprimées le %{date}. Jusqu'à cette date, il peut être restauré sans aucune perte par le serveur distant. Si vous souhaitez supprimer immédiatement toutes les données de ce compte, vous pouvez le faire ci-dessous.
       remove_avatar: Supprimer l’avatar
       remove_header: Supprimer l’entête
       removed_avatar_msg: L’avatar de %{username} a été supprimé avec succès
@@ -373,6 +375,8 @@ fr-QC:
       add_new: Mettre le domaine sur liste sur blanche
       created_msg: Ce domaine a été ajouté à la liste blanche avec succès
       destroyed_msg: Le domaine a été supprimé de la liste blanche
+      export: Exporter
+      import: Importer
       undo: Supprimer de la liste blanche
     domain_blocks:
       add_new: Bloquer un nouveau domaine
@@ -382,13 +386,18 @@ fr-QC:
       edit: Modifier le blocage de domaine
       existing_domain_block: Vous avez déjà imposé des limites plus strictes à %{name}.
       existing_domain_block_html: Vous avez déjà imposé des limites plus strictes à %{name}, vous devez d’abord le/la <a href="%{unblock_url}">débloquer</a>.
+      export: Exporter
+      import: Importer
       new:
         create: Créer le blocage
         hint: Le blocage de domaine n’empêchera pas la création de comptes dans la base de données, mais il appliquera automatiquement et rétrospectivement des méthodes de modération spécifiques sur ces comptes.
         severity:
+          desc_html: "<strong>Limiter</strong> rendra les messages des comptes de ce domaine invisibles à ceux qui ne les suivent pas. <strong>Suspendre</strong> supprimera tout le contenu, les médias, et données de profile pour les comptes de ce domaine de votre serveur. Utilisez <strong>Aucun</strong> si vous voulez simplement rejeter les fichiers multimédia."
           noop: Aucune
+          silence: Limiter
           suspend: Suspendre
         title: Nouveau blocage de domaine
+      no_domain_block_selected: Aucun blocage de domaine n'a été modifié car aucun n'a été sélectionné
       not_permitted: Vous n’êtes pas autorisé à effectuer cette action
       obfuscate: Obfusquer le nom de domaine
       obfuscate_hint: Obfusquer partiellement le nom de domaine dans la liste si la publication de la liste des limitations de domaine est activée
@@ -421,6 +430,20 @@ fr-QC:
       resolved_dns_records_hint_html: Le nom de domaine est relié aux domaines MX suivants, qui ont la responsabilité ultime d'accepter les courriels. Bloquer un domaine MX empêchera les inscriptions à partir de toute adresse courriel utilisant le même domaine MX, même si le nom de domaine affiché est différent. <strong> Veillez à ne pas bloquer les fournisseurs de messagerie d'envergure.</strong>
       resolved_through_html: Résolu par %{domain}
       title: Blocage de domaines de courriel
+    export_domain_allows:
+      new:
+        title: Autoriser l'importation de domaine
+      no_file: Aucun fichier sélectionné
+    export_domain_blocks:
+      import:
+        description_html: Vous êtes sur le point d'importer une liste de blocs de domaine. Veuillez examiner cette liste très attentivement, spécialement si vous n'êtes pas l'auteur de cette liste.
+        existing_relationships_warning: Relations de suivi existantes
+        private_comment_description_html: 'Pour vous aider à suivre d''où viennent les blocs importés, des blocs importés seront créés avec le commentaire privé suivant : <q>%{comment}</q>'
+        private_comment_template: Importé depuis %{source} le %{date}
+        title: Importer des blocs de domaine
+      new:
+        title: Importer des blocs de domaine
+      no_file: Aucun fichier sélectionné
     follow_recommendations:
       description_html: "<strong>Les recommandations d'abonnement aident les nouvelles personnes à trouver rapidement du contenu intéressant</strong>. Si un·e utilisateur·rice n'a pas assez interagi avec les autres pour avoir des recommandations personnalisées, ces comptes sont alors recommandés. La sélection est mise à jour quotidiennement depuis un mélange de comptes ayant le plus d'interactions récentes et le plus grand nombre d'abonné·e·s locaux pour une langue donnée."
       language: Pour la langue
@@ -540,7 +563,6 @@ fr-QC:
     report_notes:
       created_msg: Note de signalement créée avec succès !
       destroyed_msg: Note de signalement effacée avec succès !
-      today_at: Aujourd'hui à %{time}
     reports:
       account:
         notes:
@@ -683,6 +705,9 @@ fr-QC:
       content_retention:
         preamble: Contrôle comment le contenu créé par les utilisateurs est enregistré et stocké dans Mastodon.
         title: Rétention du contenu
+      default_noindex:
+        desc_html: Affecte tous les utilisateurs qui n'ont pas modifié ce paramètre eux-mêmes
+        title: Ne pas indexer par défaut les utilisateurs dans les moteurs de recherche
       discovery:
         follow_recommendations: Suivre les recommandations
         preamble: Faire apparaître un contenu intéressant est essentiel pour interagir avec de nouveaux utilisateurs qui ne connaissent peut-être personne sur Mastodonte. Contrôlez le fonctionnement des différentes fonctionnalités de découverte sur votre serveur.
@@ -913,6 +938,7 @@ fr-QC:
     warning: Soyez prudent·e avec ces données. Ne les partagez pas !
     your_token: Votre jeton d’accès
   auth:
+    apply_for_account: Demander un compte
     change_password: Mot de passe
     delete_account: Supprimer le compte
     delete_account_html: Si vous désirez supprimer votre compte, vous pouvez <a href="%{path}">cliquer ici</a>. Il vous sera demandé de confirmer cette action.
@@ -949,6 +975,9 @@ fr-QC:
       email_below_hint_html: Si l’adresse de courriel ci-dessous est incorrecte, vous pouvez la modifier ici et recevoir un nouveau courriel de confirmation.
       email_settings_hint_html: Le courriel de confirmation a été envoyé à %{email}. Si cette adresse de courriel n’est pas correcte, vous pouvez la modifier dans les paramètres du compte.
       title: Configuration
+    sign_in:
+      preamble_html: Connectez-vous avec vos identifiants <strong>%{domain}</strong> . Si votre compte est hébergé sur un autre serveur, vous ne pourrez pas vous connecter ici.
+      title: Se connecter à %{domain}
     sign_up:
       preamble: Avec un compte sur ce serveur Mastodon, vous serez en mesure de suivre toute autre personne sur le réseau, quel que soit l’endroit où son compte est hébergé.
       title: Mettons les choses en place pour %{domain}.
@@ -1157,6 +1186,7 @@ fr-QC:
     invalid_markup: 'contient un balisage HTML invalide: %{error}'
   imports:
     errors:
+      invalid_csv_file: 'Fichier CSV non valide. Erreur : %{error}'
       over_rows_processing_limit: contient plus de %{count} lignes
     modes:
       merge: Fusionner
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index b24603db9..c40fd9317 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -116,6 +116,8 @@ fr:
       redownloaded_msg: Le profil de %{username} a été actualisé avec succès depuis l’origine
       reject: Rejeter
       rejected_msg: La demande d’inscription de %{username} a été rejetée avec succès
+      remote_suspension_irreversible: Les données de ce compte ont été supprimées définitivement.
+      remote_suspension_reversible_hint_html: Ce compte a été suspendu par son serveur d'accueil, et les données rattachées seront supprimées le %{date}. Jusqu'à cette date, il peut être restauré sans aucune perte par le serveur distant. Si vous souhaitez supprimer immédiatement toutes les données de ce compte, vous pouvez le faire ci-dessous.
       remove_avatar: Supprimer l’avatar
       remove_header: Supprimer l’entête
       removed_avatar_msg: L’avatar de %{username} a été supprimé avec succès
@@ -561,7 +563,6 @@ fr:
     report_notes:
       created_msg: Note de signalement créée avec succès !
       destroyed_msg: Note de signalement effacée avec succès !
-      today_at: Aujourd'hui à %{time}
     reports:
       account:
         notes:
@@ -704,6 +705,9 @@ fr:
       content_retention:
         preamble: Contrôle comment le contenu créé par les utilisateurs est enregistré et stocké dans Mastodon.
         title: Rétention du contenu
+      default_noindex:
+        desc_html: Affecte tous les utilisateurs qui n'ont pas modifié ce paramètre eux-mêmes
+        title: Ne pas indexer par défaut les utilisateurs dans les moteurs de recherche
       discovery:
         follow_recommendations: Suivre les recommandations
         preamble: Faire apparaître un contenu intéressant est essentiel pour interagir avec de nouveaux utilisateurs qui ne connaissent peut-être personne sur Mastodonte. Contrôlez le fonctionnement des différentes fonctionnalités de découverte sur votre serveur.
@@ -971,6 +975,9 @@ fr:
       email_below_hint_html: Si l’adresse de courriel ci-dessous est incorrecte, vous pouvez la modifier ici et recevoir un nouveau courriel de confirmation.
       email_settings_hint_html: Le courriel de confirmation a été envoyé à %{email}. Si cette adresse de courriel n’est pas correcte, vous pouvez la modifier dans les paramètres du compte.
       title: Configuration
+    sign_in:
+      preamble_html: Connectez-vous avec vos identifiants <strong>%{domain}</strong> . Si votre compte est hébergé sur un autre serveur, vous ne pourrez pas vous connecter ici.
+      title: Se connecter à %{domain}
     sign_up:
       preamble: Avec un compte sur ce serveur Mastodon, vous serez en mesure de suivre toute autre personne sur le réseau, quel que soit l’endroit où son compte est hébergé.
       title: Mettons les choses en place pour %{domain}.
@@ -1591,7 +1598,7 @@ fr:
       details: 'Voici les détails de la connexion :'
       explanation: Nous avons détecté une connexion à votre compte à partir d’une nouvelle adresse IP.
       further_actions_html: Si ce n’était pas vous, nous vous recommandons de %{action} immédiatement et d’activer l’authentification à deux facteurs afin de garder votre compte sécurisé.
-      subject: Votre compte a été accédé à partir d'une nouvelle adresse IP
+      subject: Une nouvelle adresse IP a accédé à votre compte
       title: Une nouvelle connexion
     warning:
       appeal: Faire appel
diff --git a/config/locales/fy.yml b/config/locales/fy.yml
index 9d9064388..3888c2c14 100644
--- a/config/locales/fy.yml
+++ b/config/locales/fy.yml
@@ -1,17 +1,81 @@
 ---
 fy:
+  about:
+    about_mastodon_html: Mastodon is in sosjaal netwurk dat gebrûkt makket fan iepen webprotokollen en frije software. It is krekt lykas e-mail desintralisearre!
+    contact_missing: Net ynsteld
+    contact_unavailable: Net fan tapassing
+    hosted_on: Mastodon op %{domain}
+    title: Oer
   accounts:
-    last_active: letst warber
+    follow: Folgje
+    followers:
+      one: Folger
+      other: Folgers
+    following: Folgjend
+    instance_actor_flash: Dizze account is in ‘virtual actor’ wêrmei’t de server himsels fertsjinwurdiget en is dus gjin yndividuele brûker. It wurdt foar federaasjedoeleinen brûkt en moat net útsteld wurde.
+    last_active: lêst warber
+    link_verified_on: Eigendom fan dizze keppeling is kontrolearre op %{date}
+    nothing_here: Hjir is neat!
+    pin_errors:
+      following: Jo moatte dizze account wol al folgje, eardat jo it oanrekommandearje kinne
+    posts:
+      one: Toot
+      other: Berjochten
+    posts_tab_heading: Berjochten
   admin:
+    account_actions:
+      action: Aksje útfiere
+      title: Moderaasjemaatregelen tsjin %{acct} nimme
+    account_moderation_notes:
+      create: Lit in opmerking efter
+      created_msg: Oanmeitsjen fan opmerking foar moderatoaren slagge!
+      destroyed_msg: Fuortsmiten fan opmerking foar moderatoaren slagge!
     accounts:
+      add_email_domain_block: E-maildomein blokkearje
+      approve: Goedkarre
+      approved_msg: It goedkarren fan de account fan %{username} is slagge
+      are_you_sure: Binne jo wis?
+      avatar: Profylfoto
+      by_domain: Domein
+      change_email:
+        changed_msg: E-mailadres mei sukses wizige!
+        current_email: Aktuele e-mailadres
+        label: E-mailadres wizigje
+        new_email: Nij e-mailadres
+        submit: E-mailadres wizigje
+        title: E-mailadres foar %{username} wizigje
+      change_role:
+        changed_msg: Rol mei sukses wizige!
+        label: Rol wizigje
+        no_role: Gjin rol
+        title: Rol fan %{username} wizigje
+      confirm: Befêstigje
+      confirmed: Befêstige
+      confirming: Befêstiging
+      custom: Oanpast
       delete: Gegevens fuortsmite
       deleted: Fuortsmiten
+      demote: Degradearje
+      destroyed_msg: It fuortsmiten fan de gegevens fan %{username} stiet no yn de wachtrige
+      disable: Befrieze
+      disable_sign_in_token_auth: Ferifikaasje mei in tagongskoade fia e-mailberjocht útskeakelje
+      disable_two_factor_authentication: 2FA útskeakelje
+      disabled: Beferzen
+      display_name: Werjeftenamme
       domain: Domein
       edit: Bewurkje
+      email: E-mailadres
+      email_status: E-mailsteat
+      enable: Untteie
+      enable_sign_in_token_auth: Ferifikaasje mei in tagongskoade fia e-mailberjocht ynskeakelje
+      enabled: Ynskeakele
+      enabled_msg: It ûntteie fan de account fan %{username} is slagge
       followers: Folgers
       follows: Folgjend
       header: Omslachfoto
       inbox_url: Ynboks-URL
+      invite_request_text: Redenen om te registrearjen
+      invited_by: Utnûge troch
       ip: IP
       joined: Registrearre
       location:
@@ -21,6 +85,9 @@ fy:
         title: Lokaasje
       login_status: Oanmeldsteat
       media_attachments: Mediabylagen
+      memorialize: Nei in Yn memoriam wizigje
+      memorialized: Yn memoriam
+      memorialized_msg: It nei in Yn memoriam wizigje fan de account fan %{username} is slagge
       moderation:
         active: Aktyf
         all: Alle
@@ -28,37 +95,274 @@ fy:
         silenced: Beheind
         suspended: Utsteld
         title: Moderaasje
+      moderation_notes: Opmerkingen foar moderatoaren
+      most_recent_activity: Lêst warber
+      most_recent_ip: Lêst brûkt IP-adres
+      no_account_selected: Der binne gjin accounts wizige, omdat der gjin ien selektearre waard
+      no_limits_imposed: Gjin limiten ynsteld
+      no_role_assigned: Gjin rol tawezen
+      not_subscribed: Net abonnearre
+      pending: Moat noch beoardiele wurde
       perform_full_suspension: Utstelle
+      previous_strikes: Eardere skeiningen
+      previous_strikes_description_html:
+        one: Dizze account hat <strong>ien</strong> oertrêding makke.
+        other: Dizze account hat <strong>%{count}</strong> oertrêdingen makke.
       promote: Promovearje
       protocol: Protokol
       public: Iepenbier
+      push_subscription_expires: PuSH-abonnemint ferrint op
+      redownload: Profyl fernije
+      redownloaded_msg: It werstellen fan it oarspronklike profyl fan %{username} is slagge
       reject: Wegerje
+      rejected_msg: It ôfwizen fan it registraasjefersyk fan %{username} is slagge
+      remote_suspension_irreversible: De gegevens fan dizze account binne definityf fuortsmiten.
+      remote_suspension_reversible_hint_html: Dizze account is útsteld op harren server en de gegevens wurde op %{date} folslein fuortsmiten. Oant dy tiid kin de eksterne server dizze account werstelle sûnder neidielige gefolgen. Wannear’t jo alle gegevens fan dizze account daliks fuortsmite wolle, kinne jo dit hjirûnder dwaan.
+      remove_avatar: Profylfoto fuortsmite
+      remove_header: Omslachfoto fuortsmite
+      removed_avatar_msg: It fuortsmiten fan de profylfoto fan %{username} is slagge
+      removed_header_msg: It fuortsmiten fan de omslachfoto fan %{username} is slagge
+      resend_confirmation:
+        already_confirmed: Dizze brûker is al befêstige
+        send: Befêstigings-e-mailberjocht opnij ferstjoere
+        success: Befêstigings-e-mailberjocht mei sukses ferstjoerd!
+      reset: Opnij ynstelle
+      reset_password: Wachtwurd opnij ynstelle
+      resubscribe: Opnij abonnearje
+      role: Rol
+      search: Sykje
+      search_same_email_domain: Oare brûkers mei itselde e-maildomein
+      search_same_ip: Oare brûkers mei itselde IP-adres
       security_measures:
         only_password: Allinnich wachtwurd
         password_and_2fa: Wachtwurd en 2FA
+      sensitive: Gefoelich forsearje
+      sensitized: As gefoelich markearre
+      shared_inbox_url: Dielde Postfek-YN-URL
+      show:
+        created_reports: Oanmakke rapportaazjes
+        targeted_reports: Troch oaren rapportearre
+      silence: Beheine
+      silenced: Beheind
+      statuses: Berjochten
+      strikes: Eardere skeiningen
+      subscribe: Abonnearje
+      suspend: Utstelle
+      suspended: Utsteld
+      suspension_irreversible: De gegevens fan dizze account binne definityf fuortsmiten. Jo kinne it útstellen fan dizze account ûngedien meitsje, sadat it wer te brûken is, mar de fuortsmiten gegevens wurde hjirmei net wersteld.
+      suspension_reversible_hint_html: Dizze account is útsteld en de gegevens wurde op %{date} folslein fuortsmiten. Oant dy tiid kin de account wersteld wurde sûnder neidielige gefolgen. Wannear’t jo alle gegevens fan dizze account daliks fuortsmite wolle, kinne jo dit hjirûnder dwaan.
       title: Accounts
       unblock_email: E-mailadres deblokkearje
+      unblocked_email_msg: It e-mailadres fan %{username} is deblokkearre
+      unconfirmed_email: Unbefêstige e-mailadres
+      undo_sensitized: Net mear as gefoelich forsearje
+      undo_silenced: Net langer beheine
+      undo_suspension: Net langer útstelle
+      unsilenced_msg: It opheffen fan de beheiningen fan %{username} is slagge
+      unsubscribe: Opsizze
+      unsuspended_msg: It net langer útstellen fan %{username} is slagge
+      username: Brûkersnamme
+      view_domain: Gearfetting foar domein besjen
       warn: Warskôgje
       web: Web-app
+      whitelisted: Goedkard foar federaasje
     action_logs:
       action_types:
+        approve_appeal: Beswier goedkarre
+        approve_user: Brûker goedkarre
+        assigned_to_self_report: Rapportaazje tawize
+        change_email_user: E-mailadres fan brûker wizigje
+        change_role_user: Brûkersrol wizigje
+        confirm_user: Brûker befêstigje
+        create_account_warning: Warskôging oanmeitsje
+        create_announcement: Meidieling oanmeitsje
+        create_canonical_email_block: E-mailblokkade oanmeitsje
+        create_custom_emoji: Lokale emoji oanmeitsje
+        create_domain_allow: Domeingoedkarring oanmeitsje
+        create_domain_block: Domeinblokkade oanmeitsje
+        create_email_domain_block: E-maildomeinblokkade oanmeitsje
+        create_ip_block: IP-rigel oanmeitsje
+        create_unavailable_domain: Net beskikber domein oanmeitsje
+        create_user_role: Rol oanmeitsje
+        demote_user: Brûker degradearje
         destroy_announcement: Meidieling fuortsmite
+        destroy_canonical_email_block: E-mailblokkade fuortsmite
+        destroy_custom_emoji: Lokale emoji fuortsmite
+        destroy_domain_allow: Domeingoedkarring fuortsmite
+        destroy_domain_block: Domeinblokkade fuortsmite
+        destroy_email_domain_block: E-maildomeinblokkade fuortsmite
+        destroy_instance: Domein folslein fuortsmite
+        destroy_ip_block: IP-rigel fuortsmite
+        destroy_status: Toot fuortsmite
+        destroy_unavailable_domain: Net beskikber domein fuortsmite
+        destroy_user_role: Rol permanint fuortsmite
+        disable_2fa_user: Twa-stapsferifikaasje útskeakelje
+        disable_custom_emoji: Lokale emoji útskeakelje
+        disable_sign_in_token_auth_user: Ferifikaasje mei in tagongskoade fia e-mailberjocht foar de brûker útskeakelje
+        disable_user: Brûker útskeakelje
+        enable_custom_emoji: Lokale emoji ynskeakelje
+        enable_sign_in_token_auth_user: Ferifikaasje mei in tagongskoade fia e-mailberjocht foar de brûker ynskeakelje
+        enable_user: Brûker ynskeakelje
+        memorialize_account: De account yn in Yn memoriam wizigje
+        promote_user: Brûker promovearje
+        reject_appeal: Beswier ôfwize
+        reject_user: Brûker ôfwize
+        remove_avatar_user: Profylfoto fuortsmite
+        reopen_report: Rapport opnij iepenje
+        resend_user: Befêstigings-e-mailberjocht opnij ferstjoere
+        reset_password_user: Wachtwurd opnij ynstelle
+        resolve_report: Rapport oplosse
+        sensitive_account: De media yn jo account as gefoelich markearje
+        silence_account: Account beheine
+        suspend_account: Account útstelle
+        unassigned_report: Rapportaazje net langer tawize
+        unblock_email_account: E-mailadres deblokkearje
+        unsensitive_account: De media yn jo account net langer as gefoelich markearje
+        unsilence_account: Account net langer beheine
+        unsuspend_account: Account net langer útstelle
+        update_announcement: Meidieling bywurkje
+        update_custom_emoji: Lokale emoji bywurkje
+        update_domain_block: Domeinblokkade bywurkje
+        update_ip_block: IP-rigel bywurkje
+        update_status: Berjocht bywurkje
+        update_user_role: Rol bywurkje
+      actions:
+        approve_appeal_html: "%{name} hat it beswier tsjin de moderaasjemaatregel fan %{target} goedkard"
+        approve_user_html: "%{name} hat de registraasje fan %{target} goedkard"
+        assigned_to_self_report_html: "%{name} hat rapportaazje %{target} oan harrensels tawiisd"
+        change_email_user_html: "%{name} hat it e-mailadres fan brûker %{target} wizige"
+        change_role_user_html: "%{name} hat de rol fan %{target} wizige"
+        confirm_user_html: E-mailadres fan brûker %{target} is troch %{name} befêstige
+        create_account_warning_html: "%{name} hat in warskôging nei %{target} ferstjoerd"
+        create_announcement_html: "%{name} hat de nije meidieling %{target} oanmakke"
+        create_canonical_email_block_html: "%{name} hat it e-mailberjocht mei de hash %{target} blokkearre"
+        create_custom_emoji_html: Nije emoji %{target} is troch %{name} opladen
+        create_domain_allow_html: "%{name} hat de federaasje mei it domein %{target} goedkard"
+        create_domain_block_html: Domein %{target} is troch %{name} blokkearre
+        create_email_domain_block_html: "%{name} hat it e-maildomein %{target} blokkearre"
+        create_ip_block_html: "%{name} hat de rigel foar IP %{target} oanmakke"
+        create_unavailable_domain_html: "%{name} hat de besoarging foar domein %{target} beëinige"
+        create_user_role_html: "%{name} hat de rol %{target} oanmakke"
+        demote_user_html: Brûker %{target} is troch %{name} degradearre
+        destroy_announcement_html: "%{name} hat de meidieling %{target} fuortsmiten"
+        destroy_canonical_email_block_html: "%{name} hat it e-mailberjocht mei de hash %{target} deblokkearre"
+        destroy_custom_emoji_html: Emoji %{target} is troch %{name} fuortsmiten
+        destroy_domain_allow_html: "%{name} hat de federaasje mei it domein %{target} ôfkard"
+        destroy_domain_block_html: Domein %{target} is troch %{name} deblokkearre
+        destroy_email_domain_block_html: Domein %{target} is troch %{name} deblokkearre
+        destroy_instance_html: "%{name} hat it domein %{target} folslein fuortsmiten"
+        destroy_ip_block_html: "%{name} hat de rigel foar IP %{target} fuortsmiten"
+        destroy_status_html: Berjocht fan %{target} is troch %{name} fuortsmiten
+        destroy_unavailable_domain_html: "%{name} hat de besoarging foar domein %{target} opnij starte"
+        destroy_user_role_html: "%{name} hat de rol %{target} fuortsmiten"
+        disable_2fa_user_html: De fereaske twa-stapsferifikaasje foar %{target} is troch %{name} útskeakele
+        disable_custom_emoji_html: Emoji %{target} is troch %{name} útskeakele
+        disable_sign_in_token_auth_user_html: "%{name} hat ferifikaasje mei in tagongskoade fia e-mailberjocht útskeakele foar %{target}"
+        disable_user_html: Oanmelden foar %{target} is troch %{name} útskeakele
+        enable_custom_emoji_html: Emoji %{target} is troch %{name} ynskeakele
+        enable_sign_in_token_auth_user_html: "%{name} hat ferifikaasje mei in tagongskoade fia e-mailberjocht ynskeakele foar %{target}"
+        enable_user_html: Oanmelden foar %{target} is troch %{name} ynskeakele
+        memorialize_account_html: De account %{target} is troch %{name} yn in Yn memoriam wizige
+        promote_user_html: Brûker %{target} is troch %{name} promovearre
+        reject_appeal_html: "%{name} hat it beswier tsjin de moderaasjemaatregel fan %{target} ôfwêzen"
+        reject_user_html: "%{name} hat de registraasje fan %{target} ôfwêzen"
+        remove_avatar_user_html: "%{name} hat de profylfoto fan %{target} fuortsmiten"
+        reopen_report_html: "%{name} hat rapportaazje %{target} opnij iepene"
+        resend_user_html: "%{name} hat it befêstigings-e-mailberjocht foar %{target} opnij ferstjoerd"
+        reset_password_user_html: Wachtwurd fan brûker %{target} is troch %{name} opnij ynsteld
+        resolve_report_html: "%{name} hat rapportaazje %{target} oplost"
+        sensitive_account_html: "%{name} markearre de media fan %{target} as gefoelich"
+        silence_account_html: Account %{target} is troch %{name} beheind
+        suspend_account_html: Account %{target} is troch %{name} útsteld
+        unassigned_report_html: "%{name} hat it tawizen fan rapportaazje %{target} ûngedien makke"
+        unblock_email_account_html: "%{name} deblokkearre it e-mailadres fan %{target}"
+        unsensitive_account_html: "%{name} markearre de media fan %{target} as net gefoelich"
+        unsilence_account_html: Beheining fan account %{target} is troch %{name} opheven
+        unsuspend_account_html: Utstellen fan account %{target} is troch %{name} opheven
+        update_announcement_html: "%{name} hat de meidieling %{target} bywurke"
+        update_custom_emoji_html: Emoji %{target} is troch %{name} bywurke
+        update_domain_block_html: "%{name} hat de domeinblokkade bywurke foar %{target}"
+        update_ip_block_html: "%{name} hat de rigel foar IP %{target} wizige"
+        update_status_html: "%{name} hat de berjochten %{target} bywurke"
+        update_user_role_html: "%{name} hat de rol %{target} wizige"
       deleted_account: fuortsmiten account
+      empty: Gjin lochboeken fûn.
+      filter_by_action: Op aksje filterje
+      filter_by_user: Op brûker filterje
+      title: Auditlogboek
+    announcements:
+      destroyed_msg: Fuortsmiten fan meidieling slagge!
+      edit:
+        title: Meidieling bewurkje
+      empty: Gjin meidielingen fûn.
+      live: Live
+      new:
+        create: Meidieling oanmeitsje
+        title: Nije meidieling
+      publish: Publisearje
+      published_msg: Publisearjen fan meidieling slagge!
+      scheduled_for: Ynpland foar %{time}
+      scheduled_msg: Meidieling stiet ynpland foar publikaasje!
+      title: Oankundigingen
+      unpublish: Depublisearje
+      unpublished_msg: Ungedien meitsjen fan publisearre meidieling is slagge!
+      updated_msg: Bywurkjen fan meidieling slagge!
     custom_emojis:
+      assign_category: Kategory tawize
+      by_domain: Domein
+      copied_msg: Lokale kopy fan emoji meitsje slagge
       copy: Kopiearje
+      copy_failed_msg: Kin gjin lokale kopy fan dizze emoji meitsje
+      create_new_category: Nije kategory tafoegje
+      created_msg: Emoji oanmeitsjen slagge!
       delete: Fuortsmite
+      destroyed_msg: Emoji fuortsmiten slagge!
       disable: Utskeakelje
       disabled: Utskeakele
+      disabled_msg: Emoji útskeakeljen slagge
       emoji: Emoji
       enable: Ynskeakelje
       enabled: Ynskeakele
+      enabled_msg: Emoji ynskeakeljen slagge
       image_hint: PNG of GIF net grutter as %{size}
       list: Yn list
       listed: Werjaan
+      new:
+        title: Lokale emoji tafoegje
+      no_emoji_selected: Der binne gjin emoji wizige, omdat der gjin ien selektearre waard
+      not_permitted: Jo hawwe gjin rjochten om dizze aksje út te fieren
+      overwrite: Oerskriuwe
+      shortcode: Ferkoarte koade
+      shortcode_hint: Op syn minst 2 tekens, allinnich alfanumeryk en underscores
+      title: Lokale emoji
+      uncategorized: Net kategorisearre
+      unlist: Net yn list
+      unlisted: Net werjaan
+      update_failed_msg: Dizze emoji koe net bywurke wurde
+      updated_msg: Emoji fernije is slagge!
       upload: Oplade
     dashboard:
       active_users: warbere brûkers
       interactions: ynteraksjes
+      media_storage: Mediaûnthâld
+      new_users: nije brûkers
+      opened_reports: iepene rapportaazjes
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> te beoardielen beswier"
+        other: "<strong>%{count}</strong> te beoardielen beswieren"
+      pending_reports_html:
+        one: "<strong>%{count}</strong> iepensteande rapportaazje"
+        other: "<strong>%{count}</strong> iepensteande rapportaazjes"
+      pending_tags_html:
+        one: "<strong>%{count}</strong> te beoardielen hashtag"
+        other: "<strong>%{count}</strong> te beoardielen hashtags"
+      pending_users_html:
+        one: "<strong>%{count}</strong> te beoardielen nije brûker"
+        other: "<strong>%{count}</strong> te beoardielen nije brûkers"
+      resolved_reports: oploste rapportaazjes
+      software: Software
+      sources: Registraasjelokaasje
+      space: Romtegebrûk
       title: Dashboerd
       top_languages: Meast aktive talen
       top_servers: Meast aktive tsjinners
@@ -67,15 +371,99 @@ fy:
       appeals:
         empty: Gjin beswieren fûn.
         title: Beswieren
+    domain_allows:
+      add_new: Federaasje mei domein tastean
+      created_msg: Federaasjetastimming mei domein is slagge
+      destroyed_msg: Federaasje mei domein is net tastien
+      export: Eksportearje
+      import: Ymportearje
+      undo: Federaasje mei domein net tastean
+    domain_blocks:
+      add_new: Nije domeinblokkade tafoegje
+      created_msg: Domeinblokkade wurdt no ferwurke
+      destroyed_msg: Domeinblokkade is ûngedien makke
+      domain: Domein
+      edit: Domeinblokkade bewurkje
+      existing_domain_block: Jo hawwe al strangere limiten oplein oan %{name}.
+      existing_domain_block_html: Jo hawwe al strangere beheiningen oplein oan %{name}, jo moatte it domein earst <a href="%{unblock_url}">deblokkearje</a>.
+      export: Eksportearje
+      import: Ymportearje
+      new:
+        create: Blokkade oanmeitsje
+        hint: In domeinblokkade foarkomt net dat accountgegevens fan dit domein oan de database tafoege wurde, mar dat der mei weromwurkjende krêft en automatysk bepaalde moderaasjemetoaden op dizze accounts tapast wurde.
+        severity:
+          desc_html: "<strong>Beheinen</strong> soarget derfoar dat berjochten fan accounts fan dit domein foar elkenien ûnsichtber binne, behalve as in account folge wurdt. <strong>Utstelle</strong> soarget derfoar dat alle berjochten, media en profylgegevens fan accounts fan dit domein fuortsmiten wurde. Brûk <strong>Gjin</strong> wannear’t jo allinnich mediabestannen wegerje wolle."
+          noop: Gjin
+          silence: Beheine
+          suspend: Utstelle
+        title: Nije domeinblokkade
+      no_domain_block_selected: Der binne gjin domeinblokkades wizige, omdat der gjin ien selektearre waard
+      not_permitted: Jo hawwe gjin rjochten om dizze aksje út te fieren
+      obfuscate: Domeinnamme dizich meitsje
+      obfuscate_hint: De domeinnamme foar in part dizich meitsje, wannear’t de list mei domeinblokkaden toand wurdt
+      private_comment: Priveeopmerking
+      private_comment_hint: Opmerking oer dizze domeinbeheining foar yntern gebrûk troch de moderatoaren.
+      public_comment: Iepenbiere opmerking
+      public_comment_hint: Opmerking oer dizze domeinbeheining foar it grutte publyk, foar wannear de iepenbiere list mei domeinbeheiningen ynskeakele is.
+      reject_media: Mediabestannen wegerje
+      reject_media_hint: Smyt lokaal bewarre mediabestannen fuort en wegeret dizze yn de takomst te downloaden. Net relevant foar útstelde domeinen
+      reject_reports: Rapportaazjes wegerje
+      reject_reports_hint: Alle rapportaazjes dy’t fan dit domein ôf komme negearje. Net relevant foar útstelde domeinen
+      undo: Domeinblokkade ûngedien meitsje
+      view: Domeinblokkade besjen
     email_domain_blocks:
+      add_new: Nije tafoegje
+      attempts_over_week:
+        one: "%{count} registraasjebesykjen yn de ôfrûne wike"
+        other: "%{count} registraasjebesykjen yn de ôfrûne wike"
+      created_msg: E-maildomein blokkearjen slagge
       delete: Fuortsmite
+      dns:
+        types:
+          mx: MX-record
       domain: Domein
       new:
         create: Domain tafoegje
         resolve: Domein opsykje
+        title: Nije e-maildomein blokkearje
+      no_email_domain_block_selected: Der binne gjin e-maildomeinblokkaden wizige, omdat der gjin ien selektearre waard
+      resolved_dns_records_hint_html: De domeinnamme slacht op de folgjende MX-domeinen dy’t úteinlik ferantwurdlik binne foar it akseptearjen fan e-mail. It blokkearjen fan in MX-domein blokkearret oanmeldingen fan elk e-mailadres dat itselde MX-domein brûkt, sels as de sichtbere domeinnamme oars is. <strong>Pas op dat jo gjin grutte e-mailproviders blokkearje.</strong>
+      resolved_through_html: Blokkearre fia %{domain}
+      title: Blokkearre e-maildomeinen
+    export_domain_allows:
+      new:
+        title: Tastiene domeinen ymportearje
+      no_file: Gjin bestân selektearre
+    export_domain_blocks:
+      import:
+        description_html: Jo steane op it punt in list mei domeinblokkaden te ymportearjen. Kontrolearje dizze list bot soarchfâldich, foaral as jo dizze list net sels makke hawwe.
+        existing_relationships_warning: Besteande folchrelaasjes
+        private_comment_description_html: 'Om jo te helpen byhâlden wêr’t de ymportearre blokkaden wei komme, wurde de ymportearre blokkaden mei de folgjende priveeopmerking oanmakke: <q>%{comment}</q>'
+        private_comment_template: Ymportearre fan %{source} op %{date}
+        title: Domeinblokkaden ymportearje
+      new:
+        title: Domeinblokkaden ymportearje
+      no_file: Gjin bestân selektearre
     follow_recommendations:
+      description_html: "<strong>Dizze oanrekommandearre accounts helpe nije brûkers fluch ynteressante ynhâld</strong>te finen. Wannear’t in brûker net mei oare brûkers genôch ynteraksje hân hat om personalisearre oanrekommandaasjes te krijen, wurde yn stee dêrfan dizze accounts oanrekommandearre. Dizze accounts wurde deistich opnij berekkene mei help fan accounts mei it heechste tal resinte ynteraksjes en it heechste tal lokale folgers yn in bepaalde taal."
+      language: Foar taal
       status: Steat
+      suppress: Oanrekommandearre account net mear oanrekommandearje
+      suppressed: Net mear oanrekommandearre
+      title: Oanrekommandearre accounts
+      unsuppress: Account wer oanrekommandearje
     instances:
+      availability:
+        description_html:
+          one: As de besoarging oan it domein nei <strong>%{count} dag</strong> mislearjen bliuwt, dan sille der gjin fierdere besykjen ta besoarging dien wurde oant in besoarging <em>fan</em> it domein ûntfongen is.
+          other: As de besoarging oan it domein nei <strong>%{count} dagen</strong> mislearjen bliuwt, dan sille der gjin fierdere besykjen ta besoarging dien wurde oant in besoarging <em>fan</em> it domein ûntfongen is.
+        failure_threshold_reached: Flaterdrompelwearde berikt op %{date}.
+        failures_recorded:
+          one: Mislearre besykjen op %{count} dag.
+          other: Mislearre besykjen op %{count} ferskate dagen.
+        no_failures_recorded: Gjin steuringen bekend.
+        title: Beskikberheid
+        warning: It lêste besykjen om mei dizze server te ferbinen wie sûnder sukses
       back_to_all: Alle
       back_to_limited: Beheind
       back_to_warning: Warskôging
@@ -83,71 +471,1199 @@ fy:
       confirm_purge: Wolle jo werklik alle gegevens fan dit domein foar ivich fuortsmite?
       content_policies:
         comment: Ynterne reden
+        description_html: Jo kinne it belied bepale dat op de accounts fan dit domein en alle subdomeinen fan tapassing is.
         policies:
+          reject_media: Mediabestannen wegerje
+          reject_reports: Rapportaazjes wegerje
           silence: Beheind
           suspend: Utsteld
         policy: Belied
+        reason: Publike reden
+        title: Belied
       dashboard:
+        instance_accounts_dimension: Meast troch ús folge accounts
         instance_accounts_measure: bewarre accounts
+        instance_followers_measure: ús folgers dêr
+        instance_follows_measure: troch harren hjir folge
+        instance_languages_dimension: Meast aktive talen
+        instance_media_attachments_measure: bewarre mediabestannen
+        instance_reports_measure: rapportaazjes oer harren
+        instance_statuses_measure: bewarre berjochten
+      delivery:
+        all: Alles
+        clear: Ofleverflater fuorthelje
+        failing: Problemen
+        restart: Oflevering opnij starte
+        stop: Oflevering beëinigje
+        unavailable: Net beskikber
+      delivery_available: Ofleverjen is mooglik
+      delivery_error_days: Dagen mei ôfleverflaters
+      delivery_error_hint: Wannear’t de besoarging foar %{count} dagen net mooglik is, wurdt de besoarging automatysk as net beskikber markearre.
+      destroyed_msg: Gegevens fan %{domain} stean no yn de wachtrige foar oansteande ferwidering.
+      empty: Gjin domeinen fûn.
+      known_accounts:
+        one: "%{count} bekende account"
+        other: "%{count} bekende accounts"
+      moderation:
+        all: Alle
+        limited: Beheind
+        title: Moderaasje
+      private_comment: Priveeopmerking
+      public_comment: Iepenbiere opmerking
+      purge: Folslein fuortsmite
+      purge_description_html: As jo tinke dat dit domein definityf offline is, kinne jo alle accounts en byhearrende gegevens fan dit domein fuortsmite. Dit kin efkes duorje.
+      title: Federaasje
+      total_blocked_by_us: Troch ús blokkearre
+      total_followed_by_them: Troch harren folge
+      total_followed_by_us: Troch ús folge
+      total_reported: Rapportaazjes oer harren
+      total_storage: Mediabylagen
+      totals_time_period_hint_html: De hjirûnder toande totalen befetsje gegevens sûnt it begjin.
+    invites:
+      deactivate_all: Alles deaktivearje
+      filter:
+        all: Alles
+        available: Beskikber
+        expired: Ferrûn
+        title: Filter
+      title: Utnûgingen
     ip_blocks:
+      add_new: Rigel meitsje
+      created_msg: It tafoegjen fan in nije IP-rigel is slagge
       delete: Fuortsmite
+      expires_in:
+        '1209600': 2 wiken
+        '15778476': 6 moannen
+        '2629746': 1 moanne
+        '31556952': 1 jier
+        '86400': 1 dei
+        '94670856': 3 jier
+      new:
+        title: Nije IP-rigel oanmeitsje
+      no_ip_block_selected: Der binne gjin IP-rigels wizige, omdat der gjin ien selektearre waard
+      title: IP-rigels
+    relationships:
+      title: Relaasjes fan %{acct}
     relays:
+      add_new: Nije relayserver tafoegje
       delete: Fuortsmite
+      description_html: In <strong>federaasjerelay</strong> is in tuskenlizzende server dy’t grutte hoemannichte iepenbiere berjochten útwikselet tusken servers dy’t harren hjirop abonnearre hawwe. <strong>It kin lytse en middelgrutte servers helpe om ynhâld fan de fediverse te ûntdekken</strong>, wêrfoar oars lokale brûkers hânmjittich minsken fan eksterne servers folgje moatte.
+      disable: Utskeakelje
+      disabled: Utskeakele
+      enable: Ynskeakelje
+      enable_hint: Ien kear ynskeakele giet jo server harren op alle iepenbiere berjochten fan dizze relayserver abonnearje en stjoert it de iepenbiere berjochten fan jo server nei de relayserver.
+      enabled: Ynskeakele
+      inbox_url: Relay-URL
+      pending: Wachtet op tastimming fan de relayserver
+      save_and_enable: Bewarje en ynskeakelje
+      setup: In ferbining mei in relayserver meitsje
+      signatures_not_enabled: Federaasjerelays wurkje mooglik net goed wannear’t de feilige modus of de beheinde federaasjemodus ynskeakele is
+      status: Steat
+      title: Relayservers
+    report_notes:
+      created_msg: Oanmeitsjen fan rapportaazje slagge!
+      destroyed_msg: Fuortsmiten fan opmerking by rapportaazje slagge!
     reports:
+      account:
+        notes:
+          one: "%{count} opmerking"
+          other: "%{count} opmerkingen"
+      action_log: Auditlogboek
+      action_taken_by: Maatregel nommen troch
+      actions:
+        delete_description_html: De rapportearre berjochten wurde fuortsmiten en der wurdt in oertrêding registrearre om takomstige oertrêdingen fan itselde account flugger ôfhannelje te kinnen.
+        mark_as_sensitive_description_html: De media yn de rapportearre berjochten wurde markearre as gefoelich en der wurdt in oertrêding registrearre om takomstige oertrêdingen fan itselde account flugger ôfhannelje te kinnen.
+        other_description_html: Besjoch mear opsjes foar it kontrolearjen fan it gedrach fan en de kommunikaasje mei it rapportearre account.
+        resolve_description_html: Der wurdt tsjin it rapportearre account gjin maatregel nommen, gjin oertrêding registrearre en de rapportaazje wurdt markearre as oplost.
+        silence_description_html: It profyl sil allinnich sichtber wêze foar dyjinge dy’t it al folgje of it hânmjittich opsykje, wêrtroch it berik earnstich beheind wurdt. Kin altyd weromdraaid wurde.
+        suspend_description_html: It profyl en alle accountgegevens wurde earst net tagonklik makke, oant dizze úteinlik definityf fuortsmiten wurde. It is net mear mooglik om ynteraksje te hawwen mei de account. Dit kin binnen 30 dagen weromdraaid wurde.
+      actions_description_html: Beslis hokker maatregel nommen wurde moat om dizze rapportaazje op te lossen. Wannear’t jo in (straf)maatregel tsjin it rapportearre account nimme, kriget de account in e-mailmelding, behalve wannear’t de <strong>spam</strong>-kategory keazen is.
+      add_to_report: Mear oan de rapportaazje tafoegje
+      are_you_sure: Binne jo wis?
+      assign_to_self: Oan my tawize
+      assigned: Tawizen moderator
+      by_target_domain: Domein fan rapportearre account
+      category: Kategory
+      category_description_html: De reden wêrom dizze account en/of ynhâld rapportearre waard, wurdt oan it rapportearre account meidield
+      comment:
+        none: Gjin
+      comment_description_html: 'Om mear ynformaasje te jaan, skreau %{name}:'
+      created_at: Rapportearre op
       delete_and_resolve: Berjocht fuortsmite
+      forwarded: Trochstjoerd
+      forwarded_to: Trochstjoerd nei %{domain}
+      mark_as_resolved: As oplost markearje
+      mark_as_sensitive: As gefoelich markearje
+      mark_as_unresolved: As net oplost markearje
+      no_one_assigned: Net ien
       notes:
+        create: Opmerking tafoegje
+        create_and_resolve: Oplosse mei opmerking
+        create_and_unresolve: Opnij iepeje mei opmerking
         delete: Fuortsmite
+        placeholder: Beskriuw hokker maatregels nommen binne of oare relatearre opmerkingen…
+        title: Opmerkingen
+      notes_description_html: Besjoch en lit opmerkingen efter foar oare moderatoaren en foar jo takomstige sels
+      quick_actions_description_html: 'Nim in flugge maatregel of skow nei ûnder om de rapportearre ynhâld te besjen:'
+      remote_user_placeholder: de eksterne brûker fan %{instance}
+      reopen: Rapport opnij iepenje
+      report: 'Rapportaazje #%{id}'
+      reported_account: Rapportearre account
+      reported_by: Rapportearre troch
+      resolved: Oplost
+      resolved_msg: Rapportaazje oplosse slagge!
+      skip_to_actions: Gean daliks nei de maatregels
+      status: Steat
+      statuses: Rapportearre ynhâld
+      statuses_description_html: De problematyske ynhâld wurdt oan it rapportearre account meidield
+      target_origin: Orizjineel fan rapportearre account
+      title: Rapportaazjes
+      unassign: Net langer tawize
+      unresolved: Net oplost
+      updated_at: Bywurke
+      view_profile: Profyl besjen
     roles:
+      add_new: Rol tafoegje
+      assigned_users:
+        one: "%{count} brûker"
+        other: "%{count} brûkers"
+      categories:
+        administration: Behear
+        devops: DevOps
+        invites: Utnûgingen
+        moderation: Moderaasje
+        special: Spesjaal
       delete: Fuortsmite
+      description_html: Mei <strong>brûkersrollen</strong> kinne jo de funksjes en ûnderdielen fan Mastodon, wêr’t jo brûkers tagong ta hawwe, oanpasse.
+      edit: Rol ‘%{name}’ bewurkje
+      everyone: Standertrjochten
+      everyone_full_description_html: Dit is de <strong>basisrol</strong> dy’t fan tapassing is op <strong>alle brûkers</strong>, sels foar dyjinge sûnder tawizen rol. Alle oare rollen hawwe de rjochten fan dizze rol as minimum.
+      permissions_count:
+        one: "%{count} rjocht"
+        other: "%{count} rjochten"
+      privileges:
+        administrator: Behearder
+        administrator_description: Dizze brûkers hawwe folsleine rjochten en kinne dus oeral by
+        delete_user_data: Brûkersgegevens fuortsmite
+        delete_user_data_description: Stiet brûkers ta om de gegevens fan oare brûkers sûnder fertraging fuort te smiten
+        invite_users: Brûkers útnûgje
+        invite_users_description: Stiet brûkers ta om nije minsken foar de server út te nûgjen
+        manage_announcements: Meidielingen beheare
+        manage_announcements_description: Stiet brûkers ta om meidielingen op de server te behearen
+        manage_appeals: Beswieren beheare
+        manage_appeals_description: Stiet brûkers ta om beswieren tsjin moderaasjemaatregelen te beoardielen
+        manage_blocks: Blokkaden beheare
+        manage_blocks_description: Stiet brûkers ta om e-mailproviders en IP-adressen te blokkearjen
+        manage_custom_emojis: Lokale emoji’s beheare
+        manage_custom_emojis_description: Stiet brûkers ta om lokale emoji’s op de server te behearen
+        manage_federation: Federaasje beheare
+        manage_federation_description: Stiet brûkers ta om federaasje mei oare domeinen te blokkearjen of ta te stean en om de besoarging te bepalen
+        manage_invites: Utnûgingen beheare
+        manage_invites_description: Stiet brûkers ta om útnûgingskeppelingen te besjen en te de-aktivearjen
+        manage_reports: Rapportaazjes beheare
+        manage_reports_description: Stiet brûkers ta om rapportaazjes te beoardielen en om oan de hân hjirfan moderaasjemaatregelen te nimmen
+        manage_roles: Rollen beheare
+        manage_roles_description: Stiet brûkers ta om rollen te behearen en ta te wizen dy’t minder rjochten hawwe as harren eigen rol(len)
+        manage_rules: Serverregels wizigje
+        manage_rules_description: Stiet brûkers ta om serverregels te wizigjen
+        manage_settings: Serverynstellingen wizigje
+        manage_settings_description: Stiet brûkers ta de ynstellingen fan de website te wizigjen
+        manage_taxonomies: Trends en hashtags beheare
+        manage_taxonomies_description: Stiet brûkers ta om trending ynhâld te besjen en om hashtagynstellingen by te wurkjen
+        manage_user_access: Brûkerstagong beheare
+        manage_user_access_description: Stiet brûkers ta om twa-stapsferifikaasje fan oare brûkers út te skeakeljen, om harren e-mailadres te wizigjen en om harren wachtwurd opnij yn te stellen
+        manage_users: Brûkers beheare
+        manage_users_description: Stiet brûkers ta om brûkersdetails fan oaren te besjen en moderaasjemaatregelen tsjin harren te nimmen
+        manage_webhooks: Webhooks beheare
+        manage_webhooks_description: Stiet brûkers ta om webhooks foar beheartaken yn te stellen
+        view_audit_log: Auditlochboek besjen
+        view_audit_log_description: Stiet brûkers ta om in skiednis fan behearaksjes op de server te besjen
+        view_dashboard: Dashboard besjen
+        view_dashboard_description: Jout brûkers tagong ta it dashboard en ferskate statistiken
+        view_devops: DevOps
+        view_devops_description: Jout brûkers tagong ta de dashboarden fan Sidekiq en pgHero
+      title: Rollen
     rules:
+      add_new: Rigel tafoegje
       delete: Fuortsmite
+      description_html: Hoewol de measte minsken sizze dat se de brûksbetingsten lêzen hawwe en der mei akkoard gean, lêze minsken dizze meastentiids net oant dat der in probleem bard. <strong>Meitsje it ienfâldiger om de regels fan dizze server yn ien eachwink te sjen, troch se punt foar punt yn in list te setten.</strong> Probearje de ferskate regels koart en simpel te hâlden, mar probearje se ek net yn ferskate items ûnder te ferdielen.
+      edit: Rigel bewurkje
+      empty: Foar dizze server binne noch gjin regels opsteld.
+      title: Serverrigels
+    settings:
+      about:
+        manage_rules: Serverregels beheare
+        preamble: Jou wiidweidige ynformaasje oer hoe’t de server beheard, modereare en finansiere wurdt.
+        rules_hint: Der is in spesjaal gebied foar regels wêr’t jo brûkers harren oan hâlde moatte.
+        title: Oer
+      appearance:
+        preamble: Mastodon’s webomjouwing oanpasse.
+        title: Werjefte
+      branding:
+        preamble: De branding fan jo server lit sjen hoe’t it fan oare servers yn it netwurk ferskilt. Dizze ynformaasje wurdt op ferskate plakken toand, lykas yn de webomjouwing fan Mastodon, yn mobile apps, yn foarfertoaningen op oare websites en berjochte-apps, ensfh. Dêrom is it wichtich om de ynformaasje helder, koart en bûnich te hâlden.
+        title: Branding
+      content_retention:
+        preamble: Tafersjoch hâlde op hoe’t berjochten en media fan brûkers op Mastodon bewarre wurde.
+        title: Bewartermyn berjochten
+      default_noindex:
+        desc_html: Hat ynfloed op alle brûkers dy’t dizze ynstelling net sels wizige hawwe
+        title: Brûkers standert net troch sykmasinen yndeksearje litte
+      discovery:
+        follow_recommendations: Oanrekommandearre accounts
+        preamble: It toanen fan ynteressante ynhâld is fan essinsjeel belang foar it oan board heljen fan nije brûkers dy’t mooglik net ien fan Mastodon kinne. Bepaal hoe’t ferskate funksjes foar it ûntdekken fan ynhâld en brûkers op jo server wurkje.
+        profile_directory: Profylmap
+        public_timelines: Iepenbiere tiidlinen
+        title: Untdekke
+        trends: Trends
+      domain_blocks:
+        all: Oan elkenien
+        disabled: Oan net ien
+        users: Oan oanmelde lokale brûkers
+      registrations:
+        preamble: Tafersjoch hâlde op wa’t in account op dizze server registrearje kin.
+        title: Registraasjes
+      registrations_mode:
+        modes:
+          approved: Goedkarring fereaske om te registrearje te kinnen
+          none: Net ien kin harren registrearje
+          open: Elkenien kin harren registrearje
+      title: Serverynstellingen
+    site_uploads:
+      delete: Opladen bestân fuortsmite
+      destroyed_msg: Fuortsmiten website-oplaad slagge!
     statuses:
+      account: Auteur
+      application: Tapassing
+      back_to_account: Tebek nei accountside
+      back_to_report: Tebek nei de rapportaazje
+      batch:
+        remove_from_report: Ut rapportaazje fuortsmite
+        report: Rapportaazje
       deleted: Fuortsmiten
+      favourites: Favoriten
+      history: Ferzjeskiednis
+      in_reply_to: Reaksje op
+      language: Taal
+      media:
+        title: Media
+      metadata: Metagegevens
+      no_status_selected: Der binne gjin berjochten wizige, omdat der gjin ien selektearre waard
+      open: Berjocht toane
+      original_status: Oarspronklik berjocht
+      reblogs: Boosts
+      status_changed: Berjocht wizige
+      title: Accountberjochten
+      trending: Trending
+      visibility: Sichtberheid
+      with_media: Mei media
+    strikes:
+      actions:
+        delete_statuses: "%{name} hat de berjochten fan %{target} fuortsmiten"
+        disable: Account %{target} is troch %{name} beferzen
+        mark_statuses_as_sensitive: "%{name} markearre de berjochten fan %{target} as gefoelich"
+        none: "%{name} hat in warskôging nei %{target} ferstjoerd"
+        sensitive: "%{name} markearre de account fan %{target} as gefoelich"
+        silence: Account %{target} is troch %{name} beheind
+        suspend: Account %{target} is troch %{name} útsteld
+      appeal_approved: Beswier yntsjinne
+      appeal_pending: Beswier yn behanneling
     system_checks:
       database_schema_check:
         message_html: Der binne database migraasjes yn ôfwachting. Jo moatte dizze útfiere om der foar te soargjen dat de applikaasje wurkjen bliuwt sa as it heard
+      elasticsearch_running_check:
+        message_html: Koe gjin ferbining meitsje mei Elasticsearch. Kontrolearje dat Elasticsearch útfierd wurdt of skeakelje full-text-sykjen út
+      elasticsearch_version_check:
+        message_html: 'Ynkompatibele Elasticsearch-ferzje: %{value}'
+        version_comparison: Jo brûke Elasticsearch %{running_version}, mar %{required_version} is fereaske
+      rules_check:
+        action: Serverregels beheare
+        message_html: Jo hawwe foar dizze server gjin regels opsteld.
+      sidekiq_process_check:
+        message_html: Der draait gjin Sidekiq-proses foar de wachtrige(n) %{value}. Kontrolearje jo Sidekiq-konfiguraasje
+    tags:
+      review: Steat beoardiele
+      updated_msg: Hashtagynstellingen mei sukses bywurke
+    title: Behear
+    trends:
+      allow: Tastean
+      approved: Goedkarre
+      disallow: Ofkarre
+      links:
+        allow: Keppeling goedkarre
+        allow_provider: Auteur goedkarre
+        description_html: Dit binne keppelingen dy’t op dit stuit in protte dield wurde troch accounts wêr’t jo server berjochten fan ûntfangt. Hjirtroch kinne jo brûkers sjen wat der yn de wrâld oan de hân is. Der wurde gjin keppelingen werjûn oant jo de website goedkard hawwe. Jo kinne ek yndividuele keppelingen goed- of ôfkarre.
+        disallow: Keppeling ôfkarre
+        disallow_provider: Website ôfkarre
+        no_link_selected: Der binne gjin keppelingen wizige, omdat der gjin ien selektearre waard
+        publishers:
+          no_publisher_selected: Der binne gjin websites wizige, omdat der gjin ien selektearre waard
+        shared_by_over_week:
+          one: Dizze wike troch ien persoan dield
+          other: Dizze wike troch %{count} persoanen dield
+        title: Trending keppelingen
+        usage_comparison: Hjoed %{today} kear dield, fergelike mei %{yesterday} kear juster
+      only_allowed: Allinnich goedkarre
+      pending_review: Moat noch beoardiele wurde
+      preview_card_providers:
+        allowed: Keppelingen fan dizze website kinne trending wurde
+        description_html: Dit binne domeinen wêrfan keppelingen faaks op jo server dield wurde. Keppelingen sille net yn it iepenbier trending wurde, eardat it domein fan de keppeling goedkard wurdt. Jo goedkarring (of ôfwizing) jildt ek foar subdomeinen.
+        rejected: Keppelingen fan dizze nijswebsite kinne net trending wurde
+        title: Utjouwers
+      rejected: Wegere
+      statuses:
+        allow: Berjocht goedkarre
+        allow_account: Account goedkarre
+        description_html: Dit binne berjochten dy’t op jo server bekend binne en dy’t op dit stuit in protte dield wurde en as favoryt markearre wurde. Hjirmei kinne nije en weromkearende brûkers mear minsken fine om te folgjen. Der wurde gjin berjochten yn it iepenbier werjûn oant de account troch jo goedkard is en de brûker tastiet dat harren account oan oaren oanrekommandearre wurdt. Jo kinne ek yndividuele berjochten goed- of ôfkarre.
+        disallow: Berjocht ôfkarre
+        disallow_account: Account ôfkarre
+        no_status_selected: Der binne gjin trending berjochten wizige, omdat der gjin ien selektearre waard
+        not_discoverable: Brûker hat gjin tastimming jûn om ûntdekt te wurden
+        shared_by:
+          one: Ien kear dield of as favoryt markearre
+          other: "%{friendly_count} kear dield of as favoryt markearre"
+        title: Trending berjochten
+      tags:
+        current_score: Aktuele skoare is %{score}
+        dashboard:
+          tag_accounts_measure: tal unike kearen brûkt
+          tag_languages_dimension: Populêre talen
+          tag_servers_dimension: Populêre servers
+          tag_servers_measure: ferskate servers
+          tag_uses_measure: totaal tal kear brûkt
+        description_html: Dizze hashtags ferskine op dit stuit yn in protte berjochten dy’t op jo server sichtber binne. Hjirmei kinne jo brûkers sjen dêr’t minsken op dit momint it meast oer prate. Der wurde gjin hashtags yn it iepenbier werjûn oant jo se goedkarre.
+        listable: Kin oanrekommandearre wurde
+        no_tag_selected: Der binne gjin hashtags wizige, omdat der gjin ien selektearre waard
+        not_listable: Wurdt net oanrekommandearre
+        not_trendable: Sil net ûnder trends ferskine
+        not_usable: Kin net brûkt wurde
+        peaked_on_and_decaying: Yn de trends op %{date}, nimt no wer ôf
+        title: Trending hashtags
+        trendable: Kin net ûnder trends ferskine
+        trending_rank: 'Trending #%{rank}'
+        usable: Kin brûkt wurde
+        usage_comparison: Hjoed %{today} kear brûkt, fergelike mei %{yesterday} kear juster
+        used_by_over_week:
+          one: Dizze wike troch ien persoan brûkt
+          other: Dizze wike troch %{count} persoanen brûkt
+      title: Trends
+      trending: Trending
     warning_presets:
+      add_new: Nije tafoegje
       delete: Fuortsmite
+      edit_preset: Foarynstelling foar warskôging bewurkje
+      empty: Jo hawwe noch gjin foarynstellingen foar warskôgingen tafoege.
+      title: Foarynstellingen foar warskôgingen beheare
     webhooks:
+      add_new: Einpunt tafoegje
       delete: Fuortsmite
+      description_html: Mei in <strong>webhook</strong> kin Mastodon <strong>meldingen real-time</strong> oer keazen barrens nei jo eigen tapassing stjoere, sadat jo applikaasje <strong>automatysk reaksjes generearje kin</strong>.
+      disable: Utskeakelje
+      disabled: Utskeakele
+      edit: Einpunt bewurkje
+      empty: Jo hawwe noch gjin webhook-einpunten konfigurearre.
+      enable: Ynskeakelje
+      enabled: Aktyf
+      enabled_events:
+        one: 1 ynskeakele evenemint
+        other: "%{count} ynskeakele eveneminten"
+      events: Eveneminten
+      new: Nije webhook
+      rotate_secret: Geheime kaai opnij generearje
+      secret: Geheime kaai ûndertekenje
+      status: Steat
+      title: Webhooks
+      webhook: Webhook
+  admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: it fuortsmiten fan harren berjochten
+        disable: it beferzen fan harren account
+        mark_statuses_as_sensitive: it markearjen fan harren berjochten as gefoelich
+        none: in warskôging
+        sensitive: it gefoelich forsearjen fan harren account
+        silence: it beheinen fan harren account
+        suspend: it útstellen fan harren account
+      body: "%{target} makket beswier tsjin in moderaasjemaatregel troch %{action_taken_by} op %{date}, oangeande %{type}. De brûker skriuwt:"
+      next_steps: Jo kinne it beswier goedkarre om dêrmei de moderaasjemaatregel ûngedien te meitsjen, of jo kinne it ferwerpe.
+      subject: "%{username} makket beswier tsjin in moderaasjemaatregel op %{instance}"
+    new_pending_account:
+      body: Sjoch hjirûnder de details fan it nije account. Jo kinne de oanfraach goedkarre of ôfwize.
+      subject: Der moat in nij account op %{instance} beoardiele wurde (%{username})
+    new_report:
+      body: "%{reporter} hat %{target} rapportearre"
+      body_remote: Ien fan %{domain} hat %{target} rapportearre
+      subject: Nije rapportaazje op %{instance} (#%{id})
+    new_trends:
+      body: 'De folgjende items moatte beoardiele wurde eardat se iepenbier toand wurde kinne:'
+      new_trending_links:
+        title: Trending keppelingen
+      new_trending_statuses:
+        title: Trending berjochten
+      new_trending_tags:
+        no_approved_tags: Op dit stuit binne der gjin goedkarre hashtags.
+        requirements: 'Elk fan dizze kandidaten kin de #%{rank} goedkarre trending hashtag oertreffe, dy’t op dit stuit #%{lowest_tag_name} is mei in skoare fan %{lowest_tag_score}.'
+        title: Trending hashtags
+      subject: Nije trends te beoardielen op %{instance}
+  aliases:
+    add_new: Alias oanmeitsje
+    created_msg: Mei sukses in nije alias oanmakke. Jo kinne no mei de ferhuzing fan it âlde account ôf begjinne.
+    deleted_msg: De alias is mei sukses fuortsmiten. Ferhúzjen fan dy account ôf nei dizze account is net mear mooglik.
+    empty: Jo hawwe gjin aliassen.
+    hint_html: Wannear’t jo fan in oare account ôf nei dizze account ferhúzje wolle, kinne jo hjir in alias oanmeitsje. Dit is nedich eardat jo troch gean kinne mei it ferhúzjen fan folgers fan de âlde nei dizze nije account. Dizze aksje is op eins <strong>net gefaarlik en omkearber</strong>. <strong>De accountmigraasje wurdt start fan de âlde account ôf</strong>.
+    remove: Alias ûntkeppelje
+  appearance:
+    advanced_web_interface: Avansearre webomjouwing
+    advanced_web_interface_hint: 'Wannear’t jo fan de hiele skermbreedte gebrûk meitsje wolle, stelt de avansearre webomjouwing jo yn steat om meardere ferskate kolommen te konfigurearjen. Hjirmei kinne jo safolle mooglik ynformaasje op itselde momint besjen, lykas: Start, meldingen, de globale tiidline, meardere listen en hashtags.'
+    animations_and_accessibility: Animaasjes en tagonklikheid
+    confirmation_dialogs: Befêstigingen
+    discovery: Untdekke
+    localization:
+      body: Mastodon wurdt troch frijwilligers oerset.
+      guide_link: https://crowdin.com/project/mastodon/fy
+      guide_link_text: Elkenien kin bydrage.
+    sensitive_content: Gefoelige ynhâld
+    toot_layout: Lay-out fan berjochten
+  application_mailer:
+    notification_preferences: E-mailfoarkarren wizigje
+    salutation: "%{name},"
+    settings: 'E-mailfoarkarren wizigje: %{link}'
+    view: 'Besjoch:'
+    view_profile: Profyl besjen
+    view_status: Berjocht besjen
+  applications:
+    created: Oanmeitsjen tapassing slagge
+    destroyed: Fuortsmiten tapassing slagge
+    regenerate_token: Tagongskoade opnij oanmeitsje
+    token_regenerated: Opnij oanmeitsjen tagongskoade slagge
+    warning: Wês foarsichtich mei dizze gegevens. Diel it nea mei in oar!
+    your_token: Jo tagongskoade
   auth:
+    apply_for_account: Account oanfreegje
+    change_password: Wachtwurd
     delete_account: Account fuortsmite
+    delete_account_html: Wannear’t jo jo account graach fuortsmite wolle, kinne jo dat <a href="%{path}">hjir dwaan</a>. Wy freegje jo dêr om in befêstiging.
+    description:
+      prefix_invited_by_user: "@%{name} nûget jo hjirby út om in account oan te meitsjen op dizze Mastodon-server!"
+      prefix_sign_up: Registrearje jo hjoed noch op Mastodon!
+      suffix: Mei in account binne jo yn steat om minsken te folgjen, berjochten te pleatsen en út te wikseljen mei minsken dy’t op oare Mastodon-servers binne en mear!
+    didnt_get_confirmation: Gjin befêstigingsynstruksjes ûntfongen?
+    dont_have_your_security_key: Hawwe jo jo befeiligingskaai net by de hân?
+    forgot_password: Wachtwurd ferjitten?
+    invalid_reset_password_token: De koade om jo wachtwurd opnij yn te stellen is ferrûn. Freegje in nije oan.
+    link_to_otp: Fier in twa-stapsferifikaasjekoade fan jo telefoan of in werstelkoade yn
+    link_to_webauth: Jo apparaat mei de autentikaasje-app brûke
+    log_in_with: Oanmelde mei
+    login: Oanmelde
+    logout: Ofmelde
+    migrate_account: Nei in oar account ferhúzje
+    migrate_account_html: Wannear’t jo dizze account nei in oare account trochferwize wolle, kinne jo <a href="%{path}">dit hjir ynstelle</a>.
+    or_log_in_with: Of oanmelde mei
+    privacy_policy_agreement_html: Ik haw it <a href="%{privacy_policy_path}" target="_blank">privacybelied</a> lêzen en gean dêrmei akkoard
+    providers:
+      cas: CAS
+      saml: SAML
+    register: Registrearje
+    registration_closed: "%{instance} lit gjin nije brûkers ta"
+    resend_confirmation: Ferstjoer de befêstigingsynstruksjes nochris
+    reset_password: Wachtwurd opnij ynstelle
+    rules:
+      preamble: Dizze binne fêststeld en wurde yn stân hâlden troch de moderatoaren fan %{domain}.
+      title: Inkelde basisrigels.
+    security: Befeiliging
+    set_new_password: Nij wachtwurd ynstelle
+    setup:
+      email_below_hint_html: Wannear ûndersteand e-mailadres net kloppet, kinne jo dat hjir wizigje. Jo ûntfange dan hjirnei in befêstigings-e-mailberjocht.
+      email_settings_hint_html: It befêstigings-e-mailberjocht is ferstjoerd nei %{email}. Wannear’t dat e-mailadres net kloppet, kinne jo dat wizigje yn jo accountynstellingen.
+      title: Ynstelle
+    sign_in:
+      preamble_html: Meld jo oan mei de oanmeldgegevens fan <strong>%{domain}</strong>. As jo account op in oare server stiet, kinne jo hjir net oanmelde.
+      title: Oanmelde op %{domain}
+    sign_up:
+      preamble: Jo kinne mei in Mastodon-account elkenien yn it netwurk folgen, wêr’t dizze persoan ek in account hat.
+      title: Litte wy jo account op %{domain} ynstelle.
+    status:
+      account_status: Accountsteat
+      confirming: Oan it wachtsjen oant it e-mailadres befêstige is.
+      functional: Jo account kin folslein brûkt wurde.
+      pending: Jo oanfraach moat noch beoardiele wurde troch ien fan ús meiwurkers. Dit kin miskien efkes duorje. Jo ûntfangt in e-mailberjocht wannear’t jo oanfraach goedkard is.
+      redirecting_to: Jo account is ynaktyf, omdat it op dit stuit trochferwezen wurdt nei %{acct}.
+      view_strikes: Besjoch de earder troch moderatoaren fêststelde skeiningen dy’t jo makke hawwe
+    too_fast: Formulier is te fluch yntsjinne. Probearje it nochris.
+    use_security_key: Befeiligingskaai brûke
+  authorize_follow:
+    already_following: Jo folgje dizze account al
+    already_requested: Jo hawwe al in folchfersyk nei dat account ferstjoerd
+    error: Spitiger, der is in flater bard by it opsykjen fan de eksterne account
+    follow: Folgje
+    follow_request: 'Jo hawwe in folchfersyk yntsjinne by:'
+    following: 'Slagge! Jo folgje no:'
+    post_follow:
+      close: Of jo kinne dit finster gewoan slute.
+      return: Profyl fan dizze brûker toane
+      web: Gean nei de webapp
+    title: "%{acct} folgje"
+  challenge:
+    confirm: Trochgean
+    hint_html: "<strong>Tip:</strong> Wy freegje jo it kommende oere net mear nei jo wachtwurd."
+    invalid_password: Unjildich wachtwurd
+    prompt: Befêstigje wachtwurd om troch te gean
+  crypto:
+    errors:
+      invalid_key: is gjin jildige Ed25519- of Curve25519-kaai
+      invalid_signature: is gjin jildige Ed25519-hantekening
+  date:
+    formats:
+      default: "%d %b %Y"
+      with_month_name: "%d %B %Y"
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count}o"
+      about_x_months: "%{count}mo"
+      about_x_years: "%{count}j"
+      almost_x_years: "%{count}j"
+      half_a_minute: Sakrekt
+      less_than_x_minutes: "%{count}m"
+      less_than_x_seconds: Sakrekt
+      over_x_years: "%{count}j"
+      x_days: "%{count}d"
+      x_minutes: "%{count}m"
+      x_months: "%{count}mo"
+      x_seconds: "%{count}s"
   deletes:
+    challenge_not_passed: De ynformaasje dy’t jo ynfierd hawwe is ûnjildich
+    confirm_password: Fier jo aktuele wachtwurd yn om jo identiteit te befêstigjen
+    confirm_username: Fier jo brûkersnamme yn om de proseduere te befêstigjen
     proceed: Account fuortsmite
+    success_msg: Jo account is mei sukses fuortsmiten
+    warning:
+      before: 'Lês dizze tekst soarchfâldich eardat jo troch gean:'
+      caches: Berjochten en media dy’t op oare servers bewarre binne kinne dêr efterbliuwe
+      data_removal: Jo berjochten en oare gegevens wurde permanint fuortmiten
+      email_change_html: Jo kinne <a href="%{path}">jo e-mailadres wizigje</a> sûnder dat jo jo account fuort hoege te smiten
+      email_contact_html: Wannear’t it noch hieltyd net oankomt, kinne jo foar help in e-mailberjocht stjoere nei <a href="mailto:%{email}">%{email}</a>
+      email_reconfirmation_html: Wannear’t jo it befêstigings-e-mailberjocht net ûntfongen hawwe, kinne jo dizze <a href="%{path}">opnij oanfreegje</a>
+      irreversible: Jo sille net yn steat wêze om jo account te werstellen of te de-aktivearjen
+      more_details_html: Sjoch it <a href="%{terms_path}">privacybelied</a> foar mear ynformaasje.
+      username_available: Jo brûkersnamme sil wer beskikber komme
+      username_unavailable: Jo brûkersnamme sil net beskikber bliuwe
+  disputes:
+    strikes:
+      action_taken: Nommen maatregel
+      appeal: Beswier
+      appeal_approved: It yntsjinne beswier is goedkard en de earder fêststelde oertrêding is net langer jildich
+      appeal_rejected: It yntsjinne beswier is ôfwêzen
+      appeal_submitted_at: Beswier yntsjinne
+      appealed_msg: Jo beswier is yntsjinne. Wannear’t dizze goedkard wurdt, krije jo hjir berjocht fan.
+      appeals:
+        submit: Beswier yntsjinje
+      approve_appeal: Beswier goedkarre
+      associated_report: Byhearrende rapportaazje
+      created_at: Datum en tiid
+      description_html: Dit binne maatregels dy’t tsjin jo account nommen binne en warskôgingen dy’t troch meiwurkers fan %{instance} nei jo stjoerd binne.
+      recipient: Adressearre oan
+      reject_appeal: Beswier ôfwêzen
+      status: 'Berjocht #%{id}'
+      status_removed: Berjocht is al fan de server fuortsmiten
+      title: "%{action} fan %{date}"
+      title_actions:
+        delete_statuses: Fuortsmiten fan berjocht
+        disable: Beferzen fan account
+        mark_statuses_as_sensitive: Berjochten as gefoelich markearje
+        none: Warskôging
+        sensitive: Folsleine account as gefoelich markearje
+        silence: Beheining account
+        suspend: Utstellen account
+      your_appeal_approved: Jo beswier is goedkard
+      your_appeal_pending: Jo hawwe in beswier yntsjinne
+      your_appeal_rejected: Jo beswier is ôfwêzen
+  domain_validator:
+    invalid_domain: is in ûnjildige domeinnamme
   errors:
-    '400': The request you submitted was invalid or malformed.
-    '403': You don't have permission to view this page.
-    '404': The page you are looking for isn't here.
-    '406': This page is not available in the requested format.
-    '410': The page you were looking for doesn't exist here anymore.
-    '422': 
-    '429': Too many requests
-    '500': 
-    '503': The page could not be served due to a temporary server failure.
+    '400': De oanfraach dy’t jo yntsjinne hawwe wie ûnjildich of fout.
+    '403': Jo hawwe gjin tastimming om dizze side te besjen.
+    '404': De side wêrnei’t jo sochten bestiet net.
+    '406': Dizze side is net beskikber yn it opfrege formaat.
+    '410': De side dy’t jo sochten bestiet net mear.
+    '422':
+      content: Feilichheidsferifikaasje mislearre. Blokkearje jo tafallich cookies?
+      title: Feilichheidsferifikaasje mislearre
+    '429': Te folle ferbiningsoanfragen
+    '500':
+      content: It spyt ús, der is oan ús kant wat fout gien.
+      title: Dizze side is skansearre
+    '503': De side koe troch in tydlike serversteuring net laden wurde.
+    noscript_html: Skeakelje JavaScript yn om de webapp fan Mastodon brûke te kinnen. As alternatyf kinne jo in <a href="%{apps_path}">Mastodon-app</a> sykje foar jo platfoarm.
+  existing_username_validator:
+    not_found: koe gjin lokale brûker mei dy brûkersnamme fine
+    not_found_multiple: koe %{usernames} net fine
+  exports:
+    archive_takeout:
+      date: Datum
+      download: Jo argyf downloade
+      hint_html: Jo kinne in argyf opfreegje fan jo <strong>berjochten en oplade media</strong>. De eksportearre gegevens binne yn it ActivityPub-formaat, dat troch hjirfoar geskikte software te lêzen is. Jo kinne elke 7 dagen in kopy fan jo argyf oanfreegje.
+      in_progress: Jo argyf wurdt gearstald…
+      request: Jo argyf opfreegje
+      size: Grutte
+    blocks: Jo blokkearje
+    bookmarks: Blêdwizers
+    csv: CSV
+    domain_blocks: Domeinblokkaden
+    lists: Listen
+    mutes: Jo negearje
+    storage: Mediaûnthâld
+  featured_tags:
+    add_new: Nije tafoegje
+    errors:
+      limit: Jo hawwe al it maksimaal tal hashtags útljochte
+    hint_html: "<strong>Wat binne útljochte hashtags?</strong> Dizze wurde prominint op jo iepenbiere profyl toand en stelt minsken yn steat om jo iepenbiere berjochten per hashtag te besjen. It is in goed helpmiddel om kreative wurksumheden of langetermynprojekten by te hâlden."
   filters:
     contexts:
+      account: Profilen
+      home: Starttiidline en listen
+      notifications: Meldingen
+      public: Iepenbiere tiidlinen
       thread: Petearen
+    edit:
+      add_keyword: Foegje kaaiwurd ta
+      keywords: Kaaiwurden
+      statuses: Yndividuele berjochten
+      statuses_hint_html: Dit filter is fan tapassing om yndividuele berjochten te selektearjen, oft se no met de ûndersteande trefwurden oerienkomme of net. <a href="%{path}">Berjochten fan it filter besjen of fuortsmite</a>.
+      title: Filter bewurkje
+    errors:
+      deprecated_api_multiple_keywords: Dizze ynstellingen kinne net fia dizze applikaasje wizige wurde, omdat der mear as ien trefwurd brûkt wurdt. Brûk in mear resinte applikaasje of de webomjouwing.
+      invalid_context: Gjin of ûnjildige kontekst jûn
     index:
+      contexts: Filters yn %{contexts}
       delete: Fuortsmite
+      empty: Jo hawwe gjin filters oanmakke.
+      expires_in: Ferrint nei %{distance}
+      expires_on: Ferrint op %{date}
+      keywords:
+        one: "%{count} trefwurd"
+        other: "%{count} trefwurden"
+      statuses:
+        one: "%{count} berjocht"
+        other: "%{count} berjochten"
+      statuses_long:
+        one: "%{count} yndividueel berjocht ferstoppe"
+        other: "%{count} yndividuele berjochten ferstoppe"
+      title: Filters
+    new:
+      save: Nije filter bewarje
+      title: Nije filter tafoegje
+    statuses:
+      back_to_filter: Tebek nei it filter
+      batch:
+        remove: Ut it filter fuortsmite
+      index:
+        hint: Dit filter is fan tapassing om yndividuele berjochten te selektearjen, ûnôfhinklik fan oare kritearia. Jo kinne yn de webomjouwing mear berjochten oan dit filter tafoegje.
+        title: Filtere berjochten
+  footer:
+    trending_now: Trends
   generic:
+    all: Alle
+    all_items_on_page_selected_html:
+      one: "<strong>%{count}</strong> item op dizze side is selektearre."
+      other: Alle <strong>%{count}</strong> items op dizze side binne selektearre.
+    all_matching_items_selected_html:
+      one: "<strong>%{count}</strong> item dat mei jo sykopdracht oerienkomt is selektearre."
+      other: Alle <strong>%{count}</strong> items dy’t mei jo sykopdracht oerienkomme binne selektearre.
+    changes_saved_msg: Wizigingen mei sukses bewarre!
+    copy: Kopiearje
     delete: Fuortsmite
+    deselect: Alles deselektearje
+    none: Gjin
+    order_by: Sortearje op
+    save_changes: Wizigingen bewarje
+    select_all_matching_items:
+      one: "%{count} item dat mei jo sykopdracht oerienkomt selektearje."
+      other: Alle %{count} items dy’t mei jo sykopdracht oerienkomme selektearje.
+    today: hjoed
+    validation_errors:
+      one: Der is wat net hielendal goed! Besjoch ûndersteande flater
+      other: Der is wat net hielendal goed! Besjoch ûndersteande %{count} flaters
+  html_validator:
+    invalid_markup: 'befettet ûnjildige HTML-opmaak: %{error}'
+  imports:
+    errors:
+      invalid_csv_file: 'Unjildich CSV-bestân. Flater: %{error}'
+      over_rows_processing_limit: befettet mear as %{count} rigen
+    modes:
+      merge: Gearfoegje
+      merge_long: Besteande gegevens behâlde en nije tafoegje
+      overwrite: Oerskriuwe
+      overwrite_long: Aktuele gegevens mei de nije gegevens ferfange
+    preface: Jo kinne bepaalde gegevens, lykas de minsken dy’t jo folgje of blokkearre hawwe, nei jo account op dizze server ymportearje. Jo moatte dizze gegevens wol earst op de oarspronklike server eksportearje.
+    success: Jo gegevens binne mei sukses opladen en wurde ynkoarten ferwurke
+    types:
+      blocking: Blokkearlist
+      bookmarks: Blêdwizers
+      domain_blocking: Domeinblokkearlist
+      following: Folchlist
+      muting: Negearlist
+    upload: Oplade
   invites:
     delete: Deaktivearje
+    expired: Ferrûn
+    expires_in:
+      '1800': 30 minuten
+      '21600': 6 oeren
+      '3600': 1 oere
+      '43200': 12 oeren
+      '604800': 1 wike
+      '86400': 1 dei
+    expires_in_prompt: Nea
+    generate: Utnûgingskeppeling generearje
+    invited_by: 'Jo binne útnûge troch:'
+    max_uses:
+      one: 1 kear
+      other: "%{count} kear"
+    max_uses_prompt: Gjin limyt
+    prompt: Generearje en diel spesjale keppelingen om minsken tagong ta dizze Mastodon-server te jaan
+    table:
+      expires_at: Ferrint op
+      uses: Brûkt
+    title: Minsken útnûgje
+  lists:
+    errors:
+      limit: Jo hawwe it maksimaal tal listen berikt
+  login_activities:
+    authentication_methods:
+      otp: twa-stapsferifikaasje-app
+      password: wachtwurd
+      sign_in_token: befeiligingskoade fia e-mailberjocht
+      webauthn: befeiligingskaaien
+    description_html: Wannear’t jo aktiviteit sjogge dy’t jo net werkenne, tink dan nei om jo wachtwurd te wizigjen en twa-stapsferifikaasje yn te skeakeljen.
+    empty: Gjin oanmeldskiednis beskikber
+    failed_sign_in_html: Mislearre oanmeldbesykjen mei %{method} fan %{ip} (%{browser})
+    successful_sign_in_html: Mei sukses oanmeld mei %{method} fan %{ip} (%{browser})
+    title: Oanmeldskiednis
+  media_attachments:
+    validations:
+      images_and_video: In fideo kin net oan in berjocht mei ôfbyldingen keppele wurde
+      not_ready: Kin gjin bestannen tafoegje dy’t noch net ferwurke binne. Probearje it letter opnij!
+      too_many: Der kinne net mear as 4 ôfbyldingen tafoege wurde
+  migrations:
+    acct: Ferhuze nei
+    cancel: Trochferwizing annulearje
+    cancel_explanation: It annulearjen fan de trochferwizing sil jo aktuele account opnij aktivearje, mar bringt gjin folgers werom dy’t nei de oare account ferhuze binne.
+    cancelled_msg: De trochferwizing is mei sukses annulearre.
+    errors:
+      already_moved: is itselde account wêrnei’t jo al nei ta ferhuze binne
+      missing_also_known_as: is gjin alias fan dizze account
+      move_to_self: kin net it aktuele account wêze
+      not_found: koe net fûn wurde
+      on_cooldown: Jo lêste migraasje is noch te koart lyn
+    followers_count: Folgers op it momint fan ferhuzing
+    incoming_migrations: Ferhúzje fan in oar account ôf
+    incoming_migrations_html: Om fan in oar account ôf nei dizze account te ferhúzjen, moatte jo earst <a href="%{path}">in accountalias oanmeitsje</a>.
+    moved_msg: Jo account wurdt no nei %{acct} trochferwiisd en jo folgers wurde ferhuze.
+    not_redirecting: Jo account wurdt op dit stuit net nei in oar account trochferwizen.
+    on_cooldown: Jo hawwe resint jo account ferhuze. Dizze mooglikheid is oer %{count} dagen wer beskikber.
+    past_migrations: Foarige migraasjes
+    proceed_with_move: Folgers ferhúzje
+    redirected_msg: Jo account wurdt no trochferwizen nei %{acct}.
+    redirecting_to: Jo account wurdt no nei %{acct} trochferwizen.
+    set_redirect: Trochferwizing ynstelle
+    warning:
+      backreference_required: De nije account moat earst ynsteld wurde om nei dizze account weromferwize te kinnen
+      before: 'Lês dizze tekst soarchfâldich eardat jo troch gean:'
+      cooldown: Nei de ferhuzing kinne jo tydlik net opnij ferhúzje
+      disabled_account: Jo aktuele account is hjirnei net mear folslein brûkber. Jo hawwe echter wol tagong ta it eksportearjen fan jo gegevens en ta it opnij aktivearjen fan jo account.
+      followers: Dizze aksje ferhuzet alle folgers fan de aktuele account ôf nei de nije account
+      only_redirect_html: Jo kinne as alternatyf ek <a href="%{path}">allinnich de trochferwizing op jo profyl sette</a>.
+      other_data: Oare gegevens wurde net automatysk ferhuze
+      redirect: Jo aktuele accountprofyl wurdt bywurke mei in trochferwizingsmelding en wurdt útsluten fan sykresultaten
+  moderation:
+    title: Moderaasje
+  move_handler:
+    carry_blocks_over_text: Dizze brûker is fan %{acct} ôf ferhuze. Jo hawwe dizze account blokkearre.
+    carry_mutes_over_text: Dizze brûker is fan %{acct} ôf ferhuze. Jo hawwe dizze account negearre.
+    copy_account_note_text: 'Dizze brûker is fan %{acct} ôf ferhuze. Jo hawwe de folgjende opmerkingen oer dizze account makke:'
+  navigation:
+    toggle_menu: Menu toane/ferstopje
   notification_mailer:
+    admin:
+      report:
+        subject: "%{name} hat in rapportaazje yntsjinne"
+      sign_up:
+        subject: "%{name} hat harren registrearre"
+    favourite:
+      body: 'Jo berjocht waard troch %{name} al favoryt markearre:'
+      subject: "%{name} hat jo berjocht as favoryt markearre"
+      title: Nije favoryt
+    follow:
+      body: "%{name} folget jo no!"
+      subject: "%{name} folget jo no"
+      title: Nije folger
+    follow_request:
+      action: Folchfersiken beheare
+      body: "%{name} wol jo graach folgje"
+      subject: 'Folgjen yn ôfwachting: %{name}'
+      title: Nij folchfersyk
     mention:
       action: Beäntwurdzje
       body: 'Jo binne fermeld troch %{name} yn:'
       subject: Jo binne fermeld troch %{name}
       title: Nije fermelding
+    poll:
+      subject: In enkête fan %{name} is beëinige
+    reblog:
+      body: 'Jo berjocht waard troch %{name} al boost:'
+      subject: "%{name} hat jo berjocht boost"
+      title: Nije boost
+    status:
+      subject: "%{name} hat sakrekt in berjocht pleatst"
+    update:
+      subject: "%{name} hat in berjocht bewurke"
+  notifications:
+    email_events: E-mailmeldingen foar eveneminten
+    email_events_hint: 'Selektearje eveneminten wêrfoar’t jo meldingen ûntfange wolle:'
+    other_settings: Oare meldingsynstellingen
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: mld.
+          million: mln.
+          quadrillion: qdn.
+          thousand: K
+          trillion: bln.
+  otp_authentication:
+    code_hint: Fier de koade yn dy’t troch de autentikaasje-app generearre waard
+    description_html: Nei it ynstellen fan <strong>twa-stapsferifikaasje</strong> mei in autentikaasje-app, kinne jo allinnich oanmelde as jo jo mobile telefoan by jo hawwe. Hjirmei generearje jo nammentlik de yn te fieren tagongskoade.
+    enable: Ynskeakelje
+    instructions_html: "<strong>Scan dizze QR-koade yn Google Authenticator of in gelikense app op jo mobile telefoan</strong>. Fan no ôf generearret dizze app tagongskoaden dy’t jo by it oanmelden ynfiere moatte."
+    manual_instructions: 'Yn it gefal jo de QR-koade net scanne kinne en it hânmjittich ynfiere moatte, fine jo hjirûnder de geheime koade yn platte tekst:'
+    setup: Ynstelle
+    wrong_code: De ynfierde koade is ûnjildich! Kloppet de systeemtiid fan de server en dy fan jo apparaat?
+  pagination:
+    newer: Nijer
+    next: Folgjende
+    older: Alder
+    prev: Foarige
+    truncate: "&hellip;"
+  polls:
+    errors:
+      already_voted: Jo hawwe al op dizze enkête stimd
+      duplicate_options: befettet dûbele items
+      duration_too_long: leit te fier yn de takomst
+      duration_too_short: duorret te koart
+      expired: De enkête is al beëinige
+      invalid_choice: De keazen enkêteopsje bestiet net
+      over_character_limit: kin net langer wêze as %{max} tekens
+      too_few_options: moat mear as ien item befetsje
+      too_many_options: kin net mear as %{max} items befetsje
+  preferences:
+    other: Oars
+    posting_defaults: Standertynstellingen foar berjochten
+    public_timelines: Iepenbiere tiidlinen
+  privacy_policy:
+    title: Privacybelied
+  reactions:
+    errors:
+      limit_reached: Limyt fan ferskate emoji-reaksjes berikt
+      unrecognized_emoji: is gjin besteande emoji-reaksje
   relationships:
+    activity: Accountaktiviteit
+    dormant: Slommerjend
+    follow_selected_followers: Selektearre folgers folgje
+    followers: Folgers
+    following: Folgjend
+    invited: Utnûge
     last_active: Letst warber
+    most_recent: Meast resint
+    moved: Ferhuze
+    mutual: Fan wjerskanten
+    primary: Primêr
+    relationship: Relaasje
+    remove_selected_domains: Alle folgers fan de selektearre domeinen fuortsmite
+    remove_selected_followers: Selektearre folgers fuortsmite
+    remove_selected_follows: Selektearre brûkers net mear folgje
+    status: Accountsteat
+  remote_follow:
+    missing_resource: Koe fereaske trochferwizings-URL foar jo account net fine
+  reports:
+    errors:
+      invalid_rules: ferwiist net nei jildige regels
   rss:
     content_warning: 'Ynhâldswarskôging:'
+    descriptions:
+      account: Iepenbiere berjochten fan @%{acct}
+      tag: 'Iepenbiere berjochten mei hashtag #%{hashtag}'
+  scheduled_statuses:
+    over_daily_limit: Jo binne oer de limyt fan %{limit} yn te plannen berjochten foar hjoed
+    over_total_limit: Jo binne oer de limyt fan %{limit} yn te plannen berjochten
+    too_soon: De datum foar it ynplande berjocht moat yn de takomst lizze
+  sessions:
+    activity: Lêst warber
+    browser: Browser
+    browsers:
+      alipay: Alipay
+      blackberry: BlackBerry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Electron
+      firefox: Firefox
+      generic: Unbekende 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: UC Browser
+      weibo: Weibo
+    current_session: Aktuele sesje
+    description: "%{browser} op %{platform}"
+    explanation: Dit binne de webbrowsers dy’t op dit stuit mei jo Mastodon-account oanmeld binne.
+    ip: IP
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: BlackBerry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
+      mac: macOS
+      other: ûnbekend platfoarm
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
+    revoke: Ynlûke
+    revoke_success: Sesje mei sukses ynlutsen
+    title: Sesjes
+    view_authentication_history: Oanmeldskiednis fan jo account besjen
   settings:
+    account: Account
+    account_settings: Accountynstellingen
+    aliases: Accountaliassen
+    appearance: Werjefte
+    authorized_apps: Autorisearre apps
+    back: Tebek nei Mastodon
     delete: Account fuortsmite
+    development: Untwikkelers
+    edit_profile: Profyl bewurkje
+    export: Eksportearje
+    featured_tags: Utljochte hashtags
+    import: Ymportearje
+    import_and_export: Ymportearje en eksportearje
+    migrate: Accountmigraasje
+    notifications: Meldingen
+    preferences: Foarkarren
+    profile: Profyl
+    relationships: Folgers en folgjenden
+    statuses_cleanup: Automatysk berjochten fuortsmite
+    strikes: Fêststelde skeiningen
+    two_factor_authentication: Twa-stapsferifikaasje
+    webauthn_authentication: Befeiligingskaaien
   statuses:
+    attached:
+      audio:
+        one: "%{count} lûdsbestân"
+        other: "%{count} lûdsbestannen"
+      description: 'Bylagen: %{attached}'
+      image:
+        one: "%{count} opmerking"
+        other: "%{count} opmerkingen"
+      video:
+        one: "%{count} fideo"
+        other: "%{count} fideo’s"
+    boosted_from_html: Boost fan %{acct_link}
     content_warning: 'Ynhâldswarskôging: %{warning}'
+    default_language: Itselde as de taal fan de brûkersomjouwing
+    disallowed_hashtags:
+      one: 'befette in net tastiene hashtag: %{tags}'
+      other: 'befette net tastiene hashtags: %{tags}'
+    edited_at_html: Bewurke op %{date}
+    errors:
+      in_reply_not_found: It berjocht wêrop jo probearje te reagearjen liket net te bestean.
+    open_in_web: Yn de webapp iepenje
+    over_character_limit: Oer de limyt fan %{max} tekens
     pin_errors:
-      direct: Berjochten dy allinnich sichtber binne foar fermelde brûkers kinne net fêstset wurde
+      direct: Berjochten dy’t allinnich sichtber binne foar fermelde brûkers kinne net fêstset wurde
+      limit: Jo hawwe it maksimaal tal berjochten al fêstmakke
+      ownership: In berjocht fan in oar kin net fêstmakke wurde
+      reblog: In boost kin net fêstset wurde
+    poll:
+      total_people:
+        one: "%{count} persoan"
+        other: "%{count} persoanen"
+      total_votes:
+        one: "%{count} stim"
+        other: "%{count} stimmen"
+      vote: Stimme
+    show_more: Mear toane
+    show_newer: Nijere toane
+    show_older: Aldere toane
+    show_thread: Petear toane
+    sign_in_to_participate: Meld jo oan om oan dit petear mei te dwaan
+    title: '%{name}: "%{quote}"'
+    visibilities:
+      direct: Direkt
+      private: Allinnich folgers
+      private_long: Allinnich oan jo folgers toane
+      public: Iepenbier
+      public_long: Elkenien kin it sjen
+      unlisted: Minder iepenbier
+      unlisted_long: Elkenien kin it sjen, mar net op iepenbiere tiidlinen
+  statuses_cleanup:
+    enabled: Automatysk âlde berjochten fuortsmite
+    enabled_hint: Smyt jo berjochten automatysk fuort sa gau as se in bepaalde leeftiidsgrins berikke, útsein se oerienkomme mei ien fan de ûndersteande útsûnderingen
+    exceptions: Utsûnderingen
+    explanation: Trochdat it fuortsmiten fan berjochten de server swier belêst, bart dit stadich op mominten dat de server net dwaande is. Om dizze reden kinne jo berjochten in amerijke neidat se de leeftiidsgrins berikt hawwe fuortsmiten wurde.
+    ignore_favs: Favoriten negearje
+    ignore_reblogs: Boosts negearje
+    interaction_exceptions: Utsûnderingen op basis fan ynteraksjes
+    interaction_exceptions_explanation: Merk op dat der gjin garânsje is dat berjochten fuortsmiten wurde, wannear’t ien kear it tal favoriten of boosts boppe de ynstelde grinswearde west binne.
+    keep_direct: Direkte berjochten behâlde
+    keep_direct_hint: Smyt gjin inkeld direkt berjocht fan jo fuort
+    keep_media: Berjochten mei mediabylagen behâlde
+    keep_media_hint: Smyt gjin inkeld berjocht mei mediabylagen fuort
+    keep_pinned: Fêstmakke berjochten behâlde
+    keep_pinned_hint: Smyt gjin inkeld fêstset berjocht fan jo fuort
+    keep_polls: Enkêten bewarje
+    keep_polls_hint: Gjin inkelde enkête fan jo wurdt fuortsmiten
+    keep_self_bookmark: Blêdwizers behâlde
+    keep_self_bookmark_hint: Eigen berjochten dy’t jo oan jo blêdwizers tafoege hawwe wurde net fuortsmiten
+    keep_self_fav: Favoriten behâlde
+    keep_self_fav_hint: Eigen berjochten dy’t jo as favoryt markearre hawwe wurde net fuortsmiten
+    min_age:
+      '1209600': 2 wiken
+      '15778476': 6 moannen
+      '2629746': 1 moanne
+      '31556952': 1 jier
+      '5259492': 2 moannen
+      '604800': 1 wike
+      '63113904': 2 jier
+      '7889238': 3 moannen
+    min_age_label: Fuort te smiten nei
+    min_favs: Berjochten dy’t op syn minst safolle kear as favoryt markearre binne behâlde
+    min_favs_hint: Smyt gjin berjochten dy’t op syn minst safolle kear as favoryt markearre binne fuort. Lit leech om berjochten likefolle it tal favoriten fuort te smiten
+    min_reblogs: Berjochten dy’t op syn minst safolle kear boost binne behâlde
+    min_reblogs_hint: Smyt gjin berjochten dy’t op syn minst safolle kear boost binne fuort. Lit leech om berjochten likefolle it tal boosts fuort te smiten
+  stream_entries:
+    pinned: Fêstsette berjocht
+    reblogged: boostte
+    sensitive_content: Gefoelige ynhâld
+  strikes:
+    errors:
+      too_late: De perioade dat jo beswier meitsje kinne tsjin dizze skeining is ferrûn
+  tags:
+    does_not_match_previous_name: komt net oerien mei de foarige namme
+  themes:
+    contrast: Mastodon (heech kontrast)
+    default: Mastodon (donker)
+    mastodon-light: Mastodon (ljocht)
+  time:
+    formats:
+      default: "%d %B %Y om %H:%M"
+      month: "%b %Y"
+      time: "%H:%M"
+  two_factor_authentication:
+    add: Tafoegje
+    disable: 2FA útskeakelje
+    disabled_success: Utskeakeljen twa-stapsferifikaasje is slagge
+    edit: Bewurkje
+    enabled: Twa-stapsferifikaasje is ynskeakele
+    enabled_success: Ynskeakeljen twa-stapsferifikaasje is slagge
+    generate_recovery_codes: Werstelkoaden generearje
+    lost_recovery_codes: Mei werstelkoaden kinne jo tagong ta jo account krije wannear’t jo jo telefoan kwytrekke binne. Wannear’t jo jo werstelkoaden kwytrekke binne, kinne jo se hjir opnij generearje. Jo âlde werstelkoaden binne dêrnei ûnjildich.
+    methods: Metoaden foar twa-stapsferifikaasje
+    otp: Autentikaasje-app
+    recovery_codes: Reservekopy meitsje fan werstelkoaden
+    recovery_codes_regenerated: Opnij generearjen werstelkoaden slagge
+    recovery_instructions_html: Wannear’t jo ea de tagong ta jo telefoan ferlieze, kinne jo mei help fan ien fan de werstelkoaden hjirûnder opnij tagong krije ta jo account. <strong>Soargje derfoar dat jo de werstelkoaden op in feilich plak bewarje</strong>. Jo kinne se bygelyks ôfdrukke en se tegearre mei oare wichtige dokuminten bewarje.
+    webauthn: Befeiligingskaaien
+  user_mailer:
+    appeal_approved:
+      action: Gean nei jo account
+      explanation: It beswier tsjin in troch in moderator fêststelde skeining fan jo op %{strike_date}, yntsjinne op %{appeal_date}, is goedkard. De earder fêststelde skeining is hjirby net langer jildich.
+      subject: Jo beswier fan %{date} is goedkard
+      title: Beswier goedkard
+    appeal_rejected:
+      explanation: It beswier tsjin in troch in moderator fêststelde skeining fan jo op %{strike_date}, yntsjinne op %{appeal_date}, is ôfwêzen. De fêststelde skeining bliuwt wurdt dêrom net wizige.
+      subject: Jo beswier fan %{date} is ôfwêzen
+      title: Beswier ôfwêzen
+    backup_ready:
+      explanation: Jo hawwe in folsleine reservekopy fan jo Mastodon-account opfrege. It stiet no klear om download te wurden!
+      subject: Jo argyf stiet klear om download te wurden
+      title: Argyf ophelje
+    suspicious_sign_in:
+      change_password: wizigje jo wachtwurd
+      details: 'Hjir binne de details fan oanmeldbesykjen:'
+      explanation: Wy hawwe fêststeld dat ien fan in nij IP-adres ôf op jo account oanmeld is.
+      further_actions_html: Wannear’t jo dit net wiene, advisearje wy om daliks %{action} en om twa-stapsferifikaasje yn te skeakeljen, om sa jo account feilich te hâlden.
+      subject: Jo account is fan in nij IP-adres ôf benadere
+      title: In nije registraasje
+    warning:
+      appeal: Beswier yntsjinje
+      appeal_description: Wannear’t jo tinke dat dit in flater is, kinne jo in beswier yntsjinje by de meiwurkers fan %{instance}.
+      categories:
+        spam: Spam
+        violation: De ynhâld is yn striid mei de folgjende mienskipsrjochtlinen
+      explanation:
+        delete_statuses: Der is fêststeld dat guon fan jo berjochten yn striid binne mei ien of meardere mienskipsrjochtlinen en dêrom troch de moderatoren fan %{instance} fuortsmiten.
+        disable: Jo kinne net langer jo account brûke, mar jo profyl en oare gegevens binne noch wol yntakt. Jo kinne in reservekopy fan jo gegevens opfreegje, accountynstellingen wizigje of jo account fuortsmite.
+        mark_statuses_as_sensitive: Guon fan jo berjochten binne as gefoelich markearre troch de moderatoren fan %{instance}. Dit betsjut dat minsken op de media yn de berjochten klikke/tikke moatte om dizze wer te jaan. Jo kinne media yn de takomst ek sels as gefoelich markearje.
+        sensitive: Fan no ôf wurde al jo opladen media as gefoelich markearre en efter in warskôging ferstoppe.
+        silence: Jo kinne noch hieltyd jo account brûke, mar allinnich minsken dy’t jo al folgje kinne jo berjochten sjen, en jo kinne minder goed fûn wurde. Oaren kinne jo echter noch wol hieltyd hânmjittich folgje.
+        suspend: Jo kinne net langer jo account brûke en jo profyl en oare gegevens binne net langer tagonklik. Jo kinne noch hieltyd oanmelde om in reservekopy fan jo gegevens op te freegjen, oant dizze nei 30 dagen folslein fuortsmiten wurde. Wy sille wol inkelde basisgegevens behâlde om foar te kommen dat jo ûnder jo útstel probearje út te kommen.
+      reason: 'Reden:'
+      statuses: 'Rapportearre berjochten:'
+      subject:
+        delete_statuses: Dizze berjochten fan %{acct} binne fuortsmiten
+        disable: Jo account %{acct} is beferzen
+        mark_statuses_as_sensitive: Dizze berjochten fan %{acct} binne as gefoelich markearre
+        none: Warskôging foar %{acct}
+        sensitive: Berjochten fan %{acct} sille fan no ôf altyd as gefoelich markearre wurde
+        silence: Jo account %{acct} is no beheind
+        suspend: Jo account %{acct} is útsteld
+      title:
+        delete_statuses: Berjochten fuortsmiten
+        disable: Account beferzen
+        mark_statuses_as_sensitive: Berjochten as gefoelich markearre
+        none: Warskôging
+        sensitive: Account as gefoelich markearre
+        silence: Account beheind
+        suspend: Account beskoattele
+    welcome:
+      edit_profile_action: Profyl ynstelle
+      edit_profile_step: Jo kinne jo profyl oanpasse troch in profylfoto op te laden, jo werjeftenamme oan te passen en mear. Jo kinne it hânmjittich goedkarren fan folgers ynstelle.
+      explanation: Hjir binne inkelde tips om jo op wei te helpen
+      final_action: Begjin mei berjochten te pleatsen
+      final_step: 'Begjin berjochten te pleatsen! Sels sûnder folgers kinne jo iepenbiere berjochten troch oaren besjoen wurde, bygelyks op de lokale tiidline en ûnder hashtags. Jo kinne josels foarstelle mei it gebrûk fan de hashtag #introductions.'
+      full_handle: Jo folsleine Mastodon-adres
+      full_handle_hint: Dit jouwe jo oan jo freonen, sadat se jo berjochten stjoere kinne of (fan in oare Mastodon-server ôf) folgje kinne.
+      subject: Wolkom op Mastodon
+      title: Wolkom oan board %{name}!
+  users:
+    follow_limit_reached: Jo kinne net mear as %{limit} accounts folgje
+    invalid_otp_token: Unjildige twa-stapstagongskoade
+    otp_lost_help_html: As jo tagong ta beide kwytrekke binne, nim dan kontakt op fia %{email}
+    seamless_external_login: Jo binne oanmeld fia in eksterne tsjinst, dêrom binne wachtwurden en e-mailynstellingen net beskikber.
+    signed_in_as: 'Oanmeld as:'
+  verification:
+    explanation_html: 'Jo kinne <strong>josels ferifiearje as de eigener fan de keppelingen yn de metadata fan jo profyl</strong>. Hjirfoar moat op de keppele website in keppeling werom nei jo Mastodon-profyl stean. Dizze keppeling <strong>moat</strong> it <code>rel="me"</code>-attribút befetsje. De omskriuwing fan de keppeling makket net út. Hjir is in foarbyld:'
+    verification: Ferifikaasje
   webauthn_credentials:
+    add: Nije befeiligingskaai tafoegje
+    create:
+      error: Der is in probleem bard mei it tafoegjen fan jo befeiligingskaai. Probearje it nochris.
+      success: It tafoegjen fan jo befeiligingskaai is slagge.
     delete: Fuortsmite
+    delete_confirmation: Binne jo wis dat jo dizze befeiligingskaai fuortsmite wolle?
+    description_html: Wannear’t jo <strong>ferifikaasje mei befeiligingskaaien</strong> ynskeakelje, moatte jo wylst it oanmelden ien fan jo befeiligingskaaien brûke.
+    destroy:
+      error: Der wie in probleem by it fuortsmiten fan jo befeiligingskaai. Probearje it nochris.
+      success: Jo befeilingskaai is mei sukses fuortsmiten.
+    invalid_credential: Unjildige befeiligingskaai
+    nickname_hint: Fier de bynamme yn fan jo nije befeiligingskaai
+    not_enabled: Jo hawwe WebAuthn noch net ynskeakele
+    not_supported: Dizze browser stipet gjin befeiligingskaaien
+    otp_required: Om befeiligingskaaien brûke te kinnen, moatte jo earst twa-stapsferifikaasje ynskeakelje.
+    registered_on: Registrearre op %{date}
diff --git a/config/locales/ga.yml b/config/locales/ga.yml
index 90a1323a3..767c9f246 100644
--- a/config/locales/ga.yml
+++ b/config/locales/ga.yml
@@ -66,6 +66,9 @@ ga:
         remote: Cian
       memorialize: Déan cuntas chuimhneacháin de
       memorialized: Cuntas chuimhneacháin
+      moderation:
+        all: Uile
+      perform_full_suspension: Fionraí
       previous_strikes: Cionta roimhe seo
       promote: Ardaigh
       protocol: Prótacal
@@ -81,9 +84,13 @@ ga:
       resubscribe: Athchláraigh
       role: Ról
       search: Cuardaigh
+      security_measures:
+        only_password: Pasfhocal amháin
+      silenced: Teoranta
       statuses: Postálacha
       subscribe: Cláraigh
       title: Cuntais
+      warn: Rabhadh a thabhairt
       web: Gréasán
     action_logs:
       action_types:
@@ -180,6 +187,9 @@ ga:
     settings:
       appearance:
         title: Cuma
+      default_noindex:
+        desc_html: I bhfeidhm do ghach úsáideoir nár athraigh an socrú seo iad féin
+        title: Diúltaigh d'innéacsú inneall cuardaigh mar réamhshocrú d'úsáideoirí
     site_uploads:
       delete: Scrios comhad uaslódáilte
     statuses:
diff --git a/config/locales/gd.yml b/config/locales/gd.yml
index be1dad399..22f87aa49 100644
--- a/config/locales/gd.yml
+++ b/config/locales/gd.yml
@@ -580,7 +580,6 @@ gd:
     report_notes:
       created_msg: Chaidh nòta a chruthachadh dhan ghearan!
       destroyed_msg: Chaidh nòta a’ ghearain a sguabadh às!
-      today_at: An-diugh aig %{time}
     reports:
       account:
         notes:
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index a468d47d8..c14becfbf 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -28,7 +28,7 @@ gl:
       title: Executar acción de moderación a %{acct}
     account_moderation_notes:
       create: Deixar nota
-      created_msg: Nota de moderación creada de xeito correcto!
+      created_msg: Nota de moderación creada correctamente!
       destroyed_msg: Nota de moderación eliminada de xeito correcto!
     accounts:
       add_email_domain_block: Bloquear o dominio do email
@@ -116,6 +116,8 @@ gl:
       redownloaded_msg: Actualizado o perfil de %{username} desde a orixe
       reject: Rexeitar
       rejected_msg: Rexeitada a solicitude de rexistro de %{username}
+      remote_suspension_irreversible: Elimináronse de xeito irreversible os datos desta conta.
+      remote_suspension_reversible_hint_html: Esta conta foi suspendida no seu servidor, e os datos serán totalmente eliminados o %{date}. Ata entón, o servidor remoto pode restablecer a conta sen perder datos. Se desexas eliminar agora mesmo todos os datos da conta, podes facelo aquí embaixo.
       remove_avatar: Eliminar imaxe de perfil
       remove_header: Eliminar cabeceira
       removed_avatar_msg: Eliminado a imaxe de avatar de %{username}
@@ -561,7 +563,6 @@ gl:
     report_notes:
       created_msg: A nota da denuncia creouse de xeito correcto!
       destroyed_msg: A nota da denuncia borrouse de xeito correcto!
-      today_at: Hoxe ás %{time}
     reports:
       account:
         notes:
@@ -704,6 +705,9 @@ gl:
       content_retention:
         preamble: Controla como se gardan en Mastodon os contidos creados polas usuarias.
         title: Retención do contido
+      default_noindex:
+        desc_html: Aféctalle a tódalas usuarias que non cambiaron este axuste elas mesmas
+        title: Por omisión exclúe as usuarias do indexado por servidores de busca
       discovery:
         follow_recommendations: Recomendacións de seguimento
         preamble: Destacar contido interesante é importante para axudar a que as novas usuarias se sintan cómodas se non coñecen a ninguén en Mastodon. Xestiona os diferentes xeitos de promocionar contidos.
@@ -971,6 +975,9 @@ gl:
       email_below_hint_html: Se o enderezo inferior non é correcto, podes cambialo aquí e recibir un correo de confirmación.
       email_settings_hint_html: Enviouse un correo de confirmación a %{email}. Se o enderezo non é correcto podes cambialo nos axustes da conta.
       title: Axustes
+    sign_in:
+      preamble_html: Accede coas túas credenciais en <strong>%{domain}</strong>. Se a túa conta está nun servidor diferente, non podes acceder desde aquí.
+      title: Accede a %{domain}
     sign_up:
       preamble: Cunha conta neste servidor Mastodon poderás seguir a calquera outra persoa na rede, independentemente de onde estivese hospedada esa conta.
       title: Imos crear a túa conta en %{domain}.
@@ -989,9 +996,9 @@ gl:
     error: Desgraciadamente, algo fallou ao buscar a conta remota
     follow: Seguir
     follow_request: 'Enviaches unha petición de seguimento a:'
-    following: 'Parabéns! Está a seguir a:'
+    following: 'Parabéns! Agora segues a:'
     post_follow:
-      close: Ou, pode pechar esta ventá.
+      close: Ou, podes pechar esta ventá.
       return: Mostrar o perfil da usuaria
       web: Ir á web
     title: Seguir %{acct}
@@ -1024,19 +1031,19 @@ gl:
       x_seconds: "%{count}s"
   deletes:
     challenge_not_passed: A información introducida non é correcta
-    confirm_password: Introduza o seu contrasinal para verificar a súa identidade
+    confirm_password: Escribe o contrasinal actual para verificar a túa identidade
     confirm_username: Introduce o nome de usuaria para confirmar o procedemento
     proceed: Eliminar conta
     success_msg: A súa conta eliminouse correctamente
     warning:
-      before: 'Antes de seguir, por favor lé estas notas con atención:'
-      caches: O contido almacenado en outros servidores podería persistir
+      before: 'Antes de continuar, por favor le estas notas con atención:'
+      caches: O contido almacenado noutros servidores podería persistir
       data_removal: As túas publicacións e outros datos serán permanentemente borrados
       email_change_html: Podes <a href="%{path}">cambiar o enderezo de correo</a> sen eliminar a conta
       email_contact_html: Se non o recibes, podes escribir a <a href="mailto:%{email}">%{email}</a> pedindo axuda
       email_reconfirmation_html: Se non recibes o correo de confirmación, podes <a href="%{path}">solicitalo de novo</a>
       irreversible: Non poderás restaurar ou reactivar a conta
-      more_details_html: Para máis detalles, mira a <a href="%{terms_path}">política de intimidade</a>.
+      more_details_html: Para máis detalles, mira a <a href="%{terms_path}">política de privacidade</a>.
       username_available: O nome de usuaria estará dispoñible novamente
       username_unavailable: O nome de usuaria non estará dispoñible
   disputes:
@@ -1260,7 +1267,7 @@ gl:
     set_redirect: Establecer redirección
     warning:
       backreference_required: Tes que configurar primeiro a nova conta para referenciar hacia esta
-      before: 'Antes de seguir, por favor lé estas notas con atención:'
+      before: 'Antes de continuar, por favor le estas notas con atención:'
       cooldown: Tras a migración existe un período de calma durante o cal non poderás volver a migrar de novo
       disabled_account: Tras o cambio a túa conta actual non será totalmente usable, pero terás acceso a exportar os datos e tamén a reactivación.
       followers: Esta acción moverá todas as túas seguidoras desde a conta actual a nova conta
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 25464c335..201d8c45f 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -122,6 +122,8 @@ he:
       redownloaded_msg: הפרופיל של %{username} רוענן בהצלחה מהמקור
       reject: דחויים
       rejected_msg: בקשת ההרשמה של %{username} נדחתה בהצלחה
+      remote_suspension_irreversible: נתוני חשבון זה נמחקו באופן בלתי הפיך.
+      remote_suspension_reversible_hint_html: חשבון זה הושעה ע"י השרת שלו ונתוניו יוסרו במלואם בתאריך %{date}. עד אז יוכל השרת המרוחק לשחזר את החשבון ללא תופעות לוואי שליליות. אם ברצונך להסיר את כל נתוני החשבון באופן מיידי, ניתן לעשות זאת להלן.
       remove_avatar: הסרת תמונת פרופיל
       remove_header: הסרת כותרת
       removed_avatar_msg: תמונת הפרופיל של %{username} הוסרה בהצלחה
@@ -583,7 +585,6 @@ he:
     report_notes:
       created_msg: הערה על דו"ח נוצרה בהצלחה!
       destroyed_msg: הערה על דו"ח נמחקה בהצלחה!
-      today_at: היום, ב%{time}
     reports:
       account:
         notes:
@@ -732,6 +733,9 @@ he:
       content_retention:
         preamble: שליטה על דרך אחסון תוכן המשתמשים במסטודון.
         title: תקופת השמירה של תכנים
+      default_noindex:
+        desc_html: משפיע על כל המשתמשים/ות שלא שינו את ההגדרה הזו בעצמם
+        title: הסתרת משתמשיםות ממנוע החיפוש כברירת המחדל
       discovery:
         follow_recommendations: המלצות מעקב
         preamble: הצפה של תוכן מעניין בקבלת פני משתמשות חדשות שאולי אינן מכירות עדיין א.נשים במסטודון. ניתן לשלוט איך אפשרויות גילוי שונות עובדות על השרת שלך.
@@ -1007,6 +1011,9 @@ he:
       email_below_hint_html: אם כתובת הדוא"ל להלן לא נכונה, ניתן לשנותה כאן ולקבל דוא"ל אישור חדש.
       email_settings_hint_html: דוא"ל האישור נשלח ל-%{email}. אם כתובת הדוא"ל הזו לא נכונה, ניתן לשנותה בהגדרות החשבון.
       title: הגדרות
+    sign_in:
+      preamble_html: הכנס.י עם שם וסיסמא מאתר <strong>%{domain}</strong>. אם חשבונך מתארח בשרת אחר, לא ניתן להתחבר איתו פה.
+      title: התחבר אל %{domain}
     sign_up:
       preamble: כיוון שמסטודון מבוזרת, תוכל/י להשתמש בחשבון שלך משרתי מסטודון או רשתות תואמות אחרות אם אין לך חשבון על שרת זה.
       title: הבה ניצור לך חשבון בשרת %{domain}.
@@ -1705,7 +1712,7 @@ he:
     seamless_external_login: את.ה מחובר דרך שירות חיצוני, לכן אפשרויות הסיסמא והדוא"ל לא מאופשרות.
     signed_in_as: 'מחובר בתור:'
   verification:
-    explanation_html: 'ניתן <strong>לאמת את עצמך כבעלים של הקישורית במטא-נתונים של פרופילך</strong>. כדי לעשות זאת, האתר המקושם חייב להכיל קישורית חוזרת לפרופיל המסטודון שלך. הקישורית החוזרת <strong>חייבת</strong> להכיל תכונת <code>rel="me"</code>. התוכן הטקסטואלי של הקישורית לא משנה. הנה דוגמא:'
+    explanation_html: 'ניתן <strong>לאמת את עצמך כבעלים של הקישורית במטא-נתונים של פרופילך</strong>. כדי לעשות זאת, האתר המקושר חייב להכיל קישורית חוזרת לפרופיל המסטודון שלך. הקישורית החוזרת <strong>חייבת</strong> להכיל תכונת <code>rel="me"</code>. התוכן הטקסטואלי של הקישורית לא משנה. הנה דוגמא:'
     verification: אימות
   webauthn_credentials:
     add: הוספת מפתח אבטחה חדש
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 8e1eb7f15..3cec6e979 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -116,6 +116,8 @@ hu:
       redownloaded_msg: "%{username} profilját sikeresen frissítettük az eredetiből"
       reject: Elutasítás
       rejected_msg: A %{username} fiók regisztrációs kérelmét sikeresen elutasítottuk
+      remote_suspension_irreversible: A fiók adatait véglegesen törölték.
+      remote_suspension_reversible_hint_html: 'A fiókot felfüggesztették a kiszolgálóján, az adatai ekkor lesznek teljesen eltávolítva: %{date}. Eddig az időpontig a távoli kiszolgáló probléma nélkül helyre tudja állítani a fiókot. Ha azonnal törölni szeretnéd a fiók adatait, alább megteheted.'
       remove_avatar: Profilkép eltávolítása
       remove_header: Fejléc törlése
       removed_avatar_msg: A %{username} fiók avatárját sikeresen töröltük
@@ -555,13 +557,12 @@ hu:
       pending: Várakozás a relé jóváhagyására
       save_and_enable: Mentés és engedélyezés
       setup: Relé kapcsolat felállítása
-      signatures_not_enabled: A relék nem fognak jól működni, amíg a biztonságos mód vagy az engedélyező listás mód aktív
+      signatures_not_enabled: A relék nem fognak megfelelően működni, amíg a biztonságos mód vagy a korlátozott föderációs mód engedélyezett
       status: Állapot
       title: Relék
     report_notes:
       created_msg: Bejelentési feljegyzés létrehozva!
       destroyed_msg: Bejelentési feljegyzés törölve!
-      today_at: Ma %{time}-kor
     reports:
       account:
         notes:
@@ -704,6 +705,9 @@ hu:
       content_retention:
         preamble: Felhasználók által generált tartalom Mastodonon való tárolásának szabályozása.
         title: Tartalom megtartása
+      default_noindex:
+        desc_html: Azokat a felhasználókat érinti, akik nem módosították ezt a beállítást
+        title: Alapértelmezetten ne indexeljék a keresők a felhasználókat
       discovery:
         follow_recommendations: Ajánlottak követése
         preamble: Az érdekes tartalmak felszínre hozása fontos szerepet játszik az új felhasználók bevonásában, akik esetleg nem ismerik a Mastodont. Szabályozd, hogy a különböző felfedezési funkciók hogyan működjenek a kiszolgálón.
@@ -971,6 +975,9 @@ hu:
       email_below_hint_html: Ha az alábbi e-mail cím nem megfelelő, itt megváltoztathatod és kaphatsz egy új igazoló e-mailt.
       email_settings_hint_html: A visszaigazoló e-mailt elküldtük ide %{email}. Ha az e-mail cím nem megfelelő, megváltoztathatod a fiókod beállításainál.
       title: Beállítás
+    sign_in:
+      preamble_html: Jelentkezz be a <strong>%{domain}</strong> fiókoddal. Ha másik kiszolgálón található a fiókod, akkor itt nem fogsz tudni belépni.
+      title: Jelentkezz be a %{domain}-ra
     sign_up:
       preamble: Egy fiókkal ezen a Mastodon kiszolgálón követhetsz bárkit a hálózaton, függetlenül attól, hogy az illető fiókja melyik kiszolgálón található.
       title: Állítsuk be a fiókod a %{domain} kiszolgálón.
diff --git a/config/locales/hy.yml b/config/locales/hy.yml
index ca2598b14..5cd6d53a3 100644
--- a/config/locales/hy.yml
+++ b/config/locales/hy.yml
@@ -335,8 +335,6 @@ hy:
       save_and_enable: Պահպանել եւ միացնել
       status: Կարգավիճակ
       title: Վերահեռարձակիչներ
-    report_notes:
-      today_at: Այսօր ժամը %{time}-ին
     reports:
       account:
         notes:
diff --git a/config/locales/id.yml b/config/locales/id.yml
index a6965cdbd..70c65081d 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -113,6 +113,7 @@ id:
       redownloaded_msg: Berhasil menyegarkan profil %{username} dari asal
       reject: Tolak
       rejected_msg: Berhasil menolak permintaan pendaftaran %{username}
+      remote_suspension_irreversible: Data akun ini telah dihapus permanen.
       remove_avatar: Hapus avatar
       remove_header: Hapus header
       removed_avatar_msg: Berhasil menghapus gambar avatar %{username}
@@ -550,7 +551,6 @@ id:
     report_notes:
       created_msg: Catatan laporan berhasil dibuat!
       destroyed_msg: Catatan laporan berhasil dihapus!
-      today_at: Hari ini pada %{time}
     reports:
       account:
         notes:
@@ -690,6 +690,9 @@ id:
       content_retention:
         preamble: Atur bagaimana konten yang dibuat oleh pengguna disimpan di Mastodon.
         title: Retensi konten
+      default_noindex:
+        desc_html: Memengaruhi semua pengguna yang belum mengubah pengaturan ini sendiri
+        title: Keluarkan pengguna dari pengindeksan mesin telusur secara bawaan
       discovery:
         follow_recommendations: Ikuti rekomendasi
         preamble: Menampilkan konten menarik penting dalam memandu pengguna baru yang mungkin tidak tahu siapa pun di Mastodon. Atur bagaimana berbagai fitur penemuan bekerja di server Anda.
@@ -953,6 +956,8 @@ id:
       email_below_hint_html: Jika alamat email di bawah tidak benar, Anda dapat menggantinya di sini dan menerima email konfirmasi baru.
       email_settings_hint_html: Email konfirmasi telah dikirim ke %{email}. Jika alamat email tidak benar, Anda dapat mengubahnya di pengaturan akun.
       title: Atur
+    sign_in:
+      title: Masuk ke %{domain}
     sign_up:
       preamble: Dengan sebuah akun di server Mastodon ini, Anda akan dapat mengikuti orang lain dalam jaringan, di mana pun akun mereka berada.
       title: Mari kita siapkan Anda di %{domain}.
diff --git a/config/locales/io.yml b/config/locales/io.yml
index 7dc54986e..3f18bf7fc 100644
--- a/config/locales/io.yml
+++ b/config/locales/io.yml
@@ -370,6 +370,8 @@ io:
       add_new: Permisez federato kun domeno
       created_msg: Domeno sucesoza permisesas por federato
       destroyed_msg: Domeno despermisesas de federato
+      export: Exportez
+      import: Importez
       undo: Despermisez federato kun domeno
     domain_blocks:
       add_new: Add new
@@ -379,13 +381,18 @@ io:
       edit: Modifikez domenobstrukto
       existing_domain_block: Vu ja exekutis plu rigoroza limiti a %{name}.
       existing_domain_block_html: Vu ja povis plu rigoroza limiti a %{name}, vu bezonas <a href="%{unblock_url}">deobstruktar</a> unesme.
+      export: Exportez
+      import: Importez
       new:
         create: Kreez obstrukto
         hint: Domenobstrukto ne preventos kreo di kontrekordaji en datumaturo, ma retroaktive e automate aplikos partikulara jermetodi a ta konti.
         severity:
           noop: Nulo
+          silence: Limito
           suspend: Restriktez
         title: Nova domenobstrukto
+      no_domain_block_selected: Nula domenobstrukti ne chanjesis por ke nulo selektesis
+      not_permitted: Vu ne permisesis agar co
       obfuscate: Nedicernebligez domennomo
       obfuscate_hint: Partala nedicernebligez domennomo en listo se reklamo di listo di domenlimito aktivigesas
       private_comment: Privata komento
@@ -536,7 +543,6 @@ io:
     report_notes:
       created_msg: Raportnoto sucesoze kreesis!
       destroyed_msg: Raportnoto sucesoze efacesis!
-      today_at: Hodie en %{time}
     reports:
       account:
         notes:
@@ -1231,6 +1237,8 @@ io:
     carry_blocks_over_text: Ca uzanti transferesis de %{acct} quon vu restriktis.
     carry_mutes_over_text: Ca uzanti transferesis de %{acct} quon vu silencigis.
     copy_account_note_text: 'Ca uzanti transferesis de %{acct}, co esas vua antea noti pri ol:'
+  navigation:
+    toggle_menu: Baskulez menuo
   notification_mailer:
     admin:
       report:
@@ -1350,6 +1358,7 @@ io:
     browser: Vidilo
     browsers:
       alipay: Alipay
+      blackberry: BlackBerry
       chrome: Chrome
       edge: Microsoft Edge
       electron: Electron
@@ -1363,6 +1372,7 @@ io:
       phantom_js: PhantomJS
       qq: Vidilo QQ
       safari: Safari
+      uc_browser: UC Browser
       weibo: Weibo
     current_session: Nuna sesiono
     description: "%{browser} che %{platform}"
@@ -1371,6 +1381,8 @@ io:
     platforms:
       adobe_air: Adobe Air
       android: Android
+      blackberry: BlackBerry
+      chrome_os: ChromeOS
       firefox_os: Firefox OS
       ios: iOS
       linux: Linux
diff --git a/config/locales/is.yml b/config/locales/is.yml
index cd0a5a2b1..d08d8c6a7 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -116,6 +116,8 @@ is:
       redownloaded_msg: Tókst að endurlesa notandasnið %{username} úr upphaflegu sniði
       reject: Hafna
       rejected_msg: Tókst að hafna skráningu fyrir %{username}
+      remote_suspension_irreversible: Gögnum þessa notandaaðgangs hefur verið eytt óafturkvæmt.
+      remote_suspension_reversible_hint_html: Notandaaðgangurinn hefur verið settur í frysti á hinum netþjóninum og gögnunum á honum verður eytt að fullu þann %{date}. Þangað til gæti hinn netþjóninn endurheimt aðganginn úr frysti án nokkurra breytinga. Ef þú vilt eyða öllum gögnum af honum strax, geturðu gert það hér fyrir neðan.
       remove_avatar: Fjarlægja auðkennismynd
       remove_header: Fjarlægja haus
       removed_avatar_msg: Tókst að fjarlægja auðkennismynd notandans %{username}
@@ -561,7 +563,6 @@ is:
     report_notes:
       created_msg: Tókst að útbúa minnispunkt skýrslu!
       destroyed_msg: Tókst að eyða minnispunkti skýrslu!
-      today_at: Í dag kl. %{time}
     reports:
       account:
         notes:
@@ -704,6 +705,9 @@ is:
       content_retention:
         preamble: Stýrðu hvernig efni frá notendum sé geymt í Mastodon.
         title: Geymsla efnis
+      default_noindex:
+        desc_html: Hefur áhrif á alla þá notendur sem ekki hafa breytt þessum stillingum sjálfir
+        title: Sjálfgefið láta notendur afþakka atriðaskráningu í leitarvélum
       discovery:
         follow_recommendations: Meðmæli um að fylgjast með
         preamble: Að láta áhugavert efni koma skýrt fram er sérstaklega mikilvægt til að nálgast nýja notendur sem ekki þekkja neinn sem er á Mastodon. Stýrðu því hvernig hinir ýmsu eiginleikar við uppgötvun efnis virka á netþjóninum þínum.
@@ -971,6 +975,9 @@ is:
       email_below_hint_html: Ef tölvupóstfangið hér fyrir neðan er rangt, skaltu breyta því hér og fá nýjan staðfestingarpóst.
       email_settings_hint_html: Staðfestingarpósturinn var sendur til %{email}. Ef það tölvupóstfang er ekki rétt geturðu breytt því í stillingum notandaaðgangsins.
       title: Uppsetning
+    sign_in:
+      preamble_html: Skráðu þig inn með auðkennum þínum fyrir <strong>%{domain}</strong>. Ef aðgangurinn þinn er hýstur á öðrum netþjóni, muntu ekki geta skráð þig inn hér.
+      title: Skrá inn á %{domain}
     sign_up:
       preamble: Með notandaaðgangi á þessum Mastodon-þjóni geturðu fylgst með hverjum sem er á netkerfinu, sama hvar notandaaðgangurinn þeirra er hýstur.
       title: Förum núna að setja þig upp á %{domain}.
diff --git a/config/locales/it.yml b/config/locales/it.yml
index b0e911f7f..59d9f910a 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -116,6 +116,8 @@ it:
       redownloaded_msg: Il profilo di %{username} è stato aggiornato correttamente dall'origine
       reject: Rifiuta
       rejected_msg: Richiesta d'iscrizione di %{username} rifiutata correttamente
+      remote_suspension_irreversible: I dati di questo account sono stati cancellati in modo irreversibile.
+      remote_suspension_reversible_hint_html: L'account è stato sospeso sul loro server e i dati saranno completamente eliminati il %{date}. Fino ad allora, il server remoto può ripristinare questo account senza effetti negativi. Se si desidera eliminare immediatamente tutti i dati dell'account, è possibile farlo qui sotto.
       remove_avatar: Rimuovi l'avatar
       remove_header: Rimuovi l'intestazione
       removed_avatar_msg: Immagine dell'avatar di %{username} rimossa correttamente
@@ -561,7 +563,6 @@ it:
     report_notes:
       created_msg: Nota rapporto creata!
       destroyed_msg: Nota rapporto cancellata!
-      today_at: Oggi alle %{time}
     reports:
       account:
         notes:
@@ -704,6 +705,9 @@ it:
       content_retention:
         preamble: Controlla come vengono memorizzati i contenuti generati dall'utente in Mastodon.
         title: Conservazione dei contenuti
+      default_noindex:
+        desc_html: Interessa tutti gli utenti che non hanno modificato personalmente questa impostazione
+        title: Esclude gli utenti dall'indicizzazione dei motori di ricerca per impostazione predefinita
       discovery:
         follow_recommendations: Segui le raccomandazioni
         preamble: La comparsa di contenuti interessanti è determinante per l'arrivo di nuovi utenti che potrebbero non conoscere nessuno su Mastodon. Controlla in che modo varie funzionalità di scoperta funzionano sul tuo server.
@@ -973,6 +977,9 @@ it:
       email_below_hint_html: Se l'indirizzo e-mail sottostante non è corretto, puoi cambiarlo qui e ricevere una nuova e-mail di conferma.
       email_settings_hint_html: L'email di conferma è stata inviata a %{email}. Se l'indirizzo e-mail non è corretto, puoi modificarlo nelle impostazioni dell'account.
       title: Configurazione
+    sign_in:
+      preamble_html: Accedi con le tue credenziali <strong>%{domain}</strong>. Se il tuo account si trova su un server diverso, non potrai accedere qui.
+      title: Accedi a %{domain}
     sign_up:
       preamble: Con un account su questo server Mastodon, sarai in grado di seguire qualsiasi altra persona sulla rete, indipendentemente da dove sia ospitato il suo account.
       title: Lascia che ti configuriamo su %{domain}.
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 271257e27..39d6a6d70 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -113,6 +113,8 @@ ja:
       redownloaded_msg: "%{username}のプロフィールを正常に更新しました"
       reject: 却下
       rejected_msg: "%{username}さんの登録申請を却下しました"
+      remote_suspension_irreversible: このアカウントのデータは不可逆的に削除されました。
+      remote_suspension_reversible_hint_html: このアカウントは停止されており、データは%{date} 日で完全に削除されます。それまでは悪影響なしにアカウントを復旧させることができます。アカウントを即座に削除したい場合は、以下から行うことができます。
       remove_avatar: アイコンを削除
       remove_header: ヘッダーを削除
       removed_avatar_msg: "%{username}さんのアバター画像を削除しました"
@@ -383,6 +385,7 @@ ja:
         create: ブロックを作成
         hint: ドメインブロックはデータベース中のアカウント項目の作成を妨げませんが、遡って自動的に指定されたモデレーションをそれらのアカウントに適用します。
         severity:
+          desc_html: "<strong></strong>はこのドメインでのアカウントの投稿をフォローしていない人から隠します。<strong>停止</strong>はこのドメインでのアカウントのコンテンツ、メディア、プロフィールデータをサーバーから削除します。メディアファイルのみを拒否したい場合は<strong>なし</strong>を選択します。"
           noop: なし
           silence: 制限
           suspend: 停止
@@ -420,10 +423,14 @@ ja:
       resolved_through_html: "%{domain}を通して解決しました"
       title: メールドメインブロック
     export_domain_allows:
+      new:
+        title: ドメイン許可をインポート
       no_file: ファイルが選択されていません
     export_domain_blocks:
       import:
+        description_html: ドメインブロックのリストをインポートしようとしています。このリストを自分で作成していない場合は、慎重に確認してください。
         existing_relationships_warning: 既存のフォロー関係
+        private_comment_description_html: インポートされたブロックがどこから来たのかを追跡するため、インポートされたブロックは次のプライベートコメントを追加して作成されます:<q>%{comment}</q>
         private_comment_template: "%{source} から %{date} にインポートしました"
         title: ドメインブロックをインポート
       new:
@@ -545,7 +552,6 @@ ja:
     report_notes:
       created_msg: 通報メモを書き込みました!
       destroyed_msg: 通報メモを削除しました!
-      today_at: 今日 %{time}
     reports:
       account:
         notes:
@@ -685,6 +691,9 @@ ja:
       content_retention:
         preamble: ユーザーが生成したコンテンツがどのように Mastodon に保存されるかを管理します。
         title: コンテンツの保持
+      default_noindex:
+        desc_html: この設定を自分で変更していない全ユーザーに影響します
+        title: デフォルトで検索エンジンによるインデックスを拒否する
       discovery:
         follow_recommendations: おすすめフォロー
         preamble: Mastodon を知らないユーザーを取り込むには、興味深いコンテンツを浮上させることが重要です。サーバー上で様々なディスカバリー機能がどのように機能するかを制御します。
@@ -948,6 +957,8 @@ ja:
       email_below_hint_html: 下記のメールアドレスが間違っている場合、ここで変更することで新たに確認メールを受信できます。
       email_settings_hint_html: 確認用のメールを%{email}に送信しました。メールアドレスが正しくない場合、以下より変更することができます。
       title: セットアップ
+    sign_in:
+      title: "%{domain}にログイン"
     sign_up:
       preamble: この Mastodon サーバーのアカウントがあれば、ネットワーク上の他の人のアカウントがどこでホストされているかに関係なく、その人をフォローすることができます。
       title: さあ %{domain} でセットアップしましょう.
diff --git a/config/locales/kab.yml b/config/locales/kab.yml
index 7dd8bcabd..d2a96d41f 100644
--- a/config/locales/kab.yml
+++ b/config/locales/kab.yml
@@ -344,8 +344,6 @@ kab:
       save_and_enable: Sekles rnu rmed-it
       status: Addad
       title: Imnegliyen
-    report_notes:
-      today_at: Ass-a ɣef %{time}
     reports:
       account:
         notes:
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index af8ba5657..a320723bf 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -30,7 +30,7 @@ ko:
       destroyed_msg: 중재 기록이 성공적으로 삭제되었습니다!
     accounts:
       add_email_domain_block: 이 이메일 도메인을 차단하기
-      approve: 승인
+      approve: 허가
       approved_msg: 성공적으로 %{username}의 가입 신청서를 승인했습니다
       are_you_sure: 정말로 실행하시겠습니까?
       avatar: 아바타
@@ -47,7 +47,7 @@ ko:
         label: 역할 변경
         no_role: 역할 없음
         title: "%{username}의 역할 변경"
-      confirm: 확인
+      confirm: 확정
       confirmed: 확인됨
       confirming: 확인 중
       custom: 사용자 지정
@@ -94,7 +94,7 @@ ko:
         suspended: 정지 중
         title: 중재
       moderation_notes: 중재 기록
-      most_recent_activity: 최근 활동순
+      most_recent_activity: 최근 활동
       most_recent_ip: 최근 IP
       no_account_selected: 아무 것도 선택 되지 않아 어떤 계정도 변경 되지 않았습니다
       no_limits_imposed: 제한 없음
@@ -113,6 +113,8 @@ ko:
       redownloaded_msg: 성공적으로 %{username}의 프로필을 원본으로부터 업데이트 하였습니다
       reject: 거부
       rejected_msg: 성공적으로 %{username}의 가입 신청서를 반려하였습니다
+      remote_suspension_irreversible: 이 계정의 데이터는 되돌릴 수 없도록 삭제되었습니다.
+      remote_suspension_reversible_hint_html: 이 계정은 계정이 속한 서버에서 정지되었습니다, 그리고 %{date}에 데이터가 완전히 삭제될 것입니다. 그 때까지는 해당 서버에서 계정을 그대로 복구할 수 있습니다. 만약 지금 당장 이 계정의 모든 데이터를 삭제하고 싶다면, 아래에서 실행할 수 있습니다.
       remove_avatar: 아바타 지우기
       remove_header: 헤더 삭제
       removed_avatar_msg: 성공적으로 %{username}의 아바타 이미지를 삭제하였습니다
@@ -416,7 +418,7 @@ ko:
       domain: 도메인
       new:
         create: 차단 규칙 생성
-        resolve: 도메인 해결
+        resolve: 도메인 검사
         title: 새 이메일 도메인 차단
       no_email_domain_block_selected: 아무 것도 선택 되지 않아 어떤 이메일 도메인 차단도 변경되지 않았습니다
       resolved_dns_records_hint_html: 도메인 네임은 다음의 MX 도메인으로 연결되어 있으며, 이메일을 받는데 필수적입니다. MX 도메인을 차단하면 같은 MX 도메인을 사용하는 어떤 이메일이라도 가입할 수 없게 되며, 보여지는 도메인이 다르더라도 적용됩니다. <strong>주요 이메일 제공자를 차단하지 않도록 조심하세요.</strong>
@@ -552,7 +554,6 @@ ko:
     report_notes:
       created_msg: 신고 기록이 성공적으로 작성되었습니다!
       destroyed_msg: 신고 기록이 성공적으로 삭제되었습니다!
-      today_at: 오늘 %{time}
     reports:
       account:
         notes:
@@ -692,6 +693,9 @@ ko:
       content_retention:
         preamble: 마스토돈에 저장된 사용자 콘텐츠를 어떻게 다룰지 제어합니다.
         title: 콘텐츠 보존기한
+      default_noindex:
+        desc_html: 이 설정을 개인적으로 바꾸지 않은 모든 사용자들에게 적용 됩니다
+        title: 사용자들이 기본적으로 검색엔진에 인덱싱되지 않도록 합니다
       discovery:
         follow_recommendations: 팔로우 추천
         preamble: 흥미로운 콘텐츠를 노출하는 것은 마스토돈을 알지 못할 수도 있는 신규 사용자를 유입시키는 데 중요합니다. 이 서버에서 작동하는 다양한 발견하기 기능을 제어합니다.
@@ -955,6 +959,9 @@ ko:
       email_below_hint_html: 아래의 이메일 계정이 올바르지 않을 경우, 여기서 변경하고 새 확인 메일을 받을 수 있습니다.
       email_settings_hint_html: 확인 메일이 %{email}로 보내졌습니다. 이메일 주소가 올바르지 않은 경우, 계정 설정에서 변경하세요.
       title: 설정
+    sign_in:
+      preamble_html: "<strong>%{domain}</strong>의 계정 정보를 이용해 로그인 하세요. 만약 내 계정이 다른 서버에 존재한다면, 여기서는 로그인 할 수 없습니다."
+      title: "%{domain}에 로그인"
     sign_up:
       preamble: 이 마스토돈 서버의 계정을 통해, 네트워크에 속한 다른 사람들을, 그들이 어떤 서버에 있든 팔로우 할 수 있습니다.
       title: "%{domain}에 가입하기 위한 정보들을 입력하세요."
@@ -1336,6 +1343,9 @@ ko:
       unrecognized_emoji: 인식 되지 않은 에모지입니다
   relationships:
     activity: 계정 활동
+    confirm_follow_selected_followers: 정말로 선택된 팔로워들을 팔로우 하시겠습니까?
+    confirm_remove_selected_followers: 정말로 선택된 팔로워들을 삭제하시겠습니까?
+    confirm_remove_selected_follows: 정말로 선택된 팔로우를 끊으시겠습니까?
     dormant: 휴면
     follow_selected_followers: 선택한 팔로워들을 팔로우
     followers: 팔로워
@@ -1398,7 +1408,7 @@ ko:
       firefox_os: 파이어폭스OS
       ios: iOS
       linux: 리눅스
-      mac: 맥OS
+      mac: macOS
       other: 알 수 없는 플랫폼
       windows: 윈도우
       windows_mobile: 윈도우 모바일
diff --git a/config/locales/ku.yml b/config/locales/ku.yml
index 453bc839b..ccee57b42 100644
--- a/config/locales/ku.yml
+++ b/config/locales/ku.yml
@@ -116,6 +116,8 @@ ku:
       redownloaded_msg: Bi serkeftî profîla %{username} ji kokê va hat nûve kirin
       reject: Nepejirîne
       rejected_msg: Tomarkirina %{username} bi awayekî serkeftî nehate pejirandin
+      remote_suspension_irreversible: Daneyên vê ajimêrê bi awayekî bê veger hatine jêbirin.
+      remote_suspension_reversible_hint_html: Ajimêr hate rawestandin li ser rajekarê wan, û daneyên di %{date} de wê hemû werin rakirin. Heya vê demê, ajimêr bêyî bandorên nebaş dikare dîsa vegere. Ku tu dixwazî hemû daneyan ajimêrê niha rakî, tu dikarî li jêrê bikî.
       remove_avatar: Avatarê rake
       remove_header: Sernavê rake
       removed_avatar_msg: Wêneyê %{username} bi awayekî serkeftî hate rakirin
@@ -148,7 +150,7 @@ ku:
       suspend: Hatiye rawestandin
       suspended: Hatiye rawestandin
       suspension_irreversible: Daneyên vê ajimêrê bêveger hatine jêbirin. Tu dikarî ajimêra xwe ji rawestandinê vegerinî da ku ew bi kar bînî lê ew ê tu daneya ku berê hebû venegere.
-      suspension_reversible_hint_html: Ajimêr hat qerisandin, û daneyên di %{date} de hemû were rakirin. Hetta vê demê, ajimêr bê bandorên nebaş dikare dîsa vegere. Heke tu dixwazî hemû daneyan ajimêrê niha rakî, tu dikarî li jêrê bikî.
+      suspension_reversible_hint_html: Ajimêr hate rawestandin, û daneyên di %{date} de wê hemû werin rakirin. Heya vê demê, ajimêr bêyî bandorên nebaş dikare dîsa vegere. Ku tu dixwazî hemû daneyan ajimêrê niha rakî, tu dikarî li jêrê bikî.
       title: Ajimêr
       unblock_email: Astengiyê li ser navnîşana e-nameyê rake
       unblocked_email_msg: Bi serkeftî astengiya li ser navnîşana e-nameyê %{username} hate rakirin
@@ -563,7 +565,6 @@ ku:
     report_notes:
       created_msg: Nîşeyê ragihandinê bi awayekî serkeftî pêk hat!
       destroyed_msg: Nîşeyê ragihandinê bi awayekî serkeftî hate jêbirin!
-      today_at: Îro di %{time} de
     reports:
       account:
         notes:
@@ -706,6 +707,9 @@ ku:
       content_retention:
         preamble: Kontrol bike ka naveroka ku ji aliyê bikarhêner ve hatiye çêkirin di Mastodon de çawa tê tomarkirin.
         title: Parastina naverokê
+      default_noindex:
+        desc_html: Bandorê li ser hemû bikarhênerên ku bi xwe ev sazkarî neguhertine
+        title: Pêlrêçkirna bikarhêneran ji motorê lêgerînê dûr bixe
       discovery:
         follow_recommendations: Pêşniyarên şopandinê
         preamble: Rûbirûbûna naveroka balkêş ji bo bikarhênerên nû yên ku li ser Mastodon kesek nas nakin pir bi bandor e. Kontrol bike ka çend taybetmendiyên vekolînê li ser rajekarê te çawa dixebite.
@@ -907,7 +911,7 @@ ku:
     created_msg: Bi serkeftî nûçikê nû hat çêkirin. Tu niha dikarî di ajimêrê xwe kevn bar bikî.
     deleted_msg: Nûçik bi serkeftî hat rakirin. Êdî nepêkan e vê ajimêrê de barkirina ajimêrek din.
     empty: Nûçikên te tune ne.
-    hint_html: Heke tu dixwazî ji ajimêreke din bar bike bo yekî din, li vir tu dikarî bernavekê biafirîne, ku pêdivî ye berî ku tu bi şopandina şopînerên xwe ji ajimêra kevn ber bi vê yekê biçe. Ev çalakî bi serê xwe <strong>bê ziyan û vegere</strong>.<strong>Koçberiya ajimêr ji ajimêreke kevin dest pê dike</strong>.
+    hint_html: Ku tu dixwazî ji ajimêreke din bar bike bo yekî din, li vir tu dikarî bernavekê biafirîne, ku pêdivî ye berî ku tu bi şopandina şopînerên xwe ji ajimêra kevn ber bi vê yekê biçe. Ev çalakî bi serê xwe <strong>bê ziyan û vegere</strong>.<strong>Koçberiya ajimêr ji ajimêreke kevin dest pê dike</strong>.
     remove: Girêdana nûçikê rake
   appearance:
     advanced_web_interface: Navrûya tevnê yê pêşketî
@@ -939,11 +943,11 @@ ku:
     apply_for_account: Ajimêrekê bixwaze
     change_password: Borînpeyv
     delete_account: Ajimêr jê bibe
-    delete_account_html: Heke tu dixwazî ajimêra xwe jê bibe, tu dikarî <a href="%{path}">li vir bidomîne</a>. Ji te tê xwestin ku were pejirandin.
+    delete_account_html: Ku tu dixwazî ajimêra xwe jê bibe, tu dikarî <a href="%{path}">li vir bidomîne</a>. Ji te tê xwestin ku were pejirandin.
     description:
       prefix_invited_by_user: "@%{name} te vedixwîne ku tu beşdarî vê rajekara Mastodon-ê bibî!"
       prefix_sign_up: Îro li Mastodonê tomar bibe!
-      suffix: Bi ajimêrekê, tu yê karibî kesan bişopînî, rojanekirinan bişînî û bi bikarhênerên ji her rajekarê Mastodon re peyaman bişînî û bêhtir!
+      suffix: Bi ajimêrekê, tu yê karibî kesan bişopînî, rojanekirinan bişînî û bi bikarhênerên ji her rajekarê Mastodon re peyaman bişînî û bêtir!
     didnt_get_confirmation: Te rêwerzên pejirandinê wernegirt?
     dont_have_your_security_key: Kilîda te ya ewlehiyê tune ye?
     forgot_password: Te borînpeyva xwe ji bîr kir?
@@ -954,7 +958,7 @@ ku:
     login: Têkeve
     logout: Derkeve
     migrate_account: Livandin bo ajimêreke din
-    migrate_account_html: Heke tu dixwazî ev ajimêr li ajimêreke cuda beralî bikî, tu dikarî <a href="%{path}">ji vir de saz bike</a>.
+    migrate_account_html: Ku tu dixwazî ev ajimêr li ajimêreke cuda beralî bikî, tu dikarî <a href="%{path}">ji vir de saz bike</a>.
     or_log_in_with: An têketinê bike bi riya
     privacy_policy_agreement_html: Min <a href="%{privacy_policy_path}" target="_blank">Politîka taybetiyê</a> xwend û dipejirînim
     providers:
@@ -970,9 +974,12 @@ ku:
     security: Ewlehî
     set_new_password: Borînpeyveke nû ji nû ve saz bike
     setup:
-      email_below_hint_html: Heke navnîşana e-nameya jêrîn ne rast be, tu dikarî wê li vir biguherîne û e-nameyeke pejirandinê ya nû bistîne.
-      email_settings_hint_html: E-nameya pejirandinê ji %{email} re hate şandin. Heke ew navnîşana e-nameyê ne rast be, tu dikarî wê di sazkariyên ajimêr de biguherîne.
+      email_below_hint_html: Ku navnîşana e-nameya jêrîn ne rast be, tu dikarî wê li vir biguherîne û e-nameyeke pejirandinê ya nû bistîne.
+      email_settings_hint_html: E-nameya pejirandinê ji %{email} re hate şandin. Ku ew navnîşana e-nameyê ne rast be, tu dikarî wê di sazkariyên ajimêr de biguherîne.
       title: Damezirandin
+    sign_in:
+      preamble_html: Têketinê bike bi riya <strong>%{domain}</strong> xwe. Ku ajimêrê te li ser rajekareke cuda hatiye pêşkêşkirin, tu yê nikaribû têketinê bikî vir.
+      title: Têkeve %{domain}
     sign_up:
       preamble: Bi ajimêrekê li ser vê rajekarê Mastodon re, tu yê karîbî her keseke din li ser torê bişopînî, her ku ajimêrê wan li ku derê tê pêşkêşkirin.
       title: Ka em te bi rê bixin li ser %{domain}.
@@ -980,7 +987,7 @@ ku:
       account_status: Rewşa ajimêr
       confirming: Li benda pejirandina e-nameyê ne da ku biqede.
       functional: Ajimêra te êdî amade ye.
-      pending: Daxwaza te li benda vekolînê ji hêla xebatkarên me ye. Ev dibe ku hinek dem bigire. Heke daxwaza te were pejirandin tu yê e-nameyekê bistîne.
+      pending: Daxwaza te li benda vekolînê ji hêla xebatkarên me ye. Ev dibe ku hinek dem bigire. Ku daxwaza te were pejirandin tu yê e-nameyekê bistîne.
       redirecting_to: Ajimêra te neçalak e ji ber ku niha ber bi %{acct} ve tê beralîkirin.
       view_strikes: Binpêkirinên berê yên dijî ajimêrê xwe bibîne
     too_fast: Form pir zû hat şandin, dîsa biceribîne.
@@ -1035,10 +1042,10 @@ ku:
       caches: Naveroka ku ji hêla rajekarên din ve hatiye pêşbîrkirin dibe ku bimîne
       data_removal: Şandiyên te û daneyên din wê bi awayekî dawî bêne rakirin
       email_change_html: Tu dikarî navnîşana <a href="%{path}"> e-nameya xwe biguherînî </a> bêyî ku tu ajimêra xwe jê bibî
-      email_contact_html: Heke ew hîn jî negihîştiye, tu dikarî ji bo alîkariyê <a href="mailto:%{email}">%{email}</a> e-nameyê bişînî
-      email_reconfirmation_html: Heke te e-nameya pejirandinê nesitand, tu dikarî <a href="%{path}">dîsa daxwaz bike</a>
+      email_contact_html: Ku ew hîn jî negihîştiye, tu dikarî ji bo alîkariyê <a href="mailto:%{email}">%{email}</a> e-nameyê bişînî
+      email_reconfirmation_html: Ku te e-nameya pejirandinê nesitand, tu dikarî <a href="%{path}">dîsa daxwaz bike</a>
       irreversible: Tu yê nikaribe ajimêra xwe serrast bike an ji nû ve çalak bike
-      more_details_html: Bo bêhtir zanyarî, <a href="%{terms_path}">polîtika nihêniyê</a> binêre.
+      more_details_html: Bo bêtir zanyarî, <a href="%{terms_path}">polîtika taybetiyê</a> binêre.
       username_available: Navê bikarhêneriyê te wê dîsa peyda bibe
       username_unavailable: Navê bikarhêneriyê ye wê tuneyî bimîne
   disputes:
@@ -1327,10 +1334,10 @@ ku:
           trillion: Trîlyon
   otp_authentication:
     code_hint: Ji bo pejirandinê têkeve koda te ya ku ji alîyê sepana piştraskirinê va hatiye çê kirin
-    description_html: Heke tu<strong>bi piştrastkirina du-faktorî re</strong> sepana piştrastkirinê çalak bikî, ji bo têketinê hewceye telefona te li ba te be, ji bona têketinê te ra nîşaneyan çê bike.
+    description_html: Ku tu<strong>bi piştrastkirina du-gavî re</strong> sepana piştrastkirinê çalak bikî, ji bo têketinê pêdivî heye ku telefona te li ba te be, ji bona têketinê te ra nîşaneyan çê bike.
     enable: Çalak bike
     instructions_html: "<strong>Vê kodê QR kontrol bike bi riya Google Authenticator an jî sepanekeTOTP li ser têlefona xwe </strong>. Ji niha û pê ve, ew sepan dê nîşanên ku divê tu binivîsîne dema têketinê de biafirîne."
-    manual_instructions: 'Heke tu nikarî bî koda QR venêrî û pêwîst be bi dest bikevî, ev nivîsê hêsan ê veşartî:'
+    manual_instructions: 'Ku tu nikarî bî koda QR venêrî û pêwîst be bi dest bikevî, ev nivîsê hêsan ê veşartî:'
     setup: Saz bike
     wrong_code: Koda têketinê betal e! Dema rajekarê û dema amûrê raste?
   pagination:
@@ -1349,7 +1356,7 @@ ku:
       invalid_choice: Vebijarka dengdanê ya bijartî tune
       over_character_limit: her yek ji %{max} karakterê dirêjtirîn nabe
       too_few_options: divê ji yekî zêdetir tişt hebin
-      too_many_options: nikare ji %{max} hêmanan bêhtir pêk bê
+      too_many_options: nikare ji %{max} hêmanan bêtir pêk be
   preferences:
     other: Yên din
     posting_defaults: Berdestên şandiyê
@@ -1524,7 +1531,7 @@ ku:
     keep_polls: Rapirsîyan veşêre
     keep_polls_hint: Yek ji rapirsiyên te jê nabe
     keep_self_bookmark: Şandiyên ku wek şûnpel hatine tevlêkirin veşêre
-    keep_self_bookmark_hint: Şandî heke te wek şûnpel tomar kiriye we neyê jêbirin
+    keep_self_bookmark_hint: Şandî ku te wek şûnpel tomar kiriye wê neyê jêbirin
     keep_self_fav: Şandiyên ku te eciband veşêre
     keep_self_fav_hint: Ger te şandiyên xwe ecibandibe jê nabe
     min_age:
@@ -1567,12 +1574,12 @@ ku:
     enabled: Rastandina du-gavî bi serfirazî hate çalak kirin
     enabled_success: Rastandina du-gavî bi serfirazî hate çalak kirin
     generate_recovery_codes: Kodên xilaskirinê çêbike
-    lost_recovery_codes: Ku telefon winda bibe kodên xilaskirinê derfet dide ku tu bigihijî ajimêra xwe. Heke te kodên xwe yê xilaskirinê winda kiribe tu dikarî ji vê derê dîsa ava bikî. Kodên te yê xilaskirinê ên kevin wê nederbasdar bibe.
+    lost_recovery_codes: Ku telefon winda bibe kodên xilaskirinê derfet dide ku tu bigihijî ajimêra xwe. Ku te kodên xwe yê xilaskirinê winda kiribe tu dikarî ji vê derê dîsa ava bikî. Kodên te yê xilaskirinê ên kevin wê nederbasdar bibe.
     methods: Rêbazên du-gavî
     otp: Sepana Authenticator
     recovery_codes: Kilîtên rizgarbûna hilanînê
     recovery_codes_regenerated: Kilîtên rizgarbûna bi serkeftî hate nûvkirin
-    recovery_instructions_html: Heke gava te têlefona xwe winda kir, tu dikarî yek ji kodên rizgarkirinê yên jêrîn bi kar bîne da ku tu bigihîjî ajimêra xwe. <strong>Kodên rizgarkirinê li cihekî ewle biparêze </strong>. Mînakî, tu dikarî wan çap bikî û wan bi peldandkên din ên girîng re tomar bike.
+    recovery_instructions_html: Ku gava te têlefona xwe winda kir, tu dikarî yek ji kodên rizgarkirinê yên jêrîn bi kar bîne da ku tu bigihîjî ajimêra xwe. <strong>Kodên rizgarkirinê li cihekî ewle biparêze </strong>. Mînakî, tu dikarî wan çap bikî û wan bi peldandkên din ên girîng re tomar bike.
     webauthn: Kilîdên ewlehiyê
   user_mailer:
     appeal_approved:
@@ -1597,7 +1604,7 @@ ku:
       title: Têketineke nû
     warning:
       appeal: Îtîrazekê bişîne
-      appeal_description: Heke tu bawer dikî ku ev şaşetiyeke, tu dikarî îtîrazekê ji karmendên %{instance} re bişînî.
+      appeal_description: Ku tu bawer dikî ku ev şaşetiyeke, tu dikarî îtîrazekê ji karmendên %{instance} re bişînî.
       categories:
         spam: Nexwestî (Spam)
         violation: Naverok rêbazên civakê yên jêrîn binpê dike
@@ -1639,7 +1646,7 @@ ku:
   users:
     follow_limit_reached: Tu nikarî zêdetirî %{limit} kesan bişopînî
     invalid_otp_token: Koda du-gavî ya nelê
-    otp_lost_help_html: Heke te gihîştina herduyan ji dest da, dibe ku tu bi %{email} re têkilî deyne
+    otp_lost_help_html: Ku te gihîştina herduyan ji dest da, dibe ku tu bi %{email} re têkilî deyne
     seamless_external_login: Te bi rajekarke biyanî re têketina xwe kir, ji ber vê yekê borînpeyv û e-name nayê bikaranîn.
     signed_in_as: 'Têketin wekî:'
   verification:
@@ -1652,7 +1659,7 @@ ku:
       success: Tevlîkirina kilîteke ewlehiyê nû bi awayekî serkeftî qediya.
     delete: Jê bibe
     delete_confirmation: Ma tu bi rastî dixwazî ku ev kilîta ewlehiyê jê bibe?
-    description_html: Heker tu <strong> piştrastkirina kilîta ewlehiyê </strong> çalak bikî, Ji bo têketinê ger tu kilîtekî ewlehiyê bikarbînî.
+    description_html: Ku tu <strong> piştrastkirina kilîta ewlehiyê </strong> çalak bikî, Ji bo têketinê divê tu kilîtekî ewlehiyê bi kar bînî.
     destroy:
       error: Dema kilîda ewlehiyê hate jêbirin pirsgirêkek peyda bû. Ji kerema xwe re careke din biceribîne.
       success: Kilîda ewlehiyê bi awayekî serkeftî hatê jêbirin.
diff --git a/config/locales/la.yml b/config/locales/la.yml
new file mode 100644
index 000000000..0a4bec9ee
--- /dev/null
+++ b/config/locales/la.yml
@@ -0,0 +1,12 @@
+---
+la:
+  errors:
+    '400': The request you submitted was invalid or malformed.
+    '403': You don't have permission to view this page.
+    '404': The page you are looking for isn't here.
+    '406': This page is not available in the requested format.
+    '410': The page you were looking for doesn't exist here anymore.
+    '422': 
+    '429': Too many requests
+    '500': 
+    '503': The page could not be served due to a temporary server failure.
diff --git a/config/locales/lv.yml b/config/locales/lv.yml
index da4765f06..e75590664 100644
--- a/config/locales/lv.yml
+++ b/config/locales/lv.yml
@@ -119,6 +119,8 @@ lv:
       redownloaded_msg: Veiksmīgi atsvaidzināts %{username} profils no izcelsmes
       reject: Noraidīt
       rejected_msg: Veiksmīgi noraidīts %{username} reģistrēšanās pieteikums
+      remote_suspension_irreversible: Šī konta dati ir neatgriezeniski dzēsti.
+      remote_suspension_reversible_hint_html: Konts ir apturēts viņu serverī, un dati tiks pilnībā noņemti %{date}. Līdz tam attālais serveris var atjaunot šo kontu bez jebkādām negatīvām sekām. Ja vēlaties nekavējoties noņemt visus konta datus, varat to izdarīt tālāk.
       remove_avatar: Noņemt avatāru
       remove_header: Noņemt galveni
       removed_avatar_msg: Veiksmīgi noņemts %{username} avatāra attēls
@@ -205,7 +207,7 @@ lv:
         enable_sign_in_token_auth_user: Iespējot e-pasta marķiera autentifikāciju lietotājam
         enable_user: Ieslēgt Lietotāju
         memorialize_account: Saglabāt Kontu Piemiņai
-        promote_user: Paaugstināt Lietotāju
+        promote_user: Izceltt Lietotāju
         reject_appeal: Noraidīt Apelāciju
         reject_user: Noraidīt lietotāju
         remove_avatar_user: Noņemt Avatāru
@@ -272,12 +274,12 @@ lv:
         resend_user_html: "%{name} atkārtoti nosūtīja apstiprinājuma e-pastu %{target}"
         reset_password_user_html: "%{name} atiestatīja paroli lietotājam %{target}"
         resolve_report_html: "%{name} atrisināja ziņojumu %{target}"
-        sensitive_account_html: "%{name} atzīmēja %{target} mediju kā sensitīvu"
+        sensitive_account_html: "%{name} atzīmēja %{target} multividi kā sensitīvu"
         silence_account_html: "%{name} ierobežoja %{target} kontu"
         suspend_account_html: "%{name} apturēja %{target} kontu"
         unassigned_report_html: "%{name} nepiešķīra ziņojumu %{target}"
         unblock_email_account_html: "%{name} atbloķēja %{target} e-pasta adresi"
-        unsensitive_account_html: "%{name} atmarķēja %{target} mediju kā sensitīvu"
+        unsensitive_account_html: "%{name} atmarķēja %{target} multividi kā sensitīvu"
         unsilence_account_html: "%{name} atcēla ierobežojumu %{target} kontam"
         unsuspend_account_html: "%{name} neapturēja %{target} kontu"
         update_announcement_html: "%{name} atjaunināja paziņojumu %{target}"
@@ -345,7 +347,7 @@ lv:
     dashboard:
       active_users: aktīvie lietotāji
       interactions: mijiedarbības
-      media_storage: Mediju krātuve
+      media_storage: Multividesu krātuve
       new_users: jauni lietotāji
       opened_reports: atvērtie ziņojumi
       pending_appeals_html:
@@ -410,8 +412,8 @@ lv:
       private_comment_hint: Atstāj komentāru par šo domēna ierobežojumu moderatoru iekšējai lietošanai.
       public_comment: Publisks komentārs
       public_comment_hint: Atstāj komentāru par šo domēna ierobežojumu plašai sabiedrībai, ja ir iespējota domēnu ierobežojumu saraksta reklamēšana.
-      reject_media: Noraidīt mediju failus
-      reject_media_hint: Noņem lokāli saglabātos mediju failus un atsaka tos lejupielādēt nākotnē. Nav nozīmes apturēšanai
+      reject_media: Noraidīt multivides failus
+      reject_media_hint: Noņem lokāli saglabātos multivides failus un atsaka tos lejupielādēt nākotnē. Nav nozīmes apturēšanai
       reject_reports: Noraidīt ziņojumus
       reject_reports_hint: Ignorēt visus ziņojumus, kas nāk no šī domēna. Nav nozīmes apturēšanai
       undo: Atsaukt domēna bloķēšanu
@@ -481,7 +483,7 @@ lv:
         comment: Iekšējā piezīme
         description_html: Tu vari definēt satura politikas, kas tiks piemērotas visiem kontiem no šī domēna un jebkura tā apakšdomēna.
         policies:
-          reject_media: Noraidīt medijus
+          reject_media: Noraidīt multividi
           reject_reports: Noraidīt ziņojumus
           silence: Ierobežot
           suspend: Apturēt
@@ -494,7 +496,7 @@ lv:
         instance_followers_measure: mūsu sekotāji tur
         instance_follows_measure: viņu sekotāji šeit
         instance_languages_dimension: Populārākās valodas
-        instance_media_attachments_measure: saglabātie mediju pielikumi
+        instance_media_attachments_measure: saglabātie multivides pielikumi
         instance_reports_measure: ziņojumi par viņiem
         instance_statuses_measure: saglabātās ziņas
       delivery:
@@ -526,7 +528,7 @@ lv:
       total_followed_by_them: Viņiem seko
       total_followed_by_us: Mums seko
       total_reported: Ziņojumi par viņiem
-      total_storage: Mediju pielikumi
+      total_storage: Multividesu pielikumi
       totals_time_period_hint_html: Tālāk redzamajās summās ir iekļauti dati par visu laiku.
     invites:
       deactivate_all: Deaktivēt visu
@@ -572,7 +574,6 @@ lv:
     report_notes:
       created_msg: Ziņojuma piezīme ir veiksmīgi izveidota!
       destroyed_msg: Ziņojuma piezīme ir veiksmīgi izdzēsta!
-      today_at: Šodien %{time}
     reports:
       account:
         notes:
@@ -583,7 +584,7 @@ lv:
       action_taken_by: Veiktā darbība
       actions:
         delete_description_html: Raksti, par kurām ziņots, tiks dzēsti, un tiks reģistrēts brīdinājums, lai palīdzētu tev izvērst turpmākos pārkāpumus saistībā ar to pašu kontu.
-        mark_as_sensitive_description_html: Mediju faili ziņojumos, par kuriem ziņots, tiks atzīmēti kā sensitīvi, un tiks reģistrēts brīdinājums, lai palīdzētu tev izvērst turpmākus pārkāpumus saistībā ar to pašu kontu.
+        mark_as_sensitive_description_html: Multividesu faili ziņojumos, par kuriem ziņots, tiks atzīmēti kā sensitīvi, un tiks reģistrēts brīdinājums, lai palīdzētu tev izvērst turpmākus pārkāpumus saistībā ar to pašu kontu.
         other_description_html: Skatīt vairāk iespēju kontrolēt konta uzvedību un pielāgot saziņu ar paziņoto kontu.
         resolve_description_html: Pret norādīto kontu netiks veiktas nekādas darbības, netiks reģistrēts brīdinājums, un ziņojums tiks slēgts.
         silence_description_html: Profils būs redzams tikai tiem, kas jau tam seko vai manuāli apskata, tādējādi ievērojami ierobežojot tā sasniedzamību. Šo izvēli vienmēr var mainīt.
@@ -718,6 +719,9 @@ lv:
       content_retention:
         preamble: Kontrolē, kā Mastodon tiek glabāts lietotāju ģenerēts saturs.
         title: Satura saglabāšana
+      default_noindex:
+        desc_html: Ietekmē visus lietotājus, kuri paši nav mainījuši šo iestatījumu
+        title: Pēc noklusējuma lietotāji būs atteikušies no meklētājprogrammu indeksēšanas
       discovery:
         follow_recommendations: Sekotšanas rekomendācijas
         preamble: Interesanta satura parādīšana palīdz piesaistīt jaunus lietotājus, kuri, iespējams, nepazīst nevienu Mastodon. Kontrolē, kā tavā serverī darbojas dažādi atklāšanas līdzekļi.
@@ -765,7 +769,7 @@ lv:
       title: Konta ziņas
       trending: Tendences
       visibility: Redzamība
-      with_media: Ar medijiem
+      with_media: Ar multividi
     strikes:
       actions:
         delete_statuses: "%{name} izdzēsa %{target} publikācijas"
@@ -989,6 +993,9 @@ lv:
       email_below_hint_html: Ja zemāk norādītā e-pasta adrese ir nepareiza, vari to nomainīt šeit un saņemt jaunu apstiprinājuma e-pastu.
       email_settings_hint_html: Apstiprinājuma e-pasts tika nosūtīts uz %{email}. Ja šī e-pasta adrese nav pareiza, vari to nomainīt konta iestatījumos.
       title: Iestatīt
+    sign_in:
+      preamble_html: Pierakstieties ar saviem <strong>%{domain}</strong> akreditācijas datiem. Ja jūsu konts ir mitināts citā serverī, jūs nevarēsit pieteikties šeit.
+      title: Pierakstīties %{domain}
     sign_up:
       preamble: Izmantojot kontu šajā Mastodon serverī, tu varēsi sekot jebkurai citai personai tīklā neatkarīgi no tā, kur tiek mitināts viņas konts.
       title: Atļauj tevi iestatīt %{domain}.
@@ -1111,7 +1118,7 @@ lv:
     archive_takeout:
       date: Dati
       download: Lejupielādē savu arhīvu
-      hint_html: Tu vari pieprasīt savu <strong>ziņu un augšupielādēto mediju</strong> arhīvu. Eksportētie dati būs ActivityPub formātā, ko varēs nolasīt ar jebkuru saderīgu programmatūru. Tu vari pieprasīt arhīvu ik pēc 7 dienām.
+      hint_html: Tu vari pieprasīt savu <strong>ziņu un augšupielādēto multividi</strong> arhīvu. Eksportētie dati būs ActivityPub formātā, ko varēs nolasīt ar jebkuru saderīgu programmatūru. Tu vari pieprasīt arhīvu ik pēc 7 dienām.
       in_progress: Notiek tava arhīva apkopošana...
       request: Pieprasi savu arhīvu
       size: Izmērs
@@ -1121,7 +1128,7 @@ lv:
     domain_blocks: Bloķētie domēni
     lists: Saraksti
     mutes: Apklusinātie konti
-    storage: Mediju krātuve
+    storage: Multividesu krātuve
   featured_tags:
     add_new: Pievienot jaunu
     errors:
@@ -1328,9 +1335,9 @@ lv:
     poll:
       subject: "%{name} aptauja ir beigusies"
     reblog:
-      body: 'Tavu ziņu pastiprināja %{name}:'
-      subject: "%{name} pastiprināja tavu ziņu"
-      title: Jauns pastiprinājums
+      body: 'Tavu ziņu izcēla %{name}:'
+      subject: "%{name} izcēla tavu ziņu"
+      title: Jauns izcēlums
     status:
       subject: "%{name} tikko publicēja"
     update:
@@ -1495,7 +1502,7 @@ lv:
         one: "%{count} video"
         other: "%{count} video"
         zero: "%{count} video"
-    boosted_from_html: Pastiprināja %{acct_link}
+    boosted_from_html: Izcēla %{acct_link}
     content_warning: 'Satura brīdinājums: %{warning}'
     default_language: Tāda, kā saskarnes valoda
     disallowed_hashtags:
@@ -1511,7 +1518,7 @@ lv:
       direct: Ziņojumus, kas ir redzami tikai minētajiem lietotājiem, nevar piespraust
       limit: Tu jau esi piespraudis maksimālo ziņu skaitu
       ownership: Citas personas ziņu nevar piespraust
-      reblog: Pastiprinātu ierakstu nevar piespraust
+      reblog: Izceltu ierakstu nevar piespraust
     poll:
       total_people:
         one: "%{count} persona"
@@ -1542,13 +1549,13 @@ lv:
     exceptions: Izņēmumi
     explanation: Tā kā ziņu dzēšana ir dārga darbība, tā tiek veikta lēnām laika gaitā, kad serveris nav citādi aizņemts. Šī iemesla dēļ tavas ziņas var tikt izdzēstas kādu laiku pēc vecuma sliekšņa sasniegšanas.
     ignore_favs: Ignorēt izlasi
-    ignore_reblogs: Ignorēt pastiprinātos ierakstus
+    ignore_reblogs: Ignorēt izcēlumus
     interaction_exceptions: Izņēmumi, kuru pamatā ir mijiedarbība
-    interaction_exceptions_explanation: Ņem vērā, ka ieraksti var netikt dzēsti, ja tie noslīd zem par izlases vai pastiprinājuma sliekšņa pēc tam, kad to reiz pārsnieguši.
+    interaction_exceptions_explanation: Ņemiet vērā, ka nav garantijas, ka ziņas tiks dzēstas, ja tās pārsniegs izlases vai izcēluma slieksni.
     keep_direct: Saglabāt tiešos ziņojumus
     keep_direct_hint: Nedzēš nevienu tavu tiešo ziņojumu
-    keep_media: Saglabāt ziņas ar mediju pielikumiem
-    keep_media_hint: Neizdzēš nevienu no tavām ziņām, kurām ir mediju pielikumi
+    keep_media: Saglabāt ziņas ar multivides pielikumiem
+    keep_media_hint: Neizdzēš nevienu no tavām ziņām, kurām ir multivides pielikumi
     keep_pinned: Saglabāt piespraustās ziņas
     keep_pinned_hint: Nedzēš nevienu tavis piesprausto ziņu
     keep_polls: Saglabāt aptaujas
@@ -1569,11 +1576,11 @@ lv:
     min_age_label: Vecuma slieksnis
     min_favs: Saglabāt ziņas izlsasē vismaz
     min_favs_hint: Nedzēš nevienu tavu ziņu, kas ir saņēmusi vismaz tik daudz izlases. Atstāj tukšu, lai dzēstu ziņas neatkarīgi no to izlases skaita
-    min_reblogs: Saglabāt ierakstus pastiprinātus vismaz
-    min_reblogs_hint: Neizdzēš nevienu no taviem ierakstiem, kas ir pastiprināts vismaz tik reižu. Atstāj tukšu, lai dzēstu ierakstus neatkarīgi no to pastiprinājumu skaita
+    min_reblogs: Saglabāt ziņas izceltas vismaz
+    min_reblogs_hint: Neizdzēš nevienu no tavām ziņām, kas ir izceltas vismaz tik reižu. Atstāj tukšu, lai dzēstu ziņas neatkarīgi no to izcēlumu skaita
   stream_entries:
     pinned: Piespraustā ziņa
-    reblogged: pastiprinātie
+    reblogged: izceltie
     sensitive_content: Sensitīvs saturs
   strikes:
     errors:
@@ -1634,8 +1641,8 @@ lv:
       explanation:
         delete_statuses: Tika konstatēts, ka dažas no tavām ziņām pārkāpj vienu vai vairākas kopienas vadlīnijas, un rezultātā %{instance} moderatori tās noņēma.
         disable: Tu vairs nevari izmantot savu kontu, taču tavs profils un citi dati paliek neskarti. Tu vari pieprasīt savu datu dublējumu, mainīt konta iestatījumus vai dzēst kontu.
-        mark_statuses_as_sensitive: "%{instance} moderatori dažas no tavām ziņām ir atzīmējušas kā sensitīvas. Tas nozīmē, ka cilvēkiem būs jāpieskaras ziņās esošajiem medijiem, pirms tiek parādīts priekšskatījums. Tu arī pats vari atzīmēt mediju kā sensitīvu, kad tādu publicēsi turpmāk."
-        sensitive: No šī brīža visi augšupielādētie mediju faili tiks atzīmēti kā sensitīvi un paslēpti aiz klikšķa brīdinājuma.
+        mark_statuses_as_sensitive: "%{instance} moderatori dažas no tavām ziņām ir atzīmējušas kā sensitīvas. Tas nozīmē, ka cilvēkiem būs jāpieskaras ziņās esošajai multividei, pirms tiek parādīts priekšskatījums. Tu arī pats vari atzīmēt mediju kā sensitīvu, kad tādu publicēsi turpmāk."
+        sensitive: No šī brīža visi augšupielādētie multivides faili tiks atzīmēti kā sensitīvi un paslēpti aiz klikšķa brīdinājuma.
         silence: Tu joprojām vari izmantot savu kontu, taču tikai tie cilvēki, kuri jau tev seko, redzēs tavas ziņas šajā serverī, un tev var tikt liegtas dažādas atklāšanas funkcijas. Tomēr citi joprojām var tev manuāli sekot.
         suspend: Tu vairs nevari izmantot savu kontu, un tavs profils un citi dati vairs nav pieejami. Tu joprojām vari pieteikties, lai pieprasītu savu datu dublēšanu, līdz dati tiks pilnībā noņemti aptuveni 30 dienu laikā, taču mēs saglabāsim dažus pamata datus, lai neļautu tev izvairīties no apturēšanas.
       reason: 'Iemesls:'
diff --git a/config/locales/ms.yml b/config/locales/ms.yml
index e13827a6b..848580f0c 100644
--- a/config/locales/ms.yml
+++ b/config/locales/ms.yml
@@ -525,7 +525,6 @@ ms:
     report_notes:
       created_msg: Catatan laporan telah berjaya dicipta!
       destroyed_msg: Catatan laporan telah berjaya dipadam!
-      today_at: Hari ini pada %{time}
     reports:
       account:
         notes:
@@ -685,6 +684,8 @@ ms:
       original_status: Hantaran asal
       reblogs: Ulang siar
       status_changed: Hantaran diubah
+      title: Hantaran akaun
+      trending: Sohor kini
     strikes:
       actions:
         delete_statuses: "%{name} memadam hantaran %{target}"
@@ -731,6 +732,10 @@ ms:
         trendable: Boleh muncul di bawah sohor kini
         trending_rank: 'Sohor kini #%{rank}'
         usable: Boleh digunakan
+      title: Sohor kini
+      trending: Sohor kini
+    warning_presets:
+      delete: Padam
     webhooks:
       delete: Padam
       enable: Dayakan
@@ -744,6 +749,7 @@ ms:
       guide_link_text: Sesiapa sahaja boleh memberi sumbangan.
     sensitive_content: Kandungan sensitif
   application_mailer:
+    notification_preferences: Tukar keutamaan e-mel
     view: 'Lihat:'
     view_profile: Lihat profil
     view_status: Lihat hantaran
@@ -777,6 +783,9 @@ ms:
     confirm: Teruskan
     invalid_password: Kata laluan tidak sah
     prompt: Sahkan kata laluan untuk teruskan
+  datetime:
+    distance_in_words:
+      half_a_minute: Sebentar tadi
   deletes:
     proceed: Padam akaun
   disputes:
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 04a4aa696..500aadcbf 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -1,7 +1,7 @@
 ---
 nl:
   about:
-    about_mastodon_html: Mastodon is een sociaal netwerk dat gebruikt maakt van open webprotocollen en vrije software. Het is net zoals e-mail gedecentraliseerd.
+    about_mastodon_html: 'Het sociale netwerk van de toekomst: geen advertenties, geen bedrijven die meekijken, ethisch ontworpen, en gedecentraliseerd! Wees eigenaar van jouw eigen gegevens met Mastodon!'
     contact_missing: Niet ingesteld
     contact_unavailable: n.v.t
     hosted_on: Mastodon op %{domain}
@@ -116,6 +116,8 @@ nl:
       redownloaded_msg: Het herstellen van het oorspronkelijke profiel van %{username} is geslaagd
       reject: Afwijzen
       rejected_msg: Het afwijzen van het registratieverzoek van %{username} is geslaagd
+      remote_suspension_irreversible: De gegevens van dit account zijn onomkeerbaar verwijderd.
+      remote_suspension_reversible_hint_html: Dit account is opgeschort op hun server en de gegevens worden volledig verwijderd op %{date}. Tot die tijd kan de externe server dit account herstellen zonder nadelige gevolgen. Wanneer je alle gegevens van dit account onmiddellijk wilt verwijderen, kun je dit hieronder doen.
       remove_avatar: Profielfoto verwijderen
       remove_header: Omslagfoto verwijderen
       removed_avatar_msg: Het verwijderen van de profielfoto van %{username} is geslaagd
@@ -555,13 +557,12 @@ nl:
       pending: Aan het wachten op toestemming van de relayserver
       save_and_enable: Opslaan en inschakelen
       setup: Een verbinding met een relayserver maken
-      signatures_not_enabled: Federatierelays werken niet goed wanneer de veilige modus of de beperkte federatiemodus is ingeschakeld
+      signatures_not_enabled: Federatierelays werken mogelijk niet goed wanneer de veilige modus of de beperkte federatiemodus is ingeschakeld
       status: Status
       title: Relayservers
     report_notes:
       created_msg: Opmerking bij rapportage succesvol aangemaakt!
       destroyed_msg: Opmerking bij rapportage succesvol verwijderd!
-      today_at: Vandaag om %{time}
     reports:
       account:
         notes:
@@ -704,6 +705,9 @@ nl:
       content_retention:
         preamble: Toezicht houden op hoe berichten en media van gebruikers op Mastodon worden bewaard.
         title: Bewaartermijn berichten
+      default_noindex:
+        desc_html: Heeft invloed op alle gebruikers die deze instelling niet zelf hebben veranderd
+        title: Gebruikers standaard niet door zoekmachines laten indexeren
       discovery:
         follow_recommendations: Aanbevolen accounts
         preamble: Het tonen van interessante inhoud is van essentieel belang voor het aan boord halen van nieuwe gebruikers, die mogelijk niemand van Mastodon kennen. Bepaal hoe verschillende functies voor het ontdekken van inhoud en gebruikers op jouw server werken.
@@ -971,6 +975,9 @@ nl:
       email_below_hint_html: Wanneer onderstaand e-mailadres niet klopt, kun je dat hier veranderen. Je ontvangt dan hierna een bevestigingsmail.
       email_settings_hint_html: De bevestigingsmail is verzonden naar %{email}. Wanneer dat e-mailadres niet klopt, kun je dat veranderen in je accountinstellingen.
       title: Instellen
+    sign_in:
+      preamble_html: Log in met de inloggegevens van <strong>%{domain}</strong>. Als jouw account zich op een andere server bevindt, kun je hier niet inloggen.
+      title: Inloggen op %{domain}
     sign_up:
       preamble: Je kunt met een Mastodon-account iedereen in het netwerk volgen, ongeacht waar deze persoon een account heeft.
       title: Laten we je account op %{domain} instellen.
@@ -1263,7 +1270,7 @@ nl:
       before: 'Lees eerst goed deze tekst, alvorens verder te gaan:'
       cooldown: Na de verhuizing kun je tijdelijk niet opnieuw verhuizen
       disabled_account: Jouw huidige account is hierna niet meer volledig bruikbaar. Je hebt echter wel toegang tot het exporteren van je gegevens en tot het opnieuw activeren van je account.
-      followers: Deze actie verhuisd alle volgers vanaf het huidige account naar het nieuwe account
+      followers: Deze actie verhuist alle volgers vanaf het huidige account naar het nieuwe account
       only_redirect_html: Je kunt als alternatief ook <a href="%{path}">alleen de doorverwijzing op je profiel zetten</a>.
       other_data: Geen andere gegevens worden automatisch verhuisd
       redirect: Jouw huidige accountprofiel wordt bijgewerkt met een doorverwijzingsmelding en wordt uitgesloten van zoekresultaten
@@ -1631,7 +1638,7 @@ nl:
       final_action: Begin berichten te plaatsen
       final_step: 'Begin berichten te plaatsen! Zelfs zonder volgers kunnen jouw openbare berichten door anderen bekeken worden, bijvoorbeeld op de lokale tijdlijn en onder hashtags. Je kunt jezelf voorstellen met het gebruik van de hashtag #introductions.'
       full_handle: Jouw volledige Mastodonadres
-      full_handle_hint: Dit geef je aan jouw vrienden, zodat ze jouw berichten kunnen sturen of (vanaf een andere Mastodonserver) kunnen volgen.
+      full_handle_hint: Dit geef je aan jouw vrienden, zodat ze jou berichten kunnen sturen of (vanaf een andere Mastodonserver) kunnen volgen.
       subject: Welkom op Mastodon
       title: Welkom aan boord %{name}!
   users:
diff --git a/config/locales/nn.yml b/config/locales/nn.yml
index 9155950bb..18823e55c 100644
--- a/config/locales/nn.yml
+++ b/config/locales/nn.yml
@@ -116,6 +116,8 @@ nn:
       redownloaded_msg: Oppdaterte %{username} sin profil frå opphavstenar
       reject: Avvis
       rejected_msg: Avviste %{username} sin registreringssøknad
+      remote_suspension_irreversible: Data for denne kontoen har blitt sletta for alltid.
+      remote_suspension_reversible_hint_html: Kontoen har blitt suspendert på tenaren deira og data vil bli fjerna den %{date}. Fram til dess kan tenaren deira gjenoppretta kontoen utan negative fylgjer. Dersom du ynskjer å fjerna all kontodata no, kan du gjera det nedanfor.
       remove_avatar: Fjern bilete
       remove_header: Fjern overskrift
       removed_avatar_msg: Fjerna %{username} sitt avatarbilete
@@ -418,6 +420,8 @@ nn:
         create: Legg til domene
         resolve: Løs domene
         title: Ny blokkeringsoppføring av e-postdomene
+      no_email_domain_block_selected: Blokkering av e-post-domener vart ikkje endra sidan ingen var valde
+      resolved_dns_records_hint_html: Domenenamnet gjer oppslag til desse MX-domenene som til sist er ansvarlige for å motta e-post. Blokkering av eit MX-domene vil blokkere registreringar frå alle e-postadresser som bruker same MX-domene, sjølv om det synlige domenenavnet skulle vera noko anna. <strong>Pass på så du ikkje blokkerer dei store e-postleverandørane.</strong>
       resolved_through_html: Løyst gjennom %{domain}
       title: Blokkerte e-postadresser
     export_domain_allows:
@@ -444,6 +448,9 @@ nn:
       unsuppress: Tilbakestill følgjeforslag
     instances:
       availability:
+        description_html:
+          one: Om leveransar til domenet feilar <strong>%{count} dag</strong>, vil det ikkje bli gjort fleire forsøk før det eventuelt kjem ein leveranse <em>frå</em> domenet.
+          other: Om leveransar til domenet feilar <strong>%{count} ulike dagar</strong>, vil det ikkje bli gjort fleire forsøk før det eventuelt kjem ein leveranse <em>frå</em> domenet.
         failure_threshold_reached: Feilterskelen ble nådd %{date}.
         failures_recorded:
           one: Mislykkede forsøk på %{count} dag.
@@ -451,7 +458,7 @@ nn:
         no_failures_recorded: Ingen feil registrert.
         title: Tilgjenge
         warning: Det siste forsøket på å koble til denne serveren lyktes ikke
-      back_to_all: All
+      back_to_all: Alle
       back_to_limited: Begrenset
       back_to_warning: Advarsel
       by_domain: Domene
@@ -464,9 +471,11 @@ nn:
           reject_reports: Avvis rapporter
           silence: Begrens
           suspend: Suspender
+        policy: Vilkår
         reason: Offentlig årsak
         title: Retningslinjer for innhold
       dashboard:
+        instance_accounts_dimension: Mest fylgde kontoar
         instance_accounts_measure: lagrede kontoer
         instance_followers_measure: våre følgere der
         instance_follows_measure: deres følgere her
@@ -475,26 +484,35 @@ nn:
         instance_reports_measure: rapporter om dem
         instance_statuses_measure: lagrede innlegg
       delivery:
-        all: All
+        all: Alle
         clear: Feil ved fjerning
+        failing: Feilar
         restart: Starte levering
         stop: Stopp levering
         unavailable: Ikke tilgjengelig
       delivery_available: Levering er tilgjengelig
+      delivery_error_days: Leveringsfeildagar
       delivery_error_hint: Dersom levering ikke er mulig i løpet av %{count} dager, blir det automatisk merket som ikke mulig å levere.
+      destroyed_msg: Data frå %{domain} er no lagt i kø for å bli sletta.
       empty: Ingen domener funnet.
+      known_accounts:
+        one: "%{count} kjend konto"
+        other: "%{count} kjende kontoar"
       moderation:
         all: Alle
         limited: Avgrensa
         title: Moderasjon
       private_comment: Privat kommentar
       public_comment: Offentleg kommentar
+      purge: Reinse
+      purge_description_html: Dersom du trur dette domenet har blitt kopla ned for godt, kan du sletta all kontoinformasjon og tilhøyrande data som gjeld domenet frå lageret ditt. Dette kan ta litt tid.
       title: Samling
       total_blocked_by_us: Blokkert av oss
       total_followed_by_them: Fylgd av dei
       total_followed_by_us: Fylgd av oss
       total_reported: Rapportar om dei
       total_storage: Medievedlegg
+      totals_time_period_hint_html: Totalsum vist nedanfor gjeld data for alle tidsperiodar.
     invites:
       deactivate_all: Slå av alle
       filter:
@@ -533,7 +551,7 @@ nn:
       pending: Avventer overgangens godkjenning
       save_and_enable: Lagr og slå på
       setup: Sett opp en overgangsforbindelse
-      signatures_not_enabled: Overganger vil ikke fungere riktig mens sikkermodus eller hvitelistingsmodus er skrudd på
+      signatures_not_enabled: Overgangar fungerer ikkje så lenge sikker- eller kvitlistingsmodus er aktivert
       status: Status
       title: Vidaresendingar
     report_notes:
@@ -549,35 +567,49 @@ nn:
       actions:
         delete_description_html: De rapporterte innleggene vil bli slettet, og en advarsel vil bli tatt vare på for å hjelpe deg eskalere ved fremtidige overtredelser fra samme konto.
         mark_as_sensitive_description_html: Mediene i dei rapporterte innlegga vil verte markerte som ømtolege, og ein merknad vil verte lagra for å hjelpe deg å eskalera ved framtidige regelbrot frå same konto.
+        other_description_html: Sjå fleire alternativ når det gjeld kontroll av kontoåtferd og tilpassing av kommunikasjonen til den rapporterte kontoen.
         resolve_description_html: Ingen handling utføres mot den rapporterte kontoen, ingen advarsel gis, og rapporten lukkes.
         silence_description_html: Profilen vil kun være synlig for dem som allerede følger den eller manuelt slår den opp, noe som sterkt begrenser dens rekkevidde. Kan alltid tilbakestilles.
+        suspend_description_html: Profil med innhald vil bli utilgjengeleg og til sist sletta. Det vil ikkje vera mogleg å samhandla med kontoen. Avgjerda kan opphevast innan 30 dagar.
+      actions_description_html: Avgjer kva som skal gjerast med denne rapporteringa. Dersom du utfører straffetiltak mot den rapporterte kontoen, vil dei motta ein e-post – så sant du ikkje har valt kategorien <strong>Spam</strong>.
+      add_to_report: Legg til i rapporten
       are_you_sure: Er du sikker?
       assign_to_self: Tilegn til meg
       assigned: Tilsett moderator
       by_target_domain: Domenet av rapportert bruker
       category: Kategori
+      category_description_html: Årsaka til at kontoen og/eller innhaldet vart rapportert vil bli inkludert i kommunikasjonen med den rapporterte kontoen
       comment:
         none: Ingen
+      comment_description_html: 'For å gje meir informasjon, skreiv %{name}:'
       created_at: Rapportert
+      delete_and_resolve: Slett innlegg
       forwarded: Videresendt
       forwarded_to: Videresendt til %{domain}
       mark_as_resolved: Merk som løyst
       mark_as_sensitive: Marker som ømtolig
       mark_as_unresolved: Merk som uløyst
+      no_one_assigned: Ingen
       notes:
         create: Sett inn merknad
         create_and_resolve: Løys med merknad
         create_and_unresolve: Opn på nytt med merknad
         delete: Slett
         placeholder: Beskriv hvilke handlinger som har blitt tatt, eller andre relaterte oppdateringer...
+        title: Merknad
+      notes_description_html: Sjå og skriv merknadar til andre moderatorar og ditt framtidige sjølv
+      quick_actions_description_html: 'Utfør ei handling eller bla ned for å sjå det rapporterte innhaldet:'
+      remote_user_placeholder: den eksterne brukaren frå %{instance}
       reopen: Opn rapport igjen
       report: 'Rapporter #%{id}'
       reported_account: Rapportert konto
       reported_by: Rapportert av
       resolved: Oppløyst
       resolved_msg: Rapporten er løyst!
+      skip_to_actions: Gå til handlingar
       status: Status
       statuses: Rapportert innhold
+      statuses_description_html: Støytande innhald vil bli inkludert i kommunikasjonen med den rapporterte kontoen
       target_origin: Opprinnelse for innrapportert konto
       title: Rapportar
       unassign: Avset
@@ -593,6 +625,8 @@ nn:
         administration: Administrasjon
         devops: DevOps
         invites: Innbydingar
+        moderation: Moderering
+        special: Særskild
       delete: Slett
       description_html: Med <strong>brukarrollar</strong> kan du kontrollera kva funksjonar og område av Mastodon brukarane dine har tilgong til.
       edit: Endr rollen '%{name}'
@@ -608,10 +642,36 @@ nn:
         delete_user_data_description: Lar brukere slette andre brukeres data uten forsinkelse
         invite_users: Innby brukarar
         invite_users_description: Tillet at brukarar innbyr nye folk til tenaren
+        manage_announcements: Handtera Kunngjeringar
+        manage_announcements_description: Let brukarar handtera kunngjeringar på tenaren
+        manage_appeals: Handtering av klager
+        manage_appeals_description: Let brukarar gjennomgå klager på modereringshandlingar
+        manage_blocks: Handtere blokkeringar
+        manage_blocks_description: Let brukarar blokkere e-postleverandørar og IP-adresser
+        manage_custom_emojis: Handtere tilpassa emojiar
+        manage_custom_emojis_description: Let brukarar handtere tilpassa emojiar på tenaren
+        manage_federation: Handtere føderasjon
+        manage_federation_description: Let brukarar blokkera eller tillata føderasjon med andre domener, samt styra kva som skal leverast
         manage_invites: Handsam innbydingar
         manage_invites_description: Tillet at brukarar blar gjennom og deaktiverer innbydingslenkjer
+        manage_reports: Handtere rapporteringar
+        manage_reports_description: Let brukarar gjennomgå rapportar og utføre modereringshandlingar i samsvar med desse
         manage_roles: Handsam roller
         manage_roles_description: Tillet at brukarar handsamar og tilset rollar under deira eiga
+        manage_rules: Handtere reglar
+        manage_rules_description: Let brukarar endre reglane for tenaren
+        manage_settings: Handtere innstillingar
+        manage_settings_description: Let brukarar endre innstillingar for tenaren
+        manage_taxonomies: Handtere taksonomiar
+        manage_taxonomies_description: Let brukarar gjennomgå populært innhald og oppdatera innstillingar for emneknaggar
+        manage_user_access: Administrer brukartilgang
+        manage_user_access_description: Let brukarar deaktivera 2-trinnsautentisering, endra e-postadressa og tilbakestille passordet til andre brukarar
+        manage_users: Handtere brukarar
+        manage_users_description: Let brukarar sjå detaljar om andre brukarar og utføre moderasjonshandlingar mot dei
+        manage_webhooks: Handtere webhooks
+        manage_webhooks_description: Let brukarar setje opp webhooks for administrative hendingar
+        view_audit_log: Sjå revisjonslogg
+        view_audit_log_description: Let brukarar sjå historikk over administrative handlingar på tenaren
         view_dashboard: Vis dashbord
         view_dashboard_description: Gir brukere tilgang til dashbordet og ulike metrikker
         view_devops: DevOps
@@ -626,17 +686,36 @@ nn:
       title: Server regler
     settings:
       about:
+        manage_rules: Handter tenarreglar
+        preamble: Gje grundig informasjon om korleis tenaren blir drifta, moderert og finansiert.
+        rules_hint: Det er eit eige område for reglar som brukarar må retta seg etter.
         title: Om
       appearance:
+        preamble: Tilpasse web-grensesnittet.
         title: Utsjånad
+      branding:
+        preamble: Profileringa av tenaren din skil den frå andre tenarar i nettverket. Informasjonen kan bli vist ulike stadar, til dømes i Mastodon sitt web-grensesnitt, i eigne applikasjonar, i førehandsvisningar på andre nettsider, i meldingsappar og så bortetter. På grunn av dette er det best å halde informasjonen enkel, kort og treffande.
+        title: Profilering
+      content_retention:
+        preamble: Styr korleis brukargenerert innhald blir lagra i Mastodon.
+        title: Bevaring av innhald
+      default_noindex:
+        desc_html: Påverkar alle brukarar som ikkje har justert denne innstillinga sjølve
+        title: Ikkje la brukarar indekserast av søkjemotorar som standard
       discovery:
         follow_recommendations: Følgjeforslag
         preamble: Å framheva interessant innhald er vitalt i mottakinga av nye brukarar som ikkje nødvendigvis kjenner nokon på Mastodon. Kontroller korleis oppdagingsfunksjonane på tenaren din fungerar.
+        profile_directory: Profilkatalog
+        public_timelines: Offentlege tidsliner
+        title: Oppdaging
         trends: Trender
       domain_blocks:
         all: Til alle
         disabled: Til ingen
         users: Til lokale brukarar som er logga inn
+      registrations:
+        preamble: Kontroller kven som kan oppretta konto på tenaren din.
+        title: Registreringar
       registrations_mode:
         modes:
           approved: Godkjenning kreves for påmelding
@@ -650,18 +729,25 @@ nn:
       account: Forfatter
       application: Applikasjon
       back_to_account: Tilbake til kontosida
+      back_to_report: Attende til rapporteringssida
       batch:
         remove_from_report: Fjern fra rapport
+        report: Rapport
       deleted: Sletta
+      favourites: Favorittar
       history: Versjonshistorikk
+      in_reply_to: Svarar på
       language: Språk
       media:
         title: Media
       metadata: Metadata
       no_status_selected: Ingen statusar vart endra sidan ingen vart valde
+      open: Opne innlegg
       original_status: Opprinnelig innlegg
+      reblogs: Framhevingar
       status_changed: Innlegg endret
       title: Kontostatusar
+      trending: Populært
       visibility: Synlighet
       with_media: Med media
     strikes:
@@ -698,32 +784,98 @@ nn:
       disallow: Ikke tillat
       links:
         allow: Tillat lenke
+        allow_provider: Tillat utgjevar
+        description_html: Dette er lenkjer som for tida blir mykje delt av kontoar som tenaren din ser innlegg frå. Dei kan hjelpa brukarane dine med å finna ut kva som skjer i verda. Ingen lenkjer vert offentleg tilgjengelege før du godkjenner utgjevaren. Du kan også tillata eller forby individuelle lenkjer.
         disallow: Ikke tillat lenke
+        disallow_provider: Forby utgjevaren
         no_link_selected: Ingen lenker ble endret da ingen var valgt
+        publishers:
+          no_publisher_selected: Ingen utgjevarar vart endra sidan ingen var valde
         shared_by_over_week:
           one: Delt av %{count} person i løpet av den siste uken
           other: Delt av %{count} personer i løpet av den siste uken
+        title: Populære lenkjer
         usage_comparison: Delt %{today} ganger i dag, sammenlignet med %{yesterday} i går
+      only_allowed: Kun tillatne
       pending_review: Avventer gjennomgang
+      preview_card_providers:
+        allowed: Lenkjer frå denne utgjevaren kan bli populære
+        description_html: På tenaren din blir lenkjer frå desse domena ofte delt. Ei lenkje vil ikkje bli offentleg populær om ikkje domenet er tillate som utgjevar. Tillating (eller forbod) gjeld også subdomener.
+        rejected: Lenkjer frå denne utgjevaren kan ikkje bli populær
+        title: Utgjevarar
       rejected: Avvist
       statuses:
         allow: Tillat innlegg
         allow_account: Tillat forfatter
+        description_html: Dette er innlegg som tenaren din veit om og som blir mykje delt og markerte som favorittar no for tida. Dei kan hjelpa nye og gamle brukarar å finna folk dei vil fylgja. Ingen innlegg vert vist offentleg utan at du tillet forfattaren, og utan at forfattaren tillet kontoen deira å bli foreslått for andre. Du kan også tillata eller avvisa individuelle innlegg.
         disallow: Ikke tillat innlegg
+        disallow_account: Forby forfattar
+        no_status_selected: Ingen populære innlegg vart endra sidan ingen var valde
+        not_discoverable: Forfattaren har ikkje valt å kunna bli oppdaga
+        shared_by:
+          one: Delt eller markert som favoritt ein gong
+          other: Delt og markert som favoritt %{friendly_count} gongar
+        title: Populære innlegg
+      tags:
+        current_score: Gjeldande poengsum %{score}
+        dashboard:
+          tag_accounts_measure: unike bruksområder
+          tag_languages_dimension: Mest brukte språk
+          tag_servers_dimension: Mest brukte servere
+          tag_servers_measure: forskjellige servere
+          tag_uses_measure: samlet bruk
+        description_html: Dette er emneknagger som for øyeblikket vises i mange innlegg som serveren din ser. Det kan hjelpe dine brukere med å finne ut hva folk snakker mest om i øyeblikket. Ingen emneknagger vises offentlig før du godkjenner dem.
+        listable: Kan bli foreslått
+        not_listable: Vil ikke bli foreslått
+        not_trendable: Kunne ikke vises under trender
+        not_usable: Kan ikke brukes
+        peaked_on_and_decaying: Nådde toppen %{date}, nå på vei ned
+        title: Populære emneknagger
+        trendable: Kan vises under trender
+        trending_rank: 'Trender #%{rank}'
+        usable: Kan brukes
+        usage_comparison: Brukt %{today} ganger i dag, sammenlignet med %{yesterday} i går
+        used_by_over_week:
+          one: Brukt av én person i løpet av den seneste uken
+          other: Brukt av %{count} personer i løpet av den seneste uken
+      title: Trender
+      trending: Trender
     warning_presets:
       add_new: Legg til ny
       delete: Slett
       edit_preset: Endr åtvaringsoppsett
+      empty: Du har ikke definert noen forhåndsinnstillinger for advarsler enda.
       title: Handsam åtvaringsoppsett
     webhooks:
       add_new: Legg til endepunkt
+      delete: Slett
+      description_html: En <strong>webhook</strong> gjør det mulig for Mastodon å sende <strong>varsler i sanntid</strong> om utvalgte hendelser til din egen applikasjon, sånn at applikasjonen din kan <strong>reagere automatisk</strong>.
+      disable: Deaktiver
+      disabled: Deaktivert
+      edit: Rediger endepunkt
+      empty: Du har ingen webhook-endepunkter konfigurert ennå.
+      enable: Aktiver
+      enabled: Aktiv
+      enabled_events:
+        one: 1 aktivert hendelse
+        other: "%{count} aktiverte hendelser"
+      events: Hendelser
+      new: Ny webhook
+      rotate_secret: Roter hemmelighet
+      secret: Hemmelighet for signering
       status: Status
+      title: Webhooker
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
+        delete_statuses: å slette sine innlegg
+        disable: for å fryse kontoen deres
         mark_statuses_as_sensitive: å merke innleggene sine som følsomme
+        none: en advarsel
         sensitive: å merke kontoen sin som følsom
         silence: for å begrense deres konto
+        suspend: for å suspendere kontoen deres
     new_pending_account:
       body: Detaljer om den nye kontoen er nedenfor. Du kan godkjenne eller avvise denne søknaden.
       subject: Ny konto opp til vurdering på %{instance} (%{username})
@@ -731,6 +883,14 @@ nn:
       body: "%{reporter} har rapportert %{target}"
       body_remote: Nokon frå %{domain} har meldt %{target}
       subject: Ny rapport for %{instance} (#%{id})
+    new_trends:
+      new_trending_links:
+        title: Populære lenker
+      new_trending_statuses:
+        title: Populære innlegg
+      new_trending_tags:
+        title: Populære emneknagger
+      subject: Ny trender for gjennomsyn av %{instance}
   aliases:
     add_new: Lag psevdonym
     created_msg: Laga eit nytt kallenamn. No kan du setja i gang med flyttinga frå den gamle kontoen.
@@ -745,7 +905,8 @@ nn:
     confirmation_dialogs: Bekreftelsesdialoger
     discovery: Oppdaging
     localization:
-      body: Mastodon er oversatt av frivillige.
+      body: Mastodon er omsett av friviljuge.
+      guide_link: https://crowdin.com/project/mastodon
       guide_link_text: Alle kan bidra.
     sensitive_content: Ømtolig innhald
     toot_layout: Tutoppsett
@@ -782,7 +943,7 @@ nn:
     login: Innlogging
     logout: Logg ut
     migrate_account: Flytt til ein annan konto
-    migrate_account_html: Hvis du ønsker å henvise denne kontoen til en annen, kan du <a href="%{path}">konfigurere det her</a>.
+    migrate_account_html: Om du vil visa denne kontoen til ein anna, kan du <a href="%{path}">skipe det her</a>.
     or_log_in_with: Eller logg inn med
     privacy_policy_agreement_html: Jeg har lest og godtar <a href="%{privacy_policy_path}" target="_blank">retningslinjer for personvern</a>
     providers:
@@ -801,6 +962,9 @@ nn:
       email_below_hint_html: Om e-posten nedfor ikkje er rett, kan du endra han her og få ein ny stadfestings-e-post.
       email_settings_hint_html: Stadfestings-e-posten vart send til %{email}. Om den e-postadressa ikkje er rett, kan du byta adresse i kontoinnstillingane.
       title: Oppsett
+    sign_in:
+      preamble_html: Logg inn med brukaropplysningar for <strong>%{domain}</strong>. Dersom kontoen din er registrert på ein annan tenar vil du ikkje kunne logga inn her.
+      title: Logg inn på %{domain}
     sign_up:
       preamble: Med en konto på denne Mastodon-tjeneren vil du kunne følge andre personer på nettverket, uansett hvor kontoen deres holder til.
       title: La oss få deg satt i gang på %{domain}.
@@ -948,25 +1112,57 @@ nn:
       thread: Samtalar
     edit:
       add_keyword: Legg til stikkord
+      keywords: Nøkkelord
       statuses: Individuelle innlegg
       title: Endr filter
     errors:
       invalid_context: Ingen eller ugild kontekst gjeve
     index:
+      contexts: Filtre i %{contexts}
       delete: Slett
       empty: Du har ingen filtre.
+      expires_in: Utløper om %{distance}
+      expires_on: Utløper den %{date}
+      keywords:
+        one: "%{count} nøkkelord"
+        other: "%{count} nøkkelorder"
+      statuses:
+        one: "%{count} innlegg"
+        other: "%{count} innlegger"
+      statuses_long:
+        one: "%{count} enkeltinnlegg skjult"
+        other: "%{count} individuelle innlegger skjult"
       title: Filter
     new:
+      save: Lagre nytt filter
       title: Legg til nytt filter
+    statuses:
+      back_to_filter: Tilbake til filter
+      batch:
+        remove: Fjern fra filter
+      index:
+        hint: Dette filteret gjelder for å velge individuelle innlegg uavhengig av andre kriterier. Du kan legge til flere innlegg til dette filteret fra webgrensesnittet.
+        title: Filtrerte innlegg
   footer:
     trending_now: Populært no
   generic:
     all: Alle
+    all_items_on_page_selected_html:
+      one: "<strong>%{count}</strong> element på denne siden er valgt."
+      other: Alle <strong>%{count}</strong> elementer på denne siden er valgt.
+    all_matching_items_selected_html:
+      one: "<strong>%{count}</strong> element som matcher søket ditt er valgt."
+      other: Alle <strong>%{count}</strong> elementer som matcher søket velges.
     changes_saved_msg: Alle endringane vart lagra!
     copy: Kopier
     delete: Slett
+    deselect: Fjern all merking
+    none: Ingen
     order_by: Sorter etter
     save_changes: Lagr endringar
+    select_all_matching_items:
+      one: Velg %{count} element som samsvarer med søket ditt.
+      other: Velg alle %{count} elementer som samsvarer med søket ditt.
     today: i dag
     validation_errors:
       one: Noe er ikke helt riktig ennå. Vennligst se etter en gang til
@@ -981,6 +1177,7 @@ nn:
       merge: Set saman
       merge_long: Hald på eksisterande data og legg til nye
       overwrite: Skriv over
+      overwrite_long: Erstatt gjeldende med de nye
     preface: Du kan henta inn data som du har eksportert frå ein annan tenar, som t.d. ei liste over folka du fylgjer eller blokkerer.
     success: Dataa dine vart lasta opp og vert no handsama så fort som mogeleg
     types:
@@ -1019,6 +1216,7 @@ nn:
     authentication_methods:
       otp: to-faktor autentiseringsapp
       password: passord
+      sign_in_token: e-post sikkerhetskode
       webauthn: sikkerhetsnøkler
     description_html: Hvis du ser aktivitet som du ikke gjenkjenner, bør du vurdere å endre passordet ditt og aktivere to-trinnsinnlogging.
     empty: Ingen innloggingshistorikk er tilgjengelig
@@ -1067,6 +1265,8 @@ nn:
     carry_blocks_over_text: Denne brukaren flytta frå %{acct}, som du gøymde.
     carry_mutes_over_text: Denne brukeren flyttet fra %{acct}, som du hadde dempet.
     copy_account_note_text: 'Denne brukeren flyttet fra %{acct}, her var dine tidligere notater om dem:'
+  navigation:
+    toggle_menu: Vis/Skjul meny
   notification_mailer:
     admin:
       report:
@@ -1091,6 +1291,8 @@ nn:
       body: 'Du vart nemnd av %{name} i:'
       subject: Du vart nemnd av %{name}
       title: Ny nemning
+    poll:
+      subject: En avstemming av %{name} er avsluttet
     reblog:
       body: 'Statusen din vart framheva av %{name}:'
       subject: "%{name} framheva statusen din"
@@ -1171,6 +1373,7 @@ nn:
     errors:
       invalid_rules: refererer ikke til gyldige regler
   rss:
+    content_warning: 'Innholdsadvarsel:'
     descriptions:
       account: Offentlige innlegg fra @%{acct}
       tag: 'Offentlige innlegg merket med #%{hashtag}'
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 7013b6a1b..5c5900184 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -116,6 +116,8 @@
       redownloaded_msg: Oppdatert %{username} sin profil fra opprinnelse
       reject: Avslå
       rejected_msg: Vellykket avvist %{username} sin registreringsapplikasjon
+      remote_suspension_irreversible: Dataene til denne kontoen har blitt slettet uten mulighet for gjenoppretting.
+      remote_suspension_reversible_hint_html: Kontoen har blitt suspendert på sin tjener, og dataene bli fjernet helt den %{date}. Inntil da kan tjeneren gjeninnsette kontoen uten skade. Hvis du ønsker å fjerne alle dataene til kontoen umiddelbart, kan du gjøre dette under.
       remove_avatar: Fjern profilbilde
       remove_header: Fjern overskrift
       removed_avatar_msg: Fjernet %{username} sitt avatarbilde
@@ -245,8 +247,10 @@
         destroy_announcement_html: "%{name} slettet kunngjøring %{target}"
         destroy_canonical_email_block_html: "%{name} fjernet blokkering av e-post med hash %{target}"
         destroy_custom_emoji_html: "%{name} slettet emoji %{target}"
+        destroy_domain_allow_html: "%{name} ikke tillatt føderasjon med domenet %{target}"
         destroy_domain_block_html: "%{name} fjernet blokkeringen av domenet %{target}"
         destroy_email_domain_block_html: "%{name} fjernet blokkeringen av e-post-domenet %{target}"
+        destroy_instance_html: "%{name} blokkert domene %{target}"
         destroy_ip_block_html: "%{name} slettet regel for IP %{target}"
         destroy_status_html: "%{name} fjernet innlegget av %{target}"
         destroy_unavailable_domain_html: "%{name} gjenopptok levering til domenet %{target}"
@@ -262,16 +266,22 @@
         promote_user_html: "%{name} forfremmet bruker %{target}"
         reject_appeal_html: "%{name} avviste moderasjonsavgjørelsesklagen fra %{target}"
         reject_user_html: "%{name} avslo registrering fra %{target}"
+        remove_avatar_user_html: "%{name} fjernet %{target} sitt profilbilde"
         reopen_report_html: "%{name} gjenåpnet rapporten %{target}"
         resend_user_html: "%{name} sendte e-postbekreftelse på nytt for %{target}"
         reset_password_user_html: "%{name} tilbakestille passordet for brukeren %{target}"
+        resolve_report_html: "%{name} løst rapport %{target}"
         sensitive_account_html: "%{name} merket %{target}s innlegg som følsomt"
         silence_account_html: "%{name} begrenset %{target}s konto"
         suspend_account_html: "%{name} suspenderte %{target}s konto"
+        unassigned_report_html: "%{name} ikke tildelt rapport %{target}"
         unblock_email_account_html: "%{name} fjernet blokkering av %{target}s e-postadresse"
         unsensitive_account_html: "%{name} fjernet følsomt-merket på %{target}s innlegg"
         unsilence_account_html: "%{name} fjernet begrensningen av %{target}s konto"
+        unsuspend_account_html: "%{name} oppheve %{target} sin konto"
+        update_announcement_html: "%{name} oppdatert kunngjøring %{target}"
         update_custom_emoji_html: "%{name} oppdaterte emoji %{target}"
+        update_domain_block_html: "%{name} oppdaterte domeneblokk for %{target}"
         update_ip_block_html: "%{name} endret regel for IP %{target}"
         update_status_html: "%{name} oppdaterte innlegg av %{target}"
         update_user_role_html: "%{name} endret %{target} -rolle"
@@ -337,6 +347,18 @@
       media_storage: Medialagring
       new_users: nye brukere
       opened_reports: rapporter åpnet
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> ventende anker"
+        other: "<strong>%{count}</strong> ventende ankere"
+      pending_reports_html:
+        one: "<strong>%{count}</strong> ventende rapport"
+        other: "<strong>%{count}</strong> ventende rapporter"
+      pending_tags_html:
+        one: "<strong>%{count}</strong> ventende emneknagg"
+        other: "<strong>%{count}</strong> ventende emneknagger"
+      pending_users_html:
+        one: "<strong>%{count}</strong> ventende bruker"
+        other: "<strong>%{count}</strong> ventende brukere"
       resolved_reports: rapporter løst
       software: Programvare
       sources: Kilder for registreringer
@@ -402,7 +424,11 @@
       domain: Domene
       new:
         create: Legg til domene
+        resolve: Løs domene
         title: Ny blokkeringsoppføring av e-postdomene
+      no_email_domain_block_selected: Ingen e-postdomeneblokker ble endret da ingen ble valgt
+      resolved_dns_records_hint_html: Domenenavnet løser seg til følgende MX-domener som er til slutt ansvarlige for å motta e-post. Blokkering av et MX-domene vil blokkere signaler fra en hvilken som helst e-postadresse som bruker samme MX-domene, selv om det synlige domenenavnet er annerledes. <strong>Vær forsiktig så du ikke blokkerer store e-posttilbydere.</strong>
+      resolved_through_html: Løst gjennom %{domain}
       title: Blokkering av e-postdomene
     export_domain_allows:
       new:
@@ -428,6 +454,9 @@
       unsuppress: Gjenopprett følg-anbefaling
     instances:
       availability:
+        description_html:
+          one: Hvis levering til domenet mislykkes <strong>%{count} dag</strong> uten å lykkes, ingen ytterligere leveringsforsøk vil bli gjort med mindre det kommer leveranse <em>fra</em> domenet er mottatt.
+          other: Hvis levering til domenet mislykkes på <strong>%{count} forskjellige dager</strong> uten å lykkes, ingen ytterligere leveringsforsøk vil bli gjort med mindre det kommer leveranse <em>fra</em> domenet er mottatt.
         failure_threshold_reached: Feilterskelen ble nådd %{date}.
         failures_recorded:
           one: Mislykkede forsøk på %{count} dag.
@@ -448,9 +477,11 @@
           reject_reports: Avvis rapporter
           silence: Begrens
           suspend: Suspender
+        policy: Vilkår
         reason: Offentlig årsak
         title: Retningslinjer for innhold
       dashboard:
+        instance_accounts_dimension: Flest fulgte kontoer
         instance_accounts_measure: lagrede kontoer
         instance_followers_measure: våre følgere der
         instance_follows_measure: deres følgere her
@@ -461,24 +492,33 @@
       delivery:
         all: All
         clear: Feil ved fjerning
+        failing: Feilet
         restart: Starte levering
         stop: Stopp levering
         unavailable: Ikke tilgjengelig
       delivery_available: Levering er tilgjengelig
+      delivery_error_days: Antall feildager i levering
       delivery_error_hint: Dersom levering ikke er mulig i løpet av %{count} dager, blir det automatisk merket som ikke mulig å levere.
+      destroyed_msg: Data fra %{domain} er nå i kø for sletting av overhengende sletting.
       empty: Ingen domener funnet.
+      known_accounts:
+        one: "%{count} kjent konto"
+        other: "%{count} kjente kontoer"
       moderation:
         all: Alt
         limited: Begrenset
         title: Moderasjon
       private_comment: Privat kommentar
       public_comment: Offentlig kommentar
+      purge: Rens
+      purge_description_html: Hvis du tror dette domenet er frakoblet for godt, kan du slette alle kontoer og tilknyttede data fra dette domenet fra lagringen. Dette kan ta en stund.
       title: Kjente instanser
       total_blocked_by_us: Blokkert av oss
       total_followed_by_them: Fulgt av dem
       total_followed_by_us: Fulgt av oss
       total_reported: Rapporter om dem
       total_storage: Mediavedlegg
+      totals_time_period_hint_html: Summen som vises nedenfor inkluderer data for alle tider.
     invites:
       deactivate_all: Deaktiver alle
       filter:
@@ -528,38 +568,54 @@
         notes:
           one: "%{count} notis"
           other: "%{count} notiser"
+      action_log: Revisjon logg
       action_taken_by: Handling utført av
       actions:
         delete_description_html: De rapporterte innleggene vil bli slettet, og en advarsel vil bli tatt vare på for å hjelpe deg eskalere ved fremtidige overtredelser fra samme konto.
         mark_as_sensitive_description_html: Mediene i de rapporterte innleggene vil bli merket som følsomme, og en advarsel vil bli notert for å hjelpe deg eskalere ved fremtidige overtredelser fra samme konto.
+        other_description_html: Se flere alternativer for å kontrollere kontoens atferd og tilpasse kommunikasjonen til den oppgitte kontoen.
         resolve_description_html: Ingen handling utføres mot den rapporterte kontoen, ingen advarsel gis, og rapporten lukkes.
         silence_description_html: Profilen vil kun være synlig for dem som allerede følger den eller manuelt slår den opp, noe som sterkt begrenser dens rekkevidde. Kan alltid tilbakestilles.
+        suspend_description_html: Profilen og alt innholdet blir utilgjengelig inntil det til slutt blir slettet. Samhandle med kontoen vil være umulig. Reversibelt innen 30 dager.
+      actions_description_html: Velg hvilke tiltak som skal treffes for å løse denne rapporten. Dersom du tar noen entydige tiltak mot den oppgitte kontoen, blir det sendt en e-post til dem, unntatt når <strong>Søppelpost</strong> -kategorien er valgt.
+      add_to_report: Legg til mer i rapporten
       are_you_sure: Er du sikker?
       assign_to_self: Tilegn til meg
       assigned: Tilegnet moderator
       by_target_domain: Domenet av rapportert bruker
+      category: Kategori
+      category_description_html: Årsaken til at denne kontoen og/eller innholdet er blitt rapportert vil bli henvist i forbindelse med den rapporterte kontoen
       comment:
         none: Ingen
+      comment_description_html: 'For å gi mer informasjon, %{name} skrev:'
       created_at: Rapportert
+      delete_and_resolve: Slettede innlegg
       forwarded: Videresendt
       forwarded_to: Videresendt til %{domain}
       mark_as_resolved: Merk som løst
       mark_as_sensitive: Merk som følsomt
       mark_as_unresolved: Merk som uoppklart
+      no_one_assigned: Ingen
       notes:
         create: Legg til notat
         create_and_resolve: Løst med notat
         create_and_unresolve: Gjenåpne med notat
         delete: Slett
         placeholder: Beskriv hvilke handlinger som har blitt tatt, eller andre relaterte oppdateringer...
+        title: Notater
+      notes_description_html: Se og skriv notater til andre moderatorer og deg selv i fremtiden
+      quick_actions_description_html: 'Ta en rask handling eller bla ned for å se rapportert innhold:'
+      remote_user_placeholder: ekstern bruker fra %{instance}
       reopen: Gjenåpne rapporten
       report: 'Rapporter #%{id}'
       reported_account: Rapportert konto
       reported_by: Rapportert av
       resolved: Løst
       resolved_msg: Rapport løst!
+      skip_to_actions: Hopp over til handlinger
       status: Status
       statuses: Rapportert innhold
+      statuses_description_html: Innholdet som tilbys, vil bli nevnt i forbindelse med den rapporterte kontoen
       target_origin: Opprinnelse for innrapportert konto
       title: Rapporter
       unassign: Fjern tilegning
@@ -575,7 +631,10 @@
         administration: Administrasjon
         devops: DevOps
         invites: Invitasjoner
+        moderation: Moderering
+        special: Spesiell
       delete: Slett
+      description_html: Med <strong>brukerroller</strong>kan du tilpasse hvilke funksjoner og områder av Mastodon dine brukere har tilgang til.
       edit: Rediger rollen '%{name}'
       everyone: Standard-tillatelser
       everyone_full_description_html: Dette er <strong>basis-rollen</strong> som påvirker <strong>alle brukere</strong>, selv de uten en tilordnet rolle. Alle andre roller arver tillatelser fra den.
@@ -589,11 +648,32 @@
         delete_user_data_description: Lar brukere slette andre brukeres data uten forsinkelse
         invite_users: Invitere brukere
         invite_users_description: Lar brukere invitere nye personer til serveren
+        manage_announcements: Behandle Kunngjøringer
+        manage_announcements_description: Lar brukere endre kunngjøringer på serveren
+        manage_blocks: Behandle Blokker
+        manage_custom_emojis: Administrer egendefinerte Emojier
+        manage_custom_emojis_description: Lar brukere endre egendefinert emojis på serveren
+        manage_federation: Administrer Føderasjon
+        manage_federation_description: Lar brukere blokkere eller tillate føderasjon med andre domener og kontrollere leveringsevne
+        manage_invites: Administrer Invitasjoner
         manage_invites_description: Lar brukere bla gjennom og deaktivere invitasjonslenker
+        manage_reports: Administrer Rapporter
+        manage_reports_description: Lar brukere se på rapporter og utføre moderasjonshandlinger mot dem
+        manage_roles: Behandle Roller
+        manage_rules: Administrer Regler
+        manage_rules_description: La brukere endre serverregler
+        manage_settings: Administrer Innstillinger
+        manage_settings_description: La brukere endre sideinnstillinger
+        manage_user_access: Administrer Brukertilgang
+        manage_user_access_description: Lar brukere deaktivere andre brukeres 2-trinnsinnlogging, endre sin e-postadresse, og tilbakestille passordet deres
+        manage_users: Behandle Brukere
+        manage_users_description: Lar brukere se detaljer om andre brukere og utføre moderasjonshandlinger mot dem
+        manage_webhooks: Administrer Webhooks
         view_dashboard: Vis dashbord
         view_dashboard_description: Gir brukere tilgang til dashbordet og ulike metrikker
         view_devops: DevOps
         view_devops_description: Gir brukere tilgang til Sidekiq og pgHero-dashbord
+      title: Roller
     rules:
       add_new: Legg til et filter
       delete: Slett
@@ -603,13 +683,32 @@
       title: Server regler
     settings:
       about:
+        manage_rules: Behandle serverregler
+        preamble: Gi informasjon om hvordan serveren opereres, modereres, finansieres.
+        rules_hint: Det er et eget område for regler som brukerne skal følge her.
         title: Om
+      appearance:
+        preamble: Tilpass Mastodons webgrensesnitt.
+        title: Utseende
+      branding:
+        title: Merkevare
+      content_retention:
+        preamble: Kontroller hvordan brukergenerert innhold lagres i Mastodon.
+      default_noindex:
+        desc_html: Påvirker alle brukerne som ikke selv har justert denne innstillingen
+        title: Ikke la brukere indekseres av søkemotorer som standard
       discovery:
+        follow_recommendations: Følg anbefalinger
+        public_timelines: Offentlige tidslinjer
+        title: Oppdagelse
         trends: Trender
       domain_blocks:
         all: Til alle
         disabled: Til ingen
         users: Til lokale brukere som er logget inn
+      registrations:
+        preamble: Kontroller hvem som kan opprette en konto på serveren din.
+        title: Registreringer
       registrations_mode:
         modes:
           approved: Godkjenning kreves for påmelding
@@ -623,18 +722,25 @@
       account: Forfatter
       application: Applikasjon
       back_to_account: Tilbake til kontosiden
+      back_to_report: Tilbake til rapport siden
       batch:
         remove_from_report: Fjern fra rapport
+        report: Rapport
       deleted: Slettet
+      favourites: Favoritter
       history: Versjonshistorikk
+      in_reply_to: Svarer til
       language: Språk
       media:
         title: Media
       metadata: Metadata
       no_status_selected: Ingen statuser ble endret da ingen ble valgt
+      open: Åpne innlegg
       original_status: Opprinnelig innlegg
+      reblogs: Fremheve
       status_changed: Innlegg endret
       title: Kontostatuser
+      trending: Populært
       visibility: Synlighet
       with_media: Med media
     strikes:
@@ -663,6 +769,7 @@
         message_html: Ingen Sidekiq-prosess kjører for %{value} køen(e). Vennligst se gjennom Sidekiq-konfigurasjonen din
     tags:
       review: Gjennomgangsstatus
+      updated_msg: Emneknagg innstillinger vellykket oppdatert
     title: Administrasjon
     trends:
       allow: Tillat
@@ -670,31 +777,82 @@
       disallow: Ikke tillat
       links:
         allow: Tillat lenke
+        allow_provider: Tillat utgiver
+        description_html: Dette er linker som for øyeblikket deles mye av kontoer som serveren din ser innlegg fra. Det kan hjelpe brukerne dine med å finne ut hva som skjer i verden. Ingen lenker vises offentlig før du godkjenner utgiveren. Du kan også tillate eller avvise individuelle lenker.
         disallow: Ikke tillat lenke
+        disallow_provider: Forby utgiver
         no_link_selected: Ingen lenker ble endret da ingen var valgt
+        publishers:
+          no_publisher_selected: Ingen utgivere ble endret da ingen ble valgt
         shared_by_over_week:
           one: Delt av %{count} person i løpet av den siste uken
           other: Delt av %{count} personer i løpet av den siste uken
+        title: Populære lenker
         usage_comparison: Delt %{today} ganger i dag, sammenlignet med %{yesterday} i går
+      only_allowed: Kun tillatte
       pending_review: Avventer gjennomgang
+      preview_card_providers:
+        allowed: Lenker fra denne utgiveren kan "trende"
+        rejected: Lenker fra denne utgiveren vil ikke "trende"
+        title: Utgivere
       rejected: Avvist
       statuses:
         allow: Tillat innlegg
         allow_account: Tillat forfatter
+        description_html: Dette er innlegg som serveren din vet om at de blir delt og favorisert for øyeblikket. Dette kan hjelpe dine nye og returnerede brukere med å finne flere å følge. Ingen innlegg vises offentlig før du godkjenner forfatteren, og forfatteren tillater at kontoen deres foreslås til andre. Du kan også tillate eller avvise individuelle innlegg.
         disallow: Ikke tillat innlegg
+        disallow_account: Forby forfatter
+        title: Populære innlegg
+      tags:
+        current_score: Gjeldende poengsum %{score}
+        dashboard:
+          tag_accounts_measure: unike bruksområder
+          tag_languages_dimension: Mest brukte språk
+          tag_servers_dimension: Mest brukte servere
+          tag_servers_measure: forskjellige servere
+          tag_uses_measure: samlet bruk
+        description_html: Dette er emneknagger som for øyeblikket vises i mange innlegg som serveren din ser. Det kan hjelpe dine brukere med å finne ut hva folk snakker mest om i øyeblikket. Ingen emneknagger vises offentlig før du godkjenner dem.
+        listable: Kan bli foreslått
+        not_listable: Vil ikke bli foreslått
+        not_trendable: Kunne ikke vises under trender
+        not_usable: Kan ikke brukes
+        usable: Kan brukes
+        used_by_over_week:
+          one: Brukt av en person i løpet av siste uke
+          other: Brukes av %{count} personer i løpet av den siste uken
+      title: Trend
+      trending: Trender
     warning_presets:
       add_new: Legg til ny
       delete: Slett
+      edit_preset: Rediger advarsel forhåndsinnstilling
+      empty: Du har ikke definert noen forhåndsinnstillinger for varsler enda.
       title: Endre forhåndsinnstillinger for advarsler
     webhooks:
       add_new: Legg til endepunkt
+      delete: Slett
+      description_html: En <strong>webhook</strong> gjør det mulig for Mastodon å dytte <strong>varsler i sanntid</strong> om utvalgte arrangementer til din egen applikasjon, Derfor kan søknaden din <strong>utløse reaksjoner</strong> automatisk.
+      disable: Deaktiver
+      disabled: Deaktivert
+      edit: Rediger sluttpunkt
+      empty: Du har ingen webhook-endepunkter konfigurert ennå.
+      enable: Aktiver
+      enabled: Aktiv
+      enabled_events:
+        one: 1 aktivert hendelse
+        other: "%{count} aktiverte hendelser"
+      events: Hendelser
       status: Status
   admin_mailer:
     new_appeal:
       actions:
+        delete_statuses: å slette sine innlegg
+        disable: for å fryse kontoen deres
         mark_statuses_as_sensitive: å merke innleggene sine som følsomme
+        none: en advarsel
         sensitive: å merke kontoen sin som følsom
         silence: for å begrense deres konto
+        suspend: for å avslutte kontoen
     new_pending_account:
       body: Detaljer om den nye kontoen er nedenfor. Du kan godkjenne eller avvise denne søknaden.
       subject: Ny konto opp til vurdering på %{instance} (%{username})
@@ -702,8 +860,18 @@
       body: "%{reporter} har rapportert %{target}"
       body_remote: Noen fra %{domain} har rapportert %{target}
       subject: Ny rapport for %{instance} (#%{id})
+    new_trends:
+      new_trending_links:
+        title: Populære lenker
+      new_trending_statuses:
+        title: Populære innlegg
+      new_trending_tags:
+        title: Populære emneknagger
+      subject: Ny trender for gjennomsyn av %{instance}
   aliases:
     add_new: Lag et alias
+    created_msg: Vellykket opprettelse av nytt alias. Du kan nå starte flyttingen fra den gamle kontoen.
+    deleted_msg: Fjernet alias. Flytting fra denne kontoen til denne vil ikke lenger være mulig.
     empty: Du har ingen aliaser.
     hint_html: Dersom du vil flytte fra en annen konto til den, kan du lage et alias her, som er påkrevd før du kan gå videre med å flytte følgere fra den gamle kontoen til den nye. Handlingen i seg selv er <strong>harmløs og reversibel</strong>. <strong>Kontoflyttingen har blitt satt i gang fra den gamle kontoen</strong>.
     remove: Fjern aliaslenking
@@ -715,6 +883,7 @@
     discovery: Oppdagelse
     localization:
       body: Mastodon er oversatt av frivillige.
+      guide_link: https://crowdin.com/project/mastodon
       guide_link_text: Alle kan bidra.
     sensitive_content: Følsomt innhold
     toot_layout: Innleggsoppsett
@@ -770,6 +939,9 @@
       email_below_hint_html: Dersom E-postadressen nedenfor er feil, kan du endre det her og motta en ny bekreftelses-E-post.
       email_settings_hint_html: Bekreftelses-E-posten ble sendt til %{email}. Dersom den E-postadressen ikke var riktig, kan du endre den i kontoinnstillingene.
       title: Innstillinger
+    sign_in:
+      preamble_html: Logg inn med ditt <strong>%{domain}</strong> brukeropplysninger. Hvis kontoen din er plassert på en annen server, vil du ikke kunne logge inn her.
+      title: Logg inn på %{domain}
     sign_up:
       preamble: Med en konto på denne Mastodon-tjeneren vil du kunne følge andre personer på nettverket, uansett hvor kontoen deres holder til.
       title: La oss få deg satt i gang på %{domain}.
@@ -917,34 +1089,70 @@
       thread: Samtaler
     edit:
       add_keyword: Legg til stikkord
+      keywords: Nøkkelord
       statuses: Individuelle innlegg
       title: Rediger filter
     index:
+      contexts: Filtre i %{contexts}
       delete: Slett
       empty: Du har ingen filtre.
+      expires_in: Utløper om %{distance}
+      expires_on: Utløper den %{date}
+      keywords:
+        one: "%{count} nøkkelord"
+        other: "%{count} nøkkelorder"
+      statuses:
+        one: "%{count} innlegg"
+        other: "%{count} innlegger"
+      statuses_long:
+        one: "%{count} enkeltinnlegg skjult"
+        other: "%{count} individuelle innlegger skjult"
       title: Filtre
     new:
+      save: Lagre nytt filter
       title: Legg til nytt filter
+    statuses:
+      back_to_filter: Tilbake til filter
+      batch:
+        remove: Fjern fra filter
+      index:
+        hint: Dette filteret gjelder for å velge individuelle innlegg uavhengig av andre kriterier. Du kan legge til flere innlegg til dette filteret fra webgrensesnittet.
+        title: Filtrerte innlegg
   footer:
     trending_now: Trender nå
   generic:
     all: Alle
+    all_items_on_page_selected_html:
+      one: "<strong>%{count}</strong> element på denne siden er valgt."
+      other: Alle <strong>%{count}</strong> elementer på denne siden er valgt.
+    all_matching_items_selected_html:
+      one: "<strong>%{count}</strong> element som matcher søket ditt er valgt."
+      other: Alle <strong>%{count}</strong> elementer som matcher søket velges.
     changes_saved_msg: Vellykket lagring av endringer!
     copy: Kopier
     delete: Slett
+    deselect: Fjern all merking
+    none: Ingen
     order_by: Sorter etter
     save_changes: Lagre endringer
+    select_all_matching_items:
+      one: Velg %{count} element som samsvarer med søket ditt.
+      other: Velg alle %{count} elementer som samsvarer med søket ditt.
     today: i dag
     validation_errors:
       one: Noe er ikke helt riktig ennå. Vennligst se etter en gang til
       other: Noe er ikke helt riktig ennå. Det er ennå %{count} feil å rette på
+  html_validator:
+    invalid_markup: 'inneholder ugyldig HTML-markør: %{error}'
   imports:
     errors:
       invalid_csv_file: 'Ugyldig CSV-fil. Feil: %{error}'
       over_rows_processing_limit: inneholder flere enn %{count} rader
     modes:
       merge: Slå sammen
+      merge_long: Behold eksisterende og legg til nye
       overwrite: Overskriv
+      overwrite_long: Erstatt gjeldende med de nye
     preface: Du kan importere data om brukere du følger eller blokkerer til kontoen din på denne instansen med eksportfiler fra andre instanser.
     success: Dine data ble mottatt og vil bli behandlet så fort som mulig
     types:
@@ -983,6 +1191,7 @@
     authentication_methods:
       otp: to-faktor autentiseringsapp
       password: passord
+      sign_in_token: e-post sikkerhetskode
       webauthn: sikkerhetsnøkler
     description_html: Hvis du ser aktivitet som du ikke gjenkjenner, bør du vurdere å endre passordet ditt og aktivere to-trinnsinnlogging.
     empty: Ingen innloggingshistorikk er tilgjengelig
@@ -1031,6 +1240,8 @@
     carry_blocks_over_text: Denne brukeren flyttet fra %{acct}, som du hadde blokkert.
     carry_mutes_over_text: Denne brukeren flyttet fra %{acct}, som du hadde dempet.
     copy_account_note_text: 'Denne brukeren flyttet fra %{acct}, her var dine tidligere notater om dem:'
+  navigation:
+    toggle_menu: Vis/Skjul meny
   notification_mailer:
     admin:
       report:
@@ -1055,6 +1266,8 @@
       body: 'Du ble nevnt av %{name} i:'
       subject: Du ble nevnt av %{name}
       title: Ny nevning
+    poll:
+      subject: En avstemming av %{name} er avsluttet
     reblog:
       body: 'Ditt innlegg ble fremhevet av %{name}:'
       subject: "%{name} fremhevet ditt innlegg"
@@ -1135,6 +1348,7 @@
     errors:
       invalid_rules: refererer ikke til gyldige regler
   rss:
+    content_warning: 'Innholdsadvarsel:'
     descriptions:
       account: Offentlige innlegg fra @%{acct}
       tag: 'Offentlige innlegg merket med #%{hashtag}'
@@ -1357,6 +1571,8 @@
         disable: Du kan ikke lenger bruke kontoen din, men profilen din og andre data forblir intakt. Du kan be om en sikkerhetskopi av dine data, endre kontoinnstillinger eller slette din konto.
         mark_statuses_as_sensitive: Noen av dine innlegg har blitt merket som følsomme av moderatorene på %{instance}. Dette betyr at folk må trykke på media i innleggene før en forhåndsvisning blir vist. Du kan merke medier som følsomme når du publiserer i fremtiden.
         sensitive: Fra nå av, vil alle dine opplastede mediefiler bli merket som følsomme og skjult bak et klikk-advarsel.
+        silence: Du kan fortsatt bruke din konto, men bare personer som allerede følger deg vil se dine innlegg på denne serveren, og du kan bli ekskludert fra ulike funnfunksjoner. Andre kan fremdeles følge deg manuelt.
+        suspend: Du kan ikke lenger bruke kontoen din, og profilen din og andre data er ikke lenger tilgjengelige. Du kan fortsatt logge inn for å be om en sikkerhetskopi av dataene dine til dataene er fullstendig fjernet i løpet av omtrent 30 dager. men vi vil holde på noen grunndata for å forhindre at du unngår suspensjonen.
       reason: 'Årsak:'
       statuses: 'Innlegg angitt:'
       subject:
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 5677159b6..3457d7801 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -493,6 +493,8 @@ oc:
     registration_closed: "%{instance} accepta pas de nòus membres"
     resend_confirmation: Tornar mandar las instruccions de confirmacion
     reset_password: Reïnicializar lo senhal
+    rules:
+      title: Unas règlas de basa.
     security: Seguretat
     set_new_password: Picar un nòu senhal
     setup:
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 753c40725..67976d987 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -122,6 +122,8 @@ pl:
       redownloaded_msg: Pomyślnie odświeżono profil %{username} z miejsca pochodzenia
       reject: Odrzuć
       rejected_msg: Pomyślnie odrzucono wniosek o rejestrację %{username}
+      remote_suspension_irreversible: Dane tego konta zostały nieodwracalnie usunięte.
+      remote_suspension_reversible_hint_html: Konto zostało zawieszone na serwerze, a dane zostaną w pełni usunięte dnia %{date}. Do tego czasu zdalny serwer może przywrócić to konto bez żadnych konsekwencji. Jeśli chcesz natychmiast usunąć wszystkie dane konta, możesz to zrobić poniżej.
       remove_avatar: Usun awatar
       remove_header: Usuń nagłówek
       removed_avatar_msg: Pomyślnie usunięto awatar %{username}
@@ -583,7 +585,6 @@ pl:
     report_notes:
       created_msg: Pomyslnie utworzono notatkę moderacyjną.
       destroyed_msg: Pomyślnie usunięto notatkę moderacyjną.
-      today_at: Dziś o %{time}
     reports:
       account:
         notes:
@@ -732,6 +733,9 @@ pl:
       content_retention:
         preamble: Kontroluj, jak treści generowane przez użytkownika są przechowywane w Mastodon.
         title: Retencja treści
+      default_noindex:
+        desc_html: Wpłynie to na wszystkich użytkowników, którzy sami tego nie zmienili w swoich ustawieniach
+        title: Domyślnie żądaj nieindeksowania użytkowników przez wyszukiwarki
       discovery:
         follow_recommendations: Polecane konta
         preamble: Prezentowanie interesujących treści ma kluczowe znaczenie dla nowych użytkowników, którzy mogą nie znać nikogo z Mastodona. Kontroluj, jak różne funkcje odkrywania działają na Twoim serwerze.
@@ -1007,6 +1011,9 @@ pl:
       email_below_hint_html: Jeżeli poniższy adres e-mail jest nieprawidłowy, możesz zmienić go tutaj i otrzymać nowy e-mail potwierdzający.
       email_settings_hint_html: E-mail potwierdzający został wysłany na %{email}. Jeżeli adres e-mail nie jest prawidłowy, możesz zmienić go w ustawieniach konta.
       title: Konfiguracja
+    sign_in:
+      preamble_html: Zaloguj się przy użyciu danych logowania <strong>%{domain}</strong>. Jeśli Twoje konto jest hostowane na innym serwerze, nie będziesz mógł się zalogować tutaj.
+      title: Zaloguj się do %{domain}
     sign_up:
       preamble: Z kontem na tym serwerze Mastodon będziesz mógł obserwować każdą inną osobę w sieci, niezależnie od miejsca przechowywania ich konta.
       title: Skonfigurujmy Twoje konto na %{domain}.
@@ -1502,7 +1509,7 @@ pl:
     preferences: Preferencje
     profile: Profil
     relationships: Obserwowani i obserwujący
-    statuses_cleanup: Automatyczne usuwanie posta
+    statuses_cleanup: Automatyczne usuwanie wpisów
     strikes: Ostrzeżenia moderacyjne
     two_factor_authentication: Uwierzytelnianie dwuetapowe
     webauthn_authentication: Klucze bezpieczeństwa
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index eca2804e8..82cdbb25c 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -116,6 +116,8 @@ pt-BR:
       redownloaded_msg: O perfil de %{username} foi atualizado a partir da origem
       reject: Rejeitar
       rejected_msg: O pedido de registro de %{username} foi rejeitado
+      remote_suspension_irreversible: Os dados desta conta foram excluídos de forma irreversível.
+      remote_suspension_reversible_hint_html: A conta foi suspensa em seu servidor, e todos os dados serão removidos em %{date}. Até lá, o servidor remoto pode restaurar essa conta sem nenhum efeito negativo. Se você quer remover todos os dados desta conta imediatamente, você pode fazer isso abaixo.
       remove_avatar: Remover imagem de perfil
       remove_header: Remover capa
       removed_avatar_msg: A imagem de perfil de %{username} foi removida
@@ -394,6 +396,7 @@ pt-BR:
           silence: Limitar
           suspend: Banir
         title: Novo bloqueio de domínio
+      no_domain_block_selected: Nenhum bloqueio de domínio foi alterado porque nenhum foi selecionado
       not_permitted: Você não possui permissão para realizar esta ação
       obfuscate: Ofuscar nome de domínio
       obfuscate_hint: Ofuscar parcialmente o domínio na lista se a exibição da lista de domínios limitados estiver habilitada
@@ -433,6 +436,7 @@ pt-BR:
     export_domain_blocks:
       import:
         description_html: Você está prestes a importar uma lista de boqueio de domínio. Por favor, revise esta lista com muito cuidado, especialmente se você mesmo não criou esta lista.
+        existing_relationships_warning: Existem relações de seguimento
         private_comment_template: Importado de %{source} em %{date}
         title: Importar bloqueio de domínios
       new:
@@ -557,7 +561,6 @@ pt-BR:
     report_notes:
       created_msg: Nota de denúncia criada!
       destroyed_msg: Nota de denúncia excluída!
-      today_at: Hoje às %{time}
     reports:
       account:
         notes:
@@ -700,6 +703,8 @@ pt-BR:
       content_retention:
         preamble: Controlar como o conteúdo gerado pelo usuário é armazenado no Mastodon.
         title: Retenção de conteúdo
+      default_noindex:
+        desc_html: Afeta qualquer usuário que não tenha alterado esta configuração manualmente
       discovery:
         follow_recommendations: Seguir recomendações
         preamble: Navegar por um conteúdo interessante é fundamental para integrar novos usuários que podem não conhecer ninguém no Mastodon. Controle como várias características de descoberta funcionam no seu servidor.
@@ -787,6 +792,8 @@ pt-BR:
         disallow: Proibir link
         disallow_provider: Proibir autor
         no_link_selected: Nenhum link foi alterado como nenhum foi selecionado
+        publishers:
+          no_publisher_selected: Nenhum editor foi alterado porque nenhum foi selecionado
         shared_by_over_week:
           one: Compartilhado por uma pessoa na última semana
           other: Compartilhado por %{count} pessoas na última semana
@@ -964,6 +971,8 @@ pt-BR:
       email_below_hint_html: Se o endereço de e-mail abaixo não for seu, você pode alterá-lo aqui e receber um novo e-mail de confirmação.
       email_settings_hint_html: O e-mail de confirmação foi enviado para %{email}. Se esse endereço de e-mail não estiver correto, você pode alterá-lo nas configurações da conta.
       title: Configurações
+    sign_in:
+      title: Entrar em %{domain}
     sign_up:
       preamble: Com uma conta neste servidor Mastodon, você poderá seguir qualquer outra pessoa na rede, independentemente de onde sua conta esteja hospedada.
       title: Então vamos lá criar uma conta em %{domain}.
@@ -1296,7 +1305,7 @@ pt-BR:
     reblog:
       body: "%{name} impulsionou a sua publicação:"
       subject: "%{name} impulsionou a sua publicação"
-      title: Novo boost
+      title: Novo impulso
     status:
       subject: "%{name} acabou de publicar"
     update:
@@ -1532,7 +1541,7 @@ pt-BR:
     min_reblogs: Manter publicações impulsionadas por ao menos
     min_reblogs_hint: Não exclui publicações que receberam pelo menos esta quantidade de impulsos. Deixe em branco para excluir publicações independentemente da quantidade de impulsos
   stream_entries:
-    pinned: Publicação fixada
+    pinned: Toot fixado
     reblogged: deu boost
     sensitive_content: Conteúdo sensível
   strikes:
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index 1f382f615..dbc2701f0 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -1,11 +1,11 @@
 ---
 pt-PT:
   about:
-    about_mastodon_html: Mastodon é uma rede social baseada em protocolos abertos da web e software livre e gratuito. É descentralizado como e-mail.
-    contact_missing: Não configurado
+    about_mastodon_html: 'A rede social do futuro: sem publicidade, e sem vigilância empresarial; desenho ético, e descentralizado! Tome posse dos seus dados com o Mastodon!'
+    contact_missing: Por definir
     contact_unavailable: n.d.
     hosted_on: Mastodon em %{domain}
-    title: Sobre
+    title: Acerca de
   accounts:
     follow: Seguir
     followers:
@@ -14,10 +14,10 @@ pt-PT:
     following: A seguir
     instance_actor_flash: Esta conta é um actor virtual usado para representar a própria instância e não um utilizador individual. É usada para motivos de federação e não deve ser suspenso.
     last_active: última vez activo
-    link_verified_on: A posse deste link foi verificada em %{date}
+    link_verified_on: A posse desta hiperligação foi verificada em %{date}
     nothing_here: Não há nada aqui!
     pin_errors:
-      following: Tu tens de estar a seguir a pessoa que pretendes apoiar
+      following: Tem de estar a seguir a pessoa que pretende apoiar
     posts:
       one: Publicação
       other: Publicações
@@ -27,18 +27,18 @@ pt-PT:
       action: Executar acção
       title: Executar acção de moderação em %{acct}
     account_moderation_notes:
-      create: Criar nota
-      created_msg: Nota de moderação criada com sucesso!
-      destroyed_msg: Nota de moderação excluída com sucesso!
+      create: Deixar uma nota
+      created_msg: Nota de moderação correctamente criada!
+      destroyed_msg: Nota de moderação destruída!
     accounts:
-      add_email_domain_block: Adicionar o domínio de e-mail à lista negra
+      add_email_domain_block: Bloquear este domínio de correio electrónico
       approve: Aprovar
-      approved_msg: Inscrição de %{username} aprovada com sucesso
+      approved_msg: Inscrição de %{username} aprovada correctamente
       are_you_sure: Tens a certeza?
-      avatar: Imagem de Perfil
+      avatar: Imagem de perfil
       by_domain: Domínio
       change_email:
-        changed_msg: E-mail alterado com sucesso!
+        changed_msg: Endereço de correio electrónico alterado!
         current_email: E-mail atual
         label: Alterar e-mail
         new_email: Novo e-mail
@@ -59,17 +59,17 @@ pt-PT:
       destroyed_msg: Os dados de %{username} estão agora em fila de espera para serem eliminados de imediato
       disable: Congelar
       disable_sign_in_token_auth: Desativar token de autenticação por e-mail
-      disable_two_factor_authentication: Desativar 2FA
+      disable_two_factor_authentication: Desactivar autenticação por dois factores (2FA)
       disabled: Congelada
       display_name: Nome a mostrar
       domain: Domínio
       edit: Editar
-      email: E-mail
+      email: Correio electrónico
       email_status: Estado do e-mail
       enable: Descongelar
       enable_sign_in_token_auth: Ativar token de autenticação por e-mail
       enabled: Ativado
-      enabled_msg: Descongelou com sucesso a conta %{username}
+      enabled_msg: Descongelou a conta %{username}
       followers: Seguidores
       follows: A seguir
       header: Cabeçalho
@@ -85,7 +85,7 @@ pt-PT:
         title: Local
       login_status: Estado de início de sessão
       media_attachments: Anexos de media
-      memorialize: Converter em memorial
+      memorialize: Converter num memorial
       memorialized: Em memória
       memorialized_msg: Conta %{username} transformada com sucesso em memorial
       moderation:
@@ -104,76 +104,78 @@ pt-PT:
       not_subscribed: Não inscrito
       pending: Pendente de revisão
       perform_full_suspension: Fazer suspensão completa
-      previous_strikes: Punições anteriores
+      previous_strikes: Reprimendas anteriores
       previous_strikes_description_html:
-        one: Esta conta tem <strong>1</strong> punição.
-        other: Esta conta tem <strong>%{count}</strong> punições.
+        one: Esta conta tem <strong>1</strong> reprimenda.
+        other: Esta conta tem <strong>%{count}</strong> reprimendas.
       promote: Promover
       protocol: Protocolo
       public: Público
       push_subscription_expires: A Inscrição PuSH expira
       redownload: Atualizar perfil
-      redownloaded_msg: Atualizado com sucesso o perfil de %{username} da origem
+      redownloaded_msg: Perfil de %{username} correctamente actualizado a partir da origem
       reject: Rejeitar
-      rejected_msg: Inscrição de %{username} rejeitada com sucesso
+      rejected_msg: Inscrição de %{username} correctamente rejeitada
+      remote_suspension_irreversible: Os dados desta conta foram eliminados irreversivelmente.
+      remote_suspension_reversible_hint_html: A conta foi suspensa no servidor de origem e os seus dados serão totalmente eliminados em %{date}. Até lá, o servidor de origem poderá recuperar esta conta sem quaisquer efeitos negativos. Se desejar eliminar todos os dados desta conta imediatamente, pode fazê-lo em baixo.
       remove_avatar: Remover a imagem de perfil
       remove_header: Remover o cabeçalho
-      removed_avatar_msg: Imagem de perfil de %{username} removida com sucesso
-      removed_header_msg: Imagem de cabeçalho de %{username} removida com sucesso
+      removed_avatar_msg: Imagem de perfil de %{username} removida
+      removed_header_msg: Imagem de cabeçalho de %{username} removida
       resend_confirmation:
         already_confirmed: Este utilizador já está confirmado
         send: Reenviar um e-mail de confirmação
-        success: E-mail de confirmação enviado com sucesso!
-      reset: Restaurar
-      reset_password: Reset palavra-passe
+        success: E-mail de confirmação enviado!
+      reset: Reiniciar
+      reset_password: Criar nova palavra-passe
       resubscribe: Reinscrever
       role: Função
       search: Pesquisar
-      search_same_email_domain: Outros utilizadores com o mesmo domínio de e-mail
+      search_same_email_domain: Outros utilizadores com o mesmo domínio de correio electrónico
       search_same_ip: Outros utilizadores com o mesmo IP
       security_measures:
         only_password: Apenas palavra-passe
         password_and_2fa: Palavra-passe e 2FA
-      sensitive: Marcar como sensível
-      sensitized: marcada como sensível
+      sensitive: Marcar como problemático
+      sensitized: Marcada como problemática
       shared_inbox_url: URL da caixa de entrada compartilhada
       show:
         created_reports: Denúncias realizadas
         targeted_reports: Denunciada por outros
-      silence: Silêncio
-      silenced: Silenciada
-      statuses: Status
-      strikes: Punições anteriores
+      silence: Limitar
+      silenced: Limitado
+      statuses: Publicações
+      strikes: Reprimendas anteriores
       subscribe: Inscrever-se
       suspend: Suspender
       suspended: Suspensa
-      suspension_irreversible: Os dados desta conta foram eliminados irreversivelmente. Pode cancelar a suspensão da conta para torná-la utilizável, mas ela não irá recuperar os dados que possuía anteriormente.
+      suspension_irreversible: Os dados desta conta foram eliminados irreversivelmente. Pode cancelar a suspensão da conta para torná-la utilizável, mas não irá recuperar os dados que possuía anteriormente.
       suspension_reversible_hint_html: A conta foi suspensa e os dados serão totalmente eliminados em %{date}. Até lá, a conta poderá ser recuperada sem quaisquer efeitos negativos. Se deseja eliminar todos os dados desta conta imediatamente, pode fazê-lo em baixo.
       title: Contas
       unblock_email: Desbloquear endereço de e-mail
-      unblocked_email_msg: Endereço de e-mail de %{username} desbloqueado com sucesso
-      unconfirmed_email: E-mail não confirmado
-      undo_sensitized: Desmarcar como sensível
+      unblocked_email_msg: Endereço de e-mail de %{username} desbloqueado
+      unconfirmed_email: Correio electrónico por confirmar
+      undo_sensitized: Desmarcar como problemático
       undo_silenced: Desfazer silenciar
       undo_suspension: Desfazer supensão
-      unsilenced_msg: Removeu com sucesso as limitações da conta %{username}
+      unsilenced_msg: Removeu as limitações da conta %{username}
       unsubscribe: Cancelar inscrição
-      unsuspended_msg: Removeu com sucesso a suspensão da conta %{username}
-      username: Utilizador
+      unsuspended_msg: Removeu a suspensão da conta %{username}
+      username: Nome de utilizador
       view_domain: Ver resumo do domínio
-      warn: Aviso
-      web: Web
-      whitelisted: Está na lista branca
+      warn: Advertir
+      web: Teia
+      whitelisted: Permitido para a federação
     action_logs:
       action_types:
-        approve_appeal: Aprovar Recurso
-        approve_user: Aprovar Utilizador
+        approve_appeal: Aprovar recurso
+        approve_user: Aprovar utilizador
         assigned_to_self_report: Atribuir Denúncia
-        change_email_user: Alterar E-mail do Utilizador
+        change_email_user: Alterar correio electrónico do utilizador
         change_role_user: Alterar Função do Utilizador
         confirm_user: Confirmar Utilizador
         create_account_warning: Criar Aviso
-        create_announcement: Criar Anúncio
+        create_announcement: Criar comunicado
         create_canonical_email_block: Criar Bloqueio de E-mail
         create_custom_emoji: Criar Emoji Personalizado
         create_domain_allow: Criar Permissão de Domínio
@@ -183,7 +185,7 @@ pt-PT:
         create_unavailable_domain: Criar Domínio Indisponível
         create_user_role: Criar Função
         demote_user: Despromover Utilizador
-        destroy_announcement: Eliminar Anúncio
+        destroy_announcement: Apagar comunicado
         destroy_canonical_email_block: Eliminar Bloqueio de E-mail
         destroy_custom_emoji: Eliminar Emoji Personalizado
         destroy_domain_allow: Eliminar Permissão de Domínio
@@ -201,7 +203,7 @@ pt-PT:
         enable_custom_emoji: Ativar Emoji Personalizado
         enable_sign_in_token_auth_user: Ativar token de autenticação por e-mail para Utilizador
         enable_user: Ativar Utilizador
-        memorialize_account: Memorizar Conta
+        memorialize_account: Tornar conta num memorial
         promote_user: Promover Utilizador
         reject_appeal: Rejeitar Recurso
         reject_user: Rejeitar Utilizador
@@ -210,15 +212,15 @@ pt-PT:
         resend_user: Reenviar E-mail de Confirmação
         reset_password_user: Repor Password
         resolve_report: Resolver Denúncia
-        sensitive_account: Marcar a media na sua conta como sensível
-        silence_account: Silenciar Conta
-        suspend_account: Suspender Conta
+        sensitive_account: Marcar a media na sua conta como problemática
+        silence_account: Limitar conta
+        suspend_account: Suspender conta
         unassigned_report: Desatribuir Denúncia
         unblock_email_account: Desbloquear endereço de e-mail
-        unsensitive_account: Desmarcar a media na sua conta como sensível
+        unsensitive_account: Desmarcar a conta como problemática
         unsilence_account: Deixar de Silenciar Conta
         unsuspend_account: Retirar Suspensão à Conta
-        update_announcement: Atualizar Anúncio
+        update_announcement: Atualizar comunicado
         update_custom_emoji: Atualizar Emoji Personalizado
         update_domain_block: Atualizar Bloqueio de Domínio
         update_ip_block: Atualizar regra de IP
@@ -283,28 +285,28 @@ pt-PT:
         update_ip_block_html: "%{name} alterou regra para IP %{target}"
         update_status_html: "%{name} atualizou o estado de %{target}"
         update_user_role_html: "%{name} alterou a função %{target}"
-      deleted_account: conta excluída
+      deleted_account: conta apagada
       empty: Não foram encontrados registos.
       filter_by_action: Filtrar por ação
       filter_by_user: Filtrar por utilizador
       title: Registo de auditoria
     announcements:
-      destroyed_msg: Anúncio eliminado com sucesso!
+      destroyed_msg: Comunicado correctamente eliminado!
       edit:
-        title: Editar anúncio
-      empty: Nenhum anúncio encontrado.
-      live: Em exibição
+        title: Editar comunicado
+      empty: Nenhum comunicado encontrado.
+      live: Em directo
       new:
-        create: Criar anúncio
-        title: Novo anúncio
+        create: Criar comunicado
+        title: Novo comunicado
       publish: Publicar
-      published_msg: Anúncio publicado com sucesso!
+      published_msg: Comunicado correctamente publicado!
       scheduled_for: Agendado para %{time}
-      scheduled_msg: Anúncio agendado para publicação!
-      title: Anúncios
+      scheduled_msg: Comunicado agendado para publicação!
+      title: Comunicados
       unpublish: Anular publicação
-      unpublished_msg: Anúncio retirado de exibição com sucesso!
-      updated_msg: Anúncio atualizado com sucesso!
+      unpublished_msg: Comunicado correctamente retirado de publicação!
+      updated_msg: Comunicado correctamente actualizado!
     custom_emojis:
       assign_category: Atribuir categoria
       by_domain: Domínio
@@ -324,20 +326,20 @@ pt-PT:
       enabled_msg: Ativado com sucesso este emoji
       image_hint: PNG ou GIF até %{size}
       list: Lista
-      listed: Listado
+      listed: Inventariado
       new:
-        title: Adicionar novo emoji customizado
+        title: Adicionar novo emoji personalizado
       no_emoji_selected: Nenhum emojis foi alterado, pois nenhum foi selecionado
       not_permitted: Não está autorizado a executar esta ação
-      overwrite: Sobrescrever
+      overwrite: Escrever por cima
       shortcode: Código de atalho
       shortcode_hint: Pelo menos 2 caracteres, apenas caracteres alfanuméricos e underscores
-      title: Emojis customizados
-      uncategorized: Sem categoria
+      title: Emojis personalizados
+      uncategorized: Não categorizados
       unlist: Não listar
-      unlisted: Não listado
+      unlisted: Não inventariado
       update_failed_msg: Não foi possível atualizar esse emoji
-      updated_msg: Emoji atualizado com sucesso!
+      updated_msg: Emoji correctamente actualizado!
       upload: Enviar
     dashboard:
       active_users: utilizadores activos
@@ -352,8 +354,8 @@ pt-PT:
         one: "<strong>%{count}</strong> denuncia pendente"
         other: "<strong>%{count}</strong> denuncias pendentes"
       pending_tags_html:
-        one: "<strong>%{count}</strong> hashtag pendente"
-        other: "<strong>%{count}</strong> hashtags pendentes"
+        one: "<strong>%{count}</strong> etiqueta pendente"
+        other: "<strong>%{count}</strong> etiquetas pendentes"
       pending_users_html:
         one: "<strong>%{count}</strong> utilizador pendente"
         other: "<strong>%{count}</strong> utilizadores pendentes"
@@ -362,52 +364,52 @@ pt-PT:
       sources: Origem de inscrições
       space: Utilização do espaço
       title: Painel de controlo
-      top_languages: Principais idiomas activos
+      top_languages: Principais línguas activas
       top_servers: Servidores mais activos
-      website: Website
+      website: Página na teia
     disputes:
       appeals:
         empty: Nenhum recurso encontrado.
         title: Recursos
     domain_allows:
-      add_new: Colocar domínio na lista branca
-      created_msg: Domínio foi adicionado à lista branca com sucesso
-      destroyed_msg: Domínio foi removido da lista branca
+      add_new: Permitir federação com o domínio
+      created_msg: Permissão correctamente atribuída para federação
+      destroyed_msg: Revogada a permissão de federação para o domínio
       export: Exportar
       import: Importar
-      undo: Remover da lista branca
+      undo: Revogar federação com o domínio
     domain_blocks:
-      add_new: Adicionar novo
+      add_new: Adicionar novo bloqueio de domínio
       created_msg: Bloqueio do domínio está a ser processado
-      destroyed_msg: Bloqueio de domínio está a ser removido
+      destroyed_msg: Retirado o bloqueio de domínio
       domain: Domínio
       edit: Editar bloqueio de domínio
-      existing_domain_block: Já impôs limites mais rigorosos a %{name}.
-      existing_domain_block_html: Você já impôs limites mais restritivos a %{name}, é necessário primeiro <a href="%{unblock_url}">desbloqueá-lo</a>.
+      existing_domain_block: Já tinha imposto limites mais rigorosos a %{name}.
+      existing_domain_block_html: Já tinha imposto limites mais restritivos a %{name}. Primeiro, precisa de o <a href="%{unblock_url}">desbloquear</a>.
       export: Exportar
       import: Importar
       new:
         create: Criar bloqueio
-        hint: O bloqueio de dominio não vai previnir a criação de entradas na base de dados, mas irá retroativamente e automaticamente aplicar métodos de moderação específica nessas contas.
+        hint: O bloqueio por domínio não vai prevenir a criação de contas na base de dados, mas irá retroactiva e automaticamente aplicar certos métodos de moderação nessas contas.
         severity:
           desc_html: "<strong>Limitar</strong> tornará as mensagens das contas neste domínio invisíveis a qualquer pessoa que não as esteja a seguir. <strong>Suspender</strong> removerá do seu servidor todo o conteúdo, media, e dados de perfil das contas deste domínio. Utilize <strong>Nenhum</strong> se apenas quiser rejeitar ficheiros media."
           noop: Nenhum
           silence: Limitar
           suspend: Suspender
         title: Novo bloqueio de domínio
-      no_domain_block_selected: Nenhum bloqueio de domínio foi alterado pois nenhum foi selecionado
+      no_domain_block_selected: Nenhum bloqueio de domínio foi alterado, pois nenhum foi seleccionado
       not_permitted: Não está autorizado a executar esta ação
       obfuscate: Ofuscar nome de domínio
-      obfuscate_hint: Ofuscar parcialmente o nome de domínio na lista, se estiverem habilitadas as limitações na publicação da lista de domínios
+      obfuscate_hint: Ofuscar parcialmente o nome de domínio na lista, caso estejam definidas limitações na publicação da lista de domínios
       private_comment: Comentário privado
       private_comment_hint: Comentário sobre essa limitação de domínio para uso interno pelos moderadores.
       public_comment: Comentário público
       public_comment_hint: Comentário sobre essa limitação de domínio para o público geral, se ativada a divulgação da lista de limitações de domínio.
       reject_media: Rejeitar ficheiros de media
-      reject_media_hint: Remove arquivos de media armazenados localmente e rejeita descarregar novos arquivos no futuro. Irrelevante para suspensões
-      reject_reports: Rejeitar denúncia
-      reject_reports_hint: Ignorar todos as denúncias provenientes deste domínio. Irrelevante para suspensões
-      undo: Anular
+      reject_media_hint: Remove ficheiros de media armazenados localmente, e rejeita a descarga de novos ficheiros no futuro. Sem pertinência para suspensões
+      reject_reports: Rejeitar denúncias
+      reject_reports_hint: Ignorar todas as denúncias provenientes deste domínio. Sem pertinência para suspensões
+      undo: Anular o bloqueio por domínio
       view: Ver domínios bloqueados
     email_domain_blocks:
       add_new: Adicionar novo
@@ -444,7 +446,7 @@ pt-PT:
       no_file: Nenhum ficheiro selecionado
     follow_recommendations:
       description_html: "<strong>Recomendações de quem seguir ajudam novos utilizadores a encontrar conteúdo interessante rapidamente.</strong>. Quando um utilizador não interage com outros o suficiente para formar recomendações personalizadas, estas contas são recomendadas. Elas são recalculadas diariamente a partir de uma mistura de contas com mais atividade recente e maior número de seguidores locais para um determinado idioma."
-      language: Para o idioma
+      language: Para a língua
       status: Estado
       suppress: Suprimir recomendação de contas a seguir
       suppressed: Suprimida
@@ -453,7 +455,7 @@ pt-PT:
     instances:
       availability:
         description_html:
-          one: Se a transmissão ao domínio falhar <strong>%{count} dia</strong> sem sucesso, nenhuma tentativa de transmissão será feita a menos que uma transmissão <em>proveniente</em> do domínio seja recebida.
+          one: Se a transmissão ao domínio falhar ao final de <strong>%{count} dia(s)</strong>, não será feita mais nenhuma tentativa de transmissão a menos que seja recebida uma transmissão <em>proveniente</em> desse domínio.
           other: Se a transmissão ao domínio falhar em <strong>%{count} dias diferentes</strong> sem sucesso, nenhuma tentativa de transmissão será feita a menos que uma transmissão <em>proveniente</em> do domínio seja recebida.
         failure_threshold_reached: Limite de falhas atingido em %{date}.
         failures_recorded:
@@ -466,7 +468,7 @@ pt-PT:
       back_to_limited: Limitadas
       back_to_warning: Aviso
       by_domain: Domínio
-      confirm_purge: Tem a certeza que deseja eliminar permanentemente os dados deste domínio?
+      confirm_purge: Tem a certeza de que deseja eliminar permanentemente os dados deste domínio?
       content_policies:
         comment: Nota interna
         description_html: Pode definir políticas de conteúdo que serão aplicadas a todas as contas deste domínio e a qualquer um dos seus subdomínios.
@@ -483,7 +485,7 @@ pt-PT:
         instance_accounts_measure: contas armazenadas
         instance_followers_measure: nossos seguidores lá
         instance_follows_measure: os seus seguidores aqui
-        instance_languages_dimension: Idiomas mais populares
+        instance_languages_dimension: Liderança de línguas
         instance_media_attachments_measure: anexos de media armazenados
         instance_reports_measure: denúncias sobre eles
         instance_statuses_measure: publicações armazenadas
@@ -509,11 +511,11 @@ pt-PT:
       private_comment: Comentários privados
       public_comment: Comentários públicos
       purge: Purgar
-      purge_description_html: Se acredita que este domínio está definitivamente offline, pode excluir todos os registos de contas e dados associados a ele do seu armazenamento. Isso pode demorar algum tempo.
-      title: Instâncias conhecidas
-      total_blocked_by_us: Bloqueadas por nós
-      total_followed_by_them: Seguidas por eles
-      total_followed_by_us: Seguidas por nós
+      purge_description_html: Se crê que este domínio está definitivamente fora de linha, pode apagar todos os seus registos de contas e dados associados do seu armazenamento. Isso pode demorar algum tempo.
+      title: Federação
+      total_blocked_by_us: Bloqueado(s) por nós
+      total_followed_by_them: Seguido(s) por eles
+      total_followed_by_us: Seguido(s) por nós
       total_reported: Denúncias sobre eles
       total_storage: Anexos de media
       totals_time_period_hint_html: Os totais exibidos abaixo incluem dados referentes ao tempo total.
@@ -527,7 +529,7 @@ pt-PT:
       title: Convites
     ip_blocks:
       add_new: Criar regra
-      created_msg: Nova regra de IP adicionada com sucesso
+      created_msg: Nova regra de IP correctamente adicionada
       delete: Eliminar
       expires_in:
         '1209600': 2 semanas
@@ -549,19 +551,18 @@ pt-PT:
       disable: Desativar
       disabled: Desactivado
       enable: Activar
-      enable_hint: Uma vez ativado, a tua instância irá subscrever a todas as publicações deste repetidor e irá começar a enviar as suas publicações públicas para ele.
+      enable_hint: Uma vez ativado, a tua instância irá assinar todas as publicações deste repetidor e irá começar a enviar as suas publicações públicas para lá.
       enabled: Ativado
       inbox_url: URL do repetidor
       pending: À espera da aprovação do repetidor
       save_and_enable: Guardar e ativar
       setup: Configurar uma ligação ao repetidor
-      signatures_not_enabled: Relays não funcionarão corretamente enquanto o modo seguro ou o modo lista branca estiverem ativados
+      signatures_not_enabled: Os repetidores não funcionarão correctamente enquanto o modo seguro ou o modo de lista branca estiverem activados
       status: Estado
       title: Retransmissores
     report_notes:
       created_msg: Nota de denúncia criada com sucesso!
       destroyed_msg: Nota de denúncia eliminada com sucesso!
-      today_at: Hoje às %{time}
     reports:
       account:
         notes:
@@ -570,11 +571,11 @@ pt-PT:
       action_log: Registo de auditoria
       action_taken_by: Ação tomada por
       actions:
-        delete_description_html: As publicações denunciadas serão eliminadas e uma punição será registada para ajudá-lo a escalar ações em futuras infrações pela mesma conta.
-        mark_as_sensitive_description_html: A media nas publicações denunciadas será marcada como sensível e uma punição será registada para ajudá-lo a escalar ações em futuras infrações pela mesma conta.
+        delete_description_html: As publicações denunciadas serão eliminadas, e será registada uma reprimenda para ajudá-lo a tomar medidas em futuras infrações pela mesma conta.
+        mark_as_sensitive_description_html: A media nas publicações denunciadas será marcada como problemática, e uma reprimenda será registada para ajudá-lo a tomar medidas em futuras infrações pela mesma conta.
         other_description_html: Ver mais opções para controlar o comportamento da conta e personalizar a comunicação para a conta denunciada.
-        resolve_description_html: Nenhuma ação será tomada contra a conta denunciada, nenhuma punição será registada, e a denuncia será fechada.
-        silence_description_html: O perfil será visível apenas para aqueles que já o seguem ou o procurem manualmente, limitando severamente o seu alcance. Pode sempre ser revertido.
+        resolve_description_html: Nenhuma ação será tomada contra a conta denunciada, não será registada nenhuma reprimenda, e a denúncia será fechada.
+        silence_description_html: O perfil será visível apenas para aqueles que já o seguem ou o procurem manualmente, limitando fortemente o seu alcance. Pode sempre ser revertido.
         suspend_description_html: O perfil e todo o seu conteúdo tornar-se-ão inacessíveis até serem eventualmente apagados. A interacção com a conta será impossível. Reversível no prazo de 30 dias.
       actions_description_html: Decida a ação a tomar para resolver esta denúncia. Se decidir por uma ação punitiva contra a conta denunciada, um e-mail de notificação será enviado, excetuando quando selecionada a categoria <strong>Spam</strong>.
       add_to_report: Adicionar mais à denúncia
@@ -592,8 +593,8 @@ pt-PT:
       forwarded: Encaminhado
       forwarded_to: Encaminhado para %{domain}
       mark_as_resolved: Marcar como resolvido
-      mark_as_sensitive: Marcar como sensível
-      mark_as_unresolved: Marcar como não resolvido
+      mark_as_sensitive: Marcar como problemático
+      mark_as_unresolved: Marcar como por resolver
       no_one_assigned: Ninguém
       notes:
         create: Adicionar nota
@@ -602,15 +603,15 @@ pt-PT:
         delete: Eliminar
         placeholder: Descreve as ações que foram tomadas ou quaisquer outras atualizações relacionadas...
         title: Notas
-      notes_description_html: Visualize e deixe anotações para outros moderadores e para sí no futuro
-      quick_actions_description_html: 'Tome uma ação rápida ou role para baixo para ver o conteúdo denunciado:'
+      notes_description_html: Visualize e deixe anotações para outros moderadores e para si próprio no futuro
+      quick_actions_description_html: 'Tome uma ação rápida ou deslize para baixo para ver o conteúdo denunciado:'
       remote_user_placeholder: o utilizador remoto de %{instance}
       reopen: Reabrir denúncia
       report: 'Denúncia #%{id}'
       reported_account: Conta denunciada
       reported_by: Denunciado por
       resolved: Resolvido
-      resolved_msg: Denúncia resolvida com sucesso!
+      resolved_msg: Denúncia correctamente resolvida!
       skip_to_actions: Passar para as ações
       status: Estado
       statuses: Conteúdo denunciado
@@ -633,7 +634,7 @@ pt-PT:
         moderation: Moderação
         special: Especiais
       delete: Eliminar
-      description_html: Com as <strong>funções de utilizador</strong>, pode personalizar quais funções e áreas do Mastodon os seus utilizadores podem aceder.
+      description_html: Com as <strong>funções de utilizador</strong>, pode personalizar quais as funções e áreas do Mastodon a que os seus utilizadores podem aceder.
       edit: Editar função '%{name}'
       everyone: Permissões padrão
       everyone_full_description_html: Esta é a <strong>função base</strong> que afeta <strong>todos os utilizadores</strong>, mesmo aqueles sem uma função atribuída. Todas as outras funções herdam as permissões desta.
@@ -644,31 +645,31 @@ pt-PT:
         administrator: Administrador
         administrator_description: Utilizadores com esta permissão irão contornar todas as permissões
         delete_user_data: Eliminar Dados de Utilizador
-        delete_user_data_description: Permite que os utilizadores eliminem os dados de outros utilizadores sem atraso
+        delete_user_data_description: Permite que os utilizadores eliminem os dados doutros utilizadores sem tempo de espera
         invite_users: Convidar Utilizadores
         invite_users_description: Permite aos utilizadores convidar pessoas novas para o servidor
-        manage_announcements: Gerir Anúncios
-        manage_announcements_description: Permite aos utilizadores gerir anúncios no servidor
-        manage_appeals: Gerir Recursos
+        manage_announcements: Gerir comunicados
+        manage_announcements_description: Permite aos utilizadores gerirem os comunicados no servidor
+        manage_appeals: Gerir apelos
         manage_appeals_description: Permite aos utilizadores rever recursos de moderação
         manage_blocks: Gerir Bloqueios
-        manage_blocks_description: Permite aos utilizadores bloquear provedores de e-mail e endereços IP
+        manage_blocks_description: Permite aos utilizadores bloquear fornecedores de e-mail e endereços IP
         manage_custom_emojis: Gerir Emojis Personalizados
-        manage_custom_emojis_description: Permite aos utilizadores gerir os emojis personalizados do servidor
+        manage_custom_emojis_description: Permite aos utilizadores gerirem os emojis personalizados do servidor
         manage_federation: Gerir Federação
         manage_federation_description: Permite aos utilizadores bloquear ou permitir federação com outros domínios e controlar a entregabilidade
         manage_invites: Gerir Convites
-        manage_invites_description: Permite aos utilizadores pesquisar e desativar links de convite
+        manage_invites_description: Permite aos utilizadores pesquisarem e desativarem ligações de convite
         manage_reports: Gerir Relatórios
         manage_reports_description: Permite aos utilizadores rever relatórios e executar ações de moderação contra eles
         manage_roles: Gerir Funções
-        manage_roles_description: Permite aos usuários gerir e atribuir funções abaixo das deles
+        manage_roles_description: Permite aos utilizadores a gestão e atribuição de funções abaixo dos seus
         manage_rules: Gerir Regras
         manage_rules_description: Permite aos utilizadores alterar as regras do servidor
         manage_settings: Gerir Configurações
-        manage_settings_description: Permite aos utilizadores alterar as configurações do site
+        manage_settings_description: Permite aos utilizadores alterar as configurações do sítio na teia
         manage_taxonomies: Gerir Taxonomias
-        manage_taxonomies_description: Permite aos utilizadores rever o conteúdo em tendência e atualizar as configurações de hashtag
+        manage_taxonomies_description: 'Permite aos utilizadores avaliar o conteúdo em alta e atualizar as configurações de #etiquetas'
         manage_user_access: Gerir Acesso de Utilizador
         manage_user_access_description: Permite aos utilizadores desativar a autenticação em duas etapas de outros utilizadores, alterar o seu endereço de e-mail e redefinir a sua palavra-passe
         manage_users: Gerir Utilizadores
@@ -678,14 +679,14 @@ pt-PT:
         view_audit_log: Ver Registo de Auditoria
         view_audit_log_description: Permite aos utilizadores ver um histórico de ações administrativas no servidor
         view_dashboard: Ver Painel de Controlo
-        view_dashboard_description: Permite aos utilizadores aceder ao painel de controlo e várias métricas
+        view_dashboard_description: Permite aos utilizadores acederem ao painel de controlo e a várias estatísticas
         view_devops: DevOps
         view_devops_description: Permite aos utilizadores aceder aos painéis de controlo do Sidekiq e pgHero
       title: Funções
     rules:
       add_new: Adicionar regra
       delete: Eliminar
-      description_html: Embora a maioria afirme ter lido e concordado com os termos de serviço, geralmente as pessoas só leem depois de surgir um problema. <strong>Dê uma olhada nas regras do seu servidor fornecendo-as em uma lista de marcadores planos.</strong> Tente manter as regras individuais curtas e simples, mas tente também não dividi-las em muitos itens separados.
+      description_html: Embora a maioria afirme ter lido e concordado com os termos de serviço, geralmente as pessoas só os leem depois de lhes surgir um problema. <strong>Torne fácil a leitura rápida das regras do seu servidor, apresentando-as numa lista de tópicos.</strong> Tente que cada regra seja sucinta e simples, mas tente também não dividi-las num número excessivo de tópicos separados.
       edit: Editar regra
       empty: Nenhuma regra de instância foi ainda definida.
       title: Regras da instância
@@ -694,23 +695,26 @@ pt-PT:
         manage_rules: Gerir regras do servidor
         preamble: Forneça informações aprofundadas sobre como o servidor é operado, moderado, financiado.
         rules_hint: Existe uma área dedicada às regras a que os seus utilizadores devem aderir.
-        title: Sobre
+        title: Acerca de
       appearance:
         preamble: Personalize a interface web do Mastodon.
         title: Aspeto
       branding:
-        preamble: A marca do seu servidor diferencia-a de outros servidores na rede. Essa informação pode ser exibida em vários ambientes, como a interface web do Mastodon, aplicativos nativos, visualizações de links em outros sites e dentro de aplicativos de mensagens, etc. Por esta razão, é melhor manter esta informação clara, curta e concisa.
+        preamble: A marca do seu servidor diferencia-a doutros servidores na rede. Essa informação pode ser exibida em vários contexos, como a interface na teia do Mastodon, aplicações nativas, visualizações de hiperligações noutros sites, em aplicações de mensagens, etc. Por esta razão, é melhor manter esta informação clara, curta e concisa.
         title: Marca
       content_retention:
         preamble: Controle como o conteúdo gerado pelos utilizadores é armazenado no Mastodon.
         title: Retenção de conteúdo
+      default_noindex:
+        desc_html: Afeta todos os utilizadores que não alteraram esta configuração
+        title: Desativar, por omissão, a indexação de utilizadores por parte dos motores de pesquisa
       discovery:
         follow_recommendations: Recomendações para seguir
         preamble: Revelar conteúdos interessantes é fundamental para a entrada de novos utilizadores que podem não conhecer ninguém no Mastodon. Controle como os vários recursos de descoberta funcionam no seu servidor.
         profile_directory: Diretório de perfis
         public_timelines: Cronologias públicas
         title: Descobrir
-        trends: Tendências
+        trends: Em alta
       domain_blocks:
         all: Para toda a gente
         disabled: Para ninguém
@@ -726,7 +730,7 @@ pt-PT:
       title: Definições do Servidor
     site_uploads:
       delete: Eliminar arquivo carregado
-      destroyed_msg: Upload do site eliminado com sucesso!
+      destroyed_msg: Envio de sítio na teia correctamente eliminado!
     statuses:
       account: Autor
       application: Aplicação
@@ -736,36 +740,36 @@ pt-PT:
         remove_from_report: Remover da denúncia
         report: Denúncia
       deleted: Eliminado
-      favourites: Favoritos
+      favourites: Marcadores
       history: Histórico de versões
       in_reply_to: A responder a
-      language: Idioma
+      language: Língua
       media:
         title: Media
       metadata: Metadados
       no_status_selected: Nenhum estado foi alterado porque nenhum foi selecionado
       open: Abrir publicação
       original_status: Publicação original
-      reblogs: Reblogs
+      reblogs: Re-publicacões
       status_changed: Publicação alterada
       title: Estado das contas
-      trending: Em destaque
+      trending: Em alta
       visibility: Visibilidade
       with_media: Com media
     strikes:
       actions:
         delete_statuses: "%{name} eliminou a publicação de %{target}"
         disable: "%{name} congelou a conta de %{target}"
-        mark_statuses_as_sensitive: "%{name} marcou as publicações de %{target} como sensíveis"
+        mark_statuses_as_sensitive: "%{name} marcou as publicações de %{target} como problemáticas"
         none: "%{name} enviou uma advertência a %{target}"
-        sensitive: "%{name} marcou a conta de %{target} como sensível"
+        sensitive: "%{name} marcou a conta de %{target} como problemática"
         silence: "%{name} limitou a conta de %{target}"
         suspend: "%{name} suspendeu a conta de %{target}"
       appeal_approved: Recorrido
       appeal_pending: Recurso pendente
     system_checks:
       database_schema_check:
-        message_html: Existem migrações de base de dados pendentes. Por favor, execute-as para garantir que o aplicativo se comporte como esperado
+        message_html: Há migrações de base de dados pendentes. Queira executá-las, para garantir que a aplicação se comporta como o esperado
       elasticsearch_running_check:
         message_html: Não foi possível conectar ao Elasticsearch. Por favor, verifique se está em execução, ou desabilite a pesquisa de texto completo
       elasticsearch_version_check:
@@ -778,32 +782,32 @@ pt-PT:
         message_html: Nenhum processo Sidekiq em execução para a(s) fila(s) %{value}. Reveja a configuração do seu Sidekiq
     tags:
       review: Estado da revisão
-      updated_msg: Definições de hashtags actualizadas com sucesso
+      updated_msg: 'Definições de #etiquetas correctamente actualizadas'
     title: Administração
     trends:
       allow: Permitir
       approved: Aprovado
       disallow: Não permitir
       links:
-        allow: Permitir link
+        allow: Permitir ligação
         allow_provider: Permitir editor
-        description_html: Estes são links que atualmente estão a ser frequentemente partilhados por contas visiveis pelo seu servidor. Eles podem ajudar os seus utilizador a descobrir o que está a acontecer no mundo. Nenhum link é exibido publicamente até que aprove o editor. Também pode permitir ou rejeitar links individualmente.
-        disallow: Não permitir link
+        description_html: Estas são as ligações que presentemente estão a ser muito partilhadas por contas visíveis pelo seu servidor. Estas podem ajudar os seus utilizador a descobrir o que está a acontecer no mundo. Nenhuma ligação é exibida publicamente até que o editor a aprove. Também pode permitir ou rejeitar ligações em avulso.
+        disallow: Não permitir ligação
         disallow_provider: Não permitir editor
-        no_link_selected: Nenhum link foi alterado, pois nenhum foi selecionado
+        no_link_selected: Nenhuma ligação foi alterada, pois nenhuma foi selecionada
         publishers:
           no_publisher_selected: Nenhum editor foi alterado, pois nenhum foi selecionado
         shared_by_over_week:
           one: Partilhado por uma pessoa na última semana
           other: Partilhado por %{count} pessoas na última semana
-        title: Links em destaque
+        title: Ligações em alta
         usage_comparison: Partilhado %{today} vezes hoje, em comparação com %{yesterday} ontem
       only_allowed: Apenas permitidos
       pending_review: Pendente de revisão
       preview_card_providers:
-        allowed: Links deste editor poderão ser incluídos nos destaques
-        description_html: Estes são domínios a partir dos quais links são frequentemente partilhados no seu servidor. Estes links não serão colocados em destaque a menos que o seu domínio de origem seja aprovado. A sua aprovação (ou rejeição) estende-se a subdomínios.
-        rejected: Links deste editor não serão incluídos nos destaques
+        allowed: Ligações deste editor poderão vir a ficar em alta
+        description_html: Estes são os domínios a partir dos quais ligações são frequentemente partilhadas no seu servidor. As suas ligações não serão colocadas em alta a menos que o seu domínio de origem seja aprovado. A sua aprovação (ou rejeição) estende-se a subdomínios.
+        rejected: Ligações deste editor não serão postas em alta
         title: Editores
       rejected: Rejeitado
       statuses:
@@ -812,37 +816,37 @@ pt-PT:
         description_html: Estas são publicações que o seu servidor conhece e que atualmente estão a ser frequentemente partilhadas e adicionadas aos favoritos. Isto pode ajudar os seus utilizadores, novos e retornados, a encontrar mais pessoas para seguir. Nenhuma publicação será exibida publicamente até que aprove o autor, e o autor permita que a sua conta seja sugerida a outros. Você também pode permitir ou rejeitar publicações individualmente.
         disallow: Não permitir publicação
         disallow_account: Não permitir autor
-        no_status_selected: Nenhuma publicação em tendência foi alterada, pois nenhuma foi selecionada
+        no_status_selected: Nenhuma publicação em alta foi alterada, pois nenhuma foi selecionada
         not_discoverable: O autor optou por não permitir que a sua conta seja sugerida a outros
         shared_by:
-          one: Partilhado ou adicionado aos favoritos uma vez
-          other: Partilhado e adicionado aos favoritos %{friendly_count} vezes
-        title: Publicações em destaque
+          one: Partilhado ou adicionado aos marcadores uma vez
+          other: Partilhado e adicionado aos marcadores %{friendly_count} vezes
+        title: Publicações em alta
       tags:
         current_score: Pontuação atual %{score}
         dashboard:
           tag_accounts_measure: utilizadores únicos
-          tag_languages_dimension: Idiomas mais populares
-          tag_servers_dimension: Servidores mais populares
+          tag_languages_dimension: Liderança de línguas
+          tag_servers_dimension: Topo de servidores
           tag_servers_measure: servidores diferentes
           tag_uses_measure: utilizações totais
-        description_html: Estas são hashtags que aparecem atualmente com frequência em publicações visíveis pelo seu servidor. Isto pode ajudar os seus utilizadores a descobrir o que está ser mais falado no momento. Nenhuma hashtag é exibida publicamente até que a aprove.
+        description_html: 'Estas são as #etiquetas que aparecem atualmente com frequência em publicações visíveis pelo seu servidor. Isto pode ajudar os seus utilizadores a descobrir o que está ser mais falado no momento. Nenhuma #etiqueta será exibida publicamente até que a aprove.'
         listable: Pode ser sugerida
         no_tag_selected: Nenhuma etiqueta foi alterada, pois nenhuma foi selecionada
         not_listable: Não será sugerida
         not_trendable: Não aparecerá nas tendências
         not_usable: Não pode ser utilizada
         peaked_on_and_decaying: Máximo em %{date}, agora a decair
-        title: Hashtags em destaque
-        trendable: Pode aparecer nas tendências
-        trending_rank: 'Tendência #%{rank}'
+        title: Etiquetas em alta
+        trendable: Pode aparecer em alta
+        trending_rank: 'Em alta #%{rank}'
         usable: Pode ser utilizada
         usage_comparison: Utilizada %{today} vezes hoje, em comparação com %{yesterday} ontem
         used_by_over_week:
           one: Utilizada por uma pessoa na última semana
           other: Utilizada por %{count} pessoas na última semana
-      title: Tendências
-      trending: Em destaque
+      title: Em alta
+      trending: Em alta
     warning_presets:
       add_new: Adicionar novo
       delete: Eliminar
@@ -852,7 +856,7 @@ pt-PT:
     webhooks:
       add_new: Adicionar endpoint
       delete: Eliminar
-      description_html: Um <strong>webhook</strong> possibilita que o Mastodon envie <strong>notificações em tempo real</strong> de eventos seleccionados, para um seu aplicativo, para que este possa <strong>acionar ações automaticamente</strong>.
+      description_html: Um <strong>webhook</strong> possibilita que o Mastodon envie <strong>notificações em tempo real</strong> de eventos seleccionados, para uma aplicação sua, de modo que esta possa <strong>espoletar ações automaticamente</strong>.
       disable: Desativar
       disabled: Desativado
       edit: Editar endpoint
@@ -872,18 +876,18 @@ pt-PT:
   admin_mailer:
     new_appeal:
       actions:
-        delete_statuses: para elimintar as suas publicações
+        delete_statuses: para eliminar as suas publicações
         disable: para congelar a sua conta
-        mark_statuses_as_sensitive: marcar as suas publicações como sensíveis
+        mark_statuses_as_sensitive: para marcar as suas publicações como problemáticas
         none: uma advertência
-        sensitive: marcação da sua conta como sensível
-        silence: limitação da sua conta
-        suspend: suspensão da sua conta
+        sensitive: para marcar a sua conta como problemática
+        silence: para limitar a sua conta
+        suspend: para suspender a sua conta
       body: "%{target} está a recorrer de uma decisão de moderação de %{action_taken_by} a %{date}, que consistiu em %{type}. Escreveu:"
       next_steps: Pode aprovar o recurso para reverter a decisão de moderação, ou ignorá-lo.
       subject: "%{username} está a recorrer da decisão de moderação em %{instance}"
     new_pending_account:
-      body: Em baixo, estão os detalhes da nova conta. Pode aprovar ou rejeitar esta inscrição.
+      body: Abaixo, estão os pormenores da nova conta. Pode aprovar ou rejeitar esta inscrição.
       subject: Nova conta para revisão em %{instance} (%{username})
     new_report:
       body: "%{reporter} denunciou %{target}"
@@ -892,33 +896,33 @@ pt-PT:
     new_trends:
       body: 'Os seguintes itens precisam ser revistos antes de poderem ser exibidos publicamente:'
       new_trending_links:
-        title: Links em destaque
+        title: Ligações em alta
       new_trending_statuses:
-        title: Publicações em destaque
+        title: Publicações em alta
       new_trending_tags:
-        no_approved_tags: Não existem, atualmente, hashtags aprovadas em destaque.
-        requirements: 'Qualquer um destes candidatos pode ultrapassar a #%{rank} hashtag aprovada em destaque, que é atualmente #%{lowest_tag_name} com uma pontuação de %{lowest_tag_score}.'
-        title: Hashtags em destaque
+        no_approved_tags: 'Neste momento, não existem #etiquetas aprovadas para destaque.'
+        requirements: 'Qualquer um destes candidatos pode ultrapassar a #%{rank} etiqueta aprovada em destaque, que é atualmente #%{lowest_tag_name} com uma pontuação de %{lowest_tag_score}.'
+        title: Etiquetas em alta
       subject: Novas tendências para revisão em %{instance}
   aliases:
     add_new: Criar pseudónimo
     created_msg: Criou com sucesso um novo pseudónimo. Pode agora iniciar a migração da conta antiga.
-    deleted_msg: O pseudónimo foi eliminado com sucesso. Migrar dessa conta para esta não será mais possível.
+    deleted_msg: O pseudónimo foi correctamente eliminado. Não será mais possível migrar a partir dessa conta.
     empty: Não tem pseudónimos.
     hint_html: Se quiser mudar de outra conta para esta, pode criar aqui um pseudónimo, que é necessário antes de poder prosseguir com a migração de seguidores da conta antiga para esta. Esta ação por si só é <strong>inofensiva e reversível</strong>. <strong>A migração da conta é iniciada a partir da conta antiga</strong>.
     remove: Desvincular pseudónimo
   appearance:
     advanced_web_interface: Interface web avançada
-    advanced_web_interface_hint: 'Se quiser utilizar toda a largura do seu ecrã, a interface web avançada permite-lhe configurar várias colunas diferentes para ver tanta informação ao mesmo tempo quanto quiser: Página inicial, notificações, cronologia federada, qualquer número de listas e hashtags.'
+    advanced_web_interface_hint: 'Se quiser utilizar toda a largura do seu ecrã, a interface web avançada permite-lhe configurar várias colunas diferentes para ver tanta informação ao mesmo tempo quanto quiser: Página inicial, notificações, cronologia federada, qualquer número de listas e etiquetas.'
     animations_and_accessibility: Animações e acessibilidade
     confirmation_dialogs: Caixas de confirmação
     discovery: Descobrir
     localization:
-      body: Mastodon é traduzido por voluntários.
+      body: O Mastodon é traduzido por voluntários.
       guide_link: https://pt.crowdin.com/project/mastodon/
       guide_link_text: Todos podem contribuir.
-    sensitive_content: Conteúdo sensível
-    toot_layout: Disposição do Toot
+    sensitive_content: Conteúdo problemático
+    toot_layout: Disposição da publicação
   application_mailer:
     notification_preferences: Alterar preferências de e-mail
     salutation: "%{name},"
@@ -927,8 +931,8 @@ pt-PT:
     view_profile: Ver perfil
     view_status: Ver publicação
   applications:
-    created: Aplicação criada com sucesso
-    destroyed: Aplicação eliminada com sucesso
+    created: Aplicação correctamente criada
+    destroyed: Aplicação correctamente eliminada
     regenerate_token: Regenerar token de acesso
     token_regenerated: Token de acesso regenerado com sucesso
     warning: Cuidado com estes dados. Não partilhar com ninguém!
@@ -944,9 +948,9 @@ pt-PT:
       suffix: Com uma conta, poderá seguir pessoas, publicar atualizações e trocar mensagens com utilizadores de qualquer instância Mastodon e muito mais!
     didnt_get_confirmation: Não recebeu o e-mail de confirmação?
     dont_have_your_security_key: Não tem a sua chave de segurança?
-    forgot_password: Esqueceste a palavra-passe?
+    forgot_password: Esqueceu-se da palavra-passe?
     invalid_reset_password_token: Token de modificação da palavra-passe é inválido ou expirou. Por favor, solicita um novo.
-    link_to_otp: Insira um código de autenticação em duas etapas do seu telemóvel ou um código de recuperação
+    link_to_otp: Insira um código de autenticação em duas etapas do seu telemóvel, ou um código de recuperação
     link_to_webauth: Usa o teu dispositivo de chave de segurança
     log_in_with: Iniciar sessão com
     login: Entrar
@@ -963,7 +967,7 @@ pt-PT:
     resend_confirmation: Reenviar instruções de confirmação
     reset_password: Criar nova palavra-passe
     rules:
-      preamble: Estas são definidos e aplicadas pelos moderadores de %{domain}.
+      preamble: Estas são definidas e aplicadas pelos moderadores de %{domain}.
       title: Algumas regras básicas.
     security: Alterar palavra-passe
     set_new_password: Editar palavra-passe
@@ -971,6 +975,9 @@ pt-PT:
       email_below_hint_html: Se o endereço de e-mail abaixo estiver incorreto, pode alterá-lo aqui e receber um novo e-mail de confirmação.
       email_settings_hint_html: O e-mail de confirmação foi enviado para %{email}. Se esse endereço de e-mail não estiver correto, pode alterá-lo nas definições da conta.
       title: Configuração
+    sign_in:
+      preamble_html: Iniciar sessão com as suas credenciais de <strong>%{domain}</strong>. Se a sua conta estiver hospedada noutro servidor, não poderá iniciar sessão aqui.
+      title: Iniciar sessão em %{domain}
     sign_up:
       preamble: Com uma conta neste servidor Mastodon, poderá seguir qualquer outra pessoa na rede, independentemente do servidor onde a conta esteja hospedada.
       title: Vamos lá inscrevê-lo em %{domain}.
@@ -980,8 +987,8 @@ pt-PT:
       functional: A sua conta está totalmente operacional.
       pending: A sua inscrição está pendente de revisão pela nossa equipa. Isso pode demorar algum tempo. Receberá um e-mail se a sua conta for aprovada.
       redirecting_to: A sua conta está inativa porque está atualmente a ser redirecionada para %{acct}.
-      view_strikes: Veja as punições anteriores contra a sua conta
-    too_fast: Formulário enviado muito rapidamente, tente novamente.
+      view_strikes: Veja as reprimendas anteriores sobre a sua conta
+    too_fast: Formulário enviado demasiado rapidamente, tente novamente.
     use_security_key: Usar chave de segurança
   authorize_follow:
     already_following: Tu já estás a seguir esta conta
@@ -992,8 +999,8 @@ pt-PT:
     following: 'Sucesso! Agora estás a seguir a:'
     post_follow:
       close: Ou podes simplesmente fechar esta janela.
-      return: Voltar ao perfil do utilizador
-      web: Voltar à página inicial
+      return: Mostrar perfil do utilizador
+      web: Ir para a página na teia
     title: Seguir %{acct}
   challenge:
     confirm: Continuar
@@ -1014,91 +1021,91 @@ pt-PT:
       about_x_months: "%{count} meses"
       about_x_years: "%{count} anos"
       almost_x_years: "%{count} anos"
-      half_a_minute: Justo agora
+      half_a_minute: Agora mesmo
       less_than_x_minutes: "%{count} meses"
-      less_than_x_seconds: Justo agora
+      less_than_x_seconds: Agora mesmo
       over_x_years: "%{count} anos"
       x_days: "%{count} dias"
       x_minutes: "%{count} minutos"
       x_months: "%{count} meses"
       x_seconds: "%{count} segundos"
   deletes:
-    challenge_not_passed: A informação que introduziu não estava correta
-    confirm_password: Introduza a sua palavra-passe atual para verificar a sua identidade
-    confirm_username: Introduza o seu nome de utilizador para confirmar o procedimento
+    challenge_not_passed: A informação que inseriu não estava correcta
+    confirm_password: Insira sua palavra-passe atual para verificar a sua identidade
+    confirm_username: Insira seu nome de utilizador para confirmar o procedimento
     proceed: Eliminar conta
-    success_msg: A sua conta foi eliminada com sucesso
+    success_msg: A sua conta foi correctamente eliminada
     warning:
       before: 'Antes de continuar, por favor leia cuidadosamente estas notas:'
-      caches: O conteúdo que foi armazenado em cache por outras instâncias pode persistir
+      caches: O conteúdo que foi armazenado em cache por outras instâncias pode perdurar
       data_removal: As suas publicações e outros dados serão eliminados permanentemente
       email_change_html: Pode <a href="%{path}">alterar o seu endereço de e-mail</a> sem eliminar a sua conta
       email_contact_html: Se ainda não chegou, pode enviar um e-mail a <a href="mailto:%{email}">%{email}</a> para obter ajuda
       email_reconfirmation_html: Se não recebeu o e-mail de confirmação, pode <a href="%{path}">pedi-lo novamente</a>
       irreversible: Não será possível restaurar ou reativar sua conta
-      more_details_html: Para mais detalhes, leia a <a href="%{terms_path}">política de privacidade</a>.
+      more_details_html: Para mais pormenores, leia a <a href="%{terms_path}">política de privacidade</a>.
       username_available: O seu nome de utilizador ficará novamente disponível
       username_unavailable: O seu nome de utilizador permanecerá indisponível
   disputes:
     strikes:
       action_taken: Ação tomada
       appeal: Recorrer
-      appeal_approved: Esta punição foi alvo de recurso, bem sucedido, pelo que já não é válida
+      appeal_approved: Esta reprimenda foi alvo dum recurso entretanto deferido, pelo que já não é válida
       appeal_rejected: O recurso foi rejeitado
       appeal_submitted_at: Recurso submetido
       appealed_msg: O seu recurso foi submetido. Se ele for aprovado, será notificado.
       appeals:
         submit: Submeter recurso
-      approve_appeal: Aprovar recurso
+      approve_appeal: Deferir recurso
       associated_report: Denúncia associada
       created_at: Data
       description_html: Estas são ações tomadas contra a sua conta e avisos que lhe foram enviados pela equipa de %{instance}.
       recipient: Endereçado a
-      reject_appeal: Rejeitar recurso
+      reject_appeal: Indeferir recurso
       status: 'Publicação #%{id}'
       status_removed: Publicação já eliminada do sistema
       title: "%{action} de %{date}"
       title_actions:
         delete_statuses: Remoção de publicação
         disable: Congelamento da conta
-        mark_statuses_as_sensitive: Marcação das publicações como sensíveis
+        mark_statuses_as_sensitive: Marcação das publicações como problemáticas
         none: Advertência
-        sensitive: Marcação da conta como sensível
+        sensitive: Marcação da conta como problemática
         silence: Limitação da conta
         suspend: Suspensão da conta
-      your_appeal_approved: O seu recurso foi aprovado
+      your_appeal_approved: O seu recurso foi deferido
       your_appeal_pending: Submeteu um recurso
-      your_appeal_rejected: O seu recurso foi rejeitado
+      your_appeal_rejected: O seu recurso foi indeferido
   domain_validator:
     invalid_domain: não é um nome de domínio válido
   errors:
     '400': O pedido que submeteu foi inválido ou mal formulado.
     '403': Não tens a permissão necessária para ver esta página.
-    '404': A página que estás a procurar não existe.
+    '404': A página que procura não existe.
     '406': Esta página não está disponível no formato solicitado.
-    '410': A página que estás a procurar não existe mais.
+    '410': A página que procura já não existe.
     '422':
       content: "A verificação de segurança falhou. \nDesativaste o uso de cookies?"
       title: A verificação de segurança falhou
-    '429': Desacelerado
+    '429': Demasiados pedidos
     '500':
-      content: Desculpe, mas algo correu mal.
+      content: Desculpe, mas algo correu mal da nossa parte.
       title: Esta página não está correta
     '503': A página não pôde ser apresentada devido a uma falha temporária do servidor.
-    noscript_html: Para usar o aplicativo web do Mastodon, por favor ativa o JavaScript. Alternativamente, experimenta um dos <a href="%{apps_path}">apps nativos</a> para o Mastodon na sua plataforma.
+    noscript_html: Para usar a aplicação da teia do Mastodon, por favor active o JavaScript. Em alternativa, experimenta uma das <a href="%{apps_path}">aplicações nativas</a> do Mastodon para a sua plataforma.
   existing_username_validator:
     not_found: não foi possível encontrar um utilizador local com esse nome
     not_found_multiple: não foi possível encontrar %{usernames}
   exports:
     archive_takeout:
       date: Data
-      download: Descarregar o teu arquivo
-      hint_html: Pode pedir um arquivo das suas <strong>publicações e ficheiros de media carregados</strong>. Os dados no ficheiro exportado estarão no formato ActivityPub, que pode ser lido com qualquer software compatível. Pode solicitar um arquivo a cada 7 dias.
+      download: Descarregar o seu arquivo
+      hint_html: Pode pedir um arquivo das suas <strong>publicações e ficheiros de media carregados</strong>. Os dados no ficheiro exportado estarão no formato ActivityPub, que pode ser lido com qualquer programa compatível. Pode solicitar um arquivo a cada 7 dias.
       in_progress: A compilar o seu arquivo...
-      request: Pede o teu arquivo
+      request: Peça o seu arquivo
       size: Tamanho
     blocks: Bloqueaste
-    bookmarks: Itens Salvos
+    bookmarks: Marcadores
     csv: CSV
     domain_blocks: Bloqueios de domínio
     lists: Listas
@@ -1107,8 +1114,8 @@ pt-PT:
   featured_tags:
     add_new: Adicionar nova
     errors:
-      limit: Já atingiste o limite máximo de hashtags
-    hint_html: "<strong>O que são hashtags em destaque?</strong> Elas são exibidas de forma bem visível no seu perfil público e permitem que as pessoas consultem as suas publicações públicas especificamente sob essas hashtags. São uma ótima ferramenta para manter o controlo de trabalhos criativos ou projetos de longo prazo."
+      limit: Já atingiste o limite máximo de etiquetas
+    hint_html: "<strong>O que são etiquetas em destaque?</strong> Exibidas de forma bem visível no seu perfil público, permitem que as pessoas consultem as suas publicações públicas especificamente sob essas etiquetas. São uma óptima ferramenta para dar seguimento a trabalhos criativos ou projectos de longo prazo."
   filters:
     contexts:
       account: Perfis
@@ -1123,7 +1130,7 @@ pt-PT:
       statuses_hint_html: Este filtro aplica-se a publicações individuais selecionadas independentemente de estas corresponderem às palavras-chave abaixo. <a href="%{path}">Reveja ou remova publicações do filtro</a>.
       title: Editar filtros
     errors:
-      deprecated_api_multiple_keywords: Estes parâmetros não podem ser alterados a partir deste aplicativo porque se aplicam a mais de um filtro de palavra-chave. Use um aplicativo mais recente ou a interface web.
+      deprecated_api_multiple_keywords: Estes parâmetros não podem ser alterados a partir desta aplicação porque se aplicam a mais que um filtro de palavra-chave. Use uma aplicação mais recente ou a interface na teia.
       invalid_context: Inválido ou nenhum contexto fornecido
     index:
       contexts: Filtros em %{contexts}
@@ -1142,17 +1149,17 @@ pt-PT:
         other: "%{count} publicações individuais ocultadas"
       title: Filtros
     new:
-      save: Salvar novo filtro
+      save: Guardar novo filtro
       title: Adicionar novo filtro
     statuses:
       back_to_filter: Voltar ao filtro
       batch:
-        remove: Remover do filtro
+        remove: Retirar do filtro
       index:
         hint: Este filtro aplica-se a publicações individuais selecionadas independentemente de outros critérios. Pode adicionar mais publicações a este filtro através da interface web.
         title: Publicações filtradas
   footer:
-    trending_now: Tendências atuais
+    trending_now: Em alta neste momento
   generic:
     all: Tudo
     all_items_on_page_selected_html:
@@ -1173,8 +1180,8 @@ pt-PT:
       other: Selecione todos os %{count} items que correspondem à sua pesquisa.
     today: hoje
     validation_errors:
-      one: Algo não está correcto. Por favor vê o erro abaixo
-      other: Algo não está correto. Por favor vê os %{count} erros abaixo
+      one: Algo não está correcto. Por favor analise o erro abaixo
+      other: Algo não está bem. Queira analisar os %{count} erros abaixo
   html_validator:
     invalid_markup: 'contém marcação HTML inválida: %{error}'
   imports:
@@ -1187,14 +1194,14 @@ pt-PT:
       overwrite: Escrever por cima
       overwrite_long: Substituir os registos atuais pelos novos
     preface: Podes importar dados que tenhas exportado de outra instância, como a lista de pessoas que segues ou bloqueadas.
-    success: Os teus dados foram enviados com sucesso e serão processados em breve
+    success: Os teus dados foram enviados correctamente e serão processados em breve
     types:
       blocking: Lista de bloqueio
       bookmarks: Itens salvos
       domain_blocking: Lista de domínios bloqueados
       following: Lista de pessoas que estás a seguir
       muting: Lista de utilizadores silenciados
-    upload: Enviar
+    upload: Carregar
   invites:
     delete: Desativar
     expired: Expirados
@@ -1206,8 +1213,8 @@ pt-PT:
       '604800': 1 semana
       '86400': 1 dia
     expires_in_prompt: Nunca
-    generate: Gerar
-    invited_by: 'Tu foste convidado por:'
+    generate: Gerar hiperligação de convite
+    invited_by: 'Foi convidado por:'
     max_uses:
       one: 1 uso
       other: "%{count} usos"
@@ -1224,28 +1231,28 @@ pt-PT:
     authentication_methods:
       otp: aplicação de autenticação em duas etapas
       password: palavra-passe
-      sign_in_token: código de segurança por e-mail
+      sign_in_token: código de segurança por correio electrónico
       webauthn: chaves de segurança
     description_html: Se vê atividade que não reconhece, considere alterar a sua palavra-passe e ativar a autenticação em duas etapas.
     empty: Sem histórico de autenticação disponível
     failed_sign_in_html: Tentativa falhada de início de sessão com %{method} de %{ip} (%{browser})
-    successful_sign_in_html: Iniciada sessão com sucesso com %{method} de %{ip} (%{browser})
+    successful_sign_in_html: Sessão correctamente iniciada com %{method} de %{ip} (%{browser})
     title: Histórico de autenticação
   media_attachments:
     validations:
       images_and_video: Não é possível anexar um vídeo a uma publicação que já contém imagens
-      not_ready: Não é possível anexar arquivos que não terminaram de ser processados. Tente novamente daqui a pouco!
-      too_many: Não é possível anexar mais de 4 arquivos
+      not_ready: Não é possível anexar ficheiros que ainda não acabaram de ser processados. Tente outra vez daqui a pouco!
+      too_many: Não é possível anexar mais de 4 ficheiros
   migrations:
-    acct: username@domain da nova conta
+    acct: Mudou-se para
     cancel: Cancelar redirecionamento
     cancel_explanation: Cancelar o redirecionamento irá reativar a sua conta atual, mas não trará de volta os seguidores que foram migrados para essa conta.
-    cancelled_msg: Cancelou com sucesso o redireccionamento.
+    cancelled_msg: Cancelou correctamente o redireccionamento.
     errors:
       already_moved: é a mesma conta para a qual já migrou
-      missing_also_known_as: não está a referenciar esta conta
+      missing_also_known_as: não é um pseudónimo dessa conta
       move_to_self: não pode ser conta atual
-      not_found: não pode ser encontrado
+      not_found: não foi encontrado
       on_cooldown: Você está no período de espera
     followers_count: Seguidores no momento da migração
     incoming_migrations: A migrar de uma conta diferente
@@ -1274,7 +1281,7 @@ pt-PT:
     carry_mutes_over_text: Este utilizador migrou de %{acct}, que você tinha silenciado.
     copy_account_note_text: 'Este utilizador migrou de %{acct}, aqui estão as suas notas anteriores sobre ele:'
   navigation:
-    toggle_menu: Abrir/fechar menu
+    toggle_menu: Alternar o menu
   notification_mailer:
     admin:
       report:
@@ -1282,9 +1289,9 @@ pt-PT:
       sign_up:
         subject: "%{name} inscreveu-se"
     favourite:
-      body: 'O teu post foi adicionado aos favoritos por %{name}:'
-      subject: "%{name} adicionou o teu post aos favoritos"
-      title: Novo favorito
+      body: 'A sua publicação foi adicionada aos marcadores por %{name}:'
+      subject: "%{name} adicionou a sua publicação aos marcadores"
+      title: Novo marcador
     follow:
       body: "%{name} é teu seguidor!"
       subject: "%{name} começou a seguir-te"
@@ -1300,18 +1307,18 @@ pt-PT:
       subject: "%{name} mencionou-te"
       title: Nova menção
     poll:
-      subject: Uma votação realizada por %{name} terminou
+      subject: A sondagem de %{name} encerrou
     reblog:
-      body: 'O teu post foi partilhado por %{name}:'
-      subject: "%{name} partilhou o teu post"
-      title: Nova partilha
+      body: 'A sua publicação foi reforçada por %{name}:'
+      subject: "%{name} reforçou a sua publicação"
+      title: Novo reforço
     status:
       subject: "%{name} acabou de publicar"
     update:
       subject: "%{name} editou uma publicação"
   notifications:
     email_events: Eventos para notificações por e-mail
-    email_events_hint: 'Selecione os eventos para os quais deseja receber notificações:'
+    email_events_hint: 'Selecione os casos para os quais deseja receber notificações:'
     other_settings: Outras opções de notificações
   number:
     human:
@@ -1327,8 +1334,8 @@ pt-PT:
     code_hint: Introduz o código gerado pela tua aplicação de autenticação para confirmar
     description_html: Se ativar a <strong>autenticação em duas etapas</strong>, para entrar na sua conta terá de ter consigo o seu telefone, que vai gerar os tokens necessários à validação do seu acesso.
     enable: Ativar
-    instructions_html: "<strong>Digitalize este código QR no Google Authenticator ou num aplicativo TOTP similar no seu telefone</strong>. A partir de agora, esse aplicativo irá gerar tokens que você terá que introduzir para aceder à sua conta."
-    manual_instructions: 'Se você não consegue digitalizar o código QR e precisa introduzi-lo manualmente, aqui está o código em texto:'
+    instructions_html: "<strong>Digitalize este código QR no Google Authenticator ou numa aplicação TOTP semelhante a partir do seu telemóvel</strong>. A partir desse momento, essa aplicação irá gerar tokens que terá que inserir para aceder à sua conta."
+    manual_instructions: 'Se não conseguir digitalizar o código QR e precisar de o inserir manualmente, eis o código por extenso:'
     setup: Configurar
     wrong_code: O código introduzido é inválido! A hora do servidor e a hora do dispositivo estão corretos?
   pagination:
@@ -1342,7 +1349,7 @@ pt-PT:
       already_voted: Tu já votaste nesta sondagem
       duplicate_options: contém itens duplicados
       duration_too_long: está demasiado à frente no futuro
-      duration_too_short: é demasiado cedo
+      duration_too_short: é demasiado em cima da hora
       expired: A sondagem já terminou
       invalid_choice: A opção de voto escolhida não existe
       over_character_limit: não pode ter mais do que %{max} caracteres cada um
@@ -1356,7 +1363,7 @@ pt-PT:
     title: Política de Privacidade
   reactions:
     errors:
-      limit_reached: Limite de reações diferentes atingido
+      limit_reached: Alcançado limite de reações diferentes
       unrecognized_emoji: não é um emoji reconhecido
   relationships:
     activity: Atividade da conta
@@ -1376,7 +1383,7 @@ pt-PT:
     remove_selected_follows: Deixar de seguir os utilizadores selecionados
     status: Estado da conta
   remote_follow:
-    missing_resource: Não foi possível achar a URL de redirecionamento para sua conta
+    missing_resource: Não foi possível encontrar o URL de redireccionamento para a sua conta
   reports:
     errors:
       invalid_rules: não faz referência a regras válidas
@@ -1422,13 +1429,13 @@ pt-PT:
       firefox_os: SO Firefox
       ios: iOS
       linux: Linux
-      mac: Mac
-      other: Plataforma desconhecida
+      mac: macOS
+      other: plataforma desconhecida
       windows: Windows
       windows_mobile: Windows Mobile
       windows_phone: Windows Phone
     revoke: Revogar
-    revoke_success: Sessão revogada com sucesso
+    revoke_success: Sessão correctamente revogada
     title: Sessões
     view_authentication_history: Ver histórico de autenticação da sua conta
   settings:
@@ -1436,13 +1443,13 @@ pt-PT:
     account_settings: Definições da conta
     aliases: Pseudónimos da conta
     appearance: Aspecto
-    authorized_apps: Aplicativos autorizados
+    authorized_apps: Aplicações autorizadas
     back: Voltar ao Mastodon
     delete: Eliminação da conta
     development: Desenvolvimento
     edit_profile: Editar perfil
     export: Exportar dados
-    featured_tags: Hashtags destacadas
+    featured_tags: Etiquetas destacadas
     import: Importar
     import_and_export: Importar e exportar
     migrate: Migração de conta
@@ -1466,22 +1473,22 @@ pt-PT:
       video:
         one: "%{count} vídeo"
         other: "%{count} vídeos"
-    boosted_from_html: Partilhadas de %{acct_link}
+    boosted_from_html: Reforçado por %{acct_link}
     content_warning: 'Aviso de conteúdo: %{warning}'
-    default_language: Mesmo do idioma da interface
+    default_language: A mesma língua que a da interface
     disallowed_hashtags:
-      one: 'continha uma hashtag proibida: %{tags}'
+      one: 'continha uma #etiqueta proibida: %{tags}'
       other: 'continha as hashtags proibidas: %{tags}'
     edited_at_html: Editado em %{date}
     errors:
       in_reply_not_found: A publicação a que está a tentar responder parece não existir.
-    open_in_web: Abrir no browser
+    open_in_web: Abrir na Teia
     over_character_limit: limite de caracter excedeu %{max}
     pin_errors:
-      direct: Publicações visíveis apenas para utilizadores mencionados não podem ser fixados
-      limit: Já fixaste a quantidade máxima de publicações
-      ownership: Posts de outras pessoas não podem ser fixados
-      reblog: Não podes fixar uma partilha
+      direct: Publicações visíveis apenas para utilizadores mencionados não podem ser afixadas
+      limit: Já afixaste a quantidade máxima de publicações
+      ownership: Não podem ser afixadas publicações doutras pessoas
+      reblog: Não pode afixar um reforço
     poll:
       total_people:
         one: "%{count} pessoa"
@@ -1498,33 +1505,33 @@ pt-PT:
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Direto
-      private: Mostrar apenas para seguidores
-      private_long: Mostrar apenas para seguidores
+      private: Só para seguidores
+      private_long: Mostrar só aos seguidores
       public: Público
       public_long: Todos podem ver
-      unlisted: Público, mas não mostre no timeline público
-      unlisted_long: Todos podem ver, porém não será postado nas timelines públicas
+      unlisted: Não inventariado
+      unlisted_long: Todos podem ver, mas não será inventariado nas cronologias públicas
   statuses_cleanup:
     enabled: Apagar publicações antigas automaticamente
-    enabled_hint: Apaga automaticamente as suas publicações assim que atingirem um limite de idade específico, a não ser que correspondam a uma das exceções abaixo
+    enabled_hint: Apaga automaticamente as suas publicações assim que atingirem um certo limite de tempo, a não ser que correspondam a uma das seguintes excepções
     exceptions: Exceções
-    explanation: Como excluir publicações é uma operação cara, isto é realizado lentamente ao longo do tempo, quando o servidor não está ocupado de outra forma. Por esta razão, as suas publicações podem ser apagadas um pouco depois de atingirem o limite de idade.
-    ignore_favs: Ignorar favoritos
-    ignore_reblogs: Ignorar partilhas
+    explanation: Como apagar publicações é uma operação custosa, isto é feito lentamente ao longo do tempo, quando o servidor não está ocupado. Por esta razão, as suas publicações podem ser apagadas um pouco depois de atingirem o limite de idade definido.
+    ignore_favs: Ignorar marcadores
+    ignore_reblogs: Ignorar reforços
     interaction_exceptions: Exceções baseadas em interações
     interaction_exceptions_explanation: Note que não há garantia de que as publicações sejam excluídas se ficarem abaixo do limite de favoritos ou partilhas após as ter verificado uma vez.
     keep_direct: Manter mensagens diretas
     keep_direct_hint: Não apaga nenhuma das suas mensagens diretas
     keep_media: Manter publicações com anexos de multimédia
-    keep_media_hint: Não exclui nenhuma das suas publicações com multimédia anexada
-    keep_pinned: Manter publicações fixadas
-    keep_pinned_hint: Não apagar nenhuma das suas publicações fixadas
-    keep_polls: Manter enquetes
-    keep_polls_hint: Não apaga nenhuma das suas enquetes
+    keep_media_hint: Não apaga nenhuma das suas publicações com multimédia anexada
+    keep_pinned: Manter publicações afixadas
+    keep_pinned_hint: Não apagar nenhuma das suas publicações afixadas
+    keep_polls: Manter sondagens
+    keep_polls_hint: Não apaga nenhuma das suas sondagens
     keep_self_bookmark: Manter as publicações que guardou
     keep_self_bookmark_hint: Não apaga as suas próprias publicações se as tiver guardado
-    keep_self_fav: Manter as publicações que gostou
-    keep_self_fav_hint: Não apaga as suas próprias publicações se as tiver favoritado
+    keep_self_fav: Manter as publicações que marcou
+    keep_self_fav_hint: Não apaga as suas próprias publicações se as tiver marcado
     min_age:
       '1209600': 2 semanas
       '15778476': 6 meses
@@ -1535,22 +1542,22 @@ pt-PT:
       '63113904': 2 anos
       '7889238': 3 meses
     min_age_label: Limite de idade
-    min_favs: Manter as publicações favoritas mais de
+    min_favs: Manter pelo menos as publicações dos marcadores
     min_favs_hint: Não apaga nenhuma das suas publicações que tenha recebido mais do que esta quantidade de favoritos. Deixe em branco para apagar as publicações, independentemente do número de favoritos
-    min_reblogs: Manter as publicações partilhadas mais de
+    min_reblogs: Manter as publicações reforçadas mais de
     min_reblogs_hint: Não apaga nenhuma das suas publicações que tenha sido partilhada mais do que este número de vezes. Deixe em branco para apagar as publicações, independentemente do número de partilhas
   stream_entries:
-    pinned: Toot fixado
-    reblogged: partilhado
-    sensitive_content: Conteúdo sensível
+    pinned: Publicação afixada
+    reblogged: reforçada
+    sensitive_content: Conteúdo problemático
   strikes:
     errors:
-      too_late: É tarde demais para apelar desta punição
+      too_late: É tarde demais para recorrer desta reprimenda
   tags:
     does_not_match_previous_name: não coincide com o nome anterior
   themes:
     contrast: Mastodon (Elevado contraste)
-    default: Mastodon
+    default: Mastodon (Escuro)
     mastodon-light: Mastodon (Claro)
   time:
     formats:
@@ -1559,32 +1566,32 @@ pt-PT:
       time: "%H:%M"
   two_factor_authentication:
     add: Adicionar
-    disable: Desativar
-    disabled_success: Autenticação em duas etapas desativada com sucesso
+    disable: Desactivar autenticação por dois factores (2FA)
+    disabled_success: Autenticação em duas etapas correctamente desactivada
     edit: Editar
     enabled: A autenticação em duas etapas está ativada
-    enabled_success: Autenticação em duas etapas ativada com sucesso
+    enabled_success: Autenticação em duas etapas correctamente activada
     generate_recovery_codes: Gerar códigos para recuperar conta
-    lost_recovery_codes: Códigos de recuperação permite que você recupere o acesso a sua conta se você perder seu telefone. Se você perder os códigos de recuperação, você pode regera-los aqui. Seus códigos antigos serão invalidados.
+    lost_recovery_codes: Os códigos de recuperação permitem que recupere o acesso à sua conta caso perca o seu telemóvel. Se perder os códigos de recuperação, pode criar uns novos aqui. Os seus códigos antigos serão revogados.
     methods: Métodos de autenticação em duas etapas
     otp: Aplicação de autenticação
     recovery_codes: Cópia de segurança dos códigos de recuperação
-    recovery_codes_regenerated: Códigos de recuperação foram gerados com sucesso
-    recovery_instructions_html: Se tu alguma vez perderes o teu smartphone, to poderás usar um dos códigos de recuperação para voltares a ter acesso à tua conta. <strong>Mantém os códigos de recuperação seguros</strong>. Por exemplo, tu podes imprimi-los e guardá-los junto a outros documentos importantes.
+    recovery_codes_regenerated: Códigos de recuperação foram correctamente gerados
+    recovery_instructions_html: Se perder o seu telemóvel, poderá usar um dos códigos de recuperação para voltar a ter acesso à sua conta. <strong>Guarde os códigos de recuperação em lugar seguro</strong>. Por exemplo, pode imprimi-los e guardá-los junto doutros documentos importantes.
     webauthn: Chaves de segurança
   user_mailer:
     appeal_approved:
       action: Ir para a sua conta
-      explanation: O recurso à punição contra a sua conta de %{strike_date}, o qual submeteu a %{appeal_date}, foi aprovado. A sua conta encontra-se novamente em situação regular.
-      subject: O seu recurso de %{date} foi aprovado
-      title: Recurso aprovado
+      explanation: O recurso à reprimenda contra a sua conta de %{strike_date}, enviado a %{appeal_date}, foi deferido. A sua conta encontra-se novamente em situação regular.
+      subject: O seu recurso de %{date} foi deferido
+      title: Recurso deferido
     appeal_rejected:
-      explanation: O recurso à punição contra a sua conta de %{strike_date}, o qual submeteu a %{appeal_date}, foi rejeitado.
-      subject: O seu recurso de %{date} foi rejeitado
-      title: Recurso rejeitado
+      explanation: O recurso à punição contra a sua conta de %{strike_date}, submetido em %{appeal_date}, foi indeferido.
+      subject: O seu recurso de %{date} foi indeferido
+      title: Recurso indeferido
     backup_ready:
-      explanation: Pediste uma cópia completa da tua conta Mastodon. Ela já está pronta para descarregares!
-      subject: O teu arquivo está pronto para descarregar
+      explanation: Pediu uma cópia integral de salvaguarda da sua conta Mastodon. Já está pronta para descarregar!
+      subject: O seu arquivo está pronto para descarregar
       title: Arquivo de ficheiros
     suspicious_sign_in:
       change_password: alterar a sua palavra-passe
@@ -1629,7 +1636,7 @@ pt-PT:
       edit_profile_step: Pode personalizar o seu perfil carregando uma imagem de perfil, alterando o nome a exibir, entre outras opções. Pode optar por rever os novos seguidores antes de estes o poderem seguir.
       explanation: Aqui estão algumas dicas para começar
       final_action: Começar a publicar
-      final_step: 'Comece a publicar! Mesmo sem seguidores, as suas mensagens públicas podem ser vistas por outros, por exemplo, na cronologia local e em hashtags. Pode querer apresentar-se utilizando a hashtag #introduções ou #introductions.'
+      final_step: 'Comece a publicar! Mesmo sem seguidores, as suas mensagens públicas podem ser vistas por outros, como por exemplo na cronologia local e em etiquetas. Pense em apresentar-se usando a etiqueta #apresentações.'
       full_handle: O seu nome completo
       full_handle_hint: Isto é o que tem de facultar aos seus amigos para que eles lhe possam enviar mensagens ou seguir a partir de outra instância.
       subject: Bem-vindo ao Mastodon
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 9b13ee12e..9e0b3d54a 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -122,6 +122,8 @@ ru:
       redownloaded_msg: Профиль %{username} успешно обновлен из оригинала
       reject: Отклонить
       rejected_msg: Успешно отклонено приложение для регистрации %{username}
+      remote_suspension_irreversible: Данные этого аккаунта были необратимо удалены.
+      remote_suspension_reversible_hint_html: Учётная запись была заблокирована, и данные будут полностью удалены %{date}. До этого момента её можно восстановить без каких-либо неприятных последствий. Если вы хотите немедленно удалить все данные учётной записи, вы можете сделать это ниже.
       remove_avatar: Удалить аватар
       remove_header: Убрать шапку
       removed_avatar_msg: Аватар %{username} успешно удален
@@ -468,6 +470,12 @@ ru:
       unsuppress: Восстановить рекомендацию
     instances:
       availability:
+        description_html:
+          few: Если доставка в домен завершается сбоем <strong>%{count} дня</strong>, дальнейшие попытки доставки предприниматься не будут, пока не будет получена доставка <em>из</em> домена.
+          many: Если доставка в домен завершается сбоем <strong>%{count} дней</strong>, дальнейшие попытки доставки предприниматься не будут, пока не будет получена доставка <em>из</em> домена.
+          one: Если доставка в домен завершается сбоем <strong>%{count} день</strong>, дальнейшие попытки доставки предприниматься не будут, пока не будет получена доставка <em>из</em> домена.
+          other: Если доставка в домен завершается сбоем на протяжении <strong>%{count} различных дней</strong>, дальнейшие попытки доставки предприниматься не будут, пока не будет получена доставка <em>из</em> домена.
+        failure_threshold_reached: Порог отказа достиг %{date}.
         failures_recorded:
           few: Попытки неудачны уже %{count} дня.
           many: Попытки неудачны уже %{count} дней.
@@ -577,7 +585,6 @@ ru:
     report_notes:
       created_msg: Примечание жалобы создано!
       destroyed_msg: Примечание жалобы удалено!
-      today_at: Сегодня в %{time}
     reports:
       account:
         notes:
@@ -726,8 +733,12 @@ ru:
       content_retention:
         preamble: Управление сохранением пользовательского контента в Mastodon.
         title: Хранение контента
+      default_noindex:
+        desc_html: Влияет на всех пользователей, которые не изменили эту настройку сами
+        title: Исключить пользователей из индексации поисковиками по умолчанию
       discovery:
         follow_recommendations: Рекомендации подписок
+        preamble: Наблюдение интересного контента играет важную роль при открытии новых пользователей, которые могут не знать ни одного Mastodon. Контролируйте как работают различные функции обнаружения на вашем сервере.
         profile_directory: Каталог профилей
         public_timelines: Публичные ленты
         title: Обзор
@@ -832,8 +843,10 @@ ru:
       statuses:
         allow: Разрешить пост
         allow_account: Разрешить автора
+        description_html: Это посты, которыми на вашем сервере в данный момент часто делятся и предпочитают, что может помочь вашим новым и постоянным пользователям найти больше людей, чтобы на них подписаться. Посты не будут отображаться публично, пока вы не одобрите автора, а автор не разрешит предлагать его аккаунт другим. Вы также можете разрешить или отклонить отдельные сообщения.
         disallow: Запретить пост
         disallow_account: Запретить автора
+        no_status_selected: Тенденции не были изменены, так как ни одна запись не была выбрана
         not_discoverable: Автор решил не раскрывать себя
         shared_by:
           few: Поделились или добавили в избранное %{friendly_count} раза
@@ -849,6 +862,7 @@ ru:
           tag_servers_dimension: Самые популярные серверы
           tag_servers_measure: разные сервера
           tag_uses_measure: всего использований
+        description_html: Это хэштеги, которые сейчас появляются в большом количестве сообщений, которые видит ваш сервер. Это может помочь вашим пользователям узнать о том, что говорят больше всего на данный момент. Хэштеги не отображаются публично до тех пор, пока вы их не подтвердите.
         listable: Может предлагаться
         no_tag_selected: Теги небыли изменены, поскольку ни один из них не выбран
         not_listable: Не будет предлагаться
@@ -996,6 +1010,9 @@ ru:
       email_below_hint_html: Если ниже указан неправильный адрес, вы можете исправить его здесь и получить новое письмо подтверждения.
       email_settings_hint_html: Письмо с подтверждением было отправлено на %{email}. Если адрес указан неправильно, его можно поменять в настройках учётной записи.
       title: Установка
+    sign_in:
+      preamble_html: Войдите, используя ваши учётные данные <strong>%{domain}</strong>. Если ваша учётная запись размещена на другом сервере, вы не сможете здесь войти.
+      title: Войти в %{domain}
     sign_up:
       preamble: С учётной записью на этом сервере Mastodon вы сможете следить за любым другим пользователем в сети, независимо от того, где размещён их аккаунт.
       title: Зарегистрируйтесь в %{domain}.
@@ -1186,6 +1203,16 @@ ru:
     trending_now: Актуально сейчас
   generic:
     all: Любой
+    all_items_on_page_selected_html:
+      few: "<strong>%{count}</strong> элемента выбрано на странице."
+      many: "<strong>%{count}</strong> элементов выбрано на странице."
+      one: "<strong>%{count}</strong> элемент выбран на странице."
+      other: Все <strong>%{count}</strong> элементов выбраны на странице.
+    all_matching_items_selected_html:
+      few: Выбрано <strong>%{count}</strong> элемента, соответствующих вашему запросу.
+      many: Выбрано <strong>%{count}</strong> элементов, соответствующих вашему запросу.
+      one: Выбран <strong>%{count}</strong> элемент, соответствующий вашему запросу.
+      other: Выбраны все <strong>%{count}</strong> элементов, соответствующих вашему запросу.
     changes_saved_msg: Изменения успешно сохранены!
     copy: Копировать
     delete: Удалить
@@ -1622,6 +1649,7 @@ ru:
       subject: Ваше обжалование от %{date} была одобрено
       title: Обжалование одобрено
     appeal_rejected:
+      explanation: Апелляция на разблокировку против вашей учетной записи %{strike_date}, которую вы подали на %{appeal_date}, была одобрена. Ваша учетная запись восстановлена.
       subject: Ваше обжалование от %{date} отклонено
       title: Обжалование отклонено
     backup_ready:
diff --git a/config/locales/sco.yml b/config/locales/sco.yml
index a2b91173e..23b905754 100644
--- a/config/locales/sco.yml
+++ b/config/locales/sco.yml
@@ -561,7 +561,6 @@ sco:
     report_notes:
       created_msg: Clype note successfully creatit!
       destroyed_msg: Clype note successfully deletit!
-      today_at: The day at %{time}
     reports:
       account:
         notes:
diff --git a/config/locales/si.yml b/config/locales/si.yml
index 1f5fe630c..37f8a8d7e 100644
--- a/config/locales/si.yml
+++ b/config/locales/si.yml
@@ -510,7 +510,6 @@ si:
     report_notes:
       created_msg: වාර්තා සටහන සාර්ථකව සාදන ලදී!
       destroyed_msg: වාර්තා සටහන සාර්ථකව මකා ඇත!
-      today_at: අද %{time}ට
     reports:
       account:
         notes:
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index fbea01ee0..21d24af51 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -125,6 +125,9 @@ ar:
         name: الاسم العام للوظيفه، إذا تم تعيين الوظيفه ليتم عرضه كشارة
         permissions_as_keys: سيكون للمستخدمين الذين لديهم هذه الوظيفة حق الصلاحيه إلى...
         position: وتقرر الوظيفة الأعلى تسوية النزاعات في حالات معينة، ولا يمكن القيام ببعض الإجراءات إلا على أساس الوظائف ذات الأولوية الأقل
+      webhook:
+        events: حدد الأحداث لإرسالها
+        url: إين سترسل الأحداث
     labels:
       account:
         fields:
@@ -227,11 +230,16 @@ ar:
           warn: إخفاء بتحذير
       form_admin_settings:
         backups_retention_period: فترة الاحتفاظ بأرشيف المستخدم
+        bootstrap_timeline_accounts: أوصي دائما بهذه الحسابات للمستخدمين الجدد
+        closed_registrations_message: رسالة مخصصة عندما يكون التسجيل غير متاح
+        content_cache_retention_period: مدة الاحتفاظ بالتخزين المؤقت للوسائط
         custom_css: سي أس أس CSS مخصص
+        mascot: جالب حظ مخصص (قديم)
         media_cache_retention_period: مدة الاحتفاظ بالتخزين المؤقت للوسائط
         profile_directory: تفعيل دليل الصفحات التعريفية
         registrations_mode: من يمكنه التسجيل
         require_invite_text: يتطلب سببا للانضمام
+        show_domain_blocks: إظهار النطاقات المحظورة
         show_domain_blocks_rationale: أظهِر لماذا تم حظر النطاقات
         site_contact_email: للاتصال بالبريد الإلكتروني
         site_contact_username: اسم مستخدم جهة الاتصال
@@ -269,6 +277,8 @@ ar:
         mention: ابعث بريداً إلكترونيًا عندما يُشير إليك أو يذكُرك أحدهم
         pending_account: ابعث رسالة إلكترونية إن كان هناك حساب جديد بحاجة إلى مراجعة
         reblog: ابعث بريداً إلكترونيًا عندما يقوم أحدهم بترقية منشورك
+        report: هناك إبلاغ جديد تم إرساله
+        trending_tag: المتداولة الجديدة تتطلّب مراجعة
       rule:
         text: قانون
       tag:
@@ -280,10 +290,12 @@ ar:
         role: الدور
       user_role:
         color: لون الشارة
+        highlighted: عرض الدور كشارة على الملفات الشخصية للمستخدمين
         name: التسمية
         permissions_as_keys: الصلاحيات
         position: الأولوية
       webhook:
+        events: الأحداث المفعلة
         url: الرابط التشعبّي URL لنقطة النهاية
     'no': لا
     required:
diff --git a/config/locales/simple_form.be.yml b/config/locales/simple_form.be.yml
index 73b27b1dc..54651ca66 100644
--- a/config/locales/simple_form.be.yml
+++ b/config/locales/simple_form.be.yml
@@ -18,29 +18,81 @@ be:
           disable: Перадухіліць выкарыстанне акаунтаў, але не выдаляць і не хаваць іх змесціва.
           none: Выкарыстоўвай гэта для папярэджвання карыстальнікаў але без іншых наступстваў.
           sensitive: Прымусова адмячаць усе медыя карыстальніка як дэлікатныя.
+          silence: Забараніць карыстальніку пасты з публічнай бачнасцю, схаваць ягоныя допісы і апавяшчэнні ад людзей, якія на яго не падпісаныя.
+          suspend: Забараніць любыя ўзаемадзеянні ад ці з гэтым уліковым запісам і выдаліць ягонае змесціва. Можна адрабіць цягам 30 дзён.
+        warning_preset_id: Неабавязкова. Вы можаце дадаць уласны тэкст напрыканцы шаблону
       announcement:
+        all_day: Калі пазначана, будуць паказаны толькі даты з пазначанага прамежку часу
         ends_at: Неабавязкова. Аб'ява будзе аўтаматычна знята ў пэўны час
         scheduled_at: Пакіньце пустым, каб апублікаваць аб'яву імаверна
         starts_at: Неабавязкова. На выпадак, калі ваша аб'ява прывязана да пэўнага перыяду часу
+        text: Вы можаце карыстацца сінтаксісам допісаў. Калі ласка, улічвайце месца, якое аб'ява зойме на экране карыстальніка
       appeal:
         text: Вы можаце абскардзіць рашэнне толькі адзін раз
       defaults:
+        autofollow: Людзі, якія зарэгістраваліся праз запрашэнне, аўтаматычна падпішуцца на вас
+        avatar: PNG, GIF ці JPG. Не больш за %{size}. Будзе сціснуты да памеру %{dimensions}} пікселяў
+        bot: Паведаміць іншым, што гэты ўліковы запіс у асноўным выконвае аўтаматычныя дзеянні і можа не кантралявацца
+        context: Адзін ці некалькі кантэкстаў, да якіх трэба прымяніць фільтр
+        current_password: У мэтах бяспекі, калі ласка, увядзіце пароль бягучага ўліковага запісу
+        current_username: Каб пацвердзіць, увядзіце, калі ласка імя карыстальніка бягучага ўліковага запісу
+        digest: Будзе даслана толькі пасля доўгага перыяду неактыўнасці і толькі калі вы атрымалі асабістыя паведамленні падчас вашай адсутнасці
         discoverable: Дазволіць незнаёмым людзям знаходзіць ваш уліковы запіс праз рэкамендацыі, трэнды і іншыя функцыі
         email: Пацвярджэнне будзе выслана па электроннай пошце
+        fields: У вашаму профілі можа быць паказана да 4 элементаў у выглядзе табліцы
+        header: PNG, GIF ці JPG. Не больш за %{size}. Будзе сціснуты да памеру %{dimensions}} пікселяў
+        inbox_url: Капіраваць URL са старонкі рэтранслятара, якім вы хочаце карыстацца
+        irreversible: Адфільтраваныя пасты прападуць незваротна, нават калі фільтр потым будзе выдалены
         locale: Мова карыстальніцкага інтэрфейсу, электронных паведамленняў і апавяшчэнняў
         locked: Уручную кантралюйце, хто можа быць вашым падпісантам, ухваляючы запросы на падпіску
         password: Не менш за 8 сімвалаў
+        phrase: Параўнанне адбудзецца нягледзячы на рэгістр тэксту і папярэджанні аб змесціве допісу
+        scopes: Якімі API праграм будзе дазволена карыстацца. Калі вы абярэце найвышэйшы ўзровень, не трэба абіраць асобныя.
+        setting_aggregate_reblogs: Не паказваць новыя пашырэнні для допісаў, якія нядаўна пашырылі(уплывае выключна на будучыя пашырэнні)
+        setting_always_send_emails: Звычайна лісты з апавяшчэннямі не будуць дасылацца, калі вы актыўна карыстаецеся Mastodon
+        setting_default_sensitive: Далікатныя медыя прадвызначана схаваныя. Іх можна адкрыць адзіным клікам
         setting_display_media_default: Хаваць медыя пазначаныя як далікатныя
         setting_display_media_hide_all: Заўсёды хаваць медыя
         setting_display_media_show_all: Заўсёды паказваць медыя
         setting_hide_network: Вашы падпіскі і вашы падпісчыкі будуць нябачны ў вашым профілі
         setting_noindex: Уплывае на бачнасць старонкі вашага профілю і вашых допісаў
+        setting_show_application: Праграма, праз якую вы ствараеце допісы, будзе паказвацца ў падрабязнасцях пра допісы
+        setting_use_blurhash: Градыенты заснаваны на колерах схаваных выяў, але размываюць дэталі
+        setting_use_pending_items: Схаваць абнаўленні стужкі за клікам замест аўтаматычнага пракручвання стужкі
+        username: Ваша імя карыстальніка будзе ўнікальным на %{domain}
+        whole_word: Калі ключавое слова ці фраза складаецца толькі з літар і лічбаў, яно будзе ўжытае толькі калі супадае з усім словам
+      domain_allow:
+        domain: Гэты дамен зможа атрымліваць даныя з гэтага сервера. Даныя з гэтага дамену будуць апрацаваныя ды захаваныя
+      email_domain_block:
+        domain: Гэта можа быць імя дамена, якое паказваецца ў электронным адрасе ці ў MX запісе, якім ён карыстаецца. Іх правераць пры рэгістрацыі.
+        with_dns_records: Будзе здзейснена спроба развязаць DNS запісы дадзенага дамену. Вынікі таксама будуць заблакіраваны
+      featured_tag:
+        name: 'Вось некаторыя з хэштэгаў, якімі вы нядаўна карысталіся:'
+      filters:
+        action: Абярыце, што зрабіць, калі пост падпадае пад умовы фільтру
+        actions:
+          hide: Поўнасцю схаваць адфільтраванае змесціва, дзейнічаць, нібы яго не існуе
+          warn: Схаваць адфільтраваны кантэнт за папярэджаннем з назвай фільтру
       form_admin_settings:
         backups_retention_period: Захоўваць створаныя архівы карыстальніка адзначаную колькасць дзён.
         bootstrap_timeline_accounts: Гэтыя ўліковыя запісы будуць замацаваны ў топе рэкамендацый для новых карыстальнікаў.
+        closed_registrations_message: Паказваецца, калі рэгістрацыя закрытая
+        content_cache_retention_period: Допісы з іншых сервераў будуць выдаляцца пасля выстаўленай колькасці дзён, калі выстаўлены станоўчы лік. Гэта можа быць незваротным.
         custom_css: Вы можаце прымяняць карыстальніцкія стылі ў вэб-версіі Mastodon.
         mascot: Замяняе ілюстрацыю ў пашыраным вэб-інтэрфейсе.
+        media_cache_retention_period: Спампаваныя медыя будуць выдаляцца пасля выстаўленай колькасці дзён, калі выстаўлены станоўчы лік, і спампоўвацца нанова па запыце.
+        profile_directory: Дырэкторыя профіляў змяшчае спіс усіх карыстальнікаў, якія вырашылі быць бачнымі.
+        require_invite_text: Калі рэгістрацыя патрабуе ручнога пацвержання, зрабіце поле "Чаму вы хочаце далучыцца?" абавязковым
+        site_contact_email: Як людзі могуць звязацца з вамі па юрыдычных запытах або пытаннях падтрымкі.
         site_contact_username: Як людзі могуць звязацца з вамі на Mastodon.
+        site_extended_description: Любая дадатковая інфармацыя, якая можа быць карыснай наведвальнікам ды вашым карыстальнікам. Можна карыстацца сінтаксісам Markdown каб структураваць тэкст.
+        site_short_description: Кароткае апісанне, каб дапамагчы адназначна ідэнтыфікаваць ваш сервер. Хто яго падтрымлівае, для каго ён?
+        site_terms: Апішыце ўласную палітыку прыватнасці альбо пакіньце поле пустым, калі хочаце скарыстацца прадвызначанай. Можна карыстацца сінтаксісам Markdown каб структураваць тэкст.
+        site_title: Як людзі могуць звяртацца да вашага серверу акрамя яго даменнага імя.
+        theme: Тэма, што бачаць новыя карыстальнікі ды наведвальнікі, якія выйшлі.
+        thumbnail: Выява памерамі прыкладна 2:1, якая паказваецца побач з інфармацыяй пра ваш сервер.
+        timeline_preview: Наведвальнікі, якія выйшлі, змогуць праглядаць апошнія публічныя допісы на серверы.
+        trendable_by_default: Прапусціць ручны агляд трэндавага змесціва. Асобныя элементы ўсё яшчэ можна будзе выдаліць з трэндаў пастфактум.
         trends: Трэнды паказваюць, якія допісы, хэштэгі і навіны набываюць папулярнасць на вашым серверы.
       form_challenge:
         current_password: Вы ўваходзіце ў бяспечную зону
@@ -51,13 +103,28 @@ be:
       ip_block:
         comment: Неабавязкова. Напамін, чаму вы дадалі гэта правіла.
         expires_in: IP адрасы з'яўляюцца абмежаваным рэсурсам, часам яны падзяляюцца паміж карыстальнікамі і мяняюць уладальніка. Па гэтай прычыне, безтэрміновае блакаванне IP не рэкамендуецца.
+        ip: Увядзіце адрас IPv4 ці IPv6. Вы можаце заблакіраваць цэлыя абсягі з дапамогай CIDR сінтаксісу. Асцярожна! Не заблакіруйце самі сябе!
         severities:
           no_access: Заблакіраваць доступ да ўсіх рэсурсаў
           sign_up_block: Новыя рэгістрацыі будуць немагчымы
           sign_up_requires_approval: Новыя рэгістрацыі запатрабуюць вашага ўзгаднення
         severity: Абярыце, што будзе адбывацца з запытамі з гэтага IP
+      rule:
+        text: Апішыце правіла ці патрабаванне для карыстальнікаў на гэтым серверы. Імкніцеся зрабіць яго простым ды кароткім
       sessions:
         otp: 'Увядзіце код двухфактарнай аўтэнтыфікацыі з вашага тэлефона або адзін з кодаў аднаўлення:'
+        webauthn: Калі гэта USB прылада, устаўце яе і, калі неабходна, націсніце на яе.
+      tag:
+        name: Вы можаце змяняць толькі рэгістр літар, напрыклад для таго, каб падвысіць чытабельнасць
+      user:
+        chosen_languages: У публічных стужках будуць паказвацца допісы толькі на тых мовах, якія вы пазначыце
+        role: Гэтая роля кантралюе дазволы, якія мае карыстальнік
+      user_role:
+        color: Колер, які будзе выкарыстоўвацца для гэтай ролі па ўсім UI, у фармаце RGB ці hex
+        highlighted: Гэта робіць ролю публічна бачнай
+        name: Публічная назва ролі, калі роля дэманструецца як значок у профілю
+        permissions_as_keys: Карыстальнікі з гэтай роляй будуць мець доступ да...
+        position: Ролі вышэйшага рангу займаюцца вырашэннем канфліктаў у пэўных сітуацыях. Некаторыя дзеянні можна выкананаць толькі над ролямі з ніжэйшым рангам
       webhook:
         events: Выберыце падзеі для адпраўкі
         url: Куды падзеі будуць адпраўляцца
@@ -66,6 +133,10 @@ be:
         fields:
           name: Пазнака
           value: Змесціва
+      account_alias:
+        acct: Маркер старога ўліковага запісу
+      account_migration:
+        acct: Маркер новага ўліковага запісу
       account_warning_preset:
         text: Тэкст шаблону
         title: Загаловак
@@ -80,6 +151,7 @@ be:
           sensitive: Далікатны
           silence: Абмежаваць
           suspend: Прыпыніць
+        warning_preset_id: Выкарыстаць шаблон папярэджання
       announcement:
         all_day: Падзея на ўвесь дзень
         ends_at: Канец падзеі
@@ -102,9 +174,10 @@ be:
         display_name: Адлюстраванае імя
         email: Адрас электроннай пошты
         expires_in: Заканчваецца пасля
-        fields: Метададзеныя профілю
+        fields: Метаданыя профілю
         header: Загаловак
         honeypot: "%{label} (не запаўняць)"
+        inbox_url: URL паштовай скрыні-рэтранслятара
         irreversible: Выдаляць, а не хаваць
         locale: Мова інтэрфейсу
         locked: Зрабіць уліковы запіс закрытым
@@ -116,6 +189,7 @@ be:
         phrase: Ключавое слова ці фраза
         setting_advanced_layout: Уключыць пашыраны вэб-інтэрфейс
         setting_aggregate_reblogs: Групаваць прасоўванні ў стужках
+        setting_always_send_emails: Заўжды дасылаць для апавяшчэнні эл. пошты
         setting_auto_play_gif: Аўтапрайграванне анімаваных GIF
         setting_boost_modal: Паказваць акно пацвярджэння перад пашырэннем
         setting_crop_images: У неразгорнутых допісах абразаць відарысы да 16:9
@@ -130,11 +204,14 @@ be:
         setting_display_media_show_all: Паказаць усё
         setting_expand_spoilers: Заўжды разгортваць допісы з папярэджаннем аб змесціве
         setting_hide_network: Схаваць вашы сувязі
+        setting_noindex: Адмовіцца ад індэксавання пашуковымі рухавікамі
         setting_reduce_motion: Памяншэнне руху ў анімацыях
+        setting_show_application: Паказваць праграмы, праз якія дасылаюцца допісы
         setting_system_font_ui: Выкарыстоўваць прадвызначаны сістэмны шрыфт
         setting_theme: Тэма сайта
         setting_trends: Паказваць трэнды дня
         setting_unfollow_modal: Паказваць акно пацвярджэння перад адпіскай
+        setting_use_blurhash: Паказваць каляровыя градыенты замест схаваных медыя
         setting_use_pending_items: Павольны рэжым
         severity: Узровень
         sign_in_token_attempt: Код бяспекі
@@ -150,8 +227,14 @@ be:
       filters:
         actions:
           hide: Схаваць цалкам
+          warn: Схаваць з папярэджаннем
       form_admin_settings:
+        backups_retention_period: Працягласць захавання архіву карыстальніка
+        bootstrap_timeline_accounts: Заўсёды раіць гэтыя ўліковыя запісы новым карыстальнікам
+        closed_registrations_message: Уласнае паведамленне, калі рэгістрацыя немагчымая
+        content_cache_retention_period: Працягласць захавання кэшу для змесціва
         custom_css: CSS карыстальніка
+        mascot: Уласны маскот(спадчына)
         media_cache_retention_period: Працягласць захавання кэшу для медыя
         profile_directory: Уключыць каталог профіляў
         registrations_mode: Хто можа зарэгістравацца
@@ -166,6 +249,7 @@ be:
         site_title: Назва сервера
         theme: Тэма па змаўчанні
         thumbnail: Мініяцюра сервера
+        timeline_preview: Дазволіць неаўтэнтыфікаваны доступ да публічных стужак
         trendable_by_default: Дазваляць трэнды без папярэдняй праверкі
         trends: Уключыць трэнды
       interactions:
@@ -186,6 +270,7 @@ be:
         severity: Правіла
       notification_emails:
         appeal: Нехта падае апеляцыю на рашэнне мадэратара
+        digest: Дасылаць лісты з дайджэстам
         favourite: Нехта ўпадабаў ваш допіс
         follow: Нехта падпісаўся на вас
         follow_request: Нехта даслаў вам запыт на падпіску
diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml
index 5a4642c82..36741108f 100644
--- a/config/locales/simple_form.bg.yml
+++ b/config/locales/simple_form.bg.yml
@@ -2,11 +2,17 @@
 bg:
   simple_form:
     hints:
+      account_alias:
+        acct: Посочете потребителско_име@домейн на акаунта си, от който искате да се преместите
+      account_migration:
+        acct: Посочете потребителско_име@домейн на акаунта си, към който се премествате
       account_warning_preset:
+        text: 'Можете да използвате синтаксиса на публикация: URL адреси, хаштагове и споменавания и пр.'
         title: По избор. Невидимо за получателя
       admin_account_action:
         include_statuses: Потребителят ще може да види кои публикации са довели до действието от страна на модератора или до предупреждението
         send_email_notification: Потребителят ще получи обяснение какво се е случило с неговия акаунт
+        text_html: По избор. Можете да използвате синтаксисът на публикация. Можете да <a href="%{path}">добавите предварително настроени предупреждения</a>, за да спестите време
         type_html: Изберете какво да сторите с <strong>%{acct}</strong>
         types:
           disable: Забранете на потребител да достъпва акаунта си, без да изтривате или скривате съдържанието на този акаунт.
@@ -21,56 +27,104 @@ bg:
         scheduled_at: Ако се остави празно, обявлението ще се публикува незабавно
         starts_at: По избор. В случай, че обявлението е ограничено до определен времеви диапазон
         text: Можете да използвате синтаксиса на обикновени публикации. Не забравяйте, че обявлението ще заеме известно място от екрана на потребителя
+      appeal:
+        text: Можете да възразите срещу провинение само веднъж
       defaults:
         autofollow: Хората, които се регистрират чрез поканата, автоматично ще ви последват
         avatar: PNG, GIF или JPG. До %{size}. Ще бъде смалена до %{dimensions} пиксела
         bot: Покажете на останалите потребители, че акаунтът извършва предимно автоматизирани действия, които не се следят
         context: Един или повече контексти, към които да се приложи филтърът
-        discoverable: Позволете на непознати потребители да открият вашия акаунт чрез препоръки, трендове и други функции
-        email: Ще въ бъде изпратен имейл за потвърждение
-        fields: Можете да добавите до 4 елемента в таблицата към своя профил
+        current_password: От съображения за сигурност, въведете паролата на текущия акаунт
+        current_username: Въведете потребителското име на текущия профил, за да потвърдите
+        digest: Изпраща се само след дълъг период на бездействие и само ако сте получили лични съобщения във ваше отсъствие
+        discoverable: Позволяване на странници да откриват вашия акаунт чрез препоръки, нашумели и други неща
+        email: Ще ви се изпрати имейл за потвърждение
+        fields: Може да добавите до 4 елемента в таблицата към профила си
         header: PNG, GIF или JPG. До %{size}. Ще бъде смалена до %{dimensions} пиксела
+        inbox_url: Копирайте URL адреса на заглавната страница на предаващия сървър, който искат да използвате
+        irreversible: Филтрираните публикации ще изчезнат безвъзвратно, дори филтърът да бъде премахнат по-късно
+        locale: Езикът на потребителския интерфейс, известиятата по имейл и насочените известия
         locked: Изисква ръчно одобрение на последователите. По подразбиране, публикациите са достъпни само до последователи.
         password: Използвайте поне 8 символа
+        phrase: Ще съвпадне без значение дали са главни или малки букви, или ако е предупреждение към публикация
         scopes: Указва до кои API има достъп приложението. Ако изберете диапазон от най-високо ниво, няма нужда да избирате индивидуални.
-        setting_aggregate_reblogs: Скриване на нови споделяния за публикации, които са били споделени наскоро (засяга само новополучени споделяния)
+        setting_aggregate_reblogs: Без показване на нови подсилвания за публикации, които са неотдавна подсилени (засяга само новополучени подсилвания)
+        setting_always_send_emails: Обикновено известия по имейл няма да бъдат изпратени при активно използване на Mastodon
         setting_default_sensitive: Деликатната мултимедия е скрита по подразбиране и може да се разкрие с едно щракване
         setting_display_media_default: Скриване на мултимедия отбелязана като деликатна
         setting_display_media_hide_all: Винаги да се скрива мултимедията
         setting_display_media_show_all: Винаги да се показва мултимедията
         setting_hide_network: В профила ви ще бъде скрито кой може да последвате и кой може да ви последва
         setting_noindex: Засяга вашите публикации и публичен профил
-        setting_show_application: Приложението, от което публикувате, ще бъде показано в подробностите към публикацията
+        setting_show_application: Приложението, което ползвате за публикуване, ще се показва в подробностите на публикацията ви
         setting_use_blurhash: Преливането се определя от цветовете на скритите изображения, но детайлите остават скрити
-        setting_use_pending_items: Инфопотокът ще се обновява само при кликване, вместо автоматично
+        setting_use_pending_items: Да се показват обновявания на часовата ос само след щракване вместо автоматично превъртане на инфоканала
         username: Вашето потребителско име ще е неповторим в %{domain}
+        whole_word: Ако ключовата дума/фраза е стриктно буквеноцифрена, ще бъде приложена само, ако съвпадне с цялата дума
+      domain_allow:
+        domain: Този домейн ще може да извлече данни от този сървър и входящите данни от него ще бъдат обработени и запазени
+      email_domain_block:
+        domain: Това може да е името на домейна, който се съдържа в имейл адреса или MX записа, който той използва. Ще бъдат проверени при регистрация.
+        with_dns_records: Ще има опит за преобразуване на DNS записите за дадения домейн и резултатите също ще бъдат блокирани
       featured_tag:
         name: 'Ето няколко хаштага, които последно сте използвали:'
       filters:
-        action: Изберете кое действие да бъде извършено, когато публикация бъде филтрирана
+        action: Изберете кое действие да се извърши, прецеждайки съвпаденията на публикацията
         actions:
           hide: Напълно скриване на филтрираното съдържание, сякаш не съществува
           warn: Скриване на филтрираното съдържание зад предупреждение, включващо името на филтъра
       form_admin_settings:
+        backups_retention_period: Запазване на генерираните потребителски архиви за посочения брой дни.
+        bootstrap_timeline_accounts: Тези акаунти ще се закачат в горния край на препоръките за следване на нови потребители.
+        closed_registrations_message: Показва се, когато е затворено за регистрации
+        content_cache_retention_period: Публикации от други сървъри ще се изтрият след определен брой дни при положително число. Действието може да е необратимо.
+        custom_css: Може да прилагате собствени стилове в уеб версията на Mastodon.
+        mascot: Можете да заместите илюстрацията в разширения уеб интерфейс.
+        media_cache_retention_period: Свалените мултимедийни файлове ще бъдат изтрити след посочения брой дни, когато броят е положително число, и ще бъдат свалени отново при поискване.
+        profile_directory: Указателят на профили съдържа всички потребители, които са се съгласили да бъдат откривани.
+        require_invite_text: Когато регистрацията изисква ръчно одобрение, текстовото поле за това "Защо желаете да се присъедините?" ще бъде задължително, вместо по желание
+        site_contact_email: Как могат хората да се свържат с вас относно правни запитвания или помощ.
         site_contact_username: Как хората могат да ви достигнат в Mastodon.
         site_extended_description: Всяка допълнителна информация, която може да е полезна за посетителите и потребителите ви. Може да се структурира със синтаксиса на Markdown.
         site_short_description: Кратък опис за помощ на неповторимата самоличност на сървъра ви. Кой го управлява, за кого е?
+        site_terms: Използвайте собствени правила за поверителност или оставете празно, за да използвате тези по подразбиране. Може да се структурира с Markdown синтаксис.
+        site_title: Как могат хората да наричат вашия сървър, освен името на домейна.
+        theme: Темата, която нови и невлезли потребители ще виждат.
+        thumbnail: Изображение в резолюция около 2:1, показвана до информацията за вашия сървър.
+        timeline_preview: Невлезлите потребители ще могат да преглеждат най-новите публични публикации, налични на сървъра.
+        trendable_by_default: Прескачане на ръчния преглед на нашумяло съдържание. Отделни елементи могат да бъдат премахвани от нашумели в последствие.
+        trends: В секцията Нашумели се показват публикации, хаштагове и новини, набрали популярност на вашия сървър.
+      form_challenge:
+        current_password: Влизате в сигурна зона
       imports:
         data: CSV файл, експортиран от друга инстанция на Mastodon
+      invite_request:
+        text: Това ще ни помогне да разгледаме заявлението ви
       ip_block:
+        comment: По избор. Помага да се сетите защо сте добавили това правило.
         expires_in: IP адресите са краен ресурс. Понякога са споделени и често сменят притежателите си. Поради това, блокиране на IP за неопределен период не се препоръчва.
+        ip: Въведете адреси IPv4 или IPv6. Може да блокирате цели обхвати с помощта на синтаксиса CIDR. Внимавайте да не се самозаключите!
         severities:
           no_access: Блокиране на достъп до всички ресурси
+          sign_up_block: Нови регистрации няма да са възможни
+          sign_up_requires_approval: Новите регистрации ще изискват одобрението ви
         severity: Изберете какво да се случва със заявките от този IP
       rule:
         text: Опишете правило или изискване за потребителите на този сървър. Опитайте се да го направите кратко и просто
       sessions:
         otp: 'Въведете двуфакторния код, породен от приложението на телефона си или използвайте един от кодовете си за възстановяване:'
+        webauthn: Ако е USB ключ, то не забравяйте да го вмъкнете и, ако е необходимо, го натикайте.
+      tag:
+        name: Можете да смените само употребата на големи/малки букви, например, за да е по-четимо
       user:
         chosen_languages: Само публикации на езиците с отметка ще бъдат показвани в публичните инфопотоци
+        role: Ролите управляват какви права има потребителят
       user_role:
+        color: Цветът, използван за ролите в потребителския интерфейс, като RGB в шестнадесетичен формат
         highlighted: Това прави ролята публично видима
+        name: Публично име за ролята, ако ролята е настроена да се показва като значка
         permissions_as_keys: Потребители с тази роля ще имат достъп до...
+        position: По-висшата роля може да разреши конфликти в някои ситуации. Някои действия могат да бъдат извършени само за роли с по-нисък приоритет
       webhook:
         events: Изберете събития за изпращане
         url: До къде ще се изпращат събитията
@@ -79,75 +133,95 @@ bg:
         fields:
           name: Етикет
           value: Съдържание
+      account_alias:
+        acct: Потребителско име на предишния акаунт
+      account_migration:
+        acct: Потребителско име на новия акаунт
       account_warning_preset:
+        text: Предварително настроен текст
         title: Заглавие
       admin_account_action:
-        include_statuses: Включва докладваните публикации в е-писмо
+        include_statuses: Включване на докладваните публикации в имейла
+        send_email_notification: Известяване на потребителя по имейл
+        text: Потребителско предупреждение
         type: Действие
         types:
           disable: Замразяване
+          none: Изпращане на предупреждение
           sensitive: Деликатно
           silence: Ограничение
           suspend: Спиране
+        warning_preset_id: Употреба на преднастройка за предупреждение
       announcement:
         all_day: Целодневно събитие
         ends_at: Край на събитието
+        scheduled_at: Планиране на публикация
         starts_at: Начало на събитието
         text: Оповестяване
+      appeal:
+        text: Обяснете защо решението трябва да се отхвърли
       defaults:
-        autofollow: Автоматично последване на вашия акаунт
+        autofollow: Поканете за следване на акаунта ви
         avatar: Аватар
-        bot: Този акаунт е бот
+        bot: Акаунтът е бот
         chosen_languages: Филтриране на езиците
-        confirm_new_password: Потвърди новата парола
-        confirm_password: Потвърди паролата
+        confirm_new_password: Потвърждаване на новата парола
+        confirm_password: Потвърдете паролата
+        context: Филтриране на контекста
         current_password: Текуща парола
         data: Данни
-        discoverable: Препоръчайте своя акаунт
+        discoverable: Предложете акаунта на други
         display_name: Показвано име
         email: Адрес на имейла
         expires_in: Изтича след
         fields: Метаданни за профила
-        header: Заглавен ред
+        header: Заглавка
+        honeypot: "%{label} (не се попълва)"
+        inbox_url: URL адрес за входящи съобщения на предаващия сървър
+        irreversible: Премахване, вместо скриване
         locale: Език на интерфейса
         locked: Направи акаунта поверителен
         max_uses: Максимален брой използвания
         new_password: Нова парола
-        note: Биография
+        note: Биогр.
         otp_attempt: Двуфакторен код
         password: Парола
         phrase: Ключова дума или фраза
-        setting_advanced_layout: Включете разширения уеб интерфейс
-        setting_aggregate_reblogs: Групиране на споделянията в инфопотока
-        setting_always_send_emails: Винаги да се изпращат известия по имейл
+        setting_advanced_layout: Включване на разширен уеб интерфейс
+        setting_aggregate_reblogs: Групиране на подсилванията в часовите оси
+        setting_always_send_emails: Винаги изпращане на известия по имейл
         setting_auto_play_gif: Самопускащи се анимирани гифчета
-        setting_boost_modal: Показване на диалога за потвърждение преди споделяне
-        setting_crop_images: Изрязване на изображения от неразгънати публикации до 16x9
+        setting_boost_modal: Показване на прозорец за потвърждение преди подсилване
+        setting_crop_images: Изрязване на образи в неразгънати публикации до 16x9
         setting_default_language: Език на публикуване
-        setting_default_privacy: Поверителност на публикациите
+        setting_default_privacy: Поверителност на публикуване
         setting_default_sensitive: Винаги да се отбелязва мултимедията като деликатна
-        setting_delete_modal: Показване на диалога за потвърждение преди изтриване на публикация
+        setting_delete_modal: Показване на прозорче за потвърждение преди изтриване на публикация
         setting_disable_swiping: Деактивиране на бързо плъзгащи движения
         setting_display_media: Показване на мултимедия
         setting_display_media_default: Стандартно
         setting_display_media_hide_all: Скриване на всичко
         setting_display_media_show_all: Показване на всичко
-        setting_expand_spoilers: Постоянно разширяване на публикации, маркирани с предупреждения
+        setting_expand_spoilers: Винаги разширяване на публикации, отбелязани с предупреждения за съдържание
+        setting_hide_network: Скриване на социалното ви графосвързване
         setting_noindex: Отказване от индексирането от търсачки
-        setting_reduce_motion: Забавяне на движението на анимациите
-        setting_show_application: Показване от кое приложение е изпратена публикацията
-        setting_system_font_ui: Използване на системния шрифт по подразбиране
+        setting_reduce_motion: Обездвижване на анимациите
+        setting_show_application: Разкриване на приложението, изпращащо публикации
+        setting_system_font_ui: Употреба на стандартния шрифт на системата
         setting_theme: Тема на сайта
-        setting_trends: Показване на ежедневните актуални теми
-        setting_unfollow_modal: Показване на диалога за потвърждение преди прекратяване следването на акаунт
-        setting_use_blurhash: Показване на цветно преливане за скрита мултимедия
+        setting_trends: Показване на днешните нашумели
+        setting_unfollow_modal: Показване на прозорче за потвърждение преди прекратяване следването на някого
+        setting_use_blurhash: Показване на цветни преливки за скрита мултимедия
         setting_use_pending_items: Бавен режим
+        severity: Тежест
         sign_in_token_attempt: Код за сигурност
         title: Заглавие
-        type: Тип на импортиране
+        type: Тип на внасяне
         username: Потребителско име
         username_or_email: Потребителско име или имейл
         whole_word: Цяла дума
+      email_domain_block:
+        with_dns_records: Включване не записи MX и IP-та на домейна
       featured_tag:
         name: Хаштаг
       filters:
@@ -155,18 +229,33 @@ bg:
           hide: Напълно скриване
           warn: Скриване зад предупреждение
       form_admin_settings:
+        backups_retention_period: Период за съхранение на потребителския архив
+        bootstrap_timeline_accounts: Винаги да се препоръчват следните акаунти на нови потребители
+        closed_registrations_message: Съобщение, показвано, когато записвания не са възможни
+        content_cache_retention_period: Период на съхранение на кеша за съдържание
+        custom_css: Персонализиран CSS
+        mascot: Талисман по избор (остаряла настройка)
+        media_cache_retention_period: Период на запазване на мултимедията в кеш паметта
+        profile_directory: Показване на директорията от профили
+        registrations_mode: Кой може да се регистрира
         require_invite_text: Изисква се причина за присъединяване
+        show_domain_blocks: Показване на блокиранията на домейни
+        show_domain_blocks_rationale: Показване защо са били блокирани домейните
+        site_contact_email: Имейл за контакт
         site_contact_username: Потребителско име на контакт
-        site_extended_description: Разширено описание
-        site_short_description: Описание на сървъра
+        site_extended_description: Разширен опис
+        site_short_description: Опис на сървъра
         site_terms: Политика за поверителност
         site_title: Име на сървъра
         theme: Стандартна тема
         thumbnail: Миниобраз на сървъра
+        timeline_preview: Позволяване на неупълномощен достъп до публични часови оси
+        trendable_by_default: Без преглед на нашумели
+        trends: Включване на налагащи се
       interactions:
         must_be_follower: Блокирай известия от не-последователи
-        must_be_following: Блокирай известия от хора, които не следваш
-        must_be_following_dm: Блокиране на директни съобщения от хора, които не следвате
+        must_be_following: Блокиране на известия от неследваните
+        must_be_following_dm: Блокиране на директни съобщения от неследваните
       invite:
         comment: Коментар
       invite_request:
@@ -175,34 +264,46 @@ bg:
         comment: Коментар
         ip: IP адрес
         severities:
-          no_access: Блокиране на адреса
+          no_access: Блокиране на достъпа
           sign_up_block: Блокиране на регистрации
           sign_up_requires_approval: Ограничаване на регистриране
         severity: Правило
       notification_emails:
+        appeal: Някой възразява срещу решение на модератора
         digest: Изпращай извлечения на съобщенията
-        favourite: Изпращай e-mail, когато някой хареса твоя публикация
-        follow: Изпращай e-mail, когато някой те последва
-        follow_request: Изпращай e-mail, когато някой пожелае да те последва
-        mention: Изпращай e-mail, когато някой те спомене
+        favourite: Някой направи ваша публикация като любима
+        follow: Някой ви последва
+        follow_request: Някой пожела да ви последва
+        mention: Някой ви спомена
         pending_account: Новите акаунти трябва да се прегледат
-        reblog: Изпращай e-mail, когато някой сподели твоя публикация
+        reblog: Някой подсили ваша публикация
         report: Новият доклад е подаден
+        trending_tag: Изискване на преглед за новонашумели
       rule:
         text: Правило
       tag:
+        listable: Позволяване на хаштага да се появява при търсене и предложения
         name: Хаштаг
+        trendable: Показване на хаштага да се появява под нашумели
+        usable: Позволяване на публикациите да употребяват този хаштаг
       user:
         role: Роля
       user_role:
         color: Цвят на значката
+        highlighted: Показване на ролята като значка на потребителските профили
         name: Име
         permissions_as_keys: Разрешения
         position: Приоритет
+      webhook:
+        events: Включване на събития
+        url: URL адрес на крайната точка
     'no': Не
     not_recommended: Не се препоръчва
     recommended: Препоръчано
     required:
       mark: "*"
       text: задължително
+    title:
+      sessions:
+        webauthn: Употребете един от ключовете си за сигурност, за да влезете
     'yes': Да
diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml
index 597d97859..8e5fd73fa 100644
--- a/config/locales/simple_form.ca.yml
+++ b/config/locales/simple_form.ca.yml
@@ -10,15 +10,15 @@ ca:
         text: Pots usar totes les sintaxis, com ara URL, etiquetes i mencions
         title: Opcional. No és visible per al destinatari
       admin_account_action:
-        include_statuses: L'usuari veurà quines publicacions han provocat que s'hagi moderat o avisat
+        include_statuses: L'usuari veurà quins tuts han causat l'acció de moderació o avís
         send_email_notification: L'usuari rebrà una explicació del que ha passat amb el seu compte
-        text_html: Opcional. En les publicacions, pots usar tota la sintaxi. Pots <a href="%{path}">afegir configuracions predefinides d'avís</a> per a estalviar temps
+        text_html: Opcional. En els tuts, pots usar tota la sintaxi. Pots <a href="%{path}">afegir configuracions predefinides d'avís</a> per a estalviar temps
         type_html: Tria què fer amb <strong>%{acct}</strong>
         types:
-          disable: Evita que l'usuari faci servir el seu compte, però no esborris ni amaguis el seu contingut.
+          disable: Evita que l'usuari faci servir el seu compte, però no n'esborris ni amaguis el contingut.
           none: Fes servir això per a enviar un avís a l'usuari sense desencadenar cap altra acció.
           sensitive: Obliga a marcar tots els fitxers multimèdia adjunts com a sensibles.
-          silence: Evita que l'usuari pugui publicar amb visibilitat pública, amagar les seves publicacions i les notificacions d'usuaris que no el segueixin.
+          silence: Evita que l'usuari pugui publicar amb visibilitat pública, amagar els seus tuts i les notificacions d'usuaris que no el segueixin.
           suspend: Evita qualsevol interacció des de o cap a aquest compte i esborra els seus continguts. Reversible en un termini de 30 dies.
         warning_preset_id: Opcional. Encara pots afegir text personalitzat al final de la configuració predefinida
       announcement:
@@ -26,7 +26,7 @@ ca:
         ends_at: Opcional. En aquest moment, l'anunci no es publicarà automàticament
         scheduled_at: Deixa-ho en blanc per a publicar l’anunci immediatament
         starts_at: Opcional. En cas que el teu anunci estigui vinculat a un interval de temps específic
-        text: Pots fer servir la sintaxi de publicacions. Tingues en compte l’espai que l’anunci ocuparà a la pantalla de l’usuari
+        text: Pots fer servir la sintaxi dels tuts. Tingues en compte l’espai que l’anunci ocuparà a la pantalla de l’usuari
       appeal:
         text: Només pots emetre una apel·lació per cada acció
       defaults:
@@ -42,23 +42,23 @@ ca:
         fields: Pots tenir fins a 4 elements que es mostren com a taula al teu perfil
         header: PNG, GIF o JPG de com a màxim %{size}. S'escalarà a %{dimensions}px
         inbox_url: Copia l'URL de la pàgina principal del relay que vols usar
-        irreversible: Les publicacions filtrades desapareixeran de manera irreversible, fins i tot si el filtre s'elimina més tard
+        irreversible: Els tuts filtrats desapareixeran de manera irreversible, fins i tot si el filtre es retira més tard
         locale: L'idioma de la interfície d’usuari, els correus i les notificacions push
         locked: Controla manualment qui et pot seguir, aprovant sol·licituds
         password: Utilitza com a mínim 8 caràcters
         phrase: Es combinarà independentment del format en el text o l'avís de contingut del tut
         scopes: API permeses per a accedir a l'aplicació. Si selecciones un àmbit de nivell superior, no cal que en seleccionis un d'individual.
-        setting_aggregate_reblogs: No mostris els nous impulsos de les publicacions que ja s'han impulsat recentment (només afecta els nous impulsos rebuts)
+        setting_aggregate_reblogs: No mostra els nous impulsos dels tuts que ja s'han impulsat recentment (només afecta als impulsos nous rebuts)
         setting_always_send_emails: Normalment, no s'enviarà cap notificació per correu electrònic mentre facis servir Mastodon
         setting_default_sensitive: El contingut sensible està ocult per defecte i es pot mostrar fent-hi clic
-        setting_display_media_default: Ocultar el contingut gràfic marcat com a sensible
+        setting_display_media_default: Amaga el contingut gràfic marcat com a sensible
         setting_display_media_hide_all: Oculta sempre tot el contingut multimèdia
         setting_display_media_show_all: Mostra sempre el contingut gràfic
         setting_hide_network: Qui segueixes i els que et segueixen no es mostraran en el teu perfil
         setting_noindex: Afecta el teu perfil públic i les pàgines d'estat
-        setting_show_application: L'aplicació que fas servir per a publicar es mostrarà en la vista detallada de les publicacions
+        setting_show_application: L'aplicació que fas servir per a publicar es mostrarà a la vista detallada dels teus tuts
         setting_use_blurhash: Els degradats es basen en els colors de les imatges ocultes, però n'enfosqueixen els detalls
-        setting_use_pending_items: Amaga les actualitzacions de la línia de temps després de fer un clic en lloc de desplaçar automàticament les publicacions
+        setting_use_pending_items: Amaga les actualitzacions de la línia de temps després de fer un clic, en lloc de desplaçar-les automàticament
         username: El teu nom d'usuari serà únic a %{domain}
         whole_word: Quan la paraula clau o la frase sigui només alfanumèrica, s'aplicarà si coincideix amb la paraula sencera
       domain_allow:
@@ -77,7 +77,7 @@ ca:
         backups_retention_period: Manté els arxius d'usuari generats durant el nombre de dies especificats.
         bootstrap_timeline_accounts: Aquests comptes es fixaran en la part superior de les recomanacions de seguiment dels nous usuaris.
         closed_registrations_message: Mostrat quan el registres estan tancats
-        content_cache_retention_period: Les publicacions d'altres servidors se suprimiran després del nombre de dies especificat quan s'estableix un valor positiu. Això pot ser irreversible.
+        content_cache_retention_period: Els tuts d'altres servidors se suprimiran després del nombre de dies especificat quan s'estableix un valor positiu. Això pot ser irreversible.
         custom_css: Pots aplicar estils personalitzats en la versió web de Mastodon.
         mascot: Anul·la la il·lustració en la interfície web avançada.
         media_cache_retention_period: Els fitxers multimèdia descarregats s'esborraran després del nombre de dies especificat quan el valor configurat és positiu, i tornats a descarregats sota demanda.
@@ -87,13 +87,13 @@ ca:
         site_contact_username: Com pot la gent trobar-te a Mastodon.
         site_extended_description: Qualsevol informació addicional que pot ser útil per als visitants i els teus usuaris. Es pot estructurar amb format Markdown.
         site_short_description: Una descripció curta per a ajudar a identificar de manera única el teu servidor. Qui el fa anar, per a qui és?
-        site_terms: Usa la teva pròpia política de privacitat o deixa-ho en blanc per a usar la per defecte. Pot ser estructurat amb format Markdown.
+        site_terms: Fes servir la teva pròpia política de privacitat o deixa-ho en blanc per a la per defecte. Es pot estructurar amb format Markdown.
         site_title: Com pot la gent referir-se al teu servidor a part del seu nom de domini.
         theme: El tema que els visitants i els nous usuaris veuen.
         thumbnail: Una imatge d'aproximadament 2:1 que es mostra al costat la informació del teu servidor.
-        timeline_preview: Els visitants amb sessió no iniciada seran capaços de navegar per les publicacions més recents en el teu servidor.
+        timeline_preview: Els visitants amb sessió no iniciada seran capaços de navegar per els tuts més recents en el teu servidor.
         trendable_by_default: Omet la revisió manual del contingut en tendència. Els articles individuals poden encara ser eliminats després del fet.
-        trends: Les tendències mostren quines publicacions, etiquetes i notícies estan guanyant força al vostre servidor.
+        trends: Les tendències mostren quins tuts, etiquetes i notícies estan guanyant força en el teu servidor.
       form_challenge:
         current_password: Estàs entrant en una àrea segura
       imports:
@@ -117,7 +117,7 @@ ca:
       tag:
         name: Només pots canviar la caixa de les lletres, per exemple, per fer-la més llegible
       user:
-        chosen_languages: Quan estigui marcat, només es mostraran les publicacions en les llengües seleccionades en les línies de temps públiques
+        chosen_languages: Quan estigui marcat, només es mostraran els tuts de les llengües seleccionades en les línies de temps públiques
         role: El rol controla quines permissions té l'usuari
       user_role:
         color: Color que s'usarà per al rol a tota la interfície d'usuari, com a RGB en format hexadecimal
@@ -141,7 +141,7 @@ ca:
         text: Text predefinit
         title: Títol
       admin_account_action:
-        include_statuses: Inclou les publicacions reportades en el correu electrònic
+        include_statuses: Inclou tuts reportats en el correu electrònic
         send_email_notification: Notifica l'usuari per correu electrònic
         text: Avís personalitzat
         type: Acció
@@ -192,9 +192,9 @@ ca:
         setting_always_send_emails: Envia'm sempre notificacions per correu electrònic
         setting_auto_play_gif: Reprodueix automàticament els GIF animats
         setting_boost_modal: Mostra la finestra de confirmació abans d'impulsar
-        setting_crop_images: Retalla les imatges en publicacions no ampliades a 16x9
-        setting_default_language: Idioma de les publicacions
-        setting_default_privacy: Privacitat de les publicacions
+        setting_crop_images: Retalla les imatges en tuts no ampliats a 16x9
+        setting_default_language: Llengua dels tuts
+        setting_default_privacy: Privacitat dels tuts
         setting_default_sensitive: Marcar sempre el contingut gràfic com a sensible
         setting_delete_modal: Mostra la finestra de confirmació abans d'esborrar un tut
         setting_disable_swiping: Desactiva les animacions
@@ -202,11 +202,11 @@ ca:
         setting_display_media_default: Per defecte
         setting_display_media_hide_all: Amaga-ho tot
         setting_display_media_show_all: Mostra-ho tot
-        setting_expand_spoilers: Desplega sempre les publicacions marcades amb advertències de contingut
+        setting_expand_spoilers: Desplega sempre els tuts marcats amb advertències de contingut
         setting_hide_network: Amaga la teva xarxa
         setting_noindex: Desactiva la indexació dels motors de cerca
         setting_reduce_motion: Redueix el moviment de les animacions
-        setting_show_application: Revelar l'aplicació utilitzada per fer les publicacions
+        setting_show_application: Revela l'aplicació utilitzada per enviar tuts
         setting_system_font_ui: Usa la lletra predeterminada del sistema
         setting_theme: Tema del lloc
         setting_trends: Mostra les tendències d'avui
@@ -271,7 +271,7 @@ ca:
       notification_emails:
         appeal: Algú ha apel·lat una decisió de moderació
         digest: Envia'm un resum per correu electrònic
-        favourite: Algú marca com a preferit el teu estat
+        favourite: Algú marca com a preferida la teva publicació
         follow: Algú et segueix
         follow_request: Algú sol·licita seguir-te
         mention: Algú et menciona
@@ -285,7 +285,7 @@ ca:
         listable: Permet que aquesta etiqueta aparegui en les cerques i en el directori de perfils
         name: Etiqueta
         trendable: Permet que aquesta etiqueta aparegui en les tendències
-        usable: Permetre a les publicacions emprar aquesta etiqueta
+        usable: Permet als tuts emprar aquesta etiqueta
       user:
         role: Rol
       user_role:
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index 06db2cc77..6f22876cf 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -13,12 +13,12 @@ de:
         include_statuses: Die Person sieht, welche Beiträge die Moderationsmaßnahme oder Warnung verursacht haben
         send_email_notification: Benutzer*in wird eine Erklärung erhalten, was mit dem Konto geschehen ist
         text_html: Optional. Du kannst Beitragssyntax verwenden. Du kannst <a href="%{path}">Warnvorlagen hinzufügen</a>, um Zeit zu sparen
-        type_html: Wähle aus, was du mit <strong>%{acct}</strong> machen möchtest
+        type_html: Wähle aus, wie mit <strong>%{acct}</strong> vorgegangen werden soll
         types:
           disable: Benutzer*in daran hindern, das Konto verwenden zu können, aber die Inhalte nicht löschen oder ausblenden.
           none: Verwende dies, um dem Account eine Warnung zu schicken, ohne dabei eine andere Aktion vorzunehmen.
           sensitive: Erzwingen, dass alle Medienanhänge dieses Profils mit einer Inhaltswarnung versehen werden.
-          silence: Verhindern, dass der Benutzer in der Lage ist, mit der öffentlichen Sichtbarkeit zu posten und seine Beiträge und Benachrichtigungen von Personen zu verstecken, die ihm nicht folgen.
+          silence: Verhindern, dass der Benutzer in der Lage ist, mit der öffentlichen Sichtbarkeit zu posten und seine Beiträge und Benachrichtigungen vor Personen zu verbergen, die ihm nicht folgen.
           suspend: Verhindert jegliche Interaktion von oder zu diesem Konto und löscht dessen Inhalt. Kann innerhalb von 30 Tagen rückgängig gemacht werden.
         warning_preset_id: Optional. Du kannst immer noch eigenen Text an das Ende der Vorlage hinzufügen
       announcement:
@@ -43,7 +43,7 @@ de:
         header: PNG, GIF oder JPG. Höchstens %{size} groß. Wird auf %{dimensions} px verkleinert
         inbox_url: Kopiere die URL von der Startseite des gewünschten Relays
         irreversible: Bereinigte Beiträge verschwinden unwiderruflich für dich, auch dann, wenn dieser Filter zu einem späteren wieder entfernt wird
-        locale: Die Sprache der Oberfläche, E-Mails und Push-Benachrichtigungen
+        locale: Die Sprache der Benutzeroberfläche, E-Mails und Push-Benachrichtigungen
         locked: Wer dir folgen und deine Inhalte sehen möchte, muss dein Follower sein und dafür um deine Erlaubnis bitten
         password: Verwende mindestens 8 Zeichen
         phrase: Wird unabhängig von der Groß- und Kleinschreibung im Text oder der Inhaltswarnung eines Beitrags abgeglichen
@@ -95,17 +95,17 @@ de:
         trendable_by_default: Manuelles Überprüfen angesagter Inhalte überspringen. Einzelne Elemente können später noch aus den Trends entfernt werden.
         trends: Trends zeigen, welche Beiträge, Hashtags und Nachrichten auf deinem Server immer beliebter werden.
       form_challenge:
-        current_password: Du betrittst einen sicheren Bereich
+        current_password: Du betrittst einen gesicherten Bereich
       imports:
-        data: CSV-Datei, die aus einem anderen Mastodon-Server exportiert wurde
+        data: CSV-Datei, exportiert von einem anderen Mastodon-Server
       invite_request:
-        text: Dies wird uns helfen deine Anmeldungsanfrage besser zu verarbeiten
+        text: Dies wird uns bei der Überprüfung deiner Anmeldung behilflich sein
       ip_block:
         comment: Optional. Zur Erinnerung, weshalb du diese Regel eingeführt hast.
         expires_in: IP-Adressen sind eine begrenzte Ressource. Sie können außerdem auf viele Computer aufgeteilt sein und auch die Zuordnungen ändern sich. Deshalb werden unbestimmte IP-Blöcke nicht empfohlen.
-        ip: Gib eine IPv4- oder IPv6-Adresse an. Du kannst ganze Bereiche mit der CIDR-Syntax blockieren. Achte darauf, dass du dich nicht aussperrst!
+        ip: Gib eine IPv4- oder IPv6-Adresse an. Du kannst ganze Bereiche mit der CIDR-Syntax blockieren. Achte darauf, dass du dich nicht selbst aussperrst!
         severities:
-          no_access: Zugriff auf alle Ressourcen blockieren
+          no_access: Blockiere Zugriff auf alle Ressourcen
           sign_up_block: Neue Registrierungen werden nicht möglich sein
           sign_up_requires_approval: Neue Registrierungen müssen genehmigt werden
         severity: Wähle aus, was mit Anfragen von dieser IP-Adresse geschehen soll
@@ -124,9 +124,9 @@ de:
         highlighted: Dies macht die Rolle öffentlich im Profil sichtbar
         name: Name der Rolle, der auch öffentlich als Badge angezeigt wird, sofern dies unten aktiviert ist
         permissions_as_keys: Benutzer*innen mit dieser Rolle haben Zugriff auf...
-        position: Die höhere Rolle entscheidet über die Konfliktlösung in bestimmten Situationen. Bestimmte Aktionen können nur in Rollen mit geringerer Priorität ausgeführt werden
+        position: Höhere Rollen entscheiden über Konfliktlösungen zu gewissen Situationen. Bestimmte Aktionen können nur mit geringfügigeren Rollen durchgeführt werden
       webhook:
-        events: Zu sendende Ereignisse auswählen
+        events: Wähle die zu sendenden Termine
         url: Wo Ereignisse hingesendet werden
     labels:
       account:
@@ -134,24 +134,24 @@ de:
           name: Bezeichnung
           value: Inhalt
       account_alias:
-        acct: Adresse des alten Kontos
+        acct: Betreiber des alten Kontos
       account_migration:
-        acct: Adresse des neuen Kontos
+        acct: Betreiber des neuen Kontos
       account_warning_preset:
         text: Vorlagentext
         title: Titel
       admin_account_action:
-        include_statuses: Gemeldete Beiträge der E-Mail beifügen
+        include_statuses: Beitragsmeldungen in die E-Mail mit anfügen
         send_email_notification: Nutzer*in per E-Mail benachrichtigen
-        text: Eigene Warnung
+        text: Benutzerdefinierte Warnung
         type: Aktion
         types:
           disable: Einfrieren
-          none: Nichts tun
+          none: Warnung senden
           sensitive: Inhaltswarnung
-          silence: Stummschalten
+          silence: Einschränkung
           suspend: Sperren
-        warning_preset_id: Benutze eine Warnungsvorlage
+        warning_preset_id: Warnungsvorlage verwenden
       announcement:
         all_day: Ganztägiges Ereignis
         ends_at: Ende der Ankündigung
@@ -159,11 +159,11 @@ de:
         starts_at: Beginn der Ankündigung
         text: Ankündigung
       appeal:
-        text: Erkläre, warum diese Entscheidung rückgängig gemacht werden soll
+        text: Teile mit, warum diese Entscheidung zurückgenommen werden soll
       defaults:
-        autofollow: Meinem Profil automatisch folgen
+        autofollow: Lade ein, um deinem Konto zu folgen
         avatar: Profilbild
-        bot: Dieses Profil ist ein Bot
+        bot: Dies ist ein Bot-Konto
         chosen_languages: Sprachen einschränken
         confirm_new_password: Neues Passwort bestätigen
         confirm_password: Passwort bestätigen
@@ -181,22 +181,22 @@ de:
         irreversible: Endgültig, nicht nur temporär ausblenden
         locale: Sprache des Webinterface
         locked: Geschütztes Profil
-        max_uses: Maximale Verwendungen
+        max_uses: Maximale Anzahl der Nutzer
         new_password: Neues Passwort
         note: Über mich
         otp_attempt: Zwei-Faktor-Authentisierung
         password: Passwort
         phrase: Wort oder Formulierung
         setting_advanced_layout: Erweitertes Webinterface verwenden
-        setting_aggregate_reblogs: Geteilte Beiträge in den Timelines gruppieren
+        setting_aggregate_reblogs: Boosts in der Timeline gruppieren
         setting_always_send_emails: Benachrichtigungen immer senden
         setting_auto_play_gif: Animierte GIFs automatisch abspielen
-        setting_boost_modal: Bestätigungsdialog anzeigen, bevor ein Beitrag geteilt wird
+        setting_boost_modal: Bestätigung vor dem Teilen einholen
         setting_crop_images: Bilder in nicht ausgeklappten Beiträgen auf 16:9 zuschneiden
         setting_default_language: Beitragssprache
         setting_default_privacy: Beitragssichtbarkeit
         setting_default_sensitive: Eigene Medien immer mit einer Inhaltswarnung versehen
-        setting_delete_modal: Bestätigungsdialog anzeigen, bevor ein Beitrag gelöscht wird
+        setting_delete_modal: Bestätigung anzeigen, bevor ein Beitrag gelöscht wird
         setting_disable_swiping: Wischgesten deaktivieren
         setting_display_media: Medien-Anzeige
         setting_display_media_default: Standard
@@ -242,7 +242,7 @@ de:
         show_domain_blocks: Anzeigen, welche Domains gesperrt wurden
         show_domain_blocks_rationale: Anzeigen, weshalb Domains gesperrt wurden
         site_contact_email: E-Mail-Adresse
-        site_contact_username: Profilname
+        site_contact_username: Kontakt Benutzername
         site_extended_description: Detaillierte Beschreibung
         site_short_description: Serverbeschreibung
         site_terms: Datenschutzerklärung
diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml
index 89e78c9b0..6d216bb80 100644
--- a/config/locales/simple_form.en-GB.yml
+++ b/config/locales/simple_form.en-GB.yml
@@ -34,8 +34,76 @@ en-GB:
         avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px
         bot: Signal to others that the account mainly performs automated actions and might not be monitored
         context: One or multiple contexts where the filter should apply
+        current_password: For security purposes please enter the password of the current account
+        current_username: To confirm, please enter the username of the current account
+        digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence
+        discoverable: Allow your account to be discovered by strangers through recommendations, trends and other features
+        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 posts will disappear irreversibly, even if filter is later removed
+        locale: The language of the user interface, e-mails and push notifications
+        locked: Manually control who can follow you by approving follow requests
+        password: Use at least 8 characters
+        phrase: Will be matched regardless of casing in text or content warning of a post
+        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 posts that have been recently boosted (only affects newly-received boosts)
+        setting_always_send_emails: Normally e-mail notifications won't be sent when you are actively using Mastodon
+        setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click
+        setting_display_media_default: Hide media marked as sensitive
+        setting_display_media_hide_all: Always hide media
+        setting_display_media_show_all: Always show media
+        setting_hide_network: Who you follow and who follows you will be hidden on your profile
+        setting_noindex: Affects your public profile and post pages
+        setting_show_application: The application you use to post will be displayed in the detailed view of your posts
+        setting_use_blurhash: Gradients are based on the colors of the hidden visuals but obfuscate any details
+        setting_use_pending_items: Hide timeline updates behind a click instead of automatically scrolling the feed
+        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
+      domain_allow:
+        domain: This domain will be able to fetch data from this server and incoming data from it will be processed and stored
+      email_domain_block:
+        domain: This can be the domain name that shows up in the e-mail address or the MX record it uses. They will be checked upon sign-up.
+        with_dns_records: An attempt to resolve the given domain's DNS records will be made and the results will also be blocked
+      featured_tag:
+        name: 'Here are some of the hashtags you used the most recently:'
+      filters:
+        action: Chose which action to perform when a post matches the filter
+        actions:
+          hide: Completely hide the filtered content, behaving as if it did not exist
+          warn: Hide the filtered content behind a warning mentioning the filter's title
+      form_admin_settings:
+        backups_retention_period: Keep generated user archives for the specified number of days.
+        bootstrap_timeline_accounts: These accounts will be pinned to the top of new users' follow recommendations.
+        closed_registrations_message: Displayed when sign-ups are closed
+        content_cache_retention_period: Posts from other servers will be deleted after the specified number of days when set to a positive value. This may be irreversible.
+        custom_css: You can apply custom styles on the web version of Mastodon.
+        mascot: Overrides the illustration in the advanced web interface.
+        media_cache_retention_period: Downloaded media files will be deleted after the specified number of days when set to a positive value, and re-downloaded on demand.
+        profile_directory: The profile directory lists all users who have opted-in to be discoverable.
+        require_invite_text: When sign-ups require manual approval, make the “Why do you want to join?” text input mandatory rather than optional
+        site_contact_email: How people can reach you for legal or support inquiries.
+        site_contact_username: How people can reach you on Mastodon.
+        site_extended_description: Any additional information that may be useful to visitors and your users. Can be structured with Markdown syntax.
+        site_short_description: A short description to help uniquely identify your server. Who is running it, who is it for?
+        site_terms: Use your own privacy policy or leave blank to use the default. Can be structured with Markdown syntax.
+        site_title: How people may refer to your server besides its domain name.
+        theme: Theme that logged out visitors and new users see.
+        thumbnail: A roughly 2:1 image displayed alongside your server information.
     labels:
+      ip_block:
+        ip: IP
+        severities:
+          no_access: Block access
+          sign_up_block: Block sign-ups
+          sign_up_requires_approval: Limit sign-ups
+        severity: Rule
       notification_emails:
+        appeal: Someone appeals a moderator decision
+        digest: Send digest e-mails
+        favourite: Someone favourited your post
+        follow: Someone followed you
         follow_request: Someone requested to follow you
         mention: Someone mentioned you
         pending_account: New account needs review
@@ -44,3 +112,28 @@ en-GB:
         trending_tag: New trend requires review
       rule:
         text: Rule
+      tag:
+        listable: Allow this hashtag to appear in searches and suggestions
+        name: Hashtag
+        trendable: Allow this hashtag to appear under trends
+        usable: Allow posts to use this hashtag
+      user:
+        role: Role
+      user_role:
+        color: Badge colour
+        name: Name
+        permissions_as_keys: Permissions
+        position: Priority
+      webhook:
+        events: Enabled events
+        url: Endpoint URL
+    'no': 'No'
+    not_recommended: Not recommended
+    recommended: Recommended
+    required:
+      mark: "*"
+      text: required
+    title:
+      sessions:
+        webauthn: Use one of your security keys to sign in
+    'yes': 'Yes'
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 8934f862e..622300820 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -18,8 +18,8 @@ en:
           disable: Prevent the user from using their account, but do not delete or hide their contents.
           none: Use this to send a warning to the user, without triggering any other action.
           sensitive: Force all this user's media attachments to be flagged as sensitive.
-          silence: Prevent the user from being able to post with public visibility, hide their posts and notifications from people not following them.
-          suspend: Prevent any interaction from or to this account and delete its contents. Revertible within 30 days.
+          silence: Prevent the user from being able to post with public visibility, hide their posts and notifications from people not following them. Closes all reports against this account.
+          suspend: Prevent any interaction from or to this account and delete its contents. Revertible within 30 days. Closes all reports against this account.
         warning_preset_id: Optional. You can still add custom text to end of the preset
       announcement:
         all_day: When checked, only the dates of the time range will be displayed
@@ -74,6 +74,7 @@ en:
           hide: Completely hide the filtered content, behaving as if it did not exist
           warn: Hide the filtered content behind a warning mentioning the filter's title
       form_admin_settings:
+        activity_api_enabled: Counts of locally published posts, active users, and new registrations in weekly buckets
         backups_retention_period: Keep generated user archives for the specified number of days.
         bootstrap_timeline_accounts: These accounts will be pinned to the top of new users' follow recommendations.
         closed_registrations_message: Displayed when sign-ups are closed
@@ -81,6 +82,7 @@ en:
         custom_css: You can apply custom styles on the web version of Mastodon.
         mascot: Overrides the illustration in the advanced web interface.
         media_cache_retention_period: Downloaded media files will be deleted after the specified number of days when set to a positive value, and re-downloaded on demand.
+        peers_api_enabled: A list of domain names this server has encountered in the fediverse. No data is included here about whether you federate with a given server, just that your server knows about it. This is used by services that collect statistics on federation in a general sense.
         profile_directory: The profile directory lists all users who have opted-in to be discoverable.
         require_invite_text: When sign-ups require manual approval, make the “Why do you want to join?” text input mandatory rather than optional
         site_contact_email: How people can reach you for legal or support inquiries.
@@ -229,6 +231,7 @@ en:
           hide: Hide completely
           warn: Hide with a warning
       form_admin_settings:
+        activity_api_enabled: Publish aggregate statistics about user activity in the API
         backups_retention_period: User archive retention period
         bootstrap_timeline_accounts: Always recommend these accounts to new users
         closed_registrations_message: Custom message when sign-ups are not available
@@ -236,6 +239,7 @@ en:
         custom_css: Custom CSS
         mascot: Custom mascot (legacy)
         media_cache_retention_period: Media cache retention period
+        peers_api_enabled: Publish list of discovered servers in the API
         profile_directory: Enable profile directory
         registrations_mode: Who can sign-up
         require_invite_text: Require a reason to join
diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml
index c42ca5319..025905aa1 100644
--- a/config/locales/simple_form.et.yml
+++ b/config/locales/simple_form.et.yml
@@ -3,11 +3,11 @@ et:
   simple_form:
     hints:
       account_alias:
-        acct: Sisesta selle konto kasutajanimi@domeen, millelt soovite kolida
+        acct: Sisesta konto kasutajanimi@domeen, mille soovid siia ümber kolida
       account_migration:
-        acct: Sisesta selle konto kasutajanimi@domeen, millele soovite kolida
+        acct: Sisesta kasutajanimi@domeen, kuhu soovid konto siit kolida
       account_warning_preset:
-        text: Te saate kasutada postituse süntaksi, näiteks URLe, silte ja mainimisi
+        text: Saab kasutada postituse süntaksi, näiteks URLe, silte ja mainimisi
         title: Valikuline. Ei ole nähtav saajale
       admin_account_action:
         include_statuses: Kasutaja näeb, millised postitused on põhjustanud moderaatori otsuse või hoiatuse
@@ -18,15 +18,15 @@ et:
           disable: Keela kasutajal konto kasutamine, sisu kustutamata või varjamata.
           none: Hoiatuse saatmine kasutajale, ilma täiendavate tegevuste käivitamiseta.
           sensitive: Kogu kasutaja meediasisu märgitakse kui tundlik sisu.
-          silence: Takistab kasutajal avaliku nähtavusega postitamist, peidab tema postitused ja märguanded inimeste eest, kes ei jälgi.
+          silence: Takistab kasutajal avaliku nähtavusega postitamist, peidab tema postitused ja märguanded inimeste eest, kes teda ei jälgi.
           suspend: Takistamaks suhtlust selle kontoga ja kustutamaks kogu sisu. Tagasivõetav 30 päeva jooksul.
-        warning_preset_id: Valikuline. Te saate ikka lisada mis tahes teksti eelseadistuse lõppu
+        warning_preset_id: Valikuline. Saad ikka lisada mis tahes teksti eelseadistuse lõppu
       announcement:
-        all_day: Kui valitud, ainult kuupäevad antud ajavahemikus on kuvatud
+        all_day: Kui valitud, kuvatakse vaid selle ajavahemiku kuupäevi
         ends_at: Valikuline. Teadaanne eemaldatakse automaatselt sellel ajal
         scheduled_at: Jäta tühjaks, et avaldada teadaande koheselt
-        starts_at: Valikuline. Juhul, kui teie teadaanne on limiteeritud kindlale ajavahemikule
-        text: Te saate kasutada postituse süntaksi. Tuleks silmas pidada, kui palju ruumi teadaanne võtab kasutaja ekraanil
+        starts_at: Valikuline. Juhul, kui teadaanne on piiratud kindla ajavahemikuga
+        text: Saad kasutada postituse süntaksi. Tuleks silmas pidada, kui palju teadaanne kasutaja ekraanil ruumi võtab
       appeal:
         text: Otsust on võimalik vaidlustada vaid 1 kord
       defaults:
@@ -34,32 +34,32 @@ et:
         avatar: PNG, GIF või JPG. Kõige rohkem %{size}. Vähendatakse %{dimensions} pikslini
         bot: Teavita teisi, et see konto teeb enamjaolt automatiseeritud tegevusi ja ei pruugi olla järelvalve all
         context: Üks või mitu konteksti, mille vastu see filter peaks rakenduma
-        current_password: Turvalisuse huvides palume sisestage praeguse konto salasõna
-        current_username: Kinnitamiseks palun sisestage oma konto kasutajanimi
-        digest: Saadetakse ainult pärast pikka perioodi tegevusetust ja ainult siis, kui Teile on saadetud privaatseid sõnumeid
+        current_password: Sisesta turvalisuse huvides oma siinse konto salasõna
+        current_username: Kinnitamiseks palun sisesta oma konto kasutajanimi
+        digest: Saadetakse ainult pärast pikka tegevusetuse perioodi ja ainult siis, kui on saadetud otsesõnumeid
         discoverable: Konto on leitav võhivõõraste jaoks soovituste ja trendide sirvimise teel vm sarnaste vahenditega
-        email: Teile saadetakse kinnituskiri e-posti teel
-        fields: Te saate oma profiilil tabelina kuvada kuni 4 asja
+        email: Sulle saadetakse e-posti teel kinnituskiri
+        fields: Saad oma profiilil tabelina kuvada kuni 4 asja
         header: PNG, GIF või JPG. Kõige rohkem %{size}. Vähendatakse %{dimensions} pikslini
-        inbox_url: Kopeerige soovitud relee avalehe URL
+        inbox_url: Kopeeri soovitud vahendaja avalehe URL
         irreversible: Filtreeritud postitused kaovad taastamatult, isegi kui filter on hiljem eemaldatud
-        locale: Kasutajaliidese, e-kirjade ja push-teadete keel
+        locale: Kasutajaliidese, e-kirjade ja tõuketeadete keel
         locked: Nõuab käsitsi jälgijate kinnitamist
         password: Vajalik on vähemalt 8 märki
         phrase: Kattub olenemata postituse teksti suurtähtedest või sisuhoiatusest
-        scopes: Milliseid API-sid see rakendus tohib kasutada. Kui Te valite kõrgeima taseme, ei pea Te valima individuaalseid.
+        scopes: Milliseid API-sid see rakendus tohib kasutada. Kui valid kõrgeima taseme, ei pea üksikuid eraldi valima.
         setting_aggregate_reblogs: Ära kuva uusi postituste jagamisi, mis on hiljuti jagatud (kehtib vaid uutele jagamistele)
         setting_always_send_emails: Mastodoni aktiivsel kasutamisel sulle tavaliselt meilile teavitusi ei saadeta
         setting_default_sensitive: Tundlik meedia on vaikimisi peidetud ning seda saab avada sellele klikkides
         setting_display_media_default: Peida tundlikuks märgitud meedia
         setting_display_media_hide_all: Alati peida kõik meedia
         setting_display_media_show_all: Alati näita tundlikuks märgistatud meedia
-        setting_hide_network: Keda Te jälgite ja kes jägib Teid ei kuvata Teie profiilil
-        setting_noindex: Mõjutab Teie avalikku profiili ja staatuse lehekülgi
-        setting_show_application: Rakendus, mida kasutate postitamiseks, kuvatakse postituste detailvaates
+        setting_hide_network: Profiilil ei kuvata Keda sa jälgid ja kes jälgib sind
+        setting_noindex: Mõjutab avalikku profiili ja postituste lehekülgi
+        setting_show_application: Postitamiseks kasutatud rakenduse infot kuvatakse postituse üksikasjavaates
         setting_use_blurhash: Värvid põhinevad peidetud visuaalidel, kuid hägustavad igasuguseid detaile
-        setting_use_pending_items: Peida ajajoone uuendused kliki taga selle asemel, et automaatselt kerida voogu
-        username: Teie kasutajanimi on %{domain}-il unikaalne
+        setting_use_pending_items: Voo automaatse kerimise asemel peida ajajoone uuendused kliki taha
+        username: Sinu kasutajanimi on %{domain}-il unikaalne
         whole_word: Kui võtmesõna või fraas on ainult tähtnumbriline, rakendub see ainult siis, kui see kattub terve sõnaga
       domain_allow:
         domain: See domeen saab tõmmata andmeid sellelt serverilt ning sissetulevad andmed sellelt domeenilt töödeldakse ning salvestatakse
@@ -74,20 +74,20 @@ et:
           hide: Filtreeritud sisu täielik peitmine, nagu seda polekski üldse olemas
           warn: Varja filtreeritud sisu hoiatusega, nimetades filtri pealkirja
       form_admin_settings:
-        backups_retention_period: Talleta genereeritud kasutajaarhiivid määratud arv päevadeks.
+        backups_retention_period: Talleta genereeritud kasutajaarhiivid määratud arv päevi.
         bootstrap_timeline_accounts: Need kasutajad kinnitatakse uute kasutajate jälgimissoovituste esiritta.
         closed_registrations_message: Kuvatakse, kui liitumised pole võimalikud
         content_cache_retention_period: Teiste serverite postitused kustutatakse pärast määratud päevade arvu, kui see on seatud positiivsele väärtusele. See võib olla pöördumatu.
         custom_css: Kohandatud stiile on võimalik kasutada Mastodoni veebiliideses.
         mascot: Asendab kohandatud veebiliidese illustratsiooni.
-        media_cache_retention_period: Positiivse väärtuse korral kustutatakse allalaetud meediafailid nende päevade möödudes ning laetakse vajadusel uuesti alla.
+        media_cache_retention_period: Positiivse väärtuse korral kustutatakse allalaetud meediafailid määratud päevade möödudes. Vajadusel laaditakse need uuesti alla.
         profile_directory: Kasutajate kataloog kuvab nimekirja kasutajatest, kes on seda lubanud.
-        require_invite_text: Kui liitumisi on tarvis kinnitada, oleks "Miks Te soovite liituda?" vastus vajalik
+        require_invite_text: Kui liitumisi on tarvis kinnitada, oleks "Miks soovid liituda?" vastus vajalik
         site_contact_email: Kui peaks tekkima vajadus ühendust võtta täiendavate küsimuste osas.
         site_contact_username: Kuidas Mastodoni kaudu ühendust võtta.
         site_extended_description: Igasugune lisateave, mis võib külastajatele ja kasutajatele kasulik olla. Saab liigendada Markdown süntaksiga.
         site_short_description: Lühikirjeldus serveri unikaalseks identifitseerimiseks. Kes haldab, kellele mõeldud?
-        site_terms: Kasuta oma privaatsuspoliitikat või tühjaks jättes vaikimisi-teksti. Saab liigendada Markdown süntaksi abil.
+        site_terms: Lisa siia serveri isikuandmete kaitse põhimõtted või jäta tühjaks, et kasutada geneerilisi. Tekstis on lubatud Markdowni süntaks.
         site_title: Kuidas inimesed saavad serverile viidata, lisaks domeeninimele.
         theme: Teema, mida näevad sisenemata ning uued kasutajad.
         thumbnail: Umbes 2:1 mõõdus pilt serveri informatsiooni kõrval.
@@ -99,7 +99,7 @@ et:
       imports:
         data: CSV fail eksporditi teisest Mastodoni serverist
       invite_request:
-        text: See aitab meil üle vaadata Teie taotlust
+        text: See aitab meil sinu taotlust üle vaadata
       ip_block:
         comment: Valikuline. Talletamaks reegli lisamise põhjust.
         expires_in: IP-aadressid on lõplik ressurss ja on tihtipeale ühiskasutuses või vahetub kasutaja. Sel põhjusel pole kestvad IP-piirangud soovituslikud.
@@ -112,10 +112,10 @@ et:
       rule:
         text: Reegli või nõude kirjeldus selle serveri kasutajatele. Võimalikult lühidalt ja lihtsalt
       sessions:
-        otp: 'Kahe-etapise autentimise kood telefonirakendusest või mõni taastekood:'
+        otp: 'Kaheastmelise autentimise kood telefonirakendusest või mõni taastekood:'
         webauthn: Kui see on USB-võti, sisesta see ning vajadusel aktiveeri.
       tag:
-        name: Te saate ainult muuta tähtede tõstetust, näiteks selleks, et muuta seda rohkem loetavaks
+        name: Saad muuta ainult tähtede suurtähelisust, näiteks selleks, et muuta seda loetavamaks
       user:
         chosen_languages: Keelte valimisel näidatakse avalikel ajajoontel ainult neis keeltes postitusi
         role: See roll kontrollib, millised õigused kasutajal on
@@ -134,9 +134,9 @@ et:
           name: Nimetus
           value: Sisu
       account_alias:
-        acct: Vana konto täisnimi
+        acct: Vana konto aadress
       account_migration:
-        acct: Uue konto täisnimi
+        acct: Uue konto aadress
       account_warning_preset:
         text: Eelseadistatud tekst
         title: Pealkiri
@@ -146,7 +146,7 @@ et:
         text: Hoiatus
         type: Tegevus
         types:
-          disable: Keela
+          disable: Lukusta
           none: Ära tee midagi
           sensitive: Tundlik
           silence: Vaigista
@@ -170,29 +170,29 @@ et:
         context: Filtreeri kontekste
         current_password: Kehtiv salasõna
         data: Andmed
-        discoverable: Lisage see konto kataloogi
+        discoverable: Lisa see konto kataloogi
         display_name: Kuvanimi
         email: E-posti aadress
         expires_in: Aegu pärast
         fields: Veebiviited
         header: Päis
         honeypot: "%{label} (ära sisesta)"
-        inbox_url: Relee sisendkausta URL
+        inbox_url: Vahendaja sisendkausta URL
         irreversible: Kustuta selle asemel, et peita
         locale: Kasutajaliidese keel
         locked: Lukusta konto
         max_uses: Maksimum kasutajate arv
         new_password: Uus salasõna
         note: Elulugu
-        otp_attempt: Kahe-etapine kood
+        otp_attempt: Kaheastmeline kood
         password: Salasõna
         phrase: Võtmesõna või fraas
         setting_advanced_layout: Aktiveeri kohandatud veebiliides
         setting_aggregate_reblogs: Grupeeri jagamised ajajoontel
         setting_always_send_emails: Edasta kõik teavitused meilile
-        setting_auto_play_gif: Mängi GIF-e automaatselt
+        setting_auto_play_gif: Esita GIF-e automaatselt
         setting_boost_modal: Näita enne jagamist kinnitusdialoogi
-        setting_crop_images: Kuva suurendamata postituste pildid kui 16x9
+        setting_crop_images: Laiendamata postitustes kärbi pildid 16:9 küljesuhtesse
         setting_default_language: Postituse keel
         setting_default_privacy: Postituse nähtavus
         setting_default_sensitive: Alati märgista meedia tundlikuks
@@ -202,10 +202,10 @@ et:
         setting_display_media_default: Vaikimisi
         setting_display_media_hide_all: Peida kõik
         setting_display_media_show_all: Kuva kõik
-        setting_expand_spoilers: Alati laienda sisuhoiatustega postitused
+        setting_expand_spoilers: Alati näita tundlikuks märgitud postituste sisu
         setting_hide_network: Peida oma võrk
         setting_noindex: Keeldu otsingumootorite indekseerimistest
-        setting_reduce_motion: Vähenda liikumist animatsioonides
+        setting_reduce_motion: Vähenda animatsioonides liikumist
         setting_show_application: Avalikusta postituste tegemisel kasutatud rakendus
         setting_system_font_ui: Kasuta süsteemi vaikefonti
         setting_theme: Saidi teema
@@ -259,7 +259,7 @@ et:
       invite:
         comment: Kommenteerima
       invite_request:
-        text: Miks Te soovite liituda?
+        text: Miks soovid liituda?
       ip_block:
         comment: Kommentaar
         ip: IP
@@ -271,8 +271,8 @@ et:
       notification_emails:
         appeal: Moderaatori otsus on vaidlustatud
         digest: Saada ülevaatlike e-kirju
-        favourite: Saada e-kiri, kui keegi lisab teie staatuse lemmikuks
-        follow: Saada e-kiri, kui keegi alustab Teie jälgimist
+        favourite: Saada e-kiri, kui keegi lisab su postituse lemmikuks
+        follow: Saada e-kiri, kui keegi alustab jälgimist
         follow_request: Saada e-kiri, kui keegi soovib Teid jälgida
         mention: Saada e-kiri, kui keegi mainib Teid
         pending_account: Saada e-kiri, kui uus konto vajab ülevaatlust
diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml
index 26d905ccc..fc40b2855 100644
--- a/config/locales/simple_form.fi.yml
+++ b/config/locales/simple_form.fi.yml
@@ -7,7 +7,7 @@ fi:
       account_migration:
         acct: Määrittele käyttäjän käyttäjänimi@verkkotunnus, johon haluat siirtyä
       account_warning_preset:
-        text: Voit käyttää julkaisun syntaksia, kuten URL-osoitteita, hashtageja ja mainintoja
+        text: Voit käyttää julkaisun syntaksia, kuten URL-osoitteita, aihetunnisteita ja mainintoja
         title: Vapaaehtoinen. Ei näytetä vastaanottajalle
       admin_account_action:
         include_statuses: Käyttäjä näkee mitkä viestit johtivat toimenpiteeseen tai varoitukseen
@@ -41,7 +41,7 @@ fi:
         email: Sinulle lähetetään vahvistussähköposti
         fields: Sinulla voi olla korkeintaan 4 asiaa profiilissasi taulukossa
         header: PNG, GIF tai JPG. Enintään %{size}. Skaalataan kokoon %{dimensions} px
-        inbox_url: Kopioi URL-osoite sen viestin etusivulta, jota haluat käyttää
+        inbox_url: Kopioi URL-osoite haluamasi välittäjän etusivulta
         irreversible: Suodatetut julkaisut katoavat lopullisesti, vaikka suodatin poistettaisiin myöhemmin
         locale: Käyttöliittymän, sähköpostien ja ilmoitusten kieli
         locked: Sinun täytyy hyväksyä seuraajat manuaalisesti
@@ -93,7 +93,7 @@ fi:
         thumbnail: Noin 2:1 kuva näytetään palvelimen tietojen rinnalla.
         timeline_preview: Uloskirjautuneet vierailijat voivat selata uusimpia julkisia viestejä, jotka ovat saatavilla palvelimella.
         trendable_by_default: Ohita suositun sisällön manuaalinen tarkistus. Yksittäisiä kohteita voidaan edelleen poistaa jälkikäteen.
-        trends: Trendit osoittavat, mitkä viestit, hashtagit ja uutiset ovat saamassa vetoa palvelimellasi.
+        trends: Trendit osoittavat, mitkä julkaisut, aihetunnisteet ja uutiset ovat saamassa vetoa palvelimellasi.
       form_challenge:
         current_password: Olet menossa suojatulle alueelle
       imports:
@@ -177,7 +177,7 @@ fi:
         fields: Profiilin metadata
         header: Otsakekuva
         honeypot: "%{label} (älä täytä)"
-        inbox_url: Välityspostilaatikon URL-osoite
+        inbox_url: Välittäjän postilaatikon URL-osoite
         irreversible: Pudota piilottamisen sijaan
         locale: Kieli
         locked: Lukitse tili
@@ -204,7 +204,7 @@ fi:
         setting_display_media_show_all: Näytä kaikki
         setting_expand_spoilers: Laajenna aina sisältövaroituksilla merkityt viestit
         setting_hide_network: Piilota verkkosi
-        setting_noindex: Jättäydy pois hakukoneindeksoinnista
+        setting_noindex: Jättäydy hakukoneindeksoinnin ulkopuolelle
         setting_reduce_motion: Vähennä animaatioiden liikettä
         setting_show_application: Näytä sovellus mistä lähetät viestejä
         setting_system_font_ui: Käytä järjestelmän oletusfonttia
@@ -282,10 +282,10 @@ fi:
       rule:
         text: Sääntö
       tag:
-        listable: Salli tämän hashtagin näkyä hauissa ja ehdotuksissa
+        listable: Salli tämän aihetunnisteen näkyä hauissa ja ehdotuksissa
         name: Aihetunniste
         trendable: Salli tämän aihetunnisteen näkyä trendeissä
-        usable: Salli postauksien käyttää tätä aihetunnistetta
+        usable: Salli julkaisujen käyttää tätä aihetunnistetta
       user:
         role: Rooli
       user_role:
diff --git a/config/locales/simple_form.fr-QC.yml b/config/locales/simple_form.fr-QC.yml
index 41e14e5b2..11c050354 100644
--- a/config/locales/simple_form.fr-QC.yml
+++ b/config/locales/simple_form.fr-QC.yml
@@ -84,7 +84,7 @@ fr-QC:
         profile_directory: L'annuaire des profils répertorie tous les utilisateurs qui ont opté pour être découverts.
         require_invite_text: Lorsque les inscriptions nécessitent une approbation manuelle, rendre le texte de l’invitation "Pourquoi voulez-vous vous inscrire ?" obligatoire plutôt que facultatif
         site_contact_email: Comment les personnes peuvent vous joindre pour des demandes de renseignements juridiques ou d'assistance.
-        site_contact_username: Comment les gens peuvent vous conracter sur Mastodon.
+        site_contact_username: Comment les gens peuvent vous contacter sur Mastodon.
         site_extended_description: Toute information supplémentaire qui peut être utile aux visiteurs et à vos utilisateurs. Peut être structurée avec la syntaxe Markdown.
         site_short_description: Une courte description pour aider à identifier de manière unique votre serveur. Qui l'exécute, à qui il est destiné ?
         site_terms: Utilisez votre propre politique de confidentialité ou laissez vide pour utiliser la syntaxe par défaut. Peut être structurée avec la syntaxe Markdown.
diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml
index b568750e2..d45809a3a 100644
--- a/config/locales/simple_form.fy.yml
+++ b/config/locales/simple_form.fy.yml
@@ -1,6 +1,309 @@
 ---
 fy:
   simple_form:
+    hints:
+      account_alias:
+        acct: Fermeld de brûkersnamme@domein fan de account fan wêr’t jo ferhúzje wolle
+      account_migration:
+        acct: Fermeld de brûkersnamme@domein fan de account wêr’t jo nei ta ferhúzje wolle
+      account_warning_preset:
+        text: Jo kinne spesifike tekst foar berjochten brûke, lykas URL’s, hashtags en fermeldingen
+        title: Opsjoneel. Net sichtber foar de ûntfanger
+      admin_account_action:
+        include_statuses: De brûker sjocht hokker berjochten ferantwurdlik binne foar de moderaasjemaatregel of warskôging
+        send_email_notification: De brûker ûntfangt in útlis oer wat der mei harren account bard is
+        text_html: Opsjoneel. Jo kinne spesifike tekst foar berjochten brûke. Om tiid te besparjen kinne jo <a href="%{path}">presets foar warskôgingen tafoegje</a>
+        type_html: Kies wat der mei <strong>%{acct}</strong> barre moat
+        types:
+          disable: Foarkom dat de brûker harren account brûkt, mar wiskje of ferstopje de ynhâld net.
+          none: Brûk dit om in warskôging nei de brûker te stjoeren, sûnder dat noch in oare maatregel nommen wurdt.
+          sensitive: Forsearje dat alle mediabylagen fan dizze brûker as gefoelich markearre wurde.
+          silence: Foarkom dat de brûker iepenbiere berjochten ferstjoere kin, ferstopje harren berjochten en meldingen foar minsken dy’t dyjinge net folgje.
+          suspend: Alle ynteraksjes fan en mei dizze account opkeare, en de accountgegevens fuortsmite. Dit kin binnen 30 dagen weromdraaid wurde.
+        warning_preset_id: Opsjoneel. Jo kinne noch hieltyd hânmjittich tekst tafoegje oan it ein fan de foarynstelling
+      announcement:
+        all_day: Wannear dit oanfinkt is, wurde allinnich de datums binnen it tiidrek toand
+        ends_at: Opsjoneel. De publikaasje fan de meidieling wurdt op dit tiidstip automatysk beëinige
+        scheduled_at: Lit leech om de meidieling daliks te publisearjen
+        starts_at: Opsjoneel. Yn it gefal dat jo meidieling oan in bepaald tiidrek bûn is
+        text: Jo kinne spesifike tekst foar berjochten brûke. Let op de romte dy’t de meidieling op it skerm fan de brûker yn nimt
+      appeal:
+        text: Jo kinne mar ien kear beswier yntsjinje tsjin in fêststelde oertrêding
+      defaults:
+        autofollow: Minsken dy’t harren fia de útnûging registrearre hawwe, folgje jo automatysk
+        avatar: PNG, GIF of JPG. Maksimaal %{size}. Wurdt weromskeald nei %{dimensions}px
+        bot: Sinjaal nei oare brûkers ta dat dizze account yn haadsaak automatisearre berjochten stjoert en mooglik net kontrolearre wurdt
+        context: Ien of meardere lokaasjes wêr’t it filter aktyf wêze moat
+        current_password: Fier foar feilichheidsredenen it wachtwurd fan jo aktuele account yn
+        current_username: Fier ta befêstiging de brûkersnamme fan jo aktuele account yn
+        digest: Wurdt allinnich nei in lange perioade fan ynaktiviteit ferstjoerd en allinnich wannear’t jo wylst jo ôfwêzigens persoanlike berjochten ûntfongen hawwe
+        discoverable: Tastean dat jo account te finen is foar ûnbekenden, fia oanrekommandaasjes, trends en op oare manieren
+        email: Jo krije in befêstigings-e-mailberjocht
+        fields: Jo kinne maksimaal 4 items as in tabel op jo profyl werjaan
+        header: PNG, GIF of JPG. Maksimaal %{size}. Wurdt weromskeald nei %{dimensions}px
+        inbox_url: Kopiearje de URL fan de foarside fan de relayserver dy’t jo brûke wolle
+        irreversible: Filtere berjochten ferdwine definityf, sels as it filter letter fuortsmiten wurdt
+        locale: De taal fan de brûkersomjouwing, e-mailberjochten en pushmeldingen
+        locked: Troch it goedkarren fan folgers hânmjittich bepale wa’t jo folgje mei
+        password: Brûk op syn minst 8 tekens
+        phrase: Komt oerien nettsjinsteande haad-/lytse letters of in ynhâldswarskôging
+        scopes: Ta hokker API’s hat de tapassing tagong. Wannear’t jo in tastimming fan it boppeste nivo kieze, hoege jo gjin yndividuele tastimmingen mear te kiezen.
+        setting_aggregate_reblogs: Gjin nije boosts toane foar berjochten dy’t resintlik noch boost binne (hat allinnich effekt op nij ûntfongen boosts)
+        setting_always_send_emails: Normaliter wurde der gjin e-mailmeldingen ferstjoerd wannear’t jo aktyf Mastodon brûke
+        setting_default_sensitive: Gefoelige media wurdt standert ferstoppe en kin mei ien klik toand wurde
+        setting_display_media_default: As gefoelich markearre media ferstopje
+        setting_display_media_hide_all: Media altyd ferstopje
+        setting_display_media_show_all: Media altyd toane
+        setting_hide_network: Wa’t jo folgje en wa’t jo folget wurdt net op jo profyl toand
+        setting_noindex: Hat ynfloed op jo iepenbiere profyl en siden mei berjochten
+        setting_show_application: De tapassing dy’t jo brûke om berjochten te pleatsen, wurdt yn de detaillearre werjefte fan it berjocht toand
+        setting_use_blurhash: Dizige kleuroergongen binne basearre op de kleuren fan de ferstoppe media, wêrmei elk detail ferdwynt
+        setting_use_pending_items: De tiidline wurdt bywurke troch op it oantal nije items te klikken, yn stee fan dat dizze automatysk bywurke wurdt
+        username: Jo brûkersnamme is unyk op %{domain}
+        whole_word: Wannear it trefwurd of part fan de sin alfanumeryk is, wurdt it allinnich filtere wannear’t it hiele wurd oerienkomt
+      domain_allow:
+        domain: Dit domein is yn steat om gegevens fan dizze server op te heljen, en ynkommende gegevens wurde ferwurke en bewarre
+      email_domain_block:
+        domain: Dit kin de domeinnamme wêze dy’t werjûn wurdt yn it e-mailadres of yn it MX-record dat it brûkt. Se wurde kontrolearre wylst de registraasje.
+        with_dns_records: Der wurdt in besykjen dien om de oanbelangjende DNS-records op te sykjen, wêrnei de resultaten ek blokkearre wurde
+      featured_tag:
+        name: 'Hjir binne inkelde fan de hashtags dy’t jo koartlyn brûkt hawwe:'
+      filters:
+        action: Kies hokker aksjes útfierd wurde moatte, wannear’t in berjocht oerienkomt mei it filter
+        actions:
+          hide: Ferstopje de filtere ynhâld folslein, as oft it net bestiet
+          warn: Ferstopje de filtere ynhâld efter in warskôging, mei de titel fan it filter as warskôgingstekst
+      form_admin_settings:
+        backups_retention_period: De oanmakke brûkersargiven foar it opjûne oantal dagen behâlde.
+        bootstrap_timeline_accounts: Dizze accounts wurde boppe oan de oanrekommandaasjes oan nije brûkers toand. Meardere brûkersnammen troch komma’s skiede.
+        closed_registrations_message: Werjûn wannear’t registraasje fan nije accounts útskeakele is
+        content_cache_retention_period: 'Berjochten fan oare servers wurde nei it opjûne oantal dagen fuortsmiten. Let op: Dit is definityf.'
+        custom_css: Jo kinne oanpaste CSS tapasse op de webferzje fan dizze Mastodon-server.
+        mascot: Oerskriuwt de yllustraasje yn de avansearre webomjouwing.
+        media_cache_retention_period: Mediabestannen dy’t fan oare servers download binne wurde nei it opjûne oantal dagen fuortsmiten en wurde op fersyk opnij download.
+        profile_directory: De brûkersgids befettet in list fan alle brûkers dy¥t derfoar keazen hawwe om ûntdekt wurde te kinnen.
+        require_invite_text: Meitsje it ynfoljen fan "Wêrom wolle jo jo hjir registrearje?" ferplicht yn stee fan opsjoneel, wannear’t registraasjes hânmjittich goedkard wurde moatte
+        site_contact_email: Hoe minsken jo berikke kinne foar juridyske fragen of stipe.
+        site_contact_username: Hoe minsken jo op Mastodon berikke kinne.
+        site_extended_description: Alle oanfoljende ynformaasje dy’t nuttich wêze kin foar besikers en jo brûkers. Kin opmakke wurde mei Markdown.
+        site_short_description: In koarte beskriuwing om it unike karakter fan jo server te toanen. Wa beheart de server, wat is de doelgroep?
+        site_terms: Brûk jo eigen privacybeleid of lit leech om de standertwearde te brûken. Kin mei Markdown opmakke wurde.
+        site_title: Hoe minsken bûten de domeinnamme nei jo server ferwize kinne.
+        theme: Tema dy’t ôfmelde besikers en nije brûkers sjen.
+        thumbnail: In ôfbylding fan ûngefear in ferhâlding fan 2:1 dy’t njonken jo serverynformaasje toand wurdt.
+        timeline_preview: Net oanmelde besikers kinne de meast resinte, op de server oanwêzige iepenbiere berjochten besjen.
+        trendable_by_default: Hânmjittige beoardieling fan trends oerslaan. Yndividuele items kinne letter dochs noch ôfkard wurde.
+        trends: Trends toane hokker berjochten, hashtags en nijsberjochten op jo server oan populariteit winne.
+      form_challenge:
+        current_password: Jo betrêdzje in feilige omjouwing
+      imports:
+        data: CSV-bestân dat op in oare Mastodon-server eksportearre waard
+      invite_request:
+        text: Dit helpt ús om jo oanfraach te beoardielen
+      ip_block:
+        comment: Opsjoneel. Ferjit net wêrom jo dizze rigel tafoege hawwe.
+        expires_in: It tal IP-adressen is beheind. Se wurde somtiden dield en wikselje faaks fan eigener. Om dizze reden wurde ûnbeheinde IP-blokkaden net oanrekommandearre.
+        ip: Fier in IPv4- of IPv6-adres yn. Jo kinne hiele rigels blokkearje mei de CIDR-metoade. Pas op dat jo josels net bûtenslute!
+        severities:
+          no_access: Tagong ta de hiele server blokkearje
+          sign_up_block: Nije registraasjes binne net mooglik
+          sign_up_requires_approval: Nije registraasjes fereaskje jo goedkarring
+        severity: Kies wat der barre moat mei oanfragen fan dit IP-adres
+      rule:
+        text: Omskriuw in rigel of eask foar brûkers op dizze server. Probearje it koart en simpel te hâlden
+      sessions:
+        otp: 'Fier de twa-stapstagongskoade fan jo mobile telefoan ôf yn of brûk ien fan jo werstelkoaden:'
+        webauthn: Wannear’t it in USB-kaai is, soargje der dan foar dat jo dizze yn de kompjûter stekke en, wannear nedich, aktivearje.
+      tag:
+        name: Jo kinne elk wurd mei in haadletter begjinne, om sa bygelyks de tekst mear lêsber te meitsjen
+      user:
+        chosen_languages: Allinnich berjochten yn de selektearre talen wurde op de iepenbiere tiidline toand
+        role: De rol bepaalt hokker rjochten in brûker hat
+      user_role:
+        color: Kleur dy’t brûkt wurdt foar de rol yn de UI, as RGB yn heksadesimaal formaat
+        highlighted: Dit makket de rol iepenbier sichtber
+        name: Iepenbiere namme fan de rol, wannear de rol as badge op profylsiden toand wurdt
+        permissions_as_keys: Brûkers mei dizze rol hawwe tagong ta…
+        position: In hegere rol beslist yn bepaalde situaasjes oer it oplossen fan konflikten. Bepaalde aksjes kinne allinnich útfierd wurde op rollen mei in legere prioriteit
+      webhook:
+        events: Selektearje de te ferstjoeren eveneminten
+        url: Wêr’t eveneminten nei ta stjoerd wurde
     labels:
+      account:
+        fields:
+          name: Label
+          value: Ynhâld
+      account_alias:
+        acct: Mastodonadres fan it âlde account
+      account_migration:
+        acct: Mastodonadres fan it nije account
+      account_warning_preset:
+        text: Tekst fan preset
+        title: Titel
+      admin_account_action:
+        include_statuses: Rapportearre berjochten oan it e-mailberjocht tafoegje
+        send_email_notification: Meld dit per e-mailberjocht oan de brûker
+        text: Oanpaste warskôging
+        type: Aksje
+        types:
+          disable: Befrieze
+          none: Warskôging stjoere
+          sensitive: Gefoelich
+          silence: Beheine
+          suspend: Utstelle en definityf accountgegevens fuortsmite
+        warning_preset_id: Brûk in foarynstelling fan in warskôging
+      announcement:
+        all_day: De hiele dei troch
+        ends_at: Einiget
+        scheduled_at: Meidieling ynplanne
+        starts_at: Begjint
+        text: Oankundiging
+      appeal:
+        text: Lis út wêrom dizze beslissing neffens jo weromdraaid wurde moat
+      defaults:
+        autofollow: Utnûgje om jo account te folgjen
+        avatar: Profylfoto
+        bot: Dit is in bot-account
+        chosen_languages: Talen filterje
+        confirm_new_password: Nij wachtwurd befêstigje
+        confirm_password: Wachtwurd befêstigje
+        context: Filterlokaasjes
+        current_password: Aktueel wachtwurd
+        data: Gegevens
+        discoverable: Dizze account oanrekommandearje litte en yn de brûkersgids toane
+        display_name: Werjeftenamme
+        email: E-mailadres
+        expires_in: Ferrint nei
+        fields: Profylmetadata
+        header: Omslachfoto
+        honeypot: "%{label} (net ynfolje)"
+        inbox_url: Relais-ynboks-URL
+        irreversible: Fuortsmite yn stee fan ferstopje
+        locale: Taal fan de brûkersomjouwing
+        locked: Folchfersyk fereaskje
+        max_uses: Maksimaal tal kear te brûken
+        new_password: Nije wachtwurd
+        note: Bio
+        otp_attempt: Twa-stapstagangskoade
+        password: Wachtwurd
+        phrase: Trefwurd of sindiel
+        setting_advanced_layout: Avansearre webomjouwing ynskeakelje
+        setting_aggregate_reblogs: Boosts yn tiidlinen groepearje
+        setting_always_send_emails: Altyd e-mailmeldingen ferstjoere
+        setting_auto_play_gif: Spylje animearre GIF’s automatysk ôf
+        setting_boost_modal: Freegje foar it boosten fan in berjocht in befêstiging
+        setting_crop_images: Ofbyldingen bysnije oant 16x9 yn berjochten op tiidlinen
+        setting_default_language: Taal fan jo berjochten
+        setting_default_privacy: Sichtberheid fan nije berjochten
+        setting_default_sensitive: Media altyd as gefoelich markearje
+        setting_delete_modal: Freegje foar it fuortsmiten fan in berjocht in befêstiging
+        setting_disable_swiping: Feibewegingen útskeakelje
+        setting_display_media: Mediawerjefte
+        setting_display_media_default: Standert
+        setting_display_media_hide_all: Alles ferstopje
+        setting_display_media_show_all: Alles toane
+        setting_expand_spoilers: Berjochten mei ynhâldswarskôgingen altyd útklappe
+        setting_hide_network: Jo folgers en wa’t jo folget ferstopje
+        setting_noindex: Jo berjochten net troch sykmasinen yndeksearje litte
+        setting_reduce_motion: Stadigere animaasjes
+        setting_show_application: Tapassing dy’t jo foar it ferstjoeren fan berjochten brûke toane
+        setting_system_font_ui: Standertlettertype fan jo systeem brûke
+        setting_theme: Websitetema
+        setting_trends: Trends fan hjoed toane
+        setting_unfollow_modal: Freegje foar it ûntfolgjen fan ien in befêstiging
+        setting_use_blurhash: Dizige kleuroergongen foar ferstoppe media toane
+        setting_use_pending_items: Stadige modus
+        severity: Swierte
+        sign_in_token_attempt: Befeiligingskoade
+        title: Titel
+        type: Ymporttype
+        username: Brûkersnamme
+        username_or_email: Brûkersnamme of e-mailadres
+        whole_word: Hiel wurd
+      email_domain_block:
+        with_dns_records: MX-records en IP-adressen fan it domein tafoegje
+      featured_tag:
+        name: Hashtag
+      filters:
+        actions:
+          hide: Folslein ferstopje
+          warn: Mei in warskôging ferstopje
+      form_admin_settings:
+        backups_retention_period: Bewartermyn brûkersargyf
+        bootstrap_timeline_accounts: Accounts dy’t altyd oan nije brûkers oanrekommandearre wurde
+        closed_registrations_message: Oanpast berjocht wannear registraasje útskeakele is
+        content_cache_retention_period: Bewartermyn berjochtebuffer
+        custom_css: Oanpaste CSS
+        mascot: Oanpaste maskotte (legacy)
+        media_cache_retention_period: Bewartermyn mediabuffer
+        profile_directory: Brûkersgids ynskeakelje
+        registrations_mode: Wa kin harren registrearje
+        require_invite_text: Opjaan fan in reden is ferplicht
+        show_domain_blocks: Domeinblokkaden toane
+        show_domain_blocks_rationale: Redenen foar domeinblokkaden toane
+        site_contact_email: E-mailadres kontaktpersoan
+        site_contact_username: Brûkersnamme kontaktpersoan
+        site_extended_description: Wiidweidige omskriuwing
+        site_short_description: Serveromskriuwing
+        site_terms: Privacybelied
+        site_title: Servernamme
+        theme: Standerttema
+        thumbnail: Serverthumbnail
+        timeline_preview: Tagong ta de iepenbiere tiidlinen sûnder oan te melden tastean
+        trendable_by_default: Trends goedkarre sûnder yn it foar geande beoardieling
+        trends: Trends ynskeakelje
+      interactions:
+        must_be_follower: Meldingen fan minsken dy’t jo net folgje blokkearje
+        must_be_following: Meldingen fan minsken dy’t jo net folgje blokkearje
+        must_be_following_dm: Direkte berjochten fan minsken dy’t jo net folgje blokkearje
+      invite:
+        comment: Opmerking
+      invite_request:
+        text: Wêrom wolle jo jo hjir registrearje?
+      ip_block:
+        comment: Opmerking
+        ip: IP-adres
+        severities:
+          no_access: Tagong blokkearje
+          sign_up_block: Registraasjes blokkearje
+          sign_up_requires_approval: Registraasjes beheine
+        severity: Regel
       notification_emails:
+        appeal: Ien hat beswier yntsjinne tsjin in beslissing fan in moderator
+        digest: Periodyk e-mailberjochten mei in gearfetting ferstjoere
+        favourite: Wannear ien jo berjocht as favoryt markearret
+        follow: Wannear ien begûn is jo te folgjen
+        follow_request: Wannear ien jo folgje wol
         mention: Ien hat jo fermeld
+        pending_account: Wannear in nij account beoardiele wurde moat
+        reblog: Wannear ien jo berjocht boost hat
+        report: Nije rapportaazje yntsjinne is
+        trending_tag: Nije trend beoardieling fereasket
+      rule:
+        text: Regel
+      tag:
+        listable: Tastean dat dizze hashtag yn sykopdrachten en oanrekommandaasjes te sjen is
+        name: Hashtag
+        trendable: Goedkarre dat dizze hashtag ûnder trends te sjen is
+        usable: Tastean dat dizze hashtag yn berjochten brûkt wurde mei
+      user:
+        role: Rol
+      user_role:
+        color: Badgekleur
+        highlighted: Rol as badge op profylsiden toane
+        name: Namme
+        permissions_as_keys: Tastimmingen
+        position: Prioriteit
+      webhook:
+        events: Ynskeakele eveneminten
+        url: Einpunt-URL
+    'no': Nee
+    not_recommended: Net oanrekommandearre
+    recommended: Oanrekommandearre
+    required:
+      mark: "*"
+      text: fereaske
+    title:
+      sessions:
+        webauthn: Brûk ien fan jo befeiligingskaaien om oan te melden
+    'yes': Ja
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index dfae386bc..714275ab5 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -191,7 +191,7 @@ gl:
         setting_aggregate_reblogs: Agrupar promocións nas cronoloxías
         setting_always_send_emails: Enviar sempre notificacións por correo electrónico
         setting_auto_play_gif: Reprodución automática de GIFs animados
-        setting_boost_modal: Pedir confirmación antes de promocionar
+        setting_boost_modal: Solicitar confirmación antes de promover
         setting_crop_images: Recortar imaxes a 16x9 en publicacións non despregadas
         setting_default_language: Idioma de publicación
         setting_default_privacy: Privacidade da publicación
diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml
index 03dda3382..a9c94717d 100644
--- a/config/locales/simple_form.is.yml
+++ b/config/locales/simple_form.is.yml
@@ -203,7 +203,7 @@ is:
         setting_display_media_hide_all: Fela allt
         setting_display_media_show_all: Birta allt
         setting_expand_spoilers: Alltaf útfella færslur sem eru með aðvörun vegna efnisins
-        setting_hide_network: Fela netkerfið þitt
+        setting_hide_network: Fela félagsnetið þitt
         setting_noindex: Afþakka atriðaskráningu í leitarvélum
         setting_reduce_motion: Minnka hreyfingu í hreyfimyndum
         setting_show_application: Upplýsa um forrit sem er til að senda færslur
diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml
index d67a21209..aaef8cf55 100644
--- a/config/locales/simple_form.ku.yml
+++ b/config/locales/simple_form.ku.yml
@@ -25,7 +25,7 @@ ku:
         all_day: Dema were nîşankirin, tenê dîrokên navbera demê dê werin nîşan kirin
         ends_at: Bi dilê xwe ye. Daxuyanî di vê demê de bi xweberî ji weşanê de rabe
         scheduled_at: Vala bihêle ku yekcar daxûyanî were weşandin
-        starts_at: Bi dilê xwe ye. Heke daxûyanî ya te di demeke diyar ve girêdayî be
+        starts_at: Vebijêrkî ye. Ku daxûyanî ya te di demeke diyar ve girêdayî be
         text: Tu dikarî hevoksaziya şandiyê bi kar bînî. Ji kerema xwe bila haya te ji cihê ku ev daxuyanî li ser dîmenderê bikarhêner bigire hebe
       appeal:
         text: Tu dikarî tenê carekê îtîraza binpêkirinê bikî
@@ -84,7 +84,7 @@ ku:
         mascot: Îlustrasyona navrûyê webê yê pêşketî bêbandor dike.
         media_cache_retention_period: Pelên medyayê yên daxistî wê piştî çend rojên diyarkirî dema ku li ser nirxek erênî were danîn werin jêbirin, û li gorî daxwazê ​​ji nû ve werin daxistin.
         profile_directory: Pelrêça profîlê hemû bikarhênerên keşfbûnê hilbijartine lîste dike.
-        require_invite_text: Heke ji bo qeydkirinê pejirandina bi destan hewce bike, Nivîsa "Hûn çima dixwazin tevlê bibin?" li şûna vebijarkî bike mecbûrî
+        require_invite_text: Gava ku tomarkirin pêdiviya pejirandina destan dike, Têketina nivîsê "Tu çima dixwazî beşdar bibî?" Bike sereke ji devla vebijêrkî
         site_contact_email: Mirov dikarin ji bo pirsên qanûnî yan jî yên piştgiriyê çawa xwe digihînin te.
         site_contact_username: Mirov dikarin li ser Mastodonê xwe çawa xwe bigihînin te.
         site_extended_description: Her zanyariyek daxwazî dibe ku bibe alîkar bo mêvan û bikarhêneran re. Û dikarin bi hevoksaziya Markdown re werin sazkirin.
@@ -115,9 +115,9 @@ ku:
         text: Ji bo bikarhênerên li ser vê rajekarê rêzikek an jî pêdivîyê pênase bike. Hewl bide ku rêzikê kin û xwerû bigire
       sessions:
         otp: 'Koda du-gavî a telefona xwe têkevê an jî yek ji wan kodên xilaskirinê têkevê:'
-        webauthn: Heke kilîta USB-yê be, jê ewle be ku wê têxinê û heke pêdivî be, pê li wê bike.
+        webauthn: Ku kilîta USB be, jê ewle be ku wê têxî û ku pêdivî be, pê li wê bike.
       tag:
-        name: Tîpan, mînak ji bo ku bêhtir paknivîs bibe, tenê rewşa tîpên girdek/hûrdek dikarî biguherînî
+        name: Tu dikarî tenê mezinahiya tîpan biguherînî bo mînak, da ku ew bêtir were xwendin
       user:
         chosen_languages: Dema were nîşankirin, tenê parvekirinên bi zimanên hilbijartî dê di rêzikên giştî de werin nîşandan
         role: Rola kîjan mafdayînên bikarhêner heye kontrol dike
diff --git a/config/locales/simple_form.la.yml b/config/locales/simple_form.la.yml
new file mode 100644
index 000000000..3a7ba0d44
--- /dev/null
+++ b/config/locales/simple_form.la.yml
@@ -0,0 +1 @@
+la:
diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml
index dd0dda314..57762f821 100644
--- a/config/locales/simple_form.lv.yml
+++ b/config/locales/simple_form.lv.yml
@@ -48,12 +48,12 @@ lv:
         password: Izmanto vismaz 8 rakstzīmes
         phrase: Tiks saskaņots neatkarīgi no ziņas teksta reģistra vai satura brīdinājuma
         scopes: Kuriem API lietojumprogrammai būs atļauta piekļuve. Ja izvēlies augstākā līmeņa tvērumu, tev nav jāatlasa atsevišķi vienumi.
-        setting_aggregate_reblogs: Nerādīt jaunus pastiprinājumus ierakstiem, kas nesen tikuši pastiprināti (ietekmēs tikai turpmāk saņemtos pastiprinājumus)
+        setting_aggregate_reblogs: Nerādīt jaunus izcēlumus ziņām, kas nesen tika palielinātas (ietekmē tikai nesen saņemtos palielinājumus)
         setting_always_send_emails: Parasti e-pasta paziņojumi netiek sūtīti, kad aktīvi izmantojat Mastodon
-        setting_default_sensitive: Sensitīvi mediji pēc noklusējuma ir paslēpti, un tos var atklāt, noklikšķinot
-        setting_display_media_default: Paslēpt mediju, kas atzīmēts kā sensitīvs
-        setting_display_media_hide_all: Vienmēr slēpt medijus
-        setting_display_media_show_all: Vienmēr rādīt medijus
+        setting_default_sensitive: Sensitīva multivide pēc noklusējuma ir paslēpti, un tos var atklāt, noklikšķinot
+        setting_display_media_default: Paslēpt multividi, kas atzīmēta kā sensitīva
+        setting_display_media_hide_all: Vienmēr slēpt multividi
+        setting_display_media_show_all: Vienmēr rādīt multividi
         setting_hide_network: Tavā profilā netiks rādīts, kam tu seko un kurš seko tev
         setting_noindex: Ietekmē tavu publisko profilu un ziņu lapas
         setting_show_application: Lietojumprogramma, ko tu izmanto publicēšanai, tiks parādīta tavu ziņu detalizētajā skatā
@@ -188,17 +188,17 @@ lv:
         password: Parole
         phrase: Atslēgvārds vai frāze
         setting_advanced_layout: Iespējot paplašināto tīmekļa saskarni
-        setting_aggregate_reblogs: Grupēt pastiprinājumus ierakstu lentās
+        setting_aggregate_reblogs: Grupēt izcēlumus ierakstu lentās
         setting_always_send_emails: Vienmēr sūtīt e-pasta paziņojumus
         setting_auto_play_gif: Automātiski atskaņot animētos GIF
-        setting_boost_modal: Rādīt apstiprinājuma dialogu pirms pastiprināšanas
+        setting_boost_modal: Rādīt apstiprinājuma dialogu pirms izcelšanas
         setting_crop_images: Apgrieziet attēlus neizvērstajās ziņās līdz 16x9
         setting_default_language: Publicēšanas valoda
         setting_default_privacy: Publicēšanas privātums
-        setting_default_sensitive: Atļaut atzīmēt medijus kā sensitīvus
+        setting_default_sensitive: Atļaut atzīmēt multividi kā sensitīvu
         setting_delete_modal: Parādīt apstiprinājuma dialogu pirms ziņas dzēšanas
         setting_disable_swiping: Atspējot vilkšanas kustības
-        setting_display_media: Mediju rādīšana
+        setting_display_media: Multivides rādīšana
         setting_display_media_default: Noklusējums
         setting_display_media_hide_all: Paslēpt visu
         setting_display_media_show_all: Parādīt visu
@@ -211,7 +211,7 @@ lv:
         setting_theme: Vietnes motīvs
         setting_trends: Parādīt šodienas tendences
         setting_unfollow_modal: Parādīt apstiprinājuma dialogu pirms pārtraukt kādam sekot
-        setting_use_blurhash: Rādīt krāsainos gradientus slēptajiem medijiem
+        setting_use_blurhash: Rādīt krāsainus gradientus slēptajiem multivides materiāliem
         setting_use_pending_items: Lēnais režīms
         severity: Smagums
         sign_in_token_attempt: Drošības kods
@@ -276,7 +276,7 @@ lv:
         follow_request: Kāds vēlas tev sekot
         mention: Kāds pieminēja tevi
         pending_account: Jāpārskata jaunu kontu
-        reblog: Kāds pastiprināja tavu ierakstu
+        reblog: Kāds izcēla tavu ierakstu
         report: Tika iesniegts jauns ziņojums
         trending_tag: Jaunā tendence ir jāpārskata
       rule:
diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml
index 42ef3f818..7f1d28230 100644
--- a/config/locales/simple_form.no.yml
+++ b/config/locales/simple_form.no.yml
@@ -113,6 +113,15 @@
         name: Du kan bare forandre bruken av store/små bokstaver, f.eks. for å gjøre det mer lesbart
       user:
         chosen_languages: Hvis noen av dem er valgt, vil kun innlegg i de valgte språkene bli vist i de offentlige tidslinjene
+      user_role:
+        color: Farge som skal brukes for rollen gjennom hele UI, som RGB i hex-format
+        highlighted: Dette gjør rollen offentlig synlig
+        name: Offentlig navn på rollen hvis rollen skal vises som et merke
+        permissions_as_keys: Brukere med denne rollen vil ha tilgang til...
+        position: Høyere rolle bestemmer konfliktløsning i visse situasjoner. Enkelte tiltak kan bare utføres på roller med lavere prioritet
+      webhook:
+        events: Velg hendelser som skal sendes
+        url: Hvor hendelser vil bli sendt til
     labels:
       account:
         fields:
@@ -143,6 +152,8 @@
         scheduled_at: Planlegg publisering
         starts_at: Begynnelse av hendelsen
         text: Kunngjøring
+      appeal:
+        text: Forklar hvorfor denne beslutningen bør gjøres om
       defaults:
         autofollow: Inviter til å følge kontoen din
         avatar: Profilbilde
@@ -172,6 +183,7 @@
         phrase: Nøkkelord eller frase
         setting_advanced_layout: Skru på det avanserte nettgrensesnittet
         setting_aggregate_reblogs: Gruppefremhevinger i tidslinjer
+        setting_always_send_emails: Alltid send e-postvarslinger
         setting_auto_play_gif: Autoavspill animert GIF-filer
         setting_boost_modal: Vis bekreftelse før fremheving
         setting_crop_images: Klipp bilder i ikke-utvidede innlegg til 16:9
@@ -197,6 +209,7 @@
         setting_use_pending_items: Saktemodus
         severity: Alvorlighetsgrad
         sign_in_token_attempt: Sikkerhetskode
+        title: Tittel
         type: Importeringstype
         username: Brukernavn
         username_or_email: Brukernavn eller E-post
@@ -205,12 +218,32 @@
         with_dns_records: Inkluder MX-poster og IP-adresser for domenet
       featured_tag:
         name: Emneknagg
+      filters:
+        actions:
+          hide: Skjul fullstendig
+          warn: Skjul med en advarsel
       form_admin_settings:
+        backups_retention_period: Brukers oppbevaringsperiode for arkiv
+        bootstrap_timeline_accounts: Anbefaler alltid disse kontoene til nye brukere
+        closed_registrations_message: Egendefinert melding når registrering ikke er tilgjengelig
+        content_cache_retention_period: Oppbevaringsperiode for innholdsbuffer
+        custom_css: Egendefinert CSS
+        media_cache_retention_period: Oppbevaringsperiode for mediebuffer
         profile_directory: Aktiver profilkatalog
         registrations_mode: Hvem kan opprette konto
+        require_invite_text: Krev en grunn for å bli med
+        show_domain_blocks: Vis domeneblokker
         show_domain_blocks_rationale: Vis grunnen til at domener ble blokkert
         site_contact_email: E-postadresse for kontakt
+        site_contact_username: Kontakt brukernavn
+        site_extended_description: Utvidet beskrivelse
+        site_short_description: Beskrivelse av server
+        site_terms: Retningslinjer for personvern
         site_title: Servernavn
+        theme: Standard tema
+        thumbnail: Miniatyrbilde til server
+        trendable_by_default: Tillat trender uten foregående vurdering
+        trends: Aktiver trender
       interactions:
         must_be_follower: Blokker varslinger fra ikke-følgere
         must_be_following: Blokker varslinger fra personer du ikke følger
@@ -224,9 +257,11 @@
         ip: IP
         severities:
           no_access: Blokker tilgang
+          sign_up_block: Blokker registrering
           sign_up_requires_approval: Begrens påmeldinger
         severity: Oppføring
       notification_emails:
+        appeal: Noen klager på en moderator sin avgjørelse
         digest: Send sammendrag på e-post
         favourite: Send e-post når noen setter din status som favoritt
         follow: Send e-post når noen følger deg
@@ -234,6 +269,8 @@
         mention: Send e-post når noen nevner deg
         pending_account: Ny bruker avventer gjennomgang
         reblog: Send e-post når noen fremhever din status
+        report: Ny rapport er sendt
+        trending_tag: Ny trend krever gjennomgang
       rule:
         text: Regler
       tag:
@@ -244,9 +281,13 @@
       user:
         role: Rolle
       user_role:
+        color: Merkefarge
+        highlighted: Vis rolle som merke på brukerprofiler
         name: Navn
         permissions_as_keys: Tillatelser
         position: Prioritet
+      webhook:
+        events: Aktiverte hendelser
     'no': Nei
     required:
       mark: "*"
diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml
index 6f674d83b..e86272e4a 100644
--- a/config/locales/simple_form.pt-PT.yml
+++ b/config/locales/simple_form.pt-PT.yml
@@ -7,7 +7,7 @@ pt-PT:
       account_migration:
         acct: Especifique o utilizador@domínio da conta para onde você deseja migrar
       account_warning_preset:
-        text: Tu podes usar sintaxe de escrita, como URLs, hashtags e referências
+        text: Pode usar sintaxe de escrita, como URL, etiquetas, e referências
         title: Opcional. Não visível para o destinatário
       admin_account_action:
         include_statuses: O utilizador verá quais toots causaram a ação de moderação ou aviso
@@ -67,7 +67,7 @@ pt-PT:
         domain: Este pode ser o nome de domínio que aparece no endereço de e-mail ou o registo MX por ele utilizado. Eles serão verificados aquando da inscrição.
         with_dns_records: Será feita uma tentativa de resolver os registos DNS do domínio em questão e os resultados também serão colocados na lista negra
       featured_tag:
-        name: 'Aqui estão algumas das hashtags que utilizou recentemente:'
+        name: 'Eis algumas das etiquetas que utilizou recentemente:'
       filters:
         action: Escolha qual a ação a executar quando uma publicação corresponde ao filtro
         actions:
@@ -93,7 +93,7 @@ pt-PT:
         thumbnail: Uma imagem de aproximadamente 2:1, exibida ao lado da informação do seu servidor.
         timeline_preview: Os visitantes sem sessão iniciada poderão consultar as publicações públicas mais recentes disponíveis no servidor.
         trendable_by_default: Ignorar a revisão manual do conteúdo das tendências. Itens individuais ainda poderão ser removidos das tendências após a sua exibição.
-        trends: As tendências mostram quais as publicações, hashtags e notícias estão a ganhar destaque no seu servidor.
+        trends: As tendências mostram quais as publicações, etiquetas e notícias que estão a ganhar destaque no seu servidor.
       form_challenge:
         current_password: Está a entrar numa área restrita
       imports:
@@ -179,7 +179,7 @@ pt-PT:
         honeypot: "%{label} (não preencher)"
         inbox_url: URL da caixa de entrada do repetidor
         irreversible: Expandir em vez de esconder
-        locale: Idioma
+        locale: Língua da interface
         locked: Trancar conta
         max_uses: Número máximo de utilizações
         new_password: Nova palavra-passe
@@ -223,7 +223,7 @@ pt-PT:
       email_domain_block:
         with_dns_records: Incluir registos MX e IPs do domínio
       featured_tag:
-        name: Hashtag
+        name: Etiqueta
       filters:
         actions:
           hide: Ocultar por completo
@@ -282,10 +282,10 @@ pt-PT:
       rule:
         text: Regra
       tag:
-        listable: Permitir que esta hashtag apareça em pesquisas e no diretório de perfis
-        name: Hashtag
-        trendable: Permitir que esta hashtag apareça em destaque
-        usable: Permitir que toots utilizem esta hashtag
+        listable: Permitir que esta etiqueta apareça em pesquisas e no diretório de perfis
+        name: Etiqueta
+        trendable: Permitir que esta etiqueta apareça em destaque
+        usable: Permitir as publicações usem esta etiqueta
       user:
         role: Função
       user_role:
diff --git a/config/locales/simple_form.sr-Latn.yml b/config/locales/simple_form.sr-Latn.yml
index 66efa3db8..069d30b6d 100644
--- a/config/locales/simple_form.sr-Latn.yml
+++ b/config/locales/simple_form.sr-Latn.yml
@@ -2,58 +2,308 @@
 sr-Latn:
   simple_form:
     hints:
+      account_alias:
+        acct: Navedi korisničko_ime@domen naloga sa kojeg želiš da pređeš
+      account_migration:
+        acct: Navedi korisničko_ime@domen naloga na koji želiš da pređeš
+      account_warning_preset:
+        text: Možete koristiti sintaksu truba, kao što su npr. URL-ova, tarabe i pominjanja
+        title: Opciono. Nije vidljivo primaocu
+      admin_account_action:
+        include_statuses: Korisnik će videti koje su objave prouzrokovale moderiranje ili upozorenje
+        send_email_notification: Korisnik će dobiti objašnjenje toga šta mu se desilo sa naloga
+        text_html: Opcionalno. Možete koristiti sintaksu truba. Možete <a href="%{path}">dodati upozoravajuća prepodešavanje</a> da sačuvate vreme
+        type_html: Izaberite šta da radite sa <strong>%{acct}</strong>
+        types:
+          disable: Spreči korisnika da koristi svoj nalog, ali nemoj brisati ili sakrivati njegov sadržaj.
+          none: Koristi ovo da pošalješ upozorenje korisniku, bez pokretanja bilo koje druge akcije.
+          sensitive: Učini da svi medijski prilozi ovog korisnika prisilno budu označeni kao osetljivi.
+          silence: Onemogući korisnika da objavljuje javno, sakrij sve njegove svoje objave i obaveštenja od korisnika koji ga ne prate.
+          suspend: Spreči bilo kakvu interakciju sa ovog naloga ili sa njim i izbriši njegov sadržaj. Može da se opozove u roku od 30 dana.
+        warning_preset_id: Opcionalno. Možete i dalje dodati prilagođeni tekst na kraj preseta
+      announcement:
+        all_day: Biće prikazani samo datumi vremenskog opsega koji su označeni
+        ends_at: Opciono. Objava će biti automatski opozvana u ovom trenutku
+        scheduled_at: Ostavi prazno da bi najava bila odmah objavljena
+        starts_at: Opciono. U slučaju da je najava vezana za određeni vremenski raspon
+        text: Možeš koristiti post sintaksu. Vodi računa o prostoru koji će objava zauzimati na ekranu korisnika
+      appeal:
+        text: Na brisanje se možeš žaliti samo jednom
       defaults:
+        autofollow: Osobe koje se prijave kroz pozivnice će vas automatski zapratiti
         avatar: PNG, GIF ili JPG. Najviše %{size}. Biće smanjena na %{dimensions}px
+        bot: Ovaj nalog uglavnom vrši automatizovane radnje i možda se ne nadgleda
+        context: Jedan ili više konteksta u kojima treba da se primeni filter
+        current_password: Unesi lozinku tekućeg naloga iz bezbednosnih razloga
+        current_username: Unesi korisničko ime tekućeg naloga za potvrdu
         digest: Poslato posle dužeg perioda neaktivnosti sa pregledom svih bitnih stvari koje ste dobili dok ste bili odsutni
+        discoverable: Dozvoli nepoznatim korisnicima da otkriju tvoj nalog putem preporuka, trendova i drugih funkcija
+        email: Biće vam poslata e-pošta sa potvrdom
+        fields: Možete imati do 4 stavke prikazane kao tabela na vašem nalogu
         header: PNG, GIF ili JPG. Najviše %{size}. Biće smanjena na %{dimensions}px
+        inbox_url: Kopirajte URL sa naslovne strane releja koji želite koristiti
+        irreversible: Filtrirane trube će nestati nepovratno, čak i ako je filter kasnije uklonjen
+        locale: Jezik korisničkog interfejsa, e-pošte i mobilnih obaveštenja
         locked: Zahteva da pojedinačno odobrite pratioce
-        setting_noindex: Utiče na Vaš javni profil i statusne strane
+        password: Koristite najmanje 8 znakova
+        phrase: Biće uparena bez obzira na veliko ili malo slovo u tekstu ili upozorenja o sadržaju trube
+        scopes: Kojim API-jima će aplikacija dozvoliti pristup. Ako izaberete opseg najvišeg nivoa, ne morate odabrati pojedinačne.
+        setting_aggregate_reblogs: Ne pokazuj nova deljenja za trube koje su nedavno podeljene (utiče samo na nedavno primljena deljenja)
+        setting_always_send_emails: Obaveštenja e-poštom se po pravilu neće slati kada aktivno koristiš Mastodon
+        setting_default_sensitive: Osetljivi mediji su podrazumevano skriveni i mogu se otkriti klikom
+        setting_display_media_default: Sakrij medije označene kao osetljive
+        setting_display_media_hide_all: Uvek sakrij sve medije
+        setting_display_media_show_all: Uvek prikaži medije označene kao osetljive
+        setting_hide_network: Koga pratite i ko vas prati neće biti prikazano na vašem nalogu
+        setting_noindex: Utiče na Vaš javni nalog i statusne strane
+        setting_show_application: Aplikacija koju koristiš za objavljivanje biće prikazana u detaljnom prikazu tvojih objava
+        setting_use_blurhash: Gradijent se zasniva na bojama skrivenih vizuelnih prikaza, ali prikriva sve detalje
+        setting_use_pending_items: Sakrij ažuriranja vremenske ose iza klika umesto automatskog pomeranja izvora objava
+        username: Vaš nadimak će biti jedinstven na %{domain}
+        whole_word: Kada je ključna reč ili fraza isključivo alfanumerička, biće primenjena samo ako se podudara sa celom reči
+      domain_allow:
+        domain: Ovaj domen će moći da preuzima podatke sa ovog servera i dolazni podaci sa njega će se obrađivati i čuvati
+      email_domain_block:
+        domain: Ovo može biti ime domena koje se pojavljuje u adresi e-pošte ili MX zapisa koji koristi. Oni će biti provereni prilikom registracije.
+        with_dns_records: Biće učinjen pokušaj da se razreše DNS zapisi datog domena i rezultati će takođe biti blokirani
+      featured_tag:
+        name: 'Evo nekih od heš oznaka koje ste nedavno koristili:'
+      filters:
+        action: Izaberi koju radnju treba izvršiti kada objava odgovara filteru
+        actions:
+          hide: Potpuno sakrij filtrirani sadržaj, ponašajući se kao da ne postoji
+          warn: Sakrij filtrirani sadržaj iza upozorenja u kome se navodi naziv filtera
+      form_admin_settings:
+        backups_retention_period: Čuvaj generisane korisničke arhive navedeni broj dana.
+        bootstrap_timeline_accounts: Ovi nalozi će biti zakačeni na vrh preporuka za praćenje novih korisnika.
+        closed_registrations_message: Prikazuje se kada su prijave zatvorene
+        content_cache_retention_period: Kada se postavi na pozitivnu vrednost, objave sa drugih servera će biti izbrisane nakon navedenog broja dana. Ovo može biti nepovratno.
+        custom_css: Možeš da primeniš prilagođene stilove na veb verziji Mastodona.
+        mascot: Zamenjuje ilustraciju u naprednom veb interfejsu.
+        media_cache_retention_period: Kada se postavi na pozitivnu vrednost, preuzete medijske datoteke će biti izbrisane nakon navedenog broja dana, i ponovo preuzete na zahtev.
+        profile_directory: Direktorijum profila navodi sve korisnike koji su se opredelili da budu vidljivi.
+        require_invite_text: Kada registracije zahtevaju ručno odobrenje, postavi da unos teksta „Zašto želiš da se pridružiš?“ bude obavezan, a ne opcioni
+        site_contact_email: Kako korisnici mogu da te kontaktiraju za pravna pitanja ili pitanja u vezi podrške.
+        site_contact_username: Kako korisnici mogu da te kontaktiraju na Mastodonu.
+        site_extended_description: Bilo koja dodatna informacija koja može biti korisne posetiocima i tvojim korisnicima. Može se strukturirati pomoću Markdown sintakse.
+        site_short_description: Kratak opis pomoću koga se na jedinstven način identifikuje tvoj server. Ko ga održava, kome je namenjen?
+        site_terms: Koristi sopstvenu politiku privatnosti ili ostavi prazno da bi se koristila podrazumevana. Može se strukturirati pomoću Markdown sintakse.
+        site_title: Način na moji može da se pozove na tvoj server osim naziva njegovog domena.
+        theme: Tema koju vide posetioci koji nisu prijavljeni i novi korisnici.
+        thumbnail: Slika koja se približno 2:1 prikazuje pored informacija o tvom serveru.
+        timeline_preview: Posetioci koji nisu prijavljeni će moći da pregledaju najnovije javne objave dostupne na serveru.
+        trendable_by_default: Preskoči ručni pregled sadržaja koji je u trendu. Pojedinačne stavke se nakon toga i dalje mogu ukloniti iz trendova.
+        trends: Trendovi pokazuju koje objave, heš oznake i vesti postaju sve popularniji na tvom serveru.
+      form_challenge:
+        current_password: Ulaziš u bezbedno područje
       imports:
         data: CSV fajl izvezen sa druge Mastodont instance
+      invite_request:
+        text: Ovo će nam pomoći da pregledamo tvoju prijavu
+      ip_block:
+        comment: Opciono. Zapamti zašto si dodao ovo pravilo.
+        expires_in: IP adrese su ograničeni resurs, ponekad se dele i često menjaju korisnika. Zbog toga se IP blokovi na neograničeno vreme ne preporučuju.
+        ip: Unesi IPv4 ili IPv6 adresu. Možeš blokirati čitave opsege koristeći CIDR sintaksu. Vodi računa da sebe ne zaključaš!
+        severities:
+          no_access: Blokiraj pristup svim resursima
+          sign_up_block: Nove prijave neće biti moguće
+          sign_up_requires_approval: Nove prijave će zahtevati tvoje odobrenje
+        severity: Izaberi šta će se desiti sa zahtevima sa ove IP adrese
+      rule:
+        text: Opiši pravilo ili zahtev za korisnike na ovom serveru. Potrudi se da opis bude kratak i jednostavan
       sessions:
         otp: 'Unesite dvofaktorski kod sa Vašeg telefona ili koristite jedan od kodova za oporavak:'
+        webauthn: Ako je to USB ključ, obavezno ga ubaci i, ako je potrebno, pritisni ga.
+      tag:
+        name: Mogu se samo promeniti mala slova u velika, na primer, da bi bilo čitljivije
+      user:
+        chosen_languages: Kada označite, trube u izabranim jezicima će se prikazati na javnoj vremenskoj liniji
+        role: Uloga kontroliše koje dozvole korisnik ima
+      user_role:
+        color: Boja koja će se koristiti za ulogu u celom korisničkom interfejsu, kao RGB, u heksadecimalnom formatu
+        highlighted: Ovo čini ulogu javno vidljivom
+        name: Javni naziv uloge, ako je uloga podešena da se prikazuje kao značka
+        permissions_as_keys: Korisnici sa ovom ulogom će imati pristup...
+        position: Viša uloga odlučuje o rešavanju sukoba u određenim situacijama. Određene radnje se mogu izvršiti samo na ulogama sa nižim prioritetom
+      webhook:
+        events: Izaberite događaje za slanje
+        url: Gde će se događaji slati
     labels:
+      account:
+        fields:
+          name: Etiketa
+          value: Sadržaj
+      account_alias:
+        acct: Ručica (@) starog naloga
+      account_migration:
+        acct: Ručica (@) novog naloga
+      account_warning_preset:
+        text: Tekst preseta
+        title: Naslov
+      admin_account_action:
+        include_statuses: Uključi prijavljene objave u e-poštu
+        send_email_notification: Obavesti korisnika preko e-pošte
+        text: Prilagođeno upozorenje
+        type: Radnja
+        types:
+          disable: Onemogući
+          none: Ne radi ništa
+          sensitive: Osetljivo
+          silence: Utišaj
+          suspend: Obustavite i nepovratno izbrišite podatke o nalogu
+        warning_preset_id: Koristi upozoravajući preset
+      announcement:
+        all_day: Celodnevni događaj
+        ends_at: Kraj događaja
+        scheduled_at: Planiraj objavljivanje
+        starts_at: Početak događaja
+        text: Najava
+      appeal:
+        text: Objasni zašto ovu odluku treba poništiti
       defaults:
+        autofollow: Pozovite da prati vaš nalog
+        avatar: Avatar
+        bot: Ovo je nalog bota
+        chosen_languages: Filtriraj jezike
         confirm_new_password: Potvrdite novu lozinku
         confirm_password: Potvrdite lozinku
+        context: Filtriraj kontekste
         current_password: Trenutna lozinka
         data: Podaci
+        discoverable: Navedite ovaj nalog u fascikli
         display_name: Ime za prikaz
         email: Adresa e-pošte
         expires_in: Ističe nakon
+        fields: Metapodaci naloga
         header: Zaglavlje
+        honeypot: "%{label} (ne popunjavaj)"
+        inbox_url: URL od relejnog prijemnog sandučeta
+        irreversible: Ispustiti umesto sakriti
         locale: Jezik
-        locked: Zaključaj nalog
+        locked: Zahtevaj zahteve za praćenje
         max_uses: Maksimalni broj korišćenja
         new_password: Nova lozinka
         note: Biografija
         otp_attempt: Dvofaktorski kod
         password: Lozinka
+        phrase: Ključna reč ili fraza
+        setting_advanced_layout: Omogući napredni veb interfejs
+        setting_aggregate_reblogs: Grupiši deljenja u vremenskim linijama
+        setting_always_send_emails: Uvek šalji obaveštenja e-poštom
         setting_auto_play_gif: Automatski puštaj animirane GIF-ove
         setting_boost_modal: Prikaži dijalog za potvrdu pre davanja podrške
+        setting_crop_images: Izreži slike u neproširenim objavama na 16x9
+        setting_default_language: Jezik objavljivanja
         setting_default_privacy: Privatnost objava
         setting_default_sensitive: Uvek označi multimediju kao osetljivu
         setting_delete_modal: Prikaži dijalog za potvrdu pre brisanja tuta
+        setting_disable_swiping: Onemogući pokrete prevlačenja
+        setting_display_media: Prikaz medija
+        setting_display_media_default: Podrazumevano
+        setting_display_media_hide_all: Sakrij sve
+        setting_display_media_show_all: Prikaži sve
+        setting_expand_spoilers: Uvek prošiti trube koje su označene upozorenjem sadržaja
+        setting_hide_network: Sakrij svoju mrežu
         setting_noindex: Odjavi se od indeksiranja search engine-a
         setting_reduce_motion: Smanji pokrete u animacijama
+        setting_show_application: Otkrij aplikaciju koja se koristi za slanje postova
         setting_system_font_ui: Koristi sistemski font
         setting_theme: Tema sajta
+        setting_trends: Prikaži današnje trendove
         setting_unfollow_modal: Prikaži dijalog za potvrdu pre nego što otpratite nekoga
+        setting_use_blurhash: Prikaži gradijente u boji za skrivene medije
+        setting_use_pending_items: Spori režim
         severity: Oštrina
+        sign_in_token_attempt: Sigurnosni kod
+        title: Naslov
         type: Tip uvoza
         username: Korisničko ime
+        username_or_email: Korisničko ime ili E-pošta
+        whole_word: Cela reč
+      email_domain_block:
+        with_dns_records: Uključite MX zapise i IP adrese domena
+      featured_tag:
+        name: Heš oznaka
+      filters:
+        actions:
+          hide: Sakrij u potpunosti
+          warn: Sakrij uz upozorenje
+      form_admin_settings:
+        backups_retention_period: Period čuvanja korisničke arhive
+        bootstrap_timeline_accounts: Uvek preporuči ove naloge novim korisnicima
+        closed_registrations_message: Prilagođena poruka kada prijave nisu moguće
+        content_cache_retention_period: Period čuvanja keša sadržaja
+        custom_css: Prilagođeni CSS
+        mascot: Prilagođena maskota (nasleđe)
+        media_cache_retention_period: Period čuvanja keša medija
+        profile_directory: Omogući direktorijum profila
+        registrations_mode: Ko može da se prijavi
+        require_invite_text: Zatraži razlog za pristupanje
+        show_domain_blocks: Pprikaži blokove domena
+        show_domain_blocks_rationale: Pokaži zašto su domeni blokirani
+        site_contact_email: E-adresa za kontakt
+        site_contact_username: Korisničko ime za kontakt
+        site_extended_description: Prošireni opis
+        site_short_description: Opis servera
+        site_terms: Politika privatnosti
+        site_title: Ime servera
+        theme: Podrazumevana tema
+        thumbnail: Sličica servera
+        timeline_preview: Dozvoli neautorizovan pristup javnim vremenskim osama
+        trendable_by_default: Dozvoli trendove bez prethodnog pregleda
+        trends: Omogući trendove
       interactions:
         must_be_follower: Blokiraj obaveštenja od korisnika koji me ne prate
         must_be_following: Blokiraj obaveštenja od ljudi koje ne pratim
         must_be_following_dm: Blokiraj direktne poruke od ljudi koje ne pratim
+      invite:
+        comment: Komentar
+      invite_request:
+        text: Zašto želiš da se pridružiš?
+      ip_block:
+        comment: Komentar
+        ip: Avatar
+        severities:
+          no_access: Blokiraj pristup
+          sign_up_block: Blokiraj prijave
+          sign_up_requires_approval: Ograniči prijave
+        severity: Pravilo
       notification_emails:
+        appeal: Neko se žali na odluku moderatora
         digest: Šalji e-poštu sa sažetkom
         favourite: Šalji e-poštu kada neko stavi da mu je Vaš status omiljen
         follow: Šalji e-poštu kada Vas neko zaprati
         follow_request: Šalji e-poštu kada neko zatraži da Vas zaprati
         mention: Šalji e-poštu kada Vas neko pomene
+        pending_account: Novi nalog treba pregledati
         reblog: Šalji e-poštu kada neko podrži Vaš status
+        report: Podneta je nova prijava
+        trending_tag: Novi trend treba pregledati
+      rule:
+        text: Pravilo
+      tag:
+        listable: Dozvoli da se ova heš oznaka pojavljuje u pretragama i predlozima
+        name: Heš oznaka
+        trendable: Dozvoli da se ova heš oznaka pojavi u okviru trendova
+        usable: Dozvoli objavama da koriste ovu heš oznaku
+      user:
+        role: Uloga
+      user_role:
+        color: Boja bedža
+        highlighted: Prikaži ulogu i bedž na profilima korisnika
+        name: Ime
+        permissions_as_keys: Ovlašćenja
+        position: Prioritet
+      webhook:
+        events: Omogućeni događaji
+        url: URL krajnje tačke
     'no': Ne
+    not_recommended: Nije preporučeno
+    recommended: Preporučeno
     required:
+      mark: "*"
       text: obavezno
+    title:
+      sessions:
+        webauthn: Koristi jedan od svojih bezbednosnih ključeva za prijavljivanje
     'yes': Da
diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml
index 7d4f2e0cc..cf590b5f4 100644
--- a/config/locales/simple_form.sr.yml
+++ b/config/locales/simple_form.sr.yml
@@ -58,9 +58,24 @@ sr:
         setting_noindex: Утиче на Ваш јавни налог и статусне стране
         setting_show_application: Апликација коју користиш за објављивање биће приказана у детаљном приказу твојих објава
         setting_use_blurhash: Градијент се заснива на бојама скривених визуелних приказа, али прикрива све детаље
+        setting_use_pending_items: Сакриј ажурирања временске осе иза клика уместо аутоматског померања извора објава
         username: Ваш надимак ће бити јединствен на %{domain}
         whole_word: Када је кључна реч или фраза искључиво алфанумеричка, биће примењена само ако се подудара са целом речи
+      domain_allow:
+        domain: Овај домен ће моћи да преузима податке са овог сервера и долазни подаци са њега ће се обрађивати и чувати
+      email_domain_block:
+        domain: Ово може бити име домена које се појављује у адреси е-поште или MX записа који користи. Они ће бити проверени приликом регистрације.
+        with_dns_records: Биће учињен покушај да се разреше DNS записи датог домена и резултати ће такође бити блокирани
+      featured_tag:
+        name: 'Ево неких од хеш ознака које сте недавно користили:'
+      filters:
+        action: Изабери коју радњу треба извршити када објава одговара филтеру
+        actions:
+          hide: Потпуно сакриј филтрирани садржај, понашајући се као да не постоји
+          warn: Сакриј филтрирани садржај иза упозорења у коме се наводи назив филтера
       form_admin_settings:
+        backups_retention_period: Чувај генерисане корисничке архиве наведени број дана.
+        bootstrap_timeline_accounts: Ови налози ће бити закачени на врх препорука за праћење нових корисника.
         closed_registrations_message: Приказује се када су пријаве затворене
         content_cache_retention_period: Када се постави на позитивну вредност, објаве са других сервера ће бити избрисане након наведеног броја дана. Ово може бити неповратно.
         custom_css: Можеш да примениш прилагођене стилове на веб верзији Мастодона.
@@ -70,8 +85,21 @@ sr:
         require_invite_text: Када регистрације захтевају ручно одобрење, постави да унос текста „Зашто желиш да се придружиш?“ буде обавезан, а не опциони
         site_contact_email: Како корисници могу да те контактирају за правна питања или питања у вези подршке.
         site_contact_username: Како корисници могу да те контактирају на Мастодону.
+        site_extended_description: Било која додатна информација која може бити корисне посетиоцима и твојим корисницима. Може се структурирати помоћу Markdown синтаксе.
+        site_short_description: Кратак опис помоћу кога се на јединствен начин идентификује твој сервер. Ко га одржава, коме је намењен?
+        site_terms: Користи сопствену политику приватности или остави празно да би се користила подразумевана. Може се структурирати помоћу Markdown синтаксе.
+        site_title: Начин на моји може да се позове на твој сервер осим назива његовог домена.
+        theme: Тема коју виде посетиоци који нису пријављени и нови корисници.
+        thumbnail: Слика која се приближно 2:1 приказује поред информација о твом серверу.
+        timeline_preview: Посетиоци који нису пријављени ће моћи да прегледају најновије јавне објаве доступне на серверу.
+        trendable_by_default: Прескочи ручни преглед садржаја који је у тренду. Појединачне ставке се након тога и даље могу уклонити из трендова.
+        trends: Трендови показују које објаве, хеш ознаке и вести постају све популарнији на твом серверу.
+      form_challenge:
+        current_password: Улазиш у безбедно подручје
       imports:
         data: CSV фајл извезен са друге Мастодонт инстанце
+      invite_request:
+        text: Ово ће нам помоћи да прегледамо твоју пријаву
       ip_block:
         comment: Опционо. Запамти зашто си додао ово правило.
         expires_in: IP адресе су ограничени ресурс, понекад се деле и често мењају корисника. Због тога се IP блокови на неограничено време не препоручују.
diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml
index 06771a94b..3d61f78b8 100644
--- a/config/locales/simple_form.th.yml
+++ b/config/locales/simple_form.th.yml
@@ -42,7 +42,7 @@ th:
         fields: คุณสามารถมีได้มากถึง 4 รายการแสดงเป็นตารางในโปรไฟล์ของคุณ
         header: PNG, GIF หรือ JPG สูงสุด %{size} จะถูกย่อขนาดเป็น %{dimensions}px
         inbox_url: คัดลอก URL จากหน้าแรกของรีเลย์ที่คุณต้องการใช้
-        irreversible: โพสต์ที่กรองอยู่จะหายไปอย่างถาวร แม้ว่าจะเอาตัวกรองออกในภายหลัง
+        irreversible: โพสต์ที่กรองอยู่จะหายไปอย่างถาวร แม้ว่าจะเอาตัวกรองออกในภายหลังก็ตาม
         locale: ภาษาของส่วนติดต่อผู้ใช้, อีเมล และการแจ้งเตือนแบบผลัก
         locked: ควบคุมผู้ที่สามารถติดตามคุณด้วยตนเองได้โดยอนุมัติคำขอติดตาม
         password: ใช้อย่างน้อย 8 ตัวอักษร
diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml
index 74ce8e942..6f46dadda 100644
--- a/config/locales/simple_form.uk.yml
+++ b/config/locales/simple_form.uk.yml
@@ -50,8 +50,8 @@ uk:
         scopes: Які API додатку буде дозволено використовувати. Якщо ви виберете самий верхній, нижчестоящі будуть обрані автоматично.
         setting_aggregate_reblogs: Не показувати поширення для дописів, які нещодавно вже були поширені (не вплине на вже отримані поширення)
         setting_always_send_emails: Зазвичай, під час активного користування Mastodon, сповіщення не будуть відправлятися електронною поштою
-        setting_default_sensitive: Дражливі медіа приховані за промовчанням та можуть бути розкрити кліком
-        setting_display_media_default: Ховати медіа, позначені делікатними
+        setting_default_sensitive: Делікатні медіа типово приховані та можуть бути розкриті натисканням
+        setting_display_media_default: Приховувати медіа, позначені як делікатними
         setting_display_media_hide_all: Завжди приховувати медіа
         setting_display_media_show_all: Завжди показувати медіа
         setting_hide_network: У вашому профілі не буде показано підписки та підписників
@@ -188,7 +188,7 @@ uk:
         password: Пароль
         phrase: Ключове слово або фраза
         setting_advanced_layout: Увімкнути розширений вебінтерфейс
-        setting_aggregate_reblogs: Групувати просування в стрічках
+        setting_aggregate_reblogs: Групувати поширення в стрічках
         setting_always_send_emails: Завжди надсилати сповіщення електронною поштою
         setting_auto_play_gif: Автоматично відтворювати анімовані GIF
         setting_boost_modal: Показувати діалог підтвердження під час поширення
@@ -255,7 +255,7 @@ uk:
       interactions:
         must_be_follower: Блокувати сповіщення від непідписаних людей
         must_be_following: Блокувати сповіщення від людей, на яких ви не підписані
-        must_be_following_dm: Заблокувати прямі сповіщення від людей, на яких ви не підписані
+        must_be_following_dm: Блокувати особисті повідомлення від людей, за якими ви не слідкуєте
       invite:
         comment: Коментар
       invite_request:
@@ -282,7 +282,7 @@ uk:
       rule:
         text: Правило
       tag:
-        listable: Дозволити появу цього хештеґа у каталозі профілів
+        listable: Дозволити появу цього хештеґа у каталозі пошуку і пропозицій
         name: Хештеґ
         trendable: Дозволити появу цього хештеґа у списку популярних хештеґів
         usable: Дозволити дописам використовувати цей хештег
diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml
index f2ed1391f..d395112f8 100644
--- a/config/locales/simple_form.vi.yml
+++ b/config/locales/simple_form.vi.yml
@@ -110,7 +110,7 @@ vi:
           sign_up_requires_approval: Bạn sẽ phê duyệt những đăng ký mới từ IP này
         severity: Chọn hành động nếu nhận được yêu cầu từ IP này
       rule:
-        text: Mô tả một quy tắc bắt buộc trên máy chủ này. Nên để ngắn và đơn giản.
+        text: Mô tả một nội quy bắt buộc trên máy chủ này. Nên để ngắn và đơn giản
       sessions:
         otp: 'Nhập mã xác minh 2 bước được tạo bởi ứng dụng điện thoại của bạn hoặc dùng một trong các mã khôi phục của bạn:'
         webauthn: Nếu đây là USB key, hãy cắm vào và thử xoay chiều.
@@ -280,7 +280,7 @@ vi:
         report: Ai đó gửi báo cáo
         trending_tag: Phê duyệt nội dung nổi bật mới
       rule:
-        text: Quy tắc
+        text: Nội quy
       tag:
         listable: Cho phép xuất hiện trong tìm kiếm và đề xuất
         name: Hashtag
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index bbccc5839..e1e2afd4d 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -216,6 +216,7 @@ sk:
         change_email_user_html: "%{name} zmenil/a emailovú adresu užívateľa %{target}"
         confirm_user_html: "%{name} potvrdil/a emailovú adresu používateľa %{target}"
         create_account_warning_html: "%{name} poslal/a upozornenie užívateľovi %{target}"
+      deleted_account: zmazaný účet
       filter_by_action: Filtruj podľa úkonu
       filter_by_user: Trieď podľa užívateľa
       title: Kontrólny záznam
@@ -267,6 +268,7 @@ sk:
       upload: Nahraj
     dashboard:
       active_users: aktívni užívatelia
+      interactions: interakcií
       media_storage: Úložisko médií
       new_users: noví užívatelia
       opened_reports: otvorené hlásenia
@@ -281,6 +283,7 @@ sk:
       add_new: Povolená doména
       created_msg: Doména bola úspešne povolená
       destroyed_msg: Doména bola odstránená zo zoznamu povolených
+      import: Nahraj
       undo: Odober zo zoznamu povolených
     domain_blocks:
       add_new: Blokuj novú doménu
@@ -289,6 +292,8 @@ sk:
       domain: Doména
       edit: Uprav blokovanie domény
       existing_domain_block_html: Pre účet %{name} si už nahodil/a přísnejšie obmedzenie, najskôr ho teda musíš <a href="%{unblock_url}">odblokovať</a>.
+      export: Exportuj
+      import: Nahraj
       new:
         create: Vytvor blokovanie domény
         hint: Blokovanie domény stále dovolí vytvárať nové účty v databázi, ale tieto budú spätne automaticky moderované.
@@ -336,6 +341,7 @@ sk:
         comment: Interná poznámka
         policies:
           reject_media: Zamietni médiá
+          reject_reports: Zamietni hlásenia
           suspend: Vylúč
         policy: Zásady
         reason: Verejné odôvodnenie
@@ -344,6 +350,7 @@ sk:
         instance_accounts_dimension: Najsledovanejšie účty
       delivery:
         all: Všetko
+        failing: Zlyhávajúce
         unavailable: Nedostupné
       delivery_available: Je v dosahu doručovania
       moderation:
@@ -402,7 +409,6 @@ sk:
     report_notes:
       created_msg: Poznámka o nahlásení úspešne vytvorená!
       destroyed_msg: Poznámka o nahlásení úspešne vymazaná!
-      today_at: Dnes o %{time}
     reports:
       action_taken_by: Zákrok vykonal/a
       are_you_sure: Si si istý/á?
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 4e6b499b1..299f6107b 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -122,6 +122,8 @@ sl:
       redownloaded_msg: Uspešno osvežen profil %{username} iz izvirnika
       reject: Zavrni
       rejected_msg: Uspešno zavrnjena vloga prijave uporabnika %{username}
+      remote_suspension_irreversible: Podatki tega računa so bili nepovratno izbrisani.
+      remote_suspension_reversible_hint_html: Račun je bil suspendiran na njihovem strežniku, podatki pa bodo v celoti odstranjeni %{date}. Do takrat lahko oddaljeni strežnik obnovi ta račun obnoviti brez negativnih posledic. Če želite takoj odstraniti vse podatke računa, lahko to storite spodaj.
       remove_avatar: Odstrani podobo
       remove_header: Odstrani glavo
       removed_avatar_msg: Uspešno odstranjena slika avatarja uporabnika %{username}
@@ -583,7 +585,6 @@ sl:
     report_notes:
       created_msg: Opomba o prijavi je uspešno ustvarjena!
       destroyed_msg: Opomba o prijavi je uspešno izbrisana!
-      today_at: Danes ob %{time}
     reports:
       account:
         notes:
@@ -732,6 +733,9 @@ sl:
       content_retention:
         preamble: Nazdor nad hrambo vsebine uporabnikov v Mastodonu.
         title: Hramba vsebin
+      default_noindex:
+        desc_html: Vpliva na vse uporabnike, ki niso sami spremenili te nastavitve
+        title: Privzeto izvzemi uporabnike iz indeksiranja iskalnika
       discovery:
         follow_recommendations: Sledi priporočilom
         preamble: Izpostavljanje zanimivih vsebin je ključno za pridobivanje novih uporabnikov, ki morda ne poznajo nikogar na Mastodonu. Nadzirajte, kako različne funkcionalnosti razkritja delujejo na vašem strežniku.
@@ -1007,6 +1011,9 @@ sl:
       email_below_hint_html: Če spodnji e-poštni naslov ni pravilen, ga lahko spremenite tukaj in prejmete novo potrditveno e-pošto.
       email_settings_hint_html: Potrditvena e-pošta je bila poslana na %{email}. Če ta e-poštni naslov ni pravilen, ga lahko spremenite v nastavitvah računa.
       title: Nastavitev
+    sign_in:
+      preamble_html: Prijavite se s svojimi poverilnicami <strong>%{domain}</strong>. Če vaš račun gostuje na drugem strežniku, se tukaj ne boste mogli prijaviti.
+      title: Vpiši se v %{domain}
     sign_up:
       preamble: Z računom na strežniku Mastodon boste lahko sledili vsem drugim v tem omrežju, ne glede na to, kje gostuje njihov račun.
       title: Naj vas namestimo na %{domain}.
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index 239ea2441..8b46063a7 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -116,6 +116,8 @@ sq:
       redownloaded_msg: Profili i %{username} u rifreskua me sukses prej origjinës
       reject: Hidhe tej
       rejected_msg: Aplikimi për regjistrim i %{username} u hodh poshtë me sukses
+      remote_suspension_irreversible: Të dhënat e kësaj llogarie janë fshirë në mënyrë të pakthyeshme.
+      remote_suspension_reversible_hint_html: Llogaria është pezulluar në shërbyesit e tyre dhe të dhënat do të hiqen plotësisht më %{date}. Deri atëherë, shërbyesi i largët mund të rikthejë këtë llogari pa u cënuar. Nëse dëshironi të hiqen menjëherë të dhënat e llogarisë, mund ta bëni më poshtë.
       remove_avatar: Hiqe avatarin
       remove_header: Hiqe kryen
       removed_avatar_msg: U hoq me sukses figura e avatarit të %{username}
@@ -373,6 +375,8 @@ sq:
       add_new: Shtoje përkatësinë në listë lejimesh
       created_msg: Përkatësia u shtua me sukses në listë lejimesh
       destroyed_msg: Përkatësia u hoq nga listë lejimesh
+      export: Eksportim
+      import: Importim
       undo: Hiqe nga listë lejimesh
     domain_blocks:
       add_new: Shtoni bllokim të ri përkatësie
@@ -382,6 +386,8 @@ sq:
       edit: Përpunoni bllokim përkatësie
       existing_domain_block: Keni vendosur tashmë kufizime më të rrepta mbi %{name}.
       existing_domain_block_html: Keni vendosur tashmë kufizime më të rrepta mbi %{name}, lypset ta <a href="%{unblock_url}">zhbllokoni</a> së pari.
+      export: Eksportim
+      import: Importim
       new:
         create: Krijoni bllokim
         hint: Bllokimi i përkatësisë nuk do të pengojë krijim zërash llogarie te baza e të dhënave, por do të aplikojë në mënyrë retroaktive dhe të vetvetishme metoda specifike moderimi mbi këto llogari.
@@ -425,6 +431,8 @@ sq:
       resolved_through_html: Zgjidhur përmes %{domain}
       title: Listë bllokimesh email-esh
     export_domain_allows:
+      new:
+        title: Impotoni lejime përkatësish
       no_file: S’u përzgjodh kartelë
     export_domain_blocks:
       import:
@@ -554,7 +562,6 @@ sq:
     report_notes:
       created_msg: Shënimi i raportimit u krijua me sukses!
       destroyed_msg: Shënimi i raportimit u fshi me sukses!
-      today_at: Sot më %{time}
     reports:
       account:
         notes:
@@ -695,6 +702,9 @@ sq:
       content_retention:
         preamble: Kontrolloni se si depozitohen në Mastodon lënda e prodhuar nga përdoruesit.
         title: Mbajtje lënde
+      default_noindex:
+        desc_html: Prek krejt përdoruesit që s’e kanë ndryshuar vetë këtë rregullim
+        title: Lëri, si parazgjedhje, përdoruesit jashtë indeksimi nga motorë kërkimesh
       discovery:
         follow_recommendations: Rekomandime ndjekjeje
         preamble: Shpërfaqja e lëndës interesante është me rëndësi kyçe për mirëseardhjen e përdoruesve të rinj që mund të mos njohin njeri në Mastodon. Kontrolloni se si funksionojnë në shërbyesin tuaj veçori të ndryshme zbulimi.
@@ -960,6 +970,9 @@ sq:
       email_below_hint_html: Nëse adresa email më poshtë s’është e saktë, mund ta ndryshoni këtu dhe të merrni një email të ri ripohimi.
       email_settings_hint_html: Email-i i ripohimit u dërgua te %{email}. Nëse ajo adresë email s’është e saktë, mund ta ndryshoni që nga rregullimet e llogarisë.
       title: Ujdisje
+    sign_in:
+      preamble_html: Hyni me kredencialet tuaja për te <strong>%{domain}</strong>. Nëse llogaria juaj strehohet në një tjetër shërbyes, s’do të jeni në gjendje të bëni hyrjen këtu.
+      title: Bëni hyrjen te %{domain}
     sign_up:
       preamble: Me një llogari në këtë shërbyes Mastodon, do të jeni në gjendje të ndiqni cilindo person tjetër në rrjet, pavarësisht se ku strehohet llogaria e tyre.
       title: Le të ujdisim llogarinë tuaj në %{domain}.
diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml
index 93cbb0137..dc62f2220 100644
--- a/config/locales/sr-Latn.yml
+++ b/config/locales/sr-Latn.yml
@@ -52,6 +52,7 @@ sr-Latn:
       protocol: Protokol
       public: Javno
       redownload: Osveži avatar
+      remote_suspension_reversible_hint_html: Налог је суспендован на њиховом серверу, а подаци ће бити у потпуности уклоњени %{date}. До тада, удаљени сервер може вратити овај налог без икаквих негативних ефеката. Ако желите одмах да уклоните све податке налога, то можете учинити у наставку.
       resend_confirmation:
         already_confirmed: Ovaj korisnik je već potvrđen
         send: Ponovo pošaljite e-poruku za potvrdu
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index eb80ab9ee..656b6f763 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -4,10 +4,10 @@ sr:
     about_mastodon_html: Мастодон је друштвена мрежа базирана на отвореним протоколима и слободном софтверу отвореног кода. Децентрализована је као што је децентрализована е-пошта.
     contact_missing: Није постављено
     contact_unavailable: Није доступно
-    hosted_on: Мастодонт хостован на %{domain}
+    hosted_on: Мастодон хостован на %{domain}
     title: О
   accounts:
-    follow: Запрати
+    follow: Прати
     followers:
       few: Пратиоци
       one: Пратиоц
@@ -32,15 +32,23 @@ sr:
       created_msg: Модераторска белешка успешно направљена!
       destroyed_msg: Модераторска белешка успешно обрисана!
     accounts:
+      add_email_domain_block: Блокирај домен е-поште
+      approve: Одобри
       are_you_sure: Да ли сте сигурни?
       avatar: Аватар
       by_domain: Домен
       change_email:
+        changed_msg: Е-пошта налога успешно промењена!
         current_email: Тренутна е-пошта
         label: Промените е-пошту
         new_email: Нова e-пошта
         submit: Промените e-пошту
         title: Промените e-пошту за %{username}
+      change_role:
+        changed_msg: Улога успешно промењена!
+        label: Промени улогу
+        no_role: Нема улогу
+        title: Промени улогу за %{username}
       confirm: Потврди
       confirmed: Потврђено
       confirming: Потврдување
@@ -62,7 +70,9 @@ sr:
       follows: Праћени
       header: Заглавље
       inbox_url: Адреса сандучета
+      invite_request_text: Разлози за придруживање
       invited_by: Позван од стране
+      ip: IP
       joined: Придружио се
       location:
         all: Све
@@ -75,19 +85,24 @@ sr:
       moderation:
         active: Активан
         all: Сви
+        pending: На чекању
+        silenced: Ограничено
         suspended: Суспендовани
         title: Модерација
       moderation_notes: Модераторске белешке
       most_recent_activity: Најскорија активност
       most_recent_ip: Најскорија IP адреса
       no_limits_imposed: Нема ограничења
+      no_role_assigned: Ниједна улога није додељена
       not_subscribed: Није претплаћен
+      pending: Чека на преглед
       perform_full_suspension: Искључи
       promote: Унапреди
       protocol: Протокол
       public: Јавно
       push_subscription_expires: PuSH претплата истиче
       redownload: Освежи налог
+      reject: Одбаци
       remove_avatar: Уклони аватар
       remove_header: Одстрани заглавље
       resend_confirmation:
@@ -97,7 +112,11 @@ sr:
       reset: Ресетуј
       reset_password: Ресетуј лозинку
       resubscribe: Поново се претплати
+      role: Улога
       search: Претрага
+      security_measures:
+        only_password: Само лозинка
+      sensitized: Означено као осетљиво
       shared_inbox_url: Адреса дељеног сандучета
       show:
         created_reports: Направљени извештаји
@@ -106,8 +125,10 @@ sr:
       silenced: Ућуткан
       statuses: Статуси
       subscribe: Претплати се
+      suspend: Суспендуј
       suspended: Суспендовани
       title: Налози
+      unblock_email: Одблокирај адресу е-поште
       unconfirmed_email: Непотврђена е-пошта
       undo_silenced: Укини ћутање
       undo_suspension: Укини суспензију
@@ -116,19 +137,56 @@ sr:
       warn: Упозори
       web: Веб
     action_logs:
+      action_types:
+        approve_user: Одобри корисника
+        change_email_user: Промени e-адресу корисника
+        change_role_user: Промени улогу корисника
+        confirm_user: Потврди корисника
+        create_account_warning: Креирај упозорење
+        create_announcement: Креирај најаву
+        create_canonical_email_block: Креирај блок е-поште
+        create_user_role: Креирај улогу
+        destroy_announcement: Избриши најаву
+        destroy_canonical_email_block: Избриши блок е-поште
+        destroy_status: Избриши пост
+        disable_user: Онемогући корисника
+        enable_user: Омогући корисника
+        reject_user: Одбаци корисника
+        silence_account: Ограничи налог
+        suspend_account: Обустави налог
+        update_status: Уреди објаву
+        update_user_role: Уреди улогу
+      deleted_account: обрисан налог
+      filter_by_action: Филтрирај по активности
+      filter_by_user: Филтрирај по кориснику
       title: Записник
+    announcements:
+      edit:
+        title: Уреди најаву
+      empty: Ниједна најава није пронађена.
+      live: Уживо
+      new:
+        create: Креирај најаву
+        title: Нова најава
+      publish: Објави
+      published_msg: Најава успешно објављена!
+      title: Најаве
     custom_emojis:
+      assign_category: Додели категорију
       by_domain: Домен
       copied_msg: Успешно направљена локална копија емоџија
       copy: Копирај
       copy_failed_msg: Не могу да направим локалну копију тог емотиџија
+      create_new_category: Kreiraj novu kategoriju
       created_msg: Емоџи успешно направљен!
       delete: Обриши
       destroyed_msg: Емоџи успешно обрисан!
       disable: Онемогући
+      disabled: Онемогућено
       disabled_msg: Емоџи успешно онемогућен
       emoji: Емоџи
       enable: Омогући
+      enabled: Омогућено
       enabled_msg: Емоџи успешно омогућен
       listed: Излистан
       new:
@@ -145,11 +203,16 @@ sr:
       software: Софтвер
       space: Коришћење простора
       title: Командна табла
+    domain_allows:
+      export: Извоз
+      import: Увоз
     domain_blocks:
       add_new: Додај нови блок домена
       created_msg: Блокирање домена се обрађује
       destroyed_msg: Блокирање домена је опозвано
       domain: Домен
+      export: Извоз
+      import: Увоз
       new:
         create: Направи блокаду
         hint: Блокирање домена неће спречити прављење налога у бази, али ће ретроактивно и аутоматски применити одређене модераторске методе над тим налозима.
@@ -157,6 +220,8 @@ sr:
           noop: Ништа
           suspend: Суспензија
         title: Ново блокирање домена
+      private_comment: Приватни коментар
+      public_comment: Јавни коментар
       reject_media: Одбаци мултимедију
       reject_media_hint: Уклања локално ускладиштене мултимедијске фајлове и одбија да их скида убудуће. Небитно је за суспензију
       reject_reports: Одбаци извештај
@@ -171,12 +236,29 @@ sr:
         create: Додај домен
         title: Нова ставка е-поштe у црној листи
       title: Црна листа E-поште
+    follow_recommendations:
+      status: Статус
     instances:
+      back_to_all: Све
+      back_to_limited: Ограничено
+      back_to_warning: Упозорење
+      by_domain: Домен
+      content_policies:
+        policies:
+          silence: Ограничи
+          suspend: Суспендуј
+        policy: Политика
+        reason: Јавни разлог
+      delivery:
+        all: Све
+        unavailable: Недоступно
       delivery_available: Достава је доступна
       moderation:
         all: Све
         limited: Ограничено
         title: Модерација
+      private_comment: Приватни коментар
+      public_comment: Јавни коментар
       title: Федерација
       total_blocked_by_us: Блокирано од стране нас
       total_followed_by_them: Праћени од стране њих
@@ -190,6 +272,17 @@ sr:
         expired: Истекли
         title: Филтер
       title: Позивнице
+    ip_blocks:
+      expires_in:
+        '1209600': 2 недеље
+        '15778476': 6 месеци
+        '2629746': 1 месец
+        '31556952': 1 година
+        '86400': 1 дан
+        '94670856': 3 године
+      new:
+        title: Креирај ново IP правило
+      no_ip_block_selected: Ниједно IP правило није промењено јер ниједно није изабрано
     relays:
       add_new: Додај нови релеј
       delete: Обриши
@@ -235,9 +328,35 @@ sr:
       unassign: Уклони доделу
       unresolved: Нерешене
       updated_at: Ажурирана
+      view_profile: Погледај профил
+    roles:
+      add_new: Додај улогу
+      categories:
+        administration: Администрација
+        moderation: Модерација
+      delete: Избриши
+      privileges:
+        administrator: Администратор
+        delete_user_data: Избриши податке корисника
+        invite_users: Позови кориснике
+        manage_announcements: Управљај обавештењима
+        manage_roles: Управљај улогама
+        manage_rules: Управљај правилима
+        manage_rules_description: Дозволи корисницима да мењају правила сервера
+        manage_settings: Управљај поставкама
+        manage_settings_description: Дозволи корисницима да мењају поставке сајта
+    rules:
+      add_new: Додај правило
+      delete: Избриши
+      edit: Уреди правило
+      empty: Ниједно правило сервера још није дефинисано.
+      title: Правила сервера
     settings:
       appearance:
         title: Изглед
+      default_noindex:
+        desc_html: Утиче на све кориснике који нису сами променили ову поставку
+        title: Подразумевано искључи кориснике из индексирања претраживача
       discovery:
         public_timelines: Јавне временске линије
     statuses:
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index f85c2fa24..bae4a964b 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -116,6 +116,8 @@ sv:
       redownloaded_msg: Uppdaterade %{username}s profil från server
       reject: Förkasta
       rejected_msg: Avvisade %{username}s registreringsansökan
+      remote_suspension_irreversible: Detta konto har raderats och uppgifterna kan inte återkallas.
+      remote_suspension_reversible_hint_html: Kontot har stängts av på dess server och all data som tillhör det kommer att raderas permanent den %{date}. Tills dess kan kontot återställas på sin server utan dataförlust. Om du vill radera all kontodata redan nu, kan du göra detta nedan.
       remove_avatar: Ta bort avatar
       remove_header: Ta bort rubrik
       removed_avatar_msg: Tog bort %{username}s profilbild
@@ -123,7 +125,7 @@ sv:
       resend_confirmation:
         already_confirmed: Den här användaren är redan bekräftad
         send: Skicka om e-postbekräftelse
-        success: Bekräftelsemeddelande skickas framgångsrikt!
+        success: Bekräftelsemeddelande skickades framgångsrikt!
       reset: Återställ
       reset_password: Återställ lösenord
       resubscribe: Starta en ny prenumeration
@@ -283,7 +285,7 @@ sv:
         update_ip_block_html: "%{name} ändrade regel för IP %{target}"
         update_status_html: "%{name} uppdaterade inlägget av %{target}"
         update_user_role_html: "%{name} ändrade rollen %{target}"
-      deleted_account: raderat konto deleted account
+      deleted_account: raderat konto
       empty: Inga loggar hittades.
       filter_by_action: Filtrera efter åtgärd
       filter_by_user: Filtrera efter användare
@@ -561,7 +563,6 @@ sv:
     report_notes:
       created_msg: Anmälningsanteckning har skapats!
       destroyed_msg: Anmälningsanteckning har raderats!
-      today_at: Idag kl. %{time}
     reports:
       account:
         notes:
@@ -704,6 +705,9 @@ sv:
       content_retention:
         preamble: Kontrollera hur användargenererat innehåll lagras i Mastodon.
         title: Bibehållande av innehåll
+      default_noindex:
+        desc_html: Påverkar alla användare som inte själva ändrat denna inställning
+        title: Undantag användare från sökmotorindexering som standard
       discovery:
         follow_recommendations: Följrekommendationer
         preamble: Att visa intressant innehåll är avgörande i onboarding av nya användare som kanske inte känner någon på Mastodon. Styr hur olika upptäcktsfunktioner fungerar på din server.
@@ -971,6 +975,9 @@ sv:
       email_below_hint_html: Om nedanstående e-postadress är felaktig kan du ändra den här, och få ett nytt bekräftelsemeddelande.
       email_settings_hint_html: E-postmeddelande för verifiering skickades till %{email}. Om e-postadressen inte stämmer kan du ändra den i kontoinställningarna.
       title: Ställ in
+    sign_in:
+      preamble_html: Logga in med dina användaruppgifter på <strong>%{domain}</strong>. Om ditt konto finns på en annan server kommer du inte att kunna logga in här.
+      title: Logga in på %{domain}
     sign_up:
       preamble: Med ett konto på denna Mastodon-server kan du följa alla andra personer på nätverket, oavsett vilken server deras konto tillhör.
       title: Låt oss få igång dig på %{domain}.
@@ -1161,7 +1168,7 @@ sv:
     all_matching_items_selected_html:
       one: "<strong>%{count}</strong> objekt som matchar din sökning är valt."
       other: "<strong>%{count}</strong> objekt som matchar din sökning är valda."
-    changes_saved_msg: Ändringar sparades framgångsrikt!
+    changes_saved_msg: Ändringar sparade!
     copy: Kopiera
     delete: Radera
     deselect: Avmarkera alla
@@ -1187,7 +1194,7 @@ sv:
       overwrite: Skriv över
       overwrite_long: Ersätt de nuvarande uppgifterna med de nya
     preface: Du kan importera data som du exporterat från en annan instans, till exempel en lista över personer du följer eller blockerar.
-    success: Dina uppgifter har laddats upp och kommer nu att behandlas snarast
+    success: Dina uppgifter har laddats upp och kommer att behandlas snarast
     types:
       blocking: Lista av blockerade
       bookmarks: Bokmärken
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 5be7e33f3..9ef2b4f30 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -113,6 +113,8 @@ th:
       redownloaded_msg: รีเฟรชโปรไฟล์ของ %{username} จากจุดเริ่มต้นสำเร็จ
       reject: ปฏิเสธ
       rejected_msg: ปฏิเสธใบสมัครลงทะเบียนของ %{username} สำเร็จ
+      remote_suspension_irreversible: ลบข้อมูลของบัญชีนี้อย่างถาวรแล้ว
+      remote_suspension_reversible_hint_html: ระงับบัญชีในเซิร์ฟเวอร์ของเขาแล้ว และจะเอาข้อมูลออกอย่างสมบูรณ์ใน %{date} จนกว่าจะถึงตอนนั้น เซิร์ฟเวอร์ระยะไกลสามารถกู้คืนบัญชีนี้ได้โดยไม่มีผลร้ายใด ๆ หากคุณต้องการเอาข้อมูลของบัญชีทั้งหมดออกในทันที คุณสามารถทำได้ด้านล่าง
       remove_avatar: เอาภาพประจำตัวออก
       remove_header: เอาส่วนหัวออก
       removed_avatar_msg: เอาภาพประจำตัวของ %{username} ออกสำเร็จ
@@ -417,7 +419,7 @@ th:
         resolve: แปลงที่อยู่โดเมน
         title: ปิดกั้นโดเมนอีเมลใหม่
       no_email_domain_block_selected: ไม่มีการเปลี่ยนแปลงการปิดกั้นโดเมนอีเมลเนื่องจากไม่มีการเลือก
-      resolved_dns_records_hint_html: ชื่อโดเมนแปลงที่อยู่เป็นโดเมน MX ดังต่อไปนี้ ซึ่งท้ายที่สุดแล้วจะรับผิดชอบสำหรับการยอมรับอีเมล การปิดกั้นโดเมน MX จะปิดกั้นการลงทะเบียนจากที่อยู่อีเมลใด ๆ ซึ่งใช้โดเมน MX เดียวกัน แม้ว่าชื่อโดเมนที่ปรากฏจะแตกต่างกัน <strong>ระวังอย่าปิดกั้นผู้ให้บริการอีเมลรายใหญ่</strong>
+      resolved_dns_records_hint_html: ชื่อโดเมนแปลงที่อยู่เป็นโดเมน MX ดังต่อไปนี้ ซึ่งท้ายที่สุดแล้วจะรับผิดชอบสำหรับการยอมรับอีเมล การปิดกั้นโดเมน MX จะปิดกั้นการลงทะเบียนจากที่อยู่อีเมลใด ๆ ซึ่งใช้โดเมน MX เดียวกัน แม้ว่าชื่อโดเมนที่ปรากฏจะแตกต่างกันก็ตาม <strong>ระวังอย่าปิดกั้นผู้ให้บริการอีเมลรายใหญ่</strong>
       resolved_through_html: แปลงที่อยู่ผ่าน %{domain}
       title: โดเมนอีเมลที่ปิดกั้นอยู่
     export_domain_allows:
@@ -550,7 +552,6 @@ th:
     report_notes:
       created_msg: สร้างหมายเหตุรายงานสำเร็จ!
       destroyed_msg: ลบหมายเหตุรายงานสำเร็จ!
-      today_at: วันนี้เวลา %{time}
     reports:
       account:
         notes:
@@ -690,6 +691,9 @@ th:
       content_retention:
         preamble: ควบคุมวิธีการจัดเก็บเนื้อหาที่ผู้ใช้สร้างขึ้นใน Mastodon
         title: การเก็บรักษาเนื้อหา
+      default_noindex:
+        desc_html: มีผลต่อผู้ใช้ทั้งหมดที่ไม่ได้เปลี่ยนการตั้งค่านี้ด้วยตนเอง
+        title: เลือกให้ผู้ใช้ไม่รับการทำดัชนีโดยเครื่องมือค้นหาเป็นค่าเริ่มต้น
       discovery:
         follow_recommendations: คำแนะนำการติดตาม
         preamble: การแสดงเนื้อหาที่น่าสนใจเป็นเครื่องมือในการเตรียมความพร้อมให้ผู้ใช้ใหม่ที่อาจไม่รู้จักใครก็ตามใน Mastodon ควบคุมวิธีที่คุณลักษณะการค้นพบต่าง ๆ ทำงานในเซิร์ฟเวอร์ของคุณ
@@ -953,6 +957,9 @@ th:
       email_below_hint_html: หากที่อยู่อีเมลด้านล่างไม่ถูกต้อง คุณสามารถเปลี่ยนที่อยู่อีเมลที่นี่และรับอีเมลยืนยันใหม่
       email_settings_hint_html: ส่งอีเมลยืนยันไปยัง %{email} แล้ว หากที่อยู่อีเมลนั้นไม่ถูกต้อง คุณสามารถเปลี่ยนที่อยู่อีเมลได้ในการตั้งค่าบัญชี
       title: การตั้งค่า
+    sign_in:
+      preamble_html: ลงชื่อเข้าด้วยข้อมูลประจำตัว <strong>%{domain}</strong> ของคุณ หากบัญชีของคุณได้รับการโฮสต์ในเซิร์ฟเวอร์อื่น คุณจะไม่สามารถเข้าสู่ระบบได้ที่นี่
+      title: ลงชื่อเข้า %{domain}
     sign_up:
       preamble: เมื่อมีบัญชีในเซิร์ฟเวอร์ Mastodon นี้ คุณจะสามารถติดตามบุคคลอื่นใดในเครือข่าย โดยไม่คำนึงถึงที่ซึ่งบัญชีของเขาได้รับการโฮสต์
       title: มาตั้งค่าของคุณใน %{domain} กันเลย
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 15637c323..cd377ff54 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -116,6 +116,8 @@ tr:
       redownloaded_msg: "%{username} kullanıcısının profili kökenden başarıyla yenilendi"
       reject: Reddet
       rejected_msg: "%{username} adlı kullanıcının kayıt başvurusu başarıyla reddedildi"
+      remote_suspension_irreversible: Bu hesaba ait veriler geri dönüşümsüz bir şekilde silindi.
+      remote_suspension_reversible_hint_html: Hesap sunucusunda askıya alındı ve veriler %{date} tarihinde tamamen kaldırılacak. O zamana kadar, uzak sunucu herhangi bir olumsuz etki olmadan hesabı geri yüklenebilir. Hesabın tüm verilerini hemen kaldırmak isterseniz, bunu aşağıdan yapabilirsiniz.
       remove_avatar: Profil resmini kaldır
       remove_header: Üstbilgiyi kaldır
       removed_avatar_msg: "%{username} hesabının avatar resmi başarıyla kaldırıldı"
@@ -395,6 +397,8 @@ tr:
           silence: Sınırla
           suspend: Uzaklaştır
         title: Yeni domain bloğu
+      no_domain_block_selected: Seçim yapılmadığından hiç bir alan adı engeli değiştirilmedi
+      not_permitted: Bu işlemi gerçekleştirme izniniz yok
       obfuscate: Alan adını gizle
       obfuscate_hint: Alan adı kısıtlamaları listelerinin duyurulması etkinleştirilmişse alan adını listede kısmen gizle
       private_comment: Özel yorum
@@ -427,9 +431,14 @@ tr:
       resolved_through_html: "%{domain} aracılığıyla çözümlendi"
       title: E-posta kara listesi
     export_domain_allows:
+      new:
+        title: Alan adı engellerini içe aktar
       no_file: Dosya seçilmedi
     export_domain_blocks:
       import:
+        description_html: Bir alan adı engeli listesini içe aktarmak üzeresiniz. Bu listeyi iyice gözden geçirin, özellikle listeyi siz hazırlamadıysanız.
+        existing_relationships_warning: Mevcut takip ilişkileri
+        private_comment_description_html: 'İçe aktarılan engellerin nereden geldiğini izlemenize olanak sağlamak için, içe aktarılan engeller şu özel yorum ile oluşturulacak: <q>%{comment}</q>'
         private_comment_template: "%{source} kaynağından %{date} tarihinde içe aktarıldı"
         title: Domain bloklarını içe aktar
       new:
@@ -554,7 +563,6 @@ tr:
     report_notes:
       created_msg: Şikayet notu başarıyla oluşturuldu!
       destroyed_msg: Şikayet notu başarıyla silindi!
-      today_at: 'Bugün şu saatte: %{time}'
     reports:
       account:
         notes:
@@ -697,6 +705,9 @@ tr:
       content_retention:
         preamble: Kullanıcıların ürettiği içeriğin Mastodon'da nasıl saklanacağını denetleyin.
         title: İçerik saklama
+      default_noindex:
+        desc_html: Bu ayarı kendileri değiştirmeyen tüm kullanıcıları etkiler
+        title: Varsayılan olarak kullanıcıları arama motoru indekslemesinin dışında tut
       discovery:
         follow_recommendations: Takip önerileri
         preamble: İlginç içeriği gezinmek, Mastodon'da kimseyi tanımayan yeni kullanıcıları alıştırmak için oldukça etkilidir. Sunucunuzdaki çeşitli keşif özelliklerinin nasıl çalıştığını denetleyin.
@@ -964,6 +975,9 @@ tr:
       email_below_hint_html: Eğer aşağıdaki e-posta adresi yanlışsa, onu burada değiştirebilir ve yeni bir doğrulama e-postası alabilirsiniz.
       email_settings_hint_html: Onaylama e-postası %{email} adresine gönderildi. Eğer bu e-posta adresi doğru değilse, hesap ayarlarından değiştirebilirsiniz.
       title: Kurulum
+    sign_in:
+      preamble_html: "<strong>%{domain}</strong> kimlik bilgilerinizi kullanarak giriş yapın. Eğer hesabınız başka bir sunucuda barındırılıyorsa, burada giriş yapamazsınız."
+      title: "%{domain} giriş yapın"
     sign_up:
       preamble: Bu Mastodon sunucusu üzerinden bir hesap ile ağdaki herhangi bir kişiyi, hesabı hangi sunucuda saklanırsa saklansın, takip edebilirsiniz.
       title: "%{domain} için kurulumunuzu yapalım."
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index c11e0688a..69ac1d68a 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -13,7 +13,7 @@ uk:
       many: Підписників
       one: Підписник
       other: Підписники
-    following: Підписані
+    following: Підписок
     instance_actor_flash: Цей обліковий запис є віртуальним персонажем, який використовується для показу самого сервера, а не будь-якого окремого користувача. Він використовується з метою федералізації і не повинен бути зупинений.
     last_active: остання активність
     link_verified_on: Права власності на це посилання були перевірені %{date}
@@ -122,6 +122,8 @@ uk:
       redownloaded_msg: Профіль %{username} оновлено з джерела походження
       reject: Відхилити
       rejected_msg: Заявку на реєстрацію %{username} відхилено
+      remote_suspension_irreversible: Дані цього облікового запису безповоротно видалені.
+      remote_suspension_reversible_hint_html: Обліковий запис було призупинено на їхньому сервері, а дані будуть повністю вилучені на %{date}. До цього часу віддалений сервер може відновити цей обліковий запис без будь-яких наслідків. Якщо ви бажаєте вилучити всі дані облікового запису негайно, ви можете зробити це нижче.
       remove_avatar: Видалити аватар
       remove_header: Видалити заголовок
       removed_avatar_msg: Зображення користувача %{username} вилучено
@@ -577,13 +579,12 @@ uk:
       pending: Очікуємо на підтвердження ретранслятором
       save_and_enable: Зберегти та увімкнути
       setup: Налаштування з'єднання з ретранслятором
-      signatures_not_enabled: Ретранслятори не будуть добре працювати поки ввімкнений безопасний режим або режим білого списка
+      signatures_not_enabled: Ретранслятори не будуть працювати коректно поки ввімкнений безпечний режим або режим обмеженої федерації
       status: Стан
       title: Ретранслятори
     report_notes:
       created_msg: Скарга успішно створена!
       destroyed_msg: Скарга успішно видалена!
-      today_at: Сьогодні о %{time}
     reports:
       account:
         notes:
@@ -732,6 +733,9 @@ uk:
       content_retention:
         preamble: Контролюйте, як зберігаються користувацькі матеріали в Mastodon.
         title: Зберігання вмісту
+      default_noindex:
+        desc_html: Впливає на всіх користувачів, які не змінили це налаштування самостійно
+        title: Усталено відмовитись від індексації користувачів пошуковими системами
       discovery:
         follow_recommendations: Поради щодо підписок
         preamble: Показ цікавих матеріалів відіграє важливу роль у залученні нових користувачів, які, можливо, не знають нікого з Mastodon. Контролюйте роботу різних функцій виявлення на вашому сервері.
@@ -1007,6 +1011,9 @@ uk:
       email_below_hint_html: Якщо ця електронна адреса не є вірною, ви можете змінити її тут та отримати новий лист для підтвердження.
       email_settings_hint_html: Електронний лист-підтвердження було вислано на %{email}. Якщо ця адреса електронної пошти не правильна, ви можете змінити її в налаштуваннях облікового запису.
       title: Налаштування
+    sign_in:
+      preamble_html: Увійдіть за допомогою облікових даних <strong>%{domain}</strong>. Якщо ваш обліковий запис розміщений на іншому сервері, ви не зможете увійти тут.
+      title: Увійти до %{domain}
     sign_up:
       preamble: За допомогою облікового запису на цьому сервері Mastodon, ви зможете слідкувати за будь-якою іншою людиною в мережі, не зважаючи на те, де розміщений обліковий запис.
       title: Налаштуймо вас на %{domain}.
@@ -1338,8 +1345,8 @@ uk:
       subject: Ваш допис сподобався %{name}
       title: Нове вподобання
     follow:
-      body: "%{name} тепер підписаний на вас!"
-      subject: "%{name} тепер підписаний на вас"
+      body: "%{name} тепер стежить за вами!"
+      subject: "%{name} тепер стежить за вами"
       title: Новий підписник
     follow_request:
       action: Керувати запитами на підписку
@@ -1693,7 +1700,7 @@ uk:
       edit_profile_step: Ви можете налаштувати свій профіль, завантаживши зображення профілю, змінивши відображуване ім'я та інше. Ви можете включити для перегляду нових підписників до того, як вони матимуть змогу підписатися на вас.
       explanation: Ось кілька порад для початку
       final_action: Почати писати
-      final_step: 'Почніть дописувати! Навіть не підписавшись на вас, інші зможуть побачити ваші пости, наприклад, у локальній стрічці та у хештеґах. Якщо ви хочете представитися, можете скористатися хештеґом #introductions.'
+      final_step: 'Почніть дописувати! Навіть не підписавшись на вас, інші зможуть побачити ваші дописи, наприклад, у локальній стрічці та у хештеґах. Якщо ви хочете представитися, можете скористатися хештеґом #introductions.'
       full_handle: Ваше звернення
       full_handle_hint: Те, що ви хочете сказати друзям, щоб вони могли написати вам або підписатися з інших сайтів.
       subject: Ласкаво просимо до Mastodon
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index fe412d06f..62d1a64c4 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -113,6 +113,8 @@ vi:
       redownloaded_msg: Đã tiếp nhận tài khoản %{username} thành công
       reject: Từ chối
       rejected_msg: Đã từ chối đăng ký tài khoản %{username}
+      remote_suspension_irreversible: Dữ liệu của người này đã bị xóa vĩnh viễn.
+      remote_suspension_reversible_hint_html: Mọi dữ liệu của người này sẽ bị xóa hoàn toàn vào %{date}. Trước thời hạn này, các máy chủ khác vẫn có thể lưu trữ mà không ảnh hưởng. Nếu bạn muốn xóa dữ liệu của người này ngay lập tức, hãy tiếp tục.
       remove_avatar: Xóa ảnh đại diện
       remove_header: Xóa ảnh bìa
       removed_avatar_msg: Đã xóa bỏ ảnh đại diện của %{username}
@@ -550,7 +552,6 @@ vi:
     report_notes:
       created_msg: Đã thêm lưu ý kiểm duyệt!
       destroyed_msg: Đã xóa lưu ý kiểm duyệt!
-      today_at: Hôm nay lúc %{time}
     reports:
       account:
         notes:
@@ -649,8 +650,8 @@ vi:
         manage_reports_description: Cho phép xem xét các báo cáo và thực hiện hành động kiểm duyệt đối với chúng
         manage_roles: Quản lý vai trò
         manage_roles_description: Cho phép quản lý và chỉ định các vai trò nhỏ hơn họ
-        manage_rules: Quản lý quy tắc máy chủ
-        manage_rules_description: Cho phép thay đổi quy tắc máy chủ
+        manage_rules: Quản lý nội quy máy chủ
+        manage_rules_description: Cho phép thay đổi nội quy máy chủ
         manage_settings: Quản lý thiết lập
         manage_settings_description: Cho phép thay đổi thiết lập máy chủ
         manage_taxonomies: Quản lý phân loại
@@ -669,17 +670,17 @@ vi:
         view_devops_description: Cho phép truy cập trang tổng quan Sidekiq và pgHero
       title: Danh sách vai trò
     rules:
-      add_new: Thêm quy tắc
+      add_new: Thêm nội quy
       delete: Xóa bỏ
-      description_html: Mặc dù được yêu cầu chấp nhận điều khoản dịch vụ khi đăng ký, nhưng mọi người thường không đọc cho đến khi vấn đề gì đó xảy ra. <strong>Hãy làm điều này rõ ràng hơn bằng cách liệt kê quy tắc máy chủ theo gạch đầu dòng.</strong> Cố gắng viết ngắn và đơn giản, nhưng đừng tách ra quá nhiều mục.
-      edit: Sửa quy tắc
-      empty: Chưa có quy tắc máy chủ.
-      title: Quy tắc máy chủ
+      description_html: Mặc dù được yêu cầu chấp nhận điều khoản dịch vụ khi đăng ký, nhưng mọi người thường không đọc cho đến khi vấn đề gì đó xảy ra. <strong>Hãy làm điều này rõ ràng hơn bằng cách liệt kê nội quy máy chủ theo gạch đầu dòng.</strong> Cố gắng viết ngắn và đơn giản, nhưng đừng tách ra quá nhiều mục.
+      edit: Sửa nội quy
+      empty: Chưa có nội quy máy chủ.
+      title: Nội quy máy chủ
     settings:
       about:
-        manage_rules: Sửa quy tắc máy chủ
+        manage_rules: Sửa nội quy máy chủ
         preamble: Cung cấp thông tin chuyên sâu về cách máy chủ được vận hành, kiểm duyệt, tài trợ.
-        rules_hint: Có một khu vực dành riêng cho các quy tắc mà người tham gia máy chủ của bạn phải tuân thủ.
+        rules_hint: Có một khu vực dành riêng cho các nội quy mà người tham gia máy chủ của bạn phải tuân thủ.
         title: Giới thiệu
       appearance:
         preamble: Tùy chỉnh giao diện web của Mastodon.
@@ -690,6 +691,9 @@ vi:
       content_retention:
         preamble: Kiểm soát cách lưu trữ nội dung cá nhân trong Mastodon.
         title: Lưu giữ nội dung
+      default_noindex:
+        desc_html: Ảnh hưởng đến tất cả người không tự thay đổi cài đặt này
+        title: Mặc định người dùng không xuất hiện trong công cụ tìm kiếm
       discovery:
         follow_recommendations: Gợi ý theo dõi
         preamble: Hiển thị nội dung thú vị là công cụ để thu hút người dùng mới, những người có thể không quen bất kỳ ai trong Mastodon. Kiểm soát cách các tính năng khám phá hoạt động trên máy chủ của bạn.
@@ -758,8 +762,8 @@ vi:
         message_html: 'Phiên bản Elasticsearch không tương thích: %{value}'
         version_comparison: Đang dùng Elasticsearch %{running_version} trong khi bắt buộc phải có %{required_version}
       rules_check:
-        action: Sửa quy tắc máy chủ
-        message_html: Bạn chưa cập nhật quy tắc máy chủ.
+        action: Sửa nội quy máy chủ
+        message_html: Bạn chưa cập nhật nội quy máy chủ.
       sidekiq_process_check:
         message_html: Sidekiq không hoạt động khi truy vấn %{value}. Hãy kiểm tra lại cấu hình Sidekiq
     tags:
@@ -946,13 +950,16 @@ vi:
     reset_password: Đặt lại mật khẩu
     rules:
       preamble: Được ban hành và áp dụng bởi quản trị máy chủ %{domain}.
-      title: Quy tắc máy chủ.
+      title: Nội quy máy chủ.
     security: Bảo mật
     set_new_password: Đặt mật khẩu mới
     setup:
       email_below_hint_html: Nếu địa chỉ email dưới đây không chính xác, bạn có thể thay đổi địa chỉ tại đây và nhận email xác nhận mới.
       email_settings_hint_html: Email xác minh đã được gửi tới %{email}. Nếu địa chỉ email đó không chính xác, bạn có thể thay đổi nó trong cài đặt tài khoản.
       title: Thiết lập
+    sign_in:
+      preamble_html: Đăng nhập bằng tài khoản <strong>%{domain}</strong>. Nếu tài khoản của bạn được lưu trữ trên một máy chủ khác, bạn sẽ không thể đăng nhập tại đây.
+      title: Đăng nhập %{domain}
     sign_up:
       preamble: Với tài khoản trên máy chủ Mastodon này, bạn sẽ có thể theo dõi bất kỳ người nào trên các máy chủ khác, bất kể tài khoản của họ ở đâu.
       title: Cho phép bạn đăng ký trên %{domain}.
@@ -1353,7 +1360,7 @@ vi:
     missing_resource: Không tìm thấy URL chuyển hướng cho tài khoản của bạn
   reports:
     errors:
-      invalid_rules: không đúng với quy tắc
+      invalid_rules: không hợp với nội quy
   rss:
     content_warning: 'Cảnh báo nội dung:'
     descriptions:
@@ -1442,7 +1449,7 @@ vi:
     default_language: Giống ngôn ngữ giao diện
     disallowed_hashtags:
       other: 'chứa các hashtag bị cấm: %{tags}'
-    edited_at_html: Đã sửa %{date}
+    edited_at_html: Sửa %{date}
     errors:
       in_reply_not_found: Bạn đang trả lời một tút không còn tồn tại.
     open_in_web: Xem trong web
@@ -1568,7 +1575,7 @@ vi:
         spam: Spam
         violation: Nội dung vi phạm quy tắc cộng đồng
       explanation:
-        delete_statuses: Vài tút của bạn đã vi phạm quy tắc máy chủ và tạm thời bị ẩn bởi kiểm duyệt viên của %{instance}.
+        delete_statuses: Vài tút của bạn đã vi phạm nội quy máy chủ và tạm thời bị ẩn bởi kiểm duyệt viên của %{instance}.
         disable: Bạn không còn có thể sử dụng tài khoản của mình, nhưng hồ sơ của bạn và dữ liệu khác vẫn còn nguyên. Bạn có thể yêu cầu sao lưu dữ liệu của mình, thay đổi cài đặt tài khoản hoặc xóa tài khoản của bạn.
         mark_statuses_as_sensitive: Vài tút của bạn đã bị kiểm duyệt viên %{instance} đánh dấu nhạy cảm. Mọi người cần nhấn vào media để xem nó. Bạn có thể tự đánh dấu tài khoản của bạn là nhạy cảm.
         sensitive: Từ giờ trở đi, tất cả các media của bạn bạn tải lên sẽ được đánh dấu là nhạy cảm và ẩn đằng sau cảnh báo nhấp chuột.
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 176054be6..bc1a7994a 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -45,8 +45,8 @@ zh-CN:
       change_role:
         changed_msg: 已成功更改角色!
         label: 更改角色
-        no_role: 未设置角色
-        title: 为 %{username} 更改角色
+        no_role: 没有角色
+        title: 更改 %{username} 的角色
       confirm: 确认
       confirmed: 已确认
       confirming: 等待确认
@@ -113,6 +113,8 @@ zh-CN:
       redownloaded_msg: 成功从来源处刷新 %{username} 的用户资料
       reject: 拒绝
       rejected_msg: 已拒绝 %{username} 的注册申请
+      remote_suspension_irreversible: 此账户的数据已被不可逆转地删除。
+      remote_suspension_reversible_hint_html: 账号已在他们的服务器上封禁,数据将在 %{date} 完全删除。 在此之前,远程服务器仍可恢复此账号,并且没有任何不良影响。 如果你想立即移除该账号的所有数据,可以在下面进行。
       remove_avatar: 删除头像
       remove_header: 删除横幅图片
       removed_avatar_msg: 成功删除 %{username} 的头像
@@ -550,7 +552,6 @@ zh-CN:
     report_notes:
       created_msg: 举报记录建立成功!
       destroyed_msg: 举报记录删除成功!
-      today_at: 今天 %{time}
     reports:
       account:
         notes:
@@ -690,6 +691,9 @@ zh-CN:
       content_retention:
         preamble: 控制用户生成的内容在 Mastodon 中如何存储。
         title: 内容保留
+      default_noindex:
+        desc_html: 影响所有尚未更改此设置的用户
+        title: 默认不让用户被搜索引擎索引
       discovery:
         follow_recommendations: 关注推荐
         preamble: 露出有趣的内容有助于新加入 Mastodon 的用户融入。可在这里控制多种发现功能如何在你的服务器上工作。
@@ -953,6 +957,9 @@ zh-CN:
       email_below_hint_html: 如果下面的电子邮箱地址是错误的,你可以在这里修改并重新发送新的确认邮件。
       email_settings_hint_html: 确认邮件已经发送到%{email}。如果该邮箱地址不对,你可以在账号设置里面修改。
       title: 初始设置
+    sign_in:
+      preamble_html: 使用您在 <strong>%{domain}</strong> 的账户和密码登录。如果您的账户托管在其他的服务器上,您将无法在此登录。
+      title: 登录到 %{domain}
     sign_up:
       preamble: 使用此 Mastodon 服务器上的帐号,您将能够关注网络上的任何其他人,无论他们的帐号托管在哪里的主机。
       title: 让我们在 %{domain} 上开始。
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index fabfd892f..f26a8df08 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -49,7 +49,7 @@ zh-HK:
         title: 更改 %{username} 身份
       confirm: 確定
       confirmed: 已確定
-      confirming: 確定
+      confirming: 確定中
       custom: 自訂
       delete: 刪除資料
       deleted: 已刪除
@@ -113,6 +113,8 @@ zh-HK:
       redownloaded_msg: 成功重新載入 %{username} 的個人資料頁面
       reject: 拒絕
       rejected_msg: 成功拒絕了 %{username} 的新帳號申請
+      remote_suspension_irreversible: 帳戶已永久刪除
+      remote_suspension_reversible_hint_html: 此帳戶已被停權及所有數據將會於 %{date} 被刪除。在此之前,你仍可以完全回復帳號。如果你想即時刪除此帳戶的資料,可以在下面進行操作。
       remove_avatar: 刪除頭像
       remove_header: 移除頁面頂端
       removed_avatar_msg: 成功刪除 %{username} 的頭像
@@ -550,7 +552,6 @@ zh-HK:
     report_notes:
       created_msg: 舉報備註已建立!
       destroyed_msg: 舉報備註已刪除!
-      today_at: 今天 %{time}
     reports:
       account:
         notes:
@@ -690,6 +691,9 @@ zh-HK:
       content_retention:
         preamble: 控制使用者生成的內容如何儲存在 Mastodon。
         title: 內容留存
+      default_noindex:
+        desc_html: 影響所有未自行設定的用戶
+        title: 預設用戶不在搜尋引擎索引之內
       discovery:
         follow_recommendations: 追蹤建議
         preamble: 呈現有趣的內容有助於吸引不認識 Mastodon 的使用者新手上路。控制各種探索功能在你的伺服器上的運作方式。
@@ -953,6 +957,9 @@ zh-HK:
       email_below_hint_html: 如果下面的電郵地址不正確,你可在此修改,然後接收電郵進行確認。
       email_settings_hint_html: 確認電郵已發送至 %{email}。電郵地址不正確的話,你可以在帳戶設置中進行更改。
       title: 設定
+    sign_in:
+      preamble_html: 請使用 <strong>%{domain}</strong> 的資料登入。如果您的帳戶託管在其他的伺服器,您將無法在此登入。
+      title: 登入 %{domain}
     sign_up:
       preamble: 有了這個 Mastodon 伺服器的帳號,無論將帳號託管在何處,你都可以追蹤網絡上任何人。
       title: 讓我為你在 %{domain} 上設定好。
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 6fec21083..1674ad756 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -75,7 +75,7 @@ zh-TW:
       invite_request_text: 加入原因
       invited_by: 邀請者
       ip: IP 位址
-      joined: 已加入
+      joined: 加入時間
       location:
         all: 全部
         local: 本站
@@ -113,6 +113,8 @@ zh-TW:
       redownloaded_msg: 成功重新載入%{username} 的個人檔案頁面
       reject: 拒絕
       rejected_msg: 成功拒絕了%{username} 的新帳號申請
+      remote_suspension_irreversible: 此帳號之資料已被不可逆地刪除。
+      remote_suspension_reversible_hint_html: 這個帳號已於此伺服器被停權,所有資料將會於 %{date} 被刪除。在此之前,遠端伺服器可以完全回復此的帳號。如果您想即時刪除這個帳號的資料,您可以在下面進行操作。
       remove_avatar: 取消大頭貼
       remove_header: 移除開頭
       removed_avatar_msg: 成功刪除了 %{username} 的大頭貼
@@ -552,7 +554,6 @@ zh-TW:
     report_notes:
       created_msg: 檢舉記錄建立成功!
       destroyed_msg: 檢舉記錄刪除成功!
-      today_at: 今日為 %{time}
     reports:
       account:
         notes:
@@ -692,6 +693,9 @@ zh-TW:
       content_retention:
         preamble: 控制使用者產生內容如何儲存於 Mastodon 上。
         title: 內容保留期間
+      default_noindex:
+        desc_html: 影響所有沒有變更此設定的使用者
+        title: 預設將使用者排除於搜尋引擎索引
       discovery:
         follow_recommendations: 跟隨建議
         preamble: 呈現有趣的內容有助於 Mastodon 上一人不識的新手上路。控制各種不同的分類在您伺服器上如何被探索到。
@@ -889,7 +893,7 @@ zh-TW:
     created_msg: 成功建立別名。您可以自舊帳號開始轉移。
     deleted_msg: 成功移除別名。您將無法再由舊帳號轉移到目前的帳號。
     empty: 您目前沒有任何別名。
-    hint_html: 如果想由其他帳號轉移到此帳號,您可以在此處新增別名,稍後系統將容許您把跟隨者由舊帳號轉移至此。此項作業是<strong>無害且可復原的</strong>。 <strong>帳號的遷移程序需要在舊帳號啟動</strong>。
+    hint_html: 如果想由其他帳號轉移至此帳號,您可以在此處新增別名,稍後系統將容許您將跟隨者由舊帳號轉移至此。此項作業是<strong>無害且可復原的</strong>。 <strong>帳號的遷移程序需要在舊帳號啟動</strong>。
     remove: 取消連結別名
   appearance:
     advanced_web_interface: 進階網頁介面
@@ -955,6 +959,9 @@ zh-TW:
       email_below_hint_html: 如果此電子郵件地址不正確,您可於此修改並接收郵件進行認證。
       email_settings_hint_html: 請確認 e-mail 是否傳送到 %{email} 。如果不對的話,可以從帳號設定修改。
       title: 設定
+    sign_in:
+      preamble_html: 請登入您於 <strong>%{domain}</strong> 之帳號密碼。若您的帳號託管於其他伺服器,您將無法於此登入。
+      title: 登入 %{domain}
     sign_up:
       preamble: 於此 Mastodon 伺服器擁有帳號的話,您將能跟隨聯邦宇宙網路中任何一份子,無論他們的帳號託管於何處。
       title: 讓我們一起設定 %{domain} 吧!
@@ -1478,7 +1485,7 @@ zh-TW:
     enabled: 自動刪除舊嘟文
     enabled_hint: 一旦達到指定的保存期限,就會自動刪除您的嘟文,除非該嘟文符合下列例外
     exceptions: 例外
-    explanation: 因為刪除嘟文是昂貴的操作,當伺服器不那麼忙碌時才會慢慢完成。因此,您的嘟文會在到達保存期限後一段時間才會被刪除。
+    explanation: 因為刪除嘟文是耗費資源的操作,當伺服器不那麼忙碌時才會慢慢完成。因此,您的嘟文會在到達保存期限後一段時間才會被刪除。
     ignore_favs: 忽略最愛
     ignore_reblogs: 忽略轉嘟
     interaction_exceptions: 基於互動的例外規則
@@ -1486,7 +1493,7 @@ zh-TW:
     keep_direct: 保留私訊
     keep_direct_hint: 不會刪除任何您的私訊
     keep_media: 保留包含媒體內容的嘟文
-    keep_media_hint: 不會刪除您包含媒體內容的嘟文
+    keep_media_hint: 不會刪除您包含媒體內容之嘟文
     keep_pinned: 保留釘選嘟文
     keep_pinned_hint: 不會刪除您的釘選嘟文
     keep_polls: 保留投票
@@ -1501,7 +1508,7 @@ zh-TW:
       '2629746': 1 個月
       '31556952': 1 年
       '5259492': 2 個月
-      '604800': 一週
+      '604800': 1 週
       '63113904': 2 年
       '7889238': 3 個月
     min_age_label: 保存期限
diff --git a/config/puma.rb b/config/puma.rb
index 224be7903..e59295445 100644
--- a/config/puma.rb
+++ b/config/puma.rb
@@ -1,7 +1,8 @@
 persistent_timeout ENV.fetch('PERSISTENT_TIMEOUT') { 20 }.to_i
 
-threads_count = ENV.fetch('MAX_THREADS') { 5 }.to_i
-threads threads_count, threads_count
+max_threads_count = ENV.fetch('MAX_THREADS') { 5 }.to_i
+min_threads_count = ENV.fetch('MIN_THREADS') { max_threads_count }.to_i
+threads min_threads_count, max_threads_count
 
 if ENV['SOCKET']
   bind "unix://#{ENV['SOCKET']}"
@@ -10,7 +11,7 @@ else
 end
 
 environment ENV.fetch('RAILS_ENV') { 'development' }
-workers     ENV.fetch('WEB_CONCURRENCY') { 2 }
+workers     ENV.fetch('WEB_CONCURRENCY') { 2 }.to_i
 
 preload_app!
 
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
index 05c5b28c8..b8739aab3 100644
--- a/config/sidekiq.yml
+++ b/config/sidekiq.yml
@@ -1,5 +1,5 @@
 ---
-:concurrency: 5
+:concurrency: <%= ENV.fetch('SIDEKIQ_CONCURRENCY', 5) %>
 :queues:
   - [default, 8]
   - [push, 6]
diff --git a/config/webpack/generateLocalePacks.js b/config/webpack/generateLocalePacks.js
index 09fba4a18..b1b818159 100644
--- a/config/webpack/generateLocalePacks.js
+++ b/config/webpack/generateLocalePacks.js
@@ -20,18 +20,25 @@ module.exports = Object.keys(flavours).reduce(function (map, entry) {
   if (!flavour.locales) {
     return map;
   }
-  const locales = readdirSync(flavour.locales).filter(
-    filename => /\.js(?:on)?$/.test(filename) && !/defaultMessages|whitelist|index/.test(filename)
-  );
+  const locales = readdirSync(flavour.locales).filter(filename => {
+    return /\.json$/.test(filename) &&
+      !/defaultMessages/.test(filename) &&
+      !/whitelist/.test(filename);
+  }).map(filename => filename.replace(/\.json$/, ''));
+
+  let inherited_locales_path = null;
+  if (flavour.inherit_locales && flavours[flavour.inherit_locales]?.locales) {
+    inherited_locales_path = flavours[flavour.inherit_locales]?.locales;
+  }
+
   const outPath = resolve('tmp', 'locales', entry);
 
   rimraf.sync(outPath);
   mkdirp.sync(outPath);
 
   locales.forEach(function (locale) {
-    const localeName = locale.replace(/\.js(?:on)?$/, '');
-    const localePath = join(outPath, `${localeName}.js`);
-    const baseLocale = localeName.split('-')[0]; // e.g. 'zh-TW' -> 'zh'
+    const localePath = join(outPath, `${locale}.js`);
+    const baseLocale = locale.split('-')[0]; // e.g. 'zh-TW' -> 'zh'
     const localeDataPath = [
       // first try react-intl
       `node_modules/react-intl/locale-data/${baseLocale}.js`,
@@ -45,21 +52,22 @@ module.exports = Object.keys(flavours).reduce(function (map, entry) {
       filename => filename.replace(/(?:node_modules|app\/javascript)\//, '')
     )[0];
     const localeContent = `//
-// locales/${entry}/${localeName}.js
+// locales/${entry}/${locale}.js
 // automatically generated by generateLocalePacks.js
 //
 
-import messages from '../../../${flavour.locales}/${locale.replace(/\.js$/, '')}';
+${inherited_locales_path ? `import inherited from '../../../${inherited_locales_path}/${locale}.json';` : ''}
+import messages from '../../../${flavour.locales}/${locale}.json';
 import localeData from '${localeDataPath}';
 import { setLocale } from 'locales';
 
 setLocale({
   localeData,
-  messages,
+  ${inherited_locales_path ? 'messages: Object.assign({}, inherited, messages)' : 'messages'},
 });
 `;
     writeFileSync(localePath, localeContent, 'utf8');
-    map[`locales/${entry}/${localeName}`] = localePath;
+    map[`locales/${entry}/${locale}`] = localePath;
   });
 
   return map;
diff --git a/config/webpack/production.js b/config/webpack/production.js
index 79dcebc7c..143a23b99 100644
--- a/config/webpack/production.js
+++ b/config/webpack/production.js
@@ -34,6 +34,12 @@ module.exports = merge(sharedConfig, {
       cache: true,
       test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/,
     }),
+    new CompressionPlugin({
+      filename: '[path][base].br[query]',
+      algorithm: 'brotliCompress',
+      cache: true,
+      test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/,
+    }),
     new BundleAnalyzerPlugin({ // generates report.html
       analyzerMode: 'static',
       openAnalyzer: false,
diff --git a/config/webpack/translationRunner.js b/config/webpack/translationRunner.js
index 38050baf8..c7f84cc7e 100644
--- a/config/webpack/translationRunner.js
+++ b/config/webpack/translationRunner.js
@@ -1,11 +1,12 @@
 const fs = require('fs');
 const path = require('path');
-const { default: manageTranslations } = require('react-intl-translations-manager');
+const { default: manageTranslations, readMessageFiles } = require('react-intl-translations-manager');
 
 const RFC5646_REGEXP = /^[a-z]{2,3}(?:-(?:x|[A-Za-z]{2,4}))*$/;
 
 const rootDirectory = path.resolve(__dirname, '..', '..');
-const translationsDirectory = path.resolve(rootDirectory, 'app', 'javascript', 'mastodon', 'locales');
+const externalDefaultMessages = path.resolve(rootDirectory, 'app', 'javascript', 'mastodon', 'locales', 'defaultMessages.json');
+const translationsDirectory = path.resolve(rootDirectory, 'app', 'javascript', 'flavours', 'glitch', 'locales');
 const messagesDirectory = path.resolve(rootDirectory, 'build', 'messages');
 const availableLanguages = fs.readdirSync(translationsDirectory).reduce((languages, filename) => {
   const basename = path.basename(filename, '.json');
@@ -86,6 +87,25 @@ validateLanguages(languages, [
   !argv.force && testAvailability,
 ].filter(Boolean));
 
+// Override `provideExtractedMessages` to ignore translation strings provided upstream already
+const provideExtractedMessages = () => {
+  const extractedMessages = readMessageFiles(messagesDirectory);
+  const originalExtractedMessages = JSON.parse(fs.readFileSync(externalDefaultMessages, 'utf8'));
+  const originalKeys = new Set();
+
+  originalExtractedMessages.forEach(file => {
+    file.descriptors.forEach(descriptor => {
+      originalKeys.add(descriptor.id)
+    });
+  });
+
+  extractedMessages.forEach(file => {
+    file.descriptors = file.descriptors.filter((descriptor) => !originalKeys.has(descriptor.id));
+  });
+
+  return extractedMessages.filter((file) => file.descriptors.length > 0);
+};
+
 // manage translations
 manageTranslations({
   messagesDirectory,
@@ -96,4 +116,7 @@ manageTranslations({
   jsonOptions: {
     trailingNewline: true,
   },
+  overrideCoreMethods: {
+    provideExtractedMessages,
+  },
 });
diff --git a/crowdin-glitch.yml b/crowdin-glitch.yml
new file mode 100644
index 000000000..14b559c8f
--- /dev/null
+++ b/crowdin-glitch.yml
@@ -0,0 +1,8 @@
+commit_message: '[ci skip]'
+files:
+  - source: /app/javascript/flavours/glitch/locales/en.json
+    translation: /app/javascript/flavours/glitch/locales/%two_letters_code%.json
+  - source: /config/locales-glitch/en.yml
+    translation: /config/locales-glitch/%two_letters_code%.yml
+  - source: /config/locales-glitch/simple_form.en.yml
+    translation: /config/locales-glitch/simple_form.%two_letters_code%.yml
diff --git a/lib/assets/wordmark.dark.css b/lib/assets/wordmark.dark.css
index d87069178..db3355f59 100644
--- a/lib/assets/wordmark.dark.css
+++ b/lib/assets/wordmark.dark.css
@@ -1 +1 @@
-// Not needed
+/* Not needed */
diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb
index 77cbef84e..34afbc699 100644
--- a/lib/mastodon/accounts_cli.rb
+++ b/lib/mastodon/accounts_cli.rb
@@ -200,21 +200,44 @@ module Mastodon
       end
     end
 
-    desc 'delete USERNAME', 'Delete a user'
+    option :email
+    option :dry_run, type: :boolean
+    desc 'delete [USERNAME]', 'Delete a user'
     long_desc <<-LONG_DESC
       Remove a user account with a given USERNAME.
-    LONG_DESC
-    def delete(username)
-      account = Account.find_local(username)
 
-      if account.nil?
-        say('No user with such username', :red)
+      With the --email option, the user is selected based on email
+      rather than username.
+    LONG_DESC
+    def delete(username = nil)
+      if username.present? && options[:email].present?
+        say('Use username or --email, not both', :red)
+        exit(1)
+      elsif username.blank? && options[:email].blank?
+        say('No username provided', :red)
         exit(1)
       end
 
-      say("Deleting user with #{account.statuses_count} statuses, this might take a while...")
-      DeleteAccountService.new.call(account, reserve_email: false)
-      say('OK', :green)
+      dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
+      account = nil
+
+      if username.present?
+        account = Account.find_local(username)
+        if account.nil?
+          say('No user with such username', :red)
+          exit(1)
+        end
+      else
+        account = Account.left_joins(:user).find_by(user: { email: options[:email] })
+        if account.nil?
+          say('No user with such email', :red)
+          exit(1)
+        end
+      end
+
+      say("Deleting user with #{account.statuses_count} statuses, this might take a while...#{dry_run}")
+      DeleteAccountService.new.call(account, reserve_email: false) unless options[:dry_run]
+      say("OK#{dry_run}", :green)
     end
 
     option :force, type: :boolean, aliases: [:f], description: 'Override public key check'
@@ -530,6 +553,116 @@ module Mastodon
       end
     end
 
+    option :concurrency, type: :numeric, default: 5, aliases: [:c]
+    option :dry_run, type: :boolean
+    desc 'prune', 'Prune remote accounts that never interacted with local users'
+    long_desc <<-LONG_DESC
+      Prune remote account that
+      - follows no local accounts
+      - is not followed by any local accounts
+      - has no statuses on local
+      - has not been mentioned
+      - has not been favourited local posts
+      - not muted/blocked by us
+    LONG_DESC
+    def prune
+      dry_run = options[:dry_run] ? ' (dry run)' : ''
+
+      query = Account.remote.where.not(actor_type: %i(Application Service))
+      query = query.where('NOT EXISTS (SELECT 1 FROM mentions WHERE account_id = accounts.id)')
+      query = query.where('NOT EXISTS (SELECT 1 FROM favourites WHERE account_id = accounts.id)')
+      query = query.where('NOT EXISTS (SELECT 1 FROM statuses WHERE account_id = accounts.id)')
+      query = query.where('NOT EXISTS (SELECT 1 FROM follows WHERE account_id = accounts.id OR target_account_id = accounts.id)')
+      query = query.where('NOT EXISTS (SELECT 1 FROM blocks WHERE account_id = accounts.id OR target_account_id = accounts.id)')
+      query = query.where('NOT EXISTS (SELECT 1 FROM mutes WHERE target_account_id = accounts.id)')
+      query = query.where('NOT EXISTS (SELECT 1 FROM reports WHERE target_account_id = accounts.id)')
+      query = query.where('NOT EXISTS (SELECT 1 FROM follow_requests WHERE account_id = accounts.id OR target_account_id = accounts.id)')
+
+      _, deleted = parallelize_with_progress(query) do |account|
+        next if account.bot? || account.group?
+        next if account.suspended?
+        next if account.silenced?
+
+        account.destroy unless options[:dry_run]
+        1
+      end
+
+      say("OK, pruned #{deleted} accounts#{dry_run}", :green)
+    end
+
+    option :force, type: :boolean
+    option :replay, type: :boolean
+    option :target
+    desc 'migrate USERNAME', 'Migrate a local user to another account'
+    long_desc <<~LONG_DESC
+      With --replay, replay the last migration of the specified account, in
+      case some remote server may not have properly processed the associated
+      `Move` activity.
+
+      With --target, specify another account to migrate to.
+
+      With --force, perform the migration even if the selected account
+      redirects to a different account that the one specified.
+    LONG_DESC
+    def migrate(username)
+      if options[:replay].present? && options[:target].present?
+        say('Use --replay or --target, not both', :red)
+        exit(1)
+      end
+
+      if options[:replay].blank? && options[:target].blank?
+        say('Use either --replay or --target', :red)
+        exit(1)
+      end
+
+      account = Account.find_local(username)
+
+      if account.nil?
+        say("No such account: #{username}", :red)
+        exit(1)
+      end
+
+      migration = nil
+
+      if options[:replay]
+        migration = account.migrations.last
+        if migration.nil?
+          say('The specified account has not performed any migration', :red)
+          exit(1)
+        end
+
+        unless options[:force] || migration.target_acount_id == account.moved_to_account_id
+          say('The specified account is not redirecting to its last migration target. Use --force if you want to replay the migration anyway', :red)
+          exit(1)
+        end
+      end
+
+      if options[:target]
+        target_account = ResolveAccountService.new.call(options[:target])
+
+        if target_account.nil?
+          say("The specified target account could not be found: #{options[:target]}", :red)
+          exit(1)
+        end
+
+        unless options[:force] || account.moved_to_account_id.nil? || account.moved_to_account_id == target_account.id
+          say('The specified account is redirecting to a different target account. Use --force if you want to change the migration target', :red)
+          exit(1)
+        end
+
+        begin
+          migration = account.migrations.create!(acct: target_account.acct)
+        rescue ActiveRecord::RecordInvalid => e
+          say("Error: #{e.message}", :red)
+          exit(1)
+        end
+      end
+
+      MoveService.new.call(migration)
+
+      say("OK, migrated #{account.acct} to #{migration.target_account.acct}", :green)
+    end
+
     private
 
     def rotate_keys_for_account(account, delay = 0)
diff --git a/lib/mastodon/domains_cli.rb b/lib/mastodon/domains_cli.rb
index a7c78c4a7..77364ffbb 100644
--- a/lib/mastodon/domains_cli.rb
+++ b/lib/mastodon/domains_cli.rb
@@ -97,7 +97,7 @@ module Mastodon
       failed          = Concurrent::AtomicFixnum.new(0)
       start_at        = Time.now.to_f
       seed            = start ? [start] : Instance.pluck(:domain)
-      blocked_domains = Regexp.new('\\.?' + DomainBlock.where(severity: 1).pluck(:domain).join('|') + '$')
+      blocked_domains = /\.?(#{DomainBlock.where(severity: 1).pluck(:domain).map { |domain| Regexp.escape(domain) }.join('|')})$/
       progress        = create_progress_bar
 
       pool = Concurrent::ThreadPoolExecutor.new(min_threads: 0, max_threads: options[:concurrency], idletime: 10, auto_terminate: true, max_queue: 0)
diff --git a/lib/mastodon/media_cli.rb b/lib/mastodon/media_cli.rb
index bba4a1bd7..24cc98964 100644
--- a/lib/mastodon/media_cli.rb
+++ b/lib/mastodon/media_cli.rb
@@ -14,35 +14,78 @@ module Mastodon
     end
 
     option :days, type: :numeric, default: 7, aliases: [:d]
+    option :prune_profiles, type: :boolean, default: false
+    option :remove_headers, type: :boolean, default: false
+    option :include_follows, type: :boolean, default: false
     option :concurrency, type: :numeric, default: 5, aliases: [:c]
-    option :verbose, type: :boolean, default: false, aliases: [:v]
     option :dry_run, type: :boolean, default: false
-    desc 'remove', 'Remove remote media files'
+    desc 'remove', 'Remove remote media files, headers or avatars'
     long_desc <<-DESC
-      Removes locally cached copies of media attachments from other servers.
-
+      Removes locally cached copies of media attachments (and optionally profile
+      headers and avatars) from other servers. By default, only media attachements
+      are removed.
       The --days option specifies how old media attachments have to be before
-      they are removed. It defaults to 7 days.
+      they are removed. In case of avatars and headers, it specifies how old
+      the last webfinger request and update to the user has to be before they
+      are pruned. It defaults to 7 days.
+      If --prune-profiles is specified, only avatars and headers are removed.
+      If --remove-headers is specified, only headers are removed.
+      If --include-follows is specified along with --prune-profiles or
+      --remove-headers, all non-local profiles will be pruned irrespective of
+      follow status. By default, only accounts that are not followed by or
+      following anyone locally are pruned.
     DESC
+    # rubocop:disable Metrics/PerceivedComplexity
     def remove
-      time_ago = options[:days].days.ago
-      dry_run  = options[:dry_run] ? '(DRY RUN)' : ''
+      if options[:prune_profiles] && options[:remove_headers]
+        say('--prune-profiles and --remove-headers should not be specified simultaneously', :red, true)
+        exit(1)
+      end
+      if options[:include_follows] && !(options[:prune_profiles] || options[:remove_headers])
+        say('--include-follows can only be used with --prune-profiles or --remove-headers', :red, true)
+        exit(1)
+      end
+      time_ago        = options[:days].days.ago
+      dry_run         = options[:dry_run] ? ' (DRY RUN)' : ''
 
-      processed, aggregate = parallelize_with_progress(MediaAttachment.cached.where.not(remote_url: '').where('created_at < ?', time_ago)) do |media_attachment|
-        next if media_attachment.file.blank?
+      if options[:prune_profiles] || options[:remove_headers]
+        processed, aggregate = parallelize_with_progress(Account.remote.where({ last_webfingered_at: ..time_ago, updated_at: ..time_ago })) do |account|
+          next if !options[:include_follows] && Follow.where(account: account).or(Follow.where(target_account: account)).exists?
+          next if account.avatar.blank? && account.header.blank?
+          next if options[:remove_headers] && account.header.blank?
 
-        size = (media_attachment.file_file_size || 0) + (media_attachment.thumbnail_file_size || 0)
+          size = (account.header_file_size || 0)
+          size += (account.avatar_file_size || 0) if options[:prune_profiles]
 
-        unless options[:dry_run]
-          media_attachment.file.destroy
-          media_attachment.thumbnail.destroy
-          media_attachment.save
+          unless options[:dry_run]
+            account.header.destroy
+            account.avatar.destroy if options[:prune_profiles]
+            account.save!
+          end
+
+          size
         end
 
-        size
+        say("Visited #{processed} accounts and removed profile media totaling #{number_to_human_size(aggregate)}#{dry_run}", :green, true)
       end
 
-      say("Removed #{processed} media attachments (approx. #{number_to_human_size(aggregate)}) #{dry_run}", :green, true)
+      unless options[:prune_profiles] || options[:remove_headers]
+        processed, aggregate = parallelize_with_progress(MediaAttachment.cached.where.not(remote_url: '').where(created_at: ..time_ago)) do |media_attachment|
+          next if media_attachment.file.blank?
+
+          size = (media_attachment.file_file_size || 0) + (media_attachment.thumbnail_file_size || 0)
+
+          unless options[:dry_run]
+            media_attachment.file.destroy
+            media_attachment.thumbnail.destroy
+            media_attachment.save
+          end
+
+          size
+        end
+
+        say("Removed #{processed} media attachments (approx. #{number_to_human_size(aggregate)})#{dry_run}", :green, true)
+      end
     end
 
     option :start_after
@@ -183,6 +226,7 @@ module Mastodon
 
       say("Removed #{removed} orphans (approx. #{number_to_human_size(reclaimed_bytes)})#{dry_run}", :green, true)
     end
+    # rubocop:enable Metrics/PerceivedComplexity
 
     option :account, type: :string
     option :domain, type: :string
@@ -269,7 +313,7 @@ module Mastodon
     def lookup(url)
       path = Addressable::URI.parse(url).path
 
-      path_segments = path.split('/')[2..-1]
+      path_segments = path.split('/')[2..]
       path_segments.delete('cache')
 
       unless [7, 10].include?(path_segments.size)
diff --git a/lib/sanitize_ext/sanitize_config.rb b/lib/sanitize_ext/sanitize_config.rb
index 27e1eb92f..55eb17097 100644
--- a/lib/sanitize_ext/sanitize_config.rb
+++ b/lib/sanitize_ext/sanitize_config.rb
@@ -69,7 +69,7 @@ class Sanitize
         end
       end
 
-      current_node.replace(current_node.text) unless LINK_PROTOCOLS.include?(scheme)
+      current_node.replace(Nokogiri::XML::Text.new(current_node.text, current_node.document)) unless LINK_PROTOCOLS.include?(scheme)
     end
 
     MASTODON_STRICT ||= freeze_config(
diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake
index c1e5bd2b4..32040feec 100644
--- a/lib/tasks/mastodon.rake
+++ b/lib/tasks/mastodon.rake
@@ -194,7 +194,7 @@ namespace :mastodon do
 
           env['S3_HOSTNAME'] = prompt.ask('S3 hostname:') do |q|
             q.required true
-            q.default 's3-us-east-1.amazonaws.com'
+            q.default 's3.us-east-1.amazonaws.com'
             q.modify :strip
           end
 
@@ -395,18 +395,11 @@ namespace :mastodon do
         incompatible_syntax = false
 
         env_contents = env.each_pair.map do |key, value|
-          if value.is_a?(String) && value =~ /[\s\#\\"]/
-            incompatible_syntax = true
+          value = value.to_s
+          escaped = dotenv_escape(value)
+          incompatible_syntax = true if value != escaped
 
-            if value =~ /[']/
-              value = value.to_s.gsub(/[\\"\$]/) { |x| "\\#{x}" }
-              "#{key}=\"#{value}\""
-            else
-              "#{key}='#{value}'"
-            end
-          else
-            "#{key}=#{value}"
-          end
+          "#{key}=#{escaped}"
         end.join("\n")
 
         generated_header = "# Generated with mastodon:setup on #{Time.now.utc}\n\n".dup
@@ -519,3 +512,49 @@ def disable_log_stdout!
   HttpLog.configuration.logger = dev_null
   Paperclip.options[:log]      = false
 end
+
+def dotenv_escape(value)
+  # Dotenv has its own parser, which unfortunately deviates somewhat from
+  # what shells actually do.
+  #
+  # In particular, we can't use Shellwords::escape because it outputs a
+  # non-quotable string, while Dotenv requires `#` to always be in quoted
+  # strings.
+  #
+  # Therefore, we need to write our own escape code…
+  # Dotenv's parser has a *lot* of edge cases, and I think not every
+  # ASCII string can even be represented into something Dotenv can parse,
+  # so this is a best effort thing.
+  #
+  # In particular, strings with all the following probably cannot be
+  # escaped:
+  # - `#`, or ends with spaces, which requires some form of quoting (simply escaping won't work)
+  # - `'` (single quote), preventing us from single-quoting
+  # - `\` followed by either `r` or `n`
+
+  # No character that would cause Dotenv trouble
+  return value unless /[\s\#\\"'$]/.match?(value)
+
+  # As long as the value doesn't include single quotes, we can safely
+  # rely on single quotes
+  return "'#{value}'" unless /[']/.match?(value)
+
+  # If the value contains the string '\n' or '\r' we simply can't use
+  # a double-quoted string, because Dotenv will expand \n or \r no
+  # matter how much escaping we add.
+  double_quoting_disallowed = /\\[rn]/.match?(value)
+
+  value = value.gsub(double_quoting_disallowed ? /[\\"'\s]/ : /[\\"']/) { |x| "\\#{x}" }
+
+  # Dotenv is especially tricky with `$` as unbalanced
+  # parenthesis will make it not unescape `\$` as `$`…
+
+  # Variables
+  value = value.gsub(/\$(?!\()/) { |x| "\\#{x}" }
+  # Commands
+  value = value.gsub(/\$(?<cmd>\((?:[^()]|\g<cmd>)+\))/) { |x| "\\#{x}" }
+
+  value = "\"#{value}\"" unless double_quoting_disallowed
+
+  value
+end
diff --git a/package.json b/package.json
index 98c1050a1..8eb7e1d66 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,7 @@
     "test": "${npm_execpath} run test:lint:js && ${npm_execpath} run test:jest",
     "test:lint": "${npm_execpath} run test:lint:js && ${npm_execpath} run test:lint:sass",
     "test:lint:js": "eslint --ext=js . --cache",
-    "test:lint:sass": "stylelint '**/*.scss'",
+    "test:lint:sass": "stylelint \"**/*.{css,scss}\"",
     "test:jest": "cross-env NODE_ENV=test jest",
     "format": "prettier --write \"**/*.{json,yml}\"",
     "format-check": "prettier --check \"**/*.{json,yml}\""
@@ -24,13 +24,13 @@
   },
   "private": true,
   "dependencies": {
-    "@babel/core": "^7.20.5",
-    "@babel/plugin-proposal-decorators": "^7.20.5",
+    "@babel/core": "^7.20.12",
+    "@babel/plugin-proposal-decorators": "^7.20.7",
     "@babel/plugin-transform-react-inline-elements": "^7.18.6",
     "@babel/plugin-transform-runtime": "^7.19.6",
     "@babel/preset-env": "^7.20.2",
     "@babel/preset-react": "^7.18.6",
-    "@babel/runtime": "^7.20.6",
+    "@babel/runtime": "^7.20.7",
     "@gamestdio/websocket": "^0.3.2",
     "@github/webauthn-json": "^0.5.7",
     "@rails/ujs": "^6.1.7",
@@ -40,7 +40,7 @@
     "arrow-key-navigation": "^1.2.0",
     "atrament": "0.2.4",
     "autoprefixer": "^9.8.8",
-    "axios": "^1.2.1",
+    "axios": "^1.2.2",
     "babel-loader": "^8.3.0",
     "babel-plugin-lodash": "^3.3.4",
     "babel-plugin-preval": "^5.1.0",
@@ -68,7 +68,7 @@
     "glob": "^8.0.3",
     "history": "^4.10.1",
     "http-link-header": "^1.1.0",
-    "immutable": "^4.1.0",
+    "immutable": "^4.2.2",
     "imports-loader": "^1.2.0",
     "intersection-observer": "^0.12.2",
     "intl": "^1.2.5",
@@ -76,7 +76,7 @@
     "intl-relativeformat": "^6.4.3",
     "is-nan": "^1.3.2",
     "js-yaml": "^4.1.0",
-    "jsdom": "^20.0.3",
+    "jsdom": "^21.0.0",
     "lodash": "^4.17.21",
     "mark-loader": "^0.1.6",
     "marky": "^1.2.5",
@@ -84,13 +84,11 @@
     "mkdirp": "^1.0.4",
     "npmlog": "^7.0.1",
     "object-assign": "^4.1.1",
-    "object-fit-images": "^3.2.3",
     "object.values": "^1.1.6",
     "path-complete-extname": "^1.0.0",
     "pg": "^8.5.0",
-    "postcss": "^8.4.19",
+    "postcss": "^8.4.21",
     "postcss-loader": "^3.0.0",
-    "postcss-object-fit-images": "^1.1.2",
     "promise.prototype.finally": "^3.1.4",
     "prop-types": "^15.8.1",
     "punycode": "^2.1.0",
@@ -103,7 +101,7 @@
     "react-intl": "^2.9.0",
     "react-motion": "^0.5.2",
     "react-notification": "^6.8.5",
-    "react-overlays": "^0.9.3",
+    "react-overlays": "^5.2.1",
     "react-redux": "^7.2.9",
     "react-redux-loading-bar": "^5.0.4",
     "react-router-dom": "^4.1.1",
@@ -121,7 +119,7 @@
     "requestidlecallback": "^0.3.0",
     "reselect": "^4.1.7",
     "rimraf": "^3.0.2",
-    "sass": "^1.56.1",
+    "sass": "^1.57.1",
     "sass-loader": "^10.2.0",
     "stacktrace-js": "^2.0.2",
     "stringz": "^2.1.0",
@@ -144,7 +142,7 @@
     "workbox-strategies": "^6.5.4",
     "workbox-webpack-plugin": "^6.5.4",
     "workbox-window": "^6.5.4",
-    "ws": "^8.10.0"
+    "ws": "^8.12.0"
   },
   "devDependencies": {
     "@babel/eslint-parser": "^7.19.1",
@@ -159,12 +157,12 @@
     "jest": "^29.3.1",
     "jest-environment-jsdom": "^29.3.1",
     "postcss-scss": "^4.0.6",
-    "prettier": "^2.8.0",
+    "prettier": "^2.8.2",
     "raf": "^3.4.1",
     "react-intl-translations-manager": "^5.0.3",
     "react-test-renderer": "^16.14.0",
-    "stylelint": "^14.14.0",
-    "stylelint-config-standard-scss": "^5.0.0",
+    "stylelint": "^14.16.1",
+    "stylelint-config-standard-scss": "^6.1.0",
     "webpack-dev-server": "^3.11.3",
     "yargs": "^17.6.2"
   },
@@ -173,6 +171,6 @@
   },
   "optionalDependencies": {
     "bufferutil": "^4.0.7",
-    "utf-8-validate": "^5.0.10"
+    "utf-8-validate": "^6.0.0"
   }
 }
diff --git a/postcss.config.js b/postcss.config.js
index 1c820c318..e7749a219 100644
--- a/postcss.config.js
+++ b/postcss.config.js
@@ -1,7 +1,6 @@
 module.exports = ({ env }) => ({
   plugins: {
     autoprefixer: {},
-    'postcss-object-fit-images': {},
     cssnano: env === 'production' ? {} : false,
   },
 });
diff --git a/public/embed.js b/public/embed.js
index 5607c24d5..defba403e 100644
--- a/public/embed.js
+++ b/public/embed.js
@@ -1,24 +1,28 @@
 // @ts-check
 
-(function() {
+(function () {
   'use strict';
 
   /**
    * @param {() => void} loaded
    */
-  var ready = function(loaded) {
-    if (['interactive', 'complete'].indexOf(document.readyState) !== -1) {
+  var ready = function (loaded) {
+    if (document.readyState === 'complete') {
       loaded();
     } else {
-      document.addEventListener('DOMContentLoaded', loaded);
+      document.addEventListener('readystatechange', function () {
+        if (document.readyState === 'complete') {
+          loaded();
+        }
+      });
     }
   };
 
-  ready(function() {
+  ready(function () {
     /** @type {Map<number, HTMLIFrameElement>} */
     var iframes = new Map();
 
-    window.addEventListener('message', function(e) {
+    window.addEventListener('message', function (e) {
       var data = e.data || {};
 
       if (typeof data !== 'object' || data.type !== 'setHeight' || !iframes.has(data.id)) {
@@ -34,7 +38,7 @@
       iframe.height = data.height;
     });
 
-    [].forEach.call(document.querySelectorAll('iframe.mastodon-embed'), function(iframe) {
+    [].forEach.call(document.querySelectorAll('iframe.mastodon-embed'), function (iframe) {
       // select unique id for each iframe
       var id = 0, failCount = 0, idBuffer = new Uint32Array(1);
       while (id === 0 || iframes.has(id)) {
@@ -49,10 +53,10 @@
 
       iframes.set(id, iframe);
 
-      iframe.scrolling      = 'no';
+      iframe.scrolling = 'no';
       iframe.style.overflow = 'hidden';
 
-      iframe.onload = function() {
+      iframe.onload = function () {
         iframe.contentWindow.postMessage({
           type: 'setHeight',
           id: id,
diff --git a/public/inert.css b/public/inert.css
index 275fad2e6..54e10616d 100644
--- a/public/inert.css
+++ b/public/inert.css
@@ -3,7 +3,8 @@
   cursor: default;
 }
 
-[inert], [inert] * {
+[inert],
+[inert] * {
   user-select: none;
   -webkit-user-select: none;
   -moz-user-select: none;
diff --git a/spec/controllers/admin/domain_blocks_controller_spec.rb b/spec/controllers/admin/domain_blocks_controller_spec.rb
index 98cda5004..f432060d9 100644
--- a/spec/controllers/admin/domain_blocks_controller_spec.rb
+++ b/spec/controllers/admin/domain_blocks_controller_spec.rb
@@ -70,6 +70,53 @@ RSpec.describe Admin::DomainBlocksController, type: :controller do
     end
   end
 
+  describe 'PUT #update' do
+    let!(:remote_account) { Fabricate(:account, domain: 'example.com') }
+    let(:domain_block)    { Fabricate(:domain_block, domain: 'example.com', severity: original_severity) }
+
+    before do
+      BlockDomainService.new.call(domain_block)
+    end
+
+    let(:subject) do
+      post :update, params: { id: domain_block.id, domain_block: { domain: 'example.com', severity: new_severity } }
+    end
+
+    context 'downgrading a domain suspension to silence' do
+      let(:original_severity) { 'suspend' }
+      let(:new_severity)      { 'silence' }
+
+      it 'changes the block severity' do
+        expect { subject }.to change { domain_block.reload.severity }.from('suspend').to('silence')
+      end
+
+      it 'undoes individual suspensions' do
+        expect { subject }.to change { remote_account.reload.suspended? }.from(true).to(false)
+      end
+
+      it 'performs individual silences' do
+        expect { subject }.to change { remote_account.reload.silenced? }.from(false).to(true)
+      end
+    end
+
+    context 'upgrading a domain silence to suspend' do
+      let(:original_severity) { 'silence' }
+      let(:new_severity)      { 'suspend' }
+
+      it 'changes the block severity' do
+        expect { subject }.to change { domain_block.reload.severity }.from('silence').to('suspend')
+      end
+
+      it 'undoes individual silences' do
+        expect { subject }.to change { remote_account.reload.silenced? }.from(true).to(false)
+      end
+
+      it 'performs individual suspends' do
+        expect { subject }.to change { remote_account.reload.suspended? }.from(false).to(true)
+      end
+    end
+  end
+
   describe 'DELETE #destroy' do
     it 'unblocks the domain' do
       service = double(call: true)
diff --git a/spec/controllers/admin/reports/actions_controller_spec.rb b/spec/controllers/admin/reports/actions_controller_spec.rb
new file mode 100644
index 000000000..6609798dc
--- /dev/null
+++ b/spec/controllers/admin/reports/actions_controller_spec.rb
@@ -0,0 +1,42 @@
+require 'rails_helper'
+
+describe Admin::Reports::ActionsController do
+  render_views
+
+  let(:user) { Fabricate(:user, role: UserRole.find_by(name: 'Admin')) }
+  let(:account) { Fabricate(:account) }
+  let!(:status) { Fabricate(:status, account: account) }
+  let(:media_attached_status) { Fabricate(:status, account: account) }
+  let!(:media_attachment) { Fabricate(:media_attachment, account: account, status: media_attached_status) }
+  let(:media_attached_deleted_status) { Fabricate(:status, account: account, deleted_at: 1.day.ago) }
+  let!(:media_attachment2) { Fabricate(:media_attachment, account: account, status: media_attached_deleted_status) }
+  let(:last_media_attached_status) { Fabricate(:status, account: account) }
+  let!(:last_media_attachment) { Fabricate(:media_attachment, account: account, status: last_media_attached_status) }
+  let!(:last_status) { Fabricate(:status, account: account) }
+
+  before do
+    sign_in user, scope: :user
+  end
+
+  describe 'POST #create' do
+    let(:report) { Fabricate(:report, status_ids: status_ids, account: user.account, target_account: account) }
+    let(:status_ids) { [media_attached_status.id, media_attached_deleted_status.id] }
+
+    before do
+      post :create, params: { report_id: report.id, action => '' }
+    end
+
+    context 'when action is mark_as_sensitive' do
+
+      let(:action) { 'mark_as_sensitive' }
+
+      it 'resolves the report' do
+        expect(report.reload.action_taken_at).to_not be_nil
+      end
+
+      it 'marks the non-deleted as sensitive' do
+        expect(media_attached_status.reload.sensitive).to eq true
+      end
+    end
+  end
+end
diff --git a/spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb b/spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb
index f12285b2a..606def602 100644
--- a/spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb
+++ b/spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb
@@ -71,6 +71,53 @@ RSpec.describe Api::V1::Admin::DomainBlocksController, type: :controller do
     end
   end
 
+  describe 'PUT #update' do
+    let!(:remote_account) { Fabricate(:account, domain: 'example.com') }
+    let(:domain_block)    { Fabricate(:domain_block, domain: 'example.com', severity: original_severity) }
+
+    before do
+      BlockDomainService.new.call(domain_block)
+    end
+
+    let(:subject) do
+      post :update, params: { id: domain_block.id, domain: 'example.com', severity: new_severity }
+    end
+
+    context 'downgrading a domain suspension to silence' do
+      let(:original_severity) { 'suspend' }
+      let(:new_severity)      { 'silence' }
+
+      it 'changes the block severity' do
+        expect { subject }.to change { domain_block.reload.severity }.from('suspend').to('silence')
+      end
+
+      it 'undoes individual suspensions' do
+        expect { subject }.to change { remote_account.reload.suspended? }.from(true).to(false)
+      end
+
+      it 'performs individual silences' do
+        expect { subject }.to change { remote_account.reload.silenced? }.from(false).to(true)
+      end
+    end
+
+    context 'upgrading a domain silence to suspend' do
+      let(:original_severity) { 'silence' }
+      let(:new_severity)      { 'suspend' }
+
+      it 'changes the block severity' do
+        expect { subject }.to change { domain_block.reload.severity }.from('silence').to('suspend')
+      end
+
+      it 'undoes individual silences' do
+        expect { subject }.to change { remote_account.reload.silenced? }.from(true).to(false)
+      end
+
+      it 'performs individual suspends' do
+        expect { subject }.to change { remote_account.reload.suspended? }.from(false).to(true)
+      end
+    end
+  end
+
   describe 'DELETE #destroy' do
     let!(:block) { Fabricate(:domain_block) }
 
diff --git a/spec/controllers/auth/passwords_controller_spec.rb b/spec/controllers/auth/passwords_controller_spec.rb
index dcfdebb17..1c6874f08 100644
--- a/spec/controllers/auth/passwords_controller_spec.rb
+++ b/spec/controllers/auth/passwords_controller_spec.rb
@@ -35,4 +35,65 @@ describe Auth::PasswordsController, type: :controller do
       end
     end
   end
+
+  describe 'POST #update' do
+    let(:user) { Fabricate(:user) }
+
+    before do
+      @password = 'reset0password'
+      request.env['devise.mapping'] = Devise.mappings[:user]
+    end
+
+    context 'with valid reset_password_token' do
+      let!(:session_activation) { Fabricate(:session_activation, user: user) }
+      let!(:access_token) { Fabricate(:access_token, resource_owner_id: user.id) }
+      let!(:web_push_subscription) { Fabricate(:web_push_subscription, access_token: access_token) }
+
+      before do
+        @token = user.send_reset_password_instructions
+
+        post :update, params: { user: { password: @password, password_confirmation: @password, reset_password_token: @token } }
+      end
+
+      it 'redirect to sign in' do
+        expect(response).to redirect_to '/auth/sign_in'
+      end
+
+      it 'changes password' do
+        this_user = User.find(user.id)
+
+        expect(this_user).to_not be_nil
+        expect(this_user.valid_password?(@password)).to be true
+      end
+
+      it 'deactivates all sessions' do
+        expect(user.session_activations.count).to eq 0
+      end
+
+      it 'revokes all access tokens' do
+        expect(Doorkeeper::AccessToken.active_for(user).count).to eq 0
+      end
+
+      it 'removes push subscriptions' do
+        expect(Web::PushSubscription.where(user: user).or(Web::PushSubscription.where(access_token: access_token)).count).to eq 0
+      end
+    end
+
+    context 'with invalid reset_password_token' do
+      before do
+        post :update, params: { user: { password: @password, password_confirmation: @password, reset_password_token: 'some_invalid_value' } }
+      end
+
+      it 'renders reset password' do
+        expect(response).to render_template(:new)
+      end
+
+      it 'retains password' do
+        this_user = User.find(user.id)
+
+        expect(this_user).to_not be_nil
+        expect(this_user.external_or_valid_password?(user.password)).to be true
+      end
+    end
+  end
 end
diff --git a/spec/controllers/well_known/nodeinfo_controller_spec.rb b/spec/controllers/well_known/nodeinfo_controller_spec.rb
index 694bb0fb9..36e85f20d 100644
--- a/spec/controllers/well_known/nodeinfo_controller_spec.rb
+++ b/spec/controllers/well_known/nodeinfo_controller_spec.rb
@@ -27,6 +27,8 @@ describe WellKnown::NodeInfoController, type: :controller do
 
       json = body_as_json
 
+      expect({ "foo" => 0 }).not_to match_json_schema("nodeinfo_2.0")
+      expect(json).to match_json_schema("nodeinfo_2.0")
       expect(json[:version]).to eq '2.0'
       expect(json[:usage]).to be_a Hash
       expect(json[:software]).to be_a Hash
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index 20ee32aa0..1dbd985bf 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -113,7 +113,7 @@ describe ApplicationHelper do
       Setting.site_title = site_title
     end
 
-    it 'returns site title on production enviroment' do
+    it 'returns site title on production environment' do
       Setting.site_title = 'site title'
       expect(Rails.env).to receive(:production?).and_return(true)
       expect(helper.title).to eq 'site title'
diff --git a/spec/helpers/formatting_helper_spec.rb b/spec/helpers/formatting_helper_spec.rb
new file mode 100644
index 000000000..af604a87b
--- /dev/null
+++ b/spec/helpers/formatting_helper_spec.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe FormattingHelper, type: :helper do
+  include Devise::Test::ControllerHelpers
+
+  describe '#rss_status_content_format' do
+    let(:status) { Fabricate(:status, text: 'Hello world<>', spoiler_text: 'This is a spoiler<>', poll: Fabricate(:poll, options: %w(Yes<> No))) }
+    let(:html) { helper.rss_status_content_format(status) }
+
+    it 'renders the spoiler text' do
+      expect(html).to include('<p>This is a spoiler&lt;&gt;</p><hr>')
+    end
+
+    it 'renders the status text' do
+      expect(html).to include('<p>Hello world&lt;&gt;</p>')
+    end
+
+    it 'renders the poll' do
+      expect(html).to include('<radio disabled="disabled">Yes&lt;&gt;</radio><br>')
+    end
+  end
+end
diff --git a/spec/lib/feed_manager_spec.rb b/spec/lib/feed_manager_spec.rb
index 2b11ddf70..f2ab2570d 100644
--- a/spec/lib/feed_manager_spec.rb
+++ b/spec/lib/feed_manager_spec.rb
@@ -39,6 +39,18 @@ RSpec.describe FeedManager do
         expect(FeedManager.instance.filter?(:home, reblog, bob)).to be false
       end
 
+      it 'returns true for post from account who blocked me' do
+        status = Fabricate(:status, text: 'Hello, World', account: alice)
+        alice.block!(bob)
+        expect(FeedManager.instance.filter?(:home, status, bob)).to be true
+      end
+
+      it 'returns true for post from blocked account' do
+        status = Fabricate(:status, text: 'Hello, World', account: alice)
+        bob.block!(alice)
+        expect(FeedManager.instance.filter?(:home, status, bob)).to be true
+      end
+
       it 'returns true for reblog by followee of blocked account' do
         status = Fabricate(:status, text: 'Hello world', account: jeff)
         reblog = Fabricate(:status, reblog: status, account: alice)
diff --git a/spec/lib/request_spec.rb b/spec/lib/request_spec.rb
index 5eccf3201..8539944e2 100644
--- a/spec/lib/request_spec.rb
+++ b/spec/lib/request_spec.rb
@@ -120,6 +120,11 @@ describe Request do
       expect { subject.perform { |response| response.body_with_limit } }.to raise_error Mastodon::LengthValidationError
     end
 
+    it 'truncates large monolithic body' do
+      stub_request(:any, 'http://example.com').to_return(body: SecureRandom.random_bytes(2.megabytes), headers: { 'Content-Length' => 2.megabytes })
+      expect(subject.perform { |response| response.truncated_body.bytesize }).to be < 2.megabytes
+    end
+
     it 'uses binary encoding if Content-Type does not tell encoding' do
       stub_request(:any, 'http://example.com').to_return(body: '', headers: { 'Content-Type' => 'text/html' })
       expect(subject.perform { |response| response.body_with_limit.encoding }).to eq Encoding::BINARY
diff --git a/spec/lib/sanitize_config_spec.rb b/spec/lib/sanitize_config_spec.rb
index dc6418e5b..29344476f 100644
--- a/spec/lib/sanitize_config_spec.rb
+++ b/spec/lib/sanitize_config_spec.rb
@@ -28,6 +28,10 @@ describe Sanitize::Config do
       expect(Sanitize.fragment('<a href="foo://bar">Test</a>', subject)).to eq 'Test'
     end
 
+    it 'does not re-interpret HTML when removing unsupported links' do
+      expect(Sanitize.fragment('<a href="foo://bar">Test&lt;a href="https://example.com"&gt;test&lt;/a&gt;</a>', subject)).to eq 'Test&lt;a href="https://example.com"&gt;test&lt;/a&gt;'
+    end
+
     it 'keeps a with href' do
       expect(Sanitize.fragment('<a href="http://example.com">Test</a>', subject)).to eq '<a href="http://example.com" rel="nofollow noopener noreferrer" target="_blank">Test</a>'
     end
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index edae05f9d..6cd769dc8 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -160,7 +160,7 @@ RSpec.describe Account, type: :model do
         expect(account.avatar_remote_url).to eq 'https://remote.test/invalid_avatar'
         expect(account.header_remote_url).to eq expectation.header_remote_url
         expect(account.avatar_file_name).to  eq nil
-        expect(account.header_file_name).to  eq nil
+        expect(account.header_file_name).to  eq expectation.header_file_name
       end
     end
   end
@@ -658,6 +658,12 @@ RSpec.describe Account, type: :model do
     end
   end
 
+  describe '.requested_by_map' do
+    it 'returns an hash' do
+      expect(Account.requested_by_map([], 1)).to be_a Hash
+    end
+  end
+
   describe 'MENTION_RE' do
     subject { Account::MENTION_RE }
 
diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb
index b16f99a79..102d2f625 100644
--- a/spec/models/tag_spec.rb
+++ b/spec/models/tag_spec.rb
@@ -1,21 +1,22 @@
+# frozen_string_literal: true
 require 'rails_helper'
 
-RSpec.describe Tag, type: :model do
+RSpec.describe Tag do
   describe 'validations' do
     it 'invalid with #' do
-      expect(Tag.new(name: '#hello_world')).to_not be_valid
+      expect(described_class.new(name: '#hello_world')).not_to be_valid
     end
 
     it 'invalid with .' do
-      expect(Tag.new(name: '.abcdef123')).to_not be_valid
+      expect(described_class.new(name: '.abcdef123')).not_to be_valid
     end
 
     it 'invalid with spaces' do
-      expect(Tag.new(name: 'hello world')).to_not be_valid
+      expect(described_class.new(name: 'hello world')).not_to be_valid
     end
 
     it 'valid with aesthetic' do
-      expect(Tag.new(name: 'aesthetic')).to be_valid
+      expect(described_class.new(name: 'aesthetic')).to be_valid
     end
   end
 
@@ -62,6 +63,10 @@ RSpec.describe Tag, type: :model do
       expect(subject.match('hello #one·two·three').to_s).to eq ' #one·two·three'
     end
 
+    it 'matches ・unicode in ぼっち・ざ・ろっく correctly' do
+      expect(subject.match('testing #ぼっち・ざ・ろっく').to_s).to eq ' #ぼっち・ざ・ろっく'
+    end
+
     it 'matches ZWNJ' do
       expect(subject.match('just add #نرم‌افزار and').to_s).to eq ' #نرم‌افزار'
     end
@@ -89,44 +94,46 @@ RSpec.describe Tag, type: :model do
   describe '.find_normalized' do
     it 'returns tag for a multibyte case-insensitive name' do
       upcase_string   = 'abcABCabcABCやゆよ'
-      downcase_string = 'abcabcabcabcやゆよ';
+      downcase_string = 'abcabcabcabcやゆよ'
 
       tag = Fabricate(:tag, name: HashtagNormalizer.new.normalize(downcase_string))
-      expect(Tag.find_normalized(upcase_string)).to eq tag
+      expect(described_class.find_normalized(upcase_string)).to eq tag
     end
   end
 
   describe '.matches_name' do
     it 'returns tags for multibyte case-insensitive names' do
       upcase_string   = 'abcABCabcABCやゆよ'
-      downcase_string = 'abcabcabcabcやゆよ';
+      downcase_string = 'abcabcabcabcやゆよ'
 
       tag = Fabricate(:tag, name: HashtagNormalizer.new.normalize(downcase_string))
-      expect(Tag.matches_name(upcase_string)).to eq [tag]
+      expect(described_class.matches_name(upcase_string)).to eq [tag]
     end
 
     it 'uses the LIKE operator' do
-      expect(Tag.matches_name('100%abc').to_sql).to eq %q[SELECT "tags".* FROM "tags" WHERE LOWER("tags"."name") LIKE LOWER('100abc%')]
+      result = %q[SELECT "tags".* FROM "tags" WHERE LOWER("tags"."name") LIKE LOWER('100abc%')]
+      expect(described_class.matches_name('100%abc').to_sql).to eq result
     end
   end
 
   describe '.matching_name' do
     it 'returns tags for multibyte case-insensitive names' do
       upcase_string   = 'abcABCabcABCやゆよ'
-      downcase_string = 'abcabcabcabcやゆよ';
+      downcase_string = 'abcabcabcabcやゆよ'
 
       tag = Fabricate(:tag, name: HashtagNormalizer.new.normalize(downcase_string))
-      expect(Tag.matching_name(upcase_string)).to eq [tag]
+      expect(described_class.matching_name(upcase_string)).to eq [tag]
     end
   end
 
   describe '.find_or_create_by_names' do
+    let(:upcase_string) { 'abcABCabcABCやゆよ' }
+    let(:downcase_string) { 'abcabcabcabcやゆよ' }
+
     it 'runs a passed block once per tag regardless of duplicates' do
-      upcase_string   = 'abcABCabcABCやゆよ'
-      downcase_string = 'abcabcabcabcやゆよ';
-      count           = 0
+      count = 0
 
-      Tag.find_or_create_by_names([upcase_string, downcase_string]) do |tag|
+      described_class.find_or_create_by_names([upcase_string, downcase_string]) do |_tag|
         count += 1
       end
 
@@ -136,28 +143,28 @@ RSpec.describe Tag, type: :model do
 
   describe '.search_for' do
     it 'finds tag records with matching names' do
-      tag = Fabricate(:tag, name: "match")
-      _miss_tag = Fabricate(:tag, name: "miss")
+      tag = Fabricate(:tag, name: 'match')
+      _miss_tag = Fabricate(:tag, name: 'miss')
 
-      results = Tag.search_for("match")
+      results = described_class.search_for('match')
 
       expect(results).to eq [tag]
     end
 
     it 'finds tag records in case insensitive' do
-      tag = Fabricate(:tag, name: "MATCH")
-      _miss_tag = Fabricate(:tag, name: "miss")
+      tag = Fabricate(:tag, name: 'MATCH')
+      _miss_tag = Fabricate(:tag, name: 'miss')
 
-      results = Tag.search_for("match")
+      results = described_class.search_for('match')
 
       expect(results).to eq [tag]
     end
 
     it 'finds the exact matching tag as the first item' do
-      similar_tag = Fabricate(:tag, name: "matchlater", reviewed_at: Time.now.utc)
-      tag = Fabricate(:tag, name: "match", reviewed_at: Time.now.utc)
+      similar_tag = Fabricate(:tag, name: 'matchlater', reviewed_at: Time.now.utc)
+      tag = Fabricate(:tag, name: 'match', reviewed_at: Time.now.utc)
 
-      results = Tag.search_for("match")
+      results = described_class.search_for('match')
 
       expect(results).to eq [tag, similar_tag]
     end
diff --git a/spec/presenters/account_relationships_presenter_spec.rb b/spec/presenters/account_relationships_presenter_spec.rb
index edfbbb354..8a485d2b9 100644
--- a/spec/presenters/account_relationships_presenter_spec.rb
+++ b/spec/presenters/account_relationships_presenter_spec.rb
@@ -10,6 +10,7 @@ RSpec.describe AccountRelationshipsPresenter do
       allow(Account).to receive(:blocking_map).with(account_ids, current_account_id).and_return(default_map)
       allow(Account).to receive(:muting_map).with(account_ids, current_account_id).and_return(default_map)
       allow(Account).to receive(:requested_map).with(account_ids, current_account_id).and_return(default_map)
+      allow(Account).to receive(:requested_by_map).with(account_ids, current_account_id).and_return(default_map)
       allow(Account).to receive(:domain_blocking_map).with(account_ids, current_account_id).and_return(default_map)
     end
 
@@ -71,6 +72,14 @@ RSpec.describe AccountRelationshipsPresenter do
       end
     end
 
+    context 'options[:requested_by_map] is set' do
+      let(:options) { { requested_by_map: { 6 => true } } }
+
+      it 'sets @requested merged with default_map and options[:requested_by_map]' do
+        expect(presenter.requested_by).to eq default_map.merge(options[:requested_by_map])
+      end
+    end
+
     context 'options[:domain_blocking_map] is set' do
       let(:options) { { domain_blocking_map: { 7 => true } } }
 
diff --git a/spec/services/suspend_account_service_spec.rb b/spec/services/suspend_account_service_spec.rb
index 5d45e4ffd..126b13986 100644
--- a/spec/services/suspend_account_service_spec.rb
+++ b/spec/services/suspend_account_service_spec.rb
@@ -13,6 +13,8 @@ RSpec.describe SuspendAccountService, type: :service do
 
       local_follower.follow!(account)
       list.accounts << account
+
+      account.suspend!
     end
 
     it "unmerges from local followers' feeds" do
@@ -21,8 +23,8 @@ RSpec.describe SuspendAccountService, type: :service do
       expect(FeedManager.instance).to have_received(:unmerge_from_list).with(account, list)
     end
 
-    it 'marks account as suspended' do
-      expect { subject }.to change { account.suspended? }.from(false).to(true)
+    it 'does not change the “suspended” flag' do
+      expect { subject }.to_not change { account.suspended? }
     end
   end
 
diff --git a/spec/services/unsuspend_account_service_spec.rb b/spec/services/unsuspend_account_service_spec.rb
index 3ac4cc085..987eb09e2 100644
--- a/spec/services/unsuspend_account_service_spec.rb
+++ b/spec/services/unsuspend_account_service_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe UnsuspendAccountService, type: :service do
       local_follower.follow!(account)
       list.accounts << account
 
-      account.suspend!(origin: :local)
+      account.unsuspend!
     end
   end
 
@@ -30,8 +30,8 @@ RSpec.describe UnsuspendAccountService, type: :service do
       stub_request(:post, 'https://bob.com/inbox').to_return(status: 201)
     end
 
-    it 'marks account as unsuspended' do
-      expect { subject }.to change { account.suspended? }.from(true).to(false)
+    it 'does not change the “suspended” flag' do
+      expect { subject }.to_not change { account.suspended? }
     end
 
     include_examples 'common behavior' do
@@ -83,8 +83,8 @@ RSpec.describe UnsuspendAccountService, type: :service do
           expect(FeedManager.instance).to have_received(:merge_into_list).with(account, list)
         end
 
-        it 'marks account as unsuspended' do
-          expect { subject }.to change { account.suspended? }.from(true).to(false)
+        it 'does not change the “suspended” flag' do
+          expect { subject }.to_not change { account.suspended? }
         end
       end
 
@@ -107,8 +107,8 @@ RSpec.describe UnsuspendAccountService, type: :service do
           expect(FeedManager.instance).to_not have_received(:merge_into_list).with(account, list)
         end
 
-        it 'does not mark the account as unsuspended' do
-          expect { subject }.not_to change { account.suspended? }
+        it 'marks account as suspended' do
+          expect { subject }.to change { account.suspended? }.from(false).to(true)
         end
       end
 
diff --git a/spec/services/verify_link_service_spec.rb b/spec/services/verify_link_service_spec.rb
index 52ba454cc..391560f1c 100644
--- a/spec/services/verify_link_service_spec.rb
+++ b/spec/services/verify_link_service_spec.rb
@@ -73,6 +73,33 @@ RSpec.describe VerifyLinkService, type: :service do
       end
     end
 
+    context 'when a document is truncated but the link back is valid' do
+      let(:html) do
+        "
+          <!doctype html>
+          <body>
+            <a rel=\"me\" href=\"#{ActivityPub::TagManager.instance.url_for(account)}\"
+        "
+      end
+
+      it 'marks the field as not verified' do
+        expect(field.verified?).to be false
+      end
+    end
+
+    context 'when a link back might be truncated' do
+      let(:html) do
+        "
+          <!doctype html>
+          <body>
+            <a rel=\"me\" href=\"#{ActivityPub::TagManager.instance.url_for(account)}"
+      end
+
+      it 'does not mark the field as verified' do
+        expect(field.verified?).to be false
+      end
+    end
+
     context 'when a link does not contain a link back' do
       let(:html) { '' }
 
diff --git a/spec/support/matchers/json/match_json_schema.rb b/spec/support/matchers/json/match_json_schema.rb
new file mode 100644
index 000000000..5d9c9a618
--- /dev/null
+++ b/spec/support/matchers/json/match_json_schema.rb
@@ -0,0 +1,6 @@
+RSpec::Matchers.define :match_json_schema do |schema|
+  match do |input_json|
+    schema_path = Rails.root.join('spec', 'support', 'schema', "#{schema}.json").to_s
+    JSON::Validator.validate(schema_path, input_json, validate_schema: true)
+  end
+end
diff --git a/spec/support/schema/nodeinfo_2.0.json b/spec/support/schema/nodeinfo_2.0.json
new file mode 100644
index 000000000..085ce542b
--- /dev/null
+++ b/spec/support/schema/nodeinfo_2.0.json
@@ -0,0 +1,170 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "id": "http://nodeinfo.diaspora.software/ns/schema/2.0#",
+  "description": "NodeInfo schema version 2.0.",
+  "type": "object",
+  "additionalProperties": false,
+  "required": [
+    "version",
+    "software",
+    "protocols",
+    "services",
+    "openRegistrations",
+    "usage",
+    "metadata"
+  ],
+  "properties": {
+    "version": {
+      "description": "The schema version, must be 2.0.",
+      "enum": ["2.0"]
+    },
+    "software": {
+      "description": "Metadata about server software in use.",
+      "type": "object",
+      "additionalProperties": false,
+      "required": ["name", "version"],
+      "properties": {
+        "name": {
+          "description": "The canonical name of this server software.",
+          "type": "string",
+          "pattern": "^[a-z0-9-]+$"
+        },
+        "version": {
+          "description": "The version of this server software.",
+          "type": "string"
+        }
+      }
+    },
+    "protocols": {
+      "description": "The protocols supported on this server.",
+      "type": "array",
+      "minItems": 1,
+      "items": {
+        "enum": [
+          "activitypub",
+          "buddycloud",
+          "dfrn",
+          "diaspora",
+          "libertree",
+          "ostatus",
+          "pumpio",
+          "tent",
+          "xmpp",
+          "zot"
+        ]
+      }
+    },
+    "services": {
+      "description": "The third party sites this server can connect to via their application API.",
+      "type": "object",
+      "additionalProperties": false,
+      "required": ["inbound", "outbound"],
+      "properties": {
+        "inbound": {
+          "description": "The third party sites this server can retrieve messages from for combined display with regular traffic.",
+          "type": "array",
+          "minItems": 0,
+          "items": {
+            "enum": [
+              "atom1.0",
+              "gnusocial",
+              "imap",
+              "pnut",
+              "pop3",
+              "pumpio",
+              "rss2.0",
+              "twitter"
+            ]
+          }
+        },
+        "outbound": {
+          "description": "The third party sites this server can publish messages to on the behalf of a user.",
+          "type": "array",
+          "minItems": 0,
+          "items": {
+            "enum": [
+              "atom1.0",
+              "blogger",
+              "buddycloud",
+              "diaspora",
+              "dreamwidth",
+              "drupal",
+              "facebook",
+              "friendica",
+              "gnusocial",
+              "google",
+              "insanejournal",
+              "libertree",
+              "linkedin",
+              "livejournal",
+              "mediagoblin",
+              "myspace",
+              "pinterest",
+              "pnut",
+              "posterous",
+              "pumpio",
+              "redmatrix",
+              "rss2.0",
+              "smtp",
+              "tent",
+              "tumblr",
+              "twitter",
+              "wordpress",
+              "xmpp"
+            ]
+          }
+        }
+      }
+    },
+    "openRegistrations": {
+      "description": "Whether this server allows open self-registration.",
+      "type": "boolean"
+    },
+    "usage": {
+      "description": "Usage statistics for this server.",
+      "type": "object",
+      "additionalProperties": false,
+      "required": ["users"],
+      "properties": {
+        "users": {
+          "description": "statistics about the users of this server.",
+          "type": "object",
+          "additionalProperties": false,
+          "properties": {
+            "total": {
+              "description": "The total amount of on this server registered users.",
+              "type": "integer",
+              "minimum": 0
+            },
+            "activeHalfyear": {
+              "description": "The amount of users that signed in at least once in the last 180 days.",
+              "type": "integer",
+              "minimum": 0
+            },
+            "activeMonth": {
+              "description": "The amount of users that signed in at least once in the last 30 days.",
+              "type": "integer",
+              "minimum": 0
+            }
+          }
+        },
+        "localPosts": {
+          "description": "The amount of posts that were made by users that are registered on this server.",
+          "type": "integer",
+          "minimum": 0
+        },
+        "localComments": {
+          "description": "The amount of comments that were made by users that are registered on this server.",
+          "type": "integer",
+          "minimum": 0
+        }
+      }
+    },
+    "metadata": {
+      "description": "Free form key value pairs for software specific values. Clients should not rely on any specific key present.",
+      "type": "object",
+      "minProperties": 0,
+      "additionalProperties": true
+    }
+  }
+}
diff --git a/streaming/index.js b/streaming/index.js
index cecb53ed5..45ea26bd6 100644
--- a/streaming/index.js
+++ b/streaming/index.js
@@ -725,7 +725,7 @@ const startWorker = async (workerId) => {
 
             Object.keys(req.cachedFilters).forEach((key) => {
               req.cachedFilters[key].regexp = new RegExp(req.cachedFilters[key].keywords.map(([keyword, whole_word]) => {
-                let expr = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');;
+                let expr = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
 
                 if (whole_word) {
                   if (/^[\w]/.test(expr)) {
diff --git a/yarn.lock b/yarn.lock
index e01bee09b..a5c219371 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -37,30 +37,35 @@
   dependencies:
     "@babel/highlight" "^7.18.6"
 
-"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1":
+"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1":
   version "7.20.1"
   resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30"
   integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==
 
-"@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.20.5", "@babel/core@^7.7.2":
-  version "7.20.5"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113"
-  integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==
+"@babel/compat-data@^7.20.5":
+  version "7.20.10"
+  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec"
+  integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==
+
+"@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.20.12", "@babel/core@^7.7.2":
+  version "7.20.12"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d"
+  integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==
   dependencies:
     "@ampproject/remapping" "^2.1.0"
     "@babel/code-frame" "^7.18.6"
-    "@babel/generator" "^7.20.5"
-    "@babel/helper-compilation-targets" "^7.20.0"
-    "@babel/helper-module-transforms" "^7.20.2"
-    "@babel/helpers" "^7.20.5"
-    "@babel/parser" "^7.20.5"
-    "@babel/template" "^7.18.10"
-    "@babel/traverse" "^7.20.5"
-    "@babel/types" "^7.20.5"
+    "@babel/generator" "^7.20.7"
+    "@babel/helper-compilation-targets" "^7.20.7"
+    "@babel/helper-module-transforms" "^7.20.11"
+    "@babel/helpers" "^7.20.7"
+    "@babel/parser" "^7.20.7"
+    "@babel/template" "^7.20.7"
+    "@babel/traverse" "^7.20.12"
+    "@babel/types" "^7.20.7"
     convert-source-map "^1.7.0"
     debug "^4.1.0"
     gensync "^1.0.0-beta.2"
-    json5 "^2.2.1"
+    json5 "^2.2.2"
     semver "^6.3.0"
 
 "@babel/eslint-parser@^7.19.1":
@@ -72,12 +77,12 @@
     eslint-visitor-keys "^2.1.0"
     semver "^6.3.0"
 
-"@babel/generator@^7.20.5", "@babel/generator@^7.7.2":
-  version "7.20.5"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95"
-  integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==
+"@babel/generator@^7.20.7", "@babel/generator@^7.7.2":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a"
+  integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==
   dependencies:
-    "@babel/types" "^7.20.5"
+    "@babel/types" "^7.20.7"
     "@jridgewell/gen-mapping" "^0.3.2"
     jsesc "^2.5.1"
 
@@ -104,27 +109,28 @@
     "@babel/helper-annotate-as-pure" "^7.18.6"
     "@babel/types" "^7.18.6"
 
-"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0":
-  version "7.20.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a"
-  integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==
+"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb"
+  integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==
   dependencies:
-    "@babel/compat-data" "^7.20.0"
+    "@babel/compat-data" "^7.20.5"
     "@babel/helper-validator-option" "^7.18.6"
     browserslist "^4.21.3"
+    lru-cache "^5.1.1"
     semver "^6.3.0"
 
-"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5":
-  version "7.20.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz#327154eedfb12e977baa4ecc72e5806720a85a06"
-  integrity sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.7.tgz#d0e1f8d7e4ed5dac0389364d9c0c191d948ade6f"
+  integrity sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w==
   dependencies:
     "@babel/helper-annotate-as-pure" "^7.18.6"
     "@babel/helper-environment-visitor" "^7.18.9"
     "@babel/helper-function-name" "^7.19.0"
-    "@babel/helper-member-expression-to-functions" "^7.18.9"
+    "@babel/helper-member-expression-to-functions" "^7.20.7"
     "@babel/helper-optimise-call-expression" "^7.18.6"
-    "@babel/helper-replace-supers" "^7.19.1"
+    "@babel/helper-replace-supers" "^7.20.7"
     "@babel/helper-split-export-declaration" "^7.18.6"
 
 "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0":
@@ -174,12 +180,12 @@
   dependencies:
     "@babel/types" "^7.18.6"
 
-"@babel/helper-member-expression-to-functions@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815"
-  integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==
+"@babel/helper-member-expression-to-functions@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05"
+  integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==
   dependencies:
-    "@babel/types" "^7.18.9"
+    "@babel/types" "^7.20.7"
 
 "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.18.6":
   version "7.18.6"
@@ -188,19 +194,19 @@
   dependencies:
     "@babel/types" "^7.18.6"
 
-"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2":
-  version "7.20.2"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712"
-  integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==
+"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.11":
+  version "7.20.11"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0"
+  integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==
   dependencies:
     "@babel/helper-environment-visitor" "^7.18.9"
     "@babel/helper-module-imports" "^7.18.6"
     "@babel/helper-simple-access" "^7.20.2"
     "@babel/helper-split-export-declaration" "^7.18.6"
     "@babel/helper-validator-identifier" "^7.19.1"
-    "@babel/template" "^7.18.10"
-    "@babel/traverse" "^7.20.1"
-    "@babel/types" "^7.20.2"
+    "@babel/template" "^7.20.7"
+    "@babel/traverse" "^7.20.10"
+    "@babel/types" "^7.20.7"
 
 "@babel/helper-optimise-call-expression@^7.18.6":
   version "7.18.6"
@@ -224,16 +230,17 @@
     "@babel/helper-wrap-function" "^7.18.9"
     "@babel/types" "^7.18.9"
 
-"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1":
-  version "7.19.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78"
-  integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==
+"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1", "@babel/helper-replace-supers@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331"
+  integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==
   dependencies:
     "@babel/helper-environment-visitor" "^7.18.9"
-    "@babel/helper-member-expression-to-functions" "^7.18.9"
+    "@babel/helper-member-expression-to-functions" "^7.20.7"
     "@babel/helper-optimise-call-expression" "^7.18.6"
-    "@babel/traverse" "^7.19.1"
-    "@babel/types" "^7.19.0"
+    "@babel/template" "^7.20.7"
+    "@babel/traverse" "^7.20.7"
+    "@babel/types" "^7.20.7"
 
 "@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2":
   version "7.20.2"
@@ -281,14 +288,14 @@
     "@babel/traverse" "^7.18.10"
     "@babel/types" "^7.18.10"
 
-"@babel/helpers@^7.20.5":
-  version "7.20.6"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763"
-  integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==
+"@babel/helpers@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce"
+  integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==
   dependencies:
-    "@babel/template" "^7.18.10"
-    "@babel/traverse" "^7.20.5"
-    "@babel/types" "^7.20.5"
+    "@babel/template" "^7.20.7"
+    "@babel/traverse" "^7.20.7"
+    "@babel/types" "^7.20.7"
 
 "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6":
   version "7.18.6"
@@ -299,10 +306,10 @@
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5":
-  version "7.20.5"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8"
-  integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b"
+  integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==
 
 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
   version "7.18.6"
@@ -347,14 +354,14 @@
     "@babel/helper-plugin-utils" "^7.18.6"
     "@babel/plugin-syntax-class-static-block" "^7.14.5"
 
-"@babel/plugin-proposal-decorators@^7.20.5":
-  version "7.20.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.5.tgz#28ba1a0e5044664a512967a19407d7fc26925394"
-  integrity sha512-Lac7PpRJXcC3s9cKsBfl+uc+DYXU5FD06BrTFunQO6QIQT+DwyzDPURAowI3bcvD1dZF/ank1Z5rstUJn3Hn4Q==
+"@babel/plugin-proposal-decorators@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.7.tgz#05d37453c2ce818f3e47bbeda9468c8de947eecc"
+  integrity sha512-JB45hbUweYpwAGjkiM7uCyXMENH2lG+9r3G2E+ttc2PRXAoEkpfd/KW5jDg4j8RS6tLtTG1jZi9LbHZVSfs1/A==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.20.5"
+    "@babel/helper-create-class-features-plugin" "^7.20.7"
     "@babel/helper-plugin-utils" "^7.20.2"
-    "@babel/helper-replace-supers" "^7.19.1"
+    "@babel/helper-replace-supers" "^7.20.7"
     "@babel/helper-split-export-declaration" "^7.18.6"
     "@babel/plugin-syntax-decorators" "^7.19.0"
 
@@ -1022,49 +1029,42 @@
   dependencies:
     regenerator-runtime "^0.12.0"
 
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.9", "@babel/runtime@^7.2.0", "@babel/runtime@^7.20.6", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
-  version "7.20.6"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3"
-  integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.13.8", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.9", "@babel/runtime@^7.2.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd"
+  integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==
   dependencies:
     regenerator-runtime "^0.13.11"
 
-"@babel/runtime@^7.8.7":
-  version "7.16.7"
-  resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz"
-  integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==
-  dependencies:
-    regenerator-runtime "^0.13.4"
-
-"@babel/template@^7.18.10", "@babel/template@^7.3.3":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71"
-  integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==
+"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8"
+  integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==
   dependencies:
     "@babel/code-frame" "^7.18.6"
-    "@babel/parser" "^7.18.10"
-    "@babel/types" "^7.18.10"
+    "@babel/parser" "^7.20.7"
+    "@babel/types" "^7.20.7"
 
-"@babel/traverse@^7.18.10", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.7.2":
-  version "7.20.5"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133"
-  integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==
+"@babel/traverse@^7.18.10", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.7", "@babel/traverse@^7.7.2":
+  version "7.20.12"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5"
+  integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==
   dependencies:
     "@babel/code-frame" "^7.18.6"
-    "@babel/generator" "^7.20.5"
+    "@babel/generator" "^7.20.7"
     "@babel/helper-environment-visitor" "^7.18.9"
     "@babel/helper-function-name" "^7.19.0"
     "@babel/helper-hoist-variables" "^7.18.6"
     "@babel/helper-split-export-declaration" "^7.18.6"
-    "@babel/parser" "^7.20.5"
-    "@babel/types" "^7.20.5"
+    "@babel/parser" "^7.20.7"
+    "@babel/types" "^7.20.7"
     debug "^4.1.0"
     globals "^11.1.0"
 
-"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
-  version "7.20.5"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84"
-  integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==
+"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f"
+  integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==
   dependencies:
     "@babel/helper-string-parser" "^7.19.4"
     "@babel/helper-validator-identifier" "^7.19.1"
@@ -1562,11 +1562,23 @@
   resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz"
   integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==
 
+"@popperjs/core@^2.11.6":
+  version "2.11.6"
+  resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45"
+  integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==
+
 "@rails/ujs@^6.1.7":
   version "6.1.7"
   resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.7.tgz#b09dc5b2105dd267e8374c47e4490240451dc7f6"
   integrity sha512-0e7WQ4LE/+LEfW2zfAw9ppsB6A8RmxbdAUPAF++UT80epY+7emuQDkKXmaK0a9lp6An50RvzezI0cIQjp1A58w==
 
+"@restart/hooks@^0.4.7":
+  version "0.4.7"
+  resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.7.tgz#d79ca6472c01ce04389fc73d4a79af1b5e33cd39"
+  integrity sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A==
+  dependencies:
+    dequal "^2.0.2"
+
 "@rollup/plugin-babel@^5.2.0":
   version "5.3.1"
   resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283"
@@ -1885,6 +1897,15 @@
     "@types/scheduler" "*"
     csstype "^3.0.2"
 
+"@types/react@>=16.9.11":
+  version "18.0.26"
+  resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917"
+  integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==
+  dependencies:
+    "@types/prop-types" "*"
+    "@types/scheduler" "*"
+    csstype "^3.0.2"
+
 "@types/resolve@1.17.1":
   version "1.17.1"
   resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6"
@@ -1924,6 +1945,11 @@
   resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756"
   integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==
 
+"@types/warning@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52"
+  integrity sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA==
+
 "@types/yargs-parser@*":
   version "15.0.0"
   resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz"
@@ -2250,11 +2276,6 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1:
   resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
   integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
 
-ansi-styles@^2.2.1:
-  version "2.2.1"
-  resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz"
-  integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
-
 ansi-styles@^3.2.0, ansi-styles@^3.2.1:
   version "3.2.1"
   resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
@@ -2520,10 +2541,10 @@ axe-core@^4.4.3:
   resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f"
   integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==
 
-axios@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.1.tgz#44cf04a3c9f0c2252ebd85975361c026cb9f864a"
-  integrity sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==
+axios@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.2.tgz#72681724c6e6a43a9fea860fc558127dbe32f9f1"
+  integrity sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==
   dependencies:
     follow-redirects "^1.15.0"
     form-data "^4.0.0"
@@ -3115,17 +3136,6 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001400:
   resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz"
   integrity sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==
 
-chalk@^1.1.3:
-  version "1.1.3"
-  resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz"
-  integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
-  dependencies:
-    ansi-styles "^2.2.1"
-    escape-string-regexp "^1.0.2"
-    has-ansi "^2.0.0"
-    strip-ansi "^3.0.0"
-    supports-color "^2.0.0"
-
 chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2:
   version "2.4.2"
   resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
@@ -3559,10 +3569,10 @@ cosmiconfig@^6.0.0:
     path-type "^4.0.0"
     yaml "^1.7.2"
 
-cosmiconfig@^7.0.0, cosmiconfig@^7.0.1:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
-  integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
+cosmiconfig@^7.0.0, cosmiconfig@^7.1.0:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
+  integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==
   dependencies:
     "@types/parse-json" "^4.0.0"
     import-fresh "^3.2.1"
@@ -3663,43 +3673,11 @@ css-declaration-sorter@^4.0.1:
     postcss "^7.0.1"
     timsort "^0.3.0"
 
-css-font-size-keywords@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz"
-  integrity sha1-hUh1rOmspqjS7g00WkSq6btttss=
-
-css-font-stretch-keywords@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz"
-  integrity sha1-UM7puboDH7XJUtRyMTnx4Qe1SxA=
-
-css-font-style-keywords@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz"
-  integrity sha1-XDUygT9jtKHelU0TzqhqtDM0CeQ=
-
-css-font-weight-keywords@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz"
-  integrity sha1-m8BGcayFvHJLV07106yWsNYE/Zc=
-
 css-functions-list@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.1.0.tgz#cf5b09f835ad91a00e5959bcfc627cd498e1321b"
   integrity sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==
 
-css-global-keywords@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz"
-  integrity sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk=
-
-css-list-helpers@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/css-list-helpers/-/css-list-helpers-1.0.1.tgz"
-  integrity sha1-//VxkiAtuDJAxBaG+RnkSacCT30=
-  dependencies:
-    tcomb "^2.5.0"
-
 css-loader@^5.2.7:
   version "5.2.7"
   resolved "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz"
@@ -3731,11 +3709,6 @@ css-select@^2.0.0:
     domutils "^1.7.0"
     nth-check "^1.0.2"
 
-css-system-font-keywords@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz"
-  integrity sha1-hcbwhquk6zLFcaMIav/ENLhII+0=
-
 css-tree@1.0.0-alpha.37:
   version "1.0.0-alpha.37"
   resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz"
@@ -4033,6 +4006,11 @@ depd@~1.1.2:
   resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
   integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
 
+dequal@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
+  integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
+
 des.js@^1.0.0:
   version "1.0.1"
   resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz"
@@ -4138,16 +4116,16 @@ dom-accessibility-api@^0.5.6:
   resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.11.tgz"
   integrity sha512-7X6GvzjYf4yTdRKuCVScV+aA9Fvh5r8WzWrXBH9w82ZWB/eYDMGCnazoC/YAqAzUJWHzLOnZqr46K3iEyUhUvw==
 
-dom-helpers@^3.2.1, dom-helpers@^3.4.0:
+dom-helpers@^3.4.0:
   version "3.4.0"
   resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz"
   integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==
   dependencies:
     "@babel/runtime" "^7.1.2"
 
-dom-helpers@^5.0.1:
+dom-helpers@^5.0.1, dom-helpers@^5.2.0:
   version "5.2.1"
-  resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz"
+  resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902"
   integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
   dependencies:
     "@babel/runtime" "^7.8.7"
@@ -4452,7 +4430,7 @@ escape-html@^1.0.3, escape-html@~1.0.3:
   resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
   integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
 
-escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+escape-string-regexp@^1.0.5:
   version "1.0.5"
   resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
   integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
@@ -5405,13 +5383,6 @@ hard-rejection@^2.1.0:
   resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
   integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
 
-has-ansi@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz"
-  integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
-  dependencies:
-    ansi-regex "^2.0.0"
-
 has-bigints@^1.0.1:
   version "1.0.1"
   resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz"
@@ -5422,11 +5393,6 @@ has-bigints@^1.0.2:
   resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
   integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
 
-has-flag@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz"
-  integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
-
 has-flag@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
@@ -5741,15 +5707,15 @@ ignore@^4.0.6:
   resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
-ignore@^5.2.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
-  integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
+ignore@^5.2.0, ignore@^5.2.1:
+  version "5.2.4"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
+  integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
 
-immutable@^4.0.0, immutable@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
-  integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==
+immutable@^4.0.0, immutable@^4.2.2:
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.2.tgz#2da9ff4384a4330c36d4d1bc88e90f9e0b0ccd16"
+  integrity sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==
 
 import-cwd@^2.0.0:
   version "2.1.0"
@@ -6798,11 +6764,6 @@ jpeg-js@^0.4.2:
   resolved "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.3.tgz"
   integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==
 
-js-base64@^2.1.9:
-  version "2.6.4"
-  resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz"
-  integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
-
 "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
@@ -6823,7 +6784,7 @@ js-yaml@^4.1.0:
   dependencies:
     argparse "^2.0.1"
 
-jsdom@^20.0.0, jsdom@^20.0.3:
+jsdom@^20.0.0:
   version "20.0.3"
   resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db"
   integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==
@@ -6855,6 +6816,38 @@ jsdom@^20.0.0, jsdom@^20.0.3:
     ws "^8.11.0"
     xml-name-validator "^4.0.0"
 
+jsdom@^21.0.0:
+  version "21.0.0"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-21.0.0.tgz#33e22f2fc44286e50ac853c7b7656c8864a4ea45"
+  integrity sha512-AIw+3ZakSUtDYvhwPwWHiZsUi3zHugpMEKlNPaurviseYoBqo0zBd3zqoUi3LPCNtPFlEP8FiW9MqCZdjb2IYA==
+  dependencies:
+    abab "^2.0.6"
+    acorn "^8.8.1"
+    acorn-globals "^7.0.0"
+    cssom "^0.5.0"
+    cssstyle "^2.3.0"
+    data-urls "^3.0.2"
+    decimal.js "^10.4.2"
+    domexception "^4.0.0"
+    escodegen "^2.0.0"
+    form-data "^4.0.0"
+    html-encoding-sniffer "^3.0.0"
+    http-proxy-agent "^5.0.0"
+    https-proxy-agent "^5.0.1"
+    is-potential-custom-element-name "^1.0.1"
+    nwsapi "^2.2.2"
+    parse5 "^7.1.1"
+    saxes "^6.0.0"
+    symbol-tree "^3.2.4"
+    tough-cookie "^4.1.2"
+    w3c-xmlserializer "^4.0.0"
+    webidl-conversions "^7.0.0"
+    whatwg-encoding "^2.0.0"
+    whatwg-mimetype "^3.0.0"
+    whatwg-url "^11.0.0"
+    ws "^8.11.0"
+    xml-name-validator "^4.0.0"
+
 jsesc@^2.5.1:
   version "2.5.2"
   resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz"
@@ -6908,16 +6901,16 @@ json3@^3.3.3:
   integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==
 
 json5@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz"
-  integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
+  integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
   dependencies:
     minimist "^1.2.0"
 
-json5@^2.1.2, json5@^2.2.0, json5@^2.2.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
-  integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
+json5@^2.1.2, json5@^2.2.0, json5@^2.2.2:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+  integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
 
 jsonfile@^4.0.0:
   version "4.0.0"
@@ -6978,10 +6971,10 @@ klona@^2.0.4:
   resolved "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz"
   integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==
 
-known-css-properties@^0.25.0:
-  version "0.25.0"
-  resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.25.0.tgz#6ebc4d4b412f602e5cfbeb4086bd544e34c0a776"
-  integrity sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==
+known-css-properties@^0.26.0:
+  version "0.26.0"
+  resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.26.0.tgz#008295115abddc045a9f4ed7e2a84dc8b3a77649"
+  integrity sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==
 
 language-subtag-registry@~0.3.2:
   version "0.3.21"
@@ -7760,11 +7753,6 @@ object-copy@^0.1.0:
     define-property "^0.2.5"
     kind-of "^3.0.3"
 
-object-fit-images@^3.2.3:
-  version "3.2.4"
-  resolved "https://registry.npmjs.org/object-fit-images/-/object-fit-images-3.2.4.tgz"
-  integrity sha512-G+7LzpYfTfqUyrZlfrou/PLLLAPNC52FTy5y1CBywX+1/FkxIloOyQXBmZ3Zxa2AWO+lMF0JTuvqbr7G5e5CWg==
-
 object-inspect@^1.12.0, object-inspect@^1.12.2, object-inspect@^1.9.0:
   version "1.12.2"
   resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
@@ -8048,21 +8036,6 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5:
     pbkdf2 "^3.0.3"
     safe-buffer "^5.1.1"
 
-parse-css-font@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.npmjs.org/parse-css-font/-/parse-css-font-2.0.2.tgz"
-  integrity sha1-e2CwYHBaJam5C38O1JPlgjJIplI=
-  dependencies:
-    css-font-size-keywords "^1.0.0"
-    css-font-stretch-keywords "^1.0.1"
-    css-font-style-keywords "^1.0.1"
-    css-font-weight-keywords "^1.0.0"
-    css-global-keywords "^1.0.1"
-    css-list-helpers "^1.0.1"
-    css-system-font-keywords "^1.0.0"
-    tcomb "^2.5.0"
-    unquote "^1.1.0"
-
 parse-json@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz"
@@ -8567,15 +8540,6 @@ postcss-normalize-whitespace@^4.0.2:
     postcss "^7.0.0"
     postcss-value-parser "^3.0.0"
 
-postcss-object-fit-images@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.npmjs.org/postcss-object-fit-images/-/postcss-object-fit-images-1.1.2.tgz"
-  integrity sha1-i3cwQ9sUZy72zW8ssfDYsmqfVzs=
-  dependencies:
-    parse-css-font "^2.0.2"
-    postcss "^5.0.16"
-    quote "^0.4.0"
-
 postcss-ordered-values@^4.1.2:
   version "4.1.2"
   resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz"
@@ -8629,10 +8593,10 @@ postcss-selector-parser@^3.0.0:
     indexes-of "^1.0.1"
     uniq "^1.0.1"
 
-postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.6:
-  version "6.0.10"
-  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d"
-  integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
+postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.6:
+  version "6.0.11"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc"
+  integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==
   dependencies:
     cssesc "^3.0.0"
     util-deprecate "^1.0.2"
@@ -8665,16 +8629,6 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^
   resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
   integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
 
-postcss@^5.0.16:
-  version "5.2.18"
-  resolved "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz"
-  integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==
-  dependencies:
-    chalk "^1.1.3"
-    js-base64 "^2.1.9"
-    source-map "^0.5.6"
-    supports-color "^3.2.3"
-
 postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.27, postcss@^7.0.32:
   version "7.0.39"
   resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz"
@@ -8683,10 +8637,10 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.27, postcss@^7.0.32:
     picocolors "^0.2.1"
     source-map "^0.6.1"
 
-postcss@^8.2.15, postcss@^8.4.17, postcss@^8.4.19:
-  version "8.4.19"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc"
-  integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==
+postcss@^8.2.15, postcss@^8.4.19, postcss@^8.4.21:
+  version "8.4.21"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4"
+  integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==
   dependencies:
     nanoid "^3.3.4"
     picocolors "^1.0.0"
@@ -8724,10 +8678,10 @@ prelude-ls@~1.1.2:
   resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz"
   integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
 
-prettier@^2.8.0:
-  version "2.8.0"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9"
-  integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==
+prettier@^2.8.2:
+  version "2.8.2"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.2.tgz#c4ea1b5b454d7c4b59966db2e06ed7eec5dfd160"
+  integrity sha512-BtRV9BcncDyI2tsuS19zzhzoxD8Dh8LiCx7j7tHzrkz8GFXAexeWFdi22mjE1d16dftH2qNaytVxqiRTGlMfpw==
 
 pretty-bytes@^5.3.0, pretty-bytes@^5.4.1:
   version "5.6.0"
@@ -8800,14 +8754,6 @@ prompts@^2.0.1:
     kleur "^3.0.3"
     sisteransi "^1.0.5"
 
-prop-types-extra@^1.0.1:
-  version "1.1.1"
-  resolved "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz"
-  integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==
-  dependencies:
-    react-is "^16.3.2"
-    warning "^4.0.0"
-
 prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
   version "15.8.1"
   resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
@@ -8929,11 +8875,6 @@ quick-lru@^4.0.1:
   resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
   integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
 
-quote@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.npmjs.org/quote/-/quote-0.4.0.tgz"
-  integrity sha1-EIOSF/bBNiuJGUBE0psjP9fzLwE=
-
 raf@^3.1.0, raf@^3.4.1:
   version "3.4.1"
   resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz"
@@ -9049,7 +8990,7 @@ react-intl@^2.9.0:
     intl-relativeformat "^2.1.0"
     invariant "^2.1.1"
 
-react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.6:
+react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.6:
   version "16.13.1"
   resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
   integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -9085,17 +9026,19 @@ react-notification@^6.8.5:
   dependencies:
     prop-types "^15.6.2"
 
-react-overlays@^0.9.3:
-  version "0.9.3"
-  resolved "https://registry.npmjs.org/react-overlays/-/react-overlays-0.9.3.tgz"
-  integrity sha512-u2T7nOLnK+Hrntho4p0Nxh+BsJl0bl4Xuwj/Y0a56xywLMetgAfyjnDVrudLXsNcKGaspoC+t3C1V80W9QQTdQ==
-  dependencies:
-    classnames "^2.2.5"
-    dom-helpers "^3.2.1"
-    prop-types "^15.5.10"
-    prop-types-extra "^1.0.1"
-    react-transition-group "^2.2.1"
-    warning "^3.0.0"
+react-overlays@^5.2.1:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-5.2.1.tgz#49dc007321adb6784e1f212403f0fb37a74ab86b"
+  integrity sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==
+  dependencies:
+    "@babel/runtime" "^7.13.8"
+    "@popperjs/core" "^2.11.6"
+    "@restart/hooks" "^0.4.7"
+    "@types/warning" "^3.0.0"
+    dom-helpers "^5.2.0"
+    prop-types "^15.7.2"
+    uncontrollable "^7.2.1"
+    warning "^4.0.3"
 
 react-redux-loading-bar@^5.0.4:
   version "5.0.4"
@@ -9234,16 +9177,6 @@ react-toggle@^4.1.3:
   dependencies:
     classnames "^2.2.5"
 
-react-transition-group@^2.2.1:
-  version "2.9.0"
-  resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz"
-  integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==
-  dependencies:
-    dom-helpers "^3.4.0"
-    loose-envify "^1.4.0"
-    prop-types "^15.6.2"
-    react-lifecycles-compat "^3.0.4"
-
 react-transition-group@^4.3.0:
   version "4.4.2"
   resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz"
@@ -9693,10 +9626,10 @@ sass-loader@^10.2.0:
     schema-utils "^3.0.0"
     semver "^7.3.2"
 
-sass@^1.56.1:
-  version "1.56.1"
-  resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.1.tgz#94d3910cd468fd075fa87f5bb17437a0b617d8a7"
-  integrity sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==
+sass@^1.57.1:
+  version "1.57.1"
+  resolved "https://registry.yarnpkg.com/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5"
+  integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==
   dependencies:
     chokidar ">=3.0.0 <4.0.0"
     immutable "^4.0.0"
@@ -10344,7 +10277,7 @@ stringz@^2.1.0:
   dependencies:
     char-regex "^1.0.2"
 
-strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+strip-ansi@^3.0.1:
   version "3.0.1"
   resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"
   integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
@@ -10416,34 +10349,34 @@ stylehacks@^4.0.0:
     postcss "^7.0.0"
     postcss-selector-parser "^3.0.0"
 
-stylelint-config-recommended-scss@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-7.0.0.tgz#db16b6ae6055e72e3398916c0f13d6eb685902a2"
-  integrity sha512-rGz1J4rMAyJkvoJW4hZasuQBB7y9KIrShb20l9DVEKKZSEi1HAy0vuNlR8HyCKy/jveb/BdaQFcoiYnmx4HoiA==
+stylelint-config-recommended-scss@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-8.0.0.tgz#1c1e93e619fe2275d4c1067928d92e0614f7d64f"
+  integrity sha512-BxjxEzRaZoQb7Iinc3p92GS6zRdRAkIuEu2ZFLTxJK2e1AIcCb5B5MXY9KOXdGTnYFZ+KKx6R4Fv9zU6CtMYPQ==
   dependencies:
     postcss-scss "^4.0.2"
-    stylelint-config-recommended "^8.0.0"
+    stylelint-config-recommended "^9.0.0"
     stylelint-scss "^4.0.0"
 
-stylelint-config-recommended@^8.0.0:
-  version "8.0.0"
-  resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-8.0.0.tgz#7736be9984246177f017c39ec7b1cd0f19ae9117"
-  integrity sha512-IK6dWvE000+xBv9jbnHOnBq01gt6HGVB2ZTsot+QsMpe82doDQ9hvplxfv4YnpEuUwVGGd9y6nbaAnhrjcxhZQ==
+stylelint-config-recommended@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz#1c9e07536a8cd875405f8ecef7314916d94e7e40"
+  integrity sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==
 
-stylelint-config-standard-scss@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/stylelint-config-standard-scss/-/stylelint-config-standard-scss-5.0.0.tgz#afc5e43c73e7a15875b8f30f54204b01a2634743"
-  integrity sha512-zoXLibojHZYPFjtkc4STZtAJ2yGTq3Bb4MYO0oiyO6f/vNxDKRcSDZYoqN260Gv2eD5niQIr1/kr5SXlFj9kcQ==
+stylelint-config-standard-scss@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/stylelint-config-standard-scss/-/stylelint-config-standard-scss-6.1.0.tgz#a6cddd2a9430578b92fc89726a59474d5548a444"
+  integrity sha512-iZ2B5kQT2G3rUzx+437cEpdcnFOQkwnwqXuY8Z0QUwIHQVE8mnYChGAquyKFUKZRZ0pRnrciARlPaR1RBtPb0Q==
   dependencies:
-    stylelint-config-recommended-scss "^7.0.0"
-    stylelint-config-standard "^26.0.0"
+    stylelint-config-recommended-scss "^8.0.0"
+    stylelint-config-standard "^29.0.0"
 
-stylelint-config-standard@^26.0.0:
-  version "26.0.0"
-  resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-26.0.0.tgz#4701b8d582d34120eec7d260ba779e4c2d953635"
-  integrity sha512-hUuB7LaaqM8abvkOO84wh5oYSkpXgTzHu2Zza6e7mY+aOmpNTjoFBRxSLlzY0uAOMWEFx0OMKzr+reG1BUtcqQ==
+stylelint-config-standard@^29.0.0:
+  version "29.0.0"
+  resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz#4cc0e0f05512a39bb8b8e97853247d3a95d66fa2"
+  integrity sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==
   dependencies:
-    stylelint-config-recommended "^8.0.0"
+    stylelint-config-recommended "^9.0.0"
 
 stylelint-scss@^4.0.0:
   version "4.2.0"
@@ -10456,15 +10389,15 @@ stylelint-scss@^4.0.0:
     postcss-selector-parser "^6.0.6"
     postcss-value-parser "^4.1.0"
 
-stylelint@^14.14.0:
-  version "14.14.0"
-  resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.14.0.tgz#1acb52497c9a921f23f9c4014d4e0ee6eba768d0"
-  integrity sha512-yUI+4xXfPHVnueYddSQ/e1GuEA/2wVhWQbGj16AmWLtQJtn28lVxfS4b0CsWyVRPgd3Auzi0NXOthIEUhtQmmA==
+stylelint@^14.16.1:
+  version "14.16.1"
+  resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.16.1.tgz#b911063530619a1bbe44c2b875fd8181ebdc742d"
+  integrity sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==
   dependencies:
     "@csstools/selector-specificity" "^2.0.2"
     balanced-match "^2.0.0"
     colord "^2.9.3"
-    cosmiconfig "^7.0.1"
+    cosmiconfig "^7.1.0"
     css-functions-list "^3.1.0"
     debug "^4.3.4"
     fast-glob "^3.2.12"
@@ -10474,21 +10407,21 @@ stylelint@^14.14.0:
     globby "^11.1.0"
     globjoin "^0.1.4"
     html-tags "^3.2.0"
-    ignore "^5.2.0"
+    ignore "^5.2.1"
     import-lazy "^4.0.0"
     imurmurhash "^0.1.4"
     is-plain-object "^5.0.0"
-    known-css-properties "^0.25.0"
+    known-css-properties "^0.26.0"
     mathml-tag-names "^2.1.3"
     meow "^9.0.0"
     micromatch "^4.0.5"
     normalize-path "^3.0.0"
     picocolors "^1.0.0"
-    postcss "^8.4.17"
+    postcss "^8.4.19"
     postcss-media-query-parser "^0.2.3"
     postcss-resolve-nested-selector "^0.1.1"
     postcss-safe-parser "^6.0.0"
-    postcss-selector-parser "^6.0.10"
+    postcss-selector-parser "^6.0.11"
     postcss-value-parser "^4.2.0"
     resolve-from "^5.0.0"
     string-width "^4.2.3"
@@ -10496,7 +10429,7 @@ stylelint@^14.14.0:
     style-search "^0.1.0"
     supports-hyperlinks "^2.3.0"
     svg-tags "^1.0.0"
-    table "^6.8.0"
+    table "^6.8.1"
     v8-compile-cache "^2.3.0"
     write-file-atomic "^4.0.2"
 
@@ -10510,18 +10443,6 @@ substring-trie@^1.0.2:
   resolved "https://registry.npmjs.org/substring-trie/-/substring-trie-1.0.2.tgz"
   integrity sha1-e0JZI5Fii08ssXNlxszkJXx7evU=
 
-supports-color@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
-  integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
-
-supports-color@^3.2.3:
-  version "3.2.3"
-  resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz"
-  integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
-  dependencies:
-    has-flag "^1.0.0"
-
 supports-color@^5.3.0:
   version "5.5.0"
   resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
@@ -10592,10 +10513,10 @@ symbol-tree@^3.2.4:
   resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz"
   integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
 
-table@^6.0.9, table@^6.8.0:
-  version "6.8.0"
-  resolved "https://registry.npmjs.org/table/-/table-6.8.0.tgz"
-  integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==
+table@^6.0.9, table@^6.8.1:
+  version "6.8.1"
+  resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf"
+  integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==
   dependencies:
     ajv "^8.0.1"
     lodash.truncate "^4.4.2"
@@ -10620,11 +10541,6 @@ tar@^6.0.2:
     mkdirp "^1.0.3"
     yallist "^4.0.0"
 
-tcomb@^2.5.0:
-  version "2.7.0"
-  resolved "https://registry.npmjs.org/tcomb/-/tcomb-2.7.0.tgz"
-  integrity sha1-ENYpWAQWaaXVNWe5pO6M3iKxwrA=
-
 temp-dir@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e"
@@ -10977,6 +10893,16 @@ unbox-primitive@^1.0.2:
     has-symbols "^1.0.3"
     which-boxed-primitive "^1.0.2"
 
+uncontrollable@^7.2.1:
+  version "7.2.1"
+  resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738"
+  integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==
+  dependencies:
+    "@babel/runtime" "^7.6.3"
+    "@types/react" ">=16.9.11"
+    invariant "^2.2.4"
+    react-lifecycles-compat "^3.0.4"
+
 unicode-canonical-property-names-ecmascript@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
@@ -11061,7 +10987,7 @@ unpipe@1.0.0, unpipe@~1.0.0:
   resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
   integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
 
-unquote@^1.1.0, unquote@~1.1.1:
+unquote@~1.1.1:
   version "1.1.1"
   resolved "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz"
   integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=
@@ -11145,10 +11071,10 @@ use@^3.1.0:
   resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz"
   integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
 
-utf-8-validate@^5.0.10:
-  version "5.0.10"
-  resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2"
-  integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==
+utf-8-validate@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-6.0.0.tgz#91a169e91ee5441a2bab5f059f4a39cdd402caf2"
+  integrity sha512-OCJuwxQsnG51swYmNloViggxNOFO/leOZpnb/vVeoastJbrzrZZU7lGsYlUcdkCl9nsBu2nkKLjpljb3Ckvb/Q==
   dependencies:
     node-gyp-build "^4.3.0"
 
@@ -11259,7 +11185,7 @@ warning@^3.0.0:
   dependencies:
     loose-envify "^1.0.0"
 
-warning@^4.0.0, warning@^4.0.1:
+warning@^4.0.1, warning@^4.0.3:
   version "4.0.3"
   resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz"
   integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
@@ -11778,10 +11704,10 @@ ws@^7.3.1:
   resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
   integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
 
-ws@^8.10.0, ws@^8.11.0:
-  version "8.11.0"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143"
-  integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==
+ws@^8.11.0, ws@^8.12.0:
+  version "8.12.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8"
+  integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==
 
 xml-name-validator@^4.0.0:
   version "4.0.0"