about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.circleci/config.yml2
-rw-r--r--Aptfile2
-rw-r--r--Dockerfile4
-rw-r--r--Gemfile10
-rw-r--r--Gemfile.lock154
-rw-r--r--Vagrantfile2
-rw-r--r--app/controllers/admin/accounts_controller.rb4
-rw-r--r--app/controllers/admin/dashboard_controller.rb1
-rw-r--r--app/controllers/admin/disputes/appeals_controller.rb40
-rw-r--r--app/controllers/api/web/push_subscriptions_controller.rb23
-rw-r--r--app/controllers/auth/registrations_controller.rb11
-rw-r--r--app/controllers/concerns/authorization.rb2
-rw-r--r--app/controllers/concerns/localized.rb2
-rw-r--r--app/controllers/disputes/appeals_controller.rb26
-rw-r--r--app/controllers/disputes/base_controller.rb23
-rw-r--r--app/controllers/disputes/strikes_controller.rb17
-rw-r--r--app/helpers/admin/account_moderation_notes_helper.rb4
-rw-r--r--app/helpers/admin/action_logs_helper.rb2
-rw-r--r--app/helpers/admin/trends/statuses_helper.rb20
-rw-r--r--app/javascript/flavours/glitch/actions/notifications.js3
-rw-r--r--app/javascript/flavours/glitch/actions/reports.js115
-rw-r--r--app/javascript/flavours/glitch/actions/rules.js27
-rw-r--r--app/javascript/flavours/glitch/components/check.js9
-rw-r--r--app/javascript/flavours/glitch/features/emoji_picker/index.js15
-rw-r--r--app/javascript/flavours/glitch/features/notifications/components/admin_signup.js101
-rw-r--r--app/javascript/flavours/glitch/features/notifications/components/column_settings.js16
-rw-r--r--app/javascript/flavours/glitch/features/notifications/components/notification.js14
-rw-r--r--app/javascript/flavours/glitch/features/report/category.js93
-rw-r--r--app/javascript/flavours/glitch/features/report/comment.js83
-rw-r--r--app/javascript/flavours/glitch/features/report/components/option.js60
-rw-r--r--app/javascript/flavours/glitch/features/report/components/status_check_box.js56
-rw-r--r--app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js22
-rw-r--r--app/javascript/flavours/glitch/features/report/rules.js64
-rw-r--r--app/javascript/flavours/glitch/features/report/statuses.js58
-rw-r--r--app/javascript/flavours/glitch/features/report/thanks.js84
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/report_modal.js239
-rw-r--r--app/javascript/flavours/glitch/packs/public.js8
-rw-r--r--app/javascript/flavours/glitch/packs/settings.js8
-rw-r--r--app/javascript/flavours/glitch/reducers/index.js4
-rw-r--r--app/javascript/flavours/glitch/reducers/reports.js77
-rw-r--r--app/javascript/flavours/glitch/reducers/rules.js13
-rw-r--r--app/javascript/flavours/glitch/reducers/settings.js3
-rw-r--r--app/javascript/flavours/glitch/styles/admin.scss113
-rw-r--r--app/javascript/flavours/glitch/styles/components/composer.scss4
-rw-r--r--app/javascript/flavours/glitch/styles/components/index.scss22
-rw-r--r--app/javascript/flavours/glitch/styles/components/modal.scss186
-rw-r--r--app/javascript/flavours/glitch/styles/components/status.scss51
-rw-r--r--app/javascript/flavours/glitch/styles/footer.scss17
-rw-r--r--app/javascript/mastodon/actions/notifications.js3
-rw-r--r--app/javascript/mastodon/actions/reports.js115
-rw-r--r--app/javascript/mastodon/actions/rules.js27
-rw-r--r--app/javascript/mastodon/components/check.js9
-rw-r--r--app/javascript/mastodon/components/loading_indicator.js2
-rw-r--r--app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js15
-rw-r--r--app/javascript/mastodon/features/emoji/emoji_compressed.js2
-rw-r--r--app/javascript/mastodon/features/notifications/components/column_settings.js16
-rw-r--r--app/javascript/mastodon/features/notifications/components/notification.js25
-rw-r--r--app/javascript/mastodon/features/report/category.js93
-rw-r--r--app/javascript/mastodon/features/report/comment.js83
-rw-r--r--app/javascript/mastodon/features/report/components/option.js60
-rw-r--r--app/javascript/mastodon/features/report/components/status_check_box.js61
-rw-r--r--app/javascript/mastodon/features/report/containers/status_check_box_container.js22
-rw-r--r--app/javascript/mastodon/features/report/rules.js64
-rw-r--r--app/javascript/mastodon/features/report/statuses.js58
-rw-r--r--app/javascript/mastodon/features/report/thanks.js84
-rw-r--r--app/javascript/mastodon/features/ui/components/report_modal.js241
-rw-r--r--app/javascript/mastodon/locales/af.json2
-rw-r--r--app/javascript/mastodon/locales/ar.json40
-rw-r--r--app/javascript/mastodon/locales/ast.json2
-rw-r--r--app/javascript/mastodon/locales/bg.json2
-rw-r--r--app/javascript/mastodon/locales/bn.json2
-rw-r--r--app/javascript/mastodon/locales/br.json4
-rw-r--r--app/javascript/mastodon/locales/ca.json34
-rw-r--r--app/javascript/mastodon/locales/co.json2
-rw-r--r--app/javascript/mastodon/locales/cs.json2
-rw-r--r--app/javascript/mastodon/locales/cy.json2
-rw-r--r--app/javascript/mastodon/locales/da.json30
-rw-r--r--app/javascript/mastodon/locales/de.json32
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json8
-rw-r--r--app/javascript/mastodon/locales/el.json16
-rw-r--r--app/javascript/mastodon/locales/en.json2
-rw-r--r--app/javascript/mastodon/locales/eo.json2
-rw-r--r--app/javascript/mastodon/locales/es-AR.json32
-rw-r--r--app/javascript/mastodon/locales/es-MX.json32
-rw-r--r--app/javascript/mastodon/locales/es.json32
-rw-r--r--app/javascript/mastodon/locales/et.json2
-rw-r--r--app/javascript/mastodon/locales/eu.json32
-rw-r--r--app/javascript/mastodon/locales/fa.json4
-rw-r--r--app/javascript/mastodon/locales/fi.json34
-rw-r--r--app/javascript/mastodon/locales/fr.json42
-rw-r--r--app/javascript/mastodon/locales/ga.json2
-rw-r--r--app/javascript/mastodon/locales/gd.json2
-rw-r--r--app/javascript/mastodon/locales/gl.json32
-rw-r--r--app/javascript/mastodon/locales/he.json2
-rw-r--r--app/javascript/mastodon/locales/hi.json2
-rw-r--r--app/javascript/mastodon/locales/hr.json2
-rw-r--r--app/javascript/mastodon/locales/hu.json36
-rw-r--r--app/javascript/mastodon/locales/hy.json2
-rw-r--r--app/javascript/mastodon/locales/id.json30
-rw-r--r--app/javascript/mastodon/locales/io.json2
-rw-r--r--app/javascript/mastodon/locales/is.json204
-rw-r--r--app/javascript/mastodon/locales/it.json32
-rw-r--r--app/javascript/mastodon/locales/ja.json34
-rw-r--r--app/javascript/mastodon/locales/ka.json2
-rw-r--r--app/javascript/mastodon/locales/kab.json12
-rw-r--r--app/javascript/mastodon/locales/kk.json2
-rw-r--r--app/javascript/mastodon/locales/kmr.json40
-rw-r--r--app/javascript/mastodon/locales/kn.json2
-rw-r--r--app/javascript/mastodon/locales/ko.json34
-rw-r--r--app/javascript/mastodon/locales/ku.json2
-rw-r--r--app/javascript/mastodon/locales/kw.json2
-rw-r--r--app/javascript/mastodon/locales/lt.json2
-rw-r--r--app/javascript/mastodon/locales/lv.json34
-rw-r--r--app/javascript/mastodon/locales/mk.json2
-rw-r--r--app/javascript/mastodon/locales/ml.json2
-rw-r--r--app/javascript/mastodon/locales/mr.json2
-rw-r--r--app/javascript/mastodon/locales/ms.json2
-rw-r--r--app/javascript/mastodon/locales/nl.json2
-rw-r--r--app/javascript/mastodon/locales/nn.json2
-rw-r--r--app/javascript/mastodon/locales/no.json2
-rw-r--r--app/javascript/mastodon/locales/oc.json2
-rw-r--r--app/javascript/mastodon/locales/pa.json2
-rw-r--r--app/javascript/mastodon/locales/pl.json22
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json2
-rw-r--r--app/javascript/mastodon/locales/pt-PT.json32
-rw-r--r--app/javascript/mastodon/locales/ro.json2
-rw-r--r--app/javascript/mastodon/locales/ru.json38
-rw-r--r--app/javascript/mastodon/locales/sa.json2
-rw-r--r--app/javascript/mastodon/locales/sc.json2
-rw-r--r--app/javascript/mastodon/locales/si.json2
-rw-r--r--app/javascript/mastodon/locales/sk.json2
-rw-r--r--app/javascript/mastodon/locales/sl.json30
-rw-r--r--app/javascript/mastodon/locales/sq.json34
-rw-r--r--app/javascript/mastodon/locales/sr-Latn.json2
-rw-r--r--app/javascript/mastodon/locales/sr.json2
-rw-r--r--app/javascript/mastodon/locales/sv.json24
-rw-r--r--app/javascript/mastodon/locales/szl.json2
-rw-r--r--app/javascript/mastodon/locales/ta.json2
-rw-r--r--app/javascript/mastodon/locales/tai.json2
-rw-r--r--app/javascript/mastodon/locales/te.json2
-rw-r--r--app/javascript/mastodon/locales/th.json32
-rw-r--r--app/javascript/mastodon/locales/tr.json34
-rw-r--r--app/javascript/mastodon/locales/tt.json2
-rw-r--r--app/javascript/mastodon/locales/ug.json2
-rw-r--r--app/javascript/mastodon/locales/uk.json30
-rw-r--r--app/javascript/mastodon/locales/ur.json2
-rw-r--r--app/javascript/mastodon/locales/vi.json32
-rw-r--r--app/javascript/mastodon/locales/zgh.json2
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json34
-rw-r--r--app/javascript/mastodon/locales/zh-HK.json2
-rw-r--r--app/javascript/mastodon/locales/zh-TW.json34
-rw-r--r--app/javascript/mastodon/reducers/index.js4
-rw-r--r--app/javascript/mastodon/reducers/reports.js64
-rw-r--r--app/javascript/mastodon/reducers/rules.js13
-rw-r--r--app/javascript/mastodon/reducers/settings.js3
-rw-r--r--app/javascript/mastodon/service_worker/web_push_locales.js1
-rw-r--r--app/javascript/packs/public.js8
-rw-r--r--app/javascript/styles/mastodon/admin.scss113
-rw-r--r--app/javascript/styles/mastodon/components.scss258
-rw-r--r--app/javascript/styles/mastodon/footer.scss17
-rw-r--r--app/lib/activitypub/activity/announce.rb1
-rw-r--r--app/lib/admin/metrics/dimension/base_dimension.rb32
-rw-r--r--app/lib/admin/metrics/dimension/languages_dimension.rb4
-rw-r--r--app/lib/admin/metrics/dimension/servers_dimension.rb4
-rw-r--r--app/lib/admin/metrics/dimension/software_versions_dimension.rb6
-rw-r--r--app/lib/admin/metrics/dimension/sources_dimension.rb4
-rw-r--r--app/lib/admin/metrics/dimension/space_usage_dimension.rb6
-rw-r--r--app/lib/admin/metrics/dimension/tag_languages_dimension.rb6
-rw-r--r--app/lib/admin/metrics/dimension/tag_servers_dimension.rb6
-rw-r--r--app/lib/admin/metrics/measure/active_users_measure.rb10
-rw-r--r--app/lib/admin/metrics/measure/base_measure.rb52
-rw-r--r--app/lib/admin/metrics/measure/interactions_measure.rb10
-rw-r--r--app/lib/admin/metrics/measure/new_users_measure.rb8
-rw-r--r--app/lib/admin/metrics/measure/opened_reports_measure.rb8
-rw-r--r--app/lib/admin/metrics/measure/resolved_reports_measure.rb8
-rw-r--r--app/lib/admin/metrics/measure/tag_accounts_measure.rb10
-rw-r--r--app/lib/admin/metrics/measure/tag_servers_measure.rb10
-rw-r--r--app/lib/admin/metrics/measure/tag_uses_measure.rb10
-rw-r--r--app/lib/admin/metrics/retention.rb26
-rw-r--r--app/lib/feed_manager.rb4
-rw-r--r--app/lib/search_query_transformer.rb37
-rw-r--r--app/lib/video_metadata_extractor.rb3
-rw-r--r--app/mailers/admin_mailer.rb10
-rw-r--r--app/mailers/user_mailer.rb24
-rw-r--r--app/models/account.rb4
-rw-r--r--app/models/account_filter.rb4
-rw-r--r--app/models/account_warning.rb8
-rw-r--r--app/models/admin/action_log_filter.rb2
-rw-r--r--app/models/admin/appeal_filter.rb49
-rw-r--r--app/models/admin/status_filter.rb2
-rw-r--r--app/models/appeal.rb60
-rw-r--r--app/models/media_attachment.rb13
-rw-r--r--app/models/notification.rb14
-rw-r--r--app/models/user.rb6
-rw-r--r--app/policies/account_warning_policy.rb17
-rw-r--r--app/policies/appeal_policy.rb13
-rw-r--r--app/services/appeal_service.rb28
-rw-r--r--app/services/approve_appeal_service.rb74
-rw-r--r--app/services/bootstrap_timeline_service.rb7
-rw-r--r--app/services/fetch_link_card_service.rb2
-rw-r--r--app/services/notify_service.rb44
-rw-r--r--app/views/admin/account_moderation_notes/_account_moderation_note.html.haml7
-rw-r--r--app/views/admin/account_warnings/_account_warning.html.haml31
-rw-r--r--app/views/admin/accounts/show.html.haml21
-rw-r--r--app/views/admin/dashboard/index.html.haml7
-rw-r--r--app/views/admin/disputes/appeals/_appeal.html.haml21
-rw-r--r--app/views/admin/disputes/appeals/index.html.haml19
-rw-r--r--app/views/admin/report_notes/_report_note.html.haml2
-rw-r--r--app/views/admin/reports/show.html.haml2
-rw-r--r--app/views/admin_mailer/new_appeal.text.erb9
-rw-r--r--app/views/admin_mailer/new_trending_tags.text.erb2
-rw-r--r--app/views/auth/registrations/_account_warning.html.haml20
-rw-r--r--app/views/auth/registrations/_status.html.haml31
-rw-r--r--app/views/disputes/strikes/show.html.haml128
-rw-r--r--app/views/layouts/public.html.haml4
-rw-r--r--app/views/settings/preferences/notifications/show.html.haml1
-rw-r--r--app/views/statuses/_detailed_status.html.haml2
-rw-r--r--app/views/user_mailer/appeal_approved.html.haml59
-rw-r--r--app/views/user_mailer/appeal_approved.text.erb7
-rw-r--r--app/views/user_mailer/appeal_rejected.html.haml59
-rw-r--r--app/views/user_mailer/appeal_rejected.text.erb7
-rw-r--r--app/views/user_mailer/warning.html.haml6
-rw-r--r--config/brakeman.ignore64
-rw-r--r--config/i18n-tasks.yml1
-rw-r--r--config/initializers/preload_link_headers.rb2
-rw-r--r--config/initializers/rack_attack.rb7
-rw-r--r--config/locales/activerecord.is.yml2
-rw-r--r--config/locales/activerecord.lv.yml2
-rw-r--r--config/locales/ar.yml90
-rw-r--r--config/locales/bg.yml1
-rw-r--r--config/locales/bn.yml1
-rw-r--r--config/locales/br.yml3
-rw-r--r--config/locales/ca.yml98
-rw-r--r--config/locales/co.yml9
-rw-r--r--config/locales/cs.yml38
-rw-r--r--config/locales/cy.yml17
-rw-r--r--config/locales/da.yml102
-rw-r--r--config/locales/de.yml108
-rw-r--r--config/locales/devise.th.yml2
-rw-r--r--config/locales/doorkeeper.fr.yml8
-rw-r--r--config/locales/doorkeeper.is.yml8
-rw-r--r--config/locales/el.yml33
-rw-r--r--config/locales/en.yml90
-rw-r--r--config/locales/eo.yml9
-rw-r--r--config/locales/es-AR.yml110
-rw-r--r--config/locales/es-MX.yml109
-rw-r--r--config/locales/es.yml102
-rw-r--r--config/locales/et.yml9
-rw-r--r--config/locales/eu.yml61
-rw-r--r--config/locales/fa.yml19
-rw-r--r--config/locales/fi.yml101
-rw-r--r--config/locales/fr.yml140
-rw-r--r--config/locales/gd.yml40
-rw-r--r--config/locales/gl.yml150
-rw-r--r--config/locales/he.yml22
-rw-r--r--config/locales/hu.yml120
-rw-r--r--config/locales/hy.yml4
-rw-r--r--config/locales/id.yml108
-rw-r--r--config/locales/is.yml216
-rw-r--r--config/locales/it.yml103
-rw-r--r--config/locales/ja.yml74
-rw-r--r--config/locales/ka.yml4
-rw-r--r--config/locales/kab.yml21
-rw-r--r--config/locales/kk.yml9
-rw-r--r--config/locales/kmr.yml108
-rw-r--r--config/locales/ko.yml87
-rw-r--r--config/locales/ku.yml9
-rw-r--r--config/locales/lt.yml2
-rw-r--r--config/locales/lv.yml109
-rw-r--r--config/locales/ml.yml2
-rw-r--r--config/locales/ms.yml5
-rw-r--r--config/locales/nl.yml9
-rw-r--r--config/locales/nn.yml9
-rw-r--r--config/locales/no.yml9
-rw-r--r--config/locales/oc.yml9
-rw-r--r--config/locales/pl.yml106
-rw-r--r--config/locales/pt-BR.yml22
-rw-r--r--config/locales/pt-PT.yml108
-rw-r--r--config/locales/ro.yml3
-rw-r--r--config/locales/ru.yml78
-rw-r--r--config/locales/sc.yml9
-rw-r--r--config/locales/simple_form.ar.yml26
-rw-r--r--config/locales/simple_form.ast.yml1
-rw-r--r--config/locales/simple_form.ca.yml9
-rw-r--r--config/locales/simple_form.co.yml2
-rw-r--r--config/locales/simple_form.cs.yml2
-rw-r--r--config/locales/simple_form.cy.yml2
-rw-r--r--config/locales/simple_form.da.yml5
-rw-r--r--config/locales/simple_form.de.yml7
-rw-r--r--config/locales/simple_form.el.yml2
-rw-r--r--config/locales/simple_form.en.yml9
-rw-r--r--config/locales/simple_form.eo.yml2
-rw-r--r--config/locales/simple_form.es-AR.yml9
-rw-r--r--config/locales/simple_form.es-MX.yml2
-rw-r--r--config/locales/simple_form.es.yml9
-rw-r--r--config/locales/simple_form.et.yml2
-rw-r--r--config/locales/simple_form.eu.yml2
-rw-r--r--config/locales/simple_form.fa.yml2
-rw-r--r--config/locales/simple_form.fi.yml72
-rw-r--r--config/locales/simple_form.fr.yml9
-rw-r--r--config/locales/simple_form.gd.yml2
-rw-r--r--config/locales/simple_form.gl.yml11
-rw-r--r--config/locales/simple_form.hu.yml9
-rw-r--r--config/locales/simple_form.hy.yml2
-rw-r--r--config/locales/simple_form.id.yml9
-rw-r--r--config/locales/simple_form.is.yml43
-rw-r--r--config/locales/simple_form.it.yml9
-rw-r--r--config/locales/simple_form.ja.yml2
-rw-r--r--config/locales/simple_form.kab.yml1
-rw-r--r--config/locales/simple_form.kk.yml2
-rw-r--r--config/locales/simple_form.kmr.yml9
-rw-r--r--config/locales/simple_form.ko.yml9
-rw-r--r--config/locales/simple_form.ku.yml2
-rw-r--r--config/locales/simple_form.lv.yml7
-rw-r--r--config/locales/simple_form.nl.yml2
-rw-r--r--config/locales/simple_form.nn.yml2
-rw-r--r--config/locales/simple_form.no.yml2
-rw-r--r--config/locales/simple_form.oc.yml2
-rw-r--r--config/locales/simple_form.pl.yml2
-rw-r--r--config/locales/simple_form.pt-BR.yml2
-rw-r--r--config/locales/simple_form.pt-PT.yml9
-rw-r--r--config/locales/simple_form.ro.yml2
-rw-r--r--config/locales/simple_form.ru.yml6
-rw-r--r--config/locales/simple_form.sc.yml2
-rw-r--r--config/locales/simple_form.sk.yml2
-rw-r--r--config/locales/simple_form.sl.yml12
-rw-r--r--config/locales/simple_form.sq.yml6
-rw-r--r--config/locales/simple_form.sr.yml1
-rw-r--r--config/locales/simple_form.sv.yml4
-rw-r--r--config/locales/simple_form.th.yml4
-rw-r--r--config/locales/simple_form.tr.yml7
-rw-r--r--config/locales/simple_form.uk.yml3
-rw-r--r--config/locales/simple_form.vi.yml9
-rw-r--r--config/locales/simple_form.zh-CN.yml9
-rw-r--r--config/locales/simple_form.zh-HK.yml2
-rw-r--r--config/locales/simple_form.zh-TW.yml13
-rw-r--r--config/locales/sk.yml13
-rw-r--r--config/locales/sl.yml66
-rw-r--r--config/locales/sq.yml103
-rw-r--r--config/locales/sr-Latn.yml5
-rw-r--r--config/locales/sr.yml10
-rw-r--r--config/locales/sv.yml41
-rw-r--r--config/locales/ta.yml1
-rw-r--r--config/locales/te.yml1
-rw-r--r--config/locales/th.yml73
-rw-r--r--config/locales/tr.yml101
-rw-r--r--config/locales/tt.yml2
-rw-r--r--config/locales/uk.yml92
-rw-r--r--config/locales/vi.yml105
-rw-r--r--config/locales/zgh.yml2
-rw-r--r--config/locales/zh-CN.yml103
-rw-r--r--config/locales/zh-HK.yml7
-rw-r--r--config/locales/zh-TW.yml107
-rw-r--r--config/navigation.rb4
-rw-r--r--config/routes.rb15
-rw-r--r--config/settings.yml1
-rw-r--r--db/migrate/20170920032311_fix_reblogs_in_feeds.rb2
-rw-r--r--db/migrate/20220124141035_create_appeals.rb14
-rw-r--r--db/migrate/20220210153119_add_overruled_at_to_account_warnings.rb5
-rw-r--r--db/schema.rb23
-rw-r--r--lib/mastodon/statuses_cli.rb2
-rw-r--r--lib/paperclip/transcoder.rb16
-rw-r--r--package.json12
-rw-r--r--spec/controllers/admin/disputes/appeals_controller_spec.rb53
-rw-r--r--spec/controllers/disputes/appeals_controller_spec.rb27
-rw-r--r--spec/controllers/disputes/strikes_controller_spec.rb30
-rw-r--r--spec/controllers/settings/two_factor_authentication/otp_authentication_controller_spec.rb2
-rw-r--r--spec/fabricators/account_warning_fabricator.rb7
-rw-r--r--spec/fabricators/appeal_fabricator.rb5
-rw-r--r--spec/lib/activitypub/activity/announce_spec.rb32
-rw-r--r--spec/mailers/previews/admin_mailer_preview.rb5
-rw-r--r--spec/mailers/previews/user_mailer_preview.rb5
-rw-r--r--spec/models/appeal_spec.rb5
-rw-r--r--spec/models/user_spec.rb13
-rw-r--r--spec/models/web/push_subscription_spec.rb2
-rw-r--r--spec/services/block_domain_service_spec.rb2
-rw-r--r--spec/services/clear_domain_media_service_spec.rb2
-rw-r--r--spec/services/delete_account_service_spec.rb2
-rw-r--r--spec/validators/unreserved_username_validator_spec.rb4
-rw-r--r--streaming/index.js15
-rw-r--r--yarn.lock188
381 files changed, 7619 insertions, 2801 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 751ca95b1..a9ad92145 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -32,7 +32,7 @@ commands:
           name: Install system dependencies
           command: |
             sudo apt-get update
-            sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler
+            sudo apt-get install -y libicu-dev libidn11-dev
   install-ruby-dependencies:
     parameters:
       ruby-version:
diff --git a/Aptfile b/Aptfile
index b2cbad714..9235141ad 100644
--- a/Aptfile
+++ b/Aptfile
@@ -4,10 +4,8 @@ libicu-dev
 libidn11
 libidn11-dev
 libpq-dev
-libprotobuf-dev
 libxdamage1
 libxfixes3
-protobuf-compiler
 zlib1g-dev
 libcairo2
 libcroco3
diff --git a/Dockerfile b/Dockerfile
index 79f2fe0b5..0185ebfe9 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -51,7 +51,7 @@ RUN npm install -g npm@latest && \
 	gem install bundler && \
 	apt-get update && \
 	apt-get install -y --no-install-recommends git libicu-dev libidn11-dev \
-	libpq-dev libprotobuf-dev protobuf-compiler shared-mime-info
+	libpq-dev shared-mime-info
 
 COPY Gemfile* package.json yarn.lock /opt/mastodon/
 
@@ -88,7 +88,7 @@ RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selectio
 RUN apt-get update && \
   apt-get -y --no-install-recommends install \
 	  libssl1.1 libpq5 imagemagick ffmpeg libjemalloc2 \
-	  libicu66 libprotobuf17 libidn11 libyaml-0-2 \
+	  libicu66 libidn11 libyaml-0-2 \
 	  file ca-certificates tzdata libreadline8 gcc tini apt-utils && \
 	ln -s /opt/mastodon /mastodon && \
 	gem install bundler && \
diff --git a/Gemfile b/Gemfile
index ae999d964..c35c7b2a3 100644
--- a/Gemfile
+++ b/Gemfile
@@ -21,7 +21,7 @@ gem 'dotenv-rails', '~> 2.7'
 gem 'aws-sdk-s3', '~> 1.112', require: false
 gem 'fog-core', '<= 2.1.0'
 gem 'fog-openstack', '~> 0.3', require: false
-gem 'kt-paperclip', '~> 7.0'
+gem 'kt-paperclip', '~> 7.1'
 gem 'blurhash', '~> 0.1'
 
 gem 'active_model_serializers', '~> 0.10'
@@ -65,7 +65,7 @@ gem 'oj', '~> 3.13'
 gem 'ox', '~> 2.14'
 gem 'parslet'
 gem 'posix-spawn'
-gem 'pundit', '~> 2.1'
+gem 'pundit', '~> 2.2'
 gem 'premailer-rails'
 gem 'rack-attack', '~> 6.5'
 gem 'rack-cors', '~> 1.1', require: 'rack/cors'
@@ -76,7 +76,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.5'
+gem 'scenic', '~> 1.6'
 gem 'sidekiq', '~> 6.4'
 gem 'sidekiq-scheduler', '~> 3.1'
 gem 'sidekiq-unique-jobs', '~> 7.1'
@@ -105,7 +105,7 @@ group :development, :test do
   gem 'i18n-tasks', '~> 0.9', require: false
   gem 'pry-byebug', '~> 3.9'
   gem 'pry-rails', '~> 0.3'
-  gem 'rspec-rails', '~> 5.0'
+  gem 'rspec-rails', '~> 5.1'
 end
 
 group :production, :test do
@@ -126,7 +126,7 @@ end
 
 group :development do
   gem 'active_record_query_trace', '~> 1.8'
-  gem 'annotate', '~> 3.1'
+  gem 'annotate', '~> 3.2'
   gem 'better_errors', '~> 2.9'
   gem 'binding_of_caller', '~> 1.0'
   gem 'bullet', '~> 7.0'
diff --git a/Gemfile.lock b/Gemfile.lock
index 9d160dade..28b363c2e 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,40 +1,40 @@
 GEM
   remote: https://rubygems.org/
   specs:
-    actioncable (6.1.4.4)
-      actionpack (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+    actioncable (6.1.4.6)
+      actionpack (= 6.1.4.6)
+      activesupport (= 6.1.4.6)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
-    actionmailbox (6.1.4.4)
-      actionpack (= 6.1.4.4)
-      activejob (= 6.1.4.4)
-      activerecord (= 6.1.4.4)
-      activestorage (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+    actionmailbox (6.1.4.6)
+      actionpack (= 6.1.4.6)
+      activejob (= 6.1.4.6)
+      activerecord (= 6.1.4.6)
+      activestorage (= 6.1.4.6)
+      activesupport (= 6.1.4.6)
       mail (>= 2.7.1)
-    actionmailer (6.1.4.4)
-      actionpack (= 6.1.4.4)
-      actionview (= 6.1.4.4)
-      activejob (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+    actionmailer (6.1.4.6)
+      actionpack (= 6.1.4.6)
+      actionview (= 6.1.4.6)
+      activejob (= 6.1.4.6)
+      activesupport (= 6.1.4.6)
       mail (~> 2.5, >= 2.5.4)
       rails-dom-testing (~> 2.0)
-    actionpack (6.1.4.4)
-      actionview (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+    actionpack (6.1.4.6)
+      actionview (= 6.1.4.6)
+      activesupport (= 6.1.4.6)
       rack (~> 2.0, >= 2.0.9)
       rack-test (>= 0.6.3)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.0, >= 1.2.0)
-    actiontext (6.1.4.4)
-      actionpack (= 6.1.4.4)
-      activerecord (= 6.1.4.4)
-      activestorage (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+    actiontext (6.1.4.6)
+      actionpack (= 6.1.4.6)
+      activerecord (= 6.1.4.6)
+      activestorage (= 6.1.4.6)
+      activesupport (= 6.1.4.6)
       nokogiri (>= 1.8.5)
-    actionview (6.1.4.4)
-      activesupport (= 6.1.4.4)
+    actionview (6.1.4.6)
+      activesupport (= 6.1.4.6)
       builder (~> 3.1)
       erubi (~> 1.4)
       rails-dom-testing (~> 2.0)
@@ -45,22 +45,22 @@ GEM
       case_transform (>= 0.2)
       jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
     active_record_query_trace (1.8)
-    activejob (6.1.4.4)
-      activesupport (= 6.1.4.4)
+    activejob (6.1.4.6)
+      activesupport (= 6.1.4.6)
       globalid (>= 0.3.6)
-    activemodel (6.1.4.4)
-      activesupport (= 6.1.4.4)
-    activerecord (6.1.4.4)
-      activemodel (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
-    activestorage (6.1.4.4)
-      actionpack (= 6.1.4.4)
-      activejob (= 6.1.4.4)
-      activerecord (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+    activemodel (6.1.4.6)
+      activesupport (= 6.1.4.6)
+    activerecord (6.1.4.6)
+      activemodel (= 6.1.4.6)
+      activesupport (= 6.1.4.6)
+    activestorage (6.1.4.6)
+      actionpack (= 6.1.4.6)
+      activejob (= 6.1.4.6)
+      activerecord (= 6.1.4.6)
+      activesupport (= 6.1.4.6)
       marcel (~> 1.0.0)
       mini_mime (>= 1.1.0)
-    activesupport (6.1.4.4)
+    activesupport (6.1.4.6)
       concurrent-ruby (~> 1.0, >= 1.0.2)
       i18n (>= 1.6, < 2)
       minitest (>= 5.1)
@@ -71,8 +71,8 @@ GEM
     airbrussh (1.4.0)
       sshkit (>= 1.6.1, != 1.7.0)
     android_key_attestation (0.3.0)
-    annotate (3.1.1)
-      activerecord (>= 3.2, < 7.0)
+    annotate (3.2.0)
+      activerecord (>= 3.2, < 8.0)
       rake (>= 10.4, < 14.0)
     ast (2.4.2)
     attr_encrypted (3.1.0)
@@ -181,7 +181,7 @@ GEM
     devise_pam_authenticatable2 (9.2.0)
       devise (>= 4.0.0)
       rpam2 (~> 4.0)
-    diff-lcs (1.4.4)
+    diff-lcs (1.5.0)
     discard (1.2.1)
       activerecord (>= 4.2, < 8)
     docile (1.3.4)
@@ -332,7 +332,7 @@ GEM
       activerecord
       kaminari-core (= 1.2.2)
     kaminari-core (1.2.2)
-    kt-paperclip (7.0.1)
+    kt-paperclip (7.1.1)
       activemodel (>= 4.2.0)
       activesupport (>= 4.2.0)
       marcel (~> 1.0.1)
@@ -356,14 +356,14 @@ GEM
       activesupport (>= 4)
       railties (>= 4)
       request_store (~> 1.0)
-    loofah (2.13.0)
+    loofah (2.14.0)
       crass (~> 1.0.2)
       nokogiri (>= 1.5.9)
     mail (2.7.1)
       mini_mime (>= 0.1.1)
     makara (0.5.1)
       activerecord (>= 5.2.0)
-    marcel (1.0.1)
+    marcel (1.0.2)
     mario-redis-lock (1.2.1)
       redis (>= 3.0.5)
     matrix (0.4.2)
@@ -374,7 +374,7 @@ GEM
       nokogiri (~> 1.10)
     mime-types (3.4.1)
       mime-types-data (~> 3.2015)
-    mime-types-data (3.2021.1115)
+    mime-types-data (3.2022.0105)
     mini_mime (1.1.2)
     mini_portile2 (2.7.1)
     minitest (5.15.0)
@@ -418,7 +418,7 @@ GEM
     parslet (2.0.0)
     pastel (0.8.0)
       tty-color (~> 0.5)
-    pg (1.3.1)
+    pg (1.3.2)
     pghero (2.8.2)
       activerecord (>= 5)
     pkg-config (1.4.7)
@@ -442,7 +442,7 @@ GEM
     public_suffix (4.0.6)
     puma (5.6.2)
       nio4r (~> 2.0)
-    pundit (2.1.1)
+    pundit (2.2.0)
       activesupport (>= 3.0.0)
     raabro (1.4.0)
     racc (1.6.0)
@@ -455,20 +455,20 @@ GEM
       rack
     rack-test (1.1.0)
       rack (>= 1.0, < 3)
-    rails (6.1.4.4)
-      actioncable (= 6.1.4.4)
-      actionmailbox (= 6.1.4.4)
-      actionmailer (= 6.1.4.4)
-      actionpack (= 6.1.4.4)
-      actiontext (= 6.1.4.4)
-      actionview (= 6.1.4.4)
-      activejob (= 6.1.4.4)
-      activemodel (= 6.1.4.4)
-      activerecord (= 6.1.4.4)
-      activestorage (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+    rails (6.1.4.6)
+      actioncable (= 6.1.4.6)
+      actionmailbox (= 6.1.4.6)
+      actionmailer (= 6.1.4.6)
+      actionpack (= 6.1.4.6)
+      actiontext (= 6.1.4.6)
+      actionview (= 6.1.4.6)
+      activejob (= 6.1.4.6)
+      activemodel (= 6.1.4.6)
+      activerecord (= 6.1.4.6)
+      activestorage (= 6.1.4.6)
+      activesupport (= 6.1.4.6)
       bundler (>= 1.15.0)
-      railties (= 6.1.4.4)
+      railties (= 6.1.4.6)
       sprockets-rails (>= 2.0.0)
     rails-controller-testing (1.0.5)
       actionpack (>= 5.0.1.rc1)
@@ -484,9 +484,9 @@ GEM
       railties (>= 6.0.0, < 7)
     rails-settings-cached (0.6.6)
       rails (>= 4.2.0)
-    railties (6.1.4.4)
-      actionpack (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+    railties (6.1.4.6)
+      actionpack (= 6.1.4.6)
+      activesupport (= 6.1.4.6)
       method_source
       rake (>= 0.13)
       thor (~> 1.0)
@@ -509,19 +509,19 @@ GEM
     rexml (3.2.5)
     rotp (6.2.0)
     rpam2 (4.0.2)
-    rqrcode (2.1.0)
+    rqrcode (2.1.1)
       chunky_png (~> 1.0)
       rqrcode_core (~> 1.0)
     rqrcode_core (1.2.0)
-    rspec-core (3.10.1)
-      rspec-support (~> 3.10.0)
-    rspec-expectations (3.10.1)
+    rspec-core (3.11.0)
+      rspec-support (~> 3.11.0)
+    rspec-expectations (3.11.0)
       diff-lcs (>= 1.2.0, < 2.0)
-      rspec-support (~> 3.10.0)
-    rspec-mocks (3.10.2)
+      rspec-support (~> 3.11.0)
+    rspec-mocks (3.11.0)
       diff-lcs (>= 1.2.0, < 2.0)
-      rspec-support (~> 3.10.0)
-    rspec-rails (5.0.2)
+      rspec-support (~> 3.11.0)
+    rspec-rails (5.1.0)
       actionpack (>= 5.2)
       activesupport (>= 5.2)
       railties (>= 5.2)
@@ -532,7 +532,7 @@ GEM
     rspec-sidekiq (3.1.0)
       rspec-core (~> 3.0, >= 3.0.0)
       sidekiq (>= 2.4.0)
-    rspec-support (3.10.3)
+    rspec-support (3.11.0)
     rspec_junit_formatter (0.5.1)
       rspec-core (>= 2, < 4, != 2.12.0)
     rubocop (1.25.1)
@@ -562,7 +562,7 @@ GEM
     sanitize (6.0.0)
       crass (~> 1.0.2)
       nokogiri (>= 1.12.0)
-    scenic (1.5.5)
+    scenic (1.6.0)
       activerecord (>= 4.0.0)
       railties (>= 4.0.0)
     securecompare (1.0.0)
@@ -685,7 +685,7 @@ DEPENDENCIES
   active_model_serializers (~> 0.10)
   active_record_query_trace (~> 1.8)
   addressable (~> 2.8)
-  annotate (~> 3.1)
+  annotate (~> 3.2)
   aws-sdk-s3 (~> 1.112)
   better_errors (~> 2.9)
   binding_of_caller (~> 1.0)
@@ -732,7 +732,7 @@ DEPENDENCIES
   json-ld
   json-ld-preloaded (~> 3.2)
   kaminari (~> 1.2)
-  kt-paperclip (~> 7.0)
+  kt-paperclip (~> 7.1)
   letter_opener (~> 1.7)
   letter_opener_web (~> 2.0)
   link_header (~> 0.0)
@@ -761,7 +761,7 @@ DEPENDENCIES
   pry-byebug (~> 3.9)
   pry-rails (~> 0.3)
   puma (~> 5.6)
-  pundit (~> 2.1)
+  pundit (~> 2.2)
   rack (~> 2.2.3)
   rack-attack (~> 6.5)
   rack-cors (~> 1.1)
@@ -775,14 +775,14 @@ DEPENDENCIES
   redis-namespace (~> 1.8)
   rexml (~> 3.2)
   rqrcode (~> 2.1)
-  rspec-rails (~> 5.0)
+  rspec-rails (~> 5.1)
   rspec-sidekiq (~> 3.1)
   rspec_junit_formatter (~> 0.5)
   rubocop (~> 1.25)
   rubocop-rails (~> 2.13)
   ruby-progressbar (~> 1.11)
   sanitize (~> 6.0)
-  scenic (~> 1.5)
+  scenic (~> 1.6)
   sidekiq (~> 6.4)
   sidekiq-bulk (~> 0.2.0)
   sidekiq-scheduler (~> 3.1)
diff --git a/Vagrantfile b/Vagrantfile
index aeff2f233..0d44b4d23 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -33,11 +33,9 @@ sudo apt-get install \
   redis-tools \
   postgresql \
   postgresql-contrib \
-  protobuf-compiler \
   yarn \
   libicu-dev \
   libidn11-dev \
-  libprotobuf-dev \
   libreadline-dev \
   libpam0g-dev \
   -y
diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb
index e7f56e243..e0ae71b9f 100644
--- a/app/controllers/admin/accounts_controller.rb
+++ b/app/controllers/admin/accounts_controller.rb
@@ -28,7 +28,7 @@ module Admin
       @deletion_request        = @account.deletion_request
       @account_moderation_note = current_account.account_moderation_notes.new(target_account: @account)
       @moderation_notes        = @account.targeted_moderation_notes.latest
-      @warnings                = @account.strikes.custom.latest
+      @warnings                = @account.strikes.includes(:target_account, :account, :appeal).latest
       @domain_block            = DomainBlock.rule_for(@account.domain)
     end
 
@@ -146,7 +146,7 @@ module Admin
     end
 
     def filter_params
-      params.slice(*AccountFilter::KEYS).permit(*AccountFilter::KEYS)
+      params.slice(:page, *AccountFilter::KEYS).permit(:page, *AccountFilter::KEYS)
     end
 
     def form_account_batch_params
diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb
index f0a935411..e376baab2 100644
--- a/app/controllers/admin/dashboard_controller.rb
+++ b/app/controllers/admin/dashboard_controller.rb
@@ -8,6 +8,7 @@ module Admin
       @pending_users_count   = User.pending.count
       @pending_reports_count = Report.unresolved.count
       @pending_tags_count    = Tag.pending_review.count
+      @pending_appeals_count = Appeal.pending.count
     end
 
     private
diff --git a/app/controllers/admin/disputes/appeals_controller.rb b/app/controllers/admin/disputes/appeals_controller.rb
new file mode 100644
index 000000000..32e5e2f6f
--- /dev/null
+++ b/app/controllers/admin/disputes/appeals_controller.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+class Admin::Disputes::AppealsController < Admin::BaseController
+  before_action :set_appeal, except: :index
+
+  def index
+    authorize :appeal, :index?
+
+    @appeals = filtered_appeals.page(params[:page])
+  end
+
+  def approve
+    authorize @appeal, :approve?
+    log_action :approve, @appeal
+    ApproveAppealService.new.call(@appeal, current_account)
+    redirect_to disputes_strike_path(@appeal.strike)
+  end
+
+  def reject
+    authorize @appeal, :approve?
+    log_action :reject, @appeal
+    @appeal.reject!(current_account)
+    UserMailer.appeal_rejected(@appeal.account.user, @appeal)
+    redirect_to disputes_strike_path(@appeal.strike)
+  end
+
+  private
+
+  def filtered_appeals
+    Admin::AppealFilter.new(filter_params.with_defaults(status: 'pending')).results.includes(strike: :account)
+  end
+
+  def filter_params
+    params.slice(:page, *Admin::AppealFilter::KEYS).permit(:page, *Admin::AppealFilter::KEYS)
+  end
+
+  def set_appeal
+    @appeal = Appeal.find(params[:id])
+  end
+end
diff --git a/app/controllers/api/web/push_subscriptions_controller.rb b/app/controllers/api/web/push_subscriptions_controller.rb
index db2512e5f..5167928e9 100644
--- a/app/controllers/api/web/push_subscriptions_controller.rb
+++ b/app/controllers/api/web/push_subscriptions_controller.rb
@@ -17,17 +17,7 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController
 
     data = {
       policy: 'all',
-
-      alerts: {
-        follow: alerts_enabled,
-        follow_request: alerts_enabled,
-        favourite: alerts_enabled,
-        reblog: alerts_enabled,
-        mention: alerts_enabled,
-        poll: alerts_enabled,
-        status: alerts_enabled,
-        update: alerts_enabled,
-      },
+      alerts: Notification::TYPES.index_with { alerts_enabled },
     }
 
     data.deep_merge!(data_params) if params[:data]
@@ -62,15 +52,6 @@ class Api::Web::PushSubscriptionsController < Api::Web::BaseController
   end
 
   def data_params
-    @data_params ||= params.require(:data).permit(:policy, alerts: [
-      :follow,
-      :follow_request,
-      :favourite,
-      :reblog,
-      :mention,
-      :poll,
-      :status,
-      :update,
-    ])
+    @data_params ||= params.require(:data).permit(:policy, alerts: Notification::TYPES)
   end
 end
diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb
index 6b1f3fa82..5d32fe66e 100644
--- a/app/controllers/auth/registrations_controller.rb
+++ b/app/controllers/auth/registrations_controller.rb
@@ -10,6 +10,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController
   before_action :configure_sign_up_params, only: [:create]
   before_action :set_pack
   before_action :set_sessions, only: [:edit, :update]
+  before_action :set_strikes, only: [:edit, :update]
   before_action :set_instance_presenter, only: [:new, :create, :update]
   before_action :set_body_classes, only: [:new, :create, :edit, :update]
   before_action :require_not_suspended!, only: [:update]
@@ -116,8 +117,10 @@ class Auth::RegistrationsController < Devise::RegistrationsController
   end
 
   def set_invite
-    invite = invite_code.present? ? Invite.find_by(code: invite_code) : nil
-    @invite = invite&.valid_for_use? ? invite : nil
+    @invite = begin
+      invite = Invite.find_by(code: invite_code) if invite_code.present?
+      invite if invite&.valid_for_use?
+    end
   end
 
   def determine_layout
@@ -128,6 +131,10 @@ class Auth::RegistrationsController < Devise::RegistrationsController
     @sessions = current_user.session_activations
   end
 
+  def set_strikes
+    @strikes = current_account.strikes.active.latest
+  end
+
   def require_not_suspended!
     forbidden if current_account.suspended?
   end
diff --git a/app/controllers/concerns/authorization.rb b/app/controllers/concerns/authorization.rb
index 95a37e379..05260cc8b 100644
--- a/app/controllers/concerns/authorization.rb
+++ b/app/controllers/concerns/authorization.rb
@@ -3,7 +3,7 @@
 module Authorization
   extend ActiveSupport::Concern
 
-  include Pundit
+  include Pundit::Authorization
 
   def pundit_user
     current_account
diff --git a/app/controllers/concerns/localized.rb b/app/controllers/concerns/localized.rb
index f7b62f09c..173316800 100644
--- a/app/controllers/concerns/localized.rb
+++ b/app/controllers/concerns/localized.rb
@@ -14,7 +14,7 @@ module Localized
   private
 
   def requested_locale
-    requested_locale_name   = available_locale_or_nil(params[:locale])
+    requested_locale_name   = available_locale_or_nil(params[:lang])
     requested_locale_name ||= available_locale_or_nil(current_user.locale) if respond_to?(:user_signed_in?) && user_signed_in?
     requested_locale_name ||= http_accept_language if ENV['DEFAULT_LOCALE'].blank?
     requested_locale_name
diff --git a/app/controllers/disputes/appeals_controller.rb b/app/controllers/disputes/appeals_controller.rb
new file mode 100644
index 000000000..eefd92b5a
--- /dev/null
+++ b/app/controllers/disputes/appeals_controller.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class Disputes::AppealsController < Disputes::BaseController
+  before_action :set_strike
+
+  def create
+    authorize @strike, :appeal?
+
+    @appeal = AppealService.new.call(@strike, appeal_params[:text])
+
+    redirect_to disputes_strike_path(@strike), notice: I18n.t('disputes.strikes.appealed_msg')
+  rescue ActiveRecord::RecordInvalid => e
+    @appeal = e.record
+    render template: 'disputes/strikes/show'
+  end
+
+  private
+
+  def set_strike
+    @strike = current_account.strikes.find(params[:strike_id])
+  end
+
+  def appeal_params
+    params.require(:appeal).permit(:text)
+  end
+end
diff --git a/app/controllers/disputes/base_controller.rb b/app/controllers/disputes/base_controller.rb
new file mode 100644
index 000000000..7830c5524
--- /dev/null
+++ b/app/controllers/disputes/base_controller.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class Disputes::BaseController < ApplicationController
+  include Authorization
+
+  layout 'admin'
+
+  skip_before_action :require_functional!
+
+  before_action :set_body_classes
+  before_action :authenticate_user!
+  before_action :set_pack
+
+  private
+
+  def set_pack
+    use_pack 'admin'
+  end
+
+  def set_body_classes
+    @body_classes = 'admin'
+  end
+end
diff --git a/app/controllers/disputes/strikes_controller.rb b/app/controllers/disputes/strikes_controller.rb
new file mode 100644
index 000000000..d41c5c727
--- /dev/null
+++ b/app/controllers/disputes/strikes_controller.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class Disputes::StrikesController < Disputes::BaseController
+  before_action :set_strike
+
+  def show
+    authorize @strike, :show?
+
+    @appeal = @strike.appeal || @strike.build_appeal
+  end
+
+  private
+
+  def set_strike
+    @strike = AccountWarning.find(params[:id])
+  end
+end
diff --git a/app/helpers/admin/account_moderation_notes_helper.rb b/app/helpers/admin/account_moderation_notes_helper.rb
index 40b2a5289..2f08538ca 100644
--- a/app/helpers/admin/account_moderation_notes_helper.rb
+++ b/app/helpers/admin/account_moderation_notes_helper.rb
@@ -1,10 +1,10 @@
 # frozen_string_literal: true
 
 module Admin::AccountModerationNotesHelper
-  def admin_account_link_to(account)
+  def admin_account_link_to(account, path: nil)
     return if account.nil?
 
-    link_to admin_account_path(account.id), class: name_tag_classes(account), title: account.acct do
+    link_to path || admin_account_path(account.id), class: name_tag_classes(account), title: account.acct do
       safe_join([
                   image_tag(account.avatar.url, width: 15, height: 15, alt: display_name(account), class: 'avatar'),
                   content_tag(:span, account.acct, class: 'username'),
diff --git a/app/helpers/admin/action_logs_helper.rb b/app/helpers/admin/action_logs_helper.rb
index f3aa4be4f..47eeeaac3 100644
--- a/app/helpers/admin/action_logs_helper.rb
+++ b/app/helpers/admin/action_logs_helper.rb
@@ -33,6 +33,8 @@ module Admin::ActionLogsHelper
       "#{record.ip}/#{record.ip.prefix} (#{I18n.t("simple_form.labels.ip_block.severities.#{record.severity}")})"
     when 'Instance'
       record.domain
+    when 'Appeal'
+      link_to record.account.acct, disputes_strike_path(record.strike)
     end
   end
 
diff --git a/app/helpers/admin/trends/statuses_helper.rb b/app/helpers/admin/trends/statuses_helper.rb
new file mode 100644
index 000000000..d16e3dd12
--- /dev/null
+++ b/app/helpers/admin/trends/statuses_helper.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module Admin::Trends::StatusesHelper
+  def one_line_preview(status)
+    text = begin
+      if status.local?
+        status.text.split("\n").first
+      else
+        Nokogiri::HTML(status.text).css('html > body > *').first&.text
+      end
+    end
+
+    return '' if text.blank?
+
+    html = Formatter.instance.send(:encode, text)
+    html = Formatter.instance.send(:encode_custom_emojis, html, status.emojis, prefers_autoplay?)
+
+    html.html_safe # rubocop:disable Rails/OutputSafety
+  end
+end
diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js
index 40430102c..42ad39efa 100644
--- a/app/javascript/flavours/glitch/actions/notifications.js
+++ b/app/javascript/flavours/glitch/actions/notifications.js
@@ -57,7 +57,7 @@ defineMessages({
 });
 
 const fetchRelatedRelationships = (dispatch, notifications) => {
-  const accountIds = notifications.filter(item => item.type === 'follow').map(item => item.account.id);
+  const accountIds = notifications.filter(item => ['follow', 'follow_request', 'admin.sign_up'].indexOf(item.type) !== -1).map(item => item.account.id);
 
   if (accountIds > 0) {
     dispatch(fetchRelationships(accountIds));
@@ -144,6 +144,7 @@ const excludeTypesFromFilter = filter => {
     'poll',
     'status',
     'update',
+    'admin.sign_up',
   ]);
 
   return allTypes.filterNot(item => item === filter).toJS();
diff --git a/app/javascript/flavours/glitch/actions/reports.js b/app/javascript/flavours/glitch/actions/reports.js
index 80c3b3280..333bc71f4 100644
--- a/app/javascript/flavours/glitch/actions/reports.js
+++ b/app/javascript/flavours/glitch/actions/reports.js
@@ -1,89 +1,38 @@
 import api from 'flavours/glitch/util/api';
-import { openModal, closeModal } from './modal';
-
-export const REPORT_INIT   = 'REPORT_INIT';
-export const REPORT_CANCEL = 'REPORT_CANCEL';
+import { openModal } from './modal';
 
 export const REPORT_SUBMIT_REQUEST = 'REPORT_SUBMIT_REQUEST';
 export const REPORT_SUBMIT_SUCCESS = 'REPORT_SUBMIT_SUCCESS';
 export const REPORT_SUBMIT_FAIL    = 'REPORT_SUBMIT_FAIL';
 
-export const REPORT_STATUS_TOGGLE  = 'REPORT_STATUS_TOGGLE';
-export const REPORT_COMMENT_CHANGE = 'REPORT_COMMENT_CHANGE';
-export const REPORT_FORWARD_CHANGE = 'REPORT_FORWARD_CHANGE';
-
-export function initReport(account, status) {
-  return dispatch => {
-    dispatch({
-      type: REPORT_INIT,
-      account,
-      status,
-    });
-
-    dispatch(openModal('REPORT'));
-  };
-};
-
-export function cancelReport() {
-  return {
-    type: REPORT_CANCEL,
-  };
-};
-
-export function toggleStatusReport(statusId, checked) {
-  return {
-    type: REPORT_STATUS_TOGGLE,
-    statusId,
-    checked,
-  };
-};
-
-export function submitReport() {
-  return (dispatch, getState) => {
-    dispatch(submitReportRequest());
-
-    api(getState).post('/api/v1/reports', {
-      account_id: getState().getIn(['reports', 'new', 'account_id']),
-      status_ids: getState().getIn(['reports', 'new', 'status_ids']),
-      comment: getState().getIn(['reports', 'new', 'comment']),
-      forward: getState().getIn(['reports', 'new', 'forward']),
-    }).then(response => {
-      dispatch(closeModal());
-      dispatch(submitReportSuccess(response.data));
-    }).catch(error => dispatch(submitReportFail(error)));
-  };
-};
-
-export function submitReportRequest() {
-  return {
-    type: REPORT_SUBMIT_REQUEST,
-  };
-};
-
-export function submitReportSuccess(report) {
-  return {
-    type: REPORT_SUBMIT_SUCCESS,
-    report,
-  };
-};
-
-export function submitReportFail(error) {
-  return {
-    type: REPORT_SUBMIT_FAIL,
-    error,
-  };
-};
-
-export function changeReportComment(comment) {
-  return {
-    type: REPORT_COMMENT_CHANGE,
-    comment,
-  };
-};
-
-export function changeReportForward(forward) {
-  return {
-    type: REPORT_FORWARD_CHANGE,
-    forward,
-  };
-};
+export const initReport = (account, status) => dispatch =>
+  dispatch(openModal('REPORT', {
+    accountId: account.get('id'),
+    statusId: status?.get('id'),
+  }));
+
+export const submitReport = (params, onSuccess, onFail) => (dispatch, getState) => {
+  dispatch(submitReportRequest());
+
+  api(getState).post('/api/v1/reports', params).then(response => {
+    dispatch(submitReportSuccess(response.data));
+    if (onSuccess) onSuccess();
+  }).catch(error => {
+    dispatch(submitReportFail(error));
+    if (onFail) onFail();
+  });
+};
+
+export const submitReportRequest = () => ({
+  type: REPORT_SUBMIT_REQUEST,
+});
+
+export const submitReportSuccess = report => ({
+  type: REPORT_SUBMIT_SUCCESS,
+  report,
+});
+
+export const submitReportFail = error => ({
+  type: REPORT_SUBMIT_FAIL,
+  error,
+});
diff --git a/app/javascript/flavours/glitch/actions/rules.js b/app/javascript/flavours/glitch/actions/rules.js
new file mode 100644
index 000000000..b95045e81
--- /dev/null
+++ b/app/javascript/flavours/glitch/actions/rules.js
@@ -0,0 +1,27 @@
+import api from 'flavours/glitch/util/api';
+
+export const RULES_FETCH_REQUEST = 'RULES_FETCH_REQUEST';
+export const RULES_FETCH_SUCCESS = 'RULES_FETCH_SUCCESS';
+export const RULES_FETCH_FAIL    = 'RULES_FETCH_FAIL';
+
+export const fetchRules = () => (dispatch, getState) => {
+  dispatch(fetchRulesRequest());
+
+  api(getState)
+    .get('/api/v1/instance').then(({ data }) => dispatch(fetchRulesSuccess(data.rules)))
+    .catch(err => dispatch(fetchRulesFail(err)));
+};
+
+const fetchRulesRequest = () => ({
+  type: RULES_FETCH_REQUEST,
+});
+
+const fetchRulesSuccess = rules => ({
+  type: RULES_FETCH_SUCCESS,
+  rules,
+});
+
+const fetchRulesFail = error => ({
+  type: RULES_FETCH_FAIL,
+  error,
+});
diff --git a/app/javascript/flavours/glitch/components/check.js b/app/javascript/flavours/glitch/components/check.js
new file mode 100644
index 000000000..ee2ef1595
--- /dev/null
+++ b/app/javascript/flavours/glitch/components/check.js
@@ -0,0 +1,9 @@
+import React from 'react';
+
+const Check = () => (
+  <svg width='14' height='11' viewBox='0 0 14 11'>
+    <path d='M11.264 0L5.26 6.004 2.103 2.847 0 4.95l5.26 5.26 8.108-8.107L11.264 0' fill='currentColor' fillRule='evenodd' />
+  </svg>
+);
+
+export default Check;
diff --git a/app/javascript/flavours/glitch/features/emoji_picker/index.js b/app/javascript/flavours/glitch/features/emoji_picker/index.js
index 78f691c98..5de9fe107 100644
--- a/app/javascript/flavours/glitch/features/emoji_picker/index.js
+++ b/app/javascript/flavours/glitch/features/emoji_picker/index.js
@@ -250,7 +250,7 @@ class EmojiPickerMenu extends React.PureComponent {
 
   state = {
     modifierOpen: false,
-    placement: null,
+    readyToFocus: false,
   };
 
   handleDocumentClick = e => {
@@ -262,6 +262,16 @@ class EmojiPickerMenu extends React.PureComponent {
   componentDidMount () {
     document.addEventListener('click', this.handleDocumentClick, false);
     document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
+
+    // Because of https://github.com/react-bootstrap/react-bootstrap/issues/2614 we need
+    // to wait for a frame before focusing
+    requestAnimationFrame(() => {
+      this.setState({ readyToFocus: true });
+      if (this.node) {
+        const element = this.node.querySelector('input[type="search"]');
+        if (element) element.focus();
+      }
+    });
   }
 
   componentWillUnmount () {
@@ -361,7 +371,7 @@ class EmojiPickerMenu extends React.PureComponent {
           showSkinTones={false}
           backgroundImageFn={backgroundImageFn}
           notFound={notFoundFn}
-          autoFocus
+          autoFocus={this.state.readyToFocus}
           emojiTooltip
           native={useSystemEmojiFont}
         />
@@ -396,6 +406,7 @@ class EmojiPickerDropdown extends React.PureComponent {
   state = {
     active: false,
     loading: false,
+    placement: null,
   };
 
   setRef = (c) => {
diff --git a/app/javascript/flavours/glitch/features/notifications/components/admin_signup.js b/app/javascript/flavours/glitch/features/notifications/components/admin_signup.js
new file mode 100644
index 000000000..355ebef94
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/notifications/components/admin_signup.js
@@ -0,0 +1,101 @@
+//  Package imports.
+import React from 'react';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import PropTypes from 'prop-types';
+import { FormattedMessage } from 'react-intl';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import { HotKeys } from 'react-hotkeys';
+import classNames from 'classnames';
+
+// Our imports.
+import Permalink from 'flavours/glitch/components/permalink';
+import AccountContainer from 'flavours/glitch/containers/account_container';
+import NotificationOverlayContainer from '../containers/overlay_container';
+import Icon from 'flavours/glitch/components/icon';
+
+export default class NotificationFollow extends ImmutablePureComponent {
+
+  static propTypes = {
+    hidden: PropTypes.bool,
+    id: PropTypes.string.isRequired,
+    account: ImmutablePropTypes.map.isRequired,
+    notification: ImmutablePropTypes.map.isRequired,
+    unread: PropTypes.bool,
+  };
+
+  handleMoveUp = () => {
+    const { notification, onMoveUp } = this.props;
+    onMoveUp(notification.get('id'));
+  }
+
+  handleMoveDown = () => {
+    const { notification, onMoveDown } = this.props;
+    onMoveDown(notification.get('id'));
+  }
+
+  handleOpen = () => {
+    this.handleOpenProfile();
+  }
+
+  handleOpenProfile = () => {
+    const { notification } = this.props;
+    this.context.router.history.push(`/@${notification.getIn(['account', 'acct'])}`);
+  }
+
+  handleMention = e => {
+    e.preventDefault();
+
+    const { notification, onMention } = this.props;
+    onMention(notification.get('account'), this.context.router.history);
+  }
+
+  getHandlers () {
+    return {
+      moveUp: this.handleMoveUp,
+      moveDown: this.handleMoveDown,
+      open: this.handleOpen,
+      openProfile: this.handleOpenProfile,
+      mention: this.handleMention,
+      reply: this.handleMention,
+    };
+  }
+
+  render () {
+    const { account, notification, hidden, unread } = this.props;
+
+    //  Links to the display name.
+    const displayName = account.get('display_name_html') || account.get('username');
+    const link = (
+      <bdi><Permalink
+        className='notification__display-name'
+        href={account.get('url')}
+        title={account.get('acct')}
+        to={`/@${account.get('acct')}`}
+        dangerouslySetInnerHTML={{ __html: displayName }}
+      /></bdi>
+    );
+
+    //  Renders.
+    return (
+      <HotKeys handlers={this.getHandlers()}>
+        <div className={classNames('notification notification-admin-sign-up focusable', { unread })} tabIndex='0'>
+          <div className='notification__message'>
+            <div className='notification__favourite-icon-wrapper'>
+              <Icon fixedWidth id='user-plus' />
+            </div>
+
+            <FormattedMessage
+              id='notification.admin.sign_up'
+              defaultMessage='{name} signed up'
+              values={{ name: link }}
+            />
+          </div>
+
+          <AccountContainer hidden={hidden} id={account.get('id')} withNote={false} />
+          <NotificationOverlayContainer notification={notification} />
+        </div>
+      </HotKeys>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/notifications/components/column_settings.js b/app/javascript/flavours/glitch/features/notifications/components/column_settings.js
index 569ba4db0..0dad079ad 100644
--- a/app/javascript/flavours/glitch/features/notifications/components/column_settings.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/column_settings.js
@@ -6,6 +6,7 @@ import ClearColumnButton from './clear_column_button';
 import GrantPermissionButton from './grant_permission_button';
 import SettingToggle from './setting_toggle';
 import PillBarButton from './pill_bar_button';
+import { isStaff } from 'flavours/glitch/util/initial_state';
 
 export default class ColumnSettings extends React.PureComponent {
 
@@ -156,7 +157,7 @@ export default class ColumnSettings extends React.PureComponent {
         </div>
 
         <div role='group' aria-labelledby='notifications-update'>
-          <span id='notifications-status' className='column-settings__section'><FormattedMessage id='notifications.column_settings.update' defaultMessage='Edits:' /></span>
+          <span id='notifications-update' className='column-settings__section'><FormattedMessage id='notifications.column_settings.update' defaultMessage='Edits:' /></span>
 
           <div className='column-settings__pillbar'>
             <PillBarButton disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'update']} onChange={onChange} label={alertStr} />
@@ -165,6 +166,19 @@ export default class ColumnSettings extends React.PureComponent {
             <PillBarButton prefix='notifications' settings={settings} settingPath={['sounds', 'update']} onChange={onChange} label={soundStr} />
           </div>
         </div>
+
+        {isStaff && (
+          <div role='group' aria-labelledby='notifications-admin-sign-up'>
+            <span id='notifications-status' className='column-settings__section'><FormattedMessage id='notifications.column_settings.admin.sign_up' defaultMessage='New sign-ups:' /></span>
+
+            <div className='column-settings__pillbar'>
+              <PillBarButton disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'admin.sign_up']} onChange={onChange} label={alertStr} />
+              {showPushSettings && <PillBarButton prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'admin.sign_up']} onChange={this.onPushChange} label={pushStr} />}
+              <PillBarButton prefix='notifications' settings={settings} settingPath={['shows', 'admin.sign_up']} onChange={onChange} label={showStr} />
+              <PillBarButton prefix='notifications' settings={settings} settingPath={['sounds', 'admin.sign_up']} onChange={onChange} label={soundStr} />
+            </div>
+          </div>
+        )}
       </div>
     );
   }
diff --git a/app/javascript/flavours/glitch/features/notifications/components/notification.js b/app/javascript/flavours/glitch/features/notifications/components/notification.js
index 1cf205898..e0cd3c7a6 100644
--- a/app/javascript/flavours/glitch/features/notifications/components/notification.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/notification.js
@@ -8,6 +8,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
 import StatusContainer from 'flavours/glitch/containers/status_container';
 import NotificationFollow from './follow';
 import NotificationFollowRequestContainer from '../containers/follow_request_container';
+import NotificationAdminSignup from './admin_signup';
 
 export default class Notification extends ImmutablePureComponent {
 
@@ -63,6 +64,19 @@ export default class Notification extends ImmutablePureComponent {
           unread={this.props.unread}
         />
       );
+    case 'admin.sign_up':
+      return (
+        <NotificationAdminSignup
+          hidden={hidden}
+          id={notification.get('id')}
+          account={notification.get('account')}
+          notification={notification}
+          onMoveDown={onMoveDown}
+          onMoveUp={onMoveUp}
+          onMention={onMention}
+          unread={this.props.unread}
+        />
+      );
     case 'mention':
       return (
         <StatusContainer
diff --git a/app/javascript/flavours/glitch/features/report/category.js b/app/javascript/flavours/glitch/features/report/category.js
new file mode 100644
index 000000000..ddbc82563
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/report/category.js
@@ -0,0 +1,93 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import Button from 'flavours/glitch/components/button';
+import Option from './components/option';
+
+const messages = defineMessages({
+  dislike: { id: 'report.reasons.dislike', defaultMessage: 'I don\'t like it' },
+  dislike_description: { id: 'report.reasons.dislike_description', defaultMessage: 'It is not something you want to see' },
+  spam: { id: 'report.reasons.spam', defaultMessage: 'It\'s spam' },
+  spam_description: { id: 'report.reasons.spam_description', defaultMessage: 'Malicious links, fake engagement, or repetetive replies' },
+  violation: { id: 'report.reasons.violation', defaultMessage: 'It violates server rules' },
+  violation_description: { id: 'report.reasons.violation_description', defaultMessage: 'You are aware that it breaks specific rules' },
+  other: { id: 'report.reasons.other', defaultMessage: 'It\'s something else' },
+  other_description: { id: 'report.reasons.other_description', defaultMessage: 'The issue does not fit into other categories' },
+  status: { id: 'report.category.title_status', defaultMessage: 'post' },
+  account: { id: 'report.category.title_account', defaultMessage: 'profile' },
+});
+
+export default @injectIntl
+class Category extends React.PureComponent {
+
+  static propTypes = {
+    onNextStep: PropTypes.func.isRequired,
+    category: PropTypes.string,
+    onChangeCategory: PropTypes.func.isRequired,
+    startedFrom: PropTypes.oneOf(['status', 'account']),
+    intl: PropTypes.object.isRequired,
+  };
+
+  handleNextClick = () => {
+    const { onNextStep, category } = this.props;
+
+    switch(category) {
+    case 'dislike':
+      onNextStep('thanks');
+      break;
+    case 'violation':
+      onNextStep('rules');
+      break;
+    default:
+      onNextStep('statuses');
+      break;
+    }
+  };
+
+  handleCategoryToggle = (value, checked) => {
+    const { onChangeCategory } = this.props;
+
+    if (checked) {
+      onChangeCategory(value);
+    }
+  };
+
+  render () {
+    const { category, startedFrom, intl } = this.props;
+
+    const options = [
+      'dislike',
+      'spam',
+      'violation',
+      'other',
+    ];
+
+    return (
+      <React.Fragment>
+        <h3 className='report-dialog-modal__title'><FormattedMessage id='report.category.title' defaultMessage="Tell us what's going on with this {type}" values={{ type: intl.formatMessage(messages[startedFrom]) }} /></h3>
+        <p className='report-dialog-modal__lead'><FormattedMessage id='report.category.subtitle' defaultMessage='Choose the best match' /></p>
+
+        <div>
+          {options.map(item => (
+            <Option
+              key={item}
+              name='category'
+              value={item}
+              checked={category === item}
+              onToggle={this.handleCategoryToggle}
+              label={intl.formatMessage(messages[item])}
+              description={intl.formatMessage(messages[`${item}_description`])}
+            />
+          ))}
+        </div>
+
+        <div className='flex-spacer' />
+
+        <div className='report-dialog-modal__actions'>
+          <Button onClick={this.handleNextClick} disabled={category === null}><FormattedMessage id='report.next' defaultMessage='Next' /></Button>
+        </div>
+      </React.Fragment>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/report/comment.js b/app/javascript/flavours/glitch/features/report/comment.js
new file mode 100644
index 000000000..b2663bbf2
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/report/comment.js
@@ -0,0 +1,83 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';
+import Button from 'flavours/glitch/components/button';
+import Toggle from 'react-toggle';
+
+const messages = defineMessages({
+  placeholder: { id: 'report.placeholder', defaultMessage: 'Type or paste additional comments' },
+});
+
+export default @injectIntl
+class Comment extends React.PureComponent {
+
+  static propTypes = {
+    onSubmit: PropTypes.func.isRequired,
+    comment: PropTypes.string.isRequired,
+    onChangeComment: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
+    isSubmitting: PropTypes.bool,
+    forward: PropTypes.bool,
+    isRemote: PropTypes.bool,
+    domain: PropTypes.string,
+    onChangeForward: PropTypes.func.isRequired,
+  };
+
+  handleClick = () => {
+    const { onSubmit } = this.props;
+    onSubmit();
+  };
+
+  handleChange = e => {
+    const { onChangeComment } = this.props;
+    onChangeComment(e.target.value);
+  };
+
+  handleKeyDown = e => {
+    if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {
+      this.handleClick();
+    }
+  };
+
+  handleForwardChange = e => {
+    const { onChangeForward } = this.props;
+    onChangeForward(e.target.checked);
+  };
+
+  render () {
+    const { comment, isRemote, forward, domain, isSubmitting, intl } = this.props;
+
+    return (
+      <React.Fragment>
+        <h3 className='report-dialog-modal__title'><FormattedMessage id='report.comment.title' defaultMessage='Is there anything else you think we should know?' /></h3>
+
+        <textarea
+          className='report-dialog-modal__textarea'
+          placeholder={intl.formatMessage(messages.placeholder)}
+          value={comment}
+          onChange={this.handleChange}
+          onKeyDown={this.handleKeyDown}
+          disabled={isSubmitting}
+        />
+
+        {isRemote && (
+          <React.Fragment>
+            <p className='report-dialog-modal__lead'><FormattedMessage id='report.forward_hint' defaultMessage='The account is from another server. Send an anonymized copy of the report there as well?' /></p>
+
+            <label className='report-dialog-modal__toggle'>
+              <Toggle checked={forward} disabled={isSubmitting} onChange={this.handleForwardChange} />
+              <FormattedMessage id='report.forward' defaultMessage='Forward to {target}' values={{ target: domain }} />
+            </label>
+          </React.Fragment>
+        )}
+
+        <div className='flex-spacer' />
+
+        <div className='report-dialog-modal__actions'>
+          <Button onClick={this.handleClick}><FormattedMessage id='report.submit' defaultMessage='Submit report' /></Button>
+        </div>
+      </React.Fragment>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/report/components/option.js b/app/javascript/flavours/glitch/features/report/components/option.js
new file mode 100644
index 000000000..7e94f0654
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/report/components/option.js
@@ -0,0 +1,60 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import Check from 'flavours/glitch/components/check';
+
+export default class Option extends React.PureComponent {
+
+  static propTypes = {
+    name: PropTypes.string.isRequired,
+    value: PropTypes.string.isRequired,
+    checked: PropTypes.bool,
+    label: PropTypes.node,
+    description: PropTypes.node,
+    onToggle: PropTypes.func,
+    multiple: PropTypes.bool,
+    labelComponent: PropTypes.node,
+  };
+
+  handleKeyPress = e => {
+    const { value, checked, onToggle } = this.props;
+
+    if (e.key === 'Enter' || e.key === ' ') {
+      e.stopPropagation();
+      e.preventDefault();
+      onToggle(value, !checked);
+    }
+  }
+
+  handleChange = e => {
+    const { value, onToggle } = this.props;
+    onToggle(value, e.target.checked);
+  }
+
+  render () {
+    const { name, value, checked, label, labelComponent, description, multiple } = this.props;
+
+    return (
+      <label className='dialog-option poll__option selectable'>
+        <input type={multiple ? 'checkbox' : 'radio'} name={name} value={value} checked={checked} onChange={this.handleChange} />
+
+        <span
+          className={classNames('poll__input', { active: checked, checkbox: multiple })}
+          tabIndex='0'
+          role='radio'
+          onKeyPress={this.handleKeyPress}
+          aria-checked={checked}
+          aria-label={label}
+        >{checked && <Check />}</span>
+
+        {labelComponent ? labelComponent : (
+          <span className='poll__option__text'>
+            <strong>{label}</strong>
+            {description}
+          </span>
+        )}
+      </label>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/report/components/status_check_box.js b/app/javascript/flavours/glitch/features/report/components/status_check_box.js
index cc49042fc..adb5e77a7 100644
--- a/app/javascript/flavours/glitch/features/report/components/status_check_box.js
+++ b/app/javascript/flavours/glitch/features/report/components/status_check_box.js
@@ -1,23 +1,32 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import Toggle from 'react-toggle';
 import noop from 'lodash/noop';
 import StatusContent from 'flavours/glitch/components/status_content';
 import { MediaGallery, Video } from 'flavours/glitch/util/async-components';
 import Bundle from 'flavours/glitch/features/ui/components/bundle';
+import Avatar from 'flavours/glitch/components/avatar';
+import DisplayName from 'flavours/glitch/components/display_name';
+import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';
+import Option from './option';
 
 export default class StatusCheckBox extends React.PureComponent {
 
   static propTypes = {
+    id: PropTypes.string.isRequired,
     status: ImmutablePropTypes.map.isRequired,
     checked: PropTypes.bool,
     onToggle: PropTypes.func.isRequired,
-    disabled: PropTypes.bool,
+  };
+
+  handleStatusesToggle = (value, checked) => {
+    const { onToggle } = this.props;
+    onToggle(value, checked);
   };
 
   render () {
-    const { status, checked, onToggle, disabled } = this.props;
+    const { status, checked } = this.props;
+
     let media = null;
 
     if (status.get('reblog')) {
@@ -51,26 +60,45 @@ export default class StatusCheckBox extends React.PureComponent {
       } else {
         media = (
           <Bundle fetchComponent={MediaGallery} loading={this.renderLoadingMediaGallery} >
-            {Component => <Component media={status.get('media_attachments')} sensitive={status.get('sensitive')} revealed={false} height={110} onOpenMedia={noop} />}
+            {Component => (
+              <Component
+                media={status.get('media_attachments')}
+                sensitive={status.get('sensitive')}
+                revealed={false}
+                height={110}
+                onOpenMedia={noop}
+              />
+            )}
           </Bundle>
         );
       }
     }
 
-    return (
-      <div className='status-check-box'>
-        <div className='status-check-box__status'>
-          <StatusContent
-            status={status}
-            media={media}
-          />
-        </div>
+    const labelComponent = (
+      <div className='status-check-box__status poll__option__text'>
+        <div className='detailed-status__display-name'>
+          <div className='detailed-status__display-avatar'>
+            <Avatar account={status.get('account')} size={46} />
+          </div>
 
-        <div className='status-check-box-toggle'>
-          <Toggle checked={checked} onChange={onToggle} disabled={disabled} />
+          <div><DisplayName account={status.get('account')} /> · <RelativeTimestamp timestamp={status.get('created_at')} /></div>
         </div>
+
+        <StatusContent status={status} media={media} />
       </div>
     );
+
+    return (
+      <Option
+        name='status_ids'
+        value={status.get('id')}
+        checked={checked}
+        onToggle={this.handleStatusesToggle}
+        label={status.get('search_index')}
+        labelComponent={labelComponent}
+        multiple
+      />
+    );
   }
 
 }
diff --git a/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js b/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js
index 9bfd41ffc..aa34b3efd 100644
--- a/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js
+++ b/app/javascript/flavours/glitch/features/report/containers/status_check_box_container.js
@@ -1,19 +1,15 @@
 import { connect } from 'react-redux';
 import StatusCheckBox from '../components/status_check_box';
-import { toggleStatusReport } from 'flavours/glitch/actions/reports';
-import { Set as ImmutableSet } from 'immutable';
+import { makeGetStatus } from 'flavours/glitch/selectors';
 
-const mapStateToProps = (state, { id }) => ({
-  status: state.getIn(['statuses', id]),
-  checked: state.getIn(['reports', 'new', 'status_ids'], ImmutableSet()).includes(id),
-});
+const makeMapStateToProps = () => {
+  const getStatus = makeGetStatus();
 
-const mapDispatchToProps = (dispatch, { id }) => ({
+  const mapStateToProps = (state, { id }) => ({
+    status: getStatus(state, { id }),
+  });
 
-  onToggle (e) {
-    dispatch(toggleStatusReport(id, e.target.checked));
-  },
+  return mapStateToProps;
+};
 
-});
-
-export default connect(mapStateToProps, mapDispatchToProps)(StatusCheckBox);
+export default connect(makeMapStateToProps)(StatusCheckBox);
diff --git a/app/javascript/flavours/glitch/features/report/rules.js b/app/javascript/flavours/glitch/features/report/rules.js
new file mode 100644
index 000000000..4772e04a2
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/report/rules.js
@@ -0,0 +1,64 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
+import { FormattedMessage } from 'react-intl';
+import Button from 'flavours/glitch/components/button';
+import Option from './components/option';
+
+const mapStateToProps = state => ({
+  rules: state.get('rules'),
+});
+
+export default @connect(mapStateToProps)
+class Rules extends React.PureComponent {
+
+  static propTypes = {
+    onNextStep: PropTypes.func.isRequired,
+    rules: ImmutablePropTypes.list,
+    selectedRuleIds: ImmutablePropTypes.set.isRequired,
+    onToggle: PropTypes.func.isRequired,
+  };
+
+  handleNextClick = () => {
+    const { onNextStep } = this.props;
+    onNextStep('statuses');
+  };
+
+  handleRulesToggle = (value, checked) => {
+    const { onToggle } = this.props;
+    onToggle(value, checked);
+  };
+
+  render () {
+    const { rules, selectedRuleIds } = this.props;
+
+    return (
+      <React.Fragment>
+        <h3 className='report-dialog-modal__title'><FormattedMessage id='report.rules.title' defaultMessage='Which rules are being violated?' /></h3>
+        <p className='report-dialog-modal__lead'><FormattedMessage id='report.rules.subtitle' defaultMessage='Select all that apply' /></p>
+
+        <div>
+          {rules.map(item => (
+            <Option
+              key={item.get('id')}
+              name='rule_ids'
+              value={item.get('id')}
+              checked={selectedRuleIds.includes(item.get('id'))}
+              onToggle={this.handleRulesToggle}
+              label={item.get('text')}
+              multiple
+            />
+          ))}
+        </div>
+
+        <div className='flex-spacer' />
+
+        <div className='report-dialog-modal__actions'>
+          <Button onClick={this.handleNextClick} disabled={selectedRuleIds.size < 1}><FormattedMessage id='report.next' defaultMessage='Next' /></Button>
+        </div>
+      </React.Fragment>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/report/statuses.js b/app/javascript/flavours/glitch/features/report/statuses.js
new file mode 100644
index 000000000..69cfbb3e5
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/report/statuses.js
@@ -0,0 +1,58 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
+import StatusCheckBox from 'flavours/glitch/features/report/containers/status_check_box_container';
+import { OrderedSet } from 'immutable';
+import { FormattedMessage } from 'react-intl';
+import Button from 'flavours/glitch/components/button';
+
+const mapStateToProps = (state, { accountId }) => ({
+  availableStatusIds: OrderedSet(state.getIn(['timelines', `account:${accountId}:with_replies`, 'items'])),
+});
+
+export default @connect(mapStateToProps)
+class Statuses extends React.PureComponent {
+
+  static propTypes = {
+    onNextStep: PropTypes.func.isRequired,
+    accountId: PropTypes.string.isRequired,
+    availableStatusIds: ImmutablePropTypes.set.isRequired,
+    selectedStatusIds: ImmutablePropTypes.set.isRequired,
+    onToggle: PropTypes.func.isRequired,
+  };
+
+  handleNextClick = () => {
+    const { onNextStep } = this.props;
+    onNextStep('comment');
+  };
+
+  render () {
+    const { availableStatusIds, selectedStatusIds, onToggle } = this.props;
+
+    return (
+      <React.Fragment>
+        <h3 className='report-dialog-modal__title'><FormattedMessage id='report.statuses.title' defaultMessage='Are there any posts that back up this report?' /></h3>
+        <p className='report-dialog-modal__lead'><FormattedMessage id='report.statuses.subtitle' defaultMessage='Select all that apply' /></p>
+
+        <div className='report-dialog-modal__statuses'>
+          {availableStatusIds.union(selectedStatusIds).map(statusId => (
+            <StatusCheckBox
+              id={statusId}
+              key={statusId}
+              checked={selectedStatusIds.includes(statusId)}
+              onToggle={onToggle}
+            />
+          ))}
+        </div>
+
+        <div className='flex-spacer' />
+
+        <div className='report-dialog-modal__actions'>
+          <Button onClick={this.handleNextClick}><FormattedMessage id='report.next' defaultMessage='Next' /></Button>
+        </div>
+      </React.Fragment>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/report/thanks.js b/app/javascript/flavours/glitch/features/report/thanks.js
new file mode 100644
index 000000000..9c41baa7f
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/report/thanks.js
@@ -0,0 +1,84 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { FormattedMessage } from 'react-intl';
+import Button from 'flavours/glitch/components/button';
+import { connect } from 'react-redux';
+import {
+  unfollowAccount,
+  muteAccount,
+  blockAccount,
+} from 'mastodon/actions/accounts';
+
+const mapStateToProps = () => ({});
+
+export default @connect(mapStateToProps)
+class Thanks extends React.PureComponent {
+
+  static propTypes = {
+    submitted: PropTypes.bool,
+    onClose: PropTypes.func.isRequired,
+    account: ImmutablePropTypes.map.isRequired,
+    dispatch: PropTypes.func.isRequired,
+  };
+
+  handleCloseClick = () => {
+    const { onClose } = this.props;
+    onClose();
+  };
+
+  handleUnfollowClick = () => {
+    const { dispatch, account, onClose } = this.props;
+    dispatch(unfollowAccount(account.get('id')));
+    onClose();
+  };
+
+  handleMuteClick = () => {
+    const { dispatch, account, onClose } = this.props;
+    dispatch(muteAccount(account.get('id')));
+    onClose();
+  };
+
+  handleBlockClick = () => {
+    const { dispatch, account, onClose } = this.props;
+    dispatch(blockAccount(account.get('id')));
+    onClose();
+  };
+
+  render () {
+    const { account, submitted } = this.props;
+
+    return (
+      <React.Fragment>
+        <h3 className='report-dialog-modal__title'>{submitted ? <FormattedMessage id='report.thanks.title_actionable' defaultMessage="Thanks for reporting, we'll look into this." /> : <FormattedMessage id='report.thanks.title' defaultMessage="Don't want to see this?" />}</h3>
+        <p className='report-dialog-modal__lead'>{submitted ? <FormattedMessage id='report.thanks.take_action_actionable' defaultMessage='While we review this, you can take action against @{name}:' values={{ name: account.get('username') }} /> : <FormattedMessage id='report.thanks.take_action' defaultMessage='Here are your options for controlling what you see on Mastodon:' />}</p>
+
+        {account.getIn(['relationship', 'following']) && (
+          <React.Fragment>
+            <h4 className='report-dialog-modal__subtitle'><FormattedMessage id='report.unfollow' defaultMessage='Unfollow @{name}' values={{ name: account.get('username') }} /></h4>
+            <p className='report-dialog-modal__lead'><FormattedMessage id='report.unfollow_explanation' defaultMessage='You are following this account. To not see their posts in your home feed anymore, unfollow them.' /></p>
+            <Button secondary onClick={this.handleUnfollowClick}><FormattedMessage id='account.unfollow' defaultMessage='Unfollow' /></Button>
+            <hr />
+          </React.Fragment>
+        )}
+
+        <h4 className='report-dialog-modal__subtitle'><FormattedMessage id='account.mute' defaultMessage='Mute @{name}' values={{ name: account.get('username') }} /></h4>
+        <p className='report-dialog-modal__lead'><FormattedMessage id='report.mute_explanation' defaultMessage='You will not see their posts. They can still follow you and see your posts and will not know that they are muted.' /></p>
+        <Button secondary onClick={this.handleMuteClick}>{!account.getIn(['relationship', 'muting']) ? <FormattedMessage id='report.mute' defaultMessage='Mute' /> : <FormattedMessage id='account.muted' defaultMessage='Muted' />}</Button>
+
+        <hr />
+
+        <h4 className='report-dialog-modal__subtitle'><FormattedMessage id='account.block' defaultMessage='Block @{name}' values={{ name: account.get('username') }} /></h4>
+        <p className='report-dialog-modal__lead'><FormattedMessage id='report.block_explanation' defaultMessage='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.' /></p>
+        <Button secondary onClick={this.handleBlockClick}>{!account.getIn(['relationship', 'blocking']) ? <FormattedMessage id='report.block' defaultMessage='Block' /> : <FormattedMessage id='account.blocked' defaultMessage='Blocked' />}</Button>
+
+        <div className='flex-spacer' />
+
+        <div className='report-dialog-modal__actions'>
+          <Button onClick={this.handleCloseClick}><FormattedMessage id='report.close' defaultMessage='Done' /></Button>
+        </div>
+      </React.Fragment>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/ui/components/report_modal.js b/app/javascript/flavours/glitch/features/ui/components/report_modal.js
index 5cb7c5d07..dcbe94929 100644
--- a/app/javascript/flavours/glitch/features/ui/components/report_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/report_modal.js
@@ -1,38 +1,32 @@
 import React from 'react';
 import { connect } from 'react-redux';
-import { changeReportComment, changeReportForward, submitReport } from 'flavours/glitch/actions/reports';
+import { submitReport } from 'flavours/glitch/actions/reports';
 import { expandAccountTimeline } from 'flavours/glitch/actions/timelines';
+import { fetchRules } from 'flavours/glitch/actions/rules';
+import { fetchRelationships } from 'flavours/glitch/actions/accounts';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import { makeGetAccount } from 'flavours/glitch/selectors';
 import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
-import StatusCheckBox from 'flavours/glitch/features/report/containers/status_check_box_container';
 import { OrderedSet } from 'immutable';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import Button from 'flavours/glitch/components/button';
-import Toggle from 'react-toggle';
-import IconButton from '../../../components/icon_button';
+import IconButton from 'flavours/glitch/components/icon_button';
+import Category from 'flavours/glitch/features/report/category';
+import Statuses from 'flavours/glitch/features/report/statuses';
+import Rules from 'flavours/glitch/features/report/rules';
+import Comment from 'flavours/glitch/features/report/comment';
+import Thanks from 'flavours/glitch/features/report/thanks';
 
 const messages = defineMessages({
   close: { id: 'lightbox.close', defaultMessage: 'Close' },
-  placeholder: { id: 'report.placeholder', defaultMessage: 'Additional comments' },
-  submit: { id: 'report.submit', defaultMessage: 'Submit' },
 });
 
 const makeMapStateToProps = () => {
   const getAccount = makeGetAccount();
 
-  const mapStateToProps = state => {
-    const accountId = state.getIn(['reports', 'new', 'account_id']);
-
-    return {
-      isSubmitting: state.getIn(['reports', 'new', 'isSubmitting']),
-      account: getAccount(state, accountId),
-      comment: state.getIn(['reports', 'new', 'comment']),
-      forward: state.getIn(['reports', 'new', 'forward']),
-      statusIds: OrderedSet(state.getIn(['timelines', `account:${accountId}:with_replies`, 'items'])).union(state.getIn(['reports', 'new', 'status_ids'])),
-    };
-  };
+  const mapStateToProps = (state, { accountId }) => ({
+    account: getAccount(state, accountId),
+  });
 
   return mapStateToProps;
 };
@@ -42,92 +36,183 @@ export default @connect(makeMapStateToProps)
 class ReportModal extends ImmutablePureComponent {
 
   static propTypes = {
-    isSubmitting: PropTypes.bool,
-    account: ImmutablePropTypes.map,
-    statusIds: ImmutablePropTypes.orderedSet.isRequired,
-    comment: PropTypes.string.isRequired,
-    forward: PropTypes.bool,
+    accountId: PropTypes.string.isRequired,
+    statusId: PropTypes.string,
     dispatch: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
+    account: ImmutablePropTypes.map.isRequired,
   };
 
-  handleCommentChange = e => {
-    this.props.dispatch(changeReportComment(e.target.value));
-  }
-
-  handleForwardChange = e => {
-    this.props.dispatch(changeReportForward(e.target.checked));
-  }
+  state = {
+    step: 'category',
+    selectedStatusIds: OrderedSet(this.props.statusId ? [this.props.statusId] : []),
+    comment: '',
+    category: null,
+    selectedRuleIds: OrderedSet(),
+    forward: true,
+    isSubmitting: false,
+    isSubmitted: false,
+  };
 
   handleSubmit = () => {
-    this.props.dispatch(submitReport());
-  }
+    const { dispatch, accountId } = this.props;
+    const { selectedStatusIds, comment, category, selectedRuleIds, forward } = this.state;
+
+    this.setState({ isSubmitting: true });
+
+    dispatch(submitReport({
+      account_id: accountId,
+      status_ids: selectedStatusIds.toArray(),
+      comment,
+      forward,
+      category,
+      rule_ids: selectedRuleIds.toArray(),
+    }, this.handleSuccess, this.handleFail));
+  };
+
+  handleSuccess = () => {
+    this.setState({ isSubmitting: false, isSubmitted: true, step: 'thanks' });
+  };
+
+  handleFail = () => {
+    this.setState({ isSubmitting: false });
+  };
+
+  handleStatusToggle = (statusId, checked) => {
+    const { selectedStatusIds } = this.state;
+
+    if (checked) {
+      this.setState({ selectedStatusIds: selectedStatusIds.add(statusId) });
+    } else {
+      this.setState({ selectedStatusIds: selectedStatusIds.remove(statusId) });
+    }
+  };
 
-  handleKeyDown = e => {
-    if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {
-      this.handleSubmit();
+  handleRuleToggle = (ruleId, checked) => {
+    const { selectedRuleIds } = this.state;
+
+    if (checked) {
+      this.setState({ selectedRuleIds: selectedRuleIds.add(ruleId) });
+    } else {
+      this.setState({ selectedRuleIds: selectedRuleIds.remove(ruleId) });
     }
   }
 
+  handleChangeCategory = category => {
+    this.setState({ category });
+  };
+
+  handleChangeComment = comment => {
+    this.setState({ comment });
+  };
+
+  handleChangeForward = forward => {
+    this.setState({ forward });
+  };
+
+  handleNextStep = step => {
+    this.setState({ step });
+  };
+
   componentDidMount () {
-    this.props.dispatch(expandAccountTimeline(this.props.account.get('id'), { withReplies: true }));
-  }
+    const { dispatch, accountId } = this.props;
 
-  componentWillReceiveProps (nextProps) {
-    if (this.props.account !== nextProps.account && nextProps.account) {
-      this.props.dispatch(expandAccountTimeline(nextProps.account.get('id'), { withReplies: true }));
-    }
+    dispatch(fetchRelationships([accountId]));
+    dispatch(expandAccountTimeline(accountId, { withReplies: true }));
+    dispatch(fetchRules());
   }
 
   render () {
-    const { account, comment, intl, statusIds, isSubmitting, forward, onClose } = this.props;
+    const {
+      accountId,
+      account,
+      intl,
+      onClose,
+    } = this.props;
 
     if (!account) {
       return null;
     }
 
-    const domain = account.get('acct').split('@')[1];
+    const {
+      step,
+      selectedStatusIds,
+      selectedRuleIds,
+      comment,
+      forward,
+      category,
+      isSubmitting,
+      isSubmitted,
+    } = this.state;
+
+    const domain   = account.get('acct').split('@')[1];
+    const isRemote = !!domain;
+
+    let stepComponent;
+
+    switch(step) {
+    case 'category':
+      stepComponent = (
+        <Category
+          onNextStep={this.handleNextStep}
+          startedFrom={this.props.statusId ? 'status' : 'account'}
+          category={category}
+          onChangeCategory={this.handleChangeCategory}
+        />
+      );
+      break;
+    case 'rules':
+      stepComponent = (
+        <Rules
+          onNextStep={this.handleNextStep}
+          selectedRuleIds={selectedRuleIds}
+          onToggle={this.handleRuleToggle}
+        />
+      );
+      break;
+    case 'statuses':
+      stepComponent = (
+        <Statuses
+          onNextStep={this.handleNextStep}
+          accountId={accountId}
+          selectedStatusIds={selectedStatusIds}
+          onToggle={this.handleStatusToggle}
+        />
+      );
+      break;
+    case 'comment':
+      stepComponent = (
+        <Comment
+          onSubmit={this.handleSubmit}
+          isSubmitting={isSubmitting}
+          isRemote={isRemote}
+          comment={comment}
+          forward={forward}
+          domain={domain}
+          onChangeComment={this.handleChangeComment}
+          onChangeForward={this.handleChangeForward}
+        />
+      );
+      break;
+    case 'thanks':
+      stepComponent = (
+        <Thanks
+          submitted={isSubmitted}
+          account={account}
+          onClose={onClose}
+        />
+      );
+    }
 
     return (
-      <div className='modal-root__modal report-modal'>
+      <div className='modal-root__modal report-dialog-modal'>
         <div className='report-modal__target'>
           <IconButton className='report-modal__close' title={intl.formatMessage(messages.close)} icon='times' onClick={onClose} size={20} />
           <FormattedMessage id='report.target' defaultMessage='Report {target}' values={{ target: <strong>{account.get('acct')}</strong> }} />
         </div>
 
-        <div className='report-modal__container'>
-          <div className='report-modal__comment'>
-            <p><FormattedMessage id='report.hint' defaultMessage='The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:' /></p>
-
-            <textarea
-              className='setting-text light'
-              placeholder={intl.formatMessage(messages.placeholder)}
-              value={comment}
-              onChange={this.handleCommentChange}
-              onKeyDown={this.handleKeyDown}
-              disabled={isSubmitting}
-              autoFocus
-            />
-
-            {domain && (
-              <div>
-                <p><FormattedMessage id='report.forward_hint' defaultMessage='The account is from another server. Send an anonymized copy of the report there as well?' /></p>
-
-                <div className='setting-toggle'>
-                  <Toggle id='report-forward' checked={forward} disabled={isSubmitting} onChange={this.handleForwardChange} />
-                  <label htmlFor='report-forward' className='setting-toggle__label'><FormattedMessage id='report.forward' defaultMessage='Forward to {target}' values={{ target: domain }} /></label>
-                </div>
-              </div>
-            )}
-
-            <Button disabled={isSubmitting} text={intl.formatMessage(messages.submit)} onClick={this.handleSubmit} />
-          </div>
-
-          <div className='report-modal__statuses'>
-            <div>
-              {statusIds.map(statusId => <StatusCheckBox id={statusId} key={statusId} disabled={isSubmitting} />)}
-            </div>
-          </div>
+        <div className='report-dialog-modal__container'>
+          {stepComponent}
         </div>
       </div>
     );
diff --git a/app/javascript/flavours/glitch/packs/public.js b/app/javascript/flavours/glitch/packs/public.js
index a92f3d5a8..84ec9fce7 100644
--- a/app/javascript/flavours/glitch/packs/public.js
+++ b/app/javascript/flavours/glitch/packs/public.js
@@ -147,13 +147,7 @@ function main() {
   });
 
   delegate(document, '.sidebar__toggle__icon', 'click', () => {
-    const target = document.querySelector('.sidebar ul');
-
-    if (target.style.display === 'block') {
-      target.style.display = 'none';
-    } else {
-      target.style.display = 'block';
-    }
+    document.querySelector('.sidebar ul').classList.toggle('visible');
   });
 
   // Empty the honeypot fields in JS in case something like an extension
diff --git a/app/javascript/flavours/glitch/packs/settings.js b/app/javascript/flavours/glitch/packs/settings.js
index 9c4d119c1..0a53e1c25 100644
--- a/app/javascript/flavours/glitch/packs/settings.js
+++ b/app/javascript/flavours/glitch/packs/settings.js
@@ -7,13 +7,7 @@ function main() {
   const { delegate } = require('@rails/ujs');
 
   delegate(document, '.sidebar__toggle__icon', 'click', () => {
-    const target = document.querySelector('.sidebar ul');
-
-    if (target.style.display === 'block') {
-      target.style.display = 'none';
-    } else {
-      target.style.display = 'block';
-    }
+    document.querySelector('.sidebar ul').classList.toggle('visible');
   });
 }
 
diff --git a/app/javascript/flavours/glitch/reducers/index.js b/app/javascript/flavours/glitch/reducers/index.js
index d9123b103..92348c0c5 100644
--- a/app/javascript/flavours/glitch/reducers/index.js
+++ b/app/javascript/flavours/glitch/reducers/index.js
@@ -17,7 +17,7 @@ import push_notifications from './push_notifications';
 import status_lists from './status_lists';
 import mutes from './mutes';
 import blocks from './blocks';
-import reports from './reports';
+import rules from './rules';
 import boosts from './boosts';
 import contexts from './contexts';
 import compose from './compose';
@@ -64,7 +64,7 @@ const reducers = {
   push_notifications,
   mutes,
   blocks,
-  reports,
+  rules,
   boosts,
   contexts,
   compose,
diff --git a/app/javascript/flavours/glitch/reducers/reports.js b/app/javascript/flavours/glitch/reducers/reports.js
deleted file mode 100644
index 1f7f3f273..000000000
--- a/app/javascript/flavours/glitch/reducers/reports.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import {
-  REPORT_INIT,
-  REPORT_SUBMIT_REQUEST,
-  REPORT_SUBMIT_SUCCESS,
-  REPORT_SUBMIT_FAIL,
-  REPORT_CANCEL,
-  REPORT_STATUS_TOGGLE,
-  REPORT_COMMENT_CHANGE,
-  REPORT_FORWARD_CHANGE,
-} from 'flavours/glitch/actions/reports';
-import {
-  TIMELINE_DELETE,
-} from 'flavours/glitch/actions/timelines';
-import { Map as ImmutableMap, Set as ImmutableSet } from 'immutable';
-
-const initialState = ImmutableMap({
-  new: ImmutableMap({
-    isSubmitting: false,
-    account_id: null,
-    status_ids: ImmutableSet(),
-    comment: '',
-    forward: false,
-  }),
-});
-
-const deleteStatus = (state, id, references) => {
-  references.forEach(ref => {
-    state = deleteStatus(state, ref[0], []);
-  });
-
-  return state.updateIn(['new', 'status_ids'], ImmutableSet(), set => set.remove(id));
-};
-
-export default function reports(state = initialState, action) {
-  switch(action.type) {
-  case REPORT_INIT:
-    return state.withMutations(map => {
-      map.setIn(['new', 'isSubmitting'], false);
-      map.setIn(['new', 'account_id'], action.account.get('id'));
-
-      if (state.getIn(['new', 'account_id']) !== action.account.get('id')) {
-        map.setIn(['new', 'status_ids'], action.status ? ImmutableSet([action.status.getIn(['reblog', 'id'], action.status.get('id'))]) : ImmutableSet());
-        map.setIn(['new', 'comment'], '');
-      } else if (action.status) {
-        map.updateIn(['new', 'status_ids'], ImmutableSet(), set => set.add(action.status.getIn(['reblog', 'id'], action.status.get('id'))));
-      }
-    });
-  case REPORT_STATUS_TOGGLE:
-    return state.updateIn(['new', 'status_ids'], ImmutableSet(), set => {
-      if (action.checked) {
-        return set.add(action.statusId);
-      }
-
-      return set.remove(action.statusId);
-    });
-  case REPORT_COMMENT_CHANGE:
-    return state.setIn(['new', 'comment'], action.comment);
-  case REPORT_FORWARD_CHANGE:
-    return state.setIn(['new', 'forward'], action.forward);
-  case REPORT_SUBMIT_REQUEST:
-    return state.setIn(['new', 'isSubmitting'], true);
-  case REPORT_SUBMIT_FAIL:
-    return state.setIn(['new', 'isSubmitting'], false);
-  case REPORT_CANCEL:
-  case REPORT_SUBMIT_SUCCESS:
-    return state.withMutations(map => {
-      map.setIn(['new', 'account_id'], null);
-      map.setIn(['new', 'status_ids'], ImmutableSet());
-      map.setIn(['new', 'comment'], '');
-      map.setIn(['new', 'isSubmitting'], false);
-    });
-  case TIMELINE_DELETE:
-    return deleteStatus(state, action.id, action.references);
-  default:
-    return state;
-  }
-};
diff --git a/app/javascript/flavours/glitch/reducers/rules.js b/app/javascript/flavours/glitch/reducers/rules.js
new file mode 100644
index 000000000..6cc2230bc
--- /dev/null
+++ b/app/javascript/flavours/glitch/reducers/rules.js
@@ -0,0 +1,13 @@
+import { RULES_FETCH_SUCCESS } from 'flavours/glitch/actions/rules';
+import { List as ImmutableList, fromJS } from 'immutable';
+
+const initialState = ImmutableList();
+
+export default function rules(state = initialState, action) {
+  switch (action.type) {
+  case RULES_FETCH_SUCCESS:
+    return fromJS(action.rules);
+  default:
+    return state;
+  }
+}
diff --git a/app/javascript/flavours/glitch/reducers/settings.js b/app/javascript/flavours/glitch/reducers/settings.js
index 48587ce64..676a1ccc1 100644
--- a/app/javascript/flavours/glitch/reducers/settings.js
+++ b/app/javascript/flavours/glitch/reducers/settings.js
@@ -41,6 +41,7 @@ const initialState = ImmutableMap({
       poll: false,
       status: false,
       update: false,
+      'admin.sign_up': false,
     }),
 
     quickFilter: ImmutableMap({
@@ -61,6 +62,7 @@ const initialState = ImmutableMap({
       poll: true,
       status: true,
       update: true,
+      'admin.sign_up': true,
     }),
 
     sounds: ImmutableMap({
@@ -72,6 +74,7 @@ const initialState = ImmutableMap({
       poll: true,
       status: true,
       update: true,
+      'admin.sign_up': true,
     }),
   }),
 
diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss
index 66ce92ce2..a1b99636c 100644
--- a/app/javascript/flavours/glitch/styles/admin.scss
+++ b/app/javascript/flavours/glitch/styles/admin.scss
@@ -322,6 +322,10 @@ $content-width: 840px;
 
       & > ul {
         display: none;
+
+        &.visible {
+          display: block;
+        }
       }
 
       ul a,
@@ -594,12 +598,16 @@ body,
 }
 
 .log-entry {
+  display: block;
   line-height: 20px;
   padding: 15px;
   padding-left: 15px * 2 + 40px;
   background: $ui-base-color;
   border-bottom: 1px solid darken($ui-base-color, 8%);
   position: relative;
+  text-decoration: none;
+  color: $darker-text-color;
+  font-size: 14px;
 
   &:first-child {
     border-top-left-radius: 4px;
@@ -612,15 +620,12 @@ body,
     border-bottom: 0;
   }
 
-  &:hover {
+  &:hover,
+  &:focus,
+  &:active {
     background: lighten($ui-base-color, 4%);
   }
 
-  &__header {
-    color: $darker-text-color;
-    font-size: 14px;
-  }
-
   &__avatar {
     position: absolute;
     left: 15px;
@@ -1278,6 +1283,30 @@ a.sparkline {
       background: linear-gradient(to left, $ui-base-color, transparent);
       pointer-events: none;
     }
+
+    a {
+      color: $secondary-text-color;
+      text-decoration: none;
+      unicode-bidi: isolate;
+
+      &:hover {
+        text-decoration: underline;
+
+        .fa {
+          color: lighten($dark-text-color, 7%);
+        }
+      }
+
+      &.mention {
+        &:hover {
+          text-decoration: none;
+
+          span {
+            text-decoration: underline;
+          }
+        }
+      }
+    }
   }
 
   &__actions {
@@ -1467,3 +1496,75 @@ a.sparkline {
     }
   }
 }
+
+.strike-card {
+  padding: 15px;
+  border-radius: 4px;
+  background: $ui-base-color;
+  font-size: 15px;
+  line-height: 20px;
+  word-wrap: break-word;
+  font-weight: 400;
+  color: $primary-text-color;
+
+  p {
+    margin-bottom: 20px;
+    unicode-bidi: plaintext;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+
+    strong {
+      font-weight: 700;
+    }
+  }
+
+  &__rules {
+    list-style: disc;
+    padding-left: 15px;
+    margin-bottom: 20px;
+    color: $darker-text-color;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+
+    &__text {
+      color: $primary-text-color;
+    }
+  }
+
+  &__statuses-list {
+    border-radius: 4px;
+    border: 1px solid darken($ui-base-color, 8%);
+    font-size: 13px;
+    line-height: 18px;
+    overflow: hidden;
+
+    &__item {
+      padding: 16px;
+      background: lighten($ui-base-color, 2%);
+      border-bottom: 1px solid darken($ui-base-color, 8%);
+
+      &:last-child {
+        border-bottom: 0;
+      }
+
+      &__meta {
+        color: $darker-text-color;
+      }
+
+      a {
+        color: inherit;
+        text-decoration: none;
+
+        &:hover,
+        &:focus,
+        &:active {
+          text-decoration: underline;
+        }
+      }
+    }
+  }
+}
diff --git a/app/javascript/flavours/glitch/styles/components/composer.scss b/app/javascript/flavours/glitch/styles/components/composer.scss
index fd62bb651..937751d00 100644
--- a/app/javascript/flavours/glitch/styles/components/composer.scss
+++ b/app/javascript/flavours/glitch/styles/components/composer.scss
@@ -652,14 +652,14 @@
   & > .primary {
     display: inline-block;
     margin: 0;
-    padding: 0 10px;
+    padding: 7px 10px;
     text-align: center;
   }
 
   & > .side_arm {
     display: inline-block;
     margin: 0 2px;
-    padding: 0;
+    padding: 7px 0;
     width: 36px;
     text-align: center;
   }
diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss
index 656d8f25d..55abd6e1e 100644
--- a/app/javascript/flavours/glitch/styles/components/index.scss
+++ b/app/javascript/flavours/glitch/styles/components/index.scss
@@ -41,16 +41,14 @@
   cursor: pointer;
   display: inline-block;
   font-family: inherit;
-  font-size: 14px;
+  font-size: 17px;
   font-weight: 500;
-  height: 36px;
   letter-spacing: 0;
-  line-height: 36px;
+  line-height: 22px;
   overflow: hidden;
-  padding: 0 16px;
+  padding: 7px 18px;
   position: relative;
   text-align: center;
-  text-transform: uppercase;
   text-decoration: none;
   text-overflow: ellipsis;
   transition: all 100ms ease-in;
@@ -82,17 +80,6 @@
     cursor: default;
   }
 
-  &.button-primary,
-  &.button-alternative,
-  &.button-secondary,
-  &.button-alternative-2 {
-    font-size: 16px;
-    line-height: 36px;
-    height: auto;
-    text-transform: none;
-    padding: 4px 16px;
-  }
-
   &.button-alternative {
     color: $inverted-text-color;
     background: $ui-primary-color;
@@ -121,8 +108,7 @@
     color: $darker-text-color;
     text-transform: none;
     background: transparent;
-    padding: 3px 15px;
-    border-radius: 4px;
+    padding: 6px 17px;
     border: 1px solid $ui-primary-color;
 
     &:active,
diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss
index fb2445a17..ae1afc320 100644
--- a/app/javascript/flavours/glitch/styles/components/modal.scss
+++ b/app/javascript/flavours/glitch/styles/components/modal.scss
@@ -537,6 +537,192 @@
   max-width: 700px;
 }
 
+.report-dialog-modal {
+  max-width: 90vw;
+  width: 480px;
+  height: 80vh;
+  background: lighten($ui-secondary-color, 8%);
+  color: $inverted-text-color;
+  border-radius: 8px;
+  overflow: hidden;
+  position: relative;
+  flex-direction: column;
+  display: flex;
+
+  &__container {
+    box-sizing: border-box;
+    border-top: 1px solid $ui-secondary-color;
+    padding: 20px;
+    flex-grow: 1;
+    display: flex;
+    flex-direction: column;
+    min-height: 0;
+    overflow: auto;
+  }
+
+  &__title {
+    font-size: 28px;
+    line-height: 33px;
+    font-weight: 700;
+    margin-bottom: 15px;
+
+    @media screen and (max-height: 800px) {
+      font-size: 22px;
+    }
+  }
+
+  &__subtitle {
+    font-size: 17px;
+    font-weight: 600;
+    line-height: 22px;
+    margin-bottom: 4px;
+  }
+
+  &__lead {
+    font-size: 17px;
+    line-height: 22px;
+    color: lighten($inverted-text-color, 16%);
+    margin-bottom: 30px;
+  }
+
+  &__actions {
+    margin-top: 30px;
+    display: flex;
+
+    .button {
+      flex: 1 1 auto;
+    }
+  }
+
+  &__statuses {
+    flex-grow: 1;
+    min-height: 0;
+    overflow: auto;
+  }
+
+  .status__content a {
+    color: $highlight-text-color;
+  }
+
+  .status__content,
+  .status__content p {
+    color: $inverted-text-color;
+  }
+
+  .dialog-option .poll__input {
+    border-color: $inverted-text-color;
+    color: $ui-secondary-color;
+    display: inline-flex;
+    align-items: center;
+    justify-content: center;
+
+    svg {
+      width: 8px;
+      height: auto;
+    }
+
+    &:active,
+    &:focus,
+    &:hover {
+      border-color: lighten($inverted-text-color, 15%);
+      border-width: 4px;
+    }
+
+    &.active {
+      border-color: $inverted-text-color;
+      background: $inverted-text-color;
+    }
+  }
+
+  .poll__option.dialog-option {
+    padding: 15px 0;
+    flex: 0 0 auto;
+    border-bottom: 1px solid $ui-secondary-color;
+
+    &:last-child {
+      border-bottom: 0;
+    }
+
+    & > .poll__option__text {
+      font-size: 13px;
+      color: lighten($inverted-text-color, 16%);
+
+      strong {
+        font-size: 17px;
+        font-weight: 500;
+        line-height: 22px;
+        color: $inverted-text-color;
+        display: block;
+        margin-bottom: 4px;
+
+        &:last-child {
+          margin-bottom: 0;
+        }
+      }
+    }
+  }
+
+  .flex-spacer {
+    background: transparent;
+  }
+
+  &__textarea {
+    display: block;
+    box-sizing: border-box;
+    width: 100%;
+    margin: 0;
+    color: $inverted-text-color;
+    background: $simple-background-color;
+    padding: 10px;
+    font-family: inherit;
+    font-size: 17px;
+    line-height: 22px;
+    resize: vertical;
+    border: 0;
+    outline: 0;
+    border-radius: 4px;
+    margin: 20px 0;
+
+    &::placeholder {
+      color: $dark-text-color;
+    }
+
+    &:focus {
+      outline: 0;
+    }
+  }
+
+  &__toggle {
+    display: flex;
+    align-items: center;
+
+    & > span {
+      font-size: 17px;
+      font-weight: 500;
+      margin-left: 10px;
+    }
+  }
+
+  .button.button-secondary {
+    border-color: $inverted-text-color;
+    color: $inverted-text-color;
+    flex: 0 0 auto;
+
+    &:hover,
+    &:focus,
+    &:active {
+      border-color: lighten($inverted-text-color, 15%);
+      color: lighten($inverted-text-color, 15%);
+    }
+  }
+
+  hr {
+    border: 0;
+    background: transparent;
+    margin: 15px 0;
+  }
+}
+
 .report-modal__container {
   display: flex;
   border-top: 1px solid $ui-secondary-color;
diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index d9154e4c7..77541ab74 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -521,42 +521,39 @@
   justify-content: flex-start;
 }
 
-.status-check-box {
-  border-bottom: 1px solid $ui-secondary-color;
-  display: flex;
+.status-check-box__status {
+  display: block;
+  box-sizing: border-box;
+  width: 100%;
+  padding: 0 10px;
 
-  .status-check-box__status {
-    margin: 10px 0 10px 10px;
-    flex: 1;
-    overflow: hidden;
+  .detailed-status__display-name {
+    color: lighten($inverted-text-color, 16%);
 
-    .media-gallery {
-      max-width: 250px;
+    span {
+      display: inline;
     }
 
-    .status__content {
-      padding: 0;
-      white-space: normal;
+    &:hover strong {
+      text-decoration: none;
     }
+  }
 
-    .video-player,
-    .audio-player {
-      margin-top: 8px;
-      max-width: 250px;
-    }
+  .media-gallery,
+  .audio-player,
+  .video-player {
+    margin-top: 8px;
+    max-width: 250px;
+  }
 
-    .media-gallery__item-thumbnail {
-      cursor: default;
-    }
+  .status__content {
+    padding: 0;
+    white-space: normal;
   }
-}
 
-.status-check-box-toggle {
-  align-items: center;
-  display: flex;
-  flex: 0 0 auto;
-  justify-content: center;
-  padding: 10px;
+  .media-gallery__item-thumbnail {
+    cursor: default;
+  }
 }
 
 .status__prepend {
diff --git a/app/javascript/flavours/glitch/styles/footer.scss b/app/javascript/flavours/glitch/styles/footer.scss
index 00d290883..073ebda7e 100644
--- a/app/javascript/flavours/glitch/styles/footer.scss
+++ b/app/javascript/flavours/glitch/styles/footer.scss
@@ -90,6 +90,20 @@
         .column-4 {
           display: none;
         }
+
+        .column-2 h4 {
+          display: none;
+        }
+      }
+    }
+
+    .legal-xs {
+      display: none;
+      text-align: center;
+      padding-top: 20px;
+
+      @media screen and (max-width: $no-gap-breakpoint) {
+        display: block;
       }
     }
 
@@ -105,7 +119,8 @@
       }
     }
 
-    ul a {
+    ul a,
+    .legal-xs a {
       text-decoration: none;
       color: lighten($ui-base-color, 34%);
 
diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js
index 9370811e0..00e8d74d7 100644
--- a/app/javascript/mastodon/actions/notifications.js
+++ b/app/javascript/mastodon/actions/notifications.js
@@ -45,7 +45,7 @@ defineMessages({
 });
 
 const fetchRelatedRelationships = (dispatch, notifications) => {
-  const accountIds = notifications.filter(item => item.type === 'follow').map(item => item.account.id);
+  const accountIds = notifications.filter(item => ['follow', 'follow_request', 'admin.sign_up'].indexOf(item.type) !== -1).map(item => item.account.id);
 
   if (accountIds.length > 0) {
     dispatch(fetchRelationships(accountIds));
@@ -132,6 +132,7 @@ const excludeTypesFromFilter = filter => {
     'poll',
     'status',
     'update',
+    'admin.sign_up',
   ]);
 
   return allTypes.filterNot(item => item === filter).toJS();
diff --git a/app/javascript/mastodon/actions/reports.js b/app/javascript/mastodon/actions/reports.js
index afa0c3412..fbe5b3791 100644
--- a/app/javascript/mastodon/actions/reports.js
+++ b/app/javascript/mastodon/actions/reports.js
@@ -1,89 +1,38 @@
 import api from '../api';
-import { openModal, closeModal } from './modal';
-
-export const REPORT_INIT   = 'REPORT_INIT';
-export const REPORT_CANCEL = 'REPORT_CANCEL';
+import { openModal } from './modal';
 
 export const REPORT_SUBMIT_REQUEST = 'REPORT_SUBMIT_REQUEST';
 export const REPORT_SUBMIT_SUCCESS = 'REPORT_SUBMIT_SUCCESS';
 export const REPORT_SUBMIT_FAIL    = 'REPORT_SUBMIT_FAIL';
 
-export const REPORT_STATUS_TOGGLE  = 'REPORT_STATUS_TOGGLE';
-export const REPORT_COMMENT_CHANGE = 'REPORT_COMMENT_CHANGE';
-export const REPORT_FORWARD_CHANGE = 'REPORT_FORWARD_CHANGE';
-
-export function initReport(account, status) {
-  return dispatch => {
-    dispatch({
-      type: REPORT_INIT,
-      account,
-      status,
-    });
-
-    dispatch(openModal('REPORT'));
-  };
-};
-
-export function cancelReport() {
-  return {
-    type: REPORT_CANCEL,
-  };
-};
-
-export function toggleStatusReport(statusId, checked) {
-  return {
-    type: REPORT_STATUS_TOGGLE,
-    statusId,
-    checked,
-  };
-};
-
-export function submitReport() {
-  return (dispatch, getState) => {
-    dispatch(submitReportRequest());
-
-    api(getState).post('/api/v1/reports', {
-      account_id: getState().getIn(['reports', 'new', 'account_id']),
-      status_ids: getState().getIn(['reports', 'new', 'status_ids']),
-      comment: getState().getIn(['reports', 'new', 'comment']),
-      forward: getState().getIn(['reports', 'new', 'forward']),
-    }).then(response => {
-      dispatch(closeModal());
-      dispatch(submitReportSuccess(response.data));
-    }).catch(error => dispatch(submitReportFail(error)));
-  };
-};
-
-export function submitReportRequest() {
-  return {
-    type: REPORT_SUBMIT_REQUEST,
-  };
-};
-
-export function submitReportSuccess(report) {
-  return {
-    type: REPORT_SUBMIT_SUCCESS,
-    report,
-  };
-};
-
-export function submitReportFail(error) {
-  return {
-    type: REPORT_SUBMIT_FAIL,
-    error,
-  };
-};
-
-export function changeReportComment(comment) {
-  return {
-    type: REPORT_COMMENT_CHANGE,
-    comment,
-  };
-};
-
-export function changeReportForward(forward) {
-  return {
-    type: REPORT_FORWARD_CHANGE,
-    forward,
-  };
-};
+export const initReport = (account, status) => dispatch =>
+  dispatch(openModal('REPORT', {
+    accountId: account.get('id'),
+    statusId: status?.get('id'),
+  }));
+
+export const submitReport = (params, onSuccess, onFail) => (dispatch, getState) => {
+  dispatch(submitReportRequest());
+
+  api(getState).post('/api/v1/reports', params).then(response => {
+    dispatch(submitReportSuccess(response.data));
+    if (onSuccess) onSuccess();
+  }).catch(error => {
+    dispatch(submitReportFail(error));
+    if (onFail) onFail();
+  });
+};
+
+export const submitReportRequest = () => ({
+  type: REPORT_SUBMIT_REQUEST,
+});
+
+export const submitReportSuccess = report => ({
+  type: REPORT_SUBMIT_SUCCESS,
+  report,
+});
+
+export const submitReportFail = error => ({
+  type: REPORT_SUBMIT_FAIL,
+  error,
+});
diff --git a/app/javascript/mastodon/actions/rules.js b/app/javascript/mastodon/actions/rules.js
new file mode 100644
index 000000000..34e60a121
--- /dev/null
+++ b/app/javascript/mastodon/actions/rules.js
@@ -0,0 +1,27 @@
+import api from '../api';
+
+export const RULES_FETCH_REQUEST = 'RULES_FETCH_REQUEST';
+export const RULES_FETCH_SUCCESS = 'RULES_FETCH_SUCCESS';
+export const RULES_FETCH_FAIL    = 'RULES_FETCH_FAIL';
+
+export const fetchRules = () => (dispatch, getState) => {
+  dispatch(fetchRulesRequest());
+
+  api(getState)
+    .get('/api/v1/instance').then(({ data }) => dispatch(fetchRulesSuccess(data.rules)))
+    .catch(err => dispatch(fetchRulesFail(err)));
+};
+
+const fetchRulesRequest = () => ({
+  type: RULES_FETCH_REQUEST,
+});
+
+const fetchRulesSuccess = rules => ({
+  type: RULES_FETCH_SUCCESS,
+  rules,
+});
+
+const fetchRulesFail = error => ({
+  type: RULES_FETCH_FAIL,
+  error,
+});
diff --git a/app/javascript/mastodon/components/check.js b/app/javascript/mastodon/components/check.js
new file mode 100644
index 000000000..ee2ef1595
--- /dev/null
+++ b/app/javascript/mastodon/components/check.js
@@ -0,0 +1,9 @@
+import React from 'react';
+
+const Check = () => (
+  <svg width='14' height='11' viewBox='0 0 14 11'>
+    <path d='M11.264 0L5.26 6.004 2.103 2.847 0 4.95l5.26 5.26 8.108-8.107L11.264 0' fill='currentColor' fillRule='evenodd' />
+  </svg>
+);
+
+export default Check;
diff --git a/app/javascript/mastodon/components/loading_indicator.js b/app/javascript/mastodon/components/loading_indicator.js
index 59f721c50..33c59d94c 100644
--- a/app/javascript/mastodon/components/loading_indicator.js
+++ b/app/javascript/mastodon/components/loading_indicator.js
@@ -6,7 +6,7 @@ export const CircularProgress = ({ size, strokeWidth }) => {
   const radius  = (size - strokeWidth) / 2;
 
   return (
-    <svg width={size} heigh={size} viewBox={viewBox} className='circular-progress' role='progressbar'>
+    <svg width={size} height={size} viewBox={viewBox} className='circular-progress' role='progressbar'>
       <circle
         fill='none'
         cx={size / 2}
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 4a87714e6..f433e4de9 100644
--- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
@@ -170,7 +170,7 @@ class EmojiPickerMenu extends React.PureComponent {
 
   state = {
     modifierOpen: false,
-    placement: null,
+    readyToFocus: false,
   };
 
   handleDocumentClick = e => {
@@ -182,6 +182,16 @@ class EmojiPickerMenu extends React.PureComponent {
   componentDidMount () {
     document.addEventListener('click', this.handleDocumentClick, false);
     document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);
+
+    // Because of https://github.com/react-bootstrap/react-bootstrap/issues/2614 we need
+    // to wait for a frame before focusing
+    requestAnimationFrame(() => {
+      this.setState({ readyToFocus: true });
+      if (this.node) {
+        const element = this.node.querySelector('input[type="search"]');
+        if (element) element.focus();
+      }
+    });
   }
 
   componentWillUnmount () {
@@ -281,7 +291,7 @@ class EmojiPickerMenu extends React.PureComponent {
           showSkinTones={false}
           backgroundImageFn={backgroundImageFn}
           notFound={notFoundFn}
-          autoFocus
+          autoFocus={this.state.readyToFocus}
           emojiTooltip
         />
 
@@ -314,6 +324,7 @@ class EmojiPickerDropdown extends React.PureComponent {
   state = {
     active: false,
     loading: false,
+    placement: null,
   };
 
   setRef = (c) => {
diff --git a/app/javascript/mastodon/features/emoji/emoji_compressed.js b/app/javascript/mastodon/features/emoji/emoji_compressed.js
index 74b53ce5c..6a402f2d4 100644
--- a/app/javascript/mastodon/features/emoji/emoji_compressed.js
+++ b/app/javascript/mastodon/features/emoji/emoji_compressed.js
@@ -90,7 +90,7 @@ Object.keys(emojiIndex.emojis).forEach(key => {
   let { short_names, search, unified } = emojiMartData.emojis[key];
 
   if (short_names[0] !== key) {
-    throw new Error('The compresser expects the first short_code to be the ' +
+    throw new Error('The compressor expects the first short_code to be the ' +
       'key. It may need to be rewritten if the emoji change such that this ' +
       'is no longer the case.');
   }
diff --git a/app/javascript/mastodon/features/notifications/components/column_settings.js b/app/javascript/mastodon/features/notifications/components/column_settings.js
index ada8b6e4a..84db04430 100644
--- a/app/javascript/mastodon/features/notifications/components/column_settings.js
+++ b/app/javascript/mastodon/features/notifications/components/column_settings.js
@@ -5,6 +5,7 @@ import { FormattedMessage } from 'react-intl';
 import ClearColumnButton from './clear_column_button';
 import GrantPermissionButton from './grant_permission_button';
 import SettingToggle from './setting_toggle';
+import { isStaff } from 'mastodon/initial_state';
 
 export default class ColumnSettings extends React.PureComponent {
 
@@ -155,7 +156,7 @@ export default class ColumnSettings extends React.PureComponent {
         </div>
 
         <div role='group' aria-labelledby='notifications-update'>
-          <span id='notifications-status' className='column-settings__section'><FormattedMessage id='notifications.column_settings.update' defaultMessage='Edits:' /></span>
+          <span id='notifications-update' className='column-settings__section'><FormattedMessage id='notifications.column_settings.update' defaultMessage='Edits:' /></span>
 
           <div className='column-settings__row'>
             <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'update']} onChange={onChange} label={alertStr} />
@@ -164,6 +165,19 @@ export default class ColumnSettings extends React.PureComponent {
             <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'update']} onChange={onChange} label={soundStr} />
           </div>
         </div>
+
+        {isStaff && (
+          <div role='group' aria-labelledby='notifications-admin-sign-up'>
+            <span id='notifications-status' className='column-settings__section'><FormattedMessage id='notifications.column_settings.admin.sign_up' defaultMessage='New sign-ups:' /></span>
+
+            <div className='column-settings__row'>
+              <SettingToggle disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'admin.sign_up']} onChange={onChange} label={alertStr} />
+              {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'admin.sign_up']} onChange={this.onPushChange} label={pushStr} />}
+              <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'admin.sign_up']} onChange={onChange} label={showStr} />
+              <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'admin.sign_up']} onChange={onChange} label={soundStr} />
+            </div>
+          </div>
+        )}
       </div>
     );
   }
diff --git a/app/javascript/mastodon/features/notifications/components/notification.js b/app/javascript/mastodon/features/notifications/components/notification.js
index cd471852b..9198e9c9d 100644
--- a/app/javascript/mastodon/features/notifications/components/notification.js
+++ b/app/javascript/mastodon/features/notifications/components/notification.js
@@ -20,6 +20,7 @@ const messages = defineMessages({
   reblog: { id: 'notification.reblog', defaultMessage: '{name} boosted your status' },
   status: { id: 'notification.status', defaultMessage: '{name} just posted' },
   update: { id: 'notification.update', defaultMessage: '{name} edited a post' },
+  adminSignUp: { id: 'notification.admin.sign_up', defaultMessage: '{name} signed up' },
 });
 
 const notificationForScreenReader = (intl, message, timestamp) => {
@@ -344,6 +345,28 @@ class Notification extends ImmutablePureComponent {
     );
   }
 
+  renderAdminSignUp (notification, account, link) {
+    const { intl, unread } = this.props;
+
+    return (
+      <HotKeys handlers={this.getHandlers()}>
+        <div className={classNames('notification notification-admin-sign-up focusable', { unread })} tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.adminSignUp, { name: account.get('acct') }), notification.get('created_at'))}>
+          <div className='notification__message'>
+            <div className='notification__favourite-icon-wrapper'>
+              <Icon id='user-plus' fixedWidth />
+            </div>
+
+            <span title={notification.get('created_at')}>
+              <FormattedMessage id='notification.admin.sign_up' defaultMessage='{name} signed up' values={{ name: link }} />
+            </span>
+          </div>
+
+          <AccountContainer id={account.get('id')} hidden={this.props.hidden} />
+        </div>
+      </HotKeys>
+    );
+  }
+
   render () {
     const { notification } = this.props;
     const account          = notification.get('account');
@@ -367,6 +390,8 @@ class Notification extends ImmutablePureComponent {
       return this.renderUpdate(notification, link);
     case 'poll':
       return this.renderPoll(notification, account);
+    case 'admin.sign_up':
+      return this.renderAdminSignUp(notification, account, link);
     }
 
     return null;
diff --git a/app/javascript/mastodon/features/report/category.js b/app/javascript/mastodon/features/report/category.js
new file mode 100644
index 000000000..122b51c7c
--- /dev/null
+++ b/app/javascript/mastodon/features/report/category.js
@@ -0,0 +1,93 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import Button from 'mastodon/components/button';
+import Option from './components/option';
+
+const messages = defineMessages({
+  dislike: { id: 'report.reasons.dislike', defaultMessage: 'I don\'t like it' },
+  dislike_description: { id: 'report.reasons.dislike_description', defaultMessage: 'It is not something you want to see' },
+  spam: { id: 'report.reasons.spam', defaultMessage: 'It\'s spam' },
+  spam_description: { id: 'report.reasons.spam_description', defaultMessage: 'Malicious links, fake engagement, or repetetive replies' },
+  violation: { id: 'report.reasons.violation', defaultMessage: 'It violates server rules' },
+  violation_description: { id: 'report.reasons.violation_description', defaultMessage: 'You are aware that it breaks specific rules' },
+  other: { id: 'report.reasons.other', defaultMessage: 'It\'s something else' },
+  other_description: { id: 'report.reasons.other_description', defaultMessage: 'The issue does not fit into other categories' },
+  status: { id: 'report.category.title_status', defaultMessage: 'post' },
+  account: { id: 'report.category.title_account', defaultMessage: 'profile' },
+});
+
+export default @injectIntl
+class Category extends React.PureComponent {
+
+  static propTypes = {
+    onNextStep: PropTypes.func.isRequired,
+    category: PropTypes.string,
+    onChangeCategory: PropTypes.func.isRequired,
+    startedFrom: PropTypes.oneOf(['status', 'account']),
+    intl: PropTypes.object.isRequired,
+  };
+
+  handleNextClick = () => {
+    const { onNextStep, category } = this.props;
+
+    switch(category) {
+    case 'dislike':
+      onNextStep('thanks');
+      break;
+    case 'violation':
+      onNextStep('rules');
+      break;
+    default:
+      onNextStep('statuses');
+      break;
+    }
+  };
+
+  handleCategoryToggle = (value, checked) => {
+    const { onChangeCategory } = this.props;
+
+    if (checked) {
+      onChangeCategory(value);
+    }
+  };
+
+  render () {
+    const { category, startedFrom, intl } = this.props;
+
+    const options = [
+      'dislike',
+      'spam',
+      'violation',
+      'other',
+    ];
+
+    return (
+      <React.Fragment>
+        <h3 className='report-dialog-modal__title'><FormattedMessage id='report.category.title' defaultMessage="Tell us what's going on with this {type}" values={{ type: intl.formatMessage(messages[startedFrom]) }} /></h3>
+        <p className='report-dialog-modal__lead'><FormattedMessage id='report.category.subtitle' defaultMessage='Choose the best match' /></p>
+
+        <div>
+          {options.map(item => (
+            <Option
+              key={item}
+              name='category'
+              value={item}
+              checked={category === item}
+              onToggle={this.handleCategoryToggle}
+              label={intl.formatMessage(messages[item])}
+              description={intl.formatMessage(messages[`${item}_description`])}
+            />
+          ))}
+        </div>
+
+        <div className='flex-spacer' />
+
+        <div className='report-dialog-modal__actions'>
+          <Button onClick={this.handleNextClick} disabled={category === null}><FormattedMessage id='report.next' defaultMessage='Next' /></Button>
+        </div>
+      </React.Fragment>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/report/comment.js b/app/javascript/mastodon/features/report/comment.js
new file mode 100644
index 000000000..8d1a4e21f
--- /dev/null
+++ b/app/javascript/mastodon/features/report/comment.js
@@ -0,0 +1,83 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';
+import Button from 'mastodon/components/button';
+import Toggle from 'react-toggle';
+
+const messages = defineMessages({
+  placeholder: { id: 'report.placeholder', defaultMessage: 'Type or paste additional comments' },
+});
+
+export default @injectIntl
+class Comment extends React.PureComponent {
+
+  static propTypes = {
+    onSubmit: PropTypes.func.isRequired,
+    comment: PropTypes.string.isRequired,
+    onChangeComment: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
+    isSubmitting: PropTypes.bool,
+    forward: PropTypes.bool,
+    isRemote: PropTypes.bool,
+    domain: PropTypes.string,
+    onChangeForward: PropTypes.func.isRequired,
+  };
+
+  handleClick = () => {
+    const { onSubmit } = this.props;
+    onSubmit();
+  };
+
+  handleChange = e => {
+    const { onChangeComment } = this.props;
+    onChangeComment(e.target.value);
+  };
+
+  handleKeyDown = e => {
+    if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {
+      this.handleClick();
+    }
+  };
+
+  handleForwardChange = e => {
+    const { onChangeForward } = this.props;
+    onChangeForward(e.target.checked);
+  };
+
+  render () {
+    const { comment, isRemote, forward, domain, isSubmitting, intl } = this.props;
+
+    return (
+      <React.Fragment>
+        <h3 className='report-dialog-modal__title'><FormattedMessage id='report.comment.title' defaultMessage='Is there anything else you think we should know?' /></h3>
+
+        <textarea
+          className='report-dialog-modal__textarea'
+          placeholder={intl.formatMessage(messages.placeholder)}
+          value={comment}
+          onChange={this.handleChange}
+          onKeyDown={this.handleKeyDown}
+          disabled={isSubmitting}
+        />
+
+        {isRemote && (
+          <React.Fragment>
+            <p className='report-dialog-modal__lead'><FormattedMessage id='report.forward_hint' defaultMessage='The account is from another server. Send an anonymized copy of the report there as well?' /></p>
+
+            <label className='report-dialog-modal__toggle'>
+              <Toggle checked={forward} disabled={isSubmitting} onChange={this.handleForwardChange} />
+              <FormattedMessage id='report.forward' defaultMessage='Forward to {target}' values={{ target: domain }} />
+            </label>
+          </React.Fragment>
+        )}
+
+        <div className='flex-spacer' />
+
+        <div className='report-dialog-modal__actions'>
+          <Button onClick={this.handleClick}><FormattedMessage id='report.submit' defaultMessage='Submit report' /></Button>
+        </div>
+      </React.Fragment>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/report/components/option.js b/app/javascript/mastodon/features/report/components/option.js
new file mode 100644
index 000000000..744d85268
--- /dev/null
+++ b/app/javascript/mastodon/features/report/components/option.js
@@ -0,0 +1,60 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import classNames from 'classnames';
+import Check from 'mastodon/components/check';
+
+export default class Option extends React.PureComponent {
+
+  static propTypes = {
+    name: PropTypes.string.isRequired,
+    value: PropTypes.string.isRequired,
+    checked: PropTypes.bool,
+    label: PropTypes.node,
+    description: PropTypes.node,
+    onToggle: PropTypes.func,
+    multiple: PropTypes.bool,
+    labelComponent: PropTypes.node,
+  };
+
+  handleKeyPress = e => {
+    const { value, checked, onToggle } = this.props;
+
+    if (e.key === 'Enter' || e.key === ' ') {
+      e.stopPropagation();
+      e.preventDefault();
+      onToggle(value, !checked);
+    }
+  }
+
+  handleChange = e => {
+    const { value, onToggle } = this.props;
+    onToggle(value, e.target.checked);
+  }
+
+  render () {
+    const { name, value, checked, label, labelComponent, description, multiple } = this.props;
+
+    return (
+      <label className='dialog-option poll__option selectable'>
+        <input type={multiple ? 'checkbox' : 'radio'} name={name} value={value} checked={checked} onChange={this.handleChange} />
+
+        <span
+          className={classNames('poll__input', { active: checked, checkbox: multiple })}
+          tabIndex='0'
+          role='radio'
+          onKeyPress={this.handleKeyPress}
+          aria-checked={checked}
+          aria-label={label}
+        >{checked && <Check />}</span>
+
+        {labelComponent ? labelComponent : (
+          <span className='poll__option__text'>
+            <strong>{label}</strong>
+            {description}
+          </span>
+        )}
+      </label>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/report/components/status_check_box.js b/app/javascript/mastodon/features/report/components/status_check_box.js
index c29e517da..a2eb3d6f5 100644
--- a/app/javascript/mastodon/features/report/components/status_check_box.js
+++ b/app/javascript/mastodon/features/report/components/status_check_box.js
@@ -1,23 +1,32 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import Toggle from 'react-toggle';
 import noop from 'lodash/noop';
-import StatusContent from '../../../components/status_content';
-import { MediaGallery, Video } from '../../ui/util/async-components';
-import Bundle from '../../ui/components/bundle';
+import StatusContent from 'mastodon/components/status_content';
+import { MediaGallery, Video } from 'mastodon/features/ui/util/async-components';
+import Bundle from 'mastodon/features/ui/components/bundle';
+import Avatar from 'mastodon/components/avatar';
+import DisplayName from 'mastodon/components/display_name';
+import RelativeTimestamp from 'mastodon/components/relative_timestamp';
+import Option from './option';
 
 export default class StatusCheckBox extends React.PureComponent {
 
   static propTypes = {
+    id: PropTypes.string.isRequired,
     status: ImmutablePropTypes.map.isRequired,
     checked: PropTypes.bool,
     onToggle: PropTypes.func.isRequired,
-    disabled: PropTypes.bool,
+  };
+
+  handleStatusesToggle = (value, checked) => {
+    const { onToggle } = this.props;
+    onToggle(value, checked);
   };
 
   render () {
-    const { status, checked, onToggle, disabled } = this.props;
+    const { status, checked } = this.props;
+
     let media = null;
 
     if (status.get('reblog')) {
@@ -50,24 +59,46 @@ export default class StatusCheckBox extends React.PureComponent {
       } else {
         media = (
           <Bundle fetchComponent={MediaGallery} loading={this.renderLoadingMediaGallery} >
-            {Component => <Component media={status.get('media_attachments')} sensitive={status.get('sensitive')} height={110} onOpenMedia={noop} />}
+            {Component => (
+              <Component
+                media={status.get('media_attachments')}
+                sensitive={status.get('sensitive')}
+                height={110}
+                onOpenMedia={noop}
+              />
+            )}
           </Bundle>
         );
       }
     }
 
-    return (
-      <div className='status-check-box'>
-        <div className='status-check-box__status'>
-          <StatusContent status={status} />
-          {media}
-        </div>
+    const labelComponent = (
+      <div className='status-check-box__status poll__option__text'>
+        <div className='detailed-status__display-name'>
+          <div className='detailed-status__display-avatar'>
+            <Avatar account={status.get('account')} size={46} />
+          </div>
 
-        <div className='status-check-box-toggle'>
-          <Toggle checked={checked} onChange={onToggle} disabled={disabled} />
+          <div><DisplayName account={status.get('account')} /> · <RelativeTimestamp timestamp={status.get('created_at')} /></div>
         </div>
+
+        <StatusContent status={status} />
+
+        {media}
       </div>
     );
+
+    return (
+      <Option
+        name='status_ids'
+        value={status.get('id')}
+        checked={checked}
+        onToggle={this.handleStatusesToggle}
+        label={status.get('search_index')}
+        labelComponent={labelComponent}
+        multiple
+      />
+    );
   }
 
 }
diff --git a/app/javascript/mastodon/features/report/containers/status_check_box_container.js b/app/javascript/mastodon/features/report/containers/status_check_box_container.js
index 48cd0319b..65a7c11fd 100644
--- a/app/javascript/mastodon/features/report/containers/status_check_box_container.js
+++ b/app/javascript/mastodon/features/report/containers/status_check_box_container.js
@@ -1,19 +1,15 @@
 import { connect } from 'react-redux';
 import StatusCheckBox from '../components/status_check_box';
-import { toggleStatusReport } from '../../../actions/reports';
-import { Set as ImmutableSet } from 'immutable';
+import { makeGetStatus } from 'mastodon/selectors';
 
-const mapStateToProps = (state, { id }) => ({
-  status: state.getIn(['statuses', id]),
-  checked: state.getIn(['reports', 'new', 'status_ids'], ImmutableSet()).includes(id),
-});
+const makeMapStateToProps = () => {
+  const getStatus = makeGetStatus();
 
-const mapDispatchToProps = (dispatch, { id }) => ({
+  const mapStateToProps = (state, { id }) => ({
+    status: getStatus(state, { id }),
+  });
 
-  onToggle (e) {
-    dispatch(toggleStatusReport(id, e.target.checked));
-  },
+  return mapStateToProps;
+};
 
-});
-
-export default connect(mapStateToProps, mapDispatchToProps)(StatusCheckBox);
+export default connect(makeMapStateToProps)(StatusCheckBox);
diff --git a/app/javascript/mastodon/features/report/rules.js b/app/javascript/mastodon/features/report/rules.js
new file mode 100644
index 000000000..f2db0d9e4
--- /dev/null
+++ b/app/javascript/mastodon/features/report/rules.js
@@ -0,0 +1,64 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
+import { FormattedMessage } from 'react-intl';
+import Button from 'mastodon/components/button';
+import Option from './components/option';
+
+const mapStateToProps = state => ({
+  rules: state.get('rules'),
+});
+
+export default @connect(mapStateToProps)
+class Rules extends React.PureComponent {
+
+  static propTypes = {
+    onNextStep: PropTypes.func.isRequired,
+    rules: ImmutablePropTypes.list,
+    selectedRuleIds: ImmutablePropTypes.set.isRequired,
+    onToggle: PropTypes.func.isRequired,
+  };
+
+  handleNextClick = () => {
+    const { onNextStep } = this.props;
+    onNextStep('statuses');
+  };
+
+  handleRulesToggle = (value, checked) => {
+    const { onToggle } = this.props;
+    onToggle(value, checked);
+  };
+
+  render () {
+    const { rules, selectedRuleIds } = this.props;
+
+    return (
+      <React.Fragment>
+        <h3 className='report-dialog-modal__title'><FormattedMessage id='report.rules.title' defaultMessage='Which rules are being violated?' /></h3>
+        <p className='report-dialog-modal__lead'><FormattedMessage id='report.rules.subtitle' defaultMessage='Select all that apply' /></p>
+
+        <div>
+          {rules.map(item => (
+            <Option
+              key={item.get('id')}
+              name='rule_ids'
+              value={item.get('id')}
+              checked={selectedRuleIds.includes(item.get('id'))}
+              onToggle={this.handleRulesToggle}
+              label={item.get('text')}
+              multiple
+            />
+          ))}
+        </div>
+
+        <div className='flex-spacer' />
+
+        <div className='report-dialog-modal__actions'>
+          <Button onClick={this.handleNextClick} disabled={selectedRuleIds.size < 1}><FormattedMessage id='report.next' defaultMessage='Next' /></Button>
+        </div>
+      </React.Fragment>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/report/statuses.js b/app/javascript/mastodon/features/report/statuses.js
new file mode 100644
index 000000000..5999a0e06
--- /dev/null
+++ b/app/javascript/mastodon/features/report/statuses.js
@@ -0,0 +1,58 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { connect } from 'react-redux';
+import StatusCheckBox from 'mastodon/features/report/containers/status_check_box_container';
+import { OrderedSet } from 'immutable';
+import { FormattedMessage } from 'react-intl';
+import Button from 'mastodon/components/button';
+
+const mapStateToProps = (state, { accountId }) => ({
+  availableStatusIds: OrderedSet(state.getIn(['timelines', `account:${accountId}:with_replies`, 'items'])),
+});
+
+export default @connect(mapStateToProps)
+class Statuses extends React.PureComponent {
+
+  static propTypes = {
+    onNextStep: PropTypes.func.isRequired,
+    accountId: PropTypes.string.isRequired,
+    availableStatusIds: ImmutablePropTypes.set.isRequired,
+    selectedStatusIds: ImmutablePropTypes.set.isRequired,
+    onToggle: PropTypes.func.isRequired,
+  };
+
+  handleNextClick = () => {
+    const { onNextStep } = this.props;
+    onNextStep('comment');
+  };
+
+  render () {
+    const { availableStatusIds, selectedStatusIds, onToggle } = this.props;
+
+    return (
+      <React.Fragment>
+        <h3 className='report-dialog-modal__title'><FormattedMessage id='report.statuses.title' defaultMessage='Are there any posts that back up this report?' /></h3>
+        <p className='report-dialog-modal__lead'><FormattedMessage id='report.statuses.subtitle' defaultMessage='Select all that apply' /></p>
+
+        <div className='report-dialog-modal__statuses'>
+          {availableStatusIds.union(selectedStatusIds).map(statusId => (
+            <StatusCheckBox
+              id={statusId}
+              key={statusId}
+              checked={selectedStatusIds.includes(statusId)}
+              onToggle={onToggle}
+            />
+          ))}
+        </div>
+
+        <div className='flex-spacer' />
+
+        <div className='report-dialog-modal__actions'>
+          <Button onClick={this.handleNextClick}><FormattedMessage id='report.next' defaultMessage='Next' /></Button>
+        </div>
+      </React.Fragment>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/report/thanks.js b/app/javascript/mastodon/features/report/thanks.js
new file mode 100644
index 000000000..d169b1e32
--- /dev/null
+++ b/app/javascript/mastodon/features/report/thanks.js
@@ -0,0 +1,84 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { FormattedMessage } from 'react-intl';
+import Button from 'mastodon/components/button';
+import { connect } from 'react-redux';
+import {
+  unfollowAccount,
+  muteAccount,
+  blockAccount,
+} from 'mastodon/actions/accounts';
+
+const mapStateToProps = () => ({});
+
+export default @connect(mapStateToProps)
+class Thanks extends React.PureComponent {
+
+  static propTypes = {
+    submitted: PropTypes.bool,
+    onClose: PropTypes.func.isRequired,
+    account: ImmutablePropTypes.map.isRequired,
+    dispatch: PropTypes.func.isRequired,
+  };
+
+  handleCloseClick = () => {
+    const { onClose } = this.props;
+    onClose();
+  };
+
+  handleUnfollowClick = () => {
+    const { dispatch, account, onClose } = this.props;
+    dispatch(unfollowAccount(account.get('id')));
+    onClose();
+  };
+
+  handleMuteClick = () => {
+    const { dispatch, account, onClose } = this.props;
+    dispatch(muteAccount(account.get('id')));
+    onClose();
+  };
+
+  handleBlockClick = () => {
+    const { dispatch, account, onClose } = this.props;
+    dispatch(blockAccount(account.get('id')));
+    onClose();
+  };
+
+  render () {
+    const { account, submitted } = this.props;
+
+    return (
+      <React.Fragment>
+        <h3 className='report-dialog-modal__title'>{submitted ? <FormattedMessage id='report.thanks.title_actionable' defaultMessage="Thanks for reporting, we'll look into this." /> : <FormattedMessage id='report.thanks.title' defaultMessage="Don't want to see this?" />}</h3>
+        <p className='report-dialog-modal__lead'>{submitted ? <FormattedMessage id='report.thanks.take_action_actionable' defaultMessage='While we review this, you can take action against @{name}:' values={{ name: account.get('username') }} /> : <FormattedMessage id='report.thanks.take_action' defaultMessage='Here are your options for controlling what you see on Mastodon:' />}</p>
+
+        {account.getIn(['relationship', 'following']) && (
+          <React.Fragment>
+            <h4 className='report-dialog-modal__subtitle'><FormattedMessage id='report.unfollow' defaultMessage='Unfollow @{name}' values={{ name: account.get('username') }} /></h4>
+            <p className='report-dialog-modal__lead'><FormattedMessage id='report.unfollow_explanation' defaultMessage='You are following this account. To not see their posts in your home feed anymore, unfollow them.' /></p>
+            <Button secondary onClick={this.handleUnfollowClick}><FormattedMessage id='account.unfollow' defaultMessage='Unfollow' /></Button>
+            <hr />
+          </React.Fragment>
+        )}
+
+        <h4 className='report-dialog-modal__subtitle'><FormattedMessage id='account.mute' defaultMessage='Mute @{name}' values={{ name: account.get('username') }} /></h4>
+        <p className='report-dialog-modal__lead'><FormattedMessage id='report.mute_explanation' defaultMessage='You will not see their posts. They can still follow you and see your posts and will not know that they are muted.' /></p>
+        <Button secondary onClick={this.handleMuteClick}>{!account.getIn(['relationship', 'muting']) ? <FormattedMessage id='report.mute' defaultMessage='Mute' /> : <FormattedMessage id='account.muted' defaultMessage='Muted' />}</Button>
+
+        <hr />
+
+        <h4 className='report-dialog-modal__subtitle'><FormattedMessage id='account.block' defaultMessage='Block @{name}' values={{ name: account.get('username') }} /></h4>
+        <p className='report-dialog-modal__lead'><FormattedMessage id='report.block_explanation' defaultMessage='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.' /></p>
+        <Button secondary onClick={this.handleBlockClick}>{!account.getIn(['relationship', 'blocking']) ? <FormattedMessage id='report.block' defaultMessage='Block' /> : <FormattedMessage id='account.blocked' defaultMessage='Blocked' />}</Button>
+
+        <div className='flex-spacer' />
+
+        <div className='report-dialog-modal__actions'>
+          <Button onClick={this.handleCloseClick}><FormattedMessage id='report.close' defaultMessage='Done' /></Button>
+        </div>
+      </React.Fragment>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/ui/components/report_modal.js b/app/javascript/mastodon/features/ui/components/report_modal.js
index f4f0a3884..744dd248b 100644
--- a/app/javascript/mastodon/features/ui/components/report_modal.js
+++ b/app/javascript/mastodon/features/ui/components/report_modal.js
@@ -1,38 +1,31 @@
 import React from 'react';
 import { connect } from 'react-redux';
-import { changeReportComment, changeReportForward, submitReport } from '../../../actions/reports';
-import { expandAccountTimeline } from '../../../actions/timelines';
+import { submitReport } from 'mastodon/actions/reports';
+import { expandAccountTimeline } from 'mastodon/actions/timelines';
+import { fetchRules } from 'mastodon/actions/rules';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import { makeGetAccount } from '../../../selectors';
+import { makeGetAccount } from 'mastodon/selectors';
 import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
-import StatusCheckBox from '../../report/containers/status_check_box_container';
 import { OrderedSet } from 'immutable';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import Button from '../../../components/button';
-import Toggle from 'react-toggle';
-import IconButton from '../../../components/icon_button';
+import IconButton from 'mastodon/components/icon_button';
+import Category from 'mastodon/features/report/category';
+import Statuses from 'mastodon/features/report/statuses';
+import Rules from 'mastodon/features/report/rules';
+import Comment from 'mastodon/features/report/comment';
+import Thanks from 'mastodon/features/report/thanks';
 
 const messages = defineMessages({
   close: { id: 'lightbox.close', defaultMessage: 'Close' },
-  placeholder: { id: 'report.placeholder', defaultMessage: 'Additional comments' },
-  submit: { id: 'report.submit', defaultMessage: 'Submit' },
 });
 
 const makeMapStateToProps = () => {
   const getAccount = makeGetAccount();
 
-  const mapStateToProps = state => {
-    const accountId = state.getIn(['reports', 'new', 'account_id']);
-
-    return {
-      isSubmitting: state.getIn(['reports', 'new', 'isSubmitting']),
-      account: getAccount(state, accountId),
-      comment: state.getIn(['reports', 'new', 'comment']),
-      forward: state.getIn(['reports', 'new', 'forward']),
-      statusIds: OrderedSet(state.getIn(['timelines', `account:${accountId}:with_replies`, 'items'])).union(state.getIn(['reports', 'new', 'status_ids'])),
-    };
-  };
+  const mapStateToProps = (state, { accountId }) => ({
+    account: getAccount(state, accountId),
+  });
 
   return mapStateToProps;
 };
@@ -42,92 +35,182 @@ export default @connect(makeMapStateToProps)
 class ReportModal extends ImmutablePureComponent {
 
   static propTypes = {
-    isSubmitting: PropTypes.bool,
-    account: ImmutablePropTypes.map,
-    statusIds: ImmutablePropTypes.orderedSet.isRequired,
-    comment: PropTypes.string.isRequired,
-    forward: PropTypes.bool,
+    accountId: PropTypes.string.isRequired,
+    statusId: PropTypes.string,
     dispatch: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
+    account: ImmutablePropTypes.map.isRequired,
   };
 
-  handleCommentChange = e => {
-    this.props.dispatch(changeReportComment(e.target.value));
-  }
-
-  handleForwardChange = e => {
-    this.props.dispatch(changeReportForward(e.target.checked));
-  }
+  state = {
+    step: 'category',
+    selectedStatusIds: OrderedSet(this.props.statusId ? [this.props.statusId] : []),
+    comment: '',
+    category: null,
+    selectedRuleIds: OrderedSet(),
+    forward: true,
+    isSubmitting: false,
+    isSubmitted: false,
+  };
 
   handleSubmit = () => {
-    this.props.dispatch(submitReport());
-  }
+    const { dispatch, accountId } = this.props;
+    const { selectedStatusIds, comment, category, selectedRuleIds, forward } = this.state;
+
+    this.setState({ isSubmitting: true });
+
+    dispatch(submitReport({
+      account_id: accountId,
+      status_ids: selectedStatusIds.toArray(),
+      comment,
+      forward,
+      category,
+      rule_ids: selectedRuleIds.toArray(),
+    }, this.handleSuccess, this.handleFail));
+  };
+
+  handleSuccess = () => {
+    this.setState({ isSubmitting: false, isSubmitted: true, step: 'thanks' });
+  };
+
+  handleFail = () => {
+    this.setState({ isSubmitting: false });
+  };
+
+  handleStatusToggle = (statusId, checked) => {
+    const { selectedStatusIds } = this.state;
+
+    if (checked) {
+      this.setState({ selectedStatusIds: selectedStatusIds.add(statusId) });
+    } else {
+      this.setState({ selectedStatusIds: selectedStatusIds.remove(statusId) });
+    }
+  };
 
-  handleKeyDown = e => {
-    if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {
-      this.handleSubmit();
+  handleRuleToggle = (ruleId, checked) => {
+    const { selectedRuleIds } = this.state;
+
+    if (checked) {
+      this.setState({ selectedRuleIds: selectedRuleIds.add(ruleId) });
+    } else {
+      this.setState({ selectedRuleIds: selectedRuleIds.remove(ruleId) });
     }
   }
 
+  handleChangeCategory = category => {
+    this.setState({ category });
+  };
+
+  handleChangeComment = comment => {
+    this.setState({ comment });
+  };
+
+  handleChangeForward = forward => {
+    this.setState({ forward });
+  };
+
+  handleNextStep = step => {
+    this.setState({ step });
+  };
+
   componentDidMount () {
-    this.props.dispatch(expandAccountTimeline(this.props.account.get('id'), { withReplies: true }));
-  }
+    const { dispatch, accountId } = this.props;
 
-  componentWillReceiveProps (nextProps) {
-    if (this.props.account !== nextProps.account && nextProps.account) {
-      this.props.dispatch(expandAccountTimeline(nextProps.account.get('id'), { withReplies: true }));
-    }
+    dispatch(expandAccountTimeline(accountId, { withReplies: true }));
+    dispatch(fetchRules());
   }
 
   render () {
-    const { account, comment, intl, statusIds, isSubmitting, forward, onClose } = this.props;
+    const {
+      accountId,
+      account,
+      intl,
+      onClose,
+    } = this.props;
 
     if (!account) {
       return null;
     }
 
-    const domain = account.get('acct').split('@')[1];
+    const {
+      step,
+      selectedStatusIds,
+      selectedRuleIds,
+      comment,
+      forward,
+      category,
+      isSubmitting,
+      isSubmitted,
+    } = this.state;
+
+    const domain   = account.get('acct').split('@')[1];
+    const isRemote = !!domain;
+
+    let stepComponent;
+
+    switch(step) {
+    case 'category':
+      stepComponent = (
+        <Category
+          onNextStep={this.handleNextStep}
+          startedFrom={this.props.statusId ? 'status' : 'account'}
+          category={category}
+          onChangeCategory={this.handleChangeCategory}
+        />
+      );
+      break;
+    case 'rules':
+      stepComponent = (
+        <Rules
+          onNextStep={this.handleNextStep}
+          selectedRuleIds={selectedRuleIds}
+          onToggle={this.handleRuleToggle}
+        />
+      );
+      break;
+    case 'statuses':
+      stepComponent = (
+        <Statuses
+          onNextStep={this.handleNextStep}
+          accountId={accountId}
+          selectedStatusIds={selectedStatusIds}
+          onToggle={this.handleStatusToggle}
+        />
+      );
+      break;
+    case 'comment':
+      stepComponent = (
+        <Comment
+          onSubmit={this.handleSubmit}
+          isSubmitting={isSubmitting}
+          isRemote={isRemote}
+          comment={comment}
+          forward={forward}
+          domain={domain}
+          onChangeComment={this.handleChangeComment}
+          onChangeForward={this.handleChangeForward}
+        />
+      );
+      break;
+    case 'thanks':
+      stepComponent = (
+        <Thanks
+          submitted={isSubmitted}
+          account={account}
+          onClose={onClose}
+        />
+      );
+    }
 
     return (
-      <div className='modal-root__modal report-modal'>
+      <div className='modal-root__modal report-dialog-modal'>
         <div className='report-modal__target'>
           <IconButton className='report-modal__close' title={intl.formatMessage(messages.close)} icon='times' onClick={onClose} size={20} />
           <FormattedMessage id='report.target' defaultMessage='Report {target}' values={{ target: <strong>{account.get('acct')}</strong> }} />
         </div>
 
-        <div className='report-modal__container'>
-          <div className='report-modal__comment'>
-            <p><FormattedMessage id='report.hint' defaultMessage='The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:' /></p>
-
-            <textarea
-              className='setting-text light'
-              placeholder={intl.formatMessage(messages.placeholder)}
-              value={comment}
-              onChange={this.handleCommentChange}
-              onKeyDown={this.handleKeyDown}
-              disabled={isSubmitting}
-              autoFocus
-            />
-
-            {domain && (
-              <div>
-                <p><FormattedMessage id='report.forward_hint' defaultMessage='The account is from another server. Send an anonymized copy of the report there as well?' /></p>
-
-                <div className='setting-toggle'>
-                  <Toggle id='report-forward' checked={forward} disabled={isSubmitting} onChange={this.handleForwardChange} />
-                  <label htmlFor='report-forward' className='setting-toggle__label'><FormattedMessage id='report.forward' defaultMessage='Forward to {target}' values={{ target: domain }} /></label>
-                </div>
-              </div>
-            )}
-
-            <Button disabled={isSubmitting} text={intl.formatMessage(messages.submit)} onClick={this.handleSubmit} />
-          </div>
-
-          <div className='report-modal__statuses'>
-            <div>
-              {statusIds.map(statusId => <StatusCheckBox id={statusId} key={statusId} disabled={isSubmitting} />)}
-            </div>
-          </div>
+        <div className='report-dialog-modal__container'>
+          {stepComponent}
         </div>
       </div>
     );
diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json
index 2675da68c..5456eb88e 100644
--- a/app/javascript/mastodon/locales/af.json
+++ b/app/javascript/mastodon/locales/af.json
@@ -308,6 +308,7 @@
   "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.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index d244ab5fc..33a78afa3 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -21,7 +21,7 @@
   "account.following_counter": "{count, plural, zero{لا يُتابِع} one {يُتابِعُ واحد} two{يُتابِعُ اِثنان} few{يُتابِعُ {counter}} many{يُتابِعُ {counter}} other {يُتابِعُ {counter}}}",
   "account.follows.empty": "لا يُتابع هذا المُستخدمُ أيَّ أحدٍ حتى الآن.",
   "account.follows_you": "يُتابِعُك",
-  "account.hide_reblogs": "إخفاء تعزيزات @{name}",
+  "account.hide_reblogs": "إخفاء مشاركات @{name}",
   "account.joined": "انضم في {date}",
   "account.last_status": "آخر نشاط",
   "account.link_verified_on": "تمَّ التَّحقق مِن مِلْكيّة هذا الرابط بتاريخ {date}",
@@ -38,7 +38,7 @@
   "account.report": "الإبلاغ عن @{name}",
   "account.requested": "في اِنتظر القُبول. اِنقُر لإلغاء طلب المُتابعة",
   "account.share": "مُشاركة الملف الشخصي لـ @{name}",
-  "account.show_reblogs": "عرض تعزيزات @{name}",
+  "account.show_reblogs": "عرض مشاركات @{name}",
   "account.statuses_counter": "{count, plural, zero {لَا تَبويقات} one {تَبويقةٌ واحدة} two {تَبويقَتانِ اِثنتان} few {{counter} تَبويقات} many {{counter} تَبويقتًا} other {{counter} تَبويقة}}",
   "account.unblock": "إلغاء الحَظر عن @{name}",
   "account.unblock_domain": "إلغاء الحَظر عن النِّطاق {domain}",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط",
   "compose_form.publish": "تبويق",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "احفظ التعديلات",
   "compose_form.sensitive.hide": "{count, plural, one {الإشارة إلى الوَسط كمُحتوى حسّاس} two{الإشارة إلى الوسطان كمُحتويان حسّاسان} other {الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
   "compose_form.sensitive.marked": "{count, plural, one {تمَّ الإشارة إلى الوسط كمُحتوى حسّاس} two{تمَّ الإشارة إلى الوسطان كمُحتويان حسّاسان} other {تمَّ الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {لم تَتِمّ الإشارة إلى الوسط كمُحتوى حسّاس} two{لم تَتِمّ الإشارة إلى الوسطان كمُحتويان حسّاسان} other {لم تَتِمّ الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
@@ -248,7 +248,7 @@
   "keyboard_shortcuts.start": "لفتح عمود \"هيا نبدأ\"",
   "keyboard_shortcuts.toggle_hidden": "لعرض أو إخفاء النص مِن وراء التحذير",
   "keyboard_shortcuts.toggle_sensitivity": "لعرض/إخفاء الوسائط",
-  "keyboard_shortcuts.toot": "لتحرير تبويق جديد",
+  "keyboard_shortcuts.toot": "للشروع في تحرير منشور جديد",
   "keyboard_shortcuts.unfocus": "لإلغاء التركيز على حقل النص أو نافذة البحث",
   "keyboard_shortcuts.up": "للانتقال إلى أعلى القائمة",
   "lightbox.close": "إغلاق",
@@ -281,7 +281,7 @@
   "navigation_bar.blocks": "الحسابات المحجوبة",
   "navigation_bar.bookmarks": "الفواصل المرجعية",
   "navigation_bar.community_timeline": "الخيط العام المحلي",
-  "navigation_bar.compose": "تحرير تبويق جديد",
+  "navigation_bar.compose": "لتحرير منشور جديد",
   "navigation_bar.direct": "الرسائل المباشِرة",
   "navigation_bar.discover": "اكتشف",
   "navigation_bar.domain_blocks": "النطاقات المخفية",
@@ -306,8 +306,9 @@
   "notification.mention": "{name} ذكرك",
   "notification.own_poll": "انتهى استطلاعك للرأي",
   "notification.poll": "لقد إنتها تصويت شاركت فيه",
-  "notification.reblog": "{name} قام بترقية تبويقك",
+  "notification.reblog": "قام {name} بمشاركة منشورك",
   "notification.status": "{name} نشر للتو",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "امسح الإخطارات",
   "notifications.clear_confirmation": "أمتأكد من أنك تود مسح جل الإخطارات الخاصة بك و المتلقاة إلى حد الآن ؟",
   "notifications.column_settings.alert": "إشعارات سطح المكتب",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "منشورات جديدة:",
   "notifications.column_settings.unread_notifications.category": "إشعارات غير مقروءة",
   "notifications.column_settings.unread_notifications.highlight": "علّم الإشعارات غير المقرؤة",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "الكل",
   "notifications.filter.boosts": "الترقيات",
   "notifications.filter.favourites": "المفضلة",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "جارٍ التحميل…",
   "regeneration_indicator.sublabel": "جارٍ تجهيز تغذية صفحتك الرئيسية!",
   "relative_time.days": "{number}ي",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "منذ {number, plural, zero {} one {# يوم} two {# يومين} few {# أيام} many {# أيام} other {# يوم}}",
+  "relative_time.full.hours": "منذ {number, plural, zero {} one {# ساعة واحدة} two {# ساعتين} few {# ساعات} many {# ساعات} other {# ساعة}}",
+  "relative_time.full.just_now": "الآن",
+  "relative_time.full.minutes": "منذ {number, plural, zero {} one {# دقيقة واحدة} two {# دقيقتين} few {# دقائق} many {# دقيقة} other {# دقائق}}",
+  "relative_time.full.seconds": "منذ {number, plural, zero {} one {# ثانية واحدة} two {# ثانيتين} few {# ثوانٍ} many {# ثوانٍ} other {# ثانية}}",
   "relative_time.hours": "{number}سا",
   "relative_time.just_now": "الآن",
   "relative_time.minutes": "{number}د",
   "relative_time.seconds": "{number}ثا",
   "relative_time.today": "اليوم",
   "reply_indicator.cancel": "إلغاء",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "أخرى",
+  "report.categories.spam": "مزعج",
+  "report.categories.violation": "المحتوى ينتهك شرطا أو عدة شروط استخدام للخادم",
   "report.forward": "التحويل إلى {target}",
   "report.forward_hint": "هذا الحساب ينتمي إلى خادوم آخَر. هل تودّ إرسال نسخة مجهولة مِن التقرير إلى هنالك أيضًا؟",
   "report.hint": "سوف يتم إرسال التقرير إلى المُشرِفين على خادومكم. بإمكانكم الإدلاء بشرح عن سبب الإبلاغ عن الحساب أسفله:",
@@ -407,9 +409,9 @@
   "status.delete": "احذف",
   "status.detailed_status": "تفاصيل المحادثة",
   "status.direct": "رسالة خاصة إلى @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "تعديل",
+  "status.edited": "عُدّل في {date}",
+  "status.edited_x_times": "عُدّل {count, plural, zero {} one {{count} مرة} two {{count} مرتين} few {{count} مرات} many {{count} مرات} other {{count} مرة}}",
   "status.embed": "إدماج",
   "status.favourite": "أضف إلى المفضلة",
   "status.filtered": "مُصفّى",
@@ -423,12 +425,12 @@
   "status.mute_conversation": "كتم المحادثة",
   "status.open": "وسع هذه المشاركة",
   "status.pin": "دبّسه على الصفحة التعريفية",
-  "status.pinned": "تبويق مثبَّت",
+  "status.pinned": "منشور مثبَّت",
   "status.read_more": "اقرأ المزيد",
   "status.reblog": "رَقِّي",
   "status.reblog_private": "القيام بالترقية إلى الجمهور الأصلي",
   "status.reblogged_by": "رقّاه {name}",
-  "status.reblogs.empty": "لم يقم أي أحد بترقية هذا التبويق بعد. عندما يقوم أحدهم بذلك سوف تظهر هنا.",
+  "status.reblogs.empty": "لم يقم أي أحد بمشاركة هذا المنشور بعد. عندما يقوم أحدهم بذلك سوف يظهر هنا.",
   "status.redraft": "إزالة و إعادة الصياغة",
   "status.remove_bookmark": "احذفه مِن الفواصل المرجعية",
   "status.reply": "ردّ",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index d4c4f84b0..526c0f0f0 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -308,6 +308,7 @@
   "notification.poll": "Finó una encuesta na que votesti",
   "notification.reblog": "{name} compartió'l to estáu",
   "notification.status": "{name} just posted",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Llimpiar avisos",
   "notifications.clear_confirmation": "¿De xuru que quies llimpiar dafechu tolos avisos?",
   "notifications.column_settings.alert": "Avisos d'escritoriu",
@@ -326,6 +327,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.filter.all": "Too",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 02e37c4c7..14cbddaf3 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -308,6 +308,7 @@
   "notification.poll": "Анкета, в която сте гласували, приключи",
   "notification.reblog": "{name} сподели твоята публикация",
   "notification.status": "{name} току-що публикува",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Изчистване на известия",
   "notifications.clear_confirmation": "Сигурни ли сте, че искате да изчистите окончателно всичките си известия?",
   "notifications.column_settings.alert": "Десктоп известия",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Нови публикации:",
   "notifications.column_settings.unread_notifications.category": "Unread notifications",
   "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Всичко",
   "notifications.filter.boosts": "Споделяния",
   "notifications.filter.favourites": "Любими",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index ec034b002..0c0a1ca1b 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -308,6 +308,7 @@
   "notification.poll": "আপনি ভোট দিয়েছিলেন এমন এক  নির্বাচনের ভোটের সময় শেষ হয়েছে",
   "notification.reblog": "{name} আপনার কার্যক্রমে সমর্থন দেখিয়েছেন",
   "notification.status": "{name} just posted",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "প্রজ্ঞাপনগুলো মুছে ফেলতে",
   "notifications.clear_confirmation": "আপনি কি নির্চিত প্রজ্ঞাপনগুলো মুছে ফেলতে চান ?",
   "notifications.column_settings.alert": "কম্পিউটারে প্রজ্ঞাপনগুলি",
@@ -326,6 +327,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.filter.all": "সব",
   "notifications.filter.boosts": "সমর্থনগুলো",
   "notifications.filter.favourites": "পছন্দের গুলো",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index f13b7dfd7..daea18086 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -308,6 +308,7 @@
   "notification.poll": "Ur sontadeg ho deus mouezhet warnañ a zo echuet",
   "notification.reblog": "{name} skignet ho toud",
   "notification.status": "{name} en/he deus toudet",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Skarzhañ ar c'hemennoù",
   "notifications.clear_confirmation": "Ha sur oc'h e fell deoc'h skarzhañ ho kemennoù penn-da-benn?",
   "notifications.column_settings.alert": "Kemennoù war ar burev",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Toudoù nevez:",
   "notifications.column_settings.unread_notifications.category": "Kemennoù n'int ket lennet",
   "notifications.column_settings.unread_notifications.highlight": "Usskediñ kemennoù nevez",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Pep tra",
   "notifications.filter.boosts": "Skignadennoù",
   "notifications.filter.favourites": "Muiañ-karet",
@@ -367,7 +369,7 @@
   "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": "bremañ",
   "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}e",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 0ab88e2cd..15036eef9 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -47,8 +47,8 @@
   "account.unmute": "Treure silenci de @{name}",
   "account.unmute_notifications": "Activar notificacions de @{name}",
   "account_note.placeholder": "Fes clic per afegir una nota",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Ràtio de retenció per dia després del registre",
+  "admin.dashboard.monthly_retention": "Ràtio de retenció per mes després del registre",
   "admin.dashboard.retention.average": "Mitjana",
   "admin.dashboard.retention.cohort": "Registres mes",
   "admin.dashboard.retention.cohort_size": "Nous usuaris",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Canvia l’enquesta per a permetre una única opció",
   "compose_form.publish": "Publicar",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Desa els canvis",
   "compose_form.sensitive.hide": "Marcar mèdia com a sensible",
   "compose_form.sensitive.marked": "Mèdia marcat com a sensible",
   "compose_form.sensitive.unmarked": "Mèdia no està marcat com a sensible",
@@ -308,6 +308,7 @@
   "notification.poll": "Ha finalitzat una enquesta en la que has votat",
   "notification.reblog": "{name} ha impulsat el teu estat",
   "notification.status": "ha publicat {name}",
+  "notification.update": "{name} ha editat una publicació",
   "notifications.clear": "Netejar notificacions",
   "notifications.clear_confirmation": "Estàs segur que vols esborrar permanentment totes les teves notificacions?",
   "notifications.column_settings.alert": "Notificacions d'escriptori",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Nous tuts:",
   "notifications.column_settings.unread_notifications.category": "Notificacions no llegides",
   "notifications.column_settings.unread_notifications.highlight": "Destaca notificacions no llegides",
+  "notifications.column_settings.update": "Edicions:",
   "notifications.filter.all": "Tots",
   "notifications.filter.boosts": "Impulsos",
   "notifications.filter.favourites": "Favorits",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Carregant…",
   "regeneration_indicator.sublabel": "S'està preparant la línia de temps Inici!",
   "relative_time.days": "fa {number} dies",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "fa {number, plural, one {# dia} other {# dies}}",
+  "relative_time.full.hours": "fa {number, plural, one {# hora} other {# hores}}",
+  "relative_time.full.just_now": "ara mateix",
+  "relative_time.full.minutes": "fa {number, plural, one {# minut} other {# minuts}}",
+  "relative_time.full.seconds": "fa {number, plural, one {# segon} other {# segons}}",
   "relative_time.hours": "fa {number} hores",
   "relative_time.just_now": "ara",
   "relative_time.minutes": "fa {number} minuts",
   "relative_time.seconds": "fa {number} segons",
   "relative_time.today": "avui",
   "reply_indicator.cancel": "Cancel·lar",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "Altres",
+  "report.categories.spam": "Contingut brossa",
+  "report.categories.violation": "El contingut viola una o més regles del servidor",
   "report.forward": "Reenvia a {target}",
   "report.forward_hint": "Aquest compte és d'un altre servidor. Enviar-hi també una copia anònima del informe?",
   "report.hint": "El informe s'enviarà als moderadors del teu servidor. Pots explicar perquè vols informar d'aquest compte aquí:",
@@ -407,14 +409,14 @@
   "status.delete": "Esborrar",
   "status.detailed_status": "Visualització detallada de la conversa",
   "status.direct": "Missatge directe @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Edita",
+  "status.edited": "Editat {date}",
+  "status.edited_x_times": "Editat {count, plural, one {{count} vegada} other {{count} vegades}}",
   "status.embed": "Incrustar",
   "status.favourite": "Favorit",
   "status.filtered": "Filtrat",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} ha creat {date}",
+  "status.history.edited": "{name} ha editat {date}",
   "status.load_more": "Carrega més",
   "status.media_hidden": "Multimèdia amagat",
   "status.mention": "Esmentar @{name}",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index d3fade546..8956cd678 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -308,6 +308,7 @@
   "notification.poll": "Un scandagliu induve avete vutatu hè finitu",
   "notification.reblog": "{name} hà spartutu u vostru statutu",
   "notification.status": "{name} hà appena pubblicatu",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Purgà e nutificazione",
   "notifications.clear_confirmation": "Site sicuru·a che vulete toglie tutte ste nutificazione?",
   "notifications.column_settings.alert": "Nutificazione nant'à l'urdinatore",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Statuti novi:",
   "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": "Tuttu",
   "notifications.filter.boosts": "Spartere",
   "notifications.filter.favourites": "Favuriti",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 2b31d32c3..2c5bf8a85 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -308,6 +308,7 @@
   "notification.poll": "Anketa, ve které jste hlasovali, skončila",
   "notification.reblog": "Uživatel {name} boostnul váš příspěvek",
   "notification.status": "Nový příspěvek od {name}",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Smazat oznámení",
   "notifications.clear_confirmation": "Opravdu chcete trvale smazat všechna vaše oznámení?",
   "notifications.column_settings.alert": "Oznámení na počítači",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Nové příspěvky:",
   "notifications.column_settings.unread_notifications.category": "Nepřečtená oznámení",
   "notifications.column_settings.unread_notifications.highlight": "Zvýraznit nepřečtená oznámení",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Vše",
   "notifications.filter.boosts": "Boosty",
   "notifications.filter.favourites": "Oblíbení",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index a6379568c..387f33782 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -308,6 +308,7 @@
   "notification.poll": "Mae pleidlais rydych wedi pleidleisio ynddi wedi dod i ben",
   "notification.reblog": "Hysbysebodd {name} eich tŵt",
   "notification.status": "{name} just posted",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Clirio hysbysiadau",
   "notifications.clear_confirmation": "Ydych chi'n sicr eich bod am glirio'ch holl hysbysiadau am byth?",
   "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith",
@@ -326,6 +327,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.filter.all": "Pob",
   "notifications.filter.boosts": "Hybiadau",
   "notifications.filter.favourites": "Ffefrynnau",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 56c1daa13..4e1832fd3 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -47,7 +47,7 @@
   "account.unmute": "Fjern tavsgjort for @{name}",
   "account.unmute_notifications": "Slå notifikationer om @{name} til igen",
   "account_note.placeholder": "Klik for at tilføje notat",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+  "admin.dashboard.daily_retention": "Brugerfastholdelsesrate efter dag efter tilmelding",
   "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
   "admin.dashboard.retention.average": "Gennemsnitlig",
   "admin.dashboard.retention.cohort": "Tilmeldingsmåned",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Ændr afstemning til enkeltvalgstype",
   "compose_form.publish": "Udgiv",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Gem ændringer",
   "compose_form.sensitive.hide": "{count, plural, one {Markér medie som følsomt} other {Markér medier som følsomme}}",
   "compose_form.sensitive.marked": "{count, plural, one {Medie er markeret som sensitivt} other {Medier er markerede som sensitive}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Medie er ikke market som sensitivt} other {Medier er ikke markerede som sensitive}}",
@@ -308,6 +308,7 @@
   "notification.poll": "En afstemning, du deltog i, er færdig",
   "notification.reblog": "{name} fremhævede dit indlæg",
   "notification.status": "{name} har netop udgivet",
+  "notification.update": "{name} redigerede et indlæg",
   "notifications.clear": "Ryd notifikationer",
   "notifications.clear_confirmation": "Er du sikker på, du vil rydde alle dine notifikationer permanent?",
   "notifications.column_settings.alert": "Skrivebordsnotifikationer",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Nye indlæg:",
   "notifications.column_settings.unread_notifications.category": "Ulæste notifikationer",
   "notifications.column_settings.unread_notifications.highlight": "Fremhæv ulæste notifikationer",
+  "notifications.column_settings.update": "Redigeringer:",
   "notifications.filter.all": "Alle",
   "notifications.filter.boosts": "Fremhævelser",
   "notifications.filter.favourites": "Favoritter",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Indlæser…",
   "regeneration_indicator.sublabel": "Din hjemmetidslinje klargøres!",
   "relative_time.days": "{number}d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# dag} other {# dage}} diden",
+  "relative_time.full.hours": "{number, plural, one {# time} other {# timer}} siden",
+  "relative_time.full.just_now": "netop nu",
+  "relative_time.full.minutes": "{number, plural, one {# minut} other {# minutter}} siden",
+  "relative_time.full.seconds": "{number, plural, one {# sekund} other {# sekunder}} siden",
   "relative_time.hours": "{number}t",
   "relative_time.just_now": "nu",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
   "relative_time.today": "i dag",
   "reply_indicator.cancel": "Afbryd",
-  "report.categories.other": "Other",
+  "report.categories.other": "Andre",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "Indhold overtræder en eller flere serverregler",
   "report.forward": "Videresend til {target}",
   "report.forward_hint": "Kontoen er fra en anden server. Send en anonymiseret kopi af anmeldelsen dertil også?",
   "report.hint": "Anmeldelsen sendes til din serverordstyrer. Du kan oplyse nærmere om kontoanmeldelsen nedenfor:",
@@ -407,14 +409,14 @@
   "status.delete": "Slet",
   "status.detailed_status": "Detaljeret samtalevisning",
   "status.direct": "Direkte besked til @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Redigér",
+  "status.edited": "Redigeret {date}",
+  "status.edited_x_times": "Redigeret {count, plural, one {{count} gang} other {{count} gange}}",
   "status.embed": "Indlejr",
   "status.favourite": "Favorit",
   "status.filtered": "Filtreret",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} oprettet {date}",
+  "status.history.edited": "{name} redigeret {date}",
   "status.load_more": "Indlæs mere",
   "status.media_hidden": "Medie skjult",
   "status.mention": "Nævn @{name}",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 12ac0b253..89faee676 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -47,8 +47,8 @@
   "account.unmute": "@{name} nicht mehr stummschalten",
   "account.unmute_notifications": "Benachrichtigungen von @{name} einschalten",
   "account_note.placeholder": "Notiz durch Klicken hinzufügen",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Benutzerverbleibrate nach Tag nach Anmeldung",
+  "admin.dashboard.monthly_retention": "Benutzerverbleibrate nach Monat nach Anmeldung",
   "admin.dashboard.retention.average": "Durchschnitt",
   "admin.dashboard.retention.cohort": "Anmeldemonat",
   "admin.dashboard.retention.cohort_size": "Neue Benutzer",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Umfrage ändern, um eine einzige Wahl zu erlauben",
   "compose_form.publish": "Tröt",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Änderungen speichern",
   "compose_form.sensitive.hide": "Medien als NSFW markieren",
   "compose_form.sensitive.marked": "Medien sind als NSFW markiert",
   "compose_form.sensitive.unmarked": "Medien sind nicht als NSFW markiert",
@@ -308,6 +308,7 @@
   "notification.poll": "Eine Umfrage in der du abgestimmt hast ist vorbei",
   "notification.reblog": "{name} hat deinen Beitrag geteilt",
   "notification.status": "{name} hat gerade etwas gepostet",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Mitteilungen löschen",
   "notifications.clear_confirmation": "Bist du dir sicher, dass du alle Mitteilungen löschen möchtest?",
   "notifications.column_settings.alert": "Desktop-Benachrichtigungen",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Neue Beiträge:",
   "notifications.column_settings.unread_notifications.category": "Ungelesene Benachrichtigungen",
   "notifications.column_settings.unread_notifications.highlight": "Ungelesene Benachrichtigungen hervorheben",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Alle",
   "notifications.filter.boosts": "Geteilte Beiträge",
   "notifications.filter.favourites": "Favorisierungen",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Laden…",
   "regeneration_indicator.sublabel": "Deine Startseite wird gerade vorbereitet!",
   "relative_time.days": "{number}d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "vor {number, plural, one {# Tag} other {# Tagen}}",
+  "relative_time.full.hours": "vor {number, plural, one {# Stunde} other {# Stunden}}",
+  "relative_time.full.just_now": "gerade eben",
+  "relative_time.full.minutes": "vor {number, plural, one {# Minute} other {# Minuten}}",
+  "relative_time.full.seconds": "vor {number, plural, one {1 Sekunde} other {# Sekunden}}",
   "relative_time.hours": "{number}h",
   "relative_time.just_now": "jetzt",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
   "relative_time.today": "heute",
   "reply_indicator.cancel": "Abbrechen",
-  "report.categories.other": "Other",
+  "report.categories.other": "Andere",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "Inhalt verletzt ein oder mehrere Server-Regeln",
   "report.forward": "An {target} weiterleiten",
   "report.forward_hint": "Dieses Konto ist von einem anderen Server. Soll eine anonymisierte Kopie des Berichts auch dorthin geschickt werden?",
   "report.hint": "Der Bericht wird an die Moderatoren des Servers geschickt. Du kannst hier eine Erklärung angeben, warum du dieses Konto meldest:",
@@ -407,14 +409,14 @@
   "status.delete": "Löschen",
   "status.detailed_status": "Detaillierte Ansicht der Konversation",
   "status.direct": "Direktnachricht @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Bearbeiten",
+  "status.edited": "Bearbeitet {date}",
+  "status.edited_x_times": "{count, plural, one {{count} mal} other {{count} mal}} bearbeitet",
   "status.embed": "Einbetten",
   "status.favourite": "Favorisieren",
   "status.filtered": "Gefiltert",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} erstellte {date}",
+  "status.history.edited": "{name} bearbeitete {date}",
   "status.load_more": "Weitere laden",
   "status.media_hidden": "Medien versteckt",
   "status.mention": "@{name} erwähnen",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 1f6477e44..5be55db82 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -2408,6 +2408,10 @@
       {
         "defaultMessage": "New toots:",
         "id": "notifications.column_settings.status"
+      },
+      {
+        "defaultMessage": "Edits:",
+        "id": "notifications.column_settings.update"
       }
     ],
     "path": "app/javascript/mastodon/features/notifications/components/column_settings.json"
@@ -2494,6 +2498,10 @@
         "id": "notification.status"
       },
       {
+        "defaultMessage": "{name} edited a post",
+        "id": "notification.update"
+      },
+      {
         "defaultMessage": "{name} has requested to follow you",
         "id": "notification.follow_request"
       }
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 78d071f66..450b3aff8 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Ενημέρωση δημοσκόπησης με μοναδική επιλογή",
   "compose_form.publish": "Τουτ",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Αποθήκευση αλλαγών",
   "compose_form.sensitive.hide": "Σημείωσε τα πολυμέσα ως ευαίσθητα",
   "compose_form.sensitive.marked": "Το πολυμέσο έχει σημειωθεί ως ευαίσθητο",
   "compose_form.sensitive.unmarked": "Το πολυμέσο δεν έχει σημειωθεί ως ευαίσθητο",
@@ -308,6 +308,7 @@
   "notification.poll": "Τελείωσε μια από τις ψηφοφορίες που συμμετείχες",
   "notification.reblog": "Ο/Η {name} προώθησε την κατάστασή σου",
   "notification.status": "Ο/Η {name} μόλις έγραψε κάτι",
+  "notification.update": "{name} επεξεργάστηκε μια δημοσίευση",
   "notifications.clear": "Καθαρισμός ειδοποιήσεων",
   "notifications.clear_confirmation": "Σίγουρα θέλεις να καθαρίσεις όλες τις ειδοποιήσεις σου;",
   "notifications.column_settings.alert": "Ειδοποιήσεις επιφάνειας εργασίας",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Νέα τουτ:",
   "notifications.column_settings.unread_notifications.category": "Μη αναγνωσμένες ειδοποιήσεις",
   "notifications.column_settings.unread_notifications.highlight": "Επισήμανση μη αναγνωσμένων ειδοποιήσεων",
+  "notifications.column_settings.update": "Επεξεργασίες:",
   "notifications.filter.all": "Όλες",
   "notifications.filter.boosts": "Προωθήσεις",
   "notifications.filter.favourites": "Αγαπημένα",
@@ -367,7 +369,7 @@
   "relative_time.days": "{number}η",
   "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
   "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
+  "relative_time.full.just_now": "μόλις τώρα",
   "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
   "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
   "relative_time.hours": "{number}ω",
@@ -376,9 +378,9 @@
   "relative_time.seconds": "{number}δ",
   "relative_time.today": "σήμερα",
   "reply_indicator.cancel": "Άκυρο",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "Άλλες",
+  "report.categories.spam": "Ανεπιθύμητα",
+  "report.categories.violation": "Το περιεχόμενο παραβιάζει έναν ή περισσότερους κανόνες διακομιστή",
   "report.forward": "Προώθηση προς {target}",
   "report.forward_hint": "Ο λογαριασμός είναι από διαφορετικό διακομιστή. Να σταλεί ανώνυμο αντίγραφο της καταγγελίας κι εκεί;",
   "report.hint": "Η καταγγελία θα σταλεί στους διαχειριστές του κόμβου σου. Μπορείς να περιγράψεις γιατί καταγγέλεις αυτόν το λογαριασμό παρακάτω:",
@@ -407,8 +409,8 @@
   "status.delete": "Διαγραφή",
   "status.detailed_status": "Προβολή λεπτομερειών συζήτησης",
   "status.direct": "Προσωπικό μήνυμα προς @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
+  "status.edit": "Επεξεργασία",
+  "status.edited": "Επεξεργάστηκε στις {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
   "status.embed": "Ενσωμάτωσε",
   "status.favourite": "Σημείωσε ως αγαπημένο",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 9b5676ee3..ad3508f8d 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -313,6 +313,7 @@
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your post",
   "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.alert": "Desktop notifications",
@@ -331,6 +332,7 @@
   "notifications.column_settings.status": "New posts:",
   "notifications.column_settings.unread_notifications.category": "Unread notifications",
   "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index c3f7e3acd..1039bb695 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -308,6 +308,7 @@
   "notification.poll": "Partoprenita balotenketo finiĝis",
   "notification.reblog": "{name} diskonigis vian mesaĝon",
   "notification.status": "{name} ĵus afiŝita",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Forviŝi sciigojn",
   "notifications.clear_confirmation": "Ĉu vi certas, ke vi volas porĉiame forviŝi ĉiujn viajn sciigojn?",
   "notifications.column_settings.alert": "Retumilaj sciigoj",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Novaj mesaĝoj:",
   "notifications.column_settings.unread_notifications.category": "Nelegitaj sciigoj",
   "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Ĉiuj",
   "notifications.filter.boosts": "Diskonigoj",
   "notifications.filter.favourites": "Stelumoj",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index d57be2717..24902a058 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -47,8 +47,8 @@
   "account.unmute": "Dejar de silenciar a @{name}",
   "account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
   "account_note.placeholder": "Hacé clic par agregar una nota",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Tasa de retención de usuarios por día, después del registro",
+  "admin.dashboard.monthly_retention": "Tasa de retención de usuarios por mes, después del registro",
   "admin.dashboard.retention.average": "Promedio",
   "admin.dashboard.retention.cohort": "Mes de registro",
   "admin.dashboard.retention.cohort_size": "Nuevos usuarios",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Cambiar encuesta para permitir una sola opción",
   "compose_form.publish": "Enviar",
   "compose_form.publish_loud": "¡{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Guardar cambios",
   "compose_form.sensitive.hide": "Marcar medio como sensible",
   "compose_form.sensitive.marked": "{count, plural, one {El medio está marcado como sensible} other {Los medios están marcados como sensibles}}",
   "compose_form.sensitive.unmarked": "El medio no está marcado como sensible",
@@ -308,6 +308,7 @@
   "notification.poll": "Finalizó una encuesta en la que votaste",
   "notification.reblog": "{name} adhirió a tu mensaje",
   "notification.status": "{name} acaba de enviar un mensaje",
+  "notification.update": "{name} editó un mensaje",
   "notifications.clear": "Limpiar notificaciones",
   "notifications.clear_confirmation": "¿Estás seguro que querés limpiar todas tus notificaciones permanentemente?",
   "notifications.column_settings.alert": "Notificaciones de escritorio",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Nuevos mensajes:",
   "notifications.column_settings.unread_notifications.category": "Notificaciones sin leer",
   "notifications.column_settings.unread_notifications.highlight": "Resaltar notificaciones no leídas",
+  "notifications.column_settings.update": "Ediciones:",
   "notifications.filter.all": "Todas",
   "notifications.filter.boosts": "Adhesiones",
   "notifications.filter.favourites": "Favoritos",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Cargando…",
   "regeneration_indicator.sublabel": "¡Se está preparando tu línea temporal principal!",
   "relative_time.days": "{number}d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural,one {hace # día} other {hace # días}}",
+  "relative_time.full.hours": "{number, plural,one {hace # hora} other {hace # horas}}",
+  "relative_time.full.just_now": "recién",
+  "relative_time.full.minutes": "{number, plural,one {hace # minuto} other {hace # minutos}}",
+  "relative_time.full.seconds": "{number, plural,one {hace # segundo} other {hace # segundos}}",
   "relative_time.hours": "{number}h",
   "relative_time.just_now": "ahora",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
   "relative_time.today": "hoy",
   "reply_indicator.cancel": "Cancelar",
-  "report.categories.other": "Other",
+  "report.categories.other": "Otra",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "El contenido viola una o más reglas del servidor",
   "report.forward": "Reenviar a {target}",
   "report.forward_hint": "La cuenta es de otro servidor. ¿Querés enviar una copia anonimizada del informe también ahí?",
   "report.hint": "La denuncia se enviará a los moderadores de tu servidor. A continuación, podés proporcionar una explicación de por qué estás denunciando esta cuenta:",
@@ -407,14 +409,14 @@
   "status.delete": "Eliminar",
   "status.detailed_status": "Vista de conversación detallada",
   "status.direct": "Mensaje directo para @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Editar",
+  "status.edited": "Editado {date}",
+  "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
   "status.embed": "Insertar",
   "status.favourite": "Marcar como favorito",
   "status.filtered": "Filtrado",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "Creado por {name} el {date}",
+  "status.history.edited": "Editado por {name} el {date}",
   "status.load_more": "Cargar más",
   "status.media_hidden": "Medios ocultos",
   "status.mention": "Mencionar a @{name}",
diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json
index ba56241ff..ad967f4e9 100644
--- a/app/javascript/mastodon/locales/es-MX.json
+++ b/app/javascript/mastodon/locales/es-MX.json
@@ -47,8 +47,8 @@
   "account.unmute": "Dejar de silenciar a @{name}",
   "account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
   "account_note.placeholder": "Clic para añadir nota",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Tasa de retención de usuarios por día después del registro",
+  "admin.dashboard.monthly_retention": "Tasa de retención de usuarios por mes después del registro",
   "admin.dashboard.retention.average": "Promedio",
   "admin.dashboard.retention.cohort": "Mes de registro",
   "admin.dashboard.retention.cohort_size": "Nuevos usuarios",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción",
   "compose_form.publish": "Tootear",
   "compose_form.publish_loud": "¡{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Guardar cambios",
   "compose_form.sensitive.hide": "Marcar multimedia como sensible",
   "compose_form.sensitive.marked": "Material marcado como sensible",
   "compose_form.sensitive.unmarked": "Material no marcado como sensible",
@@ -308,6 +308,7 @@
   "notification.poll": "Una encuesta en la que has votado ha terminado",
   "notification.reblog": "{name} ha retooteado tu estado",
   "notification.status": "{name} acaba de publicar",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Limpiar notificaciones",
   "notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?",
   "notifications.column_settings.alert": "Notificaciones de escritorio",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Nuevos toots:",
   "notifications.column_settings.unread_notifications.category": "Notificaciones sin leer",
   "notifications.column_settings.unread_notifications.highlight": "Destacar notificaciones no leídas",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Todos",
   "notifications.filter.boosts": "Retoots",
   "notifications.filter.favourites": "Favoritos",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Cargando…",
   "regeneration_indicator.sublabel": "¡Tu historia de inicio se está preparando!",
   "relative_time.days": "{number} d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "hace {number, plural, one {# día} other {# días}}",
+  "relative_time.full.hours": "hace {number, plural, one {# hora} other {# horas}}",
+  "relative_time.full.just_now": "justo ahora",
+  "relative_time.full.minutes": "hace {number, plural, one {# minuto} other {# minutos}}",
+  "relative_time.full.seconds": "hace {number, plural, one {# segundo} other {# segundos}}",
   "relative_time.hours": "{number} h",
   "relative_time.just_now": "ahora",
   "relative_time.minutes": "{number} m",
   "relative_time.seconds": "{number} s",
   "relative_time.today": "hoy",
   "reply_indicator.cancel": "Cancelar",
-  "report.categories.other": "Other",
+  "report.categories.other": "Otros",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "El contenido viola una o más reglas del servidor",
   "report.forward": "Reenviar a {target}",
   "report.forward_hint": "Esta cuenta es de otro servidor. ¿Enviar una copia anonimizada del informe allí también?",
   "report.hint": "El informe se enviará a los moderadores de tu instancia. Puedes proporcionar una explicación de por qué informas sobre esta cuenta a continuación:",
@@ -407,14 +409,14 @@
   "status.delete": "Borrar",
   "status.detailed_status": "Vista de conversación detallada",
   "status.direct": "Mensaje directo a @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Editar",
+  "status.edited": "Editado {date}",
+  "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
   "status.embed": "Incrustado",
   "status.favourite": "Favorito",
   "status.filtered": "Filtrado",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} creó {date}",
+  "status.history.edited": "{name} editó {date}",
   "status.load_more": "Cargar más",
   "status.media_hidden": "Contenido multimedia oculto",
   "status.mention": "Mencionar",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 0b91f0809..3ac5a9c05 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -47,8 +47,8 @@
   "account.unmute": "Dejar de silenciar a @{name}",
   "account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
   "account_note.placeholder": "Clic para añadir nota",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Tasa de retención de usuarios por día después del registro",
+  "admin.dashboard.monthly_retention": "Tasa de retención de usuarios por mes después del registro",
   "admin.dashboard.retention.average": "Media",
   "admin.dashboard.retention.cohort": "Mes de registro",
   "admin.dashboard.retention.cohort_size": "Nuevos usuarios",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción",
   "compose_form.publish": "Tootear",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Guardar cambios",
   "compose_form.sensitive.hide": "{count, plural, one {Marcar material como sensible} other {Marcar material como sensible}}",
   "compose_form.sensitive.marked": "{count, plural, one {Material marcado como sensible} other {Material marcado como sensible}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Material no marcado como sensible} other {Material no marcado como sensible}}",
@@ -308,6 +308,7 @@
   "notification.poll": "Una encuesta en la que has votado ha terminado",
   "notification.reblog": "{name} ha retooteado tu publicación",
   "notification.status": "{name} acaba de publicar",
+  "notification.update": "{name} editó una publicación",
   "notifications.clear": "Limpiar notificaciones",
   "notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?",
   "notifications.column_settings.alert": "Notificaciones de escritorio",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Nuevas publicaciones:",
   "notifications.column_settings.unread_notifications.category": "Notificaciones sin leer",
   "notifications.column_settings.unread_notifications.highlight": "Destacar notificaciones no leídas",
+  "notifications.column_settings.update": "Ediciones:",
   "notifications.filter.all": "Todos",
   "notifications.filter.boosts": "Retoots",
   "notifications.filter.favourites": "Favoritos",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Cargando…",
   "regeneration_indicator.sublabel": "¡Tu historia de inicio se está preparando!",
   "relative_time.days": "{number} d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "hace {number, plural, one {# día} other {# días}}",
+  "relative_time.full.hours": "hace {number, plural, one {# hora} other {# horas}}",
+  "relative_time.full.just_now": "justo ahora",
+  "relative_time.full.minutes": "hace {number, plural, one {# minuto} other {# minutos}}",
+  "relative_time.full.seconds": "hace {number, plural, one {# segundo} other {# segundos}}",
   "relative_time.hours": "{number} h",
   "relative_time.just_now": "ahora",
   "relative_time.minutes": "{number} m",
   "relative_time.seconds": "{number} s",
   "relative_time.today": "hoy",
   "reply_indicator.cancel": "Cancelar",
-  "report.categories.other": "Other",
+  "report.categories.other": "Otros",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "El contenido viola una o más reglas del servidor",
   "report.forward": "Reenviar a {target}",
   "report.forward_hint": "Esta cuenta es de otro servidor. ¿Enviar una copia anonimizada del informe allí también?",
   "report.hint": "El informe se enviará a los moderadores de tu instancia. Puedes proporcionar una explicación de por qué informas sobre esta cuenta a continuación:",
@@ -407,14 +409,14 @@
   "status.delete": "Borrar",
   "status.detailed_status": "Vista de conversación detallada",
   "status.direct": "Mensaje directo a @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Editar",
+  "status.edited": "Editado {date}",
+  "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
   "status.embed": "Incrustado",
   "status.favourite": "Favorito",
   "status.filtered": "Filtrado",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} creó {date}",
+  "status.history.edited": "{name} editó {date}",
   "status.load_more": "Cargar más",
   "status.media_hidden": "Contenido multimedia oculto",
   "status.mention": "Mencionar",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index c1c71a91a..8f180c411 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -308,6 +308,7 @@
   "notification.poll": "Küsitlus, milles osalesite, on lõppenud",
   "notification.reblog": "{name} upitas Teie staatust",
   "notification.status": "{name} just posted",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Puhasta teated",
   "notifications.clear_confirmation": "Olete kindel, et soovite püsivalt kõik oma teated eemaldada?",
   "notifications.column_settings.alert": "Töölauateated",
@@ -326,6 +327,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.filter.all": "Kõik",
   "notifications.filter.boosts": "Upitused",
   "notifications.filter.favourites": "Lemmikud",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 4581dfe95..da3d66a9a 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -47,8 +47,8 @@
   "account.unmute": "Desmututu @{name}",
   "account.unmute_notifications": "Desmututu @{name}(r)en jakinarazpenak",
   "account_note.placeholder": "Click to add a note",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Erabiltzaile atxikitze-tasa izena eman ondorengo eguneko",
+  "admin.dashboard.monthly_retention": "Erabiltzaile atxikitze-tasa izena eman ondorengo hilabeteko",
   "admin.dashboard.retention.average": "Batezbestekoa",
   "admin.dashboard.retention.cohort": "Izen emate hilean",
   "admin.dashboard.retention.cohort_size": "Erabiltzaile berriak",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Aldatu inkesta aukera bakarra onartzeko",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Gorde aldaketak",
   "compose_form.sensitive.hide": "Markatu multimedia hunkigarri gisa",
   "compose_form.sensitive.marked": "Multimedia edukia hunkigarri gisa markatu da",
   "compose_form.sensitive.unmarked": "Multimedia edukia ez da hunkigarri gisa markatu",
@@ -308,6 +308,7 @@
   "notification.poll": "Zuk erantzun duzun inkesta bat bukatu da",
   "notification.reblog": "{name}(e)k bultzada eman dio zure bidalketari",
   "notification.status": "{name} erabiltzaileak bidalketa egin berri du",
+  "notification.update": "{name} erabiltzaileak bidalketa bat editatu du",
   "notifications.clear": "Garbitu jakinarazpenak",
   "notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?",
   "notifications.column_settings.alert": "Mahaigaineko jakinarazpenak",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Bidalketa berriak:",
   "notifications.column_settings.unread_notifications.category": "Irakurri gabeko jakinarazpenak",
   "notifications.column_settings.unread_notifications.highlight": "Nabarmendu irakurri gabeko jakinarazpenak",
+  "notifications.column_settings.update": "Edizioak:",
   "notifications.filter.all": "Denak",
   "notifications.filter.boosts": "Bultzadak",
   "notifications.filter.favourites": "Gogokoak",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Kargatzen…",
   "regeneration_indicator.sublabel": "Zure hasiera-jarioa prestatzen ari da!",
   "relative_time.days": "{number}e",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "Duela {number, plural, one {egun #} other {# egun}}",
+  "relative_time.full.hours": "Duela {number, plural, one {ordu #} other {# ordu}}",
+  "relative_time.full.just_now": "oraintxe",
+  "relative_time.full.minutes": "Duela {number, plural, one {minutu #} other {# minutu}}",
+  "relative_time.full.seconds": "Duela {number, plural, one {segundo #} other {# segundo}}",
   "relative_time.hours": "{number}h",
   "relative_time.just_now": "orain",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
   "relative_time.today": "gaur",
   "reply_indicator.cancel": "Utzi",
-  "report.categories.other": "Other",
+  "report.categories.other": "Bestelakoak",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "Edukiak zerbitzariko arau bat edo gehiago urratzen ditu",
   "report.forward": "Birbidali hona: {target}",
   "report.forward_hint": "Kontu hau beste zerbitzari batekoa da. Bidali txostenaren kopia anonimo hara ere?",
   "report.hint": "Txostena zure zerbitzariaren moderatzaileei bidaliko zaie. Kontu hau zergatik salatzen duzun behean azaldu dezakezu:",
@@ -407,14 +409,14 @@
   "status.delete": "Ezabatu",
   "status.detailed_status": "Elkarrizketaren ikuspegi xehetsua",
   "status.direct": "Mezu zuzena @{name}(r)i",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Editatu",
+  "status.edited": "Editatua {date}",
+  "status.edited_x_times": "{count, plural, one {behin} other {{count} aldiz}} editatua",
   "status.embed": "Txertatu",
   "status.favourite": "Gogokoa",
   "status.filtered": "Iragazita",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} erabiltzaileak sortua {date}",
+  "status.history.edited": "{name} erabiltzaileak editatua {date}",
   "status.load_more": "Kargatu gehiago",
   "status.media_hidden": "Multimedia ezkutatua",
   "status.mention": "Aipatu @{name}",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index f36850dc2..76dd3fdc0 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -308,6 +308,7 @@
   "notification.poll": "نظرسنجی‌ای که در آن رأی دادید به پایان رسیده است",
   "notification.reblog": "‫{name}‬ فرسته‌تان را تقویت کرد",
   "notification.status": "{name} چیزی فرستاد",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "پاک‌سازی آگاهی‌ها",
   "notifications.clear_confirmation": "مطمئنید می‌خواهید همهٔ آگاهی‌هایتان را برای همیشه پاک کنید؟",
   "notifications.column_settings.alert": "آگاهی‌های میزکار",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "فرسته‌های جدید:",
   "notifications.column_settings.unread_notifications.category": "آگاهی‌های خوانده نشده",
   "notifications.column_settings.unread_notifications.highlight": "پررنگ کردن آگاهی‌های خوانده نشده",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "همه",
   "notifications.filter.boosts": "تقویت‌ها",
   "notifications.filter.favourites": "پسندها",
@@ -412,7 +414,7 @@
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
   "status.embed": "جاگذاری",
   "status.favourite": "پسندیدن",
-  "status.filtered": "پالایش‌شده",
+  "status.filtered": "پالوده",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "{name} edited {date}",
   "status.load_more": "بار کردن بیش‌تر",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 58e65bed1..032344abe 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -47,8 +47,8 @@
   "account.unmute": "Poista käyttäjän @{name} mykistys",
   "account.unmute_notifications": "Poista mykistys käyttäjän @{name} ilmoituksilta",
   "account_note.placeholder": "Lisää muistiinpano napsauttamalla",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Käyttäjän säilyminen rekisteröitymisen jälkeiseen päivään mennessä",
+  "admin.dashboard.monthly_retention": "Käyttäjän säilyminen rekisteröitymisen jälkeiseen kuukauteen mennessä",
   "admin.dashboard.retention.average": "Keskimäärin",
   "admin.dashboard.retention.cohort": "Kirjautumiset",
   "admin.dashboard.retention.cohort_size": "Uudet käyttäjät",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Muuta kysely sallimaan vain yksi valinta",
   "compose_form.publish": "Lähetä viesti",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Tallenna muutokset",
   "compose_form.sensitive.hide": "{count, plural, one {Merkitse media arkaluontoiseksi} other {Merkitse media arkaluontoiseksi}}",
   "compose_form.sensitive.marked": "{count, plural, one {Media on merkitty arkaluontoiseksi} other {Media on merkitty arkaluontoiseksi}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Mediaa ei ole merkitty arkaluontoiseksi} other {Mediaa ei ole merkitty arkaluontoiseksi}}",
@@ -308,6 +308,7 @@
   "notification.poll": "Kysely, johon osallistuit, on päättynyt",
   "notification.reblog": "{name} buustasi julkaisusi",
   "notification.status": "{name} julkaisi juuri",
+  "notification.update": "{name} muokkasi viestiä",
   "notifications.clear": "Tyhjennä ilmoitukset",
   "notifications.clear_confirmation": "Haluatko varmasti poistaa kaikki ilmoitukset pysyvästi?",
   "notifications.column_settings.alert": "Työpöytäilmoitukset",
@@ -326,6 +327,7 @@
   "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:",
   "notifications.filter.all": "Kaikki",
   "notifications.filter.boosts": "Buustit",
   "notifications.filter.favourites": "Suosikit",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Ladataan…",
   "regeneration_indicator.sublabel": "Kotinäkymääsi valmistellaan!",
   "relative_time.days": "{number} pv",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# päivä} other {# päivää}} sitten",
+  "relative_time.full.hours": "{number, plural, one {# tunti} other {# tuntia}} sitten",
+  "relative_time.full.just_now": "juuri nyt",
+  "relative_time.full.minutes": "{number, plural, one {# minuutti} other {# minuuttia}} sitten",
+  "relative_time.full.seconds": "{number, plural, one {# sekunti} other {# sekuntia}} sitten",
   "relative_time.hours": "{number} tuntia",
   "relative_time.just_now": "nyt",
   "relative_time.minutes": "{number} min",
   "relative_time.seconds": "{number} sek",
   "relative_time.today": "tänään",
   "reply_indicator.cancel": "Peruuta",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "Muu",
+  "report.categories.spam": "Roskaposti",
+  "report.categories.violation": "Sisältö rikkoo yhden tai useamman palvelimen sääntöjä",
   "report.forward": "Välitä kohteeseen {target}",
   "report.forward_hint": "Tämä tili on toisella palvelimella. Haluatko lähettää nimettömän raportin myös sinne?",
   "report.hint": "Raportti lähetetään oman palvelimesi moderaattoreille. Voit kertoa alla, miksi raportoit tästä tilistä:",
@@ -407,14 +409,14 @@
   "status.delete": "Poista",
   "status.detailed_status": "Yksityiskohtainen keskustelunäkymä",
   "status.direct": "Pikaviesti käyttäjälle @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Muokkaa",
+  "status.edited": "Muokattu {date}",
+  "status.edited_x_times": "Muokattu {count, plural, one {{count} aika} other {{count} kertaa}}",
   "status.embed": "Upota",
   "status.favourite": "Tykkää",
   "status.filtered": "Suodatettu",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} luotu {date}",
+  "status.history.edited": "{name} muokkasi {date}",
   "status.load_more": "Lataa lisää",
   "status.media_hidden": "Media piilotettu",
   "status.mention": "Mainitse @{name}",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 8c2b8f3e6..c12eb7e6c 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -13,7 +13,7 @@
   "account.domain_blocked": "Domaine bloqué",
   "account.edit_profile": "Modifier le profil",
   "account.enable_notifications": "Me notifier quand @{name} publie",
-  "account.endorse": "Recommander sur le profil",
+  "account.endorse": "Recommander sur votre profil",
   "account.follow": "Suivre",
   "account.followers": "Abonnés",
   "account.followers.empty": "Personne ne suit cet·te utilisateur·rice pour l’instant.",
@@ -34,7 +34,7 @@
   "account.muted": "Masqué·e",
   "account.never_active": "Jamais",
   "account.posts": "Messages",
-  "account.posts_with_replies": "Partages et réponses",
+  "account.posts_with_replies": "Messages et réponses",
   "account.report": "Signaler @{name}",
   "account.requested": "En attente d’approbation. Cliquez pour annuler la requête",
   "account.share": "Partager le profil de @{name}",
@@ -47,8 +47,8 @@
   "account.unmute": "Ne plus masquer @{name}",
   "account.unmute_notifications": "Ne plus masquer les notifications de @{name}",
   "account_note.placeholder": "Cliquez pour ajouter une note",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Taux de maintien des utilisateur·rice·s par jour après inscription",
+  "admin.dashboard.monthly_retention": "Brugerfastholdelsesrate efter måned efter tilmelding",
   "admin.dashboard.retention.average": "Moyenne",
   "admin.dashboard.retention.cohort": "Mois d'inscription",
   "admin.dashboard.retention.cohort_size": "Nouveaux utilisateurs",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Changer le sondage pour autoriser qu'un seul choix",
   "compose_form.publish": "Pouet",
   "compose_form.publish_loud": "{publish} !",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Enregistrer les modifications",
   "compose_form.sensitive.hide": "Marquer le média comme sensible",
   "compose_form.sensitive.marked": "{count, plural, one {Le média est marqué comme sensible} other {Les médias sont marqués comme sensibles}}",
   "compose_form.sensitive.unmarked": "Le média n’est pas marqué comme sensible",
@@ -134,7 +134,7 @@
   "confirmations.reply.confirm": "Répondre",
   "confirmations.reply.message": "Répondre maintenant écrasera le message que vous rédigez actuellement. Voulez-vous vraiment continuer ?",
   "confirmations.unfollow.confirm": "Ne plus suivre",
-  "confirmations.unfollow.message": "Voulez-vous vraiment arrêter de suivre {name} ?",
+  "confirmations.unfollow.message": "Voulez-vous vraiment vous désabonner de {name} ?",
   "conversation.delete": "Supprimer la conversation",
   "conversation.mark_as_read": "Marquer comme lu",
   "conversation.open": "Afficher la conversation",
@@ -288,7 +288,7 @@
   "navigation_bar.edit_profile": "Modifier le profil",
   "navigation_bar.favourites": "Favoris",
   "navigation_bar.filters": "Mots masqués",
-  "navigation_bar.follow_requests": "Demandes de suivi",
+  "navigation_bar.follow_requests": "Demandes d’abonnement",
   "navigation_bar.follows_and_followers": "Abonnements et abonné⋅e·s",
   "navigation_bar.info": "À propos de ce serveur",
   "navigation_bar.keyboard_shortcuts": "Raccourcis clavier",
@@ -308,6 +308,7 @@
   "notification.poll": "Un sondage auquel vous avez participé vient de se terminer",
   "notification.reblog": "{name} a partagé votre message",
   "notification.status": "{name} vient de publier",
+  "notification.update": "{name} a modifié un message",
   "notifications.clear": "Effacer les notifications",
   "notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications ?",
   "notifications.column_settings.alert": "Notifications du navigateur",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Nouveaux messages :",
   "notifications.column_settings.unread_notifications.category": "Notifications non lues",
   "notifications.column_settings.unread_notifications.highlight": "Surligner les notifications non lues",
+  "notifications.column_settings.update": "Modifications :",
   "notifications.filter.all": "Tout",
   "notifications.filter.boosts": "Partages",
   "notifications.filter.favourites": "Favoris",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Chargement…",
   "regeneration_indicator.sublabel": "Votre fil principal est en cours de préparation !",
   "relative_time.days": "{number} j",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "il y a {number, plural, one {# jour} other {# jours}}",
+  "relative_time.full.hours": "il y a {number, plural, one {# heure} other {# heures}}",
+  "relative_time.full.just_now": "à l’instant",
+  "relative_time.full.minutes": "il y a {number, plural, one {# minute} other {# minutes}}",
+  "relative_time.full.seconds": "il y a {number, plural, one {# second} other {# seconds}}",
   "relative_time.hours": "{number} h",
   "relative_time.just_now": "à l’instant",
   "relative_time.minutes": "{number} min",
   "relative_time.seconds": "{number} s",
   "relative_time.today": "aujourd’hui",
   "reply_indicator.cancel": "Annuler",
-  "report.categories.other": "Other",
+  "report.categories.other": "Autre",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "Le contenu enfreint une ou plusieurs règles du serveur",
   "report.forward": "Transférer à {target}",
   "report.forward_hint": "Le compte provient d’un autre serveur. Envoyer également une copie anonyme du rapport ?",
   "report.hint": "Le rapport sera envoyé aux modérateur·rice·s de votre serveur. Vous pouvez expliquer pourquoi vous signalez le compte ci-dessous :",
@@ -389,7 +391,7 @@
   "search_popout.search_format": "Recherche avancée",
   "search_popout.tips.full_text": "Un texte normal retourne les messages que vous avez écrits, ajoutés à vos favoris, partagés, ou vous mentionnant, ainsi que les identifiants, les noms affichés, et les hashtags des personnes et messages correspondants.",
   "search_popout.tips.hashtag": "hashtag",
-  "search_popout.tips.status": "statuts",
+  "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_results.accounts": "Comptes",
@@ -407,14 +409,14 @@
   "status.delete": "Supprimer",
   "status.detailed_status": "Vue détaillée de la conversation",
   "status.direct": "Envoyer un message direct à @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Éditer",
+  "status.edited": "Édité le {date}",
+  "status.edited_x_times": "Edité {count, plural, one {{count} fois} other {{count} fois}}",
   "status.embed": "Intégrer",
   "status.favourite": "Ajouter aux favoris",
   "status.filtered": "Filtré",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "créé par {name} {date}",
+  "status.history.edited": "édité par {name} {date}",
   "status.load_more": "Charger plus",
   "status.media_hidden": "Média caché",
   "status.mention": "Mentionner @{name}",
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index c9f2cd414..60e6441c3 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -308,6 +308,7 @@
   "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.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json
index 750674ca2..a7ffbe6b2 100644
--- a/app/javascript/mastodon/locales/gd.json
+++ b/app/javascript/mastodon/locales/gd.json
@@ -308,6 +308,7 @@
   "notification.poll": "Thàinig cunntas-bheachd sa bhòt thu gu crìoch",
   "notification.reblog": "Bhrosnaich {name} am post agad",
   "notification.status": "Tha {name} air rud a phostadh",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Falamhaich na brathan",
   "notifications.clear_confirmation": "A bheil thu cinnteach gu bheil thu airson na brathan uile agad fhalamhachadh gu buan?",
   "notifications.column_settings.alert": "Brathan deasga",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Postaichean ùra:",
   "notifications.column_settings.unread_notifications.category": "Brathan nach deach a leughadh",
   "notifications.column_settings.unread_notifications.highlight": "Soillsich na brathan nach deach a leughadh",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Na h-uile",
   "notifications.filter.boosts": "Brosnachaidhean",
   "notifications.filter.favourites": "Na h-annsachdan",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index e926239bb..39f121065 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -47,8 +47,8 @@
   "account.unmute": "Deixar de silenciar a @{name}",
   "account.unmute_notifications": "Deixar de silenciar as notificacións de @{name}",
   "account_note.placeholder": "Preme para engadir nota",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Ratio de retención de usuarias após rexistrarse",
+  "admin.dashboard.monthly_retention": "Ratio de retención de usuarias após un mes do rexistro",
   "admin.dashboard.retention.average": "Media",
   "admin.dashboard.retention.cohort": "Mes de rexistro",
   "admin.dashboard.retention.cohort_size": "Novas usuarias",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Mudar a enquisa para permitir unha soa escolla",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Gardar cambios",
   "compose_form.sensitive.hide": "{count, plural, one {Marca multimedia como sensible} other {Marca multimedia como sensibles}}",
   "compose_form.sensitive.marked": "{count, plural, one {Multimedia marcado como sensible} other {Multimedia marcados como sensibles}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Multimedia non marcado como sensible} other {Multimedia non marcado como sensible}}",
@@ -308,6 +308,7 @@
   "notification.poll": "Unha enquisa na que votaches rematou",
   "notification.reblog": "{name} compartiu a túa publicación",
   "notification.status": "{name} publicou",
+  "notification.update": "{name} editou unha publicación",
   "notifications.clear": "Limpar notificacións",
   "notifications.clear_confirmation": "Tes a certeza de querer limpar de xeito permanente todas as túas notificacións?",
   "notifications.column_settings.alert": "Notificacións de escritorio",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Novas publicacións:",
   "notifications.column_settings.unread_notifications.category": "Notificacións non lidas",
   "notifications.column_settings.unread_notifications.highlight": "Resaltar notificacións non lidas",
+  "notifications.column_settings.update": "Edicións:",
   "notifications.filter.all": "Todo",
   "notifications.filter.boosts": "Compartidos",
   "notifications.filter.favourites": "Favoritos",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Estase a cargar…",
   "regeneration_indicator.sublabel": "Estase a preparar a túa cronoloxía de inicio!",
   "relative_time.days": "{number}d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "fai {number, plural, one {# día} other {# días}}",
+  "relative_time.full.hours": "fai {number, plural, one {# hora} other {# horas}} ago",
+  "relative_time.full.just_now": "xusto agora",
+  "relative_time.full.minutes": "fai {number, plural, one {# minuto} other {# minutos}}",
+  "relative_time.full.seconds": "fai {number, plural, one {# segundo} other {# segundos}}",
   "relative_time.hours": "{number}h",
   "relative_time.just_now": "agora",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
   "relative_time.today": "hoxe",
   "reply_indicator.cancel": "Desbotar",
-  "report.categories.other": "Other",
+  "report.categories.other": "Outro",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "O contido viola unha ou máis regras do servidor",
   "report.forward": "Reenviar a {target}",
   "report.forward_hint": "A conta é doutro servidor. Enviar unha copia anónima da denuncia aló tamén?",
   "report.hint": "A denuncia enviarase á moderación do teu servidor. Abaixo podes explicar a razón pola que estás a denunciar:",
@@ -407,14 +409,14 @@
   "status.delete": "Eliminar",
   "status.detailed_status": "Vista detallada da conversa",
   "status.direct": "Mensaxe directa a @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Editar",
+  "status.edited": "Editado {date}",
+  "status.edited_x_times": "Editado {count, plural, one {{count} vez} other {{count} veces}}",
   "status.embed": "Incrustar",
   "status.favourite": "Favorito",
   "status.filtered": "Filtrado",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} creado o {date}",
+  "status.history.edited": "{name} editado o {date}",
   "status.load_more": "Cargar máis",
   "status.media_hidden": "Contido multimedia agochado",
   "status.mention": "Mencionar @{name}",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index 1447ff711..c163812ac 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -308,6 +308,7 @@
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "חצרוצך הודהד על ידי {name}",
   "notification.status": "{name} just posted",
+  "notification.update": "{name} ערכו פוסט",
   "notifications.clear": "הסרת התראות",
   "notifications.clear_confirmation": "להסיר את כל ההתראות? בטוח?",
   "notifications.column_settings.alert": "התראות לשולחן העבודה",
@@ -326,6 +327,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": "שינויים:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index d3221c468..fef87bda2 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -308,6 +308,7 @@
   "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.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "सभी",
   "notifications.filter.boosts": "बूस्ट",
   "notifications.filter.favourites": "पसंदीदा",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index ecdfab67a..32deff205 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -308,6 +308,7 @@
   "notification.poll": "Anketa u kojoj ste glasali je završila",
   "notification.reblog": "{name} je boostao/la Vaš status",
   "notification.status": "{name} just posted",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Očisti obavijesti",
   "notifications.clear_confirmation": "Želite li zaista trajno očistiti sve Vaše obavijesti?",
   "notifications.column_settings.alert": "Obavijesti radne površine",
@@ -326,6 +327,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.filter.all": "Sve",
   "notifications.filter.boosts": "Boostovi",
   "notifications.filter.favourites": "Favoriti",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 4a55c85d9..97b985d95 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -17,7 +17,7 @@
   "account.follow": "Követés",
   "account.followers": "Követő",
   "account.followers.empty": "Ezt a felhasználót még senki sem követi.",
-  "account.followers_counter": "{count, plural, one {{counter} követő} other {{counter} követő}}",
+  "account.followers_counter": "{count, plural, one {{counter} Követő} other {{counter} Követő}}",
   "account.following_counter": "{count, plural, other {{counter} Követett}}",
   "account.follows.empty": "Ez a felhasználó még senkit sem követ.",
   "account.follows_you": "Követ téged",
@@ -47,8 +47,8 @@
   "account.unmute": "@{name} némítás feloldása",
   "account.unmute_notifications": "@{name} némított értesítéseinek feloldása",
   "account_note.placeholder": "Klikk a feljegyzéshez",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Napi regisztráció utáni felhasználómegtartási arány",
+  "admin.dashboard.monthly_retention": "Havi regisztráció utáni felhasználómegtartási arány",
   "admin.dashboard.retention.average": "Átlag",
   "admin.dashboard.retention.cohort": "Regisztráció hónapja",
   "admin.dashboard.retention.cohort_size": "Új felhasználó",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Szavazás megváltoztatása egyetlen választásosra",
   "compose_form.publish": "Tülk",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Módosítások mentése",
   "compose_form.sensitive.hide": "{count, plural, one {Média kényesnek jelölése} other {Média kényesnek jelölése}}",
   "compose_form.sensitive.marked": "{count, plural, one {A médiát kényesnek jelölték} other {A médiát kényesnek jelölték}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {A médiát nem jelölték kényesnek} other {A médiát nem jelölték kényesnek}}",
@@ -308,6 +308,7 @@
   "notification.poll": "Egy szavazás, melyben részt vettél, véget ért",
   "notification.reblog": "{name} megtolta a bejegyzésedet",
   "notification.status": "{name} bejegyzést tett közzé",
+  "notification.update": "{name} szerkesztett egy bejegyzést",
   "notifications.clear": "Értesítések törlése",
   "notifications.clear_confirmation": "Biztos, hogy véglegesen törölni akarod az összes értesítésed?",
   "notifications.column_settings.alert": "Asztali értesítések",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Új bejegyzések:",
   "notifications.column_settings.unread_notifications.category": "Olvasatlan értesítések",
   "notifications.column_settings.unread_notifications.highlight": "Olvasatlan értesítések kiemelése",
+  "notifications.column_settings.update": "Szerkesztések:",
   "notifications.filter.all": "Mind",
   "notifications.filter.boosts": "Megtolások",
   "notifications.filter.favourites": "Kedvencnek jelölések",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Töltődik…",
   "regeneration_indicator.sublabel": "A saját idővonalad épp készül!",
   "relative_time.days": "{number}n",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# napja} other {# napja}}",
+  "relative_time.full.hours": "{number, plural, one {# órája} other {# órája}}",
+  "relative_time.full.just_now": "épp most",
+  "relative_time.full.minutes": "{number, plural, one {# perce} other {# perce}}",
+  "relative_time.full.seconds": "{number, plural, one {# másodperce} other {# másodperce}}",
   "relative_time.hours": "{number}ó",
   "relative_time.just_now": "most",
   "relative_time.minutes": "{number}p",
   "relative_time.seconds": "{number}mp",
   "relative_time.today": "ma",
   "reply_indicator.cancel": "Mégsem",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "Egyéb",
+  "report.categories.spam": "Kéretlen üzenet",
+  "report.categories.violation": "A tartalom a kiszolgáló egy vagy több szabályát sérti",
   "report.forward": "Továbbítás: {target}",
   "report.forward_hint": "Ez a fiók egy másik kiszolgálóról van. Oda is elküldöd a jelentés egy anonimizált másolatát?",
   "report.hint": "A bejelentést a szervered moderátorainak küldjük el. Megmagyarázhatod, miért jelented az alábbi problémát:",
@@ -407,14 +409,14 @@
   "status.delete": "Törlés",
   "status.detailed_status": "Részletes beszélgetési nézet",
   "status.direct": "Közvetlen üzenet @{name} számára",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Szerkesztés",
+  "status.edited": "Szerkesztve: {date}",
+  "status.edited_x_times": "{count, plural, one {{count} alkalommal} other {{count} alkalommal}} szerkesztve",
   "status.embed": "Beágyazás",
   "status.favourite": "Kedvenc",
   "status.filtered": "Megszűrt",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} létrehozta: {date}",
+  "status.history.edited": "{name} szerkesztette: {date}",
   "status.load_more": "Többet",
   "status.media_hidden": "Média elrejtve",
   "status.mention": "@{name} megemlítése",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index dde99078b..24139d132 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -308,6 +308,7 @@
   "notification.poll": "Հարցումը, ուր դու քուէարկել ես, աւարտուեց։",
   "notification.reblog": "{name} տարածեց գրառումդ",
   "notification.status": "{name} հենց նոր գրառում արեց",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Մաքրել ծանուցումները",
   "notifications.clear_confirmation": "Վստա՞հ ես, որ ուզում ես մշտապէս մաքրել քո բոլոր ծանուցումները։",
   "notifications.column_settings.alert": "Աշխատատիրոյթի ծանուցումներ",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Նոր գրառումներ։",
   "notifications.column_settings.unread_notifications.category": "Չկարդացուած ծանուցումներ",
   "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Բոլորը",
   "notifications.filter.boosts": "Տարածածները",
   "notifications.filter.favourites": "Հաւանածները",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 3b43f60d5..e8e81cfde 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -47,8 +47,8 @@
   "account.unmute": "Berhenti membisukan @{name}",
   "account.unmute_notifications": "Berhenti bisukan pemberitahuan dari @{name}",
   "account_note.placeholder": "Klik untuk menambah catatan",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Tingkat retensi pengguna perhari setelah mendaftar",
+  "admin.dashboard.monthly_retention": "Tingkat retensi pengguna perbulan setelah mendaftar",
   "admin.dashboard.retention.average": "Rata-rata",
   "admin.dashboard.retention.cohort": "Bulan pendaftaran",
   "admin.dashboard.retention.cohort_size": "Pengguna baru",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Ubah japat menjadi pilihan tunggal",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Simpan perubahan",
   "compose_form.sensitive.hide": "{count, plural, other {Tandai media sebagai sensitif}}",
   "compose_form.sensitive.marked": "{count, plural, other {Media ini ditandai sebagai sensitif}}",
   "compose_form.sensitive.unmarked": "{count, plural, other {Media ini tidak ditandai sebagai sensitif}}",
@@ -308,6 +308,7 @@
   "notification.poll": "Japat yang Anda ikuti telah berakhir",
   "notification.reblog": "{name} mem-boost status anda",
   "notification.status": "{name} baru saja memposting",
+  "notification.update": "{name} mengedit kiriman",
   "notifications.clear": "Hapus notifikasi",
   "notifications.clear_confirmation": "Apa anda yakin hendak menghapus semua notifikasi anda?",
   "notifications.column_settings.alert": "Notifikasi desktop",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Toot baru:",
   "notifications.column_settings.unread_notifications.category": "Notifikasi yang belum dibaca",
   "notifications.column_settings.unread_notifications.highlight": "Sorot notifikasi yang belum dibaca",
+  "notifications.column_settings.update": "Edit:",
   "notifications.filter.all": "Semua",
   "notifications.filter.boosts": "Boost",
   "notifications.filter.favourites": "Favorit",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Memuat…",
   "regeneration_indicator.sublabel": "Linimasa anda sedang disiapkan!",
   "relative_time.days": "{number}h",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, other {# hari}} yang lalu",
+  "relative_time.full.hours": "{number, plural, other {# jam}} yang lalu",
+  "relative_time.full.just_now": "baru saja",
+  "relative_time.full.minutes": "{number, plural, other {# menit}} yang lalu",
+  "relative_time.full.seconds": "{number, plural, other {# detik}} yang lalu",
   "relative_time.hours": "{number}j",
   "relative_time.just_now": "sekarang",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}d",
   "relative_time.today": "hari ini",
   "reply_indicator.cancel": "Batal",
-  "report.categories.other": "Other",
+  "report.categories.other": "Lainnya",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "Konten melanggar satu atau lebih peraturan server",
   "report.forward": "Teruskan ke {target}",
   "report.forward_hint": "Akun dari server lain. Kirim salinan laporan scr anonim ke sana?",
   "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
@@ -408,13 +410,13 @@
   "status.detailed_status": "Tampilan detail percakapan",
   "status.direct": "Pesan langsung @{name}",
   "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edited": "Diedit {date}",
+  "status.edited_x_times": "Diedit {count, plural, other {{count} kali}}",
   "status.embed": "Tanam",
   "status.favourite": "Difavoritkan",
   "status.filtered": "Disaring",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} membuat pada {date}",
+  "status.history.edited": "{name} mengedit pada {date}",
   "status.load_more": "Tampilkan semua",
   "status.media_hidden": "Media disembunyikan",
   "status.mention": "Balasan @{name}",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index ee8a2b1b9..e4ae1d2ff 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -308,6 +308,7 @@
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} repetis tua mesajo",
   "notification.status": "{name} just posted",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Efacar savigi",
   "notifications.clear_confirmation": "Ka tu esas certa, ke tu volas efacar omna tua savigi?",
   "notifications.column_settings.alert": "Surtabla savigi",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index 5020bd068..a5164fa24 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -1,16 +1,16 @@
 {
   "account.account_note_header": "Minnispunktur",
   "account.add_or_remove_from_list": "Bæta við eða fjarlægja af listum",
-  "account.badges.bot": "Þjarkur",
+  "account.badges.bot": "Róbót",
   "account.badges.group": "Hópur",
   "account.block": "Loka á @{name}",
-  "account.block_domain": "Fela allt frá {domain}",
-  "account.blocked": "Lokað á",
+  "account.block_domain": "Útiloka lénið {domain}",
+  "account.blocked": "Útilokaður",
   "account.browse_more_on_origin_server": "Skoða nánari upplýsingar á notandasniðinu",
   "account.cancel_follow_request": "Hætta við beiðni um að fylgjas",
   "account.direct": "Bein skilaboð til @{name}",
-  "account.disable_notifications": "Hættu að láta mig vita þegar @{name} þýtur",
-  "account.domain_blocked": "Lén falið",
+  "account.disable_notifications": "Hætta að láta mig vita þegar @{name} sendir inn",
+  "account.domain_blocked": "Lén útilokað",
   "account.edit_profile": "Breyta notandasniði",
   "account.enable_notifications": "Láta mig vita þegar @{name} sendir inn",
   "account.endorse": "Birta á notandasniði",
@@ -33,22 +33,22 @@
   "account.mute_notifications": "Þagga tilkynningar frá @{name}",
   "account.muted": "Þaggað",
   "account.never_active": "Aldrei",
-  "account.posts": "Þyt",
-  "account.posts_with_replies": "Þyt og svör",
+  "account.posts": "Færslur",
+  "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.share": "Deila notandasniði fyrir @{name}",
   "account.show_reblogs": "Sýna endurbirtingar frá @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} tíst} other {{counter} tíst}}",
+  "account.statuses_counter": "{count, plural, one {{counter} færsla} other {{counter} færslur}}",
   "account.unblock": "Aflétta útilokun af @{name}",
-  "account.unblock_domain": "Hætta að fela {domain}",
+  "account.unblock_domain": "Aflétta útilokun lénsins {domain}",
   "account.unendorse": "Ekki birta á notandasniði",
   "account.unfollow": "Hætta að fylgja",
   "account.unmute": "Hætta að þagga niður í @{name}",
   "account.unmute_notifications": "Hætta að þagga tilkynningar frá @{name}",
-  "account_note.placeholder": "Engin athugasemd gefin",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "account_note.placeholder": "Smelltu til að bæta við minnispunkti",
+  "admin.dashboard.daily_retention": "Hlutfall virkra notenda eftir nýskráningu eftir dögum",
+  "admin.dashboard.monthly_retention": "Hlutfall virkra notenda eftir nýskráningu eftir mánuðum",
   "admin.dashboard.retention.average": "Meðaltal",
   "admin.dashboard.retention.cohort": "Mánuður nýskráninga",
   "admin.dashboard.retention.cohort_size": "Nýir notendur",
@@ -71,14 +71,14 @@
   "column.community": "Staðvær tímalína",
   "column.direct": "Bein skilaboð",
   "column.directory": "Skoða notandasnið",
-  "column.domain_blocks": "Falin lén",
-  "column.favourites": "Fílanir",
-  "column.follow_requests": "Fylgja beiðnum",
+  "column.domain_blocks": "Útilokuð lén",
+  "column.favourites": "Eftirlæti",
+  "column.follow_requests": "Beiðnir um að fylgjast með",
   "column.home": "Heim",
   "column.lists": "Listar",
   "column.mutes": "Þaggaðir notendur",
   "column.notifications": "Tilkynningar",
-  "column.pins": "Föst tíst",
+  "column.pins": "Festar færslur",
   "column.public": "Sameiginleg tímalína",
   "column_back_button.label": "Til baka",
   "column_header.hide_settings": "Fela stillingar",
@@ -91,9 +91,9 @@
   "community.column_settings.local_only": "Einungis staðvært",
   "community.column_settings.media_only": "Einungis myndskrár",
   "community.column_settings.remote_only": "Einungis fjartengt",
-  "compose_form.direct_message_warning": "Þetta tíst verður aðeins sent á notendur sem minnst er á.",
+  "compose_form.direct_message_warning": "Þessi færsla verður aðeins send á notendur sem minnst er á.",
   "compose_form.direct_message_warning_learn_more": "Kanna nánar",
-  "compose_form.hashtag_warning": "Þetta tíst verður ekki talið með undir nokkru myllumerki þar sem það er óskráð. Einungis er hægt að leita að opinberum tístum eftir myllumerkjum.",
+  "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.lock_disclaimer": "Aðgangurinn þinn er ekki {locked}. Hver sem er getur fylgst með þeim færslum þínum sem einungis eru til fylgjenda þinna.",
   "compose_form.lock_disclaimer.lock": "læst",
   "compose_form.placeholder": "Hvað varstu að hugsa?",
@@ -103,26 +103,26 @@
   "compose_form.poll.remove_option": "Fjarlægja þennan valkost",
   "compose_form.poll.switch_to_multiple": "Breyta könnun svo hægt sé að hafa marga valkosti",
   "compose_form.poll.switch_to_single": "Breyta könnun svo hægt sé að hafa einn stakan valkost",
-  "compose_form.publish": "Þyt",
+  "compose_form.publish": "Tíst",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
-  "compose_form.sensitive.hide": "Merkja myndir sem viðkvæmar",
-  "compose_form.sensitive.marked": "Mynd er merkt sem viðkvæm",
-  "compose_form.sensitive.unmarked": "Mynd er ekki merkt sem viðkvæm",
-  "compose_form.spoiler.marked": "Texti er falinn á bak við aðvörun",
-  "compose_form.spoiler.unmarked": "Texti er ekki falinn",
+  "compose_form.save_changes": "Vista breytingar",
+  "compose_form.sensitive.hide": "{count, plural, one {Merkja mynd sem viðkvæma} other {Merkja myndir sem viðkvæmar}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Mynd er merkt sem viðkvæm} other {Myndir eru merktar sem viðkvæmar}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Mynd er ekki merkt sem viðkvæm} other {Myndir eru ekki merktar sem viðkvæmar}}",
+  "compose_form.spoiler.marked": "Fjarlægja aðvörun vegna efnis",
+  "compose_form.spoiler.unmarked": "Bæta við aðvörun vegna efnis",
   "compose_form.spoiler_placeholder": "Skrifaðu aðvörunina þína hér",
   "confirmation_modal.cancel": "Hætta við",
   "confirmations.block.block_and_report": "Útiloka og kæra",
   "confirmations.block.confirm": "Útiloka",
   "confirmations.block.message": "Ertu viss um að þú viljir loka á {name}?",
   "confirmations.delete.confirm": "Eyða",
-  "confirmations.delete.message": "Ertu viss um að þú viljir eyða þessari stöðufærslu?",
+  "confirmations.delete.message": "Ertu viss um að þú viljir eyða þessari færslu?",
   "confirmations.delete_list.confirm": "Eyða",
   "confirmations.delete_list.message": "Ertu viss um að þú viljir eyða þessum lista endanlega?",
   "confirmations.discard_edit_media.confirm": "Henda",
   "confirmations.discard_edit_media.message": "Þú ert með óvistaðar breytingar á lýsingu myndefnis eða forskoðunar, henda þeim samt?",
-  "confirmations.domain_block.confirm": "Fela allt lénið",
+  "confirmations.domain_block.confirm": "Útiloka allt lénið",
   "confirmations.domain_block.message": "Ertu alveg algjörlega viss um að þú viljir loka á allt {domain}? Í flestum tilfellum er vænlegra að nota færri en markvissari útilokanir eða að þagga niður tiltekna aðila. Þú munt ekki sjá efni frá þessu léni í neinum opinberum tímalínum eða í tilkynningunum þínum. Fylgjendur þínir frá þessu léni verða fjarlægðir.",
   "confirmations.logout.confirm": "Skrá út",
   "confirmations.logout.message": "Ertu viss um að þú viljir skrá þig út?",
@@ -130,7 +130,7 @@
   "confirmations.mute.explanation": "Þetta mun fela færslur frá þeim og þær færslur þar sem minnst er á þau, en það mun samt sem áður gera þeim kleift að sjá færslurnar þínar og að fylgjast með þér.",
   "confirmations.mute.message": "Ertu viss um að þú viljir þagga niður í {name}?",
   "confirmations.redraft.confirm": "Eyða og enduvinna drög",
-  "confirmations.redraft.message": "Ertu viss um að þú viljir eyða þessari stöðufærslu og enduvinna drögin? Fílanir og endurbirtingar munu glatast og svör við upprunalegu fæerslunni munu verða munaðarlaus.",
+  "confirmations.redraft.message": "Ertu viss um að þú viljir eyða þessari færslu og enduvinna drögin? Eftirlæti og endurbirtingar munu glatast og svör við upprunalegu færslunni munu verða munaðarlaus.",
   "confirmations.reply.confirm": "Svara",
   "confirmations.reply.message": "Ef þú svarar núna verður skrifað yfir skilaboðin sem þú ert að semja núna. Ertu viss um að þú viljir halda áfram?",
   "confirmations.unfollow.confirm": "Hætta að fylgja",
@@ -151,7 +151,7 @@
   "emoji_button.food": "Matur og drykkur",
   "emoji_button.label": "Setja inn tjáningartákn",
   "emoji_button.nature": "Náttúra",
-  "emoji_button.not_found": "Engin tjáningartákn!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "Engin samsvarandi tjáningartákn fundust",
   "emoji_button.objects": "Hlutir",
   "emoji_button.people": "Fólk",
   "emoji_button.recent": "Oft notað",
@@ -160,21 +160,21 @@
   "emoji_button.symbols": "Tákn",
   "emoji_button.travel": "Ferðalög og staðir",
   "empty_column.account_suspended": "Notandaaðgangur í bið",
-  "empty_column.account_timeline": "Engin þyt hér!",
+  "empty_column.account_timeline": "Engar færslur hér!",
   "empty_column.account_unavailable": "Notandasnið ekki tiltækt",
   "empty_column.blocks": "Þú hefur ekki ennþá útilokað neina notendur.",
-  "empty_column.bookmarked_statuses": "Þú ert ekki ennþá með nein bókamerkt þyt. Þegar þú gefur þyti bókamerki, mun það birtast hér.",
+  "empty_column.bookmarked_statuses": "Þú ert ekki ennþá með neinar bókamerktar færslur. Þegar þú bókamerkir færslu, mun það birtast hér.",
   "empty_column.community": "Staðværa tímalínan er tóm. Skrifaðu eitthvað opinberlega til að láta boltann fara að rúlla!",
   "empty_column.direct": "Þú átt ennþá engin bein skilaboð. Þegar þú sendir eða tekur á móti slíkum skilaboðum, munu þau birtast hér.",
-  "empty_column.domain_blocks": "Það eru engin falin lén ennþá.",
-  "empty_column.favourited_statuses": "Þú hefur ekki fílað nein þyt. Þegar að þú fílar þyt, þá mun það birtast hér.",
-  "empty_column.favourites": "Enginn hefu fílað þetta þyt ennþá. Þegar einhver gerir það, mun sá birtast hér.",
+  "empty_column.domain_blocks": "Það eru ennþá engin útilokuð lén.",
+  "empty_column.favourited_statuses": "Þú ert ekki ennþá með neinar eftirlætisfærslur. Þegar þú setur færslu í eftirlæti, munu þau birtast hér.",
+  "empty_column.favourites": "Enginn hefur ennþá sett þessa færslu í eftirlæti. Þegar einhver gerir það, mun það birtast hér.",
   "empty_column.follow_recommendations": "Það lítur út fyrir að ekki hafi verið hægt að útbúa neinar tillögur fyrir þig. Þú getur reynt að leita að fólki sem þú gætir þekkt eða skoðað myllumerki sem eru í umræðunni.",
   "empty_column.follow_requests": "Þú átt ennþá engar beiðnir um að fylgja þér. Þegar þú færð slíkar beiðnir, munu þær birtast hér.",
   "empty_column.hashtag": "Það er ekkert ennþá undir þessu myllumerki.",
-  "empty_column.home": "Heimatímalínan þín er tóm! Skoðaðu {public} eða notaðu leitina til að komast í gang og finna annað fólk.",
+  "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 stöðufærslur, munu þær birtast hér.",
+  "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.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ð.",
@@ -217,40 +217,40 @@
   "intervals.full.days": "{number, plural, one {# dagur} other {# dagar}}",
   "intervals.full.hours": "{number, plural, one {# klukkustund} other {# klukkustundir}}",
   "intervals.full.minutes": "{number, plural, one {# mínúta} other {# mínútur}}",
-  "keyboard_shortcuts.back": "að fara til baka",
-  "keyboard_shortcuts.blocked": "að opna lista yfir útilokaða notendur",
-  "keyboard_shortcuts.boost": "að endurbirta",
-  "keyboard_shortcuts.column": "að setja virkni á stöðufærslu í einum af dálkunum",
-  "keyboard_shortcuts.compose": "að setja virkni á textainnsetningarreit",
+  "keyboard_shortcuts.back": "Fara til baka",
+  "keyboard_shortcuts.blocked": "Opna lista yfir útilokaða notendur",
+  "keyboard_shortcuts.boost": "Endurbirta færslu",
+  "keyboard_shortcuts.column": "Setja virkni í dálk",
+  "keyboard_shortcuts.compose": "Setja virkni á textainnsetningarreit",
   "keyboard_shortcuts.description": "Lýsing",
-  "keyboard_shortcuts.direct": "að opna dálk með beinum skilaboðum",
-  "keyboard_shortcuts.down": "að fara neðar í listanum",
-  "keyboard_shortcuts.enter": "að opna stöðufærslu",
-  "keyboard_shortcuts.favourite": "Fíla þyt",
-  "keyboard_shortcuts.favourites": "Opna fílanir",
-  "keyboard_shortcuts.federated": "að opna sameiginlega tímalínu",
+  "keyboard_shortcuts.direct": "Opna dálk með beinum skilaboðum",
+  "keyboard_shortcuts.down": "Fara neðar í listanum",
+  "keyboard_shortcuts.enter": "Opna færslu",
+  "keyboard_shortcuts.favourite": "Eftirlætisfærsla",
+  "keyboard_shortcuts.favourites": "Opna eftirlætislista",
+  "keyboard_shortcuts.federated": "Opna sameiginlega tímalínu",
   "keyboard_shortcuts.heading": "Flýtileiðir á lyklaborði",
-  "keyboard_shortcuts.home": "að opna heimatímalínu",
+  "keyboard_shortcuts.home": "Opna heimatímalínu",
   "keyboard_shortcuts.hotkey": "Flýtilykill",
-  "keyboard_shortcuts.legend": "að birta þessa skýringu",
-  "keyboard_shortcuts.local": "að opna staðværa tímalínu",
-  "keyboard_shortcuts.mention": "að minnast á höfund",
-  "keyboard_shortcuts.muted": "að opna lista yfir þaggaða notendur",
-  "keyboard_shortcuts.my_profile": "að opna notandasniðið þitt",
-  "keyboard_shortcuts.notifications": "að opna tilkynningadálk",
-  "keyboard_shortcuts.open_media": "til að opna margmiðlunargögn",
-  "keyboard_shortcuts.pinned": "Opna lista yfir föst þyt",
-  "keyboard_shortcuts.profile": "að opna notandasnið höfundar",
-  "keyboard_shortcuts.reply": "að svara",
-  "keyboard_shortcuts.requests": "að opna lista yfir fylgjendabeiðnir",
-  "keyboard_shortcuts.search": "að setja virkni í leit",
-  "keyboard_shortcuts.spoilers": "til að birta/fela reit með aðvörun vegna efnis",
-  "keyboard_shortcuts.start": "að opna \"komast í gang\" dálk",
-  "keyboard_shortcuts.toggle_hidden": "að birta/fela texta á bak við aðvörun vegna efnis",
-  "keyboard_shortcuts.toggle_sensitivity": "að birta/fela myndir",
-  "keyboard_shortcuts.toot": "Hefja glænýtt þyt",
-  "keyboard_shortcuts.unfocus": "að taka virkni úr textainnsetningarreit eða leit",
-  "keyboard_shortcuts.up": "að fara ofar í listanum",
+  "keyboard_shortcuts.legend": "Birta þessa skýringu",
+  "keyboard_shortcuts.local": "Opna staðværa tímalínu",
+  "keyboard_shortcuts.mention": "Minnast á höfund",
+  "keyboard_shortcuts.muted": "Opna lista yfir þaggaða notendur",
+  "keyboard_shortcuts.my_profile": "Opna notandasniðið þitt",
+  "keyboard_shortcuts.notifications": "Opna tilkynningadálk",
+  "keyboard_shortcuts.open_media": "Opna margmiðlunargögn",
+  "keyboard_shortcuts.pinned": "Opna lista yfir festar færslur",
+  "keyboard_shortcuts.profile": "Opna notandasnið höfundar",
+  "keyboard_shortcuts.reply": "Svara færslu",
+  "keyboard_shortcuts.requests": "Opna lista yfir fylgjendabeiðnir",
+  "keyboard_shortcuts.search": "Setja virkni í leitarreit",
+  "keyboard_shortcuts.spoilers": "Birta/fela reit með aðvörun vegna efnis",
+  "keyboard_shortcuts.start": "Opna \"komast í gang\" dálk",
+  "keyboard_shortcuts.toggle_hidden": "Birta/fela texta á bak við aðvörun vegna efnis",
+  "keyboard_shortcuts.toggle_sensitivity": "Birta/fela myndir",
+  "keyboard_shortcuts.toot": "Byrja nýja færslu",
+  "keyboard_shortcuts.unfocus": "Taka virkni úr textainnsetningarreit eða leit",
+  "keyboard_shortcuts.up": "Fara ofar í listanum",
   "lightbox.close": "Loka",
   "lightbox.compress": "Þjappa myndskoðunarreit",
   "lightbox.expand": "Fletta út myndskoðunarreit",
@@ -281,12 +281,12 @@
   "navigation_bar.blocks": "Útilokaðir notendur",
   "navigation_bar.bookmarks": "Bókamerki",
   "navigation_bar.community_timeline": "Staðvær tímalína",
-  "navigation_bar.compose": "Semja nýtt þyt",
+  "navigation_bar.compose": "Semja nýja færslu",
   "navigation_bar.direct": "Bein skilaboð",
   "navigation_bar.discover": "Uppgötva",
-  "navigation_bar.domain_blocks": "Falin lén",
+  "navigation_bar.domain_blocks": "Útilokuð lén",
   "navigation_bar.edit_profile": "Breyta notandasniði",
-  "navigation_bar.favourites": "Fílanir",
+  "navigation_bar.favourites": "Eftirlæti",
   "navigation_bar.filters": "Þögguð orð",
   "navigation_bar.follow_requests": "Beiðnir um að fylgjast með",
   "navigation_bar.follows_and_followers": "Fylgist með og fylgjendur",
@@ -296,22 +296,23 @@
   "navigation_bar.logout": "Útskráning",
   "navigation_bar.mutes": "Þaggaðir notendur",
   "navigation_bar.personal": "Einka",
-  "navigation_bar.pins": "Föst þyt",
+  "navigation_bar.pins": "Festar færslur",
   "navigation_bar.preferences": "Kjörstillingar",
   "navigation_bar.public_timeline": "Sameiginleg tímalína",
   "navigation_bar.security": "Öryggi",
-  "notification.favourite": "{name} filaði stöðufærslu þína",
+  "notification.favourite": "{name} setti færslu þína í eftirlæti",
   "notification.follow": "{name} fylgist með þér",
   "notification.follow_request": "{name} hefur beðið um að fylgjast með þér",
   "notification.mention": "{name} minntist á þig",
   "notification.own_poll": "Könnuninni þinni er lokið",
   "notification.poll": "Könnun sem þú tókst þátt í er lokið",
-  "notification.reblog": "{name} endurbirti stöðufærsluna þína",
+  "notification.reblog": "{name} endurbirti færsluna þína",
   "notification.status": "{name} sendi inn rétt í þessu",
+  "notification.update": "{name} breytti færslu",
   "notifications.clear": "Hreinsa tilkynningar",
   "notifications.clear_confirmation": "Ertu viss um að þú viljir endanlega eyða öllum tilkynningunum þínum?",
   "notifications.column_settings.alert": "Tilkynningar á skjáborði",
-  "notifications.column_settings.favourite": "Fílanir:",
+  "notifications.column_settings.favourite": "Eftirlæti:",
   "notifications.column_settings.filter_bar.advanced": "Birta alla flokka",
   "notifications.column_settings.filter_bar.category": "Skyndisíustika",
   "notifications.column_settings.filter_bar.show_bar": "Birta síustikuna",
@@ -323,12 +324,13 @@
   "notifications.column_settings.reblog": "Endurbirtingar:",
   "notifications.column_settings.show": "Sýna í dálki",
   "notifications.column_settings.sound": "Spila hljóð",
-  "notifications.column_settings.status": "Ný þyt:",
+  "notifications.column_settings.status": "Nýjar færslur:",
   "notifications.column_settings.unread_notifications.category": "Ólesnar tilkynningar",
   "notifications.column_settings.unread_notifications.highlight": "Áherslulita ólesnar tilkynningar",
+  "notifications.column_settings.update": "Breytingar:",
   "notifications.filter.all": "Allt",
   "notifications.filter.boosts": "Endurbirtingar",
-  "notifications.filter.favourites": "Fílanir",
+  "notifications.filter.favourites": "Eftirlæti",
   "notifications.filter.follows": "Fylgist með",
   "notifications.filter.mentions": "Tilvísanir",
   "notifications.filter.polls": "Niðurstöður könnunar",
@@ -352,7 +354,7 @@
   "poll.votes": "{votes, plural, one {# atkvæði} other {# atkvæði}}",
   "poll_button.add_poll": "Bæta við könnun",
   "poll_button.remove_poll": "Fjarlægja könnun",
-  "privacy.change": "Aðlaga gagnaleynd stöðufærslu",
+  "privacy.change": "Aðlaga gagnaleynd færslu",
   "privacy.direct.long": "Senda einungis á notendur sem minnst er á",
   "privacy.direct.short": "Beint",
   "privacy.private.long": "Senda einungis á fylgjendur",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Hleð inn…",
   "regeneration_indicator.sublabel": "Verið er að útbúa heimastreymið þitt!",
   "relative_time.days": "{number}d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "Fyrir {number, plural, one {# degi} other {# dögum}} síðan",
+  "relative_time.full.hours": "Fyrir {number, plural, one {# klukkustund} other {# klukkustundum}} síðan",
+  "relative_time.full.just_now": "í þessu",
+  "relative_time.full.minutes": "Fyrir {number, plural, one {# mínútu} other {# mínútum}} síðan",
+  "relative_time.full.seconds": "Fyrir {number, plural, one {# sekúndu} other {# sekúndum}} síðan",
   "relative_time.hours": "{number}kl.",
   "relative_time.just_now": "núna",
   "relative_time.minutes": "{number}mín",
   "relative_time.seconds": "{number}sek",
   "relative_time.today": "í dag",
   "reply_indicator.cancel": "Hætta við",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "Annað",
+  "report.categories.spam": "Ruslpóstur",
+  "report.categories.violation": "Efnið brýtur gegn einni eða fleiri reglum netþjónsins",
   "report.forward": "Áframsenda til {target}",
   "report.forward_hint": "Notandaaðgangurinn er af öðrum vefþjóni. Á einnig að senda nafnlaust afrit af kærunni þangað?",
   "report.hint": "Kæran verður send á umsjónarmenn vefþjónsins þíns. Þú getur gefið skýringu hér fyrir neðan á því af hverju þú ert að kæra þennan notandaaðgang:",
@@ -387,48 +389,48 @@
   "report.target": "Kæri {target}",
   "search.placeholder": "Leita",
   "search_popout.search_format": "Snið ítarlegrar leitar",
-  "search_popout.tips.full_text": "Einfaldur texti skilar stöðufærslum sem þú hefur skrifað, fílað, endurbirt eða sem á þig hefur verið minnst í, ásamt samsvarandi birtingarnöfnum, notendanöfnum og myllumerkjum.",
+  "search_popout.tips.full_text": "Einfaldur texti skilar færslum sem þú hefur skrifað, sett í eftirlæti, endurbirt eða verið minnst á þig í, ásamt samsvarandi birtingarnöfnum, notendanöfnum og myllumerkjum.",
   "search_popout.tips.hashtag": "myllumerki",
-  "search_popout.tips.status": "stöðufærsla",
+  "search_popout.tips.status": "færsla",
   "search_popout.tips.text": "Einfaldur texti skilar samsvarandi birtingarnöfnum, notendanöfnum og myllumerkjum",
   "search_popout.tips.user": "notandi",
   "search_results.accounts": "Fólk",
   "search_results.hashtags": "Myllumerki",
-  "search_results.statuses": "Þyt",
-  "search_results.statuses_fts_disabled": "Að leita í efni þyta er ekki virk á þessum Mastodon-þjóni.",
+  "search_results.statuses": "Færslur",
+  "search_results.statuses_fts_disabled": "Að leita í efni færslna er ekki virkt á þessum Mastodon-þjóni.",
   "search_results.total": "{count, number} {count, plural, one {niðurstaða} other {niðurstöður}}",
   "status.admin_account": "Opna umsjónarviðmót fyrir @{name}",
-  "status.admin_status": "Opna þessa stöðufærslu í umsjónarviðmótinu",
+  "status.admin_status": "Opna þessa færslu í umsjónarviðmótinu",
   "status.block": "Útiloka @{name}",
   "status.bookmark": "Bókamerki",
   "status.cancel_reblog_private": "Taka úr endurbirtingu",
   "status.cannot_reblog": "Þessa færslu er ekki hægt að endurbirta",
-  "status.copy": "Afrita tengil í stöðufærslu",
+  "status.copy": "Afrita tengil í færslu",
   "status.delete": "Eyða",
   "status.detailed_status": "Nákvæm spjallþráðasýn",
   "status.direct": "Bein skilaboð @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Breyta",
+  "status.edited": "Breytt {date}",
+  "status.edited_x_times": "Breytt {count, plural, one {{count} sinni} other {{count} sinnum}}",
   "status.embed": "Ívefja",
-  "status.favourite": "Fílanir",
+  "status.favourite": "Eftirlæti",
   "status.filtered": "Síað",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} útbjó {date}",
+  "status.history.edited": "{name} breytti {date}",
   "status.load_more": "Hlaða inn meiru",
   "status.media_hidden": "Mynd er falin",
   "status.mention": "Minnast á @{name}",
   "status.more": "Meira",
   "status.mute": "Þagga niður í @{name}",
   "status.mute_conversation": "Þagga niður í samtali",
-  "status.open": "Útliða þessa stöðu",
+  "status.open": "Útliða þessa færslu",
   "status.pin": "Festa á notandasnið",
-  "status.pinned": "Fast þyt",
+  "status.pinned": "Fest færsla",
   "status.read_more": "Lesa meira",
   "status.reblog": "Endurbirting",
   "status.reblog_private": "Endurbirta til upphaflegra lesenda",
   "status.reblogged_by": "{name} endurbirti",
-  "status.reblogs.empty": "Enginn hefur ennþá endurbirt þetta þyt. Þegar einhver gerir það, mun sá birtast hér.",
+  "status.reblogs.empty": "Enginn hefur ennþá endurbirt þessa færslu. Þegar einhver gerir það, mun það birtast hér.",
   "status.redraft": "Eyða og enduvinna drög",
   "status.remove_bookmark": "Fjarlægja bókamerki",
   "status.reply": "Svara",
@@ -459,7 +461,7 @@
   "timeline_hint.remote_resource_not_displayed": "{resource} frá öðrum netþjónum er ekki birt.",
   "timeline_hint.resources.followers": "Fylgjendur",
   "timeline_hint.resources.follows": "Fylgist með",
-  "timeline_hint.resources.statuses": "Eldri þyt",
+  "timeline_hint.resources.statuses": "Eldri færslur",
   "trends.counter_by_accounts": "{count, plural, one {{counter} aðili} other {{counter} aðilar}} tala",
   "trends.trending_now": "Í umræðunni núna",
   "ui.beforeunload": "Drögin tapast ef þú ferð út úr Mastodon.",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index c02c84f09..a4847b77b 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -47,8 +47,8 @@
   "account.unmute": "Riattiva @{name}",
   "account.unmute_notifications": "Riattiva le notifiche da @{name}",
   "account_note.placeholder": "Clicca per aggiungere una nota",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Tasso di ritenzione utente per giorno dopo la registrazione",
+  "admin.dashboard.monthly_retention": "Tasso di ritenzione utente per mese dopo la registrazione",
   "admin.dashboard.retention.average": "Media",
   "admin.dashboard.retention.cohort": "Mese di iscrizione",
   "admin.dashboard.retention.cohort_size": "Nuovi utenti",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Modifica sondaggio per consentire una singola scelta",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Salva modifiche",
   "compose_form.sensitive.hide": "Segna media come sensibile",
   "compose_form.sensitive.marked": "Questo media è contrassegnato come sensibile",
   "compose_form.sensitive.unmarked": "Questo media non è contrassegnato come sensibile",
@@ -308,6 +308,7 @@
   "notification.poll": "Un sondaggio in cui hai votato è terminato",
   "notification.reblog": "{name} ha condiviso il tuo post",
   "notification.status": "{name} ha appena pubblicato un post",
+  "notification.update": "{name} ha modificato un post",
   "notifications.clear": "Cancella notifiche",
   "notifications.clear_confirmation": "Vuoi davvero cancellare tutte le notifiche?",
   "notifications.column_settings.alert": "Notifiche desktop",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Nuovi post:",
   "notifications.column_settings.unread_notifications.category": "Notifiche non lette",
   "notifications.column_settings.unread_notifications.highlight": "Evidenzia notifiche non lette",
+  "notifications.column_settings.update": "Modifiche:",
   "notifications.filter.all": "Tutti",
   "notifications.filter.boosts": "Condivisioni",
   "notifications.filter.favourites": "Apprezzati",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Caricamento in corso…",
   "regeneration_indicator.sublabel": "Stiamo preparando il tuo home feed!",
   "relative_time.days": "{number}g",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# giorno} other {# giorni}} fa",
+  "relative_time.full.hours": "{number, plural, one {# ora} other {# ore}} fa",
+  "relative_time.full.just_now": "proprio ora",
+  "relative_time.full.minutes": "{number, plural, one {# minuto} other {# minuti}} fa",
+  "relative_time.full.seconds": "{number, plural, one {# secondo} other {# secondi}} fa",
   "relative_time.hours": "{number}o",
   "relative_time.just_now": "ora",
   "relative_time.minutes": "{number} minuti",
   "relative_time.seconds": "{number} secondi",
   "relative_time.today": "oggi",
   "reply_indicator.cancel": "Annulla",
-  "report.categories.other": "Other",
+  "report.categories.other": "Altro",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "Il contenuto viola una o più regole del server",
   "report.forward": "Inoltra a {target}",
   "report.forward_hint": "Questo account appartiene a un altro server. Mandare anche là una copia anonima del rapporto?",
   "report.hint": "La segnalazione sarà inviata ai moderatori del tuo server. Di seguito, puoi fornire il motivo per il quale stai segnalando questo account:",
@@ -407,14 +409,14 @@
   "status.delete": "Elimina",
   "status.detailed_status": "Vista conversazione dettagliata",
   "status.direct": "Messaggio privato @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Modifica",
+  "status.edited": "Modificato il {date}",
+  "status.edited_x_times": "Modificato {count, plural, one {{count} volta} other {{count} volte}}",
   "status.embed": "Incorpora",
   "status.favourite": "Apprezzato",
   "status.filtered": "Filtrato",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} ha creato {date}",
+  "status.history.edited": "{name} ha modificato {date}",
   "status.load_more": "Mostra di più",
   "status.media_hidden": "Allegato nascosto",
   "status.mention": "Nomina @{name}",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index a54922ef6..48766c80b 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -47,8 +47,8 @@
   "account.unmute": "@{name}さんのミュートを解除",
   "account.unmute_notifications": "@{name}さんからの通知を受け取るようにする",
   "account_note.placeholder": "クリックしてメモを追加",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "サインアップ後の日ごとのユーザー継続率",
+  "admin.dashboard.monthly_retention": "サインアップ後の月ごとのユーザー継続率",
   "admin.dashboard.retention.average": "平均",
   "admin.dashboard.retention.cohort": "サインアップ月",
   "admin.dashboard.retention.cohort_size": "新しいユーザー",
@@ -109,7 +109,7 @@
   "compose_form.poll.switch_to_single": "単一選択に変更",
   "compose_form.publish": "トゥート",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "変更を保存",
   "compose_form.sensitive.hide": "メディアを閲覧注意にする",
   "compose_form.sensitive.marked": "メディアに閲覧注意が設定されています",
   "compose_form.sensitive.unmarked": "メディアに閲覧注意が設定されていません",
@@ -313,6 +313,7 @@
   "notification.poll": "アンケートが終了しました",
   "notification.reblog": "{name}さんがあなたの投稿をブーストしました",
   "notification.status": "{name}さんが投稿しました",
+  "notification.update": "{name} が投稿を編集しました",
   "notifications.clear": "通知を消去",
   "notifications.clear_confirmation": "本当に通知を消去しますか?",
   "notifications.column_settings.alert": "デスクトップ通知",
@@ -331,6 +332,7 @@
   "notifications.column_settings.status": "新しい投稿:",
   "notifications.column_settings.unread_notifications.category": "未読の通知:",
   "notifications.column_settings.unread_notifications.highlight": "未読の通知を強調表示",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "すべて",
   "notifications.filter.boosts": "ブースト",
   "notifications.filter.favourites": "お気に入り",
@@ -370,20 +372,20 @@
   "regeneration_indicator.label": "読み込み中…",
   "regeneration_indicator.sublabel": "ホームタイムラインは準備中です!",
   "relative_time.days": "{number}日前",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number} 日前",
+  "relative_time.full.hours": "{number} 時間前",
+  "relative_time.full.just_now": "今",
+  "relative_time.full.minutes": "{number} 分前",
+  "relative_time.full.seconds": "{number} 秒前",
   "relative_time.hours": "{number}時間前",
   "relative_time.just_now": "今",
   "relative_time.minutes": "{number}分前",
   "relative_time.seconds": "{number}秒前",
   "relative_time.today": "今日",
   "reply_indicator.cancel": "キャンセル",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "その他",
+  "report.categories.spam": "スパム",
+  "report.categories.violation": "サーバーのルールに違反",
   "report.forward": "{target} に転送する",
   "report.forward_hint": "このアカウントは別のサーバーに所属しています。通報内容を匿名で転送しますか?",
   "report.hint": "通報内容はあなたのサーバーのモデレーターへ送信されます。通報理由を入力してください。:",
@@ -412,14 +414,14 @@
   "status.delete": "削除",
   "status.detailed_status": "詳細な会話ビュー",
   "status.direct": "@{name}さんにダイレクトメッセージ",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "編集",
+  "status.edited": "{date} 編集済み",
+  "status.edited_x_times": "{count} 回編集",
   "status.embed": "埋め込み",
   "status.favourite": "お気に入り",
   "status.filtered": "フィルターされました",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name}さんが {date} に作成",
+  "status.history.edited": "{name}さんが {date} に編集",
   "status.load_more": "もっと見る",
   "status.media_hidden": "非表示のメディア",
   "status.mention": "@{name}さんに投稿",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 12ff62dba..c6c177d58 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -308,6 +308,7 @@
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name}-მა დაბუსტა თქვენი სტატუსი",
   "notification.status": "{name} just posted",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "შეტყობინებების გასუფთავება",
   "notifications.clear_confirmation": "დარწმუნებული ხართ, გსურთ სამუდამოდ წაშალოთ ყველა თქვენი შეტყობინება?",
   "notifications.column_settings.alert": "დესკტოპ შეტყობინებები",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index f420ac45b..b575db516 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
   "compose_form.publish": "Jewweq",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Sekles ibeddilen",
   "compose_form.sensitive.hide": "Creḍ allal n teywalt d anafri",
   "compose_form.sensitive.marked": "Allal n teywalt yettwacreḍ d anafri",
   "compose_form.sensitive.unmarked": "Allal n teywalt ur yettwacreḍ ara d anafri",
@@ -308,6 +308,7 @@
   "notification.poll": "Tfukk tefrant ideg tettekkaḍ",
   "notification.reblog": "{name} yebḍa tajewwiqt-ik i tikelt-nniḍen",
   "notification.status": "{name} akken i d-yessufeɣ",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Sfeḍ tilɣa",
   "notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk tilɣa-inek·em i lebda?",
   "notifications.column_settings.alert": "Tilɣa n tnarit",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Tiẓenẓunin timaynutin:",
   "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": "Akk",
   "notifications.filter.boosts": "Seǧhed",
   "notifications.filter.favourites": "Ismenyifen",
@@ -367,7 +369,7 @@
   "relative_time.days": "{number}u",
   "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": "tura kan",
   "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}isr",
@@ -377,7 +379,7 @@
   "relative_time.today": "assa",
   "reply_indicator.cancel": "Sefsex",
   "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
+  "report.categories.spam": "Aspam",
   "report.categories.violation": "Content violates one or more server rules",
   "report.forward": "Bren-it ɣeṛ {target}",
   "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
@@ -407,8 +409,8 @@
   "status.delete": "Kkes",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Izen usrid i @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
+  "status.edit": "Ẓreg",
+  "status.edited": "Tettwaẓreg deg {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
   "status.embed": "Seddu",
   "status.favourite": "Rnu ɣer yismenyifen",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index 074ae5844..4fb5cb3d1 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -308,6 +308,7 @@
   "notification.poll": "Бұл сауалнаманың мерзімі аяқталыпты",
   "notification.reblog": "{name} жазбаңызды бөлісті",
   "notification.status": "{name} just posted",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Ескертпелерді тазарт",
   "notifications.clear_confirmation": "Шынымен барлық ескертпелерді өшіресіз бе?",
   "notifications.column_settings.alert": "Үстел ескертпелері",
@@ -326,6 +327,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.filter.all": "Барлығы",
   "notifications.filter.boosts": "Бөлісулер",
   "notifications.filter.favourites": "Таңдаулылар",
diff --git a/app/javascript/mastodon/locales/kmr.json b/app/javascript/mastodon/locales/kmr.json
index f45e305cd..2ae288581 100644
--- a/app/javascript/mastodon/locales/kmr.json
+++ b/app/javascript/mastodon/locales/kmr.json
@@ -47,8 +47,8 @@
   "account.unmute": "@{name} Bêdeng bike",
   "account.unmute_notifications": "Agahdariyan ji @{name} bêdeng bike",
   "account_note.placeholder": "Bitikîne bo nîşeyekê tevlî bikî",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Rêjeya ragirtina bikarhêner bi roj piştî tomarkirinê",
+  "admin.dashboard.monthly_retention": "Rêjeya ragirtina bikarhêner bi meh piştî tomarkirinê",
   "admin.dashboard.retention.average": "Navîn",
   "admin.dashboard.retention.cohort": "Meha tomarkirinê",
   "admin.dashboard.retention.cohort_size": "Bikarhênerên nû",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Rapirsîyê biguherîne da ku mafê bidî tenê vebijêrkek",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Guhertinan tomar bike",
   "compose_form.sensitive.hide": "{count, plural, one {Medya wekî hestiyar nîşan bide} other {Medya wekî hestiyar nîşan bide}}",
   "compose_form.sensitive.marked": "{count, plural, one {Medya wekî hestiyar hate nîşan} other {Medya wekî hestiyar nîşan}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Medya wekî hestiyar nehatiye nîşan} other {Medya wekî hestiyar nehatiye nîşan}}",
@@ -308,6 +308,7 @@
   "notification.poll": "Rapirsiyeke ku te deng daye qediya",
   "notification.reblog": "{name} şandiya te bilind kir",
   "notification.status": "{name} niha şand",
+  "notification.update": "{name} şandiyek serrast kir",
   "notifications.clear": "Agahdariyan pak bike",
   "notifications.clear_confirmation": "Bi rastî tu dixwazî bi awayekî dawî hemû agahdariyên xwe pak bikî?",
   "notifications.column_settings.alert": "Agahdariyên sermaseyê",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Şandiyên nû:",
   "notifications.column_settings.unread_notifications.category": "Agahdariyên nexwendî",
   "notifications.column_settings.unread_notifications.highlight": "Agahiyên nexwendî nîşan bike",
+  "notifications.column_settings.update": "Serrastkirin:",
   "notifications.filter.all": "Hemû",
   "notifications.filter.boosts": "Bilindkirî",
   "notifications.filter.favourites": "Bijarte",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Tê barkirin…",
   "regeneration_indicator.sublabel": "Mala te da tê amedekirin!",
   "relative_time.days": "{number}r",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# roj} other {# roj}} berê",
+  "relative_time.full.hours": "{number, plural, one {# demjimêr} other {# demjimêr}} berê",
+  "relative_time.full.just_now": "hema niha",
+  "relative_time.full.minutes": "{number, plural, one {# xulek} other {# xulek}} berê",
+  "relative_time.full.seconds": "{number, plural, one {# çirke} other {# çirke}} xulek",
   "relative_time.hours": "{number}d",
   "relative_time.just_now": "niha",
   "relative_time.minutes": "{number}x",
   "relative_time.seconds": "{number}ç",
   "relative_time.today": "îro",
   "reply_indicator.cancel": "Dev jê berde",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "Yên din",
+  "report.categories.spam": "Nexwestî (Spam)",
+  "report.categories.violation": "Naverok yek an çend rêbazên rajekar binpê dike",
   "report.forward": "Biçe bo {target}",
   "report.forward_hint": "Ajimêr ji rajekarek din da ne. Tu kopîyeka anonîm ya raporê bişînî li wur?",
   "report.hint": "Ev rapor yê rajekarê lihevkarên te ra were şandin. Tu dikarî şiroveyekê pêşkêş bikî bê ka tu çima vê ajimêrê jor radigîhînî:",
@@ -407,14 +409,14 @@
   "status.delete": "Jê bibe",
   "status.detailed_status": "Dîtina axaftina berfireh",
   "status.direct": "Peyama rasterast @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "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.favourite": "Bijarte",
   "status.filtered": "Parzûnkirî",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} {date} afirand",
+  "status.history.edited": "{name} {date} serrast kir",
   "status.load_more": "Bêtir bar bike",
   "status.media_hidden": "Medya veşartî ye",
   "status.mention": "Qal @{name} bike",
@@ -451,9 +453,9 @@
   "tabs_bar.local_timeline": "Herêmî",
   "tabs_bar.notifications": "Agahdarî",
   "tabs_bar.search": "Bigere",
-  "time_remaining.days": "{number, plural, one {# roj} other {# roj}} mayî",
-  "time_remaining.hours": "{number, plural, one {# demjimêr} other {# demjimêr}} mayî",
-  "time_remaining.minutes": "{number, plural, one {# xulek} other {# xulek}} mayî",
+  "time_remaining.days": "{number, plural, one {# roj} other {# roj}} maye",
+  "time_remaining.hours": "{number, plural, one {# demjimêr} other {# demjimêr}} maye",
+  "time_remaining.minutes": "{number, plural, one {# xulek} other {# xulek}} maye",
   "time_remaining.moments": "Demên mayî",
   "time_remaining.seconds": "{number, plural, one {# çirke} other {# çirke}} maye",
   "timeline_hint.remote_resource_not_displayed": "{resource} Ji rajekerên din nayê dîtin.",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index cc6c34e4a..e877f8eab 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -308,6 +308,7 @@
   "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.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 613ef7600..b3aa2e6ab 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -47,8 +47,8 @@
   "account.unmute": "@{name} 뮤트 해제",
   "account.unmute_notifications": "@{name}의 알림 뮤트 해제",
   "account_note.placeholder": "클릭해서 노트 추가",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "가입 후 일별 사용자 유지율",
+  "admin.dashboard.monthly_retention": "가입 후 월별 사용자 유지율",
   "admin.dashboard.retention.average": "평균",
   "admin.dashboard.retention.cohort": "가입한 달",
   "admin.dashboard.retention.cohort_size": "새로운 사용자",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "단일 선택 투표로 변경",
   "compose_form.publish": "뿌우",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "변경사항 저장",
   "compose_form.sensitive.hide": "미디어를 민감함으로 설정하기",
   "compose_form.sensitive.marked": "미디어가 열람주의로 설정되어 있습니다",
   "compose_form.sensitive.unmarked": "미디어가 열람주의로 설정 되어 있지 않습니다",
@@ -308,6 +308,7 @@
   "notification.poll": "당신이 참여 한 투표가 종료되었습니다",
   "notification.reblog": "{name} 님이 부스트 했습니다",
   "notification.status": "{name} 님이 방금 게시물을 올렸습니다",
+  "notification.update": "{name} 님이 게시물을 수정했습니다",
   "notifications.clear": "알림 지우기",
   "notifications.clear_confirmation": "정말로 알림을 삭제하시겠습니까?",
   "notifications.column_settings.alert": "데스크탑 알림",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "새 게시물:",
   "notifications.column_settings.unread_notifications.category": "읽지 않은 알림",
   "notifications.column_settings.unread_notifications.highlight": "읽지 않은 알림 강조",
+  "notifications.column_settings.update": "수정내역:",
   "notifications.filter.all": "모두",
   "notifications.filter.boosts": "부스트",
   "notifications.filter.favourites": "즐겨찾기",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "불러오는 중…",
   "regeneration_indicator.sublabel": "당신의 홈 피드가 준비되는 중입니다!",
   "relative_time.days": "{number}일 전",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number} 일 전",
+  "relative_time.full.hours": "{number} 시간 전",
+  "relative_time.full.just_now": "방금 전",
+  "relative_time.full.minutes": "{number} 분 전",
+  "relative_time.full.seconds": "{number} 초 전",
   "relative_time.hours": "{number}시간 전",
   "relative_time.just_now": "방금",
   "relative_time.minutes": "{number}분 전",
   "relative_time.seconds": "{number}초 전",
   "relative_time.today": "오늘",
   "reply_indicator.cancel": "취소",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "기타",
+  "report.categories.spam": "스팸",
+  "report.categories.violation": "컨텐츠가 한 개 이상의 서버 규칙을 위반합니다",
   "report.forward": "{target}에 포워드 됨",
   "report.forward_hint": "이 계정은 다른 서버에 있습니다. 익명화 된 사본을 해당 서버에도 전송할까요?",
   "report.hint": "신고는 당신의 서버 스태프에게 전송 됩니다. 왜 이 계정을 신고하는 지에 대한 설명을 아래에 작성할 수 있습니다:",
@@ -407,14 +409,14 @@
   "status.delete": "삭제",
   "status.detailed_status": "대화 자세히 보기",
   "status.direct": "@{name}에게 다이렉트 메시지",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "수정",
+  "status.edited": "{date}에 편집됨",
+  "status.edited_x_times": "{count}번 수정됨",
   "status.embed": "공유하기",
   "status.favourite": "즐겨찾기",
   "status.filtered": "필터로 걸러짐",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} 님이 {date}에 생성함",
+  "status.history.edited": "{name} 님이 {date}에 수정함",
   "status.load_more": "더 보기",
   "status.media_hidden": "미디어 숨겨짐",
   "status.mention": "@{name}에게 글쓰기",
diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json
index 36b2ffef1..331ab57f0 100644
--- a/app/javascript/mastodon/locales/ku.json
+++ b/app/javascript/mastodon/locales/ku.json
@@ -308,6 +308,7 @@
   "notification.poll": "ڕاپرسییەک کە دەنگی پێداویت کۆتایی هات",
   "notification.reblog": "{name} نووسراوەکەتی دووبارە توتاند",
   "notification.status": "{name} تازە بڵاوکرایەوە",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "ئاگانامەکان بسڕیەوە",
   "notifications.clear_confirmation": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی هەموو ئاگانامەکانت بسڕیتەوە?",
   "notifications.column_settings.alert": "ئاگانامەکانی پیشانگەرر ڕومێزی",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "توتەکانی نوێ:",
   "notifications.column_settings.unread_notifications.category": "Unread notifications",
   "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "هەموو",
   "notifications.filter.boosts": "دووبارەتوتەکان",
   "notifications.filter.favourites": "دڵخوازەکان",
diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json
index c8638e56a..9a8c9685a 100644
--- a/app/javascript/mastodon/locales/kw.json
+++ b/app/javascript/mastodon/locales/kw.json
@@ -308,6 +308,7 @@
   "notification.poll": "An sondyans may hwrussowgh ragleva a worfennas",
   "notification.reblog": "{name} a generthas agas post",
   "notification.status": "{name} a wrug nowydh postya",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Dilea gwarnyansow",
   "notifications.clear_confirmation": "Owgh hwi sur a vynnes dilea agas gwarnyansow oll yn fast?",
   "notifications.column_settings.alert": "Gwarnyansow pennskrin",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Postow nowydh:",
   "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": "Oll",
   "notifications.filter.boosts": "Kenerthow",
   "notifications.filter.favourites": "Re drudh",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 1ed083f0c..c9f8f32d2 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -308,6 +308,7 @@
   "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.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index f8f61532a..955d2afa3 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -47,8 +47,8 @@
   "account.unmute": "Noņemt apklusinājumu @{name}",
   "account.unmute_notifications": "Rādīt paziņojumus no lietotāja @{name}",
   "account_note.placeholder": "Noklikšķiniet, lai pievienotu piezīmi",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "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",
   "admin.dashboard.retention.cohort": "Reģistrēšanās mēnesis",
   "admin.dashboard.retention.cohort_size": "Jauni lietotāji",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Maini aptaujas veidu, lai atļautu vienu izvēli",
   "compose_form.publish": "Taurēt",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Saglabāt izmaiņas",
   "compose_form.sensitive.hide": "{count, plural, one {Atzīmēt mediju kā sensitīvu} other {Atzīmēt medijus kā sensitīvus}}",
   "compose_form.sensitive.marked": "{count, plural, one {Medijs ir atzīmēts kā sensitīvs} other {Mediji ir atzīmēti kā sensitīvi}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Medijs nav atzīmēts kā sensitīvs} other {Mediji nav atzīmēti kā sensitīvi}}",
@@ -308,6 +308,7 @@
   "notification.poll": "Aprauja, kurā tu piedalījies, ir pabeigta",
   "notification.reblog": "{name} paaugstināja tavu ziņu",
   "notification.status": "{name} tikko publicēja",
+  "notification.update": "{name} ir rediģējis rakstu",
   "notifications.clear": "Notīrīt paziņojumus",
   "notifications.clear_confirmation": "Vai tiešām vēlies neatgriezeniski notīrīt visus savus paziņojumus?",
   "notifications.column_settings.alert": "Darbvirsmas paziņojumi",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Jaunas ziņas:",
   "notifications.column_settings.unread_notifications.category": "Nelasītie paziņojumi",
   "notifications.column_settings.unread_notifications.highlight": "Iezīmēt nelasītos paziņojumus",
+  "notifications.column_settings.update": "Labojumi:",
   "notifications.filter.all": "Visi",
   "notifications.filter.boosts": "Palielinājumi",
   "notifications.filter.favourites": "Izlases",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Ielādē…",
   "regeneration_indicator.sublabel": "Tiek gatavota tava plūsma!",
   "relative_time.days": "{number}d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# diena} other {# dienas}} atpakaļ",
+  "relative_time.full.hours": "{number, plural, one {# stunda} other {# stundas}} atpakaļ",
+  "relative_time.full.just_now": "tikko",
+  "relative_time.full.minutes": "{number, plural, one {# minūte} other {# minūtes}} atpakaļ",
+  "relative_time.full.seconds": "{number, plural, one {# sekunde} other {# sekundes}} atpakaļ",
   "relative_time.hours": "{number}st",
   "relative_time.just_now": "tagad",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
   "relative_time.today": "šodien",
   "reply_indicator.cancel": "Atcelt",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "Citi",
+  "report.categories.spam": "Spams",
+  "report.categories.violation": "Saturs pārkāpj vienu vai vairākus servera noteikumus",
   "report.forward": "Pārsūtīt {target}",
   "report.forward_hint": "Konts ir no cita servera. Vai nosūtīt anonimizētu ziņojuma kopiju arī tam?",
   "report.hint": "Pārskats tiks nosūtīts tava servera moderatoriem. Tu vari pievienot paskaidrojumu, kādēļ tu ziņo par kontu:",
@@ -407,14 +409,14 @@
   "status.delete": "Dzēst",
   "status.detailed_status": "Detalizēts sarunas skats",
   "status.direct": "Privāta ziņa @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Rediģēt",
+  "status.edited": "Rediģēts {date}",
+  "status.edited_x_times": "Rediģēts {count, plural, one {{count} reize} other {{count} reizes}}",
   "status.embed": "Iestrādāt",
   "status.favourite": "Iecienītā",
   "status.filtered": "Filtrēts",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} izveidots {date}",
+  "status.history.edited": "{name} rediģēts {date}",
   "status.load_more": "Ielādēt vairāk",
   "status.media_hidden": "Medijs ir paslēpts",
   "status.mention": "Pieminēt @{name}",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index ae925b391..609232e7a 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -308,6 +308,7 @@
   "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.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "Сите",
   "notifications.filter.boosts": "Бустови",
   "notifications.filter.favourites": "Омилени",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index b17642b3c..e85a5ff75 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -308,6 +308,7 @@
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} നിങ്ങളുടെ പോസ്റ്റ് ബൂസ്റ്റ് ചെയ്തു",
   "notification.status": "{name} ഇപ്പോൾ പോസ്റ്റുചെയ്‌തു",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "അറിയിപ്പ് മായ്ക്കുക",
   "notifications.clear_confirmation": "നിങ്ങളുടെ എല്ലാ അറിയിപ്പുകളും ശാശ്വതമായി മായ്‌ക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?",
   "notifications.column_settings.alert": "ഡെസ്ക്ടോപ്പ് അറിയിപ്പുകൾ",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "പുതിയ ടൂട്ടുകൾ:",
   "notifications.column_settings.unread_notifications.category": "Unread notifications",
   "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "എല്ലാം",
   "notifications.filter.boosts": "ബൂസ്റ്റുകൾ",
   "notifications.filter.favourites": "പ്രിയപ്പെട്ടവ",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index 14e5d2de9..ee3e21bf8 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -308,6 +308,7 @@
   "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.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 5db089d5a..c50e442c1 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -308,6 +308,7 @@
   "notification.poll": "Sebuah undian yang anda undi telah tamat",
   "notification.reblog": "{name} menggalak hantaran anda",
   "notification.status": "{name} baru sahaja mengirim hantaran",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Buang pemberitahuan",
   "notifications.clear_confirmation": "Adakah anda pasti anda ingin membuang semua pemberitahuan anda secara kekal?",
   "notifications.column_settings.alert": "Pemberitahuan atas meja",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Hantaran baharu:",
   "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": "Semua",
   "notifications.filter.boosts": "Galakan",
   "notifications.filter.favourites": "Kegemaran",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index ec4e4aabd..f636d4d24 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -308,6 +308,7 @@
   "notification.poll": "Een poll waaraan jij hebt meegedaan is beëindigd",
   "notification.reblog": "{name} boostte jouw toot",
   "notification.status": "{name} heeft zojuist een toot geplaatst",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Meldingen verwijderen",
   "notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?",
   "notifications.column_settings.alert": "Desktopmeldingen",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Nieuwe toots:",
   "notifications.column_settings.unread_notifications.category": "Ongelezen meldingen",
   "notifications.column_settings.unread_notifications.highlight": "Ongelezen meldingen markeren",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Alles",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favorieten",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index 17e1a4d25..d85cb3e20 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -308,6 +308,7 @@
   "notification.poll": "Ei rundspørjing du har røysta i er ferdig",
   "notification.reblog": "{name} framheva statusen din",
   "notification.status": "{name} la nettopp ut",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Tøm varsel",
   "notifications.clear_confirmation": "Er du sikker på at du vil fjerna alle varsla dine for alltid?",
   "notifications.column_settings.alert": "Skrivebordsvarsel",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Nye tuter:",
   "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": "Alle",
   "notifications.filter.boosts": "Framhevingar",
   "notifications.filter.favourites": "Favorittar",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 0ede09267..2948a0586 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -308,6 +308,7 @@
   "notification.poll": "En avstemning du har stemt på har avsluttet",
   "notification.reblog": "{name} fremhevde din status",
   "notification.status": "{name} la nettopp ut",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Fjern varsler",
   "notifications.clear_confirmation": "Er du sikker på at du vil fjerne alle dine varsler permanent?",
   "notifications.column_settings.alert": "Skrivebordsvarslinger",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Nye tuter:",
   "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": "Alle",
   "notifications.filter.boosts": "Fremhevinger",
   "notifications.filter.favourites": "Favoritter",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 7e7b68f77..65ba8aeb6 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -308,6 +308,7 @@
   "notification.poll": "Avètz participat a un sondatge que ven de s’acabar",
   "notification.reblog": "{name} a partejat vòstre estatut",
   "notification.status": "{name} ven de publicar",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Escafar",
   "notifications.clear_confirmation": "Volètz vertadièrament escafar totas vòstras las notificacions ?",
   "notifications.column_settings.alert": "Notificacions localas",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Tuts novèls :",
   "notifications.column_settings.unread_notifications.category": "Notificacions pas legidas",
   "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Totas",
   "notifications.filter.boosts": "Partages",
   "notifications.filter.favourites": "Favorits",
diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json
index 2675da68c..5456eb88e 100644
--- a/app/javascript/mastodon/locales/pa.json
+++ b/app/javascript/mastodon/locales/pa.json
@@ -308,6 +308,7 @@
   "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.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 07754475f..c33275866 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -109,7 +109,7 @@
   "compose_form.poll.switch_to_single": "Pozwól na wybranie tylko jednej opcji",
   "compose_form.publish": "Wyślij",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "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",
@@ -313,6 +313,7 @@
   "notification.poll": "Głosowanie w którym brałeś(-aś) udział zakończyło się",
   "notification.reblog": "{name} podbił(a) Twój wpis",
   "notification.status": "{name} właśnie utworzył(a) wpis",
+  "notification.update": "{name} edytował post",
   "notifications.clear": "Wyczyść powiadomienia",
   "notifications.clear_confirmation": "Czy na pewno chcesz bezpowrotnie usunąć wszystkie powiadomienia?",
   "notifications.column_settings.alert": "Powiadomienia na pulpicie",
@@ -331,6 +332,7 @@
   "notifications.column_settings.status": "Nowe wpisy:",
   "notifications.column_settings.unread_notifications.category": "Nieprzeczytane powiadomienia",
   "notifications.column_settings.unread_notifications.highlight": "Podświetl nieprzeczytane powiadomienia",
+  "notifications.column_settings.update": "Edycje:",
   "notifications.filter.all": "Wszystkie",
   "notifications.filter.boosts": "Podbicia",
   "notifications.filter.favourites": "Ulubione",
@@ -370,20 +372,20 @@
   "regeneration_indicator.label": "Ładuję…",
   "regeneration_indicator.sublabel": "Twoja oś czasu jest przygotowywana!",
   "relative_time.days": "{number} dni",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# dzień} few {# dni} many {# dni} other {# dni}} temu",
+  "relative_time.full.hours": "{number, plural, one {# godzinę} few {# godziny} many {# godzin} other {# godzin}} temu",
+  "relative_time.full.just_now": "przed chwilą",
+  "relative_time.full.minutes": "{number, plural, one {# minutę} few {# minuty} many {# minut} other {# minut}} temu",
+  "relative_time.full.seconds": "{number, plural, one {# sekundę} few {# sekundy} many {# sekund} other {# sekund}} temu",
   "relative_time.hours": "{number} godz.",
   "relative_time.just_now": "teraz",
   "relative_time.minutes": "{number} min.",
   "relative_time.seconds": "{number} s.",
   "relative_time.today": "dzisiaj",
   "reply_indicator.cancel": "Anuluj",
-  "report.categories.other": "Other",
+  "report.categories.other": "Inne",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "Zawartość narusza co najmniej jedną zasadę serwera",
   "report.forward": "Przekaż na {target}",
   "report.forward_hint": "To konto znajduje się na innej instancji. Czy chcesz wysłać anonimową kopię zgłoszenia rnież na nią?",
   "report.hint": "Zgłoszenie zostanie wysłane moderatorom Twojego serwera. Poniżej możesz też umieścić wyjaśnienie dlaczego zgłaszasz to konto:",
@@ -412,8 +414,8 @@
   "status.delete": "Usuń",
   "status.detailed_status": "Szczegółowy widok konwersacji",
   "status.direct": "Wyślij wiadomość bezpośrednią do @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
+  "status.edit": "Edytuj",
+  "status.edited": "Edytowano {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
   "status.embed": "Osadź",
   "status.favourite": "Dodaj do ulubionych",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index e61c3ef5a..be49f2b4e 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -308,6 +308,7 @@
   "notification.poll": "Uma enquete que você votou terminou",
   "notification.reblog": "{name} deu boost no teu toot",
   "notification.status": "{name} acabou de tootar",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Limpar notificações",
   "notifications.clear_confirmation": "Você tem certeza de que deseja limpar todas as suas notificações?",
   "notifications.column_settings.alert": "Notificações no computador",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Novos toots:",
   "notifications.column_settings.unread_notifications.category": "Notificações não lidas",
   "notifications.column_settings.unread_notifications.highlight": "Destacar notificações não lidas",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Tudo",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favoritos",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index 988ecef3a..531265706 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -47,8 +47,8 @@
   "account.unmute": "Não silenciar @{name}",
   "account.unmute_notifications": "Deixar de silenciar @{name}",
   "account_note.placeholder": "Clique para adicionar nota",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Taxa de retenção de utilizadores por dia após a inscrição",
+  "admin.dashboard.monthly_retention": "Taxa de retenção de utilizadores por mês após a inscrição",
   "admin.dashboard.retention.average": "Média",
   "admin.dashboard.retention.cohort": "Mês de inscrição",
   "admin.dashboard.retention.cohort_size": "Novos utilizadores",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Alterar a votação para permitir uma única escolha",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Guardar alterações",
   "compose_form.sensitive.hide": "Marcar media como sensível",
   "compose_form.sensitive.marked": "Media marcada como sensível",
   "compose_form.sensitive.unmarked": "Media não está marcada como sensível",
@@ -308,6 +308,7 @@
   "notification.poll": "Uma votação em que participaste chegou ao fim",
   "notification.reblog": "{name} partilhou a tua publicação",
   "notification.status": "{name} acabou de publicar",
+  "notification.update": "{name} editou uma publicação",
   "notifications.clear": "Limpar notificações",
   "notifications.clear_confirmation": "Queres mesmo limpar todas as notificações?",
   "notifications.column_settings.alert": "Notificações no ambiente de trabalho",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Novos toots:",
   "notifications.column_settings.unread_notifications.category": "Notificações não lidas",
   "notifications.column_settings.unread_notifications.highlight": "Destacar notificações não lidas",
+  "notifications.column_settings.update": "Edições:",
   "notifications.filter.all": "Todas",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favoritos",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "A carregar…",
   "regeneration_indicator.sublabel": "A tua página inicial está a ser preparada!",
   "relative_time.days": "{number}d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural,one {# dia} other {# dias}} atrás",
+  "relative_time.full.hours": "{number, plural,one {# hora}other {# horas}} atrás",
+  "relative_time.full.just_now": "agora mesmo",
+  "relative_time.full.minutes": "{number, plural,one {# minuto}other {# minutos}} atrás",
+  "relative_time.full.seconds": "{number, plural,one {# segundo} other {# segundos}} atrás",
   "relative_time.hours": "{number}h",
   "relative_time.just_now": "agora",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
   "relative_time.today": "hoje",
   "reply_indicator.cancel": "Cancelar",
-  "report.categories.other": "Other",
+  "report.categories.other": "Outro",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "O conteúdo viola uma ou mais regras do servidor",
   "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.hint": "A denúncia será enviada para os moderadores do seu servidor. Pode fornecer, em baixo, uma explicação do motivo pelo qual está a denunciar esta conta:",
@@ -407,14 +409,14 @@
   "status.delete": "Eliminar",
   "status.detailed_status": "Vista de conversação detalhada",
   "status.direct": "Mensagem direta @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "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.filtered": "Filtrada",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} criado em {date}",
+  "status.history.edited": "{name} editado em {date}",
   "status.load_more": "Carregar mais",
   "status.media_hidden": "Media escondida",
   "status.mention": "Mencionar @{name}",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index 15baeef12..1a6e19713 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -308,6 +308,7 @@
   "notification.poll": "Un sondaj pentru care ai votat s-a încheiat",
   "notification.reblog": "{name} ți-a distribuit postarea",
   "notification.status": "{name} tocmai a postat",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Șterge notificările",
   "notifications.clear_confirmation": "Ești sigur că vrei să ștergi permanent toate notificările?",
   "notifications.column_settings.alert": "Notificări pe desktop",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Postări noi:",
   "notifications.column_settings.unread_notifications.category": "Notificări necitite",
   "notifications.column_settings.unread_notifications.highlight": "Evidențiază notificările necitite",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Toate",
   "notifications.filter.boosts": "Distribuiri",
   "notifications.filter.favourites": "Favorite",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index c414f9e7c..a0438ceb5 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -35,7 +35,7 @@
   "account.never_active": "Никогда",
   "account.posts": "Посты",
   "account.posts_with_replies": "Посты и ответы",
-  "account.report": "Жалоба №{name}",
+  "account.report": "Пожаловаться на @{name}",
   "account.requested": "Ожидает подтверждения. Нажмите для отмены запроса",
   "account.share": "Поделиться профилем @{name}",
   "account.show_reblogs": "Показывать продвижения от @{name}",
@@ -47,8 +47,8 @@
   "account.unmute": "Убрать {name} из игнорируемых",
   "account.unmute_notifications": "Показывать уведомления от @{name}",
   "account_note.placeholder": "Текст заметки",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Уровень удержания пользователей после регистрации, в днях",
+  "admin.dashboard.monthly_retention": "Уровень удержания пользователей после регистрации, в месяцах",
   "admin.dashboard.retention.average": "Среднее",
   "admin.dashboard.retention.cohort": "Месяц регистрации",
   "admin.dashboard.retention.cohort_size": "Новые пользователи",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Переключить в режим выбора одного ответа",
   "compose_form.publish": "Запостить",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Сохранить",
   "compose_form.sensitive.hide": "{count, plural, one {Отметить медифайл как деликатный} other {Отметить медифайлы как деликатные}}",
   "compose_form.sensitive.marked": "Медиа{count, plural, =1 {файл отмечен} other {файлы отмечены}} как «деликатного характера»",
   "compose_form.sensitive.unmarked": "Медиа{count, plural, =1 {файл не отмечен} other {файлы не отмечены}} как «деликатного характера»",
@@ -308,6 +308,7 @@
   "notification.poll": "Опрос, в котором вы приняли участие, завершился",
   "notification.reblog": "{name} продвинул(а) ваш пост",
   "notification.status": "{name} только что запостил",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Очистить уведомления",
   "notifications.clear_confirmation": "Вы уверены, что хотите очистить все уведомления?",
   "notifications.column_settings.alert": "Уведомления на рабочем столе",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Новые посты:",
   "notifications.column_settings.unread_notifications.category": "Непрочитанные уведомления",
   "notifications.column_settings.unread_notifications.highlight": "Выделять непрочитанные уведомления",
+  "notifications.column_settings.update": "Изменения:",
   "notifications.filter.all": "Все",
   "notifications.filter.boosts": "Продвижения",
   "notifications.filter.favourites": "Отметки «избранного»",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Загрузка…",
   "regeneration_indicator.sublabel": "Один момент, мы подготавливаем вашу ленту!",
   "relative_time.days": "{number} д",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# день} many {# дней} other {# дня}} назад",
+  "relative_time.full.hours": "{number, plural, one {# час} many {# часов} other {# часа}} назад",
+  "relative_time.full.just_now": "только что",
+  "relative_time.full.minutes": "{number, plural, one {# минуту} many {# минут} other {# минуты}} назад",
+  "relative_time.full.seconds": "{number, plural, one {# секунду} many {# секунд} other {# секунды}} назад",
   "relative_time.hours": "{number} ч",
   "relative_time.just_now": "только что",
   "relative_time.minutes": "{number} мин",
   "relative_time.seconds": "{number} с",
   "relative_time.today": "сегодня",
   "reply_indicator.cancel": "Отмена",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "Другое",
+  "report.categories.spam": "Спам",
+  "report.categories.violation": "Содержимое нарушает одно или несколько правил узла",
   "report.forward": "Переслать в {target}",
   "report.forward_hint": "Эта учётная запись расположена на другом узле. Отправить туда анонимную копию вашей жалобы?",
   "report.hint": "Жалоба будет отправлена модераторам вашего узла. Вы также можете указать подробную причину жалобы ниже:",
@@ -407,14 +409,14 @@
   "status.delete": "Удалить",
   "status.detailed_status": "Подробный просмотр обсуждения",
   "status.direct": "Написать @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Изменить",
+  "status.edited": "Последнее изменение: {date}",
+  "status.edited_x_times": "{count, plural, one {{count} изменение} many {{count} изменений} other {{count} изменения}}",
   "status.embed": "Встроить на свой сайт",
   "status.favourite": "В избранное",
   "status.filtered": "Отфильтровано",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} создал {date}",
+  "status.history.edited": "{name} отредактировал {date}",
   "status.load_more": "Загрузить остальное",
   "status.media_hidden": "Файл скрыт",
   "status.mention": "Упомянуть @{name}",
@@ -460,7 +462,7 @@
   "timeline_hint.resources.followers": "подписчиков",
   "timeline_hint.resources.follows": "подписки",
   "timeline_hint.resources.statuses": "прошлые посты",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} человек обсуждает} few {{counter} человека обсуждает} many {{counter} человек обсуждают} other {{counter} обсуждают}} ",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} человек обсуждает} few {{counter} человека обсуждают} many {{counter} человек обсуждают} other {{counter} человека обсуждает}}",
   "trends.trending_now": "Самое актуальное",
   "ui.beforeunload": "Ваш черновик будет утерян, если вы покинете Mastodon.",
   "units.short.billion": "{count} млрд",
diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json
index a2a22e758..357a69187 100644
--- a/app/javascript/mastodon/locales/sa.json
+++ b/app/javascript/mastodon/locales/sa.json
@@ -308,6 +308,7 @@
   "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.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json
index 4f8f12357..467857136 100644
--- a/app/javascript/mastodon/locales/sc.json
+++ b/app/javascript/mastodon/locales/sc.json
@@ -308,6 +308,7 @@
   "notification.poll": "Unu sondàgiu in su chi as votadu est acabbadu",
   "notification.reblog": "{name} at cumpartzidu sa publicatzione tua",
   "notification.status": "{name} at publicadu cosa",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Lìmpia notìficas",
   "notifications.clear_confirmation": "Seguru chi boles isboidare in manera permanente totu is notìficas tuas?",
   "notifications.column_settings.alert": "Notìficas de iscrivania",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Publicatziones noas:",
   "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": "Totus",
   "notifications.filter.boosts": "Cumpartziduras",
   "notifications.filter.favourites": "Preferidos",
diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json
index 40939f1b2..c90c785fb 100644
--- a/app/javascript/mastodon/locales/si.json
+++ b/app/javascript/mastodon/locales/si.json
@@ -308,6 +308,7 @@
   "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": "දැනුම්දීම් හිස්කරන්න",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "සියල්ල",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "ප්‍රියතමයන්",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 34c3da043..f0833ff70 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -308,6 +308,7 @@
   "notification.poll": "Anketa v ktorej si hlasoval/a sa skončila",
   "notification.reblog": "{name} zdieľal/a tvoj príspevok",
   "notification.status": "{name} práve uverejnil/a",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Vyčisti oboznámenia",
   "notifications.clear_confirmation": "Naozaj chceš nenávratne prečistiť všetky tvoje oboznámenia?",
   "notifications.column_settings.alert": "Oboznámenia na ploche",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Nové príspevky:",
   "notifications.column_settings.unread_notifications.category": "Neprečítané oboznámenia",
   "notifications.column_settings.unread_notifications.highlight": "Zdôrazni neprečítané oboznámenia",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Všetky",
   "notifications.filter.boosts": "Vyzdvihnutia",
   "notifications.filter.favourites": "Obľúbené",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 212e9256c..f69d986fb 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Spremenite anketo, da omogočite eno izbiro",
   "compose_form.publish": "Tutni",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Shrani spremembe",
   "compose_form.sensitive.hide": "Označi medij kot občutljiv",
   "compose_form.sensitive.marked": "Medij je označen kot občutljiv",
   "compose_form.sensitive.unmarked": "Medij ni označen kot občutljiv",
@@ -308,6 +308,7 @@
   "notification.poll": "Glasovanje, v katerem ste sodelovali, se je končalo",
   "notification.reblog": "{name} je spodbudil/a vaš status",
   "notification.status": "{name} je pravkar objavil/a",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Počisti obvestila",
   "notifications.clear_confirmation": "Ali ste prepričani, da želite trajno izbrisati vsa vaša obvestila?",
   "notifications.column_settings.alert": "Namizna obvestila",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "New toots:",
   "notifications.column_settings.unread_notifications.category": "Neprebrana obvestila",
   "notifications.column_settings.unread_notifications.highlight": "Poudari neprebrana obvestila",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Vse",
   "notifications.filter.boosts": "Spodbude",
   "notifications.filter.favourites": "Priljubljeni",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Nalaganje…",
   "regeneration_indicator.sublabel": "Vaš domači vir se pripravlja!",
   "relative_time.days": "{number}d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {pred # dnem} two {pred # dnevoma} few {pred # dnevi} other {pred # dnevi}}",
+  "relative_time.full.hours": "{number, plural, one {pred # uro} two {pred # urama} few {pred # urami} other {pred # urami}}",
+  "relative_time.full.just_now": "pravkar",
+  "relative_time.full.minutes": "{number, plural, one {pred # minuto} two {pred # minutama} few {pred # minutami} other {pred # minutami}}",
+  "relative_time.full.seconds": "{number, plural, one {pred # sekundo} two {pred # sekundama} few {pred # sekundami} other {pred # sekundami}}",
   "relative_time.hours": "{number}u",
   "relative_time.just_now": "zdaj",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
   "relative_time.today": "danes",
   "reply_indicator.cancel": "Prekliči",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "Drugo",
+  "report.categories.spam": "Neželeno",
+  "report.categories.violation": "Vsebina krši eno ali več pravil strežnika",
   "report.forward": "Posreduj do {target}",
   "report.forward_hint": "Račun je iz drugega strežnika. Pošljem anonimno kopijo poročila tudi na drugi strežnik?",
   "report.hint": "Poročilo bo poslano moderatorjem vašega vozlišča. Spodaj lahko navedete, zakaj prijavljate ta račun:",
@@ -407,14 +409,14 @@
   "status.delete": "Izbriši",
   "status.detailed_status": "Podroben pogled pogovora",
   "status.direct": "Neposredno sporočilo @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Uredi",
+  "status.edited": "Urejeno {date}",
+  "status.edited_x_times": "Urejeno {count, plural, one {#-krat} two {#-krat} few {#-krat} other {#-krat}}",
   "status.embed": "Vgradi",
   "status.favourite": "Priljubljen",
   "status.filtered": "Filtrirano",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name}: ustvarjeno {date}",
+  "status.history.edited": "{name}: urejeno {date}",
   "status.load_more": "Naloži več",
   "status.media_hidden": "Mediji so skriti",
   "status.mention": "Omeni @{name}",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 2a9a12e17..fb6bbac75 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -47,8 +47,8 @@
   "account.unmute": "Ktheji zërin @{name}",
   "account.unmute_notifications": "Hiqua ndalimin e shfaqjes njoftimeve nga @{name}",
   "account_note.placeholder": "Klikoni për të shtuar shënim",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Shkallë mbajtjeje përdoruesi, në ditë, pas regjistrimit",
+  "admin.dashboard.monthly_retention": "Shkallë mbajtjeje përdoruesi, në muaj, pas regjistrimit",
   "admin.dashboard.retention.average": "Mesatare",
   "admin.dashboard.retention.cohort": "Muaj regjistrimi",
   "admin.dashboard.retention.cohort_size": "Përdorues të rinj",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Ndrysho votimin për të lejuar vetëm një zgjedhje",
   "compose_form.publish": "Mesazh",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Ruaji ndryshimet",
   "compose_form.sensitive.hide": "{count, plural, one {Vëri shenjë medias si rezervat} other {Vëru shenjë mediave si rezervat}}",
   "compose_form.sensitive.marked": "{count, plural, one {Medias i është vënë shenjë rezervat} other {Mediave u është vënë shenjë si rezervat}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Media s’ka shenjë si rezervat} other {Mediat s’kanë shenja si rezervat}}",
@@ -308,6 +308,7 @@
   "notification.poll": "Ka përfunduar një pyetësor ku keni votuar",
   "notification.reblog": "{name} përforcoi mesazhin tuaj",
   "notification.status": "{name} sapo postoi",
+  "notification.update": "{name} përpunoi një postim",
   "notifications.clear": "Spastroji njoftimet",
   "notifications.clear_confirmation": "Jeni i sigurt se doni të spastrohen përgjithmonë krejt njoftimet tuaja?",
   "notifications.column_settings.alert": "Njoftime desktopi",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Mesazhe të rinj:",
   "notifications.column_settings.unread_notifications.category": "Njoftime të palexuara",
   "notifications.column_settings.unread_notifications.highlight": "Theksoji njoftimet e palexuara",
+  "notifications.column_settings.update": "Përpunime:",
   "notifications.filter.all": "Krejt",
   "notifications.filter.boosts": "Përforcime",
   "notifications.filter.favourites": "Të parapëlqyer",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Po ngarkohet…",
   "regeneration_indicator.sublabel": "Prurja juaj vetjake po përgatitet!",
   "relative_time.days": "{number}d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# ditë} other {# ditë}} më parë",
+  "relative_time.full.hours": "{number, plural, one {# orë} other {# orë}} më parë",
+  "relative_time.full.just_now": "mu tani",
+  "relative_time.full.minutes": "{number, plural, one {# minutë} other {# minuta}} më parë",
+  "relative_time.full.seconds": "{number, plural, one {# sekondë} other {# sekonda}} më parë",
   "relative_time.hours": "{number}o",
   "relative_time.just_now": "tani",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
   "relative_time.today": "sot",
   "reply_indicator.cancel": "Anuloje",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "Tjetër",
+  "report.categories.spam": "I padëshiruar",
+  "report.categories.violation": "Lënda shkel një ose disa rregulla shërbyesi",
   "report.forward": "Përcillja {target}",
   "report.forward_hint": "Llogaria është nga një shërbyes tjetër. Të dërgohet edhe një kopje e anonimizuar e raportimit?",
   "report.hint": "Raportimi do t’u dërgohet moderatorëve të shërbyesit tuaj. Më poshtë mund të jepni një shpjegim se pse po e raportoni këtë llogari:",
@@ -407,14 +409,14 @@
   "status.delete": "Fshije",
   "status.detailed_status": "Pamje e hollësishme bisede",
   "status.direct": "Mesazh i drejtpërdrejtë për @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Përpunojeni",
+  "status.edited": "Përpunuar më {date}",
+  "status.edited_x_times": "Përpunuar {count, plural, one {{count} herë} other {{count} herë}}",
   "status.embed": "Trupëzim",
   "status.favourite": "I parapëlqyer",
   "status.filtered": "I filtruar",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} u krijua më {date}",
+  "status.history.edited": "{name} u përpunua më {date}",
   "status.load_more": "Ngarko më tepër",
   "status.media_hidden": "Me media të fshehur",
   "status.mention": "Përmendni @{name}",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index c12cad908..37fbd7666 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -308,6 +308,7 @@
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} je podržao(la) Vaš status",
   "notification.status": "{name} just posted",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Očisti obaveštenja",
   "notifications.clear_confirmation": "Da li ste sigurno da trajno želite da očistite Vaša obaveštenja?",
   "notifications.column_settings.alert": "Obaveštenja na radnoj površini",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index fb94b0098..429d4c697 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -308,6 +308,7 @@
   "notification.poll": "Завршена је анкета у којој сте гласали",
   "notification.reblog": "{name} је подржао/ла Ваш статус",
   "notification.status": "{name} управо објавио",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "Очисти обавештења",
   "notifications.clear_confirmation": "Да ли сте сигурно да трајно желите да очистите Ваша обавештења?",
   "notifications.column_settings.alert": "Обавештења на радној површини",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Нови тутови:",
   "notifications.column_settings.unread_notifications.category": "Unread notifications",
   "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Све",
   "notifications.filter.boosts": "Подршки",
   "notifications.filter.favourites": "Омиљене",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 47d70fb54..ac3179df1 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -47,8 +47,8 @@
   "account.unmute": "Sluta tysta @{name}",
   "account.unmute_notifications": "Återaktivera aviseringar från @{name}",
   "account_note.placeholder": "Klicka för att lägga till anteckning",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Användarlojalitet per dag efter registrering",
+  "admin.dashboard.monthly_retention": "Användarlojalitet per månad efter registrering",
   "admin.dashboard.retention.average": "Genomsnittlig",
   "admin.dashboard.retention.cohort": "Registreringsmånad",
   "admin.dashboard.retention.cohort_size": "Nya användare",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Ändra enkät för att tillåta ett enda val",
   "compose_form.publish": "Tut",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Spara ändringar",
   "compose_form.sensitive.hide": "Markera media som känsligt",
   "compose_form.sensitive.marked": "Media har markerats som känsligt",
   "compose_form.sensitive.unmarked": "Media är inte markerat som känsligt",
@@ -308,6 +308,7 @@
   "notification.poll": "En omröstning du röstat i har avslutats",
   "notification.reblog": "{name} knuffade din status",
   "notification.status": "{name} skrev just",
+  "notification.update": "{name} redigerade ett inlägg",
   "notifications.clear": "Rensa aviseringar",
   "notifications.clear_confirmation": "Är du säker på att du vill rensa alla dina aviseringar permanent?",
   "notifications.column_settings.alert": "Skrivbordsaviseringar",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Nya tutor:",
   "notifications.column_settings.unread_notifications.category": "O-lästa aviseringar",
   "notifications.column_settings.unread_notifications.highlight": "Markera o-lästa aviseringar",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "Alla",
   "notifications.filter.boosts": "Knuffar",
   "notifications.filter.favourites": "Favoriter",
@@ -365,19 +367,19 @@
   "regeneration_indicator.label": "Laddar…",
   "regeneration_indicator.sublabel": "Ditt hemmaflöde förbereds!",
   "relative_time.days": "{number}d",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
+  "relative_time.full.days": "{number, plural, one {# dag} other {# dagar}} sedan",
+  "relative_time.full.hours": "{number, plural, one {# timme} other {# timmar}} sedan",
   "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.minutes": "{number, plural, one {# minut} other {# minuter}} sedan",
+  "relative_time.full.seconds": "{number, plural, one {# sekund} other {# sekunder}} sedan",
   "relative_time.hours": "{number}tim",
   "relative_time.just_now": "nu",
   "relative_time.minutes": "{number}min",
   "relative_time.seconds": "{number}sek",
   "relative_time.today": "idag",
   "reply_indicator.cancel": "Ångra",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
+  "report.categories.other": "Övrigt",
+  "report.categories.spam": "Skräppost",
   "report.categories.violation": "Content violates one or more server rules",
   "report.forward": "Vidarebefordra till {target}",
   "report.forward_hint": "Kontot är från en annan server. Skicka även en anonymiserad kopia av anmälan dit?",
@@ -407,9 +409,9 @@
   "status.delete": "Radera",
   "status.detailed_status": "Detaljerad samtalsvy",
   "status.direct": "Direktmeddela @{name}",
-  "status.edit": "Edit",
+  "status.edit": "Redigera",
   "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edited_x_times": "Redigerad {count, plural, one {{count} gång} other {{count} gånger}}",
   "status.embed": "Bädda in",
   "status.favourite": "Favorit",
   "status.filtered": "Filtrerat",
diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json
index 2675da68c..5456eb88e 100644
--- a/app/javascript/mastodon/locales/szl.json
+++ b/app/javascript/mastodon/locales/szl.json
@@ -308,6 +308,7 @@
   "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.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 2e329f270..d624df36a 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -308,6 +308,7 @@
   "notification.poll": "நீங்கள் வாக்களித்த வாக்கெடுப்பு முடிவடைந்தது",
   "notification.reblog": "{name} உங்கள் நிலை அதிகரித்தது",
   "notification.status": "{name} just posted",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "அறிவிப்புகளை அழிக்கவும்",
   "notifications.clear_confirmation": "உங்கள் எல்லா அறிவிப்புகளையும் நிரந்தரமாக அழிக்க விரும்புகிறீர்களா?",
   "notifications.column_settings.alert": "டெஸ்க்டாப் அறிவிப்புகள்",
@@ -326,6 +327,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.filter.all": "எல்லா",
   "notifications.filter.boosts": "மதிப்பை உயர்த்து",
   "notifications.filter.favourites": "விருப்பத்துக்குகந்த",
diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json
index 6ef519315..5fe5cfdea 100644
--- a/app/javascript/mastodon/locales/tai.json
+++ b/app/javascript/mastodon/locales/tai.json
@@ -308,6 +308,7 @@
   "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.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index b84ee23ec..2901689d1 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -308,6 +308,7 @@
   "notification.poll": "మీరు పాల్గొనిన ఎన్సిక ముగిసినది",
   "notification.reblog": "{name} మీ స్టేటస్ ను బూస్ట్ చేసారు",
   "notification.status": "{name} just posted",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "ప్రకటనలను తుడిచివేయు",
   "notifications.clear_confirmation": "మీరు మీ అన్ని నోటిఫికేషన్లను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?",
   "notifications.column_settings.alert": "డెస్క్టాప్ నోటిఫికేషన్లు",
@@ -326,6 +327,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.filter.all": "అన్నీ",
   "notifications.filter.boosts": "బూస్ట్లు",
   "notifications.filter.favourites": "ఇష్టాలు",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 27bcbc4bb..bef3af46f 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดี่ยว",
   "compose_form.publish": "โพสต์",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "บันทึกการเปลี่ยนแปลง",
   "compose_form.sensitive.hide": "{count, plural, other {ทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
   "compose_form.sensitive.marked": "{count, plural, other {มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
   "compose_form.sensitive.unmarked": "{count, plural, other {ไม่มีการทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
@@ -132,7 +132,7 @@
   "confirmations.redraft.confirm": "ลบแล้วร่างใหม่",
   "confirmations.redraft.message": "คุณแน่ใจหรือไม่ว่าต้องการลบโพสต์นี้แล้วร่างโพสต์ใหม่? รายการโปรดและการดันจะหายไป และการตอบกลับโพสต์ดั้งเดิมจะไม่มีความเกี่ยวพัน",
   "confirmations.reply.confirm": "ตอบกลับ",
-  "confirmations.reply.message": "การตอบกลับตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
+  "confirmations.reply.message": "การตอบกลับในตอนนี้จะเขียนทับข้อความที่คุณกำลังเขียน คุณแน่ใจหรือไม่ว่าต้องการดำเนินการต่อ?",
   "confirmations.unfollow.confirm": "เลิกติดตาม",
   "confirmations.unfollow.message": "คุณแน่ใจหรือไม่ว่าต้องการเลิกติดตาม {name}?",
   "conversation.delete": "ลบการสนทนา",
@@ -308,6 +308,7 @@
   "notification.poll": "การสำรวจความคิดเห็นที่คุณได้ลงคะแนนได้สิ้นสุดแล้ว",
   "notification.reblog": "{name} ได้ดันโพสต์ของคุณ",
   "notification.status": "{name} เพิ่งโพสต์",
+  "notification.update": "{name} ได้แก้ไขโพสต์",
   "notifications.clear": "ล้างการแจ้งเตือน",
   "notifications.clear_confirmation": "คุณแน่ใจหรือไม่ว่าต้องการล้างการแจ้งเตือนทั้งหมดของคุณอย่างถาวร?",
   "notifications.column_settings.alert": "การแจ้งเตือนบนเดสก์ท็อป",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "โพสต์ใหม่:",
   "notifications.column_settings.unread_notifications.category": "การแจ้งเตือนที่ยังไม่ได้อ่าน",
   "notifications.column_settings.unread_notifications.highlight": "เน้นการแจ้งเตือนที่ยังไม่ได้อ่าน",
+  "notifications.column_settings.update": "การแก้ไข:",
   "notifications.filter.all": "ทั้งหมด",
   "notifications.filter.boosts": "การดัน",
   "notifications.filter.favourites": "รายการโปรด",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "กำลังโหลด…",
   "regeneration_indicator.sublabel": "กำลังเตรียมฟีดหน้าแรกของคุณ!",
   "relative_time.days": "{number} วัน",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, other {# วัน}}ที่แล้ว",
+  "relative_time.full.hours": "{number, plural, other {# ชั่วโมง}}ที่แล้ว",
+  "relative_time.full.just_now": "เมื่อกี้นี้",
+  "relative_time.full.minutes": "{number, plural, other {# นาที}}ที่แล้ว",
+  "relative_time.full.seconds": "{number, plural, other {# วินาที}}ที่แล้ว",
   "relative_time.hours": "{number} ชั่วโมง",
   "relative_time.just_now": "ตอนนี้",
   "relative_time.minutes": "{number} นาที",
   "relative_time.seconds": "{number} วินาที",
   "relative_time.today": "วันนี้",
   "reply_indicator.cancel": "ยกเลิก",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "อื่น ๆ",
+  "report.categories.spam": "สแปม",
+  "report.categories.violation": "เนื้อหาละเมิดหนึ่งกฎของเซิร์ฟเวอร์หรือมากกว่า",
   "report.forward": "ส่งต่อไปยัง {target}",
   "report.forward_hint": "บัญชีมาจากเซิร์ฟเวอร์อื่น ส่งสำเนาของรายงานที่ไม่ระบุตัวตนไปที่นั่นด้วย?",
   "report.hint": "จะส่งรายงานไปยังผู้ควบคุมเซิร์ฟเวอร์ของคุณ คุณสามารถให้คำอธิบายเหตุผลที่คุณรายงานบัญชีนี้ได้ด้านล่าง:",
@@ -407,14 +409,14 @@
   "status.delete": "ลบ",
   "status.detailed_status": "มุมมองการสนทนาโดยละเอียด",
   "status.direct": "ส่งข้อความโดยตรงถึง @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "แก้ไข",
+  "status.edited": "แก้ไขเมื่อ {date}",
+  "status.edited_x_times": "แก้ไข {count, plural, other {{count} ครั้ง}}",
   "status.embed": "ฝัง",
   "status.favourite": "ชื่นชอบ",
   "status.filtered": "กรองอยู่",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} ได้สร้างเมื่อ {date}",
+  "status.history.edited": "{name} ได้แก้ไขเมื่อ {date}",
   "status.load_more": "โหลดเพิ่มเติม",
   "status.media_hidden": "ซ่อนสื่ออยู่",
   "status.mention": "กล่าวถึง @{name}",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index a8c602caa..3d67b62e9 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -47,8 +47,8 @@
   "account.unmute": "@{name} adlı kişinin sesini aç",
   "account.unmute_notifications": "@{name} adlı kişinin bildirimlerini aç",
   "account_note.placeholder": "Not eklemek için tıklayın",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Kayıttan sonra günlük kullanıcı saklama oranı",
+  "admin.dashboard.monthly_retention": "Kayıttan sonra aylık kullanıcı saklama oranı",
   "admin.dashboard.retention.average": "Ortalama",
   "admin.dashboard.retention.cohort": "Kayıt ayı",
   "admin.dashboard.retention.cohort_size": "Yeni kullanıcılar",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Tek bir seçeneğe izin vermek için anketi değiştir",
   "compose_form.publish": "Tootla",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Değişiklikleri kaydet",
   "compose_form.sensitive.hide": "{count, plural, one {Medyayı hassas olarak işaretle} other {Medyayı hassas olarak işaretle}}",
   "compose_form.sensitive.marked": "{count, plural, one {Medya hassas olarak işaretlendi} other {Medya hassas olarak işaretlendi}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Medya hassas olarak işaretlenmemiş} other {Medya hassas olarak işaretlenmemiş}}",
@@ -308,6 +308,7 @@
   "notification.poll": "Oy verdiğiniz bir anket sona erdi",
   "notification.reblog": "{name} gönderini teşvik etti",
   "notification.status": "{name} az önce gönderdi",
+  "notification.update": "{name} bir gönderiyi düzenledi",
   "notifications.clear": "Bildirimleri temizle",
   "notifications.clear_confirmation": "Tüm bildirimlerinizi kalıcı olarak temizlemek ister misiniz?",
   "notifications.column_settings.alert": "Masaüstü bildirimleri",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Yeni gönderiler:",
   "notifications.column_settings.unread_notifications.category": "Okunmamış bildirimler",
   "notifications.column_settings.unread_notifications.highlight": "Okunmamış bildirimleri öne çıkar",
+  "notifications.column_settings.update": "Düzenlemeler:",
   "notifications.filter.all": "Tümü",
   "notifications.filter.boosts": "Boostlar",
   "notifications.filter.favourites": "Beğeniler",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Yükleniyor…",
   "regeneration_indicator.sublabel": "Ana akışın hazırlanıyor!",
   "relative_time.days": "{number}g",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# gün} other {# gün}} önce",
+  "relative_time.full.hours": "{number, plural, one {# saat} other {# saat}} önce",
+  "relative_time.full.just_now": "şimdi",
+  "relative_time.full.minutes": "{number, plural, one {# dakika} other {# dakika}} önce",
+  "relative_time.full.seconds": "{number, plural, one {# saniye} other {# saniye}} önce",
   "relative_time.hours": "{number}sa",
   "relative_time.just_now": "şimdi",
   "relative_time.minutes": "{number}dk",
   "relative_time.seconds": "{number}sn",
   "relative_time.today": "bugün",
   "reply_indicator.cancel": "İptal",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "Diğer",
+  "report.categories.spam": "İstenmeyen",
+  "report.categories.violation": "İçerik bir veya daha fazla sunucu kuralını ihlal ediyor",
   "report.forward": "{target} ilet",
   "report.forward_hint": "Hesap başka bir sunucudan. Raporun anonim bir kopyası da oraya gönderilsin mi?",
   "report.hint": "Bu rapor sunucu moderatörlerine gönderilecek. Bu hesabı neden bildirdiğiniz hakkında bilgi verebirsiniz:",
@@ -407,14 +409,14 @@
   "status.delete": "Sil",
   "status.detailed_status": "Ayrıntılı sohbet görünümü",
   "status.direct": "@{name} adlı kişiye direkt mesaj",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Düzenle",
+  "status.edited": "{date} tarihinde düzenlenmiş",
+  "status.edited_x_times": "{count, plural, one {{count} kez} other {{count} kez}} düzenlendi",
   "status.embed": "Gömülü",
   "status.favourite": "Beğen",
   "status.filtered": "Filtrelenmiş",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} oluşturdu {date}",
+  "status.history.edited": "{name} düzenledi {date}",
   "status.load_more": "Daha fazlasını yükle",
   "status.media_hidden": "Medya gizli",
   "status.mention": "@{name} kişisinden bahset",
diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json
index e66a7d4e1..464a65370 100644
--- a/app/javascript/mastodon/locales/tt.json
+++ b/app/javascript/mastodon/locales/tt.json
@@ -308,6 +308,7 @@
   "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.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "Бөтенесе",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json
index 2675da68c..5456eb88e 100644
--- a/app/javascript/mastodon/locales/ug.json
+++ b/app/javascript/mastodon/locales/ug.json
@@ -308,6 +308,7 @@
   "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.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 5adbd832b..4414d6741 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Перемкнути у режим вибору однієї відповіді",
   "compose_form.publish": "Дмухнути",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Зберегти зміни",
   "compose_form.sensitive.hide": "{count, plural, one {Позначити медіа делікатним} other {Позначити медіа делікатними}}",
   "compose_form.sensitive.marked": "{count, plural, one {Медіа позначене делікатним} other {Медіа позначені делікатними}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {Медіа не позначене делікатним} other {Медіа не позначені делікатними}}",
@@ -308,6 +308,7 @@
   "notification.poll": "Опитування, у якому ви голосували, закінчилося",
   "notification.reblog": "{name} передмухнув(-ла) Ваш допис",
   "notification.status": "{name} щойно дописує",
+  "notification.update": "{name} змінює допис",
   "notifications.clear": "Очистити сповіщення",
   "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщеня?",
   "notifications.column_settings.alert": "Сповіщення на комп'ютері",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Нові дмухи:",
   "notifications.column_settings.unread_notifications.category": "Непрочитані сповіщення",
   "notifications.column_settings.unread_notifications.highlight": "Виділити непрочитані сповіщення",
+  "notifications.column_settings.update": "Зміни:",
   "notifications.filter.all": "Усі",
   "notifications.filter.boosts": "Передмухи",
   "notifications.filter.favourites": "Улюблені",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Завантаження…",
   "regeneration_indicator.sublabel": "Ваша домашня стрічка готується!",
   "relative_time.days": "{number}д",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# день} few {# дні} other {# днів}} тому",
+  "relative_time.full.hours": "{number, plural, one {# година} few {# години} other {# годин}} тому",
+  "relative_time.full.just_now": "щойно",
+  "relative_time.full.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}} тому",
+  "relative_time.full.seconds": "{number, plural, one {# секунда} few {# секунди} other {# секунд}} тому",
   "relative_time.hours": "{number}г",
   "relative_time.just_now": "щойно",
   "relative_time.minutes": "{number}х",
   "relative_time.seconds": "{number}с",
   "relative_time.today": "сьогодні",
   "reply_indicator.cancel": "Відмінити",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "Інше",
+  "report.categories.spam": "Спам",
+  "report.categories.violation": "Контент порушує одне або кілька правил сервера",
   "report.forward": "Надіслати до {target}",
   "report.forward_hint": "Це акаунт з іншого серверу. Відправити анонімізовану копію скарги і туди?",
   "report.hint": "Скаргу буде відправлено модераторам Вашого сайту. Ви можете надати їм пояснення, чому ви скаржитесь на акаунт нижче:",
@@ -407,14 +409,14 @@
   "status.delete": "Видалити",
   "status.detailed_status": "Детальний вигляд бесіди",
   "status.direct": "Пряме повідомлення до @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Редагувати",
+  "status.edited": "Відредаговано {date}",
+  "status.edited_x_times": "Відредаговано {count, plural, one {{count} раз} few {{count} рази} many {{counter} разів} other {{counter} разів}}",
   "status.embed": "Вбудувати",
   "status.favourite": "Подобається",
   "status.filtered": "Відфільтровано",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} створює {date}",
+  "status.history.edited": "{name} змінює {date}",
   "status.load_more": "Завантажити більше",
   "status.media_hidden": "Медіа приховано",
   "status.mention": "Згадати @{name}",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index e029f074c..75d99bf4e 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -308,6 +308,7 @@
   "notification.poll": "آپ کا ووٹ دیا گیا ایک پول ختم ہو گیا ہے",
   "notification.reblog": "{name} boosted your status",
   "notification.status": "{name} نے ابھی ابھی پوسٹ کیا",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "اطلاعات ہٹائیں",
   "notifications.clear_confirmation": "کیا آپ واقعی اپنی تمام اطلاعات کو صاف کرنا چاہتے ہیں؟",
   "notifications.column_settings.alert": "ڈیسک ٹاپ اطلاعات",
@@ -326,6 +327,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.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index f5620638a..588721073 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -47,8 +47,8 @@
   "account.unmute": "Bỏ ẩn @{name}",
   "account.unmute_notifications": "Mở lại thông báo từ @{name}",
   "account_note.placeholder": "Nhấn để thêm",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "Tỉ lệ người dùng sau đăng ký ở lại theo ngày",
+  "admin.dashboard.monthly_retention": "Tỉ lệ người dùng sau đăng ký ở lại theo tháng",
   "admin.dashboard.retention.average": "Trung bình",
   "admin.dashboard.retention.cohort": "Đăng ký tháng",
   "admin.dashboard.retention.cohort_size": "Người dùng mới",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "Chỉ cho phép chọn duy nhất một lựa chọn",
   "compose_form.publish": "Đăng tút",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "Lưu thay đổi",
   "compose_form.sensitive.hide": "{count, plural, other {Đánh dấu nội dung nhạy cảm}}",
   "compose_form.sensitive.marked": "{count, plural, other {Nội dung này nhạy cảm}}",
   "compose_form.sensitive.unmarked": "{count, plural, other {Nội dung này bình thường}}",
@@ -308,6 +308,7 @@
   "notification.poll": "Cuộc bình chọn đã kết thúc",
   "notification.reblog": "{name} chia sẻ tút của bạn",
   "notification.status": "{name} vừa đăng",
+  "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?",
   "notifications.column_settings.alert": "Thông báo trên máy tính",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "Tút mới:",
   "notifications.column_settings.unread_notifications.category": "Thông báo chưa đọc",
   "notifications.column_settings.unread_notifications.highlight": "Nổi bật thông báo chưa đọc",
+  "notifications.column_settings.update": "Lượt sửa:",
   "notifications.filter.all": "Toàn bộ",
   "notifications.filter.boosts": "Chia sẻ",
   "notifications.filter.favourites": "Thích",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "Đang tải…",
   "regeneration_indicator.sublabel": "Bảng tin của bạn đang được cập nhật!",
   "relative_time.days": "{number} ngày",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, other {# ngày}} trước",
+  "relative_time.full.hours": "{number, plural, other {# giờ}} trước",
+  "relative_time.full.just_now": "vừa xong",
+  "relative_time.full.minutes": "{number, plural, other {# phút}} trước",
+  "relative_time.full.seconds": "{number, plural, other {# giây}} trước",
   "relative_time.hours": "{number} giờ",
   "relative_time.just_now": "vừa xong",
   "relative_time.minutes": "{number} phút",
   "relative_time.seconds": "{number}s",
   "relative_time.today": "hôm nay",
   "reply_indicator.cancel": "Hủy bỏ",
-  "report.categories.other": "Other",
+  "report.categories.other": "Khác",
   "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.violation": "Vi phạm quy tắc máy chủ",
   "report.forward": "Chuyển đến {target}",
   "report.forward_hint": "Người này thuộc máy chủ khác. Gửi một báo cáo ẩn danh tới máy chủ đó?",
   "report.hint": "Hãy cho quản trị viên biết lý do vì sao bạn báo cáo người này:",
@@ -407,14 +409,14 @@
   "status.delete": "Xóa",
   "status.detailed_status": "Xem chi tiết thêm",
   "status.direct": "Nhắn tin @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "Sửa",
+  "status.edited": "Đã sửa {date}",
+  "status.edited_x_times": "Đã sửa {count, plural, other {{count} lần}}",
   "status.embed": "Nhúng",
   "status.favourite": "Thích",
   "status.filtered": "Bộ lọc",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} tạo lúc {date}",
+  "status.history.edited": "{name} sửa lúc {date}",
   "status.load_more": "Xem thêm",
   "status.media_hidden": "Đã ẩn",
   "status.mention": "Nhắc đến @{name}",
diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json
index bc9b8bc83..f34772abe 100644
--- a/app/javascript/mastodon/locales/zgh.json
+++ b/app/javascript/mastodon/locales/zgh.json
@@ -308,6 +308,7 @@
   "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": "ⵙⴼⴹ ⵜⵉⵏⵖⵎⵉⵙⵉⵏ",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -326,6 +327,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.filter.all": "ⴰⴽⴽⵯ",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index cb971126e..56dca56a6 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -47,8 +47,8 @@
   "account.unmute": "不再隐藏 @{name}",
   "account.unmute_notifications": "不再隐藏来自 @{name} 的通知",
   "account_note.placeholder": "点击添加备注",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "注册后用户留存率(按日计算)",
+  "admin.dashboard.monthly_retention": "注册后用户留存率(按月计算)",
   "admin.dashboard.retention.average": "平均",
   "admin.dashboard.retention.cohort": "注册月",
   "admin.dashboard.retention.cohort_size": "新用户",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "将投票改为单选",
   "compose_form.publish": "嘟嘟",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "保存更改",
   "compose_form.sensitive.hide": "标记媒体为敏感内容",
   "compose_form.sensitive.marked": "媒体已被标记为敏感内容",
   "compose_form.sensitive.unmarked": "媒体未被标记为敏感内容",
@@ -308,6 +308,7 @@
   "notification.poll": "你参与的一个投票已经结束",
   "notification.reblog": "{name} 转嘟了你的嘟文",
   "notification.status": "{name} 刚刚发嘟",
+  "notification.update": "{name} 编辑了嘟文",
   "notifications.clear": "清空通知列表",
   "notifications.clear_confirmation": "你确定要永久清空通知列表吗?",
   "notifications.column_settings.alert": "桌面通知",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "新嘟文:",
   "notifications.column_settings.unread_notifications.category": "未读通知",
   "notifications.column_settings.unread_notifications.highlight": "高亮显示未读通知",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "全部",
   "notifications.filter.boosts": "转嘟",
   "notifications.filter.favourites": "喜欢",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "加载中……",
   "regeneration_indicator.sublabel": "你的主页动态正在准备中!",
   "relative_time.days": "{number}天",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# 天} other {# 天}}前",
+  "relative_time.full.hours": "{number, plural, one {# 小时} other {# 小时}}前",
+  "relative_time.full.just_now": "刚刚",
+  "relative_time.full.minutes": "{number, plural, one {# 分钟} other {# 分钟}}前",
+  "relative_time.full.seconds": "{number, plural, one {# 秒} other {# 秒}}前",
   "relative_time.hours": "{number}时",
   "relative_time.just_now": "刚刚",
   "relative_time.minutes": "{number}分",
   "relative_time.seconds": "{number}秒",
   "relative_time.today": "今天",
   "reply_indicator.cancel": "取消",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "其他",
+  "report.categories.spam": "垃圾信息",
+  "report.categories.violation": "内容违反一条或多条服务器规则",
   "report.forward": "转发举报至 {target}",
   "report.forward_hint": "这名用户来自另一个服务器。是否要向那个服务器发送一条匿名的举报?",
   "report.hint": "举报将会发送给你所在服务器的监察员。你可以在下面填写举报该用户的理由:",
@@ -407,14 +409,14 @@
   "status.delete": "删除",
   "status.detailed_status": "对话详情",
   "status.direct": "发送私信给 @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "编辑",
+  "status.edited": "编辑于 {date}",
+  "status.edited_x_times": "共编辑 {count, plural, one {{count} 次} other {{count} 次}}",
   "status.embed": "嵌入",
   "status.favourite": "喜欢",
   "status.filtered": "已过滤",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} 创建于 {date}",
+  "status.history.edited": "{name} 编辑于 {date}",
   "status.load_more": "加载更多",
   "status.media_hidden": "已隐藏的媒体内容",
   "status.mention": "提及 @{name}",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index bd6666b15..1f06f7fc6 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -308,6 +308,7 @@
   "notification.poll": "你參與過的一個投票已經結束",
   "notification.reblog": "{name} 轉推你的文章",
   "notification.status": "{name} 剛發表了文章",
+  "notification.update": "{name} edited a post",
   "notifications.clear": "清空通知紀錄",
   "notifications.clear_confirmation": "你確定要清空通知紀錄嗎?",
   "notifications.column_settings.alert": "顯示桌面通知",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "新的文章",
   "notifications.column_settings.unread_notifications.category": "Unread notifications",
   "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.update": "Edits:",
   "notifications.filter.all": "全部",
   "notifications.filter.boosts": "轉推",
   "notifications.filter.favourites": "最愛",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index 60f4bc2f4..3f89737d4 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -47,8 +47,8 @@
   "account.unmute": "取消靜音 @{name}",
   "account.unmute_notifications": "重新接收來自 @{name} 的通知",
   "account_note.placeholder": "按此添加備注",
-  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
-  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.daily_retention": "註冊後使用者存留率(日)",
+  "admin.dashboard.monthly_retention": "註冊後使用者存留率(月)",
   "admin.dashboard.retention.average": "平均",
   "admin.dashboard.retention.cohort": "註冊月份",
   "admin.dashboard.retention.cohort_size": "新使用者",
@@ -105,7 +105,7 @@
   "compose_form.poll.switch_to_single": "變更投票為允許單一選項",
   "compose_form.publish": "嘟出去",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "儲存變更",
   "compose_form.sensitive.hide": "標記媒體為敏感內容",
   "compose_form.sensitive.marked": "此媒體被標記為敏感內容",
   "compose_form.sensitive.unmarked": "此媒體未被標記為敏感內容",
@@ -308,6 +308,7 @@
   "notification.poll": "您曾投過的投票已經結束",
   "notification.reblog": "{name} 轉嘟了您的嘟文",
   "notification.status": "{name} 剛剛嘟文",
+  "notification.update": "{name} 編輯了嘟文",
   "notifications.clear": "清除通知",
   "notifications.clear_confirmation": "確定要永久清除您的通知嗎?",
   "notifications.column_settings.alert": "桌面通知",
@@ -326,6 +327,7 @@
   "notifications.column_settings.status": "新嘟文:",
   "notifications.column_settings.unread_notifications.category": "未讀通知",
   "notifications.column_settings.unread_notifications.highlight": "突顯未讀通知",
+  "notifications.column_settings.update": "編輯:",
   "notifications.filter.all": "全部",
   "notifications.filter.boosts": "轉嘟",
   "notifications.filter.favourites": "最愛",
@@ -365,20 +367,20 @@
   "regeneration_indicator.label": "載入中…",
   "regeneration_indicator.sublabel": "您的主頁時間軸正在準備中!",
   "relative_time.days": "{number} 天",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# 天} other {# 天}}前",
+  "relative_time.full.hours": "{number, plural, one {# 小時} other {# 小時}}前",
+  "relative_time.full.just_now": "剛剛",
+  "relative_time.full.minutes": "{number, plural, one {# 分鐘} other {# 分鐘}}前",
+  "relative_time.full.seconds": "{number, plural, one {# 秒} other {# 秒}}前",
   "relative_time.hours": "{number}小時前",
   "relative_time.just_now": "剛剛",
   "relative_time.minutes": "{number} 分前",
   "relative_time.seconds": "{number} 秒",
   "relative_time.today": "今天",
   "reply_indicator.cancel": "取消",
-  "report.categories.other": "Other",
-  "report.categories.spam": "Spam",
-  "report.categories.violation": "Content violates one or more server rules",
+  "report.categories.other": "其他",
+  "report.categories.spam": "垃圾訊息",
+  "report.categories.violation": "內容違反一項或多項伺服器條款",
   "report.forward": "轉寄到 {target}",
   "report.forward_hint": "這個帳戶屬於其他伺服器。要像該伺服器發送匿名的檢舉訊息嗎?",
   "report.hint": "這項訊息會發送到您伺服器的管理員。您可以提供檢舉這個帳戶的理由:",
@@ -407,14 +409,14 @@
   "status.delete": "刪除",
   "status.detailed_status": "詳細的對話內容",
   "status.direct": "發送私訊給 @{name}",
-  "status.edit": "Edit",
-  "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edit": "編輯",
+  "status.edited": "編輯於 {date}",
+  "status.edited_x_times": "已編輯 {count, plural, one {{count} 次} other {{count} 次}}",
   "status.embed": "內嵌",
   "status.favourite": "最愛",
   "status.filtered": "已過濾",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} 於 {date} 建立",
+  "status.history.edited": "{name} 於 {date} 修改",
   "status.load_more": "載入更多",
   "status.media_hidden": "隱藏媒體內容",
   "status.mention": "提及 @{name}",
diff --git a/app/javascript/mastodon/reducers/index.js b/app/javascript/mastodon/reducers/index.js
index af2ef595e..0219d8a5e 100644
--- a/app/javascript/mastodon/reducers/index.js
+++ b/app/javascript/mastodon/reducers/index.js
@@ -17,7 +17,7 @@ import status_lists from './status_lists';
 import mutes from './mutes';
 import blocks from './blocks';
 import boosts from './boosts';
-import reports from './reports';
+import rules from './rules';
 import contexts from './contexts';
 import compose from './compose';
 import search from './search';
@@ -61,7 +61,7 @@ const reducers = {
   mutes,
   blocks,
   boosts,
-  reports,
+  rules,
   contexts,
   compose,
   search,
diff --git a/app/javascript/mastodon/reducers/reports.js b/app/javascript/mastodon/reducers/reports.js
deleted file mode 100644
index 21ae6f93f..000000000
--- a/app/javascript/mastodon/reducers/reports.js
+++ /dev/null
@@ -1,64 +0,0 @@
-import {
-  REPORT_INIT,
-  REPORT_SUBMIT_REQUEST,
-  REPORT_SUBMIT_SUCCESS,
-  REPORT_SUBMIT_FAIL,
-  REPORT_CANCEL,
-  REPORT_STATUS_TOGGLE,
-  REPORT_COMMENT_CHANGE,
-  REPORT_FORWARD_CHANGE,
-} from '../actions/reports';
-import { Map as ImmutableMap, Set as ImmutableSet } from 'immutable';
-
-const initialState = ImmutableMap({
-  new: ImmutableMap({
-    isSubmitting: false,
-    account_id: null,
-    status_ids: ImmutableSet(),
-    comment: '',
-    forward: false,
-  }),
-});
-
-export default function reports(state = initialState, action) {
-  switch(action.type) {
-  case REPORT_INIT:
-    return state.withMutations(map => {
-      map.setIn(['new', 'isSubmitting'], false);
-      map.setIn(['new', 'account_id'], action.account.get('id'));
-
-      if (state.getIn(['new', 'account_id']) !== action.account.get('id')) {
-        map.setIn(['new', 'status_ids'], action.status ? ImmutableSet([action.status.getIn(['reblog', 'id'], action.status.get('id'))]) : ImmutableSet());
-        map.setIn(['new', 'comment'], '');
-      } else if (action.status) {
-        map.updateIn(['new', 'status_ids'], ImmutableSet(), set => set.add(action.status.getIn(['reblog', 'id'], action.status.get('id'))));
-      }
-    });
-  case REPORT_STATUS_TOGGLE:
-    return state.updateIn(['new', 'status_ids'], ImmutableSet(), set => {
-      if (action.checked) {
-        return set.add(action.statusId);
-      }
-
-      return set.remove(action.statusId);
-    });
-  case REPORT_COMMENT_CHANGE:
-    return state.setIn(['new', 'comment'], action.comment);
-  case REPORT_FORWARD_CHANGE:
-    return state.setIn(['new', 'forward'], action.forward);
-  case REPORT_SUBMIT_REQUEST:
-    return state.setIn(['new', 'isSubmitting'], true);
-  case REPORT_SUBMIT_FAIL:
-    return state.setIn(['new', 'isSubmitting'], false);
-  case REPORT_CANCEL:
-  case REPORT_SUBMIT_SUCCESS:
-    return state.withMutations(map => {
-      map.setIn(['new', 'account_id'], null);
-      map.setIn(['new', 'status_ids'], ImmutableSet());
-      map.setIn(['new', 'comment'], '');
-      map.setIn(['new', 'isSubmitting'], false);
-    });
-  default:
-    return state;
-  }
-};
diff --git a/app/javascript/mastodon/reducers/rules.js b/app/javascript/mastodon/reducers/rules.js
new file mode 100644
index 000000000..c1180b520
--- /dev/null
+++ b/app/javascript/mastodon/reducers/rules.js
@@ -0,0 +1,13 @@
+import { RULES_FETCH_SUCCESS } from 'mastodon/actions/rules';
+import { List as ImmutableList, fromJS } from 'immutable';
+
+const initialState = ImmutableList();
+
+export default function rules(state = initialState, action) {
+  switch (action.type) {
+  case RULES_FETCH_SUCCESS:
+    return fromJS(action.rules);
+  default:
+    return state;
+  }
+}
diff --git a/app/javascript/mastodon/reducers/settings.js b/app/javascript/mastodon/reducers/settings.js
index 5146abe98..39639f3dc 100644
--- a/app/javascript/mastodon/reducers/settings.js
+++ b/app/javascript/mastodon/reducers/settings.js
@@ -37,6 +37,7 @@ const initialState = ImmutableMap({
       poll: false,
       status: false,
       update: false,
+      'admin.sign_up': false,
     }),
 
     quickFilter: ImmutableMap({
@@ -57,6 +58,7 @@ const initialState = ImmutableMap({
       poll: true,
       status: true,
       update: true,
+      'admin.sign_up': true,
     }),
 
     sounds: ImmutableMap({
@@ -68,6 +70,7 @@ const initialState = ImmutableMap({
       poll: true,
       status: true,
       update: true,
+      'admin.sign_up': true,
     }),
   }),
 
diff --git a/app/javascript/mastodon/service_worker/web_push_locales.js b/app/javascript/mastodon/service_worker/web_push_locales.js
index 807a1bcb9..7d713cd37 100644
--- a/app/javascript/mastodon/service_worker/web_push_locales.js
+++ b/app/javascript/mastodon/service_worker/web_push_locales.js
@@ -22,6 +22,7 @@ filenames.forEach(filename => {
     'notification.poll': full['notification.poll'] || '',
     'notification.status': full['notification.status'] || '',
     'notification.update': full['notification.update'] || '',
+    'notification.admin.sign_up': full['notification.admin.sign_up'] || '',
 
     'status.show_more': full['status.show_more'] || '',
     'status.reblog': full['status.reblog'] || '',
diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js
index 7ebe8b4d0..be467a8e2 100644
--- a/app/javascript/packs/public.js
+++ b/app/javascript/packs/public.js
@@ -151,13 +151,7 @@ function main() {
   });
 
   delegate(document, '.sidebar__toggle__icon', 'click', () => {
-    const target = document.querySelector('.sidebar ul');
-
-    if (target.style.display === 'block') {
-      target.style.display = 'none';
-    } else {
-      target.style.display = 'block';
-    }
+    document.querySelector('.sidebar ul').classList.toggle('visible');
   });
 
   // Empty the honeypot fields in JS in case something like an extension
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index 66ce92ce2..a1b99636c 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -322,6 +322,10 @@ $content-width: 840px;
 
       & > ul {
         display: none;
+
+        &.visible {
+          display: block;
+        }
       }
 
       ul a,
@@ -594,12 +598,16 @@ body,
 }
 
 .log-entry {
+  display: block;
   line-height: 20px;
   padding: 15px;
   padding-left: 15px * 2 + 40px;
   background: $ui-base-color;
   border-bottom: 1px solid darken($ui-base-color, 8%);
   position: relative;
+  text-decoration: none;
+  color: $darker-text-color;
+  font-size: 14px;
 
   &:first-child {
     border-top-left-radius: 4px;
@@ -612,15 +620,12 @@ body,
     border-bottom: 0;
   }
 
-  &:hover {
+  &:hover,
+  &:focus,
+  &:active {
     background: lighten($ui-base-color, 4%);
   }
 
-  &__header {
-    color: $darker-text-color;
-    font-size: 14px;
-  }
-
   &__avatar {
     position: absolute;
     left: 15px;
@@ -1278,6 +1283,30 @@ a.sparkline {
       background: linear-gradient(to left, $ui-base-color, transparent);
       pointer-events: none;
     }
+
+    a {
+      color: $secondary-text-color;
+      text-decoration: none;
+      unicode-bidi: isolate;
+
+      &:hover {
+        text-decoration: underline;
+
+        .fa {
+          color: lighten($dark-text-color, 7%);
+        }
+      }
+
+      &.mention {
+        &:hover {
+          text-decoration: none;
+
+          span {
+            text-decoration: underline;
+          }
+        }
+      }
+    }
   }
 
   &__actions {
@@ -1467,3 +1496,75 @@ a.sparkline {
     }
   }
 }
+
+.strike-card {
+  padding: 15px;
+  border-radius: 4px;
+  background: $ui-base-color;
+  font-size: 15px;
+  line-height: 20px;
+  word-wrap: break-word;
+  font-weight: 400;
+  color: $primary-text-color;
+
+  p {
+    margin-bottom: 20px;
+    unicode-bidi: plaintext;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+
+    strong {
+      font-weight: 700;
+    }
+  }
+
+  &__rules {
+    list-style: disc;
+    padding-left: 15px;
+    margin-bottom: 20px;
+    color: $darker-text-color;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+
+    &__text {
+      color: $primary-text-color;
+    }
+  }
+
+  &__statuses-list {
+    border-radius: 4px;
+    border: 1px solid darken($ui-base-color, 8%);
+    font-size: 13px;
+    line-height: 18px;
+    overflow: hidden;
+
+    &__item {
+      padding: 16px;
+      background: lighten($ui-base-color, 2%);
+      border-bottom: 1px solid darken($ui-base-color, 8%);
+
+      &:last-child {
+        border-bottom: 0;
+      }
+
+      &__meta {
+        color: $darker-text-color;
+      }
+
+      a {
+        color: inherit;
+        text-decoration: none;
+
+        &:hover,
+        &:focus,
+        &:active {
+          text-decoration: underline;
+        }
+      }
+    }
+  }
+}
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 5304bec34..108bf68a5 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -50,16 +50,14 @@
   cursor: pointer;
   display: inline-block;
   font-family: inherit;
-  font-size: 14px;
+  font-size: 17px;
   font-weight: 500;
-  height: 36px;
   letter-spacing: 0;
-  line-height: 36px;
+  line-height: 22px;
   overflow: hidden;
-  padding: 0 16px;
+  padding: 7px 18px;
   position: relative;
   text-align: center;
-  text-transform: uppercase;
   text-decoration: none;
   text-overflow: ellipsis;
   transition: all 100ms ease-in;
@@ -100,17 +98,6 @@
     outline: 0 !important;
   }
 
-  &.button-primary,
-  &.button-alternative,
-  &.button-secondary,
-  &.button-alternative-2 {
-    font-size: 16px;
-    line-height: 36px;
-    height: auto;
-    text-transform: none;
-    padding: 4px 16px;
-  }
-
   &.button-alternative {
     color: $inverted-text-color;
     background: $ui-primary-color;
@@ -135,7 +122,7 @@
   &.button-secondary {
     color: $darker-text-color;
     background: transparent;
-    padding: 3px 15px;
+    padding: 6px 17px;
     border: 1px solid $ui-primary-color;
 
     &:active,
@@ -1114,42 +1101,39 @@
   font-size: 15px;
 }
 
-.status-check-box {
-  border-bottom: 1px solid $ui-secondary-color;
-  display: flex;
+.status-check-box__status {
+  display: block;
+  box-sizing: border-box;
+  width: 100%;
+  padding: 0 10px;
 
-  .status-check-box__status {
-    margin: 10px 0 10px 10px;
-    flex: 1;
-    overflow: hidden;
+  .detailed-status__display-name {
+    color: lighten($inverted-text-color, 16%);
 
-    .media-gallery {
-      max-width: 250px;
+    span {
+      display: inline;
     }
 
-    .status__content {
-      padding: 0;
-      white-space: normal;
+    &:hover strong {
+      text-decoration: none;
     }
+  }
 
-    .video-player,
-    .audio-player {
-      margin-top: 8px;
-      max-width: 250px;
-    }
+  .media-gallery,
+  .audio-player,
+  .video-player {
+    margin-top: 8px;
+    max-width: 250px;
+  }
 
-    .media-gallery__item-thumbnail {
-      cursor: default;
-    }
+  .status__content {
+    padding: 0;
+    white-space: normal;
   }
-}
 
-.status-check-box-toggle {
-  align-items: center;
-  display: flex;
-  flex: 0 0 auto;
-  justify-content: center;
-  padding: 10px;
+  .media-gallery__item-thumbnail {
+    cursor: default;
+  }
 }
 
 .status__prepend {
@@ -5103,6 +5087,192 @@ a.status-card.compact:hover {
   max-width: 700px;
 }
 
+.report-dialog-modal {
+  max-width: 90vw;
+  width: 480px;
+  height: 80vh;
+  background: lighten($ui-secondary-color, 8%);
+  color: $inverted-text-color;
+  border-radius: 8px;
+  overflow: hidden;
+  position: relative;
+  flex-direction: column;
+  display: flex;
+
+  &__container {
+    box-sizing: border-box;
+    border-top: 1px solid $ui-secondary-color;
+    padding: 20px;
+    flex-grow: 1;
+    display: flex;
+    flex-direction: column;
+    min-height: 0;
+    overflow: auto;
+  }
+
+  &__title {
+    font-size: 28px;
+    line-height: 33px;
+    font-weight: 700;
+    margin-bottom: 15px;
+
+    @media screen and (max-height: 800px) {
+      font-size: 22px;
+    }
+  }
+
+  &__subtitle {
+    font-size: 17px;
+    font-weight: 600;
+    line-height: 22px;
+    margin-bottom: 4px;
+  }
+
+  &__lead {
+    font-size: 17px;
+    line-height: 22px;
+    color: lighten($inverted-text-color, 16%);
+    margin-bottom: 30px;
+  }
+
+  &__actions {
+    margin-top: 30px;
+    display: flex;
+
+    .button {
+      flex: 1 1 auto;
+    }
+  }
+
+  &__statuses {
+    flex-grow: 1;
+    min-height: 0;
+    overflow: auto;
+  }
+
+  .status__content a {
+    color: $highlight-text-color;
+  }
+
+  .status__content,
+  .status__content p {
+    color: $inverted-text-color;
+  }
+
+  .dialog-option .poll__input {
+    border-color: $inverted-text-color;
+    color: $ui-secondary-color;
+    display: inline-flex;
+    align-items: center;
+    justify-content: center;
+
+    svg {
+      width: 8px;
+      height: auto;
+    }
+
+    &:active,
+    &:focus,
+    &:hover {
+      border-color: lighten($inverted-text-color, 15%);
+      border-width: 4px;
+    }
+
+    &.active {
+      border-color: $inverted-text-color;
+      background: $inverted-text-color;
+    }
+  }
+
+  .poll__option.dialog-option {
+    padding: 15px 0;
+    flex: 0 0 auto;
+    border-bottom: 1px solid $ui-secondary-color;
+
+    &:last-child {
+      border-bottom: 0;
+    }
+
+    & > .poll__option__text {
+      font-size: 13px;
+      color: lighten($inverted-text-color, 16%);
+
+      strong {
+        font-size: 17px;
+        font-weight: 500;
+        line-height: 22px;
+        color: $inverted-text-color;
+        display: block;
+        margin-bottom: 4px;
+
+        &:last-child {
+          margin-bottom: 0;
+        }
+      }
+    }
+  }
+
+  .flex-spacer {
+    background: transparent;
+  }
+
+  &__textarea {
+    display: block;
+    box-sizing: border-box;
+    width: 100%;
+    margin: 0;
+    color: $inverted-text-color;
+    background: $simple-background-color;
+    padding: 10px;
+    font-family: inherit;
+    font-size: 17px;
+    line-height: 22px;
+    resize: vertical;
+    border: 0;
+    outline: 0;
+    border-radius: 4px;
+    margin: 20px 0;
+
+    &::placeholder {
+      color: $dark-text-color;
+    }
+
+    &:focus {
+      outline: 0;
+    }
+  }
+
+  &__toggle {
+    display: flex;
+    align-items: center;
+
+    & > span {
+      font-size: 17px;
+      font-weight: 500;
+      margin-left: 10px;
+    }
+  }
+
+  .button.button-secondary {
+    border-color: $inverted-text-color;
+    color: $inverted-text-color;
+    flex: 0 0 auto;
+
+    &:hover,
+    &:focus,
+    &:active {
+      border-color: lighten($inverted-text-color, 15%);
+      color: lighten($inverted-text-color, 15%);
+    }
+  }
+
+  hr {
+    border: 0;
+    background: transparent;
+    margin: 15px 0;
+  }
+}
+
 .report-modal__container {
   display: flex;
   border-top: 1px solid $ui-secondary-color;
diff --git a/app/javascript/styles/mastodon/footer.scss b/app/javascript/styles/mastodon/footer.scss
index 00d290883..073ebda7e 100644
--- a/app/javascript/styles/mastodon/footer.scss
+++ b/app/javascript/styles/mastodon/footer.scss
@@ -90,6 +90,20 @@
         .column-4 {
           display: none;
         }
+
+        .column-2 h4 {
+          display: none;
+        }
+      }
+    }
+
+    .legal-xs {
+      display: none;
+      text-align: center;
+      padding-top: 20px;
+
+      @media screen and (max-width: $no-gap-breakpoint) {
+        display: block;
       }
     }
 
@@ -105,7 +119,8 @@
       }
     }
 
-    ul a {
+    ul a,
+    .legal-xs a {
       text-decoration: none;
       color: lighten($ui-base-color, 34%);
 
diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb
index 1f9319290..12fad8da4 100644
--- a/app/lib/activitypub/activity/announce.rb
+++ b/app/lib/activitypub/activity/announce.rb
@@ -8,6 +8,7 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
       original_status = status_from_object
 
       return reject_payload! if original_status.nil? || !announceable?(original_status)
+      return if requested_through_relay?
 
       @status = Status.find_by(account: @account, reblog: original_status)
 
diff --git a/app/lib/admin/metrics/dimension/base_dimension.rb b/app/lib/admin/metrics/dimension/base_dimension.rb
index 5872c22cb..bd2e4ecec 100644
--- a/app/lib/admin/metrics/dimension/base_dimension.rb
+++ b/app/lib/admin/metrics/dimension/base_dimension.rb
@@ -1,23 +1,34 @@
 # frozen_string_literal: true
 
 class Admin::Metrics::Dimension::BaseDimension
+  CACHE_TTL = 5.minutes.freeze
+
   def self.with_params?
     false
   end
 
+  attr_reader :loaded
+
+  alias loaded? loaded
+
   def initialize(start_at, end_at, limit, params)
     @start_at = start_at&.to_datetime
     @end_at   = end_at&.to_datetime
     @limit    = limit&.to_i
     @params   = params
+    @loaded   = false
   end
 
   def key
     raise NotImplementedError
   end
 
+  def cache_key
+    ["metrics/dimension/#{key}", @start_at, @end_at, @limit, canonicalized_params].join(';')
+  end
+
   def data
-    raise NotImplementedError
+    load
   end
 
   def self.model_name
@@ -30,11 +41,28 @@ class Admin::Metrics::Dimension::BaseDimension
 
   protected
 
+  def load
+    unless loaded?
+      @values = Rails.cache.fetch(cache_key, expires_in: CACHE_TTL) { perform_query }
+      @loaded = true
+    end
+
+    @values
+  end
+
+  def perform_query
+    raise NotImplementedError
+  end
+
   def time_period
     (@start_at..@end_at)
   end
 
   def params
-    raise NotImplementedError
+    {}
+  end
+
+  def canonicalized_params
+    params.to_h.to_a.sort_by { |k, _v| k.to_s }.map { |k, v| "#{k}=#{v}" }.join(';')
   end
 end
diff --git a/app/lib/admin/metrics/dimension/languages_dimension.rb b/app/lib/admin/metrics/dimension/languages_dimension.rb
index 1cc5f4120..f1cf82cf2 100644
--- a/app/lib/admin/metrics/dimension/languages_dimension.rb
+++ b/app/lib/admin/metrics/dimension/languages_dimension.rb
@@ -7,7 +7,9 @@ class Admin::Metrics::Dimension::LanguagesDimension < Admin::Metrics::Dimension:
     'languages'
   end
 
-  def data
+  protected
+
+  def perform_query
     sql = <<-SQL.squish
       SELECT locale, count(*) AS value
       FROM users
diff --git a/app/lib/admin/metrics/dimension/servers_dimension.rb b/app/lib/admin/metrics/dimension/servers_dimension.rb
index 3e80b6625..91bcce655 100644
--- a/app/lib/admin/metrics/dimension/servers_dimension.rb
+++ b/app/lib/admin/metrics/dimension/servers_dimension.rb
@@ -5,7 +5,9 @@ class Admin::Metrics::Dimension::ServersDimension < Admin::Metrics::Dimension::B
     'servers'
   end
 
-  def data
+  protected
+
+  def perform_query
     sql = <<-SQL.squish
       SELECT accounts.domain, count(*) AS value
       FROM statuses
diff --git a/app/lib/admin/metrics/dimension/software_versions_dimension.rb b/app/lib/admin/metrics/dimension/software_versions_dimension.rb
index 34917404d..816615f99 100644
--- a/app/lib/admin/metrics/dimension/software_versions_dimension.rb
+++ b/app/lib/admin/metrics/dimension/software_versions_dimension.rb
@@ -7,12 +7,12 @@ class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dim
     'software_versions'
   end
 
-  def data
+  protected
+
+  def perform_query
     [mastodon_version, ruby_version, postgresql_version, redis_version]
   end
 
-  private
-
   def mastodon_version
     value = Mastodon::Version.to_s
 
diff --git a/app/lib/admin/metrics/dimension/sources_dimension.rb b/app/lib/admin/metrics/dimension/sources_dimension.rb
index a9f061809..122807cdc 100644
--- a/app/lib/admin/metrics/dimension/sources_dimension.rb
+++ b/app/lib/admin/metrics/dimension/sources_dimension.rb
@@ -5,7 +5,9 @@ class Admin::Metrics::Dimension::SourcesDimension < Admin::Metrics::Dimension::B
     'sources'
   end
 
-  def data
+  protected
+
+  def perform_query
     sql = <<-SQL.squish
       SELECT oauth_applications.name, count(*) AS value
       FROM users
diff --git a/app/lib/admin/metrics/dimension/space_usage_dimension.rb b/app/lib/admin/metrics/dimension/space_usage_dimension.rb
index aa00a2e18..5867c5bab 100644
--- a/app/lib/admin/metrics/dimension/space_usage_dimension.rb
+++ b/app/lib/admin/metrics/dimension/space_usage_dimension.rb
@@ -8,12 +8,12 @@ class Admin::Metrics::Dimension::SpaceUsageDimension < Admin::Metrics::Dimension
     'space_usage'
   end
 
-  def data
+  protected
+
+  def perform_query
     [postgresql_size, redis_size, media_size]
   end
 
-  private
-
   def postgresql_size
     value = ActiveRecord::Base.connection.execute('SELECT pg_database_size(current_database())').first['pg_database_size']
 
diff --git a/app/lib/admin/metrics/dimension/tag_languages_dimension.rb b/app/lib/admin/metrics/dimension/tag_languages_dimension.rb
index afbc8cde8..e1349c229 100644
--- a/app/lib/admin/metrics/dimension/tag_languages_dimension.rb
+++ b/app/lib/admin/metrics/dimension/tag_languages_dimension.rb
@@ -11,7 +11,9 @@ class Admin::Metrics::Dimension::TagLanguagesDimension < Admin::Metrics::Dimensi
     'tag_languages'
   end
 
-  def data
+  protected
+
+  def perform_query
     sql = <<-SQL.squish
       SELECT COALESCE(statuses.language, 'und') AS language, count(*) AS value
       FROM statuses
@@ -28,8 +30,6 @@ class Admin::Metrics::Dimension::TagLanguagesDimension < Admin::Metrics::Dimensi
     rows.map { |row| { key: row['language'], human_key: standard_locale_name(row['language']), value: row['value'].to_s } }
   end
 
-  private
-
   def params
     @params.permit(:id)
   end
diff --git a/app/lib/admin/metrics/dimension/tag_servers_dimension.rb b/app/lib/admin/metrics/dimension/tag_servers_dimension.rb
index 12c5980d7..7ddf3378c 100644
--- a/app/lib/admin/metrics/dimension/tag_servers_dimension.rb
+++ b/app/lib/admin/metrics/dimension/tag_servers_dimension.rb
@@ -9,7 +9,9 @@ class Admin::Metrics::Dimension::TagServersDimension < Admin::Metrics::Dimension
     'tag_servers'
   end
 
-  def data
+  protected
+
+  def perform_query
     sql = <<-SQL.squish
       SELECT accounts.domain, count(*) AS value
       FROM statuses
@@ -27,8 +29,6 @@ class Admin::Metrics::Dimension::TagServersDimension < Admin::Metrics::Dimension
     rows.map { |row| { key: row['domain'] || Rails.configuration.x.local_domain, human_key: row['domain'] || Rails.configuration.x.local_domain, value: row['value'].to_s } }
   end
 
-  private
-
   def params
     @params.permit(:id)
   end
diff --git a/app/lib/admin/metrics/measure/active_users_measure.rb b/app/lib/admin/metrics/measure/active_users_measure.rb
index 513189780..e6f09d4bc 100644
--- a/app/lib/admin/metrics/measure/active_users_measure.rb
+++ b/app/lib/admin/metrics/measure/active_users_measure.rb
@@ -5,20 +5,20 @@ class Admin::Metrics::Measure::ActiveUsersMeasure < Admin::Metrics::Measure::Bas
     'active_users'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     activity_tracker.sum(time_period.first, time_period.last)
   end
 
-  def previous_total
+  def perform_previous_total_query
     activity_tracker.sum(previous_time_period.first, previous_time_period.last)
   end
 
-  def data
+  def perform_data_query
     activity_tracker.get(time_period.first, time_period.last).map { |date, value| { date: date.to_time(:utc).iso8601, value: value.to_s } }
   end
 
-  protected
-
   def activity_tracker
     @activity_tracker ||= ActivityTracker.new('activity:logins', :unique)
   end
diff --git a/app/lib/admin/metrics/measure/base_measure.rb b/app/lib/admin/metrics/measure/base_measure.rb
index 0107ffd9c..ed1df9c7d 100644
--- a/app/lib/admin/metrics/measure/base_measure.rb
+++ b/app/lib/admin/metrics/measure/base_measure.rb
@@ -1,14 +1,25 @@
 # frozen_string_literal: true
 
 class Admin::Metrics::Measure::BaseMeasure
+  CACHE_TTL = 5.minutes.freeze
+
   def self.with_params?
     false
   end
 
+  attr_reader :loaded
+
+  alias loaded? loaded
+
   def initialize(start_at, end_at, params)
     @start_at = start_at&.to_datetime
     @end_at   = end_at&.to_datetime
     @params   = params
+    @loaded   = false
+  end
+
+  def cache_key
+    ["metrics/measure/#{key}", @start_at, @end_at, canonicalized_params].join(';')
   end
 
   def key
@@ -16,15 +27,15 @@ class Admin::Metrics::Measure::BaseMeasure
   end
 
   def total
-    raise NotImplementedError
+    load[:total]
   end
 
   def previous_total
-    raise NotImplementedError
+    load[:previous_total]
   end
 
   def data
-    raise NotImplementedError
+    load[:data]
   end
 
   def self.model_name
@@ -37,6 +48,35 @@ class Admin::Metrics::Measure::BaseMeasure
 
   protected
 
+  def load
+    unless loaded?
+      @values = Rails.cache.fetch(cache_key, expires_in: CACHE_TTL) { perform_queries }.with_indifferent_access
+      @loaded = true
+    end
+
+    @values
+  end
+
+  def perform_queries
+    {
+      total: perform_total_query,
+      previous_total: perform_previous_total_query,
+      data: perform_data_query,
+    }
+  end
+
+  def perform_total_query
+    raise NotImplementedError
+  end
+
+  def perform_previous_total_query
+    raise NotImplementedError
+  end
+
+  def perform_data_query
+    raise NotImplementedError
+  end
+
   def time_period
     (@start_at..@end_at)
   end
@@ -50,6 +90,10 @@ class Admin::Metrics::Measure::BaseMeasure
   end
 
   def params
-    raise NotImplementedError
+    {}
+  end
+
+  def canonicalized_params
+    params.to_h.to_a.sort_by { |k, _v| k.to_s }.map { |k, v| "#{k}=#{v}" }.join(';')
   end
 end
diff --git a/app/lib/admin/metrics/measure/interactions_measure.rb b/app/lib/admin/metrics/measure/interactions_measure.rb
index b928fdb8f..7a2b7e0fa 100644
--- a/app/lib/admin/metrics/measure/interactions_measure.rb
+++ b/app/lib/admin/metrics/measure/interactions_measure.rb
@@ -5,20 +5,20 @@ class Admin::Metrics::Measure::InteractionsMeasure < Admin::Metrics::Measure::Ba
     'interactions'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     activity_tracker.sum(time_period.first, time_period.last)
   end
 
-  def previous_total
+  def perform_previous_total_query
     activity_tracker.sum(previous_time_period.first, previous_time_period.last)
   end
 
-  def data
+  def perform_data_query
     activity_tracker.get(time_period.first, time_period.last).map { |date, value| { date: date.to_time(:utc).iso8601, value: value.to_s } }
   end
 
-  protected
-
   def activity_tracker
     @activity_tracker ||= ActivityTracker.new('activity:interactions', :basic)
   end
diff --git a/app/lib/admin/metrics/measure/new_users_measure.rb b/app/lib/admin/metrics/measure/new_users_measure.rb
index b31679ad3..71191f1a2 100644
--- a/app/lib/admin/metrics/measure/new_users_measure.rb
+++ b/app/lib/admin/metrics/measure/new_users_measure.rb
@@ -5,15 +5,17 @@ class Admin::Metrics::Measure::NewUsersMeasure < Admin::Metrics::Measure::BaseMe
     'new_users'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     User.where(created_at: time_period).count
   end
 
-  def previous_total
+  def perform_previous_total_query
     User.where(created_at: previous_time_period).count
   end
 
-  def data
+  def perform_data_query
     sql = <<-SQL.squish
       SELECT axis.*, (
         WITH new_users AS (
diff --git a/app/lib/admin/metrics/measure/opened_reports_measure.rb b/app/lib/admin/metrics/measure/opened_reports_measure.rb
index 9acc2c33d..4b80a0c8c 100644
--- a/app/lib/admin/metrics/measure/opened_reports_measure.rb
+++ b/app/lib/admin/metrics/measure/opened_reports_measure.rb
@@ -5,15 +5,17 @@ class Admin::Metrics::Measure::OpenedReportsMeasure < Admin::Metrics::Measure::B
     'opened_reports'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     Report.where(created_at: time_period).count
   end
 
-  def previous_total
+  def perform_previous_total_query
     Report.where(created_at: previous_time_period).count
   end
 
-  def data
+  def perform_data_query
     sql = <<-SQL.squish
       SELECT axis.*, (
         WITH new_reports AS (
diff --git a/app/lib/admin/metrics/measure/resolved_reports_measure.rb b/app/lib/admin/metrics/measure/resolved_reports_measure.rb
index 00cb24f7e..4ab746c8f 100644
--- a/app/lib/admin/metrics/measure/resolved_reports_measure.rb
+++ b/app/lib/admin/metrics/measure/resolved_reports_measure.rb
@@ -5,15 +5,17 @@ class Admin::Metrics::Measure::ResolvedReportsMeasure < Admin::Metrics::Measure:
     'resolved_reports'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     Report.resolved.where(action_taken_at: time_period).count
   end
 
-  def previous_total
+  def perform_previous_total_query
     Report.resolved.where(action_taken_at: previous_time_period).count
   end
 
-  def data
+  def perform_data_query
     sql = <<-SQL.squish
       SELECT axis.*, (
         WITH resolved_reports AS (
diff --git a/app/lib/admin/metrics/measure/tag_accounts_measure.rb b/app/lib/admin/metrics/measure/tag_accounts_measure.rb
index ef773081b..8f4512efe 100644
--- a/app/lib/admin/metrics/measure/tag_accounts_measure.rb
+++ b/app/lib/admin/metrics/measure/tag_accounts_measure.rb
@@ -9,20 +9,20 @@ class Admin::Metrics::Measure::TagAccountsMeasure < Admin::Metrics::Measure::Bas
     'tag_accounts'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     tag.history.aggregate(time_period).accounts
   end
 
-  def previous_total
+  def perform_previous_total_query
     tag.history.aggregate(previous_time_period).accounts
   end
 
-  def data
+  def perform_data_query
     time_period.map { |date| { date: date.to_time(:utc).iso8601, value: tag.history.get(date).accounts.to_s } }
   end
 
-  protected
-
   def tag
     @tag ||= Tag.find(params[:id])
   end
diff --git a/app/lib/admin/metrics/measure/tag_servers_measure.rb b/app/lib/admin/metrics/measure/tag_servers_measure.rb
index cc064f63f..11f229602 100644
--- a/app/lib/admin/metrics/measure/tag_servers_measure.rb
+++ b/app/lib/admin/metrics/measure/tag_servers_measure.rb
@@ -9,15 +9,17 @@ class Admin::Metrics::Measure::TagServersMeasure < Admin::Metrics::Measure::Base
     'tag_servers'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     tag.statuses.where('statuses.id BETWEEN ? AND ?', Mastodon::Snowflake.id_at(@start_at, with_random: false), Mastodon::Snowflake.id_at(@end_at, with_random: false)).joins(:account).count('distinct accounts.domain')
   end
 
-  def previous_total
+  def perform_previous_total_query
     tag.statuses.where('statuses.id BETWEEN ? AND ?', Mastodon::Snowflake.id_at(@start_at - length_of_period, with_random: false), Mastodon::Snowflake.id_at(@end_at - length_of_period, with_random: false)).joins(:account).count('distinct accounts.domain')
   end
 
-  def data
+  def perform_data_query
     sql = <<-SQL.squish
       SELECT axis.*, (
         SELECT count(distinct accounts.domain) AS value
@@ -38,8 +40,6 @@ class Admin::Metrics::Measure::TagServersMeasure < Admin::Metrics::Measure::Base
     rows.map { |row| { date: row['day'], value: row['value'].to_s } }
   end
 
-  protected
-
   def tag
     @tag ||= Tag.find(params[:id])
   end
diff --git a/app/lib/admin/metrics/measure/tag_uses_measure.rb b/app/lib/admin/metrics/measure/tag_uses_measure.rb
index b7667bc6c..bce86b89f 100644
--- a/app/lib/admin/metrics/measure/tag_uses_measure.rb
+++ b/app/lib/admin/metrics/measure/tag_uses_measure.rb
@@ -9,20 +9,20 @@ class Admin::Metrics::Measure::TagUsesMeasure < Admin::Metrics::Measure::BaseMea
     'tag_uses'
   end
 
-  def total
+  protected
+
+  def perform_total_query
     tag.history.aggregate(time_period).uses
   end
 
-  def previous_total
+  def perform_previous_total_query
     tag.history.aggregate(previous_time_period).uses
   end
 
-  def data
+  def perform_data_query
     time_period.map { |date| { date: date.to_time(:utc).iso8601, value: tag.history.get(date).uses.to_s } }
   end
 
-  protected
-
   def tag
     @tag ||= Tag.find(params[:id])
   end
diff --git a/app/lib/admin/metrics/retention.rb b/app/lib/admin/metrics/retention.rb
index 0179a6e28..f6135ac1e 100644
--- a/app/lib/admin/metrics/retention.rb
+++ b/app/lib/admin/metrics/retention.rb
@@ -1,6 +1,8 @@
 # frozen_string_literal: true
 
 class Admin::Metrics::Retention
+  CACHE_TTL = 5.minutes.freeze
+
   class Cohort < ActiveModelSerializers::Model
     attributes :period, :frequency, :data
   end
@@ -9,13 +11,37 @@ class Admin::Metrics::Retention
     attributes :date, :rate, :value
   end
 
+  attr_reader :loaded
+
+  alias loaded? loaded
+
   def initialize(start_at, end_at, frequency)
     @start_at  = start_at&.to_date
     @end_at    = end_at&.to_date
     @frequency = %w(day month).include?(frequency) ? frequency : 'day'
+    @loaded    = false
+  end
+
+  def cache_key
+    ['metrics/retention', @start_at, @end_at, @frequency].join(';')
   end
 
   def cohorts
+    load
+  end
+
+  protected
+
+  def load
+    unless loaded?
+      @values = Rails.cache.fetch(cache_key, expires_in: CACHE_TTL) { perform_query }
+      @loaded = true
+    end
+
+    @values
+  end
+
+  def perform_query
     sql = <<-SQL.squish
       SELECT axis.*, (
         WITH new_users AS (
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index 0713aa471..2c16689bd 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -499,7 +499,7 @@ class FeedManager
 
     return false if active_filters.empty?
 
-    combined_regex = active_filters.reduce { |memo, obj| Regexp.union(memo, obj) }
+    combined_regex = Regexp.union(active_filters)
     status         = status.reblog if status.reblog?
 
     combined_text = [
@@ -549,7 +549,7 @@ class FeedManager
       end
     else
       # A reblog may reach earlier than the original status because of the
-      # delay of the worker deliverying the original status, the late addition
+      # delay of the worker delivering the original status, the late addition
       # by merging timelines, and other reasons.
       # If such a reblog already exists, just do not re-insert it into the feed.
       return false unless redis.zscore(reblog_key, status.id).nil?
diff --git a/app/lib/search_query_transformer.rb b/app/lib/search_query_transformer.rb
index e07ebfffe..c685d7b6f 100644
--- a/app/lib/search_query_transformer.rb
+++ b/app/lib/search_query_transformer.rb
@@ -2,19 +2,21 @@
 
 class SearchQueryTransformer < Parslet::Transform
   class Query
-    attr_reader :should_clauses, :must_not_clauses, :must_clauses
+    attr_reader :should_clauses, :must_not_clauses, :must_clauses, :filter_clauses
 
     def initialize(clauses)
       grouped = clauses.chunk(&:operator).to_h
       @should_clauses = grouped.fetch(:should, [])
       @must_not_clauses = grouped.fetch(:must_not, [])
       @must_clauses = grouped.fetch(:must, [])
+      @filter_clauses = grouped.fetch(:filter, [])
     end
 
     def apply(search)
       should_clauses.each { |clause| search = search.query.should(clause_to_query(clause)) }
       must_clauses.each { |clause| search = search.query.must(clause_to_query(clause)) }
       must_not_clauses.each { |clause| search = search.query.must_not(clause_to_query(clause)) }
+      filter_clauses.each { |clause| search = search.filter(**clause_to_filter(clause)) }
       search.query.minimum_should_match(1)
     end
 
@@ -30,6 +32,15 @@ class SearchQueryTransformer < Parslet::Transform
         raise "Unexpected clause type: #{clause}"
       end
     end
+
+    def clause_to_filter(clause)
+      case clause
+      when PrefixClause
+        { term: { clause.filter => clause.term } }
+      else
+        raise "Unexpected clause type: #{clause}"
+      end
+    end
   end
 
   class Operator
@@ -69,11 +80,33 @@ class SearchQueryTransformer < Parslet::Transform
     end
   end
 
+  class PrefixClause
+    attr_reader :filter, :operator, :term
+
+    def initialize(prefix, term)
+      @operator = :filter
+      case prefix
+      when 'from'
+        @filter = :account_id
+        username, domain = term.split('@')
+        account = Account.find_remote(username, domain)
+
+        raise "Account not found: #{term}" unless account
+
+        @term = account.id
+      else
+        raise "Unknown prefix: #{prefix}"
+      end
+    end
+  end
+
   rule(clause: subtree(:clause)) do
     prefix   = clause[:prefix][:term].to_s if clause[:prefix]
     operator = clause[:operator]&.to_s
 
-    if clause[:term]
+    if clause[:prefix]
+      PrefixClause.new(prefix, clause[:term].to_s)
+    elsif clause[:term]
       TermClause.new(prefix, operator, clause[:term].to_s)
     elsif clause[:shortcode]
       TermClause.new(prefix, operator, ":#{clause[:term]}:")
diff --git a/app/lib/video_metadata_extractor.rb b/app/lib/video_metadata_extractor.rb
index 03e40f923..2896620cb 100644
--- a/app/lib/video_metadata_extractor.rb
+++ b/app/lib/video_metadata_extractor.rb
@@ -2,7 +2,7 @@
 
 class VideoMetadataExtractor
   attr_reader :duration, :bitrate, :video_codec, :audio_codec,
-              :colorspace, :width, :height, :frame_rate
+              :colorspace, :width, :height, :frame_rate, :r_frame_rate
 
   def initialize(path)
     @path     = path
@@ -42,6 +42,7 @@ class VideoMetadataExtractor
         @width       = video_stream[:width]
         @height      = video_stream[:height]
         @frame_rate  = video_stream[:avg_frame_rate] == '0/0' ? nil : Rational(video_stream[:avg_frame_rate])
+        @r_frame_rate = video_stream[:r_frame_rate] == '0/0' ? nil : Rational(video_stream[:r_frame_rate])
       end
 
       if (audio_stream = audio_streams.first)
diff --git a/app/mailers/admin_mailer.rb b/app/mailers/admin_mailer.rb
index b23bd1296..a9d00c000 100644
--- a/app/mailers/admin_mailer.rb
+++ b/app/mailers/admin_mailer.rb
@@ -15,6 +15,16 @@ class AdminMailer < ApplicationMailer
     end
   end
 
+  def new_appeal(recipient, appeal)
+    @appeal   = appeal
+    @me       = recipient
+    @instance = Rails.configuration.x.local_domain
+
+    locale_for_account(@me) do
+      mail to: @me.user_email, subject: I18n.t('admin_mailer.new_appeal.subject', instance: @instance, username: @appeal.account.username)
+    end
+  end
+
   def new_pending_account(recipient, user)
     @account  = user.account
     @me       = recipient
diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb
index 5221a4892..1a823328c 100644
--- a/app/mailers/user_mailer.rb
+++ b/app/mailers/user_mailer.rb
@@ -169,7 +169,27 @@ class UserMailer < Devise::Mailer
     I18n.with_locale(@resource.locale || I18n.default_locale) do
       mail to: @resource.email,
            subject: I18n.t("user_mailer.warning.subject.#{@warning.action}", acct: "@#{user.account.local_username_and_domain}"),
-           reply_to: Setting.site_contact_email
+           reply_to: ENV['SMTP_REPLY_TO']
+    end
+  end
+
+  def appeal_approved(user, appeal)
+    @resource = user
+    @instance = Rails.configuration.x.local_domain
+    @appeal   = appeal
+
+    I18n.with_locale(@resource.locale || I18n.default_locale) do
+      mail to: @resource.email, subject: I18n.t('user_mailer.appeal_approved.subject', date: l(@appeal.created_at))
+    end
+  end
+
+  def appeal_rejected(user, appeal)
+    @resource = user
+    @instance = Rails.configuration.x.local_domain
+    @appeal   = appeal
+
+    I18n.with_locale(@resource.locale || I18n.default_locale) do
+      mail to: @resource.email, subject: I18n.t('user_mailer.appeal_rejected.subject', date: l(@appeal.created_at))
     end
   end
 
@@ -186,7 +206,7 @@ class UserMailer < Devise::Mailer
     I18n.with_locale(@resource.locale || I18n.default_locale) do
       mail to: @resource.email,
            subject: I18n.t('user_mailer.sign_in_token.subject'),
-           reply_to: Setting.site_contact_email
+           reply_to: ENV['SMTP_REPLY_TO']
     end
   end
 end
diff --git a/app/models/account.rb b/app/models/account.rb
index e41fdf003..8f6663e7c 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -274,6 +274,10 @@ class Account < ApplicationRecord
     true
   end
 
+  def previous_strikes_count
+    strikes.where(overruled_at: nil).count
+  end
+
   def keypair
     @keypair ||= OpenSSL::PKey::RSA.new(private_key || public_key)
   end
diff --git a/app/models/account_filter.rb b/app/models/account_filter.rb
index dcb174122..9da1522dd 100644
--- a/app/models/account_filter.rb
+++ b/app/models/account_filter.rb
@@ -24,6 +24,8 @@ class AccountFilter
     scope = Account.includes(:account_stat, user: [:ips, :invite_request]).without_instance_actor.reorder(nil)
 
     params.each do |key, value|
+      next if key.to_s == 'page'
+
       scope.merge!(scope_for(key, value.to_s.strip)) if value.present?
     end
 
@@ -49,7 +51,7 @@ class AccountFilter
     when 'email'
       accounts_with_users.merge(User.matches_email(value))
     when 'ip'
-      valid_ip?(value) ? accounts_with_users.merge(User.matches_ip(value)) : Account.none
+      valid_ip?(value) ? accounts_with_users.merge(User.matches_ip(value).group('users.id, accounts.id')) : Account.none
     when 'invited_by'
       invited_by_scope(value)
     when 'order'
diff --git a/app/models/account_warning.rb b/app/models/account_warning.rb
index fc0d988fd..05d01942d 100644
--- a/app/models/account_warning.rb
+++ b/app/models/account_warning.rb
@@ -12,6 +12,7 @@
 #  updated_at        :datetime         not null
 #  report_id         :bigint(8)
 #  status_ids        :string           is an Array
+#  overruled_at      :datetime
 #
 
 class AccountWarning < ApplicationRecord
@@ -28,12 +29,17 @@ class AccountWarning < ApplicationRecord
   belongs_to :target_account, class_name: 'Account', inverse_of: :strikes
   belongs_to :report, optional: true
 
-  has_one :appeal, dependent: :destroy
+  has_one :appeal, dependent: :destroy, inverse_of: :strike
 
   scope :latest, -> { order(id: :desc) }
   scope :custom, -> { where.not(text: '') }
+  scope :active, -> { where(overruled_at: nil).or(where('account_warnings.overruled_at >= ?', 30.days.ago)) }
 
   def statuses
     Status.with_discarded.where(id: status_ids || [])
   end
+
+  def overruled?
+    overruled_at.present?
+  end
 end
diff --git a/app/models/admin/action_log_filter.rb b/app/models/admin/action_log_filter.rb
index 12136223b..0f2f712a2 100644
--- a/app/models/admin/action_log_filter.rb
+++ b/app/models/admin/action_log_filter.rb
@@ -8,6 +8,8 @@ class Admin::ActionLogFilter
   ).freeze
 
   ACTION_TYPE_MAP = {
+    approve_appeal: { target_type: 'Appeal', action: 'approve' }.freeze,
+    reject_appeal: { target_type: 'Appeal', action: 'reject' }.freeze,
     assigned_to_self_report: { target_type: 'Report', action: 'assigned_to_self' }.freeze,
     change_email_user: { target_type: 'User', action: 'change_email' }.freeze,
     confirm_user: { target_type: 'User', action: 'confirm' }.freeze,
diff --git a/app/models/admin/appeal_filter.rb b/app/models/admin/appeal_filter.rb
new file mode 100644
index 000000000..b163d2e56
--- /dev/null
+++ b/app/models/admin/appeal_filter.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+class Admin::AppealFilter
+  KEYS = %i(
+    status
+  ).freeze
+
+  attr_reader :params
+
+  def initialize(params)
+    @params = params
+  end
+
+  def results
+    scope = Appeal.order(id: :desc)
+
+    params.each do |key, value|
+      next if %w(page).include?(key.to_s)
+
+      scope.merge!(scope_for(key, value.to_s.strip)) if value.present?
+    end
+
+    scope
+  end
+
+  private
+
+  def scope_for(key, value)
+    case key.to_s
+    when 'status'
+      status_scope(value)
+    else
+      raise "Unknown filter: #{key}"
+    end
+  end
+
+  def status_scope(value)
+    case value
+    when 'approved'
+      Appeal.approved
+    when 'rejected'
+      Appeal.rejected
+    when 'pending'
+      Appeal.pending
+    else
+      raise "Unknown status: #{value}"
+    end
+  end
+end
diff --git a/app/models/admin/status_filter.rb b/app/models/admin/status_filter.rb
index ce5bb5f46..4fba612a6 100644
--- a/app/models/admin/status_filter.rb
+++ b/app/models/admin/status_filter.rb
@@ -31,7 +31,7 @@ class Admin::StatusFilter
   def scope_for(key, value)
     case key.to_s
     when 'media'
-      Status.joins(:media_attachments).merge(@account.media_attachments.reorder(nil)).group(:id)
+      Status.joins(:media_attachments).merge(@account.media_attachments.reorder(nil)).group(:id).reorder('statuses.id desc')
     when 'id'
       Status.where(id: value)
     else
diff --git a/app/models/appeal.rb b/app/models/appeal.rb
new file mode 100644
index 000000000..1f32cfa8b
--- /dev/null
+++ b/app/models/appeal.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: appeals
+#
+#  id                     :bigint(8)        not null, primary key
+#  account_id             :bigint(8)        not null
+#  account_warning_id     :bigint(8)        not null
+#  text                   :text             default(""), not null
+#  approved_at            :datetime
+#  approved_by_account_id :bigint(8)
+#  rejected_at            :datetime
+#  rejected_by_account_id :bigint(8)
+#  created_at             :datetime         not null
+#  updated_at             :datetime         not null
+#
+class Appeal < ApplicationRecord
+  MAX_STRIKE_AGE = 20.days
+
+  belongs_to :account
+  belongs_to :strike, class_name: 'AccountWarning', foreign_key: 'account_warning_id'
+  belongs_to :approved_by_account, class_name: 'Account', optional: true
+  belongs_to :rejected_by_account, class_name: 'Account', optional: true
+
+  validates :text, presence: true, length: { maximum: 2_000 }
+  validates :account_warning_id, uniqueness: true
+
+  validate :validate_time_frame, on: :create
+
+  scope :approved, -> { where.not(approved_at: nil) }
+  scope :rejected, -> { where.not(rejected_at: nil) }
+  scope :pending, -> { where(approved_at: nil, rejected_at: nil) }
+
+  def pending?
+    !approved? && !rejected?
+  end
+
+  def approved?
+    approved_at.present?
+  end
+
+  def rejected?
+    rejected_at.present?
+  end
+
+  def approve!(current_account)
+    update!(approved_at: Time.now.utc, approved_by_account: current_account)
+  end
+
+  def reject!(current_account)
+    update!(rejected_at: Time.now.utc, rejected_by_account: current_account)
+  end
+
+  private
+
+  def validate_time_frame
+    errors.add(:base, I18n.t('strikes.errors.too_late')) if strike.created_at < MAX_STRIKE_AGE.ago
+  end
+end
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index 9eaacdc03..4b38d729e 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -38,6 +38,12 @@ class MediaAttachment < ApplicationRecord
 
   MAX_DESCRIPTION_LENGTH = 1_500
 
+  IMAGE_LIMIT = (ENV['MAX_IMAGE_SIZE'] || 10.megabytes).to_i
+  VIDEO_LIMIT = (ENV['MAX_VIDEO_SIZE'] || 40.megabytes).to_i
+
+  MAX_VIDEO_MATRIX_LIMIT = 2_304_000 # 1920x1200px
+  MAX_VIDEO_FRAME_RATE   = 60
+
   IMAGE_FILE_EXTENSIONS = %w(.jpg .jpeg .png .gif).freeze
   VIDEO_FILE_EXTENSIONS = %w(.webm .mp4 .m4v .mov).freeze
   AUDIO_FILE_EXTENSIONS = %w(.ogg .oga .mp3 .wav .flac .opus .aac .m4a .3gp .wma).freeze
@@ -75,6 +81,7 @@ class MediaAttachment < ApplicationRecord
   VIDEO_FORMAT = {
     format: 'mp4',
     content_type: 'video/mp4',
+    vfr_frame_rate_threshold: MAX_VIDEO_FRAME_RATE,
     convert_options: {
       output: {
         'loglevel' => 'fatal',
@@ -152,12 +159,6 @@ class MediaAttachment < ApplicationRecord
     all: '-quality 90 -strip +set modify-date +set create-date',
   }.freeze
 
-  IMAGE_LIMIT = (ENV['MAX_IMAGE_SIZE'] || 10.megabytes).to_i
-  VIDEO_LIMIT = (ENV['MAX_VIDEO_SIZE'] || 40.megabytes).to_i
-
-  MAX_VIDEO_MATRIX_LIMIT = 2_304_000 # 1920x1200px
-  MAX_VIDEO_FRAME_RATE   = 60
-
   belongs_to :account,          inverse_of: :media_attachments, optional: true
   belongs_to :status,           inverse_of: :media_attachments, optional: true
   belongs_to :scheduled_status, inverse_of: :media_attachments, optional: true
diff --git a/app/models/notification.rb b/app/models/notification.rb
index c14eb8a7e..9bf296386 100644
--- a/app/models/notification.rb
+++ b/app/models/notification.rb
@@ -36,6 +36,7 @@ class Notification < ApplicationRecord
     favourite
     poll
     update
+    admin.sign_up
   ).freeze
 
   TARGET_STATUS_INCLUDES_BY_TYPE = {
@@ -63,13 +64,10 @@ class Notification < ApplicationRecord
   scope :without_suspended, -> { joins(:from_account).merge(Account.without_suspended) }
 
   scope :browserable, ->(exclude_types = [], account_id = nil) {
-    types = TYPES - exclude_types.map(&:to_sym)
-
-    if account_id.nil?
-      where(type: types)
-    else
-      where(type: types, from_account_id: account_id)
-    end
+    scope = all
+    scope = where(from_account_id: account_id) if account_id.present?
+    scope = scope.where(type: TYPES - exclude_types.map(&:to_sym)) unless exclude_types.empty?
+    scope
   }
 
   def type
@@ -142,6 +140,8 @@ class Notification < ApplicationRecord
       self.from_account_id = activity&.account_id
     when 'Mention'
       self.from_account_id = activity&.status&.account_id
+    when 'Account'
+      self.from_account_id = activity&.id
     end
   end
 end
diff --git a/app/models/user.rb b/app/models/user.rb
index ee20e293e..a21e96ae5 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -111,7 +111,7 @@ class User < ApplicationRecord
   scope :inactive, -> { where(arel_table[:current_sign_in_at].lt(ACTIVE_DURATION.ago)) }
   scope :active, -> { confirmed.where(arel_table[:current_sign_in_at].gteq(ACTIVE_DURATION.ago)).joins(:account).where(accounts: { suspended_at: nil }) }
   scope :matches_email, ->(value) { where(arel_table[:email].matches("#{value}%")) }
-  scope :matches_ip, ->(value) { left_joins(:ips).where('user_ips.ip <<= ?', value) }
+  scope :matches_ip, ->(value) { left_joins(:ips).where('user_ips.ip <<= ?', value).group('users.id') }
   scope :emailable, -> { confirmed.enabled.joins(:account).merge(Account.searchable) }
 
   before_validation :sanitize_languages
@@ -265,6 +265,10 @@ class User < ApplicationRecord
     settings.notification_emails['pending_account']
   end
 
+  def allows_appeal_emails?
+    settings.notification_emails['appeal']
+  end
+
   def allows_trending_tag_emails?
     settings.notification_emails['trending_tag']
   end
diff --git a/app/policies/account_warning_policy.rb b/app/policies/account_warning_policy.rb
new file mode 100644
index 000000000..65707dfa7
--- /dev/null
+++ b/app/policies/account_warning_policy.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class AccountWarningPolicy < ApplicationPolicy
+  def show?
+    target? || staff?
+  end
+
+  def appeal?
+    target? && record.created_at >= Appeal::MAX_STRIKE_AGE.ago
+  end
+
+  private
+
+  def target?
+    record.target_account_id == current_account&.id
+  end
+end
diff --git a/app/policies/appeal_policy.rb b/app/policies/appeal_policy.rb
new file mode 100644
index 000000000..a25187172
--- /dev/null
+++ b/app/policies/appeal_policy.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AppealPolicy < ApplicationPolicy
+  def index?
+    staff?
+  end
+
+  def approve?
+    record.pending? && staff?
+  end
+
+  alias reject? approve?
+end
diff --git a/app/services/appeal_service.rb b/app/services/appeal_service.rb
new file mode 100644
index 000000000..1397c50f5
--- /dev/null
+++ b/app/services/appeal_service.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class AppealService < BaseService
+  def call(strike, text)
+    @strike = strike
+    @text   = text
+
+    create_appeal!
+    notify_staff!
+
+    @appeal
+  end
+
+  private
+
+  def create_appeal!
+    @appeal = @strike.create_appeal!(
+      text: @text,
+      account: @strike.target_account
+    )
+  end
+
+  def notify_staff!
+    User.staff.includes(:account).each do |u|
+      AdminMailer.new_appeal(u.account, @appeal).deliver_later if u.allows_appeal_emails?
+    end
+  end
+end
diff --git a/app/services/approve_appeal_service.rb b/app/services/approve_appeal_service.rb
new file mode 100644
index 000000000..f76bf8943
--- /dev/null
+++ b/app/services/approve_appeal_service.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+class ApproveAppealService < BaseService
+  def call(appeal, current_account)
+    @appeal          = appeal
+    @strike          = appeal.strike
+    @current_account = current_account
+
+    ApplicationRecord.transaction do
+      undo_strike_action!
+      mark_strike_as_appealed!
+    end
+
+    queue_workers!
+    notify_target_account!
+  end
+
+  private
+
+  def target_account
+    @strike.target_account
+  end
+
+  def undo_strike_action!
+    case @strike.action
+    when 'disable'
+      undo_disable!
+    when 'delete_statuses'
+      undo_delete_statuses!
+    when 'sensitive'
+      undo_sensitive!
+    when 'silence'
+      undo_silence!
+    when 'suspend'
+      undo_suspend!
+    end
+  end
+
+  def mark_strike_as_appealed!
+    @appeal.approve!(@current_account)
+    @strike.touch(:overruled_at)
+  end
+
+  def undo_disable!
+    target_account.user.enable!
+  end
+
+  def undo_delete_statuses!
+    # Cannot be undone
+  end
+
+  def undo_sensitive!
+    target_account.unsensitize!
+  end
+
+  def undo_silence!
+    target_account.unsilence!
+  end
+
+  def undo_suspend!
+    target_account.unsuspend!
+  end
+
+  def queue_workers!
+    case @strike.action
+    when 'suspend'
+      Admin::UnsuspensionWorker.perform_async(target_account.id)
+    end
+  end
+
+  def notify_target_account!
+    UserMailer.appeal_approved(target_account.user, @appeal).deliver_later
+  end
+end
diff --git a/app/services/bootstrap_timeline_service.rb b/app/services/bootstrap_timeline_service.rb
index e1a1b98c3..312c163e4 100644
--- a/app/services/bootstrap_timeline_service.rb
+++ b/app/services/bootstrap_timeline_service.rb
@@ -5,6 +5,7 @@ class BootstrapTimelineService < BaseService
     @source_account = source_account
 
     autofollow_inviter!
+    notify_staff!
   end
 
   private
@@ -14,4 +15,10 @@ class BootstrapTimelineService < BaseService
 
     FollowService.new.call(@source_account, @source_account.user.invite.user.account)
   end
+
+  def notify_staff!
+    User.staff.includes(:account).find_each do |user|
+      NotifyService.new.call(user.account, :'admin.sign_up', @source_account)
+    end
+  end
 end
diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb
index 94dc6389f..239ab9b93 100644
--- a/app/services/fetch_link_card_service.rb
+++ b/app/services/fetch_link_card_service.rb
@@ -2,7 +2,7 @@
 
 class FetchLinkCardService < BaseService
   URL_PATTERN = %r{
-    (#{Twitter::TwitterText::Regex[:valid_url_preceding_chars]})                                                                #   $1 preceeding chars
+    (#{Twitter::TwitterText::Regex[:valid_url_preceding_chars]})                                                                #   $1 preceding chars
     (                                                                                                                           #   $2 URL
       (https?:\/\/)                                                                                                             #   $3 Protocol (required)
       (#{Twitter::TwitterText::Regex[:valid_domain]})                                                                           #   $4 Domain(s)
diff --git a/app/services/notify_service.rb b/app/services/notify_service.rb
index 039e007f5..b1f9fd755 100644
--- a/app/services/notify_service.rb
+++ b/app/services/notify_service.rb
@@ -22,34 +22,6 @@ class NotifyService < BaseService
     FeedManager.instance.filter?(:mentions, @notification.mention.status, @recipient)
   end
 
-  def blocked_status?
-    false
-  end
-
-  def blocked_favourite?
-    false
-  end
-
-  def blocked_follow?
-    false
-  end
-
-  def blocked_reblog?
-    false
-  end
-
-  def blocked_follow_request?
-    false
-  end
-
-  def blocked_poll?
-    false
-  end
-
-  def blocked_update?
-    false
-  end
-
   def following_sender?
     return @following_sender if defined?(@following_sender)
     @following_sender = @recipient.following?(@notification.from_account) || @recipient.requested?(@notification.from_account)
@@ -71,7 +43,7 @@ class NotifyService < BaseService
     message? && @notification.target_status.direct_visibility?
   end
 
-  # Returns true if the sender has been mentionned by the recipient up the thread
+  # Returns true if the sender has been mentioned by the recipient up the thread
   def response_to_recipient?
     return false if @notification.target_status.in_reply_to_id.nil?
 
@@ -149,15 +121,15 @@ class NotifyService < BaseService
 
     return blocked if message? && from_staff?
 
-    blocked ||= domain_blocking?                                 # Skip for domain blocked accounts
-    blocked ||= @recipient.blocking?(@notification.from_account) # Skip for blocked accounts
+    blocked ||= domain_blocking?
+    blocked ||= @recipient.blocking?(@notification.from_account)
     blocked ||= @recipient.muting_notifications?(@notification.from_account)
-    blocked ||= hellbanned?                                      # Hellban
-    blocked ||= optional_non_follower?                           # Options
-    blocked ||= optional_non_following?                          # Options
-    blocked ||= optional_non_following_and_direct?               # Options
+    blocked ||= hellbanned?
+    blocked ||= optional_non_follower?
+    blocked ||= optional_non_following?
+    blocked ||= optional_non_following_and_direct?
     blocked ||= conversation_muted?
-    blocked ||= send("blocked_#{@notification.type}?")           # Type-dependent filters
+    blocked ||= blocked_mention? if @notification.type == :mention
     blocked
   end
 
diff --git a/app/views/admin/account_moderation_notes/_account_moderation_note.html.haml b/app/views/admin/account_moderation_notes/_account_moderation_note.html.haml
deleted file mode 100644
index 432fb79a6..000000000
--- a/app/views/admin/account_moderation_notes/_account_moderation_note.html.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-.speech-bubble
-  .speech-bubble__bubble
-    = simple_format(h(account_moderation_note.content))
-  .speech-bubble__owner
-    = admin_account_link_to account_moderation_note.account
-    %time.formatted{ datetime: account_moderation_note.created_at.iso8601 }= l account_moderation_note.created_at
-    = table_link_to 'trash', t('admin.account_moderation_notes.delete'), admin_account_moderation_note_path(account_moderation_note), method: :delete if can?(:destroy, account_moderation_note)
diff --git a/app/views/admin/account_warnings/_account_warning.html.haml b/app/views/admin/account_warnings/_account_warning.html.haml
index 8c9c9679c..1462e76d0 100644
--- a/app/views/admin/account_warnings/_account_warning.html.haml
+++ b/app/views/admin/account_warnings/_account_warning.html.haml
@@ -1,6 +1,25 @@
-.speech-bubble.warning
-  .speech-bubble__bubble
-    = Formatter.instance.linkify(account_warning.text)
-  .speech-bubble__owner
-    = admin_account_link_to account_warning.account
-    %time.formatted{ datetime: account_warning.created_at.iso8601 }= l account_warning.created_at
+= link_to disputes_strike_path(account_warning), class: 'log-entry' do
+  .log-entry__header
+    .log-entry__avatar
+      .indicator-icon{ class: account_warning.overruled? ? 'success' : 'failure' }
+        = fa_icon 'warning'
+    .log-entry__content
+      .log-entry__title
+        = t(account_warning.action, scope: 'admin.strikes.actions', name: content_tag(:span, account_warning.account.username, class: 'username'), target: content_tag(:span, account_warning.target_account.acct, class: 'target')).html_safe
+      .log-entry__timestamp
+        %time.formatted{ datetime: account_warning.created_at.iso8601 }
+          = l(account_warning.created_at)
+
+        - if account_warning.report_id.present?
+          ·
+          = t('admin.reports.report', id: account_warning.report_id)
+
+        - if account_warning.overruled?
+          ·
+          %span.positive-hint= t('admin.strikes.appeal_approved')
+        - elsif account_warning.appeal&.pending?
+          ·
+          %span.warning-hint= t('admin.strikes.appeal_pending')
+        - elsif account_warning.appeal&.rejected?
+          ·
+          %span.negative-hint= t('admin.strikes.appeal_rejected')
diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml
index f3853d629..9a1f07a06 100644
--- a/app/views/admin/accounts/show.html.haml
+++ b/app/views/admin/accounts/show.html.haml
@@ -246,18 +246,29 @@
   %hr.spacer/
 
   - unless @warnings.empty?
-    = render @warnings
+
+    %h3= t 'admin.accounts.previous_strikes'
+
+    %p= t('admin.accounts.previous_strikes_description_html', count: @account.previous_strikes_count)
+
+    .account-strikes
+      = render @warnings
 
     %hr.spacer/
 
-  = render @moderation_notes
+  %h3= t 'admin.reports.notes.title'
 
-  = simple_form_for @account_moderation_note, url: admin_account_moderation_notes_path do |f|
-    = render 'shared/error_messages', object: @account_moderation_note
+  %p= t 'admin.reports.notes_description_html'
 
-    = f.input :content, placeholder: t('admin.reports.notes.placeholder'), rows: 6
+  .report-notes
+    = render partial: 'admin/report_notes/report_note', collection: @moderation_notes
+
+  = simple_form_for @account_moderation_note, url: admin_account_moderation_notes_path do |f|
     = f.hidden_field :target_account_id
 
+    .field-group
+      = f.input :content, placeholder: t('admin.reports.notes.placeholder'), rows: 6
+
     .actions
       = f.button :button, t('admin.account_moderation_notes.create'), type: :submit
 
diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml
index 2ee13b9e2..66e0c0251 100644
--- a/app/views/admin/dashboard/index.html.haml
+++ b/app/views/admin/dashboard/index.html.haml
@@ -16,10 +16,10 @@
 
 .dashboard
   .dashboard__item
-    = react_admin_component :counter, measure: 'new_users', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.new_users'), href: admin_accounts_path
+    = react_admin_component :counter, measure: 'new_users', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.new_users'), href: admin_accounts_path(origin: 'local')
 
   .dashboard__item
-    = react_admin_component :counter, measure: 'active_users', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.active_users'), href: admin_accounts_path
+    = react_admin_component :counter, measure: 'active_users', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.active_users'), href: admin_accounts_path(origin: 'local')
 
   .dashboard__item
     = react_admin_component :counter, measure: 'interactions', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.interactions')
@@ -43,6 +43,9 @@
       %span= t('admin.dashboard.pending_tags_html', count: @pending_tags_count)
       = fa_icon 'chevron-right fw'
 
+    = link_to admin_disputes_appeals_path(status: 'pending'), class: 'dashboard__quick-access' do
+      %span= t('admin.dashboard.pending_appeals_html', count: @pending_appeals_count)
+      = fa_icon 'chevron-right fw'
   .dashboard__item
     = react_admin_component :dimension, dimension: 'sources', start_at: @time_period.first, end_at: @time_period.last, limit: 8, label: t('admin.dashboard.sources')
 
diff --git a/app/views/admin/disputes/appeals/_appeal.html.haml b/app/views/admin/disputes/appeals/_appeal.html.haml
new file mode 100644
index 000000000..02b8777e1
--- /dev/null
+++ b/app/views/admin/disputes/appeals/_appeal.html.haml
@@ -0,0 +1,21 @@
+= link_to disputes_strike_path(appeal.strike), class: ['log-entry', appeal.approved? && 'log-entry--inactive'] do
+  .log-entry__header
+    .log-entry__avatar
+      = image_tag appeal.account.avatar.url(:original), alt: '', width: 40, height: 40, class: 'avatar'
+    .log-entry__content
+      .log-entry__title
+        = t(appeal.strike.action, scope: 'admin.strikes.actions', name: content_tag(:span, appeal.strike.account.username, class: 'username'), target: content_tag(:span, appeal.account.acct, class: 'target')).html_safe
+      .log-entry__timestamp
+        %time.formatted{ datetime: appeal.strike.created_at.iso8601 }
+          = l(appeal.strike.created_at)
+
+        - if appeal.strike.report_id.present?
+          ·
+          = t('admin.reports.title', id: appeal.strike.report_id)
+        ·
+        - if appeal.approved?
+          %span.positive-hint= t('admin.strikes.appeal_approved')
+        - elsif appeal.rejected?
+          %span.negative-hint= t('admin.strikes.appeal_rejected')
+        - else
+          %span.warning-hint= t('admin.strikes.appeal_pending')
diff --git a/app/views/admin/disputes/appeals/index.html.haml b/app/views/admin/disputes/appeals/index.html.haml
new file mode 100644
index 000000000..42e9c4b1d
--- /dev/null
+++ b/app/views/admin/disputes/appeals/index.html.haml
@@ -0,0 +1,19 @@
+- content_for :page_title do
+  = t('admin.disputes.appeals.title')
+
+.filters
+  .filter-subset
+    %strong= t('admin.tags.review')
+    %ul
+      %li= filter_link_to safe_join([t('admin.accounts.moderation.pending'), "(#{Appeal.pending.count})"], ' '), status: 'pending'
+      %li= filter_link_to t('admin.trends.approved'), status: 'approved'
+      %li= filter_link_to t('admin.trends.rejected'), status: 'rejected'
+
+- if @appeals.empty?
+  %div.muted-hint.center-text
+    = t 'admin.disputes.appeals.empty'
+- else
+  .announcements-list
+    = render partial: 'appeal', collection: @appeals
+
+= paginate @appeals
diff --git a/app/views/admin/report_notes/_report_note.html.haml b/app/views/admin/report_notes/_report_note.html.haml
index 428b6cf59..f9d57c2ae 100644
--- a/app/views/admin/report_notes/_report_note.html.haml
+++ b/app/views/admin/report_notes/_report_note.html.haml
@@ -3,7 +3,7 @@
 
   .report-notes__item__header
     %span.username
-      = link_to display_name(report_note.account), admin_account_path(report_note.account_id)
+      = 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))
diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml
index 018a0c54a..abcbec949 100644
--- a/app/views/admin/reports/show.html.haml
+++ b/app/views/admin/reports/show.html.haml
@@ -53,7 +53,7 @@
         .report-header__details__item__header
           %strong= t('admin.accounts.strikes')
         .report-header__details__item__content
-          = @report.target_account.strikes.count
+          = @report.target_account.previous_strikes_count
 
   .report-header__details
     .report-header__details__item
diff --git a/app/views/admin_mailer/new_appeal.text.erb b/app/views/admin_mailer/new_appeal.text.erb
new file mode 100644
index 000000000..db4529eb7
--- /dev/null
+++ b/app/views/admin_mailer/new_appeal.text.erb
@@ -0,0 +1,9 @@
+<%= raw t('application_mailer.salutation', name: display_name(@me)) %>
+
+<%= raw t('admin_mailer.new_appeal.body', target: @appeal.account.username, action_taken_by: @appeal.strike.account.username, date: l(@appeal.strike.created_at), type: t(@appeal.strike.action, scope: 'admin_mailer.new_appeal.actions')) %>
+
+> <%= raw word_wrap(@appeal.text, break_sequence: "\n> ") %>
+
+<%= raw t('admin_mailer.new_appeal.next_steps') %>
+
+<%= raw t('application_mailer.view')%> <%= disputes_strike_url(@appeal.strike) %>
diff --git a/app/views/admin_mailer/new_trending_tags.text.erb b/app/views/admin_mailer/new_trending_tags.text.erb
index 5051e8a96..9ea31fa7c 100644
--- a/app/views/admin_mailer/new_trending_tags.text.erb
+++ b/app/views/admin_mailer/new_trending_tags.text.erb
@@ -13,4 +13,4 @@
 <%= t('admin_mailer.new_trending_tags.no_approved_tags') %>
 <% end %>
 
-<%= raw t('application_mailer.view')%> <%= admin_trends_tags_url(pending_review: '1') %>
+<%= raw t('application_mailer.view')%> <%= admin_trends_tags_url(status: 'pending_review') %>
diff --git a/app/views/auth/registrations/_account_warning.html.haml b/app/views/auth/registrations/_account_warning.html.haml
new file mode 100644
index 000000000..40e7e1296
--- /dev/null
+++ b/app/views/auth/registrations/_account_warning.html.haml
@@ -0,0 +1,20 @@
+= link_to disputes_strike_path(account_warning), class: 'log-entry' do
+  .log-entry__header
+    .log-entry__avatar
+      .indicator-icon{ class: account_warning.overruled? ? 'success' : 'failure' }
+        = fa_icon 'warning'
+    .log-entry__content
+      .log-entry__title
+        = t('disputes.strikes.title', action: t(account_warning.action, scope: 'disputes.strikes.title_actions'), date: l(account_warning.created_at.to_date))
+      .log-entry__timestamp
+        %time.formatted{ datetime: account_warning.created_at.iso8601 }= l(account_warning.created_at)
+
+        - if account_warning.overruled?
+          ·
+          %span.positive-hint= t('disputes.strikes.your_appeal_approved')
+        - elsif account_warning.appeal&.pending?
+          ·
+          %span.warning-hint= t('disputes.strikes.your_appeal_pending')
+        - elsif account_warning.appeal&.rejected?
+          ·
+          %span.negative-hint= t('disputes.strikes.your_appeal_rejected')
diff --git a/app/views/auth/registrations/_status.html.haml b/app/views/auth/registrations/_status.html.haml
index 47112dae0..3546510b2 100644
--- a/app/views/auth/registrations/_status.html.haml
+++ b/app/views/auth/registrations/_status.html.haml
@@ -1,22 +1,17 @@
+- if !@user.confirmed?
+  .flash-message.warning
+    = t('auth.status.confirming')
+    = link_to t('auth.didnt_get_confirmation'), new_user_confirmation_path
+- elsif !@user.approved?
+  .flash-message.warning
+    = t('auth.status.pending')
+- elsif @user.account.moved_to_account_id.present?
+  .flash-message.warning
+    = t('auth.status.redirecting_to', acct: @user.account.moved_to_account.acct)
+    = link_to t('migrations.cancel'), settings_migration_path
+
 %h3= t('auth.status.account_status')
 
-.simple_form
-  %p.hint
-    - if @user.account.suspended?
-      %span.negative-hint= t('user_mailer.warning.explanation.suspend')
-    - elsif @user.disabled?
-      %span.negative-hint= t('user_mailer.warning.explanation.disable')
-    - elsif @user.account.silenced?
-      %span.warning-hint= t('user_mailer.warning.explanation.silence')
-    - elsif !@user.confirmed?
-      %span.warning-hint= t('auth.status.confirming')
-      = link_to t('auth.didnt_get_confirmation'), new_user_confirmation_path
-    - elsif !@user.approved?
-      %span.warning-hint= t('auth.status.pending')
-    - elsif @user.account.moved_to_account_id.present?
-      %span.positive-hint= t('auth.status.redirecting_to', acct: @user.account.moved_to_account.acct)
-      = link_to t('migrations.cancel'), settings_migration_path
-    - else
-      %span.positive-hint= t('auth.status.functional')
+= render partial: 'account_warning', collection: @strikes
 
 %hr.spacer/
diff --git a/app/views/disputes/strikes/show.html.haml b/app/views/disputes/strikes/show.html.haml
new file mode 100644
index 000000000..7248b2574
--- /dev/null
+++ b/app/views/disputes/strikes/show.html.haml
@@ -0,0 +1,128 @@
+- content_for :page_title do
+  = t('disputes.strikes.title', action: t(@strike.action, scope: 'disputes.strikes.title_actions'), date: l(@strike.created_at.to_date))
+
+- content_for :heading_actions do
+  - if @appeal.persisted?
+    = link_to t('admin.accounts.approve'), approve_admin_disputes_appeal_path(@appeal), method: :post, class: 'button' if can?(:approve, @appeal)
+    = link_to t('admin.accounts.reject'), reject_admin_disputes_appeal_path(@appeal), method: :post, class: 'button button--destructive' if can?(:reject, @appeal)
+
+- if @strike.overruled?
+  %p.hint
+    %span.positive-hint
+      = fa_icon 'check'
+      = ' '
+      = t 'disputes.strikes.appeal_approved'
+- elsif @appeal.persisted? && @appeal.rejected?
+  %p.hint
+    %span.negative-hint
+      = fa_icon 'times'
+      = ' '
+      = t 'disputes.strikes.appeal_rejected'
+
+.report-header
+  .report-header__card
+    .strike-card
+      - unless @strike.none_action?
+        %p= t "user_mailer.warning.explanation.#{@strike.action}", instance: Rails.configuration.x.local_domain
+
+      - unless @strike.text.blank?
+        = Formatter.instance.linkify(@strike.text)
+
+      - if @strike.report && !@strike.report.other?
+        %p
+          %strong= t('user_mailer.warning.reason')
+          = t("user_mailer.warning.categories.#{@strike.report.category}")
+
+        - if @strike.report.violation? && @strike.report.rule_ids.present?
+          %ul.strike-card__rules
+            - @strike.report.rules.each do |rule|
+              %li
+                %span.strike-card__rules__text= rule.text
+
+      - if @strike.status_ids.present? && !@strike.status_ids.empty?
+        %p
+          %strong= t('user_mailer.warning.statuses')
+
+        .strike-card__statuses-list
+          - status_map = @strike.statuses.includes(:application, :media_attachments).index_by(&:id)
+
+          - @strike.status_ids.each do |status_id|
+            .strike-card__statuses-list__item
+              - if (status = status_map[status_id.to_i])
+                .one-liner
+                  = link_to short_account_status_url(@strike.target_account, status_id), class: 'emojify' do
+                    = one_line_preview(status)
+
+                    - status.media_attachments.each do |media_attachment|
+                      %abbr{ title: media_attachment.description }
+                        = fa_icon 'link'
+                        = media_attachment.file_file_name
+                .strike-card__statuses-list__item__meta
+                  %time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at)
+                  ·
+                  = status.application.name
+              - else
+                .one-liner= t('disputes.strikes.status', id: status_id)
+                .strike-card__statuses-list__item__meta
+                  = t('disputes.strikes.status_removed')
+
+  .report-header__details
+    .report-header__details__item
+      .report-header__details__item__header
+        %strong= t('disputes.strikes.created_at')
+      .report-header__details__item__content
+        %time.formatted{ datetime: @strike.created_at.iso8601, title: l(@strike.created_at) }= l(@strike.created_at)
+    .report-header__details__item
+      .report-header__details__item__header
+        %strong= t('disputes.strikes.recipient')
+      .report-header__details__item__content
+        = link_to @strike.target_account.username, can?(:show, @strike.target_account) ? admin_account_path(@strike.target_account_id) : ActivityPub::TagManager.instance.url_for(@strike.target_account), class: 'table-action-link'
+    .report-header__details__item
+      .report-header__details__item__header
+        %strong= t('disputes.strikes.action_taken')
+      .report-header__details__item__content
+        - if @strike.overruled?
+          %del= t(@strike.action, scope: 'user_mailer.warning.title')
+        - else
+          = t(@strike.action, scope: 'user_mailer.warning.title')
+    - if @strike.report && can?(:show, @strike.report)
+      .report-header__details__item
+        .report-header__details__item__header
+          %strong= t('disputes.strikes.associated_report')
+        .report-header__details__item__content
+          = link_to t('admin.reports.report', id: @strike.report.id), admin_report_path(@strike.report), class: 'table-action-link'
+    - if @appeal.persisted?
+      .report-header__details__item
+        .report-header__details__item__header
+          %strong= t('disputes.strikes.appeal_submitted_at')
+        .report-header__details__item__content
+          %time.formatted{ datetime: @appeal.created_at.iso8601, title: l(@appeal.created_at) }= l(@appeal.created_at)
+%hr.spacer/
+
+- if @appeal.persisted?
+  %h3= t('disputes.strikes.appeal')
+
+  .report-notes
+    .report-notes__item
+      = image_tag @appeal.account.avatar.url, class: 'report-notes__item__avatar'
+
+      .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
+
+      .report-notes__item__content
+        = simple_format(h(@appeal.text))
+- elsif can?(:appeal, @strike)
+  %h3= t('disputes.strikes.appeals.submit')
+
+  = simple_form_for(@appeal, url: disputes_strike_appeal_path(@strike)) do |f|
+    .fields-group
+      = f.input :text, wrapper: :with_label, input_html: { maxlength: 500 }
+
+    .actions
+      = f.button :button, t('disputes.strikes.appeals.submit'), type: :submit
diff --git a/app/views/layouts/public.html.haml b/app/views/layouts/public.html.haml
index 61198171d..1a789cef8 100644
--- a/app/views/layouts/public.html.haml
+++ b/app/views/layouts/public.html.haml
@@ -53,5 +53,9 @@
             %ul
               %li= link_to t('about.source_code'), Mastodon::Version.source_url
               %li= link_to t('about.apps'), 'https://joinmastodon.org/apps'
+        .legal-xs
+          = link_to "v#{Mastodon::Version.to_s}", Mastodon::Version.source_url
+          ·
+          = link_to t('about.privacy_policy'), terms_path
 
 = render template: 'layouts/application'
diff --git a/app/views/settings/preferences/notifications/show.html.haml b/app/views/settings/preferences/notifications/show.html.haml
index d7cc1ed5d..223e5d740 100644
--- a/app/views/settings/preferences/notifications/show.html.haml
+++ b/app/views/settings/preferences/notifications/show.html.haml
@@ -21,6 +21,7 @@
 
       - if current_user.staff?
         = ff.input :report, as: :boolean, wrapper: :with_label
+        = ff.input :appeal, as: :boolean, wrapper: :with_label
         = ff.input :pending_account, as: :boolean, wrapper: :with_label
         = ff.input :trending_tag, as: :boolean, wrapper: :with_label
 
diff --git a/app/views/statuses/_detailed_status.html.haml b/app/views/statuses/_detailed_status.html.haml
index cd5ed52af..1922f53ce 100644
--- a/app/views/statuses/_detailed_status.html.haml
+++ b/app/views/statuses/_detailed_status.html.haml
@@ -49,7 +49,7 @@
     %span.detailed-status__visibility-icon
       = visibility_icon status
     ·
-    - if status.application && @account.user&.setting_show_application
+    - if status.application && status.account.user&.setting_show_application
       - if status.application.website.blank?
         %strong.detailed-status__application= status.application.name
       - else
diff --git a/app/views/user_mailer/appeal_approved.html.haml b/app/views/user_mailer/appeal_approved.html.haml
new file mode 100644
index 000000000..962cab2e2
--- /dev/null
+++ b/app/views/user_mailer/appeal_approved.html.haml
@@ -0,0 +1,59 @@
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell.hero
+                  .email-row
+                    .col-6
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.text-center.padded
+                              %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 }
+                                %tbody
+                                  %tr
+                                    %td
+                                      = image_tag full_pack_url('media/images/mailer/icon_done.png'), alt: ''
+
+                              %h1= t 'user_mailer.appeal_approved.title'
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell.content-start
+                  .email-row
+                    .col-6
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.text-center
+                              %p= t 'user_mailer.appeal_approved.explanation', appeal_date: l(@appeal.created_at), strike_date: l(@appeal.strike.created_at)
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell
+                  %table.column{ cellspacing: 0, cellpadding: 0 }
+                    %tbody
+                      %tr
+                        %td.column-cell.button-cell
+                          %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 }
+                            %tbody
+                              %tr
+                                %td.button-primary
+                                  = link_to root_url do
+                                    %span= t 'user_mailer.appeal_approved.action'
diff --git a/app/views/user_mailer/appeal_approved.text.erb b/app/views/user_mailer/appeal_approved.text.erb
new file mode 100644
index 000000000..290fa24c3
--- /dev/null
+++ b/app/views/user_mailer/appeal_approved.text.erb
@@ -0,0 +1,7 @@
+<%= t 'user_mailer.appeal_approved.title' %>
+
+===
+
+<%= t 'user_mailer.appeal_approved.explanation', appeal_date: l(@appeal.created_at), strike_date: l(@appeal.strike.created_at) %>
+
+=> <%= root_url %>
diff --git a/app/views/user_mailer/appeal_rejected.html.haml b/app/views/user_mailer/appeal_rejected.html.haml
new file mode 100644
index 000000000..75cd9d023
--- /dev/null
+++ b/app/views/user_mailer/appeal_rejected.html.haml
@@ -0,0 +1,59 @@
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell.hero
+                  .email-row
+                    .col-6
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.text-center.padded
+                              %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 }
+                                %tbody
+                                  %tr
+                                    %td
+                                      = image_tag full_pack_url('media/images/mailer/icon_warning.png'), alt: ''
+
+                              %h1= t 'user_mailer.appeal_rejected.title'
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell.content-start
+                  .email-row
+                    .col-6
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.text-center
+                              %p= t 'user_mailer.appeal_rejected.explanation', appeal_date: l(@appeal.created_at), strike_date: l(@appeal.strike.created_at)
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell
+                  %table.column{ cellspacing: 0, cellpadding: 0 }
+                    %tbody
+                      %tr
+                        %td.column-cell.button-cell
+                          %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 }
+                            %tbody
+                              %tr
+                                %td.button-primary
+                                  = link_to root_url do
+                                    %span= t 'user_mailer.appeal_approved.action'
diff --git a/app/views/user_mailer/appeal_rejected.text.erb b/app/views/user_mailer/appeal_rejected.text.erb
new file mode 100644
index 000000000..f47a76818
--- /dev/null
+++ b/app/views/user_mailer/appeal_rejected.text.erb
@@ -0,0 +1,7 @@
+<%= t 'user_mailer.appeal_rejected.title' %>
+
+===
+
+<%= t 'user_mailer.appeal_rejected.explanation', appeal_date: l(@appeal.created_at), strike_date: l(@appeal.strike.created_at) %>
+
+=> <%= root_url %>
diff --git a/app/views/user_mailer/warning.html.haml b/app/views/user_mailer/warning.html.haml
index bda1fef6c..b308e18f7 100644
--- a/app/views/user_mailer/warning.html.haml
+++ b/app/views/user_mailer/warning.html.haml
@@ -77,8 +77,8 @@
                             %tbody
                               %tr
                                 %td.button-primary
-                                  = link_to about_more_url do
-                                    %span= t 'user_mailer.warning.review_server_policies'
+                                  = link_to disputes_strike_url(@warning) do
+                                    %span= t 'user_mailer.warning.appeal'
 
 %table.email-table{ cellspacing: 0, cellpadding: 0 }
   %tbody
@@ -95,4 +95,4 @@
                         %tbody
                           %tr
                             %td.column-cell.text-center
-                              %p= t 'user_mailer.warning.get_in_touch', instance: @instance
+                              %p= t 'user_mailer.warning.appeal_description', instance: @instance
diff --git a/config/brakeman.ignore b/config/brakeman.ignore
index 4245b7192..6ffe12ae0 100644
--- a/config/brakeman.ignore
+++ b/config/brakeman.ignore
@@ -3,31 +3,11 @@
     {
       "warning_type": "SQL Injection",
       "warning_code": 0,
-      "fingerprint": "04dbbc249b989db2e0119bbb0f59c9818e12889d2b97c529cdc0b1526002ba4b",
-      "check_name": "SQL",
-      "message": "Possible SQL injection",
-      "file": "app/models/report.rb",
-      "line": 113,
-      "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
-      "code": "Admin::ActionLog.from(\"(#{[Admin::ActionLog.where(:target_type => \"Report\", :target_id => id, :created_at => ((created_at..updated_at))).unscope(:order), Admin::ActionLog.where(:target_type => \"Account\", :target_id => target_account_id, :created_at => ((created_at..updated_at))).unscope(:order), Admin::ActionLog.where(:target_type => \"Status\", :target_id => status_ids, :created_at => ((created_at..updated_at))).unscope(:order)].map do\n \"(#{query.to_sql})\"\n end.join(\" UNION ALL \")}) AS admin_action_logs\")",
-      "render_path": null,
-      "location": {
-        "type": "method",
-        "class": "Report",
-        "method": "history"
-      },
-      "user_input": "Admin::ActionLog.where(:target_type => \"Status\", :target_id => status_ids, :created_at => ((created_at..updated_at))).unscope(:order)",
-      "confidence": "High",
-      "note": ""
-    },
-    {
-      "warning_type": "SQL Injection",
-      "warning_code": 0,
       "fingerprint": "19df3740b8d02a9fe0eb52c939b4b87d3a2a591162a6adfa8d64e9c26aeebe6d",
       "check_name": "SQL",
       "message": "Possible SQL injection",
       "file": "app/models/status.rb",
-      "line": 100,
+      "line": 104,
       "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
       "code": "result.joins(\"INNER JOIN statuses_tags t#{id} ON t#{id}.status_id = statuses.id AND t#{id}.tag_id = #{id}\")",
       "render_path": null,
@@ -107,7 +87,7 @@
       "check_name": "PermitAttributes",
       "message": "Potentially dangerous key allowed for mass assignment",
       "file": "app/controllers/api/v1/admin/reports_controller.rb",
-      "line": 78,
+      "line": 90,
       "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
       "code": "params.permit(:resolved, :account_id, :target_account_id)",
       "render_path": null,
@@ -141,6 +121,36 @@
       "note": ""
     },
     {
+      "warning_type": "Cross-Site Scripting",
+      "warning_code": 2,
+      "fingerprint": "afad51718ae373b2f19d2513029fd2afccf58b9148e475934bc6a162ee33c352",
+      "check_name": "CrossSiteScripting",
+      "message": "Unescaped model attribute",
+      "file": "app/views/admin/disputes/appeals/_appeal.html.haml",
+      "line": 7,
+      "link": "https://brakemanscanner.org/docs/warning_types/cross_site_scripting",
+      "code": "t((Unresolved Model).new.strike.action, :scope => \"admin.strikes.actions\", :name => content_tag(:span, (Unresolved Model).new.strike.account.username, :class => \"username\"), :target => content_tag(:span, (Unresolved Model).new.account.acct, :class => \"target\"))",
+      "render_path": [
+        {
+          "type": "template",
+          "name": "admin/disputes/appeals/index",
+          "line": 16,
+          "file": "app/views/admin/disputes/appeals/index.html.haml",
+          "rendered": {
+            "name": "admin/disputes/appeals/_appeal",
+            "file": "app/views/admin/disputes/appeals/_appeal.html.haml"
+          }
+        }
+      ],
+      "location": {
+        "type": "template",
+        "template": "admin/disputes/appeals/_appeal"
+      },
+      "user_input": "(Unresolved Model).new.strike",
+      "confidence": "Weak",
+      "note": ""
+    },
+    {
       "warning_type": "Redirect",
       "warning_code": 18,
       "fingerprint": "ba568ac09683f98740f663f3d850c31785900215992e8c090497d359a2563d50",
@@ -194,7 +204,7 @@
         {
           "type": "template",
           "name": "admin/trends/links/index",
-          "line": 37,
+          "line": 39,
           "file": "app/views/admin/trends/links/index.html.haml",
           "rendered": {
             "name": "admin/trends/links/_preview_card",
@@ -213,13 +223,13 @@
     {
       "warning_type": "Mass Assignment",
       "warning_code": 105,
-      "fingerprint": "e867661b2c9812bc8b75a5df12b28e2a53ab97015de0638b4e732fe442561b28",
+      "fingerprint": "f9de0ca4b04ae4b51b74d98db14dcbb6dae6809e627b58e711019cf9b4a47866",
       "check_name": "PermitAttributes",
       "message": "Potentially dangerous key allowed for mass assignment",
       "file": "app/controllers/api/v1/reports_controller.rb",
       "line": 36,
       "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
-      "code": "params.permit(:account_id, :comment, :forward, :status_ids => ([]))",
+      "code": "params.permit(:account_id, :comment, :category, :forward, :status_ids => ([]), :rule_ids => ([]))",
       "render_path": null,
       "location": {
         "type": "method",
@@ -231,6 +241,6 @@
       "note": ""
     }
   ],
-  "updated": "2021-11-14 05:26:09 +0100",
-  "brakeman_version": "5.1.2"
+  "updated": "2022-02-13 02:24:12 +0100",
+  "brakeman_version": "5.2.1"
 }
diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml
index 3db1bc602..84f5d6666 100644
--- a/config/i18n-tasks.yml
+++ b/config/i18n-tasks.yml
@@ -62,6 +62,7 @@ ignore_unused:
   - 'themes.*'
   - 'statuses.attached.*'
   - 'move_handler.carry_{mutes,blocks}_over_text'
+  - 'notification_mailer.*'
 
 ignore_inconsistent_interpolations:
   - '*.one'
diff --git a/config/initializers/preload_link_headers.rb b/config/initializers/preload_link_headers.rb
index 9f21c45ec..364a7cc1b 100644
--- a/config/initializers/preload_link_headers.rb
+++ b/config/initializers/preload_link_headers.rb
@@ -2,7 +2,7 @@
 # in the Links header per default.
 
 # In our case, that will bloat headers too much and potentially cause
-# issues with reverse proxies. Furhermore, we don't need those links,
+# issues with reverse proxies. Furthermore, we don't need those links,
 # as we already output them as HTML link tags.
 
 Rails.application.config.action_view.preload_links_header = false
diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb
index 964d4266d..c3733e377 100644
--- a/config/initializers/rack_attack.rb
+++ b/config/initializers/rack_attack.rb
@@ -82,7 +82,12 @@ class Rack::Attack
   end
 
   throttle('throttle_sign_up_attempts/ip', limit: 25, period: 5.minutes) do |req|
-    req.remote_ip if req.post? && req.path == '/auth'
+    if req.post? && req.path == '/auth'
+      addr = req.remote_ip
+      addr = IPAddr.new(addr) if addr.is_a?(String)
+      addr = addr.mask(64) if addr.ipv6?
+      addr.to_s
+    end
   end
 
   throttle('throttle_password_resets/ip', limit: 25, period: 5.minutes) do |req|
diff --git a/config/locales/activerecord.is.yml b/config/locales/activerecord.is.yml
index cdd803318..8ecb02e74 100644
--- a/config/locales/activerecord.is.yml
+++ b/config/locales/activerecord.is.yml
@@ -24,7 +24,7 @@ is:
         status:
           attributes:
             reblog:
-              taken: af stöðu er þegar fyrirliggjandi
+              taken: af færslum er þegar fyrirliggjandi
         user:
           attributes:
             email:
diff --git a/config/locales/activerecord.lv.yml b/config/locales/activerecord.lv.yml
index f3524811b..ad9fa6604 100644
--- a/config/locales/activerecord.lv.yml
+++ b/config/locales/activerecord.lv.yml
@@ -3,7 +3,7 @@ lv:
   activerecord:
     attributes:
       poll:
-        expires_at: Gala termiņš
+        expires_at: Deadline
         options: Izvēles
       user:
         agreement: Pakalpojuma līgums
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index c54fecac1..4501b39e8 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -1,7 +1,7 @@
 ---
 ar:
   about:
-    about_hashtag_html: هذه تبويقات متاحة للجمهور تحتوي على الكلمات الدلالية <strong>#%{hashtag}</strong>. يمكنك التفاعل معها إن كان لديك حساب في أي مكان على الفديفرس.
+    about_hashtag_html: هذه منشورات متاحة للجمهور تحتوي على الكلمات الدلالية <strong>#%{hashtag}</strong>. يمكنك التفاعل معها إن كان لديك حساب في أي مكان على الفديفرس.
     about_mastodon_html: 'شبكة التواصل الإجتماعية المستقبَليّة: مِن دون إعلانات ، غير خاضعة لرقابة الشركات ، تصميم أخلاقي ولامركزية! بياناتكم مِلك لكم مع ماستدون!'
     about_this: عن مثيل الخادم هذا
     active_count_after: نشط
@@ -88,14 +88,14 @@ ar:
     pin_errors:
       following: يجب أن تكون مِن متابعي حساب الشخص الذي تريد إبرازه
     posts:
-      few: تبويقات
-      many: تبويقات
-      one: تبويق
-      other: تبويقات
-      two: تبويقات
-      zero: تبويقات
-    posts_tab_heading: تبويقات
-    posts_with_replies: التبويقات و الردود
+      few: منشورات
+      many: منشورات
+      one: منشور واحد
+      other: منشور
+      two: منشورَيْن
+      zero: منشور
+    posts_tab_heading: المنشورات
+    posts_with_replies: المنشورات والردود
     roles:
       admin: المدير
       bot: روبوت
@@ -110,7 +110,6 @@ ar:
     account_moderation_notes:
       create: اترك ملاحظة
       created_msg: تم إنشاء ملاحظة الإشراف بنجاح!
-      delete: حذف
       destroyed_msg: تم تدمير ملاحظة الإشراف بنجاح!
     accounts:
       add_email_domain_block: حظر نطاق بريد إلكتروني
@@ -220,14 +219,15 @@ ar:
       silence: كتم
       silenced: تم كتمه
       statuses: المنشورات
-      strikes: الضربات السابقة
+      strikes: العقوبات السابقة
       subscribe: اشترك
+      suspend: علّق الحساب
       suspended: تم تعليقه
       suspension_irreversible: تم حذف بيانات هذا الحساب بشكل لا رجعة فيه، يمكنك إلغاء تعليق الحساب لجعله قابلا للاستخدام، ولكنه لن يسترد أي بيانات كانت لديه سابقاً.
       suspension_reversible_hint_html: تم تعليق الحساب، وسيتم إزالة البيانات بالكامل في %{date}، حتى ذلك الحين، يمكن استعادة الحساب دون أي آثار سلبية أي كما أنه لم يحدث أي شيء، إذا كنت ترغب في حذف جميع بيانات الحساب الآن، فيمكنك فعل ذلك أدناه.
       title: الحسابات
       unblock_email: إلغاء حظر عنوان البريد الإلكتروني
-      unblocked_email_msg: تم إلغاء حظر عنوان البريد الإلكتروني %{username} بنجاح
+      unblocked_email_msg: تم إلغاء حظر عنوان البريد الإلكتروني لـ %{username} بنجاح
       unconfirmed_email: البريد الإلكتروني غير مؤكد
       undo_sensitized: التراجع عن حساسية
       undo_silenced: رفع الصمت
@@ -441,13 +441,6 @@ ar:
         silence: تم كتمه
         suspend: تم تعليقه
       show:
-        affected_accounts:
-          few: "%{count} حسابات معنية في قاعدة البيانات"
-          many: "%{count} حسابات معنية في قاعدة البيانات"
-          one: حساب واحد %{count} معني في قاعدة البيانات
-          other: "%{count} حسابات معنية في قاعدة البيانات"
-          two: حسابين %{count} معنيين في قاعدة البيانات
-          zero: "%{count} حسابات معنية في قاعدة البيانات"
         retroactive:
           silence: إلغاء الكتم عن كافة الحسابات المتواجدة على هذا النطاق
           suspend: إلغاء التعليق المفروض على كافة حسابات هذا النطاق
@@ -500,19 +493,13 @@ ar:
       delivery_error_days: أيام أخطاء التوصيل
       delivery_error_hint: إذا كان التوصيل غير ممكناً لـ%{count} يوم، فستوضع عليها علامة {غير قابلة للتسليم} تلقائياً.
       empty: لم يتم العثور على نطاقات.
-      known_accounts:
-        few: "%{count} حسابات معروفة"
-        many: "%{count} حسابات معروفة"
-        one: حساب معروف %{count}
-        other: "%{count} حسابات معروفة"
-        two: "%{count} حسابات معروفة"
-        zero: "%{count} حسابات معروفة"
       moderation:
         all: كافتها
         limited: محدود
         title: الإشراف
       private_comment: تعليق خاص
       public_comment: تعليق للعلن
+      purge: تطهير
       title: الفديرالية
       total_blocked_by_us: المحجوبة مِن طرفنا
       total_followed_by_them: يُتابِعونها
@@ -551,7 +538,7 @@ ar:
       disable: تعطيل
       disabled: مُعطَّل
       enable: تشغيل
-      enable_hint: عندما تقوم بتنشيط هذه الميزة، سوف يشترك خادومكم في جميع التبويقات القادمة مِن هذا المُرحِّل و سيشرع كذلك بإرسال كافة التبويقات العمومية إليه.
+      enable_hint: عندما تقوم بتنشيط هذه الميزة، سوف يشترك خادومكم في جميع المنشورات القادمة مِن هذا المُرحِّل و سيشرع كذلك بإرسال كافة المنشورات العمومية إليه.
       enabled: مُشغَّل
       inbox_url: رابط المُرحّل
       pending: في انتظار تسريح المُرحِّل
@@ -575,6 +562,7 @@ ar:
           zero: "%{count} ملاحظات"
       action_log: سجل المراجعة
       action_taken_by: تم اتخاذ الإجراء مِن طرف
+      add_to_report: أضف المزيد إلى التقرير
       are_you_sure: هل أنت متأكد ؟
       assign_to_self: عين لي
       assigned: تعين رئيس
@@ -583,7 +571,7 @@ ar:
       comment:
         none: لا شيء
       created_at: ذكرت
-      delete_and_resolve: حذف وحسم
+      delete_and_resolve: احذف المنشورات
       forwarded: أُعيد توجيهه
       forwarded_to: أُعيد توجيهه إلى %{domain}
       mark_as_resolved: اعتبار الشكوى كمحلولة
@@ -602,6 +590,7 @@ ar:
       reported_by: أبلغ عنه من طرف
       resolved: معالجة
       resolved_msg: تم حل تقرير بنجاح!
+      skip_to_actions: تخطي إلى الإجراءات
       status: الحالة
       statuses: المحتوى المبلغ عنه
       target_origin: مصدر الحساب المبلغ عنه
@@ -742,6 +731,7 @@ ar:
         disallow: رفض الرابط
         disallow_provider: عدم السماح للناشر
         title: الروابط المتداولة
+        usage_comparison: تمت مشاركته %{today} مرات اليوم، مقارنة بـ %{yesterday} بالأمس
       pending_review: في انتظار المراجعة
       preview_card_providers:
         title: الناشرون
@@ -758,7 +748,12 @@ ar:
         not_listable: لن يتم اقتراحه
         not_trendable: لن يظهر في المتداولة
         not_usable: لا يمكن استخدامه
+        peaked_on_and_decaying: بلغ ذروته في %{date}، في تراجع الآن
         title: الوسوم المتداولة
+        trendable: السماح بالظهور تحت المتداولة
+        trending_rank: 'المتداولة #%{rank}'
+        usable: يمكن استخدامه
+        usage_comparison: تم استخدامه %{today} مرات اليوم، مقارنة بـ %{yesterday} بالأمس
       title: المتداوَلة
     warning_presets:
       add_new: إضافة واحد جديد
@@ -792,7 +787,7 @@ ar:
       guide_link: https://crowdin.com/project/mastodon
       guide_link_text: يمكن للجميع المساهمة.
     sensitive_content: المحتوى الحساس
-    toot_layout: تصميم التبويق
+    toot_layout: شكل المنشور
   application_mailer:
     notification_preferences: تعديل خيارات البريد الإلكتروني
     salutation: "%{name}،"
@@ -847,7 +842,6 @@ ar:
     status:
       account_status: حالة الحساب
       confirming: في انتظار اكتمال تأكيد البريد الإلكتروني.
-      functional: حسابك جاهز.
       pending: إن طلبك قيد المراجعة من قبل فريقنا. قد يستغرق هذا بعض الوقت. سوف تتلقى بريدا إلكترونيا إذا تمت الموافقة على طلبك.
       redirecting_to: حسابك غير نشط لأنه تم تحويله حاليا إلى %{acct}.
     too_fast: تم إرسال النموذج بسرعة كبيرة، حاول مرة أخرى.
@@ -937,7 +931,7 @@ ar:
     archive_takeout:
       date: التاريخ
       download: تنزيل نسخة لحسابك
-      hint_html: بإمكانك طلب نسخة كاملة لـ <strong>كافة تبويقاتك و الوسائط التي قمت بنشرها</strong>. البيانات المُصدَّرة ستكون محفوظة على شكل نسق ActivityPub و باستطاعتك قراءتها بأي برنامج يدعم هذا النسق. يُمكنك طلب نسخة كل 7 أيام.
+      hint_html: بإمكانك طلب نسخة كاملة لـ <strong>كافة منشوراتك والوسائط التي قمت بنشرها</strong>. البيانات المُصدَّرة ستكون محفوظة على شكل نسق ActivityPub و باستطاعتك قراءتها بأي برنامج يدعم هذا النسق. يُمكنك طلب نسخة كل 7 أيام.
       in_progress: جارٍ انشاء نسخة لبيانات حسابك…
       request: اطلب نسخة مِن حسابك
       size: الحجم
@@ -1140,6 +1134,8 @@ ar:
       title: ترقية جديدة
     status:
       subject: "%{name} نشر للتو"
+    update:
+      subject: قام %{name} بتحرير منشور
   notifications:
     email_events: الأحداث للإشعارات عبر البريد الإلكتروني
     email_events_hint: 'اختر الأحداث التي تريد أن تصِلَك اشعارات عنها:'
@@ -1181,7 +1177,7 @@ ar:
       too_many_options: لا يمكنه أن يحتوي أكثر مِن %{max} عناصر
   preferences:
     other: إعدادات أخرى
-    posting_defaults: التفضيلات الافتراضية لنشر التبويقات
+    posting_defaults: التفضيلات الافتراضية للنشر
     public_timelines: الخيوط الزمنية العامة
   reactions:
     errors:
@@ -1214,16 +1210,16 @@ ar:
   remote_interaction:
     favourite:
       proceed: المواصلة إلى المفضلة
-      prompt: 'ترغب في إضافة هذا التبويق إلى مفضلتك:'
+      prompt: 'ترغب في إضافة هذا المنشور إلى مفضلتك:'
     reblog:
       proceed: المواصلة إلى الترقية
-      prompt: 'ترغب في ترقية هذا التبويق:'
+      prompt: 'ترغب في مشاركة هذا المنشور:'
     reply:
       proceed: المواصلة إلى الرد
-      prompt: 'ترغب في الرد على هذا التبويق:'
+      prompt: 'ترغب في الرد على هذا المنشور:'
   scheduled_statuses:
-    over_daily_limit: لقد تجاوزتَ حد الـ %{limit} تبويقات مُبَرمَجة المسموح بها لذلك اليوم
-    over_total_limit: لقد بلغت حد الـ %{limit} مِن التبويقات المبرمَجة
+    over_daily_limit: لقد تجاوزتَ حد الـ %{limit} منشورات مُبَرمَجة مسموح بها اليوم
+    over_total_limit: لقد بلغت حد الـ %{limit} مِن المنشورات المبرمَجة
     too_soon: يجب أن يكون تاريخ البرمجة في المستقبَل
   sessions:
     activity: آخر نشاط
@@ -1315,6 +1311,7 @@ ar:
         zero: "%{count} فيديوهات"
     boosted_from_html: تم إعادة ترقيته مِن %{acct_link}
     content_warning: 'تحذير عن المحتوى: %{warning}'
+    default_language: نفس لغة الواجهة
     disallowed_hashtags:
       few: 'يحتوي على وسوم غير مسموح بها: %{tags}'
       many: 'يحتوي على وسوم غير مسموح بها: %{tags}'
@@ -1322,13 +1319,14 @@ ar:
       other: 'يحتوي على وسوم غير مسموح بها: %{tags}'
       two: 'يحتوي على وسوم غير مسموح بها: %{tags}'
       zero: 'يحتوي على وسوم غير مسموح بها: %{tags}'
+    edited_at: عُدّل في %{date}
     errors:
       in_reply_not_found: إنّ المنشور الذي تحاول الرد عليه غير موجود على ما يبدو.
     open_in_web: افتح في الويب
     over_character_limit: تم تجاوز حد الـ %{max} حرف المسموح بها
     pin_errors:
-      limit: لقد بلغت الحد الأقصى للتبويقات المدبسة
-      ownership: لا يمكن تدبيس تبويق نشره شخص آخر
+      limit: لقد بلغت الحد الأقصى للمنشورات المثبتة
+      ownership: لا يمكن تثبيت منشور نشره شخص آخر
       reblog: لا يمكن تثبيت ترقية
     poll:
       total_people:
@@ -1366,7 +1364,7 @@ ar:
     exceptions: الاستثناءات
     explanation: لأن حذف المشاركات عملية مكلفة، يتم ذلك ببطء مع مرور الوقت عندما يكون الخادم غير مشغول. لهذا السبب، يمكن حذف مشاركاتك بعد فترة من بلوغها عتبة السن.
     ignore_favs: تجاهل المفضلة
-    ignore_reblogs: تجاهل التعزيزات
+    ignore_reblogs: تجاهل المشاركات
     interaction_exceptions: الاستثناءات المبنية على التفاعلات
     interaction_exceptions_explanation: لاحظ أنه لا يوجد ضمان لحذف الوظائف إذا كانت أقل من عتبة التعزيز المفضلة بعد أن تكون قد ذهبت إليها.
     keep_direct: الاحتفاظ بالرسائل المباشرة
@@ -1393,9 +1391,9 @@ ar:
     min_favs: إبقاء المشاركات المفضلة أكثر من
     min_favs_hint: لم تقوم بحذف أي من المشاركات الخاصة بك التي حصلت على أكثر من هذه الكمية من المفضلة. اتركه فارغاً لحذف المشاركات بغض النظر عن عدد المفضلات لديها
     min_reblogs: إبقاء المشاركات المعززة أكثر من
-    min_reblogs_hint: لم تقم بحذف أي من مشاركاتك التي تم تعزيزها أكثر من هذا العدد من المرات. اتركه فارغاً لحذف المشاركات بغض النظر عن عدد تعزيزاتها
+    min_reblogs_hint: لن تُحذف أي من منشوراتك التي أعيد مشاركتها أكثر من هذا العدد من المرات. اتركه فارغاً لحذف المنشورات بغض النظر عن عدد إعادات المشاركة
   stream_entries:
-    pinned: تبويق مثبّت
+    pinned: منشور مثبّت
     reblogged: رقّاه
     sensitive_content: محتوى حساس
   tags:
@@ -1492,6 +1490,7 @@ ar:
     formats:
       default: "%b %d, %Y, %H:%M"
       month: "%b %Y"
+      time: "%H:%M"
   two_factor_authentication:
     add: إضافة
     disable: تعطيل
@@ -1522,16 +1521,21 @@ ar:
       categories:
         spam: مزعج
         violation: ينتهك المحتوى المبادئ التوجيهية التالية للمجتمع
+      explanation:
+        sensitive: من الآن فصاعدا، سيتم وضع علامة على جميع ملفات الوسائط التي يتم تحميلها على أنها حساسة وستكون مخفية خلف تحذير يُنقر.
+        silence: لا يزال بإمكانك استخدام حسابك ولكن فقط الأشخاص الذين يتابعونك فقط يمكنهم رؤية منشوراتك على هذا الخادم، وقد يتم استبعادك من ميزات الاكتشاف المختلفة. قد يتبعك آخرون على كل حال يدوياً.
+      get_in_touch: إذا كنت تعتقد أن هذا خطأ، يمكنك الرد على هذا البريد الإلكتروني للتواصل مع فريق %{instance}.
       reason: 'السبب:'
-      review_server_policies: مراجعة شروط السيرفر
       subject:
         disable: تم تجميد حسابك %{acct}
         none: تحذير إلى %{acct}
         silence: إنّ حسابك %{acct} محدود
         suspend: لقد تم تعليق حسابك %{acct}
       title:
+        delete_statuses: منشورات محذوفة
         disable: الحساب مُجمَّد
         none: تحذير
+        sensitive: الوسائط المخفية
         silence: الحساب محدود
         suspend: الحساب مُعلَّق
     welcome:
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index f97d6508f..ba0d2e4a5 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -85,7 +85,6 @@ bg:
     account_moderation_notes:
       create: Оставяне на бележка
       created_msg: Бележката за модерация е създадена успешно!
-      delete: Изтриване
     accounts:
       add_email_domain_block: Блокиране на имейл домейн
       approve: Одобряване
diff --git a/config/locales/bn.yml b/config/locales/bn.yml
index dd3eb91d9..5d7f89a70 100644
--- a/config/locales/bn.yml
+++ b/config/locales/bn.yml
@@ -89,7 +89,6 @@ bn:
     account_moderation_notes:
       create: কিছু লিখুন
       created_msg: প্রশাসনবস্তুত লেখাটি সঠিকভাবে তৈরী হয়েছে!
-      delete: মুছে ফেলা
       destroyed_msg: প্রশাসনবস্তুত লেখাটি সঠিকভাবে মুছে ফেলা হয়েছে!
     accounts:
       add_email_domain_block: নিষিদ্ধ করা ই-মেইল ডোমেইন
diff --git a/config/locales/br.yml b/config/locales/br.yml
index 31b8e2c47..5d482b503 100644
--- a/config/locales/br.yml
+++ b/config/locales/br.yml
@@ -3,6 +3,7 @@ br:
   about:
     about_this: Diàr-benn
     active_count_after: oberiant
+    api: API
     apps: Arloadoù pellgomz
     apps_platforms: Ober get Mastodoñ àr iOS, Android ha savennoù arall
     contact: Darempred
@@ -51,8 +52,6 @@ br:
     unavailable: Profil dihegerz
     unfollow: Diheuliañ
   admin:
-    account_moderation_notes:
-      delete: Dilemel
     accounts:
       by_domain: Domani
       change_email:
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index a3aa1fb92..6cec7b3f8 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -94,7 +94,6 @@ ca:
     account_moderation_notes:
       create: Crea nota
       created_msg: La nota de moderació s'ha creat correctament!
-      delete: Suprimeix
       destroyed_msg: Nota de moderació destruïda amb èxit!
     accounts:
       add_email_domain_block: Afegir el domini de correu a la llista negra
@@ -163,6 +162,11 @@ ca:
       not_subscribed: No subscrit
       pending: Revisió pendent
       perform_full_suspension: Suspèn
+      previous_strikes: Accions anteriors
+      previous_strikes_description_html:
+        one: Aquest compte té <strong>una</strong> acció.
+        other: Aquest compte té <strong>%{count}</strong> accions.
+        zero: Aquest compte està <strong>al dia</strong>.
       promote: Promociona
       protocol: Protocol
       public: Públic
@@ -206,6 +210,7 @@ ca:
       statuses: Tuts
       strikes: Accions anteriors
       subscribe: Subscriu
+      suspend: Suspèn
       suspended: Suspès
       suspension_irreversible: Les dades d’aquest compte s’han suprimit irreversiblament. Pots desfer la suspensió del compte per a fer-lo usable però això no recuperarà les dades si és que en tenia.
       suspension_reversible_hint_html: El compte ha estat suspès i les dades seran totalment suprimides el %{date}. Fins llavors, el compte pot ser restaurat sense problemes. Si vols suprimir immediatament totes les dades del compte, ho pots fer a continuació.
@@ -226,6 +231,7 @@ ca:
       whitelisted: Llista blanca
     action_logs:
       action_types:
+        approve_appeal: Aprova Apel·lació
         approve_user: Aprova l'usuari
         assigned_to_self_report: Assigna l'informe
         change_email_user: Canvia l'adreça electrònica per l'usuari
@@ -257,6 +263,7 @@ ca:
         enable_user: Activa l'usuari
         memorialize_account: Memoritza el compte
         promote_user: Promou l'usuari
+        reject_appeal: Rebutja Apel·lació
         reject_user: Rebutja l'usuari
         remove_avatar_user: Eliminar avatar
         reopen_report: Reobre l'informe
@@ -275,6 +282,7 @@ ca:
         update_domain_block: Actualitza el Bloqueig de Domini
         update_status: Actualitza l'estat
       actions:
+        approve_appeal_html: "%{name} ha aprovat l'apel·lació a la decisió de moderació de %{target}"
         approve_user_html: "%{name} ha aprovat el registre de %{target}"
         assigned_to_self_report_html: "%{name} han assignat l'informe %{target} a ells mateixos"
         change_email_user_html: "%{name} ha canviat l'adreça de correu electrònic del usuari %{target}"
@@ -306,6 +314,7 @@ ca:
         enable_user_html: "%{name} ha activat l'accés del usuari %{target}"
         memorialize_account_html: "%{name} ha convertit el compte %{target} en una pàgina de memorial"
         promote_user_html: "%{name} ha promogut l'usuari %{target}"
+        reject_appeal_html: "%{name} ha rebutjat l'apel·lació a la decisió de moderació de %{target}"
         reject_user_html: "%{name} ha rebutjat el registre de %{target}"
         remove_avatar_user_html: "%{name} ha eliminat l'avatar de %{target}"
         reopen_report_html: "%{name} ha reobert l'informe %{target}"
@@ -384,14 +393,17 @@ ca:
       media_storage: Mèdia
       new_users: usuaris nous
       opened_reports: informes oberts
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> apel·lació pendent"
+        other: "<strong>%{count}</strong> apel·lacions pendents"
       pending_reports_html:
-        one: "<strong>1</strong> informe pendent"
+        one: "<strong>%{count}</strong> informe pendent"
         other: "<strong>%{count}</strong> informes pendents"
       pending_tags_html:
-        one: "<strong>1</strong> etiqueta pendent"
+        one: "<strong>%{count}</strong> etiqueta pendent"
         other: "<strong>%{count}</strong> etiquetes pendents"
       pending_users_html:
-        one: "<strong>1</strong> usuari pendent"
+        one: "<strong>%{count}</strong> usuari pendent"
         other: "<strong>%{count}</strong> usuaris pendents"
       resolved_reports: informes resolts
       software: Programari
@@ -401,6 +413,10 @@ ca:
       top_languages: Idiomes més actius
       top_servers: Servidors més actius
       website: Lloc web
+    disputes:
+      appeals:
+        empty: Cap apel·lació trobada.
+        title: Apel·lacions
     domain_allows:
       add_new: Dominis autoritzats
       created_msg: El domini ha estat correctament autoritzat
@@ -441,6 +457,7 @@ ca:
         affected_accounts:
           one: Un compte afectat en la base de dades
           other: "%{count} comptes afectats en la base de dades"
+          zero: Cap compte afectat en la base de dades
         retroactive:
           silence: Desfés el silenci a tots els comptes existents d'aquest domini
           suspend: Desfés la suspensió de tots els comptes d'aquest domini
@@ -494,6 +511,7 @@ ca:
       known_accounts:
         one: "%{count} compte conegut"
         other: "%{count} comptes coneguts"
+        zero: Cap compte conegut
       moderation:
         all: Totes
         limited: Limitades
@@ -560,10 +578,12 @@ 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 ajudar-te a escalar en futures infraccions des d'el 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.
         suspend_description_html: El perfil i tot el seu contingut esdevindrà inaccessible fins que sigui eventualment esborrat. Interactuar amb el compte serà impossible. Reversible dins de 30 dies.
-      actions_description_html: 'Si treien el contingut ofensiu de dalt és insuficient:'
+      actions_description_html: Decideix quina acció a prendre per a resoldre aquest informe. Si prens un acció punitiva contra el compte reportat, se li enviarà una notificació per correu electrònic, excepte quan la categoria <strong>Spam</strong> és seleccionada.
       add_to_report: Afegir més al informe
       are_you_sure: N'estàs segur?
       assign_to_self: Assignar-me
@@ -575,7 +595,7 @@ ca:
         none: Cap
       comment_description_html: 'Per a donar més informació, %{name} ha escrit:'
       created_at: Reportat
-      delete_and_resolve: Esborra i resol
+      delete_and_resolve: Esborra les publicacions
       forwarded: Reenviat
       forwarded_to: Reenviat a %{domain}
       mark_as_resolved: Marca com a resolt
@@ -589,12 +609,14 @@ ca:
         placeholder: Descriu les accions que s'han pres o qualsevol altra actualització relacionada…
         title: Notes
       notes_description_html: Veu i deixa notes als altres moderadors i a tu mateix
+      quick_actions_description_html: 'Pren una acció ràpida o desplaça''t avall per a veure el contingut reportat:'
       reopen: Reobre l'informe
       report: 'Informe #%{id}'
       reported_account: Compte reportat
       reported_by: Reportat per
       resolved: Resolt
       resolved_msg: Informe resolt amb èxit!
+      skip_to_actions: Salta a les accions
       status: Estat
       statuses: Contingut reportat
       statuses_description_html: El contingut ofensiu serà citat en comunicació amb el compte reportat
@@ -715,6 +737,16 @@ ca:
       no_status_selected: No s’han canviat els estatus perquè cap no ha estat seleccionat
       title: Estats del compte
       with_media: Amb contingut multimèdia
+    strikes:
+      actions:
+        delete_statuses: "%{name} ha eliminat les publicacions de %{target}"
+        disable: "%{name} ha congelat el compte de %{target}"
+        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}"
+        suspend: "%{name} ha suspès el compte de %{target}"
+      appeal_approved: Apel·lat
+      appeal_pending: Apel·lació pendent
     system_checks:
       database_schema_check:
         message_html: Hi ha pendents migracions de la base de dades. Si us plau executa-les per a assegurar que l'aplicació es comporta com s'espera
@@ -739,6 +771,7 @@ ca:
         shared_by_over_week:
           one: Compartit per un usuari en la darrera setmana
           other: Compartit per %{count} usuaris en la darrera setmana
+          zero: Compartit per ningú en la darrera setmana
         title: Enllaços en tendència
         usage_comparison: Compartit %{today} vegades avui, comparat amb %{yesterday} d'ahir
       pending_review: Revisió pendent
@@ -768,6 +801,7 @@ ca:
         used_by_over_week:
           one: Emprat per un usuari en la darrera setmana
           other: Emprat per %{count} usuaris en la darrera setmana
+          zero: Emprat per ningú en la darrera setmana
       title: Tendència
     warning_presets:
       add_new: Afegir-ne un de nou
@@ -776,6 +810,17 @@ ca:
       empty: Encara no has definit cap preavís.
       title: Gestiona les configuracions predefinides dels avisos
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: eliminar les seves publicacions
+        disable: congelar els seus comptes
+        none: un avís
+        sensitive: marcar els seus comptes com a sensibles
+        silence: limitar els seus comptes
+        suspend: suspendre els seus comptes
+      body: "%{target} està apel·lant una decisió de moderació de %{action_taken_by} el %{date}, del tipus %{type}. Han escrit:"
+      next_steps: Pots aprovar l'apel·lació per a desfer la decisió de moderació o ignorar-la.
+      subject: "%{username} està apel·lant una decisió de moderació a %{instance}"
     new_pending_account:
       body: A continuació trobaràs els detalls del compte nou. Pots aprovar o rebutjar aquest registre.
       subject: Nou compte per a revisar a %{instance} (%{username})
@@ -866,7 +911,6 @@ ca:
     status:
       account_status: Estat del compte
       confirming: Esperant que es completi la confirmació del correu electrònic.
-      functional: El teu compte està completament operatiu.
       pending: La vostra sol·licitud està pendent de revisió pel nostre personal. Això pot trigar una mica. Rebreu un correu electrònic quan sigui aprovada.
       redirecting_to: El teu compte és inactiu perquè actualment està redirigint a %{acct}.
     too_fast: Formulari enviat massa ràpid, torna a provar-ho.
@@ -932,6 +976,32 @@ ca:
     directory: Directori de perfils
     explanation: Descobreix usuaris segons els teus interessos
     explore_mastodon: Explora %{title}
+  disputes:
+    strikes:
+      action_taken: Acció presa
+      appeal: Apel·lació
+      appeal_approved: L'acció ha estat apel·lada amb èxit i ja no és vàlida
+      appeal_rejected: L'apel·lació ha estat rebutjada
+      appeal_submitted_at: Apel·lació tramesa
+      appealed_msg: La teva apel·lació ha estat emesa. Si és aprovada, seràs notificat.
+      appeals:
+        submit: Apel·lació emesa
+      associated_report: Informe associat
+      created_at: Datada
+      recipient: Dirigida a
+      status: 'Publicació #%{id}'
+      status_removed: Publicació ja esborrada del sistema
+      title: "%{action} del %{date}"
+      title_actions:
+        delete_statuses: Eliminació de publicació
+        disable: Congelació del compte
+        none: Avís
+        sensitive: Marcant com a sensible el compte
+        silence: Limitació del compte
+        suspend: Suspensió del compte
+      your_appeal_approved: La teva apel·lació s'ha aprovat
+      your_appeal_pending: Has tramés una apel·lació
+      your_appeal_rejected: La teva apel·lació ha estat rebutjada
   domain_validator:
     invalid_domain: no es un nom de domini vàlid
   errors:
@@ -1143,6 +1213,8 @@ ca:
       title: Nou impuls
     status:
       subject: "%{name} ha publicat"
+    update:
+      subject: "%{name} ha editat una publicació"
   notifications:
     email_events: Esdeveniments per a notificacions de correu electrònic
     email_events_hint: 'Selecciona els esdeveniments per als quals vols rebre notificacions:'
@@ -1493,6 +1565,15 @@ ca:
     recovery_instructions_html: Si mai perds l'accés al teu telèfon pots utilitzar un dels codis de recuperació a continuació per a recuperar l'accés al teu compte. <strong>Cal mantenir els codis de recuperació en lloc segur</strong>. Per exemple, imprimint-los i guardar-los amb altres documents importants.
     webauthn: Claus de seguretat
   user_mailer:
+    appeal_approved:
+      action: Ves al teu compte
+      explanation: La apel·lació a la acció contra el teu compte del %{strike_date} que has tramés el %{appeal_date} ha estat aprovada. El teu compte està un cop més al dia.
+      subject: La teva apel·lació de %{date} ha estat aprovada
+      title: Apel·lació aprovada
+    appeal_rejected:
+      explanation: La apel·lació a la acció contra el teu compte del %{strike_date} que has tramés el %{appeal_date} ha estat rebutjada.
+      subject: La teva apel·lació del %{date} ha estat rebutjada
+      title: Apel·lació rebutjada
     backup_ready:
       explanation: Has sol·licitat una copia completa del teu compte Mastodon. Ara ja està a punt per a descàrrega!
       subject: El teu arxiu està preparat per a descàrrega
@@ -1504,6 +1585,8 @@ ca:
       subject: Si us plau confirma l’intent d’inici de sessió
       title: Intent d’inici de sessió
     warning:
+      appeal: Trametre una apel·lació
+      appeal_description: Si creus que això és un error pots emetre una apel·lació al equip de %{instance}.
       categories:
         spam: Contingut brossa
         violation: El contingut viola les següents guies de la comunitat
@@ -1515,7 +1598,6 @@ ca:
         suspend: Ja no pots utilitzar el teu compte i el teu perfil i altres dades ja no son accessibles. Encara pots iniciar sessió per a demanar una copia de les teves dades fins que siguin totalment eliminades als 30 dies però es mantindran les dades bàsiques per evitar que esquivis la suspensió.
       get_in_touch: Si tu creus que això és un error pots respondre aquest correu electrònic per a contactar amb l'equip de %{instance}.
       reason: 'Raó:'
-      review_server_policies: Revisa les polítiques del servidor
       statuses: 'Publicacions que han estat trobades com a violació:'
       subject:
         delete_statuses: Les teves publicacions de %{acct} han estat esborrades
diff --git a/config/locales/co.yml b/config/locales/co.yml
index 1128caca9..8a6051d05 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -94,7 +94,6 @@ co:
     account_moderation_notes:
       create: Creà una nota
       created_msg: Nota di muderazione creata!
-      delete: Toglie
       destroyed_msg: Nota di muderazione sguassata!
     accounts:
       add_email_domain_block: Mette u duminiu e-mail in lista nera
@@ -416,9 +415,6 @@ co:
         silence: silenzatu
         suspend: suspesu
       show:
-        affected_accounts:
-          one: Un contu tuccatu indè a database
-          other: "%{count} conti tuccati indè a database"
         retroactive:
           silence: Ùn silenzà più i conti affettati di stu duminiu
           suspend: Ùn suspende più i conti affettati di stu duminiu
@@ -466,9 +462,6 @@ co:
       delivery_error_days: Ghjorni d'errori di a distribuzione
       delivery_error_hint: S'ellu ùn si pò distribuì à u duminiu per %{count} ghjorni, sarà autumaticamente marcatu cum'è indistribuibile.
       empty: Mancun duminiu trovu.
-      known_accounts:
-        one: "%{count} contu cunnisciutu"
-        other: "%{count} conti cunnisciuti"
       moderation:
         all: Tuttu
         limited: Limitatu
@@ -778,7 +771,6 @@ co:
     status:
       account_status: Statutu di u contu
       confirming: In attesa di a cumplezzione di a cunfirmazione di l'e-mail.
-      functional: U vostru contu hè uperaziunale.
       pending: A vostra dumanda hè in attesa di rivista da a squadra di muderazione. Quessa pò piglià un certu tempu. Avete da riceve un'e-mail s'ella hè appruvata.
       redirecting_to: U vostru contu hè inattivu perchè riindirizza versu %{acct}.
     too_fast: Furmulariu mandatu troppu prestu, ripruvate.
@@ -1393,7 +1385,6 @@ co:
       subject: Cunfirmate u tentativu di cunnessione
       title: Tentativu di cunnessione
     warning:
-      review_server_policies: Leghje e pulitiche di u servore
       subject:
         disable: U vostru contu %{acct} hè statu ghjacciatu
         none: Avertimentu pè %{acct}
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 9d807d923..7762890e6 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -102,7 +102,6 @@ cs:
     account_moderation_notes:
       create: Zanechat poznámku
       created_msg: Moderátorská poznámka byla úspěšně vytvořena!
-      delete: Smazat
       destroyed_msg: Moderátorská poznámka byla úspěšně zničena!
     accounts:
       add_email_domain_block: Blokovat e-mailovou doménu
@@ -390,21 +389,6 @@ cs:
       media_storage: Úložiště médií
       new_users: noví uživatelé
       opened_reports: podáno hlášení
-      pending_reports_html:
-        few: "<strong>%{count}</strong> čekající hlášení"
-        many: "<strong>%{count}</strong> čekajících hlášení"
-        one: "<strong>1</strong> čekající hlášení"
-        other: "<strong>%{count}</strong> čekajících hlášení"
-      pending_tags_html:
-        few: "<strong>%{count}</strong> čekající hashtagy"
-        many: "<strong>%{count}</strong> čekajících hashtagů"
-        one: "<strong>1</strong> čekající hashtag"
-        other: "<strong>%{count}</strong> čekajících hashtagů"
-      pending_users_html:
-        few: "<strong>%{count}</strong> čekající uživatelé"
-        many: "<strong>%{count}</strong> čekajících uživatelů"
-        one: "<strong>1</strong> čekající uživatel"
-        other: "<strong>%{count}</strong> čekajících uživatelů"
       resolved_reports: vyřešeno hlášení
       software: Software
       sources: Zdroje registrací
@@ -450,11 +434,6 @@ cs:
         silence: omezena
         suspend: pozastaveno
       show:
-        affected_accounts:
-          few: "%{count} účty v databázi byly ovlivněny"
-          many: "%{count} účtů v databázi bylo ovlivněno"
-          one: Jeden účet v databázi byl ovlivněn
-          other: "%{count} účtů v databázi bylo ovlivněno"
         retroactive:
           silence: Vzít zpět omezení existujících dotčených účtů z této domény
           suspend: Zrušit pozastavení existujících ovlivněných účtů z této domény
@@ -507,11 +486,6 @@ cs:
       delivery_error_hint: Není-li možné doručení po dobu %{count} dnů, bude automaticky označen za nedoručitelný.
       destroyed_msg: Data z %{domain} nyní čekají na smazání.
       empty: Nebyly nalezeny žádné domény.
-      known_accounts:
-        few: "%{count} známé účty"
-        many: "%{count} známých účtů"
-        one: "%{count} známý účet"
-        other: "%{count} známých účtů"
       moderation:
         all: Všechny
         limited: Omezený
@@ -734,11 +708,6 @@ cs:
         allow_provider: Povolit vydavatele
         disallow: Zakázat odkaz
         disallow_provider: Zakázat vydavatele
-        shared_by_over_week:
-          few: Sdílený %{count} lidmi za poslední týden
-          many: Sdílený %{count} lidmi za poslední týden
-          one: Sdílený jedním člověkem za poslední týden
-          other: Sdílený %{count} lidmi za poslední týden
         title: Populární odkazy
         usage_comparison: Za dnešek %{today} sdílení, oproti %{yesterday} včera
       pending_review: Čeká na posouzení
@@ -765,11 +734,6 @@ cs:
         trending_rank: 'Populární #%{rank}'
         usable: Může být používán
         usage_comparison: Za dnešek %{today} použití, oproti %{yesterday} včera
-        used_by_over_week:
-          few: Použit %{count} lidmi za poslední týden
-          many: Použit %{count} lidmi za poslední týden
-          one: Použit jedním člověkem za poslední týden
-          other: Použit %{count} lidmi za poslední týden
       title: Trendy
     warning_presets:
       add_new: Přidat nové
@@ -868,7 +832,6 @@ cs:
     status:
       account_status: Stav účtu
       confirming: Čeká na dokončení potvrzení e-mailu.
-      functional: Váš účet je zcela funkční.
       pending: Vaše žádost čeká na posouzení naším personálem. To může nějakou dobu trvat. Pokud bude váš požadavek schválen, obdržíte e-mail.
       redirecting_to: Váš účet je neaktivní, protože je právě přesměrován na účet %{acct}.
     too_fast: Formulář byl odeslán příliš rychle, zkuste to znovu.
@@ -1520,7 +1483,6 @@ cs:
       subject: Potvrďte prosím pokus o přihlášení
       title: Pokus o přihlášení
     warning:
-      review_server_policies: Zkontrolujte pravidla serveru
       subject:
         disable: Váš účet %{acct} byl zmrazen
         none: Varování pro %{acct}
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index 16fd77cdd..0af3f175d 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -105,7 +105,6 @@ cy:
     account_moderation_notes:
       create: Gadael nodyn
       created_msg: Crewyd nodyn goruwchwylio yn llwyddiannus!
-      delete: Dileu
       destroyed_msg: Dinistrwyd nodyn goruwchwylio yn llwyddiannus!
     accounts:
       add_email_domain_block: Cosbrestru parth e-bost
@@ -332,13 +331,6 @@ cy:
         silence: tawelu
         suspend: ataliedig
       show:
-        affected_accounts:
-          few: Effeithiwyd ar %{count} gyfrifon
-          many: Effeithiwyd ar %{count} gyfrifon
-          one: Effeithiwyd ar un cyfrif
-          other: Effeithiwyd ar %{count} gyfrifon
-          two: Effeithiwyd ar %{count} gyfrifon
-          zero: Effeithiwyd ar %{count} gyfrifon
         retroactive:
           silence: Dad-dawelu pob cyfri presennol o'r parth hwn
           suspend: Dad-atal pob cyfrif o'r parth hwn sy'n bodoli
@@ -361,13 +353,6 @@ cy:
     instances:
       by_domain: Parth
       delivery_available: Mae'r cyflenwad ar gael
-      known_accounts:
-        few: "%{count} cyfrifon hysbys"
-        many: "%{count} cyfrifon hysbys"
-        one: "%{count} cyfrif hysbys"
-        other: "%{count} cyfrifon hysbys"
-        two: "%{count} cyfrifon hysbys"
-        zero: "%{count} cyfrifon hysbys"
       moderation:
         all: Pob
         limited: Gyfyngedig
@@ -623,7 +608,6 @@ cy:
     status:
       account_status: Statws cyfrif
       confirming: Aros i gadarnhad e-bost gael ei gwblhau.
-      functional: Mae eich cyfrif yn gwbl weithredol.
       pending: Mae'ch cais yn aros i gael ei adolygu gan ein staff. Gall hyn gymryd cryn amser. Byddwch yn derbyn e-bost os caiff eich cais ei gymeradwyo.
       redirecting_to: Mae eich cyfrif yn anactif oherwydd ei fod ar hyn o bryd yn ailgyfeirio i %{acct}.
     trouble_logging_in: Trafferdd mewngofnodi?
@@ -1184,7 +1168,6 @@ cy:
       subject: Cadarnhewch yr ymgais mewngofnodi
       title: Ymgais mewngofnodi
     warning:
-      review_server_policies: Adolygu polisïau'r gweinydd
       subject:
         disable: Mae'ch cyfrif %{acct} wedi'i rewi
         none: Rhybudd am %{acct}
diff --git a/config/locales/da.yml b/config/locales/da.yml
index c898bee20..d1bc57a88 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -94,7 +94,6 @@ da:
     account_moderation_notes:
       create: Læg en note
       created_msg: Moderatornotat oprettet!
-      delete: Slet
       destroyed_msg: Moderatornotat destrueret!
     accounts:
       add_email_domain_block: Blokér e-maildomæne
@@ -163,6 +162,8 @@ da:
       not_subscribed: Abonnerer ikke
       pending: Afventende vurdering
       perform_full_suspension: Suspendér
+      previous_strikes_description_html:
+        zero: Denne kontostatus er <strong>på god fod</strong>.
       promote: Forfrem
       protocol: Protokol
       public: Offentlig
@@ -206,6 +207,7 @@ da:
       statuses: Statusser
       strikes: Tidligere striber
       subscribe: Abonnér
+      suspend: Suspendér
       suspended: Suspenderet
       suspension_irreversible: Disse kontodata er blevet slettet permanent. Du kan afsuspendere kontoen for at gøre den brugbar, men dette gendanner ikke de tidligere kontodata.
       suspension_reversible_hint_html: Kontoen er blevet suspenderet, og dens data fjernes helt d. %{date}. Indtil da kan kontoen genoprettes uden datatab mv. Ønsker alle kontodata fjernet straks, kan dette gøres nedenfor.
@@ -226,6 +228,7 @@ da:
       whitelisted: Tilladt for federering
     action_logs:
       action_types:
+        approve_appeal: Godkend appel
         approve_user: Godkend bruger
         assigned_to_self_report: Tildel rapport
         change_email_user: Skift e-mail for bruger
@@ -257,6 +260,7 @@ da:
         enable_user: Aktivér brugeren
         memorialize_account: Gør til mindekonto
         promote_user: Promovér bruger
+        reject_appeal: Afvis appel
         reject_user: Afvis bruger
         remove_avatar_user: Fjern profilbillede
         reopen_report: Genåbn anmeldelse
@@ -275,6 +279,7 @@ da:
         update_domain_block: Opdatér domæneblokering
         update_status: Opdatér status
       actions:
+        approve_appeal_html: "%{name} godkendte moderationsafgørelsesappellen fra %{target}"
         approve_user_html: "%{name} godkendte tilmelding fra %{target}"
         assigned_to_self_report_html: "%{name} tildelte sig selv anmeldelsen %{target}"
         change_email_user_html: "%{name} ændrede e-mailadressen for bruger %{target}"
@@ -306,6 +311,7 @@ da:
         enable_user_html: "%{name} aktiverede indlogning for brugeren %{target}"
         memorialize_account_html: "%{name} gjorde %{target}s konto til en mindeside"
         promote_user_html: "%{name} forfremmede brugeren %{target}"
+        reject_appeal_html: "%{name} afviste moderationsafgørelsesappellen fra %{target}"
         reject_user_html: "%{name} afviste tilmelding fra %{target}"
         remove_avatar_user_html: "%{name} fjernede %{target}s profilbillede"
         reopen_report_html: "%{name} genåbnede anmeldelsen %{target}"
@@ -384,14 +390,17 @@ da:
       media_storage: Medielagerplads
       new_users: nye brugere
       opened_reports: rapporter åbnet
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> afventende appel"
+        other: "<strong>%{count}</strong> afventende appeller"
       pending_reports_html:
-        one: "<strong>1</strong> afventende rapport"
-        other: "<strong>%{count}</strong> afventende rapporter"
+        one: "<strong>%{count}</strong> afventende anmeldelse"
+        other: "<strong>%{count}</strong> afventende anmeldelser"
       pending_tags_html:
-        one: "<strong>1</strong> afventende hashtag"
+        one: "<strong>%{count}</strong> afventende hashtag"
         other: "<strong>%{count}</strong> afventende hashtags"
       pending_users_html:
-        one: "<strong>1</strong> afventende bruger"
+        one: "<strong>%{count}</strong> afventende bruger"
         other: "<strong>%{count}</strong> afventende brugere"
       resolved_reports: anmeldelser løst
       software: Software
@@ -401,6 +410,10 @@ da:
       top_languages: Mest aktive sprog
       top_servers: Mest aktive servere
       website: Websted
+    disputes:
+      appeals:
+        empty: Ingen appeller fundet.
+        title: Appeller
     domain_allows:
       add_new: Tillade federering med domæne
       created_msg: Domæne er blevet tilladt federering
@@ -439,8 +452,9 @@ da:
         suspend: suspenderet
       show:
         affected_accounts:
-          one: En konto i databasen påvirket
+          one: Én konto i databasen påvirket
           other: "%{count} konti i databasen påvirket"
+          zero: Ingen konto i databasen påvirket
         retroactive:
           silence: Fjern tavsgøring for eksisterende, berørte konti fra dette domæne
           suspend: Fjern suspendering for eksisterende, berørte konti fra dette domæne
@@ -494,6 +508,7 @@ da:
       known_accounts:
         one: "%{count} kendt konto"
         other: "%{count} kendte konti"
+        zero: Ingen kendt konto
       moderation:
         all: Alle
         limited: Begrænset
@@ -563,7 +578,7 @@ da:
         other_description_html: Se flere muligheder for kontoadfærdsstyring og kommunikationstilpasning til den anmeldte konto.
         silence_description_html: Profilen vil kun være synlig for dem, som allerede følger den eller manuelt slå den op, hvilket markant begrænse dens rækkevidde. Kan altid omgøres.
         suspend_description_html: Profilen inkl. alt indhold gøres utilgængelig, indtil den til sidst slettes. Interaktion med kontoen vil være umulig. Reversible inden for 30 dage.
-      actions_description_html: 'Hvis fjernelse af det krænkende indhold ovenfor er utilstrækkelig:'
+      actions_description_html: Afgør, hvilke foranstaltning, der skal træffes for at løse denne anmeldelse. Træffes en straffende foranstaltning mod den anmeldte konto, fremsendes en e-mailnotifikation, undtagen når kategorien <strong>Spam</strong> er valgt.
       add_to_report: Føj mere til anmeldelse
       are_you_sure: Sikker?
       assign_to_self: Tildel til mig
@@ -575,7 +590,7 @@ da:
         none: Ingen
       comment_description_html: 'For at give mere information, skrev %{name}:'
       created_at: Anmeldt
-      delete_and_resolve: Løs og slet
+      delete_and_resolve: Slet indlæg
       forwarded: Videresendt
       forwarded_to: Videresendt til %{domain}
       mark_as_resolved: Markér som løst
@@ -589,12 +604,14 @@ da:
         placeholder: Beskriv de udførte handlinger eller andre relevante opdateringer...
         title: Notater
       notes_description_html: Se og skriv notater til andre moderatorer og dit fremtid selv
+      quick_actions_description_html: 'Træf en hurtig foranstaltning eller rul ned for at se anmeldt indhold:'
       reopen: Genåbn anmeldelse
       report: 'Anmeldelse #%{id}'
       reported_account: Anmeldt konto
       reported_by: Anmeldt af
       resolved: Løst
       resolved_msg: Anmeldelse er nu løst!
+      skip_to_actions: Overspring til handlinger
       status: Status
       statuses: Anmeld indhold
       statuses_description_html: Krænkende indhold refereres i kommunikationen med den anmeldte konto
@@ -715,6 +732,16 @@ da:
       no_status_selected: Ingen indlæg ændret, da ingen var valgt
       title: Kontoindlæg
       with_media: Med medier
+    strikes:
+      actions:
+        delete_statuses: "%{name} slettede %{target}s indlæg"
+        disable: "%{name} frøs %{target}s konto"
+        none: "%{name} sendte en advarsel til %{target}"
+        sensitive: "%{name} markerede %{target}s konto som sensitiv"
+        silence: "%{name} begrænsede %{target}s konto"
+        suspend: "%{name} suspenderede %{target}s konto"
+      appeal_approved: Appelleret
+      appeal_pending: Appel afventer
     system_checks:
       database_schema_check:
         message_html: Databasemigreringer afventer. Kør dem for at sikre den forventede adfærd fra applikationen
@@ -737,8 +764,9 @@ da:
         disallow: Tillad ikke link
         disallow_provider: Tillad ikke udgiver
         shared_by_over_week:
-          one: Delt af én person i løbet af den sidste uge
-          other: Delt af %{count} personer i løbet af den sidste uge
+          one: Delt af én person i løbet af den seneste uge
+          other: Delt af %{count} personer i løbet af den seneste uge
+          zero: Ikke delt af nogen i løbet af den seneste uge
         title: Populære links
         usage_comparison: Delt %{today} gange i dag, sammenlignet med %{yesterday} i går
       pending_review: Afventende vurdering
@@ -766,8 +794,9 @@ da:
         usable: Kan bruges
         usage_comparison: Brugt %{today} gange i dag, sammenlignet med %{yesterday} i går
         used_by_over_week:
-          one: Brugt af én person i løbet af den sidste uge
-          other: Brugt af %{count} personer i løbet af den sidste uge
+          one: Brugt af én person i løbet af den seneste uge
+          other: Brugt af %{count} personer i løbet af den seneste uge
+          zero: Ikke brugt af nogen i løbet af den seneste uge
       title: Trends
     warning_presets:
       add_new: Tilføj ny
@@ -776,6 +805,17 @@ da:
       empty: Ingen advarselsforvalg defineret endnu.
       title: Håndtérr advarselsforvalg
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: for sletning af vedkommendes indlæg
+        disable: for frysning af vedkommendes konto
+        none: en advarsel
+        sensitive: for markering af vedkommendes konto som sensitiv
+        silence: for begrænsning af vedkommendes konto
+        suspend: for suspendering af vedkommendes konto
+      body: "%{target} appellerer en moderationsbeslutning fra %{action_taken_by} pr. %{date}, der var %{type}. Vedkommende skrev:"
+      next_steps: Appellen kan godkendes for at fortryde moderationsbeslutningen eller den ignoreres.
+      subject: "%{username} appellerer en moderationsbeslutning for %{instance}"
     new_pending_account:
       body: Detaljerne for den nye konto fremgår nedenfor. Du kan godkende eller afvise denne ansøgning.
       subject: Ny konto til gennemgang på %{instance} (%{username})
@@ -866,7 +906,6 @@ da:
     status:
       account_status: Kontostatus
       confirming: Afventer færdiggørelse af e-mailbekræftelse.
-      functional: Din konto er fuldt operationel.
       pending: Din ansøgning afventer gennemgang af vores medarbejdere. Dette kan tage noget tid. Du modtager en e-mail, hvis din ansøgning godkendes.
       redirecting_to: Din konto er inaktiv, da den pt. er omdirigerer til %{acct}.
     too_fast: Formularen indsendt for hurtigt, forsøg igen.
@@ -932,6 +971,31 @@ da:
     directory: Profilliste
     explanation: Find brugere baseret på deres interesser
     explore_mastodon: Uforsk %{title}
+  disputes:
+    strikes:
+      action_taken: Handling foretaget
+      appeal: Appel
+      appeal_rejected: Appellen er afvist
+      appeal_submitted_at: Appel indgivet
+      appealed_msg: Din appel er indgivet. Godkendes den, underrettes du.
+      appeals:
+        submit: Indgiv appel
+      associated_report: Tilknyttet anmeldelse
+      created_at: Dateret
+      recipient: Adresseret til
+      status: 'Indlæg #%{id}'
+      status_removed: Indlæg allerede fjernet fra system
+      title: "%{action} pr. %{date}"
+      title_actions:
+        delete_statuses: Indlægsfjernelse
+        disable: Kontofrysning
+        none: Advarsel
+        sensitive: Markering som sensitiv konto
+        silence: Kontobegrænsning
+        suspend: Kontosuspendering
+      your_appeal_approved: Din appel er godkendt
+      your_appeal_pending: Du har indgivet en appel
+      your_appeal_rejected: Din appel er afvist
   domain_validator:
     invalid_domain: er ikke et gyldigt domænenavn
   errors:
@@ -1143,6 +1207,8 @@ da:
       title: Nyt boost
     status:
       subject: "%{name} har netop postet"
+    update:
+      subject: "%{name} redigerede et indlæg"
   notifications:
     email_events: Begivenheder for e-mailnotifikationer
     email_events_hint: 'Vælg begivenheder, som notifikationer skal modtages for:'
@@ -1413,6 +1479,13 @@ da:
     recovery_instructions_html: Mister du nogensinde adgang til din mobil, kan du bruge en af gendannelseskoderne nedenfor til at opnå adgang til din konto. <strong>Opbevar gendannelseskoderne et sikkert sted</strong>. Du kan f.eks. udskrive dem, og gemme dem sammen med andre vigtige dokumenter.
     webauthn: Sikkerhedsnøgler
   user_mailer:
+    appeal_approved:
+      action: Gå til din konto
+      subject: Din appel pr. %{date} er godkendt
+      title: Appel godkendt
+    appeal_rejected:
+      subject: Din appel pr. %{date} er afvist
+      title: Appel afvist
     backup_ready:
       explanation: Den anmodede fulde sikkerhedskopi af din Mastodon-konto er nu klar til download!
       subject: Dit arkiv er klar til download
@@ -1424,6 +1497,8 @@ da:
       subject: Bekræft indlogningsforsøg
       title: Indlogningsforsøg
     warning:
+      appeal: Indgiv appel
+      appeal_description: Mener du, at dette er en fejl, kan der indgives en appel til personalet på %{instance}.
       categories:
         spam: Spam
         violation: Indhold overtræder flg. fællesskabsretningslinjer
@@ -1435,7 +1510,6 @@ da:
         suspend: Din konto kan ikke længere bruges, og hverken profil eller øvrige data kan tilgås. Du kan stadig logge ind for at anmode om en sikkerhedskopi af dine data, indtil disse om ca. 30 er helt slettet. Visse data bevares dog mhp. at forhindre dig i at omgå udelukkelsen.
       get_in_touch: Anses dette som en fejl, kan denne e-mail besvares for at komme i kontakt med personalet på %{instance}.
       reason: 'Årsag:'
-      review_server_policies: Gennemgå serverpolitikker
       statuses: 'Indlæg fundet i krænkelse:'
       subject:
         delete_statuses: Dine indlæg på %{acct} er blevet fjernet
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 6d0865026..edb918e67 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -94,7 +94,6 @@ de:
     account_moderation_notes:
       create: Notiz erstellen
       created_msg: Moderationsnotiz erfolgreich erstellt!
-      delete: Löschen
       destroyed_msg: Moderationsnotiz erfolgreich gelöscht!
     accounts:
       add_email_domain_block: E-Mail-Domain blacklisten
@@ -163,6 +162,11 @@ de:
       not_subscribed: Nicht abonniert
       pending: In Warteschlange
       perform_full_suspension: Verbannen
+      previous_strikes: Vorherige Strikes
+      previous_strikes_description_html:
+        one: Dieses Konto hat <strong>einen</strong> Strike.
+        other: Dieses Konto hat <strong>%{count}</strong> Strikes.
+        zero: Dieses Konto ist <strong>in gutem Stand</strong>.
       promote: Befördern
       protocol: Protokoll
       public: Öffentlich
@@ -206,6 +210,7 @@ de:
       statuses: Beiträge
       strikes: Vorherige Strikes
       subscribe: Abonnieren
+      suspend: Suspendieren
       suspended: Verbannt
       suspension_irreversible: Die Daten dieses Kontos wurden unwiderruflich gelöscht. Du kannst das Konto aufheben, um es brauchbar zu machen, aber es wird keine Daten wiederherstellen, die es davor schon hatte.
       suspension_reversible_hint_html: Das Konto wurde gesperrt und die Daten werden am %{date} vollständig gelöscht. Bis dahin kann das Konto ohne irgendwelche negativen Auswirkungen wiederhergestellt werden. Wenn du alle Daten des Kontos sofort entfernen möchtest, kannst du dies nachfolgend tun.
@@ -226,6 +231,7 @@ de:
       whitelisted: Auf der Whitelist
     action_logs:
       action_types:
+        approve_appeal: Einspruch annehmen
         approve_user: Benutzer genehmigen
         assigned_to_self_report: Bericht zuweisen
         change_email_user: E-Mail des Benutzers ändern
@@ -257,6 +263,7 @@ de:
         enable_user: Benutzer aktivieren
         memorialize_account: Account deaktivieren
         promote_user: Benutzer befördern
+        reject_appeal: Einspruch ablehnen
         reject_user: Benutzer ablehnen
         remove_avatar_user: Profilbild entfernen
         reopen_report: Meldung wieder eröffnen
@@ -275,6 +282,7 @@ de:
         update_domain_block: Domain Block aktualisieren
         update_status: Beitrag aktualisieren
       actions:
+        approve_appeal_html: "%{name} genehmigte die Moderationsbeschlüsse von %{target}"
         approve_user_html: "%{name} genehmigte die Anmeldung von %{target}"
         assigned_to_self_report_html: "%{name} hat sich die Meldung %{target} selbst zugewiesen"
         change_email_user_html: "%{name} hat die E-Mail-Adresse des Nutzers %{target} geändert"
@@ -306,6 +314,7 @@ de:
         enable_user_html: "%{name} hat Zugang von Benutzer_in %{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_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"
@@ -384,15 +393,6 @@ de:
       media_storage: Medienspeicher
       new_users: Neue Benutzer
       opened_reports: Erstellte Meldungen
-      pending_reports_html:
-        one: "<strong>1</strong> ausstehende Meldung"
-        other: "<strong>%{count}</strong> ausstehende Meldungen"
-      pending_tags_html:
-        one: "<strong>1</strong> ausstehender Hashtag"
-        other: "<strong>%{count}</strong> ausstehende Hashtags"
-      pending_users_html:
-        one: "<strong>1</strong> ausstehender Benutzer"
-        other: "<strong>%{count}</strong> ausstehende Benutzer"
       resolved_reports: Gelöste Meldungen
       software: Software
       sources: Registrierungsquellen
@@ -401,6 +401,10 @@ de:
       top_languages: Top aktive Sprachen
       top_servers: Top aktive Server
       website: Website
+    disputes:
+      appeals:
+        empty: Keine Einsprüche gefunden.
+        title: Einsprüche
     domain_allows:
       add_new: Whitelist-Domain
       created_msg: Domain wurde erfolgreich zur Whitelist hinzugefügt
@@ -438,9 +442,6 @@ de:
         silence: stummgeschaltet
         suspend: gesperrt
       show:
-        affected_accounts:
-          one: Ein Konto in der Datenbank betroffen
-          other: "%{count} Konten in der Datenbank betroffen"
         retroactive:
           silence: Alle existierenden Konten dieser Domain nicht mehr stummschalten
           suspend: Alle existierenden Konten dieser Domain entsperren
@@ -491,9 +492,6 @@ de:
       delivery_error_hint: Wenn eine Lieferung für %{count} Tage nicht möglich ist, wird sie automatisch als nicht lieferbar markiert.
       destroyed_msg: Daten von %{domain} sind nun in der Warteschlange für die bevorstehende Löschung.
       empty: Keine Domains gefunden.
-      known_accounts:
-        one: "%{count} bekanntes Konto"
-        other: "%{count} bekannte Konten"
       moderation:
         all: Alle
         limited: Beschränkt
@@ -560,10 +558,12 @@ de:
       action_log: Überprüfungsprotokoll
       action_taken_by: Maßnahme ergriffen durch
       actions:
+        delete_description_html: Der gemeldete Beitrag wird gelöscht und ein Strike wird aufgezeichnet, um dir bei zukünftigen Verstößen des gleichen Accounts zu helfen.
         other_description_html: Weitere Optionen zur Kontrolle des Kontoverhaltens und zur Anpassung der Kommunikation an das gemeldete Konto.
+        resolve_description_html: Es wird keine Maßnahme gegen den gemeldeten Account ergriffen, es wird kein Strike verzeichnet und die Meldung wird geschlossen.
         silence_description_html: Das Profil wird nur für diejenigen sichtbar sein, die es bereits verfolgen oder manuell nachschlagen und die Reichweite wird stark begrenzt. Kann immer rückgängig gemacht werden.
         suspend_description_html: Das Profil und alle seine Inhalte werden unzugänglich werden, bis es schließlich gelöscht wird. Interaktion mit dem Konto wird unmöglich sein. Reversibel innerhalb von 30 Tagen.
-      actions_description_html: 'Wenn das Entfernen des obigen Inhalts nicht ausreicht:'
+      actions_description_html: Entscheide, welche Maßnahmen zur Lösung dieses Berichts zu ergreifen sind. Wenn du eine Strafmaßnahme gegen das gemeldete Konto ergreifst, wird eine E-Mail-Benachrichtigung an diese gesendet außer wenn die <strong>Spam</strong> Kategorie ausgewählt ist.
       add_to_report: Mehr zur Meldung hinzufügen
       are_you_sure: Bist du dir sicher?
       assign_to_self: Mir zuweisen
@@ -575,7 +575,7 @@ de:
         none: Kein
       comment_description_html: 'Um weitere Informationen bereitzustellen, schrieb %{name} folgendes:'
       created_at: Gemeldet
-      delete_and_resolve: Löschen und auflösen
+      delete_and_resolve: Beiträge löschen
       forwarded: Weitergeleitet
       forwarded_to: Weitergeleitet an %{domain}
       mark_as_resolved: Als gelöst markieren
@@ -589,12 +589,14 @@ de:
         placeholder: Beschreibe, welche Maßnahmen ergriffen wurden oder irgendwelche andere Neuigkeiten…
         title: Notizen
       notes_description_html: Zeige und hinterlasse Notizen an andere Moderatoren und dein zukünftiges Selbst
+      quick_actions_description_html: 'Führe eine schnelle Aktion aus oder scrolle nach unten, um gemeldete Inhalte zu sehen:'
       reopen: Meldung wieder eröffnen
       report: 'Meldung #%{id}'
       reported_account: Gemeldetes Konto
       reported_by: Gemeldet von
       resolved: Gelöst
       resolved_msg: Meldung erfolgreich gelöst!
+      skip_to_actions: Zu Aktionen springen
       status: Zustand
       statuses: Gemeldeter Inhalt
       statuses_description_html: Störende Inhalte werden in der Kommunikation mit dem gemeldeten Konto zitiert
@@ -715,6 +717,16 @@ de:
       no_status_selected: Keine Beiträge wurden geändert, weil keine ausgewählt wurden
       title: Beiträge des Kontos
       with_media: Mit Medien
+    strikes:
+      actions:
+        delete_statuses: "%{name} hat die Beiträge von %{target} entfernt"
+        disable: "%{name} hat das Konto von %{target} eingefroren"
+        none: "%{name} hat eine Warnung an %{target} gesendet"
+        sensitive: "%{name} markierte %{target}'s Konto als NSFW"
+        silence: "%{name} hat das Konto von %{target} eingeschränkt"
+        suspend: "%{name} hat das Konto von %{target} verbannt"
+      appeal_approved: Einspruch angenommen
+      appeal_pending: Einspruch ausstehend
     system_checks:
       database_schema_check:
         message_html: Es gibt ausstehende Datenbankmigrationen. Bitte führen Sie sie aus, um sicherzustellen, dass sich die Anwendung wie erwartet verhält
@@ -736,9 +748,6 @@ de:
         allow_provider: Erlaube Herausgeber
         disallow: Verbiete Link
         disallow_provider: Verbiete Herausgeber
-        shared_by_over_week:
-          one: In der letzten Woche geteilt von einer Person
-          other: In der letzten Woche geteilt von %{count} Personen
         title: Angesagte Links
         usage_comparison: Heute %{today} mal geteilt, gestern %{yesterday} mal
       pending_review: Überprüfung ausstehend
@@ -760,14 +769,11 @@ de:
         not_trendable: Wird nicht unter Trends angezeigt
         not_usable: Kann nicht verwendet werden
         peaked_on_and_decaying: In den Trends am %{date}, jetzt absteigend
-        title: Beliebtes Hashtags
+        title: Angesagte Hashtags
         trendable: Darf unter Trends erscheinen
         trending_rank: 'Trend #%{rank}'
         usable: Kann verwendet werden
         usage_comparison: Heute %{today} mal genutzt, gestern %{yesterday} mal
-        used_by_over_week:
-          one: In der letzten Woche genutzt von einer Person
-          other: In der letzten Woche genutzt von %{count} Personen
       title: Trends
     warning_presets:
       add_new: Neu hinzufügen
@@ -776,6 +782,17 @@ de:
       empty: Du hast noch keine Warnungsvorlagen hinzugefügt.
       title: Warnungsvorlagen verwalten
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: deren Beiträge zu löschen
+        disable: deren Konto einzufrieren
+        none: eine Warnung
+        sensitive: deren Konto als NSFW zu markieren
+        silence: deren Konto zu beschränken
+        suspend: deren Konto zu sperren
+      body: "%{target} hat was gegen eine Moderationsentscheidung von %{action_taken_by} von %{date}, die %{type} war. Die Person schrieb:"
+      next_steps: Du kannst dem Einspruch zustimmen und die Moderationsentscheidung rückgängig machen oder ignorieren.
+      subject: "%{username} hat Einspruch an einer Moderationsentscheidung von %{instance}"
     new_pending_account:
       body: Die Details von diesem neuem Konto sind unten. Du kannst die Anfrage akzeptieren oder ablehnen.
       subject: Neues Konto zur Überprüfung auf %{instance} verfügbar (%{username})
@@ -866,7 +883,6 @@ de:
     status:
       account_status: Kontostatus
       confirming: Warte auf die Bestätigung der E-Mail.
-      functional: Dein Konto ist voll funktionsfähig.
       pending: Deine Bewerbung wird von unseren Mitarbeitern noch überprüft. Dies kann einige Zeit dauern. Du erhältst eine E-Mail, wenn deine Bewerbung genehmigt wurde.
       redirecting_to: Dein Konto ist inaktiv, da es derzeit zu %{acct} umgeleitet wird.
     too_fast: Formular zu schnell gesendet, versuchen Sie es erneut.
@@ -932,6 +948,32 @@ de:
     directory: Profilverzeichnis
     explanation: Entdecke Benutzer basierend auf deren Interessen
     explore_mastodon: Entdecke %{title}
+  disputes:
+    strikes:
+      action_taken: Maßnahme ergriffen
+      appeal: Einspruch
+      appeal_approved: Dieser Strike wurde erfolgreich beeinsprucht und ist nicht mehr gültig
+      appeal_rejected: Der Einspruch wurde abgelehnt
+      appeal_submitted_at: Einspruch eingelegt
+      appealed_msg: Dein Einspruch wurde abgesendet. Wenn er angenommen wird, wirst du benachrichtigt.
+      appeals:
+        submit: Einspruch erheben
+      associated_report: Zugehöriger Bericht
+      created_at: Datum
+      recipient: Adressiert an
+      status: 'Beitrag #%{id}'
+      status_removed: Beitrag bereits vom System entfernt
+      title: "%{action} vom %{date}"
+      title_actions:
+        delete_statuses: Post-Entfernung
+        disable: Einfrieren des Kontos
+        none: Warnung
+        sensitive: Als NSFW markieren
+        silence: Kontobeschränkung
+        suspend: Kontosperre
+      your_appeal_approved: Dein Einspruch wurde angenommen
+      your_appeal_pending: Du hast Einspruch eingelegt
+      your_appeal_rejected: Dein Einspruch wurde abgelehnt
   domain_validator:
     invalid_domain: ist kein gültiger Domain-Name
   errors:
@@ -1143,6 +1185,8 @@ de:
       title: Dein Beitrag wurde geteilt
     status:
       subject: "%{name} hat gerade etwas gepostet"
+    update:
+      subject: "%{name} bearbeitete einen Beitrag"
   notifications:
     email_events: Ereignisse für E-Mail-Benachrichtigungen
     email_events_hint: 'Wähle Ereignisse, für die du Benachrichtigungen erhalten möchtest:'
@@ -1495,6 +1539,15 @@ de:
     recovery_instructions_html: Wenn du den Zugang zu deinem Telefon verlieren solltest, kannst du einen untenstehenden Wiederherstellungscode benutzen, um wieder auf dein Konto zugreifen zu können. <strong>Bewahre die Wiederherstellungscodes gut auf.</strong> Du könntest sie beispielsweise ausdrucken und bei deinen restlichen wichtigen Dokumenten aufbewahren.
     webauthn: Sicherheitsschlüssel
   user_mailer:
+    appeal_approved:
+      action: Gehe zu deinem Konto
+      explanation: Der Einspruch gegen dem Strike vom %{strike_date}, den du am %{appeal_date} eingereicht hast, wurde genehmigt. Dein Konto ist wieder in gutem Zustand.
+      subject: Dein Einspruch vom %{date} wurde angenommen
+      title: Einspruch angenommen
+    appeal_rejected:
+      explanation: Der Einspruch gegen dem Strike vom %{strike_date}, den du am %{appeal_date} eingereicht hast, wurde abgelehnt.
+      subject: Dein Einspruch vom %{date} wurde abgelehnt
+      title: Einspruch abgelehnt
     backup_ready:
       explanation: Du hast ein vollständiges Backup von deinem Mastodon-Konto angefragt. Es kann jetzt heruntergeladen werden!
       subject: Dein Archiv ist bereit zum Download
@@ -1506,6 +1559,8 @@ de:
       subject: Bitte bestätige den Anmeldeversuch
       title: Anmeldeversuch
     warning:
+      appeal: Einspruch einsenden
+      appeal_description: Wenn du glaubst, dass dies ein Fehler ist, kannst du einen Einspruch an die Mitarbeiter von %{instance} senden.
       categories:
         spam: Spam
         violation: Inhalt verletzt die folgenden Community-Richtlinien
@@ -1517,7 +1572,6 @@ de:
         suspend: Du kannst dein Konto nicht mehr verwenden und dein Profil und andere Daten sind nicht mehr verfügbar. Du kannst dich immer noch anmelden, um ein Backup deiner Daten anzufordern, bis die Daten innerhalb von 30 Tagen vollständig gelöscht wurden. Allerdings werden wir einige Daten speichern, um zu verhindern, dass du die Sperrung umgehst.
       get_in_touch: Wenn du glaubst, dass dies ein Fehler ist, kannst auf diese E-Mail antworten, um mit den Mitarbeitern von %{instance} in Kontakt zu treten.
       reason: 'Grund:'
-      review_server_policies: Serverrichtlinien ansehen
       statuses: 'Beiträge, die in Verletzung gefunden wurden:'
       subject:
         delete_statuses: Deine Beiträge auf %{acct} wurden entfernt
diff --git a/config/locales/devise.th.yml b/config/locales/devise.th.yml
index e53c0f895..14f99f2c3 100644
--- a/config/locales/devise.th.yml
+++ b/config/locales/devise.th.yml
@@ -55,7 +55,7 @@ th:
         subject: 'Mastodon: เปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยแล้ว'
         title: เปิดใช้งาน 2FA แล้ว
       two_factor_recovery_codes_changed:
-        explanation: ยกเลิกรหัสกู้คืนก่อนหน้าและสร้างรหัสใหม่แล้ว
+        explanation: ยกเลิกรหัสกู้คืนก่อนหน้านี้และสร้างรหัสใหม่แล้ว
         subject: 'Mastodon: สร้างรหัสกู้คืนสองปัจจัยใหม่แล้ว'
         title: เปลี่ยนรหัสกู้คืน 2FA แล้ว
       unlock_instructions:
diff --git a/config/locales/doorkeeper.fr.yml b/config/locales/doorkeeper.fr.yml
index 6ebe93b9c..fde6c1a2e 100644
--- a/config/locales/doorkeeper.fr.yml
+++ b/config/locales/doorkeeper.fr.yml
@@ -138,12 +138,12 @@ fr:
       read:notifications: voir vos notifications
       read:reports: voir vos signalements
       read:search: rechercher en votre nom
-      read:statuses: voir tous les statuts
+      read:statuses: voir tous les messages
       write: modifier toutes les données de votre compte
       write:accounts: modifier votre profil
       write:blocks: bloquer des comptes et des domaines
-      write:bookmarks: statuts des marque-pages
-      write:favourites: mettre des statuts en favori
+      write:bookmarks: mettre des messages en marque-pages
+      write:favourites: mettre des messages en favori
       write:filters: créer des filtres
       write:follows: suivre des personnes
       write:lists: créer des listes
@@ -151,4 +151,4 @@ fr:
       write:mutes: masquer des comptes et des conversations
       write:notifications: effacer vos notifications
       write:reports: signaler d’autres personnes
-      write:statuses: publier des statuts
+      write:statuses: publier des messages
diff --git a/config/locales/doorkeeper.is.yml b/config/locales/doorkeeper.is.yml
index 17ea34206..c5071f425 100644
--- a/config/locales/doorkeeper.is.yml
+++ b/config/locales/doorkeeper.is.yml
@@ -138,12 +138,12 @@ is:
       read:notifications: sjá tilkynningarnar þínar
       read:reports: skoða skýrslurnar þína
       read:search: leita fyrir þína hönd
-      read:statuses: sjá allar stöðufærslur
+      read:statuses: sjá allar færslur
       write: breyta öllum gögnum á notandaaðgangnum þínum
       write:accounts: breyta notandasniðinu þínu
       write:blocks: útiloka notandaaðganga og lén
-      write:bookmarks: bókamerkja stöðufærslur
-      write:favourites: setja stöðufærslur í eftirlæti
+      write:bookmarks: bókamerkja færslur
+      write:favourites: setja færslur í eftirlæti
       write:filters: útbúa síur
       write:follows: fylgjast með fólki
       write:lists: búa til lista
@@ -151,4 +151,4 @@ is:
       write:mutes: þagga niður í fólki og samtölum
       write:notifications: hreinsa tilkynningarnar þínar
       write:reports: kæra annað fólk
-      write:statuses: gefa út stöður
+      write:statuses: gefa út færslur
diff --git a/config/locales/el.yml b/config/locales/el.yml
index f1bdf34a8..8bc71c0b7 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -93,7 +93,6 @@ el:
     account_moderation_notes:
       create: Άφησε σημείωση
       created_msg: Επιτυχής δημιουργία σημειώματος μεσολάβησης!
-      delete: Διαγραφή
       destroyed_msg: Επιτυχής καταστροφή σημειώματος μεσολάβησης!
     accounts:
       add_email_domain_block: Εγγραφή τομέα email σε μαύρη λίστα
@@ -197,6 +196,7 @@ el:
       silenced: Αποσιωπημένοι
       statuses: Καταστάσεις
       subscribe: Εγγραφή
+      suspend: Αναστολή
       suspended: Σε αναστολή
       suspension_irreversible: Τα δεδομένα αυτού του λογαριασμού έχουν διαγραφεί οριστικά. Μπορείς να άρεις την αναστολή του λογαριασμού για να μπορέσει να χρησιμοποιηθεί αλλά αυτό δεν θα επαναφέρει όσα δεδομένα είχε προηγουμένως.
       suspension_reversible_hint_html: Ο λογαριασμός έχει ανασταλλεί και τα δεδομένα του θα διαγραφούν πλήρως στις %{date}. Μέχρι τότε ο λογαριασμός μπορεί να επανέλθει κανονικά. Αν θέλεις να διαγράψεις όλα τα δεδομένα του λογαριασμού, μπορείς να το κάνεις παρακάτω.
@@ -217,6 +217,7 @@ el:
       whitelisted: Εγκεκριμένοι
     action_logs:
       action_types:
+        approve_appeal: Έγκριση Έφεσης
         approve_user: Έγκριση Χρήστη
         assigned_to_self_report: Ανάθεση Αναφοράς
         change_email_user: Αλλαγή email για χρήστη
@@ -244,6 +245,7 @@ el:
         enable_user: Ενεργοποίηση Χρήστη
         memorialize_account: Μετατροπή Λογαριασμού σε Αναμνηστικό
         promote_user: Προαγωγή Χρήστη
+        reject_appeal: Απόρριψη Έφεσης
         reject_user: Απόρριψη Χρήστη
         remove_avatar_user: Αφαίρεση Avatar
         reopen_report: Ξανάνοιγμα Καταγγελίας
@@ -321,18 +323,12 @@ el:
       updated_msg: Επιτυχής ενημέρωση του emoji!
       upload: Ανέβασμα
     dashboard:
-      pending_reports_html:
-        one: "<strong>1</strong> εκκρεμής αναφορά"
-        other: "<strong>%{count}</strong> εκκρεμείς αναφορές"
-      pending_tags_html:
-        one: "<strong>1</strong> εκκρεμές hashtag"
-        other: "<strong>%{count}</strong> εκκρεμή hashtag"
-      pending_users_html:
-        one: "<strong>1</strong> χρήστης σε εκκρεμότητα"
-        other: "<strong>%{count}</strong> χρήστες σε εκκρεμότητα"
       software: Λογισμικό
       space: Κατανάλωση χώρου
       title: Ταμπλό
+    disputes:
+      appeals:
+        title: Εφέσεις
     domain_allows:
       add_new: Έγκριση τομέα
       created_msg: Ο τομέας εγκρίθηκε με επιτυχία
@@ -368,9 +364,6 @@ el:
         silence: αποσιωπημένοι
         suspend: ανεσταλμένοι
       show:
-        affected_accounts:
-          one: Επηρεάζεται ένας λογαριασμός στη βάση δεδομένων
-          other: Επηρεάζονται %{count} λογαριασμοί στη βάση δεδομένων
         retroactive:
           silence: Αναίρεση αποσιώπησης όλων των λογαριασμός του τομέα
           suspend: Αναίρεση αναστολής όλων των λογαριασμών του τομέα
@@ -398,9 +391,6 @@ el:
       delivery_available: Διαθέσιμη παράδοση
       destroyed_msg: Τα δεδομένα από το %{domain} βρίσκονται σε αναμονή για επικείμενη διαγραφή.
       empty: Δεν βρέθηκαν τομείς.
-      known_accounts:
-        one: "%{count} γνωστός λογαριασμός"
-        other: "%{count} γνωστοί λογαριασμοί"
       moderation:
         all: Όλα
         limited: Περιορισμένα
@@ -477,7 +467,7 @@ el:
       comment:
         none: Κανένα
       created_at: Καταγγέλθηκε
-      delete_and_resolve: Διαγραφή και επίλυση
+      delete_and_resolve: Διαγραφή δημοσιεύσεων
       forwarded: Προωθημένα
       forwarded_to: Προώθημένα προς %{domain}
       mark_as_resolved: Σημειωμένο ως επιλυμένο
@@ -490,12 +480,14 @@ el:
         delete: Διαγραφή
         placeholder: Περιέγραψε τις ενέργειες που έγιναν, ή οποιαδήποτε άλλη ενημέρωση...
         title: Σημειώσεις
+      quick_actions_description_html: 'Κάντε μια γρήγορη ενέργεια ή μετακινηθείτε προς τα κάτω για να δείτε το αναφερόμενο περιεχόμενο:'
       reopen: Ξανάνοιξε την καταγγελία
       report: 'Καταγγελία #%{id}'
       reported_account: Αναφερόμενος λογαριασμός
       reported_by: Αναφέρθηκε από
       resolved: Επιλύθηκε
       resolved_msg: Η καταγγελία επιλύθηκε επιτυχώς!
+      skip_to_actions: Μετάβαση στις ενέργειες
       status: Κατάσταση
       statuses: Αναφερόμενο περιεχόμενο
       title: Αναφορές
@@ -627,6 +619,9 @@ el:
       empty: Δεν έχετε ακόμη ορίσει κάποια προεπιλογή προειδοποίησης.
       title: Διαχείριση προκαθορισμένων προειδοποιήσεων
   admin_mailer:
+    new_appeal:
+      actions:
+        none: μια προειδοποίηση
     new_pending_account:
       body: Τα στοιχεία του νέου λογαριασμού είναι παρακάτω. Μπορείς να εγκρίνεις ή να απορρίψεις αυτή την αίτηση.
       subject: Νέος λογαριασμός προς έγκριση στο %{instance} (%{username})
@@ -707,7 +702,6 @@ el:
     status:
       account_status: Κατάσταση λογαριασμού
       confirming: Αναμονή για ολοκλήρωση επιβεβαίωσης του email.
-      functional: Ο λογαριασμός σου είναι πανέτοιμος.
       pending: Η εφαρμογή σας εκκρεμεί έγκρισης, πιθανόν θα διαρκέσει κάποιο χρόνο. Θα λάβετε email αν εγκριθεί.
       redirecting_to: Ο λογαριασμός σου είναι ανενεργός γιατί επί του παρόντος ανακατευθύνει στον %{acct}.
     too_fast: Η φόρμα υποβλήθηκε πολύ γρήγορα, προσπαθήστε ξανά.
@@ -966,6 +960,8 @@ el:
       title: Νέα προώθηση
     status:
       subject: Ο/Η %{name} μόλις έγραψε κάτι
+    update:
+      subject: "%{name} επεξεργάστηκε μια δημοσίευση"
   notifications:
     email_events: Συμβάντα για ειδοποιήσεις μέσω email
     email_events_hint: 'Επέλεξε συμβάντα για τα οποία θέλεις να λαμβάνεις ειδοποιήσεις μέσω email:'
@@ -1254,7 +1250,6 @@ el:
       categories:
         spam: Ανεπιθύμητο
       reason: 'Αιτιολογία:'
-      review_server_policies: Αναθεώρηση πολιτικής του κόμβου
       subject:
         disable: Ο λογαριασμός σου %{acct} έχει παγώσει
         none: Προειδοποίηση προς %{acct}
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 1809f123e..c206c893b 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -94,7 +94,6 @@ en:
     account_moderation_notes:
       create: Leave note
       created_msg: Moderation note successfully created!
-      delete: Delete
       destroyed_msg: Moderation note successfully destroyed!
     accounts:
       add_email_domain_block: Block e-mail domain
@@ -163,6 +162,11 @@ en:
       not_subscribed: Not subscribed
       pending: Pending review
       perform_full_suspension: Suspend
+      previous_strikes: Previous strikes
+      previous_strikes_description_html:
+        one: This account has <strong>one</strong> strike.
+        other: This account has <strong>%{count}</strong> strikes.
+        zero: This account is <strong>in good standing</strong>.
       promote: Promote
       protocol: Protocol
       public: Public
@@ -227,6 +231,7 @@ en:
       whitelisted: Allowed for federation
     action_logs:
       action_types:
+        approve_appeal: Approve Appeal
         approve_user: Approve User
         assigned_to_self_report: Assign Report
         change_email_user: Change E-mail for User
@@ -258,6 +263,7 @@ en:
         enable_user: Enable User
         memorialize_account: Memorialize Account
         promote_user: Promote User
+        reject_appeal: Reject Appeal
         reject_user: Reject User
         remove_avatar_user: Remove Avatar
         reopen_report: Reopen Report
@@ -276,6 +282,7 @@ en:
         update_domain_block: Update Domain Block
         update_status: Update Post
       actions:
+        approve_appeal_html: "%{name} approved moderation decision appeal from %{target}"
         approve_user_html: "%{name} approved sign-up from %{target}"
         assigned_to_self_report_html: "%{name} assigned report %{target} to themselves"
         change_email_user_html: "%{name} changed the e-mail address of user %{target}"
@@ -307,6 +314,7 @@ en:
         enable_user_html: "%{name} enabled login for user %{target}"
         memorialize_account_html: "%{name} turned %{target}'s account into a memoriam page"
         promote_user_html: "%{name} promoted user %{target}"
+        reject_appeal_html: "%{name} rejected moderation decision appeal from %{target}"
         reject_user_html: "%{name} rejected sign-up from %{target}"
         remove_avatar_user_html: "%{name} removed %{target}'s avatar"
         reopen_report_html: "%{name} reopened report %{target}"
@@ -385,14 +393,17 @@ en:
       media_storage: Media storage
       new_users: new users
       opened_reports: reports opened
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> pending appeal"
+        other: "<strong>%{count}</strong> pending appeals"
       pending_reports_html:
-        one: "<strong>1</strong> pending report"
+        one: "<strong>%{count}</strong> pending report"
         other: "<strong>%{count}</strong> pending reports"
       pending_tags_html:
-        one: "<strong>1</strong> pending hashtag"
+        one: "<strong>%{count}</strong> pending hashtag"
         other: "<strong>%{count}</strong> pending hashtags"
       pending_users_html:
-        one: "<strong>1</strong> pending user"
+        one: "<strong>%{count}</strong> pending user"
         other: "<strong>%{count}</strong> pending users"
       resolved_reports: reports resolved
       software: Software
@@ -402,6 +413,10 @@ en:
       top_languages: Top active languages
       top_servers: Top active servers
       website: Website
+    disputes:
+      appeals:
+        empty: No appeals found.
+        title: Appeals
     domain_allows:
       add_new: Allow federation with domain
       created_msg: Domain has been successfully allowed for federation
@@ -442,6 +457,7 @@ en:
         affected_accounts:
           one: One account in the database affected
           other: "%{count} accounts in the database affected"
+          zero: No account in the database is affected
         retroactive:
           silence: Undo limit of existing affected accounts from this domain
           suspend: Unsuspend existing affected accounts from this domain
@@ -495,6 +511,7 @@ en:
       known_accounts:
         one: "%{count} known account"
         other: "%{count} known accounts"
+        zero: No known account
       moderation:
         all: All
         limited: Limited
@@ -720,6 +737,16 @@ en:
       no_status_selected: No posts were changed as none were selected
       title: Account posts
       with_media: With media
+    strikes:
+      actions:
+        delete_statuses: "%{name} deleted %{target}'s posts"
+        disable: "%{name} froze %{target}'s account"
+        none: "%{name} sent a warning to %{target}"
+        sensitive: "%{name} marked %{target}'s account as sensitive"
+        silence: "%{name} limited %{target}'s account"
+        suspend: "%{name} suspended %{target}'s account"
+      appeal_approved: Appealed
+      appeal_pending: Appeal pending
     system_checks:
       database_schema_check:
         message_html: There are pending database migrations. Please run them to ensure the application behaves as expected
@@ -744,6 +771,7 @@ en:
         shared_by_over_week:
           one: Shared by one person over the last week
           other: Shared by %{count} people over the last week
+          zero: Shared by noone over the last week
         title: Trending links
         usage_comparison: Shared %{today} times today, compared to %{yesterday} yesterday
       pending_review: Pending review
@@ -773,6 +801,7 @@ en:
         used_by_over_week:
           one: Used by one person over the last week
           other: Used by %{count} people over the last week
+          zero: Used by noone over the last week
       title: Trends
     warning_presets:
       add_new: Add new
@@ -781,6 +810,17 @@ en:
       empty: You haven't defined any warning presets yet.
       title: Manage warning presets
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: to delete their posts
+        disable: to freeze their account
+        none: a warning
+        sensitive: to mark their account as sensitive
+        silence: to limit their account
+        suspend: to suspend their account
+      body: "%{target} is appealing a moderation decision by %{action_taken_by} from %{date}, which was %{type}. They wrote:"
+      next_steps: You can approve the appeal to undo the moderation decision, or ignore it.
+      subject: "%{username} is appealing a moderation decision on %{instance}"
     new_pending_account:
       body: The details of the new account are below. You can approve or reject this application.
       subject: New account up for review on %{instance} (%{username})
@@ -871,7 +911,6 @@ en:
     status:
       account_status: Account status
       confirming: Waiting for e-mail confirmation to be completed.
-      functional: Your account is fully operational.
       pending: Your application is pending review by our staff. This may take some time. You will receive an e-mail if your application is approved.
       redirecting_to: Your account is inactive because it is currently redirecting to %{acct}.
     too_fast: Form submitted too fast, try again.
@@ -937,6 +976,32 @@ en:
     directory: Profile directory
     explanation: Discover users based on their interests
     explore_mastodon: Explore %{title}
+  disputes:
+    strikes:
+      action_taken: Action taken
+      appeal: Appeal
+      appeal_approved: This strike has been successfully appealed and is no longer valid
+      appeal_rejected: The appeal has been rejected
+      appeal_submitted_at: Appeal submitted
+      appealed_msg: Your appeal has been submitted. If it is approved, you will be notified.
+      appeals:
+        submit: Submit appeal
+      associated_report: Associated report
+      created_at: Dated
+      recipient: Addressed to
+      status: 'Post #%{id}'
+      status_removed: Post already removed from system
+      title: "%{action} from %{date}"
+      title_actions:
+        delete_statuses: Post removal
+        disable: Freezing of account
+        none: Warning
+        sensitive: Marking as sensitive of account
+        silence: Limitation of account
+        suspend: Suspension of account
+      your_appeal_approved: Your appeal has been approved
+      your_appeal_pending: You have submitted an appeal
+      your_appeal_rejected: Your appeal has been rejected
   domain_validator:
     invalid_domain: is not a valid domain name
   errors:
@@ -1111,6 +1176,9 @@ en:
     carry_mutes_over_text: This user moved from %{acct}, which you had muted.
     copy_account_note_text: 'This user moved from %{acct}, here were your previous notes about them:'
   notification_mailer:
+    admin:
+      sign_up:
+        subject: "%{name} signed up"
     digest:
       action: View all notifications
       body: Here is a brief summary of the messages you missed since your last visit on %{since}
@@ -1501,6 +1569,15 @@ en:
     recovery_instructions_html: If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. <strong>Keep the recovery codes safe</strong>. For example, you may print them and store them with other important documents.
     webauthn: Security keys
   user_mailer:
+    appeal_approved:
+      action: Go to your account
+      explanation: The appeal of the strike against your account on %{strike_date} that you submitted on %{appeal_date} has been approved. Your account is once again in good standing.
+      subject: Your appeal from %{date} has been approved
+      title: Appeal approved
+    appeal_rejected:
+      explanation: The appeal of the strike against your account on %{strike_date} that you submitted on %{appeal_date} has been rejected.
+      subject: Your appeal from %{date} has been rejected
+      title: Appeal rejected
     backup_ready:
       explanation: You requested a full backup of your Mastodon account. It's now ready for download!
       subject: Your archive is ready for download
@@ -1512,6 +1589,8 @@ en:
       subject: Please confirm attempted sign in
       title: Sign in attempt
     warning:
+      appeal: Submit an appeal
+      appeal_description: If you believe this is an error, you can submit an appeal to the staff of %{instance}.
       categories:
         spam: Spam
         violation: Content violates the following community guidelines
@@ -1523,7 +1602,6 @@ en:
         suspend: You can no longer use your account, and your profile and other data are no longer accessible. You can still login to request a backup of your data until the data is fully removed in about 30 days, but we will retain some basic data to prevent you from evading the suspension.
       get_in_touch: If you believe this is an error, you can reply to this e-mail to get in touch with the staff of %{instance}.
       reason: 'Reason:'
-      review_server_policies: Review server policies
       statuses: 'Posts that have been found in violation:'
       subject:
         delete_statuses: Your posts on %{acct} have been removed
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index e2315ae82..e44496f05 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -86,7 +86,6 @@ eo:
     account_moderation_notes:
       create: Lasi noton
       created_msg: Kontrola noto sukcese kreita!
-      delete: Forigi
       destroyed_msg: Kontrola noto sukcese detruita!
     accounts:
       add_email_domain_block: Bloki retadresan domajnon
@@ -369,9 +368,6 @@ eo:
         silence: silentigita
         suspend: haltigita
       show:
-        affected_accounts:
-          one: Unu konto en la datumbazo esta influita
-          other: "%{count} kontoj en la datumbazo estas influitaj"
         retroactive:
           silence: Malkaŝi ĉiujn kontojn, kiuj ekzistas en ĉi tiu domajno
           suspend: Malhaltigi ĉiujn kontojn, kiuj ekzistas en ĉi tiu domajno
@@ -407,9 +403,6 @@ eo:
         warning: Averto
       delivery_available: Liverado disponeblas
       empty: Neniuj domajnoj trovitaj.
-      known_accounts:
-        one: "%{count} konata konto"
-        other: "%{count} konataj kontoj"
       moderation:
         all: Ĉiuj
         limited: Limigita
@@ -684,7 +677,6 @@ eo:
       title: Agordi
     status:
       account_status: Statuso de la konto
-      functional: Via konto estas plene funkcianta.
     too_fast: Formularo sendita tro rapide, klopodu denove.
     trouble_logging_in: Ĝeni ensaluti?
     use_security_key: Uzi sekurecan ŝlosilon
@@ -1167,7 +1159,6 @@ eo:
       subject: Via arkivo estas preta por elŝutado
       title: Arkiva elŝuto
     warning:
-      review_server_policies: Superrigardi servilajn politikojn
       subject:
         disable: Via konto %{acct} estas frostigita
         none: Averto por %{acct}
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index e14a8d725..c901394bb 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -94,7 +94,6 @@ es-AR:
     account_moderation_notes:
       create: Dejar nota
       created_msg: "¡Nota de moderación creada exitosamente!"
-      delete: Eliminar
       destroyed_msg: "¡Nota de moderación destruída exitosamente!"
     accounts:
       add_email_domain_block: Bloquear el dominio del correo electrónico
@@ -163,6 +162,11 @@ es-AR:
       not_subscribed: No suscripto
       pending: Revisión pendiente
       perform_full_suspension: Suspender
+      previous_strikes: Incumplimientos previos
+      previous_strikes_description_html:
+        one: Esta cuenta tiene <strong>un</strong> incumplimiento.
+        other: Esta cuenta tiene <strong>%{count}</strong> incumplimientos.
+        zero: Esta cuenta está <strong>en buen estado</strong>.
       promote: Promover
       protocol: Protocolo
       public: Pública
@@ -206,6 +210,7 @@ es-AR:
       statuses: Mensajes
       strikes: Sanciones previas
       subscribe: Suscribirse
+      suspend: Suspender
       suspended: Suspendidas
       suspension_irreversible: Se eliminaron irreversiblemente los datos de esta cuenta. Podés dejar de suspenderla para hacerla utilizable, pero no se recuperarán los datos que tenía anteriormente.
       suspension_reversible_hint_html: La cuenta fue suspendida y los datos se eliminarán completamente el %{date}. Hasta entonces, la cuenta puede ser restaurada sin ningún efecto perjudicial. Si querés eliminar todos los datos de la cuenta inmediatamente, podés hacerlo abajo.
@@ -226,6 +231,7 @@ es-AR:
       whitelisted: Permitidas para federación
     action_logs:
       action_types:
+        approve_appeal: Aprobar apelación
         approve_user: Aprobar usuario
         assigned_to_self_report: Asignar denuncia
         change_email_user: Cambiar correo electrónico del usuario
@@ -257,6 +263,7 @@ es-AR:
         enable_user: Habilitar usuario
         memorialize_account: Convertir en cuenta conmemorativa
         promote_user: Promover usuario
+        reject_appeal: Rechazar apelación
         reject_user: Rechazar usuario
         remove_avatar_user: Quitar avatar
         reopen_report: Reabrir denuncia
@@ -275,6 +282,7 @@ es-AR:
         update_domain_block: Actualizar bloque de dominio
         update_status: Actualizar mensaje
       actions:
+        approve_appeal_html: "%{name} aprobó la solicitud de moderación de %{target}"
         approve_user_html: "%{name} aprobó el registro de %{target}"
         assigned_to_self_report_html: "%{name} se asignó la denuncia %{target} a sí"
         change_email_user_html: "%{name} cambió la dirección de correo electrónico del usuario %{target}"
@@ -306,6 +314,7 @@ es-AR:
         enable_user_html: "%{name} habilitó el inicio de sesión para el usuario %{target}"
         memorialize_account_html: "%{name} convirtió la cuenta de %{target} en una cuenta conmemorativa"
         promote_user_html: "%{name} promovió al usuario %{target}"
+        reject_appeal_html: "%{name} rechazó la solicitud de moderación de %{target}"
         reject_user_html: "%{name} rechazó el registro de %{target}"
         remove_avatar_user_html: "%{name} quitó el avatar de %{target}"
         reopen_report_html: "%{name} reabrió la denuncia %{target}"
@@ -384,14 +393,17 @@ es-AR:
       media_storage: Almacenamiento de medios
       new_users: nuevos usuarios
       opened_reports: denuncias abiertas
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> apelación pendiente"
+        other: "<strong>%{count}</strong> apelaciones pendientes"
       pending_reports_html:
-        one: "<strong>1</strong> denuncia pendiente"
+        one: "<strong>%{count}</strong> denuncia pendiente"
         other: "<strong>%{count}</strong> denuncias pendientes"
       pending_tags_html:
-        one: "<strong>1</strong> etiqueta pendiente"
+        one: "<strong>%{count}</strong> etiqueta pendiente"
         other: "<strong>%{count}</strong> etiquetas pendientes"
       pending_users_html:
-        one: "<strong>1</strong> usuario pendiente"
+        one: "<strong>%{count}</strong> usuario pendiente"
         other: "<strong>%{count}</strong> usuarios pendientes"
       resolved_reports: denuncias resueltas
       software: Software
@@ -401,6 +413,10 @@ es-AR:
       top_languages: Idiomas más activos
       top_servers: Servidores más activos
       website: Sitio web
+    disputes:
+      appeals:
+        empty: No se encontraron apelaciones.
+        title: Apelaciones
     domain_allows:
       add_new: Permitir federación con el dominio
       created_msg: El dominio fue exitosamente permitido para la federación
@@ -439,8 +455,9 @@ es-AR:
         suspend: suspendidos
       show:
         affected_accounts:
-          one: Una cuenta afectada en la base de datos
-          other: "%{count} cuentas afectadas en la base de datos"
+          one: Una cuenta en la base de datos afectada
+          other: "%{count} cuentas en la base de datos afectada"
+          zero: Ninguna cuenta en la base de datos está afectada
         retroactive:
           silence: Quitar límite de las cuentas existentes afectadas de este dominio
           suspend: Quitar suspensión de las cuentas existentes afectadas de este dominio
@@ -494,6 +511,7 @@ es-AR:
       known_accounts:
         one: "%{count} cuenta conocida"
         other: "%{count} cuentas conocidas"
+        zero: Ninguna cuenta conocida
       moderation:
         all: Todas
         limited: Limitadas
@@ -560,10 +578,12 @@ es-AR:
       action_log: Registro de auditoría
       action_taken_by: Acción tomada por
       actions:
+        delete_description_html: Los mensajes denunciados serán eliminados y se registrará un incumplimiento para ayudarte a escalar en futuras infracciones por la misma cuenta.
         other_description_html: Ver más opciones para controlar el comportamiento de la cuenta y personalizar la comunicación de la cuenta denunciada.
+        resolve_description_html: No se tomarán medidas contra la cuenta denunciada, no se registrará el incumplimiento, y se cerrará la denuncia.
         silence_description_html: El perfil será visible sólo para aquellos que ya sigan esta cuenta o que la busquen manualmente, limitando seriamente su alcance. Siempre puede ser revertido.
         suspend_description_html: El perfil y todos sus contenidos serán inaccesibles hasta que sean finalmente eliminados. No será posible interactuar con la cuenta. Reversible dentro de los 30 días.
-      actions_description_html: 'Si quitar el contenido ofensivo de arriba no es suficiente:'
+      actions_description_html: Decidí qué medidas tomar para resolver esta denuncia. Si tomás una acción punitiva contra la cuenta denunciada, se le enviará a dicha cuenta una notificación por correo electrónico, excepto cuando se seleccione la categoría <strong>Spam</strong>.
       add_to_report: Agregar más a la denuncia
       are_you_sure: "¿Estás seguro?"
       assign_to_self: Asignármela a mí
@@ -575,7 +595,7 @@ es-AR:
         none: Ninguno
       comment_description_html: 'Para proporcionar más información, %{name} escribió:'
       created_at: Denunciado
-      delete_and_resolve: Resolver y eliminar
+      delete_and_resolve: Eliminar mensajes
       forwarded: Reenviado
       forwarded_to: Reenviado a %{domain}
       mark_as_resolved: Marcar como resuelta
@@ -589,12 +609,14 @@ es-AR:
         placeholder: Describí qué acciones se tomaron, o cualquier otra actualización relacionada...
         title: Notas
       notes_description_html: Ver y dejar notas para otros moderadores y como referencia futura
+      quick_actions_description_html: 'Tomá una acción rápida o desplazate hacia abajo para ver el contenido denunciado:'
       reopen: Reabrir denuncia
       report: 'Denuncia #%{id}'
       reported_account: Cuenta denunciada
       reported_by: Denunciada por
       resolved: Resueltas
       resolved_msg: "¡Denuncia exitosamente resuelta!"
+      skip_to_actions: Ir directamente a las acciones
       status: Estado
       statuses: Contenido denunciado
       statuses_description_html: El contenido ofensivo se citará en la comunicación con la cuenta denunciada
@@ -715,6 +737,16 @@ es-AR:
       no_status_selected: No se cambió ningún mensaje, ya que ninguno fue seleccionado
       title: Mensajes de la cuenta
       with_media: Con medios
+    strikes:
+      actions:
+        delete_statuses: "%{name} eliminó los mensajes de %{target}"
+        disable: "%{name} congeló la cuenta de %{target}"
+        none: "%{name} envió una advertencia a %{target}"
+        sensitive: "%{name} marcó los medios de %{target} como sensibles"
+        silence: "%{name} limitó la cuenta de %{target}"
+        suspend: "%{name} suspendió la cuenta de %{target}"
+      appeal_approved: Apelado
+      appeal_pending: Apelación pendiente
     system_checks:
       database_schema_check:
         message_html: Hay migraciones pendientes de la base de datos. Por favor, ejecutalas para asegurarte de que la aplicación funciona según lo esperado
@@ -737,8 +769,9 @@ es-AR:
         disallow: Rechazar enlace
         disallow_provider: Rechazar medio
         shared_by_over_week:
-          one: Compartido por una persona durante la última semana
-          other: Compartido por %{count} personas durante la última semana
+          one: Compartido por una persona en la última semana
+          other: Compartido por %{count} personas en la última semana
+          zero: Compartido por nadie en la última semana
         title: Enlaces en tendencia
         usage_comparison: Compartido %{today} veces hoy, comparado con la/s %{yesterday} vez/veces de ayer
       pending_review: Revisión pendiente
@@ -766,8 +799,9 @@ es-AR:
         usable: Pueden usarse
         usage_comparison: Usadas %{today} veces hoy, comparado con la/s %{yesterday} vez/veces de ayer
         used_by_over_week:
-          one: Usada por una persona durante la última semana
-          other: Usada por %{count} personas durante la última semana
+          one: Usada por una persona en la última semana
+          other: Usada por %{count} personas en la última semana
+          zero: Usada por nadie en la última semana
       title: Tendencias
     warning_presets:
       add_new: Agregar nuevo
@@ -776,6 +810,17 @@ es-AR:
       empty: Aún no ha definido ningún preajuste de advertencia.
       title: Administrar preajustes de advertencia
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: para eliminar sus mensajes
+        disable: para congelar su cuenta
+        none: una advertencia
+        sensitive: para marcar su cuenta como sensible
+        silence: para limitar su cuenta
+        suspend: para suspender su cuenta
+      body: "%{target} está apelando a una solicitud de moderación de %{action_taken_by} de %{date}, del tipo %{type}. Ellos escribieron:"
+      next_steps: Podés aprobar la apelación para deshacer la solicitud de moderación, o ignorarla.
+      subject: "%{username} está apelando a una solicitud de moderación en %{instance}"
     new_pending_account:
       body: Abajo están los detalles de la nueva cuenta. Podés aprobar o rechazar esta solicitud.
       subject: Nueva cuenta para revisión en %{instance} (%{username})
@@ -866,7 +911,6 @@ es-AR:
     status:
       account_status: Estado de la cuenta
       confirming: Esperando confirmación de correo electrónico.
-      functional: Tu cuenta está totalmente operativa.
       pending: Tu solicitud está pendiente de revisión por nuestra administración. Eso puede tardar algún tiempo. Si se aprueba tu solicitud, vas a recibir un correo electrónico.
       redirecting_to: Tu cuenta se encuentra inactiva porque está siendo redirigida a %{acct}.
     too_fast: Formulario enviado demasiado rápido, probá de nuevo.
@@ -932,6 +976,32 @@ es-AR:
     directory: Directorio de perfiles
     explanation: Descubrí usuarios basados en sus intereses
     explore_mastodon: Navegá %{title}
+  disputes:
+    strikes:
+      action_taken: Acción tomada
+      appeal: Apelar
+      appeal_approved: Este incumplimiento fue apelado exitosamente y ya no es válido
+      appeal_rejected: Se rechazó la apelación
+      appeal_submitted_at: Apelación enviada
+      appealed_msg: Tu apelación fue enviada. Si se aprueba, se te notificará.
+      appeals:
+        submit: Enviar apelación
+      associated_report: Denuncia asociada
+      created_at: Con fecha
+      recipient: Dirigida a
+      status: 'Mensaje #%{id}'
+      status_removed: Mensaje ya eliminado del sistema
+      title: "%{action} de %{date}"
+      title_actions:
+        delete_statuses: Eliminación de mensaje
+        disable: Congelación de cuenta
+        none: Advertencia
+        sensitive: Marcado de cuenta como sensible
+        silence: Limitación de cuenta
+        suspend: Suspensión de cuenta
+      your_appeal_approved: Se aprobó tu apelación
+      your_appeal_pending: Enviaste una apelación
+      your_appeal_rejected: Se rechazó tu apelación
   domain_validator:
     invalid_domain: no es un nombre de dominio válido
   errors:
@@ -1143,6 +1213,8 @@ es-AR:
       title: Nueva adhesión
     status:
       subject: "%{name} acaba de enviar un mensaje"
+    update:
+      subject: "%{name} editó un mensaje"
   notifications:
     email_events: Eventos para notificaciones por correo electrónico
     email_events_hint: 'Seleccioná los eventos para los que querés recibir notificaciones:'
@@ -1493,6 +1565,15 @@ es-AR:
     recovery_instructions_html: Si alguna vez perdés el acceso a tu aplicación de 2FA, podés usar uno de los siguientes códigos de recuperación para recuperar el acceso a tu cuenta. <strong>Mantenelos a salvo</strong>. Por ejemplo, podés imprimirlos y guardarlos con otros documentos importantes.
     webauthn: Llaves de seguridad
   user_mailer:
+    appeal_approved:
+      action: Ir a tu cuenta
+      explanation: La apelación del incumplimiento contra tu cuenta del %{strike_date} que enviaste el %{appeal_date} fue aprobada. Tu cuenta se encuentra de nuevo en buen estado.
+      subject: Tu apelación del %{date} fue aprobada
+      title: Apelación aprobada
+    appeal_rejected:
+      explanation: La apelación del incumplimiento contra tu cuenta del %{strike_date} que enviaste el %{appeal_date} fue rechazada.
+      subject: Tu apelación del %{date} fue rechazada
+      title: Apelación rechazada
     backup_ready:
       explanation: Solicitaste un resguardo completo de tu cuenta de Mastodon. ¡Ya está listo para descargar!
       subject: Tu archivo historial está listo para descargar
@@ -1504,6 +1585,8 @@ es-AR:
       subject: Por favor, confirmá el intento de inicio de sesión
       title: Intento de inicio de sesión
     warning:
+      appeal: Enviar una apelación
+      appeal_description: Si creés que esto es un error, podés enviar una apelación al equipo de %{instance}.
       categories:
         spam: Spam
         violation: El contenido viola las siguientes directrices de la comunidad
@@ -1515,7 +1598,6 @@ es-AR:
         suspend: Ya no podés usar tu cuenta, y tu perfil y el resto de datos ya no son accesibles. Todavía podés iniciar sesión para solicitar una copia de seguridad de tus datos, hasta que estos sean eliminados por completo en unos 30 días, aunque conservaremos algunos datos básicos para impedir que esquivés la suspensión.
       get_in_touch: Si crees que esto es un error, podés responder a este correo electrónico para ponerte en contacto con el equipo de %{instance}.
       reason: 'Motivo:'
-      review_server_policies: Revisar las políticas del servidor
       statuses: 'Mensajes que se encontraron en violación:'
       subject:
         delete_statuses: Se eliminaron tus mensajes en %{acct}
diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml
index 834b3a7d4..06716034b 100644
--- a/config/locales/es-MX.yml
+++ b/config/locales/es-MX.yml
@@ -94,7 +94,6 @@ es-MX:
     account_moderation_notes:
       create: Crear
       created_msg: "¡Nota de moderación creada con éxito!"
-      delete: Borrar
       destroyed_msg: "¡Nota de moderación destruida con éxito!"
     accounts:
       add_email_domain_block: Poner en lista negra el dominio del correo
@@ -163,6 +162,11 @@ es-MX:
       not_subscribed: No se está suscrito
       pending: Revisión pendiente
       perform_full_suspension: Suspender
+      previous_strikes: Amonestaciones anteriores
+      previous_strikes_description_html:
+        one: Esta cuenta tiene <strong>una</strong> amonestación.
+        other: Esta cuenta tiene <strong>%{count}</strong> amonestaciones.
+        zero: Esta cuenta está <strong>en buen estado</strong>.
       promote: Promocionar
       protocol: Protocolo
       public: Público
@@ -206,6 +210,7 @@ es-MX:
       statuses: Estados
       strikes: Amonestaciones previas
       subscribe: Suscribir
+      suspend: Suspender
       suspended: Suspendido
       suspension_irreversible: Los datos de esta cuenta han sido irreversiblemente eliminados. Puedes deshacer la suspensión de la cuenta para hacerla utilizable, pero no recuperará los datos que tenías anteriormente.
       suspension_reversible_hint_html: La cuenta ha sido suspendida y los datos se eliminarán completamente el %{date}. Hasta entonces, la cuenta puede ser restaurada sin ningún efecto perjudicial. Si desea eliminar todos los datos de la cuenta inmediatamente, puede hacerlo a continuación.
@@ -226,6 +231,7 @@ es-MX:
       whitelisted: Añadido a la lista blanca
     action_logs:
       action_types:
+        approve_appeal: Aprobar Apelación
         approve_user: Aprobar Usuario
         assigned_to_self_report: Asignar Reporte
         change_email_user: Cambiar Correo Electrónico del Usuario
@@ -257,6 +263,7 @@ es-MX:
         enable_user: Habilitar Usuario
         memorialize_account: Transformar en Cuenta Conmemorativa
         promote_user: Promover Usuario
+        reject_appeal: Rechazar Apelación
         reject_user: Rechazar Usuario
         remove_avatar_user: Eliminar Avatar
         reopen_report: Reabrir Reporte
@@ -275,6 +282,7 @@ es-MX:
         update_domain_block: Actualizar el Bloqueo de Dominio
         update_status: Actualizar Estado
       actions:
+        approve_appeal_html: "%{name} aprobó la solicitud de moderación de %{target}"
         approve_user_html: "%{name} aprobó el registro de %{target}"
         assigned_to_self_report_html: "%{name} asignó el informe %{target} a sí mismo"
         change_email_user_html: "%{name} cambió la dirección de correo electrónico del usuario %{target}"
@@ -306,6 +314,7 @@ es-MX:
         enable_user_html: "%{name} habilitó el inicio de sesión para el usuario %{target}"
         memorialize_account_html: "%{name} convirtió la cuenta de %{target} en una página in memoriam"
         promote_user_html: "%{name} promoción al usuario %{target}"
+        reject_appeal_html: "%{name} rechazó la solicitud de moderación de %{target}"
         reject_user_html: "%{name} rechazó el registro de %{target}"
         remove_avatar_user_html: "%{name} eliminó el avatar de %{target}"
         reopen_report_html: "%{name} reabrió el informe %{target}"
@@ -384,15 +393,6 @@ es-MX:
       media_storage: Almacenamiento multimedia
       new_users: nuevos usuarios
       opened_reports: informes abiertos
-      pending_reports_html:
-        one: "<strong>1</strong> informe pendiente"
-        other: "<strong>%{count}</strong> informes pendientes"
-      pending_tags_html:
-        one: "<strong>1</strong> etiqueta pendiente"
-        other: "<strong>%{count}</strong> etiquetas pendientes"
-      pending_users_html:
-        one: "<strong>1</strong> usuario pendiente"
-        other: "<strong>%{count}</strong> usuarios pendientes"
       resolved_reports: informes resueltos
       software: Software
       sources: Fuentes de registro
@@ -401,6 +401,10 @@ es-MX:
       top_languages: Idiomas más activos
       top_servers: Servidores más activos
       website: Sitio web
+    disputes:
+      appeals:
+        empty: No se encontraron apelaciones.
+        title: Apelaciones
     domain_allows:
       add_new: Añadir dominio a la lista blanca
       created_msg: Dominio añadido a la lista blanca con éxito
@@ -438,9 +442,6 @@ es-MX:
         silence: silenciado
         suspend: suspendido
       show:
-        affected_accounts:
-          one: Una cuenta en la base de datos afectada
-          other: "%{count} cuentas en la base de datos afectadas"
         retroactive:
           silence: Des-silenciar todas las cuentas existentes de este dominio
           suspend: Des-suspender todas las cuentas existentes de este dominio
@@ -491,9 +492,6 @@ es-MX:
       delivery_error_hint: Si la entrega no es posible a lo largo de %{count} días, se marcará automáticamente como no entregable.
       destroyed_msg: Los datos de %{domain} están ahora en cola para su inminente eliminación.
       empty: No se encontraron dominios.
-      known_accounts:
-        one: "%{count} cuenta conocida"
-        other: "%{count} cuentas conocidas"
       moderation:
         all: Todos
         limited: Limitado
@@ -560,10 +558,12 @@ es-MX:
       action_log: Registro de auditoría
       action_taken_by: Acción tomada por
       actions:
+        delete_description_html: Los mensajes denunciados serán eliminados y se registrará una amonestación para ayudarte a escalar en futuras infracciones por la misma cuenta.
         other_description_html: Ver más opciones para controlar el comportamiento de la cuenta y personalizar la comunicación de la cuenta reportada.
+        resolve_description_html: No se tomarán medidas contra la cuenta denunciada, no se registrará la amonestación, y se cerrará el informe.
         silence_description_html: El perfil será visible solo para aquellos que ya lo sigan o lo busquen manualmente, limitando seriamente su alcance. Siempre puede ser revertido.
         suspend_description_html: El perfil y todos sus contenidos serán inaccesibles hasta que sean finalmente eliminados. La interacción con la cuenta será imposible. Reversible durante un plazo de 30 días.
-      actions_description_html: 'Si eliminar el contenido ofensivo de arriba no es suficiente:'
+      actions_description_html: Decide qué medidas tomar para resolver esta denuncia. Si tomas una acción punitiva contra la cuenta denunciada, se le enviará a dicha cuenta una notificación por correo electrónico, excepto cuando se seleccione la categoría <strong>Spam</strong>.
       add_to_report: Añadir más al reporte
       are_you_sure: "¿Estás seguro?"
       assign_to_self: Asignármela a mí
@@ -575,7 +575,7 @@ es-MX:
         none: Ninguno
       comment_description_html: 'Para proporcionar más información, %{name} escribió:'
       created_at: Denunciado
-      delete_and_resolve: Eliminar y resolver
+      delete_and_resolve: Eliminar publicaciones
       forwarded: Reenviado
       forwarded_to: Reenviado a %{domain}
       mark_as_resolved: Marcar como resuelto
@@ -589,12 +589,14 @@ es-MX:
         placeholder: Especificar qué acciones se han tomado o cualquier otra novedad respecto a esta denuncia…
         title: Notas
       notes_description_html: Ver y dejar notas a otros moderadores y a tu yo futuro
+      quick_actions_description_html: 'Toma una acción rápida o desplázate hacia abajo para ver el contenido denunciado:'
       reopen: Reabrir denuncia
       report: 'Reportar #%{id}'
       reported_account: Cuenta reportada
       reported_by: Reportado por
       resolved: Resuelto
       resolved_msg: "¡La denuncia se ha resuelto correctamente!"
+      skip_to_actions: Ir directamente a las acciones
       status: Estado
       statuses: Contenido reportado
       statuses_description_html: El contenido ofensivo se citará en la comunicación con la cuenta reportada
@@ -715,6 +717,16 @@ es-MX:
       no_status_selected: No se cambió ningún estado al no seleccionar ninguno
       title: Estado de las cuentas
       with_media: Con multimedia
+    strikes:
+      actions:
+        delete_statuses: "%{name} eliminó las publicaciones de %{target}"
+        disable: "%{name} congeló la cuenta de %{target}"
+        none: "%{name} envió una advertencia a %{target}"
+        sensitive: "%{name} marcó la cuenta de %{target} como sensible"
+        silence: "%{name} limitó la cuenta de %{target}"
+        suspend: "%{name} suspendió la cuenta de %{target}"
+      appeal_approved: Apelado
+      appeal_pending: Apelación pendiente
     system_checks:
       database_schema_check:
         message_html: Hay migraciones pendientes de la base de datos. Por favor, ejecútalas para asegurarte de que la aplicación funciona como debería
@@ -736,9 +748,6 @@ es-MX:
         allow_provider: Permitir medio
         disallow: Rechazar enlace
         disallow_provider: Rechazar medio
-        shared_by_over_week:
-          one: Compartido por una persona durante la última semana
-          other: Compartido por %{count} personas durante la última semana
         title: Enlaces en tendencia
         usage_comparison: Compartido %{today} veces hoy, comparado con %{yesterday} ayer
       pending_review: Revisión pendiente
@@ -765,9 +774,6 @@ es-MX:
         trending_rank: Tendencia n.º %{rank}
         usable: Pueden usarse
         usage_comparison: Usada %{today} veces hoy, comparado con %{yesterday} ayer
-        used_by_over_week:
-          one: Usada por una persona durante la última semana
-          other: Usada por %{count} personas durante la última semana
       title: Tendencias
     warning_presets:
       add_new: Añadir nuevo
@@ -776,6 +782,17 @@ es-MX:
       empty: Aún no has definido ningún preajuste de advertencia.
       title: Editar configuración predeterminada de avisos
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: para eliminar sus mensajes
+        disable: para congelar su cuenta
+        none: una advertencia
+        sensitive: para marcar su cuenta como sensible
+        silence: para limitar su cuenta
+        suspend: suspender su cuenta
+      body: "%{target} está apelando a una solicitud de moderación de %{action_taken_by} el %{date}, del tipo %{type}. Ellos escribieron:"
+      next_steps: Puedes aprobar la apelación para deshacer la decisión de moderación, o ignorarla.
+      subject: "%{username} está apelando a una decisión de moderación en %{instance}"
     new_pending_account:
       body: Los detalles de la nueva cuenta están abajos. Puedes aprobar o rechazar esta aplicación.
       subject: Nueva cuenta para revisión en %{instance} (%{username})
@@ -866,7 +883,6 @@ es-MX:
     status:
       account_status: Estado de la cuenta
       confirming: Esperando confirmación de correo electrónico.
-      functional: Su cuenta está totalmente operativa.
       pending: Su solicitud está pendiente de revisión por nuestros administradores. Eso puede tardar algún tiempo. Usted recibirá un correo electrónico si el solicitud sea aprobada.
       redirecting_to: Tu cuenta se encuentra inactiva porque está siendo redirigida a %{acct}.
     too_fast: Formulario enviado demasiado rápido, inténtelo de nuevo.
@@ -932,6 +948,32 @@ es-MX:
     directory: Directorio de perfiles
     explanation: Descubre usuarios según sus intereses
     explore_mastodon: Explorar %{title}
+  disputes:
+    strikes:
+      action_taken: Acción realizada
+      appeal: Apelar
+      appeal_approved: Esta amonestación fue apelada exitosamente y ya no es válida
+      appeal_rejected: Se rechazó la apelación
+      appeal_submitted_at: Apelación enviada
+      appealed_msg: Tu apelación fue enviada. Si se aprueba, se te notificará.
+      appeals:
+        submit: Enviar apelación
+      associated_report: Informe asociado
+      created_at: Con fecha
+      recipient: Dirigida a
+      status: 'Publicación #%{id}'
+      status_removed: Publicación ya eliminada del sistema
+      title: "%{action} del %{date}"
+      title_actions:
+        delete_statuses: Eliminación de publicación
+        disable: Congelación de la cuenta
+        none: Advertencia
+        sensitive: Marcado de cuenta como sensible
+        silence: Limitación de cuenta
+        suspend: Suspensión de cuenta
+      your_appeal_approved: Se aprobó tu apelación
+      your_appeal_pending: Has enviado una apelación
+      your_appeal_rejected: Tu apelación ha sido rechazada
   domain_validator:
     invalid_domain: no es un nombre de dominio válido
   errors:
@@ -1143,6 +1185,8 @@ es-MX:
       title: Nueva difusión
     status:
       subject: "%{name} acaba de publicar"
+    update:
+      subject: "%{name} editó una publicación"
   notifications:
     email_events: Eventos para notificaciones por correo electrónico
     email_events_hint: 'Selecciona los eventos para los que deseas recibir notificaciones:'
@@ -1224,6 +1268,9 @@ es-MX:
     reply:
       proceed: Proceder a responder
       prompt: 'Quieres responder a este toot:'
+  reports:
+    errors:
+      invalid_rules: no hace referencia a reglas válidas
   scheduled_statuses:
     over_daily_limit: Ha superado el límite de %{limit} toots programados para ese día
     over_total_limit: Ha superado el límite de %{limit} toots programados
@@ -1490,6 +1537,15 @@ es-MX:
     recovery_instructions_html: Si pierdes acceso a tu teléfono, puedes usar uno de los siguientes códigos de recuperación para obtener acceso a tu cuenta. <strong>Mantenlos a salvo</strong>. Por ejemplo, puedes imprimirlos y guardarlos con otros documentos importantes.
     webauthn: Claves de seguridad
   user_mailer:
+    appeal_approved:
+      action: Ir a tu cuenta
+      explanation: La apelación de la amonestación contra tu cuenta del %{strike_date} que enviaste el %{appeal_date} fue aprobada. Tu cuenta se encuentra de nuevo en buen estado.
+      subject: Tu apelación del %{date} ha sido aprobada
+      title: Apelación aprobada
+    appeal_rejected:
+      explanation: La apelación de la amonestación contra tu cuenta del %{strike_date} que enviaste el %{appeal_date} fue rechazada.
+      subject: Tu apelación del %{date} ha sido rechazada
+      title: Apelación rechazada
     backup_ready:
       explanation: Has solicitado una copia completa de tu cuenta de Mastodon. ¡Ya está preparada para descargar!
       subject: Tu archivo está preparado para descargar
@@ -1501,6 +1557,8 @@ es-MX:
       subject: Por favor, confirma el intento de inicio de sesión
       title: Intento de inicio de sesión
     warning:
+      appeal: Enviar una apelación
+      appeal_description: Si crees que esto es un error, puedes enviar una apelación al equipo de %{instance}.
       categories:
         spam: Spam
         violation: El contenido viola las siguientes directrices de la comunidad
@@ -1512,7 +1570,6 @@ es-MX:
         suspend: Ya no puedes utilizar tu cuenta, y tu perfil y el resto de datos ya no son accesibles. Todavía puedes iniciar sesión para solicitar una copia de seguridad de tus datos, hasta que estos sean eliminados por completo en unos 30 días, aunque conservaremos algunos datos básicos para impedir que esquives la suspensión.
       get_in_touch: Si crees que esto es un error, puedes responder a este correo electrónico para ponerte en contacto con el personal de %{instance}.
       reason: 'Razón:'
-      review_server_policies: Revisar las políticas del servidor
       statuses: 'Publicaciones que han sido halladas contrarias las directrices:'
       subject:
         delete_statuses: Tus publicaciones en %{acct} han sido eliminadas
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 02dee7b4f..cc2cad8e5 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -94,7 +94,6 @@ es:
     account_moderation_notes:
       create: Crear
       created_msg: "¡Nota de moderación creada con éxito!"
-      delete: Borrar
       destroyed_msg: "¡Nota de moderación destruida con éxito!"
     accounts:
       add_email_domain_block: Poner en lista negra el dominio del correo
@@ -163,6 +162,11 @@ es:
       not_subscribed: No se está suscrito
       pending: Revisión pendiente
       perform_full_suspension: Suspender
+      previous_strikes: Amonestaciones anteriores
+      previous_strikes_description_html:
+        one: Esta cuenta tiene <strong>una</strong> amonestación.
+        other: Esta cuenta tiene <strong>%{count}</strong> amonestaciones.
+        zero: Esta cuenta está <strong>en buen estado</strong>.
       promote: Promocionar
       protocol: Protocolo
       public: Público
@@ -206,6 +210,7 @@ es:
       statuses: Estados
       strikes: Amonestaciones previas
       subscribe: Suscribir
+      suspend: Suspender
       suspended: Suspendido
       suspension_irreversible: Los datos de esta cuenta han sido irreversiblemente eliminados. Puedes deshacer la suspensión de la cuenta para hacerla utilizable, pero no recuperará los datos que tenías anteriormente.
       suspension_reversible_hint_html: La cuenta ha sido suspendida y los datos se eliminarán completamente el %{date}. Hasta entonces, la cuenta puede ser restaurada sin ningún efecto perjudicial. Si desea eliminar todos los datos de la cuenta inmediatamente, puede hacerlo a continuación.
@@ -226,6 +231,7 @@ es:
       whitelisted: Añadido a la lista blanca
     action_logs:
       action_types:
+        approve_appeal: Aprobar Apelación
         approve_user: Aprobar Usuario
         assigned_to_self_report: Asignar Reporte
         change_email_user: Cambiar Correo Electrónico del Usuario
@@ -257,6 +263,7 @@ es:
         enable_user: Habilitar Usuario
         memorialize_account: Transformar en Cuenta Conmemorativa
         promote_user: Promover Usuario
+        reject_appeal: Rechazar Apelación
         reject_user: Rechazar Usuario
         remove_avatar_user: Eliminar Avatar
         reopen_report: Reabrir Reporte
@@ -275,6 +282,7 @@ es:
         update_domain_block: Actualizar el Bloqueo de Dominio
         update_status: Actualizar Estado
       actions:
+        approve_appeal_html: "%{name} aprobó la solicitud de moderación de %{target}"
         approve_user_html: "%{name} aprobó el registro de %{target}"
         assigned_to_self_report_html: "%{name} asignó el informe %{target} a sí mismo"
         change_email_user_html: "%{name} cambió la dirección de correo electrónico del usuario %{target}"
@@ -306,6 +314,7 @@ es:
         enable_user_html: "%{name} habilitó el inicio de sesión para el usuario %{target}"
         memorialize_account_html: "%{name} convirtió la cuenta de %{target} en una página in memoriam"
         promote_user_html: "%{name} promoción al usuario %{target}"
+        reject_appeal_html: "%{name} rechazó la solicitud de moderación de %{target}"
         reject_user_html: "%{name} rechazó el registro de %{target}"
         remove_avatar_user_html: "%{name} eliminó el avatar de %{target}"
         reopen_report_html: "%{name} reabrió el informe %{target}"
@@ -384,14 +393,17 @@ es:
       media_storage: Almacenamiento multimedia
       new_users: nuevos usuarios
       opened_reports: informes abiertos
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> apelación pendiente"
+        other: "<strong>%{count}</strong> apelaciones pendientes"
       pending_reports_html:
-        one: "<strong>1</strong> informe pendiente"
+        one: "<strong>%{count}</strong> informe pendiente"
         other: "<strong>%{count}</strong> informes pendientes"
       pending_tags_html:
-        one: "<strong>1</strong> etiqueta pendiente"
+        one: "<strong>%{count}</strong> etiqueta pendiente"
         other: "<strong>%{count}</strong> etiquetas pendientes"
       pending_users_html:
-        one: "<strong>1</strong> usuario pendiente"
+        one: "<strong>%{count}</strong> usuario pendiente"
         other: "<strong>%{count}</strong> usuarios pendientes"
       resolved_reports: informes resueltos
       software: Software
@@ -401,6 +413,10 @@ es:
       top_languages: Idiomas más activos
       top_servers: Servidores más activos
       website: Sitio web
+    disputes:
+      appeals:
+        empty: No se encontraron apelaciones.
+        title: Apelaciones
     domain_allows:
       add_new: Añadir dominio a la lista blanca
       created_msg: Dominio añadido a la lista blanca con éxito
@@ -440,7 +456,8 @@ es:
       show:
         affected_accounts:
           one: Una cuenta en la base de datos afectada
-          other: "%{count} cuentas en la base de datos afectadas"
+          other: "%{count} cuentas en la base de datos afectada"
+          zero: Ninguna cuenta en la base de datos está afectada
         retroactive:
           silence: Des-silenciar todas las cuentas existentes de este dominio
           suspend: Des-suspender todas las cuentas existentes de este dominio
@@ -494,6 +511,7 @@ es:
       known_accounts:
         one: "%{count} cuenta conocida"
         other: "%{count} cuentas conocidas"
+        zero: Ninguna cuenta conocida
       moderation:
         all: Todos
         limited: Limitado
@@ -560,10 +578,12 @@ es:
       action_log: Registro de auditoría
       action_taken_by: Acción tomada por
       actions:
+        delete_description_html: Los mensajes denunciados serán eliminados y se registrará una amonestación para ayudarte a escalar en futuras infracciones por la misma cuenta.
         other_description_html: Ver más opciones para controlar el comportamiento de la cuenta y personalizar la comunicación de la cuenta reportada.
+        resolve_description_html: No se tomarán medidas contra la cuenta denunciada, no se registrará la amonestación, y se cerrará el informe.
         silence_description_html: El perfil será visible solo para aquellos que ya lo sigan o lo busquen manualmente, limitando seriamente su alcance. Siempre puede ser revertido.
         suspend_description_html: El perfil y todos sus contenidos serán inaccesibles hasta que sean finalmente eliminados. La interacción con la cuenta será imposible. Reversible durante un plazo de 30 días.
-      actions_description_html: 'Si eliminar el contenido ofensivo de arriba no es suficiente:'
+      actions_description_html: Decide qué medidas tomar para resolver esta denuncia. Si tomas una acción punitiva contra la cuenta denunciada, se le enviará a dicha cuenta una notificación por correo electrónico, excepto cuando se seleccione la categoría <strong>Spam</strong>.
       add_to_report: Añadir más al reporte
       are_you_sure: "¿Estás seguro?"
       assign_to_self: Asignármela a mí
@@ -575,7 +595,7 @@ es:
         none: Ninguno
       comment_description_html: 'Para proporcionar más información, %{name} escribió:'
       created_at: Denunciado
-      delete_and_resolve: Eliminar y resolver
+      delete_and_resolve: Eliminar publicaciones
       forwarded: Reenviado
       forwarded_to: Reenviado a %{domain}
       mark_as_resolved: Marcar como resuelto
@@ -589,12 +609,14 @@ es:
         placeholder: Especificar qué acciones se han tomado o cualquier otra novedad respecto a esta denuncia…
         title: Notas
       notes_description_html: Ver y dejar notas a otros moderadores y a tu yo futuro
+      quick_actions_description_html: 'Toma una acción rápida o desplázate hacia abajo para ver el contenido denunciado:'
       reopen: Reabrir denuncia
       report: 'Reportar #%{id}'
       reported_account: Cuenta reportada
       reported_by: Reportado por
       resolved: Resuelto
       resolved_msg: "¡La denuncia se ha resuelto correctamente!"
+      skip_to_actions: Ir directamente a las acciones
       status: Estado
       statuses: Contenido reportado
       statuses_description_html: El contenido ofensivo se citará en la comunicación con la cuenta reportada
@@ -715,6 +737,16 @@ es:
       no_status_selected: No se cambió ningún estado al no seleccionar ninguno
       title: Estado de las cuentas
       with_media: Con multimedia
+    strikes:
+      actions:
+        delete_statuses: "%{name} eliminó las publicaciones de %{target}"
+        disable: "%{name} congeló la cuenta de %{target}"
+        none: "%{name} envió una advertencia a %{target}"
+        sensitive: "%{name} marcó la cuenta de %{target} como sensible"
+        silence: "%{name} limitó la cuenta de %{target}"
+        suspend: "%{name} suspendió la cuenta de %{target}"
+      appeal_approved: Apelado
+      appeal_pending: Apelación pendiente
     system_checks:
       database_schema_check:
         message_html: Hay migraciones pendientes de la base de datos. Por favor, ejecútalas para asegurarte de que la aplicación funciona como debería
@@ -737,8 +769,9 @@ es:
         disallow: Rechazar enlace
         disallow_provider: Rechazar medio
         shared_by_over_week:
-          one: Compartido por una persona durante la última semana
+          one: Compartido por una persona en la última semana
           other: Compartido por %{count} personas durante la última semana
+          zero: Compartido por nadie en la última semana
         title: Enlaces en tendencia
         usage_comparison: Compartido %{today} veces hoy, comparado con %{yesterday} ayer
       pending_review: Revisión pendiente
@@ -768,6 +801,7 @@ es:
         used_by_over_week:
           one: Usada por una persona durante la última semana
           other: Usada por %{count} personas durante la última semana
+          zero: Usada por nadie en la última semana
       title: Tendencias
     warning_presets:
       add_new: Añadir nuevo
@@ -776,6 +810,17 @@ es:
       empty: Aún no has definido ningún preajuste de advertencia.
       title: Editar configuración predeterminada de avisos
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: para eliminar sus mensajes
+        disable: para congelar su cuenta
+        none: una advertencia
+        sensitive: para marcar su cuenta como sensible
+        silence: para limitar su cuenta
+        suspend: suspender su cuenta
+      body: "%{target} está apelando a una solicitud de moderación de %{action_taken_by} el %{date}, del tipo %{type}. Ellos escribieron:"
+      next_steps: Puedes aprobar la apelación para deshacer la decisión de moderación, o ignorarla.
+      subject: "%{username} está apelando a una decisión de moderación en %{instance}"
     new_pending_account:
       body: Los detalles de la nueva cuenta están abajos. Puedes aprobar o rechazar esta aplicación.
       subject: Nueva cuenta para revisión en %{instance} (%{username})
@@ -866,7 +911,6 @@ es:
     status:
       account_status: Estado de la cuenta
       confirming: Esperando confirmación de correo electrónico.
-      functional: Su cuenta está totalmente operativa.
       pending: Su solicitud está pendiente de revisión por nuestros administradores. Eso puede tardar algún tiempo. Usted recibirá un correo electrónico si el solicitud sea aprobada.
       redirecting_to: Tu cuenta se encuentra inactiva porque está siendo redirigida a %{acct}.
     too_fast: Formulario enviado demasiado rápido, inténtelo de nuevo.
@@ -932,6 +976,32 @@ es:
     directory: Directorio de perfiles
     explanation: Descubre usuarios según sus intereses
     explore_mastodon: Explorar %{title}
+  disputes:
+    strikes:
+      action_taken: Acción realizada
+      appeal: Apelar
+      appeal_approved: Esta amonestación fue apelada exitosamente y ya no es válida
+      appeal_rejected: Se rechazó la apelación
+      appeal_submitted_at: Apelación enviada
+      appealed_msg: Tu apelación fue enviada. Si se aprueba, se te notificará.
+      appeals:
+        submit: Enviar apelación
+      associated_report: Informe asociado
+      created_at: Con fecha
+      recipient: Dirigida a
+      status: 'Publicación #%{id}'
+      status_removed: Publicación ya eliminada del sistema
+      title: "%{action} del %{date}"
+      title_actions:
+        delete_statuses: Eliminación de publicación
+        disable: Congelación de la cuenta
+        none: Advertencia
+        sensitive: Marcado de cuenta como sensible
+        silence: Limitación de cuenta
+        suspend: Suspensión de cuenta
+      your_appeal_approved: Se aprobó tu apelación
+      your_appeal_pending: Has enviado una apelación
+      your_appeal_rejected: Tu apelación ha sido rechazada
   domain_validator:
     invalid_domain: no es un nombre de dominio válido
   errors:
@@ -1143,6 +1213,8 @@ es:
       title: Nueva difusión
     status:
       subject: "%{name} acaba de publicar"
+    update:
+      subject: "%{name} editó una publicación"
   notifications:
     email_events: Eventos para notificaciones por correo electrónico
     email_events_hint: 'Selecciona los eventos para los que deseas recibir notificaciones:'
@@ -1493,6 +1565,15 @@ es:
     recovery_instructions_html: Si pierdes acceso a tu teléfono, puedes usar uno de los siguientes códigos de recuperación para obtener acceso a tu cuenta. <strong>Mantenlos a salvo</strong>. Por ejemplo, puedes imprimirlos y guardarlos con otros documentos importantes.
     webauthn: Claves de seguridad
   user_mailer:
+    appeal_approved:
+      action: Ir a tu cuenta
+      explanation: La apelación de la amonestación contra tu cuenta del %{strike_date} que enviaste el %{appeal_date} fue aprobada. Tu cuenta se encuentra de nuevo en buen estado.
+      subject: Tu apelación del %{date} ha sido aprobada
+      title: Apelación aprobada
+    appeal_rejected:
+      explanation: La apelación de la amonestación contra tu cuenta del %{strike_date} que enviaste el %{appeal_date} fue rechazada.
+      subject: Tu apelación del %{date} ha sido rechazada
+      title: Apelación rechazada
     backup_ready:
       explanation: Has solicitado una copia completa de tu cuenta de Mastodon. ¡Ya está preparada para descargar!
       subject: Tu archivo está preparado para descargar
@@ -1504,6 +1585,8 @@ es:
       subject: Por favor, confirma el intento de inicio de sesión
       title: Intento de inicio de sesión
     warning:
+      appeal: Enviar una apelación
+      appeal_description: Si crees que esto es un error, puedes enviar una apelación al equipo de %{instance}.
       categories:
         spam: Spam
         violation: El contenido viola las siguientes directrices de la comunidad
@@ -1515,7 +1598,6 @@ es:
         suspend: Ya no puedes utilizar tu cuenta, y tu perfil y el resto de datos ya no son accesibles. Todavía puedes iniciar sesión para solicitar una copia de seguridad de tus datos, hasta que estos sean eliminados por completo en unos 30 días, aunque conservaremos algunos datos básicos para impedir que esquives la suspensión.
       get_in_touch: Si crees que esto es un error, puedes responder a este correo electrónico para ponerte en contacto con el personal de %{instance}.
       reason: 'Razón:'
-      review_server_policies: Revisar las políticas del servidor
       statuses: 'Publicaciones que han sido halladas contrarias las directrices:'
       subject:
         delete_statuses: Tus publicaciones en %{acct} han sido eliminadas
diff --git a/config/locales/et.yml b/config/locales/et.yml
index 1060dda35..7c7b4eb51 100644
--- a/config/locales/et.yml
+++ b/config/locales/et.yml
@@ -86,7 +86,6 @@ et:
     account_moderation_notes:
       create: Jäta teade
       created_msg: Moderatsiooniteade edukalt koostatud!
-      delete: Kustuta
       destroyed_msg: Moderatsiooniteade edukalt kustutatud!
     accounts:
       add_email_domain_block: Keela e-posti domeen
@@ -318,9 +317,6 @@ et:
         silence: vaigistatud
         suspend: peatatud
       show:
-        affected_accounts:
-          one: Üks kasutaja andmebaasis mõjutatud
-          other: "%{count} kasutajat andmebaasis mõjutatud"
         retroactive:
           silence: Eemalda vaigistus mõjutatud kasutajatelt sellel domeenil
           suspend: Lõpeta mõjutatud kasutajate peatamine sellel domeenil
@@ -343,9 +339,6 @@ et:
     instances:
       by_domain: Domeen
       delivery_available: Üleandmine on saadaval
-      known_accounts:
-        one: "%{count} teadaolev kasutaja"
-        other: "%{count} teadaolevat kasutajat"
       moderation:
         all: Kõik
         limited: Piiratud
@@ -596,7 +589,6 @@ et:
     status:
       account_status: Konto olek
       confirming: Ootan e-posti kinnitust.
-      functional: Teie konto on täiesti töökorras.
       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}.
     trouble_logging_in: Probleeme sisselogimisega?
@@ -1016,7 +1008,6 @@ et:
       subject: Teie arhiiv on allalaadimiseks valmis
       title: Arhiivi väljavõte
     warning:
-      review_server_policies: Vaadake üle serveri eeskirju
       subject:
         disable: Teie konto %{acct} on lukustatud
         none: Hoiatus kasutajale %{acct}
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index e9c9320e2..785cf14d2 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -92,7 +92,6 @@ eu:
     account_moderation_notes:
       create: Sortu oharra
       created_msg: Moderazio oharra ongi sortu da!
-      delete: Ezabatu
       destroyed_msg: Moderazio ohara ongi suntsitu da!
     accounts:
       add_email_domain_block: Sartu domeinua zerrenda beltzean
@@ -111,6 +110,7 @@ eu:
       confirm: Berretsi
       confirmed: Berretsita
       confirming: Berresten
+      custom: Pertsonalizatua
       delete: Ezabatu datuak
       deleted: Ezabatua
       demote: Jaitsi mailaz
@@ -202,6 +202,7 @@ eu:
       silenced: Isilarazita
       statuses: Bidalketa
       subscribe: Harpidetu
+      suspend: Kanporatu
       suspended: Kanporatuta
       suspension_irreversible: Kontu honen datuak behin betiko ezabatu dira. Kontua kanporatzea atzera bota dezakezu, berriz erabilgarri izan dadin, baina datuak ezingo dira berreskuratu.
       suspension_reversible_hint_html: Kontu hau kanporatua izan da eta bere datuak %{date}(e)an behin betiko ezabatuko dira. Ordura arte kontua kalterik gabe leheneratu daiteke. Kontuaren datu guztiak oraintxe bertan ezabatu nahi badituzu, jarraian egin dezakezu.
@@ -222,6 +223,7 @@ eu:
       whitelisted: Zerrenda zurian
     action_logs:
       action_types:
+        approve_appeal: Onartu apelazioa
         approve_user: Onartu erabiltzailea
         assigned_to_self_report: Esleitu salaketa
         change_email_user: Aldatu erabiltzailearen e-maila
@@ -253,6 +255,7 @@ eu:
         enable_user: Gaitu erabiltzailea
         memorialize_account: Bihurtu kontua oroigarri
         promote_user: Igo erabiltzailea mailaz
+        reject_appeal: Baztertu apelazioa
         reject_user: Baztertu erabiltzailea
         remove_avatar_user: Kendu abatarra
         reopen_report: Berrireki txostena
@@ -271,6 +274,7 @@ eu:
         update_domain_block: Eguneratu domeinu-blokeoa
         update_status: Eguneratu bidalketa
       actions:
+        approve_appeal_html: "%{name} erabiltzaileak %{target} erabiltzailearen moderazio erabakiaren apelazioa onartu du"
         approve_user_html: "%{name} erabiltzaileak %{target} erabiltzailearen izen-ematea onartu du"
         assigned_to_self_report_html: "%{name} erabiltzaileak %{target} salaketa bere buruari esleitu dio"
         change_email_user_html: "%{name} erabiltzaileak %{target} erabiltzailearen e-posta helbidea aldatu du"
@@ -302,6 +306,7 @@ eu:
         enable_user_html: "%{name} erabiltzaileak %{target} erabiltzailearen saioa gaitu du"
         memorialize_account_html: "%{name} erabiltzaileak %{target} kontua memoriala bihurtu du"
         promote_user_html: "%{name} erabiltzaileak %{target} erabiltzailea mailaz igo du"
+        reject_appeal_html: "%{name} erabiltzaileak %{target} erabiltzailearen moderazio erabakiaren apelazioa baztertu du"
         reject_user_html: "%{name} erabiltzaileak %{target} erabiltzailearen izen-ematea baztertu du"
         remove_avatar_user_html: "%{name} erabiltzaileak %{target} erabiltzailearen abatarra kendu du"
         reopen_report_html: "%{name} erabiltzaileak %{target} txostena berrireki du"
@@ -380,15 +385,6 @@ eu:
       media_storage: Multimedia biltegiratzea
       new_users: erabiltzaile berri
       opened_reports: txosten irekita
-      pending_reports_html:
-        one: Txosten <strong>1</strong> zain
-        other: "<strong>%{count}</strong> txosten zain"
-      pending_tags_html:
-        one: Traola <strong>1</strong> zain
-        other: "<strong>%{count}</strong> traola zain"
-      pending_users_html:
-        one: Erabiltzaile <strong>1</strong> zain
-        other: "<strong>%{count}</strong> erabiltzaile zain"
       resolved_reports: txosten konponduta
       software: Softwarea
       sources: Izen emate jatorriak
@@ -397,6 +393,10 @@ eu:
       top_languages: Hizkuntza aktiboenak
       top_servers: Zerbitzari aktiboenak
       website: Webgunea
+    disputes:
+      appeals:
+        empty: Ez da apelaziorik aurkitu.
+        title: Apelazioak
     domain_allows:
       add_new: Sartu domeinua zerrenda zurian
       created_msg: Domeinua ongi sartu da zerrenda zurian
@@ -436,7 +436,8 @@ eu:
       show:
         affected_accounts:
           one: Datu-baseko kontu bati eragiten dio
-          other: Datu-baseko %{count} kontuei eragiten die
+          other: Datu-baseko %{count} konturi eragiten die
+          zero: Ez die eragiten datu-baseko kontuei
         retroactive:
           silence: Kendu isilarazteko agindua domeinu honetako kontu guztiei
           suspend: Kendu kanporatzeko agindua domeinu honetako kontu guztiei
@@ -490,6 +491,7 @@ eu:
       known_accounts:
         one: Kontu ezagun %{count}
         other: "%{count} kontu ezagun"
+        zero: Kontu ezagunik ez
       moderation:
         all: Denak
         limited: Mugatua
@@ -547,41 +549,61 @@ 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:
           one: Ohar %{count}
           other: "%{count} ohar"
+      action_log: Auditoria-egunkaria
       action_taken_by: Neurrien hartzailea
+      actions:
+        other_description_html: Ikusi kontuaren portaera kontrolatzeko eta salatutako kontuarekin komunikazioa pertsonalizatzeko aukera gehiago.
+        silence_description_html: Profila dagoeneko jarraitzen dutenei edo eskuz bilatzen dutenei bakarrik agertuko zaie, bere irismena asko mugatuz. Beti bota daiteke atzera.
+        suspend_description_html: Profila eta bere eduki guztiak iritsiezinak bihurtuko dira, ezabatzen den arte. Kontuarekin ezin da interakziorik eduki. Atzera bota daiteke 30 eguneko epean.
+      actions_description_html: Erabaki txosten hau konpontzeko ze ekintza hartu. Salatutako kontuaren aurka zigor ekintza bat hartzen baduzu, eposta jakinarazpen bat bidaliko zaie, <strong>Spam</strong> kategoria hautatzean ezik.
+      add_to_report: Gehitu gehiago txostenera
       are_you_sure: Ziur zaude?
       assign_to_self: Esleitu niri
       assigned: Esleitutako moderatzailea
       by_target_domain: Jakinarazitako kontuaren domeinua
+      category: Kategoria
+      category_description_html: Kontu edo/eta eduki hau salatu izanaren arrazoia salatutako kontuarekiko komunikazioan aipatuko da
       comment:
         none: Bat ere ez
+      comment_description_html: 'Informazio gehiago emateko, %{name} idatzi:'
       created_at: Salatua
+      delete_and_resolve: Ezabatu bidalketak
       forwarded: Birbidalia
       forwarded_to: 'Hona birbidalia: %{domain}'
       mark_as_resolved: Markatu konpondutako gisa
       mark_as_unresolved: Markatu konpondu gabeko gisa
+      no_one_assigned: Inor ez
       notes:
         create: Gehitu oharra
         create_and_resolve: Konpondu ohar batekin
         create_and_unresolve: Berrireki ohar batekin
         delete: Ezabatu
         placeholder: Azaldu hartutako neurriak, edo erlazioa duten bestelako berriak...
+        title: Oharrak
+      notes_description_html: Ikusi eta idatzi oharrak beste moderatzaileentzat eta zuretzat etorkizunerako
+      quick_actions_description_html: 'Hartu ekintza azkar bat edo korritu behera salatutako edukia ikusteko:'
       reopen: Berrireki salaketa
       report: 'Salaketa #%{id}'
       reported_account: Salatutako kontua
       reported_by: Salatzailea
       resolved: Konponduta
       resolved_msg: Salaketa ongi konpondu da!
+      skip_to_actions: Salto ekintzetara
       status: Mezua
+      statuses: Salatutako edukia
+      statuses_description_html: Salatutako edukia salatutako kontuarekiko komunikazioan aipatuko da
       target_origin: Salatutako kontuaren jatorria
       title: Salaketak
       unassign: Kendu esleipena
       unresolved: Konpondu gabea
       updated_at: Eguneratua
+      view_profile: Ikusi profila
     rules:
       add_new: Gehitu araua
       delete: Ezabatu
@@ -683,12 +705,21 @@ eu:
       destroyed_msg: Guneko igoera ongi ezabatu da!
     statuses:
       back_to_account: Atzera kontuaren orrira
+      back_to_report: Atzera txostenaren orrira
+      batch:
+        remove_from_report: Kendu txostenetik
+        report: Salatu
       deleted: Ezabatuta
       media:
         title: Multimedia
       no_status_selected: Ez da bidalketarik aldatu ez delako bidalketarik aukeratu
       title: Kontuaren bidalketak
       with_media: Multimediarekin
+    strikes:
+      actions:
+        delete_statuses: "%{name} erabiltzaileak %{target} erabiltzailearen bidalketak ezabatu ditu"
+        disable: "%{name} erabiltzailea %{target} erabiltzailearen kontua izoztu du"
+        none: "%{name} erabiltzaileak abisua bidali dio %{target} erabiltzaileari"
     system_checks:
       database_schema_check:
         message_html: Aplikatu gabeko datu-basearen migrazioak daude. Exekutatu aplikazioak esperotako portaera izan dezan
@@ -710,9 +741,6 @@ eu:
         allow_provider: Onartu argitaratzailea
         disallow: Ukatu esteka
         disallow_provider: Ukatu argitaratzailea
-        shared_by_over_week:
-          one: Pertsona batek partekatua azken astean
-          other: "%{count} pertsonak partekatua azken astean"
         title: Esteken joerak
         usage_comparison: "%{today} aldiz partekatua gaur, atzo %{yesterday} aldiz"
       pending_review: Berrikusketaren zain
@@ -739,9 +767,6 @@ eu:
         trending_rank: "%{rank}. joera"
         usable: Erabili daiteke
         usage_comparison: "%{today} aldiz erabili da gaur, atzo %{yesterday} aldiz"
-        used_by_over_week:
-          one: Pertsona batek erabilia azken astean
-          other: "%{count} pertsonak erabilia azken astean"
       title: Joerak
     warning_presets:
       add_new: Gehitu berria
@@ -839,7 +864,6 @@ eu:
     status:
       account_status: Kontuaren egoera
       confirming: E-mail baieztapena osatu bitartean zain.
-      functional: Zure kontua guztiz erabilgarri dago.
       pending: Zure eskaera gainbegiratzeko dago oraindik. Honek denbora behar lezake. Zure eskaera onartzen bada e-mail bat jasoko duzu.
       redirecting_to: Zure kontua ez dago aktibo orain %{acct} kontura birbideratzen duelako.
     too_fast: Formularioa azkarregi bidali duzu, saiatu berriro.
@@ -1470,7 +1494,6 @@ eu:
       subject: Berretsi saioa hasteko saiakera
       title: Saioa hasteko saiakera
     warning:
-      review_server_policies: Berrikusi zerbitzariko politikak
       subject:
         disable: Zure  %{acct} kontua izoztu da
         none: "%{acct} konturako abisua"
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 9f0b39a9c..933bc3610 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -94,7 +94,6 @@ fa:
     account_moderation_notes:
       create: افزودن یادداشت
       created_msg: یادداشت مدیر با موفقیت ساخته شد!
-      delete: حذف
       destroyed_msg: یادداشت نظارتی با موفقیت نابود شد!
     accounts:
       add_email_domain_block: مسدود کردن دامنهٔ رایانامه
@@ -384,15 +383,6 @@ fa:
       media_storage: ذخیره‌ساز رسانه
       new_users: کاربران جدید
       opened_reports: گزارش باز شده
-      pending_reports_html:
-        one: "<strong>۱</strong> گزارش منتظر"
-        other: "<strong>%{count}</strong> گزارش منتظر"
-      pending_tags_html:
-        one: "<strong>۱</strong> برچسب منتظر"
-        other: "<strong>%{count}</strong> برچسب منتظر"
-      pending_users_html:
-        one: "<strong>۱</strong> کاربر منتظر"
-        other: "<strong>%{count}</strong> کاربر منتظر"
       resolved_reports: گزارش حل شده
       software: نرم‌افزار
       sources: منابع ثبت‌نام
@@ -438,9 +428,6 @@ fa:
         silence: بی‌صداشده
         suspend: معلق‌شده
       show:
-        affected_accounts:
-          one: روی یک حساب در پایگاه داده تأثیر گذاشت
-          other: روی %{count} حساب در پایگاه داده تأثیر گذاشت
         retroactive:
           silence: بی‌صداشدن همهٔ حساب‌های این دامین را لغو کن
           suspend: معلق‌شدن همهٔ حساب‌های این دامین را لغو کن
@@ -491,9 +478,6 @@ fa:
       delivery_error_hint: اگر تحویل محتوا به مدت %{count} روز ممکن نباشد، به طور خودکار به عنوان تحویل‌ناشونده علامت‌گذاری خواهد شد.
       destroyed_msg: هم اکنون داده دامنه %{domain} در صف حذف حتمی است.
       empty: هیج دامنه‌ای پیدا نشد.
-      known_accounts:
-        one: "%{count} حساب شناخته‌شده"
-        other: "%{count} حساب شناخته‌شده"
       moderation:
         all: همه
         limited: محدود
@@ -570,7 +554,6 @@ fa:
       comment:
         none: هیچ
       created_at: گزارش‌شده
-      delete_and_resolve: حذف و رفع
       forwarded: هدایت شده
       forwarded_to: هدایت شده به %{domain}
       mark_as_resolved: علامت‌گذاری به عنوان حل‌شده
@@ -835,7 +818,6 @@ fa:
     status:
       account_status: وضعیت حساب
       confirming: در حال انتظار برای کامل شدن تأیید ایمیل.
-      functional: حساب شما قابل استفاده است.
       pending: درخواست شما منتظر تأیید مسئولان سایت است و این فرایند ممکن است کمی طول بکشد. اگر درخواست شما پذیرفته شود به شما ایمیلی فرستاده خواهد شد.
       redirecting_to: حساب شما غیرفعال است زیرا هم‌اکنون به %{acct} منتقل شده است.
     too_fast: فرم با سرعت بسیار زیادی فرستاده شد، دوباره تلاش کنید.
@@ -1471,7 +1453,6 @@ fa:
       categories:
         spam: هرزنامه
       reason: 'دلیل:'
-      review_server_policies: مرور سیاست‌های کارساز
       subject:
         disable: حساب %{acct} شما متوقف شده است
         none: هشدار برای %{acct}
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 38b9a04bf..f438552ce 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -94,7 +94,6 @@ fi:
     account_moderation_notes:
       create: Jätä muistiinpano
       created_msg: Moderointimerkinnän luonti onnistui!
-      delete: Poista
       destroyed_msg: Moderointimerkinnän poisto onnistui!
     accounts:
       add_email_domain_block: Estä sähköpostidomain
@@ -113,6 +112,7 @@ fi:
       confirm: Vahvista
       confirmed: Vahvistettu
       confirming: Vahvistetaan
+      custom: Mukautettu
       delete: Poista tiedot
       deleted: Poistettu
       demote: Alenna
@@ -162,6 +162,11 @@ fi:
       not_subscribed: Ei tilaaja
       pending: Odottaa tarkistusta
       perform_full_suspension: Siirrä kokonaan jäähylle
+      previous_strikes: Aiemmat varoitukset
+      previous_strikes_description_html:
+        one: Tällä tilillä on <strong>yksi</strong> varoitus.
+        other: Tällä tilillä on <strong>%{count}</strong> varoitusta.
+        zero: Tämä tili on <strong>hyvässä kunnossa</strong>.
       promote: Ylennä
       protocol: Protokolla
       public: Julkinen
@@ -203,11 +208,15 @@ fi:
       silence: Hiljennä
       silenced: Mykistetty
       statuses: Tilat
+      strikes: Aiemmat varoitukset
       subscribe: Tilaa
+      suspend: Jäädytä
       suspended: Jäähyllä
       suspension_irreversible: Tämän tilin tiedot on poistettu peruuttamattomasti. Voit peruuttaa tilin jäädyttämisen, jolloin siitä tulee käyttökelpoinen, mutta toiminto ei palauta sillä aiemmin olleita tietoja.
       suspension_reversible_hint_html: Tili on jäädytetty, ja tiedot poistetaan kokonaan %{date}. Siihen asti tili voidaan palauttaa ilman haitallisia vaikutuksia. Jos haluat poistaa kaikki tilin tiedot välittömästi, voit tehdä sen alla.
       title: Tilit
+      unblock_email: Poista sähköpostiosoitteen esto
+      unblocked_email_msg: Käyttäjän %{username} sähköpostiosoitteen esto kumottiin
       unconfirmed_email: Sähköpostia ei vahvistettu
       undo_sensitized: Kumoa pakotus arkaluontoiseksi tiliksi
       undo_silenced: Peru hiljennys
@@ -222,6 +231,7 @@ fi:
       whitelisted: Sallittu liittämiselle
     action_logs:
       action_types:
+        approve_appeal: Hyväksy valitus
         approve_user: Hyväksy käyttäjä
         assigned_to_self_report: Määritä raportti
         change_email_user: Vaihda sähköposti käyttäjälle
@@ -240,6 +250,7 @@ fi:
         destroy_domain_allow: Salli verkkotunnuksen poisto
         destroy_domain_block: Poista verkkotunnuksen esto
         destroy_email_domain_block: Poista sähköpostipalvelimen esto
+        destroy_instance: Tyhjennä verkkotunnus
         destroy_ip_block: Poista IP-sääntö
         destroy_status: Poista julkaisu
         destroy_unavailable_domain: Poista ei-saatavilla oleva verkkotunnus
@@ -252,6 +263,7 @@ fi:
         enable_user: Tili otettu käyttöön
         memorialize_account: Muuta muistotiliksi
         promote_user: Käyttäjä ylennetty
+        reject_appeal: Hylkää valitus
         reject_user: Hylkää käyttäjä
         remove_avatar_user: Profiilikuvan poisto
         reopen_report: Uudelleenavaa raportti
@@ -261,6 +273,7 @@ fi:
         silence_account: Hiljennä tili
         suspend_account: Jäädytä tili
         unassigned_report: Peruuta raportin määritys
+        unblock_email_account: Poista sähköpostiosoitteen esto
         unsensitive_account: Kumoa pakotus arkaluontoiseksi tiliksi
         unsilence_account: Peruuta tilin rajoitus
         unsuspend_account: Peruuta tilin jäädytys
@@ -269,6 +282,7 @@ fi:
         update_domain_block: Päivitä verkkotunnuksen esto
         update_status: Päivitä viesti
       actions:
+        approve_appeal_html: "%{name} hyväksyi moderointipäätöksen muutoksenhaun lähettäjältä %{target}"
         approve_user_html: "%{name} hyväksyi käyttäjän rekisteröitymisen kohteesta %{target}"
         assigned_to_self_report_html: "%{name} otti raportin %{target} tehtäväkseen"
         change_email_user_html: "%{name} vaihtoi käyttäjän %{target} sähköpostiosoitteen"
@@ -287,6 +301,7 @@ fi:
         destroy_domain_allow_html: "%{name} esti yhdistämisen verkkotunnuksella %{target}"
         destroy_domain_block_html: "%{name} poisti verkkotunnuksen %{target} eston"
         destroy_email_domain_block_html: "%{name} poisti verkkotunnuksen %{target} eston"
+        destroy_instance_html: "%{name} tyhjensi verkkotunnuksen %{target}"
         destroy_ip_block_html: "%{name} poisti IP-säännön %{target}"
         destroy_status_html: "%{name} poisti viestin %{target}"
         destroy_unavailable_domain_html: "%{name} jatkoi toimitusta verkkotunnukseen %{target}"
@@ -299,6 +314,7 @@ fi:
         enable_user_html: "%{name} salli kirjautumisen käyttäjälle %{target}"
         memorialize_account_html: "%{name} muutti käyttäjän %{target} tilin muistosivuksi"
         promote_user_html: "%{name} ylensi käyttäjän %{target}"
+        reject_appeal_html: "%{name} hylkäsi moderointipäätöksen muutoksenhaun %{target}"
         reject_user_html: "%{name} hylkäsi käyttäjän rekisteröitymisen kohteesta %{target}"
         remove_avatar_user_html: "%{name} poisti käyttäjän %{target} profiilikuvan"
         reopen_report_html: "%{name} avasi uudelleen raportin %{target}"
@@ -308,6 +324,7 @@ fi:
         silence_account_html: "%{name} rajoitti %{target} tilin"
         suspend_account_html: "%{name} siirsi käyttäjän %{target} jäähylle"
         unassigned_report_html: "%{name} peruutti raportin määrityksen %{target}"
+        unblock_email_account_html: "%{name} poisti %{target} sähköpostiosoitteen eston"
         unsensitive_account_html: "%{name} poisti merkinnän %{target} arkaluonteinen media"
         unsilence_account_html: "%{name} ei tehnyt rajoitusta %{target} tilille"
         unsuspend_account_html: "%{name} perui käyttäjän %{target} jäähyn"
@@ -376,6 +393,18 @@ fi:
       media_storage: Median tallennustila
       new_users: uudet käyttäjät
       opened_reports: raportit avattu
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> vireillä oleva valitus"
+        other: "<strong>%{count}</strong> vireillä olevat valitukset"
+      pending_reports_html:
+        one: "<strong>%{count}</strong> odottava raportti"
+        other: "<strong>%{count}</strong> odottavat raportit"
+      pending_tags_html:
+        one: "<strong>%{count}</strong> odottava hashtagi"
+        other: "<strong>%{count}</strong> odottavat hashtagit"
+      pending_users_html:
+        one: "<strong>%{count}</strong> odottava käyttäjä"
+        other: "<strong>%{count}</strong> odottavat käyttäjät"
       resolved_reports: raportit ratkaistu
       software: Ohjelmisto
       sources: Kirjautumisen lähteet
@@ -384,6 +413,10 @@ fi:
       top_languages: Aktiiviset kielet
       top_servers: Aktiiviset palvelimet
       website: Sivusto
+    disputes:
+      appeals:
+        empty: Valituksia ei löytynyt.
+        title: Valitukset
     domain_allows:
       add_new: Salli liitto verkkotunnuksella
       created_msg: Verkkotunnus on onnistuneesti sallittu federaatiolle
@@ -422,8 +455,9 @@ fi:
         suspend: jäähyllä
       show:
         affected_accounts:
-          one: Vaikuttaa yhteen tiliin tietokannassa
+          one: Tämä vaikuttaa yhteen tiliin tietokannassa
           other: Vaikuttaa %{count} tiliin tietokannassa
+          zero: Tämä ei vaikuta mihinkään tietokannan tiliin
         retroactive:
           silence: Peru kaikkien tässä verkkotunnuksessa jo olemassa olevien tilien hiljennys
           suspend: Peru kaikkien tässä verkkotunnuksessa jo olemassa olevien tilien jäähy
@@ -456,6 +490,7 @@ fi:
       back_to_limited: Rajoitettu
       back_to_warning: Varoitus
       by_domain: Verkkotunnus
+      confirm_purge: Oletko varma, että haluat pysyvästi poistaa tiedot tältä verkkotunnukselta?
       delivery:
         all: Kaikki
         clear: Tyhjennä toimitusvirheet
@@ -465,16 +500,25 @@ fi:
         unavailable: Ei saatavilla
         unavailable_message: Toimitus ei käytettävissä
         warning: Varoitus
+        warning_message:
+          one: Toimitusvirhe %{count} päivä
+          other: Toimitushäiriö %{count} päivää
       delivery_available: Toimitus on saatavilla
       delivery_error_days: Toimitusvirheen päivät
       delivery_error_hint: Jos toimitus ei ole mahdollista %{count} päivän aikana, se merkitään automaattisesti toimittamattomaksi.
+      destroyed_msg: Tiedot %{domain} on nyt jonossa välitöntä poistoa varten.
       empty: Verkkotunnuksia ei löytynyt.
+      known_accounts:
+        one: "%{count} tunnettu tili"
+        other: "%{count} tunnettua tiliä"
+        zero: Ei tunnettua tiliä
       moderation:
         all: Kaikki
         limited: Rajoitettu
         title: Moderointi
       private_comment: Yksityinen kommentti
       public_comment: Julkinen kommentti
+      purge: Tyhjennä
       title: Tiedossa olevat instanssit
       total_blocked_by_us: Estetty meidän toimesta
       total_followed_by_them: Heidän seuraama
@@ -525,37 +569,57 @@ fi:
     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:
+          one: "%{count} ilmoitus"
+          other: "%{count} ilmoitusta"
+      action_log: Tarkastusloki
       action_taken_by: Toimenpiteen tekijä
+      actions:
+        delete_description_html: Ilmoitetut viestit poistetaan ja kirjataan varoitus, joka auttaa sinua saman tilin tulevista rikkomuksista.
+        other_description_html: Katso lisää vaihtoehtoja tilin käytöksen hallitsemiseksi ja ilmoitetun tilin viestinnän mukauttamiseksi.
+      add_to_report: Lisää raporttiin
       are_you_sure: Oletko varma?
       assign_to_self: Ota tehtäväksi
       assigned: Määritetty valvoja
       by_target_domain: Ilmoitetun tilin verkkotunnus
+      category: Kategoria
       comment:
         none: Ei mitään
       created_at: Raportoitu
+      delete_and_resolve: Poista viestejä
       forwarded: Välitetty
       forwarded_to: Välitetty %{domain}
       mark_as_resolved: Merkitse ratkaistuksi
       mark_as_unresolved: Merkitse ratkaisemattomaksi
+      no_one_assigned: Ei kukaan
       notes:
         create: Lisää muistiinpano
         create_and_resolve: Ratkaise ja lisää muistiinpano
         create_and_unresolve: Avaa uudelleen ja lisää muistiinpano
         delete: Poista
         placeholder: Kuvaile mitä toimia on tehty tai muita päivityksiä tähän raporttiin…
+        title: Merkinnät
+      notes_description_html: Tarkastele ja jätä merkintöjä muille valvojille ja itsellesi tulevaisuuteen
+      quick_actions_description_html: 'Suorita nopea toiminto tai vieritä alas nähdäksesi raportoitu sisältö:'
       reopen: Avaa raportti uudestaan
       report: Raportti nro %{id}
       reported_account: Raportoitu tili
       reported_by: Raportoija
       resolved: Ratkaistut
       resolved_msg: Raportti onnistuneesti ratkaistu!
+      skip_to_actions: Siirry toimintoihin
       status: Tila
+      statuses: Raportoitu sisältö
+      statuses_description_html: Loukkaava sisältö mainitaan ilmoitetun tilin yhteydessä
       target_origin: Raportoidun tilin alkuperä
       title: Raportit
       unassign: Määrittämätön
       unresolved: Ratkaisemattomat
       updated_at: Päivitetty
+      view_profile: Näytä profiili
     rules:
       add_new: Lisää sääntö
       delete: Poista
@@ -657,6 +721,10 @@ fi:
       destroyed_msg: Sivuston lataus onnistuneesti poistettu!
     statuses:
       back_to_account: Takaisin tilin sivulle
+      back_to_report: Takaisin raporttisivulle
+      batch:
+        remove_from_report: Poista raportista
+        report: Raportti
       deleted: Poistettu
       media:
         title: Media
@@ -684,9 +752,6 @@ fi:
         allow_provider: Salli julkaisija
         disallow: Hylkää linkki
         disallow_provider: Estä julkaisija
-        shared_by_over_week:
-          one: Yhden henkilön jakama viime viikon aikana
-          other: "%{count} henkilön jakama viime viikon aikana"
         title: Suositut linkit
         usage_comparison: Jaettu %{today} kertaa tänään verrattuna eilen %{yesterday}
       pending_review: Odottaa tarkistusta
@@ -713,9 +778,6 @@ fi:
         trending_rank: 'Nousussa #%{rank}'
         usable: Voidaan käyttää
         usage_comparison: Käytetty %{today} kertaa tänään, verrattuna %{yesterday} eiliseen
-        used_by_over_week:
-          one: Yhden henkilön käyttämä viime viikon aikana
-          other: "%{count} henkilön käyttämä viime viikon aikana"
       title: Trendit
     warning_presets:
       add_new: Lisää uusi
@@ -792,6 +854,7 @@ fi:
     invalid_reset_password_token: Salasananpalautustunnus on virheellinen tai vanhentunut. Pyydä uusi.
     link_to_otp: Syötä puhelimesi kaksivaiheinen koodi tai palautuskoodi
     link_to_webauth: Käytä suojausavaintasi
+    log_in_with: Kirjaudu käyttäen
     login: Kirjaudu sisään
     logout: Kirjaudu ulos
     migrate_account: Muuta toiseen tiliin
@@ -813,7 +876,6 @@ fi:
     status:
       account_status: Tilin tila
       confirming: Odotetaan sähköpostivahvistuksen valmistumista.
-      functional: Tilisi on täysin toimiva.
       pending: Hakemuksesi odottaa henkilökuntamme tarkastusta. Tämä voi kestää jonkin aikaa. Saat sähköpostiviestin, jos hakemuksesi on hyväksytty.
       redirecting_to: Tilisi ei ole aktiivinen, koska se ohjaa tällä hetkellä kohteeseen %{acct}.
     too_fast: Lomake lähetettiin liian nopeasti, yritä uudelleen.
@@ -879,6 +941,12 @@ fi:
     directory: Profiilihakemisto
     explanation: Löydä käyttäjiä heidän kiinnostustensa mukaan
     explore_mastodon: Tutki %{title}ia
+  disputes:
+    strikes:
+      created_at: Päivätty
+      recipient: Osoitettu
+      status: 'Viesti #%{id}'
+      status_removed: Viesti on jo poistettu järjestelmästä
   domain_validator:
     invalid_domain: ei ole kelvollinen toimialueen nimi
   errors:
@@ -1171,6 +1239,9 @@ fi:
     reply:
       proceed: Jatka vastaamiseen
       prompt: 'Haluat vastata julkaisuun:'
+  reports:
+    errors:
+      invalid_rules: ei viittaa voimassa oleviin sääntöihin
   scheduled_statuses:
     over_daily_limit: Olet ylittänyt %{limit} ajoitetun viestin rajan tälle päivälle
     over_total_limit: Olet ylittänyt %{limit} ajoitetun viestin rajan
@@ -1253,14 +1324,17 @@ fi:
         other: "%{count} videota"
     boosted_from_html: Tehostettu %{acct_link}
     content_warning: 'Sisältövaroitus: %{warning}'
+    default_language: Sama kuin käyttöliittymän kieli
     disallowed_hashtags:
       one: 'sisälsi aihetunnisteen jota ei sallita: %{tags}'
       other: 'sisälsi aihetunnisteet joita ei sallita: %{tags}'
+    edited_at: Muokattu %{date}
     errors:
       in_reply_not_found: Viesti, johon yrität vastata, ei näytä olevan olemassa.
     open_in_web: Avaa selaimessa
     over_character_limit: merkkimäärän rajoitus %{max} ylitetty
     pin_errors:
+      direct: Viestejä, jotka ovat näkyvissä vain mainituille käyttäjille, ei voi kiinnittää
       limit: Olet jo kiinnittänyt suurimman mahdollisen määrän tuuttauksia
       ownership: Muiden tuuttauksia ei voi kiinnittää
       reblog: Buustausta ei voi kiinnittää
@@ -1296,6 +1370,7 @@ fi:
     interaction_exceptions: Poikkeukset, jotka perustuvat vuorovaikutukseen
     interaction_exceptions_explanation: Huomaa, että ei ole takeita viestien poistamiselle, jos ne alittavat suosikki- tai tehostusrajan sen jälkeen, kun ne on kerran ylitetty.
     keep_direct: Säilytä suorat viestit
+    keep_direct_hint: Ei poista mitään sinun suoria viestejä
     keep_media: Säilytä viestit, joissa on liitetiedostoja
     keep_media_hint: Ei poista viestejä, joissa on liitteitä
     keep_pinned: Pidä kiinnitettyt viestit
@@ -1315,6 +1390,7 @@ fi:
       '63113904': 2 vuotta
       '7889238': 3 kuukautta
     min_age_label: Ikäraja
+    min_favs: Pidä viestit suosikeissa vähintään
   stream_entries:
     pinned: Kiinnitetty tuuttaus
     reblogged: buustasi
@@ -1329,6 +1405,7 @@ fi:
     formats:
       default: "%d.%m.%Y klo %H.%M"
       month: "%b %Y"
+      time: "%H:%M"
   two_factor_authentication:
     add: Lisää
     disable: Poista käytöstä
@@ -1355,13 +1432,17 @@ fi:
       subject: Ole hyvä ja vahvista sisäänkirjautumisyritys
       title: Sisäänkirjautumisyritys
     warning:
-      review_server_policies: Tarkista palvelimen käytännöt
+      categories:
+        spam: Roskaposti
+      reason: 'Syy:'
       subject:
         disable: Tilisi %{acct} on jäädytetty
         none: Varoitus %{acct}
       title:
+        delete_statuses: Viestit poistettu
         disable: Tili jäädytetty
         none: Varoitus
+        sensitive: Media piilotettu
         silence: Rajoitettu tili
         suspend: Tilin käyttäminen keskeytetty
     welcome:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 7fde95d4f..2673b25cb 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -16,11 +16,11 @@ fr:
     contact: Contact
     contact_missing: Non défini
     contact_unavailable: Non disponible
-    discover_users: Découvrez des utilisateurs
+    discover_users: Découvrez des utilisateur·rice·s
     documentation: Documentation
-    federation_hint_html: Avec un compte sur %{instance}, vous pourrez suivre les gens sur n’importe quel serveur Mastodon et au-delà.
+    federation_hint_html: Avec un compte sur %{instance}, vous pourrez suivre des gens sur n’importe quel serveur Mastodon et au-delà.
     get_apps: Essayez une application mobile
-    hosted_on: Serveur Mastodon hébergé par %{domain}
+    hosted_on: Serveur Mastodon hébergé sur %{domain}
     instance_actor_flash: |
       Ce compte est un acteur virtuel utilisé pour représenter le serveur lui-même et non un·e utilisateur·rice individuel·le.
       Il est utilisé à des fins de fédération et ne doit pas être bloqué à moins que vous ne vouliez bloquer l’instance entière, auquel cas vous devriez utiliser un blocage de domaine.
@@ -32,10 +32,10 @@ fr:
     server_stats: 'Statistiques du serveur :'
     source_code: Code source
     status_count_after:
-      one: statut
-      other: statuts
+      one: message
+      other: messages
     status_count_before: Ayant publié
-    tagline: Suivez vos amis et découvrez-en de nouveaux
+    tagline: Suivez vos ami·e·s et découvrez-en de nouveaux·elles
     terms: Conditions d’utilisation
     unavailable_content: Serveurs modérés
     unavailable_content_description:
@@ -94,7 +94,6 @@ fr:
     account_moderation_notes:
       create: Laisser une remarque
       created_msg: Note de modération créée avec succès !
-      delete: Supprimer
       destroyed_msg: Note de modération supprimée avec succès !
     accounts:
       add_email_domain_block: Mettre le domaine du courriel sur liste noire
@@ -163,6 +162,11 @@ fr:
       not_subscribed: Non abonné
       pending: En attente d’approbation
       perform_full_suspension: Suspendre
+      previous_strikes: Sanctions précédentes
+      previous_strikes_description_html:
+        one: Ce compte a reçu <strong>une</strong> sanction.
+        other: Ce compte a reçu <strong>%{count}</strong> sanctions.
+        zero: Ce compte est <strong>en règle</strong>.
       promote: Promouvoir
       protocol: Protocole
       public: Publique
@@ -203,9 +207,10 @@ fr:
         targeted_reports: Signalés par d’autres
       silence: Masquer
       silenced: Masqué
-      statuses: Statuts
+      statuses: Messages
       strikes: Punitions précédentes
       subscribe: S’abonner
+      suspend: Suspendre
       suspended: Suspendu
       suspension_irreversible: Les données de ce compte ont été irréversiblement supprimées. Vous pouvez annuler la suspension du compte pour le rendre utilisable, mais il ne récupérera aucune donnée qu’il avait auparavant.
       suspension_reversible_hint_html: Le compte a été suspendu et les données seront complètement supprimées le %{date}. D’ici là, le compte peut être restauré sans aucun effet néfaste. Si vous souhaitez supprimer toutes les données du compte immédiatement, vous pouvez le faire ci-dessous.
@@ -226,6 +231,7 @@ fr:
       whitelisted: Sur liste blanche
     action_logs:
       action_types:
+        approve_appeal: Approuver l'appel
         approve_user: Approuver l’utilisateur
         assigned_to_self_report: Affecter le signalement
         change_email_user: Modifier le courriel pour
@@ -246,7 +252,7 @@ fr:
         destroy_email_domain_block: Supprimer le blocage de domaine de courriel
         destroy_instance: Purge du domaine
         destroy_ip_block: Supprimer la règle IP
-        destroy_status: Supprimer le statut
+        destroy_status: Supprimer le message
         destroy_unavailable_domain: Supprimer le domaine indisponible
         disable_2fa_user: Désactiver l’A2F
         disable_custom_emoji: Désactiver les émojis personnalisés
@@ -257,6 +263,7 @@ fr:
         enable_user: Activer l’utilisateur
         memorialize_account: Ériger en mémorial
         promote_user: Promouvoir l’utilisateur
+        reject_appeal: Rejeter l'appel
         reject_user: Rejeter l’utilisateur
         remove_avatar_user: Supprimer l’avatar
         reopen_report: Rouvrir le signalement
@@ -273,8 +280,9 @@ fr:
         update_announcement: Modifier l’annonce
         update_custom_emoji: Mettre à jour les émojis personnalisés
         update_domain_block: Mettre à jour le blocage de domaine
-        update_status: Mettre à jour le statut
+        update_status: Mettre à jour le message
       actions:
+        approve_appeal_html: "%{name} a approuvé l'appel de la décision de modération émis par %{target}"
         approve_user_html: "%{name} a approuvé l’inscription de %{target}"
         assigned_to_self_report_html: "%{name} s’est assigné·e le signalement de %{target}"
         change_email_user_html: "%{name} a modifié l'adresse de courriel de l'utilisateur·rice %{target}"
@@ -295,7 +303,7 @@ fr:
         destroy_email_domain_block_html: "%{name} a débloqué le domaine de courriel %{target}"
         destroy_instance_html: "%{name} a purgé le domaine %{target}"
         destroy_ip_block_html: "%{name} a supprimé la règle pour l'IP %{target}"
-        destroy_status_html: "%{name} a supprimé le statut de %{target}"
+        destroy_status_html: "%{name} a supprimé le message de %{target}"
         destroy_unavailable_domain_html: "%{name} a repris la livraison au domaine %{target}"
         disable_2fa_user_html: "%{name} a désactivé l'authentification à deux facteurs pour l'utilisateur·rice %{target}"
         disable_custom_emoji_html: "%{name} a désactivé l'émoji %{target}"
@@ -306,6 +314,7 @@ fr:
         enable_user_html: "%{name} a activé la connexion de l'utilisateur·rice %{target}"
         memorialize_account_html: "%{name} a converti le compte de %{target} en un mémorial"
         promote_user_html: "%{name} a promu l'utilisateur·rice %{target}"
+        reject_appeal_html: "%{name} a rejeté l'appel de la décision de modération émis par %{target}"
         reject_user_html: "%{name} a rejeté l’inscription de %{target}"
         remove_avatar_user_html: "%{name} a supprimé l'avatar de %{target}"
         reopen_report_html: "%{name} a rouvert le signalement %{target}"
@@ -322,8 +331,8 @@ fr:
         update_announcement_html: "%{name} a mis à jour l'annonce %{target}"
         update_custom_emoji_html: "%{name} a mis à jour l'émoji %{target}"
         update_domain_block_html: "%{name} a mis à jour le blocage de domaine pour %{target}"
-        update_status_html: "%{name} a mis à jour le statut de %{target}"
-      deleted_status: "(statut supprimé)"
+        update_status_html: "%{name} a mis à jour le message de %{target}"
+      deleted_status: "(message supprimé)"
       empty: Aucun journal trouvé.
       filter_by_action: Filtrer par action
       filter_by_user: Filtrer par utilisateur·ice
@@ -384,14 +393,17 @@ fr:
       media_storage: Stockage des médias
       new_users: nouveaux utilisateurs
       opened_reports: rapports ouverts
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> appel en attente"
+        other: "<strong>%{count}</strong> appels en attente"
       pending_reports_html:
-        one: "<strong>1</strong> rapport en attente"
+        one: "<strong>%{count}</strong> rapport en attente"
         other: "<strong>%{count}</strong> rapports en attente"
       pending_tags_html:
-        one: "<strong>1</strong> hashtag en attente"
+        one: "<strong>%{count}</strong> hashtag en attente"
         other: "<strong>%{count}</strong> hashtags en attente"
       pending_users_html:
-        one: "<strong>1</strong> utilisateur·rice en attente"
+        one: "<strong>%{count}</strong> utilisateur·rice en attente"
         other: "<strong>%{count}</strong> utilisateur·rice·s en attente"
       resolved_reports: rapports résolus
       software: Logiciel
@@ -401,6 +413,10 @@ fr:
       top_languages: Langues les plus actives
       top_servers: Serveurs les plus actifs
       website: Site Web
+    disputes:
+      appeals:
+        empty: Aucun appel trouvé.
+        title: Appels
     domain_allows:
       add_new: Mettre le domaine sur liste sur blanche
       created_msg: Ce domaine a été ajouté à la liste blanche avec succès
@@ -441,6 +457,7 @@ fr:
         affected_accounts:
           one: Un compte affecté dans la base de données
           other: "%{count} comptes affectés dans la base de données"
+          zero: Pas de compte affecté dans la base de données
         retroactive:
           silence: Ne plus masquer les comptes existants affectés de ce domaine
           suspend: Annuler la suspension des comptes existants affectés pour ce domaine
@@ -494,6 +511,7 @@ fr:
       known_accounts:
         one: "%{count} compte connu"
         other: "%{count} comptes connus"
+        zero: Pas de compte connu
       moderation:
         all: Tout
         limited: Limité
@@ -560,10 +578,12 @@ fr:
       action_log: Journal d’audit
       action_taken_by: Intervention de
       actions:
+        delete_description_html: Les messages signalés seront supprimés et une sanction sera enregistrée pour vous aider à prendre les mesures appropriées en cas d'infractions futures par le même compte.
         other_description_html: Voir plus d'options pour contrôler le comportement du compte et personnaliser la communication vers le compte signalé.
+        resolve_description_html: Aucune mesure ne sera prise contre le compte signalé, aucune sanction ne sera enregistrée et le sigalement sera clôturé.
         silence_description_html: Le profil ne sera visible que pour ceux qui le suivent déjà ou le consultent manuellement, ce qui limite considérablement sa portée. Peut toujours être restauré.
         suspend_description_html: Le profil et tout son contenu deviendront inaccessibles jusqu'à ce qu'il soit éventuellement supprimé. Interagir avec le compte sera impossible. Réversible dans les 30 jours.
-      actions_description_html: 'Si la suppression du contenu offensant ci-dessus est insuffisante :'
+      actions_description_html: Décidez des mesures à prendre pour résoudre ce signalement. Si vous prenez des mesures punitives contre le compte signalé, une notification sera envoyée par e-mail, sauf si la catégorie <strong>Spam</strong> est sélectionnée.
       add_to_report: Ajouter davantage au rapport
       are_you_sure: Voulez-vous vraiment faire ça ?
       assign_to_self: Me l’assigner
@@ -575,7 +595,7 @@ fr:
         none: Aucun
       comment_description_html: 'Pour fournir plus d''informations, %{name} a écrit :'
       created_at: Signalé
-      delete_and_resolve: Supprimer et résoudre
+      delete_and_resolve: Supprimer les publications
       forwarded: Transféré
       forwarded_to: Transféré à %{domain}
       mark_as_resolved: Marquer comme résolu
@@ -589,12 +609,14 @@ fr:
         placeholder: Décrivez quelles actions ont été prises, ou toute autre mise à jour…
         title: Remarques
       notes_description_html: Voir et laisser des notes aux autres modérateurs et à votre futur moi-même
+      quick_actions_description_html: 'Faites une action rapide ou faites défiler vers le bas pour voir le contenu signalé :'
       reopen: Ré-ouvrir le signalement
       report: 'Signalement #%{id}'
       reported_account: Compte signalé
       reported_by: Signalé par
       resolved: Résolus
       resolved_msg: Signalement résolu avec succès !
+      skip_to_actions: Passer aux actions
       status: Statut
       statuses: Contenu signalé
       statuses_description_html: Le contenu offensant sera cité dans la communication avec le compte signalé
@@ -713,8 +735,18 @@ fr:
       media:
         title: Médias
       no_status_selected: Aucun statut n’a été modifié car aucun n’a été sélectionné
-      title: Statuts du compte
+      title: Messages du compte
       with_media: Avec médias
+    strikes:
+      actions:
+        delete_statuses: "%{name} a supprimé les messages de %{target}"
+        disable: "%{name} a bloqué le compte de %{target}"
+        none: "%{name} a envoyé un avertissement à %{target}"
+        sensitive: "%{name} a marqué le compte de %{target} comme sensible"
+        silence: "%{name} a limité le compte de %{target}"
+        suspend: "%{name} a suspendu le compte de %{target}"
+      appeal_approved: Appel soumis
+      appeal_pending: Appel en attente
     system_checks:
       database_schema_check:
         message_html: Vous avez des migrations de base de données en attente. Veuillez les exécuter pour vous assurer que l'application se comporte comme prévu
@@ -737,8 +769,9 @@ fr:
         disallow: Interdire le lien
         disallow_provider: Interdire l'éditeur
         shared_by_over_week:
-          one: Partagé par une personne au cours de la dernière semaine
-          other: Partagé par %{count} personnes au cours de la dernière semaine
+          one: Partagé par une personne au cours de la semaine dernière
+          other: Partagé par %{count} personnes au cours de la semaine dernière
+          zero: Non partagé au cours de la semaine dernière
         title: Liens tendances
         usage_comparison: Partagé %{today} fois aujourd'hui, comparé à %{yesterday} hier
       pending_review: En attente de révision
@@ -766,8 +799,9 @@ fr:
         usable: Peut être utilisé
         usage_comparison: Utilisé %{today} fois aujourd'hui, comparé à %{yesterday} hier
         used_by_over_week:
-          one: Utilisé par une personne au cours de la dernière semaine
-          other: Utilisé par %{count} personnes au cours de la dernière semaine
+          one: Utilisé par une personne au cours de la semaine dernière
+          other: Utilisé par %{count} personnes au cours de la semaine dernière
+          zero: Non utilisé au cours de la semaine dernière
       title: Tendances
     warning_presets:
       add_new: Ajouter un nouveau
@@ -776,6 +810,17 @@ fr:
       empty: Vous n'avez pas encore créé de paramètres prédéfinis pour les avertissements.
       title: Gérer les avertissements prédéfinis
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: effacer les messages
+        disable: bloquer le compte
+        none: un avertissement
+        sensitive: marquer le compte comme sensible
+        silence: limiter le compte
+        suspend: suspendre le compte
+      body: "%{target} fait appel de la décision de modération émise par %{action_taken_by} le %{date} et qui était : %{type}. Cette personne a écrit :"
+      next_steps: Vous pouvez approuver l'appel pour annuler la décision de modération, ou l'ignorer.
+      subject: "%{username} fait appel d'une décision de modération sur %{instance}"
     new_pending_account:
       body: Les détails du nouveau compte se trouvent ci-dessous. Vous pouvez approuver ou rejeter cette demande.
       subject: Nouveau compte à examiner sur %{instance} (%{username})
@@ -818,7 +863,7 @@ fr:
     settings: 'Changer les préférences courriel : %{link}'
     view: 'Voir :'
     view_profile: Voir le profil
-    view_status: Afficher le statut
+    view_status: Afficher le message
   applications:
     created: Application créée avec succès
     destroyed: Application supprimée avec succès
@@ -866,7 +911,6 @@ fr:
     status:
       account_status: État du compte
       confirming: En attente de la confirmation par courriel à compléter.
-      functional: Votre compte est entièrement opérationnel.
       pending: Votre demande est en attente d'examen par notre personnel. Cela peut prendre un certain temps. Vous recevrez un courriel si votre demande est approuvée.
       redirecting_to: Votre compte est inactif car il est actuellement redirigé vers %{acct}.
     too_fast: Formulaire envoyé trop rapidement, veuillez réessayer.
@@ -932,6 +976,31 @@ fr:
     directory: Annuaire des profils
     explanation: Découvrir des utilisateur·rice·s en fonction de leurs centres d’intérêt
     explore_mastodon: Explorer %{title}
+  disputes:
+    strikes:
+      action_taken: Mesure prise
+      appeal_approved: Cette sanction a été annulée en appel et n'est plus valide
+      appeal_rejected: L'appel a été rejeté
+      appeal_submitted_at: Appel soumis le
+      appealed_msg: Votre demande d'appel a été soumise. Si elle est approuvée, vous en serez informé·e.
+      appeals:
+        submit: Faire appel
+      associated_report: Rapport associé
+      created_at: En date du
+      recipient: Adressé à
+      status: 'Message #%{id}'
+      status_removed: Message déjà supprimé du système
+      title: "%{action} du %{date}"
+      title_actions:
+        delete_statuses: Suppression de message
+        disable: Suspension de compte
+        none: Avertissement
+        sensitive: Marquage d'un compte comme sensible
+        silence: Limitation du compte
+        suspend: Suspension de compte
+      your_appeal_approved: Votre appel a été approuvé
+      your_appeal_pending: Vous avez soumis un appel
+      your_appeal_rejected: Votre appel a été rejeté
   domain_validator:
     invalid_domain: n’est pas un nom de domaine valide
   errors:
@@ -1143,6 +1212,8 @@ fr:
       title: Nouveau partage
     status:
       subject: "%{name} vient de publier"
+    update:
+      subject: "%{name} a modifié une publication"
   notifications:
     email_events: Événements pour les notifications par courriel
     email_events_hint: 'Sélectionnez les événements pour lesquels vous souhaitez recevoir des notifications :'
@@ -1224,6 +1295,9 @@ fr:
     reply:
       proceed: Confirmer la réponse
       prompt: 'Vous souhaitez répondre à ce message :'
+  reports:
+    errors:
+      invalid_rules: ne fait pas référence à des règles valides
   scheduled_statuses:
     over_daily_limit: Vous avez dépassé la limite de %{limit} messages planifiés par jour
     over_total_limit: Vous avez dépassé la limite de %{limit} messages planifiés
@@ -1333,7 +1407,7 @@ fr:
     show_older: Plus anciens
     show_thread: Afficher le fil de discussion
     sign_in_to_participate: Inscrivez-vous pour prendre part à la conversation
-    title: '%{name} : "%{quote}"'
+    title: "%{name} : « %{quote} »"
     visibilities:
       direct: Direct
       private: Abonné⋅e⋅s uniquement
@@ -1490,6 +1564,15 @@ fr:
     recovery_instructions_html: Si vous perdez l’accès à votre téléphone, vous pouvez utiliser un des codes de récupération ci-dessous pour retrouver l’accès à votre compte. <strong>Conservez les codes de récupération en sécurité</strong>. Par exemple, en les imprimant et en les stockant avec vos autres documents importants.
     webauthn: Clés de sécurité
   user_mailer:
+    appeal_approved:
+      action: Aller à votre compte
+      explanation: L'appel de la sanction contre votre compte mise en place le %{strike_date} que vous avez soumis le %{appeal_date} a été approuvé. Votre compte est de nouveau en règle.
+      subject: Votre appel du %{date} a été approuvé
+      title: Appel approuvé
+    appeal_rejected:
+      explanation: L'appel de la sanction contre votre compte mise en place le %{strike_date} que vous avez soumis le %{appeal_date} a été rejeté.
+      subject: Votre appel du %{date} a été rejeté
+      title: Appel rejeté
     backup_ready:
       explanation: Vous avez demandé une sauvegarde complète de votre compte Mastodon. Elle est maintenant prête à être téléchargée !
       subject: Votre archive est prête à être téléchargée
@@ -1501,6 +1584,8 @@ fr:
       subject: Veuillez confirmer la tentative de connexion
       title: Tentative de connexion
     warning:
+      appeal: Faire appel
+      appeal_description: Si vous pensez qu'il s'agit d'une erreur, vous pouvez faire appel auprès de l'équipe de %{instance}.
       categories:
         spam: Indésirable
         violation: Le contenu viole les directives de la communauté suivantes
@@ -1510,9 +1595,8 @@ fr:
         sensitive: Désormais, tous vos fichiers multimédias téléchargés seront marqués comme sensibles et cachés derrière un avertissement à cliquer.
         silence: Vous pouvez toujours utiliser votre compte, mais seules les personnes qui vous suivent déjà verront vos messages sur ce serveur, et vous pourriez être exclu de diverses fonctions de découverte. Cependant, d'autres personnes peuvent toujours vous suivre manuellement.
         suspend: Vous ne pouvez plus utiliser votre compte, votre profil et vos autres données ne sont plus accessibles. Vous pouvez toujours vous connecter pour demander une sauvegarde de vos données jusqu'à leur suppression complète dans environ 30 jours, mais nous conserverons certaines données de base pour vous empêcher d'échapper à la suspension.
-      get_in_touch: Si vous pensez qu'il s'agit d'une erreur, vous pouvez répondre à ce courriel pour entrer en contact avec le personnel de %{instance}.
+      get_in_touch: Si vous pensez qu’il s'agit d’une erreur, vous pouvez répondre à ce courriel pour entrer en contact avec l’équipe de %{instance}.
       reason: 'Motif :'
-      review_server_policies: Passer en revue les politiques du serveur
       statuses: 'Les messages qui ont été jugés en violation :'
       subject:
         delete_statuses: Vos messages sur %{acct} ont été supprimés
diff --git a/config/locales/gd.yml b/config/locales/gd.yml
index 17f32cb04..9f7044517 100644
--- a/config/locales/gd.yml
+++ b/config/locales/gd.yml
@@ -102,7 +102,6 @@ gd:
     account_moderation_notes:
       create: Fàg nòta
       created_msg: Chaidh nòta na maorsainneachd a chruthachadh!
-      delete: Sguab às
       destroyed_msg: Chaidh nòta na maorsainneachd a mhilleadh!
     accounts:
       add_email_domain_block: Bac àrainn a’ phuist-d
@@ -392,21 +391,6 @@ gd:
       media_storage: Stòras mheadhanan
       new_users: cleachdaichean ùra
       opened_reports: gearanan air am fosgladh
-      pending_reports_html:
-        few: "<strong>%{count}</strong> lèirmheasan ri dhèiligeadh"
-        one: "<strong>%{count}</strong> lèirmheas ri dhèiligeadh"
-        other: "<strong>%{count}</strong> lèirmheas ri dhèiligeadh"
-        two: "<strong>%{count}</strong> lèirmheas ri dhèiligeadh"
-      pending_tags_html:
-        few: "<strong>%{count}</strong> tagaichean hais ri dhèiligeadh"
-        one: "<strong>%{count}</strong> taga hais ri dhèiligeadh"
-        other: "<strong>%{count}</strong> taga hais ri dhèiligeadh"
-        two: "<strong>%{count}</strong> thaga hais ri dhèiligeadh"
-      pending_users_html:
-        few: "<strong>%{count}</strong> cleachdaichean ri dhèiligeadh"
-        one: "<strong>%{count}</strong> chleachdaiche ri dhèiligeadh"
-        other: "<strong>%{count}</strong> cleachdaiche ri dhèiligeadh"
-        two: "<strong>%{count}</strong> chleachdaiche ri dhèiligeadh"
       resolved_reports: gearanan air am fuasgladh
       software: Bathar-bog
       sources: Tùsan clàraidh
@@ -452,11 +436,6 @@ gd:
         silence: cuingichte
         suspend: à rèim
       show:
-        affected_accounts:
-          few: Bheir seo buaidh air %{count} cunntasan san stòr-dàta
-          one: Bheir seo buaidh air %{count} chunntas san stòr-dàta
-          other: Bheir seo buaidh air %{count} cunntas san stòr-dàta
-          two: Bheir seo buaidh air %{count} chunntas san stòr-dàta
         retroactive:
           silence: Dì-chuingich na cunntasan a tha ann on àrainn seo ’s air a bheil buaidh
           suspend: Cuir na cunntasan a tha ann on àrainn seo ’s air a bheil buaidh ann an rèim a-rithist
@@ -509,11 +488,6 @@ gd:
       delivery_error_hint: Mura gabh a lìbhrigeadh fad %{count} là(ithean), thèid comharra a chur ris gu fèin-obrachail a dh’innseas nach gabh a lìbhrigeadh.
       destroyed_msg: Tha an dàta o %{domain} air ciutha an sguabaidh às aithghearr.
       empty: Cha deach àrainn a lorg.
-      known_accounts:
-        few: "%{count} cunntasan as aithne dhuinn"
-        one: "%{count} cunntas as aithne dhuinn"
-        other: "%{count} cunntas as aithne dhuinn"
-        two: "%{count} chunntas as aithne dhuinn"
       moderation:
         all: Na h-uile
         limited: Cuingichte
@@ -585,7 +559,6 @@ gd:
         other_description_html: Seall barrachd roghainnean airson giùlan a’ chunntais a stiùireadh agus an conaltradh leis a’ chunntas a chaidh gearan a dhèanamh mu dhèidhinn a ghnàthachadh.
         silence_description_html: Chan fhaic ach an fheadhainn a tha a’ leantainn oirre mu thràth no a lorgas a làimh i a’ phròifil seo agus cuingichidh seo uiread nan daoine a ruigeas i gu mòr. Gabhaidh seo a neo-dhèanamh uair sam bith.
         suspend_description_html: Cha ghabh a’ phròifil seo agus an t-susbaint gu leòr aice inntrigeadh gus an dèid a sguabadh às air deireadh na sgeòil. Cha ghabh eadar-ghabhail a dhèanamh leis a’ chunntas. Gabhaidh seo a neo-dhèanamh am broinn 30 latha.
-      actions_description_html: 'Mura foghainn toirt air falbh na droch-shusbaint gu h-àrd:'
       add_to_report: Cuir barrachd ris a’ ghearan
       are_you_sure: A bheil thu cinnteach?
       assign_to_self: Iomruin dhomh-sa
@@ -597,7 +570,6 @@ gd:
         none: Chan eil gin
       comment_description_html: 'Airson barrachd fiosrachaidh a sholar, sgrìobh %{name}:'
       created_at: Chaidh an gearan a dhèanamh
-      delete_and_resolve: Sguab às is fuasgail
       forwarded: Chaidh a shìneadh air adhart
       forwarded_to: Chaidh a shìneadh air adhart gu %{domain}
       mark_as_resolved: Cuir comharra gun deach fhuasgladh
@@ -758,11 +730,6 @@ gd:
         allow_provider: Ceadaich am foillsichear
         disallow: Na ceadaich an ceangal
         disallow_provider: Na ceadaich am foillsichear
-        shared_by_over_week:
-          few: Chaidh a cho-roinneadh le %{count} rè na seachdain seo chaidh
-          one: Chaidh a cho-roinneadh le %{count} rè na seachdain seo chaidh
-          other: Chaidh a cho-roinneadh le %{count} rè na seachdain seo chaidh
-          two: Chaidh a cho-roinneadh le %{count} rè na seachdain seo chaidh
         title: Ceanglaichean a’ treandadh
         usage_comparison: Chaidh a cho-roinneadh %{today} tura(i)s an-diugh an coimeas ri %{yesterday} an-dè
       pending_review: A’ feitheamh air lèirmheas
@@ -789,11 +756,6 @@ gd:
         trending_rank: 'A’ treandadh #%{rank}'
         usable: Gabhaidh a chleachdadh
         usage_comparison: Chaidh a chleachdadh %{today} tura(i)s an-diugh an coimeas ri %{yesterday} an-dè
-        used_by_over_week:
-          few: Chaidh a chleachdadh le %{count} rè na seachdain seo chaidh
-          one: Chaidh a chleachdadh le %{count} rè na seachdain seo chaidh
-          other: Chaidh a chleachdadh le %{count} rè na seachdain seo chaidh
-          two: Chaidh a chleachdadh le %{count} rè na seachdain seo chaidh
       title: Treandaichean
     warning_presets:
       add_new: Cuir fear ùr ris
@@ -892,7 +854,6 @@ gd:
     status:
       account_status: Staid a’ chunntais
       confirming: A’ feitheamh air coileanadh an dearbhaidh on phost-d.
-      functional: Tha an cunntas agad ag obair gu slàn.
       pending: Feumaidh an sgioba againn lèirmheas a dhèanamh air d’ iarrtas. Dh’fhaoidte gun doir seo greis. Gheibh thu post-d nuair a bhios sinn air aontachadh ri d’ iarrtas.
       redirecting_to: Chan eil an cunntas gad gnìomhach on a tha e ’ga ath-stiùireadh gu %{acct}.
     too_fast: Chaidh am foirm a chur a-null ro luath, feuch ris a-rithist.
@@ -1479,7 +1440,6 @@ gd:
         suspend: Chan urrainn dhut an cunntas agad a chleachdadh tuilleadh agus chan fhaigh thu grèim air a’ phròifil no air an dàta eile agad. ’S urrainn dhut clàradh a-steach fhathast airson lethbhreac-glèidhidh dhen dàta agad iarraidh mur dèid an dàta a thoirt air falbh an ceann 30 latha gu slàn ach cumaidh sinn cuid dhen dàta bhunasach ach nach seachain thu an cur à rèim.
       get_in_touch: Ma tha thu dhen bheachd gur e mearachd a th’ ann, ’s urrainn dhut freagairt dhan phost-d seo no conaltradh ris an sgioba aig %{instance}.
       reason: 'Adhbhar:'
-      review_server_policies: Thoir sùil air riaghailtean an fhrithealaiche
       statuses: 'Na postaichean a bhris riaghailt:'
       subject:
         delete_statuses: Chaidh na postaichean agad air %{acct} a thoirt air falbh
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 57154da58..d2c323fb4 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -94,7 +94,6 @@ gl:
     account_moderation_notes:
       create: Deixar nota
       created_msg: Nota de moderación creada de xeito correcto!
-      delete: Eliminar
       destroyed_msg: Nota de moderación eliminada de xeito correcto!
     accounts:
       add_email_domain_block: Bloquear o dominio do email
@@ -163,6 +162,11 @@ gl:
       not_subscribed: Non subscrita
       pending: Revisión pendente
       perform_full_suspension: Suspender
+      previous_strikes: Accións previas
+      previous_strikes_description_html:
+        one: Esta conta ten <strong>un</strong> evento.
+        other: Esta conta ten <strong>%{count}</strong> eventos.
+        zero: Esta conta ten <strong>boa reputación</strong>.
       promote: Promocionar
       protocol: Protocolo
       public: Público
@@ -206,6 +210,7 @@ gl:
       statuses: Publicacións
       strikes: Accións previas
       subscribe: Subscribirse
+      suspend: Suspender
       suspended: Suspendida
       suspension_irreversible: Elimináronse de xeito irreversible os datos desta conta. Podes reactivar a conta para facela usable novamente pero non recuperará os datos eliminados.
       suspension_reversible_hint_html: Esta conta foi suspendida, e os datos serán totalmente eliminados o %{date}. Ata entón, a conta pode ser restaurada sen danos. Se desexas eliminar agora mesmo todos os datos da conta, podes facelo aquí embaixo.
@@ -226,6 +231,7 @@ gl:
       whitelisted: Listaxe branca
     action_logs:
       action_types:
+        approve_appeal: Aprobar apelación
         approve_user: Aprobar Usuaria
         assigned_to_self_report: Asignar denuncia
         change_email_user: Editar email da usuaria
@@ -233,16 +239,16 @@ gl:
         create_account_warning: Crear aviso
         create_announcement: Crear anuncio
         create_custom_emoji: Crear emoticonas personalizadas
-        create_domain_allow: Crear permiso de dominio
-        create_domain_block: Crear bloqueo de dominio
+        create_domain_allow: Crear Dominio Permitido
+        create_domain_block: Crear bloquedo do Dominio
         create_email_domain_block: Crear bloqueo de dominio de correo electrónico
         create_ip_block: Crear regra IP
         create_unavailable_domain: Crear dominio Non dispoñible
         demote_user: Degradar usuaria
         destroy_announcement: Eliminar anuncio
         destroy_custom_emoji: Eliminar emoticona personalizada
-        destroy_domain_allow: Eliminar permiso de dominio
-        destroy_domain_block: Eliminar bloqueo de dominio
+        destroy_domain_allow: Eliminar Dominio permitido
+        destroy_domain_block: Eliminar bloqueo do Dominio
         destroy_email_domain_block: Eliminar bloqueo de dominio de correo electrónico
         destroy_instance: Purgar Dominio
         destroy_ip_block: Eliminar regra IP
@@ -257,6 +263,7 @@ gl:
         enable_user: Activar usuaria
         memorialize_account: Transformar en conta conmemorativa
         promote_user: Promover usuaria
+        reject_appeal: Rexeitar apelación
         reject_user: Rexeitar Usuaria
         remove_avatar_user: Eliminar avatar
         reopen_report: Reabrir denuncia
@@ -275,6 +282,7 @@ gl:
         update_domain_block: Actualizar bloqueo do dominio
         update_status: Actualizar publicación
       actions:
+        approve_appeal_html: "%{name} aprobou a apelación da decisión da moderación de %{target}"
         approve_user_html: "%{name} aprobou o rexistro de %{target}"
         assigned_to_self_report_html: "%{name} asignou a denuncia %{target} para si mesma"
         change_email_user_html: "%{name} cambiou o enderezo de email da usuaria %{target}"
@@ -300,12 +308,13 @@ gl:
         disable_2fa_user_html: "%{name} desactivou o requerimento do segundo factor para a usuaria %{target}"
         disable_custom_emoji_html: "%{name} desactivou o emoji %{target}"
         disable_sign_in_token_auth_user_html: "%{name} desactivou a autenticación por token no email para %{target}"
-        disable_user_html: "%{name} desactivou a conexión para a usuaria %{target}"
+        disable_user_html: "%{name} desactivou as credenciais para a usuaria %{target}"
         enable_custom_emoji_html: "%{name} activou o emoji %{target}"
         enable_sign_in_token_auth_user_html: "%{name} activou a autenticación con token no email para %{target}"
-        enable_user_html: "%{name} activou a conexión para a usuaria %{target}"
+        enable_user_html: "%{name} activou as credenciais para a usuaria %{target}"
         memorialize_account_html: "%{name} convertiu a conta de %{target} nunha páxina para o recordo"
         promote_user_html: "%{name} promocionou a usuaria %{target}"
+        reject_appeal_html: "%{name} rexeitou a apelación da decisión da moderación de %{target}"
         reject_user_html: "%{name} rexeitou o rexistro de %{target}"
         remove_avatar_user_html: "%{name} eliminou o avatar de %{target}"
         reopen_report_html: "%{name} reabriu a denuncia %{target}"
@@ -384,14 +393,17 @@ gl:
       media_storage: Almacenaxe multimedia
       new_users: novas usuarias
       opened_reports: denuncias abertas
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> apelación pendente"
+        other: "<strong>%{count}</strong> apelacións pendentes"
       pending_reports_html:
-        one: "<strong>1</strong> denuncia pendente"
+        one: "<strong>%{count}</strong> denuncia pendente"
         other: "<strong>%{count}</strong> denuncias pendentes"
       pending_tags_html:
-        one: "<strong>1</strong> cancelo pendente"
-        other: "<strong>%{count}</strong> cancelos pendentes"
+        one: "<strong>%{count}</strong> etiqueta pendente"
+        other: "<strong>%{count}</strong> etiquetas pendentes"
       pending_users_html:
-        one: "<strong>1</strong> usuaria pendente"
+        one: "<strong>%{count}</strong> usuaria pendente"
         other: "<strong>%{count}</strong> usuarias pendentes"
       resolved_reports: denuncias resoltas
       software: Software
@@ -401,6 +413,10 @@ gl:
       top_languages: Idiomas máis activos
       top_servers: Servidores máis activos
       website: Sitio web
+    disputes:
+      appeals:
+        empty: Non hai apelacións.
+        title: Apelacións
     domain_allows:
       add_new: Engadir dominio á listaxe branca
       created_msg: Engadeu o dominio a lista branca
@@ -439,8 +455,9 @@ gl:
         suspend: suspendido
       show:
         affected_accounts:
-          one: Unha conta na base de datos afectada
-          other: "%{count} contas na base de datos afectadas"
+          one: Ten efecto sobre unha conta na base de datos
+          other: Ten efecto sobre %{count} contas na base de datos
+          zero: Non afecta a ningunha conta na base de datos
         retroactive:
           silence: Deixar de silenciar todas as contas existentes deste dominio
           suspend: Desbotar suspenso de todas as contas existentes deste dominio
@@ -494,6 +511,7 @@ gl:
       known_accounts:
         one: "%{count} conta coñecida"
         other: "%{count} contas coñecidas"
+        zero: Sen contas coñecidas
       moderation:
         all: Todo
         limited: Limitado
@@ -560,10 +578,12 @@ gl:
       action_log: Rexistro de auditoría
       action_taken_by: Acción tomada por
       actions:
+        delete_description_html: As publicacións denunciadas van ser eliminadas e gárdase un aviso para axudarche a xestionar futuras infraccións desta conta.
         other_description_html: Mira máis opcións para controlar o comportamento da conta e personalizar as comunicacións coa conta denunciada.
+        resolve_description_html: Non se van tomar accións contra a conta denunciada, nin se gardan avisos, e a denuncia arquivada.
         silence_description_html: O perfil será visible só para quen xa o está a seguir ou quen o buscou manualmente, limitando moito o seu alcance. Pódese cambiar.
         suspend_description_html: O perfil e tódolos seus contidos será inaccesbles e finalmente eliminados. A interacción coa conta non será posible. Reversible durante 30 días.
-      actions_description_html: 'Se eliminar o contido ofensivo non é suficiente:'
+      actions_description_html: Decide que acción tomar respecto desta denuncia. Se tomas accións punitivas contra a conta denunciada, enviaráselles un email coa notificación, excepto se está seleccionada a categoría <strong>Spam</strong>.
       add_to_report: Engadir máis á denuncia
       are_you_sure: Estás seguro?
       assign_to_self: Asignarme
@@ -575,7 +595,7 @@ gl:
         none: Ningún
       comment_description_html: 'Como información engadida, %{name} escribiu:'
       created_at: Denunciado
-      delete_and_resolve: Eliminar e resolver
+      delete_and_resolve: Eliminar publicacións
       forwarded: Reenviado
       forwarded_to: Reenviado a %{domain}
       mark_as_resolved: Marcar como resolto
@@ -589,12 +609,14 @@ gl:
         placeholder: Describir que accións foron tomadas ou calquera outra novidade sobre esta denuncia...
         title: Notas
       notes_description_html: Ver e deixar unha nota para ti no futuro e outras moderadoras
+      quick_actions_description_html: 'Tomar unha acción rápida ou desprázate abaixo para ver o contido denunciado:'
       reopen: Reabrir denuncia
       report: 'Denuncia #%{id}'
       reported_account: Conta denunciada
       reported_by: Denunciado por
       resolved: Resolto
       resolved_msg: Resolveuse con éxito a denuncia!
+      skip_to_actions: Ir a accións
       status: Estado
       statuses: Contido denunciado
       statuses_description_html: O contido ofensivo será citado na comunicación coa conta denunciada
@@ -715,6 +737,16 @@ gl:
       no_status_selected: Non se cambiou ningunha publicación xa que ningunha foi seleccionada
       title: Publicacións da conta
       with_media: con medios
+    strikes:
+      actions:
+        delete_statuses: "%{name} eliminou as publicacións de %{target}"
+        disable: "%{name} pausou a conta de %{target}"
+        none: "%{name} envioulle un aviso a %{target}"
+        sensitive: "%{name} marcou a conta de %{target} como sensible"
+        silence: "%{name} limitou a conta de %{target}"
+        suspend: "%{name} suspendeu a conta de %{target}"
+      appeal_approved: Recurrida
+      appeal_pending: Apelación pendente
     system_checks:
       database_schema_check:
         message_html: Existen migracións pendentes na base de datos. Bota man desta tarefa para facer que a aplicación funcione como se agarda dela
@@ -739,6 +771,7 @@ gl:
         shared_by_over_week:
           one: Compartido por unha persoa na última semana
           other: Compartido por %{count} persoas na última semana
+          zero: Non foi compartido na última semana
         title: Ligazóns en voga
         usage_comparison: Compartido %{today} veces hoxe, comparado con %{yesterday} onte
       pending_review: Revisión pendente
@@ -768,6 +801,7 @@ gl:
         used_by_over_week:
           one: Utilizado por unha persoa na última semana
           other: Utilizado por %{count} persoas na última semana
+          zero: Non foi utilizado na última semana
       title: Tendencias
     warning_presets:
       add_new: Engadir novo
@@ -776,6 +810,17 @@ gl:
       empty: Non definiches os avisos prestablecidos.
       title: Xestionar avisos preestablecidos
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: borrar as súas publicacións
+        disable: pausar a súa conta
+        none: un aviso
+        sensitive: marcar a conta como sensible
+        silence: limitar a súa conta
+        suspend: suspender a súa conta
+      body: "%{target} apelou a decisión de moderación de %{action_taken_by} o %{date}, de tipo %{type}. Escribiu:"
+      next_steps: Podes aprobar o recurso e desfacer a decisión de moderación, ou ignoralo.
+      subject: "%{username} fixo unha apelación á decisión de moderación en %{instance}"
     new_pending_account:
       body: Abaixo están os detalles da conta. Podes aprobar ou rexeitar esta solicitude.
       subject: Hai unha conta nova para revisar en %{instance} (%{username})
@@ -844,12 +889,12 @@ gl:
     invalid_reset_password_token: O testemuño para restablecer o contrasinal non é válido ou caducou. Por favor solicite un novo.
     link_to_otp: Escribe o código do segundo factor do móbil ou un código de recuperación
     link_to_webauth: Usa o teu dispositivo de chave de seguridade
-    log_in_with: Inicia sesión con
-    login: Conectar
-    logout: Desconectar
+    log_in_with: Accede con
+    login: Acceder
+    logout: Pechar sesión
     migrate_account: Mover a unha conta diferente
     migrate_account_html: Se queres redirixir esta conta hacia outra diferente, pode <a href="%{path}">configuralo aquí</a>.
-    or_log_in_with: ou conectar con
+    or_log_in_with: Ou accede con
     providers:
       cas: CAS
       saml: SAML
@@ -866,11 +911,10 @@ gl:
     status:
       account_status: Estado da conta
       confirming: Agardando a confirmación do correo enviado.
-      functional: A súa conta está totalmente operativa.
       pending: A túa solicitude está pendente de revisión. Poderíanos levar algún tempo. Recibirás un correo se a solicitude está aprobada.
       redirecting_to: A túa conta está inactiva porque está redirixida a %{acct}.
     too_fast: Formulario enviado demasiado rápido, inténtao outra vez.
-    trouble_logging_in: Problemas para conectar?
+    trouble_logging_in: Problemas para acceder?
     use_security_key: Usa chave de seguridade
   authorize_follow:
     already_following: Xa está a seguir esta conta
@@ -932,6 +976,32 @@ gl:
     directory: Directorio de perfís
     explanation: Descubre usuarias según o teu interese
     explore_mastodon: Explorar %{title}
+  disputes:
+    strikes:
+      action_taken: Acción tomada
+      appeal: Apelar
+      appeal_approved: Esta acción foi recurrida e xa non é válida
+      appeal_rejected: O recurso foi rexeitado
+      appeal_submitted_at: Enviouse a apelación
+      appealed_msg: A túa apelación foi enviada. Se é aprobada recibirás unha notificación.
+      appeals:
+        submit: Enviar apelación
+      associated_report: Denuncia asociada
+      created_at: Data
+      recipient: Entregada a
+      status: 'Publicación #%{id}'
+      status_removed: A publicación xa foi eliminada do sistema
+      title: "%{action} o %{date}"
+      title_actions:
+        delete_statuses: Eliminación da publicación
+        disable: Pausar conta
+        none: Aviso
+        sensitive: Marcar a conta como sensible
+        silence: Limitar a conta
+        suspend: Suspender a conta
+      your_appeal_approved: A apelación foi aprobada
+      your_appeal_pending: Enviaches unha apelación
+      your_appeal_rejected: A apelación foi rexeitada
   domain_validator:
     invalid_domain: non é un nome de dominio válido
   errors:
@@ -1059,9 +1129,9 @@ gl:
       sign_in_token: código de seguridade por email
       webauthn: chaves de seguridade
     description_html: Se ves actividade que non recoñeces, considera cambiar o contrasinal e activar o segundo factor de autenticación.
-    empty: Sen historial de autenticación dispoñible
-    failed_sign_in_html: Intento de conexión errado con %{method} desde %{ip} (%{browser})
-    successful_sign_in_html: Conexión correcta con %{method} desde %{ip} (%{browser})
+    empty: Non hai historial de autenticación
+    failed_sign_in_html: Intento de acceso errado con %{method} desde %{ip} (%{browser})
+    successful_sign_in_html: Acceso correcto con %{method} desde %{ip} (%{browser})
     title: Historial de autenticación
   media_attachments:
     validations:
@@ -1143,6 +1213,8 @@ gl:
       title: Nova promoción
     status:
       subject: "%{name} publicou"
+    update:
+      subject: "%{name} editou unha publicación"
   notifications:
     email_events: Eventos para os correos de notificación
     email_events_hint: 'Escolle os eventos sobre os que queres recibir notificacións:'
@@ -1159,9 +1231,9 @@ gl:
           trillion: T
   otp_authentication:
     code_hint: Escribe o código creado pola app de autenticación para confirmar
-    description_html: Se activas a <strong>autenticación con dous factores</strong> utilizando unha app de autenticación, ó conectarte pedirémosche que teñas o móbil á man, para crear o código que precisas para conectarte.
+    description_html: Se activas a <strong>autenticación con dous factores</strong> utilizando unha app de autenticación, ao conectarte pedirémosche que teñas o móbil á man, para crear o código que precisas para acceder.
     enable: Activar
-    instructions_html: "<strong>Escanea este código QR na túa app TOTP no móbil ou Google Authenticator</strong>. A partir de agora, a app creará códigos que terás que escribir cando te conectes."
+    instructions_html: "<strong>Escanea este código QR na túa app TOTP ou tipo Google Authenticator no móbil</strong>. A partir de agora, a app creará códigos que terás que escribir cando entres."
     manual_instructions: 'Se non podes escanear o código QR e tes que escribilo á man, aquí tes o código en texto plano:'
     setup: Configurar
     wrong_code: O código escrito non é válido! ¿é correcta a hora no dispositivo e no servidor?
@@ -1254,7 +1326,7 @@ gl:
       weibo: Weibo
     current_session: Sesión actual
     description: "%{browser} en %{platform}"
-    explanation: Estos son os navegadores web nos que actualmente ten sesión aberta.
+    explanation: Estos son os navegadores web nos que actualmente ten sesión iniciada.
     ip: IP
     platforms:
       adobe_air: Adobe Air
@@ -1335,7 +1407,7 @@ gl:
     show_newer: Mostrar o máis novo
     show_older: Mostrar o máis vello
     show_thread: Amosar fío
-    sign_in_to_participate: Conéctese para participar na conversa
+    sign_in_to_participate: Accede e participa na conversa
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Directa
@@ -1493,17 +1565,28 @@ gl:
     recovery_instructions_html: Se perdeses o acceso ao teu teléfono, podes utilizar un dos códigos de recuperación inferiores para recuperar o acceso á conta. <strong>Garda os códigos nun lugar seguro</strong>. Por exemplo, podes imprimilos e gardalos xunto con outros documentos importantes.
     webauthn: Chaves de seguridade
   user_mailer:
+    appeal_approved:
+      action: Vai á túa conta
+      explanation: A apelación da acción contra a túa conta o %{strike_date} que enviaches o %{appeal_date} foi aprobada. A túa conta volve ao estado normal de uso.
+      subject: O recurso presentado o %{date} foi aprobado
+      title: Apelación aprobada
+    appeal_rejected:
+      explanation: A apelación contra a acción tomada contra a túa conta o %{strike_date} que enviaches o %{appeal_date} foi rexeitada.
+      subject: A túa apelación do %{date} foi rexeitada
+      title: Apelación rexeitada
     backup_ready:
       explanation: Solicitaches os datos completos da túa conta de Mastodon. Xa está preparados para descargar!
       subject: O teu ficheiro xa está preparado para descargar
       title: Leve o ficheiro
     sign_in_token:
       details: 'Detalles sobre o intento:'
-      explanation: 'Detectamos un intento de conectar coa túa conta desde un enderezo IP descoñecido. Se es ti, escribe o código de seguridade inferior na páxina de desafío de conexión:'
+      explanation: 'Detectamos un intento de acceso coa túa conta desde un enderezo IP descoñecido. Se es ti, escribe o código de seguridade inferior na páxina de desafío de conexión:'
       further_actions: 'Se non foches ti, cambia agora o contrasinal e activa o segundo factor de autenticación para a túa conta. Pódelo facer aquí:'
       subject: Por favor confirma o intento de conexión
       title: Intento de conexión
     warning:
+      appeal: Enviar unha apelación
+      appeal_description: Se cres que esto é un erro, podes enviar un recurso á administración de %{instance}.
       categories:
         spam: Spam
         violation: O contido viola as seguintes normas da comunidade
@@ -1512,10 +1595,9 @@ gl:
         disable: Xa non podes usar a túa conta, pero o teu perfil e outros datos permanecen intactos. Podes solicitar unha copia dos teus datos, cambiar os axustes da conta ou eliminar a túa conta.
         sensitive: A partir deste momento, tódolos ficheiros que subiches estarán marcados como sensibles e agochados tras un aviso de contido.
         silence: Aínda podes usar a túa conta pero só as persoas que te siguen poden ver as túas publicacións neste servidor, e podes que foses excluída de varios xeitos de descubrimento. Porén, aínda te poden seguir de xeito manual.
-        suspend: Xa non podes usar a túa conta, o teu perfil e outros datos xa non son accesibles. Aínda podes conectarte para solicitar unha copia dos teus datos no prazo de 30 días previos á eliminación da conta, pero imos reter algúns datos básicos para evitar que poidas evitar a suspensión.
+        suspend: Xa non podes usar a túa conta, o teu perfil e outros datos xa non son accesibles. Aínda podes acceder para solicitar unha copia dos teus datos no prazo de 30 días previos á eliminación da conta. Imos reter algúns datos básicos para evitar que poidas evitar a suspensión.
       get_in_touch: Se consideras que isto é un erro, podes responder a este email para contactar coa administración de %{instance}.
       reason: 'Razón:'
-      review_server_policies: Revisar políticas do servidor
       statuses: 'Publicacións que contradín as normas:'
       subject:
         delete_statuses: As túas publicacións en %{acct} foron eliminadas
@@ -1554,9 +1636,9 @@ gl:
     invalid_otp_token: O código do segundo factor non é válido
     invalid_sign_in_token: Código de seguridade non válido
     otp_lost_help_html: Se perdes o acceso a ambos, podes contactar con %{email}
-    seamless_external_login: Está conectado a través de un servizo externo, polo que os axustes de contrasinal e correo-e non están dispoñibles.
+    seamless_external_login: Accedeches a través dun servizo externo, polo que os axustes de contrasinal e correo-e non están dispoñibles.
     signed_in_as: 'Rexistrada como:'
-    suspicious_sign_in_confirmation: Semella que non te conectaches antes desde este dispositivo, e hai tempo que non te conectas, así que ímosche enviar un código de seguridade ao teu enderezo de email para confirmar que es ti.
+    suspicious_sign_in_confirmation: Semella que non entraches antes usando este dispositivo, así que ímosche enviar un código de seguridade ao teu enderezo de email para confirmar que es ti.
   verification:
     explanation_html: 'Podes <strong>validarte a ti mesma como a dona das ligazóns nos metadatos do teu perfil</strong>. Para esto, o sitio web ligado debe conter unha ligazón de retorno ao perfil de Mastodon. Esta ligazón de retorno <strong>ten que</strong> ter un atributo <code>rel="me"</code>. O texto da ligazón non importa. Aquí tes un exemplo:'
     verification: Validación
@@ -1567,7 +1649,7 @@ gl:
       success: Engadeuse correctamente a chave de seguridade.
     delete: Eliminar
     delete_confirmation: "¿Tes a certeza de que queres eliminar a chave de seguridade?"
-    description_html: Se activas a <strong>autenticación con chave de seguridade</strong>, ó conectarte pediráseche que uses unha das túas chaves.
+    description_html: Se activas a <strong>autenticación con chave de seguridade</strong>, pediráseche que uses unha das túas chaves para acceder.
     destroy:
       error: Houbo un problema ó eliminar a túa chave de seguridade, inténtao outra vez.
       success: Eliminouse correctamente a chave de seguridade.
diff --git a/config/locales/he.yml b/config/locales/he.yml
index c151f0192..454a48e09 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -32,7 +32,6 @@ he:
     account_moderation_notes:
       create: ליצור
       created_msg: הודעת מנחה נוצרה בהצלחה!
-      delete: למחוק
       destroyed_msg: הודעת מנחה נמחקה בהצלחה!
     accounts:
       are_you_sure: בטוח?
@@ -98,6 +97,7 @@ he:
       statuses: הודעות
       strikes: עבירות קודמות
       subscribe: הרשמה
+      suspend: השעייה
       title: חשבונות
       undo_silenced: ביטול השתקה
       undo_suspension: ביטול השעייה
@@ -120,6 +120,10 @@ he:
       reject_media: חסימת קבצי מדיה
       reject_media_hint: מסירה קבצי מדיה השמורים מקומית ומונעת מהורדת קבצים נוספים בעתיד. לא רלוונטי להשעיות
       show:
+        affected_accounts:
+          one: חשבון אחד במסד נתונים מושפע
+          other: "%{count} חשבונות במסד נתונים מושפעים"
+          zero: אף חשבון במסד נתונים מושפע
         retroactive:
           silence: הסרת השתקה מכל החשבונות על שרת זה
           suspend: הסרת השעייה מכל החשבונות על שרת זה
@@ -131,6 +135,9 @@ he:
     report_notes:
       today_at: היום, ב%{time}
     reports:
+      actions:
+        delete_description_html: הפוסטים המדווחים יימחקו ותרשם עבירה על מנת להקל בהעלאה של דיווחים עתידיים על אותה חשבון.
+        resolve_description_html: אף פעולה לא תבוצע נגד החשבון עליו דווח, לא תירשם עבירה, והדיווח ייסגר.
       add_to_report: הוספת פרטים לדיווח
       are_you_sure: 100% על בטוח?
       category: קטגוריה
@@ -172,6 +179,17 @@ he:
         remove_from_report: הסרה מהדיווח
         report: דווח
     title: ניהול
+    trends:
+      links:
+        shared_by_over_week:
+          one: שותף ע"י משתמש\ת אחד\ת בשבוע האחרון
+          other: שותף ע"י %{count} משתמשים בשבוע האחרון
+          zero: לא שותף בכלל בשבוע האחרון
+      tags:
+        used_by_over_week:
+          one: היה בשימוש משתמש\ת אחד\ת בשבוע האחרון
+          other: היה בשימוש ע"י %{count} משתמשים בשבוע האחרון
+          zero: לא היה בשימוש בכלל בשבוע האחרון
   application_mailer:
     settings: 'שינוי הגדרות דוא"ל: %{link}'
     view: 'תצוגה:'
@@ -263,6 +281,8 @@ he:
     reblog:
       body: 'חצרוצך הודהד על ידי %{name}:'
       subject: חצרוצך הודהד על ידי%{name}
+    update:
+      subject: "%{name} ערכו פוסט"
   pagination:
     next: הבא
     prev: הקודם
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index a72c02eae..672a08e54 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -67,7 +67,7 @@ hu:
       felhasználót. Föderációs célokra szolgál, nem szabad tehát felfüggeszteni.
     joined: Csatlakozott %{date}
     last_active: utoljára aktív
-    link_verified_on: A link tulajdonosát %{date} -n ellenőriztük
+    link_verified_on: 'A hivatkozás tulajdonosa ekkor volt ellenőrizve: %{date}'
     media: Média
     moved_html: "%{name} ide költözött: %{new_profile_link}"
     network_hidden: Ez az információ nem elérhető
@@ -96,7 +96,6 @@ hu:
     account_moderation_notes:
       create: Új moderációs bejegyzés
       created_msg: Moderációs bejegyzés létrehozva!
-      delete: Törlés
       destroyed_msg: Moderációs bejegyzés törölve!
     accounts:
       add_email_domain_block: Email domain tiltólistára vétele
@@ -165,6 +164,11 @@ hu:
       not_subscribed: Nincs feliratkozás
       pending: Engedélyezés alatt
       perform_full_suspension: Felfüggesztés
+      previous_strikes: Korábbi vétségek
+      previous_strikes_description_html:
+        one: Ennek a fióknak <strong>egy</strong> vétsége van.
+        other: Ennek a fióknak <strong>%{count}</strong> vétsége van.
+        zero: Ez a fiók <strong>makulátlan</strong>.
       promote: Előléptetés
       protocol: Protokoll
       public: Nyilvános
@@ -208,9 +212,10 @@ hu:
       statuses: Bejegyzés
       strikes: Korábbi kihágások
       subscribe: Feliratkozás
+      suspend: Felfüggesztés
       suspended: Felfüggesztett
       suspension_irreversible: Ennek a fióknak az adatait visszaállíthatatlanul törölték. Visszavonhatod a fiók felfüggesztését, hogy újra használható legyen, de a régi adatok ettől még nem fognak visszatérni.
-      suspension_reversible_hint_html: A fiókot felfüggesztettük, az adatait %{date}-n teljesen eltávolítjuk. Eddig az időpontig a fiók probléma nélkül visszaállítható. Ha mégis azonnal törölni szeretnéd a fiókot, alább megteheted.
+      suspension_reversible_hint_html: 'A fiókot felfüggesztettük, az adatai ekkor lesznek teljesen eltávolítva: %{date}. Eddig az időpontig a fiók probléma nélkül visszaállítható. Ha mégis azonnal törölni szeretnéd a fiókot, alább megteheted.'
       title: Fiókok
       unblock_email: E-mail-cím tiltásának feloldása
       unblocked_email_msg: A(z) %{username} e-mail-cím tiltása sikeresen feloldva
@@ -228,6 +233,7 @@ hu:
       whitelisted: Engedélyező-listán
     action_logs:
       action_types:
+        approve_appeal: Fellebbezés jóváhagyása
         approve_user: Felhasználó Jóváhagyása
         assigned_to_self_report: Jelentés hozzárendelése
         change_email_user: Felhasználó e-mail címének módosítása
@@ -259,6 +265,7 @@ hu:
         enable_user: Felhasználó engedélyezése
         memorialize_account: Fiók emlékké nyilvánítása
         promote_user: Felhasználó előléptetése
+        reject_appeal: Fellebbezés elutasítása
         reject_user: Felhasználó Elutasítása
         remove_avatar_user: Profilkép eltávolítása
         reopen_report: Jelentés újranyitása
@@ -277,6 +284,7 @@ hu:
         update_domain_block: Domain tiltás frissítése
         update_status: Bejegyzés frissítése
       actions:
+        approve_appeal_html: "%{name} jóváhagyott egy fellebbezést %{target} moderátori döntéséről"
         approve_user_html: "%{name} jóváhagyta %{target} regisztrációját"
         assigned_to_self_report_html: "%{name} a %{target} bejelentést magához rendelte"
         change_email_user_html: "%{name} megváltoztatta %{target} felhasználó e-mail címét"
@@ -308,6 +316,7 @@ hu:
         enable_user_html: "%{name} engedélyezte %{target} felhasználó bejelentkezését"
         memorialize_account_html: "%{name} emléket állított %{target} felhasználónak"
         promote_user_html: "%{name} előléptette %{target} felhasználót"
+        reject_appeal_html: "%{name} visszautasított egy fellebbezést %{target} moderátori döntéséről"
         reject_user_html: "%{name} elutasította %{target} regisztrációját"
         remove_avatar_user_html: "%{name} törölte %{target} profilképét"
         reopen_report_html: "%{name} újranyitotta a %{target} bejelentést"
@@ -386,15 +395,18 @@ hu:
       media_storage: Médiatároló
       new_users: új felhasználó
       opened_reports: megnyitott bejelentés
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> fellebbezés folyamatban"
+        other: "<strong>%{count}</strong> fellebbezés folyamatban"
       pending_reports_html:
-        one: "<strong>1</strong> függőben lévő bejelentés"
-        other: "<strong>%{count}</strong> függőben lévő bejelentés"
+        one: "<strong>%{count}</strong> bejelentés folyamatban"
+        other: "<strong>%{count}</strong> bejelentés folyamatban"
       pending_tags_html:
-        one: "<strong>1</strong> függőben lévő hashtag"
-        other: "<strong>%{count}</strong> függőben lévő hashtag"
+        one: "<strong>%{count}</strong> hashtag jóváhagyásra vár"
+        other: "<strong>%{count}</strong> hashtag jóváhagyásra vár"
       pending_users_html:
-        one: "<strong>1</strong> függőben lévő felhasználó"
-        other: "<strong>%{count}</strong> függőben lévő felhasználó"
+        one: "<strong>%{count}</strong> függő fiók"
+        other: "<strong>%{count}</strong> függő fiók"
       resolved_reports: megoldott bejelentés
       software: Szoftver
       sources: Regisztrációs források
@@ -403,6 +415,10 @@ hu:
       top_languages: Legaktívabb nyelvek
       top_servers: Legaktívabb szerverek
       website: Weboldal
+    disputes:
+      appeals:
+        empty: Nem található fellebbezés.
+        title: Fellebbezések
     domain_allows:
       add_new: Domain engedélyezése
       created_msg: A domain rákerült az engedélyező-listára
@@ -441,8 +457,9 @@ hu:
         suspend: felfüggesztve
       show:
         affected_accounts:
-          one: Összesen egy fiók érintett az adatbázisban
-          other: Összesen %{count} fiók érintett az adatbázisban
+          one: Egy fiókot érintett az adatbázisban
+          other: "%{count} fiókot érintett az adatbázisban"
+          zero: Nem érintett fiókot az adatbázisban
         retroactive:
           silence: Minden felhasználó némításának feloldása ezen a domainen
           suspend: Minden felhasználó felfüggesztésének feloldása ezen a domainen
@@ -496,6 +513,7 @@ hu:
       known_accounts:
         one: "%{count} ismert fiók"
         other: "%{count} ismert fiók"
+        zero: Nincs ismert fiók
       moderation:
         all: Mind
         limited: Korlátozott
@@ -562,10 +580,12 @@ hu:
       action_log: Audit napló
       action_taken_by: 'Kezelte:'
       actions:
+        delete_description_html: A bejelentett bejegyzéseket törölni fogjuk és feljegyzünk egy vétséget, hogy segítsünk a későbbi eszkalációban ugyanennél a fióknál.
         other_description_html: További lehetőségek megjelenítése a fiók viselkedésének szabályozásához, és a jelentett fiók kommunikációjának testreszabásához.
+        resolve_description_html: Nem csinálunk semmit a bejelentett fiókkal, nem jegyzünk fel vétséget, és bezárjuk a bejelentést.
         silence_description_html: A profil csak azok számára lesz látható, akik már követik, vagy kézileg megkeresik, rendkívül korlátozva az elérését. Ez mindig visszafordítható.
         suspend_description_html: A profil és az összes tartalma elérhetetlen lesz, amíg végleg törlésre nem kerül. A fiókkal történő minden interakció lehetetlen lesz. 30 napon belül még visszaállítható.
-      actions_description_html: 'Ha a fenti szabálysértő tartalom eltávolítása elégtelen:'
+      actions_description_html: Döntsd el, mit csináljunk, hogy megoldjuk ezt a bejelentést. Ha valamilyen büntető intézkedést hozol a bejelentett fiók ellen, küldünk neki egy figyelmeztetést e-mail-ben, kivéve ha a <strong>Spam</strong> kategóriát választod.
       add_to_report: Továbbiak hozzáadása a bejelentéshez
       are_you_sure: Biztos vagy benne?
       assign_to_self: Magamhoz rendelés
@@ -577,7 +597,7 @@ hu:
         none: Egyik sem
       comment_description_html: 'Hogy további információkat adjon, %{name} ezt írta:'
       created_at: Jelentve
-      delete_and_resolve: Törlés és megoldás
+      delete_and_resolve: Bejegyzések törlése
       forwarded: Továbbítva
       forwarded_to: 'Továbbítva ide: %{domain}'
       mark_as_resolved: Megjelölés megoldottként
@@ -591,12 +611,14 @@ hu:
         placeholder: Jegyezd le, mi tettünk az ügy érdekében, vagy bármilyen változást...
         title: Megjegyzések
       notes_description_html: Megtekintés, és megjegyzések hagyása más moderátoroknak
+      quick_actions_description_html: 'Hozz egy gyors intézkedést, vagy görgess le a bejelentett tartalomhoz:'
       reopen: Bejelentés újranyitása
       report: "#%{id} számú jelentés"
       reported_account: Bejelentett fiók
       reported_by: 'Jelentette:'
       resolved: Megoldott
       resolved_msg: A bejelentést sikeresen megoldottuk!
+      skip_to_actions: Tovább az intézkedésekhez
       status: Állapot
       statuses: Jelentett tartalom
       statuses_description_html: A sértő tartalmat idézni fogjuk a bejelentett fiókkal való kommunikáció során
@@ -717,6 +739,16 @@ hu:
       no_status_selected: Nem változtattunk meg egy bejegyzést sem, mert semmi sem volt kiválasztva
       title: Fiók bejegyzései
       with_media: Médiával
+    strikes:
+      actions:
+        delete_statuses: "%{name} törölte %{target} bejegyzését"
+        disable: "%{name} befagyasztotta %{target} fiókját"
+        none: "%{name} figyelmeztetést küldött %{target} számára"
+        sensitive: "%{name} érzékenynek jelölte %{target} fiókját"
+        silence: "%{name} korlátozta %{target} fiókját"
+        suspend: "%{name} felfüggesztette %{target} fiókját"
+      appeal_approved: Megfellebbezve
+      appeal_pending: Fellebbezés folyamatban
     system_checks:
       database_schema_check:
         message_html: Vannak esedékes adatbázis migrációink. Kérlek, futtasd őket, hogy biztosítsd, hogy az alkalmazás megfelelően működjön
@@ -739,8 +771,9 @@ hu:
         disallow: Hivatkozás letiltása
         disallow_provider: Közzétevő letiltása
         shared_by_over_week:
-          one: Egy ember osztotta meg a múlt héten
-          other: "%{count} ember osztotta meg a múlt héten"
+          one: Egy ember osztotta meg az elmúlt héten
+          other: "%{count} ember osztotta meg az elmúlt héten"
+          zero: Senki sem osztotta meg az elmúlt héten
         title: Felkapott hivatkozások
         usage_comparison: "%{today} alkalommal lett ma megosztva, a tegnapi %{yesterday} alkalomhoz képest"
       pending_review: Áttekintésre vár
@@ -770,6 +803,7 @@ hu:
         used_by_over_week:
           one: Egy ember használta a múlt héten
           other: "%{count} ember használta a múlt héten"
+          zero: Senki sem használta a múlt héten
       title: Trendek
     warning_presets:
       add_new: Új hozzáadása
@@ -778,6 +812,17 @@ hu:
       empty: Nem definiáltál még egyetlen figyelmeztetést sem.
       title: Figyelmeztetések
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: bejegyzések törléséről
+        disable: fiók befagyasztásáról
+        none: figyelmeztetésről
+        sensitive: fiók érzékenynek jelöléséről
+        silence: fiók korlátozásáról
+        suspend: fiók felfüggesztéséről
+      body: "%{target} fellebbezi %{action_taken_by} moderátor %{date}-i, %{type} szóló döntését. Ezt írták:"
+      next_steps: Jóváhagyhatod a fellebbezést, hogy semmissé tedd a moderátori döntést, vagy figyelmen kívül hagyhatod.
+      subject: "%{username} fellebbez egy moderátori döntést a %{instance} szerveren"
     new_pending_account:
       body: Az új fiók részletesen alább látható. Ezt a jelentkezést engedélyezheted vagy elutasíthatod.
       subject: Új fiók (%{username}) engedélyezésre vár a %{instance} szerveren
@@ -868,7 +913,6 @@ hu:
     status:
       account_status: Fiók állapota
       confirming: Várakozás az e-mailes visszaigazolásra.
-      functional: A fiókod teljesen működőképes.
       pending: A jelentkezésed engedélyezésre vár. Ez eltarthat egy ideig. Kapsz egy e-mailt, ha a kérelmedet jóváhagyták.
       redirecting_to: A fiókod inaktív, mert jelenleg ide %{acct} van átirányítva.
     too_fast: Túl gyorsan küldted el az űrlapot, próbáld később.
@@ -934,6 +978,32 @@ hu:
     directory: Profilok
     explanation: Találj másokra érdeklődésük alapján
     explore_mastodon: "%{title} felfedezése"
+  disputes:
+    strikes:
+      action_taken: Intézkedés
+      appeal: Fellebbezés
+      appeal_approved: Ezt a vétséget eredményesen fellebbezték, így már nem érvényes
+      appeal_rejected: A fellebbezést visszautasították
+      appeal_submitted_at: Fellebbezés beküldve
+      appealed_msg: A fellebbezésedet beküldtük. Ha jóváhagyták, értesítünk.
+      appeals:
+        submit: Fellebbezés beküldése
+      associated_report: Társított bejelentés
+      created_at: Dátum
+      recipient: Címzett
+      status: 'Bejegyzés #%{id}'
+      status_removed: A bejegyzést már eltávolítottuk a rendszerből
+      title: "%{action} ekkor: %{date}"
+      title_actions:
+        delete_statuses: Bejegyzés eltávolítása
+        disable: Fiók befagyasztása
+        none: Figyelmeztetés
+        sensitive: Fiók érzékenynek jelölése
+        silence: Fiók korlátozása
+        suspend: Fiók felfüggesztése
+      your_appeal_approved: A fellebbezésedet jóváhagyták
+      your_appeal_pending: Beküldtél egy fellebbezést
+      your_appeal_rejected: A fellebbezésedet visszautasították
   domain_validator:
     invalid_domain: nem egy valódi domain név
   errors:
@@ -1145,6 +1215,8 @@ hu:
       title: Új megtolás
     status:
       subject: "%{name} bejegyzést írt"
+    update:
+      subject: "%{name} szerkesztett egy bejegyzést"
   notifications:
     email_events: Események email értesítésekhez
     email_events_hint: 'Válaszd ki azokat az eseményeket, melyekről értesítést szeretnél:'
@@ -1315,7 +1387,7 @@ hu:
     disallowed_hashtags:
       one: 'tiltott hashtaget tartalmaz: %{tags}'
       other: 'tiltott hashtageket tartalmaz: %{tags}'
-    edited_at: Szerkesztve %{date}
+    edited_at: 'Szerkesztve: %{date}'
     errors:
       in_reply_not_found: Már nem létezik az a bejegyzés, melyre válaszolni szeretnél.
     open_in_web: Megnyitás a weben
@@ -1495,6 +1567,15 @@ hu:
     recovery_instructions_html: A visszaállítási kódok egyikének segítségével tudsz majd belépni, ha elveszítenéd a telefonod. <strong>Tartsd biztos helyen a visszaállítási kódjaid</strong>! Például nyomtasd ki őket és tárold a többi fontos iratoddal együtt.
     webauthn: Biztonsági kulcsok
   user_mailer:
+    appeal_approved:
+      action: Ugrás a fiókodhoz
+      explanation: A fiókod %{appeal_date}-i fellebbezése, mely a %{strike_date}-i vétségeddel kapcsolatos, jóváhagyásra került. A fiókod megint makulátlan.
+      subject: A %{date}-i fellebbezésedet jóváhagyták
+      title: Fellebbezés jóváhagyva
+    appeal_rejected:
+      explanation: A %{appeal_date}-i fellebbezésed, amely a fiókod %{strike_date}-i vétségével kapcsolatos, elutasításra került.
+      subject: A %{date}-i fellebbezésedet visszautasították
+      title: Fellebbezés visszautasítva
     backup_ready:
       explanation: A Mastodon fiókod teljes mentését kérted. A mentés kész ás letölthető!
       subject: Az adataidról készült archív letöltésre kész
@@ -1506,6 +1587,8 @@ hu:
       subject: Erősítsd meg a megkísérelt belépést
       title: Belépési kísérlet
     warning:
+      appeal: Fellebbezés beküldése
+      appeal_description: Ha azt gondolod, hogy ez hibás, beküldhetsz egy fellebbezést a(z) %{instance} szerver csapatának.
       categories:
         spam: Kéretlen üzenet
         violation: A tartalom megsérti a következő közösségi irányelveket
@@ -1517,7 +1600,6 @@ hu:
         suspend: Többé nem használhatod a fiókodat, a profilod és más adataid többé nem elérhetőek. Még be tudsz jelentkezni, hogy mentést kérj az adataidról addig, amíg kb. 30 nap múlva teljesen le nem töröljük őket. Néhány alapadatot megtartunk, hogy el tudjuk kerülni, hogy megkerüld a felfüggesztést.
       get_in_touch: Ha azt gondolod, hogy ez egy hiba, akkor válaszolj erre az e-mail-re, hogy kapcsolatba léphess a %{instance} kiszolgáló üzemeltetőivel.
       reason: 'Indok:'
-      review_server_policies: Szerver szabályzat átnézése
       statuses: 'Szabálysértőnek talált bejegyzések:'
       subject:
         delete_statuses: A(z) %{acct} fiók bejegyzései eltávolításra kerültek
@@ -1578,4 +1660,4 @@ hu:
     not_enabled: Még nem engedélyezted a WebAuthn-t
     not_supported: Ez a böngésző nem támogatja a biztonsági kulcsokat
     otp_required: A biztonsági kulcsok használatához először engedélyezd a kétlépcsős azonosítást.
-    registered_on: 'Regisztrált ekkor: %{date}'
+    registered_on: 'Regisztráció ekkor: %{date}'
diff --git a/config/locales/hy.yml b/config/locales/hy.yml
index 021aa7c31..70f775cf0 100644
--- a/config/locales/hy.yml
+++ b/config/locales/hy.yml
@@ -92,7 +92,6 @@ hy:
     account_moderation_notes:
       create: Թողնել նշում
       created_msg: Մոդերացիոն նոթը բարեյաջող ստեղծուեց
-      delete: Ջնջել
       destroyed_msg: Մոդերացիոն նոթը բարեյաջող վերացուեց
     accounts:
       add_email_domain_block: Արգելափակել էլ․ փոստի տիրոյթը
@@ -373,9 +372,6 @@ hy:
         unavailable: Անհասանելի է
         warning: Զգուշացում
       empty: Դոմեյնները չեն գտնուել
-      known_accounts:
-        one: "%{count} յայտնի հաշիւ"
-        other: "%{count} յայտնի հաշիւներ"
       moderation:
         all: Բոլորը
         limited: Սահամանփակ
diff --git a/config/locales/id.yml b/config/locales/id.yml
index b034da26f..76e91c9d2 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -88,7 +88,6 @@ id:
     account_moderation_notes:
       create: Beri catatan
       created_msg: Catatan moderasi berhasil dibuat!
-      delete: Hapus
       destroyed_msg: Catatan moderasi berhasil dihapus!
     accounts:
       add_email_domain_block: Masukkan domain email ke daftar hitam
@@ -157,6 +156,11 @@ id:
       not_subscribed: Tidak berlangganan
       pending: Tinjauan tertunda
       perform_full_suspension: Lakukan suspen penuh
+      previous_strikes: Peringatan sebelumnya
+      previous_strikes_description_html:
+        one: Akun ini mendapatkan <strong>satu</strong> peringatan.
+        other: Akun ini mendapatkan <strong>%{count}</strong> peringatan.
+        zero: Akun ini <strong>status bagus</strong>.
       promote: Promosikan
       protocol: Protokol
       public: Publik
@@ -200,6 +204,7 @@ id:
       statuses: Status
       strikes: Peringatan sebelumnya
       subscribe: Langganan
+      suspend: Tangguhkan
       suspended: Disuspen
       suspension_irreversible: Data akun ini telah dihapus secara permanen. Anda dapat mengaktifkan akun agar tetap bisa dipakai lagi tapi data sebelumnya tidak dapat dikembalikan.
       suspension_reversible_hint_html: Akun telah ditangguhkan, dan data akan dihapus total pada %{date}. Sebelum tanggal tersebut, akun dapat dikembalikan tanpa efek apapun. Jika Anda ingin menghapus segera semua data, Anda dapat melakukan sesuai keterangan di bawah.
@@ -220,6 +225,7 @@ id:
       whitelisted: Masuk daftar putih
     action_logs:
       action_types:
+        approve_appeal: Setujui Banding
         approve_user: Setujui Pengguna
         assigned_to_self_report: Berikan laporan
         change_email_user: Ubah Email untuk Pengguna
@@ -251,6 +257,7 @@ id:
         enable_user: Aktifkan Pengguna
         memorialize_account: Kenang Akun
         promote_user: Promosikan Pengguna
+        reject_appeal: Tolak Banding
         reject_user: Tolak Pengguna
         remove_avatar_user: Hapus Avatar
         reopen_report: Buka Lagi Laporan
@@ -269,6 +276,7 @@ id:
         update_domain_block: Perbarui Blokir Domain
         update_status: Perbarui Status
       actions:
+        approve_appeal_html: "%{name} menyetujui moderasi keputusan banding dari %{target}"
         approve_user_html: "%{name} menyetujui pendaftaran dari %{target}"
         assigned_to_self_report_html: "%{name} menugaskan laporan %{target} ke dirinya sendiri"
         change_email_user_html: "%{name} mengubah alamat email pengguna %{target}"
@@ -300,6 +308,7 @@ id:
         enable_user_html: "%{name} mengaktifkan login untuk pengguna %{target}"
         memorialize_account_html: "%{name} mengubah akun %{target} jadi halaman memorial"
         promote_user_html: "%{name} mempromosikan pengguna %{target}"
+        reject_appeal_html: "%{name} menolak moderasi keputusan banding dari %{target}"
         reject_user_html: "%{name} menolak pendaftaran dari %{target}"
         remove_avatar_user_html: "%{name} menghapus avatar %{target}"
         reopen_report_html: "%{name} membuka ulang laporan %{target}"
@@ -378,8 +387,10 @@ id:
       media_storage: Penyimpanan media
       new_users: pengguna baru
       opened_reports: laporan dibuka
+      pending_appeals_html:
+        other: "<strong>%{count}</strong> banding ditunda"
       pending_reports_html:
-        other: "<strong>%{count}</strong> laporan ditunda"
+        other: "<strong>%{count}</strong> laporan banding"
       pending_tags_html:
         other: "<strong>%{count}</strong> tagar ditunda"
       pending_users_html:
@@ -392,6 +403,10 @@ id:
       top_languages: Bahasa aktif teratas
       top_servers: Server aktif teratas
       website: Situs web
+    disputes:
+      appeals:
+        empty: Tidak ada banding yang ditemukan.
+        title: Banding
     domain_allows:
       add_new: Daftar putihkan domain
       created_msg: Domain berhasil masuk daftar putih
@@ -430,7 +445,9 @@ id:
         suspend: ditangguhkan
       show:
         affected_accounts:
-          other: "%{count} akun dalam database terpengaruh"
+          one: Satu akun di basis data terpengaruh
+          other: "%{count} akun di basis data terpengaruh"
+          zero: Tidak ada akun di basis data terpengaruh
         retroactive:
           silence: Hapus pendiaman terhadap akun pada domain ini
           suspend: Hapus suspen terhadap akun pada domain ini
@@ -481,7 +498,9 @@ id:
       destroyed_msg: Data dari %{domain} masuk antrean dihapus dalam waktu dekat.
       empty: Domain tidak ditemukan.
       known_accounts:
-        other: "%{count} akun yang dikenal"
+        one: "%{count} akun dikenal"
+        other: "%{count} akun dikenal"
+        zero: Tidak ada akun yang dikenal
       moderation:
         all: Semua
         limited: Terbatas
@@ -547,10 +566,12 @@ id:
       action_log: Log audit
       action_taken_by: Aksi dilakukan oleh
       actions:
+        delete_description_html: Kiriman yang dilaporkan akan dihapus dan peringatan akan direkam untuk membantu Anda mengurus masalah oleh akun yang sama di masa mendatang.
         other_description_html: Lihat opsi lain untuk mengendalikan perilaku akun dan menyesuaikan komunikasi ke akun yang dilaporkan.
+        resolve_description_html: Tidak ada tindakan untuk akun yang dilaporkan, tidak ada peringatan yang direkam, dan laporan akan ditutup.
         silence_description_html: Profil hanya dapat terlihat oleh pengguna yang telah mengikuti atau melihatnya secara manual, yang sangat membatasi jangkauannya. Selalu dapat dipulihkan kembali.
         suspend_description_html: Profil dan semua kontennya tidak dapat diakses sampai ia terhapus. Interaksi dengan akun tersebut tidak dimungkinkan. Dapat dipulihkan dalam waktu 30 hari.
-      actions_description_html: 'Jika menghapus konten yang menyinggung perasaan di atas tidak memadai:'
+      actions_description_html: Memutuskan tindakan yang tepat untuk menyelesaikan laporan ini. Jika Anda memutuskan tindakan hukuman kepada akun terlapor, notifikasi email akan dikirim ke mereka, kecuali saat kategori <strong>Spam</strong> dipilih.
       add_to_report: Tambahkan lebih banyak untuk lapor
       are_you_sure: Apakah Anda yakin?
       assign_to_self: Tugaskan kpd saya
@@ -562,7 +583,7 @@ id:
         none: Tidak ada
       comment_description_html: 'Untuk menyediakan lebih banyak informasi, %{name} menulis:'
       created_at: Dilaporkan
-      delete_and_resolve: Hapus dan selesaikan
+      delete_and_resolve: Hapus kiriman
       forwarded: Diteruskan
       forwarded_to: Diteruskan ke %{domain}
       mark_as_resolved: Tandai telah diseleseikan
@@ -576,12 +597,14 @@ id:
         placeholder: Jelaskan aksi yang telah dilakukan, atau pembaruan lain yang berhubungan...
         title: Catatan
       notes_description_html: Lihat dan tinggalkan catatan kepada moderator lain dan Anda di masa depan
+      quick_actions_description_html: 'Lakukan tindakan cepat atau gulir ke bawah untuk melihat konten yang dilaporkan:'
       reopen: Buka lagi laporan
       report: 'Laporkan #%{id}'
       reported_account: Akun yang dilaporkan
       reported_by: Dilaporkan oleh
       resolved: Terseleseikan
       resolved_msg: Laporan berhasil diselesaikan!
+      skip_to_actions: Langsung ke tindakan
       status: Status
       statuses: Konten yang dilaporkan
       statuses_description_html: Konten menyinggung akan disampaikan saat komunikasi dengan akun yang dilaporkan
@@ -702,6 +725,16 @@ id:
       no_status_selected: Tak ada status yang berubah karena tak ada yang dipilih
       title: Status akun
       with_media: Dengan media
+    strikes:
+      actions:
+        delete_statuses: "%{name} menghapus kiriman %{target}"
+        disable: "%{name} membekukan akun %{target}"
+        none: "%{name} mengirim peringatan ke %{target}"
+        sensitive: "%{name} menandai akun %{target} sebagai sensitif"
+        silence: "%{name} membatasi akun %{target}"
+        suspend: "%{name} menangguhkan akun %{target}"
+      appeal_approved: Banding disetujui
+      appeal_pending: Banding ditunda
     system_checks:
       database_schema_check:
         message_html: Ada proses migrasi basis data tertunda. Silakan jalankan untuk memastikan aplikasi bekerja seperti yang diharapkan
@@ -724,7 +757,9 @@ id:
         disallow: Batalkan izin tautan
         disallow_provider: Batalkan izin penerbit
         shared_by_over_week:
-          other: Dibagikan oleh %{count} orang selama seminggu terakhir
+          one: Dibagikan oleh satu orang lebih dari seminggu lalu
+          other: Dibagikan oleh %{count} orang lebih dari seminggu lalu
+          zero: Tidak dibagikan siapapun lebih dari seminggu lalu
         title: Tautan sedang tren
         usage_comparison: Dibagikan %{today} kali hari ini, dibandingkan %{yesterday} kemarin
       pending_review: Tinjauan tertunda
@@ -752,7 +787,9 @@ id:
         usable: Dapat digunakan
         usage_comparison: Digunakan %{today} kali hari ini, dibandingkan %{yesterday} kemarin
         used_by_over_week:
-          other: Digunakan oleh %{count} orang selama seminggu terakhir
+          one: Dipakai oleh satu orang lebih dari seminggu lalu
+          other: Dipakai oleh %{count} orang selama seminggu terakhir
+          zero: Tidak dipakai siapapun lebih dari seminggu lalu
       title: Tren
     warning_presets:
       add_new: Tambah baru
@@ -761,6 +798,17 @@ id:
       empty: Anda belum mendefinisikan peringatan apapun.
       title: Kelola preset peringatan
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: untuk menghapus kiriman mereka
+        disable: untuk membekukan akun mereka
+        none: peringatan
+        sensitive: untuk menandai akun mereka sebagai sensitif
+        silence: untuk membatasi akun mereka
+        suspend: untuk menangguhkan akun mereka
+      body: "%{target} melakukan banding keputusan moderasi oleh %{action_taken_by} dari %{date}, yang %{type}. Mereka menulis:"
+      next_steps: Anda dapat menyetujui banding untuk mengurungkan keputusan moderasi atau mengabaikannya.
+      subject: "%{username} melakukan banding keputusan moderasi di %{instance}"
     new_pending_account:
       body: Detail akun baru di bawah. Anda dapat menyetujui atau menolak lamaran ini.
       subject: Akun baru muncul untuk ditinjau di %{instance} (%{username})
@@ -851,7 +899,6 @@ id:
     status:
       account_status: Status akun
       confirming: Menunggu konfirmasi email diselesaikan.
-      functional: Akun Anda kini beroperasi penuh.
       pending: Permintaan Anda sedang ditinjau oleh staf kami. Ini mungkin butuh beberapa waktu. Anda akan menerima email jika permintaan Anda diterima.
       redirecting_to: Akun Anda tidak aktif karena sekarang dialihkan ke %{acct}.
     too_fast: Formulir dikirim terlalu cepat, coba lagi.
@@ -917,6 +964,32 @@ id:
     directory: Direktori profil
     explanation: Temukan pengguna berdasarkan minatnya
     explore_mastodon: Jelajahi %{title}
+  disputes:
+    strikes:
+      action_taken: Tindakan dilaksanakan
+      appeal: Banding
+      appeal_approved: Peringatan ini digagalkan dalam banding dan tidak lagi valid
+      appeal_rejected: Banding telah ditolak
+      appeal_submitted_at: Banding dikirimkan
+      appealed_msg: Banding Anda sudah dikirim. Jika disetujui, Anda akan diberi tahu.
+      appeals:
+        submit: Ajukan banding
+      associated_report: Laporan yang berkaitan
+      created_at: Tanggal
+      recipient: Dialamatkan untuk
+      status: 'Kiriman #%{id}'
+      status_removed: Kirim sudah dihapus dari sistem
+      title: "%{action} dari %{date}"
+      title_actions:
+        delete_statuses: Penghapusan kiriman
+        disable: Pembekuan akun
+        none: Peringatan
+        sensitive: Tandai akun sebagai sensitif
+        silence: Pembatasan akun
+        suspend: Penangguhan akun
+      your_appeal_approved: Banding Anda disetujui
+      your_appeal_pending: Anda telah mengirim banding
+      your_appeal_rejected: Banding Anda ditolak
   domain_validator:
     invalid_domain: bukan nama domain yang valid
   errors:
@@ -1124,6 +1197,8 @@ id:
       title: Boost baru
     status:
       subject: "%{name} baru saja memposting"
+    update:
+      subject: "%{name} mengedit kiriman"
   notifications:
     email_events: Event untuk notifikasi email
     email_events_hint: 'Pilih event yang ingin Anda terima notifikasinya:'
@@ -1205,6 +1280,9 @@ id:
     reply:
       proceed: Lanjutkan ke balasan
       prompt: 'Anda ingin membalas toot ini:'
+  reports:
+    errors:
+      invalid_rules: tidak mereferensikan aturan yang valid
   scheduled_statuses:
     over_daily_limit: Anda telah melampaui batas %{limit} toot terjadwal untuk sehari
     over_total_limit: Anda telah melampaui batas %{limit} toot terjadwal
@@ -1465,6 +1543,15 @@ id:
     recovery_instructions_html: Jika anda kehilangan akses pada handphone anda, anda bisa menggunakan kode pemulihan dibawah ini untuk mendapatkan kembali akses pada akun anda. Simpan kode pemulihan anda baik-baik, misalnya dengan mencetaknya atau menyimpannya bersama dokumen penting lainnya.
     webauthn: Kunci keamanan
   user_mailer:
+    appeal_approved:
+      action: Ke akun Anda
+      explanation: Banding peringatan terhadap akun Anda pada %{strike_date} yang Anda kirim pada %{appeal_date} telah disetujui. Akun Anda akan kembali ditandai sebagai akun bagus.
+      subject: Banding Anda dari %{date} telah disetujui
+      title: Banding disetujui
+    appeal_rejected:
+      explanation: Banding terhadap akun Anda pada %{strike_date} yang Anda ajukan %{appeal_date} telah ditolak.
+      subject: Banding Anda dari %{date} telah ditolak
+      title: Banding ditolak
     backup_ready:
       explanation: Cadangan penuh akun Mastodon Anda sudah dapat diunduh!
       subject: Arsip Anda sudah siap diunduh
@@ -1476,6 +1563,8 @@ id:
       subject: Harap konfirmasi usaha masuk akun
       title: Usaha masuk akun
     warning:
+      appeal: Ajukan banding
+      appeal_description: Jika Anda yakin ini galat, Anda dapat mengajukan banding ke staf %{instance}.
       categories:
         spam: Spam
         violation: Konten melanggar panduan komunitas berikut
@@ -1487,7 +1576,6 @@ id:
         suspend: Anda tidak dapat menggunakan akun Anda, dan profil serta data lain Anda tidak lagi dapat diakses. Anda masih tetap bisa masuk akun untuk minta cadangan data sampai data Anda akan dihapus permanen 30 hari lagi, tapi kami akan menyimpan beberapa data dasar untuk mencegah Anda menghindari penangguhan.
       get_in_touch: Jika Anda yakin ini kesalahan, Anda dapat membalas email ini untuk menghubungi staf %{instance}.
       reason: 'Alasan:'
-      review_server_policies: Tinjau kebijakan server
       statuses: 'Postingan yang telah terbukti pelanggarannya:'
       subject:
         delete_statuses: Postingan anda pada %{acct} telah dihapus
diff --git a/config/locales/is.yml b/config/locales/is.yml
index 3a1896df1..3d073e158 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -1,7 +1,7 @@
 ---
 is:
   about:
-    about_hashtag_html: Þetta eru opinber skilaboð sem merkt eru með <strong>#%{hashtag}</strong>. Þú getur unnið með þau ef þú ert með skráðan aðgang einhversstaðar í skýjasambandinu.
+    about_hashtag_html: Þetta eru opinberar færslur sem merkt eru með <strong>#%{hashtag}</strong>. Þú getur unnið með þau ef þú ert með skráðan aðgang einhversstaðar í skýjasambandinu.
     about_mastodon_html: 'Samfélagsnet framtíðarinnar: Engar auglýsingar, ekkert eftirlit stórfyrirtækja, siðleg hönnun og engin miðstýring! Þú átt þín eigin gögn í Mastodon!'
     about_this: Um hugbúnaðinn
     active_count_after: virkt
@@ -10,7 +10,7 @@ is:
     api: API-kerfisviðmót
     apps: Farsímaforrit
     apps_platforms: Notaðu Mastodon frá iOS, Android og öðrum stýrikerfum
-    browse_directory: Skoða notandasniðamöppu og sía eftir áhugamálum
+    browse_directory: Skoða notendur og sía eftir áhugamálum
     browse_local_posts: Skoðaðu kvikt streymi af opinberum færslum á þessum vefþjóni
     browse_public_posts: Skoðaðu kvikt streymi af opinberum færslum á Mastodon
     contact: Hafa samband
@@ -32,8 +32,8 @@ is:
     server_stats: 'Tölfræði þjóns:'
     source_code: Grunnkóði
     status_count_after:
-      one: stöðufærsla
-      other: stöðufærslur
+      one: færsla
+      other: færslur
     status_count_before: Sem stóðu fyrir
     tagline: Fylgstu með vinum og uppgötvaðu nýja
     terms: Þjónustuskilmálar
@@ -76,10 +76,10 @@ is:
     pin_errors:
       following: Þú þarft að vera þegar að fylgjast með þeim sem þú ætlar að mæla með
     posts:
-      one: Tíst
-      other: Tíst
-    posts_tab_heading: Tíst
-    posts_with_replies: Tíst og svör
+      one: Færsla
+      other: Færslur
+    posts_tab_heading: Færslur
+    posts_with_replies: Færslur og svör
     roles:
       admin: Stjóri
       bot: Róbót
@@ -94,7 +94,6 @@ is:
     account_moderation_notes:
       create: Skilja eftir minnispunkt
       created_msg: Tókst að útbúa minnispunkt umsjónarmanns!
-      delete: Eyða
       destroyed_msg: Tókst að eyða minnispunkti umsjónarmanns!
     accounts:
       add_email_domain_block: Útiloka tölvupóstlén
@@ -163,6 +162,11 @@ is:
       not_subscribed: Ekki í áskrift
       pending: Bíður eftir yfirlestri
       perform_full_suspension: Setja í bið
+      previous_strikes: Fyrri refsingar
+      previous_strikes_description_html:
+        one: Þessi notandaaðgangur er með <strong>eina</strong> refsingu.
+        other: Þessi notandaaðgangur er með <strong>%{count}</strong> refsingar.
+        zero: Þessi notandaaðgangur er <strong>í góðu lagi</strong>.
       promote: Hækka í tign
       protocol: Samskiptamáti
       public: Opinber
@@ -203,14 +207,15 @@ is:
         targeted_reports: Kært af öðrum
       silence: Hylja
       silenced: Hulið
-      statuses: Stöðufærslur
+      statuses: Færslur
       strikes: Fyrri refsingar
       subscribe: Gerast áskrifandi
+      suspend: Setja í bið
       suspended: Í bið
       suspension_irreversible: Gögnunum á þessum notandaaðgangi hefur verið eytt óafturkræft. Þú getur tekið aðganginn úr bið svo hægt sé að nota hann, en það mun ekki endurheimta neitt af þeim gögnum sem á honum voru áður.
       suspension_reversible_hint_html: Notandaaðgangurin hefur verið settur í biðstöðu og gögnunum á honum verður eytt að fullu þann %{date}. Þangað til væri hægt að endurheimta aðganginn úr bið án nokkurra breytinga. Ef þú vilt eyða öllum gögnum af honum strax, geturðu gert það hér fyrir neðan.
       title: Notandaaðgangar
-      unblock_email: Leyfa tölvupóstfang
+      unblock_email: Aflétta útilokun tölvupóstfangs
       unblocked_email_msg: Tókst að afbanna tölvupóstfang notandans %{username}
       unconfirmed_email: Óstaðfestur tölvupóstur
       undo_sensitized: Afturkalla merkingu sem viðkvæmt
@@ -226,6 +231,7 @@ is:
       whitelisted: Á lista yfir leyft
     action_logs:
       action_types:
+        approve_appeal: Samþykkja áfrýjun
         approve_user: Samþykkja notanda
         assigned_to_self_report: Úthluta kæru
         change_email_user: Skipta um tölvupóstfang notanda
@@ -234,19 +240,19 @@ is:
         create_announcement: Búa til tilkynningu
         create_custom_emoji: Búa til sérsniðið tjáningartákn
         create_domain_allow: Búa til lén leyft
-        create_domain_block: Búa til lén bannað
-        create_email_domain_block: Búa til tölvupóstfang bannað
+        create_domain_block: Búa til útilokun léns
+        create_email_domain_block: Búa til útilokun tölvupóstléns
         create_ip_block: Búa til IP-reglu
         create_unavailable_domain: Útbúa lén sem ekki er tiltækt
         demote_user: Lækka notanda í tign
         destroy_announcement: Eyða tilkynningu
         destroy_custom_emoji: Eyða sérsniðnu tjáningartákni
         destroy_domain_allow: Eyða léni leyft
-        destroy_domain_block: Eyða léni bannað
-        destroy_email_domain_block: Eyða tölvupóstfangi bannað
+        destroy_domain_block: Eyða útilokun léns
+        destroy_email_domain_block: Eyða útilokun tölvupóstléns
         destroy_instance: Henda léni
         destroy_ip_block: Eyða IP-reglu
-        destroy_status: Eyða stöðufærslu
+        destroy_status: Eyða færslu
         destroy_unavailable_domain: Eyða léni sem ekki er tiltækt
         disable_2fa_user: Gera tveggja-þátta auðkenningu óvirka
         disable_custom_emoji: Gera sérsniðið tjáningartákn óvirkt
@@ -257,6 +263,7 @@ is:
         enable_user: Virkja notanda
         memorialize_account: Gera aðgang að minningargrein
         promote_user: Hækka notanda í tign
+        reject_appeal: Hafna áfrýjun
         reject_user: Hafna notanda
         remove_avatar_user: Fjarlægja auðkennismynd
         reopen_report: Enduropna kæru
@@ -273,8 +280,9 @@ is:
         update_announcement: Uppfæra tilkynningu
         update_custom_emoji: Uppfæra sérsniðið tjáningartákn
         update_domain_block: Uppfæra útilokun léns
-        update_status: Uppfæra stöðufærslu
+        update_status: Uppfæra færslu
       actions:
+        approve_appeal_html: "%{name} samþykkti áfrýjun á ákvörðun umsjónarmanns frá %{target}"
         approve_user_html: "%{name} samþykkti nýskráningu frá %{target}"
         assigned_to_self_report_html: "%{name} úthlutaði kæru %{target} til sín"
         change_email_user_html: "%{name} breytti tölvupóstfangi fyrir notandann %{target}"
@@ -295,7 +303,7 @@ is:
         destroy_email_domain_block_html: "%{name} aflétti útilokun af póstléninu %{target}"
         destroy_instance_html: "%{name} henti léninu %{target}"
         destroy_ip_block_html: "%{name} eyddi reglu fyrir IP-vistfangið %{target}"
-        destroy_status_html: "%{name} fjarlægði stöðufærslu frá %{target}"
+        destroy_status_html: "%{name} fjarlægði færslu frá %{target}"
         destroy_unavailable_domain_html: "%{name} hóf aftur afhendingu til lénsins %{target}"
         disable_2fa_user_html: "%{name} gerði kröfu um tveggja-þátta innskráningu óvirka fyrir notandann %{target}"
         disable_custom_emoji_html: "%{name} gerði tjáningartáknið %{target} óvirkt"
@@ -306,6 +314,7 @@ is:
         enable_user_html: "%{name} gerði innskráningu virka fyrir notandann %{target}"
         memorialize_account_html: "%{name} breytti notandaaðgangnum %{target} í minningargreinarsíðu"
         promote_user_html: "%{name} hækkaði notandann %{target} í tign"
+        reject_appeal_html: "%{name} hafnaði áfrýjun á ákvörðun umsjónarmanns frá %{target}"
         reject_user_html: "%{name} hafnaði nýskráningu frá %{target}"
         remove_avatar_user_html: "%{name} fjarlægði auðkennismynd af %{target}"
         reopen_report_html: "%{name} enduropnaði kæru %{target}"
@@ -321,9 +330,9 @@ is:
         unsuspend_account_html: "%{name} tók notandaaðganginn %{target} úr bið"
         update_announcement_html: "%{name} uppfærði tilkynningu %{target}"
         update_custom_emoji_html: "%{name} uppfærði tjáningartáknið %{target}"
-        update_domain_block_html: "%{name} uppfærði lénalás fyrir %{target}"
-        update_status_html: "%{name} uppfærði stöðufærslu frá %{target}"
-      deleted_status: "(eydd stöðufærsla)"
+        update_domain_block_html: "%{name} uppfærði útilokun lénsins %{target}"
+        update_status_html: "%{name} uppfærði færslu frá %{target}"
+      deleted_status: "(eydd færsla)"
       empty: Engar atvikaskrár fundust.
       filter_by_action: Sía eftir aðgerð
       filter_by_user: Sía eftir notanda
@@ -384,14 +393,17 @@ is:
       media_storage: Geymsla myndefnis
       new_users: nýir notendur
       opened_reports: kærur opnaðar
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> áfrýjun í bið"
+        other: "<strong>%{count}</strong> áfrýjanir í bið"
       pending_reports_html:
-        one: "<strong>1</strong> kæra í bið"
+        one: "<strong>%{count}</strong> kæra í bið"
         other: "<strong>%{count}</strong> kærur í bið"
       pending_tags_html:
-        one: "<strong>1</strong> myllumerki í bið"
+        one: "<strong>%{count}</strong> myllumerki í bið"
         other: "<strong>%{count}</strong> myllumerki í bið"
       pending_users_html:
-        one: "<strong>1</strong> notandi í bið"
+        one: "<strong>%{count}</strong> notandi í bið"
         other: "<strong>%{count}</strong> notendur í bið"
       resolved_reports: kærur leystar
       software: Hugbúnaður
@@ -401,6 +413,10 @@ is:
       top_languages: Virkustu tungumál
       top_servers: Virkustu netþjónar
       website: Vefsvæði
+    disputes:
+      appeals:
+        empty: Engar áfrýjanir fundust.
+        title: Áfrýjanir
     domain_allows:
       add_new: Setja lén á lista yfir leyft
       created_msg: Það tókst að setja lénið á lista yfir leyft
@@ -423,7 +439,7 @@ is:
           suspend: Setja í bið
         title: Ný útilokun á léni
       obfuscate: Gera heiti léns ólæsilegt
-      obfuscate_hint: Gera heiti léns ólæsilegt að hluta í listanum ef auglýsing er virk fyrir lista yfir takmarkanir léna
+      obfuscate_hint: Gera heiti léns ólæsilegt að hluta í listanum ef auglýsing yfir takmarkanir léna er virk
       private_comment: Einkaathugasemd
       private_comment_hint: Athugasemd um þessa útilokun á léni til innanhússnotkunar fyrir umsjónarmenn.
       public_comment: Opinber athugasemd
@@ -435,14 +451,15 @@ is:
       rejecting_media: hafna myndskrám
       rejecting_reports: hafna kærum
       severity:
-        silence: hulið
+        silence: takmarkað
         suspend: í bið
       show:
         affected_accounts:
           one: Einn notandaaðgangur í gagnagrunninum kemur við sögu
           other: "%{count} notendaaðgangar í gagnagrunninum koma við sögu"
+          zero: Enginn notandaaðgangur í gagnagrunninum kemur við sögu
         retroactive:
-          silence: Hætta að hylja viðkomandi notendaaðganga frá þessu léni
+          silence: Hætta að takmarka viðkomandi notendaaðganga frá þessu léni
           suspend: Taka úr bið viðkomandi notendaaðganga frá þessu léni
         title: Afturkalla útilokun á léni fyrir %{domain}
         undo: Afturkalla
@@ -450,16 +467,16 @@ is:
       view: Skoða útilokun á léni
     email_domain_blocks:
       add_new: Bæta við nýju
-      created_msg: Tókst að bæta póstléni á lista yfir bannað
+      created_msg: Tókst að útiloka póstlén
       delete: Eyða
-      destroyed_msg: Tókst að eyða póstléni af lista yfir bannað
+      destroyed_msg: Tókst að aflétta útilokun af póstléni
       domain: Lén
-      empty: Engin tölvupóstlén eru á bannlista.
+      empty: Engin tölvupóstlén eru útilokuð.
       from_html: frá %{domain}
       new:
         create: Bæta við léni
-        title: Ný færsla á bannlista fyrir tölvupóstföng
-      title: Bannlisti yfir tölvupóstföng
+        title: Útiloka nýtt tölvupóstlén
+      title: Útilokuð tölvupóstlén
     follow_recommendations:
       description_html: "<strong>Að fylgja meðmælum hjálpar nýjum notendum að finna áhugavert efni á einfaldan máta</strong>. Þegar notandi hefur ekki átt í nægilegum samskiptum við aðra til að vera farinn að móta sér skoðanir á hverju hann vill fylgjast með, er mælt með að fylgjast með þessum aðgöngum. Þeir eru endurreiknaðir daglega út frá blöndu þeirra aðganga sem eru með hvað mestri þáttöku í umræðum og mesta fylgjendafjölda út frá hverju tungumáli."
       language: Fyrir tungumálið
@@ -494,6 +511,7 @@ is:
       known_accounts:
         one: "%{count} þekktur notandaaðgangur"
         other: "%{count} þekktir notendaaðgangar"
+        zero: Enginn þekktur notandaaðgangur
       moderation:
         all: Allt
         limited: Takmarkað
@@ -502,7 +520,7 @@ is:
       public_comment: Opinber athugasemd
       purge: Henda
       title: Samband
-      total_blocked_by_us: Útilokaðir af okkur
+      total_blocked_by_us: Útilokað af okkur
       total_followed_by_them: Fylgt af þeim
       total_followed_by_us: Fylgt af okkur
       total_reported: Kærur um þá
@@ -535,11 +553,11 @@ is:
     relays:
       add_new: Bæta við nýjum endurvarpa
       delete: Eyða
-      description_html: "<strong>Endurvarpi í skýjasambandi</strong> er milliþjónn sem skiptist á miklu magni opinberra tísta við aðra þjóna sem eru áskrifendur að honum og birta sín tíst á honum. <strong>Þetta getur hjálpað litlum og meðalstórum vefþjónum að uppgötva efni úr skýjasambandinu</strong>, sem annars myndi krefjast þess að staðværir notendur fylgist handvirkt með öðru fólki á fjartengdum vefþjónum."
+      description_html: "<strong>Endurvarpi í skýjasambandi</strong> er milliþjónn sem skiptist á miklu magni opinberra færslna við aðra þjóna sem eru áskrifendur að honum og birta sín tíst á honum. <strong>Þetta getur hjálpað litlum og meðalstórum vefþjónum að uppgötva efni úr skýjasambandinu</strong>, sem annars myndi krefjast þess að staðværir notendur fylgist handvirkt með öðru fólki á fjartengdum vefþjónum."
       disable: Gera óvirkt
       disabled: Óvirkt
       enable: Virkja
-      enable_hint: Ef þetta er einu sinni virkjað, mun vefþjónninn þinn gerast áskrifandi að öllum opinberum tístum frá þessum endurvarpa og byrja að senda sín eigin opinberu tíst til hans.
+      enable_hint: Ef þetta er einu sinni virkjað, mun vefþjónninn þinn gerast áskrifandi að öllum opinberum færslum frá þessum endurvarpa og byrja að senda sín eigin opinberu tíst til hans.
       enabled: Virkt
       inbox_url: Slóð endurvarpa
       pending: Bíð eftir samþykki endurvarpa
@@ -560,10 +578,12 @@ is:
       action_log: Atvikaskrá
       action_taken_by: Aðgerð framkvæmd af
       actions:
+        delete_description_html: Kærðum færslum verður eytt og refsing skráð svo þú eigir auðveldara með að bregðast við í framtíðinni verði um fleiri brot að ræða frá sama notandaaðgangi.
         other_description_html: Skoðaðu fleir valkosti fyrir stjórnun á hegðun notandaaðgangsins og til að stýra samskiptum við kærðan notandaaðgang.
+        resolve_description_html: Til engra aðgerða verður tekið gagnvart kærðum færslum, engin refsing verður skráð og kærunni verður lokað.
         silence_description_html: Notandaaðgangurinn verður einungis sýnilegur þeim sem þegar fylgjast með honum eða sem fletta honum upp handvirkt, sem takmarkar útbreiðslu efnis verulega. Er alltaf hægt að afturkalla.
         suspend_description_html: Notandaaðgangurinn og allt efni á honum mun verða óaðgengilegt og á endanum eytt út. Samskipti við aðganginn verða ekki möguleg. Hægt að afturkalla innan 30 daga.
-      actions_description_html: 'Ef það að fjarlægja óviðeigandi efnið hér fyrir ofan er ekki nægilegt:'
+      actions_description_html: Ákveddu til hvaða aðgerða eigi að taka til að leysa þessa kæru. Ef þú ákveður að refsa kærða notandaaðgangnum, verður viðkomandi send tilkynning í tölvupósti, nema ef flokkurinn <strong>Ruslpóstur</strong> sé valinn.
       add_to_report: Bæta fleiru í kæru
       are_you_sure: Ertu viss?
       assign_to_self: Úthluta mér
@@ -575,7 +595,7 @@ is:
         none: Ekkert
       comment_description_html: 'Til að gefa nánari upplýsingar skrifaði %{name}:'
       created_at: Tilkynnt
-      delete_and_resolve: Eyða og leysa
+      delete_and_resolve: Eyða færslum
       forwarded: Áframsent
       forwarded_to: Áframsent á %{domain}
       mark_as_resolved: Merkja sem leyst
@@ -589,12 +609,14 @@ is:
         placeholder: Lýstu til hvaða aðgerða hefur verið gripið eða uppfærðu inn aðrar tengdar upplýsingar...
         title: Minnispunktar
       notes_description_html: Skoðaðu og skrifaðu minnispunkta til annarra stjórnenda og sjálfs þín
+      quick_actions_description_html: 'Beittu flýtiaðgerð eða skrunaðu niður til að skoða kært efni:'
       reopen: Enduropna kæru
       report: 'Kæra #%{id}'
       reported_account: Kærður notandaaðgangur
       reported_by: Kært af
       resolved: Leyst
       resolved_msg: Það tókst að leysa kæruna!
+      skip_to_actions: Sleppa og fara í aðgerðir
       status: Staða
       statuses: Kært efni
       statuses_description_html: Óviðeigandi efni verður tiltekið í samskiptum við kærðan notandaaðgang
@@ -613,7 +635,7 @@ is:
       title: Reglur netþjónsins
     settings:
       activity_api_enabled:
-        desc_html: Fjöldi staðværra stöðufærslna, virkra notenda og nýskráninga í vikulegum skömmtum
+        desc_html: Fjöldi staðvært birtra færslna, virkra notenda og nýskráninga í vikulegum skömmtum
         title: Birta samantektartölfræði um virkni notanda
       bootstrap_timeline_accounts:
         desc_html: Aðskildu mörg notendanöfn með kommum. Einungis staðværir og ólæstir aðgangar virka. Þegar þetta er autt er sjálgefið miðað við alla staðværa stjórnendur.
@@ -712,9 +734,19 @@ is:
       deleted: Eytt
       media:
         title: Myndefni
-      no_status_selected: Engum stöðufærslum var breytt þar sem engar voru valdar
-      title: Staða notendaaðganga
+      no_status_selected: Engum færslum var breytt þar sem engar voru valdar
+      title: Færslur notandaaðgangs
       with_media: Með myndefni
+    strikes:
+      actions:
+        delete_statuses: "%{name} eyddi færslum frá %{target}"
+        disable: "%{name} frysti aðganginn %{target}"
+        none: "%{name} sendi aðvörun til %{target}"
+        sensitive: "%{name} merkti efni frá %{target} sem viðkvæmt"
+        silence: "%{name} takmarkaði aðganginn %{target}"
+        suspend: "%{name} setti notandaaðganginn %{target} í bið"
+      appeal_approved: Áfrýjað
+      appeal_pending: Áfrýjun í bið
     system_checks:
       database_schema_check:
         message_html: Það eru fyrirliggjandi yfirfærslur á gagnagrunnum. Keyrðu þær til að tryggja að forritið hegði sér eins og skyldi
@@ -739,6 +771,7 @@ is:
         shared_by_over_week:
           one: Deilt af einum aðila síðustu vikuna
           other: Deilt af %{count} aðilum síðustu vikuna
+          zero: Ekki deilt af neinum aðila síðustu vikuna
         title: Vinsælir tenglar
         usage_comparison: Deilt %{today} sinnum í dag, samanborið við %{yesterday} í gær
       pending_review: Bíður eftir yfirlestri
@@ -768,6 +801,7 @@ is:
         used_by_over_week:
           one: Notað af einum aðila síðustu vikuna
           other: Notað af %{count} aðilum síðustu vikuna
+          zero: Ekki notað af neinum aðila síðustu vikuna
       title: Tilhneiging
     warning_presets:
       add_new: Bæta við nýju
@@ -776,6 +810,17 @@ is:
       empty: Þú hefur ekki enn skilgreint neinar aðvaranaforstillingar.
       title: Sýsla með forstilltar aðvaranir
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: að eyða færslum viðkomandi
+        disable: að frysta aðgang viðkomandi
+        none: aðvörun
+        sensitive: að merkja efni á aðgangnum sem viðkvæmt
+        silence: að takmarka aðgang viðkomandi
+        suspend: að setja aðgang viðkomandi í bið
+      body: "%{target} er að áfrýja ákvörðun umsjónarmanns tekinni af %{action_taken_by} frá %{date}, sem var %{type}. Viðkomandi skrifaði:"
+      next_steps: Þú getur samþykkt áfrýjunina til að afturkalla ákvörðun umsjónarmanns, eða hunsað hana.
+      subject: "%{username} er að áfrýja ákvörðun umsjónarmanns tekinni á %{instance}"
     new_pending_account:
       body: Nákvæmari upplýsingar um nýja notandaaðganginn eru hér fyrir neðan. Þú getur samþykkt eða hafnað þessari umsókn.
       subject: Nýr notandaaðgangur er kominn til yfirferðar á %{instance} (%{username})
@@ -811,14 +856,14 @@ is:
       guide_link: https://crowdin.com/project/mastodon/is
       guide_link_text: Allir geta tekið þátt.
     sensitive_content: Viðkvæmt efni
-    toot_layout: Framsetning tísta
+    toot_layout: Framsetning færslu
   application_mailer:
     notification_preferences: Breyta kjörstillingum tölvupósts
     salutation: "%{name},"
     settings: 'Breyta kjörstillingum tölvupósts: %{link}'
     view: 'Skoða:'
     view_profile: Skoða notandasnið
-    view_status: Skoða stöðufærslu
+    view_status: Skoða færslu
   applications:
     created: Það tókst að búa til forrit
     destroyed: Það tókst að eyða forriti
@@ -837,7 +882,7 @@ is:
     description:
       prefix_invited_by_user: "@%{name} býður þér að taka þátt á þessum Mastodon-vefþjóni!"
       prefix_sign_up: Skráðu þig á Mastodon strax í dag!
-      suffix: Með notandaaðgangi geturðu fylgst með fólki, sent inn stöðufærslur og skipst á skilaboðum við notendur á hvaða Mastodon-vefþjóni sem er, auk margs fleira!
+      suffix: Með notandaaðgangi geturðu fylgst með fólki, sent inn færslur og skipst á skilaboðum við notendur á hvaða Mastodon-vefþjóni sem er, auk margs fleira!
     didnt_get_confirmation: Fékkstu ekki leiðbeiningar um hvernig eigi að staðfesta aðganginn?
     dont_have_your_security_key: Ertu ekki með öryggislykilinn þinn?
     forgot_password: Gleymdirðu lykilorðinu?
@@ -866,7 +911,6 @@ is:
     status:
       account_status: Staða notandaaðgangs
       confirming: Bíð eftir að staðfestingu tölvupósts sé lokið.
-      functional: Notandaaðgangurinn þinn er með fulla virkni.
       pending: Umsóknin þín bíður eftir að starfsfólkið okkar fari yfir hana. Það gæti tekið nokkurn tíma. Þú munt fá tölvupóst ef umsóknin er samþykkt.
       redirecting_to: Notandaaðgangurinn þinn er óvirkur vegna þess að hann endurbeinist á %{acct}.
     too_fast: Innfyllingarform sent inn of hratt, prófaðu aftur.
@@ -932,6 +976,32 @@ is:
     directory: Notandasniðamappa
     explanation: Leitaðu að notendum eftir áhugamálum þeirra
     explore_mastodon: Kannaðu %{title}
+  disputes:
+    strikes:
+      action_taken: Framkvæmd aðgerð
+      appeal: Áfrýja
+      appeal_approved: Þessari refsingu hefur verið áfrýjað með góðum árangri og hún því ekki lengur í gildi
+      appeal_rejected: Áfrýjuninni hefur verið hafnað
+      appeal_submitted_at: Áfrýjun send inn
+      appealed_msg: Áfrýjun þín hefur verið sen dinn. Þú verður látin/n vita ef hún verður samþykkt.
+      appeals:
+        submit: Senda inn áfrýjun
+      associated_report: Tengd kæra
+      created_at: Dagsett
+      recipient: Stílað til
+      status: 'Færsla #%{id}'
+      status_removed: Færsla þegar fjarlægð úr kerfinu
+      title: "%{action} frá %{date}"
+      title_actions:
+        delete_statuses: Fjarlæging færslu
+        disable: Frysting aðgangs
+        none: Aðvörun
+        sensitive: Efni verður merkt sem viðkvæmt frá aðgangnum
+        silence: Takmörkun aðgangs
+        suspend: Setja aðgang í bið
+      your_appeal_approved: Áfrýjun þín hefur verið samþykkt
+      your_appeal_pending: Þú hefur sent inn áfrýjun
+      your_appeal_rejected: Áfrýjun þinni hefur verið hafnað
   domain_validator:
     invalid_domain: er ekki leyfilegt nafn á léni
   errors:
@@ -956,7 +1026,7 @@ is:
     archive_takeout:
       date: Dagsetning
       download: Náðu í safnskrána þína
-      hint_html: Þú getur beðið um safnskrá með <strong>tístunum þínum og innsendu myndefni</strong>. Útfluttu gögnin verða á ActivityPub-sniði, sem allur samhæfður hugbúnaður á að geta lesið. Þú getur beðið um safnskrá á 7 daga fresti.
+      hint_html: Þú getur beðið um safnskrá með <strong>færslunum þínum og innsendu myndefni</strong>. Útfluttu gögnin verða á ActivityPub-sniði, sem allur samhæfður hugbúnaður á að geta lesið. Þú getur beðið um safnskrá á 7 daga fresti.
       in_progress: Set saman safnskrána þína...
       request: Biddu um safnskrána þína
       size: Stærð
@@ -1065,7 +1135,7 @@ is:
     title: Auðkenningarferill
   media_attachments:
     validations:
-      images_and_video: Ekki er hægt að hengja myndskeið við stöðufærslu sem þegar inniheldur myndir
+      images_and_video: Ekki er hægt að hengja myndskeið við færslu sem þegar inniheldur myndir
       not_ready: Ekki er hægt að hengja við skrár sem ekki er búið að vinna til fulls. Prófaðu aftur eftir augnablik!
       too_many: Ekki er hægt að hengja við fleiri en 4 skrár
   migrations:
@@ -1118,8 +1188,8 @@ is:
         other: "%{count} nýjar tilkynningar síðan þú leist inn síðast \U0001F418"
       title: Á meðan þú varst fjarverandi...
     favourite:
-      body: 'Stöðufærslan þín var sett í eftirlæti af %{name}:'
-      subject: "%{name} setti stöðufærslu þína í eftirlæti"
+      body: 'Færslan þín var sett í eftirlæti af %{name}:'
+      subject: "%{name} setti færsluna þína í eftirlæti"
       title: Nýtt eftirlæti
     follow:
       body: "%{name} er núna að fylgjast með þér!"
@@ -1138,11 +1208,13 @@ is:
     poll:
       subject: Könnun frá %{name} er lokið
     reblog:
-      body: "%{name} endurbirti stöðufærsluna þína:"
-      subject: "%{name} endurbirti stöðufærsluna þína"
+      body: "%{name} endurbirti færsluna þína:"
+      subject: "%{name} endurbirti færsluna þína"
       title: Ný endurbirting
     status:
       subject: "%{name} sendi inn rétt í þessu"
+    update:
+      subject: "%{name} breytti færslu"
   notifications:
     email_events: Atburðir fyrir tilkynningar í tölvupósti
     email_events_hint: 'Veldu þá atburði sem þú vilt fá tilkynningar í tölvupósti þegar þeir koma upp:'
@@ -1217,19 +1289,19 @@ is:
   remote_interaction:
     favourite:
       proceed: Halda áfram í að setja í eftirlæti
-      prompt: 'Þú ætlar að setja þetta tíst í eftirlæti:'
+      prompt: 'Þú ætlar að setja þessa færslu í eftirlæti:'
     reblog:
       proceed: Halda áfram í endurbirtingu
-      prompt: 'Þú ætlar að endurbirta þetta tíst:'
+      prompt: 'Þú ætlar að endurbirta þessa færslu:'
     reply:
       proceed: Halda áfram í að svara
-      prompt: 'Þú ætlar að svara þessu tísti:'
+      prompt: 'Þú ætlar að svara þessari færslu:'
   reports:
     errors:
       invalid_rules: vísar ekki til gildra reglna
   scheduled_statuses:
-    over_daily_limit: Þú hefur farið fram úr hámarkinu með %{limit} áætluð tíst fyrir þennan dag
-    over_total_limit: Þú hefur farið fram úr hámarkinu með %{limit} áætluð tíst
+    over_daily_limit: Þú hefur farið fram úr hámarkinu með %{limit} áætlaðar færslur fyrir þennan dag
+    over_total_limit: Þú hefur farið fram úr hámarkinu með %{limit} áætlaðar færslur
     too_soon: Áætluð dagsetning verður að vera í framtíðinni
   sessions:
     activity: Síðasta virkni
@@ -1315,13 +1387,13 @@ is:
       other: 'innihélt óleyfilegu myllumerkin: %{tags}'
     edited_at: Breytt %{date}
     errors:
-      in_reply_not_found: Stöðufærslan sem þú ert að reyna að svara að er líklega ekki til.
+      in_reply_not_found: Færslan sem þú ert að reyna að svara að er líklega ekki til.
     open_in_web: Opna í vafra
     over_character_limit: hámarksfjölda stafa (%{max}) náð
     pin_errors:
-      direct: Ekki er hægt að festa skilaboð sem einungis eru sýnileg þeim notendum sem minnst er á
-      limit: Þú hefur þegar fest leyfilegan hámarksfjölda tísta
-      ownership: Tíst frá einhverjum öðrum er ekki hægt að festa
+      direct: Ekki er hægt að festa færslur sem einungis eru sýnilegar þeim notendum sem minnst er á
+      limit: Þú hefur þegar fest leyfilegan hámarksfjölda færslna
+      ownership: Færslur frá einhverjum öðrum er ekki hægt að festa
       reblog: Ekki er hægt að festa endurbirtingu
     poll:
       total_people:
@@ -1380,7 +1452,7 @@ is:
     min_reblogs: Halda færslum sem eru endurbirtar oftar en
     min_reblogs_hint: Eyðir ekki þínum eigin færslum sem endurbirtar hafa verið þetta oft. Skildu þetta eftir autt til að eyða færslum burtséð frá fjölda endurbirtinga
   stream_entries:
-    pinned: Fest tíst
+    pinned: Fest færsla
     reblogged: endurbirt
     sensitive_content: Viðkvæmt efni
   tags:
@@ -1392,7 +1464,7 @@ is:
 
       <ul>
       <li><em>Grunnupplýsingar um notandaaðgang</em>: Ef þú skráir þig á þessum netþjóni gætirðu verið beðinn um að slá inn notandanafn, tölvupóstfang og lykilorð. Þú getur einnig sett inn viðbótarupplýsingar eins og birtingarnafn og æviágrip auk þess að hlaða inn auðkennismynd eða mynd til að birta á síðuhaus. Notandanafn, birtingarnafn, æviágrip, auðkennismynd og hausmynd eru alltaf skráð opinberlega. </li>
-      <li><em>Skilaboð, fylgnigögn og aðrar opinberar upplýsingar</em>: Listinn yfir þá sem þú fylgist með er skráður opinberlega, það sama er að segja um þá sem fylgjast með þér. Þegar þú sendir skilaboð er dagsetning og tími vistaður sem og hvaða forrit þú sendir skilaboðin frá. Skilaboð geta innihaldið viðhengi, svo sem myndir og myndskeið. Opinberar og óskráðar færslur er aðgengilegar opinberlega. Þegar þú birtir færslu á notandasniðinu þínu (forsíðu) eru það einnig opinberar upplýsingar. Færslurnar þínar eru sendar þeim sem fylgjast með þér, í sumum tilvikum þýðir það að þær eru afhentar á aðra netþjóna og afrit geymd þar. Þegar þú eyðir færslum er það sömuleiðis birt fylgjendum þínum. Aðgerðir eins og að endurbirta eða setja færslu í eftirlæti eru ávallt opinberar.</li>
+      <li><em>Færslur, fylgnigögn og aðrar opinberar upplýsingar</em>: Listinn yfir þá sem þú fylgist með er skráður opinberlega, það sama er að segja um þá sem fylgjast með þér. Þegar þú sendir skilaboð er dagsetning og tími vistaður sem og hvaða forrit þú sendir skilaboðin frá. Skilaboð geta innihaldið viðhengi, svo sem myndir og myndskeið. Opinberar og óskráðar færslur er aðgengilegar opinberlega. Þegar þú birtir færslu á notandasniðinu þínu (forsíðu) eru það einnig opinberar upplýsingar. Færslurnar þínar eru sendar þeim sem fylgjast með þér, í sumum tilvikum þýðir það að þær eru afhentar á aðra netþjóna og afrit geymd þar. Þegar þú eyðir færslum er það sömuleiðis birt fylgjendum þínum. Aðgerðir eins og að endurbirta eða setja færslu í eftirlæti eru ávallt opinberar.</li>
       <li><em>Beinar færslur og eingöngu til fylgjenda</em>: Öll innlegg eru geymd og unnin á netþjóninum. Færslur sem eingöngu eru til fylgjenda berast til fylgjenda þinna og þeirra notenda sem minnst er á í þeim, beinar færslur berast aðeins til notenda sem getið er um í viðkomandi færslu. Í sumum tilvikum þýðir það að færslurnar eru afhentar á aðra netþjóna og afrit geymd þar. Við leggjum mikla áherslu á að takmarka aðgang að þessum færslum einungis við aðila sem til þess hafa heimild, en aðrir utanaðkomandi netþjónar gætu mögulega ekki gert það. Þess vegna er mikilvægt að skoða vel þá netþjóna sem fylgjendur þínir tilheyra. Þú getur valið að þurfa að samþykkja og hafna nýjum fylgjendum handvirkt í stillingunum.<em>Hafðu í huga að rekstraraðilar netþjónsins og allir viðtakendamiðlarar geta skoðað slík skilaboð</em> og að viðtakendur geta tekið skjámyndir, afritað eða á annan hátt deilt þessum gögnum. <em>Ekki deila hættulegum upplýsingum í gegnum Mastodon.</em></li>
       <li><em>IP-vistföng og önnur lýsigögn</em>: Þegar þú skráir þig inn skráum við IP-töluna sem þú skráir þig inn af, sem og heiti vafraforritsins þíns. Allar innskráðar setur verða tiltækar til skoðunar og afturköllunar í stillingunum. Síðast notaða IP-talan er geymd í allt að 12 mánuði. Við gætum líka haldið eftir atvikaskrám netþjónsins sem gæti innihaldið IP-tölur allra beiðna til netþjónsins.</li>
       </ul>
@@ -1493,6 +1565,15 @@ is:
     recovery_instructions_html: Ef þú tapar símanum þínum geturðu notað einn af endurheimtukóðunum hér fyrir neðan til að fá aftur samband við notandaaðganginn þinn. <strong>Geymdu endurheimtukóðana á öruggum stað</strong>. Sem dæmi gætirðu prentað þá út og geymt með öðrum mikilvægum skjölum.
     webauthn: Öryggislyklar
   user_mailer:
+    appeal_approved:
+      action: Farðu inn á notandaaðganginn þinn
+      explanation: Áfrýjun refsingarinnar gagnvart aðgangnum þínum þann %{strike_date} sem þú sendir inn þann %{appeal_date} hefur verið samþykkt. Notandaaðgangurinn þinn er aftur í góðu lagi.
+      subject: Áfrýjun þín frá %{date} hefur verið samþykkt
+      title: Áfrýjun samþykkt
+    appeal_rejected:
+      explanation: Áfrýjun refsingarinnar gagnvart aðgangnum þínum þann %{strike_date} sem þú sendir inn þann %{appeal_date} hefur verið hafnað.
+      subject: Áfrýjun þinni frá %{date} hefur verið hafnað
+      title: Áfrýjun hafnað
     backup_ready:
       explanation: Þú baðst um fullt öryggisafrit af Mastodon notandaaðgangnum þínum. Það er núna tilbúið til niðurhals!
       subject: Safnskráin þín er tilbúin til niðurhals
@@ -1504,28 +1585,29 @@ is:
       subject: Endilega staðfestu tilraun til innskráningar
       title: Tilraun til innskráningar
     warning:
+      appeal: Ssenda inn áfrýjun
+      appeal_description: Ef þú álítur að um mistök sé að ræða, geturðu sent áfrýjun til umsjónarmanna %{instance}.
       categories:
         spam: Ruslpóstur
         violation: Efnið er á skjön við eftirfarandi leiðbeiningar til notenda
       explanation:
-        delete_statuses: Sum skilaboð frá þér eru álitin eru að hafa gengið gegn samþykktum skilmálum vegna notkunar og hafa því stjórnendur fjarlægt þau af %{instance}. Brot sem framin verða hér eftir geta leitt til enn harðari aðgerða gegn notandaaðgangnum þínum.
+        delete_statuses: Sumar færslur frá þér eru álitnar hafa gengið gegn samþykktum skilmálum vegna notkunar og hafa því stjórnendur fjarlægt þau af %{instance}. Brot sem framin verða hér eftir geta leitt til enn harðari aðgerða gegn notandaaðgangnum þínum.
         disable: Þú getur ekki lengur notað aðganginn þinn, en notandasniðið þitt og önnur gögn eru óskemmd. Þú getur beðið um afrit af gögnunum þínum, getur breytt stillingum eða eytt aðgangnum þínum.
         sensitive: Héðan í frá verður allt myndefni sem þú sendir inn meðhöndlað sem viðkvæmt efni og falið á bakvið aðvörun sem smella þarf á.
-        silence: Þú getur áfram notað aðganginn þinn en aðeins fólk sem þegar fylgist með þér mun sjá tístin þín á þessum vefþjóni, auk þess sem lokað gæti verið á þig á ýmsum opinberum listum. Aftur á móti geta aðrir gerst fylgjendur þínir handvirkt.
+        silence: Þú getur áfram notað aðganginn þinn en aðeins fólk sem þegar fylgist með þér mun sjá færslurnar þínar á þessum vefþjóni, auk þess sem lokað gæti verið á þig á ýmsum opinberum listum. Aftur á móti geta aðrir gerst fylgjendur þínir handvirkt.
         suspend: Þú getur ekki lengur notað aðganginn þinn og notandasniðið þitt og önnur gögn eru ekki lengur aðgengileg. Þú getur enn skráð þig inn til að biðja um afrit af gögnunum þínum þar til þeim verður eytt að fullu eftir 30 daga, við munum hinsvegar halda eftir einstaka grunnupplýsingum til að koma í veg fyrir að þú komist framhjá þessu banni.
       get_in_touch: Ef þú álítur að um mistök sé að ræða, geturðu svarað þessum tölvupósti til að setja þig í samband við umsjónarmenn %{instance}.
       reason: 'Ástæða:'
-      review_server_policies: Yfirfara reglur vefþjónsins
-      statuses: 'Skilaboð sem álitin eru að hafa gengið gegn samþykktum ákvæðum:'
+      statuses: 'Færslur sem álitnar eru að hafa gengið gegn samþykktum ákvæðum:'
       subject:
-        delete_statuses: Skilaboð ín á %{acct} hafa verið fjarlægð
+        delete_statuses: Færslurnar þínar á %{acct} hafa verið fjarlægðar
         disable: Notandaaðgangurinn þinn %{acct} hefur verið frystur
         none: Aðvörun fyrir %{acct}
         sensitive: Myndefnið þitt á %{acct} verður héðan í frá merkt sem viðkvæmt
         silence: Notandaaðgangurinn þinn %{acct} hefur verið takmarkaður
         suspend: Notandaaðgangurinn þinn %{acct} hefur verið settur í bið
       title:
-        delete_statuses: Skilaboð fjarlægð
+        delete_statuses: Færslur fjarlægðar
         disable: Notandaaðgangur frystur
         none: Aðvörun
         sensitive: Mynd er falin
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 580179b68..18281a67d 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -94,7 +94,6 @@ it:
     account_moderation_notes:
       create: Lascia nota
       created_msg: Nota di moderazione creata con successo!
-      delete: Elimina
       destroyed_msg: Nota di moderazione distrutta con successo!
     accounts:
       add_email_domain_block: Inserisci il dominio email nella blacklist
@@ -163,6 +162,11 @@ it:
       not_subscribed: Non sottoscritto
       pending: Revisioni in attesa
       perform_full_suspension: Sospendi
+      previous_strikes: Provvedimenti precedenti
+      previous_strikes_description_html:
+        one: Questo account ha <strong>una</strong> violazione.
+        other: Questo account ha <strong>%{count}</strong> violazioni.
+        zero: Questo account ha <strong>una buona reputazione</strong>.
       promote: Promuovi
       protocol: Protocollo
       public: Pubblico
@@ -206,6 +210,7 @@ it:
       statuses: Stati
       strikes: Provvedimenti precedenti
       subscribe: Sottoscrivi
+      suspend: Sospendi
       suspended: Sospeso
       suspension_irreversible: I dati di questo account sono stati cancellati in modo irreversibile. È possibile annullare la sospensione dell'account per renderlo utilizzabile, ma non recupererà alcuno dei dati precedenti.
       suspension_reversible_hint_html: L'account è stato sospeso e i dati saranno completamente eliminati il %{date}. Fino ad allora, l'account può essere ripristinato senza effetti negativi. Se si desidera eliminare immediatamente tutti i dati dell'account, è possibile farlo qui sotto.
@@ -226,6 +231,7 @@ it:
       whitelisted: Nella whitelist
     action_logs:
       action_types:
+        approve_appeal: Approva Ricorso
         approve_user: Approva Utente
         assigned_to_self_report: Assegna report
         change_email_user: Cambia l'e-mail per l'utente
@@ -257,6 +263,7 @@ it:
         enable_user: Abilita utente
         memorialize_account: Trasforma in account commemorativo
         promote_user: Promuovi utente
+        reject_appeal: Respingi Ricorso
         reject_user: Rifiuta Utente
         remove_avatar_user: Elimina avatar
         reopen_report: Riapri report
@@ -275,6 +282,7 @@ it:
         update_domain_block: Aggiorna blocco di dominio
         update_status: Aggiorna stato
       actions:
+        approve_appeal_html: "%{name} ha approvato il ricorso contro la decisione di moderazione da %{target}"
         approve_user_html: "%{name} ha approvato la registrazione da %{target}"
         assigned_to_self_report_html: "%{name} ha assegnato il rapporto %{target} a se stesso"
         change_email_user_html: "%{name} ha cambiato l'indirizzo e-mail dell'utente %{target}"
@@ -306,6 +314,7 @@ it:
         enable_user_html: "%{name} ha abilitato il login per l'utente %{target}"
         memorialize_account_html: "%{name} ha trasformato l'account di %{target} in una pagina in memoriam"
         promote_user_html: "%{name} ha promosso l'utente %{target}"
+        reject_appeal_html: "%{name} ha respinto il ricorso contro la decisione di moderazione da %{target}"
         reject_user_html: "%{name} ha rifiutato la registrazione da %{target}"
         remove_avatar_user_html: "%{name} ha rimosso l'immagine profilo di %{target}"
         reopen_report_html: "%{name} ha riaperto il rapporto %{target}"
@@ -384,14 +393,17 @@ it:
       media_storage: Archiviazione media
       new_users: nuovi utenti
       opened_reports: rapporti aperti
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> appello in attesa"
+        other: "<strong>%{count}</strong> appelli in attesa"
       pending_reports_html:
-        one: "<strong>1</strong> rapporto in attesa"
-        other: "<strong>%{count}</strong> rapporti in attesa"
+        one: "<strong>%{count}</strong> segnalazione in attesa"
+        other: "<strong>%{count}</strong> segnalazioni in attesa"
       pending_tags_html:
-        one: "<strong>1</strong> hashtag in attesa"
+        one: "<strong>%{count}</strong> hashtag in attesa"
         other: "<strong>%{count}</strong> hashtag in attesa"
       pending_users_html:
-        one: "<strong>1</strong> utente in attesa"
+        one: "<strong>%{count}</strong> utente in attesa"
         other: "<strong>%{count}</strong> utenti in attesa"
       resolved_reports: segnalazioni risolte
       software: Software
@@ -401,6 +413,10 @@ it:
       top_languages: Lingue più attive
       top_servers: Server più attivi
       website: Sito web
+    disputes:
+      appeals:
+        empty: Nessun appello trovato.
+        title: Appelli
     domain_allows:
       add_new: Dominio nella whitelist
       created_msg: Il dominio è stato inserito nella whitelist
@@ -441,6 +457,7 @@ it:
         affected_accounts:
           one: Interessato un solo account nel database
           other: Interessati %{count} account nel database
+          zero: Nessun account nel database è interessato
         retroactive:
           silence: De-silenzia tutti gli account esistenti da questo dominio
           suspend: Annulla la sospensione di tutti gli account esistenti da questo dominio
@@ -494,6 +511,7 @@ it:
       known_accounts:
         one: "%{count} account noto"
         other: "%{count} account noti"
+        zero: Nessun account noto
       moderation:
         all: Tutto
         limited: Limitato
@@ -559,10 +577,12 @@ it:
           other: "%{count} note"
       action_taken_by: Azione intrapresa da
       actions:
+        delete_description_html: I post segnalati saranno eliminati e la violazione sarà registrata per aiutarti a prendere ulteriori provvedimenti sulle future infrazioni dello stesso account.
         other_description_html: Vedi altre opzioni per controllare il comportamento dell'account e personalizzare la comunicazione all'account segnalato.
+        resolve_description_html: Nessuna azione sarà intrapresa contro l'account segnalato, nessuna violazione registrata, e la segnalazione sarà chiusa.
         silence_description_html: Il profilo sarà visibile solo a coloro che lo seguono o lo cercano manualmente, limitandone fortemente la raggiungibilità. Può sempre essere annullato.
         suspend_description_html: Il profilo e tutti i suoi contenuti diventeranno inaccessibili fino a quando non sarà cancellato. L'interazione con l'account sarà impossibile. Annullabile entro 30 giorni.
-      actions_description_html: 'Se la rimozione del contenuto in questione è insufficiente:'
+      actions_description_html: Decidete quali azioni intraprendere per risolvere la segnalazione. Se si intraprende un'azione punitiva contro l'account segnalato, gli sarà inviata una notifica via e-mail, tranne quando è selezionata la categoria <strong>Spam</strong>.
       add_to_report: Aggiungi altro al report
       are_you_sure: Sei sicuro?
       assign_to_self: Assegna a me
@@ -574,7 +594,7 @@ it:
         none: Nessuno
       comment_description_html: 'Per fornire ulteriori informazioni, %{name} ha scritto:'
       created_at: Segnalato
-      delete_and_resolve: Cancella e risolvi
+      delete_and_resolve: Cancella post
       forwarded: Inoltrato
       forwarded_to: Inoltrato a %{domain}
       mark_as_resolved: Segna come risolto
@@ -588,12 +608,14 @@ it:
         placeholder: Descrivi quali azioni sono state intraprese, o ogni altro aggiornamento rilevante...
         title: Note
       notes_description_html: Visualizza e lascia note ad altri moderatori e al tuo futuro sé
+      quick_actions_description_html: 'Fai un''azione rapida o scorri verso il basso per vedere il contenuto segnalato:'
       reopen: Riapri rapporto
       report: 'Rapporto #%{id}'
       reported_account: Account segnalato
       reported_by: Inviato da
       resolved: Risolto
       resolved_msg: Rapporto risolto!
+      skip_to_actions: Passa alle azioni
       status: Stato
       statuses: Contenuto segnalato
       statuses_description_html: Il contenuto offensivo sarà citato nella comunicazione con l'account segnalato
@@ -714,6 +736,16 @@ it:
       no_status_selected: Nessun status è stato modificato perché nessuno era stato selezionato
       title: Gli status dell'account
       with_media: con media
+    strikes:
+      actions:
+        delete_statuses: "%{name} ha eliminato i post di %{target}"
+        disable: "%{name} ha congelato l'account di %{target}"
+        none: "%{name} ha inviato un avviso a %{target}"
+        sensitive: "%{name} ha contrassegnato l'account di %{target} come sensibile"
+        silence: "%{name} ha limitato l'account di %{target}"
+        suspend: "%{name} ha sospeso l'account di %{target}"
+      appeal_approved: Sottoposto ad appello
+      appeal_pending: Appello in attesa
     system_checks:
       database_schema_check:
         message_html: Ci sono migrazioni del database in attesa. Sei pregato di eseguirle per assicurarti che l'applicazione si comporti come previsto
@@ -738,6 +770,7 @@ it:
         shared_by_over_week:
           one: Condiviso da una persona nell'ultima settimana
           other: Condiviso da %{count} persone nell'ultima settimana
+          zero: Condiviso da nessuno nell'ultima settimana
         title: Link in tendenza
         usage_comparison: Condiviso %{today} volte oggi, rispetto a %{yesterday} ieri
       pending_review: Revisione in sospeso
@@ -767,6 +800,7 @@ it:
         used_by_over_week:
           one: Usato da una persona nell'ultima settimana
           other: Usato da %{count} persone nell'ultima settimana
+          zero: Usato da nessuno nell'ultima settimana
       title: Tendenze
     warning_presets:
       add_new: Aggiungi nuovo
@@ -775,6 +809,17 @@ it:
       empty: Non hai ancora definito alcun avviso preimpostato.
       title: Gestisci avvisi predefiniti
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: per cancellare i loro post
+        disable: per congelare il loro account
+        none: avviso
+        sensitive: per contrassegnare il loro account come sensibile
+        silence: per limitare il loro account
+        suspend: per sospendere il loro account
+      body: "%{target} sta facendo appello contro una decisione di moderazione di %{action_taken_by} da %{date}, che era %{type}. Ha scritto:"
+      next_steps: Puoi approvare l'appello per annullare la decisione di moderazione, oppure ignorarlo.
+      subject: "%{username} sta facendo appello contro una decisione di moderazione su %{instance}"
     new_pending_account:
       body: I dettagli del nuovo account sono qui sotto. Puoi approvare o rifiutare questa richiesta.
       subject: Nuovo account pronto per la revisione su %{instance} (%{username})
@@ -867,7 +912,6 @@ it:
     status:
       account_status: Stato dell'account
       confirming: In attesa che la conferma e-mail sia completata.
-      functional: Il tuo account è pienamente operativo.
       pending: La tua richiesta è in attesa di esame da parte del nostro staff. Potrebbe richiedere un po' di tempo. Riceverai una e-mail se la richiesta è approvata.
       redirecting_to: Il tuo account è inattivo perché attualmente reindirizza a %{acct}.
     too_fast: Modulo inviato troppo velocemente, riprova.
@@ -933,6 +977,32 @@ it:
     directory: Directory dei profili
     explanation: Scopri utenti in base ai loro interessi
     explore_mastodon: Esplora %{title}
+  disputes:
+    strikes:
+      action_taken: Azione intrapresa
+      appeal: Appello
+      appeal_approved: Questa sanzione è stata annullata in un appello e non è più valida
+      appeal_rejected: L'appello è stato respinto
+      appeal_submitted_at: Appello presentato
+      appealed_msg: Il tuo appello è stato presentato. Se sarà approvato, sarai informato.
+      appeals:
+        submit: Presenta un appello
+      associated_report: Segnalazione associata
+      created_at: Data
+      recipient: Indirizzata a
+      status: 'Post #%{id}'
+      status_removed: Post già rimosso dal sistema
+      title: "%{action} da %{date}"
+      title_actions:
+        delete_statuses: Eliminazione del post
+        disable: Congelamento dell'account
+        none: Avviso
+        sensitive: Marcatura dell'account come sensibile
+        silence: Limitazione dell'account
+        suspend: Sospensione dell'account
+      your_appeal_approved: Il tuo appello è stato approvato
+      your_appeal_pending: Hai presentato un appello
+      your_appeal_rejected: Il tuo appello è stato respinto
   domain_validator:
     invalid_domain: non è un nome di dominio valido
   errors:
@@ -1144,6 +1214,8 @@ it:
       title: Nuova condivisione
     status:
       subject: "%{name} ha appena pubblicato un post"
+    update:
+      subject: "%{name} ha modificato un post"
   notifications:
     email_events: Eventi per notifiche via email
     email_events_hint: 'Seleziona gli eventi per i quali vuoi ricevere le notifiche:'
@@ -1225,6 +1297,9 @@ it:
     reply:
       proceed: Continua per rispondere
       prompt: 'Vuoi rispondere a questo post:'
+  reports:
+    errors:
+      invalid_rules: non fa riferimento a regole valide
   scheduled_statuses:
     over_daily_limit: Hai superato il limite di %{limit} post programmati per questo giorno
     over_total_limit: Hai superato il limite di %{limit} post programmati
@@ -1494,6 +1569,15 @@ it:
     recovery_instructions_html: Se perdi il telefono, puoi usare uno dei codici di recupero qui sotto per riottenere l'accesso al tuo account. <strong>Conserva i codici di recupero in un posto sicuro</strong>. Ad esempio puoi stamparli e conservarli insieme ad altri documenti importanti.
     webauthn: Chiavi di sicurezza
   user_mailer:
+    appeal_approved:
+      action: Vai al tuo account
+      explanation: L'appello della sanzione contro il tuo account del %{strike_date} che hai inviato il %{appeal_date} è stato approvato. Il tuo account ha riottenuto la buona reputazione.
+      subject: Il tuo appello del %{date} è stato approvato
+      title: Appello approvato
+    appeal_rejected:
+      explanation: L'appello della sanzione contro il tuo account del %{strike_date} che hai inviato il %{appeal_date} è stato respinto.
+      subject: Il tuo appello del %{date} è stato respinto
+      title: Appello respinto
     backup_ready:
       explanation: Hai richiesto un backup completo del tuo account Mastodon. È pronto per essere scaricato!
       subject: Il tuo archivio è pronto per essere scaricato
@@ -1505,6 +1589,8 @@ it:
       subject: Conferma il tentativo di accesso
       title: Tentativo di accesso
     warning:
+      appeal: Presenta un appello
+      appeal_description: Se credi che si tratti di un errore, puoi presentare un appello allo staff di %{instance}.
       categories:
         spam: Spam
         violation: Il contenuto viola le seguenti linee guida della comunità
@@ -1516,7 +1602,6 @@ it:
         suspend: Non puoi più utilizzare il tuo account, e il tuo profilo e gli altri dati non sono più accessibili. Puoi ancora effettuare il login per richiedere un backup dei dati fino a quando i dati non saranno completamente cancellati nei prossimi 30 giorni, ma conserveremo alcuni dati di base per impedirti di eludere la sospensione.
       get_in_touch: Se credi che questo sia un errore, puoi rispondere a questa e-mail per metterti in contatto con lo staff di %{instance}.
       reason: 'Motivo:'
-      review_server_policies: Rivedi regole del server
       statuses: 'Post che sono stati trovati in violazione:'
       subject:
         delete_statuses: I tuoi post su %{acct} sono stati eliminati
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 105974389..1b79cd7f9 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -88,7 +88,6 @@ ja:
     account_moderation_notes:
       create: 書き込む
       created_msg: モデレーションメモを書き込みました!
-      delete: 削除
       destroyed_msg: モデレーションメモを削除しました!
     accounts:
       add_email_domain_block: メールドメインブロックに追加
@@ -199,6 +198,7 @@ ja:
       silenced: サイレンス済み
       statuses: 投稿数
       subscribe: 購読する
+      suspend: サスペンド
       suspended: 停止済み
       suspension_irreversible: このアカウントのデータは削除され元に戻せなくなります。後日アカウントの凍結を解除することはできますがデータは元に戻せません。
       suspension_reversible_hint_html: アカウントは停止されており、データは %{date} に完全に削除されます。それまではアカウントを元に戻すことができます。今すぐ完全に削除したい場合は以下から行うことができます。
@@ -219,6 +219,7 @@ ja:
       whitelisted: 連合許可済み
     action_logs:
       action_types:
+        approve_appeal: 抗議を承認
         approve_user: ユーザーの承認
         assigned_to_self_report: 通報の担当者に設定
         change_email_user: ユーザーのメールアドレスを変更
@@ -250,6 +251,7 @@ ja:
         enable_user: ユーザーを有効化
         memorialize_account: 追悼アカウント化
         promote_user: ユーザーを昇格
+        reject_appeal: 抗議を却下
         reject_user: ユーザーを拒否
         remove_avatar_user: アイコンを削除
         reopen_report: 未解決に戻す
@@ -268,6 +270,7 @@ ja:
         update_domain_block: ドメインブロックを更新
         update_status: 投稿を更新
       actions:
+        approve_appeal_html: "%{name} さんが %{target} からの抗議を承認しました"
         approve_user_html: "%{target} から登録された %{name} さんを承認しました"
         assigned_to_self_report_html: "%{name} さんが通報 %{target} を自身の担当に割り当てました"
         change_email_user_html: "%{name} さんが %{target} さんのメールアドレスを変更しました"
@@ -299,6 +302,7 @@ ja:
         enable_user_html: "%{name} さんが %{target} さんのログインを有効化しました"
         memorialize_account_html: "%{name} さんが %{target} さんを追悼アカウントページに登録しました"
         promote_user_html: "%{name} さんが %{target} さんを昇格しました"
+        reject_appeal_html: "%{name} さんが %{target} からの抗議を却下しました"
         reject_user_html: "%{target} から登録された %{name} さんを拒否しました"
         remove_avatar_user_html: "%{name} さんが %{target} さんのアイコンを削除しました"
         reopen_report_html: "%{name} さんが通報 %{target} を未解決に戻しました"
@@ -373,17 +377,19 @@ ja:
       upload: アップロード
     dashboard:
       active_users: アクティブユーザー
-      interactions: 相互作用
+      interactions: 交流
       media_storage: メディアストレージ
       new_users: 新規ユーザー
-      opened_reports: レポートが開かれました
+      opened_reports: 新規通報
+      pending_appeals_html:
+        other: 保留中の抗議 <strong>%{count}</strong> 件
       pending_reports_html:
-        other: 保留中の報告 <strong>%{count}</strong> 件
+        other: 保留中の通報 <strong>%{count}</strong> 件
       pending_tags_html:
         other: 保留中のハッシュタグ <strong>%{count}</strong> 件
       pending_users_html:
         other: 保留中のユーザー <strong>%{count}</strong> 件
-      resolved_reports: 解決済みのレポート
+      resolved_reports: 解決済みの通報
       software: ソフトウェア
       sources: サインアップソース
       space: ディスク使用量
@@ -391,6 +397,10 @@ ja:
       top_languages: トップのアクティブ言語
       top_servers: トップアクティブサーバー
       website: ウェブサイト
+    disputes:
+      appeals:
+        empty: 抗議はありません。
+        title: 抗議
     domain_allows:
       add_new: 連合を許可
       created_msg: 連合を許可しました
@@ -428,8 +438,6 @@ ja:
         silence: サイレンス中
         suspend: 停止中
       show:
-        affected_accounts:
-          other: データベース中の%{count}個のアカウントに影響します
         retroactive:
           silence: このドメインの既存の影響するアカウントのサイレンスを戻す
           suspend: このドメインの既存の影響するアカウントの停止を戻す
@@ -479,8 +487,6 @@ ja:
       delivery_error_hint: "%{count} 日間配送ができない場合は、自動的に配送不可としてマークされます。"
       destroyed_msg: "%{domain} からのデータは、すぐに削除されるように、キューに追加されました。"
       empty: ドメインが見つかりませんでした。
-      known_accounts:
-        other: 既知のアカウント数 %{count}
       moderation:
         all: すべて
         limited: 制限あり
@@ -545,20 +551,21 @@ ja:
           other: "%{count} 件のメモ"
       action_log: 監査ログ
       action_taken_by: 通報処理者
-      add_to_report: レポートにさらに追加
+      add_to_report: 通報にさらに追加
       are_you_sure: 本当に実行しますか?
       assign_to_self: 担当になる
       assigned: 担当者
       by_target_domain: ドメイン
       category: カテゴリー
+      category_description_html: 選択した理由は通報されたアカウントへの連絡時に引用されます
       comment:
         none: なし
       created_at: 通報日時
-      delete_and_resolve: 解決済みにして削除
       forwarded: 転送済み
       forwarded_to: "%{domain} に転送されました"
       mark_as_resolved: 解決済みとしてマーク
       mark_as_unresolved: 未解決に戻す
+      no_one_assigned: なし
       notes:
         create: 書き込む
         create_and_resolve: 書き込み、解決済みにする
@@ -573,8 +580,10 @@ ja:
       reported_by: 報告者
       resolved: 解決済み
       resolved_msg: 通報を解決済みにしました!
+      skip_to_actions: アクションに移動
       status: ステータス
       statuses: 通報内容
+      statuses_description_html: 問題の投稿は通報されたアカウントへの連絡時に引用されます
       target_origin: 報告されたアカウントの起源
       title: 通報
       unassign: 担当を外す
@@ -682,9 +691,9 @@ ja:
       destroyed_msg: ファイルを削除しました!
     statuses:
       back_to_account: アカウントページに戻る
-      back_to_report: レポートページに戻る
+      back_to_report: 通報ページに戻る
       batch:
-        remove_from_report: レポートから削除
+        remove_from_report: 通報から削除
         report: 通報
       deleted: 削除済み
       media:
@@ -713,11 +722,9 @@ ja:
         allow_provider: 発行者の承認
         disallow: リンクの拒否
         disallow_provider: 発行者の拒否
-        shared_by_over_week:
-          other: 先週 %{count} 人が共有しました
         title: トレンドリンク
         usage_comparison: 今日は %{today} 回、昨日は %{yesterday} 回共有されました
-      pending_review: 保留中のレビュー
+      pending_review: 保留中
       preview_card_providers:
         allowed: この発行者からのリンクを許可
         rejected: この発行者からのリンクを拒否
@@ -731,18 +738,16 @@ ja:
           tag_servers_dimension: 人気のサーバー
           tag_servers_measure: その他のサーバー
           tag_uses_measure: 合計利用数
-        listable: おすすめの
-        not_listable: 推奨されない
-        not_trendable: トレンドに表示されない
-        not_usable: 使用不可
+        listable: おすすめに表示する
+        not_listable: おすすめに表示しない
+        not_trendable: トレンドに表示しない
+        not_usable: 使用を禁止
         peaked_on_and_decaying: "%{date} 以降、しばらく使われていません"
-        title: ハッシュタグのトレンド
-        trendable: トレンドに表示される
+        title: トレンドタグ
+        trendable: トレンドに表示する
         trending_rank: '人気: %{rank} 位'
-        usable: 使用不能
+        usable: 使用を許可
         usage_comparison: 今日は %{today} 回、昨日は %{yesterday} 回使用されました。
-        used_by_over_week:
-          other: 先週は %{count} 人に使用されました
       title: トレンド
     warning_presets:
       add_new: 追加
@@ -840,7 +845,6 @@ ja:
     status:
       account_status: アカウントの状態
       confirming: メールアドレスの確認が完了するのを待っています。
-      functional: アカウントは完全に機能しています。
       pending: あなたの申請は現在サーバー管理者による審査待ちです。これにはしばらくかかります。申請が承認されるとメールが届きます。
       redirecting_to: アカウントは %{acct} に引っ越し設定されているため非アクティブになっています。
     too_fast: フォームの送信が速すぎます。もう一度やり直してください。
@@ -906,6 +910,9 @@ ja:
     directory: ディレクトリ
     explanation: 関心を軸にユーザーを発見しよう
     explore_mastodon: "%{title}を探索"
+  disputes:
+    strikes:
+      appeal: 抗議
   domain_validator:
     invalid_domain: は無効なドメイン名です
   errors:
@@ -1113,6 +1120,8 @@ ja:
       title: 新たなブースト
     status:
       subject: "%{name} さんが投稿しました"
+    update:
+      subject: "%{name} さんが投稿を更新しました"
   notifications:
     email_events: メールによる通知
     email_events_hint: '受信する通知を選択:'
@@ -1311,8 +1320,8 @@ ja:
     enabled_hint: 設定した期間を過ぎた投稿は、以下の例外に該当しない限り、自動的に削除されます
     exceptions: 例外
     explanation: 投稿の削除はサーバーに負荷がかかるため、サーバーが混み合っていないときに時間をかけて行われます。
-    ignore_favs: お気に入りされた数を無視
-    ignore_reblogs: ブーストされた数を無視
+    ignore_favs: 設定しない
+    ignore_reblogs: 設定しない
     interaction_exceptions: インタラクションに基づく例外
     interaction_exceptions_explanation: お気に入りやブーストの基準値を一度超えてしまった投稿は、基準値を下回った後であっても、削除される保証はありません。
     keep_direct: ダイレクトメッセージを保持
@@ -1336,10 +1345,10 @@ ja:
       '63113904': 2年
       '7889238': 3ヶ月
     min_age_label: 投稿を保持する期間
-    min_favs: これ以上お気に入りに登録された投稿を無視する
-    min_favs_hint: この数以上、お気に入りに登録された投稿を削除しません。空白にしておくと、お気に入りに登録された数に関わらず投稿を削除します。
-    min_reblogs: これ以上ブーストされた投稿を無視する
-    min_reblogs_hint: この数以上、ブーストされた投稿を削除しません。空白にしておくと、ブーストされた数に関わらず投稿を削除します。
+    min_favs: お気に入りの基準値
+    min_favs_hint: この数以上、お気に入りされた投稿を削除せずに残します。空白にしておくと、お気に入りに登録された数に関わらず投稿を削除します。
+    min_reblogs: ブーストの基準値
+    min_reblogs_hint: この数以上、ブーストされた投稿を削除せずに残します。空白にしておくと、ブーストされた数に関わらず投稿を削除します。
   stream_entries:
     pinned: 固定された投稿
     reblogged: さんがブースト
@@ -1474,7 +1483,6 @@ ja:
         sensitive: 今後、アップロードされたすべてのメディアファイルは閲覧注意してマークされ、クリックスルー警告の背後に隠されます。
         silence: アカウントが制限されています。このサーバーでは既にフォローしている人だけがあなたの投稿を見ることができます。 様々な発見機能から除外されるかもしれません。他の人があなたを手動でフォローすることは可能です。
       reason: '理由:'
-      review_server_policies: サーバーのポリシーを確認
       subject:
         disable: あなたのアカウント %{acct} は凍結されました
         none: "%{acct} に対する警告"
diff --git a/config/locales/ka.yml b/config/locales/ka.yml
index 782d57e2a..d942048b6 100644
--- a/config/locales/ka.yml
+++ b/config/locales/ka.yml
@@ -42,7 +42,6 @@ ka:
     account_moderation_notes:
       create: დატოვეთ ჩანაწერი
       created_msg: მოდერაციის ჩანაწერი წარმატებით შეიქმნა!
-      delete: გაუქმება
       destroyed_msg: მოდერაციის ჩანაწერი წარმატებით გაუქმდა!
     accounts:
       are_you_sure: დარწმუნებული ხარ?
@@ -173,9 +172,6 @@ ka:
       reject_media: მედია ფაილების უარყოფა
       reject_media_hint: შლის ლოკალურად შენახულ მედია ფაილებს და უარყოფს სამომავლო გადმოტვირთებს. შეუსაბამო შეჩერებებისთვის
       show:
-        affected_accounts:
-          one: გავლენა იქონია მონაცემთა ბაზაში ერთ ანგარიშზე
-          other: გავლენა იქონიო მონაცემთა ბაზაში %{count} ანგარიშზე
         retroactive:
           silence: ამ დომენში ყველა არსებულ ანგარიშზე გაჩუმების მოშორება
           suspend: ამ დომენში ყველა არსებულ ანგარიშზე შეჩერების მოშორება
diff --git a/config/locales/kab.yml b/config/locales/kab.yml
index 6b18ddbc3..57d1c9d33 100644
--- a/config/locales/kab.yml
+++ b/config/locales/kab.yml
@@ -76,7 +76,6 @@ kab:
       action: Eg tigawt
     account_moderation_notes:
       create: Eǧǧ tazmilt
-      delete: Kkes
     accounts:
       add_email_domain_block: Sewḥel taɣult n yimayl
       approve: Qbel
@@ -369,9 +368,6 @@ kab:
       delivery_available: Yella usiweḍ
       delivery_error_days: Ussan n tuccḍiwin n usiweḍ
       empty: Ulac taɣultin yettwafen.
-      known_accounts:
-        one: "%{count} n umiḍan i yettwasnen"
-        other: "%{count} n yimiḍanen i yettwassnen"
       moderation:
         all: Akk
         limited: Yettwasgugem
@@ -427,6 +423,7 @@ kab:
           other: "%{count} n timawin"
       action_taken_by: Tigawt yettwaṭṭfen sɣur
       are_you_sure: Tetḥaq-eḍ?
+      category: Taggayt
       comment:
         none: Ula yiwen
       mark_as_resolved: Creḍ-it yefra
@@ -444,6 +441,7 @@ kab:
       title: Ineqqisen
       unresolved: Ur yefra ara
       updated_at: Yettwaleqqem
+      view_profile: Wali amaɣnu
     rules:
       add_new: Rnu alugen
       delete: Kkes
@@ -481,6 +479,8 @@ kab:
       title: Tisuffiγin n umiḍan
       with_media: S taγwalt
     title: Tadbelt
+    trends:
+      allow: Sireg
     warning_presets:
       add_new: Rnu amaynut
       delete: Kkes
@@ -491,6 +491,7 @@ kab:
   appearance:
     discovery: Asnirem
     localization:
+      guide_link: https://crowdin.com/project/mastodon
       guide_link_text: Yal yiwen·t y·tezmer a ttekki.
     sensitive_content: Agbur amḥulfu
   application_mailer:
@@ -511,10 +512,14 @@ kab:
       prefix_invited_by_user: "@%{name} inced-ik·ikem ad ternuḍ ɣer uqeddac-a n Mastodon!"
       prefix_sign_up: Zeddi di Maṣṭudun assa!
     forgot_password: Tettud awal-ik uffir?
+    log_in_with: Qqen s
     login: Qqen
     logout: Ffeγ
     migrate_account: Gujj γer umiḍan nniḍen
     or_log_in_with: Neγ eqqen s
+    providers:
+      cas: CAS
+      saml: SAML
     register: Jerred
     registration_closed: "%{instance} ur yeqbil ara imttekkiyen imaynuten"
     reset_password: Wennez awal uffir
@@ -524,7 +529,6 @@ kab:
       title: Sbadu
     status:
       account_status: Addad n umiḍan
-      functional: Amiḍan-inek·m yettwaheyya.
     trouble_logging_in: Γur-k uguren n tuqqna?
     use_security_key: Seqdec tasarut n teɣlist
   authorize_follow:
@@ -582,6 +586,8 @@ kab:
     archive_takeout:
       date: Azemz
       size: Teγzi
+    bookmarks: Ticraḍ
+    csv: CSV
     lists: Tibdarin
     mutes: Wid tesgugmeḍ
   featured_tags:
@@ -610,6 +616,7 @@ kab:
     delete: Kkes
     order_by: Sizwer s
     save_changes: Sekles ibeddilen
+    today: ass-a
   imports:
     modes:
       merge: Smezdi
@@ -780,6 +787,7 @@ kab:
       video:
         one: "%{count} n tbidyutt"
         other: "%{count} n tbidyutin"
+    edited_at: Tettwaẓreg deg %{date}
     open_in_web: Ldi deg Web
     poll:
       total_people:
@@ -790,6 +798,7 @@ kab:
         other: "%{count} n yedɣaren"
       vote: Dɣeṛ
     show_more: Ssken-d ugar
+    show_newer: Ssken-d timaynutin
     show_thread: Ssken-d lxiḍ
     sign_in_to_participate: Qqen i waken ad tzeddiḍ deg udiwenni
     title: '%{name} : "%{quote}"'
@@ -833,6 +842,8 @@ kab:
     webauthn: Tisura n teɣlist
   user_mailer:
     warning:
+      categories:
+        spam: Aspam
       title:
         disable: Amiḍan i igersen
         none: Γur-wat
diff --git a/config/locales/kk.yml b/config/locales/kk.yml
index 0ea1d6a39..319531cc1 100644
--- a/config/locales/kk.yml
+++ b/config/locales/kk.yml
@@ -87,7 +87,6 @@ kk:
     account_moderation_notes:
       create: Жазба қалдырыңыз
       created_msg: Модерация жазбасы қалдырылды!
-      delete: Өшіру
       destroyed_msg: Модерация жазбасы өшірілді!
     accounts:
       approve: Құптау
@@ -267,9 +266,6 @@ kk:
         silence: үнсіз
         suspend: тоқтатылған
       show:
-        affected_accounts:
-          one: Дерекқорда бір тіркелгі қозғалды
-          other: дерекқордағы %{count} аккаунт қозғалған
         retroactive:
           silence: Осы домендегі бар тіркелгілерді жою
           suspend: Осы домендегі бар барлық тіркелгілерді тоқтатыңыз
@@ -291,9 +287,6 @@ kk:
     instances:
       by_domain: Domаin
       delivery_available: Жеткізу қол жетімді
-      known_accounts:
-        one: "%{count} таныс аккаунт"
-        other: "%{count} таныс аккаунт"
       moderation:
         all: Барлығы
         limited: Лимит
@@ -539,7 +532,6 @@ kk:
     status:
       account_status: Аккаунт статусы
       confirming: Электрондық поштаны растау аяқталуын күтуде.
-      functional: Сіздің есептік жазбаңыз толығымен жұмыс істейді.
       pending: Сіздің өтінішіңіз біздің қызметкерлеріміздің қарауында. Бұл біраз уақыт алуы мүмкін. Өтінішіңіз мақұлданса, сізге электрондық пошта хабарламасы келеді.
       redirecting_to: Сіздің есептік жазбаңыз белсенді емес, себебі ол %{acct} жүйесіне қайта бағытталуда.
     trouble_logging_in: Кіру қиын ба?
@@ -1038,7 +1030,6 @@ kk:
       subject: Мұрағатыңыз түсіріп алуға дайын
       title: Мұрағатты алу
     warning:
-      review_server_policies: Сервер саясатын қарап шығыңыз
       subject:
         disable: Аккаунтыңыз %{acct} уақытша тоқтатылды
         none: "%{acct} ескертуі"
diff --git a/config/locales/kmr.yml b/config/locales/kmr.yml
index 22eaf7b95..8e40d8e2f 100644
--- a/config/locales/kmr.yml
+++ b/config/locales/kmr.yml
@@ -94,7 +94,6 @@ kmr:
     account_moderation_notes:
       create: Nîşeyekê bihêle
       created_msg: Nîşeyê moderator bi awayekî serkeftî hate afirandin!
-      delete: Jê bibe
       destroyed_msg: Nîşeyê moderator bi awayekî serkeftî hate tinne kirin!
     accounts:
       add_email_domain_block: Navparê e-nameyê asteng bike
@@ -163,6 +162,11 @@ kmr:
       not_subscribed: Beşdar nebû
       pending: Li benda nirxandinê ye
       perform_full_suspension: Sekinî
+      previous_strikes: Binpêkirinên berê
+      previous_strikes_description_html:
+        one: Ev ajimêr <strong>yek</strong> binpêkirin kiriye.
+        other: Ev ajimêr <strong>%{count}</strong> binpêkirin kiriye.
+        zero: Ev ajimêr <strong>di rewşeke baş de ye</strong>.
       promote: Derbasê asteke bilind be
       protocol: Protokol
       public: Gelemperî
@@ -204,8 +208,9 @@ kmr:
       silence: Sînor
       silenced: Bêdeng kirî
       statuses: Şandî
-      strikes: Lêdanên berê
+      strikes: Binpêkirinên berê
       subscribe: Bibe kiryar
+      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î.
@@ -226,6 +231,7 @@ kmr:
       whitelisted: Ji bona yekbûyînê maf tê dayîn
     action_logs:
       action_types:
+        approve_appeal: Îtîrazê bipejirîne
         approve_user: Bikarhêner bipejirîne
         assigned_to_self_report: Ragihandinê diyar bike
         change_email_user: E-nameya bikarhêner biguherîne
@@ -257,6 +263,7 @@ kmr:
         enable_user: Bikarhêner çalak bike
         memorialize_account: Ajimêrê bike bîranînek
         promote_user: Bikarhêner pêş bixe
+        reject_appeal: Îtîrazê nepejirîne
         reject_user: Bikarhêner nepejirîne
         remove_avatar_user: Avatarê rake
         reopen_report: Ragihandina ji nû ve veke
@@ -275,6 +282,7 @@ kmr:
         update_domain_block: Navperên astengkirî rojane bike
         update_status: Şandiyê rojane bike
       actions:
+        approve_appeal_html: "%{name} îtiraza biryara çavdêriyê ji %{target} pejirand"
         approve_user_html: "%{name} tomarkirina ji %{target} pejirand"
         assigned_to_self_report_html: "%{name} ji xwe re ragihandinek %{target} hilda"
         change_email_user_html: "%{name} navnîşana e-nameya bikarhêner %{target} guherand"
@@ -306,6 +314,7 @@ kmr:
         enable_user_html: "%{name} ji bo bikarhêner %{target} têketin çalak kir"
         memorialize_account_html: "%{name} ajimêra %{target} veguherand rûpeleke bîranînê"
         promote_user_html: "%{name} bikarhêner %{target} bilind kir"
+        reject_appeal_html: "%{name} îtiraza biryara çavdêriyê ji %{target} nepejirand"
         reject_user_html: "%{name} tomarkirina ji %{target} nepejirand"
         remove_avatar_user_html: "%{name} avatara bikarhêner %{target} rakir"
         reopen_report_html: "%{name} ragihandina %{target} ji nû ve vekir"
@@ -384,15 +393,18 @@ kmr:
       media_storage: Bîrdanaka medyayê
       new_users: bikarhênerên nû
       opened_reports: ragihandin hatin vekirin
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> îtîraz li benda nirxandinê ye"
+        other: "<strong>%{count}</strong> îtîraz li benda nirxandinê ne"
       pending_reports_html:
-        one: "<strong>1</strong> ragihandin benda nirxandinê"
-        other: "<strong>%{count}</strong> ragihandin benda nirxandinê"
+        one: "<strong>%{count}</strong> ragihandin benda nirxandinê ye"
+        other: "<strong>%{count}</strong> ragihandin benda nirxandinê ne"
       pending_tags_html:
-        one: "<strong>1</strong> hashtag benda nirxandinê"
-        other: "<strong>%{count}</strong> hashtag benda nirxandinê"
+        one: "<strong>%{count}</strong> hashtag benda nirxandinê ye"
+        other: "<strong>%{count}</strong> hashtag benda nirxandinê ne"
       pending_users_html:
-        one: "<strong>1</strong> bikarhêner benda nirxandinê"
-        other: "<strong>%{count}</strong> bikarhêner benda nirxandinê"
+        one: "<strong>%{count}</strong> bikarhêner benda nirxandinê ye"
+        other: "<strong>%{count}</strong> bikarhêner benda nirxandinê ne"
       resolved_reports: ragihandinên çareserkirî
       software: Nermalav
       sources: Çavkaniyên tomarkirî
@@ -401,6 +413,10 @@ kmr:
       top_languages: Zimanên herî çalak
       top_servers: Rajekarên herî çalak
       website: Malpera tevnê
+    disputes:
+      appeals:
+        empty: Îtîraz nehatin dîtin.
+        title: Îtîraz
     domain_allows:
       add_new: Maf bide navpera federasyonê
       created_msg: Ji bo federasyonê maf dayîna navperê bi serkeftî hate dayîn
@@ -443,6 +459,7 @@ kmr:
         affected_accounts:
           one: Yek ajimêr di danegehê de bandor kir
           other: "%{count} ajimêr di danegehê de bandor kir"
+          zero: Yek ajimêr di danegehê de bi bandor e
         retroactive:
           silence: Vê navperê de sînorê li ser hemî ajimêran rabike
           suspend: Vê navperê de rawestandinê li ser hemî ajimêran rabike
@@ -496,6 +513,7 @@ kmr:
       known_accounts:
         one: "%{count} ajimêra naskirî"
         other: "%{count} ajimêrên naskirî"
+        zero: Ajimêra naskirî tune ye
       moderation:
         all: Hemû
         limited: Sînorkirî
@@ -562,10 +580,12 @@ kmr:
       action_log: Tomarê çavdêriyê
       action_taken_by: Çalakî hate kirin ji aliyê
       actions:
+        delete_description_html: Şandiyên hatine ragihandin wê werin jêbirin û were tomarkirin da ku ji te re bibe alîkar ku tu ji hêla heman ajimêrê ve binpêkirinên pêşerojê bêtir bikî.
         other_description_html: Bêtir vebijêrkên ji bo kontrolkirina tevgera ajimêrê bibîne û pêwendiyê li ser ajimêra ragihandî kesane bike.
+        resolve_description_html: Li hemberî ajimêra hatiye ragihandin wê tiştek pêk neyê, binpêkirin nayên tomarkirin û ragihandin wê were girtin.
         silence_description_html: Wê profîl tenê ji kesên ku berê te dişopînin an ji bi destan lê serî lê didin re xuya bibe, gihandina wê bi tundî sînordar dike. Her gav dikare were vegerandin.
         suspend_description_html: Heya ku di dawiyê de neyê jêbirin, wê profîl û hemû naverokên wê ne gihiştbar bin. Têkiliya bi ajimêrê re wê ne guncav be. Di nav 30 rojan de veger ji jêbirinê pêkan e.
-      actions_description_html: 'Ku rakirina naveroka sûcdar a li jor ne bes e:'
+      actions_description_html: Ji bo çareserkirina vê ragihandinê biryar bide ka tê kîjan gav bavêjî. Ku tu li dijî ajimêrê ragihandî çalakiyeke cezakirinê bikî, ji bilî dema ku kategoriya <strong>Spam</strong> were hilbijartin, wê agahdariyek e-nameyê ji wan re were şandin.
       add_to_report: Bo ragihandinê bêtir tevlî bike
       are_you_sure: Gelo tu bawerî?
       assign_to_self: Bo min diyar bike
@@ -577,7 +597,7 @@ kmr:
         none: Ne yek
       comment_description_html: 'Bo bêtir zanyarî bidî, %{name} nivîsand:'
       created_at: Hate ragihandin
-      delete_and_resolve: Jê bibe û ji nû ve çareser bike
+      delete_and_resolve: Şandiyan jê bibe
       forwarded: Beralîkirî
       forwarded_to: Beralîkirî bo %{domain}
       mark_as_resolved: Wekî çareserkirî nîşan bide
@@ -591,12 +611,14 @@ kmr:
         placeholder: Bide nasîn ka çi çalakî hatine kirin, an jî heman rojanekirinên din ên têkildar...
         title: Nîşe
       notes_description_html: Nîşeyan ji çavdêrên din û ji xwe re di pêşerojê de bibîne û bihêle
+      quick_actions_description_html: 'Ji bo dîtina naveroka ragihandî çalakiyeke bilez bavêje an jî li jêr bigere:'
       reopen: Ragihandina ji nû ve veke
       report: "@%{id} Ragihîne"
       reported_account: Ajimêra ragihandî
       reported_by: Ragihandî ji aliyê
       resolved: Çareserkirî
       resolved_msg: Ragihandin bi awayekî serkeftî hate çareserkirin!
+      skip_to_actions: Derbasî çalakiyan bibe
       status: Rewş
       statuses: Naveroka ragihandî
       statuses_description_html: Naveroka sûcdar wê di danûstendina bi xwediyê ajimêra ragihandî re wê werê diyarkirin
@@ -717,6 +739,16 @@ kmr:
       no_status_selected: Tu şandî nehat hilbijartin ji ber vê tu şandî jî nehat guhertin
       title: Şandiyên ajimêr
       with_media: Bi medya yê re
+    strikes:
+      actions:
+        delete_statuses: "%{name} şandiyên %{target} jêbirin"
+        disable: "%{name} ajimêr %{target} cemidand"
+        none: "%{name} ji bo %{target} hişyariyek şand"
+        sensitive: "%{name} ajimêrê %{target} wekî hestiyarî nîşan kir"
+        silence: "%{name} ajimêra %{target} bi sînor kir"
+        suspend: "%{name} ajimêra %{target} hilda rawestandinê"
+      appeal_approved: Îtîraz
+      appeal_pending: Îtîraz li benda nirxandinê ye
     system_checks:
       database_schema_check:
         message_html: Koçberiyên databasê yên li bendê hene. Ji kerema xwe wan bişopîne da ku bicîh bikî ku sepan wekî ku tê hêvî kirin tevbigere
@@ -740,7 +772,8 @@ kmr:
         disallow_provider: Mafê nede weşanger
         shared_by_over_week:
           one: Di nava hefteya dawî de ji aliyê keskekî ve hate parvekirin
-          other: Di nava hefteya dawî de ji aliyê %{count} ve hate parvekirin
+          other: Di nava hefteya dawî de ji aliyê %{count} kes ve hate parvekirin
+          zero: Di nava hefteya dawî de ji aliyê kesekî ve nehate parvekirin
         title: Girêdanên di rojevê de
         usage_comparison: Îro %{today} car hate parvekirin, li gorî %{yesterday} duh
       pending_review: Li benda nirxandinê ye
@@ -770,6 +803,7 @@ kmr:
         used_by_over_week:
           one: Di nava hefteya dawî de ji aliyê kesekî ve hatiye bikaranîn
           other: Di nava hefteya dawî de ji %{count} kes ve hatiye bikaranîn
+          zero: Di nava hefteya dawî de ji aliyê kesekî ve nehate bikaranîn
       title: Rojev
     warning_presets:
       add_new: Yeka nû tevlî bike
@@ -778,6 +812,17 @@ kmr:
       empty: Te hin tu hişyariyên pêşsazkirî destnîşan nekirine.
       title: Hişyariyên pêşsazkirî bi rêve bibe
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: ku şandiyên wan jê bibî
+        disable: ku ajimêrê wan bicemidînî
+        none: hişyariyek
+        sensitive: ku ajimêrê wan wekî hestyar nîşan bikî
+        silence: ku ajimêrê wan sînordar bikî
+        suspend: ku ajimêrê wan bidî rawestandin
+      body: "%{target} îtiraza biryareke çavdêriyê dike bi riya %{action_taken_by} ji %{date}, ku %{type} bû. Wan nivîsand:"
+      next_steps: Tu dikarî îtirazê bipejirînî ku biryara çavdêriyê têk bibî, an jî paşguh bikî.
+      subject: "%{username} li ser %{instance} îtiraz li biryareke çavdêriyê dike"
     new_pending_account:
       body: Zanyariyênn ajimêra nû li jêr in. Tu dikarî vê serîlêdanê bipejirîne an pûç bike.
       subject: "(%{username}) ajimêrê nû ji bo vekolandina li ser %{instance}"
@@ -868,7 +913,6 @@ kmr:
     status:
       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.
       redirecting_to: Ajimêra te neçalak e ji ber ku niha ber bi %{acct} ve tê beralîkirin.
     too_fast: Form pir zû hat şandin, dîsa biceribîne.
@@ -934,6 +978,32 @@ kmr:
     directory: Rêgeha profîlê
     explanation: Bikarhêneran li gorî berjewendiyên wan bibîne
     explore_mastodon: Vekole %{title}
+  disputes:
+    strikes:
+      action_taken: Çalakî hatin kirin
+      appeal: Îtîraz
+      appeal_approved: Ev binpêkirin bi serkeftî hate îtîraz kirin û êdî ne derbasdar e
+      appeal_rejected: Îtîraz nehate pejirandin
+      appeal_submitted_at: Îtîraz hate şandin
+      appealed_msg: Îtîraza te hatiye şandin. Ku were pejirandin, tu yê werî agahdarkirin.
+      appeals:
+        submit: Îtîrazê bişîne
+      associated_report: Ragihandina têkildar
+      created_at: Dîrok
+      recipient: Ji kê re
+      status: 'Şandî #%{id}'
+      status_removed: Şandî jixwe ji pergalê hatî rakirin
+      title: "%{action} ji %{date}"
+      title_actions:
+        delete_statuses: Jêbirina şandiyê
+        disable: Cemdandina ajimêrê
+        none: Hişyarî
+        sensitive: Nîşankirina ajimêr wekî hestyar
+        silence: Sînorkirina ajimêrê
+        suspend: Rawestandina ajimêrê
+      your_appeal_approved: Îtîraza te hate pejirandin
+      your_appeal_pending: Te îtîrazek şand
+      your_appeal_rejected: Îtîraza te nehate pejirandin
   domain_validator:
     invalid_domain: ne naveke navper a derbasdar e
   errors:
@@ -1145,6 +1215,8 @@ kmr:
       title: Bilindkirinên nû
     status:
       subject: "%{name} niha şand"
+    update:
+      subject: "%{name} şandiyek guhert"
   notifications:
     email_events: Bûyer bo agahdariyên e-nameyê
     email_events_hint: 'Bûyera ku tu dixwazî agahdariyan jê wergerî hilbijêre:'
@@ -1495,6 +1567,15 @@ kmr:
     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.
     webauthn: Kilîdên ewlehiyê
   user_mailer:
+    appeal_approved:
+      action: Biçe ajimêra xwe
+      explanation: Îtîraza binpêkirinê ya li dijî ajimêrê te ya %{strike_date} ku te di %{appeal_date} de şandibû hate pejirandin. Ajimêrê te careke din di rewşek baş de ye.
+      subject: Îtîraza te ji %{date} hate pejirandin
+      title: Îtîraz hate pejirandin
+    appeal_rejected:
+      explanation: Îtîraza binpêkirinê ya li dijî ajimêrê te ya di %{strike_date} de ku te di %{appeal_date} de şandibû nehat pejirandin.
+      subject: Îtîraza te ji %{date} nehate pejirandin
+      title: Îtîraz nehate pejirandin
     backup_ready:
       explanation: Te yedekîya tijê ya ajimêrê xwe Mastodonê xwest. Niha ji daxistinê re amade ye!
       subject: Arşîva te amede ye bo daxistinê
@@ -1506,6 +1587,8 @@ kmr:
       subject: Ji kerema xwe re hewldanên têketinê piştrast bike
       title: Hewldanên têketinê
     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î.
       categories:
         spam: Nexwestî (Spam)
         violation: Naverok rêbazên civakê yên jêrîn binpê dike
@@ -1517,7 +1600,6 @@ kmr:
         suspend: Tu êdî nikarî têkevî ajimêra xwe, û profîla te û daneyên din êdî nayên gihîştin. Dîsa jî tu dikarî têkevî da ku hilanîna daneyên xwe daxwaz bikî heya ku dane bi tevahî werin rakirin di hundirê 30 roj de, lê em ê hin daneyan biparêzin da ku tu ji rawestandinê rizgar bikî.
       get_in_touch: Ku tu bawer dikî ev çewtiyeke, tu dikarî bersiva vê e-nameyê bidî ku bi xebatkarên %{instance} re têkevî pêwendiyê.
       reason: 'Sedem:'
-      review_server_policies: Rêbazên rajeker lêkolîn bike
       statuses: 'Şandiyên ku di binpêkirinê de hatine dîtin:'
       subject:
         delete_statuses: Şandiyên te yên li ser %{acct} hatin rakirin
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 4da68f0b4..9efdeb751 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -90,7 +90,6 @@ ko:
     account_moderation_notes:
       create: 중재 기록 작성하기
       created_msg: 중재 기록이 성공적으로 작성되었습니다!
-      delete: 삭제
       destroyed_msg: 중재 기록이 성공적으로 삭제되었습니다!
     accounts:
       add_email_domain_block: 이 이메일 도메인을 차단하기
@@ -159,6 +158,11 @@ ko:
       not_subscribed: 구독하지 않음
       pending: 심사 대기
       perform_full_suspension: 정지시키기
+      previous_strikes: 이전의 처벌들
+      previous_strikes_description_html:
+        one: 이 계정은 <strong>한<strong> 번의 처벌이 있었습니다.
+        other: 이 계정은 <strong>%{count}</strong> 번의 처벌이 있었습니다.
+        zero: 이 계정은 처벌 기록이 <strong>없습니다</strong>.
       promote: 승급
       protocol: 프로토콜
       public: 공개
@@ -202,6 +206,7 @@ ko:
       statuses: 게시물
       strikes: 이전의 처벌들
       subscribe: 구독하기
+      suspend: 정지
       suspended: 정지 됨
       suspension_irreversible: 이 계정의 데이터는 복구할 수 없도록 삭제되었습니다. 계정을 정지 해제함으로서 계정을 다시 사용 가능하게 할 수 있지만 이전에 삭제한 어떤 데이터도 복구되지 않습니다.
       suspension_reversible_hint_html: 계정이 정지되었습니다, 그리고 %{date}에 데이터가 완전히 삭제될 것입니다. 그 때까지는 어떤 안 좋은 효과 없이 계정이 복구 될 수 있습니다. 만약 지금 당장 계정의 모든 데이터를 삭제하고 싶다면, 아래에서 행할 수 있습니다.
@@ -222,6 +227,7 @@ ko:
       whitelisted: 허용 목록
     action_logs:
       action_types:
+        approve_appeal: 이의제기 승인
         approve_user: 사용자 승인
         assigned_to_self_report: 신고 맡기
         change_email_user: 사용자의 이메일 변경
@@ -253,6 +259,7 @@ ko:
         enable_user: 사용자 활성화
         memorialize_account: 추모계정으로 전환
         promote_user: 사용자 승급
+        reject_appeal: 이의제기 거절
         reject_user: 사용자 거부
         remove_avatar_user: 아바타 지우기
         reopen_report: 신고 다시 열기
@@ -271,6 +278,7 @@ ko:
         update_domain_block: 도메인 차단 갱신
         update_status: 게시물 게시
       actions:
+        approve_appeal_html: "%{name} 님이 %{target}의 중재 결정에 대한 이의제기를 승인했습니다"
         approve_user_html: "%{name} 님이 %{target}의 가입을 승인했습니다"
         assigned_to_self_report_html: "%{name} 님이 신고 %{target}을 자신에게 할당했습니다"
         change_email_user_html: "%{name} 님이 사용자 %{target}의 이메일 주소를 변경했습니다"
@@ -302,6 +310,7 @@ ko:
         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}을 다시 열었습니다"
@@ -380,12 +389,14 @@ ko:
       media_storage: 미디어 저장소
       new_users: 새로운 사용자
       opened_reports: 신고 열림
+      pending_appeals_html:
+        other: "<strong>%{count}</strong> 개의 대기 중인 이의제기"
       pending_reports_html:
-        other: "<strong>%{count}</strong> 개의 신고 대기중"
+        other: "<strong>%{count}</strong> 건의 대기 중인 신고"
       pending_tags_html:
-        other: "<strong>%{count}</strong> 개의 해시태그 대기중"
+        other: "<strong>%{count}</strong> 개의 대기 중인 해시태그"
       pending_users_html:
-        other: "<strong>%{count}</strong> 명의 사용자 대기중"
+        other: "<strong>%{count}</strong> 명의 대기 중인 사용자"
       resolved_reports: 신고 해결됨
       software: 소프트웨어
       sources: 가입 출처
@@ -394,6 +405,10 @@ ko:
       top_languages: 상위 활성 언어
       top_servers: 상위 활성 서버
       website: 웹사이트
+    disputes:
+      appeals:
+        empty: 이의제기 없음.
+        title: 이의제기
     domain_allows:
       add_new: 도메인 허용
       created_msg: 도메인이 성공적으로 허용 목록에 추가되었습니다
@@ -434,7 +449,9 @@ ko:
         suspend: 정지
       show:
         affected_accounts:
-          other: 데이터베이스 중 %{count}개의 계정에 영향을 끼칩니다
+          one: 데이터베이스 내부의 1개의 계정에 영향을 끼칩니다
+          other: 데이터베이스 내부의 %{count} 개의 계정에 영향을 끼칩니다
+          zero: 데이터베이스 내부의 영향을 끼치는 계정이 없습니다
         retroactive:
           silence: 이 도메인에 존재하는 모든 계정의 침묵를 해제
           suspend: 이 도메인에 존재하는 모든 계정의 계정 정지를 해제
@@ -485,7 +502,9 @@ ko:
       destroyed_msg: "%{domain}의 데이터는 곧바로 지워지도록 대기열에 들어갔습니다."
       empty: 도메인이 하나도 없습니다.
       known_accounts:
-        other: 알려진 계정 %{count}개
+        one: "%{count} 개의 알려진 계정"
+        other: "%{count} 개의 알려진 계정"
+        zero: 알려진 계정이 없습니다
       moderation:
         all: 모두
         limited: 제한됨
@@ -551,10 +570,11 @@ ko:
       action_log: 감사 기록
       action_taken_by: 신고 처리자
       actions:
+        delete_description_html: 신고된 게시물은 삭제될 것이며 이 처벌기록은 같은 계정의 향후 규정 위반에 대해 참고사항으로 쓰일 수 있도록 저장됩니다.
         other_description_html: 계정 동작을 제어하고 신고된 계정과의 의사소통을 사용자 지정하기 위한 추가 옵션을 봅니다.
+        resolve_description_html: 신고된 계정에 대해 아무런 동작도 취하지 않으며, 처벌기록이 남지 않으며, 신고는 처리됨으로 변경됩니다.
         silence_description_html: 이미 팔로우 하고 있는 사람이나 수동으로 찾아보는 사람에게만 프로필이 보여지고, 도달 범위를 엄격하게 제한합니다. 언제든지 되돌릴 수 있습니다.
         suspend_description_html: 프로필과 모든 컨텐츠가 최종적으로 삭제될 때까지 접근 불가상태가 됩니다. 이 계정과의 상호작용은 불가능해집니다. 30일 이내에 되돌릴 수 있습니다.
-      actions_description_html: '만약 문제가 되는 위의 컨텐츠를 삭제하는 것을 불충분할 때에는:'
       add_to_report: 신고에 더 추가하기
       are_you_sure: 정말로 실행하시겠습니까?
       assign_to_self: 나에게 할당하기
@@ -566,7 +586,7 @@ ko:
         none: 없음
       comment_description_html: '더 많은 정보를 위해, %{name} 님이 작성했습니다:'
       created_at: 리포트 시각
-      delete_and_resolve: 삭제하고 처리됨으로 변경
+      delete_and_resolve: 게시물 삭제
       forwarded: 전달됨
       forwarded_to: "%{domain}에게 전달됨"
       mark_as_resolved: 해결 완료 처리
@@ -706,6 +726,16 @@ ko:
       no_status_selected: 아무 게시물도 선택 되지 않아 아무 것도 바뀌지 않았습니다
       title: 계정 게시물
       with_media: 미디어 있음
+    strikes:
+      actions:
+        delete_statuses: "%{name} 님이 %{target}의 게시물을 지웠습니다"
+        disable: "%{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: 데이터베이스 마이그레이션이 대기중입니다. 응용프로그램이 예상한대로 동작할 수 있도록 마이그레이션을 실행해 주세요
@@ -728,7 +758,9 @@ ko:
         disallow: 링크 거부하기
         disallow_provider: 출처 거부하기
         shared_by_over_week:
-          other: 한 주 동안 %{count}명의 사람이 공유했습니다
+          one: 지난 주 동안 한 명의 사람이 공유했습니다
+          other: 지난 주 동안 %{count} 명의 사람들이 공유했습니다
+          zero: 지난 주 동안 공유한 사람이 없습니다
         title: 지금 유행 중인 링크
         usage_comparison: 오늘은 %{today}회 공유되었고, 어제는 %{yesterday}회 공유되었습니다
       pending_review: 심사 대기
@@ -748,15 +780,17 @@ ko:
         listable: 추천될 수 있습니다
         not_listable: 추천될 수 없습니다
         not_trendable: 유행 목록에 나타나지 않습니다
-        not_usable: 사용할 수 없음
+        not_usable: 사용불가
         peaked_on_and_decaying: "%{date}에 고점을 찍고, 떨어지고 있습니다"
         title: 유행하는 해시태그
         trendable: 유행 목록에 나타날 수 있습니다
         trending_rank: "#%{rank}위로 유행 중"
-        usable: 사용할 수 없음
+        usable: 사용 가능
         usage_comparison: 오늘은 %{today}회 사용되었고, 어제는 %{yesterday}회 사용되었습니다
         used_by_over_week:
-          other: 한 주 동안 %{count}명의 사람이 사용했습니다
+          one: 지난 주 동안 한 명의 사람이 사용했습니다
+          other: 지난 주 동안 %{count} 명의 사람들이 사용했습니다
+          zero: 지난 주 동안 사용한 사람이 없습니다
       title: 유행
     warning_presets:
       add_new: 새로 추가
@@ -765,6 +799,9 @@ ko:
       empty: 아직 어떤 경고 틀도 정의되지 않았습니다.
       title: 경고 틀 관리
   admin_mailer:
+    new_appeal:
+      actions:
+        none: 경고
     new_pending_account:
       body: 아래에 새 계정에 대한 상세정보가 있습니다. 이 가입을 승인하거나 거부할 수 있습니다.
       subject: "%{instance}의 새 계정(%{username})에 대한 심사가 대기중입니다"
@@ -855,7 +892,6 @@ ko:
     status:
       account_status: 계정 상태
       confirming: 이메일 확인 과정이 완료되기를 기다리는 중.
-      functional: 계정이 완벽히 작동합니다.
       pending: 당신의 가입 신청은 스태프의 검사를 위해 대기중입니다. 이것은 시간이 다소 소요됩니다. 가입 신청이 승인 될 경우 이메일을 받게 됩니다.
       redirecting_to: 계정이 %{acct}로 리다이렉트 중이기 때문에 비활성 상태입니다.
     too_fast: 너무 빠르게 양식이 제출되었습니다, 다시 시도하세요.
@@ -921,6 +957,25 @@ ko:
     directory: 프로필 책자
     explanation: 관심사에 대한 유저들을 발견합니다
     explore_mastodon: "%{title} 탐사하기"
+  disputes:
+    strikes:
+      action_taken: 내려진 징계
+      appeal: 이의제기
+      appeal_submitted_at: 이의제기 접수됨
+      appealed_msg: 당신의 이의제기가 접수되었습니다. 만약 승인된다면, 알림을 받게 될 것입니다.
+      appeals:
+        submit: 이의 제출
+      associated_report: 관련된 신고
+      created_at: 날짜
+      recipient: 수신자
+      status: '게시물 #%{id}'
+      status_removed: 게시물이 이미 시스템에서 지워졌습니다
+      title_actions:
+        delete_statuses: 게시물 삭제
+        disable: 계정 동결
+        none: 경고
+        sensitive: 계정을 민감함으로 표시
+        silence: 계정의 제한
   domain_validator:
     invalid_domain: 올바른 도메인 네임이 아닙니다
   errors:
@@ -1128,6 +1183,8 @@ ko:
       title: 새 부스트
     status:
       subject: "%{name} 님이 방금 게시물을 올렸습니다"
+    update:
+      subject: "%{name} 님이 게시물을 수정했습니다"
   notifications:
     email_events: 이메일 알림에 대한 이벤트
     email_events_hint: '알림 받을 이벤트를 선택해주세요:'
@@ -1288,6 +1345,7 @@ ko:
         other: "%{count}개의 영상"
     boosted_from_html: "%{acct_link} 님으로부터 부스트"
     content_warning: '열람 주의: %{warning}'
+    default_language: 화면 표시 언어와 동일하게
     disallowed_hashtags:
       other: '허용되지 않은 해시태그를 포함하고 있습니다: %{tags}'
     edited_at: "%{date}에 편집됨"
@@ -1468,6 +1526,8 @@ ko:
     recovery_instructions_html: 휴대전화를 분실한 경우, 아래 복구 코드 중 하나를 사용해 계정에 접근할 수 있습니다. <strong>복구 코드는 안전하게 보관해 주십시오.</strong> 이 코드를 인쇄해 중요한 서류와 함께 보관하는 것도 좋습니다.
     webauthn: 보안 키
   user_mailer:
+    appeal_approved:
+      action: 내 계정으로 가기
     backup_ready:
       explanation: 당신이 요청한 계정의 풀 백업이 이제 다운로드 가능합니다!
       subject: 당신의 아카이브를 다운로드 가능합니다
@@ -1490,7 +1550,6 @@ ko:
         suspend: 당신은 더이상 당신의 계정을 사용할 수 없으며, 프로필과 데이터는 접근 불가능하게 됩니다. 데이터가 완전히 삭제되기 전인 30일동안은 여전히 백업을 요청하기 위해 로그인 할 수 있습니다, 하지만 계정 정지를 회피하는 것을 방지하기 위하여 몇 가지 정보는 유지됩니다.
       get_in_touch: 이것이 잘못된 조치라고 생각된다면, 이 메일에 답장하여 %{instance}의 스태프들에게 연락할 수 있습니다.
       reason: '사유:'
-      review_server_policies: 서버 정책 검토하기
       statuses: '위반사항이 발견된 게시물:'
       subject:
         delete_statuses: 당신의 계정 %{acct}에서 작성한 게시물이 삭제되었습니다
diff --git a/config/locales/ku.yml b/config/locales/ku.yml
index 744ead215..bcf71682a 100644
--- a/config/locales/ku.yml
+++ b/config/locales/ku.yml
@@ -90,7 +90,6 @@ ku:
     account_moderation_notes:
       create: جێهێشتنی تێبینی
       created_msg: تێبینی بەڕێوەبەر بە سەرکەوتوویی دروست کرا!
-      delete: سڕینەوە
       destroyed_msg: تێبینی بەڕێوەبەر بە سەرکەوتوویی لەناوچوو!
     accounts:
       add_email_domain_block: بلۆککردنی هەموو دۆمەینەکە
@@ -342,9 +341,6 @@ ku:
         silence: بێدەنگ
         suspend: ڕاگرتن
       show:
-        affected_accounts:
-          one: هەژمارەیەک کە لە بنکەی زانیارێکان کاریگەری لەسەرە
-          other: "%{count} هەژمارەیەک کە لە بنکەی زانیارێکان کاریگەری لەسەرە"
         retroactive:
           silence: نابێدەنگی ئەو ئەژمێرانەی کە هەیە لەم دۆمەینەوە
           suspend: هەڵنەپەسێدراوی هەژمارە کاریگەرەکانی ئەم دۆمەین
@@ -367,9 +363,6 @@ ku:
     instances:
       by_domain: دۆمەین
       delivery_available: گەیاندن بەردەستە
-      known_accounts:
-        one: "%{count} هەژمارەی ناسراو"
-        other: "%{count} هەژمارەکانی ناسراو"
       moderation:
         all: هەموو
         limited: سنووردار
@@ -639,7 +632,6 @@ ku:
     status:
       account_status: دۆخی هەژمارە
       confirming: چاوەڕوانی دڵنیاکردنەوەی ئیمەیڵ بۆ تەواوکردن.
-      functional: هەژمارەکەت بەتەواوی کارا بووەتەوە.
       pending: ئەپلیکەیشەنەکەت چاوەڕوانی پێداچوونەوەیە لەلایەن ستافەکەمانەوە. لەوانەیە ئەمە هەندێک کاتی بخایەنێت ئەگەر ئەۆپەکەت پەسەند کرا، ئیمەیڵت پێدەگات.
       redirecting_to: هەژمارەکەت ناچالاکە لەبەرئەوەی ئێستا دووبارە ئاڕاستەدەکرێتەوە بۆ %{acct}.
     trouble_logging_in: کێشە ت هەیە بۆ چوونە ژوورەوە?
@@ -1179,7 +1171,6 @@ ku:
       subject: تکایە دڵنیابە لە هەوڵدان بۆ چوونە ژوورەوە
       title: هەوڵدان بۆ چوونە ژوورەوە
     warning:
-      review_server_policies: پێداچوونەوەی سیاسەتەکانی ڕاژە
       subject:
         disable: هەژمارەکەت %{acct} بەستراوە
         none: ئاگاداری بۆ %{acct}
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index c41db64cf..bf7166b4f 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -46,7 +46,6 @@ lt:
     account_moderation_notes:
       create: Palikti žinutę
       created_msg: Moderavimo žinutė sėkimngai sukurta!
-      delete: Ištrinti
       destroyed_msg: Moderacijos žinutė sėkmingai ištrinta!
     accounts:
       are_you_sure: Ar esate įsitikinęs?
@@ -729,7 +728,6 @@ lt:
       subject: Jūsų archyvas paruoštas parsisiuntimui
       title: Archyvas išimtas
     warning:
-      review_server_policies: Apžvelgti serverio politiką
       subject:
         disable: Jūsų paskyra %{acct} buvo užšaldyta
         none: Įspėjmas vartotojui %{acct}
diff --git a/config/locales/lv.yml b/config/locales/lv.yml
index 875ad5c05..808cc567e 100644
--- a/config/locales/lv.yml
+++ b/config/locales/lv.yml
@@ -98,7 +98,6 @@ lv:
     account_moderation_notes:
       create: Atstāt piezīmi
       created_msg: Moderācijas piezīme ir veiksmīgi izveidota!
-      delete: Dzēst
       destroyed_msg: Moderācijas piezīme ir veiksmīgi iznīcināta!
     accounts:
       add_email_domain_block: Bloķēt e-pasta domēnu
@@ -167,6 +166,11 @@ lv:
       not_subscribed: Nav abonēts
       pending: Gaida pārskatīšanu
       perform_full_suspension: Apturēt
+      previous_strikes: Iepriekšējie brīdinājumi
+      previous_strikes_description_html:
+        one: Šim kontam ir <strong>viens</strong> brīdinājums.
+        other: Šim kontam ir <strong>%{count}</strong> brīdinājumi.
+        zero: Š konta <strong>stāvoklis ir labs</strong>.
       promote: Veicināt
       protocol: Protokols
       public: Publisks
@@ -210,6 +214,7 @@ lv:
       statuses: Ziņas
       strikes: Iepriekšējie streiki
       subscribe: Abonēt
+      suspend: Apturēt
       suspended: Apturēts
       suspension_irreversible: Šī konta dati ir neatgriezeniski izdzēsti. Tu vari atcelt konta darbības apturēšanu, lai tas būtu izmantojams, taču tas neatjaunos iepriekšējos datus.
       suspension_reversible_hint_html: Konta darbība ir apturēta, un dati tiks pilnībā noņemti %{date}. Līdz tam kontu var atjaunot bez jebkādām nelabvēlīgām sekām. Ja vēlies nekavējoties noņemt visus konta datus, to vari izdarīt zemāk.
@@ -230,6 +235,7 @@ lv:
       whitelisted: Atļauts federācijai
     action_logs:
       action_types:
+        approve_appeal: Apstiprināt Apelāciju
         approve_user: Apstiprināt lietotāju
         assigned_to_self_report: Piešķirt Pārskatu
         change_email_user: Mainīt e-pastu lietotājam
@@ -261,6 +267,7 @@ lv:
         enable_user: Ieslēgt Lietotāju
         memorialize_account: Saglabāt Kontu Piemiņai
         promote_user: Paaugstināt Lietotāju
+        reject_appeal: Noraidīt Apelāciju
         reject_user: Noraidīt lietotāju
         remove_avatar_user: Noņemt Avatāru
         reopen_report: Atkārtoti Atvērt Ziņojumu
@@ -279,6 +286,7 @@ lv:
         update_domain_block: Atjaunināt Domēna Bloku
         update_status: Atjaunināt ziņu
       actions:
+        approve_appeal_html: "%{name} apstiprināja moderācijas lēmuma apelāciju no %{target}"
         approve_user_html: "%{name} apstiprināja reģistrēšanos no %{target}"
         assigned_to_self_report_html: "%{name} piešķīra pārskatu %{target} sev"
         change_email_user_html: "%{name} nomainīja e-pasta adresi lietotājam %{target}"
@@ -310,6 +318,7 @@ lv:
         enable_user_html: "%{name} iespējoja pieteikšanos lietotājam %{target}"
         memorialize_account_html: "%{name} pārvērta %{target} kontu par atmiņas lapu"
         promote_user_html: "%{name} paaugstināja lietotāju %{target}"
+        reject_appeal_html: "%{name} noraidīja moderācijas lēmuma apelāciju no %{target}"
         reject_user_html: "%{name} noraidīja reģistrēšanos no %{target}"
         remove_avatar_user_html: "%{name} noņēma %{target} avatāru"
         reopen_report_html: "%{name} atkārtoti atvēra ziņojumu %{target}"
@@ -388,18 +397,22 @@ lv:
       media_storage: Mediju krātuve
       new_users: jauni lietotāji
       opened_reports: atvērtie ziņojumi
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> izskatāmā apelācija"
+        other: "<strong>%{count}</strong> izskatāmās apelācijas"
+        zero: "<strong>%{count}</strong> izskatāmo apelāciju"
       pending_reports_html:
-        one: "<strong>1</strong> ziņojums gaida"
+        one: "<strong>%{count}</strong>ziņojums gaida"
         other: "<strong>%{count}</strong>ziņojumi gaida"
-        zero: "<strong>%{count}</strong> ziņojumu"
+        zero: "<strong>%{count}</strong>ziņojumi gaida"
       pending_tags_html:
-        one: "<strong>1</strong> tēmturis gaida"
+        one: "<strong>%{count}</strong>tēmturis gaida"
         other: "<strong>%{count}</strong>tēmturi gaida"
-        zero: "<strong>%{count}</strong> tēmturu"
+        zero: "<strong>%{count}</strong>tēmturi gaida"
       pending_users_html:
-        one: "<strong>1</strong> lietotājs gaida"
+        one: "<strong>%{count}</strong>lietotājs gaida"
         other: "<strong>%{count}</strong>lietotāji gaida"
-        zero: "<strong>%{count}</strong> lietotāju"
+        zero: "<strong>%{count}</strong>lietotāji gaida"
       resolved_reports: ziņojumi atrisināti
       software: Programmatūra
       sources: Reģistrēšanās avoti
@@ -408,6 +421,10 @@ lv:
       top_languages: Aktīvākās valodas
       top_servers: Aktīvākie serveri
       website: Tīmekļa vietne
+    disputes:
+      appeals:
+        empty: Apelācijas netika atrastas.
+        title: Apelācijas
     domain_allows:
       add_new: Atļaut federāciju ar domēnu
       created_msg: Domēns ir veiksmīgi atļauts federācijai
@@ -448,7 +465,7 @@ lv:
         affected_accounts:
           one: Ietekmēts viens konts datu bāzē
           other: Ietekmēti %{count} konti datu bāzē
-          zero: "%{count} ietekmētu kontu"
+          zero: Nav ietekmētu kontu datubāzē
         retroactive:
           silence: Atsaukt ierobežojumus esošajiem ietekmētajiem kontiem no šī domēna
           suspend: Atcelt šī domēna esošo ietekmēto kontu darbības apturēšanu
@@ -503,7 +520,7 @@ lv:
       known_accounts:
         one: "%{count} zināms konts"
         other: "%{count} zināmi konti"
-        zero: "%{count} zināmu kontu"
+        zero: Nav zināmu kontu
       moderation:
         all: Visas
         limited: Ierobežotās
@@ -571,10 +588,12 @@ lv:
       action_log: Auditācijas pieraksti
       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.
         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, stingri ierobežojot tās sasniedzamību. Šo vienmēr var atgriezt.
         suspend_description_html: Profils un viss tā saturs kļūs nepieejami, līdz tas beidzot tiek izdzēsts. Mijiedarbība ar kontu būs neiespējama. Atgriežams 30 dienu laikā.
-      actions_description_html: 'Ja ar minētā satura noņemšanu vien nepietiek:'
+      actions_description_html: Izlem, kādas darbības jāveic, lai atrisinātu šo ziņojumu. Ja veiksi sodīšanas darbību pret kontu, par kuru ziņots, tam tiks nosūtīts e-pasta paziņojums, izņemot gadījumus, kad ir atlasīta kategorija <strong>Spam</strong>.
       add_to_report: Pievienot varāk paziņošanai
       are_you_sure: Vai esi pārliecināts?
       assign_to_self: Piešķirt man
@@ -586,7 +605,7 @@ lv:
         none: Neviens
       comment_description_html: 'Lai sniegtu vairāk informācijas, %{name} rakstīja:'
       created_at: Ziņoti
-      delete_and_resolve: Dzēst un atrisināt
+      delete_and_resolve: Izdzēst rakstus
       forwarded: Pārsūtīti
       forwarded_to: Pārsūtīti %{domain}
       mark_as_resolved: Atzīmēt kā atrisinātu
@@ -600,12 +619,14 @@ lv:
         placeholder: Apraksti veiktās darbības vai citus saistītus atjauninājumus...
         title: Piezīmes
       notes_description_html: Skati un atstāj piezīmes citiem moderatoriem un sev nākotnei
+      quick_actions_description_html: 'Veic ātro darbību vai ritini uz leju, lai skatītu saturu, par kuru ziņots:'
       reopen: Atkārtoti atvērt ziņojumu
       report: 'Ziņojums #%{id}'
       reported_account: Ziņotais konts
       reported_by: Ziņoja
       resolved: Atrisināts
       resolved_msg: Ziņojums veiksmīgi atrisināts!
+      skip_to_actions: Pāriet uz darbībām
       status: Statuss
       statuses: Ziņotais saturs
       statuses_description_html: Pārkāpuma saturs tiks minēts saziņā ar paziņoto kontu
@@ -726,6 +747,16 @@ lv:
       no_status_selected: Neviena ziņa netika mainīta, jo neviena netika atlasīta
       title: Konta ziņas
       with_media: Ar medijiem
+    strikes:
+      actions:
+        delete_statuses: "%{name} izdzēsa %{target} publikācijas"
+        disable: "%{name} iesaldēja %{target} kontu"
+        none: "%{name} nosūtīja brīdinājumu %{target}"
+        sensitive: "%{name} atzīmēja %{target} kontu kā sensitīvu"
+        silence: "%{name} ierobežoja %{target} kontu"
+        suspend: "%{name} apturēja %{target} kontu"
+      appeal_approved: Pārsūdzēts
+      appeal_pending: Apelācija tiek izskatīta
     system_checks:
       database_schema_check:
         message_html: Notiek datubāzu migrācijas. Lūdzu, palaid tās, lai nodrošinātu, ka lietojumprogramma darbojas, kā paredzēts
@@ -750,7 +781,7 @@ lv:
         shared_by_over_week:
           one: Pēdējās nedēļas laikā kopīgoja viena persona
           other: Pēdējās nedēļas laikā kopīgoja %{count} personas
-          zero: Pēdējās nedēļas laikā kopīgoja %{count} persona
+          zero: Pēdējās nedēļas laikā neviens nav kopīgojis
         title: Populārākās saites
         usage_comparison: Šodien kopīgots %{today} reizes, salīdzinot ar %{yesterday} vakar
       pending_review: Gaida pārskatīšanu
@@ -780,7 +811,7 @@ lv:
         used_by_over_week:
           one: Pēdējās nedēļas laikā izmantoja viens cilvēks
           other: Pēdējās nedēļas laikā izmantoja %{count} personas
-          zero: Pēdējās nedēļas laikā izmantoja %{count} personu
+          zero: Pēdējās nedēļas laikā neviens nav izmantojis
       title: Tendences
     warning_presets:
       add_new: Pievienot jaunu
@@ -789,6 +820,17 @@ lv:
       empty: Tu vēl neesi definējis iepriekš iestatītos brīdinājumus.
       title: Pārvaldīt brīdinājuma iestatījumus
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: lai izdzēstu viņu ierakstus
+        disable: lai iesaldētu viņu kontu
+        none: brīdinājums
+        sensitive: lai atzīmētu viņu kontu kā sensitīvu
+        silence: lai ierobežotu viņu kontu
+        suspend: lai apturētu viņu kontu
+      body: "%{target} pārsūdzēja %{action_taken_by} moderēšanas lēmumu no %{date}, kas bija %{type}. Viņi rakstīja:"
+      next_steps: Varat apstiprināt apelāciju, lai atsauktu regulēšanas lēmumu, vai ignorēt to.
+      subject: "%{username} pārsūdz moderēšanas lēmumu par %{instance}"
     new_pending_account:
       body: Sīkāka informācija par jauno kontu ir sniegta zemāk. Tu vari apstiprināt vai noraidīt šo pieteikumu.
       subject: Jauns konts pārskatīšanai %{instance} (%{username})
@@ -879,7 +921,6 @@ lv:
     status:
       account_status: Konta statuss
       confirming: Gaida e-pasta apstiprinājuma pabeigšanu.
-      functional: Tavs konts ir pilnībā darboties spējīgs.
       pending: Tavu pieteikumu gaida mūsu darbinieku izskatīšana. Tas var aizņemt kādu laiku. Ja tavs pieteikums tiks apstiprināts, tu saņemsi e-pastu.
       redirecting_to: Tavs konts ir neaktīvs, jo pašlaik tas tiek novirzīts uz %{acct}.
     too_fast: Veidlapa ir iesniegta pārāk ātri, mēģini vēlreiz.
@@ -945,6 +986,32 @@ lv:
     directory: Profila direktorija
     explanation: Atklāj lietotājus, pamatojoties uz viņu interesēm
     explore_mastodon: Izpētīt %{title}
+  disputes:
+    strikes:
+      action_taken: Veiktā darbība
+      appeal: Apelācija
+      appeal_approved: Šis brīdinājums ir veiksmīgi pārsūdzēts un vairs nav spēkā
+      appeal_rejected: Apelācija ir noraidīta
+      appeal_submitted_at: Apelācija iesniegta
+      appealed_msg: Jūsu apelācija ir iesniegta. Ja tā tiks apstiprināta, jums tiks paziņots.
+      appeals:
+        submit: Iesniegt apelāciju
+      associated_report: Saistītais ziņojums
+      created_at: Datēts
+      recipient: Adresēts
+      status: 'Publikācija #%{id}'
+      status_removed: Publikācija jau ir noņemta no sistēmas
+      title: "%{action} kopš %{date}"
+      title_actions:
+        delete_statuses: Ziņas noņemšana
+        disable: Konta iesaldēšana
+        none: Brīdinājums
+        sensitive: Konta atzīmēšana kā sensitīvs
+        silence: Konta ierobežošana
+        suspend: Konta apturēšana
+      your_appeal_approved: Jūsu apelācija ir apstiprināta
+      your_appeal_pending: Jūs esat iesniedzis apelāciju
+      your_appeal_rejected: Jūsu apelācija ir noraidīta
   domain_validator:
     invalid_domain: nav derīgs domēna nosaukums
   errors:
@@ -1160,6 +1227,8 @@ lv:
       title: Jauns stimuls
     status:
       subject: "%{name} tikko publicēja"
+    update:
+      subject: "%{name} rediģējis rakstu"
   notifications:
     email_events: E-pasta paziņojumu notikumi
     email_events_hint: 'Atlasi notikumus, par kuriem vēlies saņemt paziņojumus:'
@@ -1528,6 +1597,15 @@ lv:
     recovery_instructions_html: Ja kādreiz zaudēsi piekļuvi savam tālrunim, vari izmantot kādu no tālāk norādītajiem atkopšanas kodiem, lai atgūtu piekļuvi savam kontam. <strong>Glabā atkopšanas kodus drošībā</strong>. Piemēram, tu vari tos izdrukāt un uzglabāt kopā ar citiem svarīgiem dokumentiem.
     webauthn: Drošības atslēgas
   user_mailer:
+    appeal_approved:
+      action: Dodies uz savu kontu
+      explanation: Apelācija par brīdinājumu jūsu kontam %{strike_date}, ko iesniedzāt %{appeal_date}, ir apstiprināta. Jūsu konts atkal ir labā stāvoklī.
+      subject: Jūsu %{date} apelācija ir apstiprināta
+      title: Apelācija apstiprināta
+    appeal_rejected:
+      explanation: Apelācija par brīdinājumu jūsu kontam %{strike_date}, ko iesniedzāt %{appeal_date}, ir noraidīta.
+      subject: Jūsu %{date} apelācija ir noraidīta
+      title: Apelācija noraidīta
     backup_ready:
       explanation: Tu pieprasīji pilnu sava Mastodon konta dublējumu. Tagad tas ir gatavs lejupielādei!
       subject: Tavs arhīvs ir gatavs lejupielādei
@@ -1539,6 +1617,8 @@ lv:
       subject: Lūdzu, apstiprini pierakstīšanās mēģinājumu
       title: Pierakstīšanās mēģinājums
     warning:
+      appeal: Iesniegt apelāciju
+      appeal_description: Ja uzskatāt, ka tā ir kļūda, varat iesniegt apelāciju %{instance} darbiniekiem.
       categories:
         spam: Spams
         violation: Saturs pārkāpj šādas kopienas pamatnostādnes
@@ -1550,7 +1630,6 @@ lv:
         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.
       get_in_touch: Ja uzskati, ka tā ir kļūda, vari atbildēt uz šo e-pastu, lai sazinātos ar %{instance} darbiniekiem.
       reason: 'Iemesls:'
-      review_server_policies: Pārskati servera politikas
       statuses: 'Ziņas, kurās tika konstatēti pārkāpumi:'
       subject:
         delete_statuses: Tavas ziņas %{acct} tika noņemtas
diff --git a/config/locales/ml.yml b/config/locales/ml.yml
index 47ed7ed1c..daee6098c 100644
--- a/config/locales/ml.yml
+++ b/config/locales/ml.yml
@@ -41,8 +41,6 @@ ml:
       group: ഗ്രൂപ്പ്
     unavailable: പ്രൊഫൈൽ ലഭ്യമല്ല
   admin:
-    account_moderation_notes:
-      delete: മായ്ക്കുക
     accounts:
       add_email_domain_block: ഇ-മെയിൽ ഡൊമെയ്ൻ തടയുക
       approve: അംഗീകരിക്കുക
diff --git a/config/locales/ms.yml b/config/locales/ms.yml
index b38b9279a..0cd87686e 100644
--- a/config/locales/ms.yml
+++ b/config/locales/ms.yml
@@ -90,7 +90,6 @@ ms:
     account_moderation_notes:
       create: Tinggalkan catatan
       created_msg: Catatan penyederhanaan telah berjaya dicipta!
-      delete: Padam
       destroyed_msg: Catatan penyederhanaan telah berjaya dipadam!
     accounts:
       add_email_domain_block: Sekat domain e-mel
@@ -393,8 +392,6 @@ ms:
         silence: didiamkan
         suspend: digantungkan
       show:
-        affected_accounts:
-          other: "%{count} akaun dalam pangkalan data menerima kesan"
         retroactive:
           silence: Nyahdiamkan akaun yang menerima kesan sedia ada daripada domain ini
           suspend: Nyahgantungkan akaun yang menerima kesan sedia ada daripada domain ini
@@ -442,8 +439,6 @@ ms:
       delivery_error_days: Hari ralat penghantaran
       delivery_error_hint: Jika penghantaran tidak berjaya selama %{count} hari, ia akan ditanda sebagai tidak boleh dihantar.
       empty: Tiada domain dijumpai.
-      known_accounts:
-        other: "%{count} akaun dikenali"
       moderation:
         all: Semua
         limited: Terhad
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 723e7de9c..22084fa29 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -92,7 +92,6 @@ nl:
     account_moderation_notes:
       create: Laat een opmerking achter
       created_msg: Aanmaken van opmerking voor moderatoren geslaagd!
-      delete: Verwijderen
       destroyed_msg: Verwijderen van opmerking voor moderatoren geslaagd!
     accounts:
       add_email_domain_block: E-maildomein blokkeren
@@ -396,9 +395,6 @@ nl:
         silence: genegeerd
         suspend: opgeschort
       show:
-        affected_accounts:
-          one: Eén account in de database aangepast
-          other: "%{count} accounts in de database aangepast"
         retroactive:
           silence: Alle genegeerde accounts van dit domein niet langer negeren
           suspend: Alle opgeschorte accounts van dit domein niet langer opschorten
@@ -447,9 +443,6 @@ nl:
       delivery_error_days: Dagen met bezorgfouten
       delivery_error_hint: Wanneer de bezorging voor %{count} dagen niet mogelijk is, wordt de bezorging automatisch als niet beschikbaar gemarkeerd.
       empty: Geen domeinen gevonden.
-      known_accounts:
-        one: "%{count} bekend account"
-        other: "%{count} bekende accounts"
       moderation:
         all: Alles
         limited: Beperkt
@@ -745,7 +738,6 @@ nl:
     status:
       account_status: Accountstatus
       confirming: Aan het wachten totdat de e-mail is bevestigd.
-      functional: Jouw account is volledig operationeel.
       pending: Jouw aanvraag moet nog worden beoordeeld door een van onze medewerkers. Dit kan misschien eventjes duren. Je ontvangt een e-mail wanneer jouw aanvraag is goedgekeurd.
       redirecting_to: Jouw account is inactief omdat het momenteel wordt doorverwezen naar %{acct}.
     too_fast: Formulier is te snel ingediend. Probeer het nogmaals.
@@ -1327,7 +1319,6 @@ nl:
       subject: Bevestig de inlogpoging
       title: Inlogpoging
     warning:
-      review_server_policies: Serverbeleid bekijken
       subject:
         disable: Jouw account %{acct} is bevroren
         none: Waarschuwing voor %{acct}
diff --git a/config/locales/nn.yml b/config/locales/nn.yml
index d75e8bb87..eae87f41e 100644
--- a/config/locales/nn.yml
+++ b/config/locales/nn.yml
@@ -92,7 +92,6 @@ nn:
     account_moderation_notes:
       create: Legg igjen merknad
       created_msg: Moderatormerknad er laga!
-      delete: Slett
       destroyed_msg: Moderatormerknad er utsletta!
     accounts:
       add_email_domain_block: Gøym e-postdomene
@@ -369,9 +368,6 @@ nn:
         silence: dempa
         suspend: utvist
       show:
-        affected_accounts:
-          one: Éin konto i databasen vert påverka
-          other: "%{count} kontoar i databasen vert påverka"
         retroactive:
           silence: Avmålbind alle eksisterende kontoer fre dette domenet
           suspend: Avutvis alle eksisterende kontoer fra dette domenet
@@ -413,9 +409,6 @@ nn:
         unavailable: Ikke tilgjengelig
         warning: Advarsel
       delivery_available: Levering er tilgjengelig
-      known_accounts:
-        one: "%{count} kjend konto"
-        other: "%{count} kjende kontoar"
       moderation:
         all: Alle
         limited: Avgrensa
@@ -706,7 +699,6 @@ nn:
     status:
       account_status: Kontostatus
       confirming: Ventar på stadfesting av e-post.
-      functional: Kontoen din er oppe og går.
       pending: Søknaden din ventar på gjennomgang frå personalet vårt. Dette kan taka litt tid. Du får ein e-post om søknaden din vert godkjend.
       redirecting_to: Kontoen din er inaktiv fordi den for øyeblikket omdirigerer til %{acct}.
     trouble_logging_in: Får du ikkje logga inn?
@@ -1282,7 +1274,6 @@ nn:
       subject: Venlegast stadfest forsøket på å logga inn
       title: Forsøk på å logga inn
     warning:
-      review_server_policies: Gjennomgå serverretningslinjer
       subject:
         disable: Kontoen din, %{acct}, har blitt fryst
         none: Åtvaring for %{acct}
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 088812fb1..7019b2457 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -92,7 +92,6 @@
     account_moderation_notes:
       create: Lag
       created_msg: Moderasjonsnotat laget uten problem!
-      delete: Slett
       destroyed_msg: Moderasjonsnotat slettet uten problem!
     accounts:
       add_email_domain_block: Svartelist E-postdomenet
@@ -366,9 +365,6 @@
         silence: stilnet
         suspend: suspendert
       show:
-        affected_accounts:
-          one: En konto i databasen påvirket
-          other: "%{count} kontoer i databasen påvirket"
         retroactive:
           silence: Avmålbind alle eksisterende kontoer fre dette domenet
           suspend: Avutvis alle eksisterende kontoer fra dette domenet
@@ -410,9 +406,6 @@
         unavailable: Ikke tilgjengelig
         warning: Advarsel
       delivery_available: Levering er tilgjengelig
-      known_accounts:
-        one: "%{count} kjent konto"
-        other: "%{count} kjente kontoer"
       moderation:
         all: Alt
         limited: Begrenset
@@ -698,7 +691,6 @@
     status:
       account_status: Kontostatus
       confirming: Venter på at e-postbekreftelsen er fullført.
-      functional: Kontoen din er fullt operativt.
       pending: Søknaden din avventer gjennomgang av styret vårt. Dette kan ta litt tid. Du vil motta en E-post dersom søknaden din blir godkjent.
       redirecting_to: Kontoen din er inaktiv fordi den for øyeblikket omdirigerer til %{acct}.
     trouble_logging_in: Har du problemer med å logge på?
@@ -1263,7 +1255,6 @@
       subject: Bekreft forsøk på å logge inn
       title: Påloggingsforsøk
     warning:
-      review_server_policies: Gjennomgå serverretningslinjer
       subject:
         disable: Kontoen din, %{acct}, har blitt fryst
         none: Advarsel for %{acct}
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 5ba40c527..844a8b256 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -86,7 +86,6 @@ oc:
     account_moderation_notes:
       create: Crear una nòta
       created_msg: Nòta de moderacion ben creada !
-      delete: Suprimir
       destroyed_msg: Nòta de moderacion ben suprimida !
     accounts:
       add_email_domain_block: Metre lo domeni del corrièl en lista negra
@@ -329,9 +328,6 @@ oc:
         silence: mes en silenci
         suspend: suspendut
       show:
-        affected_accounts:
-          one: Un compte de la basa de donadas tocat
-          other: "%{count} compte de la basa de donadas tocat"
         retroactive:
           silence: Levar lo silenci de totes los comptes d’aqueste domeni
           suspend: Levar la suspension de totes los comptes d’aqueste domeni
@@ -357,9 +353,6 @@ oc:
     instances:
       by_domain: Domeni
       delivery_available: Liurason disponibla
-      known_accounts:
-        one: "%{count} compte conegut"
-        other: "%{count} comptes coneguts"
       moderation:
         all: Totas
         limited: Limitat
@@ -627,7 +620,6 @@ oc:
       title: Configuracion
     status:
       account_status: Estat del compte
-      functional: Vòstre compte es complètament foncional.
     trouble_logging_in: Problèmas de connexion ?
     use_security_key: Utilizar clau de seguretat
   authorize_follow:
@@ -1176,7 +1168,6 @@ oc:
       title: Archiu per emportar
     warning:
       reason: 'Motiu :'
-      review_server_policies: Repassar las politicas del servidor
       subject:
         disable: Vòstre compte %{acct} es gelat
         none: Avertiment per %{acct}
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index ed565cc76..6a48cb840 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -102,7 +102,6 @@ pl:
     account_moderation_notes:
       create: Pozostaw notatkę
       created_msg: Pomyślnie dodano notatkę moderacyjną!
-      delete: Usuń
       destroyed_msg: Pomyślnie usunięto notatkę moderacyjną!
     accounts:
       add_email_domain_block: Dodaj domenę e-mail na czarną listę
@@ -171,6 +170,11 @@ pl:
       not_subscribed: Nie zasubskrybowano
       pending: Oczekuje na przegląd
       perform_full_suspension: Zawieś
+      previous_strikes: Poprzednie ostrzeżenia
+      previous_strikes_description_html:
+        one: To konto ma <strong>jedno</strong> ostrzeżenie.
+        other: To konto ma <strong>%{count}</strong> ostrzeżeń.
+        zero: To konto jest <strong>w dobrym stanie</strong>.
       promote: Podnieś uprawnienia
       protocol: Protokół
       public: Publiczne
@@ -214,6 +218,7 @@ pl:
       statuses: Wpisy
       strikes: Poprzednie ostrzeżenia
       subscribe: Subskrybuj
+      suspend: Zawieś
       suspended: Zawieszono
       suspension_irreversible: Dane tego konta zostały bezpowrotnie usunięte. Możesz cofnąć zawieszenie tego konta aby można było z niego ponownie korzystać, lecz nie przywróci to danych które poprzednio się na nim znajdowały.
       suspension_reversible_hint_html: Twoje konto zostało zawieszone, a dane zostaną całkowicie usunięte %{date}. Do tego czasu, konto może zostać przywrócone bez żadnych negatywnych skutków. Jeżeli chcesz natychmiastowo usunąć wszystkie dane, możesz zrobić to niżej.
@@ -234,6 +239,7 @@ pl:
       whitelisted: Na białej liście
     action_logs:
       action_types:
+        approve_appeal: Zatwierdź odwołanie
         approve_user: Zatwierdź użytkownika
         assigned_to_self_report: Przypisz zgłoszenie
         change_email_user: Zmień adres e-mail użytkownika
@@ -265,6 +271,7 @@ pl:
         enable_user: Włącz użytkownika
         memorialize_account: Upamiętnij konto
         promote_user: Podnieś uprawnienia
+        reject_appeal: Odrzuć odwołanie
         reject_user: Odrzuć użytkownika
         remove_avatar_user: Usuń awatar
         reopen_report: Otwórz zgłoszenie ponownie
@@ -283,6 +290,7 @@ pl:
         update_domain_block: Zaktualizuj blokadę domeny
         update_status: Aktualizuj wpis
       actions:
+        approve_appeal_html: "%{name} zatwierdził(-a) odwołanie decyzji moderacyjnej od %{target}"
         approve_user_html: "%{name} zatwierdził rejestrację od %{target}"
         assigned_to_self_report_html: "%{name} przypisał(a) sobie zgłoszenie %{target}"
         change_email_user_html: "%{name} zmienił(a) adres e-mail użytkownika %{target}"
@@ -314,6 +322,7 @@ pl:
         enable_user_html: "%{name} przywrócił(a) możliwość logowania użytkownikowi %{target}"
         memorialize_account_html: "%{name} nadał(a) kontu %{target} status in memoriam"
         promote_user_html: "%{name} podniósł(a) uprawnienia użytkownikowi %{target}"
+        reject_appeal_html: "%{name} zatwierdził(-a) odwołanie decyzji moderacyjnej od %{target}"
         reject_user_html: "%{name} odrzucił rejestrację od %{target}"
         remove_avatar_user_html: "%{name} usunął(-ęła) awatar użytkownikowi %{target}"
         reopen_report_html: "%{name} otworzył(a) ponownie zgłoszenie %{target}"
@@ -392,6 +401,11 @@ pl:
       media_storage: Przechowywanie mediów
       new_users: nowi użytkownicy
       opened_reports: otwarte zgłoszenia
+      pending_appeals_html:
+        few: "<strong>%{count}</strong> oczekujące odwołania"
+        many: "<strong>%{count}</strong> oczekujących odwołań"
+        one: "<strong>%{count}</strong> oczekujących odwołań"
+        other: "<strong>%{count}</strong> oczekujących odwołań"
       pending_reports_html:
         few: "<strong>%{count}</strong> oczekujące raporty"
         many: "<strong>%{count}</strong> oczekujących raportów"
@@ -400,12 +414,12 @@ pl:
       pending_tags_html:
         few: "<strong>%{count}</strong> oczekujące hashtagi"
         many: "<strong>%{count}</strong> oczekujących hashtagów"
-        one: "<strong>%{count}</strong>oczekujący hasztag"
+        one: "<strong>%{count}</strong> oczekujący hashtag"
         other: "<strong>%{count}</strong> oczekujących hashtagów"
       pending_users_html:
         few: "<strong>%{count}</strong> oczekujących użytkowników"
         many: "<strong>%{count}</strong> oczekujących użytkowników"
-        one: "<strong>1</strong> oczekujący użytkownik"
+        one: "<strong>%{count}</strong> oczekujący użytkownik"
         other: "<strong>%{count}</strong> oczekujących użytkowników"
       resolved_reports: zamkniętych zgłoszeń
       software: Oprogramowanie
@@ -415,6 +429,10 @@ pl:
       top_languages: Najbardziej aktywne języki
       top_servers: Najbardziej aktywne serwery
       website: Strona
+    disputes:
+      appeals:
+        empty: Nie znaleziono odwołań.
+        title: Odwołania
     domain_allows:
       add_new: Zatwierdź domenę
       created_msg: Domena dodana do białej listy
@@ -452,11 +470,6 @@ pl:
         silence: wyciszono
         suspend: zawieszono
       show:
-        affected_accounts:
-          few: Dotknęło %{count} kont w bazie danych
-          many: Dotknęło %{count} kont w bazie danych
-          one: Dotknęło jedno konto w bazie danych
-          other: Dotknęło %{count} kont w bazie danych
         retroactive:
           silence: Odwołaj wyciszenie wszystkich kont w tej domenie
           suspend: Odwołaj zawieszenie wszystkich kont w tej domenie
@@ -509,11 +522,6 @@ pl:
       delivery_error_hint: Jeżeli doręczanie nie będzie możliwe przez %{count} dni, zostanie automatycznie oznaczona jako nie do doręczania.
       destroyed_msg: Dane z %{domain} są teraz w kolejce do bezpośredniego usunięcia.
       empty: Nie znaleziono domen.
-      known_accounts:
-        few: "%{count} znane konta"
-        many: "%{count} znane konta"
-        one: "%{count} znane konto"
-        other: "%{count} znane konta"
       moderation:
         all: Wszystkie
         limited: Ograniczone
@@ -582,10 +590,12 @@ pl:
       action_log: Dziennik audytu
       action_taken_by: Działanie podjęte przez
       actions:
+        delete_description_html: Zgłoszone posty zostaną usunięte, a zdarzenie zostanie zapisane, aby pomóc w eskalacji przyszłych wykroczeń na tym samym koncie.
         other_description_html: Zobacz więcej opcji do kontrolowania zachowania konta i dostosuj komunikację do zgłoszonego konta.
+        resolve_description_html: Nie zostaną podjęte żadne działania przeciwko zgłoszonemu sprawozdaniu, zdarzenie nie zostanie zarejestrowane, a zgłoszenie zostanie zamknięte.
         silence_description_html: Profil będzie widoczny tylko dla tych, którzy go już obserwują lub szukaj ręcznie, poważnie ograniczając jego zasięg. Może być zawsze cofnięty.
         suspend_description_html: Profil i cała jego zawartość staną się niedostępne, dopóki nie zostaną ostatecznie usunięte. Interakcja z kontem będzie niemożliwa. Odwracalne w ciągu 30 dni.
-      actions_description_html: 'Jeśli usunięcie obraźliwych treści jest niewystarczające:'
+      actions_description_html: Zdecyduj, jakie działania należy podjąć, aby rozstrzygnąć niniejsze zgłoszenie. Jeśli podejmiesz działania karne przeciwko zgłoszonemu kontowi, zostanie do nich wysłane powiadomienie e-mail, chyba że wybrano kategorię <strong>Spam</strong>.
       add_to_report: Dodaj więcej do raportu
       are_you_sure: Czy na pewno?
       assign_to_self: Przypisz do siebie
@@ -597,7 +607,7 @@ pl:
         none: Brak
       comment_description_html: 'Aby dostarczyć więcej informacji, %{name} napisał:'
       created_at: Zgłoszono
-      delete_and_resolve: Usuń i rozwiąż
+      delete_and_resolve: Usuń posty
       forwarded: Przekazano
       forwarded_to: Przekazano do %{domain}
       mark_as_resolved: Oznacz jako rozwiązane
@@ -611,12 +621,14 @@ pl:
         placeholder: Opisz wykonane akcje i inne szczegóły dotyczące tego zgłoszenia…
         title: Notatki
       notes_description_html: Przeglądaj i zostaw notatki innym moderatorom i sobie samemu
+      quick_actions_description_html: 'Wykonaj szybkie działanie lub przewiń w dół, aby zobaczyć zgłoszoną zawartość:'
       reopen: Otwórz ponownie
       report: 'Zgłoszenie #%{id}'
       reported_account: Zgłoszone konto
       reported_by: Zgłaszający
       resolved: Rozwiązane
       resolved_msg: Pomyślnie rozwiązano zgłoszenie.
+      skip_to_actions: Przejdź do akcji
       status: Stan
       statuses: Zgłoszona treść
       statuses_description_html: Obraźliwe treści będą cytowane w komunikacji ze zgłoszonym kontem
@@ -737,6 +749,16 @@ pl:
       no_status_selected: Żaden wpis nie został zmieniony, bo żaden nie został wybrany
       title: Wpisy konta
       with_media: Z zawartością multimedialną
+    strikes:
+      actions:
+        delete_statuses: "%{name} usunął(-ęła) posty %{target}"
+        disable: "%{name} zamroził(a) konto %{target}"
+        none: "%{name} wysłał(a) ostrzeżenie do %{target}"
+        sensitive: "%{name} oznaczył(-a) konto %{target} jako wrażliwe"
+        silence: "%{name} ograniczył(-a) konto %{target}"
+        suspend: "%{name} zawiesił(-a) konto %{target}"
+      appeal_approved: Odwołanie
+      appeal_pending: Odwołanie w toku
     system_checks:
       database_schema_check:
         message_html: Istnieją oczekujące migracje bazy danych. Uruchom je, aby upewnić się, że aplikacja działa tak, jak powinna
@@ -758,11 +780,6 @@ pl:
         allow_provider: Zezwalaj na wydawcę
         disallow: Nie zezwalaj na link
         disallow_provider: Nie zezwalaj na wydawcę
-        shared_by_over_week:
-          few: Udostępnione przez %{count} osoby w ciągu ostatniego tygodnia
-          many: Udostępnione przez %{count} osób w ciągu ostatniego tygodnia
-          one: Udostępnione przez jedną osobę w ciągu ostatniego tygodnia
-          other: Udostępnione przez %{count} osób w ciągu ostatniego tygodnia
         title: Popularne linki
         usage_comparison: Udostępnione %{today} razy dzisiaj, w porównaniu z %{yesterday} wczoraj
       pending_review: Oczekuje na przegląd
@@ -789,11 +806,6 @@ pl:
         trending_rank: 'Popularne #%{rank}'
         usable: Może być użyty
         usage_comparison: Używane %{today} razy dzisiaj, w porównaniu z %{yesterday} wczoraj
-        used_by_over_week:
-          few: Użyte przez %{count} osoby w ciągu ostatniego tygodnia
-          many: Użyte przez %{count} osób w ciągu ostatniego tygodnia
-          one: Użyte przez jedną osobę w ciągu ostatniego tygodnia
-          other: Użyte przez %{count} osób w ciągu ostatniego tygodnia
       title: Na czasie
     warning_presets:
       add_new: Dodaj nowy
@@ -802,6 +814,17 @@ pl:
       empty: Nie zdefiniowano jeszcze żadnych szablonów ostrzegawczych.
       title: Zarządzaj szablonami ostrzeżeń
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: aby usunąć ich wpisy
+        disable: aby zamrozić jego/jej konto
+        none: ostrzeżenie
+        sensitive: aby oznaczyć konto jako wrażliwe
+        silence: aby ograniczyć swoje konto
+        suspend: aby zawiesić konto
+      body: "%{target} odwołuje się od decyzji moderatora %{action_taken_by} z %{date}, czyli %{type}. Napisał:"
+      next_steps: Możesz zaakceptować odwołanie o cofnięcie decyzji o moderacji lub je zignorować.
+      subject: "%{username} odwołuje się od decyzji moderacyjnej na %{instance}"
     new_pending_account:
       body: Poniżej znajdują się szczegóły dotycząće nowego konta. Możesz przyjąć lub odrzucić to podanie.
       subject: Nowe konto czeka na przegląd na %{instance} (%{username})
@@ -892,7 +915,6 @@ pl:
     status:
       account_status: Stan konta
       confirming: Oczekiwanie na potwierdzenie adresu e-mail.
-      functional: Twoje konto całkowicie funkcjonuje.
       pending: Twoje zgłoszenie czeka na zatwierdzenie przez nas. Może to trochę potrwać. Jeżeli zgłoszenie zostanie przyjęte, otrzymasz wiadomość e-mail.
       redirecting_to: Twoje konto jest nieaktywne, ponieważ obecnie przekierowuje je na %{acct}.
     too_fast: Zbyt szybko przesłano formularz, spróbuj ponownie.
@@ -958,6 +980,32 @@ pl:
     directory: Katalog profilów
     explanation: Poznaj profile na podstawie zainteresowań
     explore_mastodon: Odkrywaj %{title}
+  disputes:
+    strikes:
+      action_taken: Podjęte działania
+      appeal: Odwołanie
+      appeal_approved: To ostrzeżenie zostało pomyślnie odwołane i nie jest już ważne
+      appeal_rejected: Odwołanie zostało odrzucone
+      appeal_submitted_at: Przesłano odwołanie
+      appealed_msg: Twoje odwołanie zostało złożone. Jeśli zostanie zatwierdzone, zostaniesz powiadomiony.
+      appeals:
+        submit: Zgłoś odwołanie
+      associated_report: Powiązany raport
+      created_at: Data
+      recipient: Adresowane do
+      status: 'Post #%{id}'
+      status_removed: Post został już usunięty z systemu
+      title: "%{action} z %{date}"
+      title_actions:
+        delete_statuses: Usuwanie postów
+        disable: Zamrażanie konta
+        none: Ostrzeżenie
+        sensitive: Oznaczenie konta jako wrażliwe
+        silence: Ograniczenie konta
+        suspend: Zawieszenie konta
+      your_appeal_approved: Twoje odwołanie zostało zatwierdzone
+      your_appeal_pending: Zgłosiłeś odwołanie
+      your_appeal_rejected: Twoje odwołanie zostało odrzucone
   domain_validator:
     invalid_domain: nie jest prawidłową nazwą domeny
   errors:
@@ -1258,6 +1306,9 @@ pl:
     reply:
       proceed: Przejdź do dodawania odpowiedzi
       prompt: 'Chcesz odpowiedzieć na ten wpis:'
+  reports:
+    errors:
+      invalid_rules: nie odwołuje się do prawidłowych reguł
   scheduled_statuses:
     over_daily_limit: Przekroczyłeś(-aś) limit %{limit} zaplanowanych wpisów na ten dzień
     over_total_limit: Przekroczyłeś(-aś) limit %{limit} zaplanowanych wpisów
@@ -1536,6 +1587,8 @@ pl:
     recovery_instructions_html: Jeżeli kiedykolwiek utracisz dostęp do telefonu, możesz wykorzystać jeden z kodów zapasowych, aby odzyskać dostęp do konta. <strong>Trzymaj je w bezpiecznym miejscu</strong>. Na przykład, wydrukuj je i przechowuj z ważnymi dokumentami.
     webauthn: Klucze bezpieczeństwa
   user_mailer:
+    appeal_approved:
+      action: Przejdź do swojego konta
     backup_ready:
       explanation: Zażądałeś pełnej kopii zapasowej konta na Mastodonie. Jest ona dostępna do pobrania!
       subject: Twoje archiwum jest gotowe do pobrania
@@ -1558,7 +1611,6 @@ pl:
         suspend: Nie możesz już używać Twojego konta, a Twój profil i inne dane nie są już dostępne. Zanim w pełni usuniemy Twoje dane po około 30 dniach, możesz nadal zalogować się, aby uzyskać ich kopię. Zachowamy pewne podstawowe dane, aby zapobiegać obchodzeniu przez Ciebie zawieszenia.
       get_in_touch: Jeżeli uważasz to za błąd, możesz odpowiedzieć na ten e-mail, aby skontaktować się z prowadzącymi %{instance}.
       reason: 'Powód:'
-      review_server_policies: Przejrzyj zasady serwera
       statuses: 'Wpisy uznane za naruszające wytyczne:'
       subject:
         delete_statuses: Twoje wpisy na %{acct} zostały usunięte
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 36f390b0e..547fbabab 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -94,7 +94,6 @@ pt-BR:
     account_moderation_notes:
       create: Deixar nota
       created_msg: Nota de moderação criada com sucesso!
-      delete: Excluir
       destroyed_msg: Nota de moderação excluída com sucesso!
     accounts:
       add_email_domain_block: Adicionar o domínio de e-mail à lista negra
@@ -113,6 +112,7 @@ pt-BR:
       confirm: Confirmar
       confirmed: Confirmado
       confirming: Confirmando
+      custom: Personalizar
       delete: Excluir dados
       deleted: Excluído
       demote: Rebaixar
@@ -204,6 +204,7 @@ pt-BR:
       silenced: Silenciado
       statuses: Toots
       subscribe: Inscrever-se
+      suspend: Suspender
       suspended: Banido
       suspension_irreversible: Os dados desta conta foram excluídos de forma irreversível. Você pode remover a suspensão da conta para torná-la utilizável, mas ela não irá recuperar nenhum dado que ela possuía anteriormente.
       suspension_reversible_hint_html: A conta foi suspensa e os dados serão totalmente removidos em %{date}. Até lá, a conta pode ser restaurada sem nenhum efeito negativo. Se você deseja remover todos os dados da conta imediatamente, você pode fazer isso abaixo.
@@ -424,9 +425,6 @@ pt-BR:
         silence: silenciado
         suspend: banido
       show:
-        affected_accounts:
-          one: Uma conta no banco de dados foi afetada
-          other: "%{count} contas no banco de dados foram afetadas"
         retroactive:
           silence: Dessilenciar contas existentes afetadas deste domínio
           suspend: Remover a suspensão das contas afetadas deste domínio
@@ -470,9 +468,6 @@ pt-BR:
         warning: Aviso
       delivery_available: Envio disponível
       empty: Nenhum domínio encontrado.
-      known_accounts:
-        one: "%{count} conta conhecida"
-        other: "%{count} contas conhecidas"
       moderation:
         all: Todos
         limited: Limitados
@@ -541,7 +536,6 @@ pt-BR:
         other_description_html: Veja mais opções para controlar o comportamento da conta e personalizar a comunicação com a conta reportada.
         silence_description_html: O perfil será visível apenas para aqueles que já o seguem ou que o procuram manualmente, limitando severamente seu alcance. Pode ser sempre revertido.
         suspend_description_html: O perfil e todo o seu conteúdo ficarão inacessíveis até que seja eventualmente excluído. Interagir com a conta será impossível. Reversível dentro de 30 dias.
-      actions_description_html: 'Se remover o conteúdo ofensivo acima for insuficiente:'
       add_to_report: Adicionar mais ao relatório
       are_you_sure: Você tem certeza?
       assign_to_self: Pegar
@@ -553,7 +547,7 @@ pt-BR:
         none: Nenhum
       comment_description_html: 'Para fornecer mais informações, %{name} escreveu:'
       created_at: Denunciado
-      delete_and_resolve: Apagar e resolver
+      delete_and_resolve: Excluir mensagens
       forwarded: Encaminhados
       forwarded_to: Encaminhado para %{domain}
       mark_as_resolved: Marcar como resolvido
@@ -567,12 +561,14 @@ pt-BR:
         placeholder: Descreva que ações foram tomadas, ou quaisquer outras atualizações relacionadas…
         title: Notas
       notes_description_html: Visualize e deixe anotações para outros moderadores e para o seu "eu" do futuro
+      quick_actions_description_html: 'Tome uma ação rápida ou role para baixo para ver o conteúdo relatado:'
       reopen: Reabrir denúncia
       report: 'Denúncia #%{id}'
       reported_account: Conta denunciada
       reported_by: Denunciada por
       resolved: Resolvido
       resolved_msg: Denúncia resolvida com sucesso!
+      skip_to_actions: Pular para ações
       status: Situação
       statuses: Conteúdo denunciado
       statuses_description_html: Conteúdo Ofensivo será citado em comunicação com a conta relatada
@@ -683,6 +679,9 @@ pt-BR:
       destroyed_msg: Upload do site excluído com sucesso!
     statuses:
       back_to_account: Voltar para página da conta
+      back_to_report: Voltar às denúncias
+      batch:
+        report: Denunciar
       deleted: Excluídos
       media:
         title: Mídia
@@ -732,9 +731,6 @@ pt-BR:
         trending_rank: 'Em alta #%{rank}'
         usable: Pode ser usado
         usage_comparison: Usado %{today} vezes hoje, em comparação com %{yesterday} de ontem
-        used_by_over_week:
-          one: Usado por uma pessoa na última semana
-          other: Usado por %{count} pessoas na última semana
       title: Em alta
     warning_presets:
       add_new: Adicionar novo
@@ -826,7 +822,6 @@ pt-BR:
     status:
       account_status: Status da conta
       confirming: Confirmação por e-mail pendente.
-      functional: Sua conta está totalmente operacional.
       pending: Sua solicitação está com revisão pendente por parte de nossa equipe. Você receberá um e-mail se ela for aprovada.
       redirecting_to: Sua conta está inativa porque atualmente está redirecionando para %{acct}.
     too_fast: O formulário foi enviado muito rapidamente, tente novamente.
@@ -1462,7 +1457,6 @@ pt-BR:
         sensitive: A partir de agora, todos os seus arquivos de mídia enviados serão marcados como confidenciais e escondidos por trás de um aviso de clique.
       get_in_touch: Se você acredita que isso é um erro, você pode responder a este e-mail para entrar em contato com a equipe de %{instance}.
       reason: 'Motivo:'
-      review_server_policies: Revisar as políticas da instância
       subject:
         disable: Sua conta %{acct} foi bloqueada
         none: Aviso para %{acct}
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index de301e149..0626b8be9 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -94,7 +94,6 @@ pt-PT:
     account_moderation_notes:
       create: Criar nota
       created_msg: Nota de moderação criada com sucesso!
-      delete: Eliminar
       destroyed_msg: Nota de moderação excluída com sucesso!
     accounts:
       add_email_domain_block: Adicionar o domínio de e-mail à lista negra
@@ -163,6 +162,11 @@ 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_description_html:
+        one: Esta conta tem <strong>1</strong> punição.
+        other: Esta conta tem <strong>%{count}</strong> punições.
+        zero: Esta conta está <strong>em situação regular</strong>.
       promote: Promover
       protocol: Protocolo
       public: Público
@@ -206,6 +210,7 @@ pt-PT:
       statuses: Status
       strikes: Punições 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_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.
@@ -226,6 +231,7 @@ pt-PT:
       whitelisted: Está na lista branca
     action_logs:
       action_types:
+        approve_appeal: Aprovar Recurso
         approve_user: Aprovar Utilizador
         assigned_to_self_report: Atribuir Denúncia
         change_email_user: Alterar E-mail do Utilizador
@@ -257,6 +263,7 @@ pt-PT:
         enable_user: Ativar Utilizador
         memorialize_account: Memorizar Conta
         promote_user: Promover Utilizador
+        reject_appeal: Rejeitar Recurso
         reject_user: Rejeitar Utilizador
         remove_avatar_user: Remover Imagem de Perfil
         reopen_report: Reabrir Denúncia
@@ -275,6 +282,7 @@ pt-PT:
         update_domain_block: Atualizar Bloqueio de Domínio
         update_status: Atualizar Estado
       actions:
+        approve_appeal_html: "%{name} aprovou recurso da decisão de moderação de %{target}"
         approve_user_html: "%{name} aprovou a inscrição de %{target}"
         assigned_to_self_report_html: "%{name} atribuiu a denúncia %{target} a si próprio"
         change_email_user_html: "%{name} alterou o endereço de e-mail do utilizador %{target}"
@@ -306,6 +314,7 @@ pt-PT:
         enable_user_html: "%{name} ativou o acesso para o utilizador %{target}"
         memorialize_account_html: "%{name} transformou a conta de %{target} em um memorial"
         promote_user_html: "%{name} promoveu o utilizador %{target}"
+        reject_appeal_html: "%{name} rejeitou recurso da decisão de moderação de %{target}"
         reject_user_html: "%{name} rejeitou a inscrição de %{target}"
         remove_avatar_user_html: "%{name} removeu a imagem de perfil de %{target}"
         reopen_report_html: "%{name} reabriu a denúncia %{target}"
@@ -384,14 +393,17 @@ pt-PT:
       media_storage: Armazenamento de media
       new_users: novos utilizadores
       opened_reports: denúncias abertas
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> recurso pendente"
+        other: "<strong>%{count}</strong> recursos pendentes"
       pending_reports_html:
-        one: "<strong>1</strong> denúncia pendente"
-        other: "<strong>%{count}</strong> denúncias pendentes"
+        one: "<strong>%{count}</strong> denuncia pendente"
+        other: "<strong>%{count}</strong> denuncias pendentes"
       pending_tags_html:
-        one: "<strong>1</strong> hashtag pendente"
+        one: "<strong>%{count}</strong> hashtag pendente"
         other: "<strong>%{count}</strong> hashtags pendentes"
       pending_users_html:
-        one: "<strong>1</strong> utilizador pendente"
+        one: "<strong>%{count}</strong> utilizador pendente"
         other: "<strong>%{count}</strong> utilizadores pendentes"
       resolved_reports: denúncias resolvidas
       software: Software
@@ -401,6 +413,10 @@ pt-PT:
       top_languages: Principais idiomas activos
       top_servers: Servidores mais activos
       website: Website
+    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
@@ -439,8 +455,9 @@ pt-PT:
         suspend: suspenso
       show:
         affected_accounts:
-          one: Uma conta na base de dados afectada
-          other: "%{count} contas na base de dados afectadas"
+          one: Uma conta na base de dados afetada
+          other: "%{count} contas na base de dados afetadas"
+          zero: Nenhuma conta na base de dados é afetada
         retroactive:
           silence: Não silenciar contas afetadas existentes deste domínio
           suspend: Não suspender todas as contas existentes nesse domínio
@@ -494,6 +511,7 @@ pt-PT:
       known_accounts:
         one: "%{count} conta conhecida"
         other: "%{count} contas conhecidas"
+        zero: Nenhuma conta conhecida
       moderation:
         all: Todas
         limited: Limitadas
@@ -560,10 +578,12 @@ 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.
         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.
         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: 'Se a remoção do conteúdo ofensivo acima for insuficiente:'
+      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
       are_you_sure: Tem a certeza?
       assign_to_self: Atribuída a mim
@@ -575,7 +595,7 @@ pt-PT:
         none: Nenhum
       comment_description_html: 'Para fornecer mais informações, %{name} escreveu:'
       created_at: Denunciado
-      delete_and_resolve: Apagar e resolver
+      delete_and_resolve: Eliminar publicações
       forwarded: Encaminhado
       forwarded_to: Encaminhado para %{domain}
       mark_as_resolved: Marcar como resolvido
@@ -589,12 +609,14 @@ pt-PT:
         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:'
       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!
+      skip_to_actions: Passar para as ações
       status: Estado
       statuses: Conteúdo denunciado
       statuses_description_html: O conteúdo ofensivo será citado na comunicação com a conta denunciada
@@ -715,6 +737,16 @@ pt-PT:
       no_status_selected: Nenhum estado foi alterado porque nenhum foi selecionado
       title: Estado das contas
       with_media: Com media
+    strikes:
+      actions:
+        delete_statuses: "%{name} eliminou a publicação de %{target}"
+        disable: "%{name} congelou a conta de %{target}"
+        none: "%{name} enviou uma advertência a %{target}"
+        sensitive: "%{name} marcou a conta de %{target} como sensível"
+        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
@@ -739,6 +771,7 @@ pt-PT:
         shared_by_over_week:
           one: Partilhado por uma pessoa na última semana
           other: Partilhado por %{count} pessoas na última semana
+          zero: Partilhado por ninguém na última semana
         title: Links em destaque
         usage_comparison: Partilhado %{today} vezes hoje, em comparação com %{yesterday} ontem
       pending_review: Pendente de revisão
@@ -768,6 +801,7 @@ pt-PT:
         used_by_over_week:
           one: Utilizada por uma pessoa na última semana
           other: Utilizada por %{count} pessoas na última semana
+          zero: Utilizada por ninguém na última semana
       title: Tendências
     warning_presets:
       add_new: Adicionar novo
@@ -776,6 +810,17 @@ pt-PT:
       empty: Ainda não definiu nenhum aviso predefinido.
       title: Gerir os avisos predefinidos
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: para elimintar as suas publicações
+        disable: para congelar a sua conta
+        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
+      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.
       subject: Nova conta para revisão em %{instance} (%{username})
@@ -866,7 +911,6 @@ pt-PT:
     status:
       account_status: Estado da conta
       confirming: A aguardar que conclua a confirmação do e-mail.
-      functional: A sua conta está totalmente operacional.
       pending: A sua inscrição está pendente de revisão pela nossa equipa. Isso pode demorar algum tempo. Receberá um e-mail se a sua conta for aprovada.
       redirecting_to: A sua conta está inativa porque está atualmente a ser redirecionada para %{acct}.
     too_fast: Formulário enviado muito rapidamente, tente novamente.
@@ -932,6 +976,32 @@ pt-PT:
     directory: Dirétorio de perfil
     explanation: Descobre utilizadores com base nos seus interesses
     explore_mastodon: Explorar %{title}
+  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_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
+      associated_report: Denúncia associada
+      created_at: Data
+      recipient: Endereçado a
+      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
+        none: Advertência
+        sensitive: Marcação da conta como sensível
+        silence: Limitação da conta
+        suspend: Suspensão da conta
+      your_appeal_approved: O seu recurso foi aprovado
+      your_appeal_pending: Submeteu um recurso
+      your_appeal_rejected: O seu recurso foi rejeitado
   domain_validator:
     invalid_domain: não é um nome de domínio válido
   errors:
@@ -1143,6 +1213,8 @@ pt-PT:
       title: Nova partilha
     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:'
@@ -1224,6 +1296,9 @@ pt-PT:
     reply:
       proceed: Prosseguir com resposta
       prompt: 'Queres responder a esta publicação:'
+  reports:
+    errors:
+      invalid_rules: não faz referência a regras válidas
   scheduled_statuses:
     over_daily_limit: Excedeste o limite de %{limit} publicações agendadas para esse dia
     over_total_limit: Tu excedeste o limite de %{limit} publicações agendadas
@@ -1306,6 +1381,7 @@ pt-PT:
         other: "%{count} vídeos"
     boosted_from_html: Partilhadas de %{acct_link}
     content_warning: 'Aviso de conteúdo: %{warning}'
+    default_language: Mesmo do idioma da interface
     disallowed_hashtags:
       one: 'continha uma hashtag proibida: %{tags}'
       other: 'continha as hashtags proibidas: %{tags}'
@@ -1489,6 +1565,15 @@ pt-PT:
     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.
     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
+    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
     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
@@ -1500,6 +1585,8 @@ pt-PT:
       subject: Por favor, confirme a tentativa de acesso
       title: Tentativa de acesso
     warning:
+      appeal: Submeter um recurso
+      appeal_description: Se acredita que isso é um erro, pode submeter um recurso para a equipa de %{instance}.
       categories:
         spam: Spam
         violation: O conteúdo infringe as seguintes diretrizes da comunidade
@@ -1511,7 +1598,6 @@ pt-PT:
         suspend: Não pode mais utilizar a sua conta, e o seu perfil e outros dados já não se encontram acessíveis. Poderá ainda iniciar sessão para solicitar uma cópia dos seus dados até os mesmos serem totalmente removidos em cerca de 30 dias, porém reteremos alguns dados básicos para o impedir evitar a suspensão.
       get_in_touch: Se acredita tratar-se de um erro, pode responder a este e-mail para entrar em contacto com os colaboradores de %{instance}.
       reason: 'Motivo:'
-      review_server_policies: Reveja a política da instância
       statuses: 'Publicações que foram consideradas em infracção:'
       subject:
         delete_statuses: As suas publicações em %{acct} foram removidas
diff --git a/config/locales/ro.yml b/config/locales/ro.yml
index a3d25c9b9..daed79c8c 100644
--- a/config/locales/ro.yml
+++ b/config/locales/ro.yml
@@ -98,7 +98,6 @@ ro:
     account_moderation_notes:
       create: Lasă o notă
       created_msg: Notă de moderare creată cu succes!
-      delete: Șterge
       destroyed_msg: Notă de moderare distrusă cu succes!
     accounts:
       add_email_domain_block: Domeniu de e-mail în lista neagră
@@ -335,7 +334,6 @@ ro:
     status:
       account_status: Starea contului
       confirming: Se așteaptă finalizarea confirmării prin e-mail.
-      functional: Contul dvs. este complet operațional.
       pending: Cererea dvs. este în curs de revizuire de către personalul nostru. Este posibil să dureze ceva timp. Veți primi un e-mail dacă cererea dvs. este aprobată.
       redirecting_to: Contul dvs. este inactiv deoarece în prezent se redirecționează către %{acct}.
     trouble_logging_in: Probleme la conectare?
@@ -712,7 +710,6 @@ ro:
       subject: Arhiva ta este gata pentru descărcare
       title: Preluare arhivă
     warning:
-      review_server_policies: Revizuiește politicile serverului
       subject:
         disable: Contul tău %{acct} a fost înghețat
         none: Avertizare pentru %{acct}
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index bdcab4f83..f99d8962a 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -102,7 +102,6 @@ ru:
     account_moderation_notes:
       create: Создать
       created_msg: Заметка модератора успешно создана!
-      delete: Удалить
       destroyed_msg: Заметка модератора успешно удалена!
     accounts:
       add_email_domain_block: Заблокировать e-mail домен
@@ -171,6 +170,10 @@ ru:
       not_subscribed: Не подписаны
       pending: Ожидает рассмотрения
       perform_full_suspension: Блокировка
+      previous_strikes: Предыдущие замечания
+      previous_strikes_description_html:
+        one: У этой учетной записи <strong>одно</strong> замечание.
+        other: У этой учетной записи <strong>%{count}</strong> замечания.
       promote: Повысить
       protocol: Протокол
       public: Публичный
@@ -212,8 +215,9 @@ ru:
       silence: Скрытие
       silenced: Заглушен
       statuses: Посты
-      strikes: Предыдущие предупреждения
+      strikes: Предыдущие замечания
       subscribe: Подписаться
+      suspend: Заблокировать
       suspended: Заморожен
       suspension_irreversible: Данные этой учётной записи были необратимо удалены. Вы можете разблокировать учетную запись, чтобы сделать её доступной, но это не восстановит ранее имевшиеся в ней данные.
       suspension_reversible_hint_html: Учётная запись была заблокирована, и данные будут полностью удалены %{date}. До этого момента её можно восстановить без каких-либо неприятных последствий. Если вы хотите немедленно удалить все данные учётной записи, вы можете сделать это ниже.
@@ -234,6 +238,7 @@ ru:
       whitelisted: В белом списке
     action_logs:
       action_types:
+        approve_appeal: Одобрить обжалование
         approve_user: Утвердить
         assigned_to_self_report: Присвоение жалоб
         change_email_user: Изменение e-mail пользователей
@@ -264,6 +269,7 @@ ru:
         enable_user: Разморозка пользователей
         memorialize_account: Присвоение пользователям статуса «мемориала»
         promote_user: Повышение пользователей
+        reject_appeal: Отклонить обжалование
         reject_user: Отклонить
         remove_avatar_user: Удаление аватаров
         reopen_report: Возобновление жалоб
@@ -391,21 +397,6 @@ ru:
       media_storage: Медиа файлы
       new_users: новые пользователи
       opened_reports: жалоб открыто
-      pending_reports_html:
-        few: "<strong>%{count}</strong> жалобы к рассмотрению"
-        many: "<strong>%{count}</strong> жалоб к рассмотрению"
-        one: "<strong>%{count}</strong> жалоба к рассмотрению"
-        other: "<strong>%{count}</strong> жалобы к рассмотрению"
-      pending_tags_html:
-        few: "<strong>%{count}</strong> хэштега к рассмотрению"
-        many: "<strong>%{count}</strong> хэштегов к рассмотрению"
-        one: "<strong>%{count}</strong> хэштег к рассмотрению"
-        other: "<strong>%{count}</strong> хэштега к рассмотрению"
-      pending_users_html:
-        few: "<strong>%{count}</strong> регистрации к рассмотрению"
-        many: "<strong>%{count}</strong> регистраций к рассмотрению"
-        one: "<strong>%{count}</strong> регистрация к рассмотрению"
-        other: "<strong>%{count}</strong> регистрации к рассмотрению"
       resolved_reports: жалоб решено
       software: Программное обеспечение
       sources: Источники регистрации
@@ -414,6 +405,10 @@ ru:
       top_languages: Самые активные языки
       top_servers: Самые активные серверы
       website: Веб-сайт
+    disputes:
+      appeals:
+        empty: Обжалования не найдены.
+        title: Обжалования
     domain_allows:
       add_new: Внести в белый список
       created_msg: Домен добавлен в белый список
@@ -456,11 +451,6 @@ ru:
         silence: скрывается
         suspend: заблокирован
       show:
-        affected_accounts:
-          few: "%{count} учетных записей в базе данных затронуты"
-          many: "%{count} учетных записей в базе данных затронуты"
-          one: Влияет на одну учётную запись в базе данных
-          other: "%{count} учетных записей в базе данных затронуты"
         retroactive:
           silence: Убрать скрытие постов учётных записей с этого узла
           suspend: Снять блокировку со всех существующих учётных записей этого домена
@@ -514,10 +504,9 @@ ru:
       destroyed_msg: Данные для домена %{domain} поставлены в очередь на удаление.
       empty: Домены не найдены.
       known_accounts:
-        few: "%{count} известные учётные записи"
-        many: "%{count} известных учётных записей"
         one: "%{count} известная учётная запись"
         other: "%{count} известных учётных записей"
+        zero: Нет известных учётных записей
       moderation:
         all: Все
         limited: Ограниченные
@@ -586,9 +575,9 @@ ru:
       action_log: Журнал событий
       action_taken_by: 'Действие предпринято:'
       actions:
+        resolve_description_html: Никаких действий не будет выполнено относительно доложенного содержимого. Жалоба будет закрыта.
         silence_description_html: Профиль будет просматриваем только пользователями, которые уже подписаны на него, либо открыли его вручную. Это действие можно отменить в любой момент.
         suspend_description_html: Профиль и всё опубликованное в нём содержимое станут недоступны, пока в конечном итоге учётная запись не будет удалена. Пользователи не смогут взаимодействовать с этой учётной записью. Это действие можно отменить в течение 30 дней.
-      actions_description_html: 'Если удаления вышеуказанного содержимого недостаточно:'
       add_to_report: Прикрепить ещё
       are_you_sure: Вы уверены?
       assign_to_self: Назначить себе
@@ -600,7 +589,7 @@ ru:
         none: Нет
       comment_description_html: 'В дополнение, %{name} добавил(а) следующий комментарий:'
       created_at: Создана
-      delete_and_resolve: Отметить решённой и удалить
+      delete_and_resolve: Удалить посты
       forwarded: Переслано
       forwarded_to: Переслано на %{domain}
       mark_as_resolved: Отметить как решённую
@@ -620,6 +609,7 @@ ru:
       reported_by: Отправитель жалобы
       resolved: Решённые
       resolved_msg: Жалоба обработана, спасибо!
+      skip_to_actions: Перейти к действиям
       status: Статус
       statuses: Содержимое относящееся к жалобе
       statuses_description_html: Нарушающее правила содержимое будет процитировано при коммуникации с фигурирующим в жалобе аккаунтом
@@ -740,6 +730,8 @@ ru:
       no_status_selected: Ничего не изменилось, так как ни один пост не был выделен
       title: Посты пользователя
       with_media: С файлами
+    strikes:
+      appeal_pending: Обжалование в обработке
     system_checks:
       database_schema_check:
         message_html: Есть отложенные миграции базы данных. Запустите их, чтобы убедиться, что приложение работает должным образом
@@ -760,11 +752,6 @@ ru:
         allow: Разрешить ссылку
         allow_provider: Разрешить издание
         disallow_provider: Отклонить издание
-        shared_by_over_week:
-          few: "%{count} человека поделились за последнюю неделю"
-          many: "%{count} человек поделились за последнюю неделю"
-          one: "%{count} человек поделился за последнюю неделю"
-          other: "%{count} человека поделилось за последнюю неделю"
         title: Актуальные ссылки
       pending_review: Ожидает рассмотрения
       preview_card_providers:
@@ -775,6 +762,8 @@ ru:
       tags:
         dashboard:
           tag_accounts_measure: уникальных использований
+          tag_languages_dimension: Самые популярные языки
+          tag_servers_dimension: Самые популярные серверы
           tag_uses_measure: всего использований
         listable: Может предлагаться
         not_listable: Не будет предлагаться
@@ -873,7 +862,6 @@ ru:
     status:
       account_status: Статус учётной записи
       confirming: Ожидание подтверждения e-mail.
-      functional: Ваша учётная запись в полном порядке.
       pending: Ваша заявка ожидает одобрения администраторами, это может занять немного времени. Вы получите письмо, как только заявку одобрят.
       redirecting_to: Ваша учётная запись деактивированна, потому что вы настроили перенаправление на %{acct}.
     too_fast: Форма отправлена слишком быстро, попробуйте еще раз.
@@ -939,6 +927,19 @@ ru:
     directory: Каталог профилей
     explanation: Находите пользователей по интересам
     explore_mastodon: Изучайте %{title}
+  disputes:
+    strikes:
+      action_taken: Предпринятые меры
+      appeal_approved: Это замечание было успешно обжаловано и более не действительно
+      appeals:
+        submit: Подать обжалование
+      created_at: Дата
+      recipient: Адресовано
+      status: 'Пост #%{id}'
+      title: "%{action} от %{date}"
+      your_appeal_approved: Ваша апелляция одобрена
+      your_appeal_pending: Вы подали апелляцию
+      your_appeal_rejected: Ваша апелляция отклонена
   domain_validator:
     invalid_domain: не является корректным доменным именем
   errors:
@@ -1157,6 +1158,8 @@ ru:
       title: Новое продвижение
     status:
       subject: "%{name} только что запостил(а)"
+    update:
+      subject: "%{name} изменил(а) пост"
   notifications:
     email_events: События для e-mail уведомлений
     email_events_hint: 'Выберите события, для которых вы хотели бы получать уведомления:'
@@ -1295,7 +1298,7 @@ ru:
     authorized_apps: Приложения
     back: Назад в Mastodon
     delete: Удаление учётной записи
-    development: Разработка
+    development: Разработчикам
     edit_profile: Изменить профиль
     export: Экспорт данных
     featured_tags: Особенные хэштеги
@@ -1515,6 +1518,13 @@ ru:
     recovery_instructions_html: 'Пожалуйста, сохраните коды ниже в надёжном месте: они понадобятся, чтобы войти в учётную запись, если вы потеряете доступ к своему смартфону. Вы можете вручную переписать их, распечатать и спрятать среди важных документов или, например, в любимой книжке. <strong>Каждый код действителен только один раз</strong>.'
     webauthn: Ключи безопасности
   user_mailer:
+    appeal_approved:
+      action: Перейти к своему профилю
+      subject: Ваша апелляция от %{date} была одобрена
+      title: Апелляция одобрена
+    appeal_rejected:
+      subject: Ваша апелляция от %{date} отклонена
+      title: Апелляция отклонена
     backup_ready:
       explanation: Вы запросили архив всех данных вашей учётной записи Mastodon. Что ж, он готов к скачиванию.
       subject: Ваш архив готов к загрузке
@@ -1526,6 +1536,7 @@ ru:
       subject: Пожалуйста, подтвердите попытку входа
       title: Попытка входа
     warning:
+      appeal: Подать апелляцию
       categories:
         spam: Спам
         violation: Содержимое нарушает следующие правила сообщества
@@ -1537,7 +1548,6 @@ ru:
         suspend: Вы больше не сможете использовать эту учётную запись и ваш профиль более недоступен к просмотру. Вы по-прежнему можете войти в учётную запись, чтобы запросить выгрузку своих данных, до тех пор, пока они не будут удалены спустя 30 дней (за исключением информации, которая не позволит вам обойти эту блокировку).
       get_in_touch: Если вы считаете, что это ошибка, вы можете ответить на это сообщение или связаться с руководством %{instance}.
       reason: 'Причина:'
-      review_server_policies: Посмотреть правила сервера
       statuses: 'Следующие публикации были отмечены как нарушающие правила:'
       subject:
         delete_statuses: Опубликованные вами с учётной записи %{acct} посты были удалены
diff --git a/config/locales/sc.yml b/config/locales/sc.yml
index 221943217..ce9d35ac3 100644
--- a/config/locales/sc.yml
+++ b/config/locales/sc.yml
@@ -94,7 +94,6 @@ sc:
     account_moderation_notes:
       create: Lassa una nota
       created_msg: As creadu una nota de moderatzione.
-      delete: Cantzella
       destroyed_msg: As cantzelladu una nota de moderatzione.
     accounts:
       add_email_domain_block: Bloca domìniu de posta eletrònica
@@ -393,9 +392,6 @@ sc:
         silence: a sa muda
         suspend: suspèndidu
       show:
-        affected_accounts:
-          one: Unu contu de sa base de datos implicadu
-          other: "%{count} contos de sa base de datos implicados"
         retroactive:
           silence: Boga de is contos a sa muda is contos de custu domìniu implicados
           suspend: Boga sa suspensione de is contos de custu domìniu implicados
@@ -427,9 +423,6 @@ sc:
       by_domain: Domìniu
       delivery_available: Sa cunsigna est a disponimentu
       empty: Perunu domìniu agatadu.
-      known_accounts:
-        one: "%{count} contu connòschidu"
-        other: "%{count} contos connòschidos"
       moderation:
         all: Totus
         limited: Limitadas
@@ -725,7 +718,6 @@ sc:
     status:
       account_status: Istadu de su contu
       confirming: Isetende chi sa posta eletrònica siat cumpletada.
-      functional: Su contu tuo est operativu.
       pending: Sa dimanda tua est in protzessu de revisione dae su personale nostru. Podet serbire unu pagu de tempus. As a retzire unu messàgiu eletrònicu si sa dimanda est aprovada.
       redirecting_to: Su contu tuo est inativu pro ite in die de oe est torrende a indiritzare a %{acct}.
     too_fast: Formulàriu imbiadu tropu a lestru, torra a proare.
@@ -1316,7 +1308,6 @@ sc:
       subject: Cunfirma su tentativu de identificatzione
       title: Tentativu de identificatzione
     warning:
-      review_server_policies: Revisiona sas polìticas de su serbidore
       subject:
         disable: Su contu tuo %{acct} est istadu cungeladu
         none: Avisu pro %{acct}
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index b2dacbf24..0f21493c1 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -10,7 +10,7 @@ ar:
         text: بإمكانك استخدام نفس القواعد التي نجدها في التبويقات كعناوين الروابط والوسوم والإشارات
         title: اختياري. غير مرئي للمُستَلِم
       admin_account_action:
-        include_statuses: سيرى المستخدم أي مِن التبويقات تسببت في إجراء الإشراف أو التحذير
+        include_statuses: سيرى المستخدم أي المنشورات تسببت في إجراء الإشراف أو التحذير
         send_email_notification: سوف يتلقى المستخدم رسالة تُفسِّر ما حدث على حسابه
         text_html: اختياري، يمكنك استخدام بناء التبويق. يمكنك <a href="%{path}">إضافة إعدادات تحذير مسبقة</a> لتوفير الوقت
         type_html: اختر ما تود إجراؤه على <strong>%{acct}</strong>
@@ -41,20 +41,20 @@ ar:
         fields: يُمكنك عرض 4 عناصر على شكل جدول في صفحتك التعريفية
         header: ملف PNG أو GIF أو JPG. حجمه على أقصى تصدير %{size}. سيتم تصغيره إلى %{dimensions}px
         inbox_url: نسخ العنوان الذي تريد استخدامه مِن صفحة الاستقبال للمُرحَّل
-        irreversible: التبويقات التي تم تصفيتها ستختفي لا محالة حتى و إن تمت إزالة عامِل التصفية لاحقًا
+        irreversible: المنشورات التي تم تصفيتها ستختفي لا محالة حتى و إن تمت إزالة عامِل التصفية لاحقًا
         locale: لغة واجهة المستخدم و الرسائل الإلكترونية و الإشعارات
         locked: يتطلب منك الموافقة يدويا على طلبات المتابعة
         password: يُنصح باستخدام 8 أحرف على الأقل
         phrase: سوف يتم العثور عليه مهما كان نوع النص أو حتى و إن كان داخل الويب فيه تحذير عن المحتوى
         scopes: ما هي المجالات المسموح بها في التطبيق ؟ إن قمت باختيار أعلى المجالات فيمكنك الاستغناء عن الخَيار اليدوي.
-        setting_aggregate_reblogs: لا تقم بعرض المشارَكات الجديدة لتبويقات قد قُمتَ بمشاركتها سابقا (هذا الإجراء يعني المشاركات الجديدة فقط التي تلقيتَها)
+        setting_aggregate_reblogs: لا تقم بعرض المشارَكات الجديدة لمنشورات قد قُمتَ بمشاركتها سابقا (هذا الإجراء يعني المشاركات الجديدة فقط التي تلقيتَها)
         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: إخفاء تحديثات الخط وراء نقرة بدلًا مِن التمرير التلقائي للتدفق
         username: اسم المستخدم الخاص بك سوف يكون فريدا مِن نوعه على %{domain}
@@ -88,7 +88,7 @@ ar:
       tag:
         name: يمكنك فقط تغيير غلاف الحروف ، على سبيل المثال ، لجعلها أكثر قابلية للقراءة
       user:
-        chosen_languages: لن تظهر على الخيوط العمومية إلّا التبويقات المنشورة في اللغات المختارة
+        chosen_languages: إن تم اختيارها، فلن تظهر على الخيوط العامة إلّا الرسائل المنشورة في تلك اللغات
     labels:
       account:
         fields:
@@ -102,7 +102,7 @@ ar:
         text: نموذج نصي
         title: العنوان
       admin_account_action:
-        include_statuses: أدرج التبويقات التي تم الإبلاغ عنها ضمن الرسالة الإلكترونية
+        include_statuses: أدرج المنشورات التي تم الإبلاغ عنها ضمن الرسالة الإلكترونية
         send_email_notification: إشعار المستخدِم عبر البريد الإلكتروني
         text: تحذير مخصص
         type: الإجراء
@@ -149,22 +149,22 @@ ar:
         setting_advanced_layout: تمكين واجهة الويب المتقدمة
         setting_aggregate_reblogs: جمع الترقيات في خيوط زمنية
         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_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_show_application: اكشف اسم التطبيق المستخدَم لإرسال المنشورات
         setting_system_font_ui: استخدم الخطوط الافتراضية للنظام
         setting_theme: سمة الموقع
         setting_trends: اعرض ما يُتداوَل اليوم
@@ -204,15 +204,13 @@ ar:
         mention: ابعث بريداً إلكترونيًا عندما يُشير إليك أو يذكُرك أحدهم
         pending_account: ابعث رسالة إلكترونية إن كان هناك حساب جديد بحاجة إلى مراجعة
         reblog: ابعث بريداً إلكترونيًا عندما يقوم أحدهم بترقية منشورك
-        report: إرسال رسالة إلكترونية عند تلقّي إبلاغ جديد
-        trending_tag: ابعث رسالة إلكترونية إن كان هناك وسم متداوَل بحاجة إلى مراجعة
       rule:
         text: قانون
       tag:
         listable: اسمح لهذا الوسم بالظهور في البحث وفي دليل الصفحات التعريفية
         name: الوسم
         trendable: السماح لهذه الكلمة المفتاحية بالظهور تحت المتداوَلة
-        usable: اسمح للتبويقات باستخدام هذا الوسم
+        usable: اسمح للمنشورات استخدام هذا الوسم
     'no': لا
     required:
       mark: "*"
diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml
index 4f6626bfb..72f85203b 100644
--- a/config/locales/simple_form.ast.yml
+++ b/config/locales/simple_form.ast.yml
@@ -92,7 +92,6 @@ ast:
         follow_request: Daquién solicitó siguite
         mention: Daquién te mentó
         reblog: Daquién compartió dalgún estáu de to
-        report: Unvióse un informe nuevu
       tag:
         name: Etiqueta
     'no': Non
diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml
index f0cb47995..42c241cab 100644
--- a/config/locales/simple_form.ca.yml
+++ b/config/locales/simple_form.ca.yml
@@ -27,6 +27,8 @@ ca:
         scheduled_at: Deixa-ho en blanc per a publicar l’anunci immediatament
         starts_at: Opcional. En el cas que el teu anunci estigui vinculat a un interval de temps específic
         text: Pots utilitzar sintaxi d'un tut. 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:
         autofollow: Les persones que es registrin a través de la invitació et seguiran automàticament
         avatar: PNG, GIF o JPG. Màxim %{size}. S'escalarà a %{dimensions}px
@@ -119,6 +121,8 @@ ca:
         scheduled_at: Programa la publicació
         starts_at: Inici del esdeveniment
         text: Anunci
+      appeal:
+        text: Explica perquè aquesta decisió hauria de ser revertida
       defaults:
         autofollow: Convida a seguir el teu compte
         avatar: Avatar
@@ -197,6 +201,7 @@ ca:
           sign_up_requires_approval: Limitar els registres
         severity: Regla
       notification_emails:
+        appeal: Algú ha apel·lat una decisió de moderació
         digest: Enviar un resum per correu electrònic
         favourite: Algú marca com a preferit el teu estat
         follow: Algú t'ha seguit
@@ -204,8 +209,8 @@ ca:
         mention: Algú t'ha esmentat
         pending_account: Un nou compte necessita revisió
         reblog: Algú comparteix el teu estat
-        report: Es presenta un nou informe
-        trending_tag: Una etiqueta sense revisar està en tendència
+        report: Nou informe és emés
+        trending_tag: Nova tendència requereix revisió
       rule:
         text: Norma
       tag:
diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml
index c1ccd950b..c6cff10bc 100644
--- a/config/locales/simple_form.co.yml
+++ b/config/locales/simple_form.co.yml
@@ -197,8 +197,6 @@ co:
         mention: Mandà un’e-mail quandu qualch’unu mi mintuva
         pending_account: Mandà un'e-mail quandu un novu contu hà bisognu d'esse valutatu
         reblog: Mandà un’e-mail quandu qualch’unu sparte i mo statuti
-        report: Mandà un'e-mail quandu c'hè un novu signalamentu
-        trending_tag: Mandà un'e-mail quandu un hashtag micca verificatu hè in e tendenze
       rule:
         text: Regula
       tag:
diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml
index 7c4912eec..57ea417ea 100644
--- a/config/locales/simple_form.cs.yml
+++ b/config/locales/simple_form.cs.yml
@@ -204,8 +204,6 @@ cs:
         mention: Někdo vás zmínil
         pending_account: Je třeba posoudit nový účet
         reblog: Někdo boostnul váš příspěvek
-        report: Je odesláno nové hlášení
-        trending_tag: Nový trend vyžaduje schválení
       rule:
         text: Pravidlo
       tag:
diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml
index 231b46765..e5ef5661d 100644
--- a/config/locales/simple_form.cy.yml
+++ b/config/locales/simple_form.cy.yml
@@ -174,8 +174,6 @@ cy:
         mention: Anfon e-bost pan mae rhywun yn eich crybwyll
         pending_account: Anfon ebost pan mae cyfrif newydd angen adolygiad
         reblog: Anfon e-bost pan mae rhywun yn bŵstio eich statws
-        report: Anfon e-bost pan y cyflwynir adroddiad newydd
-        trending_tag: Anfonwch e-bost pan fydd hashnod heb ei adolygu yn tueddu
       tag:
         listable: Gadewch i'r hashnod hwn ymddangos mewn chwiliadau ac ar y cyfeiriadur proffil
         name: Hashnod
diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml
index b42941c32..4d9ad8f3c 100644
--- a/config/locales/simple_form.da.yml
+++ b/config/locales/simple_form.da.yml
@@ -119,6 +119,8 @@ da:
         scheduled_at: Planlæg offentliggørelse
         starts_at: Start af begivenhed
         text: Bekendtgørelse
+      appeal:
+        text: Forklar, hvorfor denne beslutning bør omgøres
       defaults:
         autofollow: Invitér til at følge din konto
         avatar: Profilbillede
@@ -197,6 +199,7 @@ da:
           sign_up_requires_approval: Begræns tilmeldinger
         severity: Regel
       notification_emails:
+        appeal: En moderatorafgørelse er appelleret
         digest: Send resumé e-mails
         favourite: Nogen gav dig favoritstatus
         follow: Nogen begyndte at følge dig
@@ -205,7 +208,7 @@ da:
         pending_account: Ny konto kræver gennemgang
         reblog: Nogen boostede din status
         report: Ny anmeldelse er indsendt
-        trending_tag: Et ikke-gennemgået hashtag trender
+        trending_tag: Ny tendens kræver revidering
       rule:
         text: Regel
       tag:
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index 02ac9ce0c..3b5b91ed8 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -27,6 +27,8 @@ de:
         scheduled_at: Leer lassen um die Ankündigung sofort zu veröffentlichen
         starts_at: Optional. Falls deine Ankündigung an einen bestimmten Zeitraum gebunden ist
         text: Du kannst die Toot-Syntax verwenden. Bitte beachte den Platz, den die Ankündigung auf dem Bildschirm des Benutzers einnehmen wird
+      appeal:
+        text: Du kannst nur einmal einen Einspruch bei einem Strike einlegen
       defaults:
         autofollow: Leute, die sich über deine Einladung registrieren, werden dir automatisch folgen
         avatar: PNG, GIF oder JPG. Maximal %{size}. Wird auf %{dimensions} px herunterskaliert
@@ -119,6 +121,8 @@ de:
         scheduled_at: Veröffentlichung planen
         starts_at: Beginn des Ereignisses
         text: Ankündigung
+      appeal:
+        text: Erkläre, warum diese Entscheidung rückgängig gemacht werden soll
       defaults:
         autofollow: Eingeladene Nutzer sollen dir automatisch folgen
         avatar: Profilbild
@@ -197,6 +201,7 @@ de:
           sign_up_requires_approval: Anmeldungen begrenzen
         severity: Regel
       notification_emails:
+        appeal: Jemand hat Einspruch an eine Moderatorentscheidung
         digest: Kurzfassungen über E-Mail senden
         favourite: E-Mail senden, wenn jemand meinen Beitrag favorisiert
         follow: E-Mail senden, wenn mir jemand folgt
@@ -205,7 +210,7 @@ de:
         pending_account: E-Mail senden, wenn ein neues Benutzerkonto zur Überprüfung aussteht
         reblog: E-Mail senden, wenn jemand meinen Beitrag teilt
         report: E-Mail senden, wenn ein neuer Bericht vorliegt
-        trending_tag: E-Mail senden, wenn ein ausstehender Hashtag angesagt ist
+        trending_tag: Neuer Trend muss überprüft werden
       rule:
         text: Regel
       tag:
diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml
index 0213b7884..ccde10f2a 100644
--- a/config/locales/simple_form.el.yml
+++ b/config/locales/simple_form.el.yml
@@ -203,8 +203,6 @@ el:
         mention: Αποστολή email όταν κάποιος σε αναφέρει
         pending_account: Αποστολή email όταν υπάρχει νέος λογαριασμός για επιθεώρηση
         reblog: Αποστολή email όταν κάποιος προωθεί τη δημοσίευση σου
-        report: Αποστολή email όταν υποβάλλεται νέα καταγγελία
-        trending_tag: Αποστολή email όταν μια μη-εγκεκριμένη ετικέτα γίνεται δημοφιλής
       rule:
         text: Κανόνας
       tag:
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index e7c70e290..9a3718287 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -27,6 +27,8 @@ en:
         scheduled_at: Leave blank to publish the announcement immediately
         starts_at: Optional. In case your announcement is bound to a specific time range
         text: You can use post syntax. Please be mindful of the space the announcement will take up on the user's screen
+      appeal:
+        text: You can only appeal a strike once
       defaults:
         autofollow: People who sign up through the invite will automatically follow you
         avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px
@@ -119,6 +121,8 @@ en:
         scheduled_at: Schedule publication
         starts_at: Start of event
         text: Announcement
+      appeal:
+        text: Explain why this decision should be reversed
       defaults:
         autofollow: Invite to follow your account
         avatar: Avatar
@@ -197,6 +201,7 @@ en:
           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
@@ -204,8 +209,8 @@ en:
         mention: Someone mentioned you
         pending_account: New account needs review
         reblog: Someone boosted your post
-        report: A new report is submitted
-        trending_tag: A new trend requires approval
+        report: New report is submitted
+        trending_tag: New trend requires review
       rule:
         text: Rule
       tag:
diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml
index 773df52e3..83861358f 100644
--- a/config/locales/simple_form.eo.yml
+++ b/config/locales/simple_form.eo.yml
@@ -197,8 +197,6 @@ eo:
         mention: Sendi retmesaĝon kiam iu mencias vin
         pending_account: Sendi retmesaĝon kiam nova konto bezonas kontrolon
         reblog: Sendi retmesaĝon kiam iu diskonigas vian mesaĝon
-        report: Nova signalo estas sendita
-        trending_tag: Nekontrolita kradvorto furoras
       rule:
         text: Regulo
       tag:
diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml
index 2378def50..6026943e7 100644
--- a/config/locales/simple_form.es-AR.yml
+++ b/config/locales/simple_form.es-AR.yml
@@ -27,6 +27,8 @@ es-AR:
         scheduled_at: Dejar en blanco para publicar el anuncio inmediatamente
         starts_at: Opcional. En caso de que tu anuncio esté vinculado a un rango de tiempo específico
         text: Podés usar sintaxis de mensajes. Por favor, tené en cuenta el espacio que ocupará el anuncio en la pantalla del usuario
+      appeal:
+        text: Sólo podés apelar un incumplimiento una vez
       defaults:
         autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente
         avatar: 'PNG, GIF o JPG. Máximo: %{size}. Será subescalado a %{dimensions} píxeles'
@@ -119,6 +121,8 @@ es-AR:
         scheduled_at: Programar publicación
         starts_at: Inicio del evento
         text: Anuncio
+      appeal:
+        text: Explicá por qué esta decisión debería ser revertida
       defaults:
         autofollow: Invitar para seguir tu cuenta
         avatar: Avatar
@@ -197,6 +201,7 @@ es-AR:
           sign_up_requires_approval: Limitar registros
         severity: Regla
       notification_emails:
+        appeal: Alguien apela una solicitud de moderador
         digest: Enviar correos electrónicos compilatorios
         favourite: Una cuenta marca tu mensaje como favorito
         follow: Una cuenta te sigue
@@ -204,8 +209,8 @@ es-AR:
         mention: Una cuenta te menciona
         pending_account: Una nueva cuenta necesita revisión
         reblog: Una cuenta adhiere a tu mensaje
-        report: Se envía una nueva denuncia
-        trending_tag: Una nueva tendencia requiere aprobación
+        report: Se envió una nueva denuncia
+        trending_tag: Una nueva tendencia requiere revisión
       rule:
         text: Regla
       tag:
diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml
index 11d3ed5f4..e679e5498 100644
--- a/config/locales/simple_form.es-MX.yml
+++ b/config/locales/simple_form.es-MX.yml
@@ -204,8 +204,6 @@ es-MX:
         mention: Enviar correo electrónico cuando alguien te mencione
         pending_account: Enviar correo electrónico cuando una nueva cuenta necesita revisión
         reblog: Enviar correo electrónico cuando alguien comparta su publicación
-        report: Enviar un correo cuando se envía un nuevo informe
-        trending_tag: Enviar correo electrónico cuando una etiqueta no revisada está de tendencia
       rule:
         text: Norma
       tag:
diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml
index d2c64ce2b..9578ff13e 100644
--- a/config/locales/simple_form.es.yml
+++ b/config/locales/simple_form.es.yml
@@ -27,6 +27,8 @@ es:
         scheduled_at: Dejar en blanco para publicar el anuncio inmediatamente
         starts_at: Opcional. En caso de que su anuncio esté vinculado a un intervalo de tiempo específico
         text: Puedes usar la sintaxis de publicaciones. Por favor ten en cuenta el espacio que ocupará el anuncio en la pantalla del usuario
+      appeal:
+        text: Sólo puedes apelar una amonestación una vez
       defaults:
         autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente
         avatar: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px
@@ -119,6 +121,8 @@ es:
         scheduled_at: Programar publicación
         starts_at: Comienzo del evento
         text: Anuncio
+      appeal:
+        text: Explica por qué esta decisión debe ser revertida
       defaults:
         autofollow: Invitar a seguir tu cuenta
         avatar: Avatar
@@ -197,6 +201,7 @@ es:
           sign_up_requires_approval: Limitar registros
         severity: Regla
       notification_emails:
+        appeal: Alguien ha apelado una decisión de moderación
         digest: Enviar resumen de correos electrónicos
         favourite: Enviar correo electrónico cuando alguien de a favorito en su publicación
         follow: Enviar correo electrónico cuando alguien te siga
@@ -204,8 +209,8 @@ es:
         mention: Enviar correo electrónico cuando alguien te mencione
         pending_account: Enviar correo electrónico cuando una nueva cuenta necesita revisión
         reblog: Enviar correo electrónico cuando alguien comparta su publicación
-        report: Enviar un correo cuando se envía un nuevo informe
-        trending_tag: Enviar correo electrónico cuando una etiqueta no revisada está de tendencia
+        report: Nuevo informe enviado
+        trending_tag: Una nueva tendencia requiere revisión
       rule:
         text: Norma
       tag:
diff --git a/config/locales/simple_form.et.yml b/config/locales/simple_form.et.yml
index e3c1a0b98..efbc0b322 100644
--- a/config/locales/simple_form.et.yml
+++ b/config/locales/simple_form.et.yml
@@ -175,8 +175,6 @@ et:
         mention: Saada e-kiri, kui keegi mainib Teid
         pending_account: Saada e-kiri, kui uus konto vajab ülevaatlust
         reblog: Saada e-kiri, kui keegi upitab Teie staatust
-        report: Saada e-kiri, kui esitatud on uus teavitus
-        trending_tag: Saada e-kiri, kui ülevaatamata silt trendib
       tag:
         listable: Luba sellel sildil ilmuda profiilide kataloogis
         name: Silt
diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml
index 4de0fdee9..5adb8a48b 100644
--- a/config/locales/simple_form.eu.yml
+++ b/config/locales/simple_form.eu.yml
@@ -204,8 +204,6 @@ eu:
         mention: Bidali e-mail bat norbaitek zu aipatzean
         pending_account: Bidali e-mail bat kontu bat berrikusi behar denean
         reblog: Bidali e-mail bat norbaitek zure mezuari bultzada ematen badio
-        report: Bidali e-maila txosten berri bat aurkezten denean
-        trending_tag: Bidali e-mail bat errebisatu gabeko traola bat joeran dagoenean
       rule:
         text: Araua
       tag:
diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml
index 82f2ad492..131047947 100644
--- a/config/locales/simple_form.fa.yml
+++ b/config/locales/simple_form.fa.yml
@@ -204,8 +204,6 @@ fa:
         mention: وقتی کسی از شما نام برد ایمیل بفرست
         pending_account: وقتی حساب تازه‌ای نیاز به بازبینی داشت ایمیل بفرست
         reblog: وقتی کسی نوشتهٔ شما را بازبوقید ایمیل بفرست
-        report: وقتی گزارش تازه‌ای فرستاده شد ایمیل بفرست
-        trending_tag: وقتی یک برچسب بازبینی‌نشده پرطرفدار شد ایمیل بفرست
       rule:
         text: قانون
       tag:
diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml
index c0e9fa2ec..5c37d708b 100644
--- a/config/locales/simple_form.fi.yml
+++ b/config/locales/simple_form.fi.yml
@@ -7,6 +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
         title: Vapaaehtoinen. Ei näytetä vastaanottajalle
       admin_account_action:
         include_statuses: Käyttäjä näkee mitkä viestit johtivat toimenpiteeseen tai varoitukseen
@@ -24,34 +25,87 @@ fi:
         all_day: Kun valittu, vain valittu aikaväli näytetään
         ends_at: Valinnainen. Ilmoitus tullaan poistamaan automaattisesti tällä hetkellä
         scheduled_at: Jätä tyhjäksi julkaistaksesi ilmoituksen välittömästi
+        starts_at: Valinnainen. Jos ilmoituksesi on sidottu tiettyyn aikaväliin
+        text: Voit käyttää julkaisun syntaksia. Muista, kuinka paljon tilaa ilmoitus vie käyttäjän näytöltä
+      appeal:
+        text: Voit valittaa varoituksesta vain kerran
       defaults:
+        autofollow: Henkilöt, jotka rekisteröityvät kutsun kautta, seuraavat sinua automaattisesti
         avatar: PNG, GIF tai JPG. Enintään %{size}. Skaalataan kokoon %{dimensions} px
         bot: Tämä tili suorittaa enimmäkseen automaattisia toimintoja eikä sitä ehkä valvota
+        context: Yksi tai useampi asiayhteys, jossa suodattimen pitäisi olla käytössä
+        current_password: Turvallisuussyistä kirjoita nykyisen tilin salasana
+        current_username: Vahvista kirjoittamalla nykyisen tilin käyttäjätunnus
         digest: Lähetetään vain pitkän poissaolon jälkeen ja vain, jos olet saanut suoria viestejä poissaolosi aikana
         discoverable: Profiilihakemisto on toinen tapa, jolla tilisi voi tavoittaa laajemman yleisön
+        discoverable_no_directory: Salli tuntemattomien löytää tilisi suositusten ja muiden ominaisuuksien kautta
         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ää
+        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
         password: Käytä vähintään 8 merkkiä
+        phrase: Täytetään riippumatta julkaisun kirjainkoon tai sisällön varoituksesta
+        scopes: Mihin sovellusliittymiin sovellus pääsee käsiksi. Jos valitset ylätason laajuuden, sinun ei tarvitse valita yksittäisiä.
+        setting_aggregate_reblogs: Älä näytä uusia tehosteita viesteille, joita on äskettäin tehostettu (koskee vain äskettäin saatuja tehosteita)
+        setting_default_sensitive: Arkaluontoinen media on oletuksena piilotettu ja se voidaan näyttää yhdellä napsautuksella
         setting_display_media_default: Piilota arkaluonteiseksi merkitty media
         setting_display_media_hide_all: Piilota aina kaikki media
         setting_display_media_show_all: Näytä aina arkaluonteiseksi merkitty media
+        setting_hide_network: Ketä seuraat ja kuka seuraa sinua, piilotetaan profiiliisi
         setting_noindex: Vaikuttaa julkiseen profiiliisi ja tilasivuihisi
         setting_show_application: Viestittelyyn käyttämäsi sovellus näkyy viestiesi yksityiskohtaisessa näkymässä
         setting_use_blurhash: Liukuvärit perustuvat piilotettujen kuvien väreihin, mutta sumentavat yksityiskohdat
+        setting_use_pending_items: Piilota aikajanan päivitykset napsautuksen taakse sen sijaan, että vierittäisi syötettä automaattisesti
+        username: Käyttäjänimesi tulee olemaan yksilöllinen %{domain}
+        whole_word: Kun avainsana tai lause on vain aakkosnumeerinen, se otetaan käyttöön, jos se vastaa koko sanaa
+      domain_allow:
+        domain: Tämä verkkotunnus voi noutaa tietoja tältä palvelimelta ja sieltä saapuvat tiedot käsitellään ja tallennetaan
+      email_domain_block:
+        domain: Tämä voi olla se verkkotunnus, joka näkyy sähköpostiosoitteessa, MX-tietue, johon verkkotunnus ratkaistaan tai IP-osoitteessa, johon MX tietue päättää. Ne tarkistetaan käyttäjän kirjautumisen yhteydessä ja kirjautuminen hylätään.
+        with_dns_records: Annetun verkkotunnuksen DNS-tietueet yritetään ratkaista ja tulokset myös estetään
+      featured_tag:
+        name: 'Voit halutessasi käyttää jotakin näistä:'
+      form_challenge:
+        current_password: Olet menossa suojatulle alueelle
       imports:
         data: Toisesta Mastodon-instanssista tuotu CSV-tiedosto
+      invite_request:
+        text: Tämä auttaa meitä arvioimaan sovellustasi
+      ip_block:
+        comment: Valinnainen. Muista miksi lisäsit tämän säännön.
+        expires_in: IP-osoitteet ovat rajallinen resurssi, joskus niitä jaetaan ja vaihtavat usein omistajaa. Tästä syystä epämääräisiä IP-lohkoja ei suositella.
+        ip: Kirjoita IPv4- tai IPv6-osoite. Voit estää kokonaisia alueita käyttämällä CIDR-syntaksia. Varo, että et lukitse itseäsi!
+        severities:
+          no_access: Estä pääsy kaikkiin resursseihin
+          sign_up_requires_approval: Uudet rekisteröitymiset edellyttävät hyväksyntääsi
+        severity: Valitse, mitä tapahtuu tämän IP-osoitteen pyynnöille
+      rule:
+        text: Kuvaile sääntöä tai vaatimusta tämän palvelimen käyttäjille. Yritä pitää se lyhyenä ja yksinkertaisena
       sessions:
         otp: Syötä puhelimeen saamasi kaksivaiheisen tunnistautumisen koodi tai käytä palautuskoodia.
+        webauthn: Jos kyseessä on USB-avain, muista laittaa se paikalleen ja tarvittaessa napauttaa sitä.
+      tag:
+        name: Voit muuttaa esimerkiksi kirjaimia paremmin luettavaksi
+      user:
+        chosen_languages: Kun valittu, vain valituilla kielillä julkaistut viestit näkyvät julkisilla aikajanoilla
     labels:
       account:
         fields:
           name: Nimike
           value: Sisältö
+      account_alias:
+        acct: Vanhan tilin käsittely
+      account_migration:
+        acct: Uuden tilin käsittely
       account_warning_preset:
+        text: Esiasetettu teksti
         title: Otsikko
       admin_account_action:
+        include_statuses: Sisällytä raportoidut viestit sähköpostiin
+        send_email_notification: Ilmoita käyttäjälle sähköpostitse
         text: Mukautettu varoitus
         type: Toimenpide
         types:
@@ -64,8 +118,11 @@ fi:
       announcement:
         all_day: Koko päivän kestävä tapahtuma
         ends_at: Tapahtuman loppu
+        scheduled_at: Ajasta julkaisu
         starts_at: Tapahtuman alku
         text: Ilmoitus
+      appeal:
+        text: Perustele, miksi tämä päätös olisi kumottava
       defaults:
         autofollow: Kutsu seuraamaan tiliäsi
         avatar: Profiilikuva
@@ -82,6 +139,9 @@ fi:
         expires_in: Vanhenee
         fields: Profiilin metadata
         header: Otsakekuva
+        honeypot: "%{label} (älä täytä)"
+        inbox_url: Välityspostilaatikon URL-osoite
+        irreversible: Pudota piilottamisen sijaan
         locale: Kieli
         locked: Lukitse tili
         max_uses: Käyttökertoja enintään
@@ -99,10 +159,12 @@ fi:
         setting_default_privacy: Julkaisun näkyvyys
         setting_default_sensitive: Merkitse media aina arkaluontoiseksi
         setting_delete_modal: Kysy vahvistusta ennen viestin poistamista
+        setting_disable_swiping: Poista pyyhkäisyt käytöstä
         setting_display_media: Median näyttäminen
         setting_display_media_default: Oletus
         setting_display_media_hide_all: Piilota kaikki
         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_reduce_motion: Vähennä animaatioiden liikettä
@@ -111,6 +173,7 @@ fi:
         setting_theme: Sivuston teema
         setting_trends: Näytä päivän trendit
         setting_unfollow_modal: Kysy vahvistusta, ennen kuin lopetat seuraamisen
+        setting_use_blurhash: Näytä värikkäät liukuvärit piilotetulle medialle
         setting_use_pending_items: Hidastila
         severity: Vakavuus
         sign_in_token_attempt: Turvakoodi
@@ -131,12 +194,14 @@ fi:
       invite_request:
         text: Miksi haluat liittyä?
       ip_block:
+        comment: Kommentti
         ip: IP
         severities:
           no_access: Estä pääsy
           sign_up_requires_approval: Rajoita rekisteröitymisiä
         severity: Sääntö
       notification_emails:
+        appeal: Joku valittaa valvojan päätöksestä
         digest: Lähetä koosteviestejä sähköpostitse
         favourite: Lähetä sähköposti, kun joku tykkää tilastasi
         follow: Lähetä sähköposti, kun joku seuraa sinua
@@ -144,13 +209,20 @@ fi:
         mention: Lähetä sähköposti, kun sinut mainitaan
         pending_account: Uusi tili tarvitsee tarkastusta
         reblog: Lähetä sähköposti, kun joku buustaa julkaisusi
+        report: Uusi raportti on lähetetty
+        trending_tag: Uusi trendi vaatii tarkastelua
       rule:
         text: Sääntö
       tag:
+        listable: Salli tämän hashtagin näkyä hauissa ja ehdotuksissa
         name: Aihetunniste
         trendable: Salli tämän aihetunnisteen näkyä trendeissä
         usable: Salli postauksien käyttää tätä aihetunnistetta
     'no': Ei
     required:
+      mark: "*"
       text: pakollinen tieto
+    title:
+      sessions:
+        webauthn: Käytä jotakin suojausavainta kirjautuaksesi sisään
     'yes': Kyllä
diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml
index 01ee10f44..ebda78f22 100644
--- a/config/locales/simple_form.fr.yml
+++ b/config/locales/simple_form.fr.yml
@@ -27,6 +27,8 @@ fr:
         scheduled_at: Laisser vide pour publier l’annonce immédiatement
         starts_at: Optionnel. Si votre annonce est liée à une période spécifique
         text: Vous pouvez utiliser la syntaxe des messages. Veuillez prendre en compte l’espace que l'annonce prendra sur l’écran de l'utilisateur·rice
+      appeal:
+        text: Vous ne pouvez faire appel d'une sanction qu'une seule fois
       defaults:
         autofollow: Les personnes qui s’inscrivent grâce à l’invitation vous suivront automatiquement
         avatar: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px
@@ -119,6 +121,8 @@ fr:
         scheduled_at: Planifier la publication
         starts_at: Début de l’événement
         text: Annonce
+      appeal:
+        text: Expliquez pourquoi cette décision devrait être annulée
       defaults:
         autofollow: Invitation à suivre votre compte
         avatar: Image de profil
@@ -197,6 +201,7 @@ fr:
           sign_up_requires_approval: Limite des inscriptions
         severity: Règle
       notification_emails:
+        appeal: Une personne fait appel d'une décision des modérateur·rice·s
         digest: Envoyer des courriels récapitulatifs
         favourite: Quelqu’un a ajouté mon message à ses favoris
         follow: Quelqu’un vient de me suivre
@@ -204,8 +209,8 @@ fr:
         mention: Quelqu’un me mentionne
         pending_account: Nouveau compte en attente d’approbation
         reblog: Quelqu’un a partagé mon message
-        report: Un nouveau rapport est envoyé
-        trending_tag: Un hashtag non approuvé est dans les tendances
+        report: Nouveau signalement soumis
+        trending_tag: Nouvelle tendance nécessitant supervision
       rule:
         text: Règle
       tag:
diff --git a/config/locales/simple_form.gd.yml b/config/locales/simple_form.gd.yml
index d8f30e871..bc2cb5b62 100644
--- a/config/locales/simple_form.gd.yml
+++ b/config/locales/simple_form.gd.yml
@@ -204,8 +204,6 @@ gd:
         mention: Thug cuideigin iomradh ort
         pending_account: Tha cunntas ùr feumach air lèirmheas
         reblog: Bhrosnaich cuideigin am post agad
-        report: Chaidh gearan ùr a chur a-null
-        trending_tag: Tha treandadh ùr feumach air dearbhadh
       rule:
         text: Riaghailt
       tag:
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index 7c3d5a9b2..1ffdb8302 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -27,6 +27,8 @@ gl:
         scheduled_at: Déixao baleiro para publicar o anuncio de xeito inmediato
         starts_at: Opcional. No caso de que o teu anuncio estea vinculado a un intre de tempo específico
         text: Podes empregar a sintaxe na publicación. Ten en conta o espazo que ocupará o anuncio na pantalla da usuaria
+      appeal:
+        text: Só podes apelar a decesión unha vez
       defaults:
         autofollow: As persoas que se conectaron a través dun convite seguirante automáticamente
         avatar: PNG, GIF ou JPG. Máximo %{size}. Será reducida a %{dimensions}px
@@ -119,6 +121,8 @@ gl:
         scheduled_at: Publicación programada
         starts_at: Comezo do acontecemento
         text: Anuncio
+      appeal:
+        text: Indica a razón pola que habería que reverter a decisión
       defaults:
         autofollow: Convida a seguir a tua conta
         avatar: Avatar
@@ -137,7 +141,7 @@ gl:
         header: Cabeceira
         honeypot: "%{label} (non completar)"
         inbox_url: URL da caixa de entrada do repetidor
-        irreversible: Soltar en lugar de agochar
+        irreversible: Desbotar en lugar de agochar
         locale: Idioma da interface
         locked: Requerir aprobar seguimento
         max_uses: Número máximo de usos
@@ -197,6 +201,7 @@ gl:
           sign_up_requires_approval: Limitar o rexistro
         severity: Regra
       notification_emails:
+        appeal: Alguén apelou contra a decisión da moderación
         digest: Enviar correos con resumos
         favourite: Enviar un correo cando alguén marca como favorita unha das tuas publicacións
         follow: Enviar un correo cando alguén te segue
@@ -204,8 +209,8 @@ gl:
         mention: Enviar un correo cando alguén te menciona
         pending_account: Enviar un correo cando unha nova conta precisa revisión
         reblog: Enviar un correo cando alguén promociona a tua mensaxe
-        report: Enviar un correo cando se envíe unha denuncia
-        trending_tag: Unha nova tendencia require aprobación
+        report: Enviouse unha nova denuncia
+        trending_tag: Hai que revisar unha nova tendencia
       rule:
         text: Regra
       tag:
diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml
index e80704cee..8e4c921ef 100644
--- a/config/locales/simple_form.hu.yml
+++ b/config/locales/simple_form.hu.yml
@@ -27,6 +27,8 @@ hu:
         scheduled_at: Hagyd üresen, hogy a közleményt azonnal közzétegyük
         starts_at: Opcionális. Akkor használd, ha a közleményed adott időintervallumra vonatkozik
         text: Használhatod a bejegyzések szintaxisát. Ügyelj arra, hogy mennyi helyet foglal el majd a közlemény a felhasználó képernyőjén
+      appeal:
+        text: Egy vétséget csak egyszer fellebbezhetsz meg
       defaults:
         autofollow: Akik meghívón keresztül regisztrálnak, automatikusan követni fognak téged
         avatar: PNG, GIF vagy JPG. Maximum %{size}. Átméretezzük %{dimensions} pixelre
@@ -119,6 +121,8 @@ hu:
         scheduled_at: Közlemény időzítése
         starts_at: Esemény kezdete
         text: Közlemény
+      appeal:
+        text: Magyarázd el, miért kellene visszavonni ezt a döntést
       defaults:
         autofollow: Meghívás a fiókod követésére
         avatar: Profilkép
@@ -197,6 +201,7 @@ hu:
           sign_up_requires_approval: Regisztrációk korlátozása
         severity: Szabály
       notification_emails:
+        appeal: Valaki fellebbez egy moderátori döntéssel szemben
         digest: Összevont e-mailek küldése
         favourite: Valaki kedvencnek jelölte a bejegyzésedet
         follow: E-mail küldése, amikor valaki követni kezd téged
@@ -204,8 +209,8 @@ hu:
         mention: E-mail küldése, amikor valaki megemlít téged
         pending_account: E-mail küldése, ha új fiókot kell engedélyezni
         reblog: Valaki megtolta a bejegyzésedet
-        report: E-mail küldése, ha új bejelentés érkezett
-        trending_tag: Új felkapott hashtag jóváhagyásra vár
+        report: Új bejelentést küldtek be
+        trending_tag: Új trend felülvizsgálatra vár
       rule:
         text: Szabály
       tag:
diff --git a/config/locales/simple_form.hy.yml b/config/locales/simple_form.hy.yml
index c3418a1db..70f11eabf 100644
--- a/config/locales/simple_form.hy.yml
+++ b/config/locales/simple_form.hy.yml
@@ -195,8 +195,6 @@ hy:
         mention: Որեւէ մեկը նշեց քեզ
         pending_account: Վերանայման կարիք ունեցող նոր հաշիւ
         reblog: Ինչ֊որ մէկը գրառումդ տարածեց
-        report: Նոր բողոք է ուղարկուել
-        trending_tag: Չվերանայուած պիտակը թրենդի մէջ է
       rule:
         text: Կանոն
       tag:
diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml
index 7ba8ffd47..d7ab9763a 100644
--- a/config/locales/simple_form.id.yml
+++ b/config/locales/simple_form.id.yml
@@ -27,6 +27,8 @@ id:
         scheduled_at: Biarkan kosong jika ingin menerbitkan pengumuman secara langsung
         starts_at: Opsional. Persiapan jika pengumuman Anda terikat pada rentang waktu tertentu
         text: Anda dapat menggunakan sintaks toot. Mohon perhatikan ruang pengumuman yang mungkin akan memenuhi layar pengguna
+      appeal:
+        text: Anda hanya dapat mengajukan banding peringatan sekali
       defaults:
         autofollow: Orang yang ingin mendaftar lewat undangan, otomatis mengikuti Anda
         avatar: PNG, GIF atau JPG. Maksimal %{size}. Ukuran dikecilkan menjadi %{dimensions}px
@@ -119,6 +121,8 @@ id:
         scheduled_at: Jadwal publikasi
         starts_at: Awal mulai event
         text: Pengumuman
+      appeal:
+        text: Jelaskan mengapa keputusan ini perlu dibatalkan
       defaults:
         autofollow: Undang untuk mengikuti Anda
         avatar: Avatar
@@ -197,6 +201,7 @@ id:
           sign_up_requires_approval: Batasi pendaftaran
         severity: Aturan
       notification_emails:
+        appeal: Seseorang mengajukan banding tehadap keputusan moderator
         digest: Kirim email berisi rangkuman
         favourite: Kirim email saat seseorang menyukai status anda
         follow: Kirim email saat seseorang mengikuti anda
@@ -204,8 +209,8 @@ id:
         mention: Kirim email saat seseorang menyebut anda
         pending_account: Kirim email ketika akun baru perlu ditinjau
         reblog: Kirim email saat seseorang mem-boost status anda
-        report: Kirim email ketika laporan baru dikirim
-        trending_tag: Kirim email ketika tagar tak tertinjau jadi tren
+        report: Laporan baru dikirim
+        trending_tag: Tren baru harus ditinjau
       rule:
         text: Aturan
       tag:
diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml
index c7686a080..44541cc6b 100644
--- a/config/locales/simple_form.is.yml
+++ b/config/locales/simple_form.is.yml
@@ -7,12 +7,12 @@ is:
       account_migration:
         acct: Tilgreindu notandanafn@lén á notandaaðgangnum sem þú vilt flytjast til
       account_warning_preset:
-        text: Þú getur notað sömu skilgreiningar og fyrir tíst, svo sem URL-slóðir, myllumerki og tilvísanir
+        text: Þú getur notað sömu skilgreiningar og fyrir færslur, svo sem URL-slóðir, myllumerki og tilvísanir
         title: Valkvætt. Ekki sýnilegt viðtakandanum
       admin_account_action:
-        include_statuses: Notandinn mun sjá hvaða tíst hafa valdið viðbrögðum umsjónarmanns eða aðvörun kerfisins
+        include_statuses: Notandinn mun sjá hvaða færslur hafa valdið viðbrögðum umsjónarmanns eða aðvörun kerfisins
         send_email_notification: Notandinn mun fá útskýringar á því hvað gerðist með notandaaðganginn hans
-        text_html: Valfrjálst. Þú getur notað sömu skilgreiningar og fyrir tíst. Þú getur <a href="%{path}">bætt inn forstilltum aðvörunum</a> til að spara tíma
+        text_html: Valfrjálst. Þú getur notað sömu skilgreiningar og fyrir færslur. Þú getur <a href="%{path}">bætt inn forstilltum aðvörunum</a> til að spara tíma
         type_html: Veldu hvað eigi að gera við <strong>%{acct}</strong>
         types:
           disable: Koma í veg fyrir að notandinn noti aðganginn sinn, en ekki eyða eða fela efnið þeirra.
@@ -26,7 +26,9 @@ is:
         ends_at: Valfrjálst. Auglýsing verðut tekin úr birtingu á þessum tíma
         scheduled_at: Skildu þetta eftir autt til að birta auglýsinguna samstundis
         starts_at: Valfrjálst. Notað ef auglýsing er bundin við tiltekinn tímaramma
-        text: Þú getur notað sömu skilgreiningar og fyrir tíst. Hafðu í huga það pláss sem auglýsingin mun taka á skjá notandans
+        text: Þú getur notað sömu skilgreiningar og fyrir færslur. Hafðu í huga það pláss sem auglýsingin mun taka á skjá notandans
+      appeal:
+        text: Þú getur aðeins áfrýjað refsingu einu sinni
       defaults:
         autofollow: Fólk sem skráir sig í gegnum boðið mun sjálfkrafa fylgjast með þér
         avatar: PNG, GIF eða JPG. Mest %{size}. Verður smækkað í %{dimensions}px
@@ -41,20 +43,20 @@ is:
         fields: Þú getur birt allt að 4 atriði sem töflu á notandasniðinu þínu
         header: PNG, GIF eða JPG. Mest %{size}. Verður smækkað í %{dimensions}px
         inbox_url: Afritaðu slóðina af forsíðu endurvarpans sem þú vilt nota
-        irreversible: Síuð tíst munu hverfa óendurkræft, jafnvel þó sían sé seinna fjarlægð
+        irreversible: Síaðar færslur munu hverfa óendurkræft, jafnvel þó sían sé seinna fjarlægð
         locale: Tungumál notandaviðmótsins, tölvupósts og ýti-tilkynninga
         locked: Krefst þess að þú samþykkir fylgjendur handvirkt
         password: Notaðu minnst 8 stafi
-        phrase: Verður notað til samsvörunar burtséð frá stafstöðu texta eða viðvörunar vegna efnis í tísti
+        phrase: Verður notað til samsvörunar burtséð frá stafstöðu texta eða viðvörunar vegna efnis í færslu
         scopes: Að hvaða API-kerfisviðmótum forritið fær aðgang. Ef þú velur efsta-stigs svið, þarftu ekki að gefa einstakar heimildir.
-        setting_aggregate_reblogs: Ekki sýna nýjar endurbirtingar á tístum sem hafa nýlega verið endurbirt (hefur bara áhrif á ný-mótteknar endurbirtingar)
+        setting_aggregate_reblogs: Ekki sýna nýjar endurbirtingar á færslum sem hafa nýlega verið endurbirtar (hefur bara áhrif á ný-mótteknar endurbirtingar)
         setting_default_sensitive: Viðkvæmt myndefni er sjálfgefið falið og er hægt að birta með smelli
         setting_display_media_default: Fela myndefni sem merkt er viðkvæmt
         setting_display_media_hide_all: Alltaf fela allt myndefni
         setting_display_media_show_all: Alltaf birta myndefni sem merkt er viðkvæmt
         setting_hide_network: Hverjum þú fylgist með og hverjir fylgjast með þér verður ekki birt á notandasniðinu þínu
-        setting_noindex: Hefur áhrif á opinbera notandasniðið þitt og stöðusíður
-        setting_show_application: Nafnið á forritinu sem þú notar til að tísta mun birtast í ítarlegri sýn á tístunum þínum
+        setting_noindex: Hefur áhrif á opinbera notandasniðið þitt og færslusíður
+        setting_show_application: Nafnið á forritinu sem þú notar til að senda færslur mun birtast í ítarlegri sýn á færslunum þínum
         setting_use_blurhash: Litstiglarnir byggja á litunum í földu myndunum, en gera öll smáatriði óskýr
         setting_use_pending_items: Fela uppfærslur tímalínu þar til smellt er, í stað þess að hún skruni streyminu sjálfvirkt
         username: Notandanafnið þitt verður einstakt á %{domain}
@@ -88,7 +90,7 @@ is:
       tag:
         name: Þú getur aðeins breytt stafstöði mill há-/lágstafa, til gæmis til að gera þetta læsilegra
       user:
-        chosen_languages: Þegar merkt er við þetta, birtast einungis tíst á völdum tungumálum á opinberum tímalínum
+        chosen_languages: Þegar merkt er við þetta, birtast einungis færslur á völdum tungumálum á opinberum tímalínum
     labels:
       account:
         fields:
@@ -102,7 +104,7 @@ is:
         text: Forstilltur texti
         title: Titill
       admin_account_action:
-        include_statuses: Innifela kærð tíst í tölvupóstinum
+        include_statuses: Innifela kærðar færslur í tölvupóstinum
         send_email_notification: Láta notanda vita með tölvupósti
         text: Sérsniðin aðvörun
         type: Aðgerð
@@ -119,6 +121,8 @@ is:
         scheduled_at: Áætla birtingu
         starts_at: Upphaf atburðar
         text: Auglýsing
+      appeal:
+        text: Útskýrðu af hverju ætti að afturkalla þessa ákvörðun
       defaults:
         autofollow: Bjóða að fylgjast með aðgangnum þínum
         avatar: Auðkennismynd
@@ -150,21 +154,21 @@ is:
         setting_aggregate_reblogs: Hópa endurbirtingar í tímalínum
         setting_auto_play_gif: Spila sjálfkrafa GIF-hreyfimyndir
         setting_boost_modal: Sýna staðfestingarglugga fyrir endurbirtingu
-        setting_crop_images: Utansníða myndir í ekki útfelldum tístum í 16x9
+        setting_crop_images: Utansníða myndir í ekki-útfelldum færslum í 16x9
         setting_default_language: Tungumál sem skrifað er á
         setting_default_privacy: Gagnaleynd færslna
         setting_default_sensitive: Alltaf merkja myndefni sem viðkvæmt
-        setting_delete_modal: Birta staðfestingarglugga áður en tísti er eytt
+        setting_delete_modal: Birta staðfestingarglugga áður en færslu er eytt
         setting_disable_swiping: Gera strokuhreyfingar óvirkar
         setting_display_media: Birting myndefnis
         setting_display_media_default: Sjálfgefið
         setting_display_media_hide_all: Fela allt
         setting_display_media_show_all: Birta allt
-        setting_expand_spoilers: Alltaf útfella tíst sem eru með aðvörun vegna efnisins
+        setting_expand_spoilers: Alltaf útfella færslur sem eru með aðvörun vegna efnisins
         setting_hide_network: Fela netkerfið þ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 tíst
+        setting_show_application: Upplýsa um forrit sem er til að senda færslur
         setting_system_font_ui: Nota sjálfgefið letur kerfisins
         setting_theme: Þema vefsvæðis
         setting_trends: Birta það sem er efst á baugi í dag
@@ -197,22 +201,23 @@ is:
           sign_up_requires_approval: Takmarka nýskráningar
         severity: Regla
       notification_emails:
+        appeal: Einhver áfrýjar ákvörðun umsjónarmanns
         digest: Senda uppsafnaðan tölvupóst
-        favourite: Einhver setti stöðufærslu þína í eftirlæti
+        favourite: Einhver setti færslu þína í eftirlæti
         follow: Einhver fylgist núna með þér
         follow_request: Einhver hefur beðið um að fylgjast með þér
         mention: Einhver minntist á þig
         pending_account: Nýr notandaaðgangur þarfnast yfirferðar
-        reblog: Einhver endurbirti stöðufærslu þína
+        reblog: Einhver endurbirti færsluna þína
         report: Ný kæra hefur verið send inn
-        trending_tag: Óyfirfarið myllumerki er í umræðunni
+        trending_tag: Ný tilhneiging krefst yfirferðar
       rule:
         text: Regla
       tag:
         listable: Leyfa þessu myllumerki að birtast í leitum og í persónusniðamöppunni
         name: Myllumerki
         trendable: Leyfa þessu myllumerki að birtast undir tilhneigingum
-        usable: Leyfa tístum að nota þetta myllumerki
+        usable: Leyfa færslum að nota þetta myllumerki
     'no': Nei
     required:
       mark: "*"
diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml
index 7a1017796..2fdcfe865 100644
--- a/config/locales/simple_form.it.yml
+++ b/config/locales/simple_form.it.yml
@@ -27,6 +27,8 @@ it:
         scheduled_at: Lascia vuoto per pubblicare immediatamente l'annuncio
         starts_at: Opzionale. Quando l'annuncio è legato a un intervallo di tempo specifico
         text: Puoi usare la sintassi dei post. Tieni presente lo spazio che l'annuncio occuperà nello schermo dell'utente
+      appeal:
+        text: Puoi appellarti solo una volta
       defaults:
         autofollow: Le persone che si iscrivono attraverso l'invito ti seguiranno automaticamente
         avatar: PNG, GIF o JPG. Al massimo %{size}. Verranno scalate a %{dimensions}px
@@ -119,6 +121,8 @@ it:
         scheduled_at: Programma la pubblicazione
         starts_at: Inizio dell'evento
         text: Annuncio
+      appeal:
+        text: Spiega perché la decisione dovrebbe essere annullata
       defaults:
         autofollow: Invita a seguire il tuo account
         avatar: Immagine di profilo
@@ -197,6 +201,7 @@ it:
           sign_up_requires_approval: Limita iscrizioni
         severity: Regola
       notification_emails:
+        appeal: Qualcuno ricorre contro una decisione del moderatore
         digest: Invia email riassuntive
         favourite: Qualcuno ha apprezzato il tuo post
         follow: Invia email quando qualcuno ti segue
@@ -204,8 +209,8 @@ it:
         mention: Invia email quando qualcuno ti menziona
         pending_account: Invia e-mail quando un nuovo account richiede l'approvazione
         reblog: Qualcuno ha condiviso il tuo post
-        report: Manda una mail quando viene inviato un nuovo rapporto
-        trending_tag: Invia e-mail quando un hashtag non controllato è in tendenza
+        report: Una nuova segnalazione è stata inviata
+        trending_tag: La nuova tendenza richiede un controllo
       rule:
         text: Regola
       tag:
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index 4071bc5c8..fd2597727 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -204,8 +204,6 @@ ja:
         mention: 返信が来た時
         pending_account: 新しいアカウントの承認が必要な時
         reblog: 投稿がブーストされた時
-        report: 通報を受けた時
-        trending_tag: 未審査のハッシュタグが人気の時
       rule:
         text: ルール
       tag:
diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml
index 478170fbe..b3fa8d375 100644
--- a/config/locales/simple_form.kab.yml
+++ b/config/locales/simple_form.kab.yml
@@ -45,6 +45,7 @@ kab:
         types:
           disable: Sens anekcum
           none: Ur teg kra
+          sensitive: Amḥulfu
           silence: Sgugem
           suspend: Ḥbes di leεḍil
       announcement:
diff --git a/config/locales/simple_form.kk.yml b/config/locales/simple_form.kk.yml
index 882454d78..5b97a0e83 100644
--- a/config/locales/simple_form.kk.yml
+++ b/config/locales/simple_form.kk.yml
@@ -85,8 +85,6 @@ kk:
         mention: Біреу мен туралы жазған кезде хат жібер
         pending_account: Жаңа аккаунт құптау күткен кезде хат жібер
         reblog: Жазбамды біреу бөліскен кезде хат жібер
-        report: Жаңа шағым түскен кезде хат жібер
-        trending_tag: Қаралмаған хештег шыққан кезде хат жібер
       tag:
         listable: Бұл хештегті барлық жерде көрсетуге рұқсат бер
         name: Хэштег
diff --git a/config/locales/simple_form.kmr.yml b/config/locales/simple_form.kmr.yml
index 2702b14dc..d077c40b3 100644
--- a/config/locales/simple_form.kmr.yml
+++ b/config/locales/simple_form.kmr.yml
@@ -27,6 +27,8 @@ kmr:
         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
         text: Tu dikarî hevoksazî yên toot bikarbînî. Ji kerema xwe cihê ku ev daxuyanî li ser dîmenderê bikarhêner bigire baldar be
+      appeal:
+        text: Tu dikarî tenê carekê îtîraza binpêkirinê bikî
       defaults:
         autofollow: Mirovên ku bi rêya vexwendinê xwe tomar kirine ew ên bi xweberî te bişopînin
         avatar: PNG, GIF an jî JPG. Herî zêde %{size} dê ber bi %{dimensions}px ve were kêmkirin
@@ -121,6 +123,8 @@ kmr:
         scheduled_at: Weşanê demsaz bike
         starts_at: Destpêka bûyerê
         text: Daxuyanî
+      appeal:
+        text: Şîrove bike çima divê ev biryar were berovajîkirin
       defaults:
         autofollow: Ji bo şopandina ajimêra xwe vexwîne
         avatar: Wêne
@@ -199,6 +203,7 @@ kmr:
           sign_up_requires_approval: Tomaran sînordar bike
         severity: Rêbaz
       notification_emails:
+        appeal: Kesek îtîrazê biryara çavdêr dike
         digest: Kurte e-name bişîne
         favourite: Kesekî şandiya te hez kir
         follow: Kesekî te şopand
@@ -206,8 +211,8 @@ kmr:
         mention: Kesekî qale te kir
         pending_account: Pewîste ku ajimêra nû bihê lêkolînkirin
         reblog: Kesekî şandiya te bilind kir
-        report: Ragihandinek nû hate şandin
-        trending_tag: Hashtageke nenirxandî bûye rojev
+        report: Ragihandina nû hate şandin
+        trending_tag: Rojeva nû pêdivî nirxandinê ye
       rule:
         text: Rêbaz
       tag:
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index 408c4dfe2..2d7b0b99c 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -27,6 +27,8 @@ ko:
         scheduled_at: 공백으로 두면 공지사항이 곧바로 발행 됩니다
         starts_at: 공지사항이 특정한 시간에 종속 될 때를 위한 옵션입니다
         text: 게시물 문법을 사용할 수 있습니다. 공지사항은 사용자의 화면 상단 공간을 차지한다는 것을 명심하세요
+      appeal:
+        text: 처벌에 대해 단 한 번만 이의제기를 할 수 있습니다
       defaults:
         autofollow: 이 초대를 통해 가입하는 사람은 당신을 자동으로 팔로우 하게 됩니다
         avatar: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 축소 됨
@@ -119,6 +121,8 @@ ko:
         scheduled_at: 발행 일정
         starts_at: 이벤트 시작
         text: 공지사항
+      appeal:
+        text: 이 결정이 왜 번복되어야 하는지에 대해 설명해주세요
       defaults:
         autofollow: 초대를 통한 팔로우
         avatar: 아바타
@@ -197,6 +201,7 @@ ko:
           sign_up_requires_approval: 가입 제한
         severity: 규칙
       notification_emails:
+        appeal: 누군가가 중재자의 결정에 이의를 제기했습니다
         digest: 요약 이메일 보내기
         favourite: 누군가 내 상태를 즐겨찾기로 등록했을 때 이메일 보내기
         follow: 누군가 나를 팔로우 했을 때 이메일 보내기
@@ -204,8 +209,8 @@ ko:
         mention: 누군가 나를 언급했을 때 이메일 보내기
         pending_account: 새 계정이 심사가 필요할 때 이메일 보내기
         reblog: 누군가 내 툿을 부스트 했을 때 이메일 보내기
-        report: 새 신고 등록시 이메일로 알리기
-        trending_tag: 리뷰 되지 않은 해시태그가 유행할 때 이메일 보내기
+        report: 새 신고가 접수되었습니다
+        trending_tag: 새 트렌드에 대한 리뷰가 필요합니다
       rule:
         text: 규칙
       tag:
diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml
index 0a6cbc703..ac433d2c3 100644
--- a/config/locales/simple_form.ku.yml
+++ b/config/locales/simple_form.ku.yml
@@ -193,8 +193,6 @@ ku:
         mention: کەسێک باسی کردووی
         pending_account: هەژمارەی نوێ پێویستی بە پێداچوونەوەهەیە
         reblog: کاتێک کەسێک نووسراوەی ئێوە دووبارە توت دەکاتەوە
-        report: گوزارشتی نوێ پێشکەش کراوە
-        trending_tag: کاتێک هاشتاگێکی پێدانەچوو هۆگری فرە بوو، ئیمەیلێک بنێرە
       tag:
         listable: ڕیگەبدە ئەم هاشتاگە لە پێرستی هەڵبژاردەی بەکارهێنەران و پەڕەی گەڕان نیشان بدرێت
         name: هەشتاگ
diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml
index 36695fa3c..bf1cf446a 100644
--- a/config/locales/simple_form.lv.yml
+++ b/config/locales/simple_form.lv.yml
@@ -27,6 +27,8 @@ lv:
         scheduled_at: Lai nekavējoties publicētu paziņojumu, atstāj tukšu
         starts_at: Neobligāts. Ja tavs paziņojums ir saistīts ar noteiktu laika diapazonu
         text: Varari izmantot ziņu sintaksi. Lūdzu, apdomā lauku, ko paziņojums aizņems lietotāja ekrānā
+      appeal:
+        text: Brīdinājumu var pārsūdzēt tikai vienu reizi
       defaults:
         autofollow: Cilvēki, kuri reģistrējas, izmantojot uzaicinājumu, automātiski sekos tev
         avatar: PNG, GIF vai JPG. Ne vairāk kā %{size}. Tiks samazināts līdz %{dimensions} px
@@ -119,6 +121,8 @@ lv:
         scheduled_at: Ieplānot publikāciju
         starts_at: Pasākuma sākums
         text: Paziņojums
+      appeal:
+        text: Paskaidrojiet, kāpēc šis lēmums ir jāatceļ
       defaults:
         autofollow: Uzaicini sekot tavam kontam
         avatar: Avatars
@@ -197,6 +201,7 @@ lv:
           sign_up_requires_approval: Ierobežot reģistrēšanos
         severity: Noteikumi
       notification_emails:
+        appeal: Kāds pārsūdz moderatora lēmumu
         digest: Sūtīt kopsavilkumu e-pastus
         favourite: Kāds izcēla tavu ziņu
         follow: Kāds uzsāka tev sekot
@@ -205,7 +210,7 @@ lv:
         pending_account: Jāpārskata jaunu kontu
         reblog: Kāds paaugstināja tavu ziņu
         report: Tika iesniegts jauns ziņojums
-        trending_tag: Kļūst populārs nepārskatīts tēmturis
+        trending_tag: Jaunā tendence ir jāpārskata
       rule:
         text: Noteikumi
       tag:
diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml
index d8ce979d5..d6dec3afb 100644
--- a/config/locales/simple_form.nl.yml
+++ b/config/locales/simple_form.nl.yml
@@ -203,8 +203,6 @@ nl:
         mention: Wanneer iemand jou heeft vermeld
         pending_account: Wanneer een nieuw account moet worden beoordeeld
         reblog: Wanneer iemand jouw toot heeft geboost
-        report: Bij het indienen van een nieuwe rapportage
-        trending_tag: Wanneer een nog niet beoordeelde hashtag trending is
       rule:
         text: Regel
       tag:
diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml
index 513f7cca2..e787eb1a0 100644
--- a/config/locales/simple_form.nn.yml
+++ b/config/locales/simple_form.nn.yml
@@ -202,8 +202,6 @@ nn:
         mention: Send e-post når nokon nemner deg
         pending_account: Send e-post når ein ny konto treng gjennomgang
         reblog: Send e-post når nokon framhevar statusen din
-        report: Send e-post når nokon rapporterer noko
-        trending_tag: Ein emneknagg som ikkje er sett igjennom er på veg opp
       rule:
         text: Regler
       tag:
diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml
index 3e22c1a6e..112d1a743 100644
--- a/config/locales/simple_form.no.yml
+++ b/config/locales/simple_form.no.yml
@@ -202,8 +202,6 @@
         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 inn
-        trending_tag: En ugjennomgått emneknagg trender
       rule:
         text: Regler
       tag:
diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml
index b66aeec1c..e68cffc78 100644
--- a/config/locales/simple_form.oc.yml
+++ b/config/locales/simple_form.oc.yml
@@ -195,8 +195,6 @@ oc:
         mention: Enviar un corrièl quand qualqu’un vos menciona
         pending_account: Enviar un corrièl quand cal validar un compte novèl
         reblog: Enviar un corrièl quand qualqu’un tòrna partejar vòstre estatut
-        report: Enviar un corrièl pels nòus senhalaments
-        trending_tag: Enviar un corrièl quand una etiqueta pas repassada es en tendéncia
       rule:
         text: Règla
       tag:
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index 21880ec2b..1c2feb63d 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -204,8 +204,6 @@ pl:
         mention: Powiadamiaj mnie e-mailem, gdy ktoś o mnie wspomni
         pending_account: Wyślij e-mail kiedy nowe konto potrzebuje recenzji
         reblog: Powiadamiaj mnie e-mailem, gdy ktoś podbije mój wpis
-        report: Powiadamiaj mnie e-mailem, gdy zostanie utworzone nowe zgłoszenie
-        trending_tag: Nieprzejrzany hashtag jest na czasie
       rule:
         text: Zasada
       tag:
diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml
index 2fd300842..73fbe786b 100644
--- a/config/locales/simple_form.pt-BR.yml
+++ b/config/locales/simple_form.pt-BR.yml
@@ -204,8 +204,6 @@ pt-BR:
         mention: Enviar e-mail quando alguém te mencionar
         pending_account: Enviar e-mail quando uma nova conta precisa ser revisada
         reblog: Enviar e-mail quando alguém der boost nos teus toots
-        report: Enviar e-mail quando uma nova denúncia for enviada
-        trending_tag: Enviar e-mail quando uma hashtag não-revisada está em alta
       rule:
         text: Regra
       tag:
diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml
index 4d22a9648..9afe68705 100644
--- a/config/locales/simple_form.pt-PT.yml
+++ b/config/locales/simple_form.pt-PT.yml
@@ -27,6 +27,8 @@ pt-PT:
         scheduled_at: Deixe em branco para publicar o anúncio imediatamente
         starts_at: Opcional. Caso o seu anúncio seja vinculado a um intervalo de tempo específico
         text: Pode utilizar a sintaxe dos toot. Por favor, tenha em consideração o espaço que o anúncio ocupará no ecrã do utilizador
+      appeal:
+        text: Só pode recorrer de uma punição uma vez
       defaults:
         autofollow: As pessoas que aderem através do convite seguir-te-ão automaticamente
         avatar: PNG, GIF or JPG. Arquivos até %{size}. Vão ser reduzidos para %{dimensions}px
@@ -119,6 +121,8 @@ pt-PT:
         scheduled_at: Agendar publicação
         starts_at: Início do evento
         text: Anúncio
+      appeal:
+        text: Explique porque esta decisão deve ser revertida
       defaults:
         autofollow: Convidar para seguir a tua conta
         avatar: Imagem de Perfil
@@ -197,6 +201,7 @@ pt-PT:
           sign_up_requires_approval: Limitar inscrições
         severity: Regra
       notification_emails:
+        appeal: Alguém recorreu de uma decisão de moderação
         digest: Enviar e-mails de resumo
         favourite: Quando alguém adiciona uma publicação sua aos favoritos
         follow: Quando alguém começar a segui-lo
@@ -204,8 +209,8 @@ pt-PT:
         mention: Quando alguém o mencionar
         pending_account: Quando uma nova conta aguarda aprovação
         reblog: Quando alguém partilhar uma publicação sua
-        report: Quando um novo relatório é submetido
-        trending_tag: Quando uma hashtag não aprovada anteriormente estiver em destaque
+        report: Nova denúncia submetida
+        trending_tag: Nova tendência requer revisão
       rule:
         text: Regra
       tag:
diff --git a/config/locales/simple_form.ro.yml b/config/locales/simple_form.ro.yml
index 8138f1859..716c00b2c 100644
--- a/config/locales/simple_form.ro.yml
+++ b/config/locales/simple_form.ro.yml
@@ -173,8 +173,6 @@ ro:
         mention: Trimite e-mail când cineva te menționează
         pending_account: Noul cont trebuie revizuit
         reblog: Trimite e-mail când cineva impulsionează una din postările tale
-        report: Trimite e-mail când un raport nou este trimis
-        trending_tag: Un hashtag nerevizuit este în tendință
       tag:
         listable: Permite acestui hashtag să apară în căutări și în directorul de profil
         trendable: Permite acestui hashtag să apară sub tendințe
diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml
index 0b5da707c..3580606c3 100644
--- a/config/locales/simple_form.ru.yml
+++ b/config/locales/simple_form.ru.yml
@@ -27,6 +27,8 @@ ru:
         scheduled_at: Оставьте поля незаполненными, чтобы опубликовать объявление сразу
         starts_at: Необязательно. На случай, если ваше объявление привязано к какому-то временному интервалу
         text: Вы можете использовать тот же синтаксис, что и в постах. Будьте предусмотрительны насчёт места, которое займёт объявление на экране пользователей
+      appeal:
+        text: Вы можете обжаловать замечание только один раз
       defaults:
         autofollow: Люди, пришедшие по этому приглашению, автоматически будут подписаны на вас.
         avatar: Поддерживается PNG, GIF и JPG. Максимальный размер — %{size}. Будет уменьшен до %{dimensions}px.
@@ -119,6 +121,8 @@ ru:
         scheduled_at: Отложенная публикация
         starts_at: Время начала
         text: Объявление
+      appeal:
+        text: Объясните, почему это решение должно быть отменено
       defaults:
         autofollow: С подпиской на вашу учётную запись
         avatar: Аватар
@@ -204,8 +208,6 @@ ru:
         mention: Новое упоминание
         pending_account: Новая заявка на создание аккаунта
         reblog: Ваш пост продвинули
-        report: Поступила новая жалоба
-        trending_tag: Актуальный хэштег требует проверки
       rule:
         text: Правило
       tag:
diff --git a/config/locales/simple_form.sc.yml b/config/locales/simple_form.sc.yml
index f24193347..0b8376aab 100644
--- a/config/locales/simple_form.sc.yml
+++ b/config/locales/simple_form.sc.yml
@@ -203,8 +203,6 @@ sc:
         mention: Una persone t'at mentovadu
         pending_account: Unu contu nou tenet bisòngiu de una revisione
         reblog: Una persone at cumpartzidu s'istadu tuo
-        report: Imbiu de un'informe nou
-        trending_tag: Un'eticheta non revisionada est in tendèntzia
       rule:
         text: Règula
       tag:
diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml
index 8817f0ed3..d410e106a 100644
--- a/config/locales/simple_form.sk.yml
+++ b/config/locales/simple_form.sk.yml
@@ -162,8 +162,6 @@ sk:
         mention: Zaslať email, ak ťa niekto spomenie vo svojom príspevku
         pending_account: Zaslať email, ak treba prehodnotiť nový účet
         reblog: Zaslať email, ak niekto re-tootne tvoj príspevok
-        report: Zaslať email, ak niekto podá nové nahlásenie
-        trending_tag: Pošli email, ak sa neoverený haštag stane populárnym
       tag:
         listable: Povoľ zobrazovanie tohto haštagu v zozname profilov
         name: Haštag
diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml
index 91bf681f3..b1472cb0e 100644
--- a/config/locales/simple_form.sl.yml
+++ b/config/locales/simple_form.sl.yml
@@ -4,6 +4,7 @@ sl:
     hints:
       account_warning_preset:
         text: Lahko uporabite skladnjo tuta, kot so URL-ji, ključniki in omembe
+        title: Neobvezno. Ni vidno prejemniku
       admin_account_action:
         send_email_notification: Uporabnik bo prejel razlago, kaj se je zgodilo z njihovim računom
         text_html: Neobvezno. Lahko uporabite skladnjo tuta. <a href="%{path}">Prednastavite opozorila</a>, da prihranite čas
@@ -14,6 +15,7 @@ sl:
         avatar: PNG, GIF ali JPG. Največ %{size}. Zmanjšana bo na %{dimensions}px
         bot: Ta račun v glavnem opravlja samodejna dejanja in morda ni pod nadzorom
         context: En ali več kontekstov, kjer naj se uporabi filter
+        current_username: Za potrditev vnesite uporabniško ime trenutnega računa
         digest: Pošlje se le po dolgem obdobju nedejavnosti in samo, če ste prejeli osebna sporočila v vaši odsotnosti
         email: Poslali vam bomo potrditveno e-pošto
         fields: Na svojem profilu lahko imate do 4 predmete prikazane kot tabelo.
@@ -41,13 +43,18 @@ sl:
         domain: Ta domena bo lahko prejela podatke s tega strežnika, dohodni podatki z nje pa bodo obdelani in shranjeni
       featured_tag:
         name: 'Morda boste želeli uporabiti eno od teh:'
+      form_challenge:
+        current_password: Vstopate v varovano območje
       imports:
         data: Izvožena CSV datoteka iz drugega Mastodon vozlišča
       invite_request:
         text: To nam bo pomagalo pregledati vašo prijavo
       ip_block:
+        comment: Neobvezno. Spomnite se, zakaj ste dodali to pravilo.
         severities:
           no_access: Blokiraj dostop do vseh virov
+          sign_up_requires_approval: Za nove registracije bo potrebna vaša odobritev
+        severity: Izberite, kaj se bo zgodilo z zahtevami iz tega IP-naslova
       sessions:
         otp: 'Vnesite dvomestno kodo, ki je ustvarjena z aplikacijo na telefonu, ali uporabite eno od vaših obnovitvenih kod:'
       user:
@@ -78,6 +85,7 @@ sl:
       announcement:
         all_day: Celodnevni dogodek
         ends_at: Konec dogodka
+        scheduled_at: Načrtuj čas objave
         starts_at: Začetek dogodka
         text: Objava
       defaults:
@@ -164,8 +172,8 @@ sl:
         mention: Pošlji e-pošto, ko vas nekdo omeni
         pending_account: Pošlji e-pošto, ko je potreben pregled novega računa
         reblog: Pošlji e-pošto, ko nekdo sune vaše stanje
-        report: Pošlji e-pošto, ko je oddana nova prijava
-        trending_tag: Nov trend zahteva odobritev
+        report: Novo poročilo je oddano
+        trending_tag: Nov trend zahteva pregled
       rule:
         text: Pravilo
       tag:
diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml
index ccd1257de..ce73006c6 100644
--- a/config/locales/simple_form.sq.yml
+++ b/config/locales/simple_form.sq.yml
@@ -27,6 +27,8 @@ sq:
         scheduled_at: Që lajmërimi të botohet menjëherë, lëreni të zbrazët
         starts_at: Opsionale. Në rast se lajmërimi juaj është i lidhur me një interval kohor të caktuar
         text: Mund të përdorni sintaksë mesazhesh. Ju lutemi, mos harroni që hapësira e lajmërimit do të hajë vend në ekranin e përdoruesit
+      appeal:
+        text: Një paralajmërim mund ta apeloni vetëm një herë
       defaults:
         autofollow: Personat që regjistrohen përmes ftesës do t’ju ndjekin vetvetiu
         avatar: PNG, GIF ose JPG. Maksimumi %{size}. Do të zvogëlohen në %{dimensions}px
@@ -119,6 +121,8 @@ sq:
         scheduled_at: Planifikoji botimin
         starts_at: Fillim i aktit
         text: Lajmërim
+      appeal:
+        text: Shpjegoni pse duhet përmbysur ky vendim
       defaults:
         autofollow: Ftesë për ndjekje të llogarisë tuaj
         avatar: Avatar
@@ -197,6 +201,7 @@ sq:
           sign_up_requires_approval: Kufizo regjistrime
         severity: Rregull
       notification_emails:
+        appeal: Dikush apelon një vendim moderatori
         digest: Dërgo email-e përmbledhës
         favourite: Dikush parapëlqeu gjendjen tuaj
         follow: Dikush filloi t’ju ndjekë
@@ -205,7 +210,6 @@ sq:
         pending_account: Llogaria e re lyp shqyrtim
         reblog: Dikush përforcoi gjendjen tuaj
         report: Parashtrohet raportim i ri
-        trending_tag: Një hashtag i pashqyrtuar zë e bëhet popullor
       rule:
         text: Rregull
       tag:
diff --git a/config/locales/simple_form.sr.yml b/config/locales/simple_form.sr.yml
index 4210b0a99..5b3139bec 100644
--- a/config/locales/simple_form.sr.yml
+++ b/config/locales/simple_form.sr.yml
@@ -116,7 +116,6 @@ sr:
         follow_request: Шаљи е-пошту када неко затражи да Вас запрати
         mention: Шаљи е-пошту када Вас неко помене
         reblog: Шаљи е-пошту када неко подржи Ваш статус
-        report: Пошаљи Е-пошту када се поднесе нова пријава
     'no': Не
     required:
       text: обавезно
diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml
index 87aaeb92b..c233c1c94 100644
--- a/config/locales/simple_form.sv.yml
+++ b/config/locales/simple_form.sv.yml
@@ -24,6 +24,8 @@ sv:
         ends_at: Frivillig. Meddelandet kommer automatiskt att publiceras just nu
         scheduled_at: Lämna tomt för att publicera meddelandet omedelbart
         starts_at: Valfritt. Om ditt meddelande är bundet till ett visst tidsintervall
+      appeal:
+        text: Du kan endast överklaga en varning en gång
       defaults:
         autofollow: Användarkonton som skapas genom din inbjudan kommer automatiskt följa dig
         avatar: PNG, GIF eller JPG. Högst %{size}. Kommer att skalas ner till %{dimensions}px
@@ -185,8 +187,6 @@ sv:
         mention: Skicka e-post när någon nämner dig
         pending_account: Nytt konto behöver granskas
         reblog: Skicka e-post när någon knuffar din status
-        report: Ny rapport har skickats
-        trending_tag: En ogranskad hashtag trendar
       rule:
         text: Regel
       tag:
diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml
index 12aedd328..a324c807e 100644
--- a/config/locales/simple_form.th.yml
+++ b/config/locales/simple_form.th.yml
@@ -27,6 +27,8 @@ th:
         scheduled_at: เว้นว่างไว้เพื่อเผยแพร่ประกาศทันที
         starts_at: ไม่จำเป็น ในกรณีที่ประกาศของคุณผูกไว้กับช่วงเวลาที่เฉพาะเจาะจง
         text: คุณสามารถใช้ไวยากรณ์โพสต์ โปรดระวังพื้นที่ที่ประกาศจะใช้ในหน้าจอของผู้ใช้
+      appeal:
+        text: คุณสามารถอุทธรณ์การลงโทษได้เพียงครั้งเดียวเท่านั้น
       defaults:
         autofollow: ผู้คนที่ลงทะเบียนผ่านคำเชิญจะติดตามคุณโดยอัตโนมัติ
         avatar: PNG, GIF หรือ JPG สูงสุด %{size} จะถูกย่อขนาดเป็น %{dimensions}px
@@ -200,8 +202,6 @@ th:
         mention: ใครสักคนได้กล่าวถึงคุณ
         pending_account: บัญชีใหม่ต้องมีการตรวจทาน
         reblog: ใครสักคนได้ดันโพสต์ของคุณ
-        report: มีการส่งรายงานใหม่
-        trending_tag: แนวโน้มใหม่ต้องการการอนุมัติ
       rule:
         text: กฎ
       tag:
diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml
index cfd407ce5..ccec0ed13 100644
--- a/config/locales/simple_form.tr.yml
+++ b/config/locales/simple_form.tr.yml
@@ -27,6 +27,8 @@ tr:
         scheduled_at: Duyuruyu hemen yayınlamak için boş bırakın
         starts_at: İsteğe bağlı. Duyurunuzun belirli bir zaman aralığına bağlı olması durumunda
         text: Toot söz dizimini kullanabilirsiniz. Lütfen duyurunun kullanıcının ekranında yer alacağı alanı göz önünde bulundurun
+      appeal:
+        text: Bir eyleme yalnızca bir kere itiraz edebilirsiniz
       defaults:
         autofollow: Davetiyeyle kaydolan kişiler sizi otomatik olarak takip eder
         avatar: En fazla %{size} olacak şekilde PNG, GIF veya JPG formatında yükleyiniz. %{dimensions}px büyüklüğüne indirgenecektir
@@ -119,6 +121,8 @@ tr:
         scheduled_at: Yayınlamayı zamanla
         starts_at: Etkinliğin başlangıcı
         text: Duyuru
+      appeal:
+        text: Bu kararın neden geri alınması gerektiğini açıklayın
       defaults:
         autofollow: Hesabınızı takip etmeye davet edin
         avatar: Profil resmi
@@ -197,6 +201,7 @@ tr:
           sign_up_requires_approval: Kayıtları sınırla
         severity: Kural
       notification_emails:
+        appeal: Birisi, bir yönetim kararına itiraz ediyor
         digest: Özet e-postaları gönder
         favourite: Birisi gönderinizi beğendi
         follow: Biri seni takip etti
@@ -205,7 +210,7 @@ tr:
         pending_account: Yeni hesabın incelenmesi gerekiyor
         reblog: Birisi gönderini boostladı
         report: Yeni rapor gönderildi
-        trending_tag: İncelenmemiş bir etiket gündem oluyor
+        trending_tag: Yeni eğilimin gözden geçmesi gerekiyor
       rule:
         text: Kural
       tag:
diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml
index be7cfa3e2..49fb1d5a0 100644
--- a/config/locales/simple_form.uk.yml
+++ b/config/locales/simple_form.uk.yml
@@ -204,8 +204,7 @@ uk:
         mention: Надсилати листа, коли хтось згадує Вас
         pending_account: Надсилати електронного листа, коли новий обліковий запис потребує розгляду
         reblog: Надсилати листа, коли хтось передмухує Ваш статус
-        report: Надсилати електронного листа, коли з'являється нова скарга
-        trending_tag: Надсилати електронного листа, коли нерозглянутий хештеґ стає популярним
+        report: Нову скаргу надіслано
       rule:
         text: Правило
       tag:
diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml
index 1823e1fe9..a4eaf17c1 100644
--- a/config/locales/simple_form.vi.yml
+++ b/config/locales/simple_form.vi.yml
@@ -27,6 +27,8 @@ vi:
         scheduled_at: Để trống nếu muốn đăng thông báo ngay lập tức
         starts_at: Tùy chọn. Trong trường hợp thông báo của bạn đăng vào một khoảng thời gian cụ thể
         text: Bạn có thể dùng URL, hashtag và nhắc đến. Cố gắng ngắn gọn bởi vì thông báo sẽ xuất hiện trên màn hình điện thoại của người dùng
+      appeal:
+        text: Bạn chỉ có thể khiếu nại mỗi lần một cảnh cáo
       defaults:
         autofollow: Những người đăng ký sẽ tự động theo dõi bạn
         avatar: PNG, GIF hoặc JPG. Kích cỡ tối đa %{size}. Sẽ bị nén xuống %{dimensions}px
@@ -119,6 +121,8 @@ vi:
         scheduled_at: Lên lịch đăng
         starts_at: Bắt đầu sự kiện
         text: Thông báo
+      appeal:
+        text: Giải thích rõ vì sao quyết định này có thể đảo ngược
       defaults:
         autofollow: Mời theo dõi tài khoản của bạn
         avatar: Ảnh đại diện
@@ -197,6 +201,7 @@ vi:
           sign_up_requires_approval: Giới hạn đăng ký
         severity: Mức độ
       notification_emails:
+        appeal: Có người khiếu nại quyết định kiểm duyệt
         digest: Gửi email định kỳ
         favourite: Ai đó thích tút của bạn
         follow: Ai đó theo dõi bạn
@@ -204,8 +209,8 @@ vi:
         mention: Ai đó nhắc đến bạn
         pending_account: Tài khoản mới cần phê duyệt
         reblog: Ai đó chia sẻ tút của bạn
-        report: Ai đó gửi báo cáo
-        trending_tag: Một hashtag chưa được phê duyệt đang là xu hướng
+        report: Đã gửi báo cáo mới
+        trending_tag: Một xu hướng cần được xem xét
       rule:
         text: Quy tắc
       tag:
diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml
index 61161fc62..39e87bcf6 100644
--- a/config/locales/simple_form.zh-CN.yml
+++ b/config/locales/simple_form.zh-CN.yml
@@ -27,6 +27,8 @@ zh-CN:
         scheduled_at: 留空的话,公告会立即发布。
         starts_at: 可选。你可以让你的公告只在特定时间段显示。
         text: 你可以使用嘟文格式。但请注意不要让公告占据用户太多屏幕空间。
+      appeal:
+        text: 你仅能对单次处罚提交一次申诉
       defaults:
         autofollow: 通过邀请链接注册的用户将会自动关注你
         avatar: 文件大小限制 %{size},只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 %{dimensions}px
@@ -119,6 +121,8 @@ zh-CN:
         scheduled_at: 定时发布
         starts_at: 事件开始
         text: 公告
+      appeal:
+        text: 说明此结果应当被推翻的理由
       defaults:
         autofollow: 让被邀请人关注你的帐户
         avatar: 头像
@@ -197,6 +201,7 @@ zh-CN:
           sign_up_requires_approval: 限制注册
         severity: 规则
       notification_emails:
+        appeal: 有人对审核结果提出申诉
         digest: 发送摘要邮件
         favourite: 当有用户喜欢了我的嘟文时,发送电子邮件提醒我
         follow: 当有用户关注我时,发送电子邮件提醒我
@@ -204,8 +209,8 @@ zh-CN:
         mention: 当有用户在嘟文中提及我时,发送电子邮件提醒我
         pending_account: 在有帐号需要审核时,发送电子邮件提醒我
         reblog: 当有用户转嘟了我的嘟文时,发送电子邮件提醒我
-        report: 在提交新报告时,发送电子邮件提醒我
-        trending_tag: 当未经审核的话题成为当前热门时发邮件提醒
+        report: 新举报已提交
+        trending_tag: 新趋势待审核
       rule:
         text: 规则
       tag:
diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml
index 3a0358e62..dbf87b788 100644
--- a/config/locales/simple_form.zh-HK.yml
+++ b/config/locales/simple_form.zh-HK.yml
@@ -204,8 +204,6 @@ zh-HK:
         mention: 當有人在文章提及你時
         pending_account: 有新帳號需要審核時
         reblog: 當有人轉推你的文章時
-        report: 收到新檢舉時
-        trending_tag: 當未審核的標籤成為當前熱門時
       rule:
         text: 規則
       tag:
diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml
index c9e95e694..cfef7ae29 100644
--- a/config/locales/simple_form.zh-TW.yml
+++ b/config/locales/simple_form.zh-TW.yml
@@ -3,9 +3,9 @@ zh-TW:
   simple_form:
     hints:
       account_alias:
-        acct: 指定欲移動之帳戶的 使用者名稱@站台
+        acct: 指定要移動的帳號的「使用者名稱@網域名稱」
       account_migration:
-        acct: 指定欲移動至之帳戶的 使用者名稱@站台
+        acct: 指定要移動至的帳號的「使用者名稱@網域名稱」
       account_warning_preset:
         text: 您可使用嘟文語法,例如網址、「#」標籤和提及功能
         title: 可選。不會向收件者顯示
@@ -27,6 +27,8 @@ zh-TW:
         scheduled_at: 空白則立即發布公告
         starts_at: 可選的,讓公告在特定時間範圍內顯示
         text: 您可以使用嘟文語法,但請小心別讓公告太鴨霸而佔據使用者的整個版面。
+      appeal:
+        text: 您只能對警示提出一次申訴
       defaults:
         autofollow: 通過邀請網址註冊的使用者將自動關注你
         avatar: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會等比例縮減成 %{dimensions} 像素
@@ -119,6 +121,8 @@ zh-TW:
         scheduled_at: 排程發佈
         starts_at: 活動開始時間
         text: 公告
+      appeal:
+        text: 解釋為什麼要撤銷這個決定
       defaults:
         autofollow: 邀請別人關注你的帳戶
         avatar: 大頭貼
@@ -197,6 +201,7 @@ zh-TW:
           sign_up_requires_approval: 限制註冊
         severity: 規則
       notification_emails:
+        appeal: 有人對管理員的決定提出上訴
         digest: 傳送摘要信件
         favourite: 當有使用者喜歡你的嘟文時,傳送電子信件通知
         follow: 當有使用者關注你時,傳送電子信件通知
@@ -204,8 +209,8 @@ zh-TW:
         mention: 當有使用者在嘟文提及你時,傳送電子信件通知
         pending_account: 需要審核的新帳戶
         reblog: 當有使用者轉嘟你的嘟文時,傳送電子信件通知
-        report: 當提交新檢舉時傳送電子郵件
-        trending_tag: 未經審核的標籤正在炎上中
+        report: 新回報已遞交
+        trending_tag: 新趨勢需要審閱
       rule:
         text: 規則
       tag:
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 4bf56464e..1cc1a2994 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -97,7 +97,6 @@ sk:
     account_moderation_notes:
       create: Zanechaj poznámku
       created_msg: Poznámka moderátora bola úspešne vytvorená!
-      delete: Vymaž
       destroyed_msg: Moderátorska poznámka bola úspešne zmazaná!
     accounts:
       add_email_domain_block: Pridaj e-mailovú doménu na zoznam zakázaných
@@ -352,11 +351,6 @@ sk:
         silence: stíšené
         suspend: vylúčené
       show:
-        affected_accounts:
-          few: "%{count} účtov v databázi ovplyvnených"
-          many: "%{count} účtov v databázi ovplyvnených"
-          one: Jeden účet v databázi ovplyvnený
-          other: "%{count} účty v databázi ovplyvnené"
         retroactive:
           silence: Zruš stíšenie všetkých momentálne utíšených účtov z tejto domény
           suspend: Zruš suspendáciu všetkých momentálne ovplyvnených účtov z tejto domény
@@ -394,11 +388,6 @@ sk:
         unavailable: Nedostupné
         warning: Upozornenie
       delivery_available: Je v dosahu doručovania
-      known_accounts:
-        few: "%{count} známych účtov"
-        many: "%{count} známych účtov"
-        one: "%{count} známy účet"
-        other: "%{count} známe účty"
       moderation:
         all: Všetky
         limited: Obmedzené
@@ -688,7 +677,6 @@ sk:
     status:
       account_status: Stav účtu
       confirming: Čaká sa na dokončenie potvrdenia emailom.
-      functional: Tvoj účet je plne funkčný.
       pending: Tvoja žiadosť čaká na schvílenie od nášho týmu. Môže to chviľu potrvať. Ak bude tvoja žiadosť schválená, dostaneš o tom email.
       redirecting_to: Tvoj účet je neaktívny, lebo v súčasnosti presmerováva na %{acct}.
     trouble_logging_in: Problém s prihlásením?
@@ -1174,7 +1162,6 @@ sk:
       subject: Prosím potvrď pokus o prihlásenie
       title: Pokus o prihlásenie
     warning:
-      review_server_policies: Prehodnoť pravidlá servera
       subject:
         disable: Tvoj účet %{acct} bol zamrazený
         none: Varovanie pre %{acct}
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 6b03de475..595d52c83 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -91,9 +91,9 @@ sl:
     account_moderation_notes:
       create: Pusti opombo
       created_msg: Moderirana opomba je uspešno ustvarjena!
-      delete: Izbriši
       destroyed_msg: Moderirana opomba je uspešno uničena!
     accounts:
+      add_email_domain_block: Blokiraj domeno e-pošte
       approve: Odobri
       are_you_sure: Ali ste prepričani?
       avatar: Podoba
@@ -186,6 +186,7 @@ sl:
       silenced: Utišan
       statuses: Stanja
       subscribe: Naroči
+      suspend: Suspendiraj
       suspended: Suspendiran
       title: Računi
       unconfirmed_email: Nepotrjena e-pošta
@@ -219,9 +220,17 @@ sl:
         silence_account: Omeji račun
         update_status: Posodobi objavo
       deleted_status: "(izbrisano stanje)"
+      filter_by_action: Filtriraj po dejanjih
+      filter_by_user: Filtriraj po uporabnikih
       title: Dnevnik revizije
     announcements:
+      destroyed_msg: Obvestilo je bilo uspešno izbrisano!
+      edit:
+        title: Uredi obvestilo
+      empty: Obvestil ni mogoče najti.
+      live: V živo
       new:
+        create: Ustvari obvestilo
         title: Novo obvestilo
       publish: Objavi
       published_msg: Obvestilo je bilo uspešno objavljeno!
@@ -259,6 +268,10 @@ sl:
       updated_msg: Emotikon je uspešno posodobljen!
       upload: Pošlji
     dashboard:
+      active_users: dejavnih uporabnikov
+      interactions: interakcij
+      new_users: novih uporabnikov
+      opened_reports: odprtih poročil
       software: Programska oprema
       space: Uporaba prostora
       title: Nadzorna plošča
@@ -296,11 +309,6 @@ sl:
         silence: utišani
         suspend: suspendirani
       show:
-        affected_accounts:
-          few: "%{count} računi v bazi podatkov so prizadeti"
-          one: En račun v bazi podatkov je prizadet
-          other: "%{count} računov v bazi podatkov je prizadetih"
-          two: "%{count} računa v bazi podatkov so prizadeta"
         retroactive:
           silence: Prekliči utišanje za vse obstoječe račune iz te domene
           suspend: Aktiviraj vse obstoječe račune iz te domene
@@ -327,14 +335,12 @@ sl:
       by_domain: Domena
       delivery:
         all: Vse
+        clear: Počisti napake dostave
+        stop: Ustavi dostavo
+        title: Dostava
         unavailable: Ni na voljo
         warning: Opozorilo
       delivery_available: Na voljo je dostava
-      known_accounts:
-        few: "%{count} znani računi"
-        one: "%{count} znan račun"
-        other: "%{count} znanih računov"
-        two: "%{count} znana računa"
       moderation:
         all: Vse
         limited: Omejeno
@@ -366,6 +372,7 @@ sl:
         '94670856': 3 leta
       new:
         title: Ustvari novo pravilo IP
+      title: IP-pravila
     relays:
       add_new: Dodaj nov rele
       delete: Izbriši
@@ -393,6 +400,7 @@ sl:
       comment:
         none: Brez
       created_at: Prijavljeno
+      delete_and_resolve: Izbriši objave
       mark_as_resolved: Označi kot rešeno
       mark_as_unresolved: Označi kot nerešeno
       no_one_assigned: Nihče
@@ -403,12 +411,14 @@ sl:
         delete: Izbriši
         placeholder: Opišite dejanja, ki ste jih izvedli, ali katere koli druge posodobitve...
         title: Zapiski
+      quick_actions_description_html: 'Opravite hitro dejanje ali podrsajte navzdol, da si ogledate poročano vsebino:'
       reopen: Ponovno odpri prijavo
       report: 'Prijavi #%{id}'
       reported_account: Prijavljeni račun
       reported_by: Prijavljen od
       resolved: Razrešeni
       resolved_msg: Prijava je uspešno razrešena!
+      skip_to_actions: Preskoči na dejanja
       status: Stanje
       title: Prijave
       unassign: Odstopljeni
@@ -495,6 +505,8 @@ sl:
         title: Trendi
     statuses:
       back_to_account: Nazaj na stran računa
+      batch:
+        remove_from_report: Odstrani iz poročila
       deleted: Izbrisano
       media:
         title: Mediji
@@ -506,6 +518,9 @@ sl:
       allow: Dovoli
       approved: Odobren
       disallow: Ne dovoli
+      links:
+        allow: Dovoli povezavo
+      pending_review: Čakajoče na pregled
       tags:
         dashboard:
           tag_languages_dimension: Naj jeziki
@@ -517,6 +532,9 @@ sl:
       edit_preset: Uredi prednastavitev opozoril
       title: Upravljaj prednastavitev opozoril
   admin_mailer:
+    new_appeal:
+      actions:
+        none: opozorilo
     new_pending_account:
       body: Podrobnosti o novem računu so navedene spodaj. To aplikacijo lahko odobrite ali zavrnete.
       subject: Nov račun za pregled na %{instance} (%{username})
@@ -594,18 +612,29 @@ sl:
       return: Prikaži uporabnikov profil
       web: Pojdi na splet
     title: Sledi %{acct}
+  challenge:
+    confirm: Nadaljuj
+    invalid_password: Neveljavno geslo
+    prompt: Potrdite geslo za nadaljevanje
   datetime:
     distance_in_words:
       half_a_minute: Pravkar
       less_than_x_seconds: Pravkar
   deletes:
     confirm_password: Vnesite svoje trenutno geslo, da potrdite svojo identiteto
+    confirm_username: Vnesite svoje uporabniško ime, da potrdite postopek
     proceed: Izbriši račun
     success_msg: Vaš račun je bil uspešno izbrisan
   directories:
     directory: Imenik profilov
     explanation: Odkrijte uporabnike glede na njihove interese
     explore_mastodon: Razišči %{title}
+  disputes:
+    strikes:
+      title_actions:
+        delete_statuses: Odstranitev objave
+        none: Opozorilo
+        silence: Omejitev računa
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': Nimate dovoljenja za ogled te strani.
@@ -733,6 +762,7 @@ sl:
       too_many: Ni možno priložiti več kot 4 datoteke
   migrations:
     acct: username@domain novega računa
+    proceed_with_move: Premakni sledilce
   moderation:
     title: Moderiranje
   notification_mailer:
@@ -773,6 +803,10 @@ sl:
       body: "%{name} je spodbudil/a vaše stanje:"
       subject: "%{name} je spodbudil/a vaše stanje"
       title: Nova spodbuda
+    update:
+      subject: "%{name} je uredil(a) objavo"
+  otp_authentication:
+    enable: Omogoči
   pagination:
     newer: Novejše
     next: Naprej
@@ -795,6 +829,7 @@ sl:
   relationships:
     activity: Dejavnost računa
     dormant: Skrit
+    follow_selected_followers: Sledi izbranim sledilcem
     last_active: Zadnja dejavnost
     most_recent: Najnovejša
     moved: Prestavljeno
@@ -873,6 +908,7 @@ sl:
   settings:
     account: Račun
     account_settings: Nastavitve računa
+    aliases: Vzdevki računa
     appearance: Videz
     authorized_apps: Pooblaščene aplikacije
     back: Nazaj na Mastodon
@@ -925,6 +961,9 @@ sl:
         two: "%{count} glasova"
       vote: Glasuj
     show_more: Pokaži več
+    show_newer: Pokaži novejše
+    show_older: Pokaži starejše
+    show_thread: Pokaži nit
     sign_in_to_participate: Prijavite se, če želite sodelovati v pogovoru
     visibilities:
       private: Samo sledilci
@@ -1057,7 +1096,6 @@ sl:
       title: Poskus prijave
     warning:
       reason: 'Razlog:'
-      review_server_policies: Preglejte pravilnike strežnika
       subject:
         disable: Vaš račun %{acct} je zamrznjen
         none: Opozorila za %{acct}
@@ -1099,7 +1137,11 @@ sl:
     verification: Potrditev
   webauthn_credentials:
     add: Dodaj nov varnostni ključ
+    create:
+      success: Vaš varnostni ključ je bil uspešno dodan.
     delete: Izbriši
     delete_confirmation: Ali ste prepričani, da želite izbrisati ta varnostni ključ?
+    destroy:
+      success: Vaš varnostni ključ je bil uspešno izbrisan.
     invalid_credential: Neveljaven varnostni ključ
     not_supported: Ta brskalnik ne podpira varnostnih ključev
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index 5ff75afee..2366d0edf 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -94,7 +94,6 @@ sq:
     account_moderation_notes:
       create: Lini një shënim
       created_msg: Shënimi i moderimit u krijua me sukses!
-      delete: Fshije
       destroyed_msg: Shënimi i moderimit u asgjësua me sukses!
     accounts:
       add_email_domain_block: Blloko përkatësi email
@@ -163,6 +162,11 @@ sq:
       not_subscribed: Jo i pajtuar
       pending: Në pritje të shqyrtimit
       perform_full_suspension: Pezulloje
+      previous_strikes: Paralajmërime të mëparshme
+      previous_strikes_description_html:
+        one: Kjo llogari ka <strong>one</strong> paralajmërim.
+        other: Kjo llogari ka <strong>%{count}</strong> paralajmërime.
+        zero: Kjo llogari është <strong>në pozita të mira</strong>.
       promote: Promovojeni
       protocol: Protokoll
       public: Publike
@@ -206,6 +210,7 @@ sq:
       statuses: Gjendje
       strikes: Ndëshkime të mëparshme
       subscribe: Pajtomë
+      suspend: Pezulloje
       suspended: Të pezulluara
       suspension_irreversible: Të dhënat e kësaj llogarie janë fshirë në mënyrë të pakthyeshme. Mund ta shpezulloni llogarinë, për ta bërë të përdorshme, por kjo s’do të kthejë ndonjë të dhënë që kihej më parë.
       suspension_reversible_hint_html: Llogaria është pezulluar, dhe të dhënat do të hiqen plotësisht më %{date}. Deri atëherë, llogaria mund të rikthehet pa ndonjë zarar. Nëse doni të hiqen menjëherë krejt të dhënat e llogarisë, këtë mund ta bëni më poshtë.
@@ -226,6 +231,7 @@ sq:
       whitelisted: Lejuar për federim
     action_logs:
       action_types:
+        approve_appeal: Miratojeni Apelimin
         approve_user: Miratoje Përdoruesin
         assigned_to_self_report: Caktoji Raportim
         change_email_user: Ndrysho Email për Përdoruesin
@@ -257,6 +263,7 @@ sq:
         enable_user: Aktivizo Përdorues
         memorialize_account: Bëje Llogari Përkujtimore
         promote_user: Promovojeni Përdoruesin
+        reject_appeal: Hidheni Poshtë Apelimin
         reject_user: Hidhe Poshtë Përdoruesin
         remove_avatar_user: Hiqe Avatarin
         reopen_report: Rihape Raportimin
@@ -275,6 +282,7 @@ sq:
         update_domain_block: Përditëso Bllok Përkatësish
         update_status: Përditëso Gjendjen
       actions:
+        approve_appeal_html: "%{name} miratoi apelim vendimi moderimi nga %{target}"
         approve_user_html: "%{name} miratoi regjistrim nga %{target}"
         assigned_to_self_report_html: "%{name} ia kaloi raportimin %{target} në ngarkim vetvetes"
         change_email_user_html: "%{name} ndryshoi adresën email të përdoruesit %{target}"
@@ -306,6 +314,7 @@ sq:
         enable_user_html: "%{name} aktivizoi hyrje për përdoruesin %{target}"
         memorialize_account_html: "%{name} e shndërroi llogarinë e %{target} në një faqe përkujtimore"
         promote_user_html: "%{name} gradoi përdoruesin %{target}"
+        reject_appeal_html: "%{name} hodhi poshtë apelim vendimi moderimi nga %{target}"
         reject_user_html: "%{name} hodhi poshtë regjistrimin nga %{target}"
         remove_avatar_user_html: "%{name} hoqi avatarin e %{target}"
         reopen_report_html: "%{name} rihapi raportimin %{target}"
@@ -384,14 +393,17 @@ sq:
       media_storage: Depozitë media
       new_users: përdorues të rinj
       opened_reports: raportime të hapur
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> apelim pezull"
+        other: "<strong>%{count}</strong> apelime pezull"
       pending_reports_html:
-        one: "<strong>1</strong> raportim pezull"
+        one: "<strong>%{count}</strong> raportim pezull"
         other: "<strong>%{count}</strong> raportime pezull"
       pending_tags_html:
-        one: "<strong>1</strong> hashtag pezull"
+        one: "<strong>%{count}</strong> hashtag pezull"
         other: "<strong>%{count}</strong> hashtag-ë pezull"
       pending_users_html:
-        one: "<strong>1</strong> përdorues pezull"
+        one: "<strong>%{count}</strong> përdorues pezull"
         other: "<strong>%{count}</strong> përdorues pezull"
       resolved_reports: raportime të zgjidhur
       software: Software
@@ -401,6 +413,10 @@ sq:
       top_languages: Gjuhët aktive kryesuese
       top_servers: Shërbyesit aktivë kryesues
       website: Sajt
+    disputes:
+      appeals:
+        empty: S’u gjetën apelime.
+        title: Apelime
     domain_allows:
       add_new: Shtoje përkatësinë në listë lejimesh
       created_msg: Përkatësia u shtua me sukses në listë lejimesh
@@ -441,6 +457,7 @@ sq:
         affected_accounts:
           one: Pat ndikim te një llogari në bazën e të dhënave
           other: Pat ndikim te %{count} llogari në bazën e të dhënave
+          zero: S’pat ndikim te ndonjë llogari në bazën e të dhënave
         retroactive:
           silence: Hiqu heshtimin krejt llogarive ekzistuese nga kjo përkatësi
           suspend: Hiqu pezullimin krejt llogarive ekzistuese nga kjo përkatësi
@@ -494,6 +511,7 @@ sq:
       known_accounts:
         one: "%{count} llogari e njohur"
         other: "%{count} llogari të njohura"
+        zero: Pa llogari të njohur
       moderation:
         all: Krejt
         limited: Të kufizuarat
@@ -560,10 +578,12 @@ sq:
       action_log: Auditim regjistri
       action_taken_by: Veprimi i ndërmarrë nga
       actions:
+        delete_description_html: Postimet e raportuara do të fshihen dhe do të regjistrohet një paralajmërim, për t’ju ndihmuar të përshkallëzoni hapat në rast shkeljesh të ardhme nga e njëjta llogari.
         other_description_html: Shihni më tepër mundësi për kontroll të sjelljes së një llogari dhe përshtatni komunikimin me llogarinë e raportuar.
+        resolve_description_html: Ndaj llogarisë së raportuar nuk do të ndërmerret ndonjë veprim, s’do të regjistrohet ndonjë paralajmërim dhe raporti do të mbyllet.
         silence_description_html: Profili do të jetë i dukshëm vetëm për ata që e ndjekin tashmë, ose që e kërkojnë dorazi, duke reduktuar rëndë përhapjen e tij. Mundet përherë të prapakthehet.
         suspend_description_html: Profili dhe krej lënda e tij do të bëhen të papërdorshëm, deri sa më në fund të fshihet. Ndërveprimi me llogarinë do të jetë i pamundur. E prapakthyeshme brenda 30 ditësh.
-      actions_description_html: 'Nëse heqja e lëndës më sipër që ka probleme është e pamjaftueshme:'
+      actions_description_html: Vendosni cili veprim të kryhet për të zgjidhur këtë raportim. Nëse ndërmerrni një veprim ndëshkues kundër llogarisë së raportuar, atyre do t’u dërgohet një njoftim me email, hiq rastin kur përzgjidhet kategoria <strong>I padëshiruar</strong>.
       add_to_report: Shtoni më tepër te raportimi
       are_you_sure: A jeni i sigurt?
       assign_to_self: Caktojani vetes
@@ -575,7 +595,7 @@ sq:
         none: Asnjë
       comment_description_html: 'Për të dhënë më tepër informacion, %{name} shkroi:'
       created_at: Raportuar më
-      delete_and_resolve: Zgjidhe dhe fshije
+      delete_and_resolve: Fshiji postimet
       forwarded: U përcoll
       forwarded_to: U përcoll te %{domain}
       mark_as_resolved: Vëri shenjë si i zgjidhur
@@ -589,12 +609,14 @@ sq:
         placeholder: Përshkruani ç’veprime janë ndërmarrë, ose çfarëdo përditësimi tjetër që lidhet me të…
         title: Shënime
       notes_description_html: Shihni dhe lini shënime për moderatorët e tjerë dhe për veten në të ardhmen
+      quick_actions_description_html: 'Kryeni një veprim të shpejtë, ose rrëshqitni poshtë për të parë lëndën e raportuar:'
       reopen: Rihape raportimin
       report: 'Raportim #%{id}'
       reported_account: Llogari e raportuar
       reported_by: Raportuar nga
       resolved: I zgjidhur
       resolved_msg: Raportimi u zgjidh me sukses!
+      skip_to_actions: Kaloni te veprimet
       status: Gjendje
       statuses: Lëndë e raportuar
       statuses_description_html: Lënda problematike do të citohet në komunikimin me llogarinë e raportuar
@@ -708,12 +730,23 @@ sq:
       back_to_report: Mbrapsht te faqja e raportimit
       batch:
         remove_from_report: Hiqe prej raportimit
+        report: Raportojeni
       deleted: E fshirë
       media:
         title: Media
       no_status_selected: S’u ndryshua ndonjë gjendje, ngaqë s’u përzgjodh ndonjë e tillë
       title: Gjendje llogarish
       with_media: Me media
+    strikes:
+      actions:
+        delete_statuses: "%{name} fshiu postime të %{target}"
+        disable: "%{name} ngriu postime të %{target}"
+        none: "%{name} dërgoi një sinjalizim për %{target}"
+        sensitive: "%{name} i vuri shenjë llogarisë së %{target} si rezervat"
+        silence: "%{name} e kufizoi llogarinë %{target}"
+        suspend: "%{name} e pezulloi llogarinë e %{target}"
+      appeal_approved: Apeluar
+      appeal_pending: Apelim pezull
     system_checks:
       database_schema_check:
         message_html: Ka migrime bazash të dhënash pezull. Ju lutemi, kryejini, për të qenë të sigurt se aplikacioni sillet siç priteet
@@ -738,6 +771,7 @@ sq:
         shared_by_over_week:
           one: Ndarë nga një person javën e kaluar
           other: Ndarë nga %{count} persona javën e kaluar
+          zero: E pandarë nga njeri gjatë javës së kaluar
         title: Lidhje në modë
         usage_comparison: Ndarë %{today} herë sot, kundrejt %{yesterday} dje
       pending_review: Në pritje të shqyrtimit
@@ -765,6 +799,7 @@ sq:
         used_by_over_week:
           one: Përdorur nga një persona gjatë javës së kaluar
           other: Përdorur nga %{count} persona gjatë javës së kaluar
+          zero: E papërdorur nga njeri gjatë javës së kaluar
       title: Në modë
     warning_presets:
       add_new: Shtoni të ri
@@ -773,6 +808,17 @@ sq:
       empty: S’keni përcaktuar ende sinjalizime të gatshme.
       title: Administroni sinjalizime të paracaktuara
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: fshirje e postimeve të tij
+        disable: ngrirje e llogarisë së tij
+        none: një vërejtje
+        sensitive: vënie shenjë llogarisë së tij si rezervat
+        silence: kufizim i llogarisë së tij
+        suspend: pezullim i llogarisë së tij
+      body: "%{target} po apelon një vendim moderimi nga %{action_taken_by} të marrë më %{date}, që qe %{type}. Shkruan:"
+      next_steps: Apelimin mund të miratoni, që të zhbëhet vendimi i marrë, ose ta shpërfillni.
+      subject: "%{username} po apelon një vendim moderimi te %{instance}"
     new_pending_account:
       body: Hollësitë e llogarisë së re gjenden më poshtë. Mund ta miratoni ose hidhni poshtë këtë aplikim.
       subject: Llogari e re për shqyrtim në %{instance} (%{username})
@@ -787,6 +833,7 @@ sq:
     new_trending_tags:
       body: 'Hashtag-ët vijues janë në modë sot, por nuk janë miratuar më herët. S’do të shfaqen publikisht, veç në i miratofshi:'
       no_approved_tags: Aktualisht nuk ka hashtag-ë në modë të miratuar.
+      subject: Hashtag-ë të rinj në modë për t’u shqyrtuar në %{instance}
   aliases:
     add_new: Krijo alias
     created_msg: U krijua me sukses alias i ri. Tani mund të filloni lëvizjen prej llogarisë së vjetër.
@@ -860,7 +907,6 @@ sq:
     status:
       account_status: Gjendje llogarie
       confirming: Po pritet që të plotësohet ripohimi i email-it.
-      functional: Llogaria juaj është tërësisht funksionale.
       pending: Aplikimi juaj është në pritje të shqyrtimit nga stafi ynë. Kjo mund të dojë ca kohë. Nëse aplikimi juaj miratohet, do të merrni një email.
       redirecting_to: Llogaria juaj është joaktive, ngaqë aktualisht ridrejton te %{acct}.
     too_fast: Formulari u parashtrua shumë shpejt, riprovoni.
@@ -926,6 +972,32 @@ sq:
     directory: Drejtori profilesh
     explanation: Zbuloni përdorues bazuar në interesat e tyre
     explore_mastodon: Eksploroni %{title}
+  disputes:
+    strikes:
+      action_taken: Vendim i marrë
+      appeal: Apelim
+      appeal_approved: Ky paralajmërim është apeluar me sukses dhe s’vlen më
+      appeal_rejected: Apelimi është hedhur poshtë
+      appeal_submitted_at: Apelimi u parashtrua
+      appealed_msg: Apelimi juaj u parashtruar. Nëse miratohet, do të njoftoheni.
+      appeals:
+        submit: Parashtroni apelim
+      associated_report: Raportimi i përshoqëruar
+      created_at: Datuar
+      recipient: Drejtuar
+      status: "#%{id} postimi"
+      status_removed: Postim i hequr tashmë nga sistemi
+      title: "%{action} prej %{date}"
+      title_actions:
+        delete_statuses: Heqje postimi
+        disable: Ngrirje e llogarisë
+        none: Vërejtje
+        sensitive: Vënie shenjë llogarisë si rezervat
+        silence: Kufizim llogarie
+        suspend: Pezullim llogarie
+      your_appeal_approved: Apelimi juaj u miratua
+      your_appeal_pending: Keni parashtruar një apelim
+      your_appeal_rejected: Apelimi juaj është hedhur poshtë
   domain_validator:
     invalid_domain: s’është emër i vlefshëm përkatësie
   errors:
@@ -1137,6 +1209,8 @@ sq:
       title: Përforcim i ri
     status:
       subject: "%{name} sapo postoi"
+    update:
+      subject: "%{name} përpunoi një postim"
   notifications:
     email_events: Akte për njoftim me email
     email_events_hint: 'Përzgjidhni akte për të cilët doni të merrni njoftime:'
@@ -1218,6 +1292,9 @@ sq:
     reply:
       proceed: Ripohoni përgjigjen
       prompt: 'Doni t’i përgjigjeni këtij mesazhi:'
+  reports:
+    errors:
+      invalid_rules: s’i referohet ndonjë rregulli të vlefshëm
   scheduled_statuses:
     over_daily_limit: Keni tejkaluar kufirin e %{limit} mesazheve të planifikuara për atë ditë
     over_total_limit: Keni tejkaluar kufirin prej %{limit} mesazhesh të planifikuara
@@ -1484,6 +1561,15 @@ sq:
     recovery_instructions_html: Në ndodhtë që të humbni hyrje te telefoni juaj, mund të përdorni një nga kodet e rikthimit më poshtë, që të rifitoni hyrje te llogaria juaj. <strong>Mbajini të parrezikuar kodet e rikthimeve</strong>. Për shembull, mund t’i shtypni dhe t’i ruani tok me dokumente të tjerë të rëndësishëm.
     webauthn: Kyçe sigurie
   user_mailer:
+    appeal_approved:
+      action: Kaloni te llogaria juaj
+      explanation: Apelimi i paralajmërimit kundër llogarisë tuaj më %{strike_date}, të cilin e parashtruar më %{appeal_date} është miratuar. Llogaria juaj është sërish në pozita të mira.
+      subject: Apelimi juaj i datës %{date} u miratua
+      title: Apelimi u miratua
+    appeal_rejected:
+      explanation: Apelimi i paralajmërimit kundër llogarisë tuaj më %{strike_date}, të cilin e parashtruar më %{appeal_date}, u hodh poshtë.
+      subject: Apelimi juaj prej %{date} është hedhur poshtë
+      title: Apelimi u hodh poshtë
     backup_ready:
       explanation: Kërkuat një kopjeruajtje të plotë të llogarisë tuaj Mastodon. E keni gati për shkarkim!
       subject: Arkivi juaj është gati për shkarkim
@@ -1495,6 +1581,8 @@ sq:
       subject: Ju lutemi, ripohoni përpjekje hyrjeje
       title: Përpjekje hyrjeje
     warning:
+      appeal: Parashtroni një apelim
+      appeal_description: Nëse besoni se është gabim, mund t’i parashtroni një apelim stafit të %{instance}.
       categories:
         spam: I padëshiruar
         violation: Lënda cenon udhëzimet vijuese të bashkësisë
@@ -1506,7 +1594,6 @@ sq:
         suspend: S’mund të përdorni më llogarinë tuaj dhe profili juaj, si dhe të dhëna të tjera, s’janë më të përdorshëm. Mundeni ende të bëni hyrjen në llogarinë tuaj për të kërkuar një kopjeruajtje të të dhënave tuaja, deri para se të dhënat tuaja të hiqen plotësisht brenda afërsisht 30 ditësh, por do të mbajmë ca të dhëna elementare, për t’ju penguar t’i bëni bisht pezullimin.
       get_in_touch: Nëse besoni se këtu ka gabim, mund t’i përgjigjeni këtij email-i për t’u lidhur me stafin e %{instance}.
       reason: 'Arsye:'
-      review_server_policies: Shqyrtoni rregullat e shërbyesit
       statuses: 'Postime që janë gjetur me cenime:'
       subject:
         delete_statuses: Postimet tuaja në %{acct} janë hequr
diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml
index 261311b2a..8d8a4744a 100644
--- a/config/locales/sr-Latn.yml
+++ b/config/locales/sr-Latn.yml
@@ -27,7 +27,6 @@ sr-Latn:
     account_moderation_notes:
       create: Napravi
       created_msg: Moderatorska beleška uspešno napravljena!
-      delete: Obriši
       destroyed_msg: Moderatorska beleška uspešno obrisana!
     accounts:
       are_you_sure: Da li ste sigurni?
@@ -139,10 +138,6 @@ sr-Latn:
       reject_media: Odbaci multimediju
       reject_media_hint: Uklanja lokalno uskladištene multimedijske fajlove i odbija da ih skida na dalje. Nebitno je za suspenziju
       show:
-        affected_accounts:
-          few: Utiče na %{count} naloga u bazi
-          one: Utiče na jedan nalog u bazi
-          other: Utiče na %{count} naloga u bazi
         retroactive:
           silence: Ugasi ućutkivanje za sve postojeće naloge sa ovog domena
           suspend: Ugasi suspenzije za sve postojeće naloge sa ovog domena
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index 2fdcd6854..28e6142ff 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -64,7 +64,6 @@ sr:
     account_moderation_notes:
       create: Оставите белешку
       created_msg: Модераторска белешка успешно направљена!
-      delete: Обриши
       destroyed_msg: Модераторска белешка успешно обрисана!
     accounts:
       are_you_sure: Да ли сте сигурни?
@@ -211,10 +210,6 @@ sr:
         silence: ућуткани
         suspend: суспендовани
       show:
-        affected_accounts:
-          few: Утиче на %{count} налога у бази
-          one: Један налог у бази података је под утицајем
-          other: Утиче на %{count} налога у бази података
         retroactive:
           silence: Угаси ућуткивање за све постојеће налоге са овог домена
           suspend: Уклони суспензије за све постојеће налоге са овог домена
@@ -233,10 +228,6 @@ sr:
       title: Црна листа E-поште
     instances:
       delivery_available: Достава је доступна
-      known_accounts:
-        few: "%{count} знаних налога"
-        one: "%{count} знан налог"
-        other: "%{count} знаних налога"
       moderation:
         all: Све
         limited: Ограничено
@@ -716,7 +707,6 @@ sr:
       subject: Ваша архива је спремна за преузимање
       title: Извоз архиве
     warning:
-      review_server_policies: Прегледај политику сервера
       subject:
         disable: Ваш налог %{acct} је замрзнут
         none: Упозорење за %{acct}
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index e103d535b..b61d4ed02 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -92,7 +92,6 @@ sv:
     account_moderation_notes:
       create: Lämna kommentar
       created_msg: Modereringsnotering skapad utan problem!
-      delete: Radera
       destroyed_msg: Modereringsnotering borttagen utan problem!
     accounts:
       add_email_domain_block: Blockera e-postdomän
@@ -158,6 +157,11 @@ sv:
       not_subscribed: Inte prenumererat
       pending: Inväntar granskning
       perform_full_suspension: Utför full avstängning
+      previous_strikes: Tidigare varningar
+      previous_strikes_description_html:
+        one: Detta konto har <strong>en</strong> varning.
+        other: Detta konto har <strong>%{count}</strong> varningar.
+        zero: Detta konto är <strong>i gott skick</strong>.
       promote: Befordra
       protocol: Protokoll
       public: Offentlig
@@ -196,6 +200,7 @@ sv:
       statuses: Status
       strikes: Föregående varningar
       subscribe: Prenumerera
+      suspend: Stäng av
       suspended: Avstängd / Avstängt
       title: Konton
       unblock_email: Avblockera e-postadress
@@ -211,6 +216,7 @@ sv:
       whitelisted: Vitlistad
     action_logs:
       action_types:
+        approve_appeal: Godkänn överklagande
         approve_user: Godkänn användare
         assigned_to_self_report: Tilldela anmälan
         change_email_user: Ändra e-post för användare
@@ -238,6 +244,7 @@ sv:
         enable_user: Aktivera användare
         memorialize_account: Minnesmärk konto
         promote_user: Befordra användare
+        reject_appeal: Avvisa överklagande
         reject_user: Avvisa användare
         remove_avatar_user: Ta bort avatar
         reopen_report: Öppna rapporten igen
@@ -341,16 +348,14 @@ sv:
       interactions: interaktioner
       media_storage: Medialagring
       new_users: nya användare
-      pending_reports_html:
-        one: "<strong>1</strong> kommande rapport"
-        other: "<strong>%{count}</strong> kommande rapporter"
-      pending_users_html:
-        one: "<strong>1</strong> väntande användare"
-        other: "<strong>%{count}</strong> väntande användare"
       software: Programvara
       space: Utrymmesutnyttjande / Utrymmesanvändning
       title: Kontrollpanel
       website: Hemsida
+    disputes:
+      appeals:
+        empty: Inga överklaganden hittades.
+        title: Överklaganden
     domain_allows:
       add_new: Vitlistedomän
       created_msg: Domänen har vitlistats
@@ -387,9 +392,6 @@ sv:
         silence: tystad
         suspend: avstängd
       show:
-        affected_accounts:
-          one: Ett konto i databasen drabbades
-          other: "%{count} konton i databasen har drabbats"
         retroactive:
           silence: Ta bort tysta ner från alla befintliga konton på den här domänen
           suspend: Ta bort suspendering från alla befintliga konton på den här domänen
@@ -429,9 +431,6 @@ sv:
         warning: Varning
       delivery_available: Leverans är tillgängligt
       empty: Inga domäner hittades.
-      known_accounts:
-        one: "%{count} känt konto"
-        other: "%{count} kända konton"
       moderation:
         all: Alla
         limited: Begränsad
@@ -511,7 +510,7 @@ sv:
         placeholder: Beskriv vilka åtgärder som vidtagits eller andra uppdateringar till den här anmälan.
         title: Anteckningar
       reopen: Återuppta anmälan
-      report: 'Anmäl #%{id}'
+      report: 'Rapport #%{id}'
       reported_account: Anmält konto
       reported_by: Anmäld av
       resolved: Löst
@@ -619,6 +618,11 @@ sv:
         title: Media
       title: Kontostatus
       with_media: med media
+    strikes:
+      actions:
+        delete_statuses: "%{name} raderade %{target}s inlägg"
+        disable: "%{name} frös %{target}s konto"
+        silence: "%{name} begränsade %{target}s konto"
     system_checks:
       rules_check:
         action: Hantera serverregler
@@ -695,7 +699,6 @@ sv:
     status:
       account_status: Kontostatus
       confirming: Väntar på att e-postbekräftelsen ska slutföras.
-      functional: Ditt konto fungerar som det ska.
       redirecting_to: Ditt konto är inaktivt eftersom det för närvarande dirigeras om till %{acct}.
     too_fast: Formuläret har skickats för snabbt, försök igen.
     trouble_logging_in: Har du problem med att logga in?
@@ -754,6 +757,10 @@ sv:
     directory: Profil-mapp
     explanation: Upptäck användare baserat på deras intressen
     explore_mastodon: Utforska %{title}
+  disputes:
+    strikes:
+      created_at: Daterad
+      status: 'Inlägg #%{id}'
   domain_validator:
     invalid_domain: är inte ett giltigt domännamn
   errors:
@@ -931,7 +938,7 @@ sv:
       title: Ny följefterfrågning
     mention:
       action: Svar
-      body: 'Du nämndes av %{name} in:'
+      body: 'Du nämndes av %{name} i:'
       subject: Du nämndes av %{name}
       title: Ny omnämning
     poll:
@@ -1262,6 +1269,8 @@ sv:
     recovery_instructions_html: Om du någonsin tappar åtkomst till din telefon kan du använda någon av återställningskoderna nedan för att återställa åtkomst till ditt konto. <strong> Håll återställningskoderna säkra </strong>. Du kan till exempel skriva ut dem och lagra dem med andra viktiga dokument.
     webauthn: Säkerhetsnycklar
   user_mailer:
+    appeal_approved:
+      action: Gå till ditt konto
     backup_ready:
       explanation: Du begärde en fullständig säkerhetskopiering av ditt Mastodon-konto. Det är nu klart för nedladdning!
       subject: Ditt arkiv är klart för nedladdning
diff --git a/config/locales/ta.yml b/config/locales/ta.yml
index 40a915728..4ffbb9a71 100644
--- a/config/locales/ta.yml
+++ b/config/locales/ta.yml
@@ -77,7 +77,6 @@ ta:
     account_moderation_notes:
       create: குறிப்பு எழுதவும்
       created_msg: நடுநிலை குறிப்பு வெற்றிகரமாக பதிவு செய்யப்பட்டது!
-      delete: அகற்று
       destroyed_msg: நடுநிலை குறிப்பு வெற்றிகரமாக அகற்றப்பட்டது!
     accounts:
       add_email_domain_block: இம்மின்னஞ்சல் களத்தைத் தடுப்புப்பட்டியலில் சேர்
diff --git a/config/locales/te.yml b/config/locales/te.yml
index 08284b027..7f6aa0f09 100644
--- a/config/locales/te.yml
+++ b/config/locales/te.yml
@@ -59,7 +59,6 @@ te:
     account_moderation_notes:
       create: ఏదైనా గమనికను వదులు
       created_msg: మోడరేషన్ గమనిక విజయవంతంగా సృష్టించబడింది!
-      delete: తీసివేయి
       destroyed_msg: మోడరేషన్ గమనిక విజయవంతంగా తొలగించబడింది!
     accounts:
       are_you_sure: ఖచ్ఛితమేగా?
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 6745e015a..ec92cfd2d 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -82,7 +82,6 @@ th:
     account_moderation_notes:
       create: เขียนหมายเหตุ
       created_msg: สร้างหมายเหตุการควบคุมสำเร็จ!
-      delete: ลบ
       destroyed_msg: ทำลายหมายเหตุการควบคุมสำเร็จ!
     accounts:
       add_email_domain_block: ปิดกั้นโดเมนอีเมล
@@ -151,6 +150,10 @@ th:
       not_subscribed: ไม่ได้บอกรับ
       pending: การตรวจทานที่รอดำเนินการ
       perform_full_suspension: ระงับ
+      previous_strikes: การลงโทษก่อนหน้านี้
+      previous_strikes_description_html:
+        one: บัญชีนี้มี <strong>หนึ่ง</strong> การลงโทษ
+        other: บัญชีนี้มี <strong>%{count}</strong> การลงโทษ
       promote: เลื่อนขั้น
       protocol: โปรโตคอล
       public: สาธารณะ
@@ -191,7 +194,9 @@ th:
       silence: จำกัด
       silenced: จำกัดอยู่
       statuses: โพสต์
+      strikes: การลงโทษก่อนหน้านี้
       subscribe: บอกรับ
+      suspend: ระงับ
       suspended: ระงับอยู่
       title: บัญชี
       unblock_email: เลิกปิดกั้นที่อยู่อีเมล
@@ -210,6 +215,7 @@ th:
       whitelisted: อนุญาตการติดต่อกับภายนอกแล้ว
     action_logs:
       action_types:
+        approve_appeal: อนุมัติการอุทธรณ์
         approve_user: อนุมัติผู้ใช้
         assigned_to_self_report: มอบหมายรายงาน
         change_email_user: เปลี่ยนอีเมลสำหรับผู้ใช้
@@ -241,6 +247,7 @@ th:
         enable_user: เปิดใช้งานผู้ใช้
         memorialize_account: ทำให้บัญชีเป็นอนุสรณ์
         promote_user: เลื่อนขั้นผู้ใช้
+        reject_appeal: ปฏิเสธการอุทธรณ์
         reject_user: ปฏิเสธผู้ใช้
         remove_avatar_user: เอาภาพประจำตัวออก
         reopen_report: เปิดรายงานใหม่
@@ -367,6 +374,8 @@ th:
       media_storage: ที่เก็บข้อมูลสื่อ
       new_users: ผู้ใช้ใหม่
       opened_reports: รายงานที่เปิด
+      pending_appeals_html:
+        other: "<strong>%{count}</strong> การอุทธรณ์ที่รอดำเนินการ"
       pending_reports_html:
         other: "<strong>%{count}</strong> รายงานที่รอดำเนินการ"
       pending_tags_html:
@@ -381,6 +390,10 @@ th:
       top_languages: ภาษาที่ใช้งานอยู่สูงสุด
       top_servers: เซิร์ฟเวอร์ที่ใช้งานอยู่สูงสุด
       website: เว็บไซต์
+    disputes:
+      appeals:
+        empty: ไม่พบการอุทธรณ์
+        title: การอุทธรณ์
     domain_allows:
       add_new: อนุญาตการติดต่อกับภายนอกกับโดเมน
       created_msg: อนุญาตการติดต่อกับภายนอกกับโดเมนสำเร็จ
@@ -414,7 +427,9 @@ th:
         suspend: ระงับอยู่
       show:
         affected_accounts:
-          other: มีผลต่อ %{count} บัญชีในฐานข้อมูล
+          one: หนึ่งบัญชีในฐานข้อมูลที่ได้รับผลกระทบ
+          other: "%{count} บัญชีในฐานข้อมูลที่ได้รับผลกระทบ"
+          zero: ไม่มีบัญชีในฐานข้อมูลที่ได้รับผลกระทบ
         retroactive:
           silence: เลิกทำการจำกัดบัญชีที่มีผลที่มีอยู่จากโดเมนนี้
           suspend: เลิกระงับบัญชีที่มีผลที่มีอยู่จากโดเมนนี้
@@ -460,7 +475,9 @@ th:
       delivery_error_days: วันที่มีข้อผิดพลาดการจัดส่ง
       empty: ไม่พบโดเมน
       known_accounts:
+        one: "%{count} บัญชีที่รู้จัก"
         other: "%{count} บัญชีที่รู้จัก"
+        zero: ไม่มีบัญชีที่รู้จัก
       moderation:
         all: ทั้งหมด
         limited: จำกัดอยู่
@@ -522,6 +539,7 @@ th:
         notes:
           other: "%{count} หมายเหตุ"
       action_log: รายการบันทึกการตรวจสอบ
+      action_taken_by: ใช้การกระทำโดย
       are_you_sure: คุณแน่ใจหรือไม่?
       assign_to_self: มอบหมายให้ฉัน
       assigned: ผู้ควบคุมที่ได้รับมอบหมาย
@@ -529,8 +547,9 @@ th:
       category: หมวดหมู่
       comment:
         none: ไม่มี
+      comment_description_html: 'เพื่อให้ข้อมูลเพิ่มเติม %{name} ได้เขียน:'
       created_at: รายงานเมื่อ
-      delete_and_resolve: ลบแล้วแก้ปัญหา
+      delete_and_resolve: ลบโพสต์
       forwarded: ส่งต่อแล้ว
       forwarded_to: ส่งต่อไปยัง %{domain} แล้ว
       mark_as_resolved: ทำเครื่องหมายว่าแก้ปัญหาแล้ว
@@ -548,6 +567,7 @@ th:
       reported_by: รายงานโดย
       resolved: แก้ปัญหาแล้ว
       resolved_msg: แก้ปัญหารายงานสำเร็จ!
+      skip_to_actions: ข้ามไปยังการกระทำ
       status: สถานะ
       statuses: เนื้อหาที่รายงาน
       target_origin: จุดเริ่มต้นของบัญชีที่ได้รับการรายงาน
@@ -567,6 +587,7 @@ th:
         desc_html: จำนวนโพสต์ที่เผยแพร่ในเซิร์ฟเวอร์, ผู้ใช้ที่ใช้งานอยู่ และการลงทะเบียนใหม่ในบักเก็ตรายสัปดาห์
         title: เผยแพร่สถิติรวมเกี่ยวกับกิจกรรมผู้ใช้ใน API
       bootstrap_timeline_accounts:
+        desc_html: แยกหลายชื่อผู้ใช้ด้วยจุลภาค จะรับประกันว่าจะแสดงบัญชีเหล่านี้ในคำแนะนำการติดตาม
         title: แนะนำบัญชีเหล่านี้ให้กับผู้ใช้ใหม่
       contact_information:
         email: อีเมลธุรกิจ
@@ -664,6 +685,15 @@ th:
       no_status_selected: ไม่มีการเปลี่ยนแปลงโพสต์เนื่องจากไม่มีการเลือก
       title: โพสต์ของบัญชี
       with_media: มีสื่อ
+    strikes:
+      actions:
+        delete_statuses: "%{name} ได้ลบโพสต์ของ %{target}"
+        disable: "%{name} ได้อายัดบัญชีของ %{target}"
+        none: "%{name} ได้ส่งคำเตือนไปยัง %{target}"
+        sensitive: "%{name} ได้ทำเครื่องหมายบัญชีของ %{target} ว่าละเอียดอ่อน"
+        silence: "%{name} ได้จำกัดบัญชีของ %{target}"
+        suspend: "%{name} ได้ระงับบัญชีของ %{target}"
+      appeal_approved: อุทธรณ์แล้ว
     system_checks:
       rules_check:
         action: จัดการกฎของเซิร์ฟเวอร์
@@ -684,7 +714,9 @@ th:
         disallow: ไม่อนุญาตลิงก์
         disallow_provider: ไม่อนุญาตผู้เผยแพร่
         shared_by_over_week:
+          one: แบ่งปันโดยหนึ่งคนในช่วงสัปดาห์ที่ผ่านมา
           other: แบ่งปันโดย %{count} คนในช่วงสัปดาห์ที่ผ่านมา
+          zero: ไม่มีใครแบ่งปันในช่วงสัปดาห์ที่ผ่านมา
         title: ลิงก์ที่กำลังนิยม
         usage_comparison: แบ่งปัน %{today} ครั้งวันนี้ เทียบกับ %{yesterday} เมื่อวานนี้
       pending_review: การตรวจทานที่รอดำเนินการ
@@ -705,13 +737,16 @@ th:
         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} คนในช่วงสัปดาห์ที่ผ่านมา
+          zero: ไม่มีใครใช้ในช่วงสัปดาห์ที่ผ่านมา
       title: แนวโน้ม
     warning_presets:
       add_new: เพิ่มใหม่
@@ -720,6 +755,13 @@ th:
       empty: คุณยังไม่ได้กำหนดคำเตือนที่ตั้งไว้ล่วงหน้าใด ๆ
       title: จัดการคำเตือนที่ตั้งไว้ล่วงหน้า
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: เพื่อลบโพสต์ของเขา
+        disable: เพื่ออายัดบัญชีของเขา
+        sensitive: เพื่อทำเครื่องหมายบัญชีของเขาว่าละเอียดอ่อน
+        silence: เพื่อจำกัดบัญชีของเขา
+        suspend: เพื่อระงับบัญชีของเขา
     new_pending_account:
       body: รายละเอียดของบัญชีใหม่อยู่ด้านล่าง คุณสามารถอนุมัติหรือปฏิเสธใบสมัครนี้
     new_report:
@@ -802,7 +844,6 @@ th:
     status:
       account_status: สถานะบัญชี
       confirming: กำลังรอการยืนยันอีเมลให้เสร็จสมบูรณ์
-      functional: บัญชีของคุณทำงานได้อย่างเต็มที่
       pending: ใบสมัครของคุณกำลังรอดำเนินการตรวจทานโดยพนักงานของเรา นี่อาจใช้เวลาสักครู่ คุณจะได้รับอีเมลหากใบสมัครของคุณได้รับการอนุมัติ
     too_fast: ส่งแบบฟอร์มเร็วเกินไป ลองอีกครั้ง
     trouble_logging_in: มีปัญหาในการเข้าสู่ระบบ?
@@ -865,6 +906,23 @@ th:
     directory: ไดเรกทอรีโปรไฟล์
     explanation: ค้นพบผู้ใช้ตามความสนใจของเขา
     explore_mastodon: สำรวจ %{title}
+  disputes:
+    strikes:
+      action_taken: การกระทำที่ใช้
+      appeal_submitted_at: ส่งการอุทธรณ์แล้ว
+      appeals:
+        submit: ส่งการอุทธรณ์
+      associated_report: รายงานที่เกี่ยวข้อง
+      created_at: ลงวันที่
+      recipient: ส่งถึง
+      status: 'โพสต์ #%{id}'
+      title_actions:
+        delete_statuses: การเอาโพสต์ออก
+        disable: การอายัดบัญชี
+        none: คำเตือน
+        sensitive: การทำเครื่องหมายบัญชีว่าละเอียดอ่อน
+        silence: การจำกัดบัญชี
+        suspend: การระงับบัญชี
   domain_validator:
     invalid_domain: ไม่ใช่ชื่อโดเมนที่ถูกต้อง
   errors:
@@ -1014,7 +1072,7 @@ th:
   move_handler:
     carry_blocks_over_text: ผู้ใช้นี้ได้ย้ายจาก %{acct} ซึ่งคุณได้ปิดกั้น
     carry_mutes_over_text: ผู้ใช้นี้ได้ย้ายจาก %{acct} ซึ่งคุณได้ซ่อน
-    copy_account_note_text: 'ผู้ใช้นี้ได้ย้ายจาก %{acct} นี่คือหมายเหตุก่อนหน้าของคุณเกี่ยวกับผู้ใช้:'
+    copy_account_note_text: 'ผู้ใช้นี้ได้ย้ายจาก %{acct} นี่คือหมายเหตุก่อนหน้านี้ของคุณเกี่ยวกับผู้ใช้:'
   notification_mailer:
     digest:
       action: ดูการแจ้งเตือนทั้งหมด
@@ -1050,6 +1108,8 @@ th:
       title: การดันใหม่
     status:
       subject: "%{name} เพิ่งโพสต์"
+    update:
+      subject: "%{name} ได้แก้ไขโพสต์"
   notifications:
     email_events: เหตุการณ์สำหรับการแจ้งเตือนอีเมล
     email_events_hint: 'เลือกเหตุการณ์ที่คุณต้องการรับการแจ้งเตือน:'
@@ -1265,7 +1325,7 @@ th:
     reblogged: ดันแล้ว
     sensitive_content: เนื้อหาที่ละเอียดอ่อน
   tags:
-    does_not_match_previous_name: ไม่ตรงกับชื่อก่อนหน้า
+    does_not_match_previous_name: ไม่ตรงกับชื่อก่อนหน้านี้
   terms:
     title: เงื่อนไขการให้บริการและนโยบายความเป็นส่วนตัวของ %{instance}
   themes:
@@ -1306,7 +1366,6 @@ th:
         spam: สแปม
         violation: เนื้อหาละเมิดหลักเกณฑ์ชุมชนดังต่อไปนี้
       reason: 'เหตุผล:'
-      review_server_policies: ตรวจทานนโยบายของเซิร์ฟเวอร์
       statuses: 'โพสต์ที่พบว่ามีการละเมิด:'
       subject:
         disable: บัญชีของคุณ %{acct} ถูกอายัด
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 9fdcf8a7f..336a9a74a 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -94,7 +94,6 @@ tr:
     account_moderation_notes:
       create: Not bırak
       created_msg: Denetim notu başarıyla oluşturuldu!
-      delete: Sil
       destroyed_msg: Denetim notu başarıyla yok edildi!
     accounts:
       add_email_domain_block: E-posta alan adını engelle
@@ -163,6 +162,11 @@ tr:
       not_subscribed: Abone edilmedi
       pending: Bekleyen yorum
       perform_full_suspension: Askıya al
+      previous_strikes: Önceki eylemler
+      previous_strikes_description_html:
+        one: Bu hesap için <strong>bir</strong> eylem yapılmış.
+        other: Bu hesap için <strong>%{count}</strong> eylem yapılmış.
+        zero: Bu hesap <strong>hali iyi durumda</strong>.
       promote: Yükselt
       protocol: Protokol
       public: Herkese açık
@@ -206,6 +210,7 @@ tr:
       statuses: Durumlar
       strikes: Önceki eylemler
       subscribe: Abone ol
+      suspend: Askıya al
       suspended: Askıya alındı
       suspension_irreversible: Bu hesabın verileri geri dönüşümsüz olarak silindi. Hesabı kullanılabilir hale getirmek için hesabın askıya alınmasını kaldırabilirsiniz, ancak daha önce sahip olduğu herhangi bir veri kurtarılamaz.
       suspension_reversible_hint_html: Hesap askıya alındı ve veriler %{date} tarihinde tamamen kaldırılacak. O zamana kadar, hesap herhangi bir olumsuz etki olmaksızın geri yüklenebilir. Hesabın tüm verilerini hemen kaldırmak isterseniz, bunu aşağıdan yapabilirsiniz.
@@ -226,6 +231,7 @@ tr:
       whitelisted: Beyaz listede
     action_logs:
       action_types:
+        approve_appeal: İtirazı Kabul Et
         approve_user: Kullanıcıyı Onayla
         assigned_to_self_report: Raporu Ata
         change_email_user: Kullanıcı E-postasını Değiştir
@@ -257,6 +263,7 @@ tr:
         enable_user: Kullanıcıyı Etkinleştir
         memorialize_account: Hesabı Anıtlaştır
         promote_user: Kullanıcıyı Yükselt
+        reject_appeal: İtirazı Reddet
         reject_user: Kullanıcıyı Reddet
         remove_avatar_user: Profil Resmini Kaldır
         reopen_report: Şikayeti Tekrar Aç
@@ -275,6 +282,7 @@ tr:
         update_domain_block: Engellenen Alan Adını Güncelle
         update_status: Durumu Güncelle
       actions:
+        approve_appeal_html: "%{name}, %{target} kullanıcısının yönetim kararına itirazını kabul etti"
         approve_user_html: "%{name}, %{target} konumundan kaydı onayladı"
         assigned_to_self_report_html: "%{name} kendilerine %{target} adlı raporu verdi"
         change_email_user_html: "%{name}, %{target} kullanıcısının e-posta adresini değiştirdi"
@@ -306,6 +314,7 @@ tr:
         enable_user_html: "%{name}, %{target} kullanıcısı için oturum açmayı etkinleştirdi"
         memorialize_account_html: "%{name}, %{target} kullanıcısının hesabını bir anıt sayfaya dönüştürdü"
         promote_user_html: "%{name}, %{target} kullanıcısını yükseltti"
+        reject_appeal_html: "%{name}, %{target} kullanıcısının yönetim kararına itirazını reddetti"
         reject_user_html: "%{name}, %{target} konumundan kaydı reddetti"
         remove_avatar_user_html: "%{name}, %{target} kullanıcısının avatarını kaldırdı"
         reopen_report_html: "%{name}, %{target} şikayetini yeniden açtı"
@@ -384,14 +393,17 @@ tr:
       media_storage: Medya deposu
       new_users: yeni kullanıcılar
       opened_reports: açılan bildirimler
+      pending_appeals_html:
+        one: "<strong>%{count}</strong> bekleyen itiraz"
+        other: "<strong>%{count}</strong> bekleyen itiraz"
       pending_reports_html:
-        one: "<strong>1</strong> bekleyen bildirim"
+        one: "<strong>%{count}</strong> bekleyen bildirim"
         other: "<strong>%{count}</strong> bekleyen bildirim"
       pending_tags_html:
-        one: "<strong>1</strong> bekleyen etiket"
+        one: "<strong>%{count}</strong> bekleyen etiket"
         other: "<strong>%{count}</strong> bekleyen etiket"
       pending_users_html:
-        one: "<strong>1</strong> bekleyen kullanıcı"
+        one: "<strong>%{count}</strong> bekleyen kullanıcı"
         other: "<strong>%{count}</strong> bekleyen kullanıcı"
       resolved_reports: çözülmüş bildirimler
       software: Yazılım
@@ -401,6 +413,10 @@ tr:
       top_languages: En aktif diller
       top_servers: En aktif sunucular
       website: Web sitesi
+    disputes:
+      appeals:
+        empty: İtiraz bulunamadı.
+        title: İtirazlar
     domain_allows:
       add_new: Alan adını beyaz listeye al
       created_msg: Alan adı başarıyla beyaz listeye alındı
@@ -441,6 +457,7 @@ tr:
         affected_accounts:
           one: Veritabanındaki bir hesap etkilendi
           other: Veritabanındaki %{count} hesap etkilendi
+          zero: Veritabanındaki hiç bir hesap etkilenmedi
         retroactive:
           silence: Bu domaindeki tüm hesapların üzerindeki susturulma işlemini kaldır
           suspend: Bu domaindeki tüm hesapların üzerindeki uzaklaştırma işlemini kaldır
@@ -494,6 +511,7 @@ tr:
       known_accounts:
         one: "%{count} bilinen hesap"
         other: "%{count} bilinen hesap"
+        zero: Bilinen hesap yok
       moderation:
         all: Tümü
         limited: Sınırlı
@@ -560,10 +578,12 @@ tr:
       action_log: Denetim günlüğü
       action_taken_by: tarafından gerçekleştirilen eylem
       actions:
+        delete_description_html: Bildirilen gönderiler silinecek ve aynı hesapla ileride yaşabileceğiniz etkileşimlerde çoğaltmanız için bir eylem kaydedilecek.
         other_description_html: Hesabın davranışını denetlemek ve bildirilen hesabın iletişimini yapılandırmak için daha fazla seçenek görün.
+        resolve_description_html: Bildirilen hesap için bir şey yapılmayacak, eylem kaydedilmeyecek ve bildirim kapatılacak.
         silence_description_html: Profil sadece halihazırda takip edenler ve elle bakanlarca görünecek, böylece erişimi ciddi bir şekilde kısıtlanacak. Her zaman geri alınabilir.
         suspend_description_html: Profil ve tüm içeriği sonunda silinene kadar erişilmez olacak. Hesapla etkileşim mümkün olmayacak. 30 gün boyunca geri alınabilir.
-      actions_description_html: 'Yukarıdaki incitici içeriğin kaldırılması yetersiz ise:'
+      actions_description_html: Bu bildirimi çözmek için ne yapılması gerektiğine karar verin. Bildirilen hesap için ceza işlemi yaparsanız, <strong>İstenmeyen</strong> kategorisi seçilmemişse, onlara bir e-posta duyurusu gönderilecektir.
       add_to_report: Bildirime daha fazlasını ekle
       are_you_sure: Emin misiniz?
       assign_to_self: Bana ata
@@ -575,7 +595,7 @@ tr:
         none: Yok
       comment_description_html: 'Daha fazla bilgi vermek için %{name} şunu yazdı:'
       created_at: Şikayet edildi
-      delete_and_resolve: Çöz ve sil
+      delete_and_resolve: Gönderileri sil
       forwarded: İletildi
       forwarded_to: "%{domain}'e iletildi"
       mark_as_resolved: Giderildi olarak işaretle
@@ -589,12 +609,14 @@ tr:
         placeholder: Hangi işlemlerin yapıldığını, ya da diğer ilgili güncellemeleri açıklayın...
         title: Notlar
       notes_description_html: Kendiniz ve diğer moderatörler için not bırakın veya notları görüntüleyin
+      quick_actions_description_html: 'Hemen bir şey yapın veya bildirilen içeriği görmek için aşağı kaydırın:'
       reopen: Şikayeti tekrar aç
       report: 'Şikayet #%{id}'
       reported_account: Şikayet edilen hesap
       reported_by: Şikayet eden
       resolved: Giderildi
       resolved_msg: Şikayet başarıyla çözümlendi!
+      skip_to_actions: İşlemlere atla
       status: Durum
       statuses: Bildirilen içerik
       statuses_description_html: İncitici içerik, bildirilen hesapla iletişimde alıntılanacaktır
@@ -715,6 +737,16 @@ tr:
       no_status_selected: Hiçbiri seçilmediğinden hiçbir durum değiştirilmedi
       title: Hesap durumları
       with_media: Medya ile
+    strikes:
+      actions:
+        delete_statuses: "%{name}, %{target} kullanıcısının gönderilerini sildi"
+        disable: "%{name}, %{target} kullanıcısının hesabını dondurdu"
+        none: "%{name}, %{target} kullanıcısına bir uyarı gönderdi"
+        sensitive: "%{name}, %{target} kullanıcısının hesabını hassas olarak işaretledi"
+        silence: "%{name}, %{target} kullanıcısının hesabını kısıtladı"
+        suspend: "%{name}, %{target} kullanıcısının hesabını askıya aldı"
+      appeal_approved: İtiraz Edildi
+      appeal_pending: İtiraz bekliyor
     system_checks:
       database_schema_check:
         message_html: Beklemede olan veritabanı güncellemeleri mevcut. Uygulamanın beklenildiği gibi çalışması için lütfen onları çalıştırın
@@ -739,6 +771,7 @@ tr:
         shared_by_over_week:
           one: Geçen hafta bir kişi paylaştı
           other: Geçen hafta %{count} kişi paylaştı
+          zero: Geçen hafta kimse paylaşmadı
         title: Öne çıkan bağlantılar
         usage_comparison: Bugün %{today} kere paylaşıldı, dün %{yesterday} kere paylaşılmıştı
       pending_review: İnceleme bekliyor
@@ -766,8 +799,8 @@ tr:
         usable: Kullanılabilir
         usage_comparison: Bugün %{today} kere kullanıldı, dün %{yesterday} kere kullanılmıştı
         used_by_over_week:
-          one: Geçen hafta %{count} kişi tarafından kullanıldı
-          other: Geçen hafta %{count} kişi tarafından kullanıldı
+          one: Geçen hafta bir kişi tarafından kullanıldı
+          zero: Geçen hafta kimse tarafından kullanılmadı
       title: Öne çıkanlar
     warning_presets:
       add_new: Yeni ekle
@@ -776,6 +809,17 @@ tr:
       empty: Henüz önceden ayarlanmış bir uyarı tanımlanmadı.
       title: Uyarı ön-ayarlarını yönet
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: gönderilerini silme
+        disable: hesaplarını dondurma
+        none: uyarı
+        sensitive: hesaplarını hassas olarak işaretleme
+        silence: hesaplarını kısıtlama
+        suspend: hesaplarını askıya alma
+      body: "%{target}, %{date} tarihinde %{action_taken_by} tarafından alınan %{type} yönetim kararına itiraz etti. Şunu yazdılar:"
+      next_steps: Yönetim kararını geri almak için itirazı onaylayabilir veya itirazı görmezden gelebilirsiniz.
+      subject: "%{username}, %{instance} hakkındaki bir yönetim kararına itiraz ediyor"
     new_pending_account:
       body: Yeni hesabın detayları aşağıdadır. Bu başvuruyu onaylayabilir ya da reddedebilirsiniz.
       subject: "%{instance} üzerinde gözden geçirmek için yeni hesap (%{username})"
@@ -866,7 +910,6 @@ tr:
     status:
       account_status: Hesap durumu
       confirming: E-posta doğrulamasının tamamlanması bekleniyor.
-      functional: Hesabınız tamamen kullanıma hazır.
       pending: Başvurunuz personelimiz tarafından gözden geçirilmeyi beklemektedir. Bu biraz zaman alabilir. Başvurunuz onaylanırsa bir e-posta alacaksınız.
       redirecting_to: Hesabınız aktif değil çünkü şu anda %{acct} adresine yönlendirilmektedir.
     too_fast: Form çok hızlı gönderildi, tekrar deneyin.
@@ -932,6 +975,32 @@ tr:
     directory: Profil Dizini
     explanation: Kullanıcıları ilgi alanlarına göre keşfedin
     explore_mastodon: "%{title} sunucusunu keşfet"
+  disputes:
+    strikes:
+      action_taken: Yapılan işlem
+      appeal: İtiraz
+      appeal_approved: Eyleme başarılı bir şekilde itiraz edildi ve artık geçerli değil
+      appeal_rejected: İtiraz reddedildi
+      appeal_submitted_at: İtiraz gönderildi
+      appealed_msg: İtiraz gönderildi. Kabul edilirse bilgilendirileceksiniz.
+      appeals:
+        submit: İtirazı gönder
+      associated_report: İlişkili rapor
+      created_at: Tarih
+      recipient: Kime
+      status: 'Gönderi #%{id}'
+      status_removed: Gönderi zaten sistemden kaldırıldı
+      title: "%{date} tarihli %{action}"
+      title_actions:
+        delete_statuses: Gönderi kaldırma
+        disable: Hesabın dondurulması
+        none: Uyarı
+        sensitive: Hassas hesap olarak işaretleme
+        silence: Hesabın kısıtlanması
+        suspend: Hesabın askıya alınması
+      your_appeal_approved: İtirazınız onaylandı
+      your_appeal_pending: Bir itiraz gönderdiniz
+      your_appeal_rejected: İtirazınız reddedildi
   domain_validator:
     invalid_domain: geçerli bir alan adı değil
   errors:
@@ -1143,6 +1212,8 @@ tr:
       title: Yeni boost
     status:
       subject: "%{name} az önce gönderdi"
+    update:
+      subject: "%{name} bir gönderiyi düzenledi"
   notifications:
     email_events: E-posta bildirimi gönderilecek etkinlikler
     email_events_hint: 'Bildirim almak istediğiniz olayları seçin:'
@@ -1493,6 +1564,15 @@ tr:
     recovery_instructions_html: 'Eğer telefonunuza erişiminizi kaybederseniz, aşağıdaki kurtarma kodlarından birini kullanarak hesabınıza giriş yapabilirsiniz. Kurtarma kodlarınızı güvenli halde tutunuz. Örneğin: kodların çıktısını alıp diğer önemli belgeleriniz ile birlikte saklayabilirsiniz.'
     webauthn: Güvenlik anahtarları
   user_mailer:
+    appeal_approved:
+      action: Hesabınıza gidin
+      explanation: "%{appeal_date} tarihinde gönderdiğiniz, hesabınıza yönelik %{strike_date} tarihli eyleme itirazınız onaylandı. Hesabınız artık tekrar iyi durumda."
+      subject: "%{date} tarihli itirazınız kabul edildi"
+      title: İtiraz onaylandı
+    appeal_rejected:
+      explanation: "%{appeal_date} tarihinde gönderdiğiniz, hesabınıza yönelik %{strike_date} tarihli eyleme itirazınız reddedildi."
+      subject: "%{date} tarihli itirazınız reddedildi"
+      title: İtiraz reddedildi
     backup_ready:
       explanation: Mastodon hesabınızın tam yedeğini istemiştiniz. Şimdi indirilebilir durumda!
       subject: Arşiviniz indirilmeye hazır
@@ -1504,6 +1584,8 @@ tr:
       subject: Lütfen oturum açma girişimini onaylayın
       title: Oturum açma girişimi
     warning:
+      appeal: Bir itiraz gönder
+      appeal_description: Bunun bir hata olduğunu düşünüyorsanız, %{instance} sunucusunun personeline bir itiraz gönderebilirsiniz.
       categories:
         spam: İstenmeyen
         violation: İçerik aşağıdaki topluluk ilkelerini ihlal ediyor
@@ -1515,7 +1597,6 @@ tr:
         suspend: Hesabınızı artık kullanamazsınız ve profiliniz ve diğer veri artık erişilebilir değil. Yaklaşık 30 gün içinde silinene kadar verinizin bir yedeğini istemek için giriş yapabilirsiniz, ancak askıdan kaçınmanızı önlemek için bazı temel veriyi saklayabiliriz.
       get_in_touch: Bunun bir hata olduğunu düşünüyorsanız, %{instance} yönetimiyle bağlantıya geçmek için bu e-postaya yanıt verebilirsiniz.
       reason: 'Gerekçe:'
-      review_server_policies: Sunucu politikalarını inceleyin
       statuses: 'İhlal içeren gönderiler:'
       subject:
         delete_statuses: "%{acct} hesabınızdaki gönderiler kaldırıldı"
diff --git a/config/locales/tt.yml b/config/locales/tt.yml
index ab51124fd..40bf65ac5 100644
--- a/config/locales/tt.yml
+++ b/config/locales/tt.yml
@@ -20,8 +20,6 @@ tt:
       group: Törkem
     unfollow: Язылынмау
   admin:
-    account_moderation_notes:
-      delete: Бетерү
     accounts:
       avatar: Аватар
       by_domain: Домен
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 7fe318a8e..6d96a951b 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -100,7 +100,6 @@ uk:
     account_moderation_notes:
       create: Залишити нотатку
       created_msg: Нотатку модератора успішно створено!
-      delete: Видалити
       destroyed_msg: Нотатку модератора успішно видалено!
     accounts:
       add_email_domain_block: Додати поштовий домен до чорного списку
@@ -210,8 +209,8 @@ uk:
       silence: Глушення
       silenced: Заглушені
       statuses: Статуси
-      strikes: Попередні наліпки
       subscribe: Підписатися
+      suspend: Призупинити
       suspended: Призупинені
       suspension_irreversible: Дані цього облікового запису безповоротно видалено. Ви можете розблокувати обліковий запис, щоб могти ним користуватися, але будь-які його дані не відновляться.
       suspension_reversible_hint_html: Обліковий запис заблоковано, а дані буде повністю вилучено %{date}. До цього часу обліковий запис можна відновити без будь-яких негативних наслідків. Якщо ви бажаєте вилучити всі дані облікового запису негайно, ви можете зробити це внизу.
@@ -232,6 +231,7 @@ uk:
       whitelisted: У білому списку
     action_logs:
       action_types:
+        approve_appeal: Затвердити апеляцію
         approve_user: Затвердити користувачів
         assigned_to_self_report: Призначити звіт
         change_email_user: Змінити електронну пошту для користувача
@@ -263,6 +263,7 @@ uk:
         enable_user: Активувати користувача
         memorialize_account: Зробити обліковий запис меморіалом
         promote_user: Підвищити користувача
+        reject_appeal: Відхилити апеляцію
         reject_user: Відхилити користувача
         remove_avatar_user: Видалити аватар
         reopen_report: Перевідкрити скаргу
@@ -390,21 +391,6 @@ uk:
       media_storage: Медіасховище
       new_users: нові користувачі
       opened_reports: звітів відкрито
-      pending_reports_html:
-        few: "<strong>%{count}</strong> звіти у черзі"
-        many: "<strong>%{count}</strong> звітів у черзі"
-        one: "<strong>1</strong> звіт у черзі"
-        other: "<strong>%{count}</strong> звіти у черзі"
-      pending_tags_html:
-        few: "<strong>%{count}</strong> хештеґи у черзі"
-        many: "<strong>%{count}</strong> хештеґів у черзі"
-        one: "<strong>1</strong> хештеґ у черзі"
-        other: "<strong>%{count}</strong> хештеґи у черзі"
-      pending_users_html:
-        few: "<strong>%{count}</strong> користувача у черзі"
-        many: "<strong>%{count}</strong> користувачів у черзі"
-        one: "<strong>1</strong> користувач у черзі"
-        other: "<strong>%{count}</strong> користувача у черзі"
       resolved_reports: розв'язані звіти
       software: Програмне забезпечення
       sources: Джерела реєстрації
@@ -413,6 +399,10 @@ uk:
       top_languages: Найактивніші мови
       top_servers: Найактивніші сервери
       website: Вебсайт
+    disputes:
+      appeals:
+        empty: Апеляцій не знайдено.
+        title: Апеляції
     domain_allows:
       add_new: Додати домен до білого списку
       created_msg: Домен було успішно додано до білого списку
@@ -451,10 +441,9 @@ uk:
         suspend: призупинені
       show:
         affected_accounts:
-          few: Впливає на %{count} облікових записи у базі даних
-          many: Впливає на %{count} облікових записів у базі даних
           one: Впливає на один обліковий запис у базі даних
           other: Впливає на %{count} облікових записів у базі даних
+          zero: Не впливає на жоден обліковий запис у базі даних
         retroactive:
           silence: Зняти глушення з усіх існуючих заглушених облікових записів цього домену
           suspend: Розморозити існуючі заморожені облікові записи з цього домену
@@ -508,10 +497,9 @@ uk:
       destroyed_msg: Дані з %{domain} тепер у черзі на видалення.
       empty: Доменів не знайдено.
       known_accounts:
-        few: "%{count} відомих облікових записів"
-        many: "%{count} відомих облікових записів"
         one: "%{count} відомий обліковий запис"
         other: "%{count} відомих облікових записів"
+        zero: Немає відомих облікових записів
       moderation:
         all: Усі
         limited: Обмежені
@@ -583,7 +571,6 @@ uk:
         other_description_html: Більше опцій керування поведінкою облікового запису і налаштування комунікації з обліковим записом, на який поскаржилися.
         silence_description_html: Профіль буде видимий лише тим, хто вже стежить за ним або знайде його самостійно, сильно обмежуючи його знаходження. Можна потім скасувати.
         suspend_description_html: Профіль і весь його вміст буде недоступним, поки його не буде видалено. Взаємодія з обліковим записом буде неможливою.
-      actions_description_html: 'Якщо вилучення зазначеного образливого вмісту недостатньо:'
       add_to_report: Додати ще подробиць до скарги
       are_you_sure: Ви впевнені?
       assign_to_self: Призначити мені
@@ -595,7 +582,7 @@ uk:
         none: Немає
       comment_description_html: 'Щоб надати більше відомостей, %{name} пише:'
       created_at: Створено
-      delete_and_resolve: Видалити й розв'язати
+      delete_and_resolve: Видалити дописи
       forwarded: Переслано
       forwarded_to: Переслано до %{domain}
       mark_as_resolved: Відмітити як вирішену
@@ -615,6 +602,7 @@ uk:
       reported_by: Відправник скарги
       resolved: Вирішено
       resolved_msg: Скаргу успішно вирішено!
+      skip_to_actions: Перейти до дій
       status: Статус
       statuses: Вміст, на який поскаржилися
       statuses_description_html: Замінений вміст буде цитований у спілкуванні з обліковим записом, на який поскаржилися
@@ -737,6 +725,9 @@ uk:
       no_status_selected: Жодного статуса не було змінено, оскільки жодного не було вибрано
       title: Статуси облікових записів
       with_media: З медіа
+    strikes:
+      actions:
+        delete_statuses: "%{name} видаляє допис від %{target}"
     system_checks:
       database_schema_check:
         message_html: Існують відкладені перенесення бази даних. Запустіть їх, щоб забезпечити очікувану роботу програми
@@ -758,11 +749,6 @@ uk:
         allow_provider: Дозволити публікатора
         disallow: Заборонити посилання
         disallow_provider: Заборонити публікатора
-        shared_by_over_week:
-          few: Поширили %{count} людини за останній тиждень
-          many: Поширили %{count} людей за останній тиждень
-          one: Поширила одна людина за останній тиждень
-          other: Поширили %{count} людини за останній тиждень
         title: Популярні посилання
         usage_comparison: Сьогодні поширено %{today} разів, у порівнянні з %{yesterday} вчора
       pending_review: Очікує перевірки
@@ -789,11 +775,6 @@ uk:
         trending_rank: 'Популярність #%{rank}'
         usable: Може бути використано
         usage_comparison: Сьогодні використано %{today} разів, у порівнянні з %{yesterday} вчора
-        used_by_over_week:
-          few: Використали %{count} людини за минулий тиждень
-          many: Використали %{count} людей за минулий тиждень
-          one: Використала одна людина за минулий тиждень
-          other: Використали %{count} людини за минулий тиждень
       title: Популярні
     warning_presets:
       add_new: Додати новий
@@ -802,6 +783,16 @@ uk:
       empty: Ви ще не визначили жодних попереджень.
       title: Управління шаблонами попереджень
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: щоб видалити їхні дописи
+        disable: щоб заморозити їхній обліковий запис
+        none: попередження
+        sensitive: щоб позначати їхній обліковий запис делікатним
+        silence: щоб обмежити їхній обліковий запис
+        suspend: щоб призупинити їхній обліковий запис
+      next_steps: Ви можете схвалити апеляцію, щоб скасувати рішення про модерацію або проігнорувати її.
+      subject: "%{username} апелює до рішення про модерацію на %{instance}"
     new_pending_account:
       body: Деталі нового облікового запису наведено нижче. Ви можете схвалити або відхилити цю заяву.
       subject: Новий обліковий запис надіслано на розгляд на %{instance} (%{username})
@@ -892,7 +883,6 @@ uk:
     status:
       account_status: Статус облікового запису
       confirming: Очікуємо на завершення підтвердження за допомогою електронної пошти.
-      functional: Ваш обліковий запис повністю робочій.
       pending: Ваша заява очікує на розгляд нашим персоналом. Це може зайняти деякий час. Ви отримаєте електронний лист, якщо ваша заява буде схвалена.
       redirecting_to: Ваш обліковий запис наразі неактивний, тому що він перенаправлений до %{acct}.
     too_fast: Форму подано занадто швидко, спробуйте ще раз.
@@ -958,6 +948,30 @@ uk:
     directory: Каталог профілів
     explanation: Шукайте користувачів за їх інтересами
     explore_mastodon: Досліджуйте %{title}
+  disputes:
+    strikes:
+      action_taken: Дію виконано
+      appeal: Апеляція
+      appeal_rejected: Апеляцію було відхилено
+      appeal_submitted_at: Апеляцію надіслано
+      appealed_msg: Вашу апеляцію було надіслано. Якщо її погодять, вам буде повідомлено про це.
+      appeals:
+        submit: Подати апеляцію
+      associated_report: Пов'язана скарга
+      created_at: Застарілі
+      status: 'Допис #%{id}'
+      status_removed: Допис уже вилучено з системи
+      title: "%{action} від %{date}"
+      title_actions:
+        delete_statuses: Вилучення допису
+        disable: Заморожування облікового запису
+        none: Попередження
+        sensitive: Позначити обліковим записом з делікатним вмістом
+        silence: Обмеження облікового запису
+        suspend: Призупинення облікового запису
+      your_appeal_approved: Вашу апеляцію було схвалено
+      your_appeal_pending: Ви не подавали апеляцій
+      your_appeal_rejected: Вашу апеляцію було відхилено
   domain_validator:
     invalid_domain: не є допустимим ім'ям домену
   errors:
@@ -1177,6 +1191,8 @@ uk:
       title: Нове передмухування
     status:
       subject: "%{name} щойно опубліковано"
+    update:
+      subject: "%{name} змінює допис"
   notifications:
     email_events: Події, про які сповіщати електронною поштою
     email_events_hint: 'Оберіть події, про які ви хочете отримувати сповіщення:'
@@ -1459,6 +1475,12 @@ uk:
     recovery_instructions_html: У випадку втрати доступу до вашого телефону ви можете використати один з нижчевказаних кодів відновлення, щоб повернути доступ до вашого облікового запису. <strong>Тримайте коди відновлення у безпеці</strong>, наприклад, роздрукуйте їх та зберігайте разом з іншими важливими документами.
     webauthn: Ключі безпеки
   user_mailer:
+    appeal_approved:
+      action: Перейти у ваш обліковий запис
+      subject: Вашу апеляцію від %{date} було схвалено
+      title: Апеляцію схвалено
+    appeal_rejected:
+      title: Апеляцію відхилено
     backup_ready:
       explanation: Ви робили запит повної резервної копії вашого облікового запису Mastodon. Вона вже готова для завантаження!
       subject: Ваш архів готовий до завантаження
@@ -1470,6 +1492,7 @@ uk:
       subject: Будь ласка, підтвердіть спробу входу
       title: Спроба входу
     warning:
+      appeal: Подати апеляцію
       categories:
         spam: Спам
         violation: Вміст порушує такі правила спільноти
@@ -1481,7 +1504,6 @@ uk:
         suspend: Ви більше не можете користуватися своїм обліковим записом, а ваші інші дані більше недоступні. Ви досі можете увійти, щоб надіслати запит на отримання резервної копії своїх даних до повного видалення впродовж приблизно 30 днів, але ми збережемо деякі основні дані, щоб унеможливити ухилення вами від призупинення.
       get_in_touch: Якщо ви вважаєте, що це помилка, ви можете відповісти на цей електронний лист, щоб зв'язатися з персоналом %{instance}.
       reason: 'Причина:'
-      review_server_policies: Переглянути політики сервера
       statuses: 'Дописи, які порушили правила:'
       subject:
         delete_statuses: Ваші дописи на %{acct} були вилучені
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 2464bbaa8..99244e81c 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -88,7 +88,6 @@ vi:
     account_moderation_notes:
       create: Thêm ghi chú
       created_msg: Thêm ghi chú kiểm duyệt thành công!
-      delete: Xóa bỏ
       destroyed_msg: Đã xóa ghi chú kiểm duyệt!
     accounts:
       add_email_domain_block: Chặn tên miền email
@@ -157,6 +156,11 @@ vi:
       not_subscribed: Chưa đăng ký
       pending: Chờ duyệt
       perform_full_suspension: Vô hiệu hóa
+      previous_strikes: Những lần trước
+      previous_strikes_description_html:
+        one: Người dùng này có <strong>một</strong> lần cảnh cáo.
+        other: Người dùng này có <strong>%{count}</strong> lần cảnh cáo.
+        zero: Người dùng này <strong>chưa từng bị cảnh cáo</strong>.
       promote: Chỉ định vai trò
       protocol: Giao thức
       public: Công khai
@@ -200,6 +204,7 @@ vi:
       statuses: Tút
       strikes: Những lần trước
       subscribe: Đăng ký
+      suspend: Vô hiệu hóa
       suspended: Vô hiệu hóa
       suspension_irreversible: Toàn bộ dữ liệu của người dùng này sẽ bị xóa hết. Bạn vẫn có thể ngừng vô hiệu hóa nhưng dữ liệu sẽ không thể phục hồi.
       suspension_reversible_hint_html: Mọi dữ liệu của người này sẽ bị xóa sạch vào %{date}. Trước thời hạn này, dữ liệu vẫn có thể phục hồi. Nếu bạn muốn xóa dữ liệu của người này ngay lập tức, hãy tiếp tục.
@@ -220,6 +225,7 @@ vi:
       whitelisted: Danh sách trắng
     action_logs:
       action_types:
+        approve_appeal: Cho phép Xuất Hiện
         approve_user: Phê duyệt người dùng
         assigned_to_self_report: Tự xử lý báo cáo
         change_email_user: Đổi email
@@ -251,6 +257,7 @@ vi:
         enable_user: Kích hoạt lại người dùng
         memorialize_account: Đánh dấu tưởng niệm
         promote_user: Chỉ định vai trò
+        reject_appeal: Từ chối Xuất Hiện
         reject_user: Từ chối người dùng
         remove_avatar_user: Xóa ảnh đại diện
         reopen_report: Mở lại báo cáo
@@ -269,6 +276,7 @@ vi:
         update_domain_block: Cập nhật máy chủ chặn
         update_status: Cập nhật tút
       actions:
+        approve_appeal_html: "%{name} đã phê duyệt quyết định kiểm duyệt từ %{target}"
         approve_user_html: "%{name} đã chấp nhận đăng ký từ %{target}"
         assigned_to_self_report_html: "%{name} tự xử lý báo cáo %{target}"
         change_email_user_html: "%{name} đã thay đổi địa chỉ email cho %{target}"
@@ -300,6 +308,7 @@ vi:
         enable_user_html: "%{name} mở khóa cho người dùng %{target}"
         memorialize_account_html: "%{name} đã biến tài khoản %{target} thành một trang tưởng niệm"
         promote_user_html: "%{name} chỉ định vai trò cho %{target}"
+        reject_appeal_html: "%{name} đã phản đối quyết định kiểm duyệt từ %{target}"
         reject_user_html: "%{name} đã từ chối đăng ký từ %{target}"
         remove_avatar_user_html: "%{name} đã xóa ảnh đại diện của %{target}"
         reopen_report_html: "%{name} mở lại báo cáo %{target}"
@@ -378,6 +387,8 @@ vi:
       media_storage: Dung lượng lưu trữ
       new_users: người dùng mới
       opened_reports: báo cáo chưa xử lí
+      pending_appeals_html:
+        other: "<strong>%{count}</strong> kháng cáo đang chờ"
       pending_reports_html:
         other: "<strong>%{count}</strong> báo cáo đang chờ"
       pending_tags_html:
@@ -392,6 +403,10 @@ vi:
       top_languages: Ngôn ngữ phổ biến
       top_servers: Máy chủ phổ biến
       website: Website
+    disputes:
+      appeals:
+        empty: Không tìm thấy.
+        title: Xuất Hiện
     domain_allows:
       add_new: Cho phép liên hợp với máy chủ
       created_msg: Máy chủ đã được kích hoạt liên hợp thành công
@@ -430,7 +445,9 @@ vi:
         suspend: bị vô hiệu hóa
       show:
         affected_accounts:
-          other: "%{count} tài khoản trong cơ sở dữ liệu bị ảnh hưởng"
+          one: Ảnh hưởng một người dùng trong cơ sở dữ liệu
+          other: Ảnh hưởng %{count} người dùng trong cơ sở dữ liệu
+          zero: Không ảnh hưởng người dùng nào trong cơ sở dữ liệu
         retroactive:
           silence: Bỏ hạn chế những tài khoản ở máy chủ này
           suspend: Ngưng vô hiệu hóa các tài khoản ở máy chủ này
@@ -481,7 +498,9 @@ vi:
       destroyed_msg: Dữ liệu từ %{domain} đã lên lịch để xóa.
       empty: Không có máy chủ nào.
       known_accounts:
-        other: "%{count} tài khoản đã biết"
+        one: "%{count} người dùng đã biết"
+        other: "%{count} người dùng đã biết"
+        zero: Không có người dùng đã biết
       moderation:
         all: Tất cả
         limited: Hạn chế
@@ -547,10 +566,12 @@ vi:
       action_log: Nhật ký kiểm duyệt
       action_taken_by: Hành động được thực hiện bởi
       actions:
+        delete_description_html: Những tút bị báo cáo sẽ được xóa và 1 thẹo sẽ được ghi lại để giúp bạn lưu ý về tài khoản này trong tương lai.
         other_description_html: Những tùy chọn để kiểm soát tài khoản và giao tiếp với tài khoản bị báo cáo.
+        resolve_description_html: Không có hành động nào áp dụng đối với tài khoản bị báo cáo, không có thẹo, và báo cáo sẽ được đóng.
         silence_description_html: Trang cá nhân sẽ chỉ hiển thị với những người đã theo dõi hoặc tìm kiếm thủ công, hạn chế tối đa tầm ảnh hưởng của nó. Có thể đổi lại bình thường sau.
         suspend_description_html: Trang cá nhân và tất cả các nội dung sẽ không thể truy cập cho đến khi nó bị xóa hoàn toàn. Không thể tương tác với tài khoản. Đảo ngược trong vòng 30 ngày.
-      actions_description_html: 'Nếu loại bỏ nội dung vi phạm ở trên là không đủ:'
+      actions_description_html: Quyết định hướng xử lý báo cáo này. Nếu áp đặt trừng phạt, một email thông báo sẽ được gửi cho họ, ngoại trừ nếu đó là <strong>Spam</strong>.
       add_to_report: Bổ sung báo cáo
       are_you_sure: Bạn có chắc không?
       assign_to_self: Giao cho tôi
@@ -562,7 +583,7 @@ vi:
         none: Không có mô tả
       comment_description_html: 'Để cung cấp thêm thông tin, %{name} cho biết:'
       created_at: Báo cáo lúc
-      delete_and_resolve: Xóa và giải quyết
+      delete_and_resolve: Xóa tút
       forwarded: Chuyển tiếp
       forwarded_to: Chuyển tiếp tới %{domain}
       mark_as_resolved: Đã xử lý xong!
@@ -576,12 +597,14 @@ vi:
         placeholder: Mô tả vi phạm của người này, mức độ xử lý và những cập nhật liên quan khác...
         title: Ghi chú
       notes_description_html: Xem và để lại ghi chú cho các kiểm duyệt viên khác
+      quick_actions_description_html: 'Kiểm duyệt nhanh hoặc kéo xuống để xem nội dung bị báo cáo:'
       reopen: Mở lại báo cáo
       report: 'Báo cáo #%{id}'
       reported_account: Tài khoản bị báo cáo
       reported_by: Báo cáo bởi
       resolved: Đã xử lý xong
       resolved_msg: Đã xử lý báo cáo xong!
+      skip_to_actions: Kiểm duyệt ngay
       status: Trạng thái
       statuses: Nội dung bị báo cáo
       statuses_description_html: Lý do tài khoản hoặc nội dung này bị báo cáo sẽ được trích dẫn trong giao tiếp với tài khoản báo cáo
@@ -625,7 +648,7 @@ vi:
         desc_html: Hiển thị trên trang chủ. Kích cỡ tối thiểu 600x100px. Mặc định dùng hình thu nhỏ của máy chủ
         title: Hình ảnh giới thiệu
       mascot:
-        desc_html: Hiển thị trên nhiều trang. Kích cỡ tối thiểu 293 x 205px. Mặc định dùng linh vật Mastodon
+        desc_html: Hiển thị trên nhiều trang. Kích cỡ tối thiểu 293 × 205px. Mặc định dùng linh vật Mastodon
         title: Logo máy chủ
       peers_api_enabled:
         desc_html: Tên miền mà máy chủ này đã kết giao trong mạng liên hợp
@@ -702,6 +725,16 @@ vi:
       no_status_selected: Bạn chưa chọn bất kỳ tút nào
       title: Toàn bộ tút
       with_media: Có media
+    strikes:
+      actions:
+        delete_statuses: "%{name} đã xóa tút của %{target}"
+        disable: "%{name} đã ẩn %{target}"
+        none: "%{name} đã gửi cảnh cáo %{target}"
+        sensitive: "%{name} đã đánh dấu người dùng %{target} là nhạy cảm"
+        silence: "%{name} đã ẩn %{target}"
+        suspend: "%{name} đã vô hiệu hóa %{target}"
+      appeal_approved: Đã khiếu nại
+      appeal_pending: Đang kháng cáo
     system_checks:
       database_schema_check:
         message_html: Có cơ sở dữ liệu đang chờ xử lý. Xin khởi động nó để ứng dụng có thể hoạt động một cách ổn định nhất
@@ -724,7 +757,9 @@ vi:
         disallow: Liên kết cấm
         disallow_provider: Nguồn đăng bị cấm
         shared_by_over_week:
-          other: Chia sẻ bởi %{count} người trong tuần rồi
+          one: Chia sẻ bởi một người trong tuần qua
+          other: Chia sẻ bởi %{count} người trong tuần qua
+          zero: Không ai chia sẻ trong tuần qua
         title: Liên kết đang là xu hướng
         usage_comparison: Chia sẻ %{today} lần hôm nay, so với %{yesterday} lần hôm qua
       pending_review: Đang chờ
@@ -752,7 +787,9 @@ vi:
         usable: Có thể dùng
         usage_comparison: Dùng %{today} lần hôm nay, so với %{yesterday} hôm qua
         used_by_over_week:
-          other: Dùng bởi %{count} người tuần rồi
+          one: Dùng bởi một người trong tuần qua
+          other: Dùng bởi %{count} người trong tuần qua
+          zero: Không ai dùng trong tuần qua
       title: Xu hướng
     warning_presets:
       add_new: Thêm mới
@@ -761,6 +798,17 @@ vi:
       empty: Bạn chưa thêm mẫu có sẵn nào cả.
       title: Quản lý mẫu cảnh cáo
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: xóa tút của họ
+        disable: hạn chế tài khoản của họ
+        none: một cảnh báo
+        sensitive: đánh dấu tài khoản của họ là nhạy cảm
+        silence: hạn chế tài khoản của họ
+        suspend: vô hiệu hóa tài khoản của họ
+      body: "%{target} đã khiếu nại quyết định kiểm duyệt từ %{action_taken_by} vào %{date}, vì %{type}. Họ cho biết:"
+      next_steps: Bạn có thể chấp nhận kháng cáo để hủy bỏ kiểm duyệt, hoặc bỏ qua.
+      subject: "%{username} đang khiếu nại quyết định kiểm duyệt trên %{instance}"
     new_pending_account:
       body: Thông tin chi tiết của tài khoản mới ở phía dưới. Bạn có thể phê duyệt hoặc từ chối người này.
       subject: Tài khoản chờ xét duyệt trên %{instance} (%{username})
@@ -851,7 +899,6 @@ vi:
     status:
       account_status: Trạng thái tài khoản
       confirming: Đang chờ xác thực email.
-      functional: Tài khoản của bạn đã được xác thực.
       pending: Đơn đăng ký của bạn đang chờ phê duyệt. Điều này có thể mất một thời gian. Bạn sẽ nhận được email nếu đơn đăng ký của bạn được chấp thuận.
       redirecting_to: Tài khoản của bạn không hoạt động vì hiện đang chuyển hướng đến %{acct}.
     too_fast: Nghi vấn đăng ký spam, xin thử lại.
@@ -917,6 +964,32 @@ vi:
     directory: Khám phá
     explanation: Tìm những người chung sở thích
     explore_mastodon: Thành viên %{title}
+  disputes:
+    strikes:
+      action_taken: Hành động đã thực hiện
+      appeal: Khiếu nại
+      appeal_approved: Khiếu nại đã được chấp nhận và cảnh cáo không còn giá trị
+      appeal_rejected: Khiếu nại bị từ chối
+      appeal_submitted_at: Đã gửi khiếu nại
+      appealed_msg: Khiếu nại của bạn đã được gửi đi. Nếu nó được chấp nhận, bạn sẽ nhận được thông báo.
+      appeals:
+        submit: Gửi khiếu nại
+      associated_report: Báo cáo đính kèm
+      created_at: Ngày
+      recipient: Người nhận
+      status: 'Tút #%{id}'
+      status_removed: Tút này đã được xóa khỏi hệ thống
+      title: "%{action} từ %{date}"
+      title_actions:
+        delete_statuses: Xóa tút
+        disable: Đóng băng tài khoản
+        none: Cảnh cáo
+        sensitive: Đánh dấu nhạy cảm
+        silence: Hạn chế tài khoản
+        suspend: Vô hiệu hóa tài khoản
+      your_appeal_approved: Khiếu nại của bạn được chấp nhận
+      your_appeal_pending: Bạn đã gửi một khiếu nại
+      your_appeal_rejected: Khiếu nại của bạn bị từ chối
   domain_validator:
     invalid_domain: không phải là một tên miền hợp lệ
   errors:
@@ -1124,6 +1197,8 @@ vi:
       title: Lượt chia sẻ mới
     status:
       subject: Bài đăng mới từ %{name}
+    update:
+      subject: "%{name} đã sửa một tút"
   notifications:
     email_events: Email
     email_events_hint: 'Chọn những hoạt động sẽ gửi thông báo qua email:'
@@ -1435,6 +1510,15 @@ vi:
     recovery_instructions_html: Nếu bạn bị mất điện thoại, hãy dùng một trong các mã khôi phục bên dưới để lấy lại quyền truy cập vào tài khoản của mình. <strong>Giữ mã khôi phục an toàn</strong>. Ví dụ, bạn có thể in chúng ra giấy.
     webauthn: Khóa bảo mật
   user_mailer:
+    appeal_approved:
+      action: Đến trang cá nhân của bạn
+      explanation: Khiếu nại về tài khoản của bạn vào %{strike_date}, được gửi lúc %{appeal_date} đã được chấp nhận. Tài khoản của bạn đã có thể sử dụng bình thường.
+      subject: Khiếu nại của bạn từ %{date} đã được chấp nhận
+      title: Khiếu nại đã được chấp nhận
+    appeal_rejected:
+      explanation: Khiếu nại về tài khoản của bạn vào %{strike_date}, được gửi lúc %{appeal_date} đã bị từ chối.
+      subject: Khiếu nại của bạn từ %{date} đã bị từ chối
+      title: Khiếu nại bị từ chối
     backup_ready:
       explanation: Bạn đã yêu cầu sao lưu toàn bộ tài khoản Mastodon của mình. Bây giờ có thể tải về!
       subject: Dữ liệu cá nhân của bạn đã sẵn sàng để tải về
@@ -1446,6 +1530,8 @@ vi:
       subject: Xác nhận đăng nhập
       title: Đăng nhập
     warning:
+      appeal: Gửi khiếu nại
+      appeal_description: Nếu bạn nghĩ đây chỉ là nhầm lẫn, hãy gửi một khiếu nại cho %{instance}.
       categories:
         spam: Spam
         violation: Nội dung vi phạm quy tắc cộng đồng
@@ -1457,7 +1543,6 @@ vi:
         suspend: Bạn không còn có thể sử dụng tài khoản của bạn, hồ sơ và các dữ liệu khác không còn có thể truy cập được. Bạn vẫn có thể đăng nhập để yêu cầu sao lưu dữ liệu của mình cho đến khi dữ liệu bị xóa hoàn toàn trong khoảng 30 ngày, nhưng chúng tôi sẽ giữ lại một số dữ liệu cơ bản để ngăn bạn tránh bị đình chỉ.
       get_in_touch: Nếu bạn tin rằng đây là lỗi, bạn có thể trả lời e-mail này để liên lạc với các nhân viên của %{instance}.
       reason: 'Lý do:'
-      review_server_policies: Xem lại quy tắc của máy chủ
       statuses: 'Đây là những tút vi phạm:'
       subject:
         delete_statuses: Những tút %{acct} của bạn đã bị xóa bỏ
diff --git a/config/locales/zgh.yml b/config/locales/zgh.yml
index 898dd8da5..45f0d432d 100644
--- a/config/locales/zgh.yml
+++ b/config/locales/zgh.yml
@@ -22,8 +22,6 @@ zgh:
       group: ⵜⴰⵔⴰⴱⴱⵓⵜ
     unfollow: ⴽⴽⵙ ⴰⴹⴼⴼⵓⵕ
   admin:
-    account_moderation_notes:
-      delete: ⴽⴽⵙ
     accounts:
       change_email:
         label: ⵙⵏⴼⵍ ⵉⵎⴰⵢⵍ
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 33a15c126..b7a5a8ae5 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -88,7 +88,6 @@ zh-CN:
     account_moderation_notes:
       create: 新增记录
       created_msg: 管理记录已创建!
-      delete: 删除
       destroyed_msg: 管理记录删除成功!
     accounts:
       add_email_domain_block: 封禁电子邮箱域名
@@ -157,6 +156,11 @@ zh-CN:
       not_subscribed: 未订阅
       pending: 待审核
       perform_full_suspension: 封禁
+      previous_strikes: 既往处罚
+      previous_strikes_description_html:
+        one: 此帐号有<strong>1次</strong>处罚。
+        other: 此帐号有<strong>%{count}次</strong>处罚。
+        zero: 此帐号<strong>记录良好</strong>。
       promote: 升任
       protocol: 协议
       public: 公开页面
@@ -200,6 +204,7 @@ zh-CN:
       statuses: 嘟文
       strikes: 既往处罚
       subscribe: 订阅
+      suspend: 封禁
       suspended: 已封禁
       suspension_irreversible: 该帐号的数据已被不可逆转地删除。你可以取消暂停该帐号以使其可用,但它不会恢复以前拥有的任何数据。
       suspension_reversible_hint_html: 帐号已封禁,数据将在 %{date} 完全删除。 在此之前,帐号仍可恢复,并且没有任何不良影响。 如果你想立即移除该帐号的所有数据,可以在下面进行。
@@ -220,6 +225,7 @@ zh-CN:
       whitelisted: 允许跨站交互
     action_logs:
       action_types:
+        approve_appeal: 批准申诉
         approve_user: 批准用户
         assigned_to_self_report: 指派举报
         change_email_user: 为用户修改邮箱地址
@@ -251,6 +257,7 @@ zh-CN:
         enable_user: 启用用户
         memorialize_account: 将账户设为追悼模式
         promote_user: 给用户升任
+        reject_appeal: 驳回申诉
         reject_user: 拒绝用户
         remove_avatar_user: 移除头像
         reopen_report: 重开举报
@@ -269,6 +276,7 @@ zh-CN:
         update_domain_block: 更新域名屏蔽
         update_status: 更新嘟文
       actions:
+        approve_appeal_html: "%{name} 批准了 %{target} 对审核结果的申诉"
         approve_user_html: "%{name} 批准了用户 %{target} 的注册"
         assigned_to_self_report_html: "%{name} 接管了举报 %{target}"
         change_email_user_html: "%{name} 更改了用户 %{target} 的电子邮件地址"
@@ -300,6 +308,7 @@ zh-CN:
         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}"
@@ -379,9 +388,9 @@ zh-CN:
       new_users: 新用户
       opened_reports: 被发起的举报
       pending_reports_html:
-        other: "<strong>%{count}</strong> 个待处理请求"
+        other: "<strong>%{count}</strong> 个待处理举报"
       pending_tags_html:
-        other: "<strong>%{count}</strong> 个待处理标签"
+        other: "<strong>%{count}</strong> 个待处理话题标签"
       pending_users_html:
         other: "<strong>%{count}</strong> 个待处理用户"
       resolved_reports: 已解决的举报
@@ -392,6 +401,10 @@ zh-CN:
       top_languages: 最活跃的语言
       top_servers: 最活跃的服务器
       website: 网页端
+    disputes:
+      appeals:
+        empty: 没有发现申诉。
+        title: 申诉
     domain_allows:
       add_new: 允许和域名跨站交互
       created_msg: 域名已被允许跨站交互
@@ -430,7 +443,9 @@ zh-CN:
         suspend: 已封禁
       show:
         affected_accounts:
-          other: 将会影响到数据库中的 %{count} 个帐户
+          one: 数据库中的 1 个帐户受到影响
+          other: 数据库中的 %{count} 个帐户受到影响
+          zero: 数据库中没有帐户受到影响
         retroactive:
           silence: 对此域名的所有帐户解除隐藏
           suspend: 对此域名的所有帐户解除封禁
@@ -481,7 +496,9 @@ zh-CN:
       destroyed_msg: "%{domain} 中的数据现在正在排队等待被立刻删除。"
       empty: 暂无域名。
       known_accounts:
+        one: "%{count} 个已知帐户"
         other: "%{count} 个已知帐户"
+        zero: 没有已知账户
       moderation:
         all: 全部
         limited: 受限的
@@ -547,10 +564,12 @@ zh-CN:
       action_log: 审计日志
       action_taken_by: 操作执行者
       actions:
+        delete_description_html: 被举报的嘟文将被删除,同时该帐号将被标记一次处罚,以供未来同一帐号再次违规时参考。
         other_description_html: 查看控制该被举报帐号行为以及与其通信范围的更多选项。
+        resolve_description_html: 不会对被举报帐号采取任何动作,举报将被关闭,也不会留下处罚记录。
         silence_description_html: 只有关注或手工搜索此帐号才能查看其资料,将严重限制其触达范围。可随时撤销。
         suspend_description_html: 此帐号及其内容将无法访问,并最终被删除。也无法与该帐号交互。可在30天内撤销。
-      actions_description_html: 若移除上述违规内容仍力度不足:
+      actions_description_html: 决定采取何种措施处理此举报。如果对被举报帐号采取惩罚性措施,将向其发送一封电子邮件通知。但若选中<strong>垃圾信息</strong>类别则不会发送通知。
       add_to_report: 添加到报告
       are_you_sure: 你确定吗?
       assign_to_self: 接管
@@ -562,7 +581,7 @@ zh-CN:
         none: 没有
       comment_description_html: "%{name} 补充道:"
       created_at: 举报时间
-      delete_and_resolve: 删除并解决
+      delete_and_resolve: 删除嘟文
       forwarded: 已转发
       forwarded_to: 转发举报至 %{domain}
       mark_as_resolved: 标记为“已处理”
@@ -576,12 +595,14 @@ zh-CN:
         placeholder: 描述已经执行的操作,或其他任何相关的跟进情况…
         title: 备注
       notes_description_html: 查看备注或向其他监察员留言
+      quick_actions_description_html: 快捷选择操作或向下滚动以查看举报内容:
       reopen: 重开举报
       report: '举报 #%{id}'
       reported_account: 举报用户
       reported_by: 举报人
       resolved: 已处理
       resolved_msg: 举报处理成功!
+      skip_to_actions: 跳转到操作
       status: 状态
       statuses: 被举报内容
       statuses_description_html: 违规内容将在与该帐号的通信中被引用
@@ -702,6 +723,16 @@ zh-CN:
       no_status_selected: 因为没有嘟文被选中,所以没有更改
       title: 帐户嘟文
       with_media: 含有媒体文件
+    strikes:
+      actions:
+        delete_statuses: "%{name} 刪除了 %{target} 的嘟文"
+        disable: "%{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: 有待处理的数据库迁移。请运行它们以确保应用程序正常运行。
@@ -724,7 +755,9 @@ zh-CN:
         disallow: 不允许链接
         disallow_provider: 不允许发布者
         shared_by_over_week:
-          other: "%{count} 人在过去一周内分享"
+          one: 过去一周内被 1 个人分享过
+          other: 过去一周内被 %{count} 个人分享过
+          zero: 过去一周内未被分享过
         title: 热门链接
         usage_comparison: 今日被分享 %{today} 次,前一日为 %{yesterday} 次
       pending_review: 待审核
@@ -752,7 +785,9 @@ zh-CN:
         usable: 可以使用
         usage_comparison: 今日被使用 %{today} 次,前一日为 %{yesterday} 次
         used_by_over_week:
-          other: "%{count} 人在过去一周内使用过"
+          one: 过去一周内被 1 个人使用过
+          other: 过去一周内被 %{count} 个人使用过
+          zero: 过去一周内未被使用过
       title: 流行趋势
     warning_presets:
       add_new: 添加新条目
@@ -761,6 +796,17 @@ zh-CN:
       empty: 你尚未定义任何警告预设。
       title: 管理预设警告
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: 删除其嘟文
+        disable: 冻结其帐号
+        none: 警告
+        sensitive: 标记其帐号为敏感内容
+        silence: 限制其帐号
+        suspend: 停用其帐号
+      body: "%{target} 对 %{action_taken_by} 于 %{date} 做出的 %{type} 审核结果提出申诉,写道:"
+      next_steps: 你可以批准此申诉并撤销该审核结果,也可以忽略此申诉。
+      subject: "%{username} 对 %{instance} 的审核结果提出了申诉"
     new_pending_account:
       body: 新帐户的详细信息如下。你可以批准或拒绝此申请。
       subject: 在 %{instance} 上有新帐号 ( %{username}) 需要审核
@@ -851,7 +897,6 @@ zh-CN:
     status:
       account_status: 帐户状态
       confirming: 等待电子邮件确认完成。
-      functional: 你的帐号可以正常使用了。
       pending: 工作人员正在审核你的申请。这需要花点时间。在申请被批准后,你将收到一封电子邮件。
       redirecting_to: 你的帐户无效,因为它已被设置为跳转到 %{acct}
     too_fast: 表单提交过快,请重试。
@@ -917,6 +962,32 @@ zh-CN:
     directory: 用户目录
     explanation: 根据兴趣发现用户
     explore_mastodon: 探索 %{title}
+  disputes:
+    strikes:
+      action_taken: 采取的措施
+      appeal: 申诉
+      appeal_approved: 此次处罚已申诉成功并不再生效
+      appeal_rejected: 此次申诉已被驳回
+      appeal_submitted_at: 申诉已提交
+      appealed_msg: 你的申诉已经提交。如果申诉通过,你将收到通知。
+      appeals:
+        submit: 提交申诉
+      associated_report: 相关举报
+      created_at: 日期
+      recipient: 发送至
+      status: '嘟文 #%{id}'
+      status_removed: 嘟文已从系统中删除
+      title: "%{action} 于 %{date}"
+      title_actions:
+        delete_statuses: 嘟文删除
+        disable: 帐号冻结
+        none: 警告
+        sensitive: 标记帐号为敏感内容
+        silence: 帐号限制
+        suspend: 帐号封禁
+      your_appeal_approved: 你的申诉已被批准
+      your_appeal_pending: 你已提交申诉
+      your_appeal_rejected: 你的申诉已被驳回
   domain_validator:
     invalid_domain: 不是一个有效的域名
   errors:
@@ -1124,6 +1195,8 @@ zh-CN:
       title: 新的转嘟
     status:
       subject: "%{name} 刚刚发嘟"
+    update:
+      subject: "%{name} 编辑了嘟文"
   notifications:
     email_events: 电子邮件通知事件
     email_events_hint: 选择你想要收到通知的事件:
@@ -1468,6 +1541,15 @@ zh-CN:
     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: 你的存档已经准备完毕
@@ -1479,6 +1561,8 @@ zh-CN:
       subject: 请确认登录请求:
       title: 登录请求
     warning:
+      appeal: 提交申诉
+      appeal_description: 如果你认为此结果有误,可以向 %{instance} 的工作人员提交申诉。
       categories:
         spam: 垃圾信息
         violation: 内容违反了以下社区准则
@@ -1490,7 +1574,6 @@ zh-CN:
         suspend: 你不能再使用你的帐户,并且你的个人资料和其他数据都将无法访问。在大约30天内,你仍可以登录并请求数据备份,之后相关数据将被完全删除。我们会保留一些基础数据以避免封禁失效。
       get_in_touch: 如果你认为此操作有误,可回复此邮件以与 %{instance} 的工作人员取得联系。
       reason: 理由:
-      review_server_policies: 查看服务器政策
       statuses: 被发现有违规行为的嘟文:
       subject:
         delete_statuses: 你在 %{acct} 的嘟文已被删除
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index b437c9b10..e1fad25c5 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -90,7 +90,6 @@ zh-HK:
     account_moderation_notes:
       create: 加入管理紀錄
       created_msg: 已新增管理紀錄
-      delete: 刪除
       destroyed_msg: 管理紀錄已被刪除
     accounts:
       add_email_domain_block: 封鎖電郵網域
@@ -403,8 +402,6 @@ zh-HK:
         silence: 已靜音
         suspend: 已停權
       show:
-        affected_accounts:
-          other: 將影響到資料庫中的 %{count} 個帳號
         retroactive:
           silence: 對此域名的所有帳號取消靜音
           suspend: 對此域名的所有帳號取消除名
@@ -452,8 +449,6 @@ zh-HK:
       delivery_error_days: 遞送失敗天數
       delivery_error_hint: 若 %{count} 天皆無法達成遞送,將會被自動標記為離線。
       empty: 找不到域名。
-      known_accounts:
-        other: "%{count} 已知的帳號"
       moderation:
         all: 全部
         limited: 限制
@@ -749,7 +744,6 @@ zh-HK:
     status:
       account_status: 帳戶文章
       confirming: 正在等待確認電郵地址。
-      functional: 你的帳戶可以正常使用。
       pending: 管理員正在處理你的申請。可能會需要一點時間處理。我們將會在申請被批準的時候馬上寄電郵給你。
       redirecting_to: 你的帳戶因為正在重新定向到 %{acct},所以暫時被停用。
     too_fast: 你太快遞交了,請再試一次。
@@ -1368,7 +1362,6 @@ zh-HK:
       subject: 請確認登入請求
       title: 登入請求
     warning:
-      review_server_policies: 審視伺服器政策
       subject:
         disable: 你的帳號 %{acct} 已經被涷結
         none: 警告帳號%{acct}
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 07eb97071..c0f633095 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -88,7 +88,6 @@ zh-TW:
     account_moderation_notes:
       create: 記錄
       created_msg: 已新增管理備忘!
-      delete: 刪除
       destroyed_msg: 成功刪除管理備忘!
     accounts:
       add_email_domain_block: 將電子郵件網域加入黑名單
@@ -157,6 +156,11 @@ zh-TW:
       not_subscribed: 未訂閱
       pending: 等待審核中
       perform_full_suspension: 停權
+      previous_strikes: 先前的警示
+      previous_strikes_description_html:
+        one: 此帳號已有 <strong>1</strong> 次警示。
+        other: 此帳號已有 <strong>%{count}</strong> 次警示。
+        zero: 此帳號<strong>信譽良好</strong>。
       promote: 晉級
       protocol: 協議
       public: 公開
@@ -198,8 +202,9 @@ zh-TW:
       silence: 靜音
       silenced: 已靜音
       statuses: 嘟文
-      strikes: 先前連續嘟文紀錄
+      strikes: 先前的警示
       subscribe: 訂閱
+      suspend: 停權
       suspended: 已停權
       suspension_irreversible: 已永久刪除這個帳戶的數據。雖然這個帳戶的數據已被永久刪除,但是您仍然可以取消暫停這個帳戶。
       suspension_reversible_hint_html: 這個帳戶已被暫停,所有數據將會在 %{date} 被刪除。在此之前,您可以完全回復您的帳戶。如果您想即時刪除這個帳戶的數據,您可以在下面進行操作。
@@ -220,6 +225,7 @@ zh-TW:
       whitelisted: 已加入白名單
     action_logs:
       action_types:
+        approve_appeal: 批准申訴
         approve_user: 批准使用者
         assigned_to_self_report: 指派回報
         change_email_user: 變更使用者的電子信箱地址
@@ -251,6 +257,7 @@ zh-TW:
         enable_user: 啓用帳戶
         memorialize_account: 設定成紀念帳戶
         promote_user: 把用戶升級
+        reject_appeal: 回絕申訴
         reject_user: 回絕使用者
         remove_avatar_user: 刪除大頭貼
         reopen_report: 重開舉報
@@ -269,6 +276,7 @@ zh-TW:
         update_domain_block: 更新封鎖網域
         update_status: 更新狀態
       actions:
+        approve_appeal_html: "%{name} 批准了來自 %{target} 的審核決定上訴"
         approve_user_html: "%{name} 批准了從 %{target} 而來的註冊"
         assigned_to_self_report_html: "%{name} 將報告 %{target} 指派給自己"
         change_email_user_html: "%{name} 變更了使用者 %{target} 的電子信箱地址"
@@ -300,6 +308,7 @@ zh-TW:
         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} 的檢舉"
@@ -378,8 +387,10 @@ zh-TW:
       media_storage: 媒體儲存空間
       new_users: 新使用者
       opened_reports: 已開啟的報告
+      pending_appeals_html:
+        other: "<strong>%{count}</strong> 個待處理申訴"
       pending_reports_html:
-        other: "<strong>%{count}</strong> 份待處理報告"
+        other: "<strong>%{count}</strong> 份待處理回報"
       pending_tags_html:
         other: "<strong>%{count}</strong> 個待處理主題標籤"
       pending_users_html:
@@ -392,6 +403,10 @@ zh-TW:
       top_languages: 最活躍語言
       top_servers: 最活躍伺服器
       website: 網站
+    disputes:
+      appeals:
+        empty: 找不到申訴。
+        title: 申訴
     domain_allows:
       add_new: 將網域加入白名單
       created_msg: 網域已成功加入白名單
@@ -430,7 +445,9 @@ zh-TW:
         suspend: 已停權
       show:
         affected_accounts:
-          other: 將影響到資料庫中的 %{count} 個帳戶
+          one: 資料庫中的 1 個帳號受到影響
+          other: 資料庫中的 %{count} 個帳號受到影響
+          zero: 沒有影響到資料庫中的帳號
         retroactive:
           silence: 對此站點的所有使用者取消靜音
           suspend: 對此站點的所有使用者取消停權
@@ -483,7 +500,9 @@ zh-TW:
       destroyed_msg: 來自 %{domain} 的資料現在正在佇列中等待刪除。
       empty: 找不到網域
       known_accounts:
-        other: "%{count} 已知的帳戶"
+        one: "%{count} 個已知帳號"
+        other: "%{count} 個已知帳號"
+        zero: 沒有已知帳號
       moderation:
         all: 全部
         limited: 限制
@@ -549,10 +568,12 @@ zh-TW:
       action_log: 審計日誌
       action_taken_by: 操作執行者
       actions:
+        delete_description_html: 被檢舉的嘟文將被刪除,並且會被以刪除線標記,幫助您升級同一帳號未來的違規行為。
         other_description_html: 檢視更多控制帳號行為以及自訂檢舉帳號通知之選項。
+        resolve_description_html: 被檢舉的帳號將不被採取任何行動,不會加以刪除線標記,並且此份報告將被關閉。
         silence_description_html: 個人頁面僅會對已跟隨帳號之使用者或手動查詢可見,將大幅度限制觸及範圍。此設定可隨時被還原。
         suspend_description_html: 個人頁面及其內容將無法被存取,直到其最終被刪除。將無法與此帳號互動。此設定 30 日內可被還原。
-      actions_description_html: 若移除以上侵犯性違規內容不足成效:
+      actions_description_html: 決定應對此報告採取何種行動。若您對檢舉之帳號採取懲罰措施,則將對他們發送 e-mail 通知,如非選擇了 <strong>垃圾郵件</strong> 類別。
       add_to_report: 加入更多至報告
       are_you_sure: 你確定嗎?
       assign_to_self: 指派給自己
@@ -564,7 +585,7 @@ zh-TW:
         none: 無
       comment_description_html: 提供更多資訊,%{name} 寫道:
       created_at: 日期
-      delete_and_resolve: 刪除與解決
+      delete_and_resolve: 刪除嘟文
       forwarded: 已轉寄
       forwarded_to: 轉寄到 %{domain}
       mark_as_resolved: 標記為「已解決」
@@ -578,12 +599,14 @@ zh-TW:
         placeholder: 記錄已執行的動作,或其他相關的更新...
         title: 註記
       notes_description_html: 檢視及留下些給其他管理員和未來的自己的註記
+      quick_actions_description_html: 採取一個快速行動,或者下捲以檢視檢舉內容:
       reopen: 重開檢舉
       report: '檢舉 #%{id}'
       reported_account: 被檢舉使用者
       reported_by: 檢舉人
       resolved: 已解決
       resolved_msg: 檢舉已處理!
+      skip_to_actions: 跳過行動
       status: 嘟文
       statuses: 被檢舉的內容
       statuses_description_html: 侵犯性違規內容會被引用在檢舉帳號通知中
@@ -704,6 +727,16 @@ zh-TW:
       no_status_selected: 因未選擇嘟文而未變更。
       title: 帳戶嘟文
       with_media: 含有媒體檔案
+    strikes:
+      actions:
+        delete_statuses: "%{name} 刪除了 %{target} 的貼文"
+        disable: "%{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: 有挂起的数据库迁移,请运行它们以确保应用程序按照预期运行。
@@ -726,7 +759,9 @@ zh-TW:
         disallow: 不允許連結
         disallow_provider: 不允許發行者
         shared_by_over_week:
-          other: 於過去一週被 %{count} 人分享
+          one: 上週由 1 個人分享
+          other: 上週由 %{count} 個人分享
+          zero: 上週無人分享
         title: 熱門連結
         usage_comparison: 於今日被 %{today} 人分享,相較於昨日 %{yesterday} 人
       pending_review: 等待審核中
@@ -754,7 +789,9 @@ zh-TW:
         usable: 可被使用
         usage_comparison: 於今日被使用 %{today} 次,相較於昨日 %{yesterday} 次
         used_by_over_week:
-          other: 於過去一週被 %{count} 人使用
+          one: 上週被 1 個人使用
+          other: 上週被 %{count} 個人使用
+          zero: 上週無人使用
       title: 熱門榜
     warning_presets:
       add_new: 新增
@@ -763,6 +800,17 @@ zh-TW:
       empty: 您未曾定義任何預設警告
       title: 管理預設警告
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: 要刪除他們的嘟文
+        disable: 要凍結他們的帳號
+        none: 警告
+        sensitive: 要將他們的帳號標記為含有敏感內容
+        silence: 要限制他們的帳號
+        suspend: 要停權他們的帳號
+      body: "%{target} 正在就 %{date} 的 %{action_taken_by} 做出的審核決定提出上訴,該決定是 %{type}。他們寫道:"
+      next_steps: 您可以批准申訴以還原審核決定,或是忽略它。
+      subject: "%{username} 正在申訴 %{instance} 上的審核決定"
     new_pending_account:
       body: 以下是新帳戶的詳細資訊。您可以同意或拒絕這項申請。
       subject: "%{instance} 上有新帳戶 (%{username}) 待審核"
@@ -853,7 +901,6 @@ zh-TW:
     status:
       account_status: 帳戶狀態
       confirming: 等待電子郵件確認完成。
-      functional: 您的帳戶可以正常使用了。
       pending: 管管們正在處理您的申請,這可能需要一點時間處理。我們將在申請通過後以電子郵件方式通知您。
       redirecting_to: 您的帳戶因目前重新導向至 %{acct} 而被停用。
     too_fast: 送出表單的速度太快跟不上,請稍後再試。
@@ -919,6 +966,32 @@ zh-TW:
     directory: 個人資料目錄
     explanation: 根據興趣去發現新朋友
     explore_mastodon: 探索%{title}
+  disputes:
+    strikes:
+      action_taken: 採取的行動
+      appeal: 申訴
+      appeal_approved: 此警示已成功申訴,不再有效
+      appeal_rejected: 申訴已被回絕
+      appeal_submitted_at: 申訴已遞交
+      appealed_msg: 您的申訴已遞交。若其被批准,您將會被通知。
+      appeals:
+        submit: 遞交申訴
+      associated_report: 相關報告
+      created_at: 過時的
+      recipient: 此致
+      status: '嘟文編號 #%{id}'
+      status_removed: 嘟文已從系統中移除
+      title: "%{action} 來自 %{date}"
+      title_actions:
+        delete_statuses: 嘟文移除
+        disable: 凍結帳號
+        none: 警告
+        sensitive: 標記為敏感帳號
+        silence: 帳號限制
+        suspend: 帳號停權
+      your_appeal_approved: 您的申訴已被批准
+      your_appeal_pending: 您已遞交申訴
+      your_appeal_rejected: 您的申訴已被回絕
   domain_validator:
     invalid_domain: 並非一個有效域名
   errors:
@@ -1126,6 +1199,8 @@ zh-TW:
       title: 新的轉嘟
     status:
       subject: "%{name} 剛剛嘟文"
+    update:
+      subject: "%{name} 編輯了貼文"
   notifications:
     email_events: 電子郵件通知設定
     email_events_hint: 選取你想接收通知的事件:
@@ -1468,6 +1543,15 @@ zh-TW:
     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: 你的備份檔已可供下載
@@ -1479,6 +1563,8 @@ zh-TW:
       subject: 請確認登入嘗試
       title: 登入嘗試
     warning:
+      appeal: 遞交申訴
+      appeal_description: 若您認為這是錯誤,您可以向 %{instance} 的工作人員提出申訴。
       categories:
         spam: 垃圾訊息
         violation: 該內容違反以下社群規章
@@ -1490,7 +1576,6 @@ zh-TW:
         suspend: 您將不能使用您的帳號,您的個人資料頁面及其他資料將不再能被存取。您仍可於約 30 日內資料被完全刪除前要求下載你的資料,但我們仍會保留一部份基本資料,以防止有人規避停權處罰。
       get_in_touch: 如果您認為這是個錯誤,您可回復這封 e-mail 來連繫 %{instance} 的管理員。
       reason: 原因:
-      review_server_policies: 檢視伺服器政策
       statuses: 被判定違規之嘟文:
       subject:
         delete_statuses: 您於 %{acct} 之嘟文已被移除
diff --git a/config/navigation.rb b/config/navigation.rb
index a5590d2ea..a85670500 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -26,7 +26,7 @@ SimpleNavigation::Configuration.run do |navigation|
     n.item :statuses_cleanup, safe_join([fa_icon('history fw'), t('settings.statuses_cleanup')]), statuses_cleanup_url, if: -> { current_user.functional? }
 
     n.item :security, safe_join([fa_icon('lock fw'), t('settings.account')]), edit_user_registration_url do |s|
-      s.item :password, safe_join([fa_icon('lock fw'), t('settings.account_settings')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete|/settings/migration|/settings/aliases|/settings/login_activities}
+      s.item :password, safe_join([fa_icon('lock fw'), t('settings.account_settings')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete|/settings/migration|/settings/aliases|/settings/login_activities|^/disputes}
       s.item :two_factor_authentication, safe_join([fa_icon('mobile fw'), t('settings.two_factor_authentication')]), settings_two_factor_authentication_methods_url, highlights_on: %r{/settings/two_factor_authentication|/settings/otp_authentication|/settings/security_keys}
       s.item :authorized_apps, safe_join([fa_icon('list fw'), t('settings.authorized_apps')]), oauth_authorized_applications_url
     end
@@ -47,7 +47,7 @@ SimpleNavigation::Configuration.run do |navigation|
     n.item :moderation, safe_join([fa_icon('gavel fw'), t('moderation.title')]), admin_reports_url, if: proc { current_user.staff? } do |s|
       s.item :action_logs, safe_join([fa_icon('bars fw'), t('admin.action_logs.title')]), admin_action_logs_url
       s.item :reports, safe_join([fa_icon('flag fw'), t('admin.reports.title')]), admin_reports_url, highlights_on: %r{/admin/reports}
-      s.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_url(origin: 'local'), highlights_on: %r{/admin/accounts|/admin/pending_accounts}
+      s.item :accounts, safe_join([fa_icon('users fw'), t('admin.accounts.title')]), admin_accounts_url(origin: 'local'), highlights_on: %r{/admin/accounts|/admin/pending_accounts|/admin/disputes}
       s.item :invites, safe_join([fa_icon('user-plus fw'), t('admin.invites.title')]), admin_invites_path
       s.item :follow_recommendations, safe_join([fa_icon('user-plus fw'), t('admin.follow_recommendations.title')]), admin_follow_recommendations_path, highlights_on: %r{/admin/follow_recommendations}
       s.item :instances, safe_join([fa_icon('cloud fw'), t('admin.instances.title')]), admin_instances_url(limited: whitelist_mode? ? nil : '1'), highlights_on: %r{/admin/instances|/admin/domain_blocks|/admin/domain_allows}, if: -> { current_user.admin? }
diff --git a/config/routes.rb b/config/routes.rb
index 0eb7f1b0f..a138fcbcc 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -167,6 +167,12 @@ Rails.application.routes.draw do
     resources :login_activities, only: [:index]
   end
 
+  namespace :disputes do
+    resources :strikes, only: [:show] do
+      resource :appeal, only: [:create]
+    end
+  end
+
   resources :media, only: [:show] do
     get :player
   end
@@ -327,6 +333,15 @@ Rails.application.routes.draw do
         end
       end
     end
+
+    namespace :disputes do
+      resources :appeals, only: [:index] do
+        member do
+          post :approve
+          post :reject
+        end
+      end
+    end
   end
 
   get '/admin', to: redirect('/admin/dashboard', status: 302)
diff --git a/config/settings.yml b/config/settings.yml
index 7d192f369..d0946a668 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -52,6 +52,7 @@ defaults: &defaults
     report: true
     pending_account: true
     trending_tag: true
+    appeal: true
   interactions:
     must_be_follower: false
     must_be_following: false
diff --git a/db/migrate/20170920032311_fix_reblogs_in_feeds.rb b/db/migrate/20170920032311_fix_reblogs_in_feeds.rb
index 5654bf6f8..bcd4b9137 100644
--- a/db/migrate/20170920032311_fix_reblogs_in_feeds.rb
+++ b/db/migrate/20170920032311_fix_reblogs_in_feeds.rb
@@ -15,7 +15,7 @@ class FixReblogsInFeeds < ActiveRecord::Migration[5.1]
     # feed, with an entry in a reblog tracking zset (where the score
     # is once again set to the reblogging status' ID, and the value
     # is set to the reblogged status' ID). This is safe for Redis'
-    # float coersion because in this reblog tracking zset, we only
+    # float conversion because in this reblog tracking zset, we only
     # need the rebloggging status' ID to be able to stop tracking
     # entries after they have gotten too far down the feed, which
     # does not require an exact value.
diff --git a/db/migrate/20220124141035_create_appeals.rb b/db/migrate/20220124141035_create_appeals.rb
new file mode 100644
index 000000000..afb3efbd5
--- /dev/null
+++ b/db/migrate/20220124141035_create_appeals.rb
@@ -0,0 +1,14 @@
+class CreateAppeals < ActiveRecord::Migration[6.1]
+  def change
+    create_table :appeals do |t|
+      t.belongs_to :account, null: false, foreign_key: { on_delete: :cascade }
+      t.belongs_to :account_warning, null: false, foreign_key: { on_delete: :cascade }, index: { unique: true }
+      t.text :text, null: false, default: ''
+      t.datetime :approved_at
+      t.belongs_to :approved_by_account, foreign_key: { to_table: :accounts, on_delete: :nullify }
+      t.datetime :rejected_at
+      t.belongs_to :rejected_by_account, foreign_key: { to_table: :accounts, on_delete: :nullify }
+      t.timestamps
+    end
+  end
+end
diff --git a/db/migrate/20220210153119_add_overruled_at_to_account_warnings.rb b/db/migrate/20220210153119_add_overruled_at_to_account_warnings.rb
new file mode 100644
index 000000000..a082da774
--- /dev/null
+++ b/db/migrate/20220210153119_add_overruled_at_to_account_warnings.rb
@@ -0,0 +1,5 @@
+class AddOverruledAtToAccountWarnings < ActiveRecord::Migration[6.1]
+  def change
+    add_column :account_warnings, :overruled_at, :datetime
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 252373a7c..e27e04b71 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2022_02_09_175231) do
+ActiveRecord::Schema.define(version: 2022_02_10_153119) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -135,6 +135,7 @@ ActiveRecord::Schema.define(version: 2022_02_09_175231) do
     t.datetime "updated_at", null: false
     t.bigint "report_id"
     t.string "status_ids", array: true
+    t.datetime "overruled_at"
     t.index ["account_id"], name: "index_account_warnings_on_account_id"
     t.index ["target_account_id"], name: "index_account_warnings_on_target_account_id"
   end
@@ -243,6 +244,22 @@ ActiveRecord::Schema.define(version: 2022_02_09_175231) do
     t.bigint "status_ids", array: true
   end
 
+  create_table "appeals", force: :cascade do |t|
+    t.bigint "account_id", null: false
+    t.bigint "account_warning_id", null: false
+    t.text "text", default: "", null: false
+    t.datetime "approved_at"
+    t.bigint "approved_by_account_id"
+    t.datetime "rejected_at"
+    t.bigint "rejected_by_account_id"
+    t.datetime "created_at", precision: 6, null: false
+    t.datetime "updated_at", precision: 6, null: false
+    t.index ["account_id"], name: "index_appeals_on_account_id"
+    t.index ["account_warning_id"], name: "index_appeals_on_account_warning_id", unique: true
+    t.index ["approved_by_account_id"], name: "index_appeals_on_approved_by_account_id"
+    t.index ["rejected_by_account_id"], name: "index_appeals_on_rejected_by_account_id"
+  end
+
   create_table "backups", force: :cascade do |t|
     t.bigint "user_id"
     t.string "dump_file_name"
@@ -1034,6 +1051,10 @@ ActiveRecord::Schema.define(version: 2022_02_09_175231) do
   add_foreign_key "announcement_reactions", "accounts", on_delete: :cascade
   add_foreign_key "announcement_reactions", "announcements", on_delete: :cascade
   add_foreign_key "announcement_reactions", "custom_emojis", on_delete: :cascade
+  add_foreign_key "appeals", "account_warnings", on_delete: :cascade
+  add_foreign_key "appeals", "accounts", column: "approved_by_account_id", on_delete: :nullify
+  add_foreign_key "appeals", "accounts", column: "rejected_by_account_id", on_delete: :nullify
+  add_foreign_key "appeals", "accounts", on_delete: :cascade
   add_foreign_key "backups", "users", on_delete: :nullify
   add_foreign_key "blocks", "accounts", column: "target_account_id", name: "fk_9571bfabc1", on_delete: :cascade
   add_foreign_key "blocks", "accounts", name: "fk_4269e03e65", on_delete: :cascade
diff --git a/lib/mastodon/statuses_cli.rb b/lib/mastodon/statuses_cli.rb
index e273e2614..91b08813b 100644
--- a/lib/mastodon/statuses_cli.rb
+++ b/lib/mastodon/statuses_cli.rb
@@ -54,7 +54,7 @@ module Mastodon
 
       ActiveRecord::Base.connection.add_index(:media_attachments, :remote_url, name: :index_media_attachments_remote_url, where: 'remote_url is not null', algorithm: :concurrently, if_not_exists: true)
 
-      max_id   = Mastodon::Snowflake.id_at(options[:days].days.ago)
+      max_id   = Mastodon::Snowflake.id_at(options[:days].days.ago, with_random: false)
       start_at = Time.now.to_f
 
       unless options[:continue] && ActiveRecord::Base.connection.table_exists?('statuses_to_be_deleted')
diff --git a/lib/paperclip/transcoder.rb b/lib/paperclip/transcoder.rb
index ec1305038..afd9f58ff 100644
--- a/lib/paperclip/transcoder.rb
+++ b/lib/paperclip/transcoder.rb
@@ -13,6 +13,7 @@ module Paperclip
       @time                = options[:time] || 3
       @passthrough_options = options[:passthrough_options]
       @convert_options     = options[:convert_options].dup
+      @vfr_threshold       = options[:vfr_frame_rate_threshold]
     end
 
     def make
@@ -41,6 +42,11 @@ module Paperclip
       when 'mp4'
         @output_options['acodec'] = 'aac'
         @output_options['strict'] = 'experimental'
+
+        if high_vfr?(metadata) && !eligible_to_passthrough?(metadata)
+          @output_options['vsync'] = 'vfr'
+          @output_options['r'] = @vfr_threshold
+        end
       end
 
       command_arguments, interpolations = prepare_command(destination)
@@ -88,13 +94,21 @@ module Paperclip
     end
 
     def update_options_from_metadata(metadata)
-      return unless @passthrough_options && @passthrough_options[:video_codecs].include?(metadata.video_codec) && @passthrough_options[:audio_codecs].include?(metadata.audio_codec) && @passthrough_options[:colorspaces].include?(metadata.colorspace)
+      return unless eligible_to_passthrough?(metadata)
 
       @format          = @passthrough_options[:options][:format] || @format
       @time            = @passthrough_options[:options][:time]   || @time
       @convert_options = @passthrough_options[:options][:convert_options].dup
     end
 
+    def high_vfr?(metadata)
+      @vfr_threshold && metadata.r_frame_rate && metadata.r_frame_rate > @vfr_threshold
+    end
+
+    def eligible_to_passthrough?(metadata)
+      @passthrough_options && @passthrough_options[:video_codecs].include?(metadata.video_codec) && @passthrough_options[:audio_codecs].include?(metadata.audio_codec) && @passthrough_options[:colorspaces].include?(metadata.colorspace)
+    end
+
     def update_attachment_type(metadata)
       @attachment.instance.type = MediaAttachment.types[:gifv] unless metadata.audio_codec
     end
diff --git a/package.json b/package.json
index 4cb08e5d9..3f8f44ca4 100644
--- a/package.json
+++ b/package.json
@@ -62,12 +62,12 @@
   "private": true,
   "dependencies": {
     "@babel/core": "^7.17.2",
-    "@babel/plugin-proposal-decorators": "^7.17.0",
+    "@babel/plugin-proposal-decorators": "^7.17.2",
     "@babel/plugin-transform-react-inline-elements": "^7.16.7",
     "@babel/plugin-transform-runtime": "^7.17.0",
     "@babel/preset-env": "^7.16.11",
     "@babel/preset-react": "^7.16.7",
-    "@babel/runtime": "^7.17.0",
+    "@babel/runtime": "^7.17.2",
     "@gamestdio/websocket": "^0.3.2",
     "@github/webauthn-json": "^0.5.7",
     "@rails/ujs": "^6.1.4",
@@ -75,7 +75,7 @@
     "arrow-key-navigation": "^1.2.0",
     "atrament": "0.2.4",
     "autoprefixer": "^9.8.8",
-    "axios": "^0.25.0",
+    "axios": "^0.26.0",
     "babel-loader": "^8.2.3",
     "babel-plugin-lodash": "^3.3.4",
     "babel-plugin-preval": "^5.1.0",
@@ -90,7 +90,7 @@
     "css-loader": "^5.2.7",
     "cssnano": "^4.1.11",
     "detect-passive-events": "^2.0.3",
-    "dotenv": "^10.0.0",
+    "dotenv": "^16.0.0",
     "emoji-mart": "npm:emoji-mart-lazyload",
     "es6-symbol": "^3.1.3",
     "escape-html": "^1.0.3",
@@ -115,7 +115,7 @@
     "marky": "^1.2.2",
     "mini-css-extract-plugin": "^1.6.2",
     "mkdirp": "^1.0.4",
-    "npmlog": "^6.0.0",
+    "npmlog": "^6.0.1",
     "object-assign": "^4.1.1",
     "object-fit-images": "^3.2.3",
     "object.values": "^1.1.5",
@@ -178,7 +178,7 @@
     "@testing-library/jest-dom": "^5.16.2",
     "@testing-library/react": "^12.1.2",
     "babel-eslint": "^10.1.0",
-    "babel-jest": "^27.5.0",
+    "babel-jest": "^27.5.1",
     "eslint": "^7.32.0",
     "eslint-plugin-import": "~2.25.4",
     "eslint-plugin-jsx-a11y": "~6.5.1",
diff --git a/spec/controllers/admin/disputes/appeals_controller_spec.rb b/spec/controllers/admin/disputes/appeals_controller_spec.rb
new file mode 100644
index 000000000..6a06f9406
--- /dev/null
+++ b/spec/controllers/admin/disputes/appeals_controller_spec.rb
@@ -0,0 +1,53 @@
+require 'rails_helper'
+
+RSpec.describe Admin::Disputes::AppealsController, type: :controller do
+  render_views
+
+  before { sign_in current_user, scope: :user }
+
+  let(:target_account) { Fabricate(:account) }
+  let(:strike) { Fabricate(:account_warning, target_account: target_account, action: :suspend) }
+  let(:appeal) { Fabricate(:appeal, strike: strike, account: target_account) }
+
+  before do
+    target_account.suspend!
+  end
+
+  describe 'POST #approve' do
+    let(:current_user) { Fabricate(:user, admin: true) }
+
+    before do
+      allow(UserMailer).to receive(:appeal_approved).and_return(double('email', deliver_later: nil))
+      post :approve, params: { id: appeal.id }
+    end
+
+    it 'unsuspends a suspended account' do
+      expect(target_account.reload.suspended?).to be false
+    end
+
+    it 'redirects back to the strike page' do
+      expect(response).to redirect_to(disputes_strike_path(appeal.strike))
+    end
+
+    it 'notifies target account about approved appeal' do
+      expect(UserMailer).to have_received(:appeal_approved).with(target_account.user, appeal)
+    end
+  end
+
+  describe 'POST #reject' do
+    let(:current_user) { Fabricate(:user, admin: true) }
+
+    before do
+      allow(UserMailer).to receive(:appeal_rejected).and_return(double('email', deliver_later: nil))
+      post :reject, params: { id: appeal.id }
+    end
+
+    it 'redirects back to the strike page' do
+      expect(response).to redirect_to(disputes_strike_path(appeal.strike))
+    end
+
+    it 'notifies target account about rejected appeal' do
+      expect(UserMailer).to have_received(:appeal_rejected).with(target_account.user, appeal)
+    end
+  end
+end
diff --git a/spec/controllers/disputes/appeals_controller_spec.rb b/spec/controllers/disputes/appeals_controller_spec.rb
new file mode 100644
index 000000000..faa571fc9
--- /dev/null
+++ b/spec/controllers/disputes/appeals_controller_spec.rb
@@ -0,0 +1,27 @@
+require 'rails_helper'
+
+RSpec.describe Disputes::AppealsController, type: :controller do
+  render_views
+
+  before { sign_in current_user, scope: :user }
+
+  let!(:admin) { Fabricate(:user, admin: true) }
+
+  describe '#create' do
+    let(:current_user) { Fabricate(:user) }
+    let(:strike) { Fabricate(:account_warning, target_account: current_user.account) }
+
+    before do
+      allow(AdminMailer).to receive(:new_appeal).and_return(double('email', deliver_later: nil))
+      post :create, params: { strike_id: strike.id, appeal: { text: 'Foo' } }
+    end
+
+    it 'notifies staff about new appeal' do
+      expect(AdminMailer).to have_received(:new_appeal).with(admin.account, Appeal.last)
+    end
+
+    it 'redirects back to the strike page' do
+      expect(response).to redirect_to(disputes_strike_path(strike.id))
+    end
+  end
+end
diff --git a/spec/controllers/disputes/strikes_controller_spec.rb b/spec/controllers/disputes/strikes_controller_spec.rb
new file mode 100644
index 000000000..157f9ec3c
--- /dev/null
+++ b/spec/controllers/disputes/strikes_controller_spec.rb
@@ -0,0 +1,30 @@
+require 'rails_helper'
+
+RSpec.describe Disputes::StrikesController, type: :controller do
+  render_views
+
+  before { sign_in current_user, scope: :user }
+
+  describe '#show' do
+    let(:current_user) { Fabricate(:user) }
+    let(:strike) { Fabricate(:account_warning, target_account: current_user.account) }
+
+    before do
+      get :show, params: { id: strike.id }
+    end
+
+    context 'when meant for the user' do
+      it 'returns http success' do
+        expect(response).to have_http_status(:success)
+      end
+    end
+
+    context 'when meant for a different user' do
+      let(:strike) { Fabricate(:account_warning) }
+
+      it 'returns http forbidden' do
+        expect(response).to have_http_status(:forbidden)
+      end
+    end
+  end
+end
diff --git a/spec/controllers/settings/two_factor_authentication/otp_authentication_controller_spec.rb b/spec/controllers/settings/two_factor_authentication/otp_authentication_controller_spec.rb
index 17e8fa9b8..c8ba6f9a8 100644
--- a/spec/controllers/settings/two_factor_authentication/otp_authentication_controller_spec.rb
+++ b/spec/controllers/settings/two_factor_authentication/otp_authentication_controller_spec.rb
@@ -18,7 +18,7 @@ describe Settings::TwoFactorAuthentication::OtpAuthenticationController do
           user.update(otp_required_for_login: true)
         end
 
-        it 'redirects to two factor authentciation methods list page' do
+        it 'redirects to two factor authentication methods list page' do
           get :show
 
           expect(response).to redirect_to settings_two_factor_authentication_methods_path
diff --git a/spec/fabricators/account_warning_fabricator.rb b/spec/fabricators/account_warning_fabricator.rb
index db161d446..72fe835d9 100644
--- a/spec/fabricators/account_warning_fabricator.rb
+++ b/spec/fabricators/account_warning_fabricator.rb
@@ -1,5 +1,6 @@
 Fabricator(:account_warning) do
-  account        nil
-  target_account nil
-  text           "MyText"
+  account
+  target_account(fabricator: :account)
+  text { Faker::Lorem.paragraph }
+  action 'suspend'
 end
diff --git a/spec/fabricators/appeal_fabricator.rb b/spec/fabricators/appeal_fabricator.rb
new file mode 100644
index 000000000..339363822
--- /dev/null
+++ b/spec/fabricators/appeal_fabricator.rb
@@ -0,0 +1,5 @@
+Fabricator(:appeal) do
+  strike(fabricator: :account_warning)
+  account { |attrs| attrs[:strike].target_account }
+  text { Faker::Lorem.paragraph }
+end
diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb
index b93fcbe66..41806b258 100644
--- a/spec/lib/activitypub/activity/announce_spec.rb
+++ b/spec/lib/activitypub/activity/announce_spec.rb
@@ -113,26 +113,23 @@ RSpec.describe ActivityPub::Activity::Announce do
       let!(:relay_account) { Fabricate(:account, inbox_url: 'https://relay.example.com/inbox') }
       let!(:relay) { Fabricate(:relay, inbox_url: 'https://relay.example.com/inbox') }
 
+      let(:object_json) { 'https://example.com/actor/hello-world' }
+
       subject { described_class.new(json, sender, relayed_through_account: relay_account) }
 
+      before do
+        stub_request(:get, 'https://example.com/actor/hello-world').to_return(body: Oj.dump(unknown_object_json))
+      end
+
       context 'and the relay is enabled' do
         before do
           relay.update(state: :accepted)
           subject.perform
         end
 
-        let(:object_json) do
-          {
-            id: 'https://example.com/actor#bar',
-            type: 'Note',
-            content: 'Lorem ipsum',
-            to: 'http://example.com/followers',
-            attributedTo: 'https://example.com/actor',
-          }
-        end
-
-        it 'creates a reblog by sender of status' do
-          expect(sender.statuses.count).to eq 2
+        it 'fetches the remote status' do
+          expect(a_request(:get, 'https://example.com/actor/hello-world')).to have_been_made
+          expect(Status.find_by(uri: 'https://example.com/actor/hello-world').text).to eq 'Hello world'
         end
       end
 
@@ -141,14 +138,9 @@ RSpec.describe ActivityPub::Activity::Announce do
           subject.perform
         end
 
-        let(:object_json) do
-          {
-            id: 'https://example.com/actor#bar',
-            type: 'Note',
-            content: 'Lorem ipsum',
-            to: 'http://example.com/followers',
-            attributedTo: 'https://example.com/actor',
-          }
+        it 'does not fetch the remote status' do
+          expect(a_request(:get, 'https://example.com/actor/hello-world')).not_to have_been_made
+          expect(Status.find_by(uri: 'https://example.com/actor/hello-world')).to be_nil
         end
 
         it 'does not create anything' do
diff --git a/spec/mailers/previews/admin_mailer_preview.rb b/spec/mailers/previews/admin_mailer_preview.rb
index 75ffbbf40..9c0372b47 100644
--- a/spec/mailers/previews/admin_mailer_preview.rb
+++ b/spec/mailers/previews/admin_mailer_preview.rb
@@ -15,4 +15,9 @@ class AdminMailerPreview < ActionMailer::Preview
   def new_trending_links
     AdminMailer.new_trending_links(Account.first, PreviewCard.limit(3))
   end
+
+  # Preview this email at http://localhost:3000/rails/mailers/admin_mailer/new_appeal
+  def new_appeal
+    AdminMailer.new_appeal(Account.first, Appeal.first)
+  end
 end
diff --git a/spec/mailers/previews/user_mailer_preview.rb b/spec/mailers/previews/user_mailer_preview.rb
index 69b9b971e..8de7d8669 100644
--- a/spec/mailers/previews/user_mailer_preview.rb
+++ b/spec/mailers/previews/user_mailer_preview.rb
@@ -82,6 +82,11 @@ class UserMailerPreview < ActionMailer::Preview
     UserMailer.warning(User.first, AccountWarning.last)
   end
 
+  # Preview this email at http://localhost:3000/rails/mailers/user_mailer/appeal_approved
+  def appeal_approved
+    UserMailer.appeal_approved(User.first, Appeal.last)
+  end
+
   # Preview this email at http://localhost:3000/rails/mailers/user_mailer/sign_in_token
   def sign_in_token
     UserMailer.sign_in_token(User.first.tap { |user| user.generate_sign_in_token }, '127.0.0.1', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0', Time.now.utc)
diff --git a/spec/models/appeal_spec.rb b/spec/models/appeal_spec.rb
new file mode 100644
index 000000000..14062dc4f
--- /dev/null
+++ b/spec/models/appeal_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe Appeal, type: :model do
+  pending "add some examples to (or delete) #{__FILE__}"
+end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 406438c22..1645ab59e 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -89,6 +89,19 @@ RSpec.describe User, type: :model do
         expect(User.matches_email('specified')).to match_array([specified])
       end
     end
+
+    describe 'matches_ip' do
+      it 'returns a relation of users whose ip address is matching with the given CIDR' do
+        user1 = Fabricate(:user)
+        user2 = Fabricate(:user)
+        Fabricate(:session_activation, user: user1, ip: '2160:2160::22', session_id: '1')
+        Fabricate(:session_activation, user: user1, ip: '2160:2160::23', session_id: '2')
+        Fabricate(:session_activation, user: user2, ip: '2160:8888::24', session_id: '3')
+        Fabricate(:session_activation, user: user2, ip: '2160:8888::25', session_id: '4')
+
+        expect(User.matches_ip('2160:2160::/32')).to match_array([user1])
+      end
+    end
   end
 
   let(:account) { Fabricate(:account, username: 'alice') }
diff --git a/spec/models/web/push_subscription_spec.rb b/spec/models/web/push_subscription_spec.rb
index b44904369..bd5719593 100644
--- a/spec/models/web/push_subscription_spec.rb
+++ b/spec/models/web/push_subscription_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe Web::PushSubscription, type: :model do
       context "when notification is a #{type}" do
         let(:notification_type) { type }
 
-        it "returns boolean corresonding to alert setting" do
+        it "returns boolean corresponding to alert setting" do
           expect(subject.pushable?(notification)).to eq data[:alerts][type]
         end
       end
diff --git a/spec/services/block_domain_service_spec.rb b/spec/services/block_domain_service_spec.rb
index c689b57e3..242b02fff 100644
--- a/spec/services/block_domain_service_spec.rb
+++ b/spec/services/block_domain_service_spec.rb
@@ -66,7 +66,7 @@ RSpec.describe BlockDomainService, type: :service do
       expect(Account.find_remote('badguy', 'evil.org').silenced_at).to_not eq DomainBlock.find_by(domain: 'evil.org').created_at
     end
 
-    it 'leaves the domains status and attachements, but clears media' do
+    it 'leaves the domains status and attachments, but clears media' do
       expect { bad_status1.reload }.not_to raise_error
       expect { bad_status2.reload }.not_to raise_error
       expect { bad_attachment.reload }.not_to raise_error
diff --git a/spec/services/clear_domain_media_service_spec.rb b/spec/services/clear_domain_media_service_spec.rb
index 8e58c6039..45b92e2c9 100644
--- a/spec/services/clear_domain_media_service_spec.rb
+++ b/spec/services/clear_domain_media_service_spec.rb
@@ -13,7 +13,7 @@ RSpec.describe ClearDomainMediaService, type: :service do
       subject.call(DomainBlock.create!(domain: 'evil.org', severity: :silence, reject_media: true))
     end
 
-    it 'leaves the domains status and attachements, but clears media' do
+    it 'leaves the domains status and attachments, but clears media' do
       expect { bad_status1.reload }.not_to raise_error
       expect { bad_status2.reload }.not_to raise_error
       expect { bad_attachment.reload }.not_to raise_error
diff --git a/spec/services/delete_account_service_spec.rb b/spec/services/delete_account_service_spec.rb
index b1da97036..9c785fc17 100644
--- a/spec/services/delete_account_service_spec.rb
+++ b/spec/services/delete_account_service_spec.rb
@@ -90,7 +90,7 @@ RSpec.describe DeleteAccountService, type: :service do
       let!(:account) { Fabricate(:account, inbox_url: 'https://bob.com/inbox', protocol: :activitypub) }
       let!(:local_follower) { Fabricate(:account) }
 
-      it 'sends a reject follow to follwer inboxes' do
+      it 'sends a reject follow to follower inboxes' do
         subject.call
         expect(a_request(:post, account.inbox_url)).to have_been_made.once
       end
diff --git a/spec/validators/unreserved_username_validator_spec.rb b/spec/validators/unreserved_username_validator_spec.rb
index cabd6d386..746b3866c 100644
--- a/spec/validators/unreserved_username_validator_spec.rb
+++ b/spec/validators/unreserved_username_validator_spec.rb
@@ -27,7 +27,7 @@ RSpec.describe UnreservedUsernameValidator, type: :validator do
       context 'reserved_username?' do
         let(:reserved_username) { true }
 
-        it 'calls erros.add' do
+        it 'calls errors.add' do
           expect(errors).to have_received(:add).with(:username, :reserved)
         end
       end
@@ -35,7 +35,7 @@ RSpec.describe UnreservedUsernameValidator, type: :validator do
       context '!reserved_username?' do
         let(:reserved_username) { false }
 
-        it 'not calls erros.add' do
+        it 'not calls errors.add' do
           expect(errors).not_to have_received(:add).with(:username, any_args)
         end
       end
diff --git a/streaming/index.js b/streaming/index.js
index 2dbb546c0..3fdc9615e 100644
--- a/streaming/index.js
+++ b/streaming/index.js
@@ -92,13 +92,18 @@ const numWorkers = +process.env.STREAMING_CLUSTER_NUM || (env === 'development'
 
 /**
  * @param {string} json
+ * @param {any} req
  * @return {Object.<string, any>|null}
  */
-const parseJSON = (json) => {
+const parseJSON = (json, req) => {
   try {
     return JSON.parse(json);
   } catch (err) {
-    log.error(err);
+    if (req.accountId) {
+      log.warn(req.requestId, `Error parsing message from user ${req.accountId}: ${err}`);
+    } else {
+      log.silly(req.requestId, `Error parsing message from ${req.remoteAddress}: ${err}`);
+    }
     return null;
   }
 };
@@ -451,7 +456,7 @@ const startWorker = async (workerId) => {
    */
   const createSystemMessageListener = (req, eventHandlers) => {
     return message => {
-      const json = parseJSON(message);
+      const json = parseJSON(message, req);
 
       if (!json) return;
 
@@ -575,7 +580,7 @@ const startWorker = async (workerId) => {
     log.verbose(req.requestId, `Starting stream from ${ids.join(', ')} for ${accountId}`);
 
     const listener = message => {
-      const json = parseJSON(message);
+      const json = parseJSON(message, req);
 
       if (!json) return;
 
@@ -1059,7 +1064,7 @@ const startWorker = async (workerId) => {
     ws.on('error', onEnd);
 
     ws.on('message', data => {
-      const json = parseJSON(data);
+      const json = parseJSON(data, session.request);
 
       if (!json) return;
 
diff --git a/yarn.lock b/yarn.lock
index 41d6ec76e..e8d3f8043 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -91,7 +91,7 @@
     browserslist "^4.17.5"
     semver "^6.3.0"
 
-"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.0":
+"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.1":
   version "7.17.1"
   resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.1.tgz#9699f14a88833a7e055ce57dcd3ffdcd25186b21"
   integrity sha512-JBdSr/LtyYIno/pNnJ75lBcqc3Z1XXujzPanHqjvvrhOA+DTceTFuJi8XjmWTZh4r3fsdfqaCMN0iZemdkxZHQ==
@@ -329,12 +329,12 @@
     "@babel/helper-plugin-utils" "^7.16.7"
     "@babel/plugin-syntax-class-static-block" "^7.14.5"
 
-"@babel/plugin-proposal-decorators@^7.17.0":
-  version "7.17.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.0.tgz#fc0f689fe2535075056c587bc10c176fa9990443"
-  integrity sha512-JR8HTf3T1CsdMqfENrZ9pqncwsH4sPcvsyDLpvmv8iIbpDmeyBD7HPfGAIqkQph2j5d3B84hTm+m3qHPAedaPw==
+"@babel/plugin-proposal-decorators@^7.17.2":
+  version "7.17.2"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.2.tgz#c36372ddfe0360cac1ee331a238310bddca11493"
+  integrity sha512-WH8Z95CwTq/W8rFbMqb9p3hicpt4RX4f0K659ax2VHxgOyT6qQmUaEVEjIh4WR9Eh9NymkVn5vwsrE68fAQNUw==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.17.0"
+    "@babel/helper-create-class-features-plugin" "^7.17.1"
     "@babel/helper-plugin-utils" "^7.16.7"
     "@babel/helper-replace-supers" "^7.16.7"
     "@babel/plugin-syntax-decorators" "^7.17.0"
@@ -996,10 +996,10 @@
   dependencies:
     regenerator-runtime "^0.12.0"
 
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.0", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
-  version "7.17.0"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.0.tgz#b8d142fc0f7664fb3d9b5833fd40dcbab89276c0"
-  integrity sha512-etcO/ohMNaNA2UBdaXBBSX/3aEzFMRrVfaPv8Ptc0k+cWpWW0QFiGZ2XnVqQZI1Cf734LbPGmqBKWESfW4x/dQ==
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
+  version "7.17.2"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941"
+  integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==
   dependencies:
     regenerator-runtime "^0.13.4"
 
@@ -1317,27 +1317,6 @@
     jest-haste-map "^27.5.1"
     jest-runtime "^27.5.1"
 
-"@jest/transform@^27.5.0":
-  version "27.5.0"
-  resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.0.tgz#a4941e69ac51e8aa9a255ff4855b564c228c400b"
-  integrity sha512-yXUy/iO3TH1itxJ9BF7LLjuXt8TtgtjAl0PBQbUaCvRa+L0yYBob6uayW9dFRX/CDQweouLhvmXh44zRiaB+yA==
-  dependencies:
-    "@babel/core" "^7.1.0"
-    "@jest/types" "^27.5.0"
-    babel-plugin-istanbul "^6.1.1"
-    chalk "^4.0.0"
-    convert-source-map "^1.4.0"
-    fast-json-stable-stringify "^2.0.0"
-    graceful-fs "^4.2.9"
-    jest-haste-map "^27.5.0"
-    jest-regex-util "^27.5.0"
-    jest-util "^27.5.0"
-    micromatch "^4.0.4"
-    pirates "^4.0.4"
-    slash "^3.0.0"
-    source-map "^0.6.1"
-    write-file-atomic "^3.0.0"
-
 "@jest/transform@^27.5.1":
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409"
@@ -1369,18 +1348,7 @@
     "@types/yargs" "^15.0.0"
     chalk "^3.0.0"
 
-"@jest/types@^27.0.2", "@jest/types@^27.5.0":
-  version "27.5.0"
-  resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.0.tgz#6ad04a5c5355fd9f46e5cf761850e0edb3c209dd"
-  integrity sha512-oDHEp7gwSgA82RZ6pzUL3ugM2njP/lVB1MsxRZNOBk+CoNvh9SpH1lQixPFc/kDlV50v59csiW4HLixWmhmgPQ==
-  dependencies:
-    "@types/istanbul-lib-coverage" "^2.0.0"
-    "@types/istanbul-reports" "^3.0.0"
-    "@types/node" "*"
-    "@types/yargs" "^16.0.0"
-    chalk "^4.0.0"
-
-"@jest/types@^27.5.1":
+"@jest/types@^27.0.2", "@jest/types@^27.5.1":
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80"
   integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==
@@ -2115,10 +2083,10 @@ aproba@^1.1.1:
   resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz"
   integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
 
-are-we-there-yet@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz"
-  integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==
+are-we-there-yet@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz#ba20bd6b553e31d62fc8c31bd23d22b95734390d"
+  integrity sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==
   dependencies:
     delegates "^1.0.0"
     readable-stream "^3.6.0"
@@ -2307,12 +2275,12 @@ axe-core@^4.3.5:
   resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz"
   integrity sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==
 
-axios@^0.25.0:
-  version "0.25.0"
-  resolved "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz"
-  integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==
+axios@^0.26.0:
+  version "0.26.0"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.0.tgz#9a318f1c69ec108f8cd5f3c3d390366635e13928"
+  integrity sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==
   dependencies:
-    follow-redirects "^1.14.7"
+    follow-redirects "^1.14.8"
 
 axobject-query@^2.2.0:
   version "2.2.0"
@@ -2331,20 +2299,6 @@ babel-eslint@^10.1.0:
     eslint-visitor-keys "^1.0.0"
     resolve "^1.12.0"
 
-babel-jest@^27.5.0:
-  version "27.5.0"
-  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.0.tgz#c653985241af3c76f59d70d65a570860c2594a50"
-  integrity sha512-puhCyvBTNLevhbd1oyw6t3gWBicWoUARQYKCBB/B1moif17NbyhxbsfadqZIw8zfJJD+W7Vw0Nb20pEjLxkXqQ==
-  dependencies:
-    "@jest/transform" "^27.5.0"
-    "@jest/types" "^27.5.0"
-    "@types/babel__core" "^7.1.14"
-    babel-plugin-istanbul "^6.1.1"
-    babel-preset-jest "^27.5.0"
-    chalk "^4.0.0"
-    graceful-fs "^4.2.9"
-    slash "^3.0.0"
-
 babel-jest@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444"
@@ -2387,16 +2341,6 @@ babel-plugin-istanbul@^6.1.1:
     istanbul-lib-instrument "^5.0.4"
     test-exclude "^6.0.0"
 
-babel-plugin-jest-hoist@^27.5.0:
-  version "27.5.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.0.tgz#8fdf07835f2165a068de3ce95fd7749a89801b51"
-  integrity sha512-ztwNkHl+g1GaoQcb8f2BER4C3LMvSXuF7KVqtUioXQgScSEnkl6lLgCILUYIR+CPTwL8H3F/PNLze64HPWF9JA==
-  dependencies:
-    "@babel/template" "^7.3.3"
-    "@babel/types" "^7.3.3"
-    "@types/babel__core" "^7.0.0"
-    "@types/babel__traverse" "^7.0.6"
-
 babel-plugin-jest-hoist@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e"
@@ -2497,14 +2441,6 @@ babel-preset-current-node-syntax@^1.0.0:
     "@babel/plugin-syntax-optional-chaining" "^7.8.3"
     "@babel/plugin-syntax-top-level-await" "^7.8.3"
 
-babel-preset-jest@^27.5.0:
-  version "27.5.0"
-  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.0.tgz#4e308711c3d2ff1f45cf5d9a23646e37b621fc9f"
-  integrity sha512-7bfu1cJBlgK/nKfTvMlElzA3jpi6GzDWX3fntnyP2cQSzoi/KUz6ewGlcb3PSRYZGyv+uPnVHY0Im3JbsViqgA==
-  dependencies:
-    babel-plugin-jest-hoist "^27.5.0"
-    babel-preset-current-node-syntax "^1.0.0"
-
 babel-preset-jest@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81"
@@ -4016,10 +3952,10 @@ dot-prop@^5.2.0:
   dependencies:
     is-obj "^2.0.0"
 
-dotenv@^10.0.0:
-  version "10.0.0"
-  resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz"
-  integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==
+dotenv@^16.0.0:
+  version "16.0.0"
+  resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.0.tgz#c619001253be89ebb638d027b609c75c26e47411"
+  integrity sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==
 
 duplexer@^0.1.2:
   version "0.1.2"
@@ -4927,7 +4863,7 @@ flush-write-stream@^1.0.0:
     inherits "^2.0.3"
     readable-stream "^2.3.6"
 
-follow-redirects@^1.0.0, follow-redirects@^1.14.7:
+follow-redirects@^1.0.0, follow-redirects@^1.14.8:
   version "1.14.8"
   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc"
   integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==
@@ -6362,26 +6298,6 @@ jest-get-type@^27.5.1:
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1"
   integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==
 
-jest-haste-map@^27.5.0:
-  version "27.5.0"
-  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.0.tgz#7cc3a920caf304c89fbfceb5d5717b929873f175"
-  integrity sha512-0KfckSBEKV+D6e0toXmIj4zzp72EiBnvkC0L+xYxenkLhAdkp2/8tye4AgMzz7Fqb1r8SWtz7+s1UQLrxMBang==
-  dependencies:
-    "@jest/types" "^27.5.0"
-    "@types/graceful-fs" "^4.1.2"
-    "@types/node" "*"
-    anymatch "^3.0.3"
-    fb-watchman "^2.0.0"
-    graceful-fs "^4.2.9"
-    jest-regex-util "^27.5.0"
-    jest-serializer "^27.5.0"
-    jest-util "^27.5.0"
-    jest-worker "^27.5.0"
-    micromatch "^4.0.4"
-    walker "^1.0.7"
-  optionalDependencies:
-    fsevents "^2.3.2"
-
 jest-haste-map@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f"
@@ -6471,11 +6387,6 @@ jest-pnp-resolver@^1.2.2:
   resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz"
   integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==
 
-jest-regex-util@^27.5.0:
-  version "27.5.0"
-  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.0.tgz#26c26cf15a73edba13cb8930e261443d25ed8608"
-  integrity sha512-e9LqSd6HsDsqd7KS3rNyYwmQAaG9jq4U3LbnwVxN/y3nNlDzm2OFs596uo9zrUY+AV1opXq6ome78tRDUCRWfA==
-
 jest-regex-util@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95"
@@ -6561,14 +6472,6 @@ jest-runtime@^27.5.1:
     slash "^3.0.0"
     strip-bom "^4.0.0"
 
-jest-serializer@^27.5.0:
-  version "27.5.0"
-  resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.0.tgz#439a110df27f97a40c114a429b708c2ada15a81f"
-  integrity sha512-aSDFqQlVXtBH+Zb5dl9mCvTSFkabixk/9P9cpngL4yJKpmEi9USxfDhONFMzJrtftPvZw3PcltUVmtFZTB93rg==
-  dependencies:
-    "@types/node" "*"
-    graceful-fs "^4.2.9"
-
 jest-serializer@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64"
@@ -6605,18 +6508,6 @@ jest-snapshot@^27.5.1:
     pretty-format "^27.5.1"
     semver "^7.3.2"
 
-jest-util@^27.5.0:
-  version "27.5.0"
-  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.0.tgz#0b9540d91b0de65d288f235fa9899e6eeeab8d35"
-  integrity sha512-FUUqOx0gAzJy3ytatT1Ss372M1kmhczn8x7aE0++11oPGW1FyD/5NjYBI8w1KOXFm6IVjtaZm2szfJJL+CHs0g==
-  dependencies:
-    "@jest/types" "^27.5.0"
-    "@types/node" "*"
-    chalk "^4.0.0"
-    ci-info "^3.2.0"
-    graceful-fs "^4.2.9"
-    picomatch "^2.2.3"
-
 jest-util@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9"
@@ -6663,15 +6554,6 @@ jest-worker@^26.5.0:
     merge-stream "^2.0.0"
     supports-color "^7.0.0"
 
-jest-worker@^27.5.0:
-  version "27.5.0"
-  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.0.tgz#99ee77e4d06168107c27328bd7f54e74c3a48d59"
-  integrity sha512-8OEHiPNOPTfaWnJ2SUHM8fmgeGq37uuGsQBvGKQJl1f+6WIy6g7G3fE2ruI5294bUKUI9FaCWt5hDvO8HSwsSg==
-  dependencies:
-    "@types/node" "*"
-    merge-stream "^2.0.0"
-    supports-color "^8.0.0"
-
 jest-worker@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
@@ -7582,12 +7464,12 @@ npm-run-path@^4.0.1:
   dependencies:
     path-key "^3.0.0"
 
-npmlog@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.npmjs.org/npmlog/-/npmlog-6.0.0.tgz"
-  integrity sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q==
+npmlog@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.1.tgz#06f1344a174c06e8de9c6c70834cfba2964bba17"
+  integrity sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==
   dependencies:
-    are-we-there-yet "^2.0.0"
+    are-we-there-yet "^3.0.0"
     console-control-strings "^1.1.0"
     gauge "^4.0.0"
     set-blocking "^2.0.0"
@@ -10818,7 +10700,15 @@ urix@^0.1.0:
   resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz"
   integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
 
-url-parse@^1.4.3, url-parse@^1.5.3:
+url-parse@^1.4.3:
+  version "1.5.7"
+  resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.7.tgz#00780f60dbdae90181f51ed85fb24109422c932a"
+  integrity sha512-HxWkieX+STA38EDk7CE9MEryFeHCKzgagxlGvsdS7WBImq9Mk+PGwiT56w82WI3aicwJA8REp42Cxo98c8FZMA==
+  dependencies:
+    querystringify "^2.1.1"
+    requires-port "^1.0.0"
+
+url-parse@^1.5.3:
   version "1.5.4"
   resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz"
   integrity sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==