about summary refs log tree commit diff
diff options
context:
space:
mode:
authorStarfall <us@starfall.systems>2022-06-24 13:31:43 -0500
committerStarfall <us@starfall.systems>2022-06-24 13:31:43 -0500
commitd83f17f6763a1ffb3569eac73330cb09c557acea (patch)
tree92d392eed60a7d60bbd01e8544202db19a37e3d5
parentb9c901007b9a5772d2553a5770fa479954eec58f (diff)
parent63f79874b59b3ba28c0f940b9d36ea7aacb44c93 (diff)
Merge remote-tracking branch 'glitch/main'
-rw-r--r--.github/workflows/linter.yml71
-rw-r--r--.rubocop.yml3
-rw-r--r--Gemfile8
-rw-r--r--Gemfile.lock42
-rw-r--r--app/controllers/admin/webhooks/secrets_controller.rb19
-rw-r--r--app/controllers/admin/webhooks_controller.rb77
-rw-r--r--app/helpers/accounts_helper.rb16
-rw-r--r--app/helpers/application_helper.rb11
-rw-r--r--app/helpers/branding_helper.rb37
-rw-r--r--app/javascript/core/mailer.js4
-rw-r--r--app/javascript/flavours/glitch/components/icon_button.js4
-rw-r--r--app/javascript/flavours/glitch/styles/about.scss2
-rw-r--r--app/javascript/flavours/glitch/styles/accessibility.scss4
-rw-r--r--app/javascript/flavours/glitch/styles/admin.scss14
-rw-r--r--app/javascript/flavours/glitch/styles/basics.scss12
-rw-r--r--app/javascript/flavours/glitch/styles/branding.scss3
-rw-r--r--app/javascript/flavours/glitch/styles/components/announcements.scss2
-rw-r--r--app/javascript/flavours/glitch/styles/components/columns.scss3
-rw-r--r--app/javascript/flavours/glitch/styles/components/directory.scss4
-rw-r--r--app/javascript/flavours/glitch/styles/components/index.scss16
-rw-r--r--app/javascript/flavours/glitch/styles/components/single_column.scss4
-rw-r--r--app/javascript/flavours/glitch/styles/components/status.scss2
-rw-r--r--app/javascript/flavours/glitch/styles/containers.scss7
-rw-r--r--app/javascript/flavours/glitch/styles/contrast/variables.scss8
-rw-r--r--app/javascript/flavours/glitch/styles/dashboard.scss4
-rw-r--r--app/javascript/flavours/glitch/styles/footer.scss8
-rw-r--r--app/javascript/flavours/glitch/styles/forms.scss13
-rw-r--r--app/javascript/flavours/glitch/styles/index.scss1
-rw-r--r--app/javascript/flavours/glitch/styles/mastodon-light/variables.scss3
-rw-r--r--app/javascript/flavours/glitch/styles/statuses.scss6
-rw-r--r--app/javascript/flavours/glitch/styles/variables.scss4
-rw-r--r--app/javascript/icons/android-chrome-144x144.pngbin0 -> 6644 bytes
-rw-r--r--app/javascript/icons/android-chrome-192x192.pngbin0 -> 10138 bytes
-rw-r--r--app/javascript/icons/android-chrome-256x256.pngbin0 -> 14194 bytes
-rw-r--r--app/javascript/icons/android-chrome-36x36.pngbin0 -> 1050 bytes
-rw-r--r--app/javascript/icons/android-chrome-384x384.pngbin0 -> 25667 bytes
-rw-r--r--app/javascript/icons/android-chrome-48x48.pngbin0 -> 1468 bytes
-rw-r--r--app/javascript/icons/android-chrome-512x512.pngbin0 -> 39853 bytes
-rw-r--r--app/javascript/icons/android-chrome-72x72.pngbin0 -> 2501 bytes
-rw-r--r--app/javascript/icons/android-chrome-96x96.pngbin0 -> 3713 bytes
-rw-r--r--app/javascript/icons/apple-touch-icon-1024x1024.pngbin0 -> 104580 bytes
-rw-r--r--app/javascript/icons/apple-touch-icon-114x114.pngbin0 -> 4641 bytes
-rw-r--r--app/javascript/icons/apple-touch-icon-120x120.pngbin0 -> 4914 bytes
-rw-r--r--app/javascript/icons/apple-touch-icon-144x144.pngbin0 -> 6644 bytes
-rw-r--r--app/javascript/icons/apple-touch-icon-152x152.pngbin0 -> 7002 bytes
-rw-r--r--app/javascript/icons/apple-touch-icon-167x167.pngbin0 -> 8096 bytes
-rw-r--r--app/javascript/icons/apple-touch-icon-180x180.pngbin0 -> 8947 bytes
-rw-r--r--app/javascript/icons/apple-touch-icon-57x57.pngbin0 -> 1857 bytes
-rw-r--r--app/javascript/icons/apple-touch-icon-60x60.pngbin0 -> 1952 bytes
-rw-r--r--app/javascript/icons/apple-touch-icon-72x72.pngbin0 -> 2501 bytes
-rw-r--r--app/javascript/icons/apple-touch-icon-76x76.pngbin0 -> 2617 bytes
-rw-r--r--app/javascript/icons/favicon-16x16.pngbin0 -> 639 bytes
-rw-r--r--app/javascript/icons/favicon-32x32.pngbin0 -> 1250 bytes
-rw-r--r--app/javascript/icons/favicon-48x48.pngbin0 -> 1899 bytes
-rw-r--r--app/javascript/images/app-icon.svg28
-rw-r--r--app/javascript/images/icon_cached.svg2
-rw-r--r--app/javascript/images/icon_done.svg4
-rw-r--r--app/javascript/images/icon_email.svg4
-rw-r--r--app/javascript/images/icon_file_download.svg4
-rw-r--r--app/javascript/images/icon_flag.svg4
-rw-r--r--app/javascript/images/icon_grade.svg4
-rw-r--r--app/javascript/images/icon_lock_open.svg4
-rw-r--r--app/javascript/images/icon_person_add.svg4
-rw-r--r--app/javascript/images/icon_reply.svg4
-rw-r--r--app/javascript/images/icons/icon_cached.svg1
-rw-r--r--app/javascript/images/icons/icon_done.svg1
-rw-r--r--app/javascript/images/icons/icon_email.svg1
-rw-r--r--app/javascript/images/icons/icon_file_download.svg1
-rw-r--r--app/javascript/images/icons/icon_flag.svg1
-rw-r--r--app/javascript/images/icons/icon_grade.svg1
-rw-r--r--app/javascript/images/icons/icon_lock_open.svg1
-rw-r--r--app/javascript/images/icons/icon_person_add.svg1
-rw-r--r--app/javascript/images/icons/icon_reply.svg1
-rw-r--r--app/javascript/images/logo-symbol-icon.svg2
-rw-r--r--app/javascript/images/logo-symbol-wordmark.svg11
-rw-r--r--app/javascript/images/logo.svg11
-rw-r--r--app/javascript/images/logo_full.svg1
-rw-r--r--app/javascript/images/logo_transparent.svg1
-rw-r--r--app/javascript/images/logo_transparent_white.svg1
-rw-r--r--app/javascript/images/mailer/icon_cached.pngbin423 -> 2014 bytes
-rw-r--r--app/javascript/images/mailer/icon_done.pngbin253 -> 817 bytes
-rw-r--r--app/javascript/images/mailer/icon_email.pngbin387 -> 2120 bytes
-rw-r--r--app/javascript/images/mailer/icon_file_download.pngbin225 -> 813 bytes
-rw-r--r--app/javascript/images/mailer/icon_flag.pngbin0 -> 693 bytes
-rw-r--r--app/javascript/images/mailer/icon_grade.pngbin412 -> 3243 bytes
-rw-r--r--app/javascript/images/mailer/icon_lock_open.pngbin387 -> 2498 bytes
-rw-r--r--app/javascript/images/mailer/icon_person_add.pngbin376 -> 2356 bytes
-rw-r--r--app/javascript/images/mailer/icon_reply.pngbin319 -> 2146 bytes
-rw-r--r--app/javascript/images/mailer/icon_warning.pngbin371 -> 0 bytes
-rw-r--r--app/javascript/images/mailer/logo.pngbin0 -> 1673 bytes
-rw-r--r--app/javascript/images/mailer/logo_full.pngbin2371 -> 0 bytes
-rw-r--r--app/javascript/images/mailer/logo_transparent.pngbin506 -> 0 bytes
-rw-r--r--app/javascript/images/mailer/wordmark.pngbin0 -> 8991 bytes
-rw-r--r--app/javascript/images/preview.jpgbin292252 -> 0 bytes
-rw-r--r--app/javascript/images/preview.pngbin0 -> 514463 bytes
-rw-r--r--app/javascript/mastodon/features/ui/components/columns_area.js2
-rw-r--r--app/javascript/mastodon/locales/af.json2
-rw-r--r--app/javascript/mastodon/locales/ar.json10
-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.json22
-rw-r--r--app/javascript/mastodon/locales/ca.json2
-rw-r--r--app/javascript/mastodon/locales/ckb.json2
-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.json2
-rw-r--r--app/javascript/mastodon/locales/de.json14
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json4
-rw-r--r--app/javascript/mastodon/locales/el.json2
-rw-r--r--app/javascript/mastodon/locales/en-GB.json2
-rw-r--r--app/javascript/mastodon/locales/eo.json42
-rw-r--r--app/javascript/mastodon/locales/es-AR.json2
-rw-r--r--app/javascript/mastodon/locales/es-MX.json4
-rw-r--r--app/javascript/mastodon/locales/es.json2
-rw-r--r--app/javascript/mastodon/locales/et.json2
-rw-r--r--app/javascript/mastodon/locales/eu.json2
-rw-r--r--app/javascript/mastodon/locales/fa.json2
-rw-r--r--app/javascript/mastodon/locales/fi.json2
-rw-r--r--app/javascript/mastodon/locales/fr.json2
-rw-r--r--app/javascript/mastodon/locales/fy.json549
-rw-r--r--app/javascript/mastodon/locales/ga.json88
-rw-r--r--app/javascript/mastodon/locales/gd.json2
-rw-r--r--app/javascript/mastodon/locales/gl.json2
-rw-r--r--app/javascript/mastodon/locales/he.json156
-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.json2
-rw-r--r--app/javascript/mastodon/locales/hy.json2
-rw-r--r--app/javascript/mastodon/locales/id.json4
-rw-r--r--app/javascript/mastodon/locales/io.json12
-rw-r--r--app/javascript/mastodon/locales/is.json2
-rw-r--r--app/javascript/mastodon/locales/it.json2
-rw-r--r--app/javascript/mastodon/locales/ja.json4
-rw-r--r--app/javascript/mastodon/locales/ka.json2
-rw-r--r--app/javascript/mastodon/locales/kab.json2
-rw-r--r--app/javascript/mastodon/locales/kk.json2
-rw-r--r--app/javascript/mastodon/locales/kn.json2
-rw-r--r--app/javascript/mastodon/locales/ko.json2
-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.json42
-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.json18
-rw-r--r--app/javascript/mastodon/locales/pa.json2
-rw-r--r--app/javascript/mastodon/locales/pl.json2
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json4
-rw-r--r--app/javascript/mastodon/locales/pt-PT.json2
-rw-r--r--app/javascript/mastodon/locales/ro.json2
-rw-r--r--app/javascript/mastodon/locales/ru.json2
-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.json18
-rw-r--r--app/javascript/mastodon/locales/sq.json74
-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.json2
-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.json2
-rw-r--r--app/javascript/mastodon/locales/tr.json2
-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.json2
-rw-r--r--app/javascript/mastodon/locales/ur.json2
-rw-r--r--app/javascript/mastodon/locales/whitelist_fy.json2
-rw-r--r--app/javascript/mastodon/locales/zgh.json2
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json2
-rw-r--r--app/javascript/mastodon/locales/zh-HK.json2
-rw-r--r--app/javascript/styles/application.scss1
-rw-r--r--app/javascript/styles/contrast/variables.scss8
-rw-r--r--app/javascript/styles/mastodon-light/variables.scss5
-rw-r--r--app/javascript/styles/mastodon/about.scss2
-rw-r--r--app/javascript/styles/mastodon/admin.scss14
-rw-r--r--app/javascript/styles/mastodon/basics.scss12
-rw-r--r--app/javascript/styles/mastodon/branding.scss3
-rw-r--r--app/javascript/styles/mastodon/components.scss33
-rw-r--r--app/javascript/styles/mastodon/containers.scss7
-rw-r--r--app/javascript/styles/mastodon/dashboard.scss4
-rw-r--r--app/javascript/styles/mastodon/footer.scss8
-rw-r--r--app/javascript/styles/mastodon/forms.scss13
-rw-r--r--app/javascript/styles/mastodon/statuses.scss4
-rw-r--r--app/javascript/styles/mastodon/variables.scss4
-rw-r--r--app/models/admin/action_log.rb1
-rw-r--r--app/models/report.rb6
-rw-r--r--app/models/user.rb10
-rw-r--r--app/models/webhook.rb58
-rw-r--r--app/policies/webhook_policy.rb35
-rw-r--r--app/presenters/webhooks/event_presenter.rb13
-rw-r--r--app/serializers/manifest_serializer.rb57
-rw-r--r--app/serializers/rest/admin/report_serializer.rb3
-rw-r--r--app/serializers/rest/admin/webhook_event_serializer.rb26
-rw-r--r--app/serializers/rest/instance_serializer.rb2
-rw-r--r--app/services/base_service.rb4
-rw-r--r--app/services/webhook_service.rb22
-rw-r--r--app/validators/url_validator.rb2
-rw-r--r--app/views/about/more.html.haml2
-rw-r--r--app/views/about/show.html.haml4
-rw-r--r--app/views/accounts/show.rss.ruby2
-rw-r--r--app/views/admin/custom_emojis/_custom_emoji.html.haml2
-rw-r--r--app/views/admin/webhooks/_form.html.haml11
-rw-r--r--app/views/admin/webhooks/_webhook.html.haml19
-rw-r--r--app/views/admin/webhooks/edit.html.haml4
-rw-r--r--app/views/admin/webhooks/index.html.haml18
-rw-r--r--app/views/admin/webhooks/new.html.haml4
-rw-r--r--app/views/admin/webhooks/show.html.haml34
-rw-r--r--app/views/application/_sidebar.html.haml2
-rw-r--r--app/views/layouts/admin.html.haml9
-rwxr-xr-xapp/views/layouts/application.html.haml23
-rw-r--r--app/views/layouts/auth.html.haml2
-rw-r--r--app/views/layouts/embedded.html.haml4
-rw-r--r--app/views/layouts/mailer.html.haml4
-rw-r--r--app/views/layouts/public.html.haml4
-rw-r--r--app/views/shared/_og.html.haml2
-rw-r--r--app/views/tags/show.rss.ruby2
-rw-r--r--app/views/user_mailer/warning.html.haml2
-rw-r--r--app/workers/trigger_webhook_worker.rb12
-rw-r--r--app/workers/webhooks/delivery_worker.rb37
-rw-r--r--config/locales/activerecord.af.yml8
-rw-r--r--config/locales/activerecord.ast.yml10
-rw-r--r--config/locales/activerecord.ca.yml8
-rw-r--r--config/locales/activerecord.cs.yml8
-rw-r--r--config/locales/activerecord.da.yml8
-rw-r--r--config/locales/activerecord.de.yml8
-rw-r--r--config/locales/activerecord.en-GB.yml1
-rw-r--r--config/locales/activerecord.en.yml8
-rw-r--r--config/locales/activerecord.es-AR.yml8
-rw-r--r--config/locales/activerecord.es.yml8
-rw-r--r--config/locales/activerecord.fr.yml8
-rw-r--r--config/locales/activerecord.fy.yml24
-rw-r--r--config/locales/activerecord.gl.yml8
-rw-r--r--config/locales/activerecord.hu.yml8
-rw-r--r--config/locales/activerecord.io.yml8
-rw-r--r--config/locales/activerecord.it.yml8
-rw-r--r--config/locales/activerecord.ja.yml8
-rw-r--r--config/locales/activerecord.ku.yml8
-rw-r--r--config/locales/activerecord.lv.yml8
-rw-r--r--config/locales/activerecord.pl.yml8
-rw-r--r--config/locales/activerecord.pt-PT.yml8
-rw-r--r--config/locales/activerecord.ru.yml8
-rw-r--r--config/locales/activerecord.sl.yml8
-rw-r--r--config/locales/activerecord.sq.yml8
-rw-r--r--config/locales/activerecord.tr.yml8
-rw-r--r--config/locales/activerecord.uk.yml8
-rw-r--r--config/locales/activerecord.vi.yml8
-rw-r--r--config/locales/activerecord.zh-CN.yml4
-rw-r--r--config/locales/activerecord.zh-TW.yml8
-rw-r--r--config/locales/af.yml18
-rw-r--r--config/locales/ar.yml2
-rw-r--r--config/locales/ast.yml4
-rw-r--r--config/locales/bg.yml3
-rw-r--r--config/locales/bn.yml1
-rw-r--r--config/locales/br.yml5
-rw-r--r--config/locales/ca.yml24
-rw-r--r--config/locales/ckb.yml2
-rw-r--r--config/locales/co.yml2
-rw-r--r--config/locales/cs.yml56
-rw-r--r--config/locales/cy.yml2
-rw-r--r--config/locales/da.yml24
-rw-r--r--config/locales/de.yml73
-rw-r--r--config/locales/devise.fy.yml7
-rw-r--r--config/locales/doorkeeper.af.yml163
-rw-r--r--config/locales/doorkeeper.fy.yml23
-rw-r--r--config/locales/doorkeeper.pt-BR.yml17
-rw-r--r--config/locales/doorkeeper.ru.yml1
-rw-r--r--config/locales/el.yml10
-rw-r--r--config/locales/en.yml23
-rw-r--r--config/locales/eo.yml18
-rw-r--r--config/locales/es-AR.yml24
-rw-r--r--config/locales/es-MX.yml52
-rw-r--r--config/locales/es.yml24
-rw-r--r--config/locales/et.yml2
-rw-r--r--config/locales/eu.yml2
-rw-r--r--config/locales/fa.yml2
-rw-r--r--config/locales/fi.yml2
-rw-r--r--config/locales/fr.yml28
-rw-r--r--config/locales/fy.yml54
-rw-r--r--config/locales/gd.yml3
-rw-r--r--config/locales/gl.yml78
-rw-r--r--config/locales/he.yml12
-rw-r--r--config/locales/hr.yml2
-rw-r--r--config/locales/hu.yml24
-rw-r--r--config/locales/hy.yml2
-rw-r--r--config/locales/id.yml19
-rw-r--r--config/locales/io.yml24
-rw-r--r--config/locales/is.yml12
-rw-r--r--config/locales/it.yml24
-rw-r--r--config/locales/ja.yml96
-rw-r--r--config/locales/ka.yml1
-rw-r--r--config/locales/kab.yml1
-rw-r--r--config/locales/kk.yml2
-rw-r--r--config/locales/ko.yml101
-rw-r--r--config/locales/ku.yml24
-rw-r--r--config/locales/lt.yml1
-rw-r--r--config/locales/lv.yml31
-rw-r--r--config/locales/ml.yml1
-rw-r--r--config/locales/ms.yml1
-rw-r--r--config/locales/nl.yml3
-rw-r--r--config/locales/nn.yml2
-rw-r--r--config/locales/no.yml2
-rw-r--r--config/locales/oc.yml2
-rw-r--r--config/locales/pl.yml25
-rw-r--r--config/locales/pt-BR.yml11
-rw-r--r--config/locales/pt-PT.yml24
-rw-r--r--config/locales/ro.yml2
-rw-r--r--config/locales/ru.yml51
-rw-r--r--config/locales/sc.yml2
-rw-r--r--config/locales/simple_form.af.yml10
-rw-r--r--config/locales/simple_form.ca.yml6
-rw-r--r--config/locales/simple_form.cs.yml6
-rw-r--r--config/locales/simple_form.da.yml6
-rw-r--r--config/locales/simple_form.de.yml6
-rw-r--r--config/locales/simple_form.en-GB.yml1
-rw-r--r--config/locales/simple_form.en.yml6
-rw-r--r--config/locales/simple_form.es-AR.yml6
-rw-r--r--config/locales/simple_form.es-MX.yml2
-rw-r--r--config/locales/simple_form.es.yml6
-rw-r--r--config/locales/simple_form.fr.yml6
-rw-r--r--config/locales/simple_form.fy.yml6
-rw-r--r--config/locales/simple_form.gl.yml6
-rw-r--r--config/locales/simple_form.he.yml2
-rw-r--r--config/locales/simple_form.hu.yml6
-rw-r--r--config/locales/simple_form.io.yml6
-rw-r--r--config/locales/simple_form.it.yml6
-rw-r--r--config/locales/simple_form.ja.yml3
-rw-r--r--config/locales/simple_form.ko.yml6
-rw-r--r--config/locales/simple_form.ku.yml6
-rw-r--r--config/locales/simple_form.lv.yml6
-rw-r--r--config/locales/simple_form.pl.yml6
-rw-r--r--config/locales/simple_form.pt-PT.yml6
-rw-r--r--config/locales/simple_form.ru.yml6
-rw-r--r--config/locales/simple_form.sk.yml3
-rw-r--r--config/locales/simple_form.sl.yml6
-rw-r--r--config/locales/simple_form.sq.yml6
-rw-r--r--config/locales/simple_form.tr.yml6
-rw-r--r--config/locales/simple_form.uk.yml6
-rw-r--r--config/locales/simple_form.vi.yml6
-rw-r--r--config/locales/simple_form.zh-TW.yml6
-rw-r--r--config/locales/sk.yml3
-rw-r--r--config/locales/sl.yml21
-rw-r--r--config/locales/sq.yml111
-rw-r--r--config/locales/sr-Latn.yml1
-rw-r--r--config/locales/sr.yml1
-rw-r--r--config/locales/sv.yml2
-rw-r--r--config/locales/ta.yml1
-rw-r--r--config/locales/th.yml3
-rw-r--r--config/locales/tr.yml101
-rw-r--r--config/locales/uk.yml26
-rw-r--r--config/locales/vi.yml23
-rw-r--r--config/locales/zh-CN.yml12
-rw-r--r--config/locales/zh-HK.yml2
-rw-r--r--config/locales/zh-TW.yml23
-rw-r--r--config/navigation.rb1
-rw-r--r--config/routes.rb11
-rw-r--r--db/migrate/20220606044941_create_webhooks.rb12
-rw-r--r--db/schema.rb12
-rw-r--r--docker-compose.yml18
-rw-r--r--lib/assets/wordmark.dark.css1
-rw-r--r--lib/assets/wordmark.dark.pngbin0 -> 8991 bytes
-rw-r--r--lib/assets/wordmark.light.css1
-rw-r--r--lib/assets/wordmark.light.pngbin0 -> 8625 bytes
-rw-r--r--lib/tasks/branding.rake77
-rw-r--r--package.json26
-rw-r--r--public/android-chrome-192x192.pngbin7739 -> 0 bytes
-rw-r--r--public/apple-touch-icon.pngbin7350 -> 0 bytes
-rw-r--r--public/browserconfig.xml9
-rw-r--r--public/favicon-dev.icobin9086 -> 0 bytes
-rw-r--r--public/mask-icon.svg151
-rw-r--r--public/mstile-150x150.pngbin5340 -> 0 bytes
-rw-r--r--public/shortcuts/direct.pngbin3045 -> 0 bytes
-rw-r--r--public/shortcuts/new-status.pngbin3031 -> 0 bytes
-rw-r--r--public/shortcuts/notifications.pngbin3067 -> 0 bytes
-rw-r--r--public/shortcuts/profile.pngbin4190 -> 0 bytes
-rw-r--r--spec/fabricators/webhook_fabricator.rb5
-rw-r--r--spec/helpers/application_helper_spec.rb7
-rw-r--r--spec/models/webhook_spec.rb32
-rw-r--r--spec/validators/url_validator_spec.rb2
-rw-r--r--yarn.lock828
389 files changed, 4003 insertions, 1452 deletions
diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml
deleted file mode 100644
index fd535ea9a..000000000
--- a/.github/workflows/linter.yml
+++ /dev/null
@@ -1,71 +0,0 @@
----
-#################################
-#################################
-## Super Linter GitHub Actions ##
-#################################
-#################################
-name: Lint Code Base
-
-#
-# Documentation:
-# https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions
-#
-
-#############################
-# Start the job on all push #
-#############################
-on:
-  push:
-    branches-ignore: [main]
-    # Remove the line above to run when pushing to master
-  pull_request:
-    branches: [main]
-
-###############
-# Set the Job #
-###############
-permissions:
-  checks: write
-  contents: read
-  pull-requests: write
-  statuses: write
-
-jobs:
-  build:
-    # Name the Job
-    name: Lint Code Base
-    # Set the agent to run on
-    runs-on: ubuntu-latest
-
-    ##################
-    # Load all steps #
-    ##################
-    steps:
-      ##########################
-      # Checkout the code base #
-      ##########################
-      - name: Checkout Code
-        uses: actions/checkout@v3
-        with:
-          # Full git history is needed to get a proper list of changed files within `super-linter`
-          fetch-depth: 0
-
-      - name: Intall dependencies
-        run: yarn install --frozen-lockfile
-
-      ################################
-      # Run Linter against code base #
-      ################################
-      - name: Lint Code Base
-        uses: github/super-linter@v4
-        env:
-          CSS_FILE_NAME: stylelint.config.js
-          DEFAULT_BRANCH: main
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          JAVASCRIPT_ES_CONFIG_FILE: .eslintrc.js
-          LINTER_RULES_PATH: .
-          RUBY_CONFIG_FILE: .rubocop.yml
-          VALIDATE_ALL_CODEBASE: false
-          VALIDATE_CSS: true
-          VALIDATE_JAVASCRIPT_ES: true
-          VALIDATE_RUBY: true
diff --git a/.rubocop.yml b/.rubocop.yml
index a76937426..9e3ff21f2 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -281,6 +281,9 @@ Style/RedundantRegexpEscape:
 Style/RedundantReturn:
   Enabled: true
 
+Style/RedundantBegin:
+  Enabled: false
+
 Style/RegexpLiteral:
   Enabled: false
 
diff --git a/Gemfile b/Gemfile
index d740603d7..dc25538c0 100644
--- a/Gemfile
+++ b/Gemfile
@@ -26,7 +26,7 @@ gem 'blurhash', '~> 0.1'
 
 gem 'active_model_serializers', '~> 0.10'
 gem 'addressable', '~> 2.8'
-gem 'bootsnap', '~> 1.11.1', require: false
+gem 'bootsnap', '~> 1.12.0', require: false
 gem 'browser'
 gem 'charlock_holmes', '~> 0.7.7'
 gem 'chewy', '~> 7.2'
@@ -82,7 +82,7 @@ gem 'sidekiq', '~> 6.4'
 gem 'sidekiq-scheduler', '~> 4.0'
 gem 'sidekiq-unique-jobs', '~> 7.1'
 gem 'sidekiq-bulk', '~> 0.2.0'
-gem 'simple-navigation', '~> 4.3'
+gem 'simple-navigation', '~> 4.4'
 gem 'simple_form', '~> 5.1'
 gem 'sprockets-rails', '~> 3.4', require: 'sprockets/railtie'
 gem 'stoplight', '~> 3.0.0'
@@ -134,8 +134,8 @@ group :development do
   gem 'letter_opener', '~> 1.8'
   gem 'letter_opener_web', '~> 2.0'
   gem 'memory_profiler'
-  gem 'rubocop', '~> 1.29', require: false
-  gem 'rubocop-rails', '~> 2.14', require: false
+  gem 'rubocop', '~> 1.30', require: false
+  gem 'rubocop-rails', '~> 2.15', require: false
   gem 'brakeman', '~> 5.2', require: false
   gem 'bundler-audit', '~> 0.9', require: false
 
diff --git a/Gemfile.lock b/Gemfile.lock
index bd8d0f273..8c02b4244 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -114,7 +114,7 @@ GEM
       debug_inspector (>= 0.0.1)
     blurhash (0.1.6)
       ffi (~> 1.14)
-    bootsnap (1.11.1)
+    bootsnap (1.12.0)
       msgpack (~> 1.2)
     brakeman (5.2.3)
     browser (4.2.0)
@@ -122,7 +122,7 @@ GEM
       concurrent-ruby (~> 1.0, >= 1.0.5)
       redis (>= 1.0, <= 5.0)
     builder (3.2.4)
-    bullet (7.0.1)
+    bullet (7.0.2)
       activesupport (>= 3.0.0)
       uniform_notifier (~> 1.11)
     bundler-audit (0.9.1)
@@ -308,7 +308,7 @@ GEM
       rainbow (>= 2.0.0)
     i18n (1.10.0)
       concurrent-ruby (~> 1.0)
-    i18n-tasks (1.0.10)
+    i18n-tasks (1.0.11)
       activesupport (>= 4.0.2)
       ast (>= 2.1.0)
       better_html (~> 1.0)
@@ -397,11 +397,11 @@ GEM
     mime-types-data (3.2022.0105)
     mini_mime (1.1.2)
     mini_portile2 (2.8.0)
-    minitest (5.15.0)
-    msgpack (1.5.1)
+    minitest (5.16.0)
+    msgpack (1.5.2)
     multi_json (1.15.0)
     multipart-post (2.1.1)
-    net-ldap (0.17.0)
+    net-ldap (0.17.1)
     net-scp (3.0.0)
       net-ssh (>= 2.6.5, < 7.0.0)
     net-ssh (6.1.0)
@@ -414,7 +414,7 @@ GEM
       concurrent-ruby (~> 1.0, >= 1.0.2)
       sidekiq (>= 3.5)
       statsd-ruby (~> 1.4, >= 1.4.0)
-    oj (3.13.13)
+    oj (3.13.14)
     omniauth (1.9.1)
       hashie (>= 3.4.6)
       rack (>= 1.6.2, < 3)
@@ -513,7 +513,7 @@ GEM
     rails-dom-testing (2.0.3)
       activesupport (>= 4.2.0)
       nokogiri (>= 1.6)
-    rails-html-sanitizer (1.4.2)
+    rails-html-sanitizer (1.4.3)
       loofah (~> 2.3)
     rails-i18n (6.0.0)
       i18n (>= 0.7, < 2)
@@ -536,7 +536,7 @@ GEM
     redis (4.5.1)
     redis-namespace (1.8.2)
       redis (>= 3.0.4)
-    regexp_parser (2.4.0)
+    regexp_parser (2.5.0)
     request_store (1.5.1)
       rack (>= 1.4)
     responders (3.0.1)
@@ -571,18 +571,18 @@ GEM
     rspec-support (3.11.0)
     rspec_junit_formatter (0.5.1)
       rspec-core (>= 2, < 4, != 2.12.0)
-    rubocop (1.29.1)
+    rubocop (1.30.1)
       parallel (~> 1.10)
       parser (>= 3.1.0.0)
       rainbow (>= 2.2.2, < 4.0)
       regexp_parser (>= 1.8, < 3.0)
       rexml (>= 3.2.5, < 4.0)
-      rubocop-ast (>= 1.17.0, < 2.0)
+      rubocop-ast (>= 1.18.0, < 2.0)
       ruby-progressbar (~> 1.7)
       unicode-display_width (>= 1.4.0, < 3.0)
     rubocop-ast (1.18.0)
       parser (>= 3.1.1.0)
-    rubocop-rails (2.14.2)
+    rubocop-rails (2.15.0)
       activesupport (>= 4.2.0)
       rack (>= 1.1)
       rubocop (>= 1.7.0, < 2.0)
@@ -609,17 +609,17 @@ GEM
       redis (>= 4.2.0)
     sidekiq-bulk (0.2.0)
       sidekiq
-    sidekiq-scheduler (4.0.0)
+    sidekiq-scheduler (4.0.1)
       redis (>= 4.2.0)
       rufus-scheduler (~> 3.2)
       sidekiq (>= 4)
       tilt (>= 1.4.0)
-    sidekiq-unique-jobs (7.1.23)
+    sidekiq-unique-jobs (7.1.25)
       brpoplpush-redis_script (> 0.1.1, <= 2.0.0)
       concurrent-ruby (~> 1.0, >= 1.0.5)
       sidekiq (>= 5.0, < 8.0)
       thor (>= 0.20, < 3.0)
-    simple-navigation (4.3.0)
+    simple-navigation (4.4.0)
       activesupport (>= 2.3.2)
     simple_form (5.1.0)
       actionpack (>= 5.2)
@@ -681,7 +681,7 @@ GEM
       unf_ext
     unf_ext (0.0.8)
     unicode-display_width (2.1.0)
-    uniform_notifier (1.14.2)
+    uniform_notifier (1.16.0)
     validate_email (0.1.6)
       activemodel (>= 3.0)
       mail (>= 2.2.5)
@@ -722,7 +722,7 @@ GEM
     xorcist (1.1.2)
     xpath (3.2.0)
       nokogiri (~> 1.8)
-    zeitwerk (2.5.4)
+    zeitwerk (2.6.0)
 
 PLATFORMS
   ruby
@@ -736,7 +736,7 @@ DEPENDENCIES
   better_errors (~> 2.9)
   binding_of_caller (~> 1.0)
   blurhash (~> 0.1)
-  bootsnap (~> 1.11.1)
+  bootsnap (~> 1.12.0)
   brakeman (~> 5.2)
   browser
   bullet (~> 7.0)
@@ -825,8 +825,8 @@ DEPENDENCIES
   rspec-rails (~> 5.1)
   rspec-sidekiq (~> 3.1)
   rspec_junit_formatter (~> 0.5)
-  rubocop (~> 1.29)
-  rubocop-rails (~> 2.14)
+  rubocop (~> 1.30)
+  rubocop-rails (~> 2.15)
   ruby-progressbar (~> 1.11)
   sanitize (~> 6.0)
   scenic (~> 1.6)
@@ -834,7 +834,7 @@ DEPENDENCIES
   sidekiq-bulk (~> 0.2.0)
   sidekiq-scheduler (~> 4.0)
   sidekiq-unique-jobs (~> 7.1)
-  simple-navigation (~> 4.3)
+  simple-navigation (~> 4.4)
   simple_form (~> 5.1)
   simplecov (~> 0.21)
   sprockets (~> 3.7.2)
diff --git a/app/controllers/admin/webhooks/secrets_controller.rb b/app/controllers/admin/webhooks/secrets_controller.rb
new file mode 100644
index 000000000..16af1cf7b
--- /dev/null
+++ b/app/controllers/admin/webhooks/secrets_controller.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Admin
+  class Webhooks::SecretsController < BaseController
+    before_action :set_webhook
+
+    def rotate
+      authorize @webhook, :rotate_secret?
+      @webhook.rotate_secret!
+      redirect_to admin_webhook_path(@webhook)
+    end
+
+    private
+
+    def set_webhook
+      @webhook = Webhook.find(params[:webhook_id])
+    end
+  end
+end
diff --git a/app/controllers/admin/webhooks_controller.rb b/app/controllers/admin/webhooks_controller.rb
new file mode 100644
index 000000000..d6fb1a4ea
--- /dev/null
+++ b/app/controllers/admin/webhooks_controller.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+module Admin
+  class WebhooksController < BaseController
+    before_action :set_webhook, except: [:index, :new, :create]
+
+    def index
+      authorize :webhook, :index?
+
+      @webhooks = Webhook.page(params[:page])
+    end
+
+    def new
+      authorize :webhook, :create?
+
+      @webhook = Webhook.new
+    end
+
+    def create
+      authorize :webhook, :create?
+
+      @webhook = Webhook.new(resource_params)
+
+      if @webhook.save
+        redirect_to admin_webhook_path(@webhook)
+      else
+        render :new
+      end
+    end
+
+    def show
+      authorize @webhook, :show?
+    end
+
+    def edit
+      authorize @webhook, :update?
+    end
+
+    def update
+      authorize @webhook, :update?
+
+      if @webhook.update(resource_params)
+        redirect_to admin_webhook_path(@webhook)
+      else
+        render :show
+      end
+    end
+
+    def enable
+      authorize @webhook, :enable?
+      @webhook.enable!
+      redirect_to admin_webhook_path(@webhook)
+    end
+
+    def disable
+      authorize @webhook, :disable?
+      @webhook.disable!
+      redirect_to admin_webhook_path(@webhook)
+    end
+
+    def destroy
+      authorize @webhook, :destroy?
+      @webhook.destroy!
+      redirect_to admin_webhooks_path
+    end
+
+    private
+
+    def set_webhook
+      @webhook = Webhook.find(params[:id])
+    end
+
+    def resource_params
+      params.require(:webhook).permit(:url, events: [])
+    end
+  end
+end
diff --git a/app/helpers/accounts_helper.rb b/app/helpers/accounts_helper.rb
index f0becf8bd..d2e198265 100644
--- a/app/helpers/accounts_helper.rb
+++ b/app/helpers/accounts_helper.rb
@@ -23,20 +23,20 @@ module AccountsHelper
     if user_signed_in?
       if account.id == current_user.account_id
         link_to settings_profile_url, class: 'button logo-button' do
-          safe_join([svg_logo, t('settings.edit_profile')])
+          safe_join([logo_as_symbol, t('settings.edit_profile')])
         end
       elsif current_account.following?(account) || current_account.requested?(account)
         link_to account_unfollow_path(account), class: 'button logo-button button--destructive', data: { method: :post } do
-          safe_join([svg_logo, t('accounts.unfollow')])
+          safe_join([logo_as_symbol, t('accounts.unfollow')])
         end
       elsif !(account.memorial? || account.moved?)
         link_to account_follow_path(account), class: "button logo-button#{account.blocking?(current_account) ? ' disabled' : ''}", data: { method: :post } do
-          safe_join([svg_logo, t('accounts.follow')])
+          safe_join([logo_as_symbol, t('accounts.follow')])
         end
       end
     elsif !(account.memorial? || account.moved?)
       link_to account_remote_follow_path(account), class: 'button logo-button modal-button', target: '_new' do
-        safe_join([svg_logo, t('accounts.follow')])
+        safe_join([logo_as_symbol, t('accounts.follow')])
       end
     end
   end
@@ -105,12 +105,4 @@ module AccountsHelper
 
     [prepend_stats.join(', '), account.note].join(' · ')
   end
-
-  def svg_logo
-    content_tag(:svg, tag(:use, 'xlink:href' => '#mastodon-svg-logo'), 'viewBox' => '0 0 216.4144 232.00976')
-  end
-
-  def svg_logo_full
-    content_tag(:svg, tag(:use, 'xlink:href' => '#mastodon-svg-logo-full'), 'viewBox' => '0 0 713.35878 175.8678')
-  end
 end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index a4023733c..62739b964 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -99,11 +99,6 @@ module ApplicationHelper
     end
   end
 
-  def favicon_path
-    env_suffix = Rails.env.production? ? '' : '-dev'
-    "/favicon#{env_suffix}.ico"
-  end
-
   def title
     Rails.env.production? ? site_title : "#{site_title} (Dev)"
   end
@@ -147,8 +142,8 @@ module ApplicationHelper
     end
   end
 
-  def custom_emoji_tag(custom_emoji, animate = true)
-    if animate
+  def custom_emoji_tag(custom_emoji)
+    if prefers_autoplay?
       image_tag(custom_emoji.image.url, class: 'emojione', alt: ":#{custom_emoji.shortcode}:")
     else
       image_tag(custom_emoji.image.url(:static), class: 'emojione custom-emoji', alt: ":#{custom_emoji.shortcode}", 'data-original' => full_asset_url(custom_emoji.image.url), 'data-static' => full_asset_url(custom_emoji.image.url(:static)))
@@ -199,7 +194,7 @@ module ApplicationHelper
 
   def quote_wrap(text, line_width: 80, break_sequence: "\n")
     text = word_wrap(text, line_width: line_width - 2, break_sequence: break_sequence)
-    text.split("\n").map { |line| '> ' + line }.join("\n")
+    text.split("\n").map { |line| "> #{line}" }.join("\n")
   end
 
   def render_initial_state
diff --git a/app/helpers/branding_helper.rb b/app/helpers/branding_helper.rb
new file mode 100644
index 000000000..ad7702aea
--- /dev/null
+++ b/app/helpers/branding_helper.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+module BrandingHelper
+  def logo_as_symbol(version = :icon)
+    case version
+    when :icon
+      _logo_as_symbol_icon
+    when :wordmark
+      _logo_as_symbol_wordmark
+    end
+  end
+
+  def _logo_as_symbol_wordmark
+    content_tag(:svg, tag(:use, href: '#logo-symbol-wordmark'), viewBox: '0 0 261 66', class: 'logo logo--wordmark')
+  end
+
+  def _logo_as_symbol_icon
+    content_tag(:svg, tag(:use, href: '#logo-symbol-icon'), viewBox: '0 0 79 79', class: 'logo logo--icon')
+  end
+
+  def render_logo
+    image_pack_tag('logo.svg', alt: 'Mastodon', class: 'logo logo--icon')
+  end
+
+  def render_symbol(version = :icon)
+    path = begin
+      case version
+      when :icon
+        'logo-symbol-icon.svg'
+      when :wordmark
+        'logo-symbol-wordmark.svg'
+      end
+    end
+
+    render(file: Rails.root.join('app', 'javascript', 'images', path)).html_safe # rubocop:disable Rails/OutputSafety
+  end
+end
diff --git a/app/javascript/core/mailer.js b/app/javascript/core/mailer.js
index baef7e7fb..a4b6d5446 100644
--- a/app/javascript/core/mailer.js
+++ b/app/javascript/core/mailer.js
@@ -1 +1,3 @@
-import 'styles/mailer.scss';
+require('../styles/mailer.scss');
+
+require.context('../icons');
diff --git a/app/javascript/flavours/glitch/components/icon_button.js b/app/javascript/flavours/glitch/components/icon_button.js
index 3999409cd..9a05badd0 100644
--- a/app/javascript/flavours/glitch/components/icon_button.js
+++ b/app/javascript/flavours/glitch/components/icon_button.js
@@ -86,13 +86,13 @@ export default class IconButton extends React.PureComponent {
   render () {
     let style = {
       fontSize: `${this.props.size}px`,
-      height: `${this.props.size * 1.28571429}px`,
+      height: '1.28571429em',
       lineHeight: `${this.props.size}px`,
       ...this.props.style,
       ...(this.props.active ? this.props.activeStyle : {}),
     };
     if (!this.props.label) {
-      style.width = `${this.props.size * 1.28571429}px`;
+      style.width = '1.28571429em';
     } else {
       style.textAlign = 'left';
     }
diff --git a/app/javascript/flavours/glitch/styles/about.scss b/app/javascript/flavours/glitch/styles/about.scss
index 2cc43afec..1843129a0 100644
--- a/app/javascript/flavours/glitch/styles/about.scss
+++ b/app/javascript/flavours/glitch/styles/about.scss
@@ -690,7 +690,7 @@ $small-breakpoint: 960px;
     align-items: center;
     padding: 50px;
 
-    svg {
+    .logo {
       fill: $primary-text-color;
       height: 52px;
     }
diff --git a/app/javascript/flavours/glitch/styles/accessibility.scss b/app/javascript/flavours/glitch/styles/accessibility.scss
index 96e20f839..9b36bfd8d 100644
--- a/app/javascript/flavours/glitch/styles/accessibility.scss
+++ b/app/javascript/flavours/glitch/styles/accessibility.scss
@@ -22,8 +22,8 @@ $emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange'
     content: "\F00C";
     font-size: 50%;
     font-family: FontAwesome;
-    right: -5px;
-    top: -4px;
+    right: -0.55em;
+    top: -0.44em;
   }
 }
 
diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss
index 27be22f1b..9553aa4ae 100644
--- a/app/javascript/flavours/glitch/styles/admin.scss
+++ b/app/javascript/flavours/glitch/styles/admin.scss
@@ -133,12 +133,12 @@ $content-width: 840px;
 
       .simple-navigation-active-leaf a {
         color: $primary-text-color;
-        background-color: $ui-highlight-color;
+        background-color: darken($ui-highlight-color, 2%);
         border-bottom: 0;
         border-radius: 0;
 
         &:hover {
-          background-color: lighten($ui-highlight-color, 5%);
+          background-color: $ui-highlight-color;
         }
       }
     }
@@ -206,6 +206,14 @@ $content-width: 840px;
         }
       }
 
+      h2 small {
+        font-size: 12px;
+        display: block;
+        font-weight: 500;
+        color: $darker-text-color;
+        line-height: 18px;
+      }
+
       @media screen and (max-width: $no-columns-breakpoint) {
         border-bottom: 0;
         padding-bottom: 0;
@@ -896,7 +904,7 @@ a.name-tag,
     border: 0;
 
     a {
-      color: lighten($ui-highlight-color, 8%);
+      color: $highlight-text-color;
     }
 
     dl:first-child .verified {
diff --git a/app/javascript/flavours/glitch/styles/basics.scss b/app/javascript/flavours/glitch/styles/basics.scss
index be0e1b860..a00b2936f 100644
--- a/app/javascript/flavours/glitch/styles/basics.scss
+++ b/app/javascript/flavours/glitch/styles/basics.scss
@@ -181,7 +181,17 @@ button {
 }
 
 .logo-resources {
-  display: none;
+  // Not using display: none because of https://bugs.chromium.org/p/chromium/issues/detail?id=258029
+  visibility: hidden;
+  user-select: none;
+  pointer-events: none;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: -1000;
 }
 
 // NoScript adds a __ns__pop2top class to the full ancestry of blocked elements,
diff --git a/app/javascript/flavours/glitch/styles/branding.scss b/app/javascript/flavours/glitch/styles/branding.scss
new file mode 100644
index 000000000..d1bddc68b
--- /dev/null
+++ b/app/javascript/flavours/glitch/styles/branding.scss
@@ -0,0 +1,3 @@
+.logo {
+  color: $primary-text-color;
+}
diff --git a/app/javascript/flavours/glitch/styles/components/announcements.scss b/app/javascript/flavours/glitch/styles/components/announcements.scss
index 52feefd3c..85af9afc8 100644
--- a/app/javascript/flavours/glitch/styles/components/announcements.scss
+++ b/app/javascript/flavours/glitch/styles/components/announcements.scss
@@ -36,7 +36,7 @@
     }
 
     &.unhandled-link {
-      color: lighten($ui-highlight-color, 8%);
+      color: $highlight-text-color;
     }
   }
 }
diff --git a/app/javascript/flavours/glitch/styles/components/columns.scss b/app/javascript/flavours/glitch/styles/components/columns.scss
index d52ecf02c..1440682f3 100644
--- a/app/javascript/flavours/glitch/styles/components/columns.scss
+++ b/app/javascript/flavours/glitch/styles/components/columns.scss
@@ -201,7 +201,7 @@
     }
 
     &.active {
-      color: $ui-highlight-color;
+      color: $highlight-text-color;
     }
   }
 }
@@ -822,7 +822,6 @@
   padding: 40px;
 
   .logo {
-    fill: $primary-text-color;
     width: 50px;
     margin: 0 auto;
     margin-bottom: 40px;
diff --git a/app/javascript/flavours/glitch/styles/components/directory.scss b/app/javascript/flavours/glitch/styles/components/directory.scss
index b48c6c102..803e075c9 100644
--- a/app/javascript/flavours/glitch/styles/components/directory.scss
+++ b/app/javascript/flavours/glitch/styles/components/directory.scss
@@ -58,8 +58,8 @@
     vertical-align: middle;
 
     &.checked {
-      border-color: lighten($ui-highlight-color, 8%);
-      background: lighten($ui-highlight-color, 8%);
+      border-color: lighten($ui-highlight-color, 4%);
+      background: lighten($ui-highlight-color, 4%);
     }
   }
 }
diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss
index da9fb6ad2..7f9ed2186 100644
--- a/app/javascript/flavours/glitch/styles/components/index.scss
+++ b/app/javascript/flavours/glitch/styles/components/index.scss
@@ -51,22 +51,16 @@
   text-align: center;
   text-decoration: none;
   text-overflow: ellipsis;
-  transition: all 100ms ease-in;
-  transition-property: background-color;
   white-space: nowrap;
   width: auto;
 
   &:active,
   &:focus,
   &:hover {
-    background-color: lighten($ui-highlight-color, 7%);
-    transition: all 200ms ease-out;
-    transition-property: background-color;
+    background-color: $ui-highlight-color;
   }
 
   &--destructive {
-    transition: none;
-
     &:active,
     &:focus,
     &:hover {
@@ -916,11 +910,11 @@
 }
 
 .react-toggle--checked .react-toggle-track {
-  background-color: $ui-highlight-color;
+  background-color: darken($ui-highlight-color, 2%);
 }
 
 .react-toggle--checked:is(:hover, :focus-within):not(.react-toggle--disabled) .react-toggle-track {
-  background-color: lighten($ui-highlight-color, 10%);
+  background-color: $ui-highlight-color;
 }
 
 .react-toggle-track-check {
@@ -1216,14 +1210,14 @@ button.icon-button.active i.fa-retweet {
   }
 
   a {
-    color: lighten($ui-highlight-color, 8%);
+    color: $highlight-text-color;
     text-decoration: none;
 
     &:hover,
     &:focus,
     &:active {
       text-decoration: underline;
-      color: lighten($ui-highlight-color, 12%);
+      color: lighten($highlight-text-color, 4%);
     }
   }
 }
diff --git a/app/javascript/flavours/glitch/styles/components/single_column.scss b/app/javascript/flavours/glitch/styles/components/single_column.scss
index ba43e7f29..d10fc1d3e 100644
--- a/app/javascript/flavours/glitch/styles/components/single_column.scss
+++ b/app/javascript/flavours/glitch/styles/components/single_column.scss
@@ -199,7 +199,7 @@
   height: 3.9375rem;
   bottom: 1.3125rem;
   right: 1.3125rem;
-  background: darken($ui-highlight-color, 3%);
+  background: darken($ui-highlight-color, 2%);
   color: $white;
   border-radius: 50%;
   font-size: 21px;
@@ -210,7 +210,7 @@
   &:hover,
   &:focus,
   &:active {
-    background: lighten($ui-highlight-color, 7%);
+    background: $ui-highlight-color;
   }
 }
 
diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index fe3829fdd..9511e0c61 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -187,7 +187,7 @@
   }
 
   a.unhandled-link {
-    color: lighten($ui-highlight-color, 8%);
+    color: $highlight-text-color;
 
     .link-origin-tag {
       color: $gold-star;
diff --git a/app/javascript/flavours/glitch/styles/containers.scss b/app/javascript/flavours/glitch/styles/containers.scss
index 98a1288eb..b8d0fdad2 100644
--- a/app/javascript/flavours/glitch/styles/containers.scss
+++ b/app/javascript/flavours/glitch/styles/containers.scss
@@ -20,8 +20,7 @@
     justify-content: center;
     align-items: center;
 
-    svg {
-      fill: $primary-text-color;
+    .logo {
       height: 42px;
       margin-right: 10px;
     }
@@ -322,7 +321,7 @@
       display: block;
       padding: 15px;
 
-      svg {
+      .logo {
         display: block;
         height: 18px;
         width: auto;
@@ -798,7 +797,7 @@
       border-top: 0;
 
       a {
-        color: lighten($ui-highlight-color, 8%);
+        color: $highlight-text-color;
       }
 
       dl:first-child .verified {
diff --git a/app/javascript/flavours/glitch/styles/contrast/variables.scss b/app/javascript/flavours/glitch/styles/contrast/variables.scss
index f6cadf029..ab14a7b73 100644
--- a/app/javascript/flavours/glitch/styles/contrast/variables.scss
+++ b/app/javascript/flavours/glitch/styles/contrast/variables.scss
@@ -4,19 +4,17 @@ $black: #000000;
 $classic-base-color: #282c37;
 $classic-primary-color: #9baec8;
 $classic-secondary-color: #d9e1e8;
-$classic-highlight-color: #2b90d9;
+$classic-highlight-color: #6364ff;
 
 $ui-base-color: $classic-base-color !default;
 $ui-primary-color: $classic-primary-color !default;
 $ui-secondary-color: $classic-secondary-color !default;
-
-// Differences
-$ui-highlight-color: #2b5fd9;
+$ui-highlight-color: $classic-highlight-color !default;
 
 $darker-text-color: lighten($ui-primary-color, 20%) !default;
 $dark-text-color: lighten($ui-primary-color, 12%) !default;
 $secondary-text-color: lighten($ui-secondary-color, 6%) !default;
-$highlight-text-color: $classic-highlight-color !default;
+$highlight-text-color: lighten($ui-highlight-color, 8%) !default;
 $action-button-color: #8d9ac2;
 
 $inverted-text-color: $black !default;
diff --git a/app/javascript/flavours/glitch/styles/dashboard.scss b/app/javascript/flavours/glitch/styles/dashboard.scss
index 0a881bc10..9b06b44d6 100644
--- a/app/javascript/flavours/glitch/styles/dashboard.scss
+++ b/app/javascript/flavours/glitch/styles/dashboard.scss
@@ -83,7 +83,7 @@
     display: flex;
     align-items: baseline;
     border-radius: 4px;
-    background: $ui-highlight-color;
+    background: darken($ui-highlight-color, 2%);
     color: $primary-text-color;
     transition: all 100ms ease-in;
     font-size: 14px;
@@ -96,7 +96,7 @@
     &:active,
     &:focus,
     &:hover {
-      background-color: lighten($ui-highlight-color, 10%);
+      background-color: $ui-highlight-color;
       transition: all 200ms ease-out;
     }
 
diff --git a/app/javascript/flavours/glitch/styles/footer.scss b/app/javascript/flavours/glitch/styles/footer.scss
index 073ebda7e..0c3e42033 100644
--- a/app/javascript/flavours/glitch/styles/footer.scss
+++ b/app/javascript/flavours/glitch/styles/footer.scss
@@ -132,19 +132,19 @@
     }
 
     .brand {
-      svg {
+      .logo {
         display: block;
         height: 36px;
         width: auto;
         margin: 0 auto;
-        fill: lighten($ui-base-color, 34%);
+        color: lighten($ui-base-color, 34%);
       }
 
       &:hover,
       &:focus,
       &:active {
-        svg {
-          fill: lighten($ui-base-color, 38%);
+        .logo {
+          color: lighten($ui-base-color, 38%);
         }
       }
     }
diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss
index e4105cba5..de8bd2d45 100644
--- a/app/javascript/flavours/glitch/styles/forms.scss
+++ b/app/javascript/flavours/glitch/styles/forms.scss
@@ -448,14 +448,14 @@ code {
     width: 100%;
     border: 0;
     border-radius: 4px;
-    background: $ui-highlight-color;
+    background: darken($ui-highlight-color, 2%);
     color: $primary-text-color;
     font-size: 18px;
     line-height: inherit;
     height: auto;
     padding: 10px;
-    text-transform: uppercase;
     text-decoration: none;
+    text-transform: uppercase;
     text-align: center;
     box-sizing: border-box;
     cursor: pointer;
@@ -468,13 +468,10 @@ code {
       margin-right: 0;
     }
 
-    &:hover {
-      background-color: lighten($ui-highlight-color, 5%);
-    }
-
     &:active,
-    &:focus {
-      background-color: darken($ui-highlight-color, 5%);
+    &:focus,
+    &:hover {
+      background-color: $ui-highlight-color;
     }
 
     &:disabled:hover {
diff --git a/app/javascript/flavours/glitch/styles/index.scss b/app/javascript/flavours/glitch/styles/index.scss
index af73feb89..f808773f3 100644
--- a/app/javascript/flavours/glitch/styles/index.scss
+++ b/app/javascript/flavours/glitch/styles/index.scss
@@ -6,6 +6,7 @@
 
 @import 'reset';
 @import 'basics';
+@import 'branding';
 @import 'containers';
 @import 'lists';
 @import 'modal';
diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/variables.scss b/app/javascript/flavours/glitch/styles/mastodon-light/variables.scss
index 7709d4535..f1c8a3503 100644
--- a/app/javascript/flavours/glitch/styles/mastodon-light/variables.scss
+++ b/app/javascript/flavours/glitch/styles/mastodon-light/variables.scss
@@ -5,7 +5,7 @@ $white: #ffffff;
 $classic-base-color: #282c37;
 $classic-primary-color: #9baec8;
 $classic-secondary-color: #d9e1e8;
-$classic-highlight-color: #2b90d9;
+$classic-highlight-color: #6364ff;
 
 $ui-base-color: $classic-secondary-color !default;
 $ui-base-lighter-color: darken($ui-base-color, 57%);
@@ -15,6 +15,7 @@ $ui-secondary-color: $classic-base-color !default;
 
 $primary-text-color: $black !default;
 $darker-text-color: $classic-base-color !default;
+$highlight-text-color: darken($ui-highlight-color, 8%) !default;
 $dark-text-color: #444b5d;
 $action-button-color: #606984;
 
diff --git a/app/javascript/flavours/glitch/styles/statuses.scss b/app/javascript/flavours/glitch/styles/statuses.scss
index b807fa45a..c302fc0d0 100644
--- a/app/javascript/flavours/glitch/styles/statuses.scss
+++ b/app/javascript/flavours/glitch/styles/statuses.scss
@@ -76,7 +76,7 @@
 .button.logo-button {
   flex: 0 auto;
   font-size: 14px;
-  background: $ui-highlight-color;
+  background: darken($ui-highlight-color, 2%);
   color: $primary-text-color;
   text-transform: none;
   line-height: 1.2;
@@ -100,7 +100,7 @@
   &:active,
   &:focus,
   &:hover {
-    background: lighten($ui-highlight-color, 10%);
+    background: $ui-highlight-color;
   }
 
   &:disabled,
@@ -267,7 +267,7 @@ a.button.logo-button {
   display: block;
   font-size: 15px;
   line-height: 20px;
-  color: lighten($ui-highlight-color, 8%);
+  color: $highlight-text-color;
   border: 0;
   background: transparent;
   padding: 0;
diff --git a/app/javascript/flavours/glitch/styles/variables.scss b/app/javascript/flavours/glitch/styles/variables.scss
index 6e242281b..65758e6e0 100644
--- a/app/javascript/flavours/glitch/styles/variables.scss
+++ b/app/javascript/flavours/glitch/styles/variables.scss
@@ -12,7 +12,7 @@ $red-bookmark: $warning-red;
 $classic-base-color: #282c37;         // Midnight Express
 $classic-primary-color: #9baec8;      // Echo Blue
 $classic-secondary-color: #d9e1e8;    // Pattens Blue
-$classic-highlight-color: #2b90d9;    // Summer Sky
+$classic-highlight-color: #6364ff;    // Brand purple
 
 // Variables for defaults in UI
 $base-shadow-color: $black !default;
@@ -34,7 +34,7 @@ $primary-text-color: $white !default;
 $darker-text-color: $ui-primary-color !default;
 $dark-text-color: $ui-base-lighter-color !default;
 $secondary-text-color: $ui-secondary-color !default;
-$highlight-text-color: $ui-highlight-color !default;
+$highlight-text-color: lighten($ui-highlight-color, 8%) !default;
 $action-button-color: $ui-base-lighter-color !default;
 $passive-text-color: $gold-star !default;
 $active-passive-text-color: $success-green !default;
diff --git a/app/javascript/icons/android-chrome-144x144.png b/app/javascript/icons/android-chrome-144x144.png
new file mode 100644
index 000000000..d282a6d3d
--- /dev/null
+++ b/app/javascript/icons/android-chrome-144x144.png
Binary files differdiff --git a/app/javascript/icons/android-chrome-192x192.png b/app/javascript/icons/android-chrome-192x192.png
new file mode 100644
index 000000000..d3f9959c5
--- /dev/null
+++ b/app/javascript/icons/android-chrome-192x192.png
Binary files differdiff --git a/app/javascript/icons/android-chrome-256x256.png b/app/javascript/icons/android-chrome-256x256.png
new file mode 100644
index 000000000..98ce6ffbb
--- /dev/null
+++ b/app/javascript/icons/android-chrome-256x256.png
Binary files differdiff --git a/app/javascript/icons/android-chrome-36x36.png b/app/javascript/icons/android-chrome-36x36.png
new file mode 100644
index 000000000..f8ffeeb76
--- /dev/null
+++ b/app/javascript/icons/android-chrome-36x36.png
Binary files differdiff --git a/app/javascript/icons/android-chrome-384x384.png b/app/javascript/icons/android-chrome-384x384.png
new file mode 100644
index 000000000..60b375354
--- /dev/null
+++ b/app/javascript/icons/android-chrome-384x384.png
Binary files differdiff --git a/app/javascript/icons/android-chrome-48x48.png b/app/javascript/icons/android-chrome-48x48.png
new file mode 100644
index 000000000..ce49448d4
--- /dev/null
+++ b/app/javascript/icons/android-chrome-48x48.png
Binary files differdiff --git a/app/javascript/icons/android-chrome-512x512.png b/app/javascript/icons/android-chrome-512x512.png
new file mode 100644
index 000000000..bccaada29
--- /dev/null
+++ b/app/javascript/icons/android-chrome-512x512.png
Binary files differdiff --git a/app/javascript/icons/android-chrome-72x72.png b/app/javascript/icons/android-chrome-72x72.png
new file mode 100644
index 000000000..ce57ab746
--- /dev/null
+++ b/app/javascript/icons/android-chrome-72x72.png
Binary files differdiff --git a/app/javascript/icons/android-chrome-96x96.png b/app/javascript/icons/android-chrome-96x96.png
new file mode 100644
index 000000000..cd8f09ed4
--- /dev/null
+++ b/app/javascript/icons/android-chrome-96x96.png
Binary files differdiff --git a/app/javascript/icons/apple-touch-icon-1024x1024.png b/app/javascript/icons/apple-touch-icon-1024x1024.png
new file mode 100644
index 000000000..b1f18f3e3
--- /dev/null
+++ b/app/javascript/icons/apple-touch-icon-1024x1024.png
Binary files differdiff --git a/app/javascript/icons/apple-touch-icon-114x114.png b/app/javascript/icons/apple-touch-icon-114x114.png
new file mode 100644
index 000000000..e13aaa87d
--- /dev/null
+++ b/app/javascript/icons/apple-touch-icon-114x114.png
Binary files differdiff --git a/app/javascript/icons/apple-touch-icon-120x120.png b/app/javascript/icons/apple-touch-icon-120x120.png
new file mode 100644
index 000000000..aa63012b5
--- /dev/null
+++ b/app/javascript/icons/apple-touch-icon-120x120.png
Binary files differdiff --git a/app/javascript/icons/apple-touch-icon-144x144.png b/app/javascript/icons/apple-touch-icon-144x144.png
new file mode 100644
index 000000000..d282a6d3d
--- /dev/null
+++ b/app/javascript/icons/apple-touch-icon-144x144.png
Binary files differdiff --git a/app/javascript/icons/apple-touch-icon-152x152.png b/app/javascript/icons/apple-touch-icon-152x152.png
new file mode 100644
index 000000000..0dec7d63e
--- /dev/null
+++ b/app/javascript/icons/apple-touch-icon-152x152.png
Binary files differdiff --git a/app/javascript/icons/apple-touch-icon-167x167.png b/app/javascript/icons/apple-touch-icon-167x167.png
new file mode 100644
index 000000000..a622e1215
--- /dev/null
+++ b/app/javascript/icons/apple-touch-icon-167x167.png
Binary files differdiff --git a/app/javascript/icons/apple-touch-icon-180x180.png b/app/javascript/icons/apple-touch-icon-180x180.png
new file mode 100644
index 000000000..864046b56
--- /dev/null
+++ b/app/javascript/icons/apple-touch-icon-180x180.png
Binary files differdiff --git a/app/javascript/icons/apple-touch-icon-57x57.png b/app/javascript/icons/apple-touch-icon-57x57.png
new file mode 100644
index 000000000..116918ce2
--- /dev/null
+++ b/app/javascript/icons/apple-touch-icon-57x57.png
Binary files differdiff --git a/app/javascript/icons/apple-touch-icon-60x60.png b/app/javascript/icons/apple-touch-icon-60x60.png
new file mode 100644
index 000000000..0eda96ed6
--- /dev/null
+++ b/app/javascript/icons/apple-touch-icon-60x60.png
Binary files differdiff --git a/app/javascript/icons/apple-touch-icon-72x72.png b/app/javascript/icons/apple-touch-icon-72x72.png
new file mode 100644
index 000000000..ce57ab746
--- /dev/null
+++ b/app/javascript/icons/apple-touch-icon-72x72.png
Binary files differdiff --git a/app/javascript/icons/apple-touch-icon-76x76.png b/app/javascript/icons/apple-touch-icon-76x76.png
new file mode 100644
index 000000000..50e162891
--- /dev/null
+++ b/app/javascript/icons/apple-touch-icon-76x76.png
Binary files differdiff --git a/app/javascript/icons/favicon-16x16.png b/app/javascript/icons/favicon-16x16.png
new file mode 100644
index 000000000..33ef3bb8c
--- /dev/null
+++ b/app/javascript/icons/favicon-16x16.png
Binary files differdiff --git a/app/javascript/icons/favicon-32x32.png b/app/javascript/icons/favicon-32x32.png
new file mode 100644
index 000000000..7b9a37403
--- /dev/null
+++ b/app/javascript/icons/favicon-32x32.png
Binary files differdiff --git a/app/javascript/icons/favicon-48x48.png b/app/javascript/icons/favicon-48x48.png
new file mode 100644
index 000000000..5b35eb233
--- /dev/null
+++ b/app/javascript/icons/favicon-48x48.png
Binary files differdiff --git a/app/javascript/images/app-icon.svg b/app/javascript/images/app-icon.svg
new file mode 100644
index 000000000..1035bd076
--- /dev/null
+++ b/app/javascript/images/app-icon.svg
@@ -0,0 +1,28 @@
+<svg width="130" height="130" viewBox="0 0 121 130" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="130" height="130" fill="url(#paint0_linear_2_2)" x="-4.5"/>
+<g filter="url(#filter0_di_2_2)">
+<path d="M95.7135 43.6043C94.6199 35.5459 87.5351 29.1953 79.1366 27.9647C77.7196 27.7568 72.351 27 59.9148 27H59.822C47.3824 27 44.7135 27.7568 43.2966 27.9647C35.1319 29.1612 27.6757 34.8675 25.8667 43.0214C24.9966 47.0369 24.9037 51.4888 25.0654 55.5726C25.2958 61.4289 25.3405 67.275 25.877 73.1075C26.2479 76.9817 26.895 80.8251 27.8133 84.6088C29.5329 91.5968 36.4938 97.4122 43.3138 99.7848C50.6155 102.259 58.468 102.67 65.9919 100.971C66.8196 100.78 67.6381 100.559 68.4475 100.306C70.2737 99.7302 72.4164 99.086 73.9915 97.9542C74.0131 97.9384 74.0308 97.9178 74.0433 97.8942C74.0558 97.8706 74.0628 97.8445 74.0637 97.8179V92.1661C74.0634 92.1412 74.0574 92.1167 74.0462 92.0944C74.035 92.0721 74.0189 92.0525 73.9992 92.0371C73.9794 92.0218 73.9564 92.011 73.9318 92.0056C73.9073 92.0002 73.8819 92.0003 73.8574 92.0059C69.0369 93.1472 64.0971 93.7193 59.141 93.7103C50.6118 93.7103 48.3178 89.6981 47.6609 88.0278C47.1329 86.5842 46.7976 85.0784 46.6636 83.5486C46.6622 83.5229 46.667 83.4973 46.6775 83.4738C46.688 83.4502 46.7039 83.4295 46.724 83.4132C46.7441 83.397 46.7678 83.3856 46.7931 83.3801C46.8185 83.3746 46.8448 83.3751 46.8699 83.3816C51.6101 84.5151 56.4693 85.0873 61.3455 85.086C62.5183 85.086 63.6876 85.086 64.8604 85.0553C69.7647 84.919 74.9339 84.6701 79.7591 83.7361C79.8794 83.7123 79.9998 83.6918 80.103 83.6611C87.7139 82.2124 94.9569 77.665 95.6929 66.1501C95.7204 65.6967 95.7892 61.4016 95.7892 60.9312C95.7926 59.3325 96.3085 49.5901 95.7135 43.6043ZM83.9996 72.3371H75.9966V52.9069C75.9966 48.8163 74.277 46.7302 70.7793 46.7302C66.9343 46.7302 65.0083 49.1981 65.0083 54.0727V64.7082H57.0534V54.0727C57.0534 49.1981 55.124 46.7302 51.279 46.7302C47.8019 46.7302 46.0651 48.8163 46.0617 52.9069V72.3371H38.0656V52.3172C38.0656 48.2266 39.1191 44.9769 41.2262 42.568C43.3998 40.1648 46.2509 38.9308 49.7898 38.9308C53.8859 38.9308 56.9812 40.492 59.0447 43.6111L61.036 46.9245L63.0308 43.6111C65.0943 40.492 68.1896 38.9308 72.2788 38.9308C75.8143 38.9308 78.6654 40.1648 80.8459 42.568C82.9529 44.9746 84.0065 48.2243 84.0065 52.3172L83.9996 72.3371Z" fill="#FBFBFB" fill-opacity="0.97"/>
+</g>
+<defs>
+<filter id="filter0_di_2_2" x="21" y="27" width="79" height="83" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.261224 0 0 0 0 0.16597 0 0 0 0 0.662652 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_2_2"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_2_2" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="2"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.337255 0 0 0 0 0.227451 0 0 0 0 0.8 0 0 0 0.05 0"/>
+<feBlend mode="normal" in2="shape" result="effect2_innerShadow_2_2"/>
+</filter>
+<linearGradient id="paint0_linear_2_2" x1="61" y1="130" x2="61" y2="-91.5" gradientUnits="userSpaceOnUse">
+<stop offset="0.0755157" stop-color="#563ACC"/>
+<stop offset="0.520094" stop-color="#6364FF"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/javascript/images/icon_cached.svg b/app/javascript/images/icon_cached.svg
deleted file mode 100644
index 1087c4350..000000000
--- a/app/javascript/images/icon_cached.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg width="2048" height="1792" viewBox="0 0 2048 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1344 1504q0 13-9.5 22.5t-22.5 9.5h-960q-8 0-13.5-2t-9-7-5.5-8-3-11.5-1-11.5v-600h-192q-26 0-45-19t-19-45q0-24 15-41l320-384q19-22 49-22t49 22l320 384q15 17 15 41 0 26-19 45t-45 19h-192v384h576q16 0 25 11l160 192q7 10 7 21zm640-416q0 24-15 41l-320 384q-20 23-49 23t-49-23l-320-384q-15-17-15-41 0-26 19-45t45-19h192v-384h-576q-16 0-25-12l-160-192q-7-9-7-20 0-13 9.5-22.5t22.5-9.5h960q8 0 13.5 2t9 7 5.5 8 3 11.5 1 11.5v600h192q26 0 45 19t19 45z" fill="#fff"/></svg>
diff --git a/app/javascript/images/icon_done.svg b/app/javascript/images/icon_done.svg
deleted file mode 100644
index 446af14d9..000000000
--- a/app/javascript/images/icon_done.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg fill="#FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
-    <path d="M0 0h24v24H0z" fill="none"/>
-    <path d="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z"/>
-</svg>
\ No newline at end of file
diff --git a/app/javascript/images/icon_email.svg b/app/javascript/images/icon_email.svg
deleted file mode 100644
index 6d0ad9d9b..000000000
--- a/app/javascript/images/icon_email.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg fill="#FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
-    <path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/>
-    <path d="M0 0h24v24H0z" fill="none"/>
-</svg>
\ No newline at end of file
diff --git a/app/javascript/images/icon_file_download.svg b/app/javascript/images/icon_file_download.svg
deleted file mode 100644
index 53e97e4f8..000000000
--- a/app/javascript/images/icon_file_download.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg fill="#FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
-    <path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/>
-    <path d="M0 0h24v24H0z" fill="none"/>
-</svg>
\ No newline at end of file
diff --git a/app/javascript/images/icon_flag.svg b/app/javascript/images/icon_flag.svg
deleted file mode 100644
index 3939c9d2b..000000000
--- a/app/javascript/images/icon_flag.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg fill="#FFFFFF" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-  <path d="M0 0h24v24H0z" fill="none"/>
-  <path d="M14.4 6L14 4H5v17h2v-7h5.6l.4 2h7V6z"/>
-</svg>
diff --git a/app/javascript/images/icon_grade.svg b/app/javascript/images/icon_grade.svg
deleted file mode 100644
index f48b46889..000000000
--- a/app/javascript/images/icon_grade.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg fill="#FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
-    <path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/>
-    <path d="M0 0h24v24H0z" fill="none"/>
-</svg>
\ No newline at end of file
diff --git a/app/javascript/images/icon_lock_open.svg b/app/javascript/images/icon_lock_open.svg
deleted file mode 100644
index 3288b46d6..000000000
--- a/app/javascript/images/icon_lock_open.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg fill="#FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
-    <path d="M0 0h24v24H0z" fill="none"/>
-    <path d="M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm0 12H6V10h12v10z"/>
-</svg>
\ No newline at end of file
diff --git a/app/javascript/images/icon_person_add.svg b/app/javascript/images/icon_person_add.svg
deleted file mode 100644
index 068b8ae7c..000000000
--- a/app/javascript/images/icon_person_add.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg fill="#FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
-    <path d="M0 0h24v24H0z" fill="none"/>
-    <path d="M15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm-9-2V7H4v3H1v2h3v3h2v-3h3v-2H6zm9 4c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/>
-</svg>
\ No newline at end of file
diff --git a/app/javascript/images/icon_reply.svg b/app/javascript/images/icon_reply.svg
deleted file mode 100644
index cf6a09abc..000000000
--- a/app/javascript/images/icon_reply.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg fill="#FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
-    <path d="M10 9V5l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z"/>
-    <path d="M0 0h24v24H0z" fill="none"/>
-</svg>
\ No newline at end of file
diff --git a/app/javascript/images/icons/icon_cached.svg b/app/javascript/images/icons/icon_cached.svg
new file mode 100644
index 000000000..d938e9bad
--- /dev/null
+++ b/app/javascript/images/icons/icon_cached.svg
@@ -0,0 +1 @@
+<svg width="512" height="512" viewBox="0 0 2048 1792" xmlns="http://www.w3.org/2000/svg" fill="#fff"><path d="M1344 1504q0 13-9.5 22.5t-22.5 9.5h-960q-8 0-13.5-2t-9-7-5.5-8-3-11.5-1-11.5v-600h-192q-26 0-45-19t-19-45q0-24 15-41l320-384q19-22 49-22t49 22l320 384q15 17 15 41 0 26-19 45t-45 19h-192v384h576q16 0 25 11l160 192q7 10 7 21zm640-416q0 24-15 41l-320 384q-20 23-49 23t-49-23l-320-384q-15-17-15-41 0-26 19-45t45-19h192v-384h-576q-16 0-25-12l-160-192q-7-9-7-20 0-13 9.5-22.5t22.5-9.5h960q8 0 13.5 2t9 7 5.5 8 3 11.5 1 11.5v600h192q26 0 45 19t19 45z"/></svg>
diff --git a/app/javascript/images/icons/icon_done.svg b/app/javascript/images/icons/icon_done.svg
new file mode 100644
index 000000000..a35ab87a1
--- /dev/null
+++ b/app/javascript/images/icons/icon_done.svg
@@ -0,0 +1 @@
+<svg fill="#fff" width="512" height="512" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z"/></svg>
diff --git a/app/javascript/images/icons/icon_email.svg b/app/javascript/images/icons/icon_email.svg
new file mode 100644
index 000000000..0215b6f3a
--- /dev/null
+++ b/app/javascript/images/icons/icon_email.svg
@@ -0,0 +1 @@
+<svg fill="#fff" width="512" height="512" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
diff --git a/app/javascript/images/icons/icon_file_download.svg b/app/javascript/images/icons/icon_file_download.svg
new file mode 100644
index 000000000..dc6d6bce3
--- /dev/null
+++ b/app/javascript/images/icons/icon_file_download.svg
@@ -0,0 +1 @@
+<svg fill="#fff" width="512" height="512" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
diff --git a/app/javascript/images/icons/icon_flag.svg b/app/javascript/images/icons/icon_flag.svg
new file mode 100644
index 000000000..fe07808fa
--- /dev/null
+++ b/app/javascript/images/icons/icon_flag.svg
@@ -0,0 +1 @@
+<svg fill="#fff" width="512" height="512" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M14.4 6L14 4H5v17h2v-7h5.6l.4 2h7V6z"/></svg>
diff --git a/app/javascript/images/icons/icon_grade.svg b/app/javascript/images/icons/icon_grade.svg
new file mode 100644
index 000000000..f8dd93864
--- /dev/null
+++ b/app/javascript/images/icons/icon_grade.svg
@@ -0,0 +1 @@
+<svg fill="#fff" width="512" height="512" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
diff --git a/app/javascript/images/icons/icon_lock_open.svg b/app/javascript/images/icons/icon_lock_open.svg
new file mode 100644
index 000000000..12f559beb
--- /dev/null
+++ b/app/javascript/images/icons/icon_lock_open.svg
@@ -0,0 +1 @@
+<svg fill="#fff" width="512" height="512" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 17c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6-9h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h1.9c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm0 12H6V10h12v10z"/></svg>
diff --git a/app/javascript/images/icons/icon_person_add.svg b/app/javascript/images/icons/icon_person_add.svg
new file mode 100644
index 000000000..370536333
--- /dev/null
+++ b/app/javascript/images/icons/icon_person_add.svg
@@ -0,0 +1 @@
+<svg fill="#fff" width="512" height="512" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm-9-2V7H4v3H1v2h3v3h2v-3h3v-2H6zm9 4c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"/></svg>
diff --git a/app/javascript/images/icons/icon_reply.svg b/app/javascript/images/icons/icon_reply.svg
new file mode 100644
index 000000000..9f99e4cbf
--- /dev/null
+++ b/app/javascript/images/icons/icon_reply.svg
@@ -0,0 +1 @@
+<svg fill="#fff" width="512" height="512" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M10 9V5l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11z"/><path d="M0 0h24v24H0z" fill="none"/></svg>
diff --git a/app/javascript/images/logo-symbol-icon.svg b/app/javascript/images/logo-symbol-icon.svg
new file mode 100644
index 000000000..56cf03921
--- /dev/null
+++ b/app/javascript/images/logo-symbol-icon.svg
@@ -0,0 +1,2 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="79" height="79" viewBox="0 0 79 75"><symbol id="logo-symbol-icon"><path d="M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z" fill="currentColor"/></symbol><use xlink:href="#logo-symbol-icon" style="color:#fff" /></svg>
+
diff --git a/app/javascript/images/logo-symbol-wordmark.svg b/app/javascript/images/logo-symbol-wordmark.svg
new file mode 100644
index 000000000..7e7f7b087
--- /dev/null
+++ b/app/javascript/images/logo-symbol-wordmark.svg
@@ -0,0 +1,11 @@
+<svg width="261" height="66" viewBox="0 0 261 66" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<symbol id="logo-symbol-wordmark"><path d="M60.7539 14.4034C59.8143 7.41942 53.7273 1.91557 46.5117 0.849066C45.2943 0.668854 40.6819 0.0130005 29.9973 0.0130005H29.9175C19.2299 0.0130005 16.937 0.668854 15.7196 0.849066C8.70488 1.88602 2.29885 6.83152 0.744617 13.8982C-0.00294988 17.3784 -0.0827298 21.2367 0.0561464 24.7759C0.254119 29.8514 0.292531 34.918 0.753482 39.9728C1.07215 43.3305 1.62806 46.6614 2.41704 49.9406C3.89445 55.9969 9.87499 61.0369 15.7344 63.0931C22.0077 65.2374 28.7542 65.5934 35.2184 64.1212C35.9295 63.9558 36.6318 63.7638 37.3252 63.5451C38.8971 63.0459 40.738 62.4875 42.0913 61.5067C42.1099 61.4929 42.1251 61.4751 42.1358 61.4547C42.1466 61.4342 42.1526 61.4116 42.1534 61.3885V56.4903C42.153 56.4687 42.1479 56.4475 42.1383 56.4281C42.1287 56.4088 42.1149 56.3918 42.0979 56.3785C42.0809 56.3652 42.0611 56.3559 42.04 56.3512C42.019 56.3465 41.9971 56.3466 41.9761 56.3514C37.8345 57.3406 33.5905 57.8364 29.3324 57.8286C22.0045 57.8286 20.0336 54.3514 19.4693 52.9038C19.0156 51.6527 18.7275 50.3476 18.6124 49.0218C18.6112 48.9996 18.6153 48.9773 18.6243 48.9569C18.6333 48.9366 18.647 48.9186 18.6643 48.9045C18.6816 48.8904 18.7019 48.8805 18.7237 48.8758C18.7455 48.871 18.7681 48.8715 18.7897 48.8771C22.8622 49.8595 27.037 50.3553 31.2265 50.3542C32.234 50.3542 33.2387 50.3542 34.2463 50.3276C38.4598 50.2094 42.9009 49.9938 47.0465 49.1843C47.1499 49.1636 47.2534 49.1459 47.342 49.1193C53.881 47.8637 60.1038 43.9227 60.7362 33.9431C60.7598 33.5502 60.8189 29.8278 60.8189 29.4201C60.8218 28.0345 61.2651 19.5911 60.7539 14.4034Z" fill="url(#paint0_linear_89_11)"/>
+<path d="M12.3442 18.3034C12.3442 16.2668 13.9777 14.6194 15.997 14.6194C18.0163 14.6194 19.6497 16.2668 19.6497 18.3034C19.6497 20.34 18.0163 21.9874 15.997 21.9874C13.9777 21.9874 12.3442 20.34 12.3442 18.3034Z" fill="currentColor"/>
+<path d="M66.1484 21.4685V38.3839H59.4988V21.9744C59.4988 18.5109 58.0583 16.7597 55.1643 16.7597C51.9746 16.7597 50.3668 18.8482 50.3668 22.9603V31.9499H43.7687V22.9603C43.7687 18.8352 42.1738 16.7597 38.9712 16.7597C36.0901 16.7597 34.6367 18.5109 34.6367 21.9744V38.3839H28V21.4685C28 18.018 28.8746 15.268 30.6238 13.2314C32.4374 11.1948 34.8039 10.157 37.7365 10.157C41.132 10.157 43.7172 11.4802 45.415 14.1135L47.0742 16.9154L48.7334 14.1135C50.4311 11.4802 53.0035 10.157 56.4119 10.157C59.3444 10.157 61.711 11.1948 63.5246 13.2314C65.2738 15.268 66.1484 18.005 66.1484 21.4685ZM89.0297 29.8743C90.4059 28.4085 91.0619 26.5795 91.0619 24.3613C91.0619 22.1431 90.4059 20.3011 89.0297 18.9001C87.7049 17.4343 86.0329 16.7338 84.0007 16.7338C81.9685 16.7338 80.2965 17.4343 78.9717 18.9001C77.6469 20.3011 76.991 22.1431 76.991 24.3613C76.991 26.5795 77.6469 28.4215 78.9717 29.8743C80.2965 31.2753 81.9685 31.9888 84.0007 31.9888C86.0329 31.9888 87.7049 31.2883 89.0297 29.8743ZM91.0619 10.8316H97.6086V37.891H91.0619V34.6999C89.0811 37.3462 86.3416 38.6563 82.7788 38.6563C79.2161 38.6563 76.4765 37.3073 74.0456 34.5442C71.6533 31.7812 70.4443 28.3696 70.4443 24.3743C70.4443 20.3789 71.6661 17.0192 74.0456 14.2561C76.4893 11.4931 79.3833 10.0922 82.7788 10.0922C86.1744 10.0922 89.0811 11.3894 91.0619 14.0356V10.8445V10.8316ZM119.654 23.8683C121.583 25.3342 122.548 27.3837 122.496 29.9781C122.496 32.7411 121.532 34.9075 119.551 36.4122C117.57 37.878 115.178 38.6304 112.284 38.6304C107.049 38.6304 103.499 36.4641 101.621 32.1963L107.306 28.7847C108.065 31.1067 109.737 32.3001 112.284 32.3001C114.625 32.3001 115.782 31.5477 115.782 29.9781C115.782 28.8366 114.265 27.8118 111.165 27.0075C109.995 26.6833 109.03 26.359 108.271 26.0865C107.204 25.6585 106.29 25.1655 105.532 24.5688C103.654 23.103 102.689 21.1572 102.689 18.6666C102.689 16.0203 103.602 13.9059 105.429 12.3882C107.306 10.8186 109.596 10.0662 112.335 10.0662C116.709 10.0662 119.898 11.9601 121.982 15.7998L116.4 19.0428C115.59 17.2008 114.213 16.2798 112.335 16.2798C110.355 16.2798 109.39 17.0321 109.39 18.498C109.39 19.6395 110.908 20.6643 114.008 21.4685C116.4 22.0134 118.278 22.8176 119.641 23.8554L119.654 23.8683ZM140.477 17.538H134.741V28.7977C134.741 30.1468 135.255 30.964 136.22 31.3402C136.927 31.6126 138.355 31.6645 140.49 31.5607V37.891C136.079 38.4358 132.876 37.9948 130.998 36.5419C129.12 35.1409 128.207 32.5336 128.207 28.8106V17.538H123.795V10.8316H128.207V5.37038L134.754 3.25595V10.8316H140.49V17.538H140.477ZM161.352 29.7187C162.677 28.3177 163.333 26.5276 163.333 24.3613C163.333 22.195 162.677 20.4178 161.352 19.0039C160.027 17.6029 158.407 16.8894 156.426 16.8894C154.445 16.8894 152.825 17.5899 151.5 19.0039C150.227 20.4697 149.571 22.2469 149.571 24.3613C149.571 26.4757 150.227 28.2529 151.5 29.7187C152.825 31.1196 154.445 31.8331 156.426 31.8331C158.407 31.8331 160.027 31.1326 161.352 29.7187ZM146.883 34.5313C144.297 31.7682 143.024 28.4215 143.024 24.3613C143.024 20.3011 144.297 17.0062 146.883 14.2432C149.468 11.4802 152.67 10.0792 156.426 10.0792C160.182 10.0792 163.384 11.4802 165.97 14.2432C168.555 17.0062 169.88 20.4178 169.88 24.3613C169.88 28.3047 168.555 31.7682 165.97 34.5313C163.384 37.2943 160.233 38.6434 156.426 38.6434C152.619 38.6434 149.468 37.2943 146.883 34.5313ZM191.771 29.8743C193.095 28.4085 193.751 26.5795 193.751 24.3613C193.751 22.1431 193.095 20.3011 191.771 18.9001C190.446 17.4343 188.774 16.7338 186.742 16.7338C184.709 16.7338 183.037 17.4343 181.661 18.9001C180.336 20.3011 179.68 22.1431 179.68 24.3613C179.68 26.5795 180.336 28.4215 181.661 29.8743C183.037 31.2753 184.761 31.9888 186.742 31.9888C188.722 31.9888 190.446 31.2883 191.771 29.8743ZM193.751 0H200.298V37.891H193.751V34.6999C191.822 37.3462 189.082 38.6563 185.52 38.6563C181.957 38.6563 179.179 37.3073 176.735 34.5442C174.343 31.7812 173.134 28.3696 173.134 24.3743C173.134 20.3789 174.356 17.0192 176.735 14.2561C179.166 11.4931 182.111 10.0922 185.52 10.0922C188.928 10.0922 191.822 11.3894 193.751 14.0356V0.0129719V0ZM223.308 29.7057C224.633 28.3047 225.289 26.5146 225.289 24.3483C225.289 22.182 224.633 20.4048 223.308 18.9909C221.983 17.5899 220.363 16.8765 218.382 16.8765C216.401 16.8765 214.78 17.577 213.456 18.9909C212.182 20.4567 211.526 22.2339 211.526 24.3483C211.526 26.4627 212.182 28.2399 213.456 29.7057C214.78 31.1067 216.401 31.8201 218.382 31.8201C220.363 31.8201 221.983 31.1196 223.308 29.7057ZM208.838 34.5183C206.253 31.7553 204.98 28.4085 204.98 24.3483C204.98 20.2881 206.253 16.9932 208.838 14.2302C211.424 11.4672 214.626 10.0662 218.382 10.0662C222.137 10.0662 225.34 11.4672 227.925 14.2302C230.511 16.9932 231.835 20.4048 231.835 24.3483C231.835 28.2918 230.511 31.7553 227.925 34.5183C225.34 37.2813 222.189 38.6304 218.382 38.6304C214.575 38.6304 211.424 37.2813 208.838 34.5183ZM260.17 21.261V37.878H253.623V22.1301C253.623 20.34 253.173 18.9909 252.247 17.9661C251.385 17.0451 250.164 16.5651 248.594 16.5651C244.89 16.5651 243.012 18.7833 243.012 23.2716V37.878H236.466V10.8316H243.012V13.867C244.581 11.3245 247.077 10.0792 250.575 10.0792C253.366 10.0792 255.656 11.0521 257.431 13.0498C259.257 15.0474 260.17 17.7586 260.17 21.274" fill="currentColor"/>
+<defs>
+<linearGradient id="paint0_linear_89_11" x1="30.5" y1="0.0130005" x2="30.5" y2="65.013" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6364FF"/>
+<stop offset="1" stop-color="#563ACC"/>
+</linearGradient>
+</defs></symbol><use xlink:href="#logo-symbol-wordmark" style="color:#fff"/>
+</svg>
diff --git a/app/javascript/images/logo.svg b/app/javascript/images/logo.svg
index 034a9c221..11d0c30c5 100644
--- a/app/javascript/images/logo.svg
+++ b/app/javascript/images/logo.svg
@@ -1 +1,10 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.4144 232.00976"><path d="M211.80734 139.0875c-3.18125 16.36625-28.4925 34.2775-57.5625 37.74875-15.15875 1.80875-30.08375 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.39125 27.9425 21.11625.7225 39.91875-5.20625 39.91875-5.20625l.8675 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23234 213.82 1.40609 165.31125.20859 116.09125c-.365-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67234 3.45375 78.20359.2425 107.86484 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.975 14.7525 32.975 65.0825 0 0 .41375 37.13375-4.59875 62.915" fill="#3088d4"/><path d="M177.50984 80.077v60.94125h-24.14375v-59.15c0-12.46875-5.24625-18.7975-15.74-18.7975-11.6025 0-17.4175 7.5075-17.4175 22.3525v32.37625H96.20734V85.42325c0-14.845-5.81625-22.3525-17.41875-22.3525-10.49375 0-15.74 6.32875-15.74 18.7975v59.15H38.90484V80.077c0-12.455 3.17125-22.3525 9.54125-29.675 6.56875-7.3225 15.17125-11.07625 25.85-11.07625 12.355 0 21.71125 4.74875 27.8975 14.2475l6.01375 10.08125 6.015-10.08125c6.185-9.49875 15.54125-14.2475 27.8975-14.2475 10.6775 0 19.28 3.75375 25.85 11.07625 6.36875 7.3225 9.54 17.22 9.54 29.675" fill="#fff"/></svg>
+<svg width="65" height="65" viewBox="0 0 61 65" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M60.7539 14.3904C59.8143 7.40642 53.7273 1.90257 46.5117 0.836066C45.2943 0.655854 40.6819 0 29.9973 0H29.9175C19.2299 0 16.937 0.655854 15.7196 0.836066C8.70488 1.87302 2.29885 6.81852 0.744617 13.8852C-0.00294988 17.3654 -0.0827298 21.2237 0.0561464 24.7629C0.254119 29.8384 0.292531 34.905 0.753482 39.9598C1.07215 43.3175 1.62806 46.6484 2.41704 49.9276C3.89445 55.9839 9.87499 61.0239 15.7344 63.0801C22.0077 65.2244 28.7542 65.5804 35.2184 64.1082C35.9295 63.9428 36.6318 63.7508 37.3252 63.5321C38.8971 63.0329 40.738 62.4745 42.0913 61.4937C42.1099 61.4799 42.1251 61.4621 42.1358 61.4417C42.1466 61.4212 42.1526 61.3986 42.1534 61.3755V56.4773C42.153 56.4557 42.1479 56.4345 42.1383 56.4151C42.1287 56.3958 42.1149 56.3788 42.0979 56.3655C42.0809 56.3522 42.0611 56.3429 42.04 56.3382C42.019 56.3335 41.9971 56.3336 41.9761 56.3384C37.8345 57.3276 33.5905 57.8234 29.3324 57.8156C22.0045 57.8156 20.0336 54.3384 19.4693 52.8908C19.0156 51.6397 18.7275 50.3346 18.6124 49.0088C18.6112 48.9866 18.6153 48.9643 18.6243 48.9439C18.6333 48.9236 18.647 48.9056 18.6643 48.8915C18.6816 48.8774 18.7019 48.8675 18.7237 48.8628C18.7455 48.858 18.7681 48.8585 18.7897 48.8641C22.8622 49.8465 27.037 50.3423 31.2265 50.3412C32.234 50.3412 33.2387 50.3412 34.2463 50.3146C38.4598 50.1964 42.9009 49.9808 47.0465 49.1713C47.1499 49.1506 47.2534 49.1329 47.342 49.1063C53.881 47.8507 60.1038 43.9097 60.7362 33.9301C60.7598 33.5372 60.8189 29.8148 60.8189 29.4071C60.8218 28.0215 61.2651 19.5781 60.7539 14.3904Z" fill="url(#paint0_linear_89_8)"/>
+<path d="M50.3943 22.237V39.5876H43.5185V22.7481C43.5185 19.2029 42.0411 17.3949 39.036 17.3949C35.7325 17.3949 34.0778 19.5338 34.0778 23.7585V32.9759H27.2434V23.7585C27.2434 19.5338 25.5857 17.3949 22.2822 17.3949C19.2949 17.3949 17.8027 19.2029 17.8027 22.7481V39.5876H10.9298V22.237C10.9298 18.6918 11.835 15.8754 13.6453 13.7877C15.5128 11.7049 17.9623 10.6355 21.0028 10.6355C24.522 10.6355 27.1813 11.9885 28.9542 14.6917L30.665 17.5633L32.3788 14.6917C34.1517 11.9885 36.811 10.6355 40.3243 10.6355C43.3619 10.6355 45.8114 11.7049 47.6847 13.7877C49.4931 15.8734 50.3963 18.6899 50.3943 22.237Z" fill="white"/>
+<defs>
+<linearGradient id="paint0_linear_89_8" x1="30.5" y1="0" x2="30.5" y2="65" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6364FF"/>
+<stop offset="1" stop-color="#563ACC"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/javascript/images/logo_full.svg b/app/javascript/images/logo_full.svg
deleted file mode 100644
index 03bcf93e3..000000000
--- a/app/javascript/images/logo_full.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg"><symbol id="mastodon-svg-logo-full" viewBox="0 0 713.35878 175.8678"><path d="M160.55476 105.43125c-2.4125 12.40625-21.5975 25.9825-43.63375 28.61375-11.49125 1.3725-22.80375 2.63125-34.8675 2.07875-19.73-.90375-35.2975-4.71-35.2975-4.71 0 1.92125.11875 3.75.355 5.46 2.565 19.47 19.3075 20.6375 35.16625 21.18125 16.00625.5475 30.2575-3.9475 30.2575-3.9475l.65875 14.4725s-11.19625 6.01125-31.14 7.11625c-10.99875.605-24.65375-.27625-40.56-4.485C6.99851 162.08 1.06601 125.31.15851 88-.11899 76.9225.05226 66.47625.05226 57.74125c0-38.1525 24.99625-49.335 24.99625-49.335C37.65226 2.6175 59.27976.18375 81.76351 0h.5525c22.48375.18375 44.125 2.6175 56.72875 8.40625 0 0 24.99625 11.1825 24.99625 49.335 0 0 .3125 28.1475-3.48625 47.69" fill="#3088d4"/><path d="M34.65751 48.494c0-5.55375 4.5025-10.055 10.055-10.055 5.55375 0 10.055 4.50125 10.055 10.055 0 5.5525-4.50125 10.055-10.055 10.055-5.5525 0-10.055-4.5025-10.055-10.055M178.86476 60.69975v46.195h-18.30125v-44.8375c0-9.4525-3.9775-14.24875-11.9325-14.24875-8.79375 0-13.2025 5.69125-13.2025 16.94375V89.2935h-18.19375V64.75225c0-11.2525-4.40875-16.94375-13.2025-16.94375-7.955 0-11.9325 4.79625-11.9325 14.24875v44.8375H73.79851v-46.195c0-9.44125 2.40375-16.94375 7.2325-22.495 4.98-5.55 11.50125-8.395 19.595-8.395 9.36625 0 16.45875 3.59875 21.14625 10.79875l4.56 7.6425 4.55875-7.6425c4.68875-7.2 11.78-10.79875 21.1475-10.79875 8.09375 0 14.61375 2.845 19.59375 8.395 4.82875 5.55125 7.2325 13.05375 7.2325 22.495M241.91276 83.663625c3.77625-3.99 5.595-9.015 5.595-15.075 0-6.06-1.81875-11.085-5.595-14.9275-3.63625-3.99125-8.25375-5.91125-13.84875-5.91125-5.59625 0-10.2125 1.92-13.84875 5.91125-3.6375 3.8425-5.45625 8.8675-5.45625 14.9275 0 6.06 1.81875 11.085 5.45625 15.075 3.63625 3.8425 8.2525 5.76375 13.84875 5.76375 5.595 0 10.2125-1.92125 13.84875-5.76375m5.595-52.025h18.04625v73.9h-18.04625v-8.72125c-5.455 7.2425-13.01 10.79-22.80125 10.79-9.3725 0-17.34625-3.695-24.06125-11.23375-6.57375-7.5375-9.93125-16.84875-9.93125-27.785 0-10.78875 3.3575-20.10125 9.93125-27.63875 6.715-7.5375 14.68875-11.38 24.06125-11.38 9.79125 0 17.34625 3.5475 22.80125 10.78875v-8.72zM326.26951 67.258625c5.315 3.99 7.97375 9.60625 7.83375 16.7 0 7.53875-2.65875 13.45-8.11375 17.58875-5.45625 3.99125-12.03 6.06-20.00375 6.06-14.40875 0-24.20125-5.9125-29.3775-17.58875l15.66875-9.31c2.0975 6.35375 6.71375 9.60625 13.70875 9.60625 6.43375 0 9.6525-2.07 9.6525-6.35625 0-3.10375-4.1975-5.91125-12.73-8.1275-3.21875-.8875-5.87625-1.77375-7.97375-2.51375-2.9375-1.18125-5.455-2.5125-7.55375-4.1375-5.17625-3.99-7.83375-9.3125-7.83375-16.11 0-7.2425 2.5175-13.00625 7.55375-17.145 5.17625-4.28625 11.47-6.355 19.025-6.355 12.03 0 20.84375 5.1725 26.5775 15.66625l-15.38625 8.8675c-2.23875-5.02375-6.015-7.53625-11.19125-7.53625-5.45625 0-8.11375 2.06875-8.11375 6.05875 0 3.10375 4.19625 5.91125 12.73 8.12875 6.575 1.4775 11.75 3.695 15.5275 6.50375M383.626635 49.966125h-15.8075v30.7425c0 3.695 1.4 5.91125 4.0575 6.945 1.95875.74 5.875.8875 11.75.59125v17.29375c-12.16875 1.4775-20.9825.295-26.15875-3.69625-5.175-3.8425-7.69375-10.93625-7.69375-21.13375v-30.7425h-12.17v-18.3275h12.17v-14.9275l18.045-5.76375v20.69125h15.8075v18.3275zM441.124885 83.2205c3.6375-3.84375 5.455-8.72125 5.455-14.6325 0-5.91125-1.8175-10.78875-5.455-14.63125-3.6375-3.84375-8.11375-5.76375-13.57-5.76375-5.455 0-9.93125 1.92-13.56875 5.76375-3.4975 3.99-5.31625 8.8675-5.31625 14.63125 0 5.765 1.81875 10.6425 5.31625 14.6325 3.6375 3.8425 8.11375 5.76375 13.56875 5.76375 5.45625 0 9.9325-1.92125 13.57-5.76375m-39.86875 13.15375c-7.13375-7.5375-10.63125-16.70125-10.63125-27.78625 0-10.9375 3.4975-20.1 10.63125-27.6375 7.13375-7.5375 15.9475-11.38 26.29875-11.38 10.3525 0 19.165 3.8425 26.3 11.38 7.135 7.5375 10.77125 16.84875 10.77125 27.6375 0 10.9375-3.63625 20.24875-10.77125 27.78625-7.135 7.53875-15.8075 11.2325-26.3 11.2325-10.49125 0-19.165-3.69375-26.29875-11.2325M524.92126 83.663625c3.6375-3.99 5.455-9.015 5.455-15.075 0-6.06-1.8175-11.085-5.455-14.9275-3.63625-3.99125-8.25375-5.91125-13.84875-5.91125-5.59625 0-10.2125 1.92-13.98875 5.91125-3.63625 3.8425-5.45625 8.8675-5.45625 14.9275 0 6.06 1.82 11.085 5.45625 15.075 3.77625 3.8425 8.5325 5.76375 13.98875 5.76375 5.595 0 10.2125-1.92125 13.84875-5.76375m5.455-81.585h18.04625v103.46h-18.04625v-8.72125c-5.315 7.2425-12.87 10.79-22.66125 10.79-9.3725 0-17.485-3.695-24.2-11.23375-6.575-7.5375-9.9325-16.84875-9.9325-27.785 0-10.78875 3.3575-20.10125 9.9325-27.63875 6.715-7.5375 14.8275-11.38 24.2-11.38 9.79125 0 17.34625 3.5475 22.66125 10.78875v-38.28zM611.79626 83.2205c3.63625-3.84375 5.455-8.72125 5.455-14.6325 0-5.91125-1.81875-10.78875-5.455-14.63125-3.6375-3.84375-8.11375-5.76375-13.57-5.76375-5.455 0-9.9325 1.92-13.56875 5.76375-3.49875 3.99-5.31625 8.8675-5.31625 14.63125 0 5.765 1.8175 10.6425 5.31625 14.6325 3.63625 3.8425 8.11375 5.76375 13.56875 5.76375 5.45625 0 9.9325-1.92125 13.57-5.76375m-39.86875 13.15375c-7.135-7.5375-10.63125-16.70125-10.63125-27.78625 0-10.9375 3.49625-20.1 10.63125-27.6375 7.135-7.5375 15.9475-11.38 26.29875-11.38 10.3525 0 19.165 3.8425 26.3 11.38 7.135 7.5375 10.77125 16.84875 10.77125 27.6375 0 10.9375-3.63625 20.24875-10.77125 27.78625-7.135 7.53875-15.8075 11.2325-26.3 11.2325-10.49125 0-19.16375-3.69375-26.29875-11.2325M713.35876 60.163875v45.37375h-18.04625v-43.00875c0-4.8775-1.25875-8.5725-3.77625-11.38-2.37875-2.5125-5.73625-3.84375-10.0725-3.84375-10.2125 0-15.3875 6.06-15.3875 18.3275v39.905h-18.04625v-73.89875h18.04625v8.27625c4.33625-6.94625 11.19-10.345 20.84375-10.345 7.69375 0 13.98875 2.66 18.885 8.12875 5.035 5.46875 7.55375 12.85875 7.55375 22.465"/></symbol></svg>
diff --git a/app/javascript/images/logo_transparent.svg b/app/javascript/images/logo_transparent.svg
deleted file mode 100644
index a1e7b403e..000000000
--- a/app/javascript/images/logo_transparent.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg"><symbol id="mastodon-svg-logo" viewBox="0 0 216.4144 232.00976"><path d="M107.86523 0C78.203984.2425 49.672422 3.4535937 33.044922 11.089844c0 0-32.97656262 14.752031-32.97656262 65.082031 0 11.525-.224375 25.306175.140625 39.919925 1.19750002 49.22 9.02375002 97.72843 54.53124962 109.77343 20.9825 5.55375 38.99711 6.71547 53.505856 5.91797 26.31125-1.45875 41.08203-9.38867 41.08203-9.38867l-.86914-19.08984s-18.80171 5.92758-39.91796 5.20508c-20.921254-.7175-43.006879-2.25516-46.390629-27.94141-.3125-2.25625-.46875-4.66938-.46875-7.20313 0 0 20.536953 5.0204 46.564449 6.21289 15.915.73001 30.8393-.93343 45.99805-2.74218 29.07-3.47125 54.38125-21.3818 57.5625-37.74805 5.0125-25.78125 4.59961-62.916015 4.59961-62.916015 0-50.33-32.97461-65.082031-32.97461-65.082031C166.80539 3.4535938 138.255.2425 108.59375 0h-.72852zM74.296875 39.326172c12.355 0 21.710234 4.749297 27.896485 14.248047l6.01367 10.080078 6.01563-10.080078c6.185-9.49875 15.54023-14.248047 27.89648-14.248047 10.6775 0 19.28156 3.753672 25.85156 11.076172 6.36875 7.3225 9.53907 17.218828 9.53907 29.673828v60.941408h-24.14454V81.869141c0-12.46875-5.24453-18.798829-15.73828-18.798829-11.6025 0-17.41797 7.508516-17.41797 22.353516v32.375002H96.207031V85.423828c0-14.845-5.815468-22.353515-17.417969-22.353516-10.49375 0-15.740234 6.330079-15.740234 18.798829v59.148439H38.904297V80.076172c0-12.455 3.171016-22.351328 9.541015-29.673828 6.568751-7.3225 15.172813-11.076172 25.851563-11.076172z" /></symbol></svg>
diff --git a/app/javascript/images/logo_transparent_white.svg b/app/javascript/images/logo_transparent_white.svg
deleted file mode 100644
index f061ffe4c..000000000
--- a/app/javascript/images/logo_transparent_white.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.4144 232.00976"><path d="M107.86523 0C78.203984.2425 49.672422 3.4535937 33.044922 11.089844c0 0-32.97656262 14.752031-32.97656262 65.082031 0 11.525-.224375 25.306175.140625 39.919925 1.19750002 49.22 9.02375002 97.72843 54.53124962 109.77343 20.9825 5.55375 38.99711 6.71547 53.505856 5.91797 26.31125-1.45875 41.08203-9.38867 41.08203-9.38867l-.86914-19.08984s-18.80171 5.92758-39.91796 5.20508c-20.921254-.7175-43.006879-2.25516-46.390629-27.94141-.3125-2.25625-.46875-4.66938-.46875-7.20313 0 0 20.536953 5.0204 46.564449 6.21289 15.915.73001 30.8393-.93343 45.99805-2.74218 29.07-3.47125 54.38125-21.3818 57.5625-37.74805 5.0125-25.78125 4.59961-62.916015 4.59961-62.916015 0-50.33-32.97461-65.082031-32.97461-65.082031C166.80539 3.4535938 138.255.2425 108.59375 0h-.72852zM74.296875 39.326172c12.355 0 21.710234 4.749297 27.896485 14.248047l6.01367 10.080078 6.01563-10.080078c6.185-9.49875 15.54023-14.248047 27.89648-14.248047 10.6775 0 19.28156 3.753672 25.85156 11.076172 6.36875 7.3225 9.53907 17.218828 9.53907 29.673828v60.941408h-24.14454V81.869141c0-12.46875-5.24453-18.798829-15.73828-18.798829-11.6025 0-17.41797 7.508516-17.41797 22.353516v32.375002H96.207031V85.423828c0-14.845-5.815468-22.353515-17.417969-22.353516-10.49375 0-15.740234 6.330079-15.740234 18.798829v59.148439H38.904297V80.076172c0-12.455 3.171016-22.351328 9.541015-29.673828 6.568751-7.3225 15.172813-11.076172 25.851563-11.076172z" fill="#fff"/></svg>
diff --git a/app/javascript/images/mailer/icon_cached.png b/app/javascript/images/mailer/icon_cached.png
index 5c993dbee..e94abb7ba 100644
--- a/app/javascript/images/mailer/icon_cached.png
+++ b/app/javascript/images/mailer/icon_cached.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_done.png b/app/javascript/images/mailer/icon_done.png
index f7f95a0e8..472364de4 100644
--- a/app/javascript/images/mailer/icon_done.png
+++ b/app/javascript/images/mailer/icon_done.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_email.png b/app/javascript/images/mailer/icon_email.png
index 13967009a..d8dfe161e 100644
--- a/app/javascript/images/mailer/icon_email.png
+++ b/app/javascript/images/mailer/icon_email.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_file_download.png b/app/javascript/images/mailer/icon_file_download.png
index 3f7ac429b..24e424d3b 100644
--- a/app/javascript/images/mailer/icon_file_download.png
+++ b/app/javascript/images/mailer/icon_file_download.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_flag.png b/app/javascript/images/mailer/icon_flag.png
new file mode 100644
index 000000000..0f14f45a8
--- /dev/null
+++ b/app/javascript/images/mailer/icon_flag.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_grade.png b/app/javascript/images/mailer/icon_grade.png
index 8c212b7ee..7f371ab11 100644
--- a/app/javascript/images/mailer/icon_grade.png
+++ b/app/javascript/images/mailer/icon_grade.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_lock_open.png b/app/javascript/images/mailer/icon_lock_open.png
index c854c3bdb..d11c36475 100644
--- a/app/javascript/images/mailer/icon_lock_open.png
+++ b/app/javascript/images/mailer/icon_lock_open.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_person_add.png b/app/javascript/images/mailer/icon_person_add.png
index 6290a42ae..696eb7495 100644
--- a/app/javascript/images/mailer/icon_person_add.png
+++ b/app/javascript/images/mailer/icon_person_add.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_reply.png b/app/javascript/images/mailer/icon_reply.png
index a70093356..51d92f845 100644
--- a/app/javascript/images/mailer/icon_reply.png
+++ b/app/javascript/images/mailer/icon_reply.png
Binary files differdiff --git a/app/javascript/images/mailer/icon_warning.png b/app/javascript/images/mailer/icon_warning.png
deleted file mode 100644
index 7baaac61c..000000000
--- a/app/javascript/images/mailer/icon_warning.png
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/mailer/logo.png b/app/javascript/images/mailer/logo.png
new file mode 100644
index 000000000..77d0ef849
--- /dev/null
+++ b/app/javascript/images/mailer/logo.png
Binary files differdiff --git a/app/javascript/images/mailer/logo_full.png b/app/javascript/images/mailer/logo_full.png
deleted file mode 100644
index 82d981fc6..000000000
--- a/app/javascript/images/mailer/logo_full.png
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/mailer/logo_transparent.png b/app/javascript/images/mailer/logo_transparent.png
deleted file mode 100644
index 6dbcc2e8d..000000000
--- a/app/javascript/images/mailer/logo_transparent.png
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/mailer/wordmark.png b/app/javascript/images/mailer/wordmark.png
new file mode 100644
index 000000000..defe50178
--- /dev/null
+++ b/app/javascript/images/mailer/wordmark.png
Binary files differdiff --git a/app/javascript/images/preview.jpg b/app/javascript/images/preview.jpg
deleted file mode 100644
index ec2856748..000000000
--- a/app/javascript/images/preview.jpg
+++ /dev/null
Binary files differdiff --git a/app/javascript/images/preview.png b/app/javascript/images/preview.png
new file mode 100644
index 000000000..369bed4b6
--- /dev/null
+++ b/app/javascript/images/preview.png
Binary files differdiff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js
index e665f4447..68017a5f1 100644
--- a/app/javascript/mastodon/features/ui/components/columns_area.js
+++ b/app/javascript/mastodon/features/ui/components/columns_area.js
@@ -50,7 +50,7 @@ const componentMap = {
 };
 
 const messages = defineMessages({
-  publish: { id: 'compose_form.publish', defaultMessage: 'Toot' },
+  publish: { id: 'compose_form.publish', defaultMessage: 'Publish' },
 });
 
 const shouldHideFAB = path => path.match(/^\/statuses\/|^\/@[^/]+\/\d+|^\/publish|^\/explore|^\/getting-started|^\/start/);
diff --git a/app/javascript/mastodon/locales/af.json b/app/javascript/mastodon/locales/af.json
index e25b0d7ee..52cb08217 100644
--- a/app/javascript/mastodon/locales/af.json
+++ b/app/javascript/mastodon/locales/af.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Verwyder hierdie keuse",
   "compose_form.poll.switch_to_multiple": "Verander die peiling na verskeie keuses",
   "compose_form.poll.switch_to_single": "Verander die peiling na 'n enkel keuse",
-  "compose_form.publish": "Toet",
+  "compose_form.publish": "Publisheer",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Stoor veranderinge",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 2a592ffd2..406868d65 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -17,7 +17,7 @@
   "account.follow": "متابعة",
   "account.followers": "مُتابِعون",
   "account.followers.empty": "لا أحدَ يُتابع هذا المُستخدم إلى حد الآن.",
-  "account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two{مُتابعانِ اِثنان} few{{counter} مُتابِعين} many{{counter}  مُتابِعًا} other {{counter}  مُتابع}}",
+  "account.followers_counter": "{count, plural, zero{لا مُتابع} one {مُتابعٌ واحِد} two {مُتابعانِ اِثنان} few {{counter} مُتابِعين} many {{counter} مُتابِعًا} other {{counter} مُتابع}}",
   "account.following": "الإشتراكات",
   "account.following_counter": "{count, plural, zero{لا يُتابِع} one {يُتابِعُ واحد} two{يُتابِعُ اِثنان} few{يُتابِعُ {counter}} many{يُتابِعُ {counter}} other {يُتابِعُ {counter}}}",
   "account.follows.empty": "لا يُتابع هذا المُستخدمُ أيَّ أحدٍ حتى الآن.",
@@ -95,7 +95,7 @@
   "compose.language.change": "تغيير اللغة",
   "compose.language.search": "البحث عن لغة…",
   "compose_form.direct_message_warning_learn_more": "تَعَلَّم المَزيد",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "إنّ المنشورات على ماستدون ليست مشفرة من النهاية إلى النهاية. لا تشارك أي معلومات حساسة عبر ماستدون.",
   "compose_form.hashtag_warning": "لن يُدرَج هذا المنشور تحت أي وسم بما أنَّه غير مُدرَج. فقط المنشورات العامة يُمكن البحث عنها بواسطة الوسم.",
   "compose_form.lock_disclaimer": "حسابُك غير {locked}. يُمكن لأي شخص مُتابعتك لرؤية (منشورات المتابعين فقط).",
   "compose_form.lock_disclaimer.lock": "مُقفَل",
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "إزالة هذا الخيار",
   "compose_form.poll.switch_to_multiple": "تغيِير الاستطلاع للسماح باِخيارات مُتعدِّدة",
   "compose_form.poll.switch_to_single": "تغيِير الاستطلاع للسماح باِخيار واحد فقط",
-  "compose_form.publish": "بوّق",
+  "compose_form.publish": "انشر",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "احفظ التعديلات",
   "compose_form.sensitive.hide": "{count, plural, one {الإشارة إلى الوَسط كمُحتوى حسّاس} two{الإشارة إلى الوسطان كمُحتويان حسّاسان} other {الإشارة إلى الوسائط كمُحتويات حسّاسة}}",
@@ -512,8 +512,8 @@
   "trends.trending_now": "المتداولة الآن",
   "ui.beforeunload": "سوف تفقد مسودتك إن تركت ماستدون.",
   "units.short.billion": "{count} مليار",
-  "units.short.million": "{count}  مليون",
-  "units.short.thousand": "{count}  ألف",
+  "units.short.million": "{count} مليون",
+  "units.short.thousand": "{count} ألف",
   "upload_area.title": "اسحب ثم أفلت للرفع",
   "upload_button.label": "إضافة وسائط",
   "upload_error.limit": "لقد تم بلوغ الحد الأقصى المسموح به لإرسال الملفات.",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 148527b96..0f18f7376 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Desaniciar esta escoyeta",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Barritar",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 06d4760f0..69f4796ff 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Премахване на този избор",
   "compose_form.poll.switch_to_multiple": "Промяна на анкетата, за да се позволят множество възможни избора",
   "compose_form.poll.switch_to_single": "Промяна на анкетата, за да се позволи един възможен избор",
-  "compose_form.publish": "Раздумай",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Маркиране на мултимедията като деликатна} other {Маркиране на мултимедиите като деликатни}}",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index e89f4690b..912a7eb7e 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "এই বিকল্পটি মুছে ফেলুন",
   "compose_form.poll.switch_to_multiple": "একাধিক পছন্দ অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
   "compose_form.poll.switch_to_single": "একটি একক পছন্দের অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
-  "compose_form.publish": "টুট",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করতে",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index cbe7fc6cb..c5559a277 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -41,7 +41,7 @@
   "account.statuses_counter": "{count, plural, one {{counter} Toud} other {{counter} Toud}}",
   "account.unblock": "Diverzañ @{name}",
   "account.unblock_domain": "Diverzañ an domani {domain}",
-  "account.unblock_short": "Unblock",
+  "account.unblock_short": "Distankañ",
   "account.unendorse": "Paouez da lakaat war-wel war ar profil",
   "account.unfollow": "Diheuliañ",
   "account.unmute": "Diguzhat @{name}",
@@ -92,7 +92,7 @@
   "community.column_settings.local_only": "Nemet lec'hel",
   "community.column_settings.media_only": "Nemet Mediaoù",
   "community.column_settings.remote_only": "Nemet a-bell",
-  "compose.language.change": "Change language",
+  "compose.language.change": "Cheñch yezh",
   "compose.language.search": "Search languages...",
   "compose_form.direct_message_warning_learn_more": "Gouzout hiroc'h",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Lemel an dibab-mañ",
   "compose_form.poll.switch_to_multiple": "Kemmañ ar sontadeg evit aotren meur a zibab",
   "compose_form.poll.switch_to_single": "Kemmañ ar sontadeg evit aotren un dibab hepken",
-  "compose_form.publish": "Toudañ",
+  "compose_form.publish": "Embann",
   "compose_form.publish_loud": "{publish} !",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "Merkañ ar media evel kizidik",
@@ -191,9 +191,9 @@
   "errors.unexpected_crash.copy_stacktrace": "Eilañ ar roudoù diveugañ er golver",
   "errors.unexpected_crash.report_issue": "Danevellañ ur fazi",
   "explore.search_results": "Disoc'hoù an enklask",
-  "explore.suggested_follows": "For you",
+  "explore.suggested_follows": "Evidoc'h",
   "explore.title": "Ergerzhit",
-  "explore.trending_links": "News",
+  "explore.trending_links": "Keleier",
   "explore.trending_statuses": "Posts",
   "explore.trending_tags": "Gerioù-klik",
   "follow_recommendations.done": "Graet",
@@ -295,11 +295,11 @@
   "navigation_bar.bookmarks": "Sinedoù",
   "navigation_bar.community_timeline": "Red-amzer lec'hel",
   "navigation_bar.compose": "Skrivañ un toud nevez",
-  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.direct": "Kemennadoù prevez",
   "navigation_bar.discover": "Dizoleiñ",
   "navigation_bar.domain_blocks": "Domanioù kuzhet",
   "navigation_bar.edit_profile": "Aozañ ar profil",
-  "navigation_bar.explore": "Explore",
+  "navigation_bar.explore": "Ergerzhit",
   "navigation_bar.favourites": "Ar re vuiañ-karet",
   "navigation_bar.filters": "Gerioù kuzhet",
   "navigation_bar.follow_requests": "Pedadoù heuliañ",
@@ -394,16 +394,16 @@
   "relative_time.seconds": "{number}eil",
   "relative_time.today": "hiziv",
   "reply_indicator.cancel": "Nullañ",
-  "report.block": "Block",
+  "report.block": "Stankañ",
   "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
   "report.categories.other": "Other",
   "report.categories.spam": "Spam",
   "report.categories.violation": "Content violates one or more server rules",
   "report.category.subtitle": "Choose the best match",
   "report.category.title": "Tell us what's going on with this {type}",
-  "report.category.title_account": "profile",
+  "report.category.title_account": "profil",
   "report.category.title_status": "post",
-  "report.close": "Done",
+  "report.close": "Graet",
   "report.comment.title": "Is there anything else you think we should know?",
   "report.forward": "Treuzkas da: {target}",
   "report.forward_hint": "War ur servijer all emañ ar c'hont-se. Kas dezhañ un adskrid disanv eus an danevell ivez?",
@@ -455,7 +455,7 @@
   "status.delete": "Dilemel",
   "status.detailed_status": "Gwel kaozeadenn munudek",
   "status.direct": "Kas ur c'hemennad prevez da @{name}",
-  "status.edit": "Edit",
+  "status.edit": "Aozañ",
   "status.edited": "Edited {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
   "status.embed": "Enframmañ",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 4ca981f4b..5490bb6b7 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Elimina aquesta opció",
   "compose_form.poll.switch_to_multiple": "Canvia l’enquesta per a permetre diverses opcions",
   "compose_form.poll.switch_to_single": "Canvia l’enquesta per permetre una única opció",
-  "compose_form.publish": "Publicar",
+  "compose_form.publish": "Publica-ho",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Desa els canvis",
   "compose_form.sensitive.hide": "{count, plural, one {Marca contingut com a sensible} other {Marca contingut com a sensible}}",
diff --git a/app/javascript/mastodon/locales/ckb.json b/app/javascript/mastodon/locales/ckb.json
index a642c8a81..e7c4dab71 100644
--- a/app/javascript/mastodon/locales/ckb.json
+++ b/app/javascript/mastodon/locales/ckb.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "لابردنی ئەم هەڵبژاردەیە",
   "compose_form.poll.switch_to_multiple": "ڕاپرسی بگۆڕە بۆ ڕێگەدان بە چەند هەڵبژاردنێک",
   "compose_form.poll.switch_to_single": "گۆڕینی ڕاپرسی بۆ ڕێگەدان بە تاکە هەڵبژاردنێک",
-  "compose_form.publish": "توت",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "پاشکەوتی گۆڕانکاریەکان",
   "compose_form.sensitive.hide": "نیشانکردنی میدیا وەک هەستیار",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index d2db35f16..9172aea2e 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Toglie sta scelta",
   "compose_form.poll.switch_to_multiple": "Cambià u scandagliu per accittà parechje scelte",
   "compose_form.poll.switch_to_single": "Cambià u scandagliu per ùn accittà ch'una scelta",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Indicà u media cum'è sensibile} other {Indicà i media cum'è sensibili}}",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 1c2413793..e1602dacf 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Odstranit tuto volbu",
   "compose_form.poll.switch_to_multiple": "Povolit u ankety výběr více možností",
   "compose_form.poll.switch_to_single": "Povolit u ankety výběr jediné možnosti",
-  "compose_form.publish": "Odeslat",
+  "compose_form.publish": "Zveřejnit",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Uložit změny",
   "compose_form.sensitive.hide": "{count, plural, one {Označit média za citlivá} few {Označit média za citlivá} many {Označit média za citlivá} other {Označit média za citlivá}}",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index e22abb220..42fef4732 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Tynnu'r dewisiad",
   "compose_form.poll.switch_to_multiple": "Newid pleidlais i adael mwy nag un dewis",
   "compose_form.poll.switch_to_single": "Newid pleidlais i gyfyngu i un dewis",
-  "compose_form.publish": "Tŵt",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Cadw newidiadau",
   "compose_form.sensitive.hide": "Marcio cyfryngau fel eu bod yn sensitif",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 319040804..537fa6af6 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Fjern denne valgmulighed",
   "compose_form.poll.switch_to_multiple": "Ændr afstemning til flervalgstype",
   "compose_form.poll.switch_to_single": "Ændr afstemning til enkeltvalgstype",
-  "compose_form.publish": "Udgiv",
+  "compose_form.publish": "Publicér",
   "compose_form.publish_loud": "{publish}!",
   "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}}",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 13ade6fd4..d617da412 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -20,11 +20,11 @@
   "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Follower}}",
   "account.following": "Folgt",
   "account.following_counter": "{count, plural, one {{counter} Folgt} other {{counter} Folgt}}",
-  "account.follows.empty": "Dieses Profil folgt noch niemandem.",
+  "account.follows.empty": "Diesem Profil folgt niemand",
   "account.follows_you": "Folgt dir",
   "account.hide_reblogs": "Geteilte Beiträge von @{name} verbergen",
   "account.joined": "Beigetreten am {date}",
-  "account.link_verified_on": "Besitz dieses Links wurde geprüft am {date}",
+  "account.link_verified_on": "Diesem Profil folgt niemand",
   "account.locked_info": "Der Privatsphärenstatus dieses Accounts wurde auf „gesperrt“ gesetzt. Die Person bestimmt manuell, wer ihm/ihr folgen darf.",
   "account.media": "Medien",
   "account.mention": "@{name} erwähnen",
@@ -70,7 +70,7 @@
   "column.blocks": "Blockierte Profile",
   "column.bookmarks": "Lesezeichen",
   "column.community": "Lokale Zeitleiste",
-  "column.direct": "Mensaxes directas",
+  "column.direct": "Direktnachrichten",
   "column.directory": "Profile durchsuchen",
   "column.domain_blocks": "Blockierte Domains",
   "column.favourites": "Favoriten",
@@ -95,7 +95,7 @@
   "compose.language.change": "Sprache ändern",
   "compose.language.search": "Sprachen durchsuchen...",
   "compose_form.direct_message_warning_learn_more": "Mehr erfahren",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "Beiträge von Mastodon sind nicht Ende-zu-Ende verschlüsselt. Teile keine senible Informationen über Mastodon.",
   "compose_form.hashtag_warning": "Dieser Beitrag wird nicht durch Hashtags entdeckbar sein, weil er ungelistet ist. Nur öffentliche Beiträge tauchen in Hashtag-Zeitleisten auf.",
   "compose_form.lock_disclaimer": "Dein Profil ist nicht {locked}. Wer dir folgen will, kann das jederzeit tun und dann auch deine privaten Beiträge sehen.",
   "compose_form.lock_disclaimer.lock": "gesperrt",
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Wahl entfernen",
   "compose_form.poll.switch_to_multiple": "Umfrage ändern, um mehrere Optionen zu erlauben",
   "compose_form.poll.switch_to_single": "Umfrage ändern, um eine einzige Wahl zu erlauben",
-  "compose_form.publish": "Tröt",
+  "compose_form.publish": "Veröffentlichen",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Änderungen speichern",
   "compose_form.sensitive.hide": "Medien als NSFW markieren",
@@ -171,7 +171,7 @@
   "empty_column.community": "Die lokale Zeitleiste ist leer. Schreibe einen öffentlichen Beitrag, um den Stein ins Rollen zu bringen!",
   "empty_column.direct": "Du hast noch keine Direktnachrichten. Sobald du eine sendest oder empfängst, wird sie hier zu sehen sein.",
   "empty_column.domain_blocks": "Es sind noch keine Domains versteckt.",
-  "empty_column.explore_statuses": "Momentan ist nichts im Trend. Schau später wieder!",
+  "empty_column.explore_statuses": "Momentan ist nichts im Trend. Schau später wieder vorbei!",
   "empty_column.favourited_statuses": "Du hast noch keine favorisierten Tröts. Wenn du einen favorisierst, wird er hier erscheinen.",
   "empty_column.favourites": "Noch niemand hat diesen Beitrag favorisiert. Sobald es jemand tut, wird das hier angezeigt.",
   "empty_column.follow_recommendations": "Es sieht so aus, als könnten keine Vorschläge für dich generiert werden. Du kannst versuchen nach Leuten zu suchen, die du vielleicht kennst oder du kannst angesagte Hashtags erkunden.",
@@ -351,7 +351,7 @@
   "notifications.filter.mentions": "Erwähnungen",
   "notifications.filter.polls": "Ergebnisse der Umfrage",
   "notifications.filter.statuses": "Updates von Personen, denen du folgst",
-  "notifications.grant_permission": "Zugriff gewährt.",
+  "notifications.grant_permission": "Berechtigung erteilen.",
   "notifications.group": "{count} Benachrichtigungen",
   "notifications.mark_as_read": "Alle Benachrichtigungen als gelesen markieren",
   "notifications.permission_denied": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Berechtigung verweigert wurde.",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index d44edf27d..d1ed52832 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -3307,7 +3307,7 @@
   {
     "descriptors": [
       {
-        "defaultMessage": "Toot",
+        "defaultMessage": "Publish",
         "id": "compose_form.publish"
       }
     ],
@@ -3724,4 +3724,4 @@
     ],
     "path": "app/javascript/mastodon/features/video/index.json"
   }
-]
+]
\ No newline at end of file
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 43f5087f2..6f324860c 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Αφαίρεση επιλογής",
   "compose_form.poll.switch_to_multiple": "Ενημέρωση δημοσκόπησης με πολλαπλές επιλογές",
   "compose_form.poll.switch_to_single": "Ενημέρωση δημοσκόπησης με μοναδική επιλογή",
-  "compose_form.publish": "Τουτ",
+  "compose_form.publish": "Δημοσίευση",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Αποθήκευση αλλαγών",
   "compose_form.sensitive.hide": "Σημείωσε τα πολυμέσα ως ευαίσθητα",
diff --git a/app/javascript/mastodon/locales/en-GB.json b/app/javascript/mastodon/locales/en-GB.json
index 51f8463cd..71874cb45 100644
--- a/app/javascript/mastodon/locales/en-GB.json
+++ b/app/javascript/mastodon/locales/en-GB.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Remove this choice",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 2b26a0f97..236d25496 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -6,7 +6,7 @@
   "account.block": "Bloki @{name}",
   "account.block_domain": "Bloki domajnon {domain}",
   "account.blocked": "Blokita",
-  "account.browse_more_on_origin_server": "Rigardi pli al la originala profilo",
+  "account.browse_more_on_origin_server": "Vidi pli ĉe la originala profilo",
   "account.cancel_follow_request": "Nuligi peton de sekvado",
   "account.direct": "Rekte mesaĝi @{name}",
   "account.disable_notifications": "Ĉesu sciigi min kiam @{name} mesaĝi",
@@ -22,7 +22,7 @@
   "account.following_counter": "{count, plural, one {{counter} Sekvato} other {{counter} Sekvatoj}}",
   "account.follows.empty": "Tiu uzanto ankoraŭ ne sekvas iun.",
   "account.follows_you": "Sekvas vin",
-  "account.hide_reblogs": "Kaŝi diskonigojn de @{name}",
+  "account.hide_reblogs": "Kaŝi plusendojn de @{name}",
   "account.joined": "Kuniĝis {date}",
   "account.link_verified_on": "La posedanto de tiu ligilo estis kontrolita je {date}",
   "account.locked_info": "La privateco de tiu konto estas elektita kiel fermita. La posedanto povas mane akcepti tiun, kiu povas sekvi rin.",
@@ -30,14 +30,14 @@
   "account.mention": "Mencii @{name}",
   "account.moved_to": "{name} moviĝis al:",
   "account.mute": "Silentigi @{name}",
-  "account.mute_notifications": "Silentigi sciigojn de @{name}",
+  "account.mute_notifications": "Silentigi la sciigojn de @{name}",
   "account.muted": "Silentigita",
   "account.posts": "Mesaĝoj",
-  "account.posts_with_replies": "Kun respondoj",
+  "account.posts_with_replies": "Mesaĝoj kaj respondoj",
   "account.report": "Signali @{name}",
   "account.requested": "Atendo de aprobo. Alklaku por nuligi peton de sekvado",
-  "account.share": "Diskonigi la profilon de @{name}",
-  "account.show_reblogs": "Montri diskonigojn de @{name}",
+  "account.share": "Kundividi la profilon de @{name}",
+  "account.show_reblogs": "Montri la plusendojn de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Mesaĝo} other {{counter} Mesaĝoj}}",
   "account.unblock": "Malbloki @{name}",
   "account.unblock_domain": "Malbloki {domain}",
@@ -74,7 +74,7 @@
   "column.directory": "Trarigardi profilojn",
   "column.domain_blocks": "Blokitaj domajnoj",
   "column.favourites": "Stelumoj",
-  "column.follow_requests": "Petoj de sekvado",
+  "column.follow_requests": "Demandoj de sekvado",
   "column.home": "Hejmo",
   "column.lists": "Listoj",
   "column.mutes": "Silentigitaj uzantoj",
@@ -99,14 +99,14 @@
   "compose_form.hashtag_warning": "Ĉi tiu mesaĝo ne estos listigita per ajna kradvorto. Nur publikaj mesaĝoj estas serĉeblaj per kradvortoj.",
   "compose_form.lock_disclaimer": "Via konta ne estas {locked}. Iu ajn povas sekvi vin por vidi viajn mesaĝojn, kiuj estas nur por sekvantoj.",
   "compose_form.lock_disclaimer.lock": "ŝlosita",
-  "compose_form.placeholder": "Pri kio vi pensas?",
+  "compose_form.placeholder": "Kion vi pensas?",
   "compose_form.poll.add_option": "Aldoni elekteblon",
   "compose_form.poll.duration": "Balotenketa daŭro",
   "compose_form.poll.option_placeholder": "Elekteblo {number}",
   "compose_form.poll.remove_option": "Forigi ĉi tiu elekteblon",
   "compose_form.poll.switch_to_multiple": "Ŝanĝi la balotenketon por permesi multajn elektojn",
   "compose_form.poll.switch_to_single": "Ŝanĝi la balotenketon por permesi unu solan elekton",
-  "compose_form.publish": "Hup",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Konservi ŝanĝojn",
   "compose_form.sensitive.hide": "Marki la aŭdovidaĵojn kiel tiklaj",
@@ -198,10 +198,10 @@
   "explore.trending_tags": "Kradvortoj",
   "follow_recommendations.done": "Farita",
   "follow_recommendations.heading": "Follow people you'd like to see posts from! Here are some suggestions.",
-  "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+  "follow_recommendations.lead": "La mesaĝoj de personoj kiujn vi sekvas, aperos kronologie en via abonfluo. Ne timu erari, vi povas ĉesi sekvi facile iam ajn!",
   "follow_request.authorize": "Rajtigi",
   "follow_request.reject": "Rifuzi",
-  "follow_requests.unlocked_explanation": "Kvankam via konto ne estas ŝlosita, la dungitaro de {domain} opiniis, ke vi eble volus revizii petojn de sekvadon el ĉi tiuj kontoj permane.",
+  "follow_requests.unlocked_explanation": "Kvankam via konto ne estas ŝlosita, la teamo de {domain} pensis ke vi eble volas kontroli la demandojn de sekvado de ĉi tiuj kontoj permane.",
   "generic.saved": "Konservita",
   "getting_started.developers": "Programistoj",
   "getting_started.directory": "Profilujo",
@@ -221,7 +221,7 @@
   "hashtag.column_settings.tag_mode.none": "Neniu",
   "hashtag.column_settings.tag_toggle": "Aldoni pliajn etikedojn por ĉi tiu kolumno",
   "home.column_settings.basic": "Bazaj agordoj",
-  "home.column_settings.show_reblogs": "Montri diskonigojn",
+  "home.column_settings.show_reblogs": "Montri plusendojn",
   "home.column_settings.show_replies": "Montri respondojn",
   "home.hide_announcements": "Kaŝi anoncojn",
   "home.show_announcements": "Montri anoncojn",
@@ -230,7 +230,7 @@
   "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutoj}}",
   "keyboard_shortcuts.back": "reveni",
   "keyboard_shortcuts.blocked": "malfermi la liston de blokitaj uzantoj",
-  "keyboard_shortcuts.boost": "diskonigi",
+  "keyboard_shortcuts.boost": "Plusendi",
   "keyboard_shortcuts.column": "fokusi mesaĝon en unu el la kolumnoj",
   "keyboard_shortcuts.compose": "enfokusigi la tekstujon",
   "keyboard_shortcuts.description": "Priskribo",
@@ -259,7 +259,7 @@
   "keyboard_shortcuts.start": "malfermi la kolumnon «por komenci»",
   "keyboard_shortcuts.toggle_hidden": "montri/kaŝi tekston malantaŭ enhava averto",
   "keyboard_shortcuts.toggle_sensitivity": "montri/kaŝi aŭdovidaĵojn",
-  "keyboard_shortcuts.toot": "komenci tute novan mesaĝon",
+  "keyboard_shortcuts.toot": "Krei novan mesaĝon",
   "keyboard_shortcuts.unfocus": "malenfokusigi la tekstujon aŭ la serĉilon",
   "keyboard_shortcuts.up": "iri supren en la listo",
   "lightbox.close": "Fermi",
@@ -321,7 +321,7 @@
   "notification.mention": "{name} menciis vin",
   "notification.own_poll": "Via balotenketo finiĝitis",
   "notification.poll": "Partoprenita balotenketo finiĝis",
-  "notification.reblog": "{name} diskonigis vian mesaĝon",
+  "notification.reblog": "{name} plusendis vian mesaĝon",
   "notification.status": "{name} ĵus afiŝita",
   "notification.update": "{name} redaktis afiŝon",
   "notifications.clear": "Forviŝi sciigojn",
@@ -337,7 +337,7 @@
   "notifications.column_settings.mention": "Mencioj:",
   "notifications.column_settings.poll": "Balotenketaj rezultoj:",
   "notifications.column_settings.push": "Puŝsciigoj",
-  "notifications.column_settings.reblog": "Diskonigoj:",
+  "notifications.column_settings.reblog": "Plusendoj:",
   "notifications.column_settings.show": "Montri en kolumno",
   "notifications.column_settings.sound": "Eligi sonon",
   "notifications.column_settings.status": "Novaj mesaĝoj:",
@@ -345,7 +345,7 @@
   "notifications.column_settings.unread_notifications.highlight": "Marki nelegitajn sciigojn",
   "notifications.column_settings.update": "Redaktoj:",
   "notifications.filter.all": "Ĉiuj",
-  "notifications.filter.boosts": "Diskonigoj",
+  "notifications.filter.boosts": "Plusendoj",
   "notifications.filter.favourites": "Stelumoj",
   "notifications.filter.follows": "Sekvoj",
   "notifications.filter.mentions": "Mencioj",
@@ -449,8 +449,8 @@
   "status.admin_status": "Malfermi ĉi tiun mesaĝon en la kontrola interfaco",
   "status.block": "Bloki @{name}",
   "status.bookmark": "Aldoni al la legosignoj",
-  "status.cancel_reblog_private": "Ne plu diskonigi",
-  "status.cannot_reblog": "Ĉi tiu mesaĝo ne diskonigeblas",
+  "status.cancel_reblog_private": "Malfari la plusendon",
+  "status.cannot_reblog": "Ĉi tiu mesaĝo ne povas esti plusendita",
   "status.copy": "Kopii la ligilon al la mesaĝo",
   "status.delete": "Forigi",
   "status.detailed_status": "Detala konversacia vido",
@@ -475,8 +475,8 @@
   "status.read_more": "Legi pli",
   "status.reblog": "Plusendi",
   "status.reblog_private": "Plusendi kiel la originala videbleco",
-  "status.reblogged_by": "{name} diskonigis",
-  "status.reblogs.empty": "Ankoraŭ neniu diskonigis tiun mesaĝon. Kiam iu faros tion, tiu aperos ĉi tie.",
+  "status.reblogged_by": "{name} plusendis",
+  "status.reblogs.empty": "Neniu ankoraŭ plusendis la mesaĝon. Kiam iu faros tion, ili aperos ĉi tie.",
   "status.redraft": "Forigi kaj reskribi",
   "status.remove_bookmark": "Forigi legosignon",
   "status.reply": "Respondi",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index 65a7b699f..78d81b38f 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Quitar esta opción",
   "compose_form.poll.switch_to_multiple": "Cambiar encuesta para permitir opciones múltiples",
   "compose_form.poll.switch_to_single": "Cambiar encuesta para permitir una sola opción",
-  "compose_form.publish": "Enviar",
+  "compose_form.publish": "Publicar",
   "compose_form.publish_loud": "¡{publish}!",
   "compose_form.save_changes": "Guardar cambios",
   "compose_form.sensitive.hide": "Marcar medio como sensible",
diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json
index c58ec5aa6..570a03186 100644
--- a/app/javascript/mastodon/locales/es-MX.json
+++ b/app/javascript/mastodon/locales/es-MX.json
@@ -95,7 +95,7 @@
   "compose.language.change": "Cambiar idioma",
   "compose.language.search": "Buscar idiomas...",
   "compose_form.direct_message_warning_learn_more": "Aprender mas",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "Las publicaciones en Mastodon no están cifradas de extremo a extremo. No comparta ninguna información sensible en Mastodon.",
   "compose_form.hashtag_warning": "Este toot no se mostrará bajo hashtags porque no es público. Sólo los toots públicos se pueden buscar por hashtag.",
   "compose_form.lock_disclaimer": "Tu cuenta no está bloqueada. Todos pueden seguirte para ver tus toots solo para seguidores.",
   "compose_form.lock_disclaimer.lock": "bloqueado",
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Eliminar esta opción",
   "compose_form.poll.switch_to_multiple": "Modificar encuesta para permitir múltiples opciones",
   "compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción",
-  "compose_form.publish": "Tootear",
+  "compose_form.publish": "Publicar",
   "compose_form.publish_loud": "¡{publish}!",
   "compose_form.save_changes": "Guardar cambios",
   "compose_form.sensitive.hide": "Marcar multimedia como sensible",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 0568e86da..d9c925c87 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Eliminar esta opción",
   "compose_form.poll.switch_to_multiple": "Modificar encuesta para permitir múltiples opciones",
   "compose_form.poll.switch_to_single": "Modificar encuesta para permitir una única opción",
-  "compose_form.publish": "Tootear",
+  "compose_form.publish": "Publicar",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Guardar cambios",
   "compose_form.sensitive.hide": "{count, plural, one {Marcar material como sensible} other {Marcar material como sensible}}",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index d5f85c54d..eb3425f79 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Eemalda see valik",
   "compose_form.poll.switch_to_multiple": "Muuda küsitlust lubamaks mitut valikut",
   "compose_form.poll.switch_to_single": "Muuda küsitlust lubamaks ainult ühte valikut",
-  "compose_form.publish": "Tuut",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "Märgista meedia tundlikuks",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 4ab0c44be..c8182640a 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Kendu aukera hau",
   "compose_form.poll.switch_to_multiple": "Aldatu inkesta hainbat aukera onartzeko",
   "compose_form.poll.switch_to_single": "Aldatu inkesta aukera bakarra onartzeko",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Gorde aldaketak",
   "compose_form.sensitive.hide": "Markatu multimedia hunkigarri gisa",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 1d14dc63e..c76c596eb 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "برداشتن این گزینه",
   "compose_form.poll.switch_to_multiple": "تبدیل به نظرسنجی چندگزینه‌ای",
   "compose_form.poll.switch_to_single": "تبدیل به نظرسنجی تک‌گزینه‌ای",
-  "compose_form.publish": "بوق",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "ذخیرهٔ تغییرات",
   "compose_form.sensitive.hide": "{count, plural, one {علامت‌گذاری رسانه به عنوان حساس} other {علامت‌گذاری رسانه‌ها به عنوان حساس}}",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 9db683eb1..014f249ac 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Poista tämä valinta",
   "compose_form.poll.switch_to_multiple": "Muuta kysely monivalinnaksi",
   "compose_form.poll.switch_to_single": "Muuta kysely sallimaan vain yksi valinta",
-  "compose_form.publish": "Lähetä viesti",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Tallenna muutokset",
   "compose_form.sensitive.hide": "{count, plural, one {Merkitse media arkaluontoiseksi} other {Merkitse media arkaluontoiseksi}}",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 60b9f47d2..eb3c293ee 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Supprimer ce choix",
   "compose_form.poll.switch_to_multiple": "Changer le sondage pour autoriser plusieurs choix",
   "compose_form.poll.switch_to_single": "Changer le sondage pour autoriser qu'un seul choix",
-  "compose_form.publish": "Pouet",
+  "compose_form.publish": "Publier",
   "compose_form.publish_loud": "{publish} !",
   "compose_form.save_changes": "Enregistrer les modifications",
   "compose_form.sensitive.hide": "Marquer le média comme sensible",
diff --git a/app/javascript/mastodon/locales/fy.json b/app/javascript/mastodon/locales/fy.json
new file mode 100644
index 000000000..f8485270a
--- /dev/null
+++ b/app/javascript/mastodon/locales/fy.json
@@ -0,0 +1,549 @@
+{
+  "account.account_note_header": "Note",
+  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.badges.bot": "Bot",
+  "account.badges.group": "Groep",
+  "account.block": "Block @{name}",
+  "account.block_domain": "Block domain {domain}",
+  "account.blocked": "Blocked",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.cancel_follow_request": "Cancel follow request",
+  "account.direct": "Direct message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
+  "account.domain_blocked": "Domein blokkearre",
+  "account.edit_profile": "Profyl oanpasse",
+  "account.enable_notifications": "Notify me when @{name} posts",
+  "account.endorse": "Feature on profile",
+  "account.follow": "Folgje",
+  "account.followers": "Folgers",
+  "account.followers.empty": "No one follows this user yet.",
+  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+  "account.following": "Folget",
+  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows_you": "Folget dy",
+  "account.hide_reblogs": "Hide boosts from @{name}",
+  "account.joined": "Registrearre op {date}",
+  "account.link_verified_on": "Ownership of this link was checked on {date}",
+  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.media": "Media",
+  "account.mention": "Fermeld @{name}",
+  "account.moved_to": "{name} has moved to:",
+  "account.mute": "Mute @{name}",
+  "account.mute_notifications": "Mute notifications from @{name}",
+  "account.muted": "Muted",
+  "account.posts": "Posts",
+  "account.posts_with_replies": "Posts and replies",
+  "account.report": "Report @{name}",
+  "account.requested": "Awaiting approval. Click to cancel follow request",
+  "account.share": "Share @{name}'s profile",
+  "account.show_reblogs": "Show boosts from @{name}",
+  "account.statuses_counter": "{count, plural, one {{counter} Post} other {{counter} Posts}}",
+  "account.unblock": "Unblock @{name}",
+  "account.unblock_domain": "Unblock domain {domain}",
+  "account.unblock_short": "Unblock",
+  "account.unendorse": "Don't feature on profile",
+  "account.unfollow": "Net mear folgje",
+  "account.unmute": "Unmute @{name}",
+  "account.unmute_notifications": "Unmute notifications from @{name}",
+  "account.unmute_short": "Net mear negearre",
+  "account_note.placeholder": "Click to add a note",
+  "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
+  "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
+  "admin.dashboard.retention.average": "Gemiddelde",
+  "admin.dashboard.retention.cohort": "Sign-up month",
+  "admin.dashboard.retention.cohort_size": "Nije brûkers",
+  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Rate limited",
+  "alert.unexpected.message": "An unexpected error occurred.",
+  "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
+  "attachments_list.unprocessed": "(net ferwurke)",
+  "autosuggest_hashtag.per_week": "{count} per week",
+  "boost_modal.combo": "You can press {combo} to skip this next time",
+  "bundle_column_error.body": "Something went wrong while loading this component.",
+  "bundle_column_error.retry": "Try again",
+  "bundle_column_error.title": "Network error",
+  "bundle_modal_error.close": "Slute",
+  "bundle_modal_error.message": "Something went wrong while loading this component.",
+  "bundle_modal_error.retry": "Opnij probearje",
+  "column.blocks": "Blokkearre brûkers",
+  "column.bookmarks": "Blêdwizers",
+  "column.community": "Local timeline",
+  "column.direct": "Direct messages",
+  "column.directory": "Browse profiles",
+  "column.domain_blocks": "Blokkeare domeinen",
+  "column.favourites": "Favoriten",
+  "column.follow_requests": "Follow requests",
+  "column.home": "Home",
+  "column.lists": "Listen",
+  "column.mutes": "Negearre brûkers",
+  "column.notifications": "Notifikaasjes",
+  "column.pins": "Fêstsette berjochten",
+  "column.public": "Federated timeline",
+  "column_back_button.label": "Werom",
+  "column_header.hide_settings": "Ynstellings ferbergje",
+  "column_header.moveLeft_settings": "Kolom nei links ferpleatse",
+  "column_header.moveRight_settings": "Kolom nei rjochts ferpleatse",
+  "column_header.pin": "Fêstsette",
+  "column_header.show_settings": "Ynstellings sjen litte",
+  "column_header.unpin": "Los helje",
+  "column_subheading.settings": "Ynstellings",
+  "community.column_settings.local_only": "Allinnich lokaal",
+  "community.column_settings.media_only": "Allinnich media",
+  "community.column_settings.remote_only": "Allinnich oare tsjinners",
+  "compose.language.change": "Fan taal feroarje",
+  "compose.language.search": "Talen sykje...",
+  "compose_form.direct_message_warning_learn_more": "Lês mear",
+  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.hashtag_warning": "This post won't be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.",
+  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
+  "compose_form.lock_disclaimer.lock": "locked",
+  "compose_form.placeholder": "Wat wolst kwyt?",
+  "compose_form.poll.add_option": "Add a choice",
+  "compose_form.poll.duration": "Poll duration",
+  "compose_form.poll.option_placeholder": "Choice {number}",
+  "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
+  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
+  "compose_form.publish": "Publisearje",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.save_changes": "Save changes",
+  "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
+  "compose_form.spoiler.marked": "Ynhâldswarskôging fuortsmite",
+  "compose_form.spoiler.unmarked": "Ynhâldswarskôging tafoegje",
+  "compose_form.spoiler_placeholder": "Write your warning here",
+  "confirmation_modal.cancel": "Ofbrekke",
+  "confirmations.block.block_and_report": "Blokkearre & Oanjaan",
+  "confirmations.block.confirm": "Blokkearre",
+  "confirmations.block.message": "Wolle jo {name} werklik blokkearre?",
+  "confirmations.delete.confirm": "Fuortsmite",
+  "confirmations.delete.message": "Wolle jo dit berjocht werklik fuortsmite?",
+  "confirmations.delete_list.confirm": "Fuortsmite",
+  "confirmations.delete_list.message": "Wolle jo dizze list werklik foar ivich fuortsmite?",
+  "confirmations.discard_edit_media.confirm": "Discard",
+  "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
+  "confirmations.domain_block.confirm": "Hide entire domain",
+  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
+  "confirmations.logout.confirm": "Log out",
+  "confirmations.logout.message": "Wolle jo werklik útlogge?",
+  "confirmations.mute.confirm": "Negearre",
+  "confirmations.mute.explanation": "Dit sil berjochten fan harren ûnsichtber meitsje en berjochen wêr se yn fermeld wurde, mar se sille jo berjochten noch immen sjen kinne en jo folgje kinne.",
+  "confirmations.mute.message": "Wolle jo {name} werklik negearre?",
+  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.redraft.message": "Wolle jo dit berjocht werklik fuortsmite en opnij opstelle? Favoriten en boosts geane dan ferlern, en reaksjes op it oarspronklike berjocht reitsje jo kwyt.",
+  "confirmations.reply.confirm": "Reagearre",
+  "confirmations.reply.message": "Troch no te reagearjen sil it berjocht wat jo no oan it skriuwen binne oerskreaun wurde. Wolle jo troch gean?",
+  "confirmations.unfollow.confirm": "Net mear folgje",
+  "confirmations.unfollow.message": "Wolle jo {name} werklik net mear folgje?",
+  "conversation.delete": "Petear fuortsmite",
+  "conversation.mark_as_read": "As lêzen oanmurkje",
+  "conversation.open": "Petear besjen",
+  "conversation.with": "Mei {names}",
+  "directory.federated": "From known fediverse",
+  "directory.local": "From {domain} only",
+  "directory.new_arrivals": "New arrivals",
+  "directory.recently_active": "Resintlik warber",
+  "embed.instructions": "Embed this status on your website by copying the code below.",
+  "embed.preview": "Here is what it will look like:",
+  "emoji_button.activity": "Activity",
+  "emoji_button.clear": "Clear",
+  "emoji_button.custom": "Custom",
+  "emoji_button.flags": "Flags",
+  "emoji_button.food": "Food & Drink",
+  "emoji_button.label": "Insert emoji",
+  "emoji_button.nature": "Nature",
+  "emoji_button.not_found": "No matching emojis found",
+  "emoji_button.objects": "Objects",
+  "emoji_button.people": "People",
+  "emoji_button.recent": "Frequently used",
+  "emoji_button.search": "Search...",
+  "emoji_button.search_results": "Search results",
+  "emoji_button.symbols": "Symbols",
+  "emoji_button.travel": "Travel & Places",
+  "empty_column.account_suspended": "Account suspended",
+  "empty_column.account_timeline": "Gjin berjochten hjir!",
+  "empty_column.account_unavailable": "Profyl net beskikber",
+  "empty_column.blocks": "Jo hawwe noch gjin brûkers blokkearre.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.",
+  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.domain_blocks": "Der binne noch gjin blokkearre domeinen.",
+  "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
+  "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.",
+  "empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.",
+  "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
+  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.hashtag": "There is nothing in this hashtag yet.",
+  "empty_column.home": "Your home timeline is empty! Follow more people to fill it up. {suggestions}",
+  "empty_column.home.suggestions": "Suggestjes besjen",
+  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
+  "empty_column.mutes": "Jo hawwe noch gjin brûkers negearre.",
+  "empty_column.notifications": "Jo hawwe noch gjin notifikaasjes. Ynteraksjes mei oare minsken sjogge jo hjir.",
+  "empty_column.public": "Der is hjir neat! Skriuw eat publyklik, of folgje sels brûkers fan oare tsjinners om it hjir te foljen",
+  "error.unexpected_crash.explanation": "Troch in bug in ús koade as in probleem mei de komptabiliteit fan jo browser, koe dizze side net sjen litten wurde.",
+  "error.unexpected_crash.explanation_addons": "Dizze side kin net goed sjen litten wurde. Dit probleem komt faaks troch in browser útwreiding of ark foar automatysk oersetten.",
+  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "errors.unexpected_crash.report_issue": "Technysk probleem oanjaan",
+  "explore.search_results": "Search results",
+  "explore.suggested_follows": "Foar jo",
+  "explore.title": "Ferkenne",
+  "explore.trending_links": "Nijs",
+  "explore.trending_statuses": "Berjochten",
+  "explore.trending_tags": "Hashtags",
+  "follow_recommendations.done": "Klear",
+  "follow_recommendations.heading": "Folgje minsken wer as jo graach berjochten fan sjen wolle! Hjir binne wat suggestjes.",
+  "follow_recommendations.lead": "Posts from people you follow will show up in chronological order on your home feed. Don't be afraid to make mistakes, you can unfollow people just as easily any time!",
+  "follow_request.authorize": "Goedkarre",
+  "follow_request.reject": "Ofkarre",
+  "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
+  "generic.saved": "Bewarre",
+  "getting_started.developers": "Untwikkelders",
+  "getting_started.directory": "Profile directory",
+  "getting_started.documentation": "Dokumintaasje",
+  "getting_started.heading": "Utein sette",
+  "getting_started.invite": "Minsken útnûgje",
+  "getting_started.open_source_notice": "Mastodon is iepen boarne software. Jo kinne sels bydrage of problemen oanjaan troch GitHub op {github}.",
+  "getting_started.security": "Account ynstellings",
+  "getting_started.terms": "Terms of service",
+  "hashtag.column_header.tag_mode.all": "en {additional}",
+  "hashtag.column_header.tag_mode.any": "of {additional}",
+  "hashtag.column_header.tag_mode.none": "sûnder {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+  "hashtag.column_settings.tag_mode.all": "All of these",
+  "hashtag.column_settings.tag_mode.any": "Any of these",
+  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "home.column_settings.basic": "Basic",
+  "home.column_settings.show_reblogs": "Show boosts",
+  "home.column_settings.show_replies": "Show replies",
+  "home.hide_announcements": "Hide announcements",
+  "home.show_announcements": "Show announcements",
+  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
+  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
+  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.boost": "to boost",
+  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.down": "to move down in the list",
+  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourites": "to open favourites list",
+  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.legend": "to display this legend",
+  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.mention": "Skriuwer beneame",
+  "keyboard_shortcuts.muted": "to open muted users list",
+  "keyboard_shortcuts.my_profile": "Jo profyl iepenje",
+  "keyboard_shortcuts.notifications": "Notifikaasjes sjen litte",
+  "keyboard_shortcuts.open_media": "Media iepenje",
+  "keyboard_shortcuts.pinned": "Fêstsette berjochten sjen litte",
+  "keyboard_shortcuts.profile": "Profyl fan skriuwer iepenje",
+  "keyboard_shortcuts.reply": "Berjocht beäntwurdzje",
+  "keyboard_shortcuts.requests": "Folgfersiken sjen litte",
+  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "CW fjild ferstopje/sjen litte",
+  "keyboard_shortcuts.start": "\"Útein sette\" iepenje",
+  "keyboard_shortcuts.toggle_hidden": "Tekst efter CW fjild ferstopje/sjen litte",
+  "keyboard_shortcuts.toggle_sensitivity": "Media ferstopje/sjen litte",
+  "keyboard_shortcuts.toot": "Nij berjocht skriuwe",
+  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.up": "Nei boppe yn list ferpleatse",
+  "lightbox.close": "Slute",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
+  "lightbox.next": "Fierder",
+  "lightbox.previous": "Werom",
+  "limited_account_hint.action": "Profyl dochs besjen",
+  "limited_account_hint.title": "Dit profyl is ferstoppe troch de behearders fan jo tsjinner.",
+  "lists.account.add": "Oan list tafoegje",
+  "lists.account.remove": "Ut list wei smite",
+  "lists.delete": "List fuortsmite",
+  "lists.edit": "Edit list",
+  "lists.edit.submit": "Titel feroarje",
+  "lists.new.create": "Add list",
+  "lists.new.title_placeholder": "Nije list titel",
+  "lists.replies_policy.followed": "Elke folge brûker",
+  "lists.replies_policy.list": "Leden fan de list",
+  "lists.replies_policy.none": "Net ien",
+  "lists.replies_policy.title": "Reaksjes sjen litte oan:",
+  "lists.search": "Search among people you follow",
+  "lists.subheading": "Jo listen",
+  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "loading_indicator.label": "Loading...",
+  "media_gallery.toggle_visible": "{number, plural, one {Hide image} other {Hide images}}",
+  "missing_indicator.label": "Net fûn",
+  "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
+  "mute_modal.hide_notifications": "Notifikaasjes fan dizze brûker ferstopje?",
+  "mute_modal.indefinite": "Indefinite",
+  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.blocks": "Blokkearre brûkers",
+  "navigation_bar.bookmarks": "Blêdwiizers",
+  "navigation_bar.community_timeline": "Local timeline",
+  "navigation_bar.compose": "Compose new post",
+  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.discover": "Untdekke",
+  "navigation_bar.domain_blocks": "Blokkearre domeinen",
+  "navigation_bar.edit_profile": "Edit profile",
+  "navigation_bar.explore": "Explore",
+  "navigation_bar.favourites": "Favoriten",
+  "navigation_bar.filters": "Negearre wurden",
+  "navigation_bar.follow_requests": "Folgfersiken",
+  "navigation_bar.follows_and_followers": "Folgers en folgjenden",
+  "navigation_bar.info": "Oer dizze tsjinner",
+  "navigation_bar.keyboard_shortcuts": "Fluchtoetsen",
+  "navigation_bar.lists": "Listen",
+  "navigation_bar.logout": "Utlogge",
+  "navigation_bar.mutes": "Negearre brûkers",
+  "navigation_bar.personal": "Persoanlik",
+  "navigation_bar.pins": "Fêstsette berjochten",
+  "navigation_bar.preferences": "Foarkarren",
+  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.security": "Security",
+  "notification.admin.sign_up": "{name} hat harren ynskreaun",
+  "notification.favourite": "{name} hat jo berjocht as favoryt markearre",
+  "notification.follow": "{name} folget jo",
+  "notification.follow_request": "{name} hat jo in folgfersyk stjoerd",
+  "notification.mention": "{name} hat jo fermeld",
+  "notification.own_poll": "Jo poll is beëinige",
+  "notification.poll": "In poll wêr jo yn stimt ha is beëinige",
+  "notification.reblog": "{name} hat jo berjocht boost",
+  "notification.status": "{name} hat in berjocht pleatst",
+  "notification.update": "{name} hat in berjocht feroare",
+  "notifications.clear": "Notifikaasjes leegje",
+  "notifications.clear_confirmation": "Wolle jo al jo notifikaasjes werklik foar ivich fuortsmite?",
+  "notifications.column_settings.admin.sign_up": "Nije ynskriuwingen:",
+  "notifications.column_settings.alert": "Desktop notifikaasjes",
+  "notifications.column_settings.favourite": "Favoriten:",
+  "notifications.column_settings.filter_bar.advanced": "Alle kategorien sjen litte",
+  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
+  "notifications.column_settings.follow": "Nije folgers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
+  "notifications.column_settings.mention": "Fermeldingen:",
+  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.show": "Show in column",
+  "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New posts:",
+  "notifications.column_settings.unread_notifications.category": "Unread notifications",
+  "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
+  "notifications.column_settings.update": "Edits:",
+  "notifications.filter.all": "All",
+  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.follows": "Follows",
+  "notifications.filter.mentions": "Fermeldingen",
+  "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.grant_permission": "Grant permission.",
+  "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications.permission_required": "Desktop notifications are unavailable because the required permission has not been granted.",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
+  "poll.closed": "Closed",
+  "poll.refresh": "Refresh",
+  "poll.total_people": "{count, plural, one {# persoan} other {# minsken}}",
+  "poll.total_votes": "{count, plural, one {# stim} other {# stimmen}}",
+  "poll.vote": "Stim",
+  "poll.voted": "Jo hawwe hjir op stimt",
+  "poll.votes": "{votes, plural, one {# stim} other {# stimmen}}",
+  "poll_button.add_poll": "In poll tafoegje",
+  "poll_button.remove_poll": "Poll fuortsmite",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Allinnich sichtber foar fermelde brûkers",
+  "privacy.direct.short": "Allinnich fermelde minsken",
+  "privacy.private.long": "Allinnich sichtber foar folgers",
+  "privacy.private.short": "Allinnich folgers",
+  "privacy.public.long": "Sichtber foar elkenien",
+  "privacy.public.short": "Iepenbier",
+  "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
+  "privacy.unlisted.short": "Unlisted",
+  "refresh": "Fernije",
+  "regeneration_indicator.label": "Loading…",
+  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "relative_time.days": "{number}d",
+  "relative_time.full.days": "{number, plural, one {# dei} other {# dagen}} lyn",
+  "relative_time.full.hours": "{number, plural, one {# oere} other {# oeren}} lyn",
+  "relative_time.full.just_now": "no krekt",
+  "relative_time.full.minutes": "{number, plural, one {# minút} other {# minuten}} lyn",
+  "relative_time.full.seconds": "{number, plural, one {# sekonde} other {# sekonden}} lyn",
+  "relative_time.hours": "{number}o",
+  "relative_time.just_now": "no",
+  "relative_time.minutes": "{number}m",
+  "relative_time.seconds": "{number}s",
+  "relative_time.today": "hjoed",
+  "reply_indicator.cancel": "Ofbrekke",
+  "report.block": "Blokkearre",
+  "report.block_explanation": "Jo sille harren berjochten net sjen kinne. Se sille jo berjochten net sjen kinne en jo net folgje kinne. Se sille wol sjen kinne dat se blokkearre binne.",
+  "report.categories.other": "Other",
+  "report.categories.spam": "Spam",
+  "report.categories.violation": "Ynhâld ferbrekt ien of mear tsjinner regels",
+  "report.category.subtitle": "Selektearje wat it bêst past",
+  "report.category.title": "Fertel ús wat der mei dit {type} oan de hân is",
+  "report.category.title_account": "profyl",
+  "report.category.title_status": "berjocht",
+  "report.close": "Klear",
+  "report.comment.title": "Tinke jo dat wy noch mear witte moatte?",
+  "report.forward": "Troch stjoere nei {target}",
+  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.mute": "Negearre",
+  "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+  "report.next": "Fierder",
+  "report.placeholder": "Type or paste additional comments",
+  "report.reasons.dislike": "Ik fyn der neat oan",
+  "report.reasons.dislike_description": "It is net eat wat jo sjen wolle",
+  "report.reasons.other": "It is wat oars",
+  "report.reasons.other_description": "It probleem stiet der net tusken",
+  "report.reasons.spam": "It's spam",
+  "report.reasons.spam_description": "Malicious links, fake engagement, or repetitive replies",
+  "report.reasons.violation": "It violates server rules",
+  "report.reasons.violation_description": "You are aware that it breaks specific rules",
+  "report.rules.subtitle": "Select all that apply",
+  "report.rules.title": "Which rules are being violated?",
+  "report.statuses.subtitle": "Select all that apply",
+  "report.statuses.title": "Are there any posts that back up this report?",
+  "report.submit": "Submit report",
+  "report.target": "Report {target}",
+  "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
+  "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+  "report.thanks.title": "Don't want to see this?",
+  "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+  "report.unfollow": "Unfollow @{name}",
+  "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+  "search.placeholder": "Search",
+  "search_popout.search_format": "Advanced search format",
+  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.status": "status",
+  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.user": "user",
+  "search_results.accounts": "People",
+  "search_results.all": "All",
+  "search_results.hashtags": "Hashtags",
+  "search_results.nothing_found": "Could not find anything for these search terms",
+  "search_results.statuses": "Posts",
+  "search_results.statuses_fts_disabled": "Searching posts by their content is not enabled on this Mastodon server.",
+  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
+  "status.block": "Block @{name}",
+  "status.bookmark": "Bookmark",
+  "status.cancel_reblog_private": "Unboost",
+  "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
+  "status.delete": "Delete",
+  "status.detailed_status": "Detaillearre oersjoch fan petear",
+  "status.direct": "Direct message @{name}",
+  "status.edit": "Edit",
+  "status.edited": "Edited {date}",
+  "status.edited_x_times": "{count, plural, one {{count} kear} other {{count} kearen}} bewurke",
+  "status.embed": "Ynslute",
+  "status.favourite": "Favorite",
+  "status.filtered": "Filtere",
+  "status.history.created": "{name} makke dit {date}",
+  "status.history.edited": "{name} feroare dit {date}",
+  "status.load_more": "Load more",
+  "status.media_hidden": "Media ferstoppe",
+  "status.mention": "Fermeld @{name}",
+  "status.more": "Mear",
+  "status.mute": "Negearje @{name}",
+  "status.mute_conversation": "Petear negearre",
+  "status.open": "Dit berjocht útflappe",
+  "status.pin": "Op profyl fêstsette",
+  "status.pinned": "Fêstset berjocht",
+  "status.read_more": "Lês mear",
+  "status.reblog": "Boost",
+  "status.reblog_private": "Boost with original visibility",
+  "status.reblogged_by": "{name} hat boost",
+  "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.",
+  "status.redraft": "Fuortsmite en opnij opstelle",
+  "status.remove_bookmark": "Remove bookmark",
+  "status.reply": "Reagearre",
+  "status.replyAll": "Op elkenien reagearre",
+  "status.report": "Jou @{name} oan",
+  "status.sensitive_warning": "Sensitive content",
+  "status.share": "Diele",
+  "status.show_less": "Minder sjen litte",
+  "status.show_less_all": "Foar alles minder sjen litte",
+  "status.show_more": "Mear sjen litte",
+  "status.show_more_all": "Foar alles mear sjen litte",
+  "status.show_thread": "Petear sjen litte",
+  "status.uncached_media_warning": "Net beskikber",
+  "status.unmute_conversation": "Petear net mear negearre",
+  "status.unpin": "Unpin from profile",
+  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.header": "You might be interested in…",
+  "tabs_bar.federated_timeline": "Federated",
+  "tabs_bar.home": "Home",
+  "tabs_bar.local_timeline": "Local",
+  "tabs_bar.notifications": "Notifikaasjes",
+  "tabs_bar.search": "Sykje",
+  "time_remaining.days": "{number, plural, one {# dei} other {# dagen}} te gean",
+  "time_remaining.hours": "{number, plural, one {# oere} other {# oeren}} te gean",
+  "time_remaining.minutes": "{number, plural, one {# minút} other {# minuten}} te gean",
+  "time_remaining.moments": "Noch krekt even te gean",
+  "time_remaining.seconds": "{number, plural, one {# sekonde} other {# sekonden}} te gean",
+  "timeline_hint.remote_resource_not_displayed": "{resource} fan oare tsjinners wurde net sjen litten.",
+  "timeline_hint.resources.followers": "Folgers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Aldere berjochten",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} persoan is} other {{counter} persoanen binne}} yn petear",
+  "trends.trending_now": "Trending now",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "units.short.billion": "{count}B",
+  "units.short.million": "{count}M",
+  "units.short.thousand": "{count}K",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add images, a video or an audio file",
+  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
+  "upload_form.description": "Describe for the visually impaired",
+  "upload_form.description_missing": "No description added",
+  "upload_form.edit": "Edit",
+  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.undo": "Delete",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
+  "upload_modal.analyzing_picture": "Analyzing picture…",
+  "upload_modal.apply": "Apply",
+  "upload_modal.applying": "Applying…",
+  "upload_modal.choose_image": "Choose image",
+  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+  "upload_modal.detect_text": "Detect text from picture",
+  "upload_modal.edit_media": "Edit media",
+  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
+  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_progress.label": "Uploading…",
+  "video.close": "Close video",
+  "video.download": "Download file",
+  "video.exit_fullscreen": "Exit full screen",
+  "video.expand": "Expand video",
+  "video.fullscreen": "Full screen",
+  "video.hide": "Hide video",
+  "video.mute": "Mute sound",
+  "video.pause": "Pause",
+  "video.play": "Play",
+  "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index f56e6d5fa..2d2551845 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -60,7 +60,7 @@
   "announcement.announcement": "Fógra",
   "attachments_list.unprocessed": "(unprocessed)",
   "autosuggest_hashtag.per_week": "{count} per week",
-  "boost_modal.combo": "You can press {combo} to skip this next time",
+  "boost_modal.combo": "Is féidir leat brúigh {combo} chun é seo a scipeáil an chéad uair eile",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Bain triail as arís",
   "bundle_column_error.title": "Network error",
@@ -71,9 +71,9 @@
   "column.bookmarks": "Leabharmharcanna",
   "column.community": "Local timeline",
   "column.direct": "Direct messages",
-  "column.directory": "Browse profiles",
+  "column.directory": "Brabhsáil próifílí",
   "column.domain_blocks": "Blocked domains",
-  "column.favourites": "Favourites",
+  "column.favourites": "Roghanna",
   "column.follow_requests": "Follow requests",
   "column.home": "Baile",
   "column.lists": "Liostaí",
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Remove this choice",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
@@ -120,7 +120,7 @@
   "confirmations.block.confirm": "Block",
   "confirmations.block.message": "Are you sure you want to block {name}?",
   "confirmations.delete.confirm": "Delete",
-  "confirmations.delete.message": "Are you sure you want to delete this status?",
+  "confirmations.delete.message": "An bhfuil tú cinnte gur mhaith leat an phostáil seo a scriosadh?",
   "confirmations.delete_list.confirm": "Delete",
   "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
   "confirmations.discard_edit_media.confirm": "Faigh réidh de",
@@ -133,7 +133,7 @@
   "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
   "confirmations.mute.message": "An bhfuil tú cinnte gur mhaith leat {name} a bhalbhú?",
   "confirmations.redraft.confirm": "Delete & redraft",
-  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
+  "confirmations.redraft.message": "An bhfuil tú cinnte gur mhaith leat an phostáil sin a scriosadh agus athdhréachtú? Beidh roghanna agus treisithe caillte, agus beidh freagraí ar an bpostáil bhunúsach ina ndílleachtaí.",
   "confirmations.reply.confirm": "Reply",
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Ná lean",
@@ -164,16 +164,16 @@
   "emoji_button.symbols": "Symbols",
   "emoji_button.travel": "Taisteal ⁊ Áiteanna",
   "empty_column.account_suspended": "Account suspended",
-  "empty_column.account_timeline": "No posts found",
-  "empty_column.account_unavailable": "Profile unavailable",
+  "empty_column.account_timeline": "Níl postálacha ar bith anseo!",
+  "empty_column.account_unavailable": "Níl an phróifíl ar fáil",
   "empty_column.blocks": "You haven't blocked any users yet.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked posts yet. When you bookmark one, it will show up here.",
   "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
   "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no blocked domains yet.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
-  "empty_column.favourited_statuses": "You don't have any favourite posts yet. When you favourite one, it will show up here.",
-  "empty_column.favourites": "No one has favourited this post yet. When someone does, they will show up here.",
+  "empty_column.favourited_statuses": "Níor roghnaigh tú postáil ar bith fós. Nuair a roghnaigh tú ceann, beidh sí le feiceáil anseo.",
+  "empty_column.favourites": "Níor roghnaigh éinne an phostáil seo fós. Nuair a roghnaigh duine éigin, beidh siad le feiceáil anseo.",
   "empty_column.follow_recommendations": "Looks like no suggestions could be generated for you. You can try using search to look for people you might know or explore trending hashtags.",
   "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
   "empty_column.hashtag": "There is nothing in this hashtag yet.",
@@ -204,7 +204,7 @@
   "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
   "generic.saved": "Saved",
   "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Eolaire na próifíle",
   "getting_started.documentation": "Documentation",
   "getting_started.heading": "Getting started",
   "getting_started.invite": "Invite people",
@@ -221,7 +221,7 @@
   "hashtag.column_settings.tag_mode.none": "None of these",
   "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
   "home.column_settings.basic": "Basic",
-  "home.column_settings.show_reblogs": "Show boosts",
+  "home.column_settings.show_reblogs": "Taispeáin treisithe",
   "home.column_settings.show_replies": "Show replies",
   "home.hide_announcements": "Hide announcements",
   "home.show_announcements": "Show announcements",
@@ -230,15 +230,15 @@
   "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
   "keyboard_shortcuts.back": "to navigate back",
   "keyboard_shortcuts.blocked": "to open blocked users list",
-  "keyboard_shortcuts.boost": "to boost",
+  "keyboard_shortcuts.boost": "Treisigh postáil",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
   "keyboard_shortcuts.description": "Description",
   "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
-  "keyboard_shortcuts.enter": "to open status",
-  "keyboard_shortcuts.favourite": "to favourite",
-  "keyboard_shortcuts.favourites": "to open favourites list",
+  "keyboard_shortcuts.enter": "Oscail postáil",
+  "keyboard_shortcuts.favourite": "Roghnaigh postáil",
+  "keyboard_shortcuts.favourites": "Oscail liosta roghanna",
   "keyboard_shortcuts.federated": "to open federated timeline",
   "keyboard_shortcuts.heading": "Keyboard Shortcuts",
   "keyboard_shortcuts.home": "to open home timeline",
@@ -247,19 +247,19 @@
   "keyboard_shortcuts.local": "to open local timeline",
   "keyboard_shortcuts.mention": "to mention author",
   "keyboard_shortcuts.muted": "Oscail liosta na n-úsáideoirí balbhaithe",
-  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.my_profile": "Oscail do phróifíl",
   "keyboard_shortcuts.notifications": "to open notifications column",
   "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned posts list",
-  "keyboard_shortcuts.profile": "to open author's profile",
-  "keyboard_shortcuts.reply": "to reply",
+  "keyboard_shortcuts.profile": "Oscail próifíl an t-údar",
+  "keyboard_shortcuts.reply": "Freagair ar phostáil",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
   "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
-  "keyboard_shortcuts.toot": "to start a brand new post",
+  "keyboard_shortcuts.toot": "Cuir tús le postáil nua",
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Close",
@@ -267,8 +267,8 @@
   "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
-  "limited_account_hint.action": "Show profile anyway",
-  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
+  "limited_account_hint.action": "Taispeáin an phróifíl ar aon nós",
+  "limited_account_hint.title": "Tá an phróifíl seo curtha i bhfolach ag na modhnóra do fhreastalaí.",
   "lists.account.add": "Add to list",
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
@@ -294,13 +294,13 @@
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
-  "navigation_bar.compose": "Compose new post",
+  "navigation_bar.compose": "Cum postáil nua",
   "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
   "navigation_bar.edit_profile": "Cuir an phróifíl in eagar",
   "navigation_bar.explore": "Explore",
-  "navigation_bar.favourites": "Favourites",
+  "navigation_bar.favourites": "Roghanna",
   "navigation_bar.filters": "Focail bhalbhaithe",
   "navigation_bar.follow_requests": "Follow requests",
   "navigation_bar.follows_and_followers": "Ag leanúint agus do do leanúint",
@@ -315,20 +315,20 @@
   "navigation_bar.public_timeline": "Federated timeline",
   "navigation_bar.security": "Security",
   "notification.admin.sign_up": "{name} signed up",
-  "notification.favourite": "{name} favourited your status",
+  "notification.favourite": "Roghnaigh {name} do phostáil",
   "notification.follow": "Lean {name} thú",
   "notification.follow_request": "D'iarr {name} ort do chuntas a leanúint",
   "notification.mention": "{name} mentioned you",
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
-  "notification.reblog": "{name} boosted your status",
-  "notification.status": "{name} just posted",
+  "notification.reblog": "Threisigh {name} do phostáil",
+  "notification.status": "Phostáil {name} díreach",
   "notification.update": "Chuir {name} postáil in eagar",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.admin.sign_up": "New sign-ups:",
   "notifications.column_settings.alert": "Desktop notifications",
-  "notifications.column_settings.favourite": "Favourites:",
+  "notifications.column_settings.favourite": "Roghanna:",
   "notifications.column_settings.filter_bar.advanced": "Display all categories",
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show_bar": "Show filter bar",
@@ -337,16 +337,16 @@
   "notifications.column_settings.mention": "Mentions:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
-  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.reblog": "Treisithe:",
   "notifications.column_settings.show": "Show in column",
   "notifications.column_settings.sound": "Play sound",
-  "notifications.column_settings.status": "New posts:",
+  "notifications.column_settings.status": "Postálacha nua:",
   "notifications.column_settings.unread_notifications.category": "Unread notifications",
   "notifications.column_settings.unread_notifications.highlight": "Highlight unread notifications",
   "notifications.column_settings.update": "Eagair:",
   "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.boosts": "Treisithe",
+  "notifications.filter.favourites": "Roghanna",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
@@ -401,8 +401,8 @@
   "report.categories.violation": "Content violates one or more server rules",
   "report.category.subtitle": "Choose the best match",
   "report.category.title": "Tell us what's going on with this {type}",
-  "report.category.title_account": "profile",
-  "report.category.title_status": "post",
+  "report.category.title_account": "próifíl",
+  "report.category.title_status": "postáil",
   "report.close": "Déanta",
   "report.comment.title": "Is there anything else you think we should know?",
   "report.forward": "Forward to {target}",
@@ -435,7 +435,7 @@
   "search_popout.search_format": "Advanced search format",
   "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
   "search_popout.tips.hashtag": "haischlib",
-  "search_popout.tips.status": "status",
+  "search_popout.tips.status": "postáil",
   "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
   "search_popout.tips.user": "user",
   "search_results.accounts": "Daoine",
@@ -449,8 +449,8 @@
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
-  "status.cancel_reblog_private": "Unboost",
-  "status.cannot_reblog": "This post cannot be boosted",
+  "status.cancel_reblog_private": "Díthreisigh",
+  "status.cannot_reblog": "Ní féidir an phostáil seo a threisiú",
   "status.copy": "Copy link to status",
   "status.delete": "Scrios",
   "status.detailed_status": "Detailed conversation view",
@@ -459,7 +459,7 @@
   "status.edited": "Curtha in eagar in {date}",
   "status.edited_x_times": "Curtha in eagar {count, plural, one {{count} uair amháin} two {{count} uair} few {{count} uair} many {{count} uair} other {{count} uair}}",
   "status.embed": "Embed",
-  "status.favourite": "Favourite",
+  "status.favourite": "Rogha",
   "status.filtered": "Filtered",
   "status.history.created": "{name} created {date}",
   "status.history.edited": "Curtha in eagar ag {name} in {date}",
@@ -470,13 +470,13 @@
   "status.mute": "Balbhaigh @{name}",
   "status.mute_conversation": "Balbhaigh comhrá",
   "status.open": "Expand this status",
-  "status.pin": "Pin on profile",
+  "status.pin": "Pionnáil ar do phróifíl",
   "status.pinned": "Pinned post",
   "status.read_more": "Read more",
-  "status.reblog": "Boost",
-  "status.reblog_private": "Boost with original visibility",
-  "status.reblogged_by": "{name} boosted",
-  "status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.",
+  "status.reblog": "Treisigh",
+  "status.reblog_private": "Treisigh le léargas bunúsach",
+  "status.reblogged_by": "Treisithe ag {name}",
+  "status.reblogs.empty": "Níor threisigh éinne an phostáil seo fós. Nuair a threisigh duine éigin, beidh siad le feiceáil anseo.",
   "status.redraft": "Delete & re-draft",
   "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Reply",
@@ -491,7 +491,7 @@
   "status.show_thread": "Show thread",
   "status.uncached_media_warning": "Not available",
   "status.unmute_conversation": "Díbhalbhaigh comhrá",
-  "status.unpin": "Unpin from profile",
+  "status.unpin": "Díphionnáil de do phróifíl",
   "suggestions.dismiss": "Dismiss suggestion",
   "suggestions.header": "You might be interested in…",
   "tabs_bar.federated_timeline": "Federated",
diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json
index 107130011..bdfc02af7 100644
--- a/app/javascript/mastodon/locales/gd.json
+++ b/app/javascript/mastodon/locales/gd.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Thoir an roghainn seo air falbh",
   "compose_form.poll.switch_to_multiple": "Atharraich an cunntas-bheachd ach an gabh iomadh roghainn a thaghadh",
   "compose_form.poll.switch_to_single": "Atharraich an cunntas-bheachd gus nach gabh ach aon roghainn a thaghadh",
-  "compose_form.publish": "Postaich",
+  "compose_form.publish": "Foillsich",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Sàbhail na h-atharraichean",
   "compose_form.sensitive.hide": "{count, plural, one {Cuir comharra gu bheil am meadhan frionasach} two {Cuir comharra gu bheil na meadhanan frionasach} few {Cuir comharra gu bheil na meadhanan frionasach} other {Cuir comharra gu bheil na meadhanan frionasach}}",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index c42f9bab3..0a6aac287 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Eliminar esta opción",
   "compose_form.poll.switch_to_multiple": "Mudar a enquisa para permitir múltiples escollas",
   "compose_form.poll.switch_to_single": "Mudar a enquisa para permitir unha soa escolla",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publicar",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Gardar cambios",
   "compose_form.sensitive.hide": "{count, plural, one {Marca multimedia como sensible} other {Marca multimedia como sensibles}}",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index 21ef7a6c2..ecbc373c6 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -4,7 +4,7 @@
   "account.badges.bot": "בוט",
   "account.badges.group": "קבוצה",
   "account.block": "חסמי את @{name}",
-  "account.block_domain": "חסמו את שם המתחם (דומיין) {domain}",
+  "account.block_domain": "חסמו את קהילת {domain}",
   "account.blocked": "חסום",
   "account.browse_more_on_origin_server": "ראה יותר בפרופיל המקורי",
   "account.cancel_follow_request": "בטל בקשת מעקב",
@@ -32,20 +32,20 @@
   "account.mute": "להשתיק את @{name}",
   "account.mute_notifications": "להסתיר התראות מ @{name}",
   "account.muted": "מושתק",
-  "account.posts": "חצרוצים",
-  "account.posts_with_replies": "חצרוצים ותגובות",
+  "account.posts": "פוסטים",
+  "account.posts_with_replies": "פוסטים ותגובות",
   "account.report": "דווח על @{name}",
   "account.requested": "בהמתנה לאישור. לחצי כדי לבטל בקשת מעקב",
   "account.share": "שתף את הפרופיל של @{name}",
   "account.show_reblogs": "הצג הדהודים מאת @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
   "account.unblock": "הסר את החסימה של @{name}",
-  "account.unblock_domain": "הסראת שם המתחם {domain}",
+  "account.unblock_domain": "הסירי את החסימה של קהילת {domain}",
   "account.unblock_short": "הסר חסימה",
   "account.unendorse": "אל תקדם בפרופיל",
   "account.unfollow": "הפסקת מעקב",
   "account.unmute": "הפסקת השתקת @{name}",
-  "account.unmute_notifications": "להפסיק השתקת הודעות מ @{name}",
+  "account.unmute_notifications": "להפסיק השתקת התראות מ @{name}",
   "account.unmute_short": "ביטול השתקה",
   "account_note.placeholder": "יש ללחוץ כדי להוסיף הערות",
   "admin.dashboard.daily_retention": "קצב שימור משתמשים (פר יום) אחרי ההרשמה",
@@ -54,49 +54,49 @@
   "admin.dashboard.retention.cohort": "חודש רישום",
   "admin.dashboard.retention.cohort_size": "משתמשים חדשים",
   "alert.rate_limited.message": "נא לנסות אחרי {retry_time, time, medium}.",
-  "alert.rate_limited.title": "מגבלות מיכסה",
+  "alert.rate_limited.title": "חלה הגבלת קצב",
   "alert.unexpected.message": "אירעה שגיאה בלתי צפויה.",
   "alert.unexpected.title": "אופס!",
-  "announcement.announcement": "הודעה",
+  "announcement.announcement": "הכרזה",
   "attachments_list.unprocessed": "(לא מעובד)",
   "autosuggest_hashtag.per_week": "{count} לשבוע",
   "boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה",
-  "bundle_column_error.body": "משהו השתבש בעת הצגת הרכיב הזה.",
+  "bundle_column_error.body": "משהו השתבש בעת טעינת הרכיב הזה.",
   "bundle_column_error.retry": "לנסות שוב",
   "bundle_column_error.title": "שגיאת רשת",
   "bundle_modal_error.close": "לסגור",
   "bundle_modal_error.message": "משהו השתבש בעת טעינת הרכיב הזה.",
   "bundle_modal_error.retry": "לנסות שוב",
-  "column.blocks": "חסימות",
+  "column.blocks": "משתמשים חסומים",
   "column.bookmarks": "סימניות",
-  "column.community": "ציר זמן מקומי",
+  "column.community": "פיד שרת מקומי",
   "column.direct": "הודעות ישירות",
-  "column.directory": "גלוש פרופילים",
-  "column.domain_blocks": "Hidden domains",
+  "column.directory": "עיין בפרופילים",
+  "column.domain_blocks": "קהילות (שמות מתחם) מוסתרות",
   "column.favourites": "חיבובים",
   "column.follow_requests": "בקשות מעקב",
-  "column.home": "בבית",
+  "column.home": "פיד הבית",
   "column.lists": "רשימות",
   "column.mutes": "השתקות",
   "column.notifications": "התראות",
-  "column.pins": "Pinned toot",
-  "column.public": "בפרהסיה",
-  "column_back_button.label": "חזרה",
-  "column_header.hide_settings": "הסתרת העדפות",
-  "column_header.moveLeft_settings": "הזחת טור לשמאל",
-  "column_header.moveRight_settings": "הזחת טור לימין",
-  "column_header.pin": "קיבוע",
+  "column.pins": "פווסטים נעוצים",
+  "column.public": "פיד כללי (כל השרתים)",
+  "column_back_button.label": "בחזרה",
+  "column_header.hide_settings": "הסתרת הגדרות",
+  "column_header.moveLeft_settings": "הזזת טור לשמאל",
+  "column_header.moveRight_settings": "הזזת טור לימין",
+  "column_header.pin": "הצמדה",
   "column_header.show_settings": "הצגת העדפות",
-  "column_header.unpin": "שחרור קיבוע",
+  "column_header.unpin": "שחרור הצמדה",
   "column_subheading.settings": "אפשרויות",
   "community.column_settings.local_only": "מקומי בלבד",
-  "community.column_settings.media_only": "Media only",
-  "community.column_settings.remote_only": "מרחוק בלבד",
-  "compose.language.change": "Change language",
-  "compose.language.search": "Search languages...",
+  "community.column_settings.media_only": "מדיה בלבד",
+  "community.column_settings.remote_only": "מרוחק בלבד",
+  "compose.language.change": "שינוי שפת הפוסט",
+  "compose.language.search": "חיפוש שפות...",
   "compose_form.direct_message_warning_learn_more": "מידע נוסף",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.encryption_warning": "פוסטים במסטודון לא מוצפנים מקצה לקצה. אל תשתפו מידע רגיש במסטודון.",
+  "compose_form.hashtag_warning": "פוסט זה לא יירשם תחת תגי הקבצה (האשטאגים) היות והנראות שלו היא 'לא רשום'. רק פוסטים ציבוריים יכולים להימצא באמצעות תגי הקבצה.",
   "compose_form.lock_disclaimer": "חשבונך אינו {locked}. כל אחד יוכל לעקוב אחריך כדי לקרוא את הודעותיך המיועדות לעוקבים בלבד.",
   "compose_form.lock_disclaimer.lock": "נעול",
   "compose_form.placeholder": "מה עובר לך בראש?",
@@ -106,36 +106,36 @@
   "compose_form.poll.remove_option": "הסר בחירה זו",
   "compose_form.poll.switch_to_multiple": "אפשרו בחירה מרובה בסקר",
   "compose_form.poll.switch_to_single": "אפשרו בחירה בודדת בסקר",
-  "compose_form.publish": "ללחוש",
+  "compose_form.publish": "פרסום",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "שמירת שינויים",
   "compose_form.sensitive.hide": "{count, plural, one {סימון מידע כרגיש} other {סימון מידע כרגיש}}",
   "compose_form.sensitive.marked": "{count, plural, one {מידע מסומן כרגיש} other {מידע מסומן כרגיש}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {מידע לא מסומן כרגיש} other {מידע לא מסומן כרגיש}}",
-  "compose_form.spoiler.marked": "Text is hidden behind warning",
-  "compose_form.spoiler.unmarked": "Text is not hidden",
-  "compose_form.spoiler_placeholder": "אזהרת תוכן",
+  "compose_form.spoiler.marked": "הסר אזהרת תוכן",
+  "compose_form.spoiler.unmarked": "הוסף אזהרת תוכן",
+  "compose_form.spoiler_placeholder": "כתוב את האזהרה שלך כאן",
   "confirmation_modal.cancel": "ביטול",
   "confirmations.block.block_and_report": "לחסום ולדווח",
   "confirmations.block.confirm": "לחסום",
-  "confirmations.block.message": "לחסום את {name}?",
+  "confirmations.block.message": "האם את/ה בטוח/ה שברצונך למחוק את \"{name}\"?",
   "confirmations.delete.confirm": "למחוק",
-  "confirmations.delete.message": "למחוק את ההודעה?",
+  "confirmations.delete.message": "בטוח/ה שאת/ה רוצה למחוק את ההודעה?",
   "confirmations.delete_list.confirm": "למחוק",
   "confirmations.delete_list.message": "האם אתם בטוחים שאתם רוצים למחוק את הרשימה לצמיתות?",
   "confirmations.discard_edit_media.confirm": "השלך",
   "confirmations.discard_edit_media.message": "יש לך שינויים לא שמורים לתיאור המדיה. להשליך אותם בכל זאת?",
-  "confirmations.domain_block.confirm": "הסתר קהילה שלמה",
-  "confirmations.domain_block.message": "באמת באמת לחסום את כל קהילת {domain}? ברב המקרים השתקות נבחרות של מספר משתמשים מסויימים צריכה להספיק.",
+  "confirmations.domain_block.confirm": "חסמו לגמרי את שם המתחם (דומיין)",
+  "confirmations.domain_block.message": "בטוחה שברצונך באמת לחסום את קהילת {domain}? ברב המקרים השתקה וחסימה של מספר משתמשים עשוייה להספיק. לא תראי תוכל מכלל שם המתחם בפידים הציבוריים או בהתראות שלך. העוקבים שלך מהקהילה הזאת יוסרו",
   "confirmations.logout.confirm": "להתנתק",
   "confirmations.logout.message": "האם אתם בטוחים שאתם רוצים להתנתק?",
   "confirmations.mute.confirm": "להשתיק",
-  "confirmations.mute.explanation": "זה יסתיר חצרוצים שלהם וחצרוצים המזכירים אותם, אבל עדיין יתיר להם לראות פוסטים שלך ולעקוב אחריך.",
+  "confirmations.mute.explanation": "זה יסתיר פוסטים שלהם ופוסטים שמאזכרים אותם, אבל עדיין יתיר להם לראות פוסטים שלך ולעקוב אחריך.",
   "confirmations.mute.message": "להשתיק את {name}?",
   "confirmations.redraft.confirm": "מחק וערוך מחדש",
-  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
+  "confirmations.redraft.message": "בטוחה שאת רוצה למחוק ולהתחיל טיוטה חדשה? חיבובים והדהודים יאבדו, ותגובות לפוסט המקורי ישארו יתומות.",
   "confirmations.reply.confirm": "הגב",
-  "confirmations.reply.message": "הגבה עכשיו ידרוס את ההודעה שאתם כותבים כעת. האם אתם בטוחים שברצונכם להמשיך?",
+  "confirmations.reply.message": "תגובה עכשיו תדרוס את ההודעה שכבר התחלתים לכתוב. האם אתם בטוחים שברצונכם להמשיך?",
   "confirmations.unfollow.confirm": "להפסיק מעקב",
   "confirmations.unfollow.message": "להפסיק מעקב אחרי {name}?",
   "conversation.delete": "מחיקת שיחה",
@@ -149,7 +149,7 @@
   "embed.instructions": "ניתן להטמיע את ההודעה באתרך ע\"י העתקת הקוד שלהלן.",
   "embed.preview": "דוגמא כיצד זה יראה:",
   "emoji_button.activity": "פעילות",
-  "emoji_button.clear": "Clear",
+  "emoji_button.clear": "ניקוי",
   "emoji_button.custom": "מיוחדים",
   "emoji_button.flags": "דגלים",
   "emoji_button.food": "אוכל ושתיה",
@@ -164,22 +164,22 @@
   "emoji_button.symbols": "סמלים",
   "emoji_button.travel": "טיולים ואתרים",
   "empty_column.account_suspended": "חשבון מושהה",
-  "empty_column.account_timeline": "No toots here!",
+  "empty_column.account_timeline": "אין עדיין אף פוסט!",
   "empty_column.account_unavailable": "פרופיל לא זמין",
   "empty_column.blocks": "עדיין לא חסמתם משתמשים אחרים.",
   "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
-  "empty_column.community": "טור הסביבה ריק. יש לפרסם משהו כדי שדברים יתרחילו להתגלגל!",
+  "empty_column.community": "פיד השרת המקומי ריק. יש לפרסם משהו כדי שדברים יתרחילו להתגלגל!",
   "empty_column.direct": "אין לך שום הודעות פרטיות עדיין. כשתשלחו או תקבלו אחת, היא תופיע כאן.",
-  "empty_column.domain_blocks": "There are no hidden domains yet.",
+  "empty_column.domain_blocks": "אין עדיין קהילות מוסתרות.",
   "empty_column.explore_statuses": "אין נושאים חמים כרגע. אולי אחר כך!",
-  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
-  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
+  "empty_column.favourited_statuses": "אין עדיין פוסטים שחיבבת. כשתחבב את הראשון, הוא יופיע כאן.",
+  "empty_column.favourites": "עוד לא חיבבו את הפוסט הזה. כאשר זה יקרה, החיבובים יופיעו כאן.",
   "empty_column.follow_recommendations": "נראה שלא ניתן לייצר המלצות עבורך. נסה/י להשתמש בחיפוש כדי למצוא אנשים מוכרים או לבדוק את הנושאים החמים.",
   "empty_column.follow_requests": "אין לך שום בקשות מעקב עדיין. לכשיתקבלו כאלה, הן תופענה כאן.",
   "empty_column.hashtag": "אין כלום בהאשתג הזה עדיין.",
   "empty_column.home": "אף אחד לא במעקב עדיין. אפשר לבקר ב{public} או להשתמש בחיפוש כדי להתחיל ולהכיר חצוצרנים אחרים. {suggestions}",
   "empty_column.home.suggestions": "ראה/י כמה הצעות",
-  "empty_column.list": "אין עדיין מאום ברשימה.",
+  "empty_column.list": "אין עדיין פריטים ברשימה. כאשר חברים ברשימה הזאת יפרסמו פוסטים חדשים, הם יופיעו פה.",
   "empty_column.lists": "אין לך שום רשימות עדיין. לכשיהיו, הן תופענה כאן.",
   "empty_column.mutes": "עוד לא השתקת שום משתמש.",
   "empty_column.notifications": "אין התראות עדיין. יאללה, הגיע הזמן להתחיל להתערבב.",
@@ -194,22 +194,22 @@
   "explore.suggested_follows": "עבורך",
   "explore.title": "סיור",
   "explore.trending_links": "חדשות",
-  "explore.trending_statuses": "חצרוצים",
+  "explore.trending_statuses": "פוסטים",
   "explore.trending_tags": "האשטאגים",
   "follow_recommendations.done": "בוצע",
   "follow_recommendations.heading": "עקב/י אחרי אנשים שתרצה/י לראות את חצרוציהם! הנה כמה הצעות.",
   "follow_recommendations.lead": "חצרוצים מאנשים במעקב יופיעו בסדר כרונולוגי בפיד הבית. אל תחששו מטעויות, אפשר להסיר מעקב באותה הקלות ובכל זמן!",
-  "follow_request.authorize": "קבלה",
+  "follow_request.authorize": "הרשאה",
   "follow_request.reject": "דחיה",
   "follow_requests.unlocked_explanation": "למרות שחשבונך אינו נעול, צוות {domain} חושב שאולי כדאי לוודא את בקשות המעקב האלה ידנית.",
   "generic.saved": "נשמר",
   "getting_started.developers": "מפתחות",
-  "getting_started.directory": "ספריית פרופילים",
+  "getting_started.directory": "מדריך פרופילים",
   "getting_started.documentation": "תיעוד",
   "getting_started.heading": "בואו נתחיל",
   "getting_started.invite": "להזמין אנשים",
   "getting_started.open_source_notice": "מסטודון היא תוכנה חופשית (בקוד פתוח). ניתן לתרום או לדווח על בעיות בגיטהאב: {github}.",
-  "getting_started.security": "Security",
+  "getting_started.security": "הגדרות חשבון",
   "getting_started.terms": "תנאי שימוש",
   "hashtag.column_header.tag_mode.all": "ו- {additional}",
   "hashtag.column_header.tag_mode.any": "או {additional}",
@@ -218,8 +218,8 @@
   "hashtag.column_settings.select.placeholder": "הזן תגי הקבצה…",
   "hashtag.column_settings.tag_mode.all": "כל אלה",
   "hashtag.column_settings.tag_mode.any": "כל אלה",
-  "hashtag.column_settings.tag_mode.none": "אפאחד מאלה",
-  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "hashtag.column_settings.tag_mode.none": "אף אחד מאלה",
+  "hashtag.column_settings.tag_toggle": "כלול תגיות נוספות בטור זה",
   "home.column_settings.basic": "למתחילים",
   "home.column_settings.show_reblogs": "הצגת הדהודים",
   "home.column_settings.show_replies": "הצגת תגובות",
@@ -259,7 +259,7 @@
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "הצגת/הסתרת טקסט מוסתר מאחורי אזהרת תוכן",
   "keyboard_shortcuts.toggle_sensitivity": "הצגת/הסתרת מדיה",
-  "keyboard_shortcuts.toot": "להתחיל חיצרוץ חדש",
+  "keyboard_shortcuts.toot": "להתחיל פוסט חדש",
   "keyboard_shortcuts.unfocus": "לצאת מתיבת חיבור/חיפוש",
   "keyboard_shortcuts.up": "לנוע במעלה הרשימה",
   "lightbox.close": "סגירה",
@@ -267,8 +267,8 @@
   "lightbox.expand": "הרחבת קופסת צפייה בתמונה",
   "lightbox.next": "הלאה",
   "lightbox.previous": "הקודם",
-  "limited_account_hint.action": "Show profile anyway",
-  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
+  "limited_account_hint.action": "הצג חשבון בכל זאת",
+  "limited_account_hint.title": "פרופיל זה הוסתר ע\"י מנהלי השרת שלך.",
   "lists.account.add": "הוסף לרשימה",
   "lists.account.remove": "הסר מרשימה",
   "lists.delete": "מחיקת רשימה",
@@ -288,32 +288,32 @@
   "missing_indicator.label": "לא נמצא",
   "missing_indicator.sublabel": "לא ניתן היה למצוא את המשאב",
   "mute_modal.duration": "משך הזמן",
-  "mute_modal.hide_notifications": "להסתיר הודעות מחשבון זה?",
+  "mute_modal.hide_notifications": "להסתיר התראות מחשבון זה?",
   "mute_modal.indefinite": "ללא תאריך סיום",
   "navigation_bar.apps": "יישומונים לנייד",
-  "navigation_bar.blocks": "חסימות",
+  "navigation_bar.blocks": "משתמשים חסומים",
   "navigation_bar.bookmarks": "סימניות",
-  "navigation_bar.community_timeline": "ציר זמן מקומי",
-  "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.community_timeline": "פיד שרת מקומי",
+  "navigation_bar.compose": "צור פוסט חדש",
   "navigation_bar.direct": "הודעות ישירות",
   "navigation_bar.discover": "גלה",
-  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.domain_blocks": "קהילות (שמות מתחם) חסומות",
   "navigation_bar.edit_profile": "עריכת פרופיל",
-  "navigation_bar.explore": "חקור",
+  "navigation_bar.explore": "סיור",
   "navigation_bar.favourites": "חיבובים",
   "navigation_bar.filters": "מילים מושתקות",
   "navigation_bar.follow_requests": "בקשות מעקב",
   "navigation_bar.follows_and_followers": "נעקבים ועוקבים",
-  "navigation_bar.info": "מידע נוסף",
+  "navigation_bar.info": "אודות שרת זה",
   "navigation_bar.keyboard_shortcuts": "קיצורי מקלדת",
   "navigation_bar.lists": "רשימות",
-  "navigation_bar.logout": "יציאה",
+  "navigation_bar.logout": "התנתקות",
   "navigation_bar.mutes": "השתקות",
   "navigation_bar.personal": "אישי",
-  "navigation_bar.pins": "חיצרוצים מקובעים",
+  "navigation_bar.pins": "פוסטים נעוצים",
   "navigation_bar.preferences": "העדפות",
   "navigation_bar.public_timeline": "ציר זמן בין-קהילתי",
-  "navigation_bar.security": "בטיחות",
+  "navigation_bar.security": "אבטחה",
   "notification.admin.sign_up": "{name} נרשמו",
   "notification.favourite": "חצרוצך חובב על ידי {name}",
   "notification.follow": "{name} במעקב אחרייך",
@@ -365,20 +365,20 @@
   "poll.refresh": "רענון",
   "poll.total_people": "{count, plural, one {# איש/אישה} other {# אנשים}}",
   "poll.total_votes": "{count, plural, one {# קול} other {# קולות}}",
-  "poll.vote": "קול",
+  "poll.vote": "הצבעה",
   "poll.voted": "הצבעת לתשובה זו",
   "poll.votes": "{votes, plural, one {# קול} other {# קולות}}",
   "poll_button.add_poll": "הוספת סקר",
   "poll_button.remove_poll": "הסרת סקר",
   "privacy.change": "שינוי פרטיות ההודעה",
-  "privacy.direct.long": "הצג רק למי שהודעה זו פונה אליו",
-  "privacy.direct.short": "אנשים מוזכרים בלבד",
+  "privacy.direct.long": "רק למשתמשים מאוזכרים (mentioned)",
+  "privacy.direct.short": "למאוזכרים בלבד",
   "privacy.private.long": "הצג לעוקבים בלבד",
-  "privacy.private.short": "עוקבים בלבד",
+  "privacy.private.short": "לעוקבים בלבד",
   "privacy.public.long": "גלוי לכל",
   "privacy.public.short": "פומבי",
   "privacy.unlisted.long": "גלוי לכל, אבל מוסתר מאמצעי גילוי",
-  "privacy.unlisted.short": "לא לפיד הכללי",
+  "privacy.unlisted.short": "לא רשום (לא לפיד הכללי)",
   "refresh": "רענון",
   "regeneration_indicator.label": "טוען…",
   "regeneration_indicator.sublabel": "פיד הבית שלך בהכנה!",
@@ -395,7 +395,7 @@
   "relative_time.today": "היום",
   "reply_indicator.cancel": "ביטול",
   "report.block": "לחסום",
-  "report.block_explanation": "לא ניתן יהיה לראות את חצרוציהם. הם לא יוכלו לראות את חצרוציך או לעקוב אחריך. הם יוכלו לדעת שהם חסומים.",
+  "report.block_explanation": "לא ניתן יהיה לראות את הפוסטים שלהן. הן לא יוכלו לראות את הפוסטים שלך או לעקוב אחריך. הם יוכלו לדעת שהם חסומים.",
   "report.categories.other": "אחר",
   "report.categories.spam": "ספאם",
   "report.categories.violation": "התוכן מפר אחד או יותר מחוקי השרת",
@@ -451,7 +451,7 @@
   "status.bookmark": "סימניה",
   "status.cancel_reblog_private": "הסרת הדהוד",
   "status.cannot_reblog": "לא ניתן להדהד הודעה זו",
-  "status.copy": "Copy link to status",
+  "status.copy": "העתק/י קישור לפוסט זה",
   "status.delete": "מחיקה",
   "status.detailed_status": "תצוגת שיחה מפורטת",
   "status.direct": "הודעה ישירה ל@{name}",
@@ -469,8 +469,8 @@
   "status.more": "עוד",
   "status.mute": "להשתיק את @{name}",
   "status.mute_conversation": "השתקת שיחה",
-  "status.open": "הרחבת הודעה",
-  "status.pin": "לקבע באודות",
+  "status.open": "הרחבת פוסט זה",
+  "status.pin": "הצמדה לפרופיל שלי",
   "status.pinned": "Pinned toot",
   "status.read_more": "לקרוא עוד",
   "status.reblog": "הדהוד",
@@ -480,7 +480,7 @@
   "status.redraft": "מחיקה ועריכה מחדש",
   "status.remove_bookmark": "הסרת סימניה",
   "status.reply": "תגובה",
-  "status.replyAll": "תגובה לכולם",
+  "status.replyAll": "תגובה לפתיל",
   "status.report": "דיווח על @{name}",
   "status.sensitive_warning": "תוכן רגיש",
   "status.share": "שיתוף",
@@ -488,15 +488,15 @@
   "status.show_less_all": "להציג פחות מהכל",
   "status.show_more": "הראה יותר",
   "status.show_more_all": "להציג יותר מהכל",
-  "status.show_thread": "להציג סיב",
+  "status.show_thread": "הצג כחלק מפתיל",
   "status.uncached_media_warning": "לא זמין",
   "status.unmute_conversation": "הסרת השתקת שיחה",
   "status.unpin": "לשחרר מקיבוע באודות",
   "suggestions.dismiss": "להתעלם מהצעה",
   "suggestions.header": "ייתכן שזה יעניין אותך…",
-  "tabs_bar.federated_timeline": "ציר זמן בין-קהילתי",
-  "tabs_bar.home": "בבית",
-  "tabs_bar.local_timeline": "ציר זמן מקומי",
+  "tabs_bar.federated_timeline": "פיד כללי (בין-קהילתי)",
+  "tabs_bar.home": "פיד הבית",
+  "tabs_bar.local_timeline": "פיד שרת מקומי",
   "tabs_bar.notifications": "התראות",
   "tabs_bar.search": "חיפוש",
   "time_remaining.days": "נותרו {number, plural, one {# יום} other {# ימים}}",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index 5c3523c2d..df0085067 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "इस विकल्प को हटाएँ",
   "compose_form.poll.switch_to_multiple": "कई विकल्पों की अनुमति देने के लिए पोल बदलें",
   "compose_form.poll.switch_to_single": "एक ही विकल्प के लिए अनुमति देने के लिए पोल बदलें",
-  "compose_form.publish": "टूट्",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "परिवर्तनों को सहेजें",
   "compose_form.sensitive.hide": "मीडिया को संवेदनशील के रूप में चिह्नित करें",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index 4096c98d0..1ed57960e 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Ukloni ovu opciju",
   "compose_form.poll.switch_to_multiple": "Omogući višestruki odabir opcija ankete",
   "compose_form.poll.switch_to_single": "Omogući odabir samo jedne opcije ankete",
-  "compose_form.publish": "Tootni",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "Označi medijski sadržaj kao osjetljiv",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index ccaf9a482..403e9edfe 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Lehetőség törlése",
   "compose_form.poll.switch_to_multiple": "Szavazás megváltoztatása több választásosra",
   "compose_form.poll.switch_to_single": "Szavazás megváltoztatása egyetlen választásosra",
-  "compose_form.publish": "Tülk",
+  "compose_form.publish": "Közzététel",
   "compose_form.publish_loud": "{publish}!",
   "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}}",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 63309c5c5..7d80b18d8 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Հեռացնել այս տարբերակը",
   "compose_form.poll.switch_to_multiple": "Հարցումը դարձնել բազմակի ընտրութեամբ",
   "compose_form.poll.switch_to_single": "Հարցումը դարձնել եզակի ընտրութեամբ",
-  "compose_form.publish": "Հրապարակել",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "Հրապարակե՜լ",
   "compose_form.save_changes": "Պահպանել փոփոխութիւնները",
   "compose_form.sensitive.hide": "Նշել մեդիան որպէս դիւրազգաց",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 35fad0170..10f80ee61 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -95,7 +95,7 @@
   "compose.language.change": "Ganti bahasa",
   "compose.language.search": "Telusuri bahasa...",
   "compose_form.direct_message_warning_learn_more": "Pelajari selengkapnya",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "Kiriman di Mastodon tidak dienkripsi end-to-end. Jangan bagikan informasi sensitif melalui Mastodon.",
   "compose_form.hashtag_warning": "Toot ini tidak akan ada dalam daftar tagar manapun karena telah diatur sebagai tidak terdaftar. Hanya postingan publik yang bisa dicari dengan tagar.",
   "compose_form.lock_disclaimer": "Akun anda tidak {locked}. Semua orang dapat mengikuti anda untuk melihat postingan khusus untuk pengikut anda.",
   "compose_form.lock_disclaimer.lock": "terkunci",
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Hapus opsi ini",
   "compose_form.poll.switch_to_multiple": "Ubah japat menjadi pilihan ganda",
   "compose_form.poll.switch_to_single": "Ubah japat menjadi pilihan tunggal",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Terbitkan",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Simpan perubahan",
   "compose_form.sensitive.hide": "{count, plural, other {Tandai media sebagai sensitif}}",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index fc25e931d..3eea9dcca 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -33,12 +33,12 @@
   "account.mute_notifications": "Silencigez avizi de @{name}",
   "account.muted": "Silencigata",
   "account.posts": "Mesaji",
-  "account.posts_with_replies": "Toots with replies",
+  "account.posts_with_replies": "Posti e respondi",
   "account.report": "Denuncar @{name}",
   "account.requested": "Vartante aprobo",
   "account.share": "Partigez profilo di @{name}",
   "account.show_reblogs": "Montrez busti de @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} Posto} other {{counter} Posti}}",
   "account.unblock": "Desblokusar @{name}",
   "account.unblock_domain": "Unhide {domain}",
   "account.unblock_short": "Derestriktez",
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Efacez ca selektajo",
   "compose_form.poll.switch_to_multiple": "Chanjez votposto por permisar multiselektaji",
   "compose_form.poll.switch_to_single": "Chanjez votposto por permisar una selektajo",
-  "compose_form.publish": "Siflar",
+  "compose_form.publish": "Publikigez",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Sparez chanji",
   "compose_form.sensitive.hide": "{count, plural,one {Markizez medii quale privata} other {Markizez medii quale privata}}",
@@ -193,7 +193,7 @@
   "explore.search_results": "Trovuri",
   "explore.suggested_follows": "Por vu",
   "explore.title": "Explorez",
-  "explore.trending_links": "Niuz",
+  "explore.trending_links": "Niuzi",
   "explore.trending_statuses": "Posti",
   "explore.trending_tags": "Hashtagi",
   "follow_recommendations.done": "Fina",
@@ -350,7 +350,7 @@
   "notifications.filter.follows": "Sequati",
   "notifications.filter.mentions": "Mencioni",
   "notifications.filter.polls": "Votpostorezulti",
-  "notifications.filter.statuses": "Niuz de personi quon vu sequas",
+  "notifications.filter.statuses": "Novaji de personi quon vu sequas",
   "notifications.grant_permission": "Donez permiso.",
   "notifications.group": "{count} avizi",
   "notifications.mark_as_read": "Markizez singla avizi quale lektita",
@@ -442,7 +442,7 @@
   "search_results.all": "Omna",
   "search_results.hashtags": "Hashtagi",
   "search_results.nothing_found": "Ne povas ganar irgo per ca trovvorti",
-  "search_results.statuses": "Toots",
+  "search_results.statuses": "Posti",
   "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
   "search_results.total": "{count, number} {count, plural, one {rezulto} other {rezulti}}",
   "status.admin_account": "Apertez jerintervizajo por @{name}",
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index 845d0f8d5..2cdf3c2c0 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -106,7 +106,7 @@
   "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": "Tíst",
+  "compose_form.publish": "Birta",
   "compose_form.publish_loud": "{publish}!",
   "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}}",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index b68b71115..d28316242 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Rimuovi questa scelta",
   "compose_form.poll.switch_to_multiple": "Modifica sondaggio per consentire scelte multiple",
   "compose_form.poll.switch_to_single": "Modifica sondaggio per consentire una singola scelta",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Pubblica",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Salva modifiche",
   "compose_form.sensitive.hide": "Segna media come sensibile",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index cf8ef991a..fdb0a3b36 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -99,7 +99,7 @@
   "compose.language.change": "言語を変更",
   "compose.language.search": "言語を検索...",
   "compose_form.direct_message_warning_learn_more": "もっと詳しく",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "Mastodonの投稿はエンドツーエンド暗号化に対応していません。安全に送受信されるべき情報をMastodonで共有しないでください。",
   "compose_form.hashtag_warning": "この投稿は公開設定ではないのでハッシュタグの一覧に表示されません。公開投稿だけがハッシュタグで検索できます。",
   "compose_form.lock_disclaimer": "あなたのアカウントは{locked}になっていません。誰でもあなたをフォローすることができ、フォロワー限定の投稿を見ることができます。",
   "compose_form.lock_disclaimer.lock": "承認制",
@@ -110,7 +110,7 @@
   "compose_form.poll.remove_option": "この項目を削除",
   "compose_form.poll.switch_to_multiple": "複数選択に変更",
   "compose_form.poll.switch_to_single": "単一選択に変更",
-  "compose_form.publish": "トゥート",
+  "compose_form.publish": "投稿",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "変更を保存",
   "compose_form.sensitive.hide": "メディアを閲覧注意にする",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 2ded9c350..d97673fc4 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Remove this choice",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "ტუტი",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index 37c4c9d0b..b19bb8e49 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Sfeḍ afran-agi",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Jewweq",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Sekles ibeddilen",
   "compose_form.sensitive.hide": "Creḍ allal n teywalt d anafri",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index 659c45db4..1364311ac 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Бұл жауапты өшір",
   "compose_form.poll.switch_to_multiple": "Бірнеше жауап таңдайтындай қылу",
   "compose_form.poll.switch_to_single": "Тек бір жауап таңдайтындай қылу",
-  "compose_form.publish": "Түрт",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "Сезімтал ретінде белгіле",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index af99045bb..630431d39 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Remove this choice",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 49712f6fa..34fabbacf 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "이 항목 삭제",
   "compose_form.poll.switch_to_multiple": "다중 선택이 가능한 투표로 변경",
   "compose_form.poll.switch_to_single": "단일 선택 투표로 변경",
-  "compose_form.publish": "뿌우",
+  "compose_form.publish": "게시",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "변경사항 저장",
   "compose_form.sensitive.hide": "미디어를 민감함으로 설정하기",
diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json
index 8c9cf6705..a38f18fa3 100644
--- a/app/javascript/mastodon/locales/ku.json
+++ b/app/javascript/mastodon/locales/ku.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Vê hilbijarê rake",
   "compose_form.poll.switch_to_multiple": "Rapirsî yê biguherînin da ku destûr bidin vebijarkên pirjimar",
   "compose_form.poll.switch_to_single": "Rapirsîyê biguherîne da ku mafê bidî tenê vebijêrkek",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Biweşîne",
   "compose_form.publish_loud": "{publish}!",
   "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}}",
diff --git a/app/javascript/mastodon/locales/kw.json b/app/javascript/mastodon/locales/kw.json
index 555b39da5..6a8c9933a 100644
--- a/app/javascript/mastodon/locales/kw.json
+++ b/app/javascript/mastodon/locales/kw.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Dilea'n dewis ma",
   "compose_form.poll.switch_to_multiple": "Chanjya sondyans dhe asa lies dewis",
   "compose_form.poll.switch_to_single": "Chanjya sondyans dhe asa unn dewis hepken",
-  "compose_form.publish": "Tout",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Merkya myski vel tender} other {Merkya myski vel tender}}",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index a37b946b4..afff3a79c 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Remove this choice",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 82fc40e32..b889948cf 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -26,7 +26,7 @@
   "account.joined": "Pievienojās {date}",
   "account.link_verified_on": "Šīs saites piederība ir pārbaudīta {date}",
   "account.locked_info": "Šī konta privātuma statuss ir slēgts. Īpašnieks izskatīs, kurš viņam drīkst sekot.",
-  "account.media": "Mediji",
+  "account.media": "Multivide",
   "account.mention": "Piemin @{name}",
   "account.moved_to": "{name} ir pārcelts uz:",
   "account.mute": "Apklusināt @{name}",
@@ -90,7 +90,7 @@
   "column_header.unpin": "Atspraust",
   "column_subheading.settings": "Iestatījumi",
   "community.column_settings.local_only": "Tikai vietējie",
-  "community.column_settings.media_only": "Tikai mediji",
+  "community.column_settings.media_only": "Tikai multivide",
   "community.column_settings.remote_only": "Tikai attālinātie",
   "compose.language.change": "Mainīt valodu",
   "compose.language.search": "Meklēt valodas...",
@@ -106,12 +106,12 @@
   "compose_form.poll.remove_option": "Noņemt šo izvēli",
   "compose_form.poll.switch_to_multiple": "Maini aptaujas veidu, lai atļautu vairākas izvēles",
   "compose_form.poll.switch_to_single": "Maini aptaujas veidu, lai atļautu vienu izvēli",
-  "compose_form.publish": "Taurēt",
+  "compose_form.publish": "Publicēt",
   "compose_form.publish_loud": "{publish}!",
   "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}}",
+  "compose_form.sensitive.hide": "{count, plural, one {Atzīmēt multividi kā sensitīvu} other {Atzīmēt multivides kā sensitīvas}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Multivide ir atzīmēta kā sensitīva} other {Multivides ir atzīmētas kā sensitīvas}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Multivide nav atzīmēts kā sensitīva} other {Multivides nav atzīmētas kā sensitīvas}}",
   "compose_form.spoiler.marked": "Noņemt satura brīdinājumu",
   "compose_form.spoiler.unmarked": "Pievienot satura brīdinājumu",
   "compose_form.spoiler_placeholder": "Ieraksti savu brīdinājumu šeit",
@@ -124,7 +124,7 @@
   "confirmations.delete_list.confirm": "Dzēst",
   "confirmations.delete_list.message": "Vai tiešam vēlies neatgriezeniski dzēst šo sarakstu?",
   "confirmations.discard_edit_media.confirm": "Izmest",
-  "confirmations.discard_edit_media.message": "Vai tev ir nesaglabātas izmaiņas mediju aprakstā vai priekšskatījumā, vai tomēr atmest tās?",
+  "confirmations.discard_edit_media.message": "Vai tev ir nesaglabātas izmaiņas multivides aprakstā vai priekšskatījumā, vai tomēr atmest tās?",
   "confirmations.domain_block.confirm": "Bloķēt visu domēnu",
   "confirmations.domain_block.message": "Vai tu tiešām, tiešam vēlies bloķēt visu domēnu {domain}? Lielākajā daļā gadījumu pietiek ja nobloķē vai apklusini kādu. Tu neredzēsi saturu vai paziņojumus no šī domēna nevienā laika līnijā. Tavi sekotāji no šī domēna tiks noņemti.",
   "confirmations.logout.confirm": "Iziet",
@@ -171,7 +171,7 @@
   "empty_column.community": "Vietējā ziņu lenta ir tukša. Uzraksti kaut ko publiski, lai viss notiktu!",
   "empty_column.direct": "Patrez tev nav privātu ziņu. Tiklīdz tādu nosūtīsi vai saņemsi, tās parādīsies šeit.",
   "empty_column.domain_blocks": "Vēl nav neviena bloķēta domēna.",
-  "empty_column.explore_statuses": "Pašlaik nekas nav tendēts. Pārbaudiet vēlāk!",
+  "empty_column.explore_statuses": "Pašlaik nekā aktuāla nav. Pārbaudi vēlāk!",
   "empty_column.favourited_statuses": "Patreiz tev nav neviena izceltā ieraksta. Kad kādu izcelsi, tas parādīsies šeit.",
   "empty_column.favourites": "Neviens šo ziņojumu vel nav izcēlis. Kad būs, tie parādīsies šeit.",
   "empty_column.follow_recommendations": "Šķiet, ka tev nevarēja ģenerēt ieteikumus. Vari mēģināt izmantot meklēšanu, lai meklētu cilvēkus, kurus tu varētu pazīt, vai izpētīt populārākās atsauces.",
@@ -188,7 +188,7 @@
   "error.unexpected_crash.explanation_addons": "Šo lapu nevarēja parādīt pareizi. Šo kļūdu, iespējams, izraisīja pārlūkprogrammas papildinājums vai automātiskās tulkošanas rīki.",
   "error.unexpected_crash.next_steps": "Mēģini atsvaidzināt lapu. Ja tas nepalīdz, iespējams, varēsi lietot Mastodon, izmantojot citu pārlūkprogrammu vai vietējo lietotni.",
   "error.unexpected_crash.next_steps_addons": "Mēģini tos atspējot un atsvaidzināt lapu. Ja tas nepalīdz, iespējams, varēsi lietot Mastodon, izmantojot citu pārlūkprogrammu vai vietējo lietotni.",
-  "errors.unexpected_crash.copy_stacktrace": "Iekopēt starpliktuvē",
+  "errors.unexpected_crash.copy_stacktrace": "Kopēt stacktrace uz starpliktuvi",
   "errors.unexpected_crash.report_issue": "Ziņot par problēmu",
   "explore.search_results": "Meklēšanas rezultāti",
   "explore.suggested_follows": "Tev",
@@ -207,7 +207,7 @@
   "getting_started.directory": "Profila direktorija",
   "getting_started.documentation": "Dokumentācija",
   "getting_started.heading": "Darba sākšana",
-  "getting_started.invite": "Uzaiciniet cilvēkus",
+  "getting_started.invite": "Uzaicini cilvēkus",
   "getting_started.open_source_notice": "Mastodon ir atvērtā koda programmatūra. Tu vari dot savu ieguldījumu vai arī ziņot par problēmām {github}.",
   "getting_started.security": "Konta iestatījumi",
   "getting_started.terms": "Pakalpojuma noteikumi",
@@ -230,7 +230,7 @@
   "intervals.full.minutes": "{number, plural, one {# minūte} other {# minūtes}}",
   "keyboard_shortcuts.back": "Pāriet atpakaļ",
   "keyboard_shortcuts.blocked": "Atvērt bloķēto lietotāju sarakstu",
-  "keyboard_shortcuts.boost": "Palielināt ziņu",
+  "keyboard_shortcuts.boost": "Atbalstīt ziņu",
   "keyboard_shortcuts.column": "Fokusēt kolonnu",
   "keyboard_shortcuts.compose": "Fokusēt veidojamā teksta lauku",
   "keyboard_shortcuts.description": "Apraksts",
@@ -245,11 +245,11 @@
   "keyboard_shortcuts.hotkey": "Ātrais taustiņš",
   "keyboard_shortcuts.legend": "Parādīt šo leģendu",
   "keyboard_shortcuts.local": "Atvērt vietējo ziņu lenti",
-  "keyboard_shortcuts.mention": "Minējuma autors",
+  "keyboard_shortcuts.mention": "Pieminēt autoru",
   "keyboard_shortcuts.muted": "Atvērt apklusināto lietotāju sarakstu",
-  "keyboard_shortcuts.my_profile": "Atvērt manu profilu",
+  "keyboard_shortcuts.my_profile": "Atvērt savu profilu",
   "keyboard_shortcuts.notifications": "Atvērt paziņojumu kolonnu",
-  "keyboard_shortcuts.open_media": "Atvērt mediju",
+  "keyboard_shortcuts.open_media": "Atvērt multividi",
   "keyboard_shortcuts.pinned": "Atvērt piesprausto ziņu sarakstu",
   "keyboard_shortcuts.profile": "Atvērt autora profilu",
   "keyboard_shortcuts.reply": "Atbildēt",
@@ -258,15 +258,15 @@
   "keyboard_shortcuts.spoilers": "Rādīt/slēpt CW lauku",
   "keyboard_shortcuts.start": "Atvērt kolonnu “Darba sākšana”",
   "keyboard_shortcuts.toggle_hidden": "Rādīt/slēpt tekstu aiz CW",
-  "keyboard_shortcuts.toggle_sensitivity": "Rādīt/slēpt mediju",
-  "keyboard_shortcuts.toot": "Sākt jaunu ziņu",
+  "keyboard_shortcuts.toggle_sensitivity": "Rādīt/slēpt multividi",
+  "keyboard_shortcuts.toot": "Sāc jaunu ziņu",
   "keyboard_shortcuts.unfocus": "Atfokusēt teksta veidošanu/meklēšanu",
   "keyboard_shortcuts.up": "Pārvietot sarakstā uz augšu",
   "lightbox.close": "Aizvērt",
-  "lightbox.compress": "Saspiest attēla ietvaru",
-  "lightbox.expand": "Paplašināt attēla ietvaru",
+  "lightbox.compress": "Saspiest attēla skata lodziņu",
+  "lightbox.expand": "Izvērst attēla skata lodziņu",
   "lightbox.next": "Tālāk",
-  "lightbox.previous": "Iepriekš",
+  "lightbox.previous": "Iepriekšējais",
   "limited_account_hint.action": "Tik un tā rādīt profilu",
   "limited_account_hint.title": "Tava servera moderatori ir paslēpuši šo profilu.",
   "lists.account.add": "Pievienot sarakstam",
@@ -276,10 +276,10 @@
   "lists.edit.submit": "Mainīt virsrakstu",
   "lists.new.create": "Pievienot sarakstu",
   "lists.new.title_placeholder": "Jaunais saraksta nosaukums",
-  "lists.replies_policy.followed": "Jebkuram lietotājam, kuram seko",
+  "lists.replies_policy.followed": "Jebkurš sekots lietotājs",
   "lists.replies_policy.list": "Saraksta dalībnieki",
   "lists.replies_policy.none": "Nevienam",
-  "lists.replies_policy.title": "Rādīt atbildes:",
+  "lists.replies_policy.title": "Rādīt atbildes uz:",
   "lists.search": "Meklēt starp cilvēkiem, kuriem tu seko",
   "lists.subheading": "Tavi saraksti",
   "load_pending": "{count, plural, one {# jauna lieta} other {# jaunas lietas}}",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index df7d84d4b..1b868de07 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Избриши избор",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Тутови",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "Обележи медиа како сензитивна",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index 69267f652..674f74dd6 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "ഈ ഡിവൈസ് മാറ്റുക",
   "compose_form.poll.switch_to_multiple": "വോട്ടെടുപ്പിൽ ഒന്നിലധികം ചോയ്‌സുകൾ ഉൾപ്പെടുതുക",
   "compose_form.poll.switch_to_single": "വോട്ടെടുപ്പിൽ ഒരൊറ്റ ചോയ്‌സ്‌ മാത്രം ആക്കുക",
-  "compose_form.publish": "ടൂട്ട്",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{പ്രസിദ്ധീകരിക്കുക}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index 6728c0999..d9dafa222 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "हा पर्याय काढा",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 4cb6437f4..c3ca25965 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Buang pilihan ini",
   "compose_form.poll.switch_to_multiple": "Ubah kepada membenarkan aneka undian",
   "compose_form.poll.switch_to_single": "Ubah kepada undian pilihan tunggal",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Tandakan media sbg sensitif} other {Tandakan media sbg sensitif}}",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index 1e4901a73..058c167bb 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Deze keuze verwijderen",
   "compose_form.poll.switch_to_multiple": "Poll wijzigen om meerdere keuzes toe te staan",
   "compose_form.poll.switch_to_single": "Poll wijzigen om een enkele keuze toe te staan",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Toot!",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Wijzigingen opslaan",
   "compose_form.sensitive.hide": "{count, plural, one {Media als gevoelig markeren} other {Media als gevoelig markeren}}",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index 24a4e98b7..cd802bed0 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Ta vekk dette valet",
   "compose_form.poll.switch_to_multiple": "Endre avstemninga til å tillate fleirval",
   "compose_form.poll.switch_to_single": "Endra avstemninga til tillate berre eitt val",
-  "compose_form.publish": "Tut",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "Merk medium som sensitivt",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 78d145f55..c188a868b 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Fjern dette valget",
   "compose_form.poll.switch_to_multiple": "Endre avstemning til å tillate flere valg",
   "compose_form.poll.switch_to_single": "Endre avstemning til å tillate ett valg",
-  "compose_form.publish": "Tut",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "Merk media som sensitivt",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 4b094bcbd..3a57a5c3f 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Levar aquesta opcion",
   "compose_form.poll.switch_to_multiple": "Cambiar lo sondatge per permetre de causidas multiplas",
   "compose_form.poll.switch_to_single": "Cambiar lo sondatge per permetre una sola causida",
-  "compose_form.publish": "Tut",
+  "compose_form.publish": "Publicar",
   "compose_form.publish_loud": "{publish} !",
   "compose_form.save_changes": "Salvar los cambiaments",
   "compose_form.sensitive.hide": "Marcar coma sensible",
@@ -396,7 +396,7 @@
   "reply_indicator.cancel": "Anullar",
   "report.block": "Blocar",
   "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
-  "report.categories.other": "Other",
+  "report.categories.other": "Autre",
   "report.categories.spam": "Spam",
   "report.categories.violation": "Content violates one or more server rules",
   "report.category.subtitle": "Choose the best match",
@@ -427,9 +427,9 @@
   "report.target": "Senhalar {target}",
   "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
   "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
-  "report.thanks.title": "Don't want to see this?",
+  "report.thanks.title": "Volètz pas veire aquò ?",
   "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
-  "report.unfollow": "Unfollow @{name}",
+  "report.unfollow": "Quitar de sègre {name}",
   "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
   "search.placeholder": "Recercar",
   "search_popout.search_format": "Format recèrca avançada",
@@ -439,7 +439,7 @@
   "search_popout.tips.text": "Lo tèxte brut tòrna escais, noms d’utilizaire e etiquetas correspondents",
   "search_popout.tips.user": "utilizaire",
   "search_results.accounts": "Gents",
-  "search_results.all": "All",
+  "search_results.all": "Tot",
   "search_results.hashtags": "Etiquetas",
   "search_results.nothing_found": "Could not find anything for these search terms",
   "search_results.statuses": "Tuts",
@@ -457,12 +457,12 @@
   "status.direct": "Messatge per @{name}",
   "status.edit": "Modificar",
   "status.edited": "Edited {date}",
-  "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
+  "status.edited_x_times": "Modificat {count, plural, un {{count} còp} other {{count} còps}}",
   "status.embed": "Embarcar",
   "status.favourite": "Apondre als favorits",
   "status.filtered": "Filtrat",
-  "status.history.created": "{name} created {date}",
-  "status.history.edited": "{name} edited {date}",
+  "status.history.created": "{name} o creèt lo {date}",
+  "status.history.edited": "{name} o modifiquèt lo {date}",
   "status.load_more": "Cargar mai",
   "status.media_hidden": "Mèdia rescondut",
   "status.mention": "Mencionar",
@@ -520,7 +520,7 @@
   "upload_error.poll": "Lo mandadís de fichièr es pas autorizat pels sondatges.",
   "upload_form.audio_description": "Descriure per las personas amb pèrdas auditivas",
   "upload_form.description": "Descripcion pels mal vesents",
-  "upload_form.description_missing": "No description added",
+  "upload_form.description_missing": "Cap de descripcion pas aponduda",
   "upload_form.edit": "Modificar",
   "upload_form.thumbnail": "Cambiar la vinheta",
   "upload_form.undo": "Suprimir",
diff --git a/app/javascript/mastodon/locales/pa.json b/app/javascript/mastodon/locales/pa.json
index 7b041a208..658a3318e 100644
--- a/app/javascript/mastodon/locales/pa.json
+++ b/app/javascript/mastodon/locales/pa.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Remove this choice",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index e06cb41ca..f51948d6a 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -110,7 +110,7 @@
   "compose_form.poll.remove_option": "Usuń tę opcję",
   "compose_form.poll.switch_to_multiple": "Pozwól na wybranie wielu opcji",
   "compose_form.poll.switch_to_single": "Pozwól na wybranie tylko jednej opcji",
-  "compose_form.publish": "Wyślij",
+  "compose_form.publish": "Opublikuj",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Zapisz zmiany",
   "compose_form.sensitive.hide": "Oznacz multimedia jako wrażliwe",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 06c8354ba..66960ffca 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -95,7 +95,7 @@
   "compose.language.change": "Alterar idioma",
   "compose.language.search": "Pesquisar idiomas...",
   "compose_form.direct_message_warning_learn_more": "Saiba mais",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "Postagens no Mastodon não são criptografadas de ponta-a-ponta. Não compartilhe nenhuma informação sensível no Mastodon.",
   "compose_form.hashtag_warning": "Este toot não aparecerá em nenhuma hashtag porque está como não-listado. Somente toots públicos podem ser pesquisados por hashtag.",
   "compose_form.lock_disclaimer": "Seu perfil não está {locked}. Qualquer um pode te seguir e ver os toots privados.",
   "compose_form.lock_disclaimer.lock": "trancado",
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Remover opção",
   "compose_form.poll.switch_to_multiple": "Permitir múltiplas escolhas",
   "compose_form.poll.switch_to_single": "Opção única",
-  "compose_form.publish": "TOOT",
+  "compose_form.publish": "Publicar",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Salvar alterações",
   "compose_form.sensitive.hide": "{count, plural, one {Marcar mídia como sensível} other {Marcar mídias como sensível}}",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index 99ab7feb0..90285a70f 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Eliminar esta opção",
   "compose_form.poll.switch_to_multiple": "Alterar a votação para permitir múltiplas escolhas",
   "compose_form.poll.switch_to_single": "Alterar a votação para permitir uma única escolha",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publicar",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Guardar alterações",
   "compose_form.sensitive.hide": "Marcar media como sensível",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index 0756608ab..34328e65b 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Elimină acestă opțiune",
   "compose_form.poll.switch_to_multiple": "Modifică sondajul pentru a permite mai multe opțiuni",
   "compose_form.poll.switch_to_single": "Modifică sondajul pentru a permite o singură opțiune",
-  "compose_form.publish": "Postează",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Marchează conținutul media ca fiind sensibil} few {Marchează conținuturile media ca fiind sensibile} other {Marchează conținuturile media ca fiind sensibile}}",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index c9a648c60..42dee567e 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Убрать этот вариант",
   "compose_form.poll.switch_to_multiple": "Разрешить выбор нескольких вариантов",
   "compose_form.poll.switch_to_single": "Переключить в режим выбора одного ответа",
-  "compose_form.publish": "Запостить",
+  "compose_form.publish": "Опубликовать",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Сохранить",
   "compose_form.sensitive.hide": "{count, plural, one {Отметить медифайл как деликатный} other {Отметить медифайлы как деликатные}}",
diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json
index fef1913cf..f0861f9bc 100644
--- a/app/javascript/mastodon/locales/sa.json
+++ b/app/javascript/mastodon/locales/sa.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "मतमेतन्नश्यताम्",
   "compose_form.poll.switch_to_multiple": "मतदानं परिवर्तयित्वा बहुवैकल्पिकमतदानं क्रियताम्",
   "compose_form.poll.switch_to_single": "मतदानं परिवर्तयित्वा निर्विकल्पमतदानं क्रियताम्",
-  "compose_form.publish": "दौत्यम्",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "संवेदनशीलसामग्रीत्यङ्यताम्",
diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json
index 4c3c485c6..202caa5ca 100644
--- a/app/javascript/mastodon/locales/sc.json
+++ b/app/javascript/mastodon/locales/sc.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Boga custa optzione",
   "compose_form.poll.switch_to_multiple": "Muda su sondàgiu pro permìtere multi-optziones",
   "compose_form.poll.switch_to_single": "Muda su sondàgiu pro permìtere un'optzione isceti",
-  "compose_form.publish": "Tut",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Marca elementu multimediale comente a sensìbile} other {Marca elementos multimediales comente sensìbiles}}",
diff --git a/app/javascript/mastodon/locales/si.json b/app/javascript/mastodon/locales/si.json
index 4c63e0eb4..4d9e0d3b5 100644
--- a/app/javascript/mastodon/locales/si.json
+++ b/app/javascript/mastodon/locales/si.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "මෙම තේරීම ඉවත් කරන්න",
   "compose_form.poll.switch_to_multiple": "තේරීම් කිහිපයකට ඉඩ දීම සඳහා මත විමසුම වෙනස් කරන්න",
   "compose_form.poll.switch_to_single": "තනි තේරීමකට ඉඩ දීම සඳහා මත විමසුම වෙනස් කරන්න",
-  "compose_form.publish": "පිඹින්න",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {මාධ්‍ය සංවේදී ලෙස සලකුණු කරන්න} other {මාධ්‍ය සංවේදී ලෙස සලකුණු කරන්න}}",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index d69adc3bd..861722c2f 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -32,7 +32,7 @@
   "account.mute": "Nevšímaj si @{name}",
   "account.mute_notifications": "Stĺm oboznámenia od @{name}",
   "account.muted": "Nevšímaný/á",
-  "account.posts": "Príspevky",
+  "account.posts": "Príspevky/ov",
   "account.posts_with_replies": "Príspevky, aj s odpoveďami",
   "account.report": "Nahlás @{name}",
   "account.requested": "Čaká na schválenie. Klikni pre zrušenie žiadosti",
@@ -93,7 +93,7 @@
   "community.column_settings.media_only": "Iba médiá",
   "community.column_settings.remote_only": "Iba odľahlé",
   "compose.language.change": "Zmeň jazyk",
-  "compose.language.search": "Search languages...",
+  "compose.language.search": "Hľadaj medzi jazykmi...",
   "compose_form.direct_message_warning_learn_more": "Zisti viac",
   "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
   "compose_form.hashtag_warning": "Tento toot nebude zobrazený pod žiadným haštagom lebo nieje listovaný. Iba verejné tooty môžu byť nájdené podľa haštagu.",
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Odstráň túto voľbu",
   "compose_form.poll.switch_to_multiple": "Zmeň anketu pre povolenie viacerých možností",
   "compose_form.poll.switch_to_single": "Zmeň anketu na takú s jedinou voľbou",
-  "compose_form.publish": "Pošli",
+  "compose_form.publish": "Zverejni",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Ulož zmeny",
   "compose_form.sensitive.hide": "Označ médiá ako chúlostivé",
@@ -149,7 +149,7 @@
   "embed.instructions": "Umiestni kód uvedený nižšie pre pridanie tohto statusu na tvoju web stránku.",
   "embed.preview": "Tu je ako to bude vyzerať:",
   "emoji_button.activity": "Aktivita",
-  "emoji_button.clear": "Clear",
+  "emoji_button.clear": "Vyčisti",
   "emoji_button.custom": "Vlastné",
   "emoji_button.flags": "Vlajky",
   "emoji_button.food": "Jedlá a nápoje",
@@ -169,7 +169,7 @@
   "empty_column.blocks": "Ešte si nikoho nezablokoval/a.",
   "empty_column.bookmarked_statuses": "Ešte nemáš žiadné záložky. Keď si pridáš príspevok k záložkám, zobrazí sa tu.",
   "empty_column.community": "Lokálna časová os je prázdna. Napíšte niečo, aby sa to tu začalo hýbať!",
-  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.direct": "Ešte nemáš žiadne priame správy. Keď nejakú pošleš, alebo dostaneš, ukáže sa tu.",
   "empty_column.domain_blocks": "Žiadne domény ešte niesú skryté.",
   "empty_column.explore_statuses": "Nothing is trending right now. Check back later!",
   "empty_column.favourited_statuses": "Nemáš obľúbené ešte žiadne príspevky. Keď si nejaký obľúbiš, bude zobrazený práve tu.",
@@ -267,7 +267,7 @@
   "lightbox.expand": "Rozšíriť náhľad obrázku",
   "lightbox.next": "Ďalšie",
   "lightbox.previous": "Predchádzajúci",
-  "limited_account_hint.action": "Show profile anyway",
+  "limited_account_hint.action": "Ukáž profil aj tak",
   "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
   "lists.account.add": "Pridaj do zoznamu",
   "lists.account.remove": "Odober zo zoznamu",
@@ -372,10 +372,10 @@
   "poll_button.remove_poll": "Odstráň anketu",
   "privacy.change": "Uprav súkromie príspevku",
   "privacy.direct.long": "Pošli iba spomenutým užívateľom",
-  "privacy.direct.short": "Direct",
+  "privacy.direct.short": "Iba spomenutým ľudom",
   "privacy.private.long": "Pošli iba následovateľom",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Visible for all",
+  "privacy.private.short": "Iba pre sledujúcich",
+  "privacy.public.long": "Viditeľné pre všetkých",
   "privacy.public.short": "Verejné",
   "privacy.unlisted.long": "Visible for all, but opted-out of discovery features",
   "privacy.unlisted.short": "Verejne, ale nezobraziť v osi",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 9f9ab8a1e..ba354e98b 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -92,10 +92,10 @@
   "community.column_settings.local_only": "Vetëm vendore",
   "community.column_settings.media_only": "Vetëm Media",
   "community.column_settings.remote_only": "Vetëm të largëta",
-  "compose.language.change": "Change language",
-  "compose.language.search": "Search languages...",
+  "compose.language.change": "Ndryshoni gjuhën",
+  "compose.language.search": "Kërkoni te gjuhët…",
   "compose_form.direct_message_warning_learn_more": "Mësoni më tepër",
-  "compose_form.encryption_warning": "Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.",
+  "compose_form.encryption_warning": "Postimet në Mastodon nuk fshehtëzohen skaj-më-skaj. Mos ndani me të tjerë gjëra me spec në Mastodon.",
   "compose_form.hashtag_warning": "Ky mesazh s’do të paraqitet nën ndonjë hashtag, ngaqë s’i është caktuar ndonjë. Vetëm mesazhet publike mund të kërkohen sipas hashtagësh.",
   "compose_form.lock_disclaimer": "Llogaria juaj s’është {locked}. Mund ta ndjekë cilido, për të parë postimet tuaja vetëm për ndjekësit.",
   "compose_form.lock_disclaimer.lock": "e kyçur",
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Hiqe këtë zgjedhje",
   "compose_form.poll.switch_to_multiple": "Ndrysho votimin për të lejuar shumë zgjedhje",
   "compose_form.poll.switch_to_single": "Ndrysho votimin për të lejuar vetëm një zgjedhje",
-  "compose_form.publish": "Mesazh",
+  "compose_form.publish": "Botoje",
   "compose_form.publish_loud": "{publish}!",
   "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}}",
@@ -149,7 +149,7 @@
   "embed.instructions": "Trupëzojeni këtë gjendje në sajtin tuaj duke kopjuar kodin më poshtë.",
   "embed.preview": "Ja si do të duket:",
   "emoji_button.activity": "Veprimtari",
-  "emoji_button.clear": "Clear",
+  "emoji_button.clear": "Spastroje",
   "emoji_button.custom": "Vetjak",
   "emoji_button.flags": "Flamuj",
   "emoji_button.food": "Ushqim & Pije",
@@ -228,47 +228,47 @@
   "intervals.full.days": "{number, plural, one {# ditë} other {# ditë}}",
   "intervals.full.hours": "{number, plural, one {# orë} other {# orë}}",
   "intervals.full.minutes": "{number, plural, one {# minutë} other {# minuta}}",
-  "keyboard_shortcuts.back": "për shkuarje mbrapsht",
-  "keyboard_shortcuts.blocked": "për hapje liste përdoruesish të bllokuar",
-  "keyboard_shortcuts.boost": "për përforcim",
-  "keyboard_shortcuts.column": "për kalim fokusi mbi një gjendje te një nga shtyllat",
-  "keyboard_shortcuts.compose": "për kalim fokusi te fusha e hartimit të mesazheve",
+  "keyboard_shortcuts.back": "Për shkuarje mbrapsht",
+  "keyboard_shortcuts.blocked": "Për hapje liste përdoruesish të bllokuar",
+  "keyboard_shortcuts.boost": "Përforcim postimi",
+  "keyboard_shortcuts.column": "Fokusi mbi një shtyllë",
+  "keyboard_shortcuts.compose": "Fokusi te fusha e hartimit të mesazheve",
   "keyboard_shortcuts.description": "Përshkrim",
   "keyboard_shortcuts.direct": "për hapje shtylle mesazhesh të drejtpërdrejtë",
-  "keyboard_shortcuts.down": "për zbritje poshtë nëpër listë",
-  "keyboard_shortcuts.enter": "për hapje gjendjeje",
-  "keyboard_shortcuts.favourite": "për t’i vënë shenjë si të parapëlqyer",
-  "keyboard_shortcuts.favourites": "për hapje liste të parapëlqyerish",
-  "keyboard_shortcuts.federated": "për hapje rrjedhe kohore të të federuarve",
+  "keyboard_shortcuts.down": "Për zbritje poshtë nëpër listë",
+  "keyboard_shortcuts.enter": "Për hapje postimi",
+  "keyboard_shortcuts.favourite": "Për t’i vënë shenjë si të parapëlqyer një postimi",
+  "keyboard_shortcuts.favourites": "Për hapje liste të parapëlqyerish",
+  "keyboard_shortcuts.federated": "Për hapje rrjedhe kohore të të federuarve",
   "keyboard_shortcuts.heading": "Shkurtore tastiere",
-  "keyboard_shortcuts.home": "për hapje rrjedhe kohore vetjake",
+  "keyboard_shortcuts.home": "Për hapje rrjedhe kohore vetjake",
   "keyboard_shortcuts.hotkey": "Tast përkatës",
-  "keyboard_shortcuts.legend": "për shfaqje të kësaj legjende",
-  "keyboard_shortcuts.local": "për hapje rrjedhe kohore vendore",
-  "keyboard_shortcuts.mention": "për përmendje të autorit",
-  "keyboard_shortcuts.muted": "për hapje liste përdoruesish të heshtuar",
-  "keyboard_shortcuts.my_profile": "për hapjen e profilit tuaj",
-  "keyboard_shortcuts.notifications": "për hapje shtylle njoftimesh",
-  "keyboard_shortcuts.open_media": "për hapje mediash",
-  "keyboard_shortcuts.pinned": "për hapje liste mesazhesh të fiksuar",
-  "keyboard_shortcuts.profile": "për hapje të profilit të autorit",
-  "keyboard_shortcuts.reply": "për t’u përgjigjur",
-  "keyboard_shortcuts.requests": "për hapje liste kërkesash për ndjekje",
-  "keyboard_shortcuts.search": "për kalim fokusi te kërkimi",
-  "keyboard_shortcuts.spoilers": "për shfaqje/fshehje fushe CW",
-  "keyboard_shortcuts.start": "për hapjen e shtyllës “fillojani”",
-  "keyboard_shortcuts.toggle_hidden": "për shfaqje/fshehje teksti pas CW",
-  "keyboard_shortcuts.toggle_sensitivity": "për shfaqje/fshehje mediash",
-  "keyboard_shortcuts.toot": "për të filluar një mesazh fringo të ri",
-  "keyboard_shortcuts.unfocus": "për heqjen e fokusit nga fusha e hartimit të mesazheve apo kërkimeve",
-  "keyboard_shortcuts.up": "për ngjitje sipër nëpër listë",
+  "keyboard_shortcuts.legend": "Për shfaqje të kësaj legjende",
+  "keyboard_shortcuts.local": "Për hapje rrjedhe kohore vendore",
+  "keyboard_shortcuts.mention": "Për përmendje të autorit",
+  "keyboard_shortcuts.muted": "Për hapje liste përdoruesish të heshtuar",
+  "keyboard_shortcuts.my_profile": "Për hapjen e profilit tuaj",
+  "keyboard_shortcuts.notifications": "Për hapje shtylle njoftimesh",
+  "keyboard_shortcuts.open_media": "Për hapje mediash",
+  "keyboard_shortcuts.pinned": "Për hapje liste mesazhesh të fiksuar",
+  "keyboard_shortcuts.profile": "Për hapje të profilit të autorit",
+  "keyboard_shortcuts.reply": "Për t’iu përgjigjur një postimi",
+  "keyboard_shortcuts.requests": "Për hapje liste kërkesash për ndjekje",
+  "keyboard_shortcuts.search": "Për kalim fokusi te kërkimi",
+  "keyboard_shortcuts.spoilers": "Për shfaqje/fshehje fushe CW",
+  "keyboard_shortcuts.start": "Për hapjen e shtyllës “fillojani”",
+  "keyboard_shortcuts.toggle_hidden": "Për shfaqje/fshehje teksti pas CW",
+  "keyboard_shortcuts.toggle_sensitivity": "Për shfaqje/fshehje mediash",
+  "keyboard_shortcuts.toot": "Për të filluar një mesazh të ri",
+  "keyboard_shortcuts.unfocus": "Për heqjen e fokusit nga fusha e hartimit të mesazheve apo kërkimeve",
+  "keyboard_shortcuts.up": "Për ngjitje sipër nëpër listë",
   "lightbox.close": "Mbylle",
   "lightbox.compress": "Ngjeshe kuadratin e parjes së figurave",
   "lightbox.expand": "Zgjeroje kuadratin e parjes së figurave",
   "lightbox.next": "Pasuesja",
   "lightbox.previous": "E mëparshmja",
-  "limited_account_hint.action": "Show profile anyway",
-  "limited_account_hint.title": "This profile has been hidden by the moderators of your server.",
+  "limited_account_hint.action": "Shfaqe profilin sido qoftë",
+  "limited_account_hint.title": "Ky profil është fshehur nga moderatorët e shërbyesit tuaj.",
   "lists.account.add": "Shto në listë",
   "lists.account.remove": "Hiqe nga lista",
   "lists.delete": "Fshije listën",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index b4e992a07..498cbf963 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Remove this choice",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Tutni",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index 159628b6c..1e6ec2086 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Одстрани овај избор",
   "compose_form.poll.switch_to_multiple": "Промените анкету да бисте омогућили више избора",
   "compose_form.poll.switch_to_single": "Промените анкету да бисте омогућили један избор",
-  "compose_form.publish": "Труби",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "Означи мултимедију као осетљиву",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 233248d8b..f7a5850c8 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Ta bort detta val",
   "compose_form.poll.switch_to_multiple": "Ändra enkät för att tillåta flera val",
   "compose_form.poll.switch_to_single": "Ändra enkät för att tillåta ett enda val",
-  "compose_form.publish": "Tut",
+  "compose_form.publish": "Publicera",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Spara ändringar",
   "compose_form.sensitive.hide": "Markera media som känsligt",
diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json
index 7b041a208..658a3318e 100644
--- a/app/javascript/mastodon/locales/szl.json
+++ b/app/javascript/mastodon/locales/szl.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Remove this choice",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 43508be01..68b11b61b 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "இந்தத் தேர்வை அகற்று",
   "compose_form.poll.switch_to_multiple": "பல தேர்வுகளை அனுமதிக்குமாறு மாற்று",
   "compose_form.poll.switch_to_single": "ஒரே ஒரு தேர்வை மட்டும் அனுமதிக்குமாறு மாற்று",
-  "compose_form.publish": "டூட்",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "அனைவருக்கும் ஏற்றப் படம் இல்லை எனக் குறியிடு",
diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json
index 2bc2a29da..89683cb63 100644
--- a/app/javascript/mastodon/locales/tai.json
+++ b/app/javascript/mastodon/locales/tai.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Remove this choice",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index a25a019fb..c84ecd00d 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "ఈ ఎంపికను తొలగించు",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "టూట్",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 746fc1673..5bc08533e 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "เอาตัวเลือกนี้ออก",
   "compose_form.poll.switch_to_multiple": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตหลายตัวเลือก",
   "compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตตัวเลือกเดี่ยว",
-  "compose_form.publish": "โพสต์",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "บันทึกการเปลี่ยนแปลง",
   "compose_form.sensitive.hide": "{count, plural, other {ทำเครื่องหมายสื่อว่าละเอียดอ่อน}}",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index f98574e11..c813ee1c2 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Bu seçeneği kaldır",
   "compose_form.poll.switch_to_multiple": "Birden çok seçeneğe izin vermek için anketi değiştir",
   "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": "Yayınla",
   "compose_form.publish_loud": "{publish}!",
   "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}}",
diff --git a/app/javascript/mastodon/locales/tt.json b/app/javascript/mastodon/locales/tt.json
index e05804d93..862325f1c 100644
--- a/app/javascript/mastodon/locales/tt.json
+++ b/app/javascript/mastodon/locales/tt.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Remove this choice",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json
index 7b041a208..658a3318e 100644
--- a/app/javascript/mastodon/locales/ug.json
+++ b/app/javascript/mastodon/locales/ug.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Remove this choice",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 012f3c0b8..32d5dce84 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Видалити цей варіант",
   "compose_form.poll.switch_to_multiple": "Дозволити вибір декількох відповідей",
   "compose_form.poll.switch_to_single": "Перемкнути у режим вибору однієї відповіді",
-  "compose_form.publish": "Надіслати",
+  "compose_form.publish": "Опублікувати",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Зберегти зміни",
   "compose_form.sensitive.hide": "{count, plural, one {Позначити медіа делікатним} other {Позначити медіа делікатними}}",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index d5ed07a9c..d4daaceb3 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "یہ انتخاب ہٹا دیں",
   "compose_form.poll.switch_to_multiple": "متعدد انتخاب کی اجازت دینے کے لیے پول تبدیل کریں",
   "compose_form.poll.switch_to_single": "کسی ایک انتخاب کے لیے پول تبدیل کریں",
-  "compose_form.publish": "ٹوٹ",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "وسائل کو حساس نشاندہ کریں",
diff --git a/app/javascript/mastodon/locales/whitelist_fy.json b/app/javascript/mastodon/locales/whitelist_fy.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_fy.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json
index 02b0ed563..c6528fbe7 100644
--- a/app/javascript/mastodon/locales/zgh.json
+++ b/app/javascript/mastodon/locales/zgh.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "Remove this choice",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Toot",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 8511543e6..a7bf96f9e 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "移除此选项",
   "compose_form.poll.switch_to_multiple": "将投票改为多选",
   "compose_form.poll.switch_to_single": "将投票改为单选",
-  "compose_form.publish": "Toot!",
+  "compose_form.publish": "发布",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "保存更改",
   "compose_form.sensitive.hide": "{count, plural, one {将媒体标记为敏感内容} other {将媒体标记为敏感内容}}",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index dc0b794dd..d757b9daf 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -106,7 +106,7 @@
   "compose_form.poll.remove_option": "移除此選擇",
   "compose_form.poll.switch_to_multiple": "變更投票為允許多個選項",
   "compose_form.poll.switch_to_single": "變更投票為限定單一選項",
-  "compose_form.publish": "發文",
+  "compose_form.publish": "Publish",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.save_changes": "Save changes",
   "compose_form.sensitive.hide": "標記媒體為敏感內容",
diff --git a/app/javascript/styles/application.scss b/app/javascript/styles/application.scss
index cb65b9567..bbea06195 100644
--- a/app/javascript/styles/application.scss
+++ b/app/javascript/styles/application.scss
@@ -6,6 +6,7 @@
 
 @import 'mastodon/reset';
 @import 'mastodon/basics';
+@import 'mastodon/branding';
 @import 'mastodon/containers';
 @import 'mastodon/lists';
 @import 'mastodon/footer';
diff --git a/app/javascript/styles/contrast/variables.scss b/app/javascript/styles/contrast/variables.scss
index cfe3b21db..9edfd6d8d 100644
--- a/app/javascript/styles/contrast/variables.scss
+++ b/app/javascript/styles/contrast/variables.scss
@@ -4,19 +4,17 @@ $black: #000000;
 $classic-base-color: #282c37;
 $classic-primary-color: #9baec8;
 $classic-secondary-color: #d9e1e8;
-$classic-highlight-color: #2b90d9;
+$classic-highlight-color: #6364ff;
 
 $ui-base-color: $classic-base-color !default;
 $ui-primary-color: $classic-primary-color !default;
 $ui-secondary-color: $classic-secondary-color !default;
-
-// Differences
-$ui-highlight-color: #2b5fd9;
+$ui-highlight-color: $classic-highlight-color !default;
 
 $darker-text-color: lighten($ui-primary-color, 20%) !default;
 $dark-text-color: lighten($ui-primary-color, 12%) !default;
 $secondary-text-color: lighten($ui-secondary-color, 6%) !default;
-$highlight-text-color: $classic-highlight-color !default;
+$highlight-text-color: lighten($ui-highlight-color, 8%) !default;
 $action-button-color: #8d9ac2;
 
 $inverted-text-color: $black !default;
diff --git a/app/javascript/styles/mastodon-light/variables.scss b/app/javascript/styles/mastodon-light/variables.scss
index f6bc3ac96..cae065878 100644
--- a/app/javascript/styles/mastodon-light/variables.scss
+++ b/app/javascript/styles/mastodon-light/variables.scss
@@ -5,7 +5,7 @@ $white: #ffffff;
 $classic-base-color: #282c37;
 $classic-primary-color: #9baec8;
 $classic-secondary-color: #d9e1e8;
-$classic-highlight-color: #2b90d9;
+$classic-highlight-color: #6364ff;
 
 // Differences
 $success-green: lighten(#3c754d, 8%);
@@ -17,10 +17,11 @@ $ui-base-color: $classic-secondary-color !default;
 $ui-base-lighter-color: #b0c0cf;
 $ui-primary-color: #9bcbed;
 $ui-secondary-color: $classic-base-color !default;
-$ui-highlight-color: #2b90d9;
+$ui-highlight-color: $classic-highlight-color !default;
 
 $primary-text-color: $black !default;
 $darker-text-color: $classic-base-color !default;
+$highlight-text-color: darken($ui-highlight-color, 8%) !default;
 $dark-text-color: #444b5d;
 $action-button-color: #606984;
 
diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss
index ac2fdb2c7..c82be742d 100644
--- a/app/javascript/styles/mastodon/about.scss
+++ b/app/javascript/styles/mastodon/about.scss
@@ -688,7 +688,7 @@ $small-breakpoint: 960px;
     align-items: center;
     padding: 50px;
 
-    svg {
+    .logo {
       fill: $primary-text-color;
       height: 52px;
     }
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index 26c36c8a7..f4f5bf752 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -133,12 +133,12 @@ $content-width: 840px;
 
       .simple-navigation-active-leaf a {
         color: $primary-text-color;
-        background-color: $ui-highlight-color;
+        background-color: darken($ui-highlight-color, 2%);
         border-bottom: 0;
         border-radius: 0;
 
         &:hover {
-          background-color: lighten($ui-highlight-color, 5%);
+          background-color: $ui-highlight-color;
         }
       }
     }
@@ -203,6 +203,14 @@ $content-width: 840px;
         }
       }
 
+      h2 small {
+        font-size: 12px;
+        display: block;
+        font-weight: 500;
+        color: $darker-text-color;
+        line-height: 18px;
+      }
+
       @media screen and (max-width: $no-columns-breakpoint) {
         border-bottom: 0;
         padding-bottom: 0;
@@ -893,7 +901,7 @@ a.name-tag,
     border: 0;
 
     a {
-      color: lighten($ui-highlight-color, 8%);
+      color: $highlight-text-color;
     }
 
     dl:first-child .verified {
diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss
index 391f1fad9..413a1cdd6 100644
--- a/app/javascript/styles/mastodon/basics.scss
+++ b/app/javascript/styles/mastodon/basics.scss
@@ -256,7 +256,17 @@ button {
 }
 
 .logo-resources {
-  display: none;
+  // Not using display: none because of https://bugs.chromium.org/p/chromium/issues/detail?id=258029
+  visibility: hidden;
+  user-select: none;
+  pointer-events: none;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: -1000;
 }
 
 // NoScript adds a __ns__pop2top class to the full ancestry of blocked elements,
diff --git a/app/javascript/styles/mastodon/branding.scss b/app/javascript/styles/mastodon/branding.scss
new file mode 100644
index 000000000..d1bddc68b
--- /dev/null
+++ b/app/javascript/styles/mastodon/branding.scss
@@ -0,0 +1,3 @@
+.logo {
+  color: $primary-text-color;
+}
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 67a91e922..7ae20fbd9 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -42,7 +42,7 @@
 }
 
 .button {
-  background-color: $ui-highlight-color;
+  background-color: darken($ui-highlight-color, 2%);
   border: 10px none;
   border-radius: 4px;
   box-sizing: border-box;
@@ -60,20 +60,16 @@
   text-align: center;
   text-decoration: none;
   text-overflow: ellipsis;
-  transition: all 100ms ease-in;
   white-space: nowrap;
   width: auto;
 
   &:active,
   &:focus,
   &:hover {
-    background-color: lighten($ui-highlight-color, 10%);
-    transition: all 200ms ease-out;
+    background-color: $ui-highlight-color;
   }
 
   &--destructive {
-    transition: none;
-
     &:active,
     &:focus,
     &:hover {
@@ -829,7 +825,7 @@
   }
 
   a.unhandled-link {
-    color: lighten($ui-highlight-color, 8%);
+    color: $highlight-text-color;
   }
 
   .status__content__spoiler-link {
@@ -899,7 +895,7 @@
     }
 
     &.unhandled-link {
-      color: lighten($ui-highlight-color, 8%);
+      color: $highlight-text-color;
     }
   }
 }
@@ -912,7 +908,7 @@
   display: block;
   font-size: 15px;
   line-height: 20px;
-  color: lighten($ui-highlight-color, 8%);
+  color: $highlight-text-color;
   border: 0;
   background: transparent;
   padding: 0;
@@ -2437,7 +2433,7 @@ a.account__display-name {
   height: 3.9375rem;
   bottom: 1.3125rem;
   right: 1.3125rem;
-  background: darken($ui-highlight-color, 3%);
+  background: darken($ui-highlight-color, 2%);
   color: $white;
   border-radius: 50%;
   font-size: 21px;
@@ -2448,7 +2444,7 @@ a.account__display-name {
   &:hover,
   &:focus,
   &:active {
-    background: lighten($ui-highlight-color, 7%);
+    background: $ui-highlight-color;
   }
 }
 
@@ -2538,7 +2534,6 @@ a.account__display-name {
   padding: 40px;
 
   .logo {
-    fill: $primary-text-color;
     width: 50px;
     margin: 0 auto;
     margin-bottom: 40px;
@@ -2882,11 +2877,11 @@ a.account__display-name {
 }
 
 .react-toggle--checked .react-toggle-track {
-  background-color: $ui-highlight-color;
+  background-color: darken($ui-highlight-color, 2%);
 }
 
 .react-toggle--checked:is(:hover, :focus-within):not(.react-toggle--disabled) .react-toggle-track {
-  background-color: lighten($ui-highlight-color, 10%);
+  background-color: $ui-highlight-color;
 }
 
 .react-toggle-track-check {
@@ -2975,7 +2970,7 @@ a.account__display-name {
     }
 
     &.active {
-      color: $ui-highlight-color;
+      color: $highlight-text-color;
     }
   }
 }
@@ -3408,14 +3403,14 @@ a.status-card.compact:hover {
   }
 
   a {
-    color: lighten($ui-highlight-color, 8%);
+    color: $highlight-text-color;
     text-decoration: none;
 
     &:hover,
     &:focus,
     &:active {
       text-decoration: underline;
-      color: lighten($ui-highlight-color, 12%);
+      color: lighten($highlight-text-color, 4%);
     }
   }
 }
@@ -6428,8 +6423,8 @@ a.status-card.compact:hover {
     vertical-align: middle;
 
     &.checked {
-      border-color: lighten($ui-highlight-color, 8%);
-      background: lighten($ui-highlight-color, 8%);
+      border-color: lighten($ui-highlight-color, 4%);
+      background: lighten($ui-highlight-color, 4%);
     }
   }
 }
diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss
index 81459f5ba..5703a64e3 100644
--- a/app/javascript/styles/mastodon/containers.scss
+++ b/app/javascript/styles/mastodon/containers.scss
@@ -20,8 +20,7 @@
     justify-content: center;
     align-items: center;
 
-    svg {
-      fill: $primary-text-color;
+    .logo {
       height: 42px;
       margin-right: 10px;
     }
@@ -320,7 +319,7 @@
       display: block;
       padding: 15px;
 
-      svg {
+      .logo {
         display: block;
         height: 18px;
         width: auto;
@@ -792,7 +791,7 @@
       border-top: 0;
 
       a {
-        color: lighten($ui-highlight-color, 8%);
+        color: $highlight-text-color;
       }
 
       dl:first-child .verified {
diff --git a/app/javascript/styles/mastodon/dashboard.scss b/app/javascript/styles/mastodon/dashboard.scss
index 7d0e51fde..c21fc9eba 100644
--- a/app/javascript/styles/mastodon/dashboard.scss
+++ b/app/javascript/styles/mastodon/dashboard.scss
@@ -82,7 +82,7 @@
     display: flex;
     align-items: baseline;
     border-radius: 4px;
-    background: $ui-highlight-color;
+    background: darken($ui-highlight-color, 2%);
     color: $primary-text-color;
     transition: all 100ms ease-in;
     font-size: 14px;
@@ -95,7 +95,7 @@
     &:active,
     &:focus,
     &:hover {
-      background-color: lighten($ui-highlight-color, 10%);
+      background-color: $ui-highlight-color;
       transition: all 200ms ease-out;
     }
 
diff --git a/app/javascript/styles/mastodon/footer.scss b/app/javascript/styles/mastodon/footer.scss
index 073ebda7e..0c3e42033 100644
--- a/app/javascript/styles/mastodon/footer.scss
+++ b/app/javascript/styles/mastodon/footer.scss
@@ -132,19 +132,19 @@
     }
 
     .brand {
-      svg {
+      .logo {
         display: block;
         height: 36px;
         width: auto;
         margin: 0 auto;
-        fill: lighten($ui-base-color, 34%);
+        color: lighten($ui-base-color, 34%);
       }
 
       &:hover,
       &:focus,
       &:active {
-        svg {
-          fill: lighten($ui-base-color, 38%);
+        .logo {
+          color: lighten($ui-base-color, 38%);
         }
       }
     }
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index dd0dc22a5..320fa8fef 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -457,14 +457,14 @@ code {
     width: 100%;
     border: 0;
     border-radius: 4px;
-    background: $ui-highlight-color;
+    background: darken($ui-highlight-color, 2%);
     color: $primary-text-color;
     font-size: 18px;
     line-height: inherit;
     height: auto;
     padding: 10px;
-    text-transform: uppercase;
     text-decoration: none;
+    text-transform: uppercase;
     text-align: center;
     box-sizing: border-box;
     cursor: pointer;
@@ -477,13 +477,10 @@ code {
       margin-right: 0;
     }
 
-    &:hover {
-      background-color: lighten($ui-highlight-color, 5%);
-    }
-
     &:active,
-    &:focus {
-      background-color: darken($ui-highlight-color, 5%);
+    &:focus,
+    &:hover {
+      background-color: $ui-highlight-color;
     }
 
     &:disabled:hover {
diff --git a/app/javascript/styles/mastodon/statuses.scss b/app/javascript/styles/mastodon/statuses.scss
index a926aff96..a3237a630 100644
--- a/app/javascript/styles/mastodon/statuses.scss
+++ b/app/javascript/styles/mastodon/statuses.scss
@@ -80,7 +80,7 @@
 .button.logo-button {
   flex: 0 auto;
   font-size: 14px;
-  background: $ui-highlight-color;
+  background: darken($ui-highlight-color, 2%);
   color: $primary-text-color;
   text-transform: none;
   line-height: 1.2;
@@ -104,7 +104,7 @@
   &:active,
   &:focus,
   &:hover {
-    background: lighten($ui-highlight-color, 10%);
+    background: $ui-highlight-color;
   }
 
   &:disabled,
diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss
index 47d7e6f87..be2c900ea 100644
--- a/app/javascript/styles/mastodon/variables.scss
+++ b/app/javascript/styles/mastodon/variables.scss
@@ -12,7 +12,7 @@ $red-bookmark: $warning-red;
 $classic-base-color: #282c37;         // Midnight Express
 $classic-primary-color: #9baec8;      // Echo Blue
 $classic-secondary-color: #d9e1e8;    // Pattens Blue
-$classic-highlight-color: #2b90d9;    // Summer Sky
+$classic-highlight-color: #6364ff;    // Brand purple
 
 // Variables for defaults in UI
 $base-shadow-color: $black !default;
@@ -34,7 +34,7 @@ $primary-text-color: $white !default;
 $darker-text-color: $ui-primary-color !default;
 $dark-text-color: $ui-base-lighter-color !default;
 $secondary-text-color: $ui-secondary-color !default;
-$highlight-text-color: $ui-highlight-color !default;
+$highlight-text-color: lighten($ui-highlight-color, 8%) !default;
 $action-button-color: $ui-base-lighter-color !default;
 $passive-text-color: $gold-star !default;
 $active-passive-text-color: $success-green !default;
diff --git a/app/models/admin/action_log.rb b/app/models/admin/action_log.rb
index 852bff713..401bfd9ac 100644
--- a/app/models/admin/action_log.rb
+++ b/app/models/admin/action_log.rb
@@ -1,4 +1,5 @@
 # frozen_string_literal: true
+
 # == Schema Information
 #
 # Table name: admin_action_logs
diff --git a/app/models/report.rb b/app/models/report.rb
index 6d4166540..2efb6d4a7 100644
--- a/app/models/report.rb
+++ b/app/models/report.rb
@@ -55,6 +55,8 @@ class Report < ApplicationRecord
 
   before_validation :set_uri, only: :create
 
+  after_create_commit :trigger_webhooks
+
   def object_type
     :flag
   end
@@ -143,4 +145,8 @@ class Report < ApplicationRecord
 
     errors.add(:rule_ids, I18n.t('reports.errors.invalid_rules')) unless rules.size == rule_ids&.size
   end
+
+  def trigger_webhooks
+    TriggerWebhookWorker.perform_async('report.created', 'Report', id)
+  end
 end
diff --git a/app/models/user.rb b/app/models/user.rb
index a68442963..6d2d94625 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -37,7 +37,6 @@
 #  sign_in_token_sent_at     :datetime
 #  webauthn_id               :string
 #  sign_up_ip                :inet
-#  skip_sign_in_token        :boolean
 #
 
 class User < ApplicationRecord
@@ -120,6 +119,7 @@ class User < ApplicationRecord
   before_validation :sanitize_languages
   before_create :set_approved
   after_commit :send_pending_devise_notifications
+  after_create_commit :trigger_webhooks
 
   # This avoids a deprecation warning from Rails 5.1
   # It seems possible that a future release of devise-two-factor will
@@ -182,7 +182,9 @@ class User < ApplicationRecord
   end
 
   def update_sign_in!(new_sign_in: false)
-    old_current, new_current = current_sign_in_at, Time.now.utc
+    old_current = current_sign_in_at
+    new_current = Time.now.utc
+
     self.last_sign_in_at     = old_current || new_current
     self.current_sign_in_at  = new_current
 
@@ -480,4 +482,8 @@ class User < ApplicationRecord
   def invite_text_required?
     Setting.require_invite_text && !invited? && !external? && !bypass_invite_request_check?
   end
+
+  def trigger_webhooks
+    TriggerWebhookWorker.perform_async('account.created', 'Account', account_id)
+  end
 end
diff --git a/app/models/webhook.rb b/app/models/webhook.rb
new file mode 100644
index 000000000..431edd75d
--- /dev/null
+++ b/app/models/webhook.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: webhooks
+#
+#  id         :bigint(8)        not null, primary key
+#  url        :string           not null
+#  events     :string           default([]), not null, is an Array
+#  secret     :string           default(""), not null
+#  enabled    :boolean          default(TRUE), not null
+#  created_at :datetime         not null
+#  updated_at :datetime         not null
+#
+
+class Webhook < ApplicationRecord
+  EVENTS = %w(
+    account.created
+    report.created
+  ).freeze
+
+  scope :enabled, -> { where(enabled: true) }
+
+  validates :url, presence: true, url: true
+  validates :secret, presence: true, length: { minimum: 12 }
+  validates :events, presence: true
+
+  validate :validate_events
+
+  before_validation :strip_events
+  before_validation :generate_secret
+
+  def rotate_secret!
+    update!(secret: SecureRandom.hex(20))
+  end
+
+  def enable!
+    update!(enabled: true)
+  end
+
+  def disable!
+    update!(enabled: false)
+  end
+
+  private
+
+  def validate_events
+    errors.add(:events, :invalid) if events.any? { |e| !EVENTS.include?(e) }
+  end
+
+  def strip_events
+    self.events = events.map { |str| str.strip.presence }.compact if events.present?
+  end
+
+  def generate_secret
+    self.secret = SecureRandom.hex(20) if secret.blank?
+  end
+end
diff --git a/app/policies/webhook_policy.rb b/app/policies/webhook_policy.rb
new file mode 100644
index 000000000..2c55703a1
--- /dev/null
+++ b/app/policies/webhook_policy.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class WebhookPolicy < ApplicationPolicy
+  def index?
+    admin?
+  end
+
+  def create?
+    admin?
+  end
+
+  def show?
+    admin?
+  end
+
+  def update?
+    admin?
+  end
+
+  def enable?
+    admin?
+  end
+
+  def disable?
+    admin?
+  end
+
+  def rotate_secret?
+    admin?
+  end
+
+  def destroy?
+    admin?
+  end
+end
diff --git a/app/presenters/webhooks/event_presenter.rb b/app/presenters/webhooks/event_presenter.rb
new file mode 100644
index 000000000..dac14a3f0
--- /dev/null
+++ b/app/presenters/webhooks/event_presenter.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class Webhooks::EventPresenter < ActiveModelSerializers::Model
+  attributes :type, :created_at, :object
+
+  def initialize(type, object)
+    super()
+
+    @type       = type
+    @created_at = Time.now.utc
+    @object     = object
+  end
+end
diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb
index ad05fdf6b..9827323a8 100644
--- a/app/serializers/manifest_serializer.rb
+++ b/app/serializers/manifest_serializer.rb
@@ -4,7 +4,19 @@ class ManifestSerializer < ActiveModel::Serializer
   include RoutingHelper
   include ActionView::Helpers::TextHelper
 
-  attributes :name, :short_name, :description,
+  ICON_SIZES = %w(
+    36
+    48
+    72
+    96
+    144
+    192
+    256
+    384
+    512
+  ).freeze
+
+  attributes :name, :short_name,
              :icons, :theme_color, :background_color,
              :display, :start_url, :scope,
              :share_target, :shortcuts
@@ -17,22 +29,18 @@ class ManifestSerializer < ActiveModel::Serializer
     object.site_title
   end
 
-  def description
-    strip_tags(object.site_short_description.presence || I18n.t('about.about_mastodon_html'))
-  end
-
   def icons
-    [
+    ICON_SIZES.map do |size|
       {
-        src: '/android-chrome-192x192.png',
-        sizes: '192x192',
+        src: full_pack_url("media/icons/android-chrome-#{size}x#{size}.png"),
+        sizes: "#{size}x#{size}",
         type: 'image/png',
-      },
-    ]
+      }
+    end
   end
 
   def theme_color
-    '#282c37'
+    '#6364FF'
   end
 
   def background_color
@@ -68,37 +76,12 @@ class ManifestSerializer < ActiveModel::Serializer
   def shortcuts
     [
       {
-        name: 'New toot',
+        name: 'Compose new post',
         url: '/web/publish',
-        icons: [
-          {
-            src: '/shortcuts/new-status.png',
-            type: 'image/png',
-            sizes: '192x192',
-          },
-        ],
       },
       {
         name: 'Notifications',
         url: '/web/notifications',
-        icons: [
-          {
-            src: '/shortcuts/notifications.png',
-            type: 'image/png',
-            sizes: '192x192',
-          },
-        ],
-      },
-      {
-        name: 'Direct messages',
-        url: '/web/conversations',
-        icons: [
-          {
-            src: '/shortcuts/direct.png',
-            type: 'image/png',
-            sizes: '192x192',
-          },
-        ],
       },
     ]
   end
diff --git a/app/serializers/rest/admin/report_serializer.rb b/app/serializers/rest/admin/report_serializer.rb
index 74bc0c520..237f41d8e 100644
--- a/app/serializers/rest/admin/report_serializer.rb
+++ b/app/serializers/rest/admin/report_serializer.rb
@@ -1,7 +1,8 @@
 # frozen_string_literal: true
 
 class REST::Admin::ReportSerializer < ActiveModel::Serializer
-  attributes :id, :action_taken, :category, :comment, :created_at, :updated_at
+  attributes :id, :action_taken, :action_taken_at, :category, :comment,
+             :created_at, :updated_at
 
   has_one :account, serializer: REST::Admin::AccountSerializer
   has_one :target_account, serializer: REST::Admin::AccountSerializer
diff --git a/app/serializers/rest/admin/webhook_event_serializer.rb b/app/serializers/rest/admin/webhook_event_serializer.rb
new file mode 100644
index 000000000..fe0ac23f9
--- /dev/null
+++ b/app/serializers/rest/admin/webhook_event_serializer.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class REST::Admin::WebhookEventSerializer < ActiveModel::Serializer
+  def self.serializer_for(model, options)
+    case model.class.name
+    when 'Account'
+      REST::Admin::AccountSerializer
+    when 'Report'
+      REST::Admin::ReportSerializer
+    else
+      super
+    end
+  end
+
+  attributes :event, :created_at
+
+  has_one :virtual_object, key: :object
+
+  def virtual_object
+    object.object
+  end
+
+  def event
+    object.type
+  end
+end
diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb
index 48bbb55c8..2c8cd7734 100644
--- a/app/serializers/rest/instance_serializer.rb
+++ b/app/serializers/rest/instance_serializer.rb
@@ -39,7 +39,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer
   end
 
   def thumbnail
-    instance_presenter.thumbnail ? full_asset_url(instance_presenter.thumbnail.file.url) : full_pack_url('media/images/preview.jpg')
+    instance_presenter.thumbnail ? full_asset_url(instance_presenter.thumbnail.file.url) : full_pack_url('media/images/preview.png')
   end
 
   def max_toot_chars
diff --git a/app/services/base_service.rb b/app/services/base_service.rb
index 99e8c875f..b0c0f9ec4 100644
--- a/app/services/base_service.rb
+++ b/app/services/base_service.rb
@@ -5,4 +5,8 @@ class BaseService
   include ActionView::Helpers::SanitizeHelper
 
   include RoutingHelper
+
+  def call(*)
+    raise NotImplementedError
+  end
 end
diff --git a/app/services/webhook_service.rb b/app/services/webhook_service.rb
new file mode 100644
index 000000000..aafa38318
--- /dev/null
+++ b/app/services/webhook_service.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class WebhookService < BaseService
+  def call(event, object)
+    @event  = Webhooks::EventPresenter.new(event, object)
+    @body   = serialize_event
+
+    webhooks_for_event.each do |webhook_id|
+      Webhooks::DeliveryWorker.perform_async(webhook_id, @body)
+    end
+  end
+
+  private
+
+  def webhooks_for_event
+    Webhook.enabled.where('? = ANY(events)', @event.type).pluck(:id)
+  end
+
+  def serialize_event
+    Oj.dump(ActiveModelSerializers::SerializableResource.new(@event, serializer: REST::Admin::WebhookEventSerializer, scope: nil, scope_name: :current_user).as_json)
+  end
+end
diff --git a/app/validators/url_validator.rb b/app/validators/url_validator.rb
index f50abbe24..75d1edb87 100644
--- a/app/validators/url_validator.rb
+++ b/app/validators/url_validator.rb
@@ -2,7 +2,7 @@
 
 class URLValidator < ActiveModel::EachValidator
   def validate_each(record, attribute, value)
-    record.errors.add(attribute, I18n.t('applications.invalid_url')) unless compliant?(value)
+    record.errors.add(attribute, :invalid) unless compliant?(value)
   end
 
   private
diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml
index a4a79c4e7..0b75f159a 100644
--- a/app/views/about/more.html.haml
+++ b/app/views/about/more.html.haml
@@ -8,7 +8,7 @@
   .column-0
     .public-account-header.public-account-header--no-bar
       .public-account-header__image
-        = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url || asset_pack_path('media/images/preview.jpg'), alt: @instance_presenter.site_title, class: 'parallax'
+        = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url || asset_pack_path('media/images/preview.png'), alt: @instance_presenter.site_title, class: 'parallax'
 
   .column-1
     .landing-page__call-to-action{ dir: 'ltr' }
diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml
index 321440096..fb292941b 100644
--- a/app/views/about/show.html.haml
+++ b/app/views/about/show.html.haml
@@ -8,7 +8,7 @@
 .landing
   .landing__brand
     = link_to root_url, class: 'brand' do
-      = svg_logo_full
+      = logo_as_symbol(:wordmark)
       %span.brand__tagline=t 'about.tagline'
 
   .landing__grid
@@ -53,7 +53,7 @@
 
       .hero-widget
         .hero-widget__img
-          = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url || asset_pack_path('media/images/preview.jpg'), alt: @instance_presenter.site_title
+          = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url || asset_pack_path('media/images/preview.png'), alt: @instance_presenter.site_title
 
         .hero-widget__text
           %p
diff --git a/app/views/accounts/show.rss.ruby b/app/views/accounts/show.rss.ruby
index 73c1c51e0..fd45a8b2b 100644
--- a/app/views/accounts/show.rss.ruby
+++ b/app/views/accounts/show.rss.ruby
@@ -5,12 +5,10 @@ RSS::Builder.build do |doc|
   doc.image(full_asset_url(@account.avatar.url(:original)), display_name(@account), params[:tag].present? ? short_account_tag_url(@account, params[:tag]) : short_account_url(@account))
   doc.last_build_date(@statuses.first.created_at) if @statuses.any?
   doc.icon(full_asset_url(@account.avatar.url(:original)))
-  doc.logo(full_pack_url('media/images/logo_transparent_white.svg'))
   doc.generator("Mastodon v#{Mastodon::Version.to_s}")
 
   @statuses.each do |status|
     doc.item do |item|
-      item.title(l(status.created_at))
       item.link(ActivityPub::TagManager.instance.url_for(status))
       item.pub_date(status.created_at)
       item.description(rss_status_content_format(status))
diff --git a/app/views/admin/custom_emojis/_custom_emoji.html.haml b/app/views/admin/custom_emojis/_custom_emoji.html.haml
index 41f3975cf..8d34d38e5 100644
--- a/app/views/admin/custom_emojis/_custom_emoji.html.haml
+++ b/app/views/admin/custom_emojis/_custom_emoji.html.haml
@@ -3,7 +3,7 @@
     = f.check_box :custom_emoji_ids, { multiple: true, include_hidden: false }, custom_emoji.id
   .batch-table__row__content.batch-table__row__content--with-image
     .batch-table__row__content__image
-      = custom_emoji_tag(custom_emoji, current_account&.user&.setting_auto_play_gif)
+      = custom_emoji_tag(custom_emoji)
 
     .batch-table__row__content__text
       %samp= ":#{custom_emoji.shortcode}:"
diff --git a/app/views/admin/webhooks/_form.html.haml b/app/views/admin/webhooks/_form.html.haml
new file mode 100644
index 000000000..c1e8f8979
--- /dev/null
+++ b/app/views/admin/webhooks/_form.html.haml
@@ -0,0 +1,11 @@
+= simple_form_for @webhook, url: @webhook.new_record? ? admin_webhooks_path : admin_webhook_path(@webhook) do |f|
+  = render 'shared/error_messages', object: @webhook
+
+  .fields-group
+    = f.input :url, wrapper: :with_block_label, input_html: { placeholder: 'https://' }
+
+  .fields-group
+    = f.input :events, collection: Webhook::EVENTS, wrapper: :with_block_label, include_blank: false, as: :check_boxes, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li'
+
+  .actions
+    = f.button :button, @webhook.new_record? ? t('admin.webhooks.add_new') : t('generic.save_changes'), type: :submit
diff --git a/app/views/admin/webhooks/_webhook.html.haml b/app/views/admin/webhooks/_webhook.html.haml
new file mode 100644
index 000000000..d94a41eb3
--- /dev/null
+++ b/app/views/admin/webhooks/_webhook.html.haml
@@ -0,0 +1,19 @@
+.applications-list__item
+  = link_to admin_webhook_path(webhook), class: 'announcements-list__item__title' do
+    = fa_icon 'inbox'
+    = webhook.url
+
+  .announcements-list__item__action-bar
+    .announcements-list__item__meta
+      - if webhook.enabled?
+        %span.positive-hint= t('admin.webhooks.enabled')
+      - else
+        %span.negative-hint= t('admin.webhooks.disabled')
+
+      •
+
+      %abbr{ title: webhook.events.join(', ') }= t('admin.webhooks.enabled_events', count: webhook.events.size)
+
+    %div
+      = table_link_to 'pencil', t('admin.webhooks.edit'), edit_admin_webhook_path(webhook) if can?(:update, webhook)
+      = table_link_to 'trash', t('admin.webhooks.delete'), admin_webhook_path(webhook), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, webhook)
diff --git a/app/views/admin/webhooks/edit.html.haml b/app/views/admin/webhooks/edit.html.haml
new file mode 100644
index 000000000..3dc0ace9b
--- /dev/null
+++ b/app/views/admin/webhooks/edit.html.haml
@@ -0,0 +1,4 @@
+- content_for :page_title do
+  = t('admin.webhooks.edit')
+
+= render partial: 'form'
diff --git a/app/views/admin/webhooks/index.html.haml b/app/views/admin/webhooks/index.html.haml
new file mode 100644
index 000000000..e4499e078
--- /dev/null
+++ b/app/views/admin/webhooks/index.html.haml
@@ -0,0 +1,18 @@
+- content_for :page_title do
+  = t('admin.webhooks.title')
+
+- content_for :heading_actions do
+  = link_to t('admin.webhooks.add_new'), new_admin_webhook_path, class: 'button' if can?(:create, :webhook)
+
+%p= t('admin.webhooks.description_html')
+
+%hr.spacer/
+
+- if @webhooks.empty?
+  %div.muted-hint.center-text
+    = t 'admin.webhooks.empty'
+- else
+  .applications-list
+    = render partial: 'webhook', collection: @webhooks
+
+  = paginate @webhooks
diff --git a/app/views/admin/webhooks/new.html.haml b/app/views/admin/webhooks/new.html.haml
new file mode 100644
index 000000000..1258df74a
--- /dev/null
+++ b/app/views/admin/webhooks/new.html.haml
@@ -0,0 +1,4 @@
+- content_for :page_title do
+  = t('admin.webhooks.new')
+
+= render partial: 'form'
diff --git a/app/views/admin/webhooks/show.html.haml b/app/views/admin/webhooks/show.html.haml
new file mode 100644
index 000000000..cc450de26
--- /dev/null
+++ b/app/views/admin/webhooks/show.html.haml
@@ -0,0 +1,34 @@
+- content_for :page_title do
+  = t('admin.webhooks.title')
+
+- content_for :heading do
+  %h2
+    %small
+      = fa_icon 'inbox'
+      = t('admin.webhooks.webhook')
+    = @webhook.url
+
+- content_for :heading_actions do
+  = link_to t('admin.webhooks.edit'), edit_admin_webhook_path, class: 'button' if can?(:update, @webhook)
+
+.table-wrapper
+  %table.table.horizontal-table
+    %tbody
+      %tr
+        %th= t('admin.webhooks.status')
+        %td
+          - if @webhook.enabled?
+            %span.positive-hint= t('admin.webhooks.enabled')
+            = table_link_to 'power-off', t('admin.webhooks.disable'), disable_admin_webhook_path(@webhook), method: :post if can?(:disable, @webhook)
+          - else
+            %span.negative-hint= t('admin.webhooks.disabled')
+            = table_link_to 'power-off', t('admin.webhooks.enable'), enable_admin_webhook_path(@webhook), method: :post if can?(:enable, @webhook)
+      %tr
+        %th= t('admin.webhooks.events')
+        %td
+          %abbr{ title: @webhook.events.join(', ') }= t('admin.webhooks.enabled_events', count: @webhook.events.size)
+      %tr
+        %th= t('admin.webhooks.secret')
+        %td
+          %samp= @webhook.secret
+          = table_link_to 'refresh', t('admin.webhooks.rotate_secret'), rotate_admin_webhook_secret_path(@webhook), method: :post if can?(:rotate_secret, @webhook)
diff --git a/app/views/application/_sidebar.html.haml b/app/views/application/_sidebar.html.haml
index e97c493fe..0a952add0 100644
--- a/app/views/application/_sidebar.html.haml
+++ b/app/views/application/_sidebar.html.haml
@@ -1,6 +1,6 @@
 .hero-widget
   .hero-widget__img
-    = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url || asset_pack_path('media/images/preview.jpg'), alt: @instance_presenter.site_title
+    = image_tag @instance_presenter.hero&.file&.url || @instance_presenter.thumbnail&.file&.url || asset_pack_path('media/images/preview.png'), alt: @instance_presenter.site_title
 
   .hero-widget__text
     %p= @instance_presenter.site_short_description.html_safe.presence || t('about.about_mastodon_html')
diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml
index ec3629dd8..aa66815cc 100644
--- a/app/views/layouts/admin.html.haml
+++ b/app/views/layouts/admin.html.haml
@@ -7,12 +7,12 @@
       .sidebar-wrapper__inner
         .sidebar
           = link_to root_path do
-            = image_pack_tag 'logo.svg', class: 'logo', alt: 'Mastodon'
+            = render_logo
 
           .sidebar__toggle
             .sidebar__toggle__logo
               = link_to root_path do
-                = svg_logo_full
+                = logo_as_symbol(:wordmark)
 
             = link_to '#', class: 'sidebar__toggle__icon' do
               = fa_icon 'bars'
@@ -22,7 +22,10 @@
     .content-wrapper
       .content
         .content-heading
-          %h2= yield :page_title
+          - if content_for?(:heading)
+            = yield :heading
+          - else
+            %h2= yield :page_title
 
           - if :heading_actions
             .content-heading-actions
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 09826afb3..ee444c070 100755
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -11,12 +11,17 @@
     - if storage_host?
       %link{ rel: 'dns-prefetch', href: storage_host }/
 
-    %link{ rel: 'icon', href: favicon_path, type: 'image/x-icon' }/
-    %link{ rel: 'apple-touch-icon', sizes: '180x180', href: '/apple-touch-icon.png' }/
-    %link{ rel: 'mask-icon', href: '/mask-icon.svg', color: '#2B90D9' }/
-    %link{ rel: 'manifest', href: '/manifest.json' }/
-    %meta{ name: 'msapplication-config', content: '/browserconfig.xml' }/
-    %meta{ name: 'theme-color', content: '#282c37' }/
+    %link{ rel: 'icon', href: '/favicon.ico', type: 'image/x-icon' }/
+
+    - %w(16 32 48).each do |size|
+      %link{ rel: 'icon', sizes: "#{size}x#{size}", href: asset_pack_path("media/icons/favicon-#{size}x#{size}.png"), type: 'image/png' }/
+
+    - %w(57 60 72 76 114 120 144 152 167 180 1024).each do |size|
+      %link{ rel: 'apple-touch-icon', sizes: "#{size}x#{size}", href: asset_pack_path("media/icons/apple-touch-icon-#{size}x#{size}.png") }/
+
+    %link{ rel: 'mask-icon', href: asset_pack_path('media/images/logo-symbol-icon.svg'), color: '#6364FF' }/
+    %link{ rel: 'manifest', href: manifest_path(format: :json) }/
+    %meta{ name: 'theme-color', content: '#6364FF' }/
     %meta{ name: 'apple-mobile-web-app-capable', content: 'yes' }/
 
     %title= content_for?(:page_title) ? safe_join([yield(:page_title).chomp.html_safe, title], ' - ') : title
@@ -44,6 +49,6 @@
   %body{ class: body_classes }
     = content_for?(:content) ? yield(:content) : yield
 
-    .logo-resources
-      = raw render file: Rails.root.join('app', 'javascript', 'images', 'logo_transparent.svg')
-      = raw render file: Rails.root.join('app', 'javascript', 'images', 'logo_full.svg')
+    .logo-resources{ 'tabindex' => '-1', 'inert' => true, 'aria-hidden' => true }
+      = render_symbol :icon
+      = render_symbol :wordmark
diff --git a/app/views/layouts/auth.html.haml b/app/views/layouts/auth.html.haml
index ba105d25e..34f6b38ec 100644
--- a/app/views/layouts/auth.html.haml
+++ b/app/views/layouts/auth.html.haml
@@ -3,7 +3,7 @@
     .logo-container
       %h1
         = link_to root_path do
-          = svg_logo_full
+          = logo_as_symbol(:wordmark)
 
     .form-container
       = render 'flashes'
diff --git a/app/views/layouts/embedded.html.haml b/app/views/layouts/embedded.html.haml
index 2a2996d28..b8817d566 100644
--- a/app/views/layouts/embedded.html.haml
+++ b/app/views/layouts/embedded.html.haml
@@ -24,5 +24,5 @@
   %body.embed
     = yield
 
-    .logo-resources
-      = raw render file: Rails.root.join('app', 'javascript', 'images', 'logo_transparent.svg')
+    .logo-resources{ 'tabindex' => '-1', 'inert' => true, 'aria-hidden' => true }
+      = render_symbol :icon
diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml
index 8b69d758b..d02454fc9 100644
--- a/app/views/layouts/mailer.html.haml
+++ b/app/views/layouts/mailer.html.haml
@@ -24,7 +24,7 @@
                               %tr
                                 %td.column-cell
                                   = link_to root_url do
-                                    = image_tag full_pack_url('media/images/mailer/logo_full.png'), alt: 'Mastodon', height: 34, class: 'logo'
+                                    = image_tag full_pack_url('media/images/mailer/wordmark.png'), alt: 'Mastodon', height: 34, class: 'logo'
 
     = yield
 
@@ -49,4 +49,4 @@
                                 %p= link_to t('application_mailer.notification_preferences'), settings_preferences_notifications_url
                               %td.column-cell.text-right
                                 = link_to root_url do
-                                  = image_tag full_pack_url('media/images/mailer/logo_transparent.png'), alt: 'Mastodon', height: 24
+                                  = image_tag full_pack_url('media/images/mailer/logo.png'), alt: 'Mastodon', height: 24
diff --git a/app/views/layouts/public.html.haml b/app/views/layouts/public.html.haml
index 1a789cef8..f4ef199e6 100644
--- a/app/views/layouts/public.html.haml
+++ b/app/views/layouts/public.html.haml
@@ -8,7 +8,7 @@
         %nav.header
           .nav-left
             = link_to root_url, class: 'brand' do
-              = svg_logo_full
+              = logo_as_symbol(:wordmark)
 
             - unless whitelist_mode?
               = link_to t('directories.directory'), explore_path, class: 'nav-link optional' if Setting.profile_directory
@@ -41,7 +41,7 @@
               %li= link_to t('about.api'), 'https://docs.joinmastodon.org/client/intro/'
           .column-2
             %h4= link_to t('about.what_is_mastodon'), 'https://joinmastodon.org/'
-            = link_to svg_logo, root_url, class: 'brand'
+            = link_to logo_as_symbol, root_url, class: 'brand'
           .column-3
             %h4= site_hostname
             %ul
diff --git a/app/views/shared/_og.html.haml b/app/views/shared/_og.html.haml
index c8f12974e..7feae1b8b 100644
--- a/app/views/shared/_og.html.haml
+++ b/app/views/shared/_og.html.haml
@@ -8,7 +8,7 @@
 = opengraph 'og:type', 'website'
 = opengraph 'og:title', @instance_presenter.site_title
 = opengraph 'og:description', description
-= opengraph 'og:image', full_asset_url(thumbnail&.file&.url || asset_pack_path('media/images/preview.jpg', protocol: :request))
+= opengraph 'og:image', full_asset_url(thumbnail&.file&.url || asset_pack_path('media/images/preview.png', protocol: :request))
 = opengraph 'og:image:width', thumbnail ? thumbnail.meta['width'] : '1200'
 = opengraph 'og:image:height', thumbnail ? thumbnail.meta['height'] : '630'
 = opengraph 'twitter:card', 'summary_large_image'
diff --git a/app/views/tags/show.rss.ruby b/app/views/tags/show.rss.ruby
index f4481b81c..9ce71be74 100644
--- a/app/views/tags/show.rss.ruby
+++ b/app/views/tags/show.rss.ruby
@@ -3,12 +3,10 @@ RSS::Builder.build do |doc|
   doc.description(I18n.t('rss.descriptions.tag', hashtag: @tag.name))
   doc.link(tag_url(@tag))
   doc.last_build_date(@statuses.first.created_at) if @statuses.any?
-  doc.logo(full_pack_url('media/images/logo_transparent_white.svg'))
   doc.generator("Mastodon v#{Mastodon::Version.to_s}")
 
   @statuses.each do |status|
     doc.item do |item|
-      item.title(l(status.created_at))
       item.link(ActivityPub::TagManager.instance.url_for(status))
       item.pub_date(status.created_at)
       item.description(rss_status_content_format(status))
diff --git a/app/views/user_mailer/warning.html.haml b/app/views/user_mailer/warning.html.haml
index fff61fa90..b9422e950 100644
--- a/app/views/user_mailer/warning.html.haml
+++ b/app/views/user_mailer/warning.html.haml
@@ -17,7 +17,7 @@
                                 %tbody
                                   %tr
                                     %td
-                                      = image_tag full_pack_url('media/images/mailer/icon_warning.png'), alt: ''
+                                      = image_tag full_pack_url('media/images/mailer/icon_flag.png'), alt: ''
 
                               %h1= t "user_mailer.warning.title.#{@warning.action}"
 
diff --git a/app/workers/trigger_webhook_worker.rb b/app/workers/trigger_webhook_worker.rb
new file mode 100644
index 000000000..2ffb6246f
--- /dev/null
+++ b/app/workers/trigger_webhook_worker.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class TriggerWebhookWorker
+  include Sidekiq::Worker
+
+  def perform(event, class_name, id)
+    object = class_name.constantize.find(id)
+    WebhookService.new.call(event, object)
+  rescue ActiveRecord::RecordNotFound
+    true
+  end
+end
diff --git a/app/workers/webhooks/delivery_worker.rb b/app/workers/webhooks/delivery_worker.rb
new file mode 100644
index 000000000..b1e345c5e
--- /dev/null
+++ b/app/workers/webhooks/delivery_worker.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class Webhooks::DeliveryWorker
+  include Sidekiq::Worker
+  include JsonLdHelper
+
+  sidekiq_options queue: 'push', retry: 16, dead: false
+
+  def perform(webhook_id, body)
+    @webhook   = Webhook.find(webhook_id)
+    @body      = body
+    @response  = nil
+
+    perform_request
+  rescue ActiveRecord::RecordNotFound
+    true
+  end
+
+  private
+
+  def perform_request
+    request = Request.new(:post, @webhook.url, body: @body)
+
+    request.add_headers(
+      'Content-Type' => 'application/json',
+      'X-Hub-Signature' => "sha256=#{signature}"
+    )
+
+    request.perform do |response|
+      raise Mastodon::UnexpectedResponseError, response unless response_successful?(response) || response_error_unsalvageable?(response)
+    end
+  end
+
+  def signature
+    OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), @webhook.secret, @body)
+  end
+end
diff --git a/config/locales/activerecord.af.yml b/config/locales/activerecord.af.yml
index 8882df613..c41e2341d 100644
--- a/config/locales/activerecord.af.yml
+++ b/config/locales/activerecord.af.yml
@@ -21,6 +21,14 @@ af:
             username:
               invalid: moet slegs letters, nommers en onderstrepe bevat
               reserved: is gereserveer
+        admin/webhook:
+          attributes:
+            url:
+              invalid: is nie 'n geldige URL nie
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: is nie 'n geldige URL nie
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.ast.yml b/config/locales/activerecord.ast.yml
index 4f7c734d9..d35b95dfc 100644
--- a/config/locales/activerecord.ast.yml
+++ b/config/locales/activerecord.ast.yml
@@ -9,3 +9,13 @@ ast:
         username: Nome d'usuariu
       user/invite_request:
         text: Motivu
+    errors:
+      models:
+        admin/webhook:
+          attributes:
+            url:
+              invalid: nun ye una URL válida
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: nun ye una URL válida
diff --git a/config/locales/activerecord.ca.yml b/config/locales/activerecord.ca.yml
index 03b594c0a..056137276 100644
--- a/config/locales/activerecord.ca.yml
+++ b/config/locales/activerecord.ca.yml
@@ -21,6 +21,14 @@ ca:
             username:
               invalid: només pot contenir lletres, números i guions baixos
               reserved: està reservat
+        admin/webhook:
+          attributes:
+            url:
+              invalid: no és una URL vàlida
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: no és una URL vàlida
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.cs.yml b/config/locales/activerecord.cs.yml
index bd0b28efb..d306fe627 100644
--- a/config/locales/activerecord.cs.yml
+++ b/config/locales/activerecord.cs.yml
@@ -21,6 +21,14 @@ cs:
             username:
               invalid: musí obsahovat pouze písmena, číslice a podtržítka
               reserved: je vyhrazeno
+        admin/webhook:
+          attributes:
+            url:
+              invalid: není platná URL
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: není platná URL
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.da.yml b/config/locales/activerecord.da.yml
index 081f4af76..3566abf43 100644
--- a/config/locales/activerecord.da.yml
+++ b/config/locales/activerecord.da.yml
@@ -21,6 +21,14 @@ da:
             username:
               invalid: må kun indeholde cifre, bogstaver og understreger
               reserved: er reserveret
+        admin/webhook:
+          attributes:
+            url:
+              invalid: "'er ikke en gyldig URL"
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: "'er ikke en gyldig URL"
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.de.yml b/config/locales/activerecord.de.yml
index 31c410fa3..a24862a70 100644
--- a/config/locales/activerecord.de.yml
+++ b/config/locales/activerecord.de.yml
@@ -21,6 +21,14 @@ de:
             username:
               invalid: nur Buchstaben, Ziffern und Unterstriche
               reserved: ist reserviert
+        admin/webhook:
+          attributes:
+            url:
+              invalid: ist keine gültige URL
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: ist keine gültige URL
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.en-GB.yml b/config/locales/activerecord.en-GB.yml
new file mode 100644
index 000000000..ef03d1810
--- /dev/null
+++ b/config/locales/activerecord.en-GB.yml
@@ -0,0 +1 @@
+en-GB:
diff --git a/config/locales/activerecord.en.yml b/config/locales/activerecord.en.yml
index d5f19ca64..720b0f5e3 100644
--- a/config/locales/activerecord.en.yml
+++ b/config/locales/activerecord.en.yml
@@ -21,6 +21,14 @@ en:
             username:
               invalid: must contain only letters, numbers and underscores
               reserved: is reserved
+        admin/webhook:
+          attributes:
+            url:
+              invalid: is not a valid URL
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: is not a valid URL
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.es-AR.yml b/config/locales/activerecord.es-AR.yml
index 9d6a479a7..8a9b75a8c 100644
--- a/config/locales/activerecord.es-AR.yml
+++ b/config/locales/activerecord.es-AR.yml
@@ -21,6 +21,14 @@ es-AR:
             username:
               invalid: sólo letras, números y subguiones ("_")
               reserved: está reservado
+        admin/webhook:
+          attributes:
+            url:
+              invalid: no es una dirección web válida
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: no es una dirección web válida
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.es.yml b/config/locales/activerecord.es.yml
index 0c4d6e5cf..805e6b920 100644
--- a/config/locales/activerecord.es.yml
+++ b/config/locales/activerecord.es.yml
@@ -21,6 +21,14 @@ es:
             username:
               invalid: solo puede contener letras, números y guiones bajos
               reserved: está reservado
+        admin/webhook:
+          attributes:
+            url:
+              invalid: no es una URL válida
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: no es una URL válida
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.fr.yml b/config/locales/activerecord.fr.yml
index 34cf0b837..4ab8f6a91 100644
--- a/config/locales/activerecord.fr.yml
+++ b/config/locales/activerecord.fr.yml
@@ -21,6 +21,14 @@ fr:
             username:
               invalid: seulement des lettres, des nombres et des tirets bas
               reserved: est réservé
+        admin/webhook:
+          attributes:
+            url:
+              invalid: n’est pas une URL valide
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: n’est pas une URL valide
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.fy.yml b/config/locales/activerecord.fy.yml
new file mode 100644
index 000000000..a3398cfba
--- /dev/null
+++ b/config/locales/activerecord.fy.yml
@@ -0,0 +1,24 @@
+---
+fy:
+  activerecord:
+    attributes:
+      poll:
+        options: Karren
+      user:
+        email: E-mailadres
+        locale: Taal
+        password: Wachtwurd
+      user/account:
+        username: Brûkersnamme
+      user/invite_request:
+        text: Reden
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: mei allinnich letters, nûmers en ûnderstreekjes befetsje
+        user:
+          attributes:
+            email:
+              unreachable: liket net te bestean
diff --git a/config/locales/activerecord.gl.yml b/config/locales/activerecord.gl.yml
index cbdd801e5..4b039f5af 100644
--- a/config/locales/activerecord.gl.yml
+++ b/config/locales/activerecord.gl.yml
@@ -21,6 +21,14 @@ gl:
             username:
               invalid: só letras, números e trazo baixo
               reserved: está reservado
+        admin/webhook:
+          attributes:
+            url:
+              invalid: non é un URL válido
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: non é un URL válido
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.hu.yml b/config/locales/activerecord.hu.yml
index ac8cfd773..442bf3858 100644
--- a/config/locales/activerecord.hu.yml
+++ b/config/locales/activerecord.hu.yml
@@ -21,6 +21,14 @@ hu:
             username:
               invalid: csak betűket, számokat vagy alávonást tartalmazhat
               reserved: fenntartott
+        admin/webhook:
+          attributes:
+            url:
+              invalid: nem érvényes URL
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: nem érvényes URL
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.io.yml b/config/locales/activerecord.io.yml
index 38304ef93..9779cbdd1 100644
--- a/config/locales/activerecord.io.yml
+++ b/config/locales/activerecord.io.yml
@@ -21,6 +21,14 @@ io:
             username:
               invalid: mustas konsistar nur literi, nombri e sublinei
               reserved: rezervitas
+        admin/webhook:
+          attributes:
+            url:
+              invalid: ne esas valida URL
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: ne esas valida URL
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.it.yml b/config/locales/activerecord.it.yml
index c6587f1fd..307bd801e 100644
--- a/config/locales/activerecord.it.yml
+++ b/config/locales/activerecord.it.yml
@@ -21,6 +21,14 @@ it:
             username:
               invalid: solo lettere, numeri e trattini bassi
               reserved: è riservato
+        admin/webhook:
+          attributes:
+            url:
+              invalid: non è un URL valido
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: non è un URL valido
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.ja.yml b/config/locales/activerecord.ja.yml
index ab13dce6c..52b1b37fd 100644
--- a/config/locales/activerecord.ja.yml
+++ b/config/locales/activerecord.ja.yml
@@ -21,6 +21,14 @@ ja:
             username:
               invalid: アルファベット・数字・アンダーバーの組み合わせで入力してください
               reserved: は予約されています
+        admin/webhook:
+          attributes:
+            url:
+              invalid: は無効なURLです
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: は無効なURLです
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.ku.yml b/config/locales/activerecord.ku.yml
index 340b7a777..b440181d8 100644
--- a/config/locales/activerecord.ku.yml
+++ b/config/locales/activerecord.ku.yml
@@ -21,6 +21,14 @@ ku:
             username:
               invalid: pêdivî ye ku tenê tîp, hejmar û xêzikên jêrîn hebin
               reserved: hatiye bikaranîn
+        admin/webhook:
+          attributes:
+            url:
+              invalid: ev girêdaneke nederbasdar e
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: ev girêdaneke nederbasdar e
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.lv.yml b/config/locales/activerecord.lv.yml
index ad9fa6604..89a1fb094 100644
--- a/config/locales/activerecord.lv.yml
+++ b/config/locales/activerecord.lv.yml
@@ -21,6 +21,14 @@ lv:
             username:
               invalid: drīkst saturēt tikai burtus, ciparus un pasvītras
               reserved: ir rezervēts
+        admin/webhook:
+          attributes:
+            url:
+              invalid: nav derīgs URL
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: nav derīgs URL
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.pl.yml b/config/locales/activerecord.pl.yml
index c7b1e7fab..e9af76244 100644
--- a/config/locales/activerecord.pl.yml
+++ b/config/locales/activerecord.pl.yml
@@ -21,6 +21,14 @@ pl:
             username:
               invalid: może składać się tylko z liter, cyfr i podkreślników
               reserved: jest zarezerwowana
+        admin/webhook:
+          attributes:
+            url:
+              invalid: nie jest poprawnym adresem URL
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: nie jest poprawnym adresem URL
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.pt-PT.yml b/config/locales/activerecord.pt-PT.yml
index 17c199ea8..5b89ee5a2 100644
--- a/config/locales/activerecord.pt-PT.yml
+++ b/config/locales/activerecord.pt-PT.yml
@@ -21,6 +21,14 @@ pt-PT:
             username:
               invalid: apenas letras, números e underscores
               reserved: está reservado
+        admin/webhook:
+          attributes:
+            url:
+              invalid: não é um URL válido
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: não é um URL válido
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.ru.yml b/config/locales/activerecord.ru.yml
index 2f9210519..758fe7dd4 100644
--- a/config/locales/activerecord.ru.yml
+++ b/config/locales/activerecord.ru.yml
@@ -21,6 +21,14 @@ ru:
             username:
               invalid: только буквы, цифры и символ подчёркивания
               reserved: зарезервировано
+        admin/webhook:
+          attributes:
+            url:
+              invalid: не является допустимым URL
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: не является допустимым URL
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.sl.yml b/config/locales/activerecord.sl.yml
index d7fbb446d..7927cb4fc 100644
--- a/config/locales/activerecord.sl.yml
+++ b/config/locales/activerecord.sl.yml
@@ -21,6 +21,14 @@ sl:
             username:
               invalid: samo črke, številke in podčrtaji
               reserved: je rezerviran
+        admin/webhook:
+          attributes:
+            url:
+              invalid: ni veljaven URL
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: ni veljaven URL
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.sq.yml b/config/locales/activerecord.sq.yml
index 920b73e7a..57de9d3cb 100644
--- a/config/locales/activerecord.sq.yml
+++ b/config/locales/activerecord.sq.yml
@@ -21,6 +21,14 @@ sq:
             username:
               invalid: duhet të përmbajë vetëm shkronja, numra dhe nënvija
               reserved: është i rezervuar
+        admin/webhook:
+          attributes:
+            url:
+              invalid: s’është URL e vlefshme
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: s’është URL
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.tr.yml b/config/locales/activerecord.tr.yml
index 890f065b1..ac40e0615 100644
--- a/config/locales/activerecord.tr.yml
+++ b/config/locales/activerecord.tr.yml
@@ -21,6 +21,14 @@ tr:
             username:
               invalid: sadece harfler, sayılar ve alt çizgiler
               reserved: kullanılamaz
+        admin/webhook:
+          attributes:
+            url:
+              invalid: geçerli bir URL değil
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: geçerli bir URL değil
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.uk.yml b/config/locales/activerecord.uk.yml
index 38d4771b3..06967ddc7 100644
--- a/config/locales/activerecord.uk.yml
+++ b/config/locales/activerecord.uk.yml
@@ -21,6 +21,14 @@ uk:
             username:
               invalid: тільки літери, цифри та підкреслення
               reserved: зарезервовано
+        admin/webhook:
+          attributes:
+            url:
+              invalid: не є дійсною URL-адресою
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: не є дійсною URL-адресою
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.vi.yml b/config/locales/activerecord.vi.yml
index c0e989563..6c7c41903 100644
--- a/config/locales/activerecord.vi.yml
+++ b/config/locales/activerecord.vi.yml
@@ -21,6 +21,14 @@ vi:
             username:
               invalid: chỉ chấp nhận ký tự, số và dấu gạch dưới
               reserved: bị cấm sử dụng
+        admin/webhook:
+          attributes:
+            url:
+              invalid: không phải là một URL hợp lệ
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: không phải là một URL hợp lệ
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.zh-CN.yml b/config/locales/activerecord.zh-CN.yml
index 946e81893..855e79de6 100644
--- a/config/locales/activerecord.zh-CN.yml
+++ b/config/locales/activerecord.zh-CN.yml
@@ -21,6 +21,10 @@ zh-CN:
             username:
               invalid: 只能使用字母、数字和下划线
               reserved: 是保留关键字
+        admin/webhook:
+          attributes:
+            url:
+              invalid: 不是有效的 URL。
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.zh-TW.yml b/config/locales/activerecord.zh-TW.yml
index c6856c386..bea950ed6 100644
--- a/config/locales/activerecord.zh-TW.yml
+++ b/config/locales/activerecord.zh-TW.yml
@@ -21,6 +21,14 @@ zh-TW:
             username:
               invalid: 只能有字母、數字及底線
               reserved: 是保留關鍵字
+        admin/webhook:
+          attributes:
+            url:
+              invalid: 不是有效的 URL
+        doorkeeper/application:
+          attributes:
+            website:
+              invalid: 不是有效的 URL
         status:
           attributes:
             reblog:
diff --git a/config/locales/af.yml b/config/locales/af.yml
index bc54cfdfd..d69e6b92d 100644
--- a/config/locales/af.yml
+++ b/config/locales/af.yml
@@ -8,10 +8,28 @@ af:
     federation_hint_html: Met 'n rekening op %{instance} sal jy in staat wees om mense op enige Mastodon en federasie bediener te volg.
     get_apps: Probeer 'n mobiele toepassing
     hosted_on: Mastodon gehuisves op %{domain}
+    tagline: Gedesentraliseerde sosiale netwerk
   admin:
+    domain_blocks:
+      existing_domain_block: Jy het alreeds strenger perke ingelê op %{name}.
     trends:
       only_allowed: Slegs toegelate
       trending: Gewild
+    webhooks:
+      add_new: Voeg end-punt by
+      delete: Wis uit
+      disable: Deaktiveer
+      disabled: Gedeaktiveer
+      edit: Redigeer end-punt
+      empty: Jy het tans geen opgestelde web-hoek end-punte nie.
+      enable: Aktiveer
+      enabled: Aktief
+      new: Nuwe web-hoek
+      rotate_secret: Roteer geheim
+      secret: Onderteken geheim
+      status: Status
+      title: Web-hoeke
+      webhook: Web-hoek
   disputes:
     strikes:
       approve_appeal: Aanvaar appêl
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 9d78451bb..01f55f344 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -42,7 +42,6 @@ ar:
       two: منشورات
       zero: منشورات
     status_count_before: نشروا
-    tagline: اتبع أصدقائك وصديقاتك واكتشف آخرين وأخريات
     terms: شروط الخدمة
     unavailable_content: محتوى غير متوفر
     unavailable_content_description:
@@ -842,7 +841,6 @@ ar:
   applications:
     created: تم إنشاء التطبيق بنجاح
     destroyed: تم حذف التطبيق بنجاح
-    invalid_url: إن الرابط المقدم غير صالح
     regenerate_token: إعادة توليد رمز النفاذ
     token_regenerated: تم إعادة إنشاء الرمز الوصول بنجاح
     warning: كن حذرا مع هذه البيانات. لا تقم أبدا بمشاركتها مع الآخَرين!
diff --git a/config/locales/ast.yml b/config/locales/ast.yml
index a9bcbbdf7..1fb1cee90 100644
--- a/config/locales/ast.yml
+++ b/config/locales/ast.yml
@@ -24,7 +24,6 @@ ast:
       one: artículu
       other: artículos
     status_count_before: Que crearon
-    tagline: Sigui a persones y conoz a más xente
     terms: Términos del serviciu
     unavailable_content_description:
       domain: Sirvidor
@@ -144,6 +143,8 @@ ast:
       site_title: Nome del sirvidor
       title: Axustes del sitiu
     title: Alministración
+    webhooks:
+      events: Eventos
   admin_mailer:
     new_pending_account:
       body: Los detalles de la cuenta nueva tán embaxo. Pues aprobar o refugar esta aplicación.
@@ -164,7 +165,6 @@ ast:
     sensitive_content: Conteníu sensible
     toot_layout: Distribución de los barritos
   applications:
-    invalid_url: La URL apurrida nun ye válida
     warning: Ten munchu curiáu con estos datos, ¡enxamás nun los compartas con naide!
   auth:
     change_password: Contraseña
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index c9e264787..04296b342 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -29,7 +29,6 @@ bg:
       one: състояние
       other: състояния
     status_count_before: Написали
-    tagline: Следвайте приятели и открийте нови
     terms: Условия за ползване
     unavailable_content: Модерирани сървъри
     unavailable_content_description:
@@ -178,8 +177,6 @@ bg:
   application_mailer:
     settings: 'Промяна на предпочитанията за e-mail: %{link}'
     view: 'Преглед:'
-  applications:
-    invalid_url: Предоставеният URL е невалиден
   auth:
     didnt_get_confirmation: Не получих инструкции за потвърждение
     forgot_password: Забравих си паролата
diff --git a/config/locales/bn.yml b/config/locales/bn.yml
index 20a99fd2f..ae1ced450 100644
--- a/config/locales/bn.yml
+++ b/config/locales/bn.yml
@@ -31,7 +31,6 @@ bn:
       one: অবস্থা
       other: স্থিতিগুলি
     status_count_before: কে লিখেছে
-    tagline: পরিচিতজনদের সাথে যুক্ত হন এবং নতুনদের সাথে পরিচিত হন
     terms: ব্যবহারের শর্তাবলী
     unavailable_content: অনুপলব্ধ সামগ্রী
     unavailable_content_description:
diff --git a/config/locales/br.yml b/config/locales/br.yml
index 07e12a531..f7c060579 100644
--- a/config/locales/br.yml
+++ b/config/locales/br.yml
@@ -10,6 +10,8 @@ br:
     discover_users: Dizoleiñ implijer·ien·ezed
     learn_more: Gouzout hiroc'h
     privacy_policy: Reolennoù prevezded
+    rules: Reolennoù ar servijer
+    server_stats: 'Stadegoù ar servijer:'
     source_code: Boneg tarzh
     status_count_after:
       few: toud
@@ -36,6 +38,7 @@ br:
       other: Heulier·ez
       two: Heulier·ez
     following: O heuliañ
+    media: Media
     posts:
       few: Toud
       many: Toud
@@ -52,6 +55,7 @@ br:
     unfollow: Diheuliañ
   admin:
     accounts:
+      avatar: Avatar
       by_domain: Domani
       change_email:
         current_email: Postel bremanel
@@ -60,6 +64,7 @@ br:
         submit: Kemm ar postel
       deleted: Dilamet
       domain: Domani
+      edit: Aozañ
       email: Postel
       enable: Gweredekaat
       enabled: Gweredekaet
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 461d27fa3..8c8fa1ffb 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -38,7 +38,7 @@ ca:
       one: publicació
       other: publicacions
     status_count_before: Qui ha publicat
-    tagline: Segueix els teus amics i descobreix-ne de nous
+    tagline: Xarxa social descentralitzada
     terms: Condicions de servei
     unavailable_content: Servidors moderats
     unavailable_content_description:
@@ -428,6 +428,7 @@ ca:
       destroyed_msg: El bloqueig de domini s'ha desfet
       domain: Domini
       edit: Editar el bloqueig del domini
+      existing_domain_block: Ja s'han imposat mesures més estrictes a %{name}.
       existing_domain_block_html: Ja has imposat uns límits més estrictes a %{name}, l'hauries de <a href="%{unblock_url}">desbloquejar-lo</a> primer.
       new:
         create: Crea un bloqueig
@@ -851,6 +852,26 @@ ca:
       edit_preset: Edita l'avís predeterminat
       empty: Encara no has definit cap preavís.
       title: Gestiona les configuracions predefinides dels avisos
+    webhooks:
+      add_new: Afegir extrem
+      delete: Elimina
+      description_html: Un <strong>webhook</strong> habilita Mastodon per a empènyer <strong>notificacions en temps real</strong> sobre els esdeveniments escollits de la teva pròpia aplicació, per tant la teva aplicació pot <strong>activar reaccions automaticament</strong>.
+      disable: Desactiva
+      disabled: Desactivat
+      edit: Editar extrem
+      empty: Encara no tens cap extrem de webhook configurat.
+      enable: Activa
+      enabled: Actiu
+      enabled_events:
+        one: 1 esdeveniment activat
+        other: "%{count} esdeveniments activats"
+      events: Esdeveniments
+      new: Nou webhook
+      rotate_secret: Rota el secret
+      secret: Signant el secret
+      status: Estat
+      title: Webhooks
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -915,7 +936,6 @@ ca:
   applications:
     created: L'aplicació s'ha creat correctament
     destroyed: L'aplicació s'ha suprimit correctament
-    invalid_url: L'URL proporcionat no és correcte
     regenerate_token: Torna a generar l'identificador d'accés
     token_regenerated: L'identificador d'accés s'ha generat correctament
     warning: Aneu amb compte amb aquestes dades. No les compartiu mai amb ningú!
diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml
index 6429696ed..35e826c9c 100644
--- a/config/locales/ckb.yml
+++ b/config/locales/ckb.yml
@@ -37,7 +37,6 @@ ckb:
       one: دۆخ
       other: پۆست
     status_count_before: لە لایەن یەکەوە
-    tagline: دوای هاوڕێکان بکەوە و ئەوانەی نوێ بدۆزیەوە
     terms: مەرجەکانی خزمەتگوزاری
     unavailable_content: ڕاژەی چاودێریکراو
     unavailable_content_description:
@@ -721,7 +720,6 @@ ckb:
   applications:
     created: بەرنامە بە سەرکەوتوویی دروست کرا
     destroyed: بەرنامە بە سەرکەوتوویی سڕدراوەتەوە
-    invalid_url: بەستەری دابینکراو نادروستە
     regenerate_token: دووبارە دروستکردنەوەی نیشانەی چوونە ژوورەوە
     token_regenerated: کۆدی دەستپێگەیشتن بە سەرکەوتوویی دروستکرا
     warning: زۆر ئاگاداربە لەم داتایە. هەرگیز لەگەڵ کەس دا هاوبەشی مەکە!
diff --git a/config/locales/co.yml b/config/locales/co.yml
index ca4c7ed3d..183439447 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -35,7 +35,6 @@ co:
       one: statutu
       other: statuti
     status_count_before: Chì anu pubblicatu
-    tagline: Siguità amichi è scopre ancu di più altri
     terms: Cundizione di u serviziu
     unavailable_content: Cuntinutu micca dispunibule
     unavailable_content_description:
@@ -705,7 +704,6 @@ co:
   applications:
     created: Applicazione creata
     destroyed: Applicazione sguassata
-    invalid_url: L’URL ch’è stata pruvista ùn hè valida
     regenerate_token: Creà un’altra fiscia d’accessu
     token_regenerated: A fiscia d’accessu hè stata rigenerata
     warning: Abbadate à quessi dati. Ùn i date à nisunu!
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 9244ddeac..1868b9dd7 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -40,7 +40,7 @@ cs:
       one: příspěvek
       other: příspěvků
     status_count_before: Kteří napsali
-    tagline: Sledujte své přátele a objevujte nové
+    tagline: Decentralizovaná sociální síť
     terms: Podmínky používání
     unavailable_content: Moderované servery
     unavailable_content_description:
@@ -76,7 +76,7 @@ cs:
     last_active: naposledy aktivní
     link_verified_on: Vlastnictví tohoto odkazu bylo zkontrolováno %{date}
     media: Média
-    moved_html: "%{name} se přesunul a na %{new_profile_link}:"
+    moved_html: 'Uživatel %{name} se přesunul na %{new_profile_link}:'
     network_hidden: Tato informace není k dispozici
     nothing_here: Nic tu není!
     people_followed_by: Lidé, které sleduje %{name}
@@ -209,8 +209,8 @@ cs:
       security_measures:
         only_password: Pouze heslo
         password_and_2fa: Heslo a 2FA
-      sensitive: Citlivý
-      sensitized: označen jako citlivý
+      sensitive: Vynutit citlivost
+      sensitized: Označen jako citlivý
       shared_inbox_url: URL sdílené příchozí schránky
       show:
         created_reports: Vytvořená hlášení
@@ -228,10 +228,10 @@ cs:
       unblock_email: Odblokovat e-mailovou adresu
       unblocked_email_msg: E-mailová adresa %{username} byla úspěšně odblokována
       unconfirmed_email: Nepotvrzený e-mail
-      undo_sensitized: Vrátit zpět citlivost
+      undo_sensitized: Zrušit vynucení citlivosti
       undo_silenced: Zrušit omezení
       undo_suspension: Zrušit pozastavení
-      unsilenced_msg: Omezení účtu %{username} úspěšně odstraněno
+      unsilenced_msg: Omezení účtu %{username} úspěšně zrušeno
       unsubscribe: Přestat odebírat
       unsuspended_msg: Úspěšně obnoven účet %{username}
       username: Uživatelské jméno
@@ -279,12 +279,12 @@ cs:
         reopen_report: Znovu otevřít hlášení
         reset_password_user: Obnovit heslo
         resolve_report: Označit hlášení jako vyřešené
-        sensitive_account: Označit média ve vašem účtu jako citlivá
+        sensitive_account: Vynucení citlivosti účtu
         silence_account: Omezit účet
         suspend_account: Pozastavit účet
         unassigned_report: Zrušit přiřazení hlášení
         unblock_email_account: Odblokovat e-mailovou adresu
-        unsensitive_account: Zrušit označení médií ve vašem účtu jako citlivých
+        unsensitive_account: Zrušit vynucení citlivosti účtu
         unsilence_account: Zrušit omezení účtu
         unsuspend_account: Zrušit pozastavení účtu
         update_announcement: Aktualizovat oznámení
@@ -331,12 +331,12 @@ cs:
         reset_password_user_html: Uživatel %{name} obnovil heslo uživatele %{target}
         resolve_report_html: Uživatel %{name} vyřešil hlášení %{target}
         sensitive_account_html: "%{name} označil média účtu %{target} jako citlivá"
-        silence_account_html: Uživatel %{name} ztišil uživatele %{target}
+        silence_account_html: Uživatel %{name} omezil účet %{target}
         suspend_account_html: Uživatel %{name} pozastavil účet uživatele %{target}
         unassigned_report_html: Uživatel %{name} odebral hlášení %{target}
         unblock_email_account_html: Uživatel %{name} odblokoval e-mailovou adresu %{target}
         unsensitive_account_html: "%{name} zrušil označení médií účtu %{target} jako citlivých"
-        unsilence_account_html: Uživatel %{name} zrušil ztišení uživatele %{target}
+        unsilence_account_html: Uživatel %{name} zrušil omezení účtu %{target}
         unsuspend_account_html: Uživatel %{name} zrušil pozastavení účtu uživatele %{target}
         update_announcement_html: Uživatel %{name} aktualizoval oznámení %{target}
         update_custom_emoji_html: Uživatel %{name} aktualizoval emoji %{target}
@@ -443,10 +443,11 @@ cs:
     domain_blocks:
       add_new: Přidat novou blokaci domény
       created_msg: Blokace domény se právě vyřizuje
-      destroyed_msg: Blokace domény byla vrácena
+      destroyed_msg: Blokace domény byla odvolána
       domain: Doména
       edit: Upravit blokaci domény
-      existing_domain_block_html: Pro účet %{name} jste už nastavili přísnější omezení, nejprve jej <a href="%{unblock_url}">odblokujte</a>.
+      existing_domain_block: Pro %{name} už jste nastavili přísnější omezení.
+      existing_domain_block_html: Pro %{name} už jste nastavili přísnější omezení, nejprve ji <a href="%{unblock_url}">odblokujte</a>.
       new:
         create: Vytvořit blokaci
         hint: Blokace domény nezakáže vytváření záznamů účtů v databázi, ale bude na tyto účty zpětně a automaticky aplikovat specifické metody moderování.
@@ -466,7 +467,7 @@ cs:
       reject_media_hint: Odstraní lokálně uložené mediální soubory a odmítne jejich stahování v budoucnosti. Nepodstatné pro pozastavení
       reject_reports: Odmítat hlášení
       reject_reports_hint: Ignorovat všechna hlášení pocházející z této domény. Nepodstatné pro pozastavení
-      undo: Vrátit blokaci domény
+      undo: Odvolat blokaci domény
       view: Zobrazit blokaci domény
     email_domain_blocks:
       add_new: Přidat
@@ -885,6 +886,28 @@ cs:
       edit_preset: Upravit předlohu pro varování
       empty: Zatím jste nedefinovali žádné předlohy varování.
       title: Spravovat předlohy pro varování
+    webhooks:
+      add_new: Přidat koncový bod
+      delete: Smazat
+      description_html: "<strong>Webhook</strong> umožňuje Mastodonu o vybraných událostech <strong>notifikovat v reálném čase</strong> vaši vlastní aplikaci, aby mohla <strong>automaticky spouštět reakce</strong>."
+      disable: Vypnout
+      disabled: Vypnuto
+      edit: Upravit koncový bod
+      empty: Nemáte ještě nastavené žádné koncové body webhooků.
+      enable: Zapnout
+      enabled: Aktivní
+      enabled_events:
+        few: "%{count} zapnuté události"
+        many: "%{count} zapnutých událostí"
+        one: 1 zapnutá událost
+        other: "%{count} zapnutých událostí"
+      events: Události
+      new: Nový webhook
+      rotate_secret: Obnovit klíč
+      secret: Podpisový klíč
+      status: Stav
+      title: Webhooky
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -949,7 +972,6 @@ cs:
   applications:
     created: Aplikace úspěšně vytvořena
     destroyed: Aplikace úspěšně smazána
-    invalid_url: Zadaná URL adresa je neplatná
     regenerate_token: Znovu vygenerovat přístupový token
     token_regenerated: Přístupový token byl úspěšně vygenerován
     warning: Zacházejte s těmito daty opatrně. Nikdy je s nikým nesdílejte!
@@ -1332,8 +1354,8 @@ cs:
     code_hint: Pro potvrzení zadejte kód vygenerovaný Vaší ověřovací aplikací
     description_html: Zapnete-li <strong>dvoufázové ověřování</strong> pomocí ověřovací aplikace, k přihlášení budete u sebe muset mít svůj mobil, který pro Vás bude generovat kódy k opsání.
     enable: Zapnout
-    instructions_html: "<strong>Naskenujte tento QR kód do Google Authenticator nebo podobné TOTP aplikace na Vašem telefonu</strong>. Následně bude tato aplikace generovat kódy, které budete zadávat při přihlašování."
-    manual_instructions: 'Nemůžete-li načíst QR kód a potřebujete ho zadat ručně, zde je tajemství v textové podobě:'
+    instructions_html: "<strong>Naskenujte tento QR kód do Google Authenticator nebo podobné TOTP aplikace na svém telefonu</strong>. Následně bude tato aplikace generovat kódy, které budete zadávat při přihlašování."
+    manual_instructions: 'Nemůžete-li načíst QR kód a potřebujete ho zadat ručně, zde je klíč v textové podobě:'
     setup: Nastavit
     wrong_code: Zadaný kód je neplatný! Je čas na serveru i zařízení generujícím kód správný?
   pagination:
@@ -1404,7 +1426,7 @@ cs:
       account: Veřejné příspěvky od @%{acct}
       tag: 'Veřejné příspěvky s hashtagem #%{hashtag}'
   scheduled_statuses:
-    over_daily_limit: Překročili jste limit %{limit} příspěvků naplánovaných na tento den
+    over_daily_limit: Pro dnešek jste překročili limit %{limit} naplánovaných příspěvků
     over_total_limit: Překročili jste limit %{limit} naplánovaných příspěvků
     too_soon: Plánované datum musí být v budoucnosti
   sessions:
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index 351067346..913753325 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -42,7 +42,6 @@ cy:
       two: statwsau
       zero: statwsau
     status_count_before: Ysgrifennwyd gan
-    tagline: Dilyn ffrindiau a darganfod rhai newydd
     terms: Telerau gwasanaeth
     unavailable_content: Cynnwys nad yw ar gael
     unavailable_content_description:
@@ -587,7 +586,6 @@ cy:
   applications:
     created: Cais wedi ei greu'n llwyddiannus
     destroyed: Cais wedi ei ddileu'n llwyddiannus
-    invalid_url: Mae'r URL a ddarparwyd yn annilys
     regenerate_token: Adfywio tocyn mynediad
     token_regenerated: Adfywiwyd y tocyn mynediad yn llwyddiannus
     warning: Byddwch yn ofalus a'r data hyn. Peidiwch a'i rannu byth!
diff --git a/config/locales/da.yml b/config/locales/da.yml
index b1c26b68b..337005369 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -38,7 +38,7 @@ da:
       one: indlæg
       other: indlæg
     status_count_before: Som har postet
-    tagline: Følg venner og opdag nye
+    tagline: Decentraliseret socialt netværk
     terms: Tjenestevilkår
     unavailable_content: Modererede servere
     unavailable_content_description:
@@ -428,6 +428,7 @@ da:
       destroyed_msg: Domæneblokering er blevet fjernet
       domain: Domæne
       edit: Redigér domæneblokering
+      existing_domain_block: "%{name} er allerede pålagt strengere restriktioner."
       existing_domain_block_html: Der har allerede pålagt %{name} strengere begrænsninger, så dette kræver først en <a href="%{unblock_url}">afblokering</a>.
       new:
         create: Opret blokering
@@ -851,6 +852,26 @@ da:
       edit_preset: Redigér advarselsforvalg
       empty: Ingen advarselsforvalg defineret endnu.
       title: Håndtérr advarselsforvalg
+    webhooks:
+      add_new: Tilføj endepunkt
+      delete: Slet
+      description_html: En <strong>webhook</strong> lader Mastodon pushe <strong>notifikationer i realtid</strong> om valgte begivenheder til ens egen applikation, så denne <strong>automatisk kan udløse reaktioner</strong>.
+      disable: Deaktivér
+      disabled: Deaktiveret
+      edit: Redigér endepunkt
+      empty: Der er endnu ikke opsat nogen webhook-endepunkter.
+      enable: Aktivér
+      enabled: Aktiv
+      enabled_events:
+        one: 1 aktiv begivenhed
+        other: "%{count} aktive begivenheder"
+      events: Begivenheder
+      new: Ny webhook
+      rotate_secret: Rotér hemmelighed
+      secret: Signeringshemmelighed
+      status: Status
+      title: Webhooks
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -915,7 +936,6 @@ da:
   applications:
     created: Applikation oprettet
     destroyed: Applikation slettet
-    invalid_url: Den angivne URL er ugyldig
     regenerate_token: Regenerér adgangstoken
     token_regenerated: Adgangstoken regenereret
     warning: Vær meget påpasselig med disse data. Del dem aldrig med nogen!
diff --git a/config/locales/de.yml b/config/locales/de.yml
index abe988a98..d15011a5e 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -38,7 +38,7 @@ de:
       one: Beitrag
       other: Beiträge
     status_count_before: mit
-    tagline: Finde deine Freunde und entdecke neue
+    tagline: Dezentrales soziales Netzwerk
     terms: Nutzungsbedingungen
     unavailable_content: Nicht verfügbarer Inhalt
     unavailable_content_description:
@@ -428,6 +428,7 @@ de:
       destroyed_msg: Die Domain-Blockade wurde rückgängig gemacht
       domain: Domain
       edit: Domainblockade bearbeiten
+      existing_domain_block: Du hast %{name} bereits stärker eingeschränkt.
       existing_domain_block_html: Es gibt schon eine Blockade für %{name}, diese muss erst <a href="%{unblock_url}">aufgehoben</a> werden.
       new:
         create: Blockade einrichten
@@ -851,6 +852,26 @@ de:
       edit_preset: Warnungsvorlage bearbeiten
       empty: Du hast noch keine Warnungsvorlagen hinzugefügt.
       title: Warnungsvorlagen verwalten
+    webhooks:
+      add_new: Endpunkt hinzufügen
+      delete: Löschen
+      description_html: Ein <strong>Webhook</strong> ermöglicht Mastodon <strong>Echtzeitbenachrichtigungen</strong> über ausgewählte Ereignisse an deine eigene Anwendung zu senden damit deine Anwendung <strong>automatisch Reaktionen auslösen kann</strong>.
+      disable: Deaktivieren
+      disabled: Deaktiviert
+      edit: Endpunkt bearbeiten
+      empty: Du hast noch keine Webhook Endpunkte konfiguriert.
+      enable: Aktivieren
+      enabled: Aktiv
+      enabled_events:
+        one: 1 aktiviertes Ereignis
+        other: "%{count} aktivierte Ereignisse"
+      events: Ereignisse
+      new: Neuer Webhook
+      rotate_secret: Geheimen Schlüssel rotieren
+      secret: Signaturgeheimnis
+      status: Status
+      title: Webhooks
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -915,7 +936,6 @@ de:
   applications:
     created: Anwendung erfolgreich erstellt
     destroyed: Anwendung erfolgreich gelöscht
-    invalid_url: Die angegebene URL ist ungültig
     regenerate_token: Zugangs-Token neu erstellen
     token_regenerated: Zugangs-Token neu erstellt
     warning: Sei mit diesen Daten sehr vorsichtig. Teile sie mit niemandem!
@@ -1525,6 +1545,55 @@ de:
   tags:
     does_not_match_previous_name: entspricht nicht dem vorherigen Namen
   terms:
+    body_html: |
+      <h2>Datenschutzerklärung</h2>
+      <h3 id="collect">Welche Informationen sammeln wir?</h3>
+      <ul>
+      <li><em>Grundlegende Kontoinformationen</em>: Wenn du dich auf diesem Server registrierst, wirst du darum gebeten, einen Benutzernamen, eine E-Mail-Adresse und ein Passwort einzugeben. Du kannst auch zusätzliche Profilinformationen wie etwa einen Anzeigenamen oder eine Biografie eingeben und ein Profilbild oder ein Headerbild hochladen. Der Benutzername, der Anzeigename, die Biografie, das Profilbild und das Headerbild werden immer öffentlich angezeigt.</li>
+      <li><em>Beiträge, Folge- und andere öffentliche Informationen</em>: Die Liste der Leute, denen du folgst, wird öffentlich gezeigt, das gleiche gilt für deine Folgenden (Follower). Sobald du eine Nachricht übermittelst, wird das Datum und die Uhrzeit gemeinsam mit der Information, welche Anwendung du dafür verwendet hast, gespeichert. Nachricht können Medienanhänge enthalten, etwa Bilder und Videos. Öffentliche und ungelistete Beiträge sind öffentlich verfügbar. Sobald du einen Beitrag auf deinem Profil anpinnst, sind dies auch öffentlich verfügbare Informationen. Deine Beiträge werden an deine Folgenden ausgeliefert, was in manchen Fällen bedeutet, dass sie an andere Server ausgeliefert werden und dort Kopien gespeichert werden. Sobald du Beiträge löschst, wird dies ebenso an deine Follower ausgeliefert. Die Handlungen des Teilens und Favorisieren eines anderen Beitrages ist immer öffentlich.</li>
+      <li><em>Direkte und "Nur Folgende"-Beiträge</em>: Alle Beiträge werden auf dem Server gespeichert und verarbeitet. "Nur Folgende"-Beiträge werden an deine Folgenden und an Benutzer, die du in ihnen erwähnst, ausgeliefert, direkte Beiträge nur an in ihnen erwähnte Benutzer. In manchen Fällen bedeutet dass, dass sie an andere Server ausgeliefert werden und dort Kopien gespeichert werden. Wir bemühen uns nach bestem Wissen und Gewissen, den Zugriff auf diese Beiträge auf nur autorisierte Personen einzuschränken, jedoch könnten andere Server dabei scheitern. Deswegen ist es wichtig, die Server, zu denen deine Folgenden gehören, zu überprüfen. Du kannst eine Option in den Einstellungen umschalten, um neue Folgenden manuell anzunehmen oder abzuweisen. <em>Bitte beachte, dass die Betreiber des Server und jedes empfangenden Servers solche Nachrichten anschauen könnten</em> und dass Empfänger von diesen eine Bildschirmkopie erstellen könnten, sie kopieren oder anderweitig weiterverteilen könnten. <em>Teile nicht irgendwelche sensiblen Informationen über Mastodon.</em></li>
+      <li><em>Internet Protocol-Adressen (IP-Adressen) und andere Metadaten</em>: Sobald du dich anmeldest, erfassen wir sowohl die IP-Adresse, von der aus du dich anmeldest, als auch den Namen deine Browseranwendung. Alle angemeldeten Sitzungen (Sessions) sind für deine Überprüfung und Widerruf in den Einstellungen verfügbar. Die letzte verwendete IP-Adresse wird bis zu 12 Monate lang gespeichert. Wir könnten auch Serverprotokoll behalten, welche die IP-Adresse von jeder Anfrage an unseren Server enthalten.</li>
+      </ul>
+      <hr class="spacer" />
+      <h3 id="use">Für was verwenden wir deine Informationen?</h3>
+      <p>Jede der von dir gesammelten Information kann in den folgenden Weisen verwendet werden:</p>
+      <ul>
+      <li>Um die Kernfunktionalität von Mastodon bereitzustellen. Du kannst du mit dem Inhalt anderer Leute interagieren und deine eigenen Inhalte beitragen, wenn du angemeldet bist. Zum Beispiel kannst du anderen folgen, um deren kombinierten Beiträge in deine personalisierten Start-Timeline zu sehen.</li>
+      <li>Um Moderation der Community zu ermöglichen, zum Beispiel beim Vergleichen deiner IP-Adresse mit anderen bekannten, um Verbotsumgehung oder andere Vergehen festzustellen.</li>
+      <li>Die E-Mail-Adresse, die du bereitstellst, kann dazu verwendet werden, dir Informationen, Benachrichtigungen über andere Leute, die mit deinen Inhalten interagieren oder dir Nachrichten senden, und auf Anfragen, Wünsche und/oder Fragen zu antworten.</li>
+      </ul>
+      <hr class="spacer" />
+      <h3 id="protect">Wie beschützen wir deine Informationen?</h3>
+      <p>Wir implementieren eine Reihe von Sicherheitsmaßnahmen, um die Sicherheit deiner persönlichen Information sicherzustellen, wenn du persönliche Informationen eingibst, übermittelst oder auf sie zugreifst. Neben anderen Dingen, wird sowohl deine Browsersitzung, als auch der Datenverkehr zwischen deinen Anwendungen und der Programmierschnittstelle (API) mit SSL gesichert, dein Passwort wird mit einem starken Einwegalgorithmus gehasht. Du kannst Zwei-Faktor-Authentifizierung aktivieren, um den Zugriff auf dein Konto zusätzlich abzusichern.</p>
+      <hr class="spacer" />
+      <h3 id="data-retention">Was ist unsere Datenspeicherungsrichtlinie?</h3>
+      <p>Wir werden mit bestem Wissen und Gewissen:</p>
+      <ul>
+      <li>Serverprotokolle, die IP-Adressen von allen deinen Anfragen an diesen Server, falls solche Protokolle behalten werden, für nicht mehr als 90 Tage behalten.</li>
+      <li>registrierten Benutzer zugeordnete IP-Adressen nicht länger als 12 Monate behalten.</li>
+      </ul>
+      <p>Du kannst ein Archiv deines Inhalts anfordern und herunterladen, inkludierend deiner Beiträge, Medienanhänge, Profilbilder und Headerbilder.</p>
+      <p>Es ist in den meisten Fällen möglich dein Konto jederzeit eigenmächtig unwiderruflich zu löschen.</p>
+      <hr class="spacer"/>
+      <h3 id="cookies">Verwenden wir Cookies?</h3>
+      <p>Ja. Cookies sind kleine Dateien, die eine Webseite oder ihr Serviceanbieter über deinen Webbrowser (sofern er es erlaubt) auf die Festplatte deines Computers überträgt. Diese Cookies ermöglichen es der Seite deinen Browser wiederzuerkennen und, sofern du ein registriertes Konto hast, diesen mit deinem registrierten Konto zu verknüpfen.</p>
+      <p>Wir verwenden Cookies, um deine Einstellungen zu verstehen und für zukünftige Besuche zu speichern.</p>
+      <hr class="spacer" />
+      <h3 id="disclose">Offenbaren wir Informationen an Dritte?</h3>
+      <p>Wir verkaufen nicht, handeln nicht mit oder übertragen deine persönlich identifizierbaren Informationen nicht an Dritte. Dies beinhaltet nicht Dritte, die vertrauenswürdig sind und uns beim Betreiben unserer Seite, Leiten unseres Geschäftes oder dabei, die Dienste für dich bereitzustellen, unterstützen, sofern diese Dritte zustimmen, diese Informationen vertraulich zu halten. Wir können auch Informationen freigeben, wenn wir glauben, dass Freigabe angemessen ist, um dem Gesetz zu entsprechen, unsere Seitenrichtlinien durchzusetzen oder unsere Rechte, Eigentum und/oder Sicherheit oder die anderer zu beschützen.</p>
+      <p>Dein öffentlicher Inhalt kann durch andere Server im Netzwerk heruntergeladen werden. Deine öffentlichen und "Nur Folgende"-Beiträge werden an die Server ausgeliefert, bei denen sich deine Folgenden befinden und direkte Nachrichten werden an die Server des Empfängers ausgeliefert, falls diese Folgenden oder Empfänger sich auf einem anderen Server als diesen befinden.</p>
+      <p>Wenn du eine Anwendung autorisierst, dein Konto zu benutzen, kann diese – abhängig von den von dir genehmigten Befugnissen – auf deine öffentlichen Profilinformationen, deine Folgt- und Folgende-Liste, deine Listen, alle deine Beiträge und deine Favoriten zugreifen. Anwendungen können nie auf deine E-Mail-Adresse oder dein Passwort zugreifen</p>
+      <hr class="spacer" />
+      <h3 id="children">Webseitenbenutzung durch Kinder</h3>
+      <p>Wenn sich dieser Server in der EU oder im Europäischen Wirtschaftsraum befindet: Unsere Website, Produkte und Dienstleistungen sind alle an Leute gerichtet, die mindestens 16 Jahre als sind. Wenn du unter 16 bist, darfst du nach den Bestimmungen der DSGVO (<a href="https://de.wikipedia.org/wiki/Datenschutz-Grundverordnung">Datenschutz-Grundverordnung</a>) diese Webseite nicht benutzen.</p>
+      <p>Wenn sich dieser Server in den USA befindet: Unsere Webseite, Produkte und Dienstleistungen sind alle an Leute gerichtet, die mindestens 13 Jahre alt sind. Wenn du unter 13 bist, darfst du nach den Bestimmungen des COPPA (<a href="https://de.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act, dt. "Gesetz zum Schutz der Privatsphäre von Kindern im Internet"</a>) diese Webseite nicht benutzen.</p>
+      <p>Gesetzesvorschriften können unterschiedlich sein, wenn sich dieser Server in anderer Gerichtsbarkeit befindet.</p>
+      <hr class="spacer" />
+      <h3 id="changes">Änderung an unserer Datenschutzerklärung</h3>
+      <p>Wenn wir uns entscheiden, Änderungen an unserer Datenschutzerklärung vorzunehmen, werden wir diese Änderungen auf dieser Seite bekannt gegeben.</p>
+      <p>Dies ist eine Übersetzung, Irrtümer und Übersetzungsfehler vorbehalten. Im Zweifelsfall gilt die englische Originalversion.</p>
+      <p>Dieses Dokument ist CC-BY-SA. Es wurde zuletzt aktualisiert am 26. Mai 2022.</p>
+      <p>Ursprünglich übernommen von der <a href="https://github.com/discourse/discourse">Discourse-Datenschutzerklärung</a>.</p>
     title: "%{instance} Nutzungsbedingungen und Datenschutzerklärung"
   themes:
     contrast: Mastodon (Hoher Kontrast)
diff --git a/config/locales/devise.fy.yml b/config/locales/devise.fy.yml
new file mode 100644
index 000000000..e96c4089d
--- /dev/null
+++ b/config/locales/devise.fy.yml
@@ -0,0 +1,7 @@
+---
+fy:
+  devise:
+    failure:
+      inactive: Jo account is not net aktivearre.
+    passwords:
+      updated_not_active: Jo wachtwurd is mei sukses feroare.
diff --git a/config/locales/doorkeeper.af.yml b/config/locales/doorkeeper.af.yml
index 252f9fd5a..ec1eda8bd 100644
--- a/config/locales/doorkeeper.af.yml
+++ b/config/locales/doorkeeper.af.yml
@@ -1 +1,164 @@
+---
 af:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Toepassing naam
+        redirect_uri: Herlei URI
+        scopes: Bestekke
+        website: Toepassing webtuiste
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: kan nie 'n vragment bevat nie.
+              invalid_uri: moet 'n geldige URI wees.
+              relative_uri: moet 'n absolute URI wees.
+              secured_uri: moet 'n HTTPS/SSL URI wees.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Magtig
+        cancel: Kanselleer
+        destroy: Vernietig
+        edit: Redigeer
+        submit: Dien in
+      confirmations:
+        destroy: Is jy seker?
+      edit:
+        title: Redigeer toepassing
+      form:
+        error: Oeps! Hersien jou vorm vir moontlike foute
+      help:
+        native_redirect_uri: Gebruik %{native_redirect_uri} vir plaaslike toetse
+        redirect_uri: Gebruik een lyn per URI
+        scopes: Verdeel omvang-grense met spasies. Los dit leeg om verstek omvange te gebruik.
+      index:
+        application: Toepassing
+        callback_url: Terugroep URL
+        delete: Wis uit
+        empty: Jy het geen toepassings nie.
+        name: Naam
+        new: Nuwe toepassing
+        scopes: Omvange
+        show: Vertoon
+        title: Jou toepassings
+      new:
+        title: Nuwe toepassing
+      show:
+        actions: Aksies
+        application_id: Kliënt sleutel
+        callback_urls: Terugroep URL'e
+        scopes: Omvange
+        secret: Kliënt geheim
+        title: 'Toepassing: %{name}'
+    authorizations:
+      buttons:
+        authorize: Magtig
+        deny: Weier
+      error:
+        title: "'n Fout het plaasgevind"
+      new:
+        prompt_html: "%{client_name} wil toegang hê tot jou rekening. Dit is a derde party toepassing. <strong>Indien jy dit nie vertrou nie, moet dit nie bemagtig word nie.</strong>"
+        review_permissions: Hersien toestemming
+        title: Benodig magtiging
+      show:
+        title: Kopieër hierdie magtigings kode en plaas dit in die toepassing.
+    authorized_applications:
+      buttons:
+        revoke: Herroep
+      confirmations:
+        revoke: Is jy seker?
+      index:
+        authorized_at: Bemagtig op %{date}
+        description_html: Hierdie is toepassings wat deur middel van die API toegang tot jou rekening kan verkry. As daar enige toepassings is wat jy nie herken nie, of 'n toepassing is wat wangedra, kan die bemagtiging herroep word.
+        last_used_at: Laas gebruik op %{date}
+        never_used: Noot gebruik nie
+        scopes: Magtiging
+        superapp: Intern
+        title: Jou gemagtigde toepassings
+    errors:
+      messages:
+        access_denied: Die hulpbron eienaar of magtigingsbediener het die aansoek afgekeur.
+        credential_flow_not_configured: Hulpbron Eienaar Wagwoord Geloofsbrewe vloei het gefaal omdat Doorkeeper.configure.resource_owner_from_credentials nie opgestel is nie.
+    flash:
+      applications:
+        create:
+          notice: Toepassing geskep.
+        destroy:
+          notice: Toepassing uitgewis.
+        update:
+          notice: Toepassing opdateer.
+      authorized_applications:
+        destroy:
+          notice: Toepassing herroep.
+    grouped_scopes:
+      access:
+        read: Slegs-lees toegang
+        read/write: Lees en skryf toegang
+        write: Slegs-skryf toegang
+      title:
+        accounts: Rekeninge
+        admin/accounts: Administrasie van rekeninge
+        admin/all: Alle administratiewe funksies
+        admin/reports: Administrasie van rapporteringe
+        all: Alles
+        blocks: Blokkeringe
+        bookmarks: Boekmerke
+        conversations: Gesprekke
+        crypto: End-tot-end enkripsie
+        favourites: Gunstelinge
+        filters: Filters
+        follow: Verhoudinge
+        lists: Lyste
+        media: Media aanhegsels
+        mutes: Dempinge
+        notifications: Kennisgewings
+        push: Stoot kennisgewings
+        reports: Rapporteringe
+        search: Soek
+        statuses: Plasings
+    layouts:
+      admin:
+        nav:
+          applications: Toepassings
+          oauth2_provider: OAuth2 Verskaffer
+      application:
+        title: Benodig OAuth bemagtiging
+    scopes:
+      admin:read: lees alle data op die bediener
+      admin:read:accounts: lees sensitiewe inligting vanaf alle rekeninge
+      admin:read:reports: lees sensitiewe inligting van alle verslae end aangeklaagde rekeninge
+      admin:write: verander alle data op die bediener
+      admin:write:accounts: voer modereer aksies uit op rekeninge
+      admin:write:reports: voer modereer aksies uit op verslae
+      crypto: gebruik end-tot-end enkripsie
+      follow: verander rekening verhoudinge
+      push: ontvang jou stootkennisgewings
+      read: lees die data van al jou rekeninge
+      read:accounts: sien rekening inligting
+      read:blocks: sien blokeringe
+      read:bookmarks: sien jou boekmerke
+      read:favourites: sien jou gunstelinge
+      read:filters: sien jou filters
+      read:lists: sien jou lyste
+      read:mutes: sien jou stilmake
+      read:notifications: sien jou kennisgewinge
+      read:reports: sien jou rapporteringe
+      read:search: soek namens jou
+      read:statuses: sien alle plasings
+      write: verander alle data van jou rekening
+      write:accounts: verander jou profiel
+      write:blocks: blokeer rekeninge en domeine
+      write:bookmarks: boekmerk plasings
+      write:conversations: demp en wis gesprekke uit
+      write:favourites: merk gunsteling plasings
+      write:filters: skep filters
+      write:follows: volg mense
+      write:lists: skep lyste
+      write:media: laai meda lêers op
+      write:mutes: demp mense en gesprekke
+      write:notifications: maak jou kennisgewings skoon
+      write:reports: rapporteer ander mense
+      write:statuses: publiseer plasings
diff --git a/config/locales/doorkeeper.fy.yml b/config/locales/doorkeeper.fy.yml
new file mode 100644
index 000000000..385274868
--- /dev/null
+++ b/config/locales/doorkeeper.fy.yml
@@ -0,0 +1,23 @@
+---
+fy:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Namme fan applikaasje
+        website: Webstee fan applikaasje
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: mei gjin fragmint befetsje.
+              invalid_uri: moat in jildige URI wêze.
+              relative_uri: moat in absolute URI wêze.
+              secured_uri: moat in HTTPS/SSL URI wêze.
+  doorkeeper:
+    grouped_scopes:
+      title:
+        conversations: Petearen
+    scopes:
+      write:conversations: petearen negearre en fuortsmite
+      write:mutes: minsken en petearen negearre
diff --git a/config/locales/doorkeeper.pt-BR.yml b/config/locales/doorkeeper.pt-BR.yml
index 684b993ab..0a0b6b1be 100644
--- a/config/locales/doorkeeper.pt-BR.yml
+++ b/config/locales/doorkeeper.pt-BR.yml
@@ -60,7 +60,8 @@ pt-BR:
       error:
         title: Ocorreu um erro
       new:
-        review_permissions: Analisar permissões
+        prompt_html: O %{client_name} gostaria de ter permissão para acessar sua conta. É uma aplicação de terceiros. <strong>Se você não confia, então você não deve autorizá-lo.</strong>
+        review_permissions: Revisar permissões
         title: Autorização necessária
       show:
         title: Copie este código de autorização e cole no aplicativo.
@@ -71,6 +72,8 @@ pt-BR:
         revoke: Você tem certeza?
       index:
         authorized_at: Autorizado em %{date}
+        description_html: Estas são as aplicações que podem acessar sua conta usando a API. Se houver aplicativos que você não reconhece ou com mau funcionamento, você pode revogar seu acesso.
+        last_used_at: Última vez usado em %{date}
         never_used: Nunca usado
         scopes: Permissões
         superapp: Interno
@@ -110,16 +113,23 @@ pt-BR:
         destroy:
           notice: Aplicativo revogado.
     grouped_scopes:
+      access:
+        read: Acesso somente para leitura
+        read/write: Acesso de leitura e escrita
+        write: Acesso somente para escrita
       title:
         accounts: Contas
+        admin/accounts: Administração de contas
+        admin/all: Todas as funções administrativas
+        admin/reports: Administração de relatórios
         all: Tudo
-        blocks: Blocos
+        blocks: Bloqueios
         bookmarks: Salvos
         conversations: Conversas
         crypto: Criptografia de ponta a ponta
         favourites: Favoritos
         filters: Filtros
-        follow: Relações
+        follow: Relacionamentos
         lists: Listas
         media: Mídias anexadas
         notifications: Notificações
@@ -161,6 +171,7 @@ pt-BR:
       write:accounts: alterar seu perfil
       write:blocks: bloquear contas e domínios
       write:bookmarks: salvar toots
+      write:conversations: silenciar e excluir conversas
       write:favourites: favoritar toots
       write:filters: criar filtros
       write:follows: seguir pessoas
diff --git a/config/locales/doorkeeper.ru.yml b/config/locales/doorkeeper.ru.yml
index ff0e48720..7f4cca82b 100644
--- a/config/locales/doorkeeper.ru.yml
+++ b/config/locales/doorkeeper.ru.yml
@@ -76,6 +76,7 @@ ru:
         last_used_at: Последнее использование %{date}
         never_used: Не использовалось
         scopes: Разрешения
+        superapp: Внутреннее
         title: Ваши авторизованные приложения
     errors:
       messages:
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 47f7097e8..96ec15247 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -36,7 +36,7 @@ el:
       one: δημοσίευση
       other: δημοσιεύσεις
     status_count_before: Που έγραψαν
-    tagline: Ακολούθησε τους γνωστούς σου και ανακάλυψε νέους ανθρώπους
+    tagline: Αποκεντρωμένο κοινωνικό δίκτυο
     terms: Όροι χρήσης
     unavailable_content: Μη διαθέσιμο
     unavailable_content_description:
@@ -340,6 +340,7 @@ el:
       destroyed_msg: Ο αποκλεισμός τομέα άρθηκε
       domain: Τομέας
       edit: Διαχείρηση αποκλεισμένου τομέα
+      existing_domain_block: Έχετε ήδη επιβάλει αυστηρότερα όρια στο %{name}.
       existing_domain_block_html: Έχεις ήδη επιβάλλει αυστηρότερους περιορισμούς στο %{name}, πρώτα θα πρέπει να τους <a href="%{unblock_url}">αναιρέσεις</a>.
       new:
         create: Δημιουργία αποκλεισμού
@@ -617,6 +618,12 @@ el:
       edit_preset: Ενημέρωση προκαθορισμένης προειδοποίησης
       empty: Δεν έχετε ακόμη ορίσει κάποια προεπιλογή προειδοποίησης.
       title: Διαχείριση προκαθορισμένων προειδοποιήσεων
+    webhooks:
+      delete: Διαγραφή
+      disable: Απενεργοποίηση
+      disabled: Απενεργοποιημένα
+      enable: Ενεργοποίηση
+      status: Κατάσταση
   admin_mailer:
     new_appeal:
       actions:
@@ -657,7 +664,6 @@ el:
   applications:
     created: Η εφαρμογή δημιουργήθηκε επιτυχώς
     destroyed: Η εφαρμογή διαγράφηκε επιτυχώς
-    invalid_url: Το URL δεν είναι έγκυρο
     regenerate_token: Αναδημιουργία του διακριτικού πρόσβασης (access token)
     token_regenerated: Το διακριτικό πρόσβασης (access token) αναδημιουργήθηκε επιτυχώς
     warning: Μεγάλη προσοχή με αυτά τα στοιχεία. Μην τα μοιραστείς ποτέ με κανέναν!
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 6bb0cc7ab..cedcc9361 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -38,7 +38,7 @@ en:
       one: post
       other: posts
     status_count_before: Who published
-    tagline: Follow friends and discover new ones
+    tagline: Decentralized social network
     terms: Terms of service
     unavailable_content: Moderated servers
     unavailable_content_description:
@@ -852,6 +852,26 @@ en:
       edit_preset: Edit warning preset
       empty: You haven't defined any warning presets yet.
       title: Manage warning presets
+    webhooks:
+      add_new: Add endpoint
+      delete: Delete
+      description_html: A <strong>webhook</strong> enables Mastodon to push <strong>real-time notifications</strong> about chosen events to your own application, so your application can <strong>automatically trigger reactions</strong>.
+      disable: Disable
+      disabled: Disabled
+      edit: Edit endpoint
+      empty: You don't have any webhook endpoints configured yet.
+      enable: Enable
+      enabled: Active
+      enabled_events:
+        one: 1 enabled event
+        other: "%{count} enabled events"
+      events: Events
+      new: New webhook
+      rotate_secret: Rotate secret
+      secret: Signing secret
+      status: Status
+      title: Webhooks
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -916,7 +936,6 @@ en:
   applications:
     created: Application successfully created
     destroyed: Application successfully deleted
-    invalid_url: The provided URL is invalid
     regenerate_token: Regenerate access token
     token_regenerated: Access token successfully regenerated
     warning: Be very careful with this data. Never share it with anyone!
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index babbce7da..d287fb590 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -36,9 +36,8 @@ eo:
       one: mesaĝo
       other: mesaĝoj
     status_count_before: Kie skribiĝis
-    tagline: Sekvi amikojn kaj trovi iujn novajn
     terms: Uzkondiĉoj
-    unavailable_content: Kontrolitaj serviloj
+    unavailable_content: Moderigitaj serviloj
     unavailable_content_description:
       domain: Servilo
       reason: 'Kialo:'
@@ -86,8 +85,8 @@ eo:
       title: Plenumi kontrolan agon al %{acct}
     account_moderation_notes:
       create: Lasi noton
-      created_msg: Kontrola noto sukcese kreita!
-      destroyed_msg: Kontrola noto sukcese detruita!
+      created_msg: Noto de mederigado sukcese kreita!
+      destroyed_msg: Noto de moderigado sukcese detruita!
     accounts:
       add_email_domain_block: Bloki retadresan domajnon
       approve: Aprobi
@@ -140,8 +139,8 @@ eo:
         all: Ĉio
         pending: Pritraktata
         suspended: Haltigita
-        title: Kontrolado
-      moderation_notes: Kontrolaj notoj
+        title: Moderigado
+      moderation_notes: Notoj de moderigado
       most_recent_activity: Lasta ago
       most_recent_ip: Lasta IP
       no_account_selected: Neniu konto estis ŝanĝita ĉar neniu estis selektita
@@ -167,7 +166,7 @@ eo:
       role: Permesoj
       roles:
         admin: Administranto
-        moderator: Kontrolanto
+        moderator: Moderigisto
         staff: Teamo
         user: Uzanto
       search: Serĉi
@@ -416,7 +415,7 @@ eo:
       moderation:
         all: Ĉiuj
         limited: Limigita
-        title: Kontrolo
+        title: Moderigado
       private_comment: Privata komento
       public_comment: Publika komento
       purge: Purigu
@@ -697,7 +696,6 @@ eo:
   applications:
     created: Aplikaĵo sukcese kreita
     destroyed: Aplikaĵo sukcese forigita
-    invalid_url: La URL donita ne estas valida
     regenerate_token: Rekrei aliran ĵetonon
     token_regenerated: Alira ĵetono sukcese rekreita
     warning: Estu tre atenta kun ĉi tiu datumo. Neniam diskonigu ĝin al iu ajn!
@@ -950,7 +948,7 @@ eo:
       only_redirect_html: Alie, vi povas <a href="%{path}">nur aldoni alidirekton en via profilo</a>.
       other_data: Neniu alia datumo estos movita aŭtomate
   moderation:
-    title: Kontrolado
+    title: Moderigado
   notification_mailer:
     digest:
       action: Vidi ĉiujn sciigojn
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index b01f983b0..79ae68bf4 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -38,7 +38,7 @@ es-AR:
       one: mensaje
       other: mensajes
     status_count_before: Que enviaron
-    tagline: Seguí a tus amigos y descubrí nueva gente
+    tagline: Red social descentralizada
     terms: Términos del servicio
     unavailable_content: Servidores moderados
     unavailable_content_description:
@@ -428,6 +428,7 @@ es-AR:
       destroyed_msg: Se deshizo el bloqueo de dominio
       domain: Dominio
       edit: Editar bloqueo de dominio
+      existing_domain_block: Ya impusiste límites más estrictos a %{name}.
       existing_domain_block_html: Ya le aplicaste límites más estrictos a %{name}, por lo que primero necesitás <a href="%{unblock_url}">desbloquearlo</a>.
       new:
         create: Crear bloqueo
@@ -851,6 +852,26 @@ es-AR:
       edit_preset: Editar preajuste de advertencia
       empty: Aún no ha definido ningún preajuste de advertencia.
       title: Administrar preajustes de advertencia
+    webhooks:
+      add_new: Agregar punto final
+      delete: Eliminar
+      description_html: Un <strong>webhook</strong> habilita a Mastodon a enviar <strong>notificaciones en tiempo real</strong> sobre los eventos elegidos a tu propia aplicación, así la misma puede <strong>activar automáticamente las reacciones</strong>.
+      disable: Deshabilitar
+      disabled: Deshabilitada
+      edit: Editar punto final
+      empty: Todavía no tenés configurado ningún punto final de webhook.
+      enable: Habilitar
+      enabled: Activar
+      enabled_events:
+        one: 1 evento habilitado
+        other: "%{count} eventos habilitados"
+      events: Eventos
+      new: Nuevo webhook
+      rotate_secret: Rotar secreto
+      secret: Firma secreta
+      status: Estado
+      title: Webhooks
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -915,7 +936,6 @@ es-AR:
   applications:
     created: Aplicación creada exitosamente
     destroyed: Aplicación eliminada exitosamente
-    invalid_url: La dirección web ofrecida no es válida
     regenerate_token: Regenerar clave de acceso
     token_regenerated: Clave de acceso regenerada exitosamente
     warning: Ojo con estos datos. ¡Nunca los compartas con nadie!
diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml
index f396d6138..f57fb9601 100644
--- a/config/locales/es-MX.yml
+++ b/config/locales/es-MX.yml
@@ -38,7 +38,7 @@ es-MX:
       one: estado
       other: estados
     status_count_before: Qué han escrito
-    tagline: Seguir a amigos existentes y descubre nuevos
+    tagline: Red social descentralizada
     terms: Condiciones de servicio
     unavailable_content: Contenido no disponible
     unavailable_content_description:
@@ -428,6 +428,7 @@ es-MX:
       destroyed_msg: El bloque de dominio se deshizo
       domain: Dominio
       edit: Editar nuevo dominio bloqueado
+      existing_domain_block: Ya ha impuesto límites más estrictos a %{name}.
       existing_domain_block_html: Ya ha impuesto límites más estrictos a %{name}, necesita <a href="%{unblock_url}">desbloquearlo primero</a>.
       new:
         create: Crear bloque
@@ -915,7 +916,6 @@ es-MX:
   applications:
     created: Aplicación creada exitosamente
     destroyed: Apicación eliminada exitosamente
-    invalid_url: La URL proporcionada es incorrecta
     regenerate_token: Regenerar token de acceso
     token_regenerated: Token de acceso regenerado exitosamente
     warning: Ten mucho cuidado con estos datos. ¡No los compartas con nadie!
@@ -1525,6 +1525,54 @@ es-MX:
   tags:
     does_not_match_previous_name: no coincide con el nombre anterior
   terms:
+    body_html: |
+      <h2>Política de Privacidad</h2>
+            <h3 id="collect">¿Qué información recogemos?</h3>
+            <ul>
+            <li><em>Información básica sobre su cuenta</em>: Si se registra en este servidor, se le requerirá un nombre de usuario, una dirección de correo electrónico y una contraseña. Además puede incluir información adicional en el perfil como un nombre de perfil y una biografía, y subir una foto de perfil y una imagen de cabecera. El nombre de usuario, nombre de perfil, biografía, foto de perfil e imagen de cabecera siempre son visibles públicamente</li>
+            <li><em>Publicaciones, seguimiento y otra información pública</em>: La lista de gente a la que sigue es mostrada públicamente, al igual que sus seguidores. Cuando publica un mensaje, la fecha y hora es almacenada, así como la aplicación desde la cual publicó el mensaje. Los mensajes pueden contener archivos adjuntos multimedia, como imágenes y vídeos. Las publicaciones públicas y no listadas están disponibles públicamente. Cuando destaca una entrada en su perfil, también es información disponible públicamente. Sus publicaciones son entregadas a sus seguidores, en algunos casos significa que son entregadas a diferentes servidores y las copias son almacenadas allí. Cuando elimina publicaciones, esto también se transfiere a sus seguidores. La acción de rebloguear o marcar como favorito otra publicación es siempre pública.</li>
+            <li><em>Publicaciones directas y sólo para seguidores</em>: Todos los mensajes se almacenan y procesan en el servidor. Los mensajes sólo para seguidores se entregan a los seguidores y usuarios que se mencionan en ellos, y los mensajes directos se entregan sólo a los usuarios que se mencionan en ellos. En algunos casos significa que se entregan a diferentes servidores y que las copias se almacenan allí. Hacemos un esfuerzo de buena fe para limitar el acceso a esas publicaciones sólo a las personas autorizadas, pero otros servidores pueden no hacerlo. Por lo tanto, es importante revisar los servidores a los que pertenecen sus seguidores. Puede cambiar una opción para aprobar y rechazar nuevos seguidores manualmente en la configuración <em>Por favor, tenga en cuenta que los operadores del servidor y de cualquier servidor receptor pueden ver dichos mensajes</em>, y que los destinatarios pueden capturarlos, copiarlos o volver a compartirlos de alguna otra manera. <em>No comparta ninguna información sensible en Mastodon.</em></li>
+            <li><em>Direcciones IP y otros metadatos</em>: Al iniciar sesión, registramos la dirección IP desde la que se ha iniciado sesión, así como el nombre de la aplicación de su navegador. Todas las sesiones iniciadas están disponibles para su revisión y revocación en los ajustes. La última dirección IP utilizada se almacena hasta 12 meses. También podemos conservar los registros del servidor que incluyen la dirección IP de cada solicitud a nuestro servidor.</li>
+            </ul>
+            <hr class="spacer" />
+            <h3 id="use">¿Para qué utilizamos su información?</h3>
+            <p>Toda la información que obtenemos de usted puede ser utilizada de las siguientes maneras:</p>
+            <ul>
+            <li>Para proporcionar la funcionalidad principal de Mastodon. Sólo puedes interactuar con el contenido de otras personas y publicar tu propio contenido cuando estés conectado. Por ejemplo, puedes seguir a otras personas para ver sus mensajes combinados en tu propia línea de tiempo personalizada.</li>
+            <li>Para ayudar a la moderación de la comunidad, por ejemplo, comparando su dirección IP con otras conocidas para determinar la evasión de prohibiciones u otras violaciones.</li>
+            <li>La dirección de correo electrónico que nos proporcione podrá utilizarse para enviarle información, notificaciones sobre otras personas que interactúen con su contenido o para enviarle mensajes, así como para responder a consultas y/u otras solicitudes o preguntas.</li>
+            </ul>
+            <hr class="spacer" />
+            <h3 id="protect">¿Cómo protegemos su información?</h3>
+            <p>Implementamos una variedad de medidas de seguridad para mantener la seguridad de su información personal cuando usted ingresa, envía o accede a su información personal. Entre otras cosas, la sesión de su navegador, así como el tráfico entre sus aplicaciones y la API, están protegidos con SSL, y su contraseña está protegida mediante un algoritmo unidireccional fuerte. Puede habilitar la autenticación de dos factores para un acceso más seguro a su cuenta.</p>
+            <hr class="spacer" />
+            <h3 id="data-retention">¿Cuál es nuestra política de retención de datos?</h3>
+            <p>Haremos un esfuerzo de buena fe para:</p>
+            <ul>
+            <li>Conservar los registros del servidor que contengan la dirección IP de todas las peticiones a este servidor, en la medida en que se mantengan dichos registros, no más de 90 días.</li>
+            <li>Conservar las direcciones IP asociadas a los usuarios registrados no más de 12 meses.</li>
+            </ul>
+            <p>Puede solicitar y descargar un archivo de su contenido, incluidos sus mensajes, archivos adjuntos multimedia, foto de perfil e imagen de cabecera.</p>
+            <p>Usted puede borrar su cuenta de forma irreversible en cualquier momento.</p>
+            <hr class="spacer"/>
+            <h3 id="cookies">¿Utilizamos cookies?</h3>
+            <p>Sí. Las cookies son pequeños archivos que un sitio o su proveedor de servicios transfiere al disco duro de su ordenador a través de su navegador web (si usted lo permite). Estas cookies permiten al sitio reconocer su navegador y, si tiene una cuenta registrada, asociarla con su cuenta registrada.</p>
+            <p>Utilizamos cookies para entender y guardar sus preferencias para futuras visitas.</p>
+            <hr class="spacer" />
+            <h3 id="disclose">¿Revelamos alguna información a terceros?</h3>
+            <p>No vendemos, comerciamos ni transferimos a terceros su información personal identificable. Esto no incluye a los terceros de confianza que nos asisten en la operación de nuestro sitio, en la realización de nuestros negocios o en la prestación de servicios, siempre y cuando dichas partes acuerden mantener la confidencialidad de esta información. También podemos divulgar su información cuando creamos que es apropiado para cumplir con la ley, hacer cumplir las políticas de nuestro sitio, o proteger nuestros u otros derechos, propiedad o seguridad.</p>
+            <p>Su contenido público puede ser descargado por otros servidores de la red. Tus mensajes públicos y sólo para seguidores se envían a los servidores donde residen tus seguidores, y los mensajes directos se envían a los servidores de los destinatarios, en la medida en que dichos seguidores o destinatarios residan en un servidor diferente.</p>
+            <p>Cuando usted autoriza a una aplicación a usar su cuenta, dependiendo del alcance de los permisos que usted apruebe, puede acceder a la información de su perfil público, su lista de seguimiento, sus seguidores, sus listas, todos sus mensajes y sus favoritos. Las aplicaciones nunca podrán acceder a su dirección de correo electrónico o contraseña.</p>
+            <hr class="spacer" />
+            <h3 id="children">Uso del sitio por parte de los niños</h3>
+            <p>Si este servidor está en la UE o en el EEE: Nuestro sitio, productos y servicios están dirigidos a personas mayores de 16 años. Si es menor de 16 años, según los requisitos de la GDPR (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation_Data_Protection_Regulation">General Data Protection Regulation</a>) no utilice este sitio.</p>
+            <p>Si este servidor está en los EE.UU.: Nuestro sitio, productos y servicios están todos dirigidos a personas que tienen al menos 13 años de edad. Si usted es menor de 13 años, según los requisitos de COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) no utilice este sitio.</p>
+            <p>Los requisitos legales pueden ser diferentes si este servidor está en otra jurisdicción.</p>
+            <hr class="spacer" />
+            <h3 id="changes">Cambios en nuestra Política de Privacidad</h3>
+            <p>Si decidimos cambiar nuestra política de privacidad, publicaremos esos cambios en esta página.</p>
+            <p>Este documento es CC-BY-SA. Fue actualizado por última vez el 26 de mayo de 2022.</p>
+            <p>Adaptado originalmente desde <a href="https://github.com/discourse/discourse">la política de privacidad de Discourse</a>.</p>
     title: Términos del Servicio y Políticas de Privacidad de %{instance}
   themes:
     contrast: Alto contraste
diff --git a/config/locales/es.yml b/config/locales/es.yml
index fcab7856a..96d985f53 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -38,7 +38,7 @@ es:
       one: estado
       other: estados
     status_count_before: Qué han escrito
-    tagline: Seguir a amigos existentes y descubre nuevos
+    tagline: Red social descentralizada
     terms: Condiciones de servicio
     unavailable_content: Contenido no disponible
     unavailable_content_description:
@@ -428,6 +428,7 @@ es:
       destroyed_msg: El bloque de dominio se deshizo
       domain: Dominio
       edit: Editar nuevo dominio bloqueado
+      existing_domain_block: Ya impusiste límites más estrictos a %{name}.
       existing_domain_block_html: Ya ha impuesto límites más estrictos a %{name}, necesita <a href="%{unblock_url}">desbloquearlo primero</a>.
       new:
         create: Crear bloque
@@ -851,6 +852,26 @@ es:
       edit_preset: Editar aviso predeterminado
       empty: Aún no has definido ningún preajuste de advertencia.
       title: Editar configuración predeterminada de avisos
+    webhooks:
+      add_new: Añadir endpoint
+      delete: Eliminar
+      description_html: Un <strong>webhook</strong> permite a Mastodon enviar <strong>notificaciones en tiempo real</strong> sobre los eventos elegidos a tu propia aplicación, para que tu aplicación pueda <strong>lanzar reacciones automáticamente</strong>.
+      disable: Deshabilitar
+      disabled: Deshabilitado
+      edit: Editar endpoint
+      empty: Aún no tienes ningún endpoint de webhook configurado.
+      enable: Habilitar
+      enabled: Activo
+      enabled_events:
+        one: 1 evento habilitado
+        other: "%{count} eventos habilitados"
+      events: Eventos
+      new: Nuevo webhook
+      rotate_secret: Rotar secreto
+      secret: Firmando secreto
+      status: Estado
+      title: Webhooks
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -915,7 +936,6 @@ es:
   applications:
     created: Aplicación creada exitosamente
     destroyed: Apicación eliminada exitosamente
-    invalid_url: La URL proporcionada es incorrecta
     regenerate_token: Regenerar token de acceso
     token_regenerated: Token de acceso regenerado exitosamente
     warning: Ten mucho cuidado con estos datos. ¡No los compartas con nadie!
diff --git a/config/locales/et.yml b/config/locales/et.yml
index 3c48bad5b..a551ab424 100644
--- a/config/locales/et.yml
+++ b/config/locales/et.yml
@@ -35,7 +35,6 @@ et:
       one: postitust
       other: staatuseid
     status_count_before: Kes on avaldanud
-    tagline: Jälgi sõpru ja leia uusi
     terms: Kasutustingimused
     unavailable_content: Sisu pole saadaval
     unavailable_content_description:
@@ -540,7 +539,6 @@ et:
   applications:
     created: Rakenduse loomine õnnestus
     destroyed: Rakenduse kustutamine õnnestus
-    invalid_url: Antud URL on vale
     regenerate_token: Loo uus access token
     token_regenerated: Access tokeni loomine õnnestus
     warning: Olge nende andmetega ettevaatlikud. Ärge jagage neid kellegagi!
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 096dd276b..a71cd186d 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -36,7 +36,6 @@ eu:
       one: bidalketa
       other: bidalketa
     status_count_before: Hauek
-    tagline: Jarraitu lagunak eta egin berriak
     terms: Erabilera baldintzak
     unavailable_content: Eduki eskuraezina
     unavailable_content_description:
@@ -855,7 +854,6 @@ eu:
   applications:
     created: Aplikazioa ongi sortu da
     destroyed: Aplikazioa ongi ezabatu da
-    invalid_url: Emandako URL-a baliogabea da
     regenerate_token: Birsortu sarbide token-a
     token_regenerated: Sarbide token-a ongi birsortu da
     warning: Kontuz datu hauekin, ez partekatu inoiz inorekin!
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 1c7b9f9cc..93b766859 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -38,7 +38,6 @@ fa:
       one: چیز نوشته‌اند
       other: چیز نوشته‌اند
     status_count_before: که در کنار هم
-    tagline: با دوستان خود در ارتباط باشید و دوستان تازه پیدا کنید
     terms: شرایط خدمت
     unavailable_content: محتوای ناموجود
     unavailable_content_description:
@@ -813,7 +812,6 @@ fa:
   applications:
     created: برنامه با موفقیت ساخته شد
     destroyed: برنامه با موفقیت پاک شد
-    invalid_url: نشانی واردشده معتبر نیست
     regenerate_token: دوباره‌سازی کد دسترسی
     token_regenerated: کد دسترسی با موفقیت ساخته شد
     warning: خیلی مواظب این اطلاعات باشید و آن را به هیچ کس ندهید!
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 55e2332cf..ff369f2fe 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -38,7 +38,6 @@ fi:
       one: julkaisun
       other: julkaisua
     status_count_before: Julkaistu
-    tagline: Seuraa ja löydä uusia kavereita
     terms: Käyttöehdot
     unavailable_content: Moderoidut palvelimet
     unavailable_content_description:
@@ -860,7 +859,6 @@ fi:
   applications:
     created: Sovelluksen luonti onnistui
     destroyed: Sovelluksen poisto onnistui
-    invalid_url: Annettu URL on virheellinen
     regenerate_token: Luo pääsytunnus uudelleen
     token_regenerated: Pääsytunnuksen uudelleenluonti onnistui
     warning: Säilytä tietoa hyvin. Älä milloinkaan jaa sitä muille!
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 109fd6849..5f74972f9 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -37,8 +37,8 @@ fr:
     status_count_after:
       one: message
       other: messages
-    status_count_before: Qui a publié
-    tagline: Suivez vos ami·e·s et découvrez-en de nouveaux·elles
+    status_count_before: Ayant publié
+    tagline: Réseau social décentralisé
     terms: Conditions d’utilisation
     unavailable_content: Serveurs modérés
     unavailable_content_description:
@@ -428,6 +428,7 @@ fr:
       destroyed_msg: Le blocage de domaine a été désactivé
       domain: Domaine
       edit: Modifier le blocage de domaine
+      existing_domain_block: Vous avez déjà imposé des limites plus strictes à %{name}.
       existing_domain_block_html: Vous avez déjà imposé des limites plus strictes à %{name}, vous devez d’abord le/la <a href="%{unblock_url}">débloquer</a>.
       new:
         create: Créer le blocage
@@ -851,6 +852,25 @@ fr:
       edit_preset: Éditer les avertissements prédéfinis
       empty: Vous n'avez pas encore créé de paramètres prédéfinis pour les avertissements.
       title: Gérer les avertissements prédéfinis
+    webhooks:
+      add_new: Ajouter un point de terminaison
+      delete: Supprimer
+      description_html: Un <strong>point d'ancrage web</strong> permet à Mastodon d'envoyer des <strong>notifications en temps réel</strong> concernant des événements sélectionnés vers votre propre application, afin que celle-ci puisse <strong>déclencher automatiquement des réactions</strong>.
+      disable: Désactiver
+      disabled: Désactivé
+      edit: Modifier le point de terminaison
+      empty: Pour l'instant, vous n'avez configuré aucun lien d'ancrage web pour point de terminaison.
+      enable: Activer
+      enabled: Actif
+      enabled_events:
+        one: 1 événement activé
+        other: "%{count} événements activés"
+      events: Événements
+      new: Nouveau point d’ancrage web
+      rotate_secret: Effectuer une rotation du secret
+      status: État
+      title: Points d’ancrage web
+      webhook: Point d’ancrage web
   admin_mailer:
     new_appeal:
       actions:
@@ -915,7 +935,6 @@ fr:
   applications:
     created: Application créée avec succès
     destroyed: Application supprimée avec succès
-    invalid_url: L’URL fournie est invalide
     regenerate_token: Régénérer le jeton d’accès
     token_regenerated: Jeton d’accès régénéré avec succès
     warning: Soyez prudent·e avec ces données. Ne les partagez pas !
@@ -1519,6 +1538,9 @@ fr:
     pinned: Message épinglé
     reblogged: a partagé
     sensitive_content: Contenu sensible
+  strikes:
+    errors:
+      too_late: Il est trop tard pour faire appel à cette sanction
   tags:
     does_not_match_previous_name: ne correspond pas au nom précédent
   terms:
diff --git a/config/locales/fy.yml b/config/locales/fy.yml
new file mode 100644
index 000000000..fa727d6fe
--- /dev/null
+++ b/config/locales/fy.yml
@@ -0,0 +1,54 @@
+---
+fy:
+  about:
+    active_count_after: warber
+    active_footnote: Moanliks Warbere Brûkers (MWB)
+  accounts:
+    last_active: letst warber
+  admin:
+    accounts:
+      moderation:
+        active: Aktyf
+      security_measures:
+        only_password: Allinnich wachtwurd
+        password_and_2fa: Wachtwurd en 2FA
+    dashboard:
+      active_users: warbere brûkers
+      top_languages: Meast aktive talen
+      top_servers: Meast aktive tsjinners
+    instances:
+      confirm_purge: Wolle jo werklik alle gegevens fan dit domein foar ivich fuortsmite?
+      dashboard:
+        instance_accounts_measure: bewarre accounts
+    system_checks:
+      database_schema_check:
+        message_html: Der binne database migraasjes yn ôfwachting. Jo moatte dizze útfiere om der foar te soargjen dat de applikaasje wurkjen bliuwt sa as it heard
+  errors:
+    '400': The request you submitted was invalid or malformed.
+    '403': You don't have permission to view this page.
+    '404': The page you are looking for isn't here.
+    '406': This page is not available in the requested format.
+    '410': The page you were looking for doesn't exist here anymore.
+    '422': 
+    '429': Too many requests
+    '500': 
+    '503': The page could not be served due to a temporary server failure.
+  filters:
+    contexts:
+      thread: Petearen
+  notification_mailer:
+    digest:
+      mention: "%{name} hat jo fermeld yn:"
+    mention:
+      action: Beäntwurdzje
+      body: 'Jo binne fermeld troch %{name} yn:'
+      subject: Jo binne fermeld troch %{name}
+      title: Nije fermelding
+  relationships:
+    last_active: Letst warber
+  rss:
+    content_warning: 'Ynhâldswarskôging:'
+  statuses:
+    content_warning: 'Ynhâldswarskôging: %{warning}'
+    pin_errors:
+      direct: Berjochten dy allinnich sichtber binne foar fermelde brûkers kinne net fêstset wurde
diff --git a/config/locales/gd.yml b/config/locales/gd.yml
index 931cea4fb..387ba6c2a 100644
--- a/config/locales/gd.yml
+++ b/config/locales/gd.yml
@@ -40,7 +40,6 @@ gd:
       other: post
       two: phost
     status_count_before: A dh’fhoillsich
-    tagline: Lean air caraidean ’s rùraich feadhainn ùra
     terms: Teirmichean na seirbheise
     unavailable_content: Frithealaichean fo mhaorsainneachd
     unavailable_content_description:
@@ -446,6 +445,7 @@ gd:
       destroyed_msg: Chan eil an àrainn ’ga bacadh tuilleadh
       domain: Àrainn
       edit: Deasaich bacadh na h-àrainne
+      existing_domain_block: Chuir thu cuingeachaidhean nas teinne air %{name} mu thràth.
       existing_domain_block_html: Chuir thu cuingeachadh nas teinne air %{name} mu thràth, feumaidh tu a <a href="%{unblock_url}">dì-bhacadh</a> an toiseach.
       new:
         create: Cruthaich bacadh
@@ -949,7 +949,6 @@ gd:
   applications:
     created: Chaidh an t-iarrtas a chruthachadh
     destroyed: Chaidh an t-iarrtas a sguabadh às
-    invalid_url: Tha an t-URL a thugadh seachad mì-dhligheach
     regenerate_token: Ath-ghin an tòcan inntrigidh
     token_regenerated: Chaidh an tòcan inntrigidh ath-ghintinn
     warning: Bi glè chùramach leis an dàta seo. Na co-roinn le duine sam bith e!
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index ba3084f90..5b303b08f 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -11,8 +11,8 @@ gl:
     apps: Aplicacións móbiles
     apps_platforms: Emprega Mastodon dende iOS, Android e outras plataformas
     browse_directory: Mira o directorio e filtra por intereses
-    browse_local_posts: Navega polas publicacións públicas deste servidor en tempo real
-    browse_public_posts: Navega polas publicacións públicas de Mastodon en tempo real
+    browse_local_posts: Unha ollada aos últimos comentarios públicos neste servidor
+    browse_public_posts: Cronoloxía en directo cos comentarios públicos en Mastodon
     contact: Contacto
     contact_missing: Non establecido
     contact_unavailable: Non dispoñíbel
@@ -31,14 +31,14 @@ gl:
     privacy_policy: Política de privacidade
     rules: Regras do servidor
     rules_html: 'Aquí tes un resumo das regras que debes seguir se queres ter unha conta neste servidor de Mastodon:'
-    see_whats_happening: Ver o que está a acontecer
+    see_whats_happening: Mira o que acontece
     server_stats: 'Estatísticas do servidor:'
     source_code: Código fonte
     status_count_after:
       one: publicación
       other: publicacións
     status_count_before: Que publicaron
-    tagline: Segue ás túas amizades e coñece novas
+    tagline: Rede social descentralizada
     terms: Termos do servizo
     unavailable_content: Contido non dispoñíbel
     unavailable_content_description:
@@ -428,6 +428,7 @@ gl:
       destroyed_msg: Desfíxose o bloqueo de dominio
       domain: Dominio
       edit: Editar bloqueo de dominio
+      existing_domain_block: Xa tes establecidas restricións maiores para %{name}.
       existing_domain_block_html: Xa impuxeches límites máis estrictos a %{name}, precisas <a href="%{unblock_url}">desbloquealo</a> primeiro.
       new:
         create: Crear bloqueo
@@ -851,6 +852,26 @@ gl:
       edit_preset: Editar aviso preestablecido
       empty: Non definiches os avisos prestablecidos.
       title: Xestionar avisos preestablecidos
+    webhooks:
+      add_new: Engadir punto de extremo
+      delete: Eliminar
+      description_html: Un <strong>webhook</strong> permítelle a Mastodon enviar <strong>notificacións en tempo real</strong> á túa aplicación acerca dos eventos elexidos e así, a aplicación <strong>activará automáticamente</strong> a súa programación.
+      disable: Desactivar
+      disabled: Desactivado
+      edit: Editar extremo
+      empty: Non tes configurado ningún punto extremo para o webhook.
+      enable: Activar
+      enabled: Activo
+      enabled_events:
+        one: 1 evento activado
+        other: "%{count} eventos activados"
+      events: Eventos
+      new: Novo webhook
+      rotate_secret: Rotar segredo
+      secret: Segredo de acceso
+      status: Estado
+      title: Webhooks
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -915,7 +936,6 @@ gl:
   applications:
     created: Creouse con éxito este aplicativo
     destroyed: Eliminouse con éxito o aplicativo
-    invalid_url: A URL proporcionada non é válida
     regenerate_token: Votar a xenerar o testemuño de acceso
     token_regenerated: Rexenerouse con éxito o testemuño de acceso
     warning: Ten moito tino con estos datos. Non os compartas nunca con ninguén!
@@ -1525,6 +1545,54 @@ gl:
   tags:
     does_not_match_previous_name: non concorda co nome anterior
   terms:
+    body_html: |
+      <h2>Privacidade</h2>
+            <h3 id="collect">Que información recollemos?</h3>
+            <ul>
+            <li><em>Información básica da conta</em>: Se te rexistras neste servidor, pedirémosche un nome de usuaria, un enderezo de correo electrónico e un contrasinal. De xeito adicional tamén poderás incluír información como un nome público e biografía, tamén subir unha fotografía de perfil e unha imaxe para a cabeceira. O nome de usuaria, o nome público, a biografía e as imaxes de perfil e cabeceira sempre se mostran de xeito público.</li>
+            <li><em>Publicacións, seguimento e outra información pública</em>: A lista das persoas que segues é unha lista pública, o mesmo acontece coas persoas que te seguen. Cando envías unha mensaxe, a data e hora gárdanse así como a aplicación que utilizaches para enviar a mensaxe. As publicacións poderían incluír ficheiros multimeda, como fotografías e vídeos. As publicacións públicas e as non listadas están dispoñibles de xeito público. Cando destacas unha publicación no teu perfil tamén é pública. As publicacións son enviadas as túas seguidoras, nalgúns casos pode acontecer que estén en diferentes servidores e gárdanse copias neles. Cando eleminas unha publicación tamén se envía ás túas  seguidoras. A acción de volver a publicar ou marcar como favorita outra publicación sempre é pública.</li>
+            <li><em>Mensaxes directas e só para seguidoras</em>: Todas as mensaxes gárdanse e procésanse no servidor. As mensaxes só para seguidoras son entregadas ás túas seguidoras e ás usuarias que son mencionadas nelas, e as mensaxes directas entréganse só ás usuarias mencionadas en elas. Nalgúns casos esto implica que son entregadas a diferentes servidores e gárdanse copias alí. Facemos un esforzo honesto para limitar o acceso a esas publicacións só ás persoas autorizadas, pero outros servidores poderían non ser tan escrupulosos. Polo tanto, é importante revisar os servidores onde se hospedan as túas seguidoras. Nos axustes podes activar a opción de aprobar ou rexeitar novas seguidoras de xeito manual. <em>Ten en conta que a administración do servidor e todos os outros servidores implicados poden ver as mensaxes.</em>, e as destinatarias poderían facer capturas de pantalla, copiar e volver a compartir as mensaxes. <em>Non compartas información sensible en Mastodon.</em></li>
+            <li><em>IPs e outros metadatos</em>: Cando te conectas, gravamos o IP desde onde te conectas, así como o nome da aplicación desde onde o fas. Todas as sesións conectadas están dispoñibles para revisar e revogar nos axustes. O último enderezo IP utilizado gárdase ate por 12 meses. Tamén poderiamos gardar informes do servidor que inclúan o enderezo IP de cada petición ao servidor.</li>
+            </ul>
+            <hr class="spacer" />
+            <h3 id="use">De que xeito utilizamos os teus datos?</h3>
+            <p>Toda a información que recollemos podería ser utilizada dos seguintes xeitos:</p>
+            <ul>
+            <li>Para proporcionar a funcionabiliade básica de Mastodon. Só podes interactuar co contido de outra xente e publicar o teu propio contido se inicias sesión. Por exemplo, poderías seguir outra xente e ver as súas publicacións combinadas nunha cronoloxía de inicio personalizada.</li>
+            <li>Para axudar a moderar a comunidade, por exemplo comparando o teu enderezo IP con outros coñecidos para evitar esquivar os rexeitamentos ou outras infraccións.</li>
+            <li>O enderezo de correo electrónico que nos proporcionas podería ser utilizado para enviarche información, notificacións sobre outra xente que interactúa coas túas publicacións ou che envía mensaxes, e para responder a consultas, e/ou outras cuestións ou peticións.</li>
+            </ul>
+            <hr class="spacer" />
+            <h3 id="protect">Como proxetemos os teus datos?</h3>
+            <p>Implementamos varias medidas de seguridade para protexer os teus datos persoais cando introduces, envías ou accedes á túa información persoal. Entre outras medidas, a túa sesión de navegación, así como o tráfico entre as túas aplicacións e o API están aseguradas mediante SSL, e o teu contrasinal está camuflado utilizando un algoritmo potente de unha sóa vía. Podes habilitar a autenticación por dobre factor para protexer aínda máis o acceso á túa conta.</p>
+            <hr class="spacer" />
+            <h3 id="data-retention">Cal é a nosa política de retención de datos?</h3>
+            <p>Faremos un sincero esforzo en:</p>
+            <ul>
+            <li>Protexer informes do servidor que conteñan direccións IP das peticións ao servidor, actualmente estos informes gárdanse por non máis de 90 días.</li>
+            <li>Reter os enderezos IP asociados con usuarias rexistradas non máis de 12 meses.</li>
+            </ul>
+            <p>Podes solicitar e descargar un ficheiro cos teus contidos, incluíndo publicacións, anexos multimedia, imaxes de perfil e imaxe da cabeceira.</p>
+            <p>En todo momento podes eliminar de xeito irreversible a túa conta.</p>
+            <hr class="spacer"/>
+            <h3 id="cookies">Utilizamos cookies?</h3>
+            <p>Si. As cookies son pequenos ficheiros que un sitio web ou o provedor de servizo transfiren ao disco duro da túa computadora a través do navegador web (se o permites). Estas cookies posibilitan ao sitio web recoñecer o teu navegador e, se tes unha conta rexistrada, asocialo con dita conta.</p>
+            <p>Utilizamos cookies para comprender e gardar as túas preferencias para futuras visitas.</p>
+            <hr class="spacer" />
+            <h3 id="disclose">Entregamos algunha información a terceiras partes alleas?</h3>
+            <p>Non vendemos, negociamos ou transferimos de ningún xeito a terceiras partes alleas a túa información identificativa persoal. Esto non inclúe terceiras partes de confianza que nos axudan a xestionar o sitio web, a xestionar a empresa, ou darche servizo se esas partes aceptan manter esa información baixo confidencialidade. Poderiamos liberar esa información se cremos que eso da cumplimento axeitado a lei, reforza as políticas do noso sitio ou protexe os nosos, e de outros, dereitos, propiedade ou seguridade.</p>
+            <p>O teu contido público podería ser descargado por outros servidores na rede. As túas publicacións públicas e para só seguidoras son entregadas aos servidores onde residen as túas seguidoras na rede, e as mensaxes directas son entregadas aos servidores das destinatarias sempre que esas seguidoras ou destinatarios residan en servidores distintos de este.</p>
+            <p>Cado autorizas a unha aplicación a utilizar a túa conta, dependendo do ámbito dos permisos que autorices, podería acceder a información pública de perfil, á lista de seguimento, ás túas seguidoras, as túas listas, todas as túas publicacións, as publicacións favoritas. As aplicacións non poden acceder nunca ao teu enderezo de correo nin ao teu contrasinal.</p>
+            <hr class="spacer" />
+            <h3 id="children">Utilización do sitio web por menores</h3>
+            <p>Se este servidor está na UE ou no EEE: a nosa web, productos e servizos están dirixidos a persoas de 16 ou máis anos. Se tes menos de 16 anos, a requerimento da GDPR (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>) non uses esta web.</p>
+            <p>Se este servidor está nos EEUU: a nosa web, productos e servizos están dirixidos a persoas de 13 ou máis anos. Se non tes 13 anos de idade, a requerimento de COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) non uses esta web.</p>
+            <p>Os requerimentos legais poden ser diferentes se este servidor está baixo outra xurisdición.</p>
+            <hr class="spacer" />
+            <h3 id="changes">Cambios na nosa política de privacidade</h3>
+            <p>Se decidimos cambiar a nosa política de privacidade publicaremos os cambios nesta páxina.</p>
+            <p>Este documento ten licenza CC-BY-SA. Actualizouse o 26 de maio de 2022.</p>
+            <p>Adaptado do orixinal <a href="https://github.com/discourse/discourse">política de privacidade de Discourse</a>.</p>
     title: "%{instance} Termos do Servizo e Política de Intimidade"
   themes:
     contrast: Mastodon (Alto contraste)
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 2d0cf8ae9..040034125 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -1,7 +1,7 @@
 ---
 he:
   about:
-    about_hashtag_html: אלו סטטוסים פומביים המתוייגים בתור<strong>#%{hashtag}</strong>. ניתן להגיב, להדהד או לחבב אותם אם יש לך חשבון בכל מקום בפדרציה.
+    about_hashtag_html: אלו הודעות פומביות המתוייגות בתור<strong>#%{hashtag}</strong>. ניתן להגיב, להדהד או לחבב אותם אם יש לך חשבון בכל מקום שהוא בפדרציה.
     about_mastodon_html: מסטודון היא רשת חברתית <em>חופשית, מבוססת תוכנה חופשית ("קוד פתוח")</em>. כאלטרנטיבה <em>בלתי ריכוזית</em> לפלטפרומות המסחריות, מסטודון מאפשרת להמנע מהסיכונים הנלווים להפקדת התקשורת שלך בידי חברה יחידה. שמת את מבטחך בשרת אחד &mdash; לא משנה במי בחרת, תמיד אפשר לדבר עם כל שאר המשתמשים. לכל מי שרוצה יש את האפשרות להקים שרת מסטודון עצמאי, ולהשתתף ב<em>רשת החברתית</em> באופן חלק.
     about_this: אודות שרת זה
     active_count_after: פעיל
@@ -40,7 +40,6 @@ he:
       other: חצרוצים
       two: חצרוצים
     status_count_before: שכתבו
-    tagline: מעקב אחרי חברים וגילוי חדשים
     terms: תנאי שימוש
     unavailable_content: שרתים מוגבלים
     unavailable_content_description:
@@ -885,6 +884,14 @@ he:
       edit_preset: ערוך/י טקסט מוכן מראש לאזהרה
       empty: לא הגדרת עדיין שום טקסט מוכן מראש לאזהרה.
       title: ניהול טקסטים מוכנים מראש לאזהרות
+    webhooks:
+      delete: מחיקה
+      disable: כיבוי
+      disabled: כבוי
+      enable: אפשר
+      enabled: פעילים
+      events: אירועים
+      status: סטטוס
   admin_mailer:
     new_appeal:
       actions:
@@ -949,7 +956,6 @@ he:
   applications:
     created: ישום נוצר בהצלחה
     destroyed: ישום נמחק בהצלחה
-    invalid_url: כתובת הקישורית אינה חוקית
     regenerate_token: יצירת אסימון גישה מחדש
     token_regenerated: אסימון גישה יוצר מחדש בהצלחה
     warning: זהירות רבה נדרשת עם מידע זה. אין לחלוק אותו אף פעם עם אף אחד!
diff --git a/config/locales/hr.yml b/config/locales/hr.yml
index dd3b99dcc..fd90a5ac4 100644
--- a/config/locales/hr.yml
+++ b/config/locales/hr.yml
@@ -79,8 +79,6 @@ hr:
   application_mailer:
     settings: 'Promijeni postavke e-pošte: %{link}'
     view: 'Vidi:'
-  applications:
-    invalid_url: Unesena poveznica nije valjana
   auth:
     didnt_get_confirmation: Niste primili upute za potvrđivanje?
     forgot_password: Zaboravljena lozinka?
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 0e3ff6440..5ee01ea2c 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -38,7 +38,7 @@ hu:
       one: bejegyzést írt
       other: bejegyzést írt
     status_count_before: Eddig
-    tagline: Kövess barátokat és találj újakat
+    tagline: Decentralizált szociális hálózat
     terms: Felhasználási feltételek
     unavailable_content: Kimoderált szerverek
     unavailable_content_description:
@@ -430,6 +430,7 @@ hu:
       destroyed_msg: A domain tiltása feloldva
       domain: Domain
       edit: Domain tiltás szerkesztése
+      existing_domain_block: 'Már szigorúbb korlátozások vonatkoznak a következőre: %{name}.'
       existing_domain_block_html: A %{name} domainen már szorosabb korlátokat állítottál be, először <a href="%{unblock_url}">oldd fel a tiltást</a>.
       new:
         create: Tiltás létrehozása
@@ -853,6 +854,26 @@ hu:
       edit_preset: Figyelmeztetés szerkesztése
       empty: Nem definiáltál még egyetlen figyelmeztetést sem.
       title: Figyelmeztetések
+    webhooks:
+      add_new: Végpont hozzáadása
+      delete: Törlés
+      description_html: Egy <strong>webhook</strong> lehetővé teszi a Mastodon számára, hogy <strong>valósidejű értesítéseket</strong> küldjön le a kiválasztott eseményekről a te alkalmazásodnak, így az alkalmazásod <strong>automatikusan reagálhat</strong> ezekre.
+      disable: Letiltás
+      disabled: Letiltva
+      edit: Végpont szerkesztése
+      empty: Még nincs beállított webhook végpontod.
+      enable: Engedélyezés
+      enabled: Aktív
+      enabled_events:
+        one: 1 engedélyezett esemény
+        other: "%{count} engedélyezett esemény"
+      events: Események
+      new: Új webhook
+      rotate_secret: Titok forgatása
+      secret: Titok aláírása
+      status: Állapot
+      title: Webhookok
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -917,7 +938,6 @@ hu:
   applications:
     created: Alkalmazás sikeresen létrehozva
     destroyed: Alkalmazás sikeresen eltávolítva
-    invalid_url: A megadott URL nem megfelelő
     regenerate_token: Hozzáférési kulcs újragenerálása
     token_regenerated: Hozzáférési kulcs sikeresen újragenerálva
     warning: Ez érzékeny adat. Soha ne oszd meg másokkal!
diff --git a/config/locales/hy.yml b/config/locales/hy.yml
index f24b3197e..831ca6621 100644
--- a/config/locales/hy.yml
+++ b/config/locales/hy.yml
@@ -33,7 +33,6 @@ hy:
       one: գրառում
       other: ստատուս
     status_count_before: Որոնք արել են՝
-    tagline: Հետեւիր ընկերներիդ եւ գտիր նորերին
     terms: Ծառայութեան պայմանները
     unavailable_content: Մոդերացուող սպասարկիչներ
     unavailable_content_description:
@@ -551,7 +550,6 @@ hy:
     view_profile: Նայել անձնական էջը
     view_status: Նայել գրառումը
   applications:
-    invalid_url: Տրամադրուած URL անվաւեր է
     regenerate_token: Ստեղծել նոր հասանելիութեան կտրոն
     your_token: Քո մուտքի բանալին
   auth:
diff --git a/config/locales/id.yml b/config/locales/id.yml
index 8b364ddc9..368b21add 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -35,7 +35,7 @@ id:
     status_count_after:
       other: status
     status_count_before: Yang telah menulis
-    tagline: Ikuti teman dan temukan yang baru
+    tagline: Jejaring sosial terdesentralisasi
     terms: Kebijakan layanan
     unavailable_content: Konten tak tersedia
     unavailable_content_description:
@@ -417,6 +417,7 @@ id:
       destroyed_msg: Pemblokiran domain telah dibatalkan
       domain: Domain
       edit: Edit blok domain
+      existing_domain_block: Anda sudah menerapkan batasan ketat terhadap %{name}.
       existing_domain_block_html: Anda telah menerapkan batasan yang lebih ketat pada %{name}, Anda harus <a href="%{unblock_url}">membuka blokirnya</a> lebih dulu.
       new:
         create: Buat pemblokiran
@@ -832,6 +833,21 @@ id:
       edit_preset: Sunting preset peringatan
       empty: Anda belum mendefinisikan peringatan apapun.
       title: Kelola preset peringatan
+    webhooks:
+      add_new: Tambah titik akhir
+      delete: Hapus
+      disable: Matikan
+      disabled: Nonaktif
+      edit: Edit titik akhir
+      enable: Aktifkan
+      enabled: Aktif
+      enabled_events:
+        other: "%{count} acara aktif"
+      events: Acara
+      new: Webhook baru
+      status: Status
+      title: Webhook
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -896,7 +912,6 @@ id:
   applications:
     created: Aplikasi berhasil dibuat
     destroyed: Aplikasi berhasil dihapus
-    invalid_url: URL tidak sesuai
     regenerate_token: Buat ulang token akses
     token_regenerated: Token akses berhasil dibuat ulang
     warning: Hati-hati dengan data ini. Jangan bagikan kepada siapapun!
diff --git a/config/locales/io.yml b/config/locales/io.yml
index 1d0304d09..7cf253089 100644
--- a/config/locales/io.yml
+++ b/config/locales/io.yml
@@ -38,7 +38,7 @@ io:
       one: posto
       other: posti
     status_count_before: Qua publikigis
-    tagline: Sequez amiki e deskovrez nova personi
+    tagline: Necentralizita sociala reto
     terms: Serveskondicioni
     unavailable_content: Jerata servili
     unavailable_content_description:
@@ -428,6 +428,7 @@ io:
       destroyed_msg: Domenobstrukto desagesis
       domain: Domeno
       edit: Modifikez domenobstrukto
+      existing_domain_block: Vu ja exekutis plu rigoroza limiti a %{name}.
       existing_domain_block_html: Vu ja povis plu rigoroza limiti a %{name}, vu bezonas <a href="%{unblock_url}">deobstruktar</a> unesme.
       new:
         create: Kreez obstrukto
@@ -851,6 +852,26 @@ io:
       edit_preset: Modifikez avertfixito
       empty: Vu ne fixis irga avertfixito til nun.
       title: Jerez avertfixiti
+    webhooks:
+      add_new: Insertez finpunto
+      delete: Efacez
+      description_html: "<strong>Rethoko</strong> povigas Mastodon sendar <strong>samtempoavizi</strong> pri selektita eventi a vua sua apliko, por ke vua apliko povas <strong>automate kauzigar reakti</strong>."
+      disable: Desaktivigez
+      disabled: Desaktivigita
+      edit: Modifikez finpunto
+      empty: Vu ne havas irga ajustita finpunti ankore.
+      enable: Aktivigez
+      enabled: Aktiva
+      enabled_events:
+        one: 1 aktivigita evento
+        other: "%{count} aktivigita eventi"
+      events: Eventi
+      new: Nova rethoko
+      rotate_secret: Rotacigez sekreto
+      secret: Signosekreto
+      status: Stando
+      title: Rethoki
+      webhook: Rethok
   admin_mailer:
     new_appeal:
       actions:
@@ -915,7 +936,6 @@ io:
   applications:
     created: Apliko sucesoze kreesas
     destroyed: Apliko sucesoze efacesas
-    invalid_url: La URL donita ne esas valida
     regenerate_token: Rifacez acesficho
     token_regenerated: Acesficho sucesoze riganesas
     warning: Sorgemez per ca informi. Ne partigez kun irgu!
diff --git a/config/locales/is.yml b/config/locales/is.yml
index 28d6914e5..f9d408822 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -38,7 +38,7 @@ is:
       one: færsla
       other: færslur
     status_count_before: Sem stóðu fyrir
-    tagline: Fylgstu með vinum og uppgötvaðu nýja
+    tagline: Dreift samfélagsnet
     terms: Þjónustuskilmálar
     unavailable_content: Ekki tiltækt efni
     unavailable_content_description:
@@ -428,6 +428,7 @@ is:
       destroyed_msg: Útilokun léns hefur verið aflétt
       domain: Lén
       edit: Breyta útilokun léns
+      existing_domain_block: Þú hefur þegar gert kröfu um strangari takmörk fyrir %{name}.
       existing_domain_block_html: Þú ert þegar búin/n að setja strangari takmörk á %{name}, þú þarft fyrst að <a href="%{unblock_url}">aflétta útilokun</a> á því.
       new:
         create: Búa til útilokun
@@ -851,6 +852,14 @@ is:
       edit_preset: Breyta forstilltri aðvörun
       empty: Þú hefur ekki enn skilgreint neinar aðvaranaforstillingar.
       title: Sýsla með forstilltar aðvaranir
+    webhooks:
+      delete: Eyða
+      disable: Gera óvirkt
+      disabled: Óvirkt
+      enable: Virkja
+      enabled: Virkt
+      events: Atburðir
+      status: Staða
   admin_mailer:
     new_appeal:
       actions:
@@ -915,7 +924,6 @@ is:
   applications:
     created: Það tókst að búa til forrit
     destroyed: Það tókst að eyða forriti
-    invalid_url: Slóðin sem þú gafst upp er ógild
     regenerate_token: Endurgera aðgangsteikn
     token_regenerated: Það tókst að endurgera aðgangsteiknið
     warning: Farðu mjög varlega með þessi gögn. Þú skalt aldrei deila þeim með neinum!
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 43fa1c07b..f97779d26 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -38,7 +38,7 @@ it:
       one: stato
       other: stati
     status_count_before: Che hanno pubblicato
-    tagline: Segui amici e trovane di nuovi
+    tagline: Social network decentralizzato
     terms: Termini di Servizio
     unavailable_content: Server moderati
     unavailable_content_description:
@@ -428,6 +428,7 @@ it:
       destroyed_msg: Il blocco del dominio è stato rimosso
       domain: Dominio
       edit: Modifica blocco di dominio
+      existing_domain_block: Hai già imposto limiti più severi a %{name}.
       existing_domain_block_html: Hai già impostato limitazioni più stringenti su %{name}, dovresti <a href="%{unblock_url}">sbloccarlo</a> prima.
       new:
         create: Crea blocco
@@ -851,6 +852,26 @@ it:
       edit_preset: Modifica avviso predefinito
       empty: Non hai ancora definito alcun avviso preimpostato.
       title: Gestisci avvisi predefiniti
+    webhooks:
+      add_new: Aggiungi endpoint
+      delete: Elimina
+      description_html: Un <strong>webhook</strong> consente a Mastodon di inviare <strong>notifiche in tempo reale</strong> su determinati eventi alla tua applicazione, così la tua applicazione può <strong>attivare automaticamente delle reazioni</strong>.
+      disable: Disabilita
+      disabled: Disabilitato
+      edit: Modifica endpoint
+      empty: Non hai ancora configurato alcun endpoint per webhook.
+      enable: Abilita
+      enabled: Attivo
+      enabled_events:
+        one: 1 evento abilitato
+        other: "%{count} eventi abilitati"
+      events: Eventi
+      new: Nuovo webhook
+      rotate_secret: Ruota segreto
+      secret: Segreto per firma
+      status: Stato
+      title: Webhook
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -917,7 +938,6 @@ it:
   applications:
     created: Applicazione creata con successo
     destroyed: Applicazione eliminata con successo
-    invalid_url: L'URL fornito non è valido
     regenerate_token: Rigenera il token di accesso
     token_regenerated: Token di accesso rigenerato
     warning: Fa' molta attenzione con questi dati. Non fornirli mai a nessun altro!
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 38420d07f..b7139523b 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -35,7 +35,7 @@ ja:
     status_count_after:
       other: 投稿
     status_count_before: 投稿数
-    tagline: Follow friends and discover new ones
+    tagline: 分散型ソーシャルネットワーク
     terms: 利用規約
     unavailable_content: 制限中のサーバー
     unavailable_content_description:
@@ -825,6 +825,18 @@ ja:
       edit_preset: プリセット警告文を編集
       empty: まだプリセット警告文が作成されていません。
       title: プリセット警告文を管理
+    webhooks:
+      add_new: エンドポイントを追加
+      delete: 削除
+      disable: 無効化
+      disabled: 無効
+      edit: エンドポイントを編集
+      enable: 有効化
+      enabled: アクティブ
+      events: イベント
+      new: 新しいwebhook
+      title: Webhooks
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -885,7 +897,6 @@ ja:
   applications:
     created: アプリが作成されました
     destroyed: アプリが削除されました
-    invalid_url: URLが無効です
     regenerate_token: アクセストークンの再生成
     token_regenerated: アクセストークンが再生成されました
     warning: このデータは気をつけて取り扱ってください。他の人と共有しないでください!
@@ -1482,6 +1493,87 @@ ja:
   tags:
     does_not_match_previous_name: 以前の名前と一致しません
   terms:
+    body_html: |
+      <h2>プライバシーポリシー</h2>
+      <h3 id="collect">どのような情報を収集しますか?</h3>
+
+      <ul>
+        <li><em>基本的なアカウント情報</em>: 当サイトに登録すると、ユーザー名・メールアドレス・パスワードの入力を求められることがあります。また表示名や自己紹介・プロフィール画像・ヘッダー画像といった追加のプロフィールを登録できます。ユーザー名・表示名・自己紹介・プロフィール画像・ヘッダー画像は常に公開されます。</li>
+        <li><em>投稿・フォロー・その他公開情報</em>: フォローしているユーザーの一覧は一般公開されます。フォロワーも同様です。メッセージを投稿する際、日時だけでなく投稿に使用したアプリケーション名も記録されます。メッセージには写真や動画といった添付メディアを含むことがあります。「公開」や「未収載」の投稿は一般公開されます。プロフィールに投稿を載せるとそれもまた公開情報となります。投稿はフォロワーに配信されます。場合によっては他のサーバーに配信され、そこにコピーが保存されることを意味します。投稿を削除した場合も同様にフォロワーに配信されます。他の投稿をリブログやお気に入り登録する行動は常に公開されます。</li>
+        <li><em>「ダイレクト」と「フォロワー限定」投稿</em>: すべての投稿はサーバーに保存され、処理されます。「フォロワー限定」投稿はフォロワーと投稿に書かれたユーザーに配信されます。「ダイレクト」投稿は投稿に書かれたユーザーにのみ配信されます。場合によっては他のサーバーに配信され、そこにコピーが保存されることを意味します。私たちはこれらの閲覧を一部の許可された者に限定するよう誠意を持って努めます。しかし他のサーバーにおいても同様に扱われるとは限りません。したがって、相手の所属するサーバーを吟味することが重要です。設定で新しいフォロワーの承認または拒否を手動で行うよう切り替えることもできます。<em>サーバー管理者は「ダイレクト」や「フォロワー限定」投稿も閲覧する可能性があることを忘れないでください。</em>また受信者がスクリーンショットやコピー、もしくは共有する可能性があることを忘れないでください。<em>いかなる機微な情報もMastodon上で共有しないでください。</em></li>
+        <li><em>IPアドレスやその他メタデータ</em>: ログインする際IPアドレスだけでなくブラウザーアプリケーション名を記録します。ログインしたセッションはすべてユーザー設定で見直し、取り消すことができます。使用されている最新のIPアドレスは最大12ヵ月間保存されます。またサーバーへのIPアドレスを含むすべてのリクエストのログを保持することがあります。</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">情報を何に使用しますか?</h3>
+
+      <p>収集した情報は次の用途に使用されることがあります:</p>
+
+      <ul>
+        <li>Mastodonのコア機能の提供: ログインしている間にかぎり他の人たちと投稿を通じて交流することができます。例えば自分専用のホームタイムラインで投稿をまとめて読むために他の人たちをフォローできます。</li>
+        <li>コミュニティ維持の補助: 例えばIPアドレスを既知のものと比較し、BAN回避目的の複数登録者やその他違反者を判別します。</li>
+        <li>提供されたメールアドレスはお知らせの送信・投稿に対するリアクションやメッセージ送信の通知・お問い合わせやその他要求や質問への返信に使用されることがあります。</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="protect">情報をどのように保護しますか?</h3>
+
+      <p>私たちはあなたが入力・送信する際や自身の情報にアクセスする際に個人情報を安全に保つため、さまざまなセキュリティ上の対策を実施します。特にブラウザーセッションだけでなくアプリケーションとAPI間の通信もSSLによって保護されます。またパスワードは強力な不可逆アルゴリズムでハッシュ化されます。二要素認証を有効にし、アカウントへのアクセスをさらに安全にすることができます。</p>
+
+      <hr class="spacer" />
+
+      <h3 id="data-retention">データ保持方針はどうなっていますか?</h3>
+
+      <p>私たちは次のように誠意を持って努めます:</p>
+
+      <ul>
+        <li>当サイトへのIPアドレスを含むすべての要求に対するサーバーログを90日以内のできるかぎりの間保持します。</li>
+        <li>登録されたユーザーに関連付けられたIPアドレスを12ヵ月以内の間保持します。</li>
+      </ul>
+
+      <p>あなたは投稿・添付メディア・プロフィール画像・ヘッダー画像を含む自身のデータのアーカイブを要求し、ダウンロードすることができます。</p>
+
+      <p>あなたはいつでもアカウントの削除を要求できます。削除は取り消すことができません。</p>
+
+      <hr class="spacer" />
+
+      <h3 id="cookies">クッキーを使用していますか?</h3>
+
+      <p>はい。クッキーは (あなたが許可した場合に) WebサイトやサービスがWebブラウザーを介してコンピューターに保存する小さなファイルです。使用することでWebサイトがブラウザーを識別し、登録済みのアカウントがある場合関連付けます。</p>
+
+      <p>私たちはクッキーを将来の訪問のために設定を保存し呼び出す用途に使用します。</p>
+
+      <hr class="spacer" />
+
+      <h3 id="disclose">なんらかの情報を外部に提供していますか?</h3>
+
+      <p>私たちは個人を特定できる情報を外部へ販売・取引・その他方法で渡すことはありません。これには当サイトの運営・業務遂行・サービス提供を行ううえで補助する信頼できる第三者をこの機密情報の保護に同意するかぎり含みません。法令の遵守やサイトポリシーの施行、権利・財産・安全の保護に適切と判断した場合、あなたの情報を公開することがあります。</p>
+
+      <p>あなたの公開情報はネットワーク上の他のサーバーにダウンロードされることがあります。相手が異なるサーバーに所属する場合、「公開」と「フォロワー限定」投稿はフォロワーの所属するサーバーに配信され、「ダイレクト」投稿は受信者の所属するサーバーに配信されます。</p>
+
+      <p>あなたがアカウントの使用をアプリケーションに許可すると、承認した権限の範囲内で公開プロフィール情報・フォローリスト・フォロワー・リスト・すべての投稿・お気に入り登録にアクセスできます。アプリケーションはメールアドレスやパスワードに決してアクセスできません。</p>
+
+      <hr class="spacer" />
+
+      <h3 id="children">児童によるサイト利用について</h3>
+
+      <p>サーバーがEUまたはEEA圏内にある場合: 当サイト・製品・サービスは16歳以上の人を対象としています。あなたが16歳未満の場合、GDPR (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a> - EU一般データ保護規則) により当サイトを使用できません。</p>
+
+      <p>サーバーが米国にある場合: 当サイト・製品・サービスは13歳以上の人を対象としています。あなたが13歳未満の場合、COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a> - 児童オンラインプライバシー保護法) により当サイトを使用できません。</p>
+
+      <p>サーバーが別の管轄区域にある場合、法的要件は異なることがあります。</p>
+
+      <hr class="spacer" />
+
+      <h3 id="changes">プライバシーポリシーの変更</h3>
+
+      <p>プライバシーポリシーの変更を決定した場合、このページに変更点を掲載します。</p>
+
+      <p>この文章のライセンスはCC-BY-SAです。最終更新日は2021年6月1日です。</p>
+
+      <p>オリジナルの出典: <a href="https://github.com/discourse/discourse">Discourse privacy policy</a></p>
     title: "%{instance} 利用規約・プライバシーポリシー"
   themes:
     contrast: Mastodon (ハイコントラスト)
diff --git a/config/locales/ka.yml b/config/locales/ka.yml
index 7e6d591ec..bd02b0f8d 100644
--- a/config/locales/ka.yml
+++ b/config/locales/ka.yml
@@ -305,7 +305,6 @@ ka:
   applications:
     created: აპლიკაცია წარმატებით შეიქმნა
     destroyed: აპლიკაცია წარმატებით გაუქმდა
-    invalid_url: მოწოდებული ურლ არასწორია
     regenerate_token: წვდომის ტოკენის რეგენერაცია
     token_regenerated: წვდომის ტოკენის რეგენერაცია მოხერხდა
     warning: იყავით ძალიან ფრთხილად ამ მონაცემთან. არასდროს გააზიაროთ ეს!
diff --git a/config/locales/kab.yml b/config/locales/kab.yml
index 66d029d7a..0db4e1c9d 100644
--- a/config/locales/kab.yml
+++ b/config/locales/kab.yml
@@ -29,7 +29,6 @@ kab:
       one: n tsuffeɣt
       other: n tsuffiɣin
     status_count_before: I d-yessuffɣen
-    tagline: Ḍfeṛ imddukkal-ik tissineḍ-d wiyaḍ
     terms: Tiwetlin n useqdec
     unavailable_content: Ulac agbur
     unavailable_content_description:
diff --git a/config/locales/kk.yml b/config/locales/kk.yml
index a01a2424a..406f7e3c8 100644
--- a/config/locales/kk.yml
+++ b/config/locales/kk.yml
@@ -32,7 +32,6 @@ kk:
       one: жазба
       other: жазба
     status_count_before: Барлығы
-    tagline: Достарыңызды оқыңыз және жаңа авторларды табыңыз
     terms: Қолдану шарттары
     unavailable_content: Қолжетімсіз контент
     unavailable_content_description:
@@ -477,7 +476,6 @@ kk:
   applications:
     created: Application succеssfully created
     destroyed: Application succеssfully deleted
-    invalid_url: The providеd URL is invalid
     regenerate_token: Regenerate accеss token
     token_regenerated: Access token succеssfully regenerated
     warning: Be very carеful with this data. Never share it with anyone!
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 538c14a91..65bc57e3a 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -37,7 +37,7 @@ ko:
     status_count_after:
       other: 개
     status_count_before: 게시물 수
-    tagline: 친구들을 팔로우 하고 새로운 사람들도 만나기
+    tagline: 분산화된 소셜 네트워크
     terms: 이용약관
     unavailable_content: 이용 불가능한 컨텐츠
     unavailable_content_description:
@@ -419,6 +419,7 @@ ko:
       destroyed_msg: 도메인 차단이 해제되었습니다
       domain: 도메인
       edit: 도메인 차단 수정
+      existing_domain_block: 이미 %{name}에 대한 더 강력한 제한이 있습니다.
       existing_domain_block_html: 이미 %{name}에 대한 더 강력한 제한이 걸려 있습니다, <a href="%{unblock_url}">차단 해제</a>를 먼저 해야 합니다.
       new:
         create: 차단 추가
@@ -525,7 +526,7 @@ ko:
       private_comment: 비공개 주석
       public_comment: 공개 주석
       purge: 제거
-      purge_description_html: 이 도메인이 영구적으로 오프라인 상태라고 생각되면 스토리지에서 이 도메인의 모든 계정 레코드와 관련 데이터를 삭제할 수 있습니다. 이 작업은 시간이 좀 걸릴 수 있습니다.
+      purge_description_html: 이 도메인이 영구적으로 오프라인 상태라고 생각되면, 스토리지에서 이 도메인의 모든 계정 레코드와 관련 데이터를 삭제할 수 있습니다. 이 작업은 시간이 좀 걸릴 수 있습니다.
       title: 연합
       total_blocked_by_us: 우리에게 차단 됨
       total_followed_by_them: 우리를 팔로우
@@ -591,7 +592,7 @@ ko:
         resolve_description_html: 신고된 계정에 대해 아무런 동작도 취하지 않으며, 처벌기록이 남지 않으며, 신고는 처리됨으로 변경됩니다.
         silence_description_html: 이미 팔로우 하고 있는 사람이나 수동으로 찾아보는 사람에게만 프로필이 보여지고, 도달 범위를 엄격하게 제한합니다. 언제든지 되돌릴 수 있습니다.
         suspend_description_html: 프로필과 모든 컨텐츠가 최종적으로 삭제될 때까지 접근 불가상태가 됩니다. 이 계정과의 상호작용은 불가능해집니다. 30일 이내에 되돌릴 수 있습니다.
-      actions_description_html: 이 보고서를 해결하기 위해 취해야 할 조치를 지정해주세요. 신고된 계정에 대해 처벌 조치를 취하면 <strong>스팸</strong> 카테고리가 선택된 경우를 제외하고 이메일 알림이 해당 계정으로 전송됩니다.
+      actions_description_html: 이 신고를 해결하기 위해 취해야 할 조치를 지정해주세요. 신고된 계정에 대해 처벌 조치를 취하면, <strong>스팸</strong> 카테고리가 선택된 경우를 제외하고 해당 계정으로 이메일 알림이 전송됩니다.
       add_to_report: 신고에 더 추가하기
       are_you_sure: 정말로 실행하시겠습니까?
       assign_to_self: 나에게 할당하기
@@ -618,7 +619,7 @@ ko:
         placeholder: 이 리포트에 대한 조치, 기타 관련 된 사항에 대해 설명합니다…
         title: 노트
       notes_description_html: 확인하고 다른 중재자나 미래의 자신을 위해 기록을 작성합니다
-      quick_actions_description_html: '보고된 콘텐츠를 보려면 빠른 조치를 취하거나 아래로 스크롤하세요:'
+      quick_actions_description_html: '빠른 조치를 취하거나 아래로 스크롤해서 신고된 콘텐츠를 확인하세요:'
       remote_user_placeholder: "%{instance}의 리모트 사용자"
       reopen: 리포트 다시 열기
       report: '신고 #%{id}'
@@ -836,6 +837,14 @@ ko:
       edit_preset: 경고 틀 수정
       empty: 아직 어떤 경고 틀도 정의되지 않았습니다.
       title: 경고 틀 관리
+    webhooks:
+      add_new: 엔드포인트 추가
+      delete: 삭제
+      disable: 비활성화
+      disabled: 비활성화됨
+      edit: 엔드포인트 수정
+      enable: 활성화
+      enabled: 활성화됨
   admin_mailer:
     new_appeal:
       actions:
@@ -900,7 +909,6 @@ ko:
   applications:
     created: 애플리케이션이 성공적으로 생성되었습니다
     destroyed: 애플리케이션이 성공적으로 삭제되었습니다
-    invalid_url: 올바르지 않은 URL입니다
     regenerate_token: 토큰 재생성
     token_regenerated: 액세스 토큰이 성공적으로 재생성되었습니다
     warning: 이 데이터를 조심히 다뤄 주세요. 다른 사람들과 절대로 공유하지 마세요!
@@ -1500,6 +1508,87 @@ ko:
   tags:
     does_not_match_previous_name: 이전 이름과 맞지 않습니다
   terms:
+    body_html: |
+      <h2>개인정보 정책</h2>
+      <h3 id="collect">우리가 어떤 정보를 수집하나요?</h3>
+
+      <ul>
+      <li><em>기본 계정 정보</em>: 이 서버에 가입하실 때 사용자명, 이메일 주소, 패스워드 등을 입력 받게 됩니다. 추가적으로 표시되는 이름이나 자기소개, 프로필 이미지, 헤더 이미지 등의 프로필 정보를 입력하게 됩니다. 사용자명, 표시되는 이름, 자기소개, 프로필 이미지와 헤더 이미지는 언제나 공개적으로 게시됩니다.</li>
+      <li><em>게시물, 팔로잉, 기타 공개된 정보</em>: 당신이 팔로우 하는 사람들의 리스트는 공개됩니다. 당신을 팔로우 하는 사람들도 마찬가지입니다. 당신이 게시물을 작성하는 경우, 응용프로그램이 메시지를 받았을 때의 날짜와 시간이 기록 됩니다. 게시물은 그림이나 영상 등의 미디어를 포함할 수 있습니다. 퍼블릭과 미표시(unlisted) 게시물은 공개적으로 접근이 가능합니다. 프로필에 게시물을 고정하는 경우 마찬가지로 공개적으로 접근 가능한 정보가 됩니다. 당신의 게시물들은 당신의 팔로워들에게 전송 됩니다. 몇몇 경우 이것은 다른 서버에 전송되고 그곳에 사본이 저장 됩니다. 당신이 게시물을 삭제하는 경우 이 또한 당신의 팔로워들에게 전송 됩니다. 다른 게시물을 리블로깅 하거나 좋아요 하는 경우 이는 언제나 공개적으로 제공 됩니다.</li>
+      <li><em>DM, 팔로워 공개 게시물</em>: 모든 게시물들은 서버에서 처리되고 저장됩니다. 팔로워 공개 게시물은 당신의 팔로워와 멘션 된 사람들에게 전달이 됩니다. 다이렉트 메시지는 멘션 된 사람들에게만 전송 됩니다. 몇몇 경우 이것은 다른 서버에 전송 되고 그곳에 사본이 저장됨을 의미합니다. 우리는 이 게시물들이 권한을 가진 사람들만 열람이 가능하도록 노력을 할 것이지만 다른 서버에서는 이것이 실패할 수도 있습니다. 그러므로 당신의 팔로워들이 속한 서버를 재확인하는 것이 중요합니다. 당신은 새 팔로워를 수동으로 승인하거나 거절하도록 설정을 변경할 수 있습니다. <em>해당 서버의 운영자는 서버가 받는 메시지를 열람할 수 있다는 것을 항상 염두해 두세요</em>, 그리고 수신자들은 스크린샷을 찍거나 복사하는 등의 방법으로 다시 공유할 수 있습니다. <em>민감한 정보를 마스토돈을 통해 공유하지 마세요.</em></li>
+      <li><em>IP와 기타 메타데이터</em>: 당신이 로그인 하는 경우 IP 주소와 브라우저의 이름을 저장합니다. 모든 세션은 당신이 검토하고 취소할 수 있도록 설정에서 제공 됩니다. 마지막으로 사용 된 IP 주소는 최대 12개월 간 저장됩니다. 또한, 모든 요청에 대해 IP주소를 포함한 정보를 로그에 저장할 수 있습니다.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">우리가 당신의 정보를 어디에 쓰나요?</h3>
+
+      <p>당신에게서 수집한 정보는 다음과 같은 곳에 사용 됩니다:</p>
+
+      <ul>
+      <li>마스토돈의 주요 기능 제공. 다른 사람의 게시물에 상호작용 하거나 자신의 게시물을 작성하기 위해서는 로그인을 해야 합니다. 예를 들어, 다른 사람의 게시물을 자신만의 홈 타임라인에서 모아 보기 위해 팔로우를 할 수 있습니다.</li>
+      <li>커뮤니티의 중재를 위해, 예를 들어 당신의 IP 주소와 기타 사항을 비교하여 금지를 우회하거나 다른 규칙을 위반하는지 판단하는 데에 사용할 수 있습니다.</li>
+      <li>당신이 제공한 이메일 주소를 통해 정보, 다른 사람들의 반응이나 받은 메시지에 대한 알림, 기타 요청 등에 관한 응답 요청 등을 보내는 데에 활용됩니다.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="protect">어떻게 당신의 정보를 보호하나요?</h3>
+
+      <p>우리는 당신이 입력, 전송, 접근하는 개인정보를 보호하기 위해 다양한 보안 대책을 적용합니다. 당신의 브라우저 세션, 당신의 응용프로그램과의 통신, API는 SSL로 보호 되며 패스워드는 강력한 단방향 해시 알고리즘을 사용합니다. 계정의 더 나은 보안을 위해 2단계 인증을 활성화 할 수 있습니다.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="data-retention">자료 저장 정책은 무엇이죠?</h3>
+
+      <p>우리는 다음을 위해 노력을 할 것입니다:</p>
+
+      <ul>
+      <li>IP를 포함해 이 서버에 전송 되는 모든 요청에 대한 로그는 90일을 초과하여 저장되지 않습니다.</li>
+      <li>가입 된 사용자의 IP 정보는 12개월을 초과하여 저장 되지 않습니다.</li>
+      </ul>
+
+      <p>당신은 언제든지 게시물, 미디어 첨부, 프로필 이미지, 헤더 이미지를 포함한 당신의 컨텐트에 대한 아카이브를 요청하고 다운로드 할 수 있습니다.</p>
+
+      <p>언제든지 계정을 완전히 삭제할 수 있습니다.</p>
+
+      <hr class="spacer"/>
+
+      <h3 id="cookies">쿠키를 사용하나요?</h3>
+
+      <p>네. 쿠키는 (당신이 허용한다면) 당신의 웹 브라우저를 통해 서버에서 당신의 하드드라이브에 저장하도록 전송하는 작은 파일들입니다. 이 쿠키들은 당신의 브라우저를 인식하고, 계정이 있는 경우 이와 연결하는 것을 가능하게 합니다.</p>
+
+      <p>당신의 환경설정을 저장하고 다음 방문에 활용하기 위해 쿠키를 사용합니다.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="disclose">외부에 정보를 공개하나요?</h3>
+
+      <p>우리는 당신을 식별 가능한 개인정보를 외부에 팔거나 제공하거나 전송하지 않습니다. 이는 당사의 사이트를 운영하기 위한, 기밀 유지에 동의하는, 신뢰 가능한 서드파티를 포함하지 않습니다. 또한 법률 준수, 사이트 정책 시행, 또는 당사나 타인에 대한 권리, 재산, 또는 안전보호를 위해 적절하다고 판단되는 경우 당신의 정보를 공개할 수 있습니다.</p>
+
+      <p>당신의 공개 게시물은 네트워크에 속한 다른 서버가 다운로드 할 수 있습니다. 당신의 팔로워나 수신자가 이 서버가 아닌 다른 곳에 존재하는 경우 당신의 공개, 팔로워 공개 게시물은 당신의 팔로워가 존재하는 서버로 전송되며, 다이렉트메시지는 수신자가 존재하는 서버로 전송 됩니다.</p>
+
+      <p>당신이 계정을 사용하기 위해 응용프로그램을 승인하는 경우 당신이 허용한 권한에 따라 응용프로그램은 당신의 공개 계정정보, 팔로잉 리스트, 팔로워 리스트, 게시물, 좋아요 등에 접근이 가능해집니다. 응용프로그램은 절대로 당신의 이메일 주소나 패스워드에 접근할 수 없습니다.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="children">어린이의 사이트 사용</h3>
+
+      <p>이 서버가 EU나 EEA에 속해 있다면: 당사의 사이트, 제품과 서비스는 16세 이상인 사람들을 위해 제공됩니다. 당신이 16세 미만이라면 GDPR(<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>)의 요건에 따라 이 사이트를 사용할 수 없습니다.</p>
+
+      <p>이 서버가 미국에 속해 있다면: 당사의 사이트, 제품과 서비스는 13세 이상인 사람들을 위해 제공됩니다. 당신이 13세 미만이라면 COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>)의 요건에 따라 이 사이트를 사용할 수 없습니다.</p>
+
+      <p>이 서버가 있는 관할권에 따라 법적 요구가 달라질 수 있습니다.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="changes">개인정보 정책의 변경</h3>
+
+      <p>만약 우리의 개인정보 정책이 바뀐다면, 이 페이지에 바뀐 정책이 게시됩니다.</p>
+
+      <p>이 문서는 CC-BY-SA 라이센스입니다. 마지막 업데이트는 2012년 5월 26일입니다.</p>
+
+      <p>Originally adapted from the <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p>
     title: "%{instance} 이용약관과 개인정보 취급 방침"
   themes:
     contrast: 마스토돈 (고대비)
@@ -1553,7 +1642,7 @@ ko:
         spam: 스팸
         violation: 컨텐츠가 다음의 커뮤니티 규정을 위반합니다
       explanation:
-        delete_statuses: 귀하의 게시물 중 일부가 하나 이상의 커뮤니티 가이드라인을 위반한 것으로 확인되어 %{instance} 모더레이터에 의해 삭제되었습니다.
+        delete_statuses: 귀하의 게시물 중 일부가 하나 이상의 커뮤니티 가이드라인을 위반한 것으로 확인되어 %{instance}의 중재자에 의해 삭제되었습니다.
         disable: 당신은 더이상 당신의 계정을 사용할 수 없습니다, 하지만 프로필과 다른 데이터들은 여전히 그대로 남아있습니다. 당신의 데이터에 대한 백업을 요청하거나, 계정 설정을 변경 또는 계정을 삭제할 수 있습니다.
         mark_statuses_as_sensitive: 당신의 몇몇 게시물들은 %{instance}의 중재자에 의해 민감함으로 설정되었습니다. 이것은 사람들이 미리보기를 보기 전에 미디어를 한번 눌러야 함을 의미합니다. 당신은 스스로도 자신의 게시물을 작성할 때 미디어를 민감함으로 설정할 수 있습니다.
         sensitive: 지금부터는, 당신이 업로드한 미디어 파일들은 민감함 표시가 뜨게 되고 클릭해야만 볼 수 있다는 경고문 뒤에 가려지게 됩니다.
diff --git a/config/locales/ku.yml b/config/locales/ku.yml
index 085624c54..a157dbb4e 100644
--- a/config/locales/ku.yml
+++ b/config/locales/ku.yml
@@ -38,7 +38,7 @@ ku:
       one: şandî
       other: şandî
     status_count_before: Hatin weşan
-    tagline: Hevalên xwe bişopîne û yên nû bibîne
+    tagline: Tora civakî ya nenavendî
     terms: Peyama mercan
     unavailable_content: Rajekarên li hev kirî
     unavailable_content_description:
@@ -428,6 +428,7 @@ ku:
       destroyed_msg: Navpera asteng kirinê hat rakirin
       domain: Navper
       edit: Astengkirina navperê serrast bike
+      existing_domain_block: Jixwe te sînorên tundtir li ser %{name} daye kirine.
       existing_domain_block_html: Te bi bandorê mezin sînor danî ser %{name}, Divê tu <a href="%{unblock_url}"> asteng kirinê rabikî, pêşî ya </a>.
       new:
         create: Astengkirinekê çê bike
@@ -853,6 +854,26 @@ ku:
       edit_preset: Hişyariyên pêşsazkirî serrast bike
       empty: Te hin tu hişyariyên pêşsazkirî destnîşan nekirine.
       title: Hişyariyên pêşsazkirî bi rêve bibe
+    webhooks:
+      add_new: Xala dawîbûnê tevlî bike
+      delete: Jê bibe
+      description_html: "<strong>çengeleke tevnê</strong> dihêle ku Mastodon <strong>agahdariyên dema-rastîn</strong> ên derbarê çalakiyên hilbijartî de bisepîne ser sepana te, bi vî awayî sepana te dikare <strong>reaksiyonan bi awayekî bixweber nîşan bide</strong>."
+      disable: Neçalak bike
+      disabled: Neçalakkirî
+      edit: Xala dawîbûnê serrast bike
+      empty: Hîn çengela tevnê ya xala dawîbûnê ya te ku hatiye pevesazkirin tune ne.
+      enable: Çalak bike
+      enabled: Çalak
+      enabled_events:
+        one: 1 bûyer çalakkirî
+        other: "%{count} bûyer çalakkirî"
+      events: Bûyer
+      new: Çengela tevnê ya nû
+      rotate_secret: Veşartî bizivirîne
+      secret: Îmzekirina veşartî
+      status: Rewş
+      title: Çengelên tevnê
+      webhook: Çengela tevnê
   admin_mailer:
     new_appeal:
       actions:
@@ -917,7 +938,6 @@ ku:
   applications:
     created: Sepan bi awayekî serkeftî hat çêkirin
     destroyed: Sepan bi awayekî serkeftî hat jêbirin
-    invalid_url: URL ya hatiye dayîn ne derbasdar e
     regenerate_token: Nîşandera gihandinê bi nûve çêbike
     token_regenerated: Nîşandera gihandinê bi serkeftî nû ve hat çêkirin
     warning: Bi van daneyan re pir baldar be. Tu caran bi kesî re parve neke!
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 864d2f43f..5846f7d5d 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -353,7 +353,6 @@ lt:
   applications:
     created: Aplikacija sėkmingai sukurta
     destroyed: Aplikacija sėkmingai ištrinta
-    invalid_url: Gauta URL nuoroda netinkama
     regenerate_token: Regeneruoti prieigos žetoną
     token_regenerated: Prieigos žetonas sėkmingai sugeneruotas
     warning: Būkite atsargūs su šia informacija. Niekada jos nesidalinkite!
diff --git a/config/locales/lv.yml b/config/locales/lv.yml
index e7882c510..2ceec30b2 100644
--- a/config/locales/lv.yml
+++ b/config/locales/lv.yml
@@ -39,13 +39,13 @@ lv:
       other: ziņas
       zero: nav
     status_count_before: Kurš publicējis
-    tagline: Seko draugiem un atrodi jaunus
+    tagline: Decentralizēts sociālais tīkls
     terms: Pakalpojuma noteikumi
     unavailable_content: Moderētie serveri
     unavailable_content_description:
       domain: Serveris
       reason: Iemesls
-      rejecting_media: 'Multivides faili no šiem serveriem netiks apstrādāti vai saglabāti, un netiks parādīti sīktēli, kuriem nepieciešama manuāla noklikšķināšana uz sākotnējā faila:'
+      rejecting_media: 's faili no šiem serveriem netiks apstrādāti vai saglabāti, un netiks parādīti sīktēli, kuriem nepieciešama manuāla noklikšķināšana uz sākotnējā faila:'
       rejecting_media_title: Filtrēts saturs
       silenced: 'Ziņas no šiem serveriem tiks paslēptas publiskās ziņu lentās un sarunās, un no lietotāju mijiedarbības netiks ģenerēti paziņojumi, ja vien tu tiem nesekosi:'
       silenced_title: Ierobežoti serveri
@@ -72,7 +72,7 @@ lv:
     joined: Pievienojās %{date}
     last_active: pēdējā aktivitāte
     link_verified_on: Šīs saites piederība tika pārbaudīta %{date}
-    media: Mediji
+    media: Multivide
     moved_html: "%{name} ir pārcēlies uz %{new_profile_link}:"
     network_hidden: Šāda informācija nav pieejama
     nothing_here: Te nekā nav!
@@ -437,6 +437,7 @@ lv:
       destroyed_msg: Domēna bloķēšana ir atsaukta
       domain: Domēns
       edit: Rediģēt domēna bloķēšanu
+      existing_domain_block: Tu jau esi noteicis stingrākus ierobežojumus %{name}.
       existing_domain_block_html: Tu jau esi noteicis stingrākus ierobežojumus %{name}, vispirms tev <a href="%{unblock_url}">jāatbloķē</a>.
       new:
         create: Izveodot bloku
@@ -769,7 +770,7 @@ lv:
         report: Ziņojums
       deleted: Dzēstie
       media:
-        title: Mediji
+        title: Multivide
       no_status_selected: Neviena ziņa netika mainīta, jo neviena netika atlasīta
       title: Konta ziņas
       with_media: Ar medijiem
@@ -868,6 +869,27 @@ lv:
       edit_preset: Labot iepriekš iestatītus brīdinājumus
       empty: Tu vēl neesi definējis iepriekš iestatītos brīdinājumus.
       title: Pārvaldīt brīdinājuma iestatījumus
+    webhooks:
+      add_new: Pievienot galapunktu
+      delete: Dzēst
+      description_html: Izmantojot <strong>tīmekļa aizķeri</strong>, Mastodon var nosūtīt jūsu lietojumprogrammai <strong>reāllaika paziņojumus</strong> par izvēlētajiem notikumiem, lai tava lietojumprogramma varētu <strong>automātiski izraisīt reakcijas</strong>.
+      disable: Atspējot
+      disabled: Atspējots
+      edit: Rediģēt galapunktu
+      empty: Tev vēl nav konfigurēts neviens tīmekļa aizķeres galapunkts.
+      enable: Iespējot
+      enabled: Aktīvie
+      enabled_events:
+        one: 1 iespējots notikums
+        other: "%{count} iespējoti notikumi"
+        zero: "%{count} iespējotu notikumu"
+      events: Notikumi
+      new: Jauna tīmekļa aizķere
+      rotate_secret: Pagriezt noslēpumu
+      secret: Paraksta noslēpums
+      status: Statuss
+      title: Tīmekļa āķi
+      webhook: Tīmekļa āķis
   admin_mailer:
     new_appeal:
       actions:
@@ -932,7 +954,6 @@ lv:
   applications:
     created: Lietojumprogramma ir veiksmīgi izveidota
     destroyed: Lietojumprogramma ir veiksmīgi dzēsta
-    invalid_url: Norādītais URL nav derīgs
     regenerate_token: Atjaunot piekļuves marķieri
     token_regenerated: Piekļuves marķieris veiksmīgi atjaunots
     warning: Esi ļoti uzmanīgs ar šiem datiem. Nekad nedalies ne ar vienu ar tiem!
diff --git a/config/locales/ml.yml b/config/locales/ml.yml
index daee6098c..f035633ca 100644
--- a/config/locales/ml.yml
+++ b/config/locales/ml.yml
@@ -15,7 +15,6 @@ ml:
     see_whats_happening: എന്തൊക്കെ സംഭവിക്കുന്നു എന്ന് കാണുക
     source_code: സോഴ്സ് കോഡ്
     status_count_before: ആരാൽ എഴുതപ്പെട്ടു
-    tagline: സുഹൃത്തുക്കളെ പിന്തുടരുകയും പുതിയവരെ കണ്ടെത്തുകയും ചെയ്യുക
     terms: സേവന വ്യവസ്ഥകൾ
     unavailable_content: ലഭ്യമല്ലാത്ത ഉള്ളടക്കം
     unavailable_content_description:
diff --git a/config/locales/ms.yml b/config/locales/ms.yml
index 4e101a890..d400d3256 100644
--- a/config/locales/ms.yml
+++ b/config/locales/ms.yml
@@ -34,7 +34,6 @@ ms:
     status_count_after:
       other: hantaran
     status_count_before: Siapa terbitkan
-    tagline: Ikuti rakan lama dan terokai rakan baharu
     terms: Terma perkhidmatan
     unavailable_content: Pelayan disederhanakan
     unavailable_content_description:
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 764ae42d6..db49efbb9 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -36,7 +36,7 @@ nl:
       one: toot
       other: berichten
     status_count_before: Zij schreven
-    tagline: Vrienden volgen en nieuwe ontdekken
+    tagline: Gedecentraliseerd sociaal netwerk
     terms: Gebruiksvoorwaarden
     unavailable_content: Gemodereerde servers
     unavailable_content_description:
@@ -680,7 +680,6 @@ nl:
   applications:
     created: Aanmaken toepassing geslaagd
     destroyed: Verwijderen toepassing geslaagd
-    invalid_url: De opgegeven URL is ongeldig
     regenerate_token: Toegangscode opnieuw aanmaken
     token_regenerated: Opnieuw aanmaken toegangscode geslaagd
     warning: Wees voorzichtig met deze gegevens. Deel het nooit met iemand anders!
diff --git a/config/locales/nn.yml b/config/locales/nn.yml
index ea5020bbf..5218270da 100644
--- a/config/locales/nn.yml
+++ b/config/locales/nn.yml
@@ -30,7 +30,6 @@ nn:
     server_stats: 'Tenarstatistikk:'
     source_code: Kjeldekode
     status_count_before: Som skreiv
-    tagline: Fylg vener og oppdag nye
     terms: Brukarvilkår
     unavailable_content: Utilgjengeleg innhald
     unavailable_content_description:
@@ -634,7 +633,6 @@ nn:
   applications:
     created: Søknad laga
     destroyed: Søknad sletta
-    invalid_url: Denne lenkja er ugyldig
     regenerate_token: Lag tilgangsnykel på nytt
     token_regenerated: Tilgangsnykel laga på nytt
     warning: Ver varsam med dette datumet. Aldri del det med nokon!
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 4abc8f086..30b7a56fb 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -33,7 +33,6 @@
       one: innlegg
       other: statuser
     status_count_before: Som skrev
-    tagline: Følg venner og oppdag nye
     terms: Bruksvilkår
     unavailable_content: Utilgjengelig innhold
     unavailable_content_description:
@@ -629,7 +628,6 @@
   applications:
     created: Søknaden ble vellykket oppretttet
     destroyed: Søknaden ble vellykket slettet
-    invalid_url: Den oppgitte URLen er ugyldig
     regenerate_token: Regenerer tilgangsnøkkel
     token_regenerated: Tilgangsnøkkel vellykket regenerert
     warning: Vær veldig forsiktig med denne data. Aldri del den med noen!
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 678d5d0dc..57cecbdc4 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -31,7 +31,6 @@ oc:
       one: estatut
       other: estatuts
     status_count_before: qu’an escrich
-    tagline: Seguètz d’amics e trobatz-ne de nòus
     terms: Condicions d’utilizacion
     unavailable_content: Contengut pas disponible
     unavailable_content_description:
@@ -573,7 +572,6 @@ oc:
   applications:
     created: Aplicacion ben creada
     destroyed: Aplication corrcètament suprimida
-    invalid_url: L’URL donada es invalida
     regenerate_token: Tornar generar lo geton d’accès
     token_regenerated: Geton d’accès ben regenerat
     warning: Mèfi ! Agachatz de partejar aquela donada amb degun !
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 845e0237d..7557ab83f 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -40,7 +40,6 @@ pl:
       one: wpisu
       other: wpisów
     status_count_before: Są autorami
-    tagline: Śledź znajomych i poznawaj nowych
     terms: Zasady użytkowania
     unavailable_content: Niedostępne treści
     unavailable_content_description:
@@ -446,6 +445,7 @@ pl:
       destroyed_msg: Blokada domeny nie może zostać odwrócona
       domain: Domena
       edit: Edytuj blokadę domeny
+      existing_domain_block: Już nałożyłeś surowsze limity na %{name}.
       existing_domain_block_html: Już narzuciłeś bardziej rygorystyczne limity na %{name}, musisz najpierw <a href="%{unblock_url}">je odblokować</a>.
       new:
         create: Utwórz blokadę
@@ -870,6 +870,28 @@ pl:
       edit_preset: Edytuj szablon ostrzeżenia
       empty: Nie zdefiniowano jeszcze żadnych szablonów ostrzegawczych.
       title: Zarządzaj szablonami ostrzeżeń
+    webhooks:
+      add_new: Dodaj punkt końcowy
+      delete: Usuń
+      description_html: "<strong>webhook</strong> umożliwia Mastodon dostarczanie <strong>powiadomień w czasie rzeczywistym</strong> o wybranych wydarzeniach do twojej aplikacji, aby mogła <strong>automatycznie wyzwalać reakcje</strong>."
+      disable: Wyłącz
+      disabled: Wyłączone
+      edit: Edytuj punkt końcowy
+      empty: Nie masz jeszcze skonfigurowanych żadnych webhooków do punktów końcowych.
+      enable: Włącz
+      enabled: Aktywne
+      enabled_events:
+        few: "%{count} włączone zdarzenia"
+        many: "%{count} włączonych zdarzeń"
+        one: 1 włączone zdarzenie
+        other: "%{count} włączonych zdarzeń"
+      events: Zdarzenia
+      new: Nowy webhook
+      rotate_secret: Odśwież klucz szyfrowania
+      secret: Podpisywanie klucza szyfrowania
+      status: Stan
+      title: Webhooki
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -934,7 +956,6 @@ pl:
   applications:
     created: Pomyślnie utworzono aplikację
     destroyed: Pomyślnie usunięto aplikację
-    invalid_url: Wprowadzony adres URL jest nieprawidłowy
     regenerate_token: Wygeneruj nowy token dostępu
     token_regenerated: Pomyślnie wygenerowano nowy token dostępu
     warning: Przechowuj te dane ostrożnie. Nie udostępniaj ich nikomu!
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index b24811049..7661df9a0 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -38,7 +38,6 @@ pt-BR:
       one: toot
       other: toots
     status_count_before: Autores de
-    tagline: Siga seus amigos e faça novas amizades
     terms: Termos de serviço
     unavailable_content: Conteúdo indisponível
     unavailable_content_description:
@@ -428,6 +427,7 @@ pt-BR:
       destroyed_msg: Domínio desbloqueado
       domain: Domínio
       edit: Editar bloqueio de domínio
+      existing_domain_block: Você já impôs limites mais rigorosos em %{name}.
       existing_domain_block_html: Você já impôs limites mais estritos em %{name}, você precisa <a href="%{unblock_url}">desbloqueá-lo</a> primeiro.
       new:
         create: Criar bloqueio
@@ -615,6 +615,7 @@ pt-BR:
       forwarded: Encaminhados
       forwarded_to: Encaminhado para %{domain}
       mark_as_resolved: Marcar como resolvido
+      mark_as_sensitive: Marcar como sensível
       mark_as_unresolved: Marcar como não resolvido
       no_one_assigned: Ninguém
       notes:
@@ -800,6 +801,7 @@ pt-BR:
         usable: Pode ser usado
         usage_comparison: Usado %{today} vezes hoje, em comparação com %{yesterday} de ontem
       title: Em alta
+      trending: Em alta
     warning_presets:
       add_new: Adicionar novo
       delete: Excluir
@@ -807,6 +809,12 @@ pt-BR:
       empty: Você ainda não definiu nenhuma predefinição de alerta.
       title: Gerenciar os avisos pré-definidos
   admin_mailer:
+    new_appeal:
+      actions:
+        delete_statuses: para excluir suas publicações
+        none: um aviso
+        sensitive: para marcar sua conta como sensível
+        silence: para limitar sua conta
     new_pending_account:
       body: Os detalhes da nova conta estão abaixo. Você pode aprovar ou vetar.
       subject: Nova conta para revisão em %{instance} (%{username})
@@ -851,7 +859,6 @@ pt-BR:
   applications:
     created: Aplicativo criado com sucesso
     destroyed: Aplicativo excluído com sucesso
-    invalid_url: O link fornecido é inválido
     regenerate_token: Gerar código de acesso
     token_regenerated: Código de acesso gerado com sucesso
     warning: Tenha cuidado com estes dados. Nunca compartilhe com alguém!
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index 2765bf941..9607762bb 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -38,7 +38,7 @@ pt-PT:
       one: publicação
       other: publicações
     status_count_before: Que fizeram
-    tagline: Siga os seus amigos e descubra novas amizades
+    tagline: Rede social descentralizada
     terms: Termos de serviço
     unavailable_content: Conteúdo indisponível
     unavailable_content_description:
@@ -428,6 +428,7 @@ pt-PT:
       destroyed_msg: Bloqueio de domínio está a ser removido
       domain: Domínio
       edit: Editar bloqueio de domínio
+      existing_domain_block: Já impôs limites mais rigorosos a %{name}.
       existing_domain_block_html: Você já impôs limites mais restritivos a %{name}, é necessário primeiro <a href="%{unblock_url}">desbloqueá-lo</a>.
       new:
         create: Criar bloqueio
@@ -851,6 +852,26 @@ pt-PT:
       edit_preset: Editar o aviso predefinido
       empty: Ainda não definiu nenhum aviso predefinido.
       title: Gerir os avisos predefinidos
+    webhooks:
+      add_new: Adicionar endpoint
+      delete: Eliminar
+      description_html: Um <strong>webhook</strong> possibilita que o Mastodon envie <strong>notificações em tempo real</strong> de eventos seleccionados, para um seu aplicativo, para que este possa <strong>acionar ações automaticamente</strong>.
+      disable: Desativar
+      disabled: Desativado
+      edit: Editar endpoint
+      empty: Não tem ainda qualquer endpoint de webhook configurado.
+      enable: Ativar
+      enabled: Activo
+      enabled_events:
+        one: 1 evento ativado
+        other: "%{count} eventos ativados"
+      events: Eventos
+      new: Novo webhook
+      rotate_secret: Alternar segredo
+      secret: Segredo de assinatura
+      status: Estado
+      title: Webhooks
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -915,7 +936,6 @@ pt-PT:
   applications:
     created: Aplicação criada com sucesso
     destroyed: Aplicação eliminada com sucesso
-    invalid_url: O URL é inválido
     regenerate_token: Regenerar token de acesso
     token_regenerated: Token de acesso regenerado com sucesso
     warning: Cuidado com estes dados. Não partilhar com ninguém!
diff --git a/config/locales/ro.yml b/config/locales/ro.yml
index d13aa5464..3203e9178 100644
--- a/config/locales/ro.yml
+++ b/config/locales/ro.yml
@@ -36,7 +36,6 @@ ro:
       one: stare
       other: de stări
     status_count_before: Care au postat
-    tagline: Urmăriți prietenii și descoperiți alții noi
     terms: Termeni de serviciu
     unavailable_content: Conținut indisponibil
     unavailable_content_description:
@@ -295,7 +294,6 @@ ro:
   applications:
     created: Aplicație creată cu succes
     destroyed: Aplicație ștearsă cu succes
-    invalid_url: URL-ul furnizat nu este valid
     regenerate_token: Regenerează token-ul de acces
     token_regenerated: Token de acces regenerat cu succes
     warning: Fiți foarte atent cu aceste date. Nu le împărtășiți niciodată cu cineva!
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index c0495c3ee..47f944129 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -40,7 +40,7 @@ ru:
       one: пост
       other: поста
     status_count_before: И опубликовано
-    tagline: Подписывайтесь на друзей и заводите новые знакомства
+    tagline: Децентрализованная социальная сеть
     terms: Условия использования
     unavailable_content: Недоступный контент
     unavailable_content_description:
@@ -403,6 +403,16 @@ 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_users_html:
+        few: "<strong>%{count}</strong> ожидающих пользователя"
+        many: "<strong>%{count}</strong> ожидающих пользователей"
+        one: "<strong>%{count}</strong> ожидающий пользователь"
+        other: "<strong>%{count}</strong> ожидающих пользователей"
       resolved_reports: жалоб решено
       software: Программное обеспечение
       sources: Источники регистрации
@@ -426,6 +436,7 @@ ru:
       destroyed_msg: Блокировка домена снята
       domain: Домен
       edit: Редактировать блокировку
+      existing_domain_block: Вы уже установили более строгие ограничения для %{name}.
       existing_domain_block_html: Вы уже ввели более строгие ограничения на %{name}, вам нужно <a href="%{unblock_url}">разблокировать его</a> сначала.
       new:
         create: Создать блокировку
@@ -495,8 +506,13 @@ ru:
         comment: Внутренняя заметка
         policies:
           reject_media: Отклонить медиа
+          silence: Лимит
+          suspend: Приостановить
         policy: Политика
+        reason: Публичная причина
+        title: Политика контента
       dashboard:
+        instance_accounts_dimension: Популярные аккаунты
         instance_accounts_measure: сохраненные учетные записи
         instance_languages_dimension: Популярные языки
         instance_media_attachments_measure: сохраненные медиафайлы
@@ -796,6 +812,10 @@ ru:
         title: Издатели
       rejected: Отклонённые
       statuses:
+        allow: Разрешить пост
+        allow_account: Разрешить автора
+        disallow: Запретить пост
+        disallow_account: Запретить автора
         title: Популярные посты
       tags:
         current_score: Текущий счет %{score}
@@ -811,6 +831,7 @@ ru:
         peaked_on_and_decaying: Последний пик — %{date}, сейчас идёт на спад
         title: Актуальные хэштеги
         trendable: Может появляться в списке «актуального»
+        trending_rank: 'Популярное #%{rank}'
         usable: Может использоваться
         usage_comparison: Использовано %{today} сегодня, для сравнения вчера %{yesterday}
         used_by_over_week:
@@ -826,12 +847,35 @@ ru:
       edit_preset: Удалить шаблон предупреждения
       empty: Вы еще не определили пресеты предупреждений.
       title: Управление шаблонами предупреждений
+    webhooks:
+      add_new: Добавить конечную точку
+      delete: Удалить
+      description_html: "<strong>Вебхуки</strong> позволяют Mastodon отправлять вашим приложениям <strong>уведомления в реальном времени</strong> о выбранных происходящих событиях, а они могут <strong>обрабатывать их в автоматическом режиме</strong>."
+      disable: Отключить
+      disabled: Отключено
+      edit: Редактировать вебхук
+      empty: У вас пока нет настроенных конечных точек вебхуков.
+      enable: Включить
+      enabled: Активен
+      enabled_events:
+        few: "%{count} события включено"
+        many: "%{count} событий включено"
+        one: "%{count} событие включено"
+        other: "%{count} событий включено"
+      events: События
+      new: Новый вебхук
+      rotate_secret: Сгенерировать новый
+      secret: Ключ подписи
+      status: Состояние
+      title: Вебхуки
+      webhook: Вебхук
   admin_mailer:
     new_appeal:
       actions:
         none: предупреждение
         silence: ограничить учётную запись
         suspend: приостановить действие учётной записи
+      body: "%{target} обжалуют решение модератора %{action_taken_by} от %{date}, которое %{type}. Они написали:"
       subject: "%{username} обжалует решение модерации на %{instance}"
     new_pending_account:
       body: Ниже указана информация учётной записи. Вы можете одобрить или отклонить заявку.
@@ -847,6 +891,7 @@ ru:
       new_trending_statuses:
         title: Популярные посты
       new_trending_tags:
+        no_approved_tags: На данный момент популярные подтвержденные хэштеги отсутствуют.
         title: Популярные хэштеги
   aliases:
     add_new: Создать псевдоним
@@ -877,7 +922,6 @@ ru:
   applications:
     created: Приложение успешно создано
     destroyed: Приложение успешно удалено
-    invalid_url: Введенный URL неверен
     regenerate_token: Повторно сгенерировать токен доступа
     token_regenerated: Токен доступа успешно сгенерирован
     warning: Будьте очень внимательны с этими данными. Не делитесь ими ни с кем!
@@ -1008,9 +1052,12 @@ ru:
       title: "%{action} от %{date}"
       title_actions:
         delete_statuses: Удаление поста
+        disable: Заморозка аккаунта
         mark_statuses_as_sensitive: Помечать посты как деликатные
+        none: Требующие внимания
         sensitive: Отметить учетную запись как деликатную
         silence: Ограничение учетной записи
+        suspend: Приостановка Аккаунта
       your_appeal_approved: Ваша апелляция одобрена
       your_appeal_pending: Вы подали апелляцию
       your_appeal_rejected: Ваша апелляция отклонена
diff --git a/config/locales/sc.yml b/config/locales/sc.yml
index 99cd3f0b5..490654143 100644
--- a/config/locales/sc.yml
+++ b/config/locales/sc.yml
@@ -35,7 +35,6 @@ sc:
       one: istadu
       other: istados
     status_count_before: Atributzione de
-    tagline: Sighi is amistades tuas e iscoberi·nde àteras
     terms: Cunditziones de su servìtziu
     unavailable_content: Serbidores moderados
     unavailable_content_description:
@@ -659,7 +658,6 @@ sc:
   applications:
     created: Aplicatzione creada
     destroyed: Aplicatzione cantzellada
-    invalid_url: S'URL frunidu no est curretu
     regenerate_token: Torra a generare s'identificadore de atzessu
     token_regenerated: Identificadore de atzessu generadu
     warning: Dae cara a custos datos. Non ddos cumpartzas mai cun nemos!
diff --git a/config/locales/simple_form.af.yml b/config/locales/simple_form.af.yml
index 252f9fd5a..a52c53eba 100644
--- a/config/locales/simple_form.af.yml
+++ b/config/locales/simple_form.af.yml
@@ -1 +1,11 @@
+---
 af:
+  simple_form:
+    hints:
+      webhook:
+        events: Kies gebeurtenisse om te stuur
+        url: Waarheen gebeurtenisse gestuur sal word
+    labels:
+      webhook:
+        events: Geaktiveerde gebeurtenisse
+        url: End-punt URL
diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml
index 2e0632648..ccbb90282 100644
--- a/config/locales/simple_form.ca.yml
+++ b/config/locales/simple_form.ca.yml
@@ -91,6 +91,9 @@ ca:
         name: Només pots canviar la caixa de les lletres, per exemple, per fer-la més llegible
       user:
         chosen_languages: Quan estigui marcat, només es mostraran les publicacions en les llengües seleccionades en les línies de temps públiques
+      webhook:
+        events: Selecciona esdeveniments a enviar
+        url: On els esdeveniments seran enviats
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ ca:
         name: Etiqueta
         trendable: Permet que aquesta etiqueta aparegui en les tendències
         usable: Permetre a les publicacions emprar aquesta etiqueta
+      webhook:
+        events: Esdeveniments activats
+        url: URL del extrem
     'no': 'No'
     recommended: Recomanat
     required:
diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml
index 8c90f5ad8..9221152f4 100644
--- a/config/locales/simple_form.cs.yml
+++ b/config/locales/simple_form.cs.yml
@@ -91,6 +91,9 @@ cs:
         name: Můžete měnit pouze velikost písmen, například kvůli lepší čitelnosti
       user:
         chosen_languages: Po zaškrtnutí budou ve veřejných časových osách zobrazeny pouze příspěvky ve zvolených jazycích
+      webhook:
+        events: Zvolte odesílané události
+        url: Kam budou události odesílány
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ cs:
         name: Hashtag
         trendable: Povolit zobrazení tohoto hashtagu mezi populárními
         usable: Povolit používat tento hashtag v příspěvcích
+      webhook:
+        events: Zapnuté události
+        url: URL koncového bodu
     'no': Ne
     required:
       mark: "*"
diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml
index 5d54e029a..bf735091f 100644
--- a/config/locales/simple_form.da.yml
+++ b/config/locales/simple_form.da.yml
@@ -91,6 +91,9 @@ da:
         name: Kun bogstavtyper (store/små) kan ændres, eksempelvis for at gøre det mere læsbart
       user:
         chosen_languages: Når markeret, vil kun indlæg på de valgte sprog fremgå på offentlige tidslinjer
+      webhook:
+        events: Vælg begivenheder at sende
+        url: Hvor begivenheder sendes til
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ da:
         name: Hashtag
         trendable: Tillad visning af dette hashtag under trends
         usable: Tillad indlæg at benytte dette hashtag
+      webhook:
+        events: Aktive begivenheder
+        url: Endepunkts-URL
     'no': Nej
     required:
       mark: "*"
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index 97b4f04fe..464ed3faf 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -91,6 +91,9 @@ de:
         name: Du kannst zum Beispiel nur die Groß- und Kleinschreibung der Buchstaben ändern, um es lesbarer zu machen
       user:
         chosen_languages: Wenn aktiviert, werden nur Beiträge in den ausgewählten Sprachen auf den öffentlichen Zeitleisten angezeigt
+      webhook:
+        events: Zu sendende Ereignisse auswählen
+        url: Wo Ereignisse hingesendet werden
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ de:
         name: Hashtag
         trendable: Erlaube es diesen Hashtag in den Trends erscheinen zu lassen
         usable: Beiträge erlauben, diesen Hashtag zu verwenden
+      webhook:
+        events: Aktivierte Ereignisse
+        url: Endpunkt-URL
     'no': Nein
     required:
       mark: "*"
diff --git a/config/locales/simple_form.en-GB.yml b/config/locales/simple_form.en-GB.yml
new file mode 100644
index 000000000..ef03d1810
--- /dev/null
+++ b/config/locales/simple_form.en-GB.yml
@@ -0,0 +1 @@
+en-GB:
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index b1bf5c9fd..ae97c4d8d 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -91,6 +91,9 @@ en:
         name: You can only change the casing of the letters, for example, to make it more readable
       user:
         chosen_languages: When checked, only posts in selected languages will be displayed in public timelines
+      webhook:
+        events: Select events to send
+        url: Where events will be sent to
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ en:
         name: Hashtag
         trendable: Allow this hashtag to appear under trends
         usable: Allow posts to use this hashtag
+      webhook:
+        events: Enabled events
+        url: Endpoint URL
     'no': 'No'
     required:
       mark: "*"
diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml
index 3660909f3..a6e070fd0 100644
--- a/config/locales/simple_form.es-AR.yml
+++ b/config/locales/simple_form.es-AR.yml
@@ -91,6 +91,9 @@ es-AR:
         name: Sólo podés cambiar la capitalización de las letras, por ejemplo, para que sea más legible
       user:
         chosen_languages: Cuando estén marcados, sólo se mostrarán los mensajes en los idiomas seleccionados en las líneas temporales públicas
+      webhook:
+        events: Seleccionar eventos para enviar
+        url: Adónde serán enviados los eventos
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ es-AR:
         name: Etiqueta
         trendable: Permitir que esta etiqueta aparezca bajo tendencias
         usable: Permitir a los mensajes usar esta etiqueta
+      webhook:
+        events: Eventos habilitados
+        url: Dirección web del punto final
     'no': 'No'
     required:
       mark: "*"
diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml
index d02e97a3a..66efd68ab 100644
--- a/config/locales/simple_form.es-MX.yml
+++ b/config/locales/simple_form.es-MX.yml
@@ -49,6 +49,7 @@ es-MX:
         phrase: Se aplicará sin importar las mayúsculas o los avisos de contenido de un toot
         scopes: Qué APIs de la aplicación tendrán acceso. Si seleccionas el alcance de nivel mas alto, no necesitas seleccionar las individuales.
         setting_aggregate_reblogs: No mostrar nuevos retoots para los toots que han sido recientemente retooteados (sólo afecta a los retoots recibidos recientemente)
+        setting_always_send_emails: Normalmente las notificaciones por correo electrónico no se enviarán cuando estés usando Mastodon activamente
         setting_default_sensitive: El contenido multimedia sensible está oculto por defecto y puede ser mostrado con un click
         setting_display_media_default: Ocultar contenido multimedia marcado como sensible
         setting_display_media_hide_all: Siempre ocultar todo el contenido multimedia
@@ -151,6 +152,7 @@ es-MX:
         phrase: Palabra clave o frase
         setting_advanced_layout: Habilitar interfaz web avanzada
         setting_aggregate_reblogs: Agrupar retoots en las líneas de tiempo
+        setting_always_send_emails: Enviar siempre notificaciones por correo
         setting_auto_play_gif: Reproducir automáticamente los GIFs animados
         setting_boost_modal: Mostrar ventana de confirmación antes de un Retoot
         setting_crop_images: Recortar a 16x9 las imágenes de los toots no expandidos
diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml
index 53c6d9c45..53863ba31 100644
--- a/config/locales/simple_form.es.yml
+++ b/config/locales/simple_form.es.yml
@@ -91,6 +91,9 @@ es:
         name: Sólo se puede cambiar el cajón de las letras, por ejemplo, para que sea más legible
       user:
         chosen_languages: Cuando se marca, solo se mostrarán las publicaciones en los idiomas seleccionados en las líneas de tiempo públicas
+      webhook:
+        events: Seleccionar eventos para enviar
+        url: Donde los eventos serán enviados
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ es:
         name: Etiqueta
         trendable: Permitir que esta etiqueta aparezca bajo tendencias
         usable: Permitir a las publicaciones usar esta etiqueta
+      webhook:
+        events: Eventos habilitados
+        url: URL de Endpoint
     'no': 'No'
     recommended: Recomendado
     required:
diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml
index 3aef079a2..672ad34b7 100644
--- a/config/locales/simple_form.fr.yml
+++ b/config/locales/simple_form.fr.yml
@@ -91,6 +91,9 @@ fr:
         name: Vous ne pouvez modifier que la casse des lettres, par exemple, pour le rendre plus lisible
       user:
         chosen_languages: Lorsque coché, seuls les messages dans les langues sélectionnées seront affichés sur les fils publics
+      webhook:
+        events: Sélectionnez les événements à envoyer
+        url: Là où les événements seront envoyés
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ fr:
         name: Hashtag
         trendable: Autoriser ce hashtag à apparaitre dans les tendances
         usable: Autoriser les messages à utiliser ce hashtag
+      webhook:
+        events: Événements activés
+        url: URL du point de terminaison
     'no': Non
     required:
       mark: "*"
diff --git a/config/locales/simple_form.fy.yml b/config/locales/simple_form.fy.yml
new file mode 100644
index 000000000..b568750e2
--- /dev/null
+++ b/config/locales/simple_form.fy.yml
@@ -0,0 +1,6 @@
+---
+fy:
+  simple_form:
+    labels:
+      notification_emails:
+        mention: Ien hat jo fermeld
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index 0a8523f34..4d28b2f2a 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -91,6 +91,9 @@ gl:
         name: Só podes cambiar maiús/minúsculas, por exemplo, mellorar a lexibilidade
       user:
         chosen_languages: Se ten marca, só as publicacións nos idiomas seleccionados serán mostrados en cronoloxías públicas
+      webhook:
+        events: Elexir eventos a enviar
+        url: Cando serán enviados os eventos
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ gl:
         name: Cancelo
         trendable: Permitir que este cancelo apareza en tendencias
         usable: Permitir que as publicacións utilicen este cancelo
+      webhook:
+        events: Eventos activados
+        url: URL do extremo
     'no': Non
     required:
       mark: "*"
diff --git a/config/locales/simple_form.he.yml b/config/locales/simple_form.he.yml
index 6faf1842a..c7fe6026c 100644
--- a/config/locales/simple_form.he.yml
+++ b/config/locales/simple_form.he.yml
@@ -91,6 +91,8 @@ he:
         name: ניתן רק להחליף בין אותיות קטנות וגדולות, למשל כדי לשפר את הקריאות
       user:
         chosen_languages: אם פעיל, רק חצרוצים בשפות הנבחרות יוצגו לפידים הפומביים
+      webhook:
+        events: בחר אירועים לשליחה
     labels:
       account:
         fields:
diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml
index c8b09bc0f..fa8ea5755 100644
--- a/config/locales/simple_form.hu.yml
+++ b/config/locales/simple_form.hu.yml
@@ -91,6 +91,9 @@ hu:
         name: Csak a kis/nagybetűséget változtathatod meg, pl. hogy olvashatóbb legyen
       user:
         chosen_languages: Ha aktív, csak a kiválasztott nyelvű bejegyzések jelennek majd meg a nyilvános idővonalon
+      webhook:
+        events: Válaszd ki a küldendő eseményeket
+        url: Ahová az eseményket küldjük
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ hu:
         name: Hashtag
         trendable: A hashtag megjelenhet a felkapottak között
         usable: Bejegyzések használhatják ezt a hashtaget
+      webhook:
+        events: Engedélyezett események
+        url: Végponti URL
     'no': Nem
     required:
       mark: "*"
diff --git a/config/locales/simple_form.io.yml b/config/locales/simple_form.io.yml
index 0e2d5e3a9..5f72276b7 100644
--- a/config/locales/simple_form.io.yml
+++ b/config/locales/simple_form.io.yml
@@ -91,6 +91,9 @@ io:
         name: Vu povas nur chanjar literkaso, por exemplo, por kauzigar lu divenar plu lektebla
       user:
         chosen_languages: Kande marketigesis, nur posti en selektesis lingui montresos en publika tempolinei
+      webhook:
+        events: Selektigez eventi por sendar
+        url: Ibe eventi sendesos
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ io:
         name: Hashtago
         trendable: Permisez ca hashtago aparar che tendenci
         usable: Permisez posti uzar ca hashtago
+      webhook:
+        events: Aktivigita eventi
+        url: URL di finpunto
     'no': Ne
     recommended: Rekomendito
     required:
diff --git a/config/locales/simple_form.it.yml b/config/locales/simple_form.it.yml
index 8af94564f..01c657bd1 100644
--- a/config/locales/simple_form.it.yml
+++ b/config/locales/simple_form.it.yml
@@ -91,6 +91,9 @@ it:
         name: Puoi cambiare solo il minuscolo/maiuscolo delle lettere, ad esempio, per renderlo più leggibile
       user:
         chosen_languages: Quando una o più lingue sono contrassegnate, nelle timeline pubbliche vengono mostrati solo i toot nelle lingue selezionate
+      webhook:
+        events: Seleziona eventi da inviare
+        url: Dove gli eventi saranno inviati
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ it:
         name: Hashtag
         trendable: Permetti a questo hashtag di apparire nelle tendenze
         usable: Permetti ai post di usare questo hashtag
+      webhook:
+        events: Eventi abilitati
+        url: URL endpoint
     'no': 'No'
     required:
       mark: "*"
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index dd88ea05a..396bff320 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -219,6 +219,9 @@ ja:
         name: ハッシュタグ
         trendable: トレンドへの表示を許可する
         usable: 投稿への使用を許可する
+      webhook:
+        events: 有効なイベント
+        url: エンドポイントURL
     'no': いいえ
     required:
       mark: "*"
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index 5112d7c97..d785f30b3 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -37,7 +37,7 @@ ko:
         current_password: 보안을 위해 현재 계정의 암호를 입력해주세요
         current_username: 확인을 위해, 현재 계정의 사용자명을 입력해주세요
         digest: 오랫동안 활동하지 않았을 때 받은 멘션들에 대한 요약 받기
-        discoverable: 추천, 트렌드 및 기타 기능을 통해 낯선 사람이 귀하의 계정을 찾을 수 있도록 허용합니다
+        discoverable: 추천, 트렌드 및 기타 기능을 통해 낯선 사람이 내 계정을 발견할 수 있도록 허용합니다
         email: 당신은 확인 메일을 받게 됩니다
         fields: 당신의 프로파일에 최대 4개까지 표 형식으로 나타낼 수 있습니다
         header: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 축소 됨
@@ -206,10 +206,10 @@ ko:
         digest: 요약 이메일 보내기
         favourite: 누군가 내 상태를 마음에 들어했을 때
         follow: 누군가 나를 팔로우 했을 때
-        follow_request: 누군가 나를 팔로우 하길 원할 때
+        follow_request: 누군가 나를 팔로우 하길 요청할 때
         mention: 누군가 나를 언급했을 때
         pending_account: 새 계정이 심사가 필요할 때
-        reblog: 누군가 내 툿을 부스트 했을 때
+        reblog: 누군가 내 게시물을 부스트 했을 때
         report: 새 신고가 접수되었을 때
         trending_tag: 새 트렌드에 대한 리뷰가 필요할 때
       rule:
diff --git a/config/locales/simple_form.ku.yml b/config/locales/simple_form.ku.yml
index e9e6603cd..9cfe371b5 100644
--- a/config/locales/simple_form.ku.yml
+++ b/config/locales/simple_form.ku.yml
@@ -93,6 +93,9 @@ ku:
         name: Tîpan, mînak ji bo ku bêhtir paknivîs bibe, tenê rewşa tîpên girdek/hûrdek dikarî biguherînî
       user:
         chosen_languages: Dema were nîşankirin, tenê parvekirinên bi zimanên hilbijartî dê di rêzikên giştî de werin nîşandan
+      webhook:
+        events: Bûyeran hilbijêre bo şandinê
+        url: Cihê ku bûyer wê werin şandin
     labels:
       account:
         fields:
@@ -221,6 +224,9 @@ ku:
         name: Hashtag
         trendable: Bihêle ku ev hashtag werê xuyakirin di bin rojevê de
         usable: Bihêle ku şandî ev hashtag bi kar bînin
+      webhook:
+        events: Bûyerên çalakkirî
+        url: Girêdana xala dawîbûnê
     'no': Na
     recommended: Pêşniyarkirî
     required:
diff --git a/config/locales/simple_form.lv.yml b/config/locales/simple_form.lv.yml
index e512551ba..97fa2bff4 100644
--- a/config/locales/simple_form.lv.yml
+++ b/config/locales/simple_form.lv.yml
@@ -91,6 +91,9 @@ lv:
         name: Tu vari mainīt tikai burtu lielumu, piemēram, lai tie būtu vieglāk lasāmi
       user:
         chosen_languages: Ja ieķeksēts, publiskos laika grafikos tiks parādītas tikai ziņas noteiktajās valodās
+      webhook:
+        events: Atlasi nosūtāmos notikums
+        url: Kur notikumi tiks nosūtīti
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ lv:
         name: Tēmturis
         trendable: Atļaut šim tēmturim parādīties zem tendencēm
         usable: Atļaut lietot ziņās šo tēmturi
+      webhook:
+        events: Iespējotie notikumi
+        url: Galapunkta URL
     'no': Nē
     recommended: Ieteicams
     required:
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index 036a0be60..ad3490867 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -91,6 +91,9 @@ pl:
         name: Możesz zmieniać tylko wielkość liter, np. aby były bardziej widoczne
       user:
         chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu
+      webhook:
+        events: Wybierz zdarzenia do wysłania
+        url: Dokąd będą wysłane zdarzenia
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ pl:
         name: Hashtag
         trendable: Pozwól na wyświetlanie tego hashtagu w „Na czasie”
         usable: Pozwól na umieszczanie tego hashtagu we wpisach
+      webhook:
+        events: Włączone zdarzenia
+        url: Endpoint URL
     'no': Nie
     required:
       mark: "*"
diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml
index be260c34a..9e1bbf85f 100644
--- a/config/locales/simple_form.pt-PT.yml
+++ b/config/locales/simple_form.pt-PT.yml
@@ -91,6 +91,9 @@ pt-PT:
         name: Só pode alterar a capitalização das letras, por exemplo, para torná-las mais legíveis
       user:
         chosen_languages: Quando seleccionado, só publicações nas línguas escolhidas serão mostradas nas cronologias públicas
+      webhook:
+        events: Selecione os eventos a enviar
+        url: Para onde os eventos serão enviados
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ pt-PT:
         name: Hashtag
         trendable: Permitir que esta hashtag apareça em destaque
         usable: Permitir que toots utilizem esta hashtag
+      webhook:
+        events: Eventos ativados
+        url: URL do Endpoint
     'no': Não
     required:
       mark: "*"
diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml
index 63559d30c..c274eb85d 100644
--- a/config/locales/simple_form.ru.yml
+++ b/config/locales/simple_form.ru.yml
@@ -91,6 +91,9 @@ ru:
         name: Вы можете изменить только регистр букв чтобы, например, сделать тег более читаемым
       user:
         chosen_languages: Если выбрано, то в публичных лентах будут показаны только посты на выбранных языках.
+      webhook:
+        events: Выберите события для отправки
+        url: Куда события будут отправляться
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ ru:
         name: Хэштег
         trendable: Разрешить показ хэштега в трендах
         usable: Разрешить использовать этот хэштег в постах
+      webhook:
+        events: Включенные события
+        url: Endpoint URL
     'no': Нет
     required:
       mark: "*"
diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml
index 0bdc72a5e..7251a2284 100644
--- a/config/locales/simple_form.sk.yml
+++ b/config/locales/simple_form.sk.yml
@@ -111,7 +111,7 @@ sk:
         max_uses: Najviac možno použiť
         new_password: Nové heslo
         note: O tebe
-        otp_attempt: Dvoj-faktorový overovací (2FA) kód
+        otp_attempt: Dvoj-faktorový overovací kód
         password: Heslo
         phrase: Kľúčové slovo, alebo fráza
         setting_advanced_layout: Zapni pokročilé užívateľské rozhranie
@@ -139,6 +139,7 @@ sk:
         setting_use_blurhash: Ukáž farebné prechody pre skryté médiá
         setting_use_pending_items: Pomalý režim
         severity: Závažnosť
+        sign_in_token_attempt: Bezpečnostný kód
         type: Typ importu
         username: Prezývka
         username_or_email: Prezývka, alebo email
diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml
index dcce30e98..c1d67af91 100644
--- a/config/locales/simple_form.sl.yml
+++ b/config/locales/simple_form.sl.yml
@@ -91,6 +91,9 @@ sl:
         name: Spremenite lahko le npr. velikost črk (velike/male), da je bolj berljivo
       user:
         chosen_languages: Ko je označeno, bodo v javnih časovnicah prikazane samo objave v izbranih jezikih
+      webhook:
+        events: Izberite dogodke za pošiljanje
+        url: Kam bodo poslani dogodki
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ sl:
         name: Ključnik
         trendable: Dovoli, da se ta ključnik pojavi med trendi
         usable: Dovoli, da objave uporabljajo ta ključnik
+      webhook:
+        events: Omogočeni dogodki
+        url: URL končne točke
     'no': Ne
     required:
       mark: "*"
diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml
index 865c8fe87..be348575f 100644
--- a/config/locales/simple_form.sq.yml
+++ b/config/locales/simple_form.sq.yml
@@ -91,6 +91,9 @@ sq:
         name: Mund të ndryshoni shkronjat vetëm nga të mëdha në të vogla ose anasjelltas, për shembull, për t’i bërë më të lexueshme
       user:
         chosen_languages: Në iu vëntë shenjë, te rrjedha kohore publike do të shfaqen vetëm mesazhe në gjuhët e përzgjedhura
+      webhook:
+        events: Përzgjidhni akte për dërgim
+        url: Ku do të dërgohen aktet
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ sq:
         name: Hashtag
         trendable: Lejoje këtë hashtag të shfaqet në prirje
         usable: Lejoji mesazhet të përdorin këtë hashtag
+      webhook:
+        events: Akte të aktivizuar
+        url: URL pikëmbarimi
     'no': Jo
     required:
       mark: "*"
diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml
index 029625475..b0ba21505 100644
--- a/config/locales/simple_form.tr.yml
+++ b/config/locales/simple_form.tr.yml
@@ -91,6 +91,9 @@ tr:
         name: Harflerin, örneğin daha okunabilir yapmak için, sadece büyük/küçük harf durumlarını değiştirebilirsiniz
       user:
         chosen_languages: İşaretlendiğinde, yalnızca seçilen dillerdeki tootlar genel zaman çizelgelerinde görüntülenir
+      webhook:
+        events: Gönderilecek etkinlikleri seçin
+        url: Olayların gönderileceği yer
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ tr:
         name: Etiket
         trendable: Bu etiketin gündem altında görünmesine izin ver
         usable: Tootların bu etiketi kullanmasına izin ver
+      webhook:
+        events: Etkin olaylar
+        url: Uç nokta URL’si
     'no': Hayır
     required:
       mark: "*"
diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml
index 0b6aab940..4ab3b3833 100644
--- a/config/locales/simple_form.uk.yml
+++ b/config/locales/simple_form.uk.yml
@@ -91,6 +91,9 @@ uk:
         name: Тут ви можете лише змінювати регістр літер, щоб підвищити читабельність
       user:
         chosen_languages: У глобальних стрічках будуть відображатися дмухи тільки обраними мовами
+      webhook:
+        events: Оберіть події для надсилання
+        url: Куди надсилатимуться події
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ uk:
         name: Хештеґ
         trendable: Дозволити появу цього хештеґа у списку популярних хештеґів
         usable: Дозволити дмухам використовувати цей хештеґ
+      webhook:
+        events: Увімкнені події
+        url: URL кінцевої точки
     'no': Ні
     required:
       mark: "*"
diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml
index 7c714cdf5..06485b2ec 100644
--- a/config/locales/simple_form.vi.yml
+++ b/config/locales/simple_form.vi.yml
@@ -91,6 +91,9 @@ vi:
         name: Bạn có thể thay đổi cách viết hoa các chữ cái để giúp nó dễ đọc hơn
       user:
         chosen_languages: Chỉ hiển thị những tút viết bằng các ngôn ngữ được chọn sau
+      webhook:
+        events: Chọn sự kiện để gửi
+        url: Nơi những sự kiện được gửi đến
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ vi:
         name: Hashtag
         trendable: Cho phép xuất hiện trong xu hướng
         usable: Cho phép dùng trong tút
+      webhook:
+        events: Những sự kiện đã bật
+        url: URL endpoint
     'no': Tắt
     required:
       mark: "*"
diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml
index 11f4daea3..f54157e28 100644
--- a/config/locales/simple_form.zh-TW.yml
+++ b/config/locales/simple_form.zh-TW.yml
@@ -91,6 +91,9 @@ zh-TW:
         name: 您只能變更大小寫,例如,以使其更易讀。
       user:
         chosen_languages: 當核取時,只有選取語言的嘟文會在公開時間軸中顯示
+      webhook:
+        events: 請選擇要傳送的事件
+        url: 事件會被傳送至何處
     labels:
       account:
         fields:
@@ -219,6 +222,9 @@ zh-TW:
         name: 主題標籤
         trendable: 允許此主題標籤在趨勢下顯示
         usable: 允許嘟文使用此主題標籤
+      webhook:
+        events: 已啟用的事件
+        url: 端點 URL
     'no': 否
     required:
       mark: "*"
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index d59e81cc8..1f64c78c7 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -38,7 +38,7 @@ sk:
       one: príspevok
       other: príspevky
     status_count_before: Ktorí napísali
-    tagline: Nasleduj kamarátov, a objavuj nových
+    tagline: Decentralizovaná sociálna sieť
     terms: Podmienky užitia
     unavailable_content: Nedostupný obsah
     unavailable_content_description:
@@ -634,7 +634,6 @@ sk:
   applications:
     created: Aplikácia bola vytvorená úspešne
     destroyed: Aplikáciu sa podarilo odstrániť
-    invalid_url: Zadaná URL adresa je nesprávna
     regenerate_token: Znovu vygeneruj prístupový token
     token_regenerated: Prístupový token bol úspešne vygenerovaný znova
     warning: Na tieto údaje dávaj ohromný pozor. Nikdy ich s nikým nezďieľaj!
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 58190e95b..ff3492d60 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -40,7 +40,7 @@ sl:
       other: objav
       two: stanja
     status_count_before: Ki so avtorji
-    tagline: Sledite prijateljem in odkrijte nove
+    tagline: Decentralizirano družbeno omrežje
     terms: Pogoji storitve
     unavailable_content: Moderirani strežniki
     unavailable_content_description:
@@ -446,6 +446,7 @@ sl:
       destroyed_msg: Domenski blok je bil razveljavljen
       domain: Domena
       edit: Uredi domenski blok
+      existing_domain_block: Ste že uveljavili strožje omejitve na %{name}.
       existing_domain_block_html: Uvedli ste strožje omejitve za %{name}, sedaj ga morate najprej <a href="%{unblock_url}">odblokirati</a>.
       new:
         create: Ustvari blok
@@ -885,6 +886,23 @@ sl:
       edit_preset: Uredi prednastavitev opozoril
       empty: Zaenkrat še niste določili nobenih opozorilnih prednastavitev.
       title: Upravljaj prednastavitev opozoril
+    webhooks:
+      add_new: Dodaj končno točko
+      delete: Izbriši
+      description_html: "<strong>Spletna zanka</strong> omogoča, da Mastodon potiska <strong>obvestila v resničnem času</strong> o izbranih dogodkih vašemu programu, tako da ta lahko <strong>samodejno proži odzive</strong>."
+      disable: Onemogoči
+      disabled: Onemogočeno
+      edit: Uredi končno točko
+      empty: Zaenkrat še nimate prilagojenih končnih točk spletnih zank.
+      enable: Omogoči
+      enabled: Dejaven
+      events: Dogodki
+      new: Nova spletna zanka
+      rotate_secret: Zasukaj skrivnost
+      secret: Skrivnost podpisovanja
+      status: Stanje
+      title: Spletne zanke
+      webhook: Spletna zanka
   admin_mailer:
     new_appeal:
       actions:
@@ -949,7 +967,6 @@ sl:
   applications:
     created: Aplikacija je bila uspešno ustvarjena
     destroyed: Aplikacija je bila uspešno izbrisana
-    invalid_url: Navedeni URL je neveljaven
     regenerate_token: Obnovite dostopni žeton
     token_regenerated: Dostopni žeton je bil uspešno regeneriran
     warning: Bodite zelo previdni s temi podatki. Nikoli jih ne delite z nikomer!
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index 8974b9c84..0e4d9871e 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -38,7 +38,7 @@ sq:
       one: mesazh
       other: mesazhe
     status_count_before: Që kanë krijuar
-    tagline: Ndiqni shokë dhe zbuloni të rinj
+    tagline: Rrjet shoqëror i decentralizuar
     terms: Kushte shërbimi
     unavailable_content: Shërbyes të moderuar
     unavailable_content_description:
@@ -200,7 +200,7 @@ sq:
         only_password: Vetëm fjalëkalim
         password_and_2fa: Fjalëkalim dhe 2FA
       sensitive: Rezervat
-      sensitized: iu vu shenjë si rezervat
+      sensitized: Iu vu shenjë si rezervat
       shared_inbox_url: URL kutie të përbashkët mesazhesh
       show:
         created_reports: Ka bërë raportime
@@ -428,6 +428,7 @@ sq:
       destroyed_msg: Bllokimi i përkatësisë u hoq
       domain: Përkatësi
       edit: Përpunoni bllokim përkatësie
+      existing_domain_block: Keni vendosur tashmë kufizime më të rrepta mbi %{name}.
       existing_domain_block_html: Keni vendosur tashmë kufizime më të rrepta mbi %{name}, lypset ta <a href="%{unblock_url}">zhbllokoni</a> së pari.
       new:
         create: Krijoni bllokim
@@ -516,6 +517,7 @@ sq:
       delivery:
         all: Krejt
         clear: Spastro gabime dërgimi
+        failing: Dështim
         restart: Rinis dërgimin
         stop: Ndale dërgimin
         unavailable: Jo i passhëm
@@ -839,12 +841,32 @@ sq:
           one: Përdorur nga një person gjatë javës së kaluar
           other: Përdorur nga %{count} vetë gjatë javës së kaluar
       title: Në modë
+      trending: Në modë
     warning_presets:
       add_new: Shtoni të ri
       delete: Fshije
       edit_preset: Përpunoni sinjalizim të paracaktuar
       empty: S’keni përcaktuar ende sinjalizime të gatshme.
       title: Administroni sinjalizime të paracaktuara
+    webhooks:
+      add_new: Shtoni pikëmbarim
+      delete: Fshije
+      description_html: Një <strong>webhook</strong> i bën të mundur Mastodon-it t’i dërgojë aplikacioni tuaj <strong>njoftime aty për aty</strong> rreth aktesh që keni zgjedhur, që kështu aplikacioni juaj të mund <strong>të prodhojë automatikisht reagime</strong>.
+      disable: Çaktivizoje
+      disabled: Të çaktivizuar
+      edit: Përpunoni pikëmbarim
+      empty: S’keni ende ndonjë pikëmbarim webhook të formësuar.
+      enable: Aktivizoje
+      enabled: Aktiv
+      enabled_events:
+        one: 1 akt i aktivizuar
+        other: "%{count}s akte të aktivizuar"
+      events: Akte
+      new: "<em>Webhook</em> i ri"
+      rotate_secret: Ciklo të fshehtën
+      secret: E fshehtë nënshkrimesh
+      status: Gjendje
+      title: Webhook-ë
   admin_mailer:
     new_appeal:
       actions:
@@ -906,7 +928,6 @@ sq:
   applications:
     created: Aplikimi u krijua me sukses
     destroyed: Aplikimi u fshi me sukses
-    invalid_url: URL-ja e dhënë është e pavlefshme
     regenerate_token: Riprodho token hyrjesh
     token_regenerated: Token-i i hyrjeve u riprodhua me sukses
     warning: Bëni shumë kujdes me ato të dhëna. Mos ia jepni kurrë njeriu!
@@ -1510,9 +1531,93 @@ sq:
     pinned: Mesazh i fiksuar
     reblogged: të përforcuara
     sensitive_content: Lëndë rezervat
+  strikes:
+    errors:
+      too_late: Është shumë vonë për apelim të këtij paralajmërimi
   tags:
     does_not_match_previous_name: s’përputhet me emrin e mëparshëm
   terms:
+    body_html: |
+      <h2>Rregulla Privatësie</h2>
+      <h3 id="collect">Ç’informacion mbledhim?</h3>
+
+      <ul>
+        <li><em>Hollësi elementare llogarish</em>: Nëse regjistroheni në këtë shërbyes, mund t’ju kërkohet të jepni një emër përdoruesi, një adresë email dhe një fjalëkalim. Mund të jepni edhe hollësi shtesë profili, bie fjala, një emër për në ekran dhe jetëshkrim, si dhe të ngarkoni një foto profili dhe një figurë kryesh. Emri i përdoruesit, emri në ekran, jetëshkrimi, fotoja e profilit dhe figura e kryes janë përherë të dukshme publikisht.</li>
+        <li><em>Postime, ndjekje dhe të tjera hollësi publike</em>: Lista e personave që ndiqni tregohet publikisht, po kjo vlen edhe për ndjekësit tuaj. Kur parashtroni një mesazh, depozitohen gjithashtu data dhe koha, si dhe aplikacioni prej nga parashtruar mesazhin. Mesazhet mund të përmbajnë bashkëngjitje media, bie fjala, foto dhe video. Postimet publike dhe jo të tilla janë të passhme publikisht. Kur te profili juaj përfshini një postim, edhe ky është informacion i passhëm publikisht. Postimet tuaja u dërgohen ndjekësve tuaj, në disa raste kjo do të thotë se dërgohen te shërbyes të ndryshëm dhe në ta depozitohen kopje të tyre. Kur fshini postime, kjo ka gjasa t’u dërgohet ndjekësve tuaj. Veprimi i riblogimit, ose vënia shenjë si i parapëlqyer një postimi tjetër është përherë gjë publike.</li>
+        <li><em>Postime të drejtpërdrejta dhe vetëm për ndjekës</em>: Krejt postimet depozitohen dhe përpunohen te shërbyesi. Postimet vetëm për ndjekës u dërgohen ndjekësve tuaj dhe përdoruesve që përmenden në ta, kurse postimet e drejtpërdrejta u dërgohen vetëm përdoruesve të përmendur në to. Në disa raste kjo do të thotë se dërgohen në shërbyes të ndryshëm dhe kopje të tyre depozitohen atje. Përpiqemi në mirëbesim të kufizojmë hyrjen në këto postime të vetëm personave të autorizuar, por shërbyes të tjerë mund të mos bëjnë kështu. Ndaj është e rëndësishme të shqyrtohen shërbyesit të cilëve u përkasin ndjekësit tuaj. Që nga rregullimet mund të aktivizoni/çaktivizoni një mundësi për miratim dhe hedhje poshtë dorazi të ndjekësve të rinj. <em>Ju lutemi, kini parasysh se operatorët e shërbyesve dhe cilido shërbyes marrës mund t’i shohë këto mesazhe</em>, si dhe se marrësit mund të bëjnë foto ekrani, kopjojnë, ose rindajnë me të tjerët ato mesazhe. <em>Mos ndani me të tjerë gjëra me spec përmes Mastodon-it.</em></li>
+        <li><em>IP-ra dhe të tjera tejtëdhëna</em>: Kur bëni hyrjen në llogari, regjistrojmë adresën IP prej nga hyni, si dhe emrin e aplikacionit që përdorni për shfletim. Krejt sesionet me hyrje mund t’i shqyrtoni dhe shfuqizoni që nga rregullimet. Adresa e fundit IP e përdorur depozitohet për deri 12 muaj. Mund të mbajmë gjithashtu regjistra shërbyesi që përfshijnë adresën IP të çdo kërkese ndaj shërbyesit tonë.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">Për se e përdorim informacionin tuaj?</h3>
+
+      <p>Çfarëdo hollësi që mbledhim prej jush mund të përdoret në rrugët vijuese:</p>
+
+      <ul>
+        <li>Për të dhënë funksionet bazë të Mastodon-it. Me lëndën e personave të tjerë mund të ndërveproni, si dhe të postoni lëndën tuaj, vetëm kur jeni i futur në llogarinë tuaj. Për shembull, mund të ndiqni persona të tjerë për të parë postimet e tyre në rrjedhën tuaj kohore të personalizuar.</li>
+        <li>Për të ndihmuar në moderimin e bashkësisë, për shembull, krahasimi i adresës tuaj IP me të tjera të ditura, për të pikasur shmangie dëbimesh, apo cenime të tjera.</li>
+        <li>Adresa email që jepni mund të përdoret për t’ju dërguar informacion, njoftime mbi persona të tjerë që ndërveprojnë me lëndën tuaj, ose që ju dërgojnë mesazhe, si dhe për t’iu përgjigjur kërkesave dhe/ose çështjeve apo pyetjeve të tjera.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="protect">Si e mbrojmë informacionin tuaj?</h3>
+
+      <p>Sendërtojmë një larmi masash sigurie për të ruajtur parrezikshmërinë e informacionit tuaj personal, kur jepni, parashtroni ose përdorni informacionin tuaj personal. Mes të tjerash, sesioni i shfletuesit tuaj, si dhe trafiku mes aplikacioneve tuaja dhe API-t sigurohen me SSL dhe fjalëkalimi juaj fshehtëzohet me një algoritëm të fuqishëm njëkahësh. Për të siguruar më tej hyrjen në llogarinë tuaj, mund të aktivizoni mirëfilltësim dufaktorësh.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="data-retention">Cili është rregulli ynë për mbajtje të dhënash?</h3>
+
+      <p>Do të përpiqemi në mirëbesim:</p>
+
+      <ul>
+        <li>Të mbajmë regjistra shërbyesi që përmbajnë adresën IP të krejt kërkesave të bëra këtij shërbyesi, ashtu siç mbahen këta regjistra, për jo më shumë se 90 ditë.</li>
+        <li>Të mbajmë për jo më shumë se 12 muaj adresat IP përshoqëruar përdoruesve të regjistruar.</li>
+      </ul>
+
+      <p>Mund të kërkoni dhe shkarkoni një arkiv të lëndës tuaj, përfshi postimet tuaja, bashkëngjitje media, foto profili dhe figure kryesh.</p>
+
+      <p>Mund të fshini kurdo në mënyrë të pakthyeshme llogarinë tuaj.</p>
+
+      <hr class="spacer"/>
+
+      <h3 id="cookies">A përdorim <em>cookies</em>?</h3>
+
+      <p>Po. Cookie-t janë kartela të vockla që një sajt ose furnizuesi i shërbimit përkatës shpërngul në diskun e kompjuterit tuaj përmes shfletuesit tuaj (nëse e lejoni). Këto <em>cookies</em> i bëjnë të mundur sajtit të njohë shfletuesin tuaj dhe, nëse keni regjistruar një llogari, t’ia përshoqërojë atë llogarisë që keni regjistruar.</p>
+
+      <p>Cookie-t i përdorim për të kuptuar dhe ruajtur parapëlqimet tuaja për vizita të ardhshme.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="disclose">A u japim palëve të jashtme ndonjë informacion?</h3>
+
+      <p>Nuk u shesim, shkëmbejmë, apo shpërngulim informacion tuajin personalisht të identifikueshëm palëve të jashtme. Këtu nuk përfshin palë të treta të besuara që na ndihmojnë në funksionimin e sajtit tonë, në mbajtjen në këmbë të biznesit tonë, ose për t’ju shërbyer juve, për sa kohë që këto palë pajtohen me mbajtjen rezervat të këtij informacioni. Mundet edhe të japim informacion tuajin, kur besojmë se dhënia është e duhur për të qenë në pajtim me ligjet, për të zbatuar rregullat tonë mbi sajtin, ose për të mbrojtur të drejtat, pronën apo sigurinë tonë apo të të tjerëve.</p>
+
+      <p>Lënda juaj publike mund të shkarkohet nga shërbyes të tjerë në rrjet. Postim tuaja publike, si dhe ato vetëm për ndjekësit, u dërgohen shërbyesve ku gjenden ndjekësit tuaj, ndërsa mesazhet e drejtpërdrejtë u dërgohen shërbyesve të marrësve, në rastin kur këta ndjekës apo marrës gjenden në një tjetër shërbyes nga ky.</p>
+
+      <p>Kur autorizoni një aplikacion të përdorë llogarinë tuaj, në varësi të fushëveprimit të lejeve që miratoni, ky mund të hyjë në hollësitë e profilit tuaj publik, listën e atyre që ndiqni, ndjekësit tuaj, listat tuaja, krejt postimet tuaja dhe të parapëlqyerit tuaj. Aplikaconet s’mund të njohin kurrë adresën tuaj email dhe fjalëkalimin tuaj.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="children">Përdorim sajti nga fëmijë</h3>
+
+      <p>Nëse ky shërbyes gjendet në BE ose ZEE: Sajti, produktet dhe shërbimet tona u adresohen të tëra personave që janë të paktën 16 vjeç. Nëse jeni nën moshën 16 vjeç, sipas domosdoshmërive të GDPR-së (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">Rregullorja e Përgjithshme e Mbrojtjes së të Dhënave</a>) mos e përdorni këtë sajt.</p>
+
+      <p>Nëse ky shërbyes gjendet në ShBA: Sajti, produktet dhe shërbimet tona u adresohen të tëra personave që janë të paktën 13 vjeç. Nëse jeni nën moshën 13 vjeç, sipas domosdoshmërive të COPPA-s (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Ligji i Mbrojtjes së Privatësisë Internetore të Fëmijëve</a>) mos e përdorni këtë sajt.</p>
+
+      <p>kërkesat ligjore mund të jenë të tjera, nëse ky shërbyes gjendet nën një juridiksion tjetër.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="changes">Ndryshime te Rregullat tona të Privatësisë</h3>
+
+      <p>Nëse vendosim të ndryshojmë rregullat tona të privatësisë, ato ndryshime do t’i postojmë te kjo faqe.</p>
+
+      <p>Ky dokument licencohet sipas CC-BY-SA. Qe përditësuar së fundi më 26 maj 2022.</p>
+
+      <p>Përshtatur fillimisht prej <a href="https://github.com/discourse/discourse">rregulave të privatësisë së Discourse-it</a>.</p>
     title: Kushte Shërbimi dhe Rregulla Privatësie te %{instance}
   themes:
     contrast: Mastodon (Me shumë kontrast)
diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml
index 321fc6398..cfea20c55 100644
--- a/config/locales/sr-Latn.yml
+++ b/config/locales/sr-Latn.yml
@@ -220,7 +220,6 @@ sr-Latn:
   applications:
     created: Aplikacija uspešno napravljena
     destroyed: Aplikacija uspešno obrisana
-    invalid_url: Data adresa nije ispravna
     regenerate_token: Rekreiraj pristupni token
     token_regenerated: Pristupni token uspešno rekreiran
     warning: Oprezno sa ovim podacima. Nikad je ne delite ni sa kim!
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index 94d8c43cf..445f8f326 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -368,7 +368,6 @@ sr:
   applications:
     created: Апликација успешно направљена
     destroyed: Апликација успешно обрисана
-    invalid_url: Дата адреса није исправна
     regenerate_token: Рекреирај приступни токен
     token_regenerated: Приступни токен успешно рекреиран
     warning: Опрезно са овим подацима. Никад је не делите ни са ким!
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index 715358d5e..a84ae6cfe 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -36,7 +36,6 @@ sv:
       one: status
       other: statusar
     status_count_before: Som skapat
-    tagline: Följ vänner och upptäck nya
     terms: Användarvillkor
     unavailable_content: Otillgängligt innehåll
     unavailable_content_description:
@@ -668,7 +667,6 @@ sv:
   applications:
     created: Ansökan är framgångsrikt skapad
     destroyed: Ansökan är framgångsrikt borttagen
-    invalid_url: Den angivna webbadressen är ogiltig
     regenerate_token: Regenerera access token
     token_regenerated: Access token lyckades regenereras
     warning: Var mycket försiktig med denna data. Dela aldrig den med någon!
diff --git a/config/locales/ta.yml b/config/locales/ta.yml
index e3b61a487..3016250cc 100644
--- a/config/locales/ta.yml
+++ b/config/locales/ta.yml
@@ -28,7 +28,6 @@ ta:
       one: பதிவு
       other: பதிவுகள்
     status_count_before: எழுதிய
-    tagline: நண்பர்களைப் பின்தொடரவும் மற்றும் புதியவர்களைக் கண்டுபிடிக்கவும்
     terms: சேவை விதிமுறைகள்
     unavailable_content: விசயங்கள் இல்லை
     unavailable_content_description:
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 25fc7034e..c5f70753d 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -34,7 +34,6 @@ th:
     status_count_after:
       other: โพสต์
     status_count_before: ผู้เผยแพร่
-    tagline: ติดตามเพื่อน ๆ และค้นพบเพื่อนใหม่ ๆ
     terms: เงื่อนไขการให้บริการ
     unavailable_content: เซิร์ฟเวอร์ที่มีการควบคุม
     unavailable_content_description:
@@ -174,6 +173,7 @@ th:
         already_confirmed: ผู้ใช้นี้ได้รับการยืนยันอยู่แล้ว
         send: ส่งอีเมลยืนยันใหม่
         success: ส่งอีเมลยืนยันสำเร็จ!
+      reset: รีเซ็ต
       reset_password: ตั้งรหัสผ่านใหม่
       resubscribe: บอกรับใหม่
       role: สิทธิอนุญาต
@@ -841,7 +841,6 @@ th:
   applications:
     created: สร้างแอปพลิเคชันสำเร็จ
     destroyed: ลบแอปพลิเคชันสำเร็จ
-    invalid_url: URL ที่ระบุไม่ถูกต้อง
     regenerate_token: สร้างโทเคนการเข้าถึงใหม่
     token_regenerated: สร้างโทเคนการเข้าถึงใหม่สำเร็จ
     warning: ระวังเป็นอย่างสูงกับข้อมูลนี้ อย่าแบ่งปันข้อมูลกับใครก็ตาม!
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 15f4bf57c..9159acba3 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -38,7 +38,7 @@ tr:
       one: durum yazıldı
       other: durum yazıldı
     status_count_before: Şu ana kadar
-    tagline: Arkadaşlarını takip et ve yenilerini keşfet
+    tagline: Merkezi olmayan sosyal ağ
     terms: Kullanım şartları
     unavailable_content: Denetlenen sunucular
     unavailable_content_description:
@@ -428,6 +428,7 @@ tr:
       destroyed_msg: Domain bloğu silindi
       domain: Alan adı
       edit: Etki alanı bloğunu düzenle
+      existing_domain_block: Zaten %{name} için daha katı sınırlamalar dayatmıştınız.
       existing_domain_block_html: '%{name}''e zaten daha katı sınırlar uyguladınız, önce <a href="%{unblock_url}">engellemesini kaldırmanız</a> gerekiyor.'
       new:
         create: Yeni blok oluştur
@@ -851,6 +852,23 @@ tr:
       edit_preset: Uyarı ön-ayarını düzenle
       empty: Henüz önceden ayarlanmış bir uyarı tanımlanmadı.
       title: Uyarı ön-ayarlarını yönet
+    webhooks:
+      add_new: Uç nokta ekle
+      delete: Sil
+      description_html: Bir <strong>web kancası</strong> Mastodon'un, uygulamanızda seçili olaylar hakkında <strong>gerçek zamanlı bildirimler</strong> göndermesini sağlar, böylece uygulamanız <strong>otomatik olarak tepkileri tetikleyebilir</strong>.
+      disable: Devre dışı bırak
+      disabled: Devre dışı
+      edit: Uç nokta düzenle
+      empty: Henüz yapılandırılmış bir web kancanız yok.
+      enable: Etkinleştir
+      enabled: Etkin
+      events: Olaylar
+      new: Yeni web kancası
+      rotate_secret: Gizi döndür
+      secret: Gizi imzalama
+      status: Durum
+      title: Web kancaları
+      webhook: Web kancası
   admin_mailer:
     new_appeal:
       actions:
@@ -915,7 +933,6 @@ tr:
   applications:
     created: Uygulama başarıyla oluşturuldu
     destroyed: Uygulama başarıyla silindi
-    invalid_url: Verilen URL geçerli değil
     regenerate_token: Erişim belirtecini yeniden oluştur
     token_regenerated: Erişim belirteci başarıyla oluşturuldu
     warning: Bu verilere çok dikkat edin. Asla kimseyle paylaşmayın!
@@ -1525,6 +1542,86 @@ tr:
   tags:
     does_not_match_previous_name: önceki adla eşleşmiyor
   terms:
+    body_html: |
+      <h2>Gizlilik Politikası</h2>
+      <h3 id="collect">Hangi bilgileri topluyoruz?</h3>
+
+      <ul>
+      <li><em>Temel hesap bilgileri</em>: Bu sunucuya kaydolursanız, bir kullanıcı adı, bir e-posta adresi ve bir parola girmeniz istenebilir. Ayrıca, ekran adı ve biyografi gibi ek profil bilgileri girebilir ve bir profil fotoğrafı ve başlık resmi yükleyebilirsiniz. Kullanıcı adı, ekran ad, biyografi, profil fotoğrafı ve başlık resmi her zaman herkese açık olarak listelenir.</li>
+      <li><em>Gönderiler, takip etmeler ve diğer herkese açık bilgiler</em>: Takip ettiğiniz kişilerin listesi herkese açık olarak listelenir, sizi takip edenler için de aynısı geçerlidir. Bir mesaj gönderdiğinizde, mesajı gönderdiğiniz uygulamanın yanı sıra tarih ve saati de saklanır. Mesajlar, resim ve video gibi medya ekleri içerebilir. Herkese açık ve listelenmemiş gönderiler halka açıktır. Profilinizde bir gönderiyi yayınladığınızda, bu da herkese açık olarak mevcut bir bilgidir. Gönderileriniz takipçilerinize iletilir, bazı durumlarda farklı sunuculara gönderilir ve kopyalar orada saklanır. Gönderilerinizi sildiğinizde, bu da takipçilerinize iletilir. Başka bir gönderiyi yeniden bloglama veya favorileme eylemi her zaman halka açıktır.</li>
+      <li><em>Doğrudan ve takipçilere özel gönderiler</em>: Tüm gönderiler sunucuda saklanır ve işlenir. Takipçilere özel gönderiler, takipçilerinize ve içinde bahsedilen kullanıcılara, doğrudan gönderiler ise yalnızca içinde bahsedilen kullanıcılara iletilir. Bu, bazı durumlarda farklı sunuculara iletildiği ve kopyaların orada saklandığı anlamına gelir. Bu gönderilere erişimi yalnızca yetkili kişilerle sınırlamak için iyi niyetle çalışıyoruz, ancak diğer sunucular bunu yapamayabilir. Bu nedenle, takipçilerinizin ait olduğu sunucuları incelemek önemlidir. Ayarlarda yeni izleyicileri manuel olarak onaylama ve reddetme seçeneğini değiştirebilirsiniz. <em>Sunucuyu ve alıcı sunucuyu işleten kişilerin bu mesajları görüntüleyebileceğini unutmayın</em>, ve alıcılar ekran görüntüsü alabilir, kopyalayabilir veya başka bir şekilde yeniden paylaşabilir. <em>Mastodon üzerinden herhangi bir hassas bilgi paylaşmayın.</em></li>
+      <li><em>IP'ler ve diğer meta veriler</em>: Oturum açarken, giriş yaptığınız IP adresini ve tarayıcı uygulamanızın adını kaydederiz. Giriş yapılan tüm oturumlar, incelemek ve iptal etmek için ayarlarda mevcuttur. En son kullanılan IP adresi 12 aya kadar saklanır. Sunucumuza gelen her isteğin IP adresini içeren sunucu loglarını da saklayabiliriz.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">Bilgilerinizi ne için kullanıyoruz?</h3>
+
+      <p>Sizden topladığımız bilgilerin herhangi bir kısmı aşağıdaki şekillerde kullanılabilir:</p>
+
+      <ul>
+      <li>Mastodon'un ana işlevselliğini sağlamak için. Yalnızca oturum açtığınızda diğer kişilerin içeriğiyle etkileşime girebilir ve kendi içeriğinizi gönderebilirsiniz. Örneğin, başkalarının kombine gönderilerini kendi kişiselleştirilmiş ana sayfanızdaki zaman çizelgenizde görüntülemek için onları takip edebilirsiniz.</li>
+      <li>Topluluğun denetlenmesine yardımcı olmak için, örneğin, yasaktan kaçınma veya diğer ihlalleri belirlemek için IP adresinizin diğer bilinen adreslerle karşılaştırılması.</li>
+      <li>Verdiğiniz e-posta adresi, size bilgi, içeriğinizle etkileşimde bulunan diğer kişilerle ilgili bildirimler veya mesaj göndermek, sorgulara ve/veya diğer istek ve sorulara cevap vermek için kullanılabilir.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="protect">Bilgilerinizi nasıl koruyoruz?</h3>
+
+      <p>Kişisel bilgilerinizi girerken, gönderirken veya onlara erişirken kişisel bilgilerinizin güvenliğini sağlamak için çeşitli güvenlik önlemleri uyguluyoruz. Diğer şeylerin yanı sıra, tarayıcı oturumunuz ve uygulamalarınız ile API arasındaki trafik SSL ile güvence altına alınır ve şifreniz sağlam bir tek yönlü bir algoritma kullanılarak şifrelenir. Hesabınıza daha güvenli bir şekilde erişebilmek için iki adımlı kimlik doğrulamasını etkinleştirebilirsiniz.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="data-retention">Veri saklama politikamız nedir?</h3>
+
+      <p>Şunları yapmak için iyi niyetli bir şekilde çalışacağız:</p>
+
+      <ul>
+      <li>Bu sunucuya yapılan tüm isteklerin IP adresini içeren sunucu loglarını, bu tür logların şimdiye kadar saklandığı gibi, 90 günden fazla saklamayacağız.</li>
+      <li>Kayıtlı kullanıcılarla ilişkili IP adreslerini en fazla 12 ay boyunca saklayacağız.</li>
+      </ul>
+      <p>Gönderileriniz, medya ekleriniz, profil fotoğrafınız ve başlık resminiz dahil, içeriğimizin arşivini talep edebilir ve indirebilirsiniz.</p>
+
+      <p>Hesabınızı istediğiniz zaman geri alınamaz şekilde silebilirsiniz.</p>
+
+      <hr class="spacer"/>
+
+      <h3 id="cookies">Çerez kullanıyor muyuz?</h3>
+
+      <p>Evet. Çerezler, bir sitenin veya servis sağlayıcısının Web tarayıcınız üzerinden bilgisayarınızın sabit diskine aktardığı küçük dosyalardır (eğer izin verirseniz). Bu çerezler sitenin tarayıcınızı tanımasını ve kayıtlı bir hesabınız varsa, kayıtlı hesabınızla ilişkilendirmesini sağlar.</p>
+
+      <p>Sonraki ziyaretlerde tercihlerinizi anlamak ve kaydetmek için çerezleri kullanıyoruz.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="disclose">Herhangi bir bilgiyi dış taraflara açıklıyor muyuz?</h3>
+
+      <p>Kişisel olarak tanımlanabilir bilgilerinizi dış taraflara satmıyor, takas etmiyor veya devretmiyoruz. Bu, taraflarımız bu bilgileri gizli tutmayı kabul ettiği sürece sitemizi işletmemize, işimizi yürütmemize veya size hizmet etmemize yardımcı olan güvenilir üçüncü tarafları içermemektedir. Ayrıca, yayınlanmanın yasalara uymayı, site politikalarımızı yürürlüğe koymayı ya da kendimizin ya da diğerlerinin haklarını, mülklerini ya da güvenliğini korumamızı sağladığına inandığımızda bilgilerinizi açıklayabiliriz.</p>
+
+      <p>Herkese açık içeriğiniz ağdaki diğer sunucular tarafından indirilebilir. Bu takipçiler veya alıcılar bundan farklı bir sunucuda bulundukları sürece, herkese açık ve takipçilere özel gönderileriniz, takipçilerinizin bulunduğu sunuculara, ve doğrudan mesajlar, alıcıların sunucularına iletilir.</p>
+
+      <p>Hesabınızı kullanması için bir uygulamayı yetkilendirdiğinizde, onayladığınız izinlerin kapsamına bağlı olarak, herkese açık profil bilgilerinize, takip ettiklerinizin listesine, takipçilerinize, listelerinize, tüm gönderilerinize ve favorilerinize erişebilir. Uygulamalar e-posta adresinize veya parolanıza asla erişemez.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="children">Sitenin çocuklar tarafından kullanımı</h3>
+
+      <p>Bu sunucu AB’de veya AEA’da ise: Site, ürün ve hizmetlerimizin tamamı en az 16 yaşında olan kişilere yöneliktir. Eğer 16 yaşın altındaysanız, GDPR yükümlülükleri gereği (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>) bu siteyi kullanmayın.</p>
+
+      <p>Bu sunucu ABD’de ise: Site, ürün ve hizmetlerimizin tamamı en az 13 yaşında olan kişilere yöneliktir. Eğer 13 yaşın altındaysanız, COPPA yükümlülükleri gereği (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) bu siteyi kullanmayın.</p>
+
+      <p>Bu sunucu başka bir ülkede ise yasal gereklilikler farklı olabilir.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="changes">Gizlilik Politikamızdaki Değişiklikler</h3>
+
+      <p>Gizlilik politikamızı değiştirmeye karar verirsek, bu değişiklikleri bu sayfada yayınlayacağız.</p>
+
+      <p>Bu belge CC-BY-SA altında lisanslanmıştır. En son 26 Mayıs 2022 tarihinde güncellenmiştir.</p>
+
+      <p><a href="https://github.com/discourse/discourse">Discourse gizlilik politikasından uyarlanmıştır</a>.</p>
     title: "%{instance} Hizmet Şartları ve Gizlilik Politikası"
   themes:
     contrast: Mastodon (Yüksek karşıtlık)
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index dfe25ebb2..53a4b3567 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -38,7 +38,7 @@ uk:
       one: статус
       other: статуси
     status_count_before: Опубліковано
-    tagline: Слідкуйте за друзями та знаходьте нових
+    tagline: Децентралізована соціальна мережа
     terms: Правила використання
     unavailable_content: Недоступний вміст
     unavailable_content_description:
@@ -444,6 +444,7 @@ uk:
       destroyed_msg: Блокування домену знято
       domain: Домен
       edit: Редагувати блокування доменів
+      existing_domain_block: Ви вже наклали суворіші обмеження на %{name}.
       existing_domain_block_html: Ви вже наклали більш суворі обмеження на %{name}, вам треба спочатку <a href="%{unblock_url}">розблокувати його</a>.
       new:
         create: Створити блокування
@@ -863,6 +864,28 @@ uk:
       edit_preset: Редагувати шаблон попередження
       empty: Ви ще не визначили жодних попереджень.
       title: Управління шаблонами попереджень
+    webhooks:
+      add_new: Додати кінцеву точку
+      delete: Видалити
+      description_html: "<strong>Вебхук</strong> дає змогу Mastodon надсилати повідомлення про обрані події до вашого застосунку <strong>в реальному часі</strong>, щоб застосунок міг <strong>автоматично реагувати на реакції</strong>."
+      disable: Вимкнути
+      disabled: Вимкнено
+      edit: Редагувати кінцеву точку
+      empty: Ще не налаштовано жодних кінцевих точок вебхука.
+      enable: Увімкнути
+      enabled: Активні
+      enabled_events:
+        few: "%{count} увімкнені події"
+        many: "%{count} увімкнених подій"
+        one: 1 увімкнена подія
+        other: "%{count} увімкнені події"
+      events: Події
+      new: Новий вебхук
+      rotate_secret: Обернути секрет
+      secret: Секрет підписування
+      status: Стан
+      title: Вебхуки
+      webhook: Вебхук
   admin_mailer:
     new_appeal:
       actions:
@@ -922,7 +945,6 @@ uk:
   applications:
     created: Застосунок успішно створений
     destroyed: Застосунок успішно видалений
-    invalid_url: Введена URL неправильна
     regenerate_token: Перегенерувати токен доступу
     token_regenerated: Токен доступу успішне перегенеровано
     warning: Будьте дуже обережні з цими даними. Ніколи не діліться ними ні з ким!
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 7f0022191..72d06ab55 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -35,7 +35,7 @@ vi:
     status_count_after:
       other: tút
     status_count_before: Nơi lưu giữ
-    tagline: Theo dõi bạn bè và khám phá thế giới
+    tagline: Mạng xã hội liên hợp
     terms: Điều khoản dịch vụ
     unavailable_content: Giới hạn chung
     unavailable_content_description:
@@ -417,6 +417,7 @@ vi:
       destroyed_msg: Đã thôi chặn máy chủ
       domain: Máy chủ
       edit: Chỉnh sửa máy chủ bị chặn
+      existing_domain_block: Bạn đã hạn chế %{name} trước đó.
       existing_domain_block_html: Bạn đã áp đặt các giới hạn chặt chẽ hơn cho %{name}, trước tiên bạn cần <a href="%{unblock_url}">bỏ chặn nó</a>.
       new:
         create: Tạo chặn
@@ -832,6 +833,25 @@ vi:
       edit_preset: Sửa mẫu có sẵn
       empty: Bạn chưa thêm mẫu nhắc nhở nào cả.
       title: Quản lý mẫu nhắc nhở
+    webhooks:
+      add_new: Thêm endpoint
+      delete: Xóa bỏ
+      description_html: "<strong>Webhook</strong> cho phép Mastodon gửi nhận <strong>thông báo đẩy thời gian thật</strong> về những sự kiện cho ứng dụng thứ ba của bạn, cho ứng dụng của bạn có thể <strong>tự động kích hoạt reaction</strong>."
+      disable: Tắt
+      disabled: Đã tắt
+      edit: Sửa endpoint
+      empty: Bạn chưa thiết lập webhook endpoint nào.
+      enable: Bật
+      enabled: Hoạt động
+      enabled_events:
+        other: "%{count} sự kiện đã bật"
+      events: Sự kiện
+      new: Webhook mới
+      rotate_secret: Xoay bí mật
+      secret: Token đăng nhập
+      status: Trạng thái
+      title: Webhook
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -896,7 +916,6 @@ vi:
   applications:
     created: Đơn đăng ký được tạo thành công
     destroyed: Đã xóa đơn đăng ký
-    invalid_url: Cung cấp URL không hợp lệ
     regenerate_token: Tạo lại mã truy cập
     token_regenerated: Mã truy cập được tạo lại thành công
     warning: Hãy rất cẩn thận với dữ liệu này. Không bao giờ chia sẻ nó với bất cứ ai!
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 783733a0a..475d03a2a 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -19,7 +19,7 @@ zh-CN:
     continue_to_web: 继续前往网页应用
     discover_users: 发现用户
     documentation: 文档
-    federation_hint_html: 在 %{instance} 上拥有账号后,你可以关注任何兼容Mastodon的服务器上的人。
+    federation_hint_html: 在 %{instance} 上拥有账号后,你可以关注任何兼容 Mastodon 服务器上的人。
     get_apps: 尝试移动应用
     hosted_on: 运行在 %{domain} 上的 Mastodon 站点
     instance_actor_flash: '这个账号是个虚拟账号,不代表任何用户,只用来代表服务器本身。它用于和其它服务器互通,所以不应该被封禁,除非你想封禁整个实例。但是想封禁整个实例的时候,你应该用域名封禁。
@@ -37,7 +37,7 @@ zh-CN:
     status_count_after:
       other: 条嘟文
     status_count_before: 他们共嘟出了
-    tagline: 关注并发现新朋友
+    tagline: 分布式社交网络
     terms: 使用条款
     unavailable_content: 被限制的服务器
     unavailable_content_description:
@@ -419,6 +419,7 @@ zh-CN:
       destroyed_msg: 域名屏蔽已撤销
       domain: 域名
       edit: 编辑域名屏蔽
+      existing_domain_block: 您已经对 %{name} 设置了更严格的限制。
       existing_domain_block_html: 你已经对 %{name} 施加了更严格的限制,你需要先 <a href="%{unblock_url}">解封</a>。
       new:
         create: 添加屏蔽
@@ -434,7 +435,7 @@ zh-CN:
       private_comment: 私密评论
       private_comment_hint: 给这一域名限制添加备注,供监察员内部使用
       public_comment: 公开评论
-      public_comment_hint: 给这一域名限制添加公开的评论,如果你推广你的域名限制列表的话,这些评论就会显示出来。
+      public_comment_hint: 给这一域名限制添加公开的评论,在公告域名限制列表开启时这些评论将会公开可见。
       reject_media: 拒绝接收媒体文件
       reject_media_hint: 删除本站已缓存的媒体文件,并且不再接收来自该域名的任何媒体文件。此选项不影响封禁
       reject_reports: 拒绝接收举报
@@ -834,6 +835,10 @@ zh-CN:
       edit_preset: 编辑预置警告
       empty: 你尚未定义任何警告预设。
       title: 管理预设警告
+    webhooks:
+      delete: 删除
+      disable: 禁用
+      enable: 启用
   admin_mailer:
     new_appeal:
       actions:
@@ -898,7 +903,6 @@ zh-CN:
   applications:
     created: 应用创建成功
     destroyed: 应用删除成功
-    invalid_url: URL 无效
     regenerate_token: 重置访问令牌
     token_regenerated: 访问令牌重置成功
     warning: 一定小心,千万不要把它分享给任何人!
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index bbf5b4dad..5b6e0b83a 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -34,7 +34,6 @@ zh-HK:
     status_count_after:
       other: 篇文章
     status_count_before: 共發佈了
-    tagline: 關注朋友並探索新朋友
     terms: 使用條款
     unavailable_content: 受限制的伺服器
     unavailable_content_description:
@@ -679,7 +678,6 @@ zh-HK:
   applications:
     created: 已建立應用程式
     destroyed: 已刪除應用程式
-    invalid_url: 所提供的網址不正確
     regenerate_token: 重設 token
     token_regenerated: 已重設 token
     warning: 警告,不要把它分享給任何人!
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 95561abb7..7d2bb80cb 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -35,7 +35,7 @@ zh-TW:
     status_count_after:
       other: 條嘟文
     status_count_before: 他們共嘟出了
-    tagline: 關注朋友並探索新朋友
+    tagline: 去中心化社群網路
     terms: 使用條款
     unavailable_content: 無法取得的內容
     unavailable_content_description:
@@ -417,6 +417,7 @@ zh-TW:
       destroyed_msg: 已撤銷站點封鎖
       domain: 站點
       edit: 更改封鎖的站台
+      existing_domain_block: 您已對 %{name} 施加了更嚴格的限制。
       existing_domain_block_html: 您已經對 %{name} 施加了更嚴格的限制,您需要先把他<a href="%{unblock_url}">取消封鎖</a>。
       new:
         create: 新增封鎖
@@ -834,6 +835,25 @@ zh-TW:
       edit_preset: 編輯預設警告
       empty: 您未曾定義任何預設警告
       title: 管理預設警告
+    webhooks:
+      add_new: 新增端點
+      delete: 刪除
+      description_html: "<strong>Webhook</strong> 讓 Mastodon 可以將關於選定的事件的<strong>即時通知</strong>推送到您自己的應用程式,如此您的應用程式就可以<strong>自動觸發反應</strong>。"
+      disable: 停用
+      disabled: 已停用
+      edit: 編輯端點
+      empty: 您沒有任何設定好的 webhook 端點。
+      enable: 啟用
+      enabled: 生效
+      enabled_events:
+        other: "%{count} 個已啟用的端點"
+      events: 事件
+      new: 新增 Webhook
+      rotate_secret: 更換密鑰
+      secret: 簽署密鑰
+      status: 狀態
+      title: Webhooks
+      webhook: Webhook
   admin_mailer:
     new_appeal:
       actions:
@@ -898,7 +918,6 @@ zh-TW:
   applications:
     created: 已建立應用
     destroyed: 已刪除應用
-    invalid_url: 網址不正確
     regenerate_token: 重設 token
     token_regenerated: 已重設 token
     warning: 警告,不要把它分享給任何人!
diff --git a/config/navigation.rb b/config/navigation.rb
index 47993e7a6..2a4bf2d39 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -62,6 +62,7 @@ SimpleNavigation::Configuration.run do |navigation|
       s.item :rules, safe_join([fa_icon('gavel fw'), t('admin.rules.title')]), admin_rules_path, highlights_on: %r{/admin/rules}
       s.item :announcements, safe_join([fa_icon('bullhorn fw'), t('admin.announcements.title')]), admin_announcements_path, highlights_on: %r{/admin/announcements}
       s.item :custom_emojis, safe_join([fa_icon('smile-o fw'), t('admin.custom_emojis.title')]), admin_custom_emojis_url, highlights_on: %r{/admin/custom_emojis}
+      s.item :webhooks, safe_join([fa_icon('inbox fw'), t('admin.webhooks.title')]), admin_webhooks_path, highlights_on: %r{/admin/webhooks}
       s.item :relays, safe_join([fa_icon('exchange fw'), t('admin.relays.title')]), admin_relays_url, if: -> { current_user.admin? && !whitelist_mode? }, highlights_on: %r{/admin/relays}
       s.item :sidekiq, safe_join([fa_icon('diamond fw'), 'Sidekiq']), sidekiq_url, link_html: { target: 'sidekiq' }, if: -> { current_user.admin? }
       s.item :pghero, safe_join([fa_icon('database fw'), 'PgHero']), pghero_url, link_html: { target: 'pghero' }, if: -> { current_user.admin? }
diff --git a/config/routes.rb b/config/routes.rb
index 50bbb8b5f..b8f908ffc 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -256,6 +256,17 @@ Rails.application.routes.draw do
 
     resources :rules
 
+    resources :webhooks do
+      member do
+        post :enable
+        post :disable
+      end
+
+      resource :secret, only: [], controller: 'webhooks/secrets' do
+        post :rotate
+      end
+    end
+
     resources :reports, only: [:index, :show] do
       resources :actions, only: [:create], controller: 'reports/actions'
 
diff --git a/db/migrate/20220606044941_create_webhooks.rb b/db/migrate/20220606044941_create_webhooks.rb
new file mode 100644
index 000000000..cca48fce6
--- /dev/null
+++ b/db/migrate/20220606044941_create_webhooks.rb
@@ -0,0 +1,12 @@
+class CreateWebhooks < ActiveRecord::Migration[6.1]
+  def change
+    create_table :webhooks do |t|
+      t.string :url, null: false, index: { unique: true }
+      t.string :events, array: true, null: false, default: []
+      t.string :secret, null: false, default: ''
+      t.boolean :enabled, null: false, default: true
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 07dc11592..526480df4 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_05_27_114923) do
+ActiveRecord::Schema.define(version: 2022_06_06_044941) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -1038,6 +1038,16 @@ ActiveRecord::Schema.define(version: 2022_05_27_114923) do
     t.index ["user_id"], name: "index_webauthn_credentials_on_user_id"
   end
 
+  create_table "webhooks", force: :cascade do |t|
+    t.string "url", null: false
+    t.string "events", default: [], null: false, array: true
+    t.string "secret", default: "", null: false
+    t.boolean "enabled", default: true, null: false
+    t.datetime "created_at", precision: 6, null: false
+    t.datetime "updated_at", precision: 6, null: false
+    t.index ["url"], name: "index_webhooks_on_url", unique: true
+  end
+
   add_foreign_key "account_aliases", "accounts", on_delete: :cascade
   add_foreign_key "account_conversations", "accounts", on_delete: :cascade
   add_foreign_key "account_conversations", "conversations", on_delete: :cascade
diff --git a/docker-compose.yml b/docker-compose.yml
index 5c2c0c5df..d86cb55d2 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -25,13 +25,20 @@ services:
 
   # es:
   #   restart: always
-  #   image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
+  #   image: docker.elastic.co/elasticsearch/elasticsearch:7.17.4
   #   environment:
-  #     - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
+  #     - "ES_JAVA_OPTS=-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true"
+  #     - "xpack.license.self_generated.type=basic"
+  #     - "xpack.security.enabled=false"
+  #     - "xpack.watcher.enabled=false"
+  #     - "xpack.graph.enabled=false"
+  #     - "xpack.ml.enabled=false"
+  #     - "bootstrap.memory_lock=true"
   #     - "cluster.name=es-mastodon"
   #     - "discovery.type=single-node"
-  #     - "bootstrap.memory_lock=true"
+  #     - "thread_pool.write.queue_size=1000"
   #   networks:
+  #      - external_network
   #      - internal_network
   #   healthcheck:
   #      test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
@@ -41,6 +48,11 @@ services:
   #     memlock:
   #       soft: -1
   #       hard: -1
+  #     nofile:
+  #       soft: 65536
+  #       hard: 65536
+  #   ports:
+  #     - '127.0.0.1:9200:9200'
 
   web:
     build: .
diff --git a/lib/assets/wordmark.dark.css b/lib/assets/wordmark.dark.css
new file mode 100644
index 000000000..d87069178
--- /dev/null
+++ b/lib/assets/wordmark.dark.css
@@ -0,0 +1 @@
+// Not needed
diff --git a/lib/assets/wordmark.dark.png b/lib/assets/wordmark.dark.png
new file mode 100644
index 000000000..defe50178
--- /dev/null
+++ b/lib/assets/wordmark.dark.png
Binary files differdiff --git a/lib/assets/wordmark.light.css b/lib/assets/wordmark.light.css
new file mode 100644
index 000000000..9a601f972
--- /dev/null
+++ b/lib/assets/wordmark.light.css
@@ -0,0 +1 @@
+use { color: #000 !important; }
diff --git a/lib/assets/wordmark.light.png b/lib/assets/wordmark.light.png
new file mode 100644
index 000000000..d4485c0fb
--- /dev/null
+++ b/lib/assets/wordmark.light.png
Binary files differdiff --git a/lib/tasks/branding.rake b/lib/tasks/branding.rake
new file mode 100644
index 000000000..2eec7c9e1
--- /dev/null
+++ b/lib/tasks/branding.rake
@@ -0,0 +1,77 @@
+namespace :branding do
+  desc 'Generate necessary graphic assets for branding from source SVG files'
+  task generate: :environment do
+    Rake::Task['branding:generate_app_icons'].invoke
+    Rake::Task['branding:generate_app_badge'].invoke
+    Rake::Task['branding:generate_github_assets'].invoke
+    Rake::Task['branding:generate_mailer_assets'].invoke
+  end
+
+  desc 'Generate PNG icons and logos for e-mail templates'
+  task generate_mailer_assets: :environment do
+    rsvg_convert = Terrapin::CommandLine.new('rsvg-convert', '-h :size --keep-aspect-ratio :input -o :output')
+    output_dest  = Rails.root.join('app', 'javascript', 'images', 'mailer')
+
+    # Displayed size is 64px, at 3x it's 192px
+    Dir[Rails.root.join('app', 'javascript', 'images', 'icons', '*.svg')].each do |path|
+      rsvg_convert.run(input: path, size: 192, output: output_dest.join("#{File.basename(path, '.svg')}.png"))
+    end
+
+    # Displayed size is 34px, at 3x it's 102px
+    rsvg_convert.run(input: Rails.root.join('app', 'javascript', 'images', 'logo-symbol-wordmark.svg'), size: 102, output: output_dest.join('wordmark.png'))
+
+    # Displayed size is 24px, at 3x it's 72px
+    rsvg_convert.run(input: Rails.root.join('app', 'javascript', 'images', 'logo-symbol-icon.svg'), size: 72, output: output_dest.join('logo.png'))
+  end
+
+  desc 'Generate light/dark logotypes for GitHub'
+  task generate_github_assets: :environment do
+    rsvg_convert = Terrapin::CommandLine.new('rsvg-convert', '--stylesheet :stylesheet -h :size --keep-aspect-ratio :input -o :output')
+    output_dest  = Rails.root.join('lib', 'assets')
+
+    rsvg_convert.run(stylesheet: Rails.root.join('lib', 'assets', 'wordmark.dark.css'), input: Rails.root.join('app', 'javascript', 'images', 'logo-symbol-wordmark.svg'), size: 102, output: output_dest.join('wordmark.dark.png'))
+    rsvg_convert.run(stylesheet: Rails.root.join('lib', 'assets', 'wordmark.light.css'), input: Rails.root.join('app', 'javascript', 'images', 'logo-symbol-wordmark.svg'), size: 102, output: output_dest.join('wordmark.light.png'))
+  end
+
+  desc 'Generate favicons and app icons from SVG source files'
+  task generate_app_icons: :environment do
+    favicon_source  = Rails.root.join('app', 'javascript', 'images', 'logo.svg')
+    app_icon_source = Rails.root.join('app', 'javascript', 'images', 'app-icon.svg')
+    output_dest     = Rails.root.join('app', 'javascript', 'icons')
+
+    rsvg_convert = Terrapin::CommandLine.new('rsvg-convert', '-w :size -h :size --keep-aspect-ratio :input -o :output')
+    convert = Terrapin::CommandLine.new('convert', ':input :output')
+
+    favicon_sizes      = [16, 32, 48]
+    apple_icon_sizes   = [57, 60, 72, 76, 114, 120, 144, 152, 167, 180, 1024]
+    android_icon_sizes = [36, 48, 72, 96, 144, 192, 256, 384, 512]
+
+    favicons = []
+
+    favicon_sizes.each do |size|
+      output_path = output_dest.join("favicon-#{size}x#{size}.png")
+      favicons << output_path
+      rsvg_convert.run(size: size, input: favicon_source, output: output_path)
+    end
+
+    convert.run(input: favicons, output: Rails.root.join('public', 'favicon.ico'))
+
+    apple_icon_sizes.each do |size|
+      rsvg_convert.run(size: size, input: app_icon_source, output: output_dest.join("apple-touch-icon-#{size}x#{size}.png"))
+    end
+
+    android_icon_sizes.each do |size|
+      rsvg_convert.run(size: size, input: app_icon_source, output: output_dest.join("android-chrome-#{size}x#{size}.png"))
+    end
+  end
+
+  desc 'Generate badge icon from SVG source files'
+  task generate_app_badge: :environment do
+    rsvg_convert = Terrapin::CommandLine.new('rsvg-convert', '--stylesheet :stylesheet -w :size -h :size --keep-aspect-ratio :input -o :output')
+    badge_source = Rails.root.join('app', 'javascript', 'images', 'logo-symbol-icon.svg')
+    output_dest  = Rails.root.join('public')
+    stylesheet   = Rails.root.join('lib', 'assets', 'wordmark.light.css')
+
+    rsvg_convert.run(stylesheet: stylesheet, input: badge_source, size: 192, output: output_dest.join('badge.png'))
+  end
+end
diff --git a/package.json b/package.json
index 6e23e9c74..620c8c17c 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
   "name": "@mastodon/mastodon",
   "license": "AGPL-3.0-or-later",
   "engines": {
-    "node": ">=12"
+    "node": ">=14"
   },
   "scripts": {
     "postversion": "git push --tags",
@@ -24,10 +24,10 @@
   },
   "private": true,
   "dependencies": {
-    "@babel/core": "^7.18.2",
+    "@babel/core": "^7.18.5",
     "@babel/plugin-proposal-decorators": "^7.18.2",
     "@babel/plugin-transform-react-inline-elements": "^7.16.7",
-    "@babel/plugin-transform-runtime": "^7.18.2",
+    "@babel/plugin-transform-runtime": "^7.18.5",
     "@babel/preset-env": "^7.18.2",
     "@babel/preset-react": "^7.17.12",
     "@babel/runtime": "^7.18.3",
@@ -68,7 +68,7 @@
     "http-link-header": "^1.0.4",
     "immutable": "^4.1.0",
     "imports-loader": "^1.2.0",
-    "intersection-observer": "^0.12.0",
+    "intersection-observer": "^0.12.2",
     "intl": "^1.2.5",
     "intl-messageformat": "^2.2.0",
     "intl-relativeformat": "^6.4.3",
@@ -118,9 +118,9 @@
     "regenerator-runtime": "^0.13.9",
     "rellax": "^1.12.1",
     "requestidlecallback": "^0.3.0",
-    "reselect": "^4.1.5",
+    "reselect": "^4.1.6",
     "rimraf": "^3.0.2",
-    "sass": "^1.52.1",
+    "sass": "^1.52.3",
     "sass-loader": "^10.2.0",
     "stacktrace-js": "^2.0.2",
     "stringz": "^2.1.0",
@@ -136,27 +136,27 @@
     "webpack-bundle-analyzer": "^4.5.0",
     "webpack-cli": "^3.3.12",
     "webpack-merge": "^5.8.0",
-    "wicg-inert": "^3.1.1",
-    "ws": "^8.6.0"
+    "wicg-inert": "^3.1.2",
+    "ws": "^8.8.0"
   },
   "devDependencies": {
     "@babel/eslint-parser": "^7.18.2",
     "@testing-library/jest-dom": "^5.16.4",
     "@testing-library/react": "^12.1.5",
-    "babel-jest": "^28.1.0",
+    "babel-jest": "^28.1.1",
     "eslint": "^7.32.0",
     "eslint-plugin-import": "~2.26.0",
     "eslint-plugin-jsx-a11y": "~6.5.1",
     "eslint-plugin-promise": "~6.0.0",
     "eslint-plugin-react": "~7.30.0",
-    "jest": "^28.1.0",
-    "jest-environment-jsdom": "^28.1.0",
+    "jest": "^28.1.1",
+    "jest-environment-jsdom": "^28.1.1",
     "postcss-scss": "^4.0.4",
-    "prettier": "^2.6.2",
+    "prettier": "^2.7.1",
     "raf": "^3.4.1",
     "react-intl-translations-manager": "^5.0.3",
     "react-test-renderer": "^16.14.0",
-    "stylelint": "^14.8.5",
+    "stylelint": "^14.9.1",
     "stylelint-config-standard-scss": "^4.0.0",
     "webpack-dev-server": "^3.11.3",
     "yargs": "^17.5.1"
diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png
deleted file mode 100644
index a96fa174e..000000000
--- a/public/android-chrome-192x192.png
+++ /dev/null
Binary files differdiff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
deleted file mode 100644
index a44c6e698..000000000
--- a/public/apple-touch-icon.png
+++ /dev/null
Binary files differdiff --git a/public/browserconfig.xml b/public/browserconfig.xml
deleted file mode 100644
index 7fdab5058..000000000
--- a/public/browserconfig.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<browserconfig>
-  <msapplication>
-    <tile>
-      <square150x150logo src="/mstile-150x150.png"/>
-      <TileColor>#282c37</TileColor>
-    </tile>
-  </msapplication>
-</browserconfig>
diff --git a/public/favicon-dev.ico b/public/favicon-dev.ico
deleted file mode 100644
index 383604406..000000000
--- a/public/favicon-dev.ico
+++ /dev/null
Binary files differdiff --git a/public/mask-icon.svg b/public/mask-icon.svg
deleted file mode 100644
index 337d2c230..000000000
--- a/public/mask-icon.svg
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   width="159.20357mm"
-   height="159.20357mm"
-   viewBox="0 0 159.20356 159.20357"
-   version="1.1"
-   id="svg8"
-   inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
-   sodipodi:docname="mask-icon.svg"
-   inkscape:export-filename="/home/minnow/devil/pluralcafe/mastodon/public/badge.png"
-   inkscape:export-xdpi="23.93"
-   inkscape:export-ydpi="23.93"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:dc="http://purl.org/dc/elements/1.1/">
-  <defs
-     id="defs2">
-    <filter
-       style="color-interpolation-filters:sRGB"
-       inkscape:label="Drop Shadow"
-       id="filter5459">
-      <feFlood
-         flood-opacity="0.498039"
-         flood-color="rgb(0,0,0)"
-         result="flood"
-         id="feFlood5449" />
-      <feComposite
-         in="flood"
-         in2="SourceGraphic"
-         operator="in"
-         result="composite1"
-         id="feComposite5451" />
-      <feGaussianBlur
-         in="composite1"
-         stdDeviation="0.2"
-         result="blur"
-         id="feGaussianBlur5453" />
-      <feOffset
-         dx="0"
-         dy="0"
-         result="offset"
-         id="feOffset5455" />
-      <feComposite
-         in="SourceGraphic"
-         in2="offset"
-         operator="over"
-         result="composite2"
-         id="feComposite5457" />
-    </filter>
-    <clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath1688">
-      <rect
-         style="opacity:1;fill:#36393f;fill-opacity:1;stroke:none;stroke-width:16.1638546;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         id="rect1690"
-         width="102.64047"
-         height="102.3961"
-         x="118.12769"
-         y="105.70743" />
-    </clipPath>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.98994949"
-     inkscape:cx="383.35289"
-     inkscape:cy="294.45947"
-     inkscape:document-units="mm"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1056"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="1"
-     inkscape:snap-nodes="false"
-     inkscape:snap-others="false"
-     showguides="false"
-     inkscape:pagecheckerboard="0" />
-  <metadata
-     id="metadata5">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-30.011304,-56.758324)">
-    <path
-       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.15721;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="m 107.52127,214.59409 c -5.89767,-2.43447 -7.720053,-10.29767 -1.74482,-17.38244 5.77152,-7.75189 18.48857,-12.63768 12.85382,-23.94432 -3.13905,-6.29886 -53.50483,-69.00527 -53.50483,-69.00527 -4.518819,-5.403169 -8.633881,-21.022489 -0.928272,-34.866304 4.11484,-7.392668 11.479333,-12.058827 19.732039,-12.058827 8.94179,0 16.712613,8.670957 18.409283,16.233592 4.88534,21.77559 -17.942163,40.485339 -28.73174,61.460749 -3.329728,6.47312 -5.682418,16.12511 -0.446777,21.58081 7.749343,8.07505 22.461034,7.73957 35.350087,4.20475 12.88908,-3.53483 23.46273,-8.73351 22.08512,-23.03923 -1.37762,-14.30572 -18.10145,-7.94804 -17.99127,-15.96512 0.0205,-1.49547 0.33725,-2.48825 3.43658,-2.8847 3.16924,-0.40537 17.75209,-0.42546 24.94415,-1.1616 7.22032,-0.73904 17.72843,-3.55962 18.24839,-10.57119 0.99698,-13.444829 -15.42535,-5.1946 -12.31158,-9.669459 2.96395,-4.25956 19.87765,-5.28476 20.11925,9.152339 0.27198,16.25251 -27.37538,20.31454 -27.37538,20.31454 1.36374,0.88854 6.66965,10.60763 -0.73417,26.05555 -10.6477,22.21623 -70.067622,30.69545 -81.505642,3.49288 -2.420845,-5.7574 -1.003809,-13.89818 3.298238,-22.75227 11.819495,-20.37351 28.533711,-29.30451 31.703891,-49.712069 0.61816,-3.97941 -0.49563,-14.626734 -9.474915,-14.626734 -11.540776,0 -14.769898,20.392384 -6.908027,30.393964 l 51.303495,65.266159 c 4.35859,6.30732 10.64703,22.86665 5.7918,33.18223 -4.06972,8.64665 -16.10547,20.22882 -25.61872,16.30197 z"
-       id="path1606"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="acscssasazzassssscsscssscaa" />
-  </g>
-  <g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="guide"
-     sodipodi:insensitive="true"
-     style="display:none">
-    <g
-       transform="translate(-30.011304,-56.758323)"
-       style="display:inline"
-       id="g870">
-      <g
-         style="fill:none;fill-opacity:1;stroke:#808080;stroke-width:0.39886039;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         transform="matrix(4.4223215,0,0,4.4223215,30.011304,56.758324)"
-         id="g868-3">
-        <path
-           inkscape:export-ydpi="92.813103"
-           inkscape:export-xdpi="92.813103"
-           inkscape:export-filename="/home/mordecai/alt-key-purple.png"
-           style="fill:none;fill-opacity:1;stroke:#808080;stroke-width:0.39886039;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:connector-curvature="0"
-           d="m 36,32 c 0,2.209 -1.791,4 -4,4 H 4 C 1.791,36 0,34.209 0,32 V 4 C 0,1.791 1.791,0 4,0 h 28 c 2.209,0 4,1.791 4,4 z"
-           id="path854-6" />
-      </g>
-      <g
-         style="fill:none;fill-opacity:1;stroke:#808080;stroke-width:0.39886039;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-         transform="matrix(3.2281286,0,0,3.2281286,51.506777,78.253798)"
-         id="g868-3-7">
-        <path
-           inkscape:export-ydpi="92.813103"
-           inkscape:export-xdpi="92.813103"
-           inkscape:export-filename="/home/mordecai/alt-key-purple.png"
-           style="fill:none;fill-opacity:1;stroke:#808080;stroke-width:0.39886039;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-           inkscape:connector-curvature="0"
-           d="m 36,32 c 0,2.209 -1.791,4 -4,4 H 4 C 1.791,36 0,34.209 0,32 V 4 C 0,1.791 1.791,0 4,0 h 28 c 2.209,0 4,1.791 4,4 z"
-           id="path854-6-5" />
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png
deleted file mode 100644
index fc49c776e..000000000
--- a/public/mstile-150x150.png
+++ /dev/null
Binary files differdiff --git a/public/shortcuts/direct.png b/public/shortcuts/direct.png
deleted file mode 100644
index e8772c00e..000000000
--- a/public/shortcuts/direct.png
+++ /dev/null
Binary files differdiff --git a/public/shortcuts/new-status.png b/public/shortcuts/new-status.png
deleted file mode 100644
index b7095f3c4..000000000
--- a/public/shortcuts/new-status.png
+++ /dev/null
Binary files differdiff --git a/public/shortcuts/notifications.png b/public/shortcuts/notifications.png
deleted file mode 100644
index 6b9d45718..000000000
--- a/public/shortcuts/notifications.png
+++ /dev/null
Binary files differdiff --git a/public/shortcuts/profile.png b/public/shortcuts/profile.png
deleted file mode 100644
index 0b3bf517d..000000000
--- a/public/shortcuts/profile.png
+++ /dev/null
Binary files differdiff --git a/spec/fabricators/webhook_fabricator.rb b/spec/fabricators/webhook_fabricator.rb
new file mode 100644
index 000000000..fa4f17b55
--- /dev/null
+++ b/spec/fabricators/webhook_fabricator.rb
@@ -0,0 +1,5 @@
+Fabricator(:webhook) do
+  url { Faker::Internet.url }
+  secret { SecureRandom.hex }
+  events { Webhook::EVENTS }
+end
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index b9d38d8c6..20ee32aa0 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -59,13 +59,6 @@ describe ApplicationHelper do
     end
   end
 
-  describe 'favicon_path' do
-    it 'returns /favicon.ico on production environment' do
-      expect(Rails.env).to receive(:production?).and_return(true)
-      expect(helper.favicon_path).to eq '/favicon.ico'
-    end
-  end
-
   describe 'open_registrations?' do
     it 'returns true when open for registrations' do
       without_partial_double_verification do
diff --git a/spec/models/webhook_spec.rb b/spec/models/webhook_spec.rb
new file mode 100644
index 000000000..60c3d9524
--- /dev/null
+++ b/spec/models/webhook_spec.rb
@@ -0,0 +1,32 @@
+require 'rails_helper'
+
+RSpec.describe Webhook, type: :model do
+  let(:webhook) { Fabricate(:webhook) }
+
+  describe '#rotate_secret!' do
+    it 'changes the secret' do
+      previous_value = webhook.secret
+      webhook.rotate_secret!
+      expect(webhook.secret).to_not be_blank
+      expect(webhook.secret).to_not eq previous_value
+    end
+  end
+
+  describe '#enable!' do
+    before do
+      webhook.disable!
+    end
+
+    it 'enables the webhook' do
+      webhook.enable!
+      expect(webhook.enabled?).to be true
+    end
+  end
+
+  describe '#disable!' do
+    it 'disables the webhook' do
+      webhook.disable!
+      expect(webhook.enabled?).to be false
+    end
+  end
+end
diff --git a/spec/validators/url_validator_spec.rb b/spec/validators/url_validator_spec.rb
index a44878a44..85eadeb63 100644
--- a/spec/validators/url_validator_spec.rb
+++ b/spec/validators/url_validator_spec.rb
@@ -19,7 +19,7 @@ RSpec.describe URLValidator, type: :validator do
       let(:compliant) { false }
 
       it 'calls errors.add' do
-        expect(errors).to have_received(:add).with(attribute, I18n.t('applications.invalid_url'))
+        expect(errors).to have_received(:add).with(attribute, :invalid)
       end
     end
 
diff --git a/yarn.lock b/yarn.lock
index 74cbc0550..1e0ca6547 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -28,10 +28,10 @@
   resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab"
   integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==
 
-"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.2", "@babel/core@^7.7.2":
-  version "7.18.2"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.2.tgz#87b2fcd7cce9becaa7f5acebdc4f09f3dd19d876"
-  integrity sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==
+"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.7.2":
+  version "7.18.5"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.5.tgz#c597fa680e58d571c28dda9827669c78cdd7f000"
+  integrity sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==
   dependencies:
     "@ampproject/remapping" "^2.1.0"
     "@babel/code-frame" "^7.16.7"
@@ -39,10 +39,10 @@
     "@babel/helper-compilation-targets" "^7.18.2"
     "@babel/helper-module-transforms" "^7.18.0"
     "@babel/helpers" "^7.18.2"
-    "@babel/parser" "^7.18.0"
+    "@babel/parser" "^7.18.5"
     "@babel/template" "^7.16.7"
-    "@babel/traverse" "^7.18.2"
-    "@babel/types" "^7.18.2"
+    "@babel/traverse" "^7.18.5"
+    "@babel/types" "^7.18.4"
     convert-source-map "^1.7.0"
     debug "^4.1.0"
     gensync "^1.0.0-beta.2"
@@ -333,10 +333,10 @@
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.0":
-  version "7.18.0"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.0.tgz#10a8d4e656bc01128d299a787aa006ce1a91e112"
-  integrity sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.5":
+  version "7.18.5"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c"
+  integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==
 
 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12":
   version "7.17.12"
@@ -883,10 +883,10 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.17.12"
 
-"@babel/plugin-transform-runtime@^7.18.2":
-  version "7.18.2"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz#04637de1e45ae8847ff14b9beead09c33d34374d"
-  integrity sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==
+"@babel/plugin-transform-runtime@^7.18.5":
+  version "7.18.5"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.5.tgz#f4d3188ba6a8815793993c71c2c225d0ee1d7743"
+  integrity sha512-Q17hHxXr2fplrE+5BSC1j1Fo5cOA8YeP8XW3/1paI8MzF/faZGh0MaH1KC4jLAvqLPamQWHB5/B7KqSLY1kuHA==
   dependencies:
     "@babel/helper-module-imports" "^7.16.7"
     "@babel/helper-plugin-utils" "^7.17.12"
@@ -1088,10 +1088,10 @@
     "@babel/parser" "^7.16.7"
     "@babel/types" "^7.16.7"
 
-"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.7.2":
-  version "7.18.2"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.2.tgz#b77a52604b5cc836a9e1e08dca01cba67a12d2e8"
-  integrity sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==
+"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.18.5", "@babel/traverse@^7.7.2":
+  version "7.18.5"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.5.tgz#94a8195ad9642801837988ab77f36e992d9a20cd"
+  integrity sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==
   dependencies:
     "@babel/code-frame" "^7.16.7"
     "@babel/generator" "^7.18.2"
@@ -1099,15 +1099,15 @@
     "@babel/helper-function-name" "^7.17.9"
     "@babel/helper-hoist-variables" "^7.16.7"
     "@babel/helper-split-export-declaration" "^7.16.7"
-    "@babel/parser" "^7.18.0"
-    "@babel/types" "^7.18.2"
+    "@babel/parser" "^7.18.5"
+    "@babel/types" "^7.18.4"
     debug "^4.1.0"
     globals "^11.1.0"
 
-"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
-  version "7.18.2"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.2.tgz#191abfed79ebe6f4242f643a9a5cbaa36b10b091"
-  integrity sha512-0On6B8A4/+mFUto5WERt3EEuG1NznDirvwca1O8UwXQHVY8g3R7OzYgxXdOfMwLO08UrpUD/2+3Bclyq+/C94Q==
+"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.18.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
+  version "7.18.4"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354"
+  integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==
   dependencies:
     "@babel/helper-validator-identifier" "^7.16.7"
     to-fast-properties "^2.0.0"
@@ -1117,6 +1117,11 @@
   resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz"
   integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
 
+"@csstools/selector-specificity@^2.0.1":
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.1.tgz#b6b8d81780b9a9f6459f4bfe9226ac6aefaefe87"
+  integrity sha512-aG20vknL4/YjQF9BSV7ts4EWm/yrjagAN7OWBNmlbEOUiu0llj4OGrFoOKK3g2vey4/p2omKCoHrWtPxSwV3HA==
+
 "@emotion/babel-plugin@^11.7.1":
   version "11.9.2"
   resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz#723b6d394c89fb2ef782229d92ba95a740576e95"
@@ -1272,28 +1277,28 @@
   resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz"
   integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==
 
-"@jest/console@^28.1.0":
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.0.tgz#db78222c3d3b0c1db82f1b9de51094c2aaff2176"
-  integrity sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA==
+"@jest/console@^28.1.1":
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.1.tgz#305f8ca50b6e70413839f54c0e002b60a0f2fd7d"
+  integrity sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA==
   dependencies:
-    "@jest/types" "^28.1.0"
+    "@jest/types" "^28.1.1"
     "@types/node" "*"
     chalk "^4.0.0"
-    jest-message-util "^28.1.0"
-    jest-util "^28.1.0"
+    jest-message-util "^28.1.1"
+    jest-util "^28.1.1"
     slash "^3.0.0"
 
-"@jest/core@^28.1.0":
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.0.tgz#784a1e6ce5358b46fcbdcfbbd93b1b713ed4ea80"
-  integrity sha512-/2PTt0ywhjZ4NwNO4bUqD9IVJfmFVhVKGlhvSpmEfUCuxYf/3NHcKmRFI+I71lYzbTT3wMuYpETDCTHo81gC/g==
+"@jest/core@^28.1.1":
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.1.tgz#086830bec6267accf9af5ca76f794858e9f9f092"
+  integrity sha512-3pYsBoZZ42tXMdlcFeCc/0j9kOlK7MYuXs2B1QbvDgMoW1K9NJ4G/VYvIbMb26iqlkTfPHo7SC2JgjDOk/mxXw==
   dependencies:
-    "@jest/console" "^28.1.0"
-    "@jest/reporters" "^28.1.0"
-    "@jest/test-result" "^28.1.0"
-    "@jest/transform" "^28.1.0"
-    "@jest/types" "^28.1.0"
+    "@jest/console" "^28.1.1"
+    "@jest/reporters" "^28.1.1"
+    "@jest/test-result" "^28.1.1"
+    "@jest/transform" "^28.1.1"
+    "@jest/types" "^28.1.1"
     "@types/node" "*"
     ansi-escapes "^4.2.1"
     chalk "^4.0.0"
@@ -1301,80 +1306,80 @@
     exit "^0.1.2"
     graceful-fs "^4.2.9"
     jest-changed-files "^28.0.2"
-    jest-config "^28.1.0"
-    jest-haste-map "^28.1.0"
-    jest-message-util "^28.1.0"
+    jest-config "^28.1.1"
+    jest-haste-map "^28.1.1"
+    jest-message-util "^28.1.1"
     jest-regex-util "^28.0.2"
-    jest-resolve "^28.1.0"
-    jest-resolve-dependencies "^28.1.0"
-    jest-runner "^28.1.0"
-    jest-runtime "^28.1.0"
-    jest-snapshot "^28.1.0"
-    jest-util "^28.1.0"
-    jest-validate "^28.1.0"
-    jest-watcher "^28.1.0"
+    jest-resolve "^28.1.1"
+    jest-resolve-dependencies "^28.1.1"
+    jest-runner "^28.1.1"
+    jest-runtime "^28.1.1"
+    jest-snapshot "^28.1.1"
+    jest-util "^28.1.1"
+    jest-validate "^28.1.1"
+    jest-watcher "^28.1.1"
     micromatch "^4.0.4"
-    pretty-format "^28.1.0"
+    pretty-format "^28.1.1"
     rimraf "^3.0.0"
     slash "^3.0.0"
     strip-ansi "^6.0.0"
 
-"@jest/environment@^28.1.0":
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.0.tgz#dedf7d59ec341b9292fcf459fd0ed819eb2e228a"
-  integrity sha512-S44WGSxkRngzHslhV6RoAExekfF7Qhwa6R5+IYFa81mpcj0YgdBnRSmvHe3SNwOt64yXaE5GG8Y2xM28ii5ssA==
+"@jest/environment@^28.1.1":
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.1.tgz#c4cbf85283278d768f816ebd1a258ea6f9e39d4f"
+  integrity sha512-9auVQ2GzQ7nrU+lAr8KyY838YahElTX9HVjbQPPS2XjlxQ+na18G113OoBhyBGBtD6ZnO/SrUy5WR8EzOj1/Uw==
   dependencies:
-    "@jest/fake-timers" "^28.1.0"
-    "@jest/types" "^28.1.0"
+    "@jest/fake-timers" "^28.1.1"
+    "@jest/types" "^28.1.1"
     "@types/node" "*"
-    jest-mock "^28.1.0"
+    jest-mock "^28.1.1"
 
-"@jest/expect-utils@^28.1.0":
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.0.tgz#a5cde811195515a9809b96748ae8bcc331a3538a"
-  integrity sha512-5BrG48dpC0sB80wpeIX5FU6kolDJI4K0n5BM9a5V38MGx0pyRvUBSS0u2aNTdDzmOrCjhOg8pGs6a20ivYkdmw==
+"@jest/expect-utils@^28.1.1":
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.1.tgz#d84c346025b9f6f3886d02c48a6177e2b0360587"
+  integrity sha512-n/ghlvdhCdMI/hTcnn4qV57kQuV9OTsZzH1TTCVARANKhl6hXJqLKUkwX69ftMGpsbpt96SsDD8n8LD2d9+FRw==
   dependencies:
     jest-get-type "^28.0.2"
 
-"@jest/expect@^28.1.0":
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.0.tgz#2e5a31db692597070932366a1602b5157f0f217c"
-  integrity sha512-be9ETznPLaHOmeJqzYNIXv1ADEzENuQonIoobzThOYPuK/6GhrWNIJDVTgBLCrz3Am73PyEU2urQClZp0hLTtA==
+"@jest/expect@^28.1.1":
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.1.tgz#ea4fcc8504b45835029221c0dc357c622a761326"
+  integrity sha512-/+tQprrFoT6lfkMj4mW/mUIfAmmk/+iQPmg7mLDIFOf2lyf7EBHaS+x3RbeR0VZVMe55IvX7QRoT/2aK3AuUXg==
   dependencies:
-    expect "^28.1.0"
-    jest-snapshot "^28.1.0"
+    expect "^28.1.1"
+    jest-snapshot "^28.1.1"
 
-"@jest/fake-timers@^28.1.0":
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.0.tgz#ea77878aabd5c5d50e1fc53e76d3226101e33064"
-  integrity sha512-Xqsf/6VLeAAq78+GNPzI7FZQRf5cCHj1qgQxCjws9n8rKw8r1UYoeaALwBvyuzOkpU3c1I6emeMySPa96rxtIg==
+"@jest/fake-timers@^28.1.1":
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.1.tgz#47ce33296ab9d680c76076d51ddbe65ceb3337f1"
+  integrity sha512-BY/3+TyLs5+q87rGWrGUY5f8e8uC3LsVHS9Diz8+FV3ARXL4sNnkLlIB8dvDvRrp+LUCGM+DLqlsYubizGUjIA==
   dependencies:
-    "@jest/types" "^28.1.0"
+    "@jest/types" "^28.1.1"
     "@sinonjs/fake-timers" "^9.1.1"
     "@types/node" "*"
-    jest-message-util "^28.1.0"
-    jest-mock "^28.1.0"
-    jest-util "^28.1.0"
+    jest-message-util "^28.1.1"
+    jest-mock "^28.1.1"
+    jest-util "^28.1.1"
 
-"@jest/globals@^28.1.0":
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.0.tgz#a4427d2eb11763002ff58e24de56b84ba79eb793"
-  integrity sha512-3m7sTg52OTQR6dPhsEQSxAvU+LOBbMivZBwOvKEZ+Rb+GyxVnXi9HKgOTYkx/S99T8yvh17U4tNNJPIEQmtwYw==
+"@jest/globals@^28.1.1":
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.1.tgz#c0a7977f85e26279cc090d9adcdf82b8a34c4061"
+  integrity sha512-dEgl/6v7ToB4vXItdvcltJBgny0xBE6xy6IYQrPJAJggdEinGxCDMivNv7sFzPcTITGquXD6UJwYxfJ/5ZwDSg==
   dependencies:
-    "@jest/environment" "^28.1.0"
-    "@jest/expect" "^28.1.0"
-    "@jest/types" "^28.1.0"
+    "@jest/environment" "^28.1.1"
+    "@jest/expect" "^28.1.1"
+    "@jest/types" "^28.1.1"
 
-"@jest/reporters@^28.1.0":
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.0.tgz#5183a28b9b593b6000fa9b89b031c7216b58a9a0"
-  integrity sha512-qxbFfqap/5QlSpIizH9c/bFCDKsQlM4uAKSOvZrP+nIdrjqre3FmKzpTtYyhsaVcOSNK7TTt2kjm+4BJIjysFA==
+"@jest/reporters@^28.1.1":
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.1.tgz#9389f4bb3cce4d9b586f6195f83c79cd2a1c8662"
+  integrity sha512-597Zj4D4d88sZrzM4atEGLuO7SdA/YrOv9SRXHXRNC+/FwPCWxZhBAEzhXoiJzfRwn8zes/EjS8Lo6DouGN5Gg==
   dependencies:
     "@bcoe/v8-coverage" "^0.2.3"
-    "@jest/console" "^28.1.0"
-    "@jest/test-result" "^28.1.0"
-    "@jest/transform" "^28.1.0"
-    "@jest/types" "^28.1.0"
+    "@jest/console" "^28.1.1"
+    "@jest/test-result" "^28.1.1"
+    "@jest/transform" "^28.1.1"
+    "@jest/types" "^28.1.1"
     "@jridgewell/trace-mapping" "^0.3.7"
     "@types/node" "*"
     chalk "^4.0.0"
@@ -1387,8 +1392,9 @@
     istanbul-lib-report "^3.0.0"
     istanbul-lib-source-maps "^4.0.0"
     istanbul-reports "^3.1.3"
-    jest-util "^28.1.0"
-    jest-worker "^28.1.0"
+    jest-message-util "^28.1.1"
+    jest-util "^28.1.1"
+    jest-worker "^28.1.1"
     slash "^3.0.0"
     string-length "^4.0.1"
     strip-ansi "^6.0.0"
@@ -1411,42 +1417,42 @@
     callsites "^3.0.0"
     graceful-fs "^4.2.9"
 
-"@jest/test-result@^28.1.0":
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.0.tgz#fd149dee123510dd2fcadbbf5f0020f98ad7f12c"
-  integrity sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ==
+"@jest/test-result@^28.1.1":
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.1.tgz#c6f18d1bbb01aa88925dd687872a75f8414b317a"
+  integrity sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==
   dependencies:
-    "@jest/console" "^28.1.0"
-    "@jest/types" "^28.1.0"
+    "@jest/console" "^28.1.1"
+    "@jest/types" "^28.1.1"
     "@types/istanbul-lib-coverage" "^2.0.0"
     collect-v8-coverage "^1.0.0"
 
-"@jest/test-sequencer@^28.1.0":
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.0.tgz#ce7294bbe986415b9a30e218c7e705e6ebf2cdf2"
-  integrity sha512-tZCEiVWlWNTs/2iK9yi6o3AlMfbbYgV4uuZInSVdzZ7ftpHZhCMuhvk2HLYhCZzLgPFQ9MnM1YaxMnh3TILFiQ==
+"@jest/test-sequencer@^28.1.1":
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.1.tgz#f594ee2331df75000afe0d1ae3237630ecec732e"
+  integrity sha512-nuL+dNSVMcWB7OOtgb0EGH5AjO4UBCt68SLP08rwmC+iRhyuJWS9MtZ/MpipxFwKAlHFftbMsydXqWre8B0+XA==
   dependencies:
-    "@jest/test-result" "^28.1.0"
+    "@jest/test-result" "^28.1.1"
     graceful-fs "^4.2.9"
-    jest-haste-map "^28.1.0"
+    jest-haste-map "^28.1.1"
     slash "^3.0.0"
 
-"@jest/transform@^28.1.0":
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.0.tgz#224a3c9ba4cc98e2ff996c0a89a2d59db15c74ce"
-  integrity sha512-omy2xe5WxlAfqmsTjTPxw+iXRTRnf+NtX0ToG+4S0tABeb4KsKmPUHq5UBuwunHg3tJRwgEQhEp0M/8oiatLEA==
+"@jest/transform@^28.1.1":
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.1.tgz#83541f2a3f612077c8501f49cc4e205d4e4a6b27"
+  integrity sha512-PkfaTUuvjUarl1EDr5ZQcCA++oXkFCP9QFUkG0yVKVmNObjhrqDy0kbMpMebfHWm3CCDHjYNem9eUSH8suVNHQ==
   dependencies:
     "@babel/core" "^7.11.6"
-    "@jest/types" "^28.1.0"
+    "@jest/types" "^28.1.1"
     "@jridgewell/trace-mapping" "^0.3.7"
     babel-plugin-istanbul "^6.1.1"
     chalk "^4.0.0"
     convert-source-map "^1.4.0"
     fast-json-stable-stringify "^2.0.0"
     graceful-fs "^4.2.9"
-    jest-haste-map "^28.1.0"
+    jest-haste-map "^28.1.1"
     jest-regex-util "^28.0.2"
-    jest-util "^28.1.0"
+    jest-util "^28.1.1"
     micromatch "^4.0.4"
     pirates "^4.0.4"
     slash "^3.0.0"
@@ -1473,10 +1479,10 @@
     "@types/yargs" "^16.0.0"
     chalk "^4.0.0"
 
-"@jest/types@^28.1.0":
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.0.tgz#508327a89976cbf9bd3e1cc74641a29fd7dfd519"
-  integrity sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA==
+"@jest/types@^28.1.1":
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.1.tgz#d059bbc80e6da6eda9f081f293299348bd78ee0b"
+  integrity sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==
   dependencies:
     "@jest/schemas" "^28.0.2"
     "@types/istanbul-lib-coverage" "^2.0.0"
@@ -2504,15 +2510,15 @@ axobject-query@^2.2.0:
   resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz"
   integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==
 
-babel-jest@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.0.tgz#95a67f8e2e7c0042e7b3ad3951b8af41a533b5ea"
-  integrity sha512-zNKk0yhDZ6QUwfxh9k07GII6siNGMJWVUU49gmFj5gfdqDKLqa2RArXOF2CODp4Dr7dLxN2cvAV+667dGJ4b4w==
+babel-jest@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.1.tgz#2a3a4ae50964695b2d694ccffe4bec537c5a3586"
+  integrity sha512-MEt0263viUdAkTq5D7upHPNxvt4n9uLUGa6pPz3WviNBMtOmStb1lIXS3QobnoqM+qnH+vr4EKlvhe8QcmxIYw==
   dependencies:
-    "@jest/transform" "^28.1.0"
+    "@jest/transform" "^28.1.1"
     "@types/babel__core" "^7.1.14"
     babel-plugin-istanbul "^6.1.1"
-    babel-preset-jest "^28.0.2"
+    babel-preset-jest "^28.1.1"
     chalk "^4.0.0"
     graceful-fs "^4.2.9"
     slash "^3.0.0"
@@ -2545,10 +2551,10 @@ babel-plugin-istanbul@^6.1.1:
     istanbul-lib-instrument "^5.0.4"
     test-exclude "^6.0.0"
 
-babel-plugin-jest-hoist@^28.0.2:
-  version "28.0.2"
-  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.0.2.tgz#9307d03a633be6fc4b1a6bc5c3a87e22bd01dd3b"
-  integrity sha512-Kizhn/ZL+68ZQHxSnHyuvJv8IchXD62KQxV77TBDV/xoBFBOfgRAk97GNs6hXdTTCiVES9nB2I6+7MXXrk5llQ==
+babel-plugin-jest-hoist@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.1.tgz#5e055cdcc47894f28341f87f5e35aad2df680b11"
+  integrity sha512-NovGCy5Hn25uMJSAU8FaHqzs13cFoOI4lhIujiepssjCKRsAo3TA734RDWSGxuFTsUJXerYOqQQodlxgmtqbzw==
   dependencies:
     "@babel/template" "^7.3.3"
     "@babel/types" "^7.3.3"
@@ -2654,12 +2660,12 @@ babel-preset-current-node-syntax@^1.0.0:
     "@babel/plugin-syntax-optional-chaining" "^7.8.3"
     "@babel/plugin-syntax-top-level-await" "^7.8.3"
 
-babel-preset-jest@^28.0.2:
-  version "28.0.2"
-  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.0.2.tgz#d8210fe4e46c1017e9fa13d7794b166e93aa9f89"
-  integrity sha512-sYzXIdgIXXroJTFeB3S6sNDWtlJ2dllCdTEsnZ65ACrMojj3hVNFRmnJ1HZtomGi+Be7aqpY/HJ92fr8OhKVkQ==
+babel-preset-jest@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.1.tgz#5b6e5e69f963eb2d70f739c607b8f723c0ee75e4"
+  integrity sha512-FCq9Oud0ReTeWtcneYf/48981aTfXYuB9gbU4rBNNJVBSQ6ssv7E6v/qvbBxtOWwZFXjLZwpg+W3q7J6vhH25g==
   dependencies:
-    babel-plugin-jest-hoist "^28.0.2"
+    babel-plugin-jest-hoist "^28.1.1"
     babel-preset-current-node-syntax "^1.0.0"
 
 balanced-match@^1.0.0:
@@ -2818,7 +2824,7 @@ braces@^2.3.1, braces@^2.3.2:
     split-string "^3.0.2"
     to-regex "^3.0.1"
 
-braces@^3.0.1, braces@^3.0.2, braces@~3.0.2:
+braces@^3.0.2, braces@~3.0.2:
   version "3.0.2"
   resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
   integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
@@ -3679,10 +3685,10 @@ css-font-weight-keywords@^1.0.0:
   resolved "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz"
   integrity sha1-m8BGcayFvHJLV07106yWsNYE/Zc=
 
-css-functions-list@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.0.1.tgz#1460df7fb584d1692c30b105151dbb988c8094f9"
-  integrity sha512-PriDuifDt4u4rkDgnqRCLnjfMatufLmWNfQnGCq34xZwpY3oabwhB9SqRBmuvWUgndbemCFlKqg+nO7C2q0SBw==
+css-functions-list@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.1.0.tgz#cf5b09f835ad91a00e5959bcfc627cd498e1321b"
+  integrity sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==
 
 css-global-keywords@^1.0.1:
   version "1.0.1"
@@ -4088,10 +4094,10 @@ diff-sequences@^25.2.6:
   resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz"
   integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==
 
-diff-sequences@^28.0.2:
-  version "28.0.2"
-  resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.0.2.tgz#40f8d4ffa081acbd8902ba35c798458d0ff1af41"
-  integrity sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ==
+diff-sequences@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6"
+  integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==
 
 diffie-hellman@^5.0.0:
   version "5.0.3"
@@ -4786,16 +4792,16 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2:
   dependencies:
     homedir-polyfill "^1.0.1"
 
-expect@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.0.tgz#10e8da64c0850eb8c39a480199f14537f46e8360"
-  integrity sha512-qFXKl8Pmxk8TBGfaFKRtcQjfXEnKAs+dmlxdwvukJZorwrAabT7M3h8oLOG01I2utEhkmUTi17CHaPBovZsKdw==
+expect@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.1.tgz#ca6fff65f6517cf7220c2e805a49c19aea30b420"
+  integrity sha512-/AANEwGL0tWBwzLNOvO0yUdy2D52jVdNXppOqswC49sxMN2cPWsGCQdzuIf9tj6hHoBQzNvx75JUYuQAckPo3w==
   dependencies:
-    "@jest/expect-utils" "^28.1.0"
+    "@jest/expect-utils" "^28.1.1"
     jest-get-type "^28.0.2"
-    jest-matcher-utils "^28.1.0"
-    jest-message-util "^28.1.0"
-    jest-util "^28.1.0"
+    jest-matcher-utils "^28.1.1"
+    jest-message-util "^28.1.1"
+    jest-util "^28.1.1"
 
 express@^4.17.1, express@^4.18.1:
   version "4.18.1"
@@ -5885,10 +5891,10 @@ interpret@^1.4.0:
   resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz"
   integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
 
-intersection-observer@^0.12.0:
-  version "0.12.0"
-  resolved "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.0.tgz"
-  integrity sha512-2Vkz8z46Dv401zTWudDGwO7KiGHNDkMv417T5ItcNYfmvHR/1qCTVBO9vwH8zZmQ0WkA/1ARwpysR9bsnop4NQ==
+intersection-observer@^0.12.0, intersection-observer@^0.12.2:
+  version "0.12.2"
+  resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375"
+  integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==
 
 intl-format-cache@^2.0.5:
   version "2.2.9"
@@ -6383,74 +6389,74 @@ jest-changed-files@^28.0.2:
     execa "^5.0.0"
     throat "^6.0.1"
 
-jest-circus@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.0.tgz#e229f590911bd54d60efaf076f7acd9360296dae"
-  integrity sha512-rNYfqfLC0L0zQKRKsg4n4J+W1A2fbyGH7Ss/kDIocp9KXD9iaL111glsLu7+Z7FHuZxwzInMDXq+N1ZIBkI/TQ==
+jest-circus@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.1.tgz#3d27da6a974d85a466dc0cdc6ddeb58daaa57bb4"
+  integrity sha512-75+BBVTsL4+p2w198DQpCeyh1RdaS2lhEG87HkaFX/UG0gJExVq2skG2pT7XZEGBubNj2CytcWSPan4QEPNosw==
   dependencies:
-    "@jest/environment" "^28.1.0"
-    "@jest/expect" "^28.1.0"
-    "@jest/test-result" "^28.1.0"
-    "@jest/types" "^28.1.0"
+    "@jest/environment" "^28.1.1"
+    "@jest/expect" "^28.1.1"
+    "@jest/test-result" "^28.1.1"
+    "@jest/types" "^28.1.1"
     "@types/node" "*"
     chalk "^4.0.0"
     co "^4.6.0"
     dedent "^0.7.0"
     is-generator-fn "^2.0.0"
-    jest-each "^28.1.0"
-    jest-matcher-utils "^28.1.0"
-    jest-message-util "^28.1.0"
-    jest-runtime "^28.1.0"
-    jest-snapshot "^28.1.0"
-    jest-util "^28.1.0"
-    pretty-format "^28.1.0"
+    jest-each "^28.1.1"
+    jest-matcher-utils "^28.1.1"
+    jest-message-util "^28.1.1"
+    jest-runtime "^28.1.1"
+    jest-snapshot "^28.1.1"
+    jest-util "^28.1.1"
+    pretty-format "^28.1.1"
     slash "^3.0.0"
     stack-utils "^2.0.3"
     throat "^6.0.1"
 
-jest-cli@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.0.tgz#cd1d8adb9630102d5ba04a22895f63decdd7ac1f"
-  integrity sha512-fDJRt6WPRriHrBsvvgb93OxgajHHsJbk4jZxiPqmZbMDRcHskfJBBfTyjFko0jjfprP544hOktdSi9HVgl4VUQ==
+jest-cli@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.1.tgz#23ddfde8940e1818585ae4a568877b33b0e51cfe"
+  integrity sha512-+sUfVbJqb1OjBZ0OdBbI6OWfYM1i7bSfzYy6gze1F1w3OKWq8ZTEKkZ8a7ZQPq6G/G1qMh/uKqpdWhgl11NFQQ==
   dependencies:
-    "@jest/core" "^28.1.0"
-    "@jest/test-result" "^28.1.0"
-    "@jest/types" "^28.1.0"
+    "@jest/core" "^28.1.1"
+    "@jest/test-result" "^28.1.1"
+    "@jest/types" "^28.1.1"
     chalk "^4.0.0"
     exit "^0.1.2"
     graceful-fs "^4.2.9"
     import-local "^3.0.2"
-    jest-config "^28.1.0"
-    jest-util "^28.1.0"
-    jest-validate "^28.1.0"
+    jest-config "^28.1.1"
+    jest-util "^28.1.1"
+    jest-validate "^28.1.1"
     prompts "^2.0.1"
     yargs "^17.3.1"
 
-jest-config@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.0.tgz#fca22ca0760e746fe1ce1f9406f6b307ab818501"
-  integrity sha512-aOV80E9LeWrmflp7hfZNn/zGA4QKv/xsn2w8QCBP0t0+YqObuCWTSgNbHJ0j9YsTuCO08ZR/wsvlxqqHX20iUA==
+jest-config@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.1.tgz#e90b97b984f14a6c24a221859e81b258990fce2f"
+  integrity sha512-tASynMhS+jVV85zKvjfbJ8nUyJS/jUSYZ5KQxLUN2ZCvcQc/OmhQl2j6VEL3ezQkNofxn5pQ3SPYWPHb0unTZA==
   dependencies:
     "@babel/core" "^7.11.6"
-    "@jest/test-sequencer" "^28.1.0"
-    "@jest/types" "^28.1.0"
-    babel-jest "^28.1.0"
+    "@jest/test-sequencer" "^28.1.1"
+    "@jest/types" "^28.1.1"
+    babel-jest "^28.1.1"
     chalk "^4.0.0"
     ci-info "^3.2.0"
     deepmerge "^4.2.2"
     glob "^7.1.3"
     graceful-fs "^4.2.9"
-    jest-circus "^28.1.0"
-    jest-environment-node "^28.1.0"
+    jest-circus "^28.1.1"
+    jest-environment-node "^28.1.1"
     jest-get-type "^28.0.2"
     jest-regex-util "^28.0.2"
-    jest-resolve "^28.1.0"
-    jest-runner "^28.1.0"
-    jest-util "^28.1.0"
-    jest-validate "^28.1.0"
+    jest-resolve "^28.1.1"
+    jest-runner "^28.1.1"
+    jest-util "^28.1.1"
+    jest-validate "^28.1.1"
     micromatch "^4.0.4"
     parse-json "^5.2.0"
-    pretty-format "^28.1.0"
+    pretty-format "^28.1.1"
     slash "^3.0.0"
     strip-json-comments "^3.1.1"
 
@@ -6464,59 +6470,59 @@ jest-diff@^25.2.1:
     jest-get-type "^25.2.6"
     pretty-format "^25.5.0"
 
-jest-diff@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.0.tgz#77686fef899ec1873dbfbf9330e37dd429703269"
-  integrity sha512-8eFd3U3OkIKRtlasXfiAQfbovgFgRDb0Ngcs2E+FMeBZ4rUezqIaGjuyggJBp+llosQXNEWofk/Sz4Hr5gMUhA==
+jest-diff@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.1.tgz#1a3eedfd81ae79810931c63a1d0f201b9120106c"
+  integrity sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg==
   dependencies:
     chalk "^4.0.0"
-    diff-sequences "^28.0.2"
+    diff-sequences "^28.1.1"
     jest-get-type "^28.0.2"
-    pretty-format "^28.1.0"
+    pretty-format "^28.1.1"
 
-jest-docblock@^28.0.2:
-  version "28.0.2"
-  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.0.2.tgz#3cab8abea53275c9d670cdca814fc89fba1298c2"
-  integrity sha512-FH10WWw5NxLoeSdQlJwu+MTiv60aXV/t8KEwIRGEv74WARE1cXIqh1vGdy2CraHuWOOrnzTWj/azQKqW4fO7xg==
+jest-docblock@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8"
+  integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==
   dependencies:
     detect-newline "^3.0.0"
 
-jest-each@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.0.tgz#54ae66d6a0a5b1913e9a87588d26c2687c39458b"
-  integrity sha512-a/XX02xF5NTspceMpHujmOexvJ4GftpYXqr6HhhmKmExtMXsyIN/fvanQlt/BcgFoRKN4OCXxLQKth9/n6OPFg==
+jest-each@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.1.tgz#ba5238dacf4f31d9fe23ddc2c44c01e7c23885c4"
+  integrity sha512-A042rqh17ZvEhRceDMi784ppoXR7MWGDEKTXEZXb4svt0eShMZvijGxzKsx+yIjeE8QYmHPrnHiTSQVhN4nqaw==
   dependencies:
-    "@jest/types" "^28.1.0"
+    "@jest/types" "^28.1.1"
     chalk "^4.0.0"
     jest-get-type "^28.0.2"
-    jest-util "^28.1.0"
-    pretty-format "^28.1.0"
+    jest-util "^28.1.1"
+    pretty-format "^28.1.1"
 
-jest-environment-jsdom@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-28.1.0.tgz#1042cffd0343615c5fac2d2c8da20d1d43b73ef8"
-  integrity sha512-8n6P4xiDjNVqTWv6W6vJPuQdLx+ZiA3dbYg7YJ+DPzR+9B61K6pMVJrSs2IxfGRG4J7pyAUA5shQ9G0KEun78w==
+jest-environment-jsdom@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-28.1.1.tgz#8bd721915b32f9b196723292c4461a0ad548b55b"
+  integrity sha512-41ZvgSoPNcKG5q3LuuOcAczdBxRq9DbZkPe24okN6ZCmiZdAfFtPg3z+lOtsT1fM6OAERApKT+3m0MRDQH2zIA==
   dependencies:
-    "@jest/environment" "^28.1.0"
-    "@jest/fake-timers" "^28.1.0"
-    "@jest/types" "^28.1.0"
+    "@jest/environment" "^28.1.1"
+    "@jest/fake-timers" "^28.1.1"
+    "@jest/types" "^28.1.1"
     "@types/jsdom" "^16.2.4"
     "@types/node" "*"
-    jest-mock "^28.1.0"
-    jest-util "^28.1.0"
+    jest-mock "^28.1.1"
+    jest-util "^28.1.1"
     jsdom "^19.0.0"
 
-jest-environment-node@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.0.tgz#6ed2150aa31babba0c488c5b4f4d813a585c68e6"
-  integrity sha512-gBLZNiyrPw9CSMlTXF1yJhaBgWDPVvH0Pq6bOEwGMXaYNzhzhw2kA/OijNF8egbCgDS0/veRv97249x2CX+udQ==
+jest-environment-node@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.1.tgz#1c86c59003a7d319fa06ea3b1bbda6c193715c67"
+  integrity sha512-2aV/eeY/WNgUUJrrkDJ3cFEigjC5fqT1+fCclrY6paqJ5zVPoM//sHmfgUUp7WLYxIdbPwMiVIzejpN56MxnNA==
   dependencies:
-    "@jest/environment" "^28.1.0"
-    "@jest/fake-timers" "^28.1.0"
-    "@jest/types" "^28.1.0"
+    "@jest/environment" "^28.1.1"
+    "@jest/fake-timers" "^28.1.1"
+    "@jest/types" "^28.1.1"
     "@types/node" "*"
-    jest-mock "^28.1.0"
-    jest-util "^28.1.0"
+    jest-mock "^28.1.1"
+    jest-util "^28.1.1"
 
 jest-get-type@^25.2.6:
   version "25.2.6"
@@ -6528,64 +6534,64 @@ jest-get-type@^28.0.2:
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203"
   integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==
 
-jest-haste-map@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.0.tgz#6c1ee2daf1c20a3e03dbd8e5b35c4d73d2349cf0"
-  integrity sha512-xyZ9sXV8PtKi6NCrJlmq53PyNVHzxmcfXNVvIRHpHmh1j/HChC4pwKgyjj7Z9us19JMw8PpQTJsFWOsIfT93Dw==
+jest-haste-map@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.1.tgz#471685f1acd365a9394745bb97c8fc16289adca3"
+  integrity sha512-ZrRSE2o3Ezh7sb1KmeLEZRZ4mgufbrMwolcFHNRSjKZhpLa8TdooXOOFlSwoUzlbVs1t0l7upVRW2K7RWGHzbQ==
   dependencies:
-    "@jest/types" "^28.1.0"
+    "@jest/types" "^28.1.1"
     "@types/graceful-fs" "^4.1.3"
     "@types/node" "*"
     anymatch "^3.0.3"
     fb-watchman "^2.0.0"
     graceful-fs "^4.2.9"
     jest-regex-util "^28.0.2"
-    jest-util "^28.1.0"
-    jest-worker "^28.1.0"
+    jest-util "^28.1.1"
+    jest-worker "^28.1.1"
     micromatch "^4.0.4"
-    walker "^1.0.7"
+    walker "^1.0.8"
   optionalDependencies:
     fsevents "^2.3.2"
 
-jest-leak-detector@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.0.tgz#b65167776a8787443214d6f3f54935a4c73c8a45"
-  integrity sha512-uIJDQbxwEL2AMMs2xjhZl2hw8s77c3wrPaQ9v6tXJLGaaQ+4QrNJH5vuw7hA7w/uGT/iJ42a83opAqxGHeyRIA==
+jest-leak-detector@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.1.tgz#537f37afd610a4b3f4cab15e06baf60484548efb"
+  integrity sha512-4jvs8V8kLbAaotE+wFR7vfUGf603cwYtFf1/PYEsyX2BAjSzj8hQSVTP6OWzseTl0xL6dyHuKs2JAks7Pfubmw==
   dependencies:
     jest-get-type "^28.0.2"
-    pretty-format "^28.1.0"
+    pretty-format "^28.1.1"
 
-jest-matcher-utils@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.0.tgz#2ae398806668eeabd293c61712227cb94b250ccf"
-  integrity sha512-onnax0n2uTLRQFKAjC7TuaxibrPSvZgKTcSCnNUz/tOjJ9UhxNm7ZmPpoQavmTDUjXvUQ8KesWk2/VdrxIFzTQ==
+jest-matcher-utils@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.1.tgz#a7c4653c2b782ec96796eb3088060720f1e29304"
+  integrity sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw==
   dependencies:
     chalk "^4.0.0"
-    jest-diff "^28.1.0"
+    jest-diff "^28.1.1"
     jest-get-type "^28.0.2"
-    pretty-format "^28.1.0"
+    pretty-format "^28.1.1"
 
-jest-message-util@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.0.tgz#7e8f0b9049e948e7b94c2a52731166774ba7d0af"
-  integrity sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw==
+jest-message-util@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.1.tgz#60aa0b475cfc08c8a9363ed2fb9108514dd9ab89"
+  integrity sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ==
   dependencies:
     "@babel/code-frame" "^7.12.13"
-    "@jest/types" "^28.1.0"
+    "@jest/types" "^28.1.1"
     "@types/stack-utils" "^2.0.0"
     chalk "^4.0.0"
     graceful-fs "^4.2.9"
     micromatch "^4.0.4"
-    pretty-format "^28.1.0"
+    pretty-format "^28.1.1"
     slash "^3.0.0"
     stack-utils "^2.0.3"
 
-jest-mock@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.0.tgz#ccc7cc12a9b330b3182db0c651edc90d163ff73e"
-  integrity sha512-H7BrhggNn77WhdL7O1apG0Q/iwl0Bdd5E1ydhCJzL3oBLh/UYxAwR3EJLsBZ9XA3ZU4PA3UNw4tQjduBTCTmLw==
+jest-mock@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.1.tgz#37903d269427fa1ef5b2447be874e1c62a39a371"
+  integrity sha512-bDCb0FjfsmKweAvE09dZT59IMkzgN0fYBH6t5S45NoJfd2DHkS3ySG2K+hucortryhO3fVuXdlxWcbtIuV/Skw==
   dependencies:
-    "@jest/types" "^28.1.0"
+    "@jest/types" "^28.1.1"
     "@types/node" "*"
 
 jest-pnp-resolver@^1.2.2:
@@ -6598,149 +6604,149 @@ jest-regex-util@^28.0.2:
   resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead"
   integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==
 
-jest-resolve-dependencies@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.0.tgz#167becb8bee6e20b5ef4a3a728ec67aef6b0b79b"
-  integrity sha512-Ue1VYoSZquPwEvng7Uefw8RmZR+me/1kr30H2jMINjGeHgeO/JgrR6wxj2ofkJ7KSAA11W3cOrhNCbj5Dqqd9g==
+jest-resolve-dependencies@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.1.tgz#3dffaaa56f4b41bc6b61053899d1756401763a27"
+  integrity sha512-p8Y150xYJth4EXhOuB8FzmS9r8IGLEioiaetgdNGb9VHka4fl0zqWlVe4v7mSkYOuEUg2uB61iE+zySDgrOmgQ==
   dependencies:
     jest-regex-util "^28.0.2"
-    jest-snapshot "^28.1.0"
+    jest-snapshot "^28.1.1"
 
-jest-resolve@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.0.tgz#b1f32748a6cee7d1779c7ef639c0a87078de3d35"
-  integrity sha512-vvfN7+tPNnnhDvISuzD1P+CRVP8cK0FHXRwPAcdDaQv4zgvwvag2n55/h5VjYcM5UJG7L4TwE5tZlzcI0X2Lhw==
+jest-resolve@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.1.tgz#bc2eaf384abdcc1aaf3ba7c50d1adf01e59095e5"
+  integrity sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA==
   dependencies:
     chalk "^4.0.0"
     graceful-fs "^4.2.9"
-    jest-haste-map "^28.1.0"
+    jest-haste-map "^28.1.1"
     jest-pnp-resolver "^1.2.2"
-    jest-util "^28.1.0"
-    jest-validate "^28.1.0"
+    jest-util "^28.1.1"
+    jest-validate "^28.1.1"
     resolve "^1.20.0"
     resolve.exports "^1.1.0"
     slash "^3.0.0"
 
-jest-runner@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.0.tgz#aefe2a1e618a69baa0b24a50edc54fdd7e728eaa"
-  integrity sha512-FBpmuh1HB2dsLklAlRdOxNTTHKFR6G1Qmd80pVDvwbZXTriqjWqjei5DKFC1UlM732KjYcE6yuCdiF0WUCOS2w==
+jest-runner@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.1.tgz#9ecdb3f27a00059986797aa6b012ba8306aa436c"
+  integrity sha512-W5oFUiDBgTsCloTAj6q95wEvYDB0pxIhY6bc5F26OucnwBN+K58xGTGbliSMI4ChQal5eANDF+xvELaYkJxTmA==
   dependencies:
-    "@jest/console" "^28.1.0"
-    "@jest/environment" "^28.1.0"
-    "@jest/test-result" "^28.1.0"
-    "@jest/transform" "^28.1.0"
-    "@jest/types" "^28.1.0"
+    "@jest/console" "^28.1.1"
+    "@jest/environment" "^28.1.1"
+    "@jest/test-result" "^28.1.1"
+    "@jest/transform" "^28.1.1"
+    "@jest/types" "^28.1.1"
     "@types/node" "*"
     chalk "^4.0.0"
     emittery "^0.10.2"
     graceful-fs "^4.2.9"
-    jest-docblock "^28.0.2"
-    jest-environment-node "^28.1.0"
-    jest-haste-map "^28.1.0"
-    jest-leak-detector "^28.1.0"
-    jest-message-util "^28.1.0"
-    jest-resolve "^28.1.0"
-    jest-runtime "^28.1.0"
-    jest-util "^28.1.0"
-    jest-watcher "^28.1.0"
-    jest-worker "^28.1.0"
+    jest-docblock "^28.1.1"
+    jest-environment-node "^28.1.1"
+    jest-haste-map "^28.1.1"
+    jest-leak-detector "^28.1.1"
+    jest-message-util "^28.1.1"
+    jest-resolve "^28.1.1"
+    jest-runtime "^28.1.1"
+    jest-util "^28.1.1"
+    jest-watcher "^28.1.1"
+    jest-worker "^28.1.1"
     source-map-support "0.5.13"
     throat "^6.0.1"
 
-jest-runtime@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.0.tgz#4847dcb2a4eb4b0f9eaf41306897e51fb1665631"
-  integrity sha512-wNYDiwhdH/TV3agaIyVF0lsJ33MhyujOe+lNTUiolqKt8pchy1Hq4+tDMGbtD5P/oNLA3zYrpx73T9dMTOCAcg==
+jest-runtime@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.1.tgz#569e1dc3c36c6c4c0b29516c1c49b6ad580abdaf"
+  integrity sha512-J89qEJWW0leOsqyi0D9zHpFEYHwwafFdS9xgvhFHtIdRghbadodI0eA+DrthK/1PebBv3Px8mFSMGKrtaVnleg==
   dependencies:
-    "@jest/environment" "^28.1.0"
-    "@jest/fake-timers" "^28.1.0"
-    "@jest/globals" "^28.1.0"
+    "@jest/environment" "^28.1.1"
+    "@jest/fake-timers" "^28.1.1"
+    "@jest/globals" "^28.1.1"
     "@jest/source-map" "^28.0.2"
-    "@jest/test-result" "^28.1.0"
-    "@jest/transform" "^28.1.0"
-    "@jest/types" "^28.1.0"
+    "@jest/test-result" "^28.1.1"
+    "@jest/transform" "^28.1.1"
+    "@jest/types" "^28.1.1"
     chalk "^4.0.0"
     cjs-module-lexer "^1.0.0"
     collect-v8-coverage "^1.0.0"
     execa "^5.0.0"
     glob "^7.1.3"
     graceful-fs "^4.2.9"
-    jest-haste-map "^28.1.0"
-    jest-message-util "^28.1.0"
-    jest-mock "^28.1.0"
+    jest-haste-map "^28.1.1"
+    jest-message-util "^28.1.1"
+    jest-mock "^28.1.1"
     jest-regex-util "^28.0.2"
-    jest-resolve "^28.1.0"
-    jest-snapshot "^28.1.0"
-    jest-util "^28.1.0"
+    jest-resolve "^28.1.1"
+    jest-snapshot "^28.1.1"
+    jest-util "^28.1.1"
     slash "^3.0.0"
     strip-bom "^4.0.0"
 
-jest-snapshot@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.0.tgz#4b74fa8816707dd10fe9d551c2c258e5a67b53b6"
-  integrity sha512-ex49M2ZrZsUyQLpLGxQtDbahvgBjlLPgklkqGM0hq/F7W/f8DyqZxVHjdy19QKBm4O93eDp+H5S23EiTbbUmHw==
+jest-snapshot@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.1.tgz#ab825c16c8d8b5e883bd57eee6ca8748c42ab848"
+  integrity sha512-1KjqHJ98adRcbIdMizjF5DipwZFbvxym/kFO4g4fVZCZRxH/dqV8TiBFCa6rqic3p0karsy8RWS1y4E07b7P0A==
   dependencies:
     "@babel/core" "^7.11.6"
     "@babel/generator" "^7.7.2"
     "@babel/plugin-syntax-typescript" "^7.7.2"
     "@babel/traverse" "^7.7.2"
     "@babel/types" "^7.3.3"
-    "@jest/expect-utils" "^28.1.0"
-    "@jest/transform" "^28.1.0"
-    "@jest/types" "^28.1.0"
+    "@jest/expect-utils" "^28.1.1"
+    "@jest/transform" "^28.1.1"
+    "@jest/types" "^28.1.1"
     "@types/babel__traverse" "^7.0.6"
     "@types/prettier" "^2.1.5"
     babel-preset-current-node-syntax "^1.0.0"
     chalk "^4.0.0"
-    expect "^28.1.0"
+    expect "^28.1.1"
     graceful-fs "^4.2.9"
-    jest-diff "^28.1.0"
+    jest-diff "^28.1.1"
     jest-get-type "^28.0.2"
-    jest-haste-map "^28.1.0"
-    jest-matcher-utils "^28.1.0"
-    jest-message-util "^28.1.0"
-    jest-util "^28.1.0"
+    jest-haste-map "^28.1.1"
+    jest-matcher-utils "^28.1.1"
+    jest-message-util "^28.1.1"
+    jest-util "^28.1.1"
     natural-compare "^1.4.0"
-    pretty-format "^28.1.0"
+    pretty-format "^28.1.1"
     semver "^7.3.5"
 
-jest-util@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.0.tgz#d54eb83ad77e1dd441408738c5a5043642823be5"
-  integrity sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA==
+jest-util@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.1.tgz#ff39e436a1aca397c0ab998db5a51ae2b7080d05"
+  integrity sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==
   dependencies:
-    "@jest/types" "^28.1.0"
+    "@jest/types" "^28.1.1"
     "@types/node" "*"
     chalk "^4.0.0"
     ci-info "^3.2.0"
     graceful-fs "^4.2.9"
     picomatch "^2.2.3"
 
-jest-validate@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.0.tgz#8a6821f48432aba9f830c26e28226ad77b9a0e18"
-  integrity sha512-Lly7CJYih3vQBfjLeANGgBSBJ7pEa18cxpQfQEq2go2xyEzehnHfQTjoUia8xUv4x4J80XKFIDwJJThXtRFQXQ==
+jest-validate@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.1.tgz#59b7b339b3c85b5144bd0c06ad3600f503a4acc8"
+  integrity sha512-Kpf6gcClqFCIZ4ti5++XemYJWUPCFUW+N2gknn+KgnDf549iLul3cBuKVe1YcWRlaF8tZV8eJCap0eECOEE3Ug==
   dependencies:
-    "@jest/types" "^28.1.0"
+    "@jest/types" "^28.1.1"
     camelcase "^6.2.0"
     chalk "^4.0.0"
     jest-get-type "^28.0.2"
     leven "^3.1.0"
-    pretty-format "^28.1.0"
+    pretty-format "^28.1.1"
 
-jest-watcher@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.0.tgz#aaa7b4164a4e77eeb5f7d7b25ede5e7b4e9c9aaf"
-  integrity sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA==
+jest-watcher@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.1.tgz#533597fb3bfefd52b5cd115cd916cffd237fb60c"
+  integrity sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug==
   dependencies:
-    "@jest/test-result" "^28.1.0"
-    "@jest/types" "^28.1.0"
+    "@jest/test-result" "^28.1.1"
+    "@jest/types" "^28.1.1"
     "@types/node" "*"
     ansi-escapes "^4.2.1"
     chalk "^4.0.0"
     emittery "^0.10.2"
-    jest-util "^28.1.0"
+    jest-util "^28.1.1"
     string-length "^4.0.1"
 
 jest-worker@^26.5.0:
@@ -6752,23 +6758,24 @@ jest-worker@^26.5.0:
     merge-stream "^2.0.0"
     supports-color "^7.0.0"
 
-jest-worker@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.0.tgz#ced54757a035e87591e1208253a6e3aac1a855e5"
-  integrity sha512-ZHwM6mNwaWBR52Snff8ZvsCTqQsvhCxP/bT1I6T6DAnb6ygkshsyLQIMxFwHpYxht0HOoqt23JlC01viI7T03A==
+jest-worker@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.1.tgz#3480c73247171dfd01eda77200f0063ab6a3bf28"
+  integrity sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==
   dependencies:
     "@types/node" "*"
     merge-stream "^2.0.0"
     supports-color "^8.0.0"
 
-jest@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.0.tgz#f420e41c8f2395b9a30445a97189ebb57593d831"
-  integrity sha512-TZR+tHxopPhzw3c3560IJXZWLNHgpcz1Zh0w5A65vynLGNcg/5pZ+VildAd7+XGOu6jd58XMY/HNn0IkZIXVXg==
+jest@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.1.tgz#3c39a3a09791e16e9ef283597d24ab19a0df701e"
+  integrity sha512-qw9YHBnjt6TCbIDMPMpJZqf9E12rh6869iZaN08/vpOGgHJSAaLLUn6H8W3IAEuy34Ls3rct064mZLETkxJ2XA==
   dependencies:
-    "@jest/core" "^28.1.0"
+    "@jest/core" "^28.1.1"
+    "@jest/types" "^28.1.1"
     import-local "^3.0.2"
-    jest-cli "^28.1.0"
+    jest-cli "^28.1.1"
 
 jpeg-autorotate@^7.1.1:
   version "7.1.1"
@@ -7172,7 +7179,7 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0:
 
 makeerror@1.0.12:
   version "1.0.12"
-  resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz"
+  resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"
   integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==
   dependencies:
     tmpl "1.0.5"
@@ -7316,15 +7323,7 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
     snapdragon "^0.8.1"
     to-regex "^3.0.2"
 
-micromatch@^4.0.4:
-  version "4.0.4"
-  resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz"
-  integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
-  dependencies:
-    braces "^3.0.1"
-    picomatch "^2.2.3"
-
-micromatch@^4.0.5:
+micromatch@^4.0.4, micromatch@^4.0.5:
   version "4.0.5"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
   integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
@@ -7570,11 +7569,6 @@ nan@^2.12.1:
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee"
   integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==
 
-nanoid@^3.1.30:
-  version "3.2.0"
-  resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz"
-  integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==
-
 nanoid@^3.3.4:
   version "3.3.4"
   resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
@@ -8663,7 +8657,7 @@ postcss-selector-parser@^3.0.0:
     indexes-of "^1.0.1"
     uniq "^1.0.1"
 
-postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.6:
+postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.6:
   version "6.0.10"
   resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d"
   integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
@@ -8671,23 +8665,6 @@ postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.6:
     cssesc "^3.0.0"
     util-deprecate "^1.0.2"
 
-postcss-selector-parser@^6.0.2:
-  version "6.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
-  integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==
-  dependencies:
-    cssesc "^3.0.0"
-    indexes-of "^1.0.1"
-    uniq "^1.0.1"
-
-postcss-selector-parser@^6.0.4:
-  version "6.0.9"
-  resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz"
-  integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==
-  dependencies:
-    cssesc "^3.0.0"
-    util-deprecate "^1.0.2"
-
 postcss-svgo@^4.0.3:
   version "4.0.3"
   resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz"
@@ -8734,16 +8711,7 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.27, postcss@^7.0.32:
     picocolors "^0.2.1"
     source-map "^0.6.1"
 
-postcss@^8.2.15:
-  version "8.4.5"
-  resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz"
-  integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==
-  dependencies:
-    nanoid "^3.1.30"
-    picocolors "^1.0.0"
-    source-map-js "^1.0.1"
-
-postcss@^8.4.14:
+postcss@^8.2.15, postcss@^8.4.14:
   version "8.4.14"
   resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf"
   integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==
@@ -8784,10 +8752,10 @@ prelude-ls@~1.1.2:
   resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz"
   integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
 
-prettier@^2.6.2:
-  version "2.6.2"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032"
-  integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==
+prettier@^2.7.1:
+  version "2.7.1"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64"
+  integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==
 
 pretty-format@^25.2.1, pretty-format@^25.5.0:
   version "25.5.0"
@@ -8809,10 +8777,10 @@ pretty-format@^27.0.2:
     ansi-styles "^5.0.0"
     react-is "^17.0.1"
 
-pretty-format@^28.1.0:
-  version "28.1.0"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.0.tgz#8f5836c6a0dfdb834730577ec18029052191af55"
-  integrity sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q==
+pretty-format@^28.1.1:
+  version "28.1.1"
+  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.1.tgz#f731530394e0f7fcd95aba6b43c50e02d86b95cb"
+  integrity sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==
   dependencies:
     "@jest/schemas" "^28.0.2"
     ansi-regex "^5.0.1"
@@ -9578,10 +9546,10 @@ requires-port@^1.0.0:
   resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz"
   integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
 
-reselect@^4.1.5:
-  version "4.1.5"
-  resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.5.tgz"
-  integrity sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ==
+reselect@^4.1.6:
+  version "4.1.6"
+  resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.6.tgz#19ca2d3d0b35373a74dc1c98692cdaffb6602656"
+  integrity sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ==
 
 resolve-cwd@^2.0.0:
   version "2.0.0"
@@ -9746,10 +9714,10 @@ sass-loader@^10.2.0:
     schema-utils "^3.0.0"
     semver "^7.3.2"
 
-sass@^1.52.1:
-  version "1.52.1"
-  resolved "https://registry.yarnpkg.com/sass/-/sass-1.52.1.tgz#554693da808543031f9423911d62c60a1acf7889"
-  integrity sha512-fSzYTbr7z8oQnVJ3Acp9hV80dM1fkMN7mSD/25mpcct9F7FPBMOI8krEYALgU1aZoqGhQNhTPsuSmxjnIvAm4Q==
+sass@^1.52.3:
+  version "1.52.3"
+  resolved "https://registry.yarnpkg.com/sass/-/sass-1.52.3.tgz#b7cc7ffea2341ccc9a0c4fd372bf1b3f9be1b6cb"
+  integrity sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==
   dependencies:
     chokidar ">=3.0.0 <4.0.0"
     immutable "^4.0.0"
@@ -9837,14 +9805,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
   resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
-semver@^7.2.1, semver@^7.3.2, semver@^7.3.5:
-  version "7.3.5"
-  resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz"
-  integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
-  dependencies:
-    lru-cache "^6.0.0"
-
-semver@^7.3.4:
+semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5:
   version "7.3.7"
   resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
   integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
@@ -10096,7 +10057,7 @@ source-list-map@^2.0.0:
   resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz"
   integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
 
-"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2:
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
   version "1.0.2"
   resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
   integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
@@ -10218,11 +10179,6 @@ spdy@^4.0.2:
     select-hose "^2.0.0"
     spdy-transport "^3.0.0"
 
-specificity@^0.4.1:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019"
-  integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==
-
 split-string@^3.0.1, split-string@^3.0.2:
   version "3.1.0"
   resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz"
@@ -10536,15 +10492,16 @@ stylelint-scss@^4.0.0:
     postcss-selector-parser "^6.0.6"
     postcss-value-parser "^4.1.0"
 
-stylelint@^14.8.5:
-  version "14.8.5"
-  resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.8.5.tgz#0fcbf5b6821283b5a249dde36d70f1158da0a2a3"
-  integrity sha512-e3t4H/hlWlspkcNUrkhf44RU3OpPTA7uBOoREGBzSwdEF+2g/+gbZq7WEpMP7BpopcSe/uLaTvDuL+URL7cdnQ==
+stylelint@^14.9.1:
+  version "14.9.1"
+  resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.9.1.tgz#6494ed38f148b1e75b402d678a3b6a8aae86dfda"
+  integrity sha512-RdAkJdPiLqHawCSnu21nE27MjNXaVd4WcOHA4vK5GtIGjScfhNnaOuWR2wWdfKFAvcWQPOYe311iveiVKSmwsA==
   dependencies:
+    "@csstools/selector-specificity" "^2.0.1"
     balanced-match "^2.0.0"
     colord "^2.9.2"
     cosmiconfig "^7.0.1"
-    css-functions-list "^3.0.1"
+    css-functions-list "^3.1.0"
     debug "^4.3.4"
     execall "^2.0.0"
     fast-glob "^3.2.11"
@@ -10572,7 +10529,6 @@ stylelint@^14.8.5:
     postcss-selector-parser "^6.0.10"
     postcss-value-parser "^4.2.0"
     resolve-from "^5.0.0"
-    specificity "^0.4.1"
     string-width "^4.2.3"
     strip-ansi "^6.0.1"
     style-search "^0.1.0"
@@ -11293,9 +11249,9 @@ w3c-xmlserializer@^3.0.0:
   dependencies:
     xml-name-validator "^4.0.0"
 
-walker@^1.0.7:
+walker@^1.0.8:
   version "1.0.8"
-  resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz"
+  resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
   integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==
   dependencies:
     makeerror "1.0.12"
@@ -11579,10 +11535,10 @@ which@^2.0.1:
   dependencies:
     isexe "^2.0.0"
 
-wicg-inert@^3.1.1:
-  version "3.1.1"
-  resolved "https://registry.npmjs.org/wicg-inert/-/wicg-inert-3.1.1.tgz"
-  integrity sha512-PhBaNh8ur9Xm4Ggy4umelwNIP6pPP1bv3EaWaKqfb/QNme2rdLjm7wIInvV4WhxVHhzA4Spgw9qNSqWtB/ca2A==
+wicg-inert@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/wicg-inert/-/wicg-inert-3.1.2.tgz#df10cf756b773a96fce107c3ddcd43be5d1e3944"
+  integrity sha512-Ba9tGNYxXwaqKEi9sJJvPMKuo063umUPsHN0JJsjrs2j8KDSzkWLMZGZ+MH1Jf1Fq4OWZ5HsESJID6nRza2ang==
 
 wide-align@^1.1.5:
   version "1.1.5"
@@ -11651,10 +11607,10 @@ ws@^7.3.1:
   resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
   integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
 
-ws@^8.2.3, ws@^8.6.0:
-  version "8.6.0"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-8.6.0.tgz#e5e9f1d9e7ff88083d0c0dd8281ea662a42c9c23"
-  integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==
+ws@^8.2.3, ws@^8.8.0:
+  version "8.8.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.0.tgz#8e71c75e2f6348dbf8d78005107297056cb77769"
+  integrity sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==
 
 xml-name-validator@^4.0.0:
   version "4.0.0"