about summary refs log tree commit diff
diff options
context:
space:
mode:
authorStarfall <root@starfall.blue>2020-02-04 17:44:29 -0600
committerStarfall <root@starfall.blue>2020-02-04 17:44:29 -0600
commit6d24d3bcb84abd04f31da95f97f6d60ef0afdc00 (patch)
treee7c38251a9e92bdf3a464b4aa7f1880aa5139bf0
parentc0c9529df269816f52915a9802e5e30fbce9576b (diff)
parent885e9227c6e8e1ce5e4a5625d5126ba76dce2c00 (diff)
Merge branch 'glitch'
-rw-r--r--.circleci/config.yml89
-rw-r--r--.env.production.sample10
-rw-r--r--.nvmrc2
-rw-r--r--CHANGELOG.md156
-rw-r--r--Dockerfile6
-rw-r--r--Gemfile44
-rw-r--r--Gemfile.lock222
-rw-r--r--Vagrantfile2
-rw-r--r--app/controllers/admin/accounts_controller.rb16
-rw-r--r--app/controllers/admin/announcements_controller.rb88
-rw-r--r--app/controllers/admin/custom_emojis_controller.rb6
-rw-r--r--app/controllers/admin/followers_controller.rb18
-rw-r--r--app/controllers/admin/instances_controller.rb2
-rw-r--r--app/controllers/admin/invites_controller.rb2
-rw-r--r--app/controllers/admin/relationships_controller.rb25
-rw-r--r--app/controllers/admin/reports_controller.rb7
-rw-r--r--app/controllers/admin/tags_controller.rb2
-rw-r--r--app/controllers/api/base_controller.rb2
-rw-r--r--app/controllers/api/oembed_controller.rb14
-rw-r--r--app/controllers/api/v1/accounts/follower_accounts_controller.rb6
-rw-r--r--app/controllers/api/v1/accounts/following_accounts_controller.rb6
-rw-r--r--app/controllers/api/v1/announcements/reactions_controller.rb29
-rw-r--r--app/controllers/api/v1/announcements_controller.rb29
-rw-r--r--app/controllers/api/v1/media_controller.rb3
-rw-r--r--app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb4
-rw-r--r--app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb4
-rw-r--r--app/controllers/application_controller.rb10
-rw-r--r--app/controllers/auth/passwords_controller.rb6
-rw-r--r--app/controllers/auth/registrations_controller.rb12
-rw-r--r--app/controllers/concerns/obfuscate_filename.rb16
-rw-r--r--app/controllers/filters_controller.rb3
-rw-r--r--app/controllers/follower_accounts_controller.rb7
-rw-r--r--app/controllers/following_accounts_controller.rb7
-rw-r--r--app/controllers/oauth/authorizations_controller.rb5
-rw-r--r--app/controllers/relationships_controller.rb48
-rw-r--r--app/controllers/settings/base_controller.rb5
-rw-r--r--app/controllers/settings/profiles_controller.rb5
-rw-r--r--app/controllers/statuses_controller.rb4
-rw-r--r--app/controllers/well_known/host_meta_controller.rb6
-rw-r--r--app/helpers/accounts_helper.rb4
-rw-r--r--app/helpers/admin/action_logs_helper.rb8
-rw-r--r--app/helpers/admin/announcements_helper.rb11
-rw-r--r--app/helpers/admin/filter_helper.rb19
-rw-r--r--app/helpers/routing_helper.rb4
-rw-r--r--app/helpers/settings_helper.rb2
-rw-r--r--app/javascript/flavours/glitch/actions/announcements.js180
-rw-r--r--app/javascript/flavours/glitch/actions/compose.js2
-rw-r--r--app/javascript/flavours/glitch/actions/importer/normalizer.js10
-rw-r--r--app/javascript/flavours/glitch/actions/markers.js46
-rw-r--r--app/javascript/flavours/glitch/actions/notifications.js3
-rw-r--r--app/javascript/flavours/glitch/actions/streaming.js19
-rw-r--r--app/javascript/flavours/glitch/actions/timelines.js2
-rw-r--r--app/javascript/flavours/glitch/components/animated_number.js65
-rw-r--r--app/javascript/flavours/glitch/components/column_header.js60
-rw-r--r--app/javascript/flavours/glitch/components/dropdown_menu.js8
-rw-r--r--app/javascript/flavours/glitch/components/media_gallery.js16
-rw-r--r--app/javascript/flavours/glitch/components/relative_timestamp.js16
-rw-r--r--app/javascript/flavours/glitch/components/status_content.js20
-rw-r--r--app/javascript/flavours/glitch/features/account_timeline/index.js1
-rw-r--r--app/javascript/flavours/glitch/features/directory/components/account_card.js1
-rw-r--r--app/javascript/flavours/glitch/features/emoji_picker/index.js7
-rw-r--r--app/javascript/flavours/glitch/features/getting_started/components/announcements.js436
-rw-r--r--app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js20
-rw-r--r--app/javascript/flavours/glitch/features/getting_started/containers/trends_container.js2
-rw-r--r--app/javascript/flavours/glitch/features/home_timeline/index.js38
-rw-r--r--app/javascript/flavours/glitch/features/local_settings/page/index.js8
-rw-r--r--app/javascript/flavours/glitch/features/notifications/index.js55
-rw-r--r--app/javascript/flavours/glitch/features/status/components/action_bar.js3
-rw-r--r--app/javascript/flavours/glitch/features/status/components/detailed_status.js11
-rw-r--r--app/javascript/flavours/glitch/features/status/index.js2
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/media_modal.js1
-rw-r--r--app/javascript/flavours/glitch/features/ui/index.js3
-rw-r--r--app/javascript/flavours/glitch/locales/ast.js7
-rw-r--r--app/javascript/flavours/glitch/locales/bn.js7
-rw-r--r--app/javascript/flavours/glitch/locales/br.js7
-rw-r--r--app/javascript/flavours/glitch/locales/co.js7
-rw-r--r--app/javascript/flavours/glitch/locales/cs.js7
-rw-r--r--app/javascript/flavours/glitch/locales/cy.js7
-rw-r--r--app/javascript/flavours/glitch/locales/da.js7
-rw-r--r--app/javascript/flavours/glitch/locales/el.js7
-rw-r--r--app/javascript/flavours/glitch/locales/es-AR.js7
-rw-r--r--app/javascript/flavours/glitch/locales/et.js7
-rw-r--r--app/javascript/flavours/glitch/locales/eu.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ga.js7
-rw-r--r--app/javascript/flavours/glitch/locales/gl.js7
-rw-r--r--app/javascript/flavours/glitch/locales/hi.js7
-rw-r--r--app/javascript/flavours/glitch/locales/hy.js7
-rw-r--r--app/javascript/flavours/glitch/locales/is.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ka.js7
-rw-r--r--app/javascript/flavours/glitch/locales/kab.js7
-rw-r--r--app/javascript/flavours/glitch/locales/kk.js7
-rw-r--r--app/javascript/flavours/glitch/locales/kn.js7
-rw-r--r--app/javascript/flavours/glitch/locales/lt.js7
-rw-r--r--app/javascript/flavours/glitch/locales/lv.js7
-rw-r--r--app/javascript/flavours/glitch/locales/mk.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ml.js7
-rw-r--r--app/javascript/flavours/glitch/locales/mr.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ms.js7
-rw-r--r--app/javascript/flavours/glitch/locales/nn.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ro.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sk.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sl.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sq.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sr-Latn.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sr.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ta.js7
-rw-r--r--app/javascript/flavours/glitch/locales/te.js7
-rw-r--r--app/javascript/flavours/glitch/locales/ur.js7
-rw-r--r--app/javascript/flavours/glitch/locales/vi.js7
-rw-r--r--app/javascript/flavours/glitch/packs/public.js9
-rw-r--r--app/javascript/flavours/glitch/reducers/announcements.js102
-rw-r--r--app/javascript/flavours/glitch/reducers/compose.js2
-rw-r--r--app/javascript/flavours/glitch/reducers/index.js2
-rw-r--r--app/javascript/flavours/glitch/reducers/local_settings.js1
-rw-r--r--app/javascript/flavours/glitch/reducers/notifications.js19
-rw-r--r--app/javascript/flavours/glitch/reducers/statuses.js3
-rw-r--r--app/javascript/flavours/glitch/selectors/index.js1
-rw-r--r--app/javascript/flavours/glitch/styles/admin.scss58
-rw-r--r--app/javascript/flavours/glitch/styles/components/accounts.scss4
-rw-r--r--app/javascript/flavours/glitch/styles/components/announcements.scss225
-rw-r--r--app/javascript/flavours/glitch/styles/components/columns.scss14
-rw-r--r--app/javascript/flavours/glitch/styles/components/composer.scss22
-rw-r--r--app/javascript/flavours/glitch/styles/components/drawer.scss2
-rw-r--r--app/javascript/flavours/glitch/styles/components/index.scss9
-rw-r--r--app/javascript/flavours/glitch/styles/components/status.scss1
-rw-r--r--app/javascript/flavours/glitch/styles/forms.scss6
-rw-r--r--app/javascript/flavours/glitch/styles/polls.scss1
-rw-r--r--app/javascript/flavours/glitch/styles/statuses.scss17
-rw-r--r--app/javascript/flavours/glitch/util/numbers.js8
-rw-r--r--app/javascript/flavours/glitch/util/stream.js55
-rw-r--r--app/javascript/images/elephant_ui_plane.svg2
-rw-r--r--app/javascript/mastodon/actions/announcements.js180
-rw-r--r--app/javascript/mastodon/actions/importer/normalizer.js10
-rw-r--r--app/javascript/mastodon/actions/notifications.js3
-rw-r--r--app/javascript/mastodon/actions/statuses.js13
-rw-r--r--app/javascript/mastodon/actions/streaming.js19
-rw-r--r--app/javascript/mastodon/actions/timelines.js2
-rw-r--r--app/javascript/mastodon/components/animated_number.js65
-rw-r--r--app/javascript/mastodon/components/column_header.js5
-rw-r--r--app/javascript/mastodon/components/error_boundary.js2
-rw-r--r--app/javascript/mastodon/components/media_gallery.js16
-rw-r--r--app/javascript/mastodon/components/relative_timestamp.js16
-rw-r--r--app/javascript/mastodon/components/scrollable_list.js9
-rw-r--r--app/javascript/mastodon/components/status.js48
-rw-r--r--app/javascript/mastodon/components/status_content.js25
-rw-r--r--app/javascript/mastodon/containers/status_container.js5
-rw-r--r--app/javascript/mastodon/features/account_timeline/index.js1
-rw-r--r--app/javascript/mastodon/features/audio/index.js35
-rw-r--r--app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js7
-rw-r--r--app/javascript/mastodon/features/directory/components/account_card.js1
-rw-r--r--app/javascript/mastodon/features/getting_started/components/announcements.js436
-rw-r--r--app/javascript/mastodon/features/getting_started/containers/announcements_container.js20
-rw-r--r--app/javascript/mastodon/features/getting_started/containers/trends_container.js2
-rw-r--r--app/javascript/mastodon/features/home_timeline/index.js38
-rw-r--r--app/javascript/mastodon/features/status/components/action_bar.js3
-rw-r--r--app/javascript/mastodon/features/status/components/detailed_status.js11
-rw-r--r--app/javascript/mastodon/features/status/index.js2
-rw-r--r--app/javascript/mastodon/features/ui/components/media_modal.js1
-rw-r--r--app/javascript/mastodon/features/video/index.js50
-rw-r--r--app/javascript/mastodon/locales/ar.json28
-rw-r--r--app/javascript/mastodon/locales/ast.json170
-rw-r--r--app/javascript/mastodon/locales/bg.json16
-rw-r--r--app/javascript/mastodon/locales/bn.json70
-rw-r--r--app/javascript/mastodon/locales/br.json98
-rw-r--r--app/javascript/mastodon/locales/ca.json120
-rw-r--r--app/javascript/mastodon/locales/co.json16
-rw-r--r--app/javascript/mastodon/locales/cs.json230
-rw-r--r--app/javascript/mastodon/locales/cy.json16
-rw-r--r--app/javascript/mastodon/locales/da.json16
-rw-r--r--app/javascript/mastodon/locales/de.json20
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json53
-rw-r--r--app/javascript/mastodon/locales/el.json20
-rw-r--r--app/javascript/mastodon/locales/en.json7
-rw-r--r--app/javascript/mastodon/locales/eo.json18
-rw-r--r--app/javascript/mastodon/locales/es-AR.json18
-rw-r--r--app/javascript/mastodon/locales/es.json18
-rw-r--r--app/javascript/mastodon/locales/et.json100
-rw-r--r--app/javascript/mastodon/locales/eu.json26
-rw-r--r--app/javascript/mastodon/locales/fa.json370
-rw-r--r--app/javascript/mastodon/locales/fi.json16
-rw-r--r--app/javascript/mastodon/locales/fr.json26
-rw-r--r--app/javascript/mastodon/locales/ga.json16
-rw-r--r--app/javascript/mastodon/locales/gl.json534
-rw-r--r--app/javascript/mastodon/locales/he.json16
-rw-r--r--app/javascript/mastodon/locales/hi.json16
-rw-r--r--app/javascript/mastodon/locales/hr.json16
-rw-r--r--app/javascript/mastodon/locales/hu.json16
-rw-r--r--app/javascript/mastodon/locales/hy.json284
-rw-r--r--app/javascript/mastodon/locales/id.json22
-rw-r--r--app/javascript/mastodon/locales/io.json16
-rw-r--r--app/javascript/mastodon/locales/is.json439
-rw-r--r--app/javascript/mastodon/locales/it.json18
-rw-r--r--app/javascript/mastodon/locales/ja.json20
-rw-r--r--app/javascript/mastodon/locales/ka.json18
-rw-r--r--app/javascript/mastodon/locales/kab.json439
-rw-r--r--app/javascript/mastodon/locales/kk.json16
-rw-r--r--app/javascript/mastodon/locales/kn.json16
-rw-r--r--app/javascript/mastodon/locales/ko.json30
-rw-r--r--app/javascript/mastodon/locales/lt.json16
-rw-r--r--app/javascript/mastodon/locales/lv.json16
-rw-r--r--app/javascript/mastodon/locales/mk.json16
-rw-r--r--app/javascript/mastodon/locales/ml.json286
-rw-r--r--app/javascript/mastodon/locales/mr.json16
-rw-r--r--app/javascript/mastodon/locales/ms.json16
-rw-r--r--app/javascript/mastodon/locales/nl.json20
-rw-r--r--app/javascript/mastodon/locales/nn.json614
-rw-r--r--app/javascript/mastodon/locales/no.json326
-rw-r--r--app/javascript/mastodon/locales/oc.json18
-rw-r--r--app/javascript/mastodon/locales/pl.json16
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json406
-rw-r--r--app/javascript/mastodon/locales/pt-PT.json20
-rw-r--r--app/javascript/mastodon/locales/ro.json16
-rw-r--r--app/javascript/mastodon/locales/ru.json204
-rw-r--r--app/javascript/mastodon/locales/sk.json34
-rw-r--r--app/javascript/mastodon/locales/sl.json16
-rw-r--r--app/javascript/mastodon/locales/sq.json16
-rw-r--r--app/javascript/mastodon/locales/sr-Latn.json16
-rw-r--r--app/javascript/mastodon/locales/sr.json16
-rw-r--r--app/javascript/mastodon/locales/sv.json38
-rw-r--r--app/javascript/mastodon/locales/ta.json70
-rw-r--r--app/javascript/mastodon/locales/te.json16
-rw-r--r--app/javascript/mastodon/locales/th.json64
-rw-r--r--app/javascript/mastodon/locales/tr.json22
-rw-r--r--app/javascript/mastodon/locales/uk.json16
-rw-r--r--app/javascript/mastodon/locales/ur.json274
-rw-r--r--app/javascript/mastodon/locales/vi.json439
-rw-r--r--app/javascript/mastodon/locales/whitelist_is.json2
-rw-r--r--app/javascript/mastodon/locales/whitelist_kab.json2
-rw-r--r--app/javascript/mastodon/locales/whitelist_vi.json2
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json24
-rw-r--r--app/javascript/mastodon/locales/zh-HK.json306
-rw-r--r--app/javascript/mastodon/locales/zh-TW.json32
-rw-r--r--app/javascript/mastodon/reducers/announcements.js102
-rw-r--r--app/javascript/mastodon/reducers/index.js2
-rw-r--r--app/javascript/mastodon/reducers/statuses.js6
-rw-r--r--app/javascript/mastodon/selectors/index.js1
-rw-r--r--app/javascript/mastodon/stream.js55
-rw-r--r--app/javascript/mastodon/utils/numbers.js8
-rw-r--r--app/javascript/packs/public.js9
-rw-r--r--app/javascript/styles/mastodon/admin.scss58
-rw-r--r--app/javascript/styles/mastodon/components.scss258
-rw-r--r--app/javascript/styles/mastodon/forms.scss6
-rw-r--r--app/lib/activitypub/activity.rb2
-rw-r--r--app/lib/entity_cache.rb2
-rw-r--r--app/lib/feed_manager.rb4
-rw-r--r--app/lib/formatter.rb5
-rw-r--r--app/lib/inline_renderer.rb4
-rw-r--r--app/lib/request.rb6
-rw-r--r--app/lib/sanitize_config.rb2
-rw-r--r--app/lib/search_query_transformer.rb2
-rw-r--r--app/lib/spam_check.rb2
-rw-r--r--app/mailers/user_mailer.rb1
-rw-r--r--app/models/account.rb19
-rw-r--r--app/models/account_filter.rb17
-rw-r--r--app/models/announcement.rb86
-rw-r--r--app/models/announcement_filter.rb39
-rw-r--r--app/models/announcement_mute.rb19
-rw-r--r--app/models/announcement_reaction.rb37
-rw-r--r--app/models/backup.rb2
-rw-r--r--app/models/bookmark.rb6
-rw-r--r--app/models/concerns/account_finder_concern.rb8
-rw-r--r--app/models/concerns/account_interactions.rb1
-rw-r--r--app/models/concerns/attachmentable.rb11
-rw-r--r--app/models/concerns/status_threading_concern.rb12
-rw-r--r--app/models/custom_emoji.rb2
-rw-r--r--app/models/custom_emoji_filter.rb7
-rw-r--r--app/models/custom_filter.rb1
-rw-r--r--app/models/domain_block.rb2
-rw-r--r--app/models/instance_filter.rb5
-rw-r--r--app/models/invite_filter.rb5
-rw-r--r--app/models/media_attachment.rb4
-rw-r--r--app/models/relationship_filter.rb120
-rw-r--r--app/models/report_filter.rb7
-rw-r--r--app/models/status.rb7
-rw-r--r--app/models/tag_filter.rb10
-rw-r--r--app/models/user.rb22
-rw-r--r--app/policies/announcement_policy.rb19
-rw-r--r--app/serializers/rest/account_serializer.rb8
-rw-r--r--app/serializers/rest/announcement_serializer.rb45
-rw-r--r--app/serializers/rest/reaction_serializer.rb31
-rw-r--r--app/services/activitypub/process_collection_service.rb2
-rw-r--r--app/services/backup_service.rb2
-rw-r--r--app/services/fetch_resource_service.rb2
-rw-r--r--app/services/process_mentions_service.rb11
-rw-r--r--app/services/resolve_url_service.rb18
-rw-r--r--app/services/vote_service.rb2
-rw-r--r--app/validators/reaction_validator.rb28
-rw-r--r--app/validators/unique_username_validator.rb3
-rw-r--r--app/validators/vote_validator.rb8
-rw-r--r--app/views/accounts/show.html.haml2
-rw-r--r--app/views/admin/accounts/index.html.haml2
-rw-r--r--app/views/admin/accounts/show.html.haml14
-rw-r--r--app/views/admin/announcements/_announcement.html.haml19
-rw-r--r--app/views/admin/announcements/edit.html.haml22
-rw-r--r--app/views/admin/announcements/index.html.haml22
-rw-r--r--app/views/admin/announcements/new.html.haml21
-rw-r--r--app/views/admin/custom_emojis/index.html.haml10
-rw-r--r--app/views/admin/email_domain_blocks/index.html.haml23
-rw-r--r--app/views/admin/followers/index.html.haml28
-rw-r--r--app/views/admin/instances/index.html.haml5
-rw-r--r--app/views/admin/relationships/index.html.haml39
-rw-r--r--app/views/admin/reports/_status.html.haml7
-rw-r--r--app/views/admin/reports/index.html.haml5
-rw-r--r--app/views/admin/reports/show.html.haml2
-rw-r--r--app/views/admin/tags/_tag.html.haml5
-rw-r--r--app/views/admin/tags/index.html.haml20
-rw-r--r--app/views/directories/index.html.haml2
-rw-r--r--app/views/filters/index.html.haml36
-rw-r--r--app/views/layouts/admin.html.haml7
-rw-r--r--app/views/layouts/embedded.html.haml4
-rw-r--r--app/views/relationships/_account.html.haml2
-rw-r--r--app/views/relationships/show.html.haml7
-rw-r--r--app/views/settings/applications/index.html.haml33
-rw-r--r--app/views/settings/preferences/appearance/show.html.haml4
-rw-r--r--app/views/statuses/_detailed_status.html.haml4
-rw-r--r--app/views/statuses/_simple_status.html.haml8
-rw-r--r--app/views/statuses/embed.html.haml5
-rw-r--r--app/workers/activitypub/delivery_worker.rb10
-rw-r--r--app/workers/publish_announcement_reaction_worker.rb22
-rw-r--r--app/workers/publish_scheduled_announcement_worker.rb19
-rw-r--r--app/workers/refollow_worker.rb9
-rw-r--r--app/workers/scheduler/scheduled_statuses_scheduler.rb28
-rw-r--r--app/workers/unpublish_announcement_worker.rb14
-rw-r--r--config/application.rb2
-rw-r--r--config/initializers/doorkeeper.rb13
-rw-r--r--config/initializers/paperclip.rb2
-rw-r--r--config/initializers/rack_attack.rb3
-rw-r--r--config/initializers/simple_form.rb2
-rw-r--r--config/initializers/twitter_regex.rb58
-rw-r--r--config/locales/activerecord.ast.yml3
-rw-r--r--config/locales/activerecord.ca.yml2
-rw-r--r--config/locales/activerecord.is.yml17
-rw-r--r--config/locales/activerecord.kab.yml12
-rw-r--r--config/locales/activerecord.ml.yml11
-rw-r--r--config/locales/activerecord.nn.yml16
-rw-r--r--config/locales/activerecord.no.yml4
-rw-r--r--config/locales/activerecord.pt-BR.yml4
-rw-r--r--config/locales/activerecord.pt-PT.yml4
-rw-r--r--config/locales/activerecord.ta.yml6
-rw-r--r--config/locales/activerecord.vi.yml17
-rw-r--r--config/locales/ar.yml58
-rw-r--r--config/locales/ast.yml205
-rw-r--r--config/locales/bg.yml1
-rw-r--r--config/locales/br.yml5
-rw-r--r--config/locales/ca.yml236
-rw-r--r--config/locales/co.yml66
-rw-r--r--config/locales/cs.yml570
-rw-r--r--config/locales/cy.yml39
-rw-r--r--config/locales/da.yml70
-rw-r--r--config/locales/de.yml57
-rw-r--r--config/locales/devise.ar.yml3
-rw-r--r--config/locales/devise.ast.yml31
-rw-r--r--config/locales/devise.ca.yml34
-rw-r--r--config/locales/devise.cs.yml74
-rw-r--r--config/locales/devise.da.yml12
-rw-r--r--config/locales/devise.de.yml4
-rw-r--r--config/locales/devise.et.yml4
-rw-r--r--config/locales/devise.gl.yml144
-rw-r--r--config/locales/devise.is.yml98
-rw-r--r--config/locales/devise.kab.yml58
-rw-r--r--config/locales/devise.kn.yml4
-rw-r--r--config/locales/devise.ml.yml24
-rw-r--r--config/locales/devise.nn.yml93
-rw-r--r--config/locales/devise.no.yml4
-rw-r--r--config/locales/devise.pt-PT.yml15
-rw-r--r--config/locales/devise.ru.yml44
-rw-r--r--config/locales/devise.sk.yml2
-rw-r--r--config/locales/devise.sv.yml18
-rw-r--r--config/locales/devise.ta.yml14
-rw-r--r--config/locales/devise.th.yml43
-rw-r--r--config/locales/devise.uk.yml1
-rw-r--r--config/locales/devise.ur.yml4
-rw-r--r--config/locales/devise.vi.yml97
-rw-r--r--config/locales/devise.zh-CN.yml10
-rw-r--r--config/locales/devise.zh-TW.yml20
-rw-r--r--config/locales/doorkeeper.ar.yml3
-rw-r--r--config/locales/doorkeeper.ast.yml33
-rw-r--r--config/locales/doorkeeper.ca.yml17
-rw-r--r--config/locales/doorkeeper.co.yml3
-rw-r--r--config/locales/doorkeeper.cs.yml43
-rw-r--r--config/locales/doorkeeper.cy.yml2
-rw-r--r--config/locales/doorkeeper.da.yml4
-rw-r--r--config/locales/doorkeeper.de.yml3
-rw-r--r--config/locales/doorkeeper.el.yml3
-rw-r--r--config/locales/doorkeeper.en.yml1
-rw-r--r--config/locales/doorkeeper.eo.yml7
-rw-r--r--config/locales/doorkeeper.es-AR.yml3
-rw-r--r--config/locales/doorkeeper.es.yml3
-rw-r--r--config/locales/doorkeeper.et.yml3
-rw-r--r--config/locales/doorkeeper.eu.yml3
-rw-r--r--config/locales/doorkeeper.fa.yml49
-rw-r--r--config/locales/doorkeeper.fr.yml33
-rw-r--r--config/locales/doorkeeper.gl.yml43
-rw-r--r--config/locales/doorkeeper.hu.yml3
-rw-r--r--config/locales/doorkeeper.id.yml3
-rw-r--r--config/locales/doorkeeper.is.yml151
-rw-r--r--config/locales/doorkeeper.it.yml3
-rw-r--r--config/locales/doorkeeper.ja.yml3
-rw-r--r--config/locales/doorkeeper.kab.yml104
-rw-r--r--config/locales/doorkeeper.kk.yml3
-rw-r--r--config/locales/doorkeeper.ko.yml3
-rw-r--r--config/locales/doorkeeper.ml.yml28
-rw-r--r--config/locales/doorkeeper.nl.yml30
-rw-r--r--config/locales/doorkeeper.nn.yml149
-rw-r--r--config/locales/doorkeeper.no.yml32
-rw-r--r--config/locales/doorkeeper.oc.yml2
-rw-r--r--config/locales/doorkeeper.pt-BR.yml81
-rw-r--r--config/locales/doorkeeper.pt-PT.yml33
-rw-r--r--config/locales/doorkeeper.ru.yml29
-rw-r--r--config/locales/doorkeeper.sk.yml2
-rw-r--r--config/locales/doorkeeper.sv.yml11
-rw-r--r--config/locales/doorkeeper.th.yml9
-rw-r--r--config/locales/doorkeeper.tr.yml3
-rw-r--r--config/locales/doorkeeper.uk.yml3
-rw-r--r--config/locales/doorkeeper.vi.yml150
-rw-r--r--config/locales/doorkeeper.zh-CN.yml16
-rw-r--r--config/locales/doorkeeper.zh-HK.yml31
-rw-r--r--config/locales/doorkeeper.zh-TW.yml2
-rw-r--r--config/locales/el.yml82
-rw-r--r--config/locales/en.yml43
-rw-r--r--config/locales/en_GB.yml3
-rw-r--r--config/locales/eo.yml78
-rw-r--r--config/locales/es-AR.yml60
-rw-r--r--config/locales/es.yml65
-rw-r--r--config/locales/et.yml42
-rw-r--r--config/locales/eu.yml56
-rw-r--r--config/locales/fa.yml104
-rw-r--r--config/locales/fi.yml3
-rw-r--r--config/locales/fr.yml66
-rw-r--r--config/locales/gl.yml552
-rw-r--r--config/locales/he.yml1
-rw-r--r--config/locales/hr.yml1
-rw-r--r--config/locales/hu.yml56
-rw-r--r--config/locales/hy.yml15
-rw-r--r--config/locales/id.yml91
-rw-r--r--config/locales/io.yml1
-rw-r--r--config/locales/is.yml1231
-rw-r--r--config/locales/it.yml37
-rw-r--r--config/locales/ja.yml55
-rw-r--r--config/locales/ka.yml1
-rw-r--r--config/locales/kab.yml433
-rw-r--r--config/locales/kk.yml23
-rw-r--r--config/locales/ko.yml87
-rw-r--r--config/locales/lt.yml4
-rw-r--r--config/locales/ml.yml42
-rw-r--r--config/locales/nl.yml23
-rw-r--r--config/locales/nn.yml1200
-rw-r--r--config/locales/no.yml648
-rw-r--r--config/locales/oc.yml19
-rw-r--r--config/locales/pl.yml12
-rw-r--r--config/locales/pt-BR.yml884
-rw-r--r--config/locales/pt-PT.yml320
-rw-r--r--config/locales/ro.yml1
-rw-r--r--config/locales/ru.yml370
-rw-r--r--config/locales/simple_form.ar.yml10
-rw-r--r--config/locales/simple_form.ast.yml66
-rw-r--r--config/locales/simple_form.ca.yml34
-rw-r--r--config/locales/simple_form.co.yml12
-rw-r--r--config/locales/simple_form.cs.yml78
-rw-r--r--config/locales/simple_form.da.yml20
-rw-r--r--config/locales/simple_form.de.yml14
-rw-r--r--config/locales/simple_form.el.yml40
-rw-r--r--config/locales/simple_form.en.yml12
-rw-r--r--config/locales/simple_form.eo.yml7
-rw-r--r--config/locales/simple_form.es-AR.yml12
-rw-r--r--config/locales/simple_form.es.yml14
-rw-r--r--config/locales/simple_form.eu.yml12
-rw-r--r--config/locales/simple_form.fr.yml20
-rw-r--r--config/locales/simple_form.gl.yml36
-rw-r--r--config/locales/simple_form.hu.yml12
-rw-r--r--config/locales/simple_form.id.yml9
-rw-r--r--config/locales/simple_form.is.yml171
-rw-r--r--config/locales/simple_form.ja.yml28
-rw-r--r--config/locales/simple_form.kab.yml62
-rw-r--r--config/locales/simple_form.ko.yml12
-rw-r--r--config/locales/simple_form.ml.yml8
-rw-r--r--config/locales/simple_form.nl.yml16
-rw-r--r--config/locales/simple_form.nn.yml182
-rw-r--r--config/locales/simple_form.no.yml127
-rw-r--r--config/locales/simple_form.pt-BR.yml154
-rw-r--r--config/locales/simple_form.pt-PT.yml38
-rw-r--r--config/locales/simple_form.ru.yml112
-rw-r--r--config/locales/simple_form.sk.yml3
-rw-r--r--config/locales/simple_form.sv.yml16
-rw-r--r--config/locales/simple_form.th.yml43
-rw-r--r--config/locales/simple_form.tr.yml12
-rw-r--r--config/locales/simple_form.uk.yml12
-rw-r--r--config/locales/simple_form.vi.yml171
-rw-r--r--config/locales/simple_form.zh-CN.yml36
-rw-r--r--config/locales/simple_form.zh-HK.yml56
-rw-r--r--config/locales/simple_form.zh-TW.yml1
-rw-r--r--config/locales/sk.yml45
-rw-r--r--config/locales/sl.yml4
-rw-r--r--config/locales/sq.yml4
-rw-r--r--config/locales/sr-Latn.yml1
-rw-r--r--config/locales/sr.yml4
-rw-r--r--config/locales/sv.yml139
-rw-r--r--config/locales/ta.yml176
-rw-r--r--config/locales/th.yml184
-rw-r--r--config/locales/tr.yml67
-rw-r--r--config/locales/uk.yml101
-rw-r--r--config/locales/vi.yml1112
-rw-r--r--config/locales/zh-CN.yml117
-rw-r--r--config/locales/zh-HK.yml136
-rw-r--r--config/locales/zh-TW.yml35
-rw-r--r--config/navigation.rb1
-rw-r--r--config/routes.rb23
-rw-r--r--db/migrate/20170711225116_fix_null_booleans.rb20
-rw-r--r--db/migrate/20170918125918_ids_to_bigints.rb28
-rw-r--r--db/migrate/20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb6
-rw-r--r--db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb4
-rw-r--r--db/migrate/20180206000000_change_user_id_nonnullable.rb6
-rw-r--r--db/migrate/20180310000000_change_columns_in_notifications_nonnullable.rb10
-rw-r--r--db/migrate/20180528141303_fix_accounts_unique_index.rb28
-rw-r--r--db/migrate/20181024224956_migrate_account_conversations.rb22
-rw-r--r--db/migrate/20191031163205_change_list_account_follow_nullable.rb4
-rw-r--r--db/migrate/20191218153258_create_announcements.rb16
-rw-r--r--db/migrate/20200113125135_create_announcement_mutes.rb12
-rw-r--r--db/migrate/20200114113335_create_announcement_reactions.rb15
-rw-r--r--db/migrate/20200119112504_add_public_index_to_statuses.rb11
-rw-r--r--db/migrate/20200126203551_add_published_at_to_announcements.rb5
-rw-r--r--db/schema.rb45
-rw-r--r--lib/cli.rb2
-rw-r--r--lib/mastodon/emoji_cli.rb9
-rw-r--r--lib/mastodon/version.rb6
-rw-r--r--lib/paperclip/blurhash_transcoder.rb2
-rw-r--r--lib/tasks/auto_annotate_models.rake1
-rw-r--r--package.json56
-rw-r--r--spec/controllers/api/proofs_controller_spec.rb5
-rw-r--r--spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb27
-rw-r--r--spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb27
-rw-r--r--spec/controllers/api/v1/announcements/reactions_controller_spec.rb65
-rw-r--r--spec/controllers/api/v1/announcements_controller_spec.rb59
-rw-r--r--spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb20
-rw-r--r--spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb20
-rw-r--r--spec/controllers/api/v1/trends_controller_spec.rb18
-rw-r--r--spec/controllers/concerns/obfuscate_filename_spec.rb30
-rw-r--r--spec/controllers/follower_accounts_controller_spec.rb12
-rw-r--r--spec/controllers/following_accounts_controller_spec.rb12
-rw-r--r--spec/fabricators/announcement_fabricator.rb6
-rw-r--r--spec/fabricators/announcement_mute_fabricator.rb4
-rw-r--r--spec/fabricators/announcement_reaction_fabricator.rb5
-rw-r--r--spec/fabricators/media_attachment_fabricator.rb18
-rw-r--r--spec/features/log_in_spec.rb36
-rw-r--r--spec/features/profile_spec.rb53
-rw-r--r--spec/lib/formatter_spec.rb24
-rw-r--r--spec/models/account_spec.rb14
-rw-r--r--spec/models/announcement_mute_spec.rb4
-rw-r--r--spec/models/announcement_reaction_spec.rb4
-rw-r--r--spec/models/announcement_spec.rb4
-rw-r--r--spec/models/domain_block_spec.rb10
-rw-r--r--spec/models/media_attachment_spec.rb31
-rw-r--r--spec/models/status_spec.rb12
-rw-r--r--spec/models/user_spec.rb15
-rw-r--r--spec/services/post_status_service_spec.rb8
-rw-r--r--spec/services/process_mentions_service_spec.rb46
-rw-r--r--spec/support/examples/models/concerns/account_avatar.rb20
-rw-r--r--spec/support/examples/models/concerns/account_header.rb23
-rw-r--r--spec/support/stories/profile_stories.rb45
-rw-r--r--spec/validators/reaction_validator_spec.rb42
-rw-r--r--spec/validators/unique_username_validator_spec.rb51
-rw-r--r--spec/workers/refollow_worker_spec.rb30
-rw-r--r--streaming/index.js3
-rw-r--r--yarn.lock1628
564 files changed, 22902 insertions, 6137 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml
index ff8eb4859..3ba027d95 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -3,7 +3,7 @@ version: 2
 aliases:
   - &defaults
     docker:
-      - image: circleci/ruby:2.6-stretch-node
+      - image: circleci/ruby:2.7-buster-node
         environment: &ruby_environment
           BUNDLE_APP_CONFIG: ./.bundle/
           DB_HOST: localhost
@@ -39,7 +39,6 @@ aliases:
     steps:
       - checkout
       - *attach_workspace
-
       - restore_cache:
           keys:
             - v1-node-dependencies-{{ checksum "yarn.lock" }}
@@ -49,7 +48,6 @@ aliases:
           key: v1-node-dependencies-{{ checksum "yarn.lock" }}
           paths:
             - ./node_modules/
-
       - *persist_to_workspace
 
   - &install_system_dependencies
@@ -58,16 +56,25 @@ aliases:
         command: |
           sudo apt-get update
           sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler
+          
+          ## TODO: FIX THESE BUSTER DEPENDANCES
+          sudo wget http://ftp.au.debian.org/debian/pool/main/i/icu/libicu57_57.1-6+deb9u3_amd64.deb
+          sudo dpkg -i libicu57_57.1-6+deb9u3_amd64.deb
+          sudo wget http://ftp.au.debian.org/debian/pool/main/p/protobuf/libprotobuf10_3.0.0-9_amd64.deb
+          sudo dpkg -i libprotobuf10_3.0.0-9_amd64.deb
 
   - &install_ruby_dependencies
       steps:
         - *attach_workspace
-
         - *install_system_dependencies
-
         - run: ruby -e 'puts RUBY_VERSION' | tee /tmp/.ruby-version
         - *restore_ruby_dependencies
-        - run: bundle install --clean --jobs 16 --path ./vendor/bundle/ --retry 3 --with pam_authentication --without development production && bundle clean
+        - run: bundle config set clean 'true'
+        - run: bundle config set deployment 'true'
+        - run: bundle config set with 'pam_authentication'
+        - run: bundle config set without 'development production'
+        - run: bundle config set frozen 'true'
+        - run: bundle install --jobs 16 --retry 3 && bundle clean
         - save_cache:
             key: v2-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-{{ checksum "Gemfile.lock" }}
             paths:
@@ -82,10 +89,8 @@ aliases:
   - &test_steps
       steps:
         - *attach_workspace
-
         - *install_system_dependencies
         - run: sudo apt-get install -y ffmpeg
-
         - run:
             name: Prepare Tests
             command: ./bin/rails parallel:create parallel:load_schema parallel:prepare
@@ -98,21 +103,21 @@ jobs:
     <<: *defaults
     <<: *install_steps
 
-  install-ruby2.6:
+  install-ruby2.7:
     <<: *defaults
     <<: *install_ruby_dependencies
 
-  install-ruby2.5:
+  install-ruby2.6:
     <<: *defaults
     docker:
-      - image: circleci/ruby:2.5-stretch-node
+      - image: circleci/ruby:2.6-buster-node
         environment: *ruby_environment
     <<: *install_ruby_dependencies
 
-  install-ruby2.4:
+  install-ruby2.5:
     <<: *defaults
     docker:
-      - image: circleci/ruby:2.4-stretch-node
+      - image: circleci/ruby:2.5-buster-node
         environment: *ruby_environment
     <<: *install_ruby_dependencies
 
@@ -128,10 +133,29 @@ jobs:
               - ./mastodon/public/assets
               - ./mastodon/public/packs-test/
 
-  test-ruby2.6:
+  test-migrations:
     <<: *defaults
     docker:
-      - image: circleci/ruby:2.6-stretch-node
+      - image: circleci/ruby:2.7-buster-node
+        environment: *ruby_environment
+      - image: circleci/postgres:10.6-alpine
+        environment:
+          POSTGRES_USER: root
+      - image: circleci/redis:5-alpine
+    steps:
+      - *attach_workspace
+      - *install_system_dependencies
+      - run:
+          name: Create database
+          command: ./bin/rails parallel:create
+      - run:
+          name: Run migrations
+          command: ./bin/rails parallel:migrate
+
+  test-ruby2.7:
+    <<: *defaults
+    docker:
+      - image: circleci/ruby:2.7-buster-node
         environment: *ruby_environment
       - image: circleci/postgres:10.6-alpine
         environment:
@@ -139,10 +163,10 @@ jobs:
       - image: circleci/redis:5-alpine
     <<: *test_steps
 
-  test-ruby2.5:
+  test-ruby2.6:
     <<: *defaults
     docker:
-      - image: circleci/ruby:2.5-stretch-node
+      - image: circleci/ruby:2.6-buster-node
         environment: *ruby_environment
       - image: circleci/postgres:10.6-alpine
         environment:
@@ -150,10 +174,10 @@ jobs:
       - image: circleci/redis:5-alpine
     <<: *test_steps
 
-  test-ruby2.4:
+  test-ruby2.5:
     <<: *defaults
     docker:
-      - image: circleci/ruby:2.4-stretch-node
+      - image: circleci/ruby:2.5-buster-node
         environment: *ruby_environment
       - image: circleci/postgres:10.6-alpine
         environment:
@@ -164,7 +188,7 @@ jobs:
   test-webui:
     <<: *defaults
     docker:
-      - image: circleci/node:12.9-stretch
+      - image: circleci/node:12-buster
     steps:
       - *attach_workspace
       - run: ./bin/retry yarn test:jest
@@ -184,20 +208,27 @@ workflows:
   build-and-test:
     jobs:
       - install
-      - install-ruby2.6:
+      - install-ruby2.7:
           requires:
             - install
-      - install-ruby2.5:
+      - install-ruby2.6:
           requires:
             - install
-            - install-ruby2.6
-      - install-ruby2.4:
+            - install-ruby2.7
+      - install-ruby2.5:
           requires:
             - install
-            - install-ruby2.6
+            - install-ruby2.7
       - build:
           requires:
-            - install-ruby2.6
+            - install-ruby2.7
+      - test-migrations:
+          requires:
+            - install-ruby2.7
+      - test-ruby2.7:
+          requires:
+            - install-ruby2.7
+            - build
       - test-ruby2.6:
           requires:
             - install-ruby2.6
@@ -206,13 +237,9 @@ workflows:
           requires:
             - install-ruby2.5
             - build
-      - test-ruby2.4:
-          requires:
-            - install-ruby2.4
-            - build
       - test-webui:
           requires:
             - install
       - check-i18n:
           requires:
-            - install-ruby2.6
+            - install-ruby2.7
diff --git a/.env.production.sample b/.env.production.sample
index 6036095e4..f573a37de 100644
--- a/.env.production.sample
+++ b/.env.production.sample
@@ -275,3 +275,13 @@ STREAMING_CLUSTER_NUM=1
 # http_proxy=http://gateway.local:8118
 # Access control for hidden service.
 # ALLOW_ACCESS_TO_HIDDEN_SERVICE=true
+
+# Authorized fetch mode (optional)
+# Require remote servers to authentify when fetching toots, see
+# https://docs.joinmastodon.org/admin/config/#authorized_fetch
+# AUTHORIZED_FETCH=true
+
+# Whitelist mode (optional)
+# Only allow federation with whitelisted domains, see
+# https://docs.joinmastodon.org/admin/config/#whitelist_mode
+# WHITELIST_MODE=true
diff --git a/.nvmrc b/.nvmrc
index 45a4fb75d..48082f72f 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-8
+12
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b200747b1..fa5b2bfed 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,162 @@ Changelog
 
 All notable changes to this project will be documented in this file.
 
+## Unreleased
+### Added
+
+- Add bookmarks ([ThibG](https://github.com/tootsuite/mastodon/pull/7107), [Gargron](https://github.com/tootsuite/mastodon/pull/12494), [Gomasy](https://github.com/tootsuite/mastodon/pull/12381))
+- Add announcements ([Gargron](https://github.com/tootsuite/mastodon/pull/12662), [Gargron](https://github.com/tootsuite/mastodon/pull/12967), [Gargron](https://github.com/tootsuite/mastodon/pull/12970), [Gargron](https://github.com/tootsuite/mastodon/pull/12963), [Gargron](https://github.com/tootsuite/mastodon/pull/12950), [Gargron](https://github.com/tootsuite/mastodon/pull/12990), [Gargron](https://github.com/tootsuite/mastodon/pull/12949), [Gargron](https://github.com/tootsuite/mastodon/pull/12989), [Gargron](https://github.com/tootsuite/mastodon/pull/12964), [Gargron](https://github.com/tootsuite/mastodon/pull/12965), [ThibG](https://github.com/tootsuite/mastodon/pull/12958), [ThibG](https://github.com/tootsuite/mastodon/pull/12957), [Gargron](https://github.com/tootsuite/mastodon/pull/12955), [ThibG](https://github.com/tootsuite/mastodon/pull/12946), [ThibG](https://github.com/tootsuite/mastodon/pull/12954))
+- Add number animations in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12948), [Gargron](https://github.com/tootsuite/mastodon/pull/12971))
+- Add `kab`, `is`, `kn`, `mr`, `ur` to available locales ([Gargron](https://github.com/tootsuite/mastodon/pull/12882), [BoFFire](https://github.com/tootsuite/mastodon/pull/12962), [Gargron](https://github.com/tootsuite/mastodon/pull/12379))
+- Add profile filter category ([ThibG](https://github.com/tootsuite/mastodon/pull/12918))
+- Add ability to add oneself to lists ([ThibG](https://github.com/tootsuite/mastodon/pull/12271))
+- Add hint how to contribute translations to preferences page ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12736))
+- Add signatures to statuses in archive takeout ([noellabo](https://github.com/tootsuite/mastodon/pull/12649))
+- Add support for `magnet:` and `xmpp` links ([ThibG](https://github.com/tootsuite/mastodon/pull/12905), [ThibG](https://github.com/tootsuite/mastodon/pull/12709))
+- Add `follow_request` notification type ([ThibG](https://github.com/tootsuite/mastodon/pull/12198))
+- Add ability to filter reports by account domain in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12154))
+- Add link to search for users connected from the same IP address to admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12157))
+- Add link to reports targeting a specific domain in admin view ([ThibG](https://github.com/tootsuite/mastodon/pull/12513))
+- Add support for EventSource streaming in web UI ([BenLubar](https://github.com/tootsuite/mastodon/pull/12887))
+- Add hotkey for opening media attachments in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12498), [Kjwon15](https://github.com/tootsuite/mastodon/pull/12546))
+- Add relationship-based options to status dropdowns in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12377), [ThibG](https://github.com/tootsuite/mastodon/pull/12535), [Gargron](https://github.com/tootsuite/mastodon/pull/12430))
+- Add support for submitting media description with `ctrl`+`enter` in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12272))
+- Add download button to audio and video players in web UI ([NimaBoscarino](https://github.com/tootsuite/mastodon/pull/12179))
+- Add setting for whether to crop images in timelines in web UI ([duxovni](https://github.com/tootsuite/mastodon/pull/12126))
+- Add support for `Event` activities ([tcitworld](https://github.com/tootsuite/mastodon/pull/12637))
+- Add basic support for `Group` actors ([noellabo](https://github.com/tootsuite/mastodon/pull/12071))
+- Add `S3_OVERRIDE_PATH_STYLE` environment variable ([Gargron](https://github.com/tootsuite/mastodon/pull/12594))
+- Add `S3_OPEN_TIMEOUT` environment variable ([tateisu](https://github.com/tootsuite/mastodon/pull/12459))
+- Add `LDAP_MAIL` environment variable ([madmath03](https://github.com/tootsuite/mastodon/pull/12053))
+- Add `LDAP_UID_CONVERSION_ENABLED` environment variable ([madmath03](https://github.com/tootsuite/mastodon/pull/12461))
+- Add `--remote-only` option to `tootctl emoji purge` ([ThibG](https://github.com/tootsuite/mastodon/pull/12810))
+- Add `tootctl media remove-orphans` ([Gargron](https://github.com/tootsuite/mastodon/pull/12568), [Gargron](https://github.com/tootsuite/mastodon/pull/12571))
+- Add `tootctl media lookup` command ([irlcatgirl](https://github.com/tootsuite/mastodon/pull/12283))
+- Add cache for OEmbed endpoints to avoid extra HTTP requests ([Gargron](https://github.com/tootsuite/mastodon/pull/12403))
+- Add support for KaiOS arrow navigation to public pages ([nolanlawson](https://github.com/tootsuite/mastodon/pull/12251))
+- Add `discoverable` to accounts in REST API ([trwnh](https://github.com/tootsuite/mastodon/pull/12508))
+- Add admin setting to disable default follows ([ArisuOngaku](https://github.com/tootsuite/mastodon/pull/12566))
+- Add support for LDAP and PAM in the OAuth password grant strategy ([ntl-purism](https://github.com/tootsuite/mastodon/pull/12390))
+- Allow support for `Accept`/`Reject` activities with a non-embedded object ([puckipedia](https://github.com/tootsuite/mastodon/pull/12199))
+
+### Changed
+
+- Change `last_status_at` to be a date, not datetime in REST API ([ThibG](https://github.com/tootsuite/mastodon/pull/12966))
+- Change followers page to relationships page in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12927), [Gargron](https://github.com/tootsuite/mastodon/pull/12934))
+- Change reported media attachments to always be hidden in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12879), [ThibG](https://github.com/tootsuite/mastodon/pull/12907))
+- Change string from "Disable" to "Disable login" in admin UI ([nileshkumar](https://github.com/tootsuite/mastodon/pull/12201))
+- Change report page structure in admin UI ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12615))
+- Change swipe sensitivity to be lower on small screens in web UI ([umonaca](https://github.com/tootsuite/mastodon/pull/12168))
+- Change audio/video playback to stop playback when out of view in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12486))
+- Change media description label based on upload type in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12270))
+- Change large numbers to render without decimal units in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/12706))
+- Change "Add a choice" button to be disabled rather than hidden when poll limit reached in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12319), [hinaloe](https://github.com/tootsuite/mastodon/pull/12544))
+- Change `tootctl statuses remove` to keep statuses favourited or bookmarked by local users ([ThibG](https://github.com/tootsuite/mastodon/pull/11267), [Gomasy](https://github.com/tootsuite/mastodon/pull/12818))
+- Change domain block behavior to update user records (fast) before deleting data (slower) ([ThibG](https://github.com/tootsuite/mastodon/pull/12247))
+- Change behaviour to strip audio metadata on uploads ([hugogameiro](https://github.com/tootsuite/mastodon/pull/12171))
+- Change accepted length of remote media descriptions from 420 to 1,500 characters ([ThibG](https://github.com/tootsuite/mastodon/pull/12262))
+- Change preferences pages structure ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12497), [mayaeh](https://github.com/tootsuite/mastodon/pull/12517), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12801), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12797), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12799), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12793))
+- Change format of titles in RSS ([devkral](https://github.com/tootsuite/mastodon/pull/8596))
+- Change favourite icon animation from spring-based motion to CSS animation in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12175))
+- Change minimum required Node.js version to 10, and default to 12 ([Shleeble](https://github.com/tootsuite/mastodon/pull/12791), [mkody](https://github.com/tootsuite/mastodon/pull/12906), [Shleeble](https://github.com/tootsuite/mastodon/pull/12703))
+- Change spam check to exempt server staff ([ThibG](https://github.com/tootsuite/mastodon/pull/12874))
+- Change to fallback to to `Create` audience when `object` has no defined audience ([ThibG](https://github.com/tootsuite/mastodon/pull/12249))
+- Change Twemoji library to 12.1.3 in web UI ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/12342))
+- Change blocked users to be hidden from following/followers lists ([ThibG](https://github.com/tootsuite/mastodon/pull/12733))
+
+### Removed
+
+- Remove unused dependencies ([ykzts](https://github.com/tootsuite/mastodon/pull/12861), [mayaeh](https://github.com/tootsuite/mastodon/pull/12826), [ThibG](https://github.com/tootsuite/mastodon/pull/12822), [ykzts](https://github.com/tootsuite/mastodon/pull/12533))
+
+### Fixed
+
+- Fix some translatable strings being used wrongly ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12569), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12589), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12502), [mayaeh](https://github.com/tootsuite/mastodon/pull/12231))
+- Fix headline of public timeline page when set to local-only ([ykzts](https://github.com/tootsuite/mastodon/pull/12224))
+- Fix space between tabs not being spread evenly in web UI ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12944), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12961), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12446))
+- Fix interactive delays in database migrations with no TTY ([Gargron](https://github.com/tootsuite/mastodon/pull/12969))
+- Fix status overflowing in report dialog in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12959))
+- Fix unlocalized dropdown button title in web UI ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/12947))
+- Fix media attachments without file being uploadable ([Gargron](https://github.com/tootsuite/mastodon/pull/12562))
+- Fix unfollow confirmations in profile directory in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12922))
+- Fix duplicate `description` meta tag on accounts public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/12923))
+- Fix slow query of federated timeline ([notozeki](https://github.com/tootsuite/mastodon/pull/12886))
+- Fix not all of account's active IPs showing up in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12909), [Gargron](https://github.com/tootsuite/mastodon/pull/12943))
+- Fix search by IP not using alternative browser sessions in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12904))
+- Fix “X new items” not showing up for slow mode on empty timelines in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12875))
+- Fix OEmbed endpoint being inaccessible in secure mode ([Gargron](https://github.com/tootsuite/mastodon/pull/12864))
+- Fix proofs API being inaccessible in secure mode ([Gargron](https://github.com/tootsuite/mastodon/pull/12495))
+- Fix Ruby 2.7 incompatibilities ([ThibG](https://github.com/tootsuite/mastodon/pull/12831), [ThibG](https://github.com/tootsuite/mastodon/pull/12824), [Shleeble](https://github.com/tootsuite/mastodon/pull/12759), [zunda](https://github.com/tootsuite/mastodon/pull/12769))
+- Fix invalid poll votes being accepted in REST API ([ThibG](https://github.com/tootsuite/mastodon/pull/12601))
+- Fix old migrations failing because of strong migrations update ([ThibG](https://github.com/tootsuite/mastodon/pull/12787), [ThibG](https://github.com/tootsuite/mastodon/pull/12692))
+- Fix reuse of detailed status components in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12792))
+- Fix base64-encoded file uploads not being possible in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/12748), [Gargron](https://github.com/tootsuite/mastodon/pull/12857))
+- Fix resource_owner_from_credentials in Doorkeeper initializer ([Gargron](https://github.com/tootsuite/mastodon/pull/12743))
+- Fix error due to missing authentication call in filters controller ([Gargron](https://github.com/tootsuite/mastodon/pull/12746))
+- Fix uncaught unknown format error in host meta controller ([Gargron](https://github.com/tootsuite/mastodon/pull/12747))
+- Fix URL search not returning private toots user has access to ([ThibG](https://github.com/tootsuite/mastodon/pull/12742), [ThibG](https://github.com/tootsuite/mastodon/pull/12336))
+- Fix cache digesting log noise on status embeds ([Gargron](https://github.com/tootsuite/mastodon/pull/12750))
+- Fix slowness due to layout thrashing when reloading a large set of statuses in web UI ([panarom](https://github.com/tootsuite/mastodon/pull/12661), [panarom](https://github.com/tootsuite/mastodon/pull/12744), [Gargron](https://github.com/tootsuite/mastodon/pull/12712))
+- Fix error when fetching followers/following from REST API when user has network hidden ([Gargron](https://github.com/tootsuite/mastodon/pull/12716))
+- Fix IDN mentions not being processed, IDN domains not being rendered ([Gargron](https://github.com/tootsuite/mastodon/pull/12715))
+- Fix error when searching for empty phrase ([Gargron](https://github.com/tootsuite/mastodon/pull/12711))
+- Fix backups stopping due to read timeouts ([chr-1x](https://github.com/tootsuite/mastodon/pull/12281))
+- Fix batch actions on non-pending tags in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12537))
+- Fix sample `SAML_ACS_URL`, `SAML_ISSUER` ([orlea](https://github.com/tootsuite/mastodon/pull/12669))
+- Fix manual scrolling issue on Firefox/Windows in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12648))
+- Fix archive takeout failing if total dump size exceeds 2GB ([scd31](https://github.com/tootsuite/mastodon/pull/12602), [Gargron](https://github.com/tootsuite/mastodon/pull/12653))
+- Fix custom emoji category creation silently erroring out on duplicate category ([ThibG](https://github.com/tootsuite/mastodon/pull/12647))
+- Fix link crawler not specifying preferred content type ([ThibG](https://github.com/tootsuite/mastodon/pull/12646))
+- Fix featured hashtag setting page erroring out instead of rejecting invalid tags ([ThibG](https://github.com/tootsuite/mastodon/pull/12436))
+- Fix tooltip messages of single/multiple-choice polls switcher being reversed in web UI ([acid-chicken](https://github.com/tootsuite/mastodon/pull/12616))
+- Fix typo in help text of `tootctl statuses remove` ([trwnh](https://github.com/tootsuite/mastodon/pull/12603))
+- Fix generic HTTP 500 error on duplicate records ([Gargron](https://github.com/tootsuite/mastodon/pull/12563))
+- Fix old migration failing with new status default scope ([ThibG](https://github.com/tootsuite/mastodon/pull/12493))
+- Fix errors when using search API with no query ([Gargron](https://github.com/tootsuite/mastodon/pull/12541), [trwnh](https://github.com/tootsuite/mastodon/pull/12549))
+- Fix poll options not being selectable via keyboard in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12538))
+- Fix conversations not having an unread indicator in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/12506))
+- Fix lost focus when modals open/close in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12437))
+- Fix pending upload count not being decremented on error in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12499))
+- Fix empty poll options not being removed on remote poll update ([ThibG](https://github.com/tootsuite/mastodon/pull/12484))
+- Fix OCR with delete & redraft in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12465))
+- Fix blur behind closed registration message ([ThibG](https://github.com/tootsuite/mastodon/pull/12442))
+- Fix OEmbed discovery not handling different URL variants in query ([Gargron](https://github.com/tootsuite/mastodon/pull/12439))
+- Fix link crawler crashing on `<a>` tags without `href` ([ThibG](https://github.com/tootsuite/mastodon/pull/12159))
+- Fix whitelisted subdomains being ignored in whitelist mode ([noiob](https://github.com/tootsuite/mastodon/pull/12435))
+- Fix broken audit log in whitelist mode in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12303))
+- Fix unread indicator not honoring "Only media" option in local and federated timelines in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12330))
+- Fix error when rebuilding home feeds ([dariusk](https://github.com/tootsuite/mastodon/pull/12324))
+- Fix relationship caches being broken as result of a follow request ([ThibG](https://github.com/tootsuite/mastodon/pull/12299))
+- Fix more items than the limit being uploadable in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12300))
+- Fix various issues with account migration ([ThibG](https://github.com/tootsuite/mastodon/pull/12301))
+- Fix filtered out items being counted as pending items in slow mode in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12266))
+- Fix notification filters not applying to poll options ([ThibG](https://github.com/tootsuite/mastodon/pull/12269))
+- Fix notification message for user's own poll saying it's a poll they voted on in web UI ([ykzts](https://github.com/tootsuite/mastodon/pull/12219))
+- Fix polls with an expiration not showing up as expired in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/12222))
+- Fix volume slider having an offset between cursor and slider in Chromium in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12158))
+- Fix Vagrant image not accepting connections ([shrft](https://github.com/tootsuite/mastodon/pull/12180))
+- Fix batch actions being hidden on small screens in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12183))
+- Fix incoming federation not working in whitelist mode ([ThibG](https://github.com/tootsuite/mastodon/pull/12185))
+- Fix error when passing empty `source` param to `PUT /api/v1/accounts/update_credentials` ([jglauche](https://github.com/tootsuite/mastodon/pull/12259))
+- Fix HTTP-based streaming API being cacheable by proxies ([BenLubar](https://github.com/tootsuite/mastodon/pull/12945))
+- Fix users being able to register while `tootctl self-destruct` is in progress ([Kjwon15](https://github.com/tootsuite/mastodon/pull/12877))
+- Fix microformats detection in link crawler not ignoring `h-card` links ([nightpool](https://github.com/tootsuite/mastodon/pull/12189))
+- Fix outline on full-screen video in web UI ([hinaloe](https://github.com/tootsuite/mastodon/pull/12176))
+- Fix TLD domain blocks not being editable ([ThibG](https://github.com/tootsuite/mastodon/pull/12805))
+- Fix Nanobox deploy hooks ([danhunsaker](https://github.com/tootsuite/mastodon/pull/12663))
+- Fix needlessly complicated SQL query when performing account search amongst followings ([ThibG](https://github.com/tootsuite/mastodon/pull/12302))
+- Fix favourites count not updating when unfavouriting in web UI ([NimaBoscarino](https://github.com/tootsuite/mastodon/pull/12140))
+- Fix occasional crash on scroll in Chromium in web UI ([hinaloe](https://github.com/tootsuite/mastodon/pull/12274))
+- Fix intersection observer not working in single-column mode web UI ([panarom](https://github.com/tootsuite/mastodon/pull/12735))
+- Fix voting issue with remote polls that contain trailing spaces ([ThibG](https://github.com/tootsuite/mastodon/pull/12515))
+- Fix dynamic elements not working in pgHero due to CSP rules ([ykzts](https://github.com/tootsuite/mastodon/pull/12489))
+- Fix overly verbose backtraces when delivering ActivityPub payloads ([zunda](https://github.com/tootsuite/mastodon/pull/12798))
+
+### Security
+
+- Fix OEmbed leaking information about existence of non-public statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/12930))
+- Fix password change/reset not immediately invalidating other sessions ([Gargron](https://github.com/tootsuite/mastodon/pull/12928))
+- Fix settings pages being cacheable by the browser ([Gargron](https://github.com/tootsuite/mastodon/pull/12714))
+
 ## [3.0.1] - 2019-10-10
 ### Added
 
diff --git a/Dockerfile b/Dockerfile
index ccd916a49..e36ed13ba 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -4,7 +4,7 @@ FROM ubuntu:18.04 as build-dep
 SHELL ["bash", "-c"]
 
 # Install Node v12 (LTS)
-ENV NODE_VER="12.13.1"
+ENV NODE_VER="12.14.0"  
 RUN	echo "Etc/UTC" > /etc/localtime && \
 	apt update && \
 	apt -y install wget python && \
@@ -58,7 +58,9 @@ RUN npm install -g yarn && \
 COPY Gemfile* package.json yarn.lock /opt/mastodon/
 
 RUN cd /opt/mastodon && \
-	bundle install -j$(nproc) --deployment --without development test && \
+  bundle config set deployment 'true' && \
+  bundle config set without 'development test' && \
+	bundle install -j$(nproc) && \
 	yarn install --pure-lockfile
 
 FROM ubuntu:18.04
diff --git a/Gemfile b/Gemfile
index bb4e65fdc..fd0cd81d2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,22 +1,26 @@
 # frozen_string_literal: true
 
 source 'https://rubygems.org'
-ruby '>= 2.4.0', '< 2.7.0'
+ruby '>= 2.4.0', '< 3.0.0'
 
 gem 'pkg-config', '~> 1.4'
 
 gem 'puma', '~> 4.3'
 gem 'rails', '~> 5.2.4'
-gem 'sprockets', '~> 3.7'
+gem 'sprockets', '~> 3.7.2'
 gem 'thor', '~> 0.20'
+gem 'rack', '~> 2.1.2'
+
+gem 'thwait', '~> 0.1.0'
+gem 'e2mmap', '~> 0.1.0'
 
 gem 'hamlit-rails', '~> 0.2'
-gem 'pg', '~> 1.1'
+gem 'pg', '~> 1.2'
 gem 'makara', '~> 0.4'
 gem 'pghero', '~> 2.4'
 gem 'dotenv-rails', '~> 2.7'
 
-gem 'aws-sdk-s3', '~> 1.59', require: false
+gem 'aws-sdk-s3', '~> 1.60', require: false
 gem 'fog-core', '<= 2.1.0'
 gem 'fog-openstack', '~> 0.3', require: false
 gem 'paperclip', '~> 6.0'
@@ -31,7 +35,7 @@ gem 'browser'
 gem 'charlock_holmes', '~> 0.7.7'
 gem 'iso-639'
 gem 'chewy', '~> 5.1'
-gem 'cld3', '~> 3.2.4'
+gem 'cld3', '~> 3.2.6'
 gem 'devise', '~> 4.7'
 gem 'devise-two-factor', '~> 3.1'
 
@@ -50,24 +54,23 @@ gem 'fast_blank', '~> 1.0'
 gem 'fastimage'
 gem 'goldfinger', '~> 2.1'
 gem 'hiredis', '~> 0.6'
-gem 'redis-namespace', '~> 1.5'
+gem 'redis-namespace', '~> 1.7'
 gem 'health_check', git: 'https://github.com/ianheggie/health_check', ref: '0b799ead604f900ed50685e9b2d469cd2befba5b'
 gem 'html2text'
 gem 'htmlentities', '~> 4.3'
-gem 'http', '~> 3.3'
+gem 'http', '~> 4.3'
 gem 'http_accept_language', '~> 2.1'
 gem 'http_parser.rb', '~> 0.6', git: 'https://github.com/tmm1/http_parser.rb', ref: '54b17ba8c7d8d20a16dfc65d1775241833219cf2', submodules: true
-gem 'httplog', '~> 1.3'
+gem 'httplog', '~> 1.4'
 gem 'idn-ruby', require: 'idn'
 gem 'kaminari', '~> 1.1'
 gem 'link_header', '~> 0.0'
-gem 'mime-types', '~> 3.3', require: 'mime/types/columnar'
+gem 'mime-types', '~> 3.3.1', require: 'mime/types/columnar'
 gem 'nilsimsa', git: 'https://github.com/witgo/nilsimsa', ref: 'fd184883048b922b176939f851338d0a4971a532'
 gem 'nokogiri', '~> 1.10'
 gem 'nsa', '~> 0.2'
 gem 'oj', '~> 3.10'
-gem 'ostatus2', '~> 2.0'
-gem 'ox', '~> 2.11'
+gem 'ox', '~> 2.12'
 gem 'parslet'
 gem 'parallel', '~> 1.19'
 gem 'posix-spawn', git: 'https://github.com/rtomayko/posix-spawn', ref: '58465d2e213991f8afb13b984854a49fcdcc980c'
@@ -79,7 +82,7 @@ gem 'rails-i18n', '~> 5.1'
 gem 'rails-settings-cached', '~> 0.6'
 gem 'redis', '~> 4.1', require: ['redis', 'redis/connection/hiredis']
 gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
-gem 'rqrcode', '~> 0.10'
+gem 'rqrcode', '~> 1.1'
 gem 'ruby-progressbar', '~> 1.10'
 gem 'sanitize', '~> 5.1'
 gem 'sidekiq', '~> 5.2'
@@ -98,9 +101,9 @@ gem 'tzinfo-data', '~> 1.2019'
 gem 'webpacker', '~> 4.2'
 gem 'webpush'
 
-gem 'json-ld', git: 'https://github.com/ruby-rdf/json-ld.git', ref: 'e742697a0906e74e8bb777ef98137bc3955d981d'
+gem 'json-ld'
 gem 'json-ld-preloaded', '~> 3.0'
-gem 'rdf-normalize', '~> 0.3'
+gem 'rdf-normalize', '~> 0.4'
 
 gem 'redcarpet', '~> 3.4'
 
@@ -118,14 +121,14 @@ group :production, :test do
 end
 
 group :test do
-  gem 'capybara', '~> 3.29'
+  gem 'capybara', '~> 3.30'
   gem 'climate_control', '~> 0.2'
-  gem 'faker', '~> 2.9'
-  gem 'microformats', '~> 4.1'
+  gem 'faker', '~> 2.10'
+  gem 'microformats', '~> 4.2'
   gem 'rails-controller-testing', '~> 1.0'
   gem 'rspec-sidekiq', '~> 3.0'
   gem 'simplecov', '~> 0.17', require: false
-  gem 'webmock', '~> 3.7'
+  gem 'webmock', '~> 3.8'
   gem 'parallel_tests', '~> 2.30'
 end
 
@@ -134,11 +137,11 @@ group :development do
   gem 'annotate', '~> 3.0'
   gem 'better_errors', '~> 2.5'
   gem 'binding_of_caller', '~> 0.7'
-  gem 'bullet', '~> 6.0'
+  gem 'bullet', '~> 6.1'
   gem 'letter_opener', '~> 1.7'
   gem 'letter_opener_web', '~> 1.3'
   gem 'memory_profiler'
-  gem 'rubocop', '~> 0.78', require: false
+  gem 'rubocop', '~> 0.79', require: false
   gem 'rubocop-rails', '~> 2.4', require: false
   gem 'brakeman', '~> 4.7', require: false
   gem 'bundler-audit', '~> 0.6', require: false
@@ -148,7 +151,6 @@ group :development do
   gem 'capistrano-rbenv', '~> 2.1'
   gem 'capistrano-yarn', '~> 2.0'
 
-  gem 'derailed_benchmarks'
   gem 'stackprof'
 end
 
diff --git a/Gemfile.lock b/Gemfile.lock
index cfa4201fd..8e211aab4 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -14,19 +14,6 @@ GIT
     posix-spawn (0.3.13)
 
 GIT
-  remote: https://github.com/ruby-rdf/json-ld.git
-  revision: e742697a0906e74e8bb777ef98137bc3955d981d
-  ref: e742697a0906e74e8bb777ef98137bc3955d981d
-  specs:
-    json-ld (3.0.2)
-      htmlentities (~> 4.3)
-      json-canonicalization (~> 0.1)
-      link_header (~> 0.0, >= 0.0.8)
-      multi_json (~> 1.13)
-      rack (>= 1.6, < 3.0)
-      rdf (~> 3.0, >= 3.0.8)
-
-GIT
   remote: https://github.com/tmm1/http_parser.rb
   revision: 54b17ba8c7d8d20a16dfc65d1775241833219cf2
   ref: 54b17ba8c7d8d20a16dfc65d1775241833219cf2
@@ -93,7 +80,7 @@ GEM
       tzinfo (~> 1.1)
     addressable (2.7.0)
       public_suffix (>= 2.0.2, < 5.0)
-    airbrussh (1.3.4)
+    airbrussh (1.4.0)
       sshkit (>= 1.6.1, != 1.7.0)
     annotate (3.0.3)
       activerecord (>= 3.2, < 7.0)
@@ -105,37 +92,36 @@ GEM
     av (0.9.0)
       cocaine (~> 0.5.3)
     aws-eventstream (1.0.3)
-    aws-partitions (1.251.0)
-    aws-sdk-core (3.84.0)
+    aws-partitions (1.261.0)
+    aws-sdk-core (3.86.0)
       aws-eventstream (~> 1.0, >= 1.0.2)
       aws-partitions (~> 1, >= 1.239.0)
       aws-sigv4 (~> 1.1)
       jmespath (~> 1.0)
-    aws-sdk-kms (1.26.0)
+    aws-sdk-kms (1.27.0)
       aws-sdk-core (~> 3, >= 3.71.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.59.0)
+    aws-sdk-s3 (1.60.1)
       aws-sdk-core (~> 3, >= 3.83.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.1)
     aws-sigv4 (1.1.0)
       aws-eventstream (~> 1.0, >= 1.0.2)
     bcrypt (3.1.12)
-    benchmark-ips (2.7.2)
     better_errors (2.5.1)
       coderay (>= 1.0.0)
       erubi (>= 1.0.0)
       rack (>= 0.9.0)
     binding_of_caller (0.8.0)
       debug_inspector (>= 0.0.1)
-    blurhash (0.1.3)
+    blurhash (0.1.4)
       ffi (~> 1.10.0)
     bootsnap (1.4.5)
       msgpack (~> 1.0)
     brakeman (4.7.2)
-    browser (2.7.1)
+    browser (3.0.3)
     builder (3.2.4)
-    bullet (6.0.2)
+    bullet (6.1.0)
       activesupport (>= 3.0.0)
       uniform_notifier (~> 1.11)
     bundler-audit (0.6.1)
@@ -153,12 +139,12 @@ GEM
     capistrano-rails (1.4.0)
       capistrano (~> 3.1)
       capistrano-bundler (~> 1.1)
-    capistrano-rbenv (2.1.4)
+    capistrano-rbenv (2.1.6)
       capistrano (~> 3.1)
       sshkit (~> 1.3)
     capistrano-yarn (2.0.2)
       capistrano (~> 3.0)
-    capybara (3.29.0)
+    capybara (3.30.0)
       addressable
       mini_mime (>= 0.1.3)
       nokogiri (~> 1.8)
@@ -173,9 +159,9 @@ GEM
       activesupport (>= 4.0)
       elasticsearch (>= 2.0.0)
       elasticsearch-dsl
-    chunky_png (1.3.10)
-    cld3 (3.2.4)
-      ffi (>= 1.1.0, < 1.11.0)
+    chunky_png (1.3.11)
+    cld3 (3.2.6)
+      ffi (>= 1.1.0, < 1.12.0)
     climate_control (0.2.0)
     cocaine (0.5.8)
       climate_control (>= 0.0.3, < 1.0)
@@ -184,19 +170,10 @@ GEM
     connection_pool (2.2.2)
     crack (0.4.3)
       safe_yaml (~> 1.0.0)
-    crass (1.0.5)
-    css_parser (1.7.0)
+    crass (1.0.6)
+    css_parser (1.7.1)
       addressable
     debug_inspector (0.0.3)
-    derailed_benchmarks (1.4.2)
-      benchmark-ips (~> 2)
-      get_process_mem (~> 0)
-      heapy (~> 0)
-      memory_profiler (~> 0)
-      rack (>= 1)
-      rake (> 10, < 14)
-      ruby-statistics (>= 2.1)
-      thor (~> 0.19)
     devise (4.7.1)
       bcrypt (~> 3.0)
       orm_adapter (~> 0.1)
@@ -216,7 +193,7 @@ GEM
     discard (1.1.0)
       activerecord (>= 4.2, < 7)
     docile (1.3.2)
-    domain_name (0.5.20180417)
+    domain_name (0.5.20190701)
       unf (>= 0.0.5, < 1.0.0)
     doorkeeper (5.2.3)
       railties (>= 5)
@@ -224,6 +201,7 @@ GEM
     dotenv-rails (2.7.5)
       dotenv (= 2.7.5)
       railties (>= 3.2, < 6.1)
+    e2mmap (0.1.0)
     elasticsearch (7.3.0)
       elasticsearch-api (= 7.3.0)
       elasticsearch-transport (= 7.3.0)
@@ -240,13 +218,16 @@ GEM
       tzinfo
     excon (0.71.0)
     fabrication (2.21.0)
-    faker (2.9.0)
-      i18n (>= 1.6, < 1.8)
-    faraday (0.15.4)
+    faker (2.10.1)
+      i18n (>= 1.6, < 2)
+    faraday (1.0.0)
       multipart-post (>= 1.2, < 3)
     fast_blank (1.0.0)
     fastimage (2.1.7)
     ffi (1.10.0)
+    ffi-compiler (1.0.1)
+      ffi (>= 1.0.0)
+      rake
     fog-core (2.1.0)
       builder
       excon (~> 0.58)
@@ -266,17 +247,15 @@ GEM
     fuubar (2.5.0)
       rspec-core (~> 3.0)
       ruby-progressbar (~> 1.4)
-    get_process_mem (0.2.5)
-      ffi (~> 1.0)
     globalid (0.4.2)
       activesupport (>= 4.2.0)
-    goldfinger (2.1.0)
+    goldfinger (2.1.1)
       addressable (~> 2.5)
-      http (~> 3.0)
+      http (~> 4.0)
       nokogiri (~> 1.8)
       oj (~> 3.0)
-    hamlit (2.9.3)
-      temple (>= 0.8.0)
+    hamlit (2.11.0)
+      temple (>= 0.8.2)
       thor
       tilt
     hamlit-rails (0.2.3)
@@ -288,28 +267,29 @@ GEM
       concurrent-ruby (~> 1.0)
     hashdiff (1.0.0)
     hashie (3.6.0)
-    heapy (0.1.4)
-    highline (2.0.1)
+    highline (2.0.3)
     hiredis (0.6.3)
     hkdf (0.3.0)
     html2text (0.2.1)
       nokogiri (~> 1.6)
     htmlentities (4.3.4)
-    http (3.3.0)
+    http (4.3.0)
       addressable (~> 2.3)
       http-cookie (~> 1.0)
-      http-form_data (~> 2.0)
-      http_parser.rb (~> 0.6.0)
+      http-form_data (~> 2.2)
+      http-parser (~> 1.2.0)
     http-cookie (1.0.3)
       domain_name (~> 0.5)
-    http-form_data (2.1.1)
+    http-form_data (2.2.0)
+    http-parser (1.2.1)
+      ffi-compiler (>= 1.0, < 2.0)
     http_accept_language (2.1.1)
-    httplog (1.3.3)
+    httplog (1.4.0)
       rack (>= 1.0)
       rainbow (>= 2.0.0)
-    i18n (1.7.0)
+    i18n (1.8.2)
       concurrent-ruby (~> 1.0)
-    i18n-tasks (0.9.29)
+    i18n-tasks (0.9.30)
       activesupport (>= 4.0.2)
       ast (>= 2.1.0)
       erubi
@@ -324,8 +304,15 @@ GEM
     iso-639 (0.2.8)
     jaro_winkler (1.5.4)
     jmespath (1.4.0)
-    json (2.2.0)
-    json-canonicalization (0.1.0)
+    json (2.3.0)
+    json-canonicalization (0.2.0)
+    json-ld (3.1.0)
+      htmlentities (~> 4.3)
+      json-canonicalization (~> 0.1)
+      link_header (~> 0.0, >= 0.0.8)
+      multi_json (~> 1.14)
+      rack (~> 2.0)
+      rdf (~> 3.1)
     json-ld-preloaded (3.0.6)
       json-ld (~> 3.0)
       multi_json (~> 1.12)
@@ -371,16 +358,16 @@ GEM
       redis (>= 3.0.5)
     memory_profiler (0.9.14)
     method_source (0.9.2)
-    microformats (4.1.0)
-      json (~> 2.1)
-      nokogiri (~> 1.8, >= 1.8.3)
-    mime-types (3.3)
+    microformats (4.2.0)
+      json (~> 2.2)
+      nokogiri (~> 1.10)
+    mime-types (3.3.1)
       mime-types-data (~> 3.2015)
-    mime-types-data (3.2019.0904)
+    mime-types-data (3.2019.1009)
     mimemagic (0.3.3)
     mini_mime (1.0.2)
     mini_portile2 (2.4.0)
-    minitest (5.13.0)
+    minitest (5.14.0)
     msgpack (1.3.1)
     multi_json (1.14.1)
     multipart-post (2.1.1)
@@ -399,7 +386,7 @@ GEM
       concurrent-ruby (~> 1.0, >= 1.0.2)
       sidekiq (>= 3.5)
       statsd-ruby (~> 1.4, >= 1.4.0)
-    oj (3.10.0)
+    oj (3.10.1)
     omniauth (1.9.0)
       hashie (>= 3.4.6, < 3.7.0)
       rack (>= 1.6.2, < 3)
@@ -411,11 +398,7 @@ GEM
       omniauth (~> 1.3, >= 1.3.2)
       ruby-saml (~> 1.7)
     orm_adapter (0.5.0)
-    ostatus2 (2.0.3)
-      addressable (~> 2.5)
-      http (~> 3.0)
-      nokogiri (~> 1.8)
-    ox (2.11.0)
+    ox (2.12.1)
     paperclip (6.0.0)
       activemodel (>= 4.2.0)
       activesupport (>= 4.2.0)
@@ -426,15 +409,15 @@ GEM
       av (~> 0.9.0)
       paperclip (>= 2.5.2)
     parallel (1.19.1)
-    parallel_tests (2.30.0)
+    parallel_tests (2.30.1)
       parallel
-    parser (2.6.5.0)
+    parser (2.7.0.2)
       ast (~> 2.4.0)
     parslet (1.8.2)
     pastel (0.7.3)
       equatable (~> 0.6)
       tty-color (~> 0.5)
-    pg (1.1.4)
+    pg (1.2.2)
     pghero (2.4.1)
       activerecord (>= 5)
     pkg-config (1.4.0)
@@ -454,16 +437,16 @@ GEM
       pry (~> 0.10)
     pry-rails (0.3.9)
       pry (>= 0.10.4)
-    public_suffix (4.0.1)
+    public_suffix (4.0.3)
     puma (4.3.1)
       nio4r (~> 2.0)
     pundit (2.1.0)
       activesupport (>= 3.0.0)
     raabro (1.1.6)
-    rack (2.0.8)
+    rack (2.1.2)
     rack-attack (6.2.2)
       rack (>= 1.0, < 3)
-    rack-cors (1.1.0)
+    rack-cors (1.1.1)
       rack (>= 2.0.0)
     rack-protection (2.0.7)
       rack
@@ -506,11 +489,11 @@ GEM
       thor (>= 0.19.0, < 2.0)
     rainbow (3.0.0)
     rake (13.0.1)
-    rdf (3.0.13)
+    rdf (3.1.1)
       hamster (~> 3.0)
       link_header (~> 0.0, >= 0.0.8)
-    rdf-normalize (0.3.3)
-      rdf (>= 2.2, < 4.0)
+    rdf-normalize (0.4.0)
+      rdf (~> 3.1)
     redcarpet (3.4.0)
     redis (4.1.3)
     redis-actionpack (5.0.2)
@@ -520,7 +503,7 @@ GEM
     redis-activesupport (5.0.4)
       activesupport (>= 3, < 6)
       redis-store (>= 1.3, < 2)
-    redis-namespace (1.6.0)
+    redis-namespace (1.7.0)
       redis (>= 3.0.4)
     redis-rack (2.0.4)
       rack (>= 1.5, < 3)
@@ -532,15 +515,17 @@ GEM
     redis-store (1.5.0)
       redis (>= 2.2, < 5)
     regexp_parser (1.6.0)
-    request_store (1.4.1)
+    request_store (1.5.0)
       rack (>= 1.4)
     responders (3.0.0)
       actionpack (>= 5.0)
       railties (>= 5.0)
     rotp (2.1.2)
     rpam2 (4.0.2)
-    rqrcode (0.10.1)
+    rqrcode (1.1.2)
       chunky_png (~> 1.0)
+      rqrcode_core (~> 0.1)
+    rqrcode_core (0.1.1)
     rspec-core (3.9.0)
       rspec-support (~> 3.9.0)
     rspec-expectations (3.9.0)
@@ -561,20 +546,19 @@ GEM
       rspec-core (~> 3.0, >= 3.0.0)
       sidekiq (>= 2.4.0)
     rspec-support (3.9.0)
-    rubocop (0.78.0)
+    rubocop (0.79.0)
       jaro_winkler (~> 1.5.1)
       parallel (~> 1.10)
-      parser (>= 2.6)
+      parser (>= 2.7.0.1)
       rainbow (>= 2.2.2, < 4.0)
       ruby-progressbar (~> 1.7)
       unicode-display_width (>= 1.4.0, < 1.7)
-    rubocop-rails (2.4.0)
+    rubocop-rails (2.4.1)
       rack (>= 1.1)
       rubocop (>= 0.72.0)
     ruby-progressbar (1.10.1)
     ruby-saml (1.9.0)
       nokogiri (>= 1.5.10)
-    ruby-statistics (2.1.1)
     rufus-scheduler (3.5.2)
       fugit (~> 1.1, >= 1.1.5)
     safe_yaml (1.0.5)
@@ -618,21 +602,22 @@ GEM
     sshkit (1.20.0)
       net-scp (>= 1.1.2)
       net-ssh (>= 2.8.0)
-    stackprof (0.2.14)
+    stackprof (0.2.15)
     statsd-ruby (1.4.0)
     stoplight (2.2.0)
     streamio-ffmpeg (3.0.2)
       multi_json (~> 1.8)
     strong_migrations (0.5.1)
       activerecord (>= 5)
-    temple (0.8.1)
+    temple (0.8.2)
     terminal-table (1.8.0)
       unicode-display_width (~> 1.1, >= 1.1.1)
     terrapin (0.6.0)
       climate_control (>= 0.0.3, < 1.0)
     thor (0.20.3)
     thread_safe (0.3.6)
-    tilt (2.0.9)
+    thwait (0.1.0)
+    tilt (2.0.10)
     tty-color (0.5.0)
     tty-command (0.9.0)
       pastel (~> 0.7.0)
@@ -648,18 +633,18 @@ GEM
     tty-screen (0.7.0)
     twitter-text (1.14.7)
       unf (~> 0.1.0)
-    tzinfo (1.2.5)
+    tzinfo (1.2.6)
       thread_safe (~> 0.1)
     tzinfo-data (1.2019.3)
       tzinfo (>= 1.0.0)
     unf (0.1.4)
       unf_ext
-    unf_ext (0.0.7.5)
-    unicode-display_width (1.6.0)
-    uniform_notifier (1.12.1)
+    unf_ext (0.0.7.6)
+    unicode-display_width (1.6.1)
+    uniform_notifier (1.13.0)
     warden (1.2.8)
       rack (>= 2.0.6)
-    webmock (3.7.6)
+    webmock (3.8.0)
       addressable (>= 2.3.6)
       crack (>= 0.3.2)
       hashdiff (>= 0.4.0, < 2.0.0)
@@ -685,35 +670,35 @@ DEPENDENCIES
   active_record_query_trace (~> 1.7)
   addressable (~> 2.7)
   annotate (~> 3.0)
-  aws-sdk-s3 (~> 1.59)
+  aws-sdk-s3 (~> 1.60)
   better_errors (~> 2.5)
   binding_of_caller (~> 0.7)
   blurhash (~> 0.1)
   bootsnap (~> 1.4)
   brakeman (~> 4.7)
   browser
-  bullet (~> 6.0)
+  bullet (~> 6.1)
   bundler-audit (~> 0.6)
   capistrano (~> 3.11)
   capistrano-rails (~> 1.4)
   capistrano-rbenv (~> 2.1)
   capistrano-yarn (~> 2.0)
-  capybara (~> 3.29)
+  capybara (~> 3.30)
   charlock_holmes (~> 0.7.7)
   chewy (~> 5.1)
-  cld3 (~> 3.2.4)
+  cld3 (~> 3.2.6)
   climate_control (~> 0.2)
   concurrent-ruby
   connection_pool
-  derailed_benchmarks
   devise (~> 4.7)
   devise-two-factor (~> 3.1)
   devise_pam_authenticatable2 (~> 9.2)
   discard (~> 1.1)
   doorkeeper (~> 5.2)
   dotenv-rails (~> 2.7)
+  e2mmap (~> 0.1.0)
   fabrication (~> 2.21)
-  faker (~> 2.9)
+  faker (~> 2.10)
   fast_blank (~> 1.0)
   fastimage
   fog-core (<= 2.1.0)
@@ -725,14 +710,14 @@ DEPENDENCIES
   hiredis (~> 0.6)
   html2text
   htmlentities (~> 4.3)
-  http (~> 3.3)
+  http (~> 4.3)
   http_accept_language (~> 2.1)
   http_parser.rb (~> 0.6)!
-  httplog (~> 1.3)
+  httplog (~> 1.4)
   i18n-tasks (~> 0.9)
   idn-ruby
   iso-639
-  json-ld!
+  json-ld
   json-ld-preloaded (~> 3.0)
   kaminari (~> 1.1)
   letter_opener (~> 1.7)
@@ -742,8 +727,8 @@ DEPENDENCIES
   makara (~> 0.4)
   mario-redis-lock (~> 1.2)
   memory_profiler
-  microformats (~> 4.1)
-  mime-types (~> 3.3)
+  microformats (~> 4.2)
+  mime-types (~> 3.3.1)
   net-ldap (~> 0.16)
   nilsimsa!
   nokogiri (~> 1.10)
@@ -752,14 +737,13 @@ DEPENDENCIES
   omniauth (~> 1.9)
   omniauth-cas (~> 1.1)
   omniauth-saml (~> 1.10)
-  ostatus2 (~> 2.0)
-  ox (~> 2.11)
+  ox (~> 2.12)
   paperclip (~> 6.0)
   paperclip-av-transcoder (~> 0.6)
   parallel (~> 1.19)
   parallel_tests (~> 2.30)
   parslet
-  pg (~> 1.1)
+  pg (~> 1.2)
   pghero (~> 2.4)
   pkg-config (~> 1.4)
   posix-spawn!
@@ -769,21 +753,22 @@ DEPENDENCIES
   pry-rails (~> 0.3)
   puma (~> 4.3)
   pundit (~> 2.1)
+  rack (~> 2.1.2)
   rack-attack (~> 6.2)
   rack-cors (~> 1.1)
   rails (~> 5.2.4)
   rails-controller-testing (~> 1.0)
   rails-i18n (~> 5.1)
   rails-settings-cached (~> 0.6)
-  rdf-normalize (~> 0.3)
+  rdf-normalize (~> 0.4)
   redcarpet (~> 3.4)
   redis (~> 4.1)
-  redis-namespace (~> 1.5)
+  redis-namespace (~> 1.7)
   redis-rails (~> 5.0)
-  rqrcode (~> 0.10)
+  rqrcode (~> 1.1)
   rspec-rails (~> 3.9)
   rspec-sidekiq (~> 3.0)
-  rubocop (~> 0.78)
+  rubocop (~> 0.79)
   rubocop-rails (~> 2.4)
   ruby-progressbar (~> 1.10)
   sanitize (~> 5.1)
@@ -794,23 +779,18 @@ DEPENDENCIES
   simple-navigation (~> 4.1)
   simple_form (~> 5.0)
   simplecov (~> 0.17)
-  sprockets (~> 3.7)
+  sprockets (~> 3.7.2)
   sprockets-rails (~> 3.2)
   stackprof
   stoplight (~> 2.2.0)
   streamio-ffmpeg (~> 3.0)
   strong_migrations (~> 0.5)
   thor (~> 0.20)
+  thwait (~> 0.1.0)
   tty-command (~> 0.9)
   tty-prompt (~> 0.20)
   twitter-text (~> 1.14)
   tzinfo-data (~> 1.2019)
-  webmock (~> 3.7)
+  webmock (~> 3.8)
   webpacker (~> 4.2)
   webpush
-
-RUBY VERSION
-   ruby 2.6.5p114
-
-BUNDLED WITH
-   1.17.3
diff --git a/Vagrantfile b/Vagrantfile
index f7195a9c1..e00ed1ca6 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -12,7 +12,7 @@ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
 sudo apt-add-repository 'deb https://dl.yarnpkg.com/debian/ stable main'
 
 # Add repo for NodeJS
-curl -sL https://deb.nodesource.com/setup_8.x | sudo bash -
+curl -sL https://deb.nodesource.com/setup_10.x | sudo bash -
 
 # Add firewall rule to redirect 80 to PORT and save
 sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port #{ENV["PORT"]}
diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb
index 68b6352f8..7b1783542 100644
--- a/app/controllers/admin/accounts_controller.rb
+++ b/app/controllers/admin/accounts_controller.rb
@@ -109,21 +109,7 @@ module Admin
     end
 
     def filter_params
-      params.permit(
-        :local,
-        :remote,
-        :by_domain,
-        :active,
-        :pending,
-        :disabled,
-        :silenced,
-        :suspended,
-        :username,
-        :display_name,
-        :email,
-        :ip,
-        :staff
-      )
+      params.slice(*AccountFilter::KEYS).permit(*AccountFilter::KEYS)
     end
   end
 end
diff --git a/app/controllers/admin/announcements_controller.rb b/app/controllers/admin/announcements_controller.rb
new file mode 100644
index 000000000..494fd13d0
--- /dev/null
+++ b/app/controllers/admin/announcements_controller.rb
@@ -0,0 +1,88 @@
+# frozen_string_literal: true
+
+class Admin::AnnouncementsController < Admin::BaseController
+  before_action :set_announcements, only: :index
+  before_action :set_announcement, except: [:index, :new, :create]
+
+  def index
+    authorize :announcement, :index?
+  end
+
+  def new
+    authorize :announcement, :create?
+
+    @announcement = Announcement.new
+  end
+
+  def create
+    authorize :announcement, :create?
+
+    @announcement = Announcement.new(resource_params)
+
+    if @announcement.save
+      PublishScheduledAnnouncementWorker.perform_async(@announcement.id) if @announcement.published?
+      log_action :create, @announcement
+      redirect_to admin_announcements_path, notice: @announcement.published? ? I18n.t('admin.announcements.published_msg') : I18n.t('admin.announcements.scheduled_msg')
+    else
+      render :new
+    end
+  end
+
+  def edit
+    authorize :announcement, :update?
+  end
+
+  def update
+    authorize :announcement, :update?
+
+    if @announcement.update(resource_params)
+      PublishScheduledAnnouncementWorker.perform_async(@announcement.id) if @announcement.published?
+      log_action :update, @announcement
+      redirect_to admin_announcements_path, notice: I18n.t('admin.announcements.updated_msg')
+    else
+      render :edit
+    end
+  end
+
+  def publish
+    authorize :announcement, :update?
+    @announcement.publish!
+    PublishScheduledAnnouncementWorker.perform_async(@announcement.id)
+    log_action :update, @announcement
+    redirect_to admin_announcements_path, notice: I18n.t('admin.announcements.published_msg')
+  end
+
+  def unpublish
+    authorize :announcement, :update?
+    @announcement.unpublish!
+    UnpublishAnnouncementWorker.perform_async(@announcement.id)
+    log_action :update, @announcement
+    redirect_to admin_announcements_path, notice: I18n.t('admin.announcements.unpublished_msg')
+  end
+
+  def destroy
+    authorize :announcement, :destroy?
+    @announcement.destroy!
+    UnpublishAnnouncementWorker.perform_async(@announcement.id) if @announcement.published?
+    log_action :destroy, @announcement
+    redirect_to admin_announcements_path, notice: I18n.t('admin.announcements.destroyed_msg')
+  end
+
+  private
+
+  def set_announcements
+    @announcements = AnnouncementFilter.new(filter_params).results.page(params[:page])
+  end
+
+  def set_announcement
+    @announcement = Announcement.find(params[:id])
+  end
+
+  def filter_params
+    params.slice(*AnnouncementFilter::KEYS).permit(*AnnouncementFilter::KEYS)
+  end
+
+  def resource_params
+    params.require(:announcement).permit(:text, :scheduled_at, :starts_at, :ends_at, :all_day)
+  end
+end
diff --git a/app/controllers/admin/custom_emojis_controller.rb b/app/controllers/admin/custom_emojis_controller.rb
index 2af90f051..efa8f2950 100644
--- a/app/controllers/admin/custom_emojis_controller.rb
+++ b/app/controllers/admin/custom_emojis_controller.rb
@@ -2,10 +2,6 @@
 
 module Admin
   class CustomEmojisController < BaseController
-    include ObfuscateFilename
-
-    obfuscate_filename [:custom_emoji, :image]
-
     def index
       authorize :custom_emoji, :index?
 
@@ -52,7 +48,7 @@ module Admin
     end
 
     def filter_params
-      params.slice(:local, :remote, :by_domain, :shortcode, :page).permit(:local, :remote, :by_domain, :shortcode, :page)
+      params.slice(:page, *CustomEmojiFilter::KEYS).permit(:page, *CustomEmojiFilter::KEYS)
     end
 
     def action_from_button
diff --git a/app/controllers/admin/followers_controller.rb b/app/controllers/admin/followers_controller.rb
deleted file mode 100644
index d826f47c5..000000000
--- a/app/controllers/admin/followers_controller.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-# frozen_string_literal: true
-
-module Admin
-  class FollowersController < BaseController
-    before_action :set_account
-
-    PER_PAGE = 40
-
-    def index
-      authorize :account, :index?
-      @followers = @account.followers.local.recent.page(params[:page]).per(PER_PAGE)
-    end
-
-    def set_account
-      @account = Account.find(params[:account_id])
-    end
-  end
-end
diff --git a/app/controllers/admin/instances_controller.rb b/app/controllers/admin/instances_controller.rb
index b47b18f8e..2fc041207 100644
--- a/app/controllers/admin/instances_controller.rb
+++ b/app/controllers/admin/instances_controller.rb
@@ -62,7 +62,7 @@ module Admin
     end
 
     def filter_params
-      params.permit(:limited, :by_domain)
+      params.slice(*InstanceFilter::KEYS).permit(*InstanceFilter::KEYS)
     end
   end
 end
diff --git a/app/controllers/admin/invites_controller.rb b/app/controllers/admin/invites_controller.rb
index 44a8eec77..dabfe9765 100644
--- a/app/controllers/admin/invites_controller.rb
+++ b/app/controllers/admin/invites_controller.rb
@@ -47,7 +47,7 @@ module Admin
     end
 
     def filter_params
-      params.permit(:available, :expired)
+      params.slice(*InviteFilter::KEYS).permit(*InviteFilter::KEYS)
     end
   end
 end
diff --git a/app/controllers/admin/relationships_controller.rb b/app/controllers/admin/relationships_controller.rb
new file mode 100644
index 000000000..f8a95cfc8
--- /dev/null
+++ b/app/controllers/admin/relationships_controller.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Admin
+  class RelationshipsController < BaseController
+    before_action :set_account
+
+    PER_PAGE = 40
+
+    def index
+      authorize :account, :index?
+
+      @accounts = RelationshipFilter.new(@account, filter_params).results.page(params[:page]).per(PER_PAGE)
+    end
+
+    private
+
+    def set_account
+      @account = Account.find(params[:account_id])
+    end
+
+    def filter_params
+      params.slice(*RelationshipFilter::KEYS).permit(*RelationshipFilter::KEYS)
+    end
+  end
+end
diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb
index 09ce1761c..7c831b3d4 100644
--- a/app/controllers/admin/reports_controller.rb
+++ b/app/controllers/admin/reports_controller.rb
@@ -52,12 +52,7 @@ module Admin
     end
 
     def filter_params
-      params.permit(
-        :account_id,
-        :resolved,
-        :target_account_id,
-        :by_target_domain
-      )
+      params.slice(*ReportFilter::KEYS).permit(*ReportFilter::KEYS)
     end
 
     def set_report
diff --git a/app/controllers/admin/tags_controller.rb b/app/controllers/admin/tags_controller.rb
index 65341bbfb..59df4470e 100644
--- a/app/controllers/admin/tags_controller.rb
+++ b/app/controllers/admin/tags_controller.rb
@@ -73,7 +73,7 @@ module Admin
     end
 
     def filter_params
-      params.slice(:directory, :reviewed, :unreviewed, :pending_review, :page, :popular, :active, :name).permit(:directory, :reviewed, :unreviewed, :pending_review, :page, :popular, :active, :name)
+      params.slice(:page, *TagFilter::KEYS).permit(:page, *TagFilter::KEYS)
     end
 
     def tag_params
diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb
index 144fdd6ac..68bf425f4 100644
--- a/app/controllers/api/base_controller.rb
+++ b/app/controllers/api/base_controller.rb
@@ -85,7 +85,7 @@ class Api::BaseController < ApplicationController
   end
 
   def require_authenticated_user!
-    render json: { error: 'This API requires an authenticated user' }, status: 401 unless current_user
+    render json: { error: 'This method requires an authenticated user' }, status: 401 unless current_user
   end
 
   def require_user!
diff --git a/app/controllers/api/oembed_controller.rb b/app/controllers/api/oembed_controller.rb
index 37a163cd3..66da65bed 100644
--- a/app/controllers/api/oembed_controller.rb
+++ b/app/controllers/api/oembed_controller.rb
@@ -1,15 +1,25 @@
 # frozen_string_literal: true
 
 class Api::OEmbedController < Api::BaseController
-  respond_to :json
+  skip_before_action :require_authenticated_user!
+
+  before_action :set_status
+  before_action :require_public_status!
 
   def show
-    @status = status_finder.status
     render json: @status, serializer: OEmbedSerializer, width: maxwidth_or_default, height: maxheight_or_default
   end
 
   private
 
+  def set_status
+    @status = status_finder.status
+  end
+
+  def require_public_status!
+    not_found if @status.hidden?
+  end
+
   def status_finder
     StatusFinder.new(params[:url])
   end
diff --git a/app/controllers/api/v1/accounts/follower_accounts_controller.rb b/app/controllers/api/v1/accounts/follower_accounts_controller.rb
index 2dabb8398..e360b8a92 100644
--- a/app/controllers/api/v1/accounts/follower_accounts_controller.rb
+++ b/app/controllers/api/v1/accounts/follower_accounts_controller.rb
@@ -21,11 +21,13 @@ class Api::V1::Accounts::FollowerAccountsController < Api::BaseController
   def load_accounts
     return [] if hide_results?
 
-    default_accounts.merge(paginated_follows).to_a
+    scope = default_accounts
+    scope = scope.where.not(id: current_account.excluded_from_timeline_account_ids) unless current_account.nil?
+    scope.merge(paginated_follows).to_a
   end
 
   def hide_results?
-    (@account.user_hides_network? && current_account.id != @account.id) || (current_account && @account.blocking?(current_account))
+    (@account.user_hides_network? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account))
   end
 
   def default_accounts
diff --git a/app/controllers/api/v1/accounts/following_accounts_controller.rb b/app/controllers/api/v1/accounts/following_accounts_controller.rb
index 44e89804b..a405b365f 100644
--- a/app/controllers/api/v1/accounts/following_accounts_controller.rb
+++ b/app/controllers/api/v1/accounts/following_accounts_controller.rb
@@ -21,11 +21,13 @@ class Api::V1::Accounts::FollowingAccountsController < Api::BaseController
   def load_accounts
     return [] if hide_results?
 
-    default_accounts.merge(paginated_follows).to_a
+    scope = default_accounts
+    scope = scope.where.not(id: current_account.excluded_from_timeline_account_ids) unless current_account.nil?
+    scope.merge(paginated_follows).to_a
   end
 
   def hide_results?
-    (@account.user_hides_network? && current_account.id != @account.id) || (current_account && @account.blocking?(current_account))
+    (@account.user_hides_network? && current_account&.id != @account.id) || (current_account && @account.blocking?(current_account))
   end
 
   def default_accounts
diff --git a/app/controllers/api/v1/announcements/reactions_controller.rb b/app/controllers/api/v1/announcements/reactions_controller.rb
new file mode 100644
index 000000000..e4a72e595
--- /dev/null
+++ b/app/controllers/api/v1/announcements/reactions_controller.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class Api::V1::Announcements::ReactionsController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :write, :'write:favourites' }
+  before_action :require_user!
+
+  before_action :set_announcement
+  before_action :set_reaction, except: :update
+
+  def update
+    @announcement.announcement_reactions.create!(account: current_account, name: params[:id])
+    render_empty
+  end
+
+  def destroy
+    @reaction.destroy!
+    render_empty
+  end
+
+  private
+
+  def set_reaction
+    @reaction = @announcement.announcement_reactions.where(account: current_account).find_by!(name: params[:id])
+  end
+
+  def set_announcement
+    @announcement = Announcement.published.find(params[:announcement_id])
+  end
+end
diff --git a/app/controllers/api/v1/announcements_controller.rb b/app/controllers/api/v1/announcements_controller.rb
new file mode 100644
index 000000000..1e692ff75
--- /dev/null
+++ b/app/controllers/api/v1/announcements_controller.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class Api::V1::AnnouncementsController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :write, :'write:accounts' }, only: :dismiss
+  before_action :require_user!
+  before_action :set_announcements, only: :index
+  before_action :set_announcement, except: :index
+
+  def index
+    render json: @announcements, each_serializer: REST::AnnouncementSerializer
+  end
+
+  def dismiss
+    AnnouncementMute.create!(account: current_account, announcement: @announcement)
+    render_empty
+  end
+
+  private
+
+  def set_announcements
+    @announcements = begin
+      Announcement.published.chronological
+    end
+  end
+
+  def set_announcement
+    @announcement = Announcement.published.find(params[:id])
+  end
+end
diff --git a/app/controllers/api/v1/media_controller.rb b/app/controllers/api/v1/media_controller.rb
index aaa93b615..81825db15 100644
--- a/app/controllers/api/v1/media_controller.rb
+++ b/app/controllers/api/v1/media_controller.rb
@@ -4,9 +4,6 @@ class Api::V1::MediaController < Api::BaseController
   before_action -> { doorkeeper_authorize! :write, :'write:media' }
   before_action :require_user!
 
-  include ObfuscateFilename
-  obfuscate_filename :file
-
   respond_to :json
 
   def create
diff --git a/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb b/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb
index 657e57831..99eff360e 100644
--- a/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb
+++ b/app/controllers/api/v1/statuses/favourited_by_accounts_controller.rb
@@ -17,7 +17,9 @@ class Api::V1::Statuses::FavouritedByAccountsController < Api::BaseController
   private
 
   def load_accounts
-    default_accounts.merge(paginated_favourites).to_a
+    scope = default_accounts
+    scope = scope.where.not(id: current_account.excluded_from_timeline_account_ids) unless current_account.nil?
+    scope.merge(paginated_favourites).to_a
   end
 
   def default_accounts
diff --git a/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb b/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb
index 6851099f6..cc285ad23 100644
--- a/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb
+++ b/app/controllers/api/v1/statuses/reblogged_by_accounts_controller.rb
@@ -17,7 +17,9 @@ class Api::V1::Statuses::RebloggedByAccountsController < Api::BaseController
   private
 
   def load_accounts
-    default_accounts.merge(paginated_statuses).to_a
+    scope = default_accounts
+    scope = scope.where.not(id: current_account.excluded_from_timeline_account_ids) unless current_account.nil?
+    scope.merge(paginated_statuses).to_a
   end
 
   def default_accounts
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index f1a4f0d02..c882d40ab 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -25,6 +25,7 @@ class ApplicationController < ActionController::Base
   rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_entity
   rescue_from ActionController::UnknownFormat, with: :not_acceptable
   rescue_from ActionController::ParameterMissing, with: :bad_request
+  rescue_from Paperclip::AdapterRegistry::NoHandlerError, with: :bad_request
   rescue_from ActiveRecord::RecordNotFound, with: :not_found
   rescue_from Mastodon::NotPermittedError, with: :forbidden
   rescue_from HTTP::Error, OpenSSL::SSL::SSLError, with: :internal_server_error
@@ -211,7 +212,12 @@ class ApplicationController < ActionController::Base
   end
 
   def respond_with_error(code)
-    use_pack 'error'
-    render "errors/#{code}", layout: 'error', status: code, formats: [:html]
+    respond_to do |format|
+      format.any do
+        use_pack 'error'
+        render "errors/#{code}", layout: 'error', status: code, formats: [:html]
+      end
+      format.json { render json: { error: Rack::Utils::HTTP_STATUS_CODES[code] }, status: code }
+    end
   end
 end
diff --git a/app/controllers/auth/passwords_controller.rb b/app/controllers/auth/passwords_controller.rb
index a59806f0d..c224e1a03 100644
--- a/app/controllers/auth/passwords_controller.rb
+++ b/app/controllers/auth/passwords_controller.rb
@@ -7,6 +7,12 @@ class Auth::PasswordsController < Devise::PasswordsController
 
   layout 'auth'
 
+  def update
+    super do |resource|
+      resource.session_activations.destroy_all if resource.errors.empty?
+    end
+  end
+
   private
 
   def check_validity_of_reset_password_token
diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb
index 068375843..531df7751 100644
--- a/app/controllers/auth/registrations_controller.rb
+++ b/app/controllers/auth/registrations_controller.rb
@@ -11,6 +11,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController
   before_action :set_instance_presenter, only: [:new, :create, :update]
   before_action :set_body_classes, only: [:new, :create, :edit, :update]
   before_action :require_not_suspended!, only: [:update]
+  before_action :set_cache_headers, only: [:edit, :update]
 
   skip_before_action :require_functional!, only: [:edit, :update]
 
@@ -22,10 +23,17 @@ class Auth::RegistrationsController < Devise::RegistrationsController
     not_found
   end
 
+  def update
+    super do |resource|
+      resource.clear_other_sessions(current_session.session_id) if resource.saved_change_to_encrypted_password?
+    end
+  end
+
   protected
 
   def update_resource(resource, params)
     params[:password] = nil if Devise.pam_authentication && resource.encrypted_password.blank?
+
     super
   end
 
@@ -114,4 +122,8 @@ class Auth::RegistrationsController < Devise::RegistrationsController
   def require_not_suspended!
     forbidden if current_account.suspended?
   end
+
+  def set_cache_headers
+    response.headers['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate'
+  end
 end
diff --git a/app/controllers/concerns/obfuscate_filename.rb b/app/controllers/concerns/obfuscate_filename.rb
deleted file mode 100644
index 22736ec3a..000000000
--- a/app/controllers/concerns/obfuscate_filename.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-module ObfuscateFilename
-  extend ActiveSupport::Concern
-
-  class_methods do
-    def obfuscate_filename(path)
-      before_action do
-        file = params.dig(*path)
-        next if file.nil?
-
-        file.original_filename = SecureRandom.hex(8) + File.extname(file.original_filename)
-      end
-    end
-  end
-end
diff --git a/app/controllers/filters_controller.rb b/app/controllers/filters_controller.rb
index f1e110d87..76be03e53 100644
--- a/app/controllers/filters_controller.rb
+++ b/app/controllers/filters_controller.rb
@@ -1,10 +1,9 @@
 # frozen_string_literal: true
 
 class FiltersController < ApplicationController
-  include Authorization
-
   layout 'admin'
 
+  before_action :authenticate_user!
   before_action :set_filters, only: :index
   before_action :set_filter, only: [:edit, :update, :destroy]
   before_action :set_pack
diff --git a/app/controllers/follower_accounts_controller.rb b/app/controllers/follower_accounts_controller.rb
index df46f5f72..a5dfffd6d 100644
--- a/app/controllers/follower_accounts_controller.rb
+++ b/app/controllers/follower_accounts_controller.rb
@@ -19,7 +19,6 @@ class FollowerAccountsController < ApplicationController
         next if @account.user_hides_network?
 
         follows
-        @relationships = AccountRelationshipsPresenter.new(follows.map(&:account_id), current_user.account_id) if user_signed_in?
       end
 
       format.json do
@@ -38,7 +37,11 @@ class FollowerAccountsController < ApplicationController
   private
 
   def follows
-    @follows ||= Follow.where(target_account: @account).recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:account)
+    return @follows if defined?(@follows)
+
+    scope = Follow.where(target_account: @account)
+    scope = scope.where.not(account_id: current_account.excluded_from_timeline_account_ids) if user_signed_in?
+    @follows = scope.recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:account)
   end
 
   def page_requested?
diff --git a/app/controllers/following_accounts_controller.rb b/app/controllers/following_accounts_controller.rb
index 8cab67ff5..ff23d97f9 100644
--- a/app/controllers/following_accounts_controller.rb
+++ b/app/controllers/following_accounts_controller.rb
@@ -19,7 +19,6 @@ class FollowingAccountsController < ApplicationController
         next if @account.user_hides_network?
 
         follows
-        @relationships = AccountRelationshipsPresenter.new(follows.map(&:target_account_id), current_user.account_id) if user_signed_in?
       end
 
       format.json do
@@ -38,7 +37,11 @@ class FollowingAccountsController < ApplicationController
   private
 
   def follows
-    @follows ||= Follow.where(account: @account).recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:target_account)
+    return @follows if defined?(@follows)
+
+    scope = Follow.where(account: @account)
+    scope = scope.where.not(target_account_id: current_account.excluded_from_timeline_account_ids) if user_signed_in?
+    @follows = scope.recent.page(params[:page]).per(FOLLOW_PER_PAGE).preload(:target_account)
   end
 
   def page_requested?
diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb
index f6f5d1ecc..137346ed0 100644
--- a/app/controllers/oauth/authorizations_controller.rb
+++ b/app/controllers/oauth/authorizations_controller.rb
@@ -6,6 +6,7 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
   before_action :store_current_location
   before_action :authenticate_resource_owner!
   before_action :set_pack
+  before_action :set_cache_headers
 
   include Localized
 
@@ -32,4 +33,8 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
   def truthy_param?(key)
     ActiveModel::Type::Boolean.new.cast(params[key])
   end
+
+  def set_cache_headers
+    response.headers['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate'
+  end
 end
diff --git a/app/controllers/relationships_controller.rb b/app/controllers/relationships_controller.rb
index c87a0cf13..f1ab980c8 100644
--- a/app/controllers/relationships_controller.rb
+++ b/app/controllers/relationships_controller.rb
@@ -20,53 +20,13 @@ class RelationshipsController < ApplicationController
   rescue ActionController::ParameterMissing
     # Do nothing
   ensure
-    redirect_to relationships_path(current_params)
+    redirect_to relationships_path(filter_params)
   end
 
   private
 
   def set_accounts
-    @accounts = relationships_scope.page(params[:page]).per(40)
-  end
-
-  def relationships_scope
-    scope = begin
-      if following_relationship?
-        current_account.following.eager_load(:account_stat).reorder(nil)
-      else
-        current_account.followers.eager_load(:account_stat).reorder(nil)
-      end
-    end
-
-    scope.merge!(Follow.recent)             if params[:order].blank? || params[:order] == 'recent'
-    scope.merge!(Account.by_recent_status)  if params[:order] == 'active'
-    scope.merge!(mutual_relationship_scope) if mutual_relationship?
-    scope.merge!(moved_account_scope)       if params[:status] == 'moved'
-    scope.merge!(primary_account_scope)     if params[:status] == 'primary'
-    scope.merge!(by_domain_scope)           if params[:by_domain].present?
-    scope.merge!(dormant_account_scope)     if params[:activity] == 'dormant'
-
-    scope
-  end
-
-  def mutual_relationship_scope
-    Account.where(id: current_account.following)
-  end
-
-  def moved_account_scope
-    Account.where.not(moved_to_account_id: nil)
-  end
-
-  def primary_account_scope
-    Account.where(moved_to_account_id: nil)
-  end
-
-  def dormant_account_scope
-    AccountStat.where(last_status_at: nil).or(AccountStat.where(AccountStat.arel_table[:last_status_at].lt(1.month.ago)))
-  end
-
-  def by_domain_scope
-    Account.where(domain: params[:by_domain])
+    @accounts = RelationshipFilter.new(current_account, filter_params).results.page(params[:page]).per(40)
   end
 
   def form_account_batch_params
@@ -85,8 +45,8 @@ class RelationshipsController < ApplicationController
     params[:relationship] == 'followed_by'
   end
 
-  def current_params
-    params.slice(:page, :status, :relationship, :by_domain, :activity, :order).permit(:page, :status, :relationship, :by_domain, :activity, :order)
+  def filter_params
+    params.slice(:page, *RelationshipFilter::KEYS).permit(:page, *RelationshipFilter::KEYS)
   end
 
   def action_from_button
diff --git a/app/controllers/settings/base_controller.rb b/app/controllers/settings/base_controller.rb
index 8c394a6d3..b97603af6 100644
--- a/app/controllers/settings/base_controller.rb
+++ b/app/controllers/settings/base_controller.rb
@@ -3,6 +3,7 @@
 class Settings::BaseController < ApplicationController
   before_action :set_pack
   before_action :set_body_classes
+  before_action :set_cache_headers
 
   private
 
@@ -13,4 +14,8 @@ class Settings::BaseController < ApplicationController
   def set_body_classes
     @body_classes = 'admin'
   end
+
+  def set_cache_headers
+    response.headers['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate'
+  end
 end
diff --git a/app/controllers/settings/profiles_controller.rb b/app/controllers/settings/profiles_controller.rb
index 8b640cdca..19a7ce157 100644
--- a/app/controllers/settings/profiles_controller.rb
+++ b/app/controllers/settings/profiles_controller.rb
@@ -1,16 +1,11 @@
 # frozen_string_literal: true
 
 class Settings::ProfilesController < Settings::BaseController
-  include ObfuscateFilename
-
   layout 'admin'
 
   before_action :authenticate_user!
   before_action :set_account
 
-  obfuscate_filename [:account, :avatar]
-  obfuscate_filename [:account, :header]
-
   def show
     @account.build_fields
   end
diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb
index 1b00d38c9..588063d01 100644
--- a/app/controllers/statuses_controller.rb
+++ b/app/controllers/statuses_controller.rb
@@ -49,7 +49,7 @@ class StatusesController < ApplicationController
 
   def embed
     use_pack 'embed'
-    raise ActiveRecord::RecordNotFound if @status.hidden?
+    return not_found if @status.hidden?
 
     expires_in 180, public: true
     response.headers['X-Frame-Options'] = 'ALLOWALL'
@@ -71,7 +71,7 @@ class StatusesController < ApplicationController
     @status = @account.statuses.find(params[:id])
     authorize @status, :show?
   rescue Mastodon::NotPermittedError
-    raise ActiveRecord::RecordNotFound
+    not_found
   end
 
   def set_instance_presenter
diff --git a/app/controllers/well_known/host_meta_controller.rb b/app/controllers/well_known/host_meta_controller.rb
index 2e9298c4a..2fd6bc7cc 100644
--- a/app/controllers/well_known/host_meta_controller.rb
+++ b/app/controllers/well_known/host_meta_controller.rb
@@ -8,12 +8,8 @@ module WellKnown
 
     def show
       @webfinger_template = "#{webfinger_url}?resource={uri}"
-
-      respond_to do |format|
-        format.xml { render content_type: 'application/xrd+xml' }
-      end
-
       expires_in 3.days, public: true
+      render content_type: 'application/xrd+xml', formats: [:xml]
     end
   end
 end
diff --git a/app/helpers/accounts_helper.rb b/app/helpers/accounts_helper.rb
index 7fcc4e816..c9e95d8d8 100644
--- a/app/helpers/accounts_helper.rb
+++ b/app/helpers/accounts_helper.rb
@@ -3,7 +3,7 @@
 module AccountsHelper
   def display_name(account, **options)
     if options[:custom_emojify]
-      Formatter.instance.format_display_name(account, options)
+      Formatter.instance.format_display_name(account, **options)
     else
       account.display_name.presence || account.username
     end
@@ -13,7 +13,7 @@ module AccountsHelper
     if account.local?
       "@#{account.acct}@#{Rails.configuration.x.local_domain}"
     else
-      "@#{account.acct}"
+      "@#{account.pretty_acct}"
     end
   end
 
diff --git a/app/helpers/admin/action_logs_helper.rb b/app/helpers/admin/action_logs_helper.rb
index 608a99dd5..6bc75aa56 100644
--- a/app/helpers/admin/action_logs_helper.rb
+++ b/app/helpers/admin/action_logs_helper.rb
@@ -22,6 +22,8 @@ module Admin::ActionLogsHelper
       log.recorded_changes.slice('severity', 'reject_media')
     elsif log.target_type == 'Status' && log.action == :update
       log.recorded_changes.slice('sensitive')
+    elsif log.target_type == 'Announcement' && log.action == :update
+      log.recorded_changes.slice('text', 'starts_at', 'ends_at', 'all_day')
     end
   end
 
@@ -52,6 +54,8 @@ module Admin::ActionLogsHelper
       'pencil'
     when 'AccountWarning'
       'warning'
+    when 'Announcement'
+      'bullhorn'
     end
   end
 
@@ -94,6 +98,8 @@ module Admin::ActionLogsHelper
       link_to record.account.acct, ActivityPub::TagManager.instance.url_for(record)
     when 'AccountWarning'
       link_to record.target_account.acct, admin_account_path(record.target_account_id)
+    when 'Announcement'
+      link_to "##{record.id}", edit_admin_announcement_path(record.id)
     end
   end
 
@@ -111,6 +117,8 @@ module Admin::ActionLogsHelper
       else
         I18n.t('admin.action_logs.deleted_status')
       end
+    when 'Announcement'
+      "##{attributes['id']}"
     end
   end
 end
diff --git a/app/helpers/admin/announcements_helper.rb b/app/helpers/admin/announcements_helper.rb
new file mode 100644
index 000000000..0c053ddec
--- /dev/null
+++ b/app/helpers/admin/announcements_helper.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Admin::AnnouncementsHelper
+  def time_range(announcement)
+    if announcement.all_day?
+      safe_join([l(announcement.starts_at.to_date), ' - ', l(announcement.ends_at.to_date)])
+    else
+      safe_join([l(announcement.starts_at), ' - ', l(announcement.ends_at)])
+    end
+  end
+end
diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb
index fc4f15985..6ab92939d 100644
--- a/app/helpers/admin/filter_helper.rb
+++ b/app/helpers/admin/filter_helper.rb
@@ -1,15 +1,16 @@
 # frozen_string_literal: true
 
 module Admin::FilterHelper
-  ACCOUNT_FILTERS      = %i(local remote by_domain active pending silenced suspended username display_name email ip staff).freeze
-  REPORT_FILTERS       = %i(resolved account_id target_account_id by_target_domain).freeze
-  INVITE_FILTER        = %i(available expired).freeze
-  CUSTOM_EMOJI_FILTERS = %i(local remote by_domain shortcode).freeze
-  TAGS_FILTERS         = %i(directory reviewed unreviewed pending_review popular active name).freeze
-  INSTANCES_FILTERS    = %i(limited by_domain).freeze
-  FOLLOWERS_FILTERS    = %i(relationship status by_domain activity order).freeze
-
-  FILTERS = ACCOUNT_FILTERS + REPORT_FILTERS + INVITE_FILTER + CUSTOM_EMOJI_FILTERS + TAGS_FILTERS + INSTANCES_FILTERS + FOLLOWERS_FILTERS
+  FILTERS = [
+    AccountFilter::KEYS,
+    CustomEmojiFilter::KEYS,
+    ReportFilter::KEYS,
+    TagFilter::KEYS,
+    InstanceFilter::KEYS,
+    InviteFilter::KEYS,
+    RelationshipFilter::KEYS,
+    AnnouncementFilter::KEYS,
+  ].flatten.freeze
 
   def filter_link_to(text, link_to_params, link_class_params = link_to_params)
     new_url   = filtered_url_for(link_to_params)
diff --git a/app/helpers/routing_helper.rb b/app/helpers/routing_helper.rb
index 998b7566f..fb24a1b28 100644
--- a/app/helpers/routing_helper.rb
+++ b/app/helpers/routing_helper.rb
@@ -13,13 +13,13 @@ module RoutingHelper
   end
 
   def full_asset_url(source, **options)
-    source = ActionController::Base.helpers.asset_url(source, options) unless use_storage?
+    source = ActionController::Base.helpers.asset_url(source, **options) unless use_storage?
 
     URI.join(root_url, source).to_s
   end
 
   def full_pack_url(source, **options)
-    full_asset_url(asset_pack_path(source, options))
+    full_asset_url(asset_pack_path(source, **options))
   end
 
   private
diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb
index 39eb4180e..825aa974d 100644
--- a/app/helpers/settings_helper.rb
+++ b/app/helpers/settings_helper.rb
@@ -32,9 +32,11 @@ module SettingsHelper
     hy: 'Հայերեն',
     id: 'Bahasa Indonesia',
     io: 'Ido',
+    is: 'Íslenska',
     it: 'Italiano',
     ja: '日本語',
     ka: 'ქართული',
+    kab: 'Taqbaylit',
     kk: 'Қазақша',
     kn: 'ಕನ್ನಡ',
     ko: '한국어',
diff --git a/app/javascript/flavours/glitch/actions/announcements.js b/app/javascript/flavours/glitch/actions/announcements.js
new file mode 100644
index 000000000..871409d43
--- /dev/null
+++ b/app/javascript/flavours/glitch/actions/announcements.js
@@ -0,0 +1,180 @@
+import api from 'flavours/glitch/util/api';
+import { normalizeAnnouncement } from './importer/normalizer';
+
+export const ANNOUNCEMENTS_FETCH_REQUEST = 'ANNOUNCEMENTS_FETCH_REQUEST';
+export const ANNOUNCEMENTS_FETCH_SUCCESS = 'ANNOUNCEMENTS_FETCH_SUCCESS';
+export const ANNOUNCEMENTS_FETCH_FAIL    = 'ANNOUNCEMENTS_FETCH_FAIL';
+export const ANNOUNCEMENTS_UPDATE        = 'ANNOUNCEMENTS_UPDATE';
+export const ANNOUNCEMENTS_DELETE        = 'ANNOUNCEMENTS_DELETE';
+
+export const ANNOUNCEMENTS_DISMISS_REQUEST = 'ANNOUNCEMENTS_DISMISS_REQUEST';
+export const ANNOUNCEMENTS_DISMISS_SUCCESS = 'ANNOUNCEMENTS_DISMISS_SUCCESS';
+export const ANNOUNCEMENTS_DISMISS_FAIL    = 'ANNOUNCEMENTS_DISMISS_FAIL';
+
+export const ANNOUNCEMENTS_REACTION_ADD_REQUEST = 'ANNOUNCEMENTS_REACTION_ADD_REQUEST';
+export const ANNOUNCEMENTS_REACTION_ADD_SUCCESS = 'ANNOUNCEMENTS_REACTION_ADD_SUCCESS';
+export const ANNOUNCEMENTS_REACTION_ADD_FAIL    = 'ANNOUNCEMENTS_REACTION_ADD_FAIL';
+
+export const ANNOUNCEMENTS_REACTION_REMOVE_REQUEST = 'ANNOUNCEMENTS_REACTION_REMOVE_REQUEST';
+export const ANNOUNCEMENTS_REACTION_REMOVE_SUCCESS = 'ANNOUNCEMENTS_REACTION_REMOVE_SUCCESS';
+export const ANNOUNCEMENTS_REACTION_REMOVE_FAIL    = 'ANNOUNCEMENTS_REACTION_REMOVE_FAIL';
+
+export const ANNOUNCEMENTS_REACTION_UPDATE = 'ANNOUNCEMENTS_REACTION_UPDATE';
+
+export const ANNOUNCEMENTS_TOGGLE_SHOW = 'ANNOUNCEMENTS_TOGGLE_SHOW';
+
+const noOp = () => {};
+
+export const fetchAnnouncements = (done = noOp) => (dispatch, getState) => {
+  dispatch(fetchAnnouncementsRequest());
+
+  api(getState).get('/api/v1/announcements').then(response => {
+    dispatch(fetchAnnouncementsSuccess(response.data.map(x => normalizeAnnouncement(x))));
+  }).catch(error => {
+    dispatch(fetchAnnouncementsFail(error));
+  }).finally(() => {
+    done();
+  });
+};
+
+export const fetchAnnouncementsRequest = () => ({
+  type: ANNOUNCEMENTS_FETCH_REQUEST,
+  skipLoading: true,
+});
+
+export const fetchAnnouncementsSuccess = announcements => ({
+  type: ANNOUNCEMENTS_FETCH_SUCCESS,
+  announcements,
+  skipLoading: true,
+});
+
+export const fetchAnnouncementsFail= error => ({
+  type: ANNOUNCEMENTS_FETCH_FAIL,
+  error,
+  skipLoading: true,
+  skipAlert: true,
+});
+
+export const updateAnnouncements = announcement => ({
+  type: ANNOUNCEMENTS_UPDATE,
+  announcement: normalizeAnnouncement(announcement),
+});
+
+export const dismissAnnouncement = announcementId => (dispatch, getState) => {
+  dispatch(dismissAnnouncementRequest(announcementId));
+
+  api(getState).post(`/api/v1/announcements/${announcementId}/dismiss`).then(() => {
+    dispatch(dismissAnnouncementSuccess(announcementId));
+  }).catch(error => {
+    dispatch(dismissAnnouncementFail(announcementId, error));
+  });
+};
+
+export const dismissAnnouncementRequest = announcementId => ({
+  type: ANNOUNCEMENTS_DISMISS_REQUEST,
+  id: announcementId,
+});
+
+export const dismissAnnouncementSuccess = announcementId => ({
+  type: ANNOUNCEMENTS_DISMISS_SUCCESS,
+  id: announcementId,
+});
+
+export const dismissAnnouncementFail = (announcementId, error) => ({
+  type: ANNOUNCEMENTS_DISMISS_FAIL,
+  id: announcementId,
+  error,
+});
+
+export const addReaction = (announcementId, name) => (dispatch, getState) => {
+  const announcement = getState().getIn(['announcements', 'items']).find(x => x.get('id') === announcementId);
+
+  let alreadyAdded = false;
+
+  if (announcement) {
+    const reaction = announcement.get('reactions').find(x => x.get('name') === name);
+    if (reaction && reaction.get('me')) {
+      alreadyAdded = true;
+    }
+  }
+
+  if (!alreadyAdded) {
+    dispatch(addReactionRequest(announcementId, name, alreadyAdded));
+  }
+
+  api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => {
+    dispatch(addReactionSuccess(announcementId, name, alreadyAdded));
+  }).catch(err => {
+    if (!alreadyAdded) {
+      dispatch(addReactionFail(announcementId, name, err));
+    }
+  });
+};
+
+export const addReactionRequest = (announcementId, name) => ({
+  type: ANNOUNCEMENTS_REACTION_ADD_REQUEST,
+  id: announcementId,
+  name,
+  skipLoading: true,
+});
+
+export const addReactionSuccess = (announcementId, name) => ({
+  type: ANNOUNCEMENTS_REACTION_ADD_SUCCESS,
+  id: announcementId,
+  name,
+  skipLoading: true,
+});
+
+export const addReactionFail = (announcementId, name, error) => ({
+  type: ANNOUNCEMENTS_REACTION_ADD_FAIL,
+  id: announcementId,
+  name,
+  error,
+  skipLoading: true,
+});
+
+export const removeReaction = (announcementId, name) => (dispatch, getState) => {
+  dispatch(removeReactionRequest(announcementId, name));
+
+  api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => {
+    dispatch(removeReactionSuccess(announcementId, name));
+  }).catch(err => {
+    dispatch(removeReactionFail(announcementId, name, err));
+  });
+};
+
+export const removeReactionRequest = (announcementId, name) => ({
+  type: ANNOUNCEMENTS_REACTION_REMOVE_REQUEST,
+  id: announcementId,
+  name,
+  skipLoading: true,
+});
+
+export const removeReactionSuccess = (announcementId, name) => ({
+  type: ANNOUNCEMENTS_REACTION_REMOVE_SUCCESS,
+  id: announcementId,
+  name,
+  skipLoading: true,
+});
+
+export const removeReactionFail = (announcementId, name, error) => ({
+  type: ANNOUNCEMENTS_REACTION_REMOVE_FAIL,
+  id: announcementId,
+  name,
+  error,
+  skipLoading: true,
+});
+
+export const updateReaction = reaction => ({
+  type: ANNOUNCEMENTS_REACTION_UPDATE,
+  reaction,
+});
+
+export const toggleShowAnnouncements = () => ({
+  type: ANNOUNCEMENTS_TOGGLE_SHOW,
+});
+
+export const deleteAnnouncement = id => ({
+  type: ANNOUNCEMENTS_DELETE,
+  id,
+});
diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js
index f80642bd8..0be746048 100644
--- a/app/javascript/flavours/glitch/actions/compose.js
+++ b/app/javascript/flavours/glitch/actions/compose.js
@@ -91,9 +91,11 @@ export function cycleElefriendCompose() {
 
 export function replyCompose(status, routerHistory) {
   return (dispatch, getState) => {
+    const prependCWRe = getState().getIn(['local_settings', 'prepend_cw_re']);
     dispatch({
       type: COMPOSE_REPLY,
       status: status,
+      prependCWRe: prependCWRe,
     });
 
     ensureComposeIsVisible(getState, routerHistory);
diff --git a/app/javascript/flavours/glitch/actions/importer/normalizer.js b/app/javascript/flavours/glitch/actions/importer/normalizer.js
index 2bc603930..52ad17779 100644
--- a/app/javascript/flavours/glitch/actions/importer/normalizer.js
+++ b/app/javascript/flavours/glitch/actions/importer/normalizer.js
@@ -74,7 +74,6 @@ export function normalizeStatus(status, normalOldStatus) {
 
 export function normalizePoll(poll) {
   const normalPoll = { ...poll };
-
   const emojiMap = makeEmojiMap(normalPoll);
 
   normalPoll.options = poll.options.map((option, index) => ({
@@ -85,3 +84,12 @@ export function normalizePoll(poll) {
 
   return normalPoll;
 }
+
+export function normalizeAnnouncement(announcement) {
+  const normalAnnouncement = { ...announcement };
+  const emojiMap = makeEmojiMap(normalAnnouncement);
+
+  normalAnnouncement.contentHtml = emojify(normalAnnouncement.content, emojiMap);
+
+  return normalAnnouncement;
+}
diff --git a/app/javascript/flavours/glitch/actions/markers.js b/app/javascript/flavours/glitch/actions/markers.js
index c3a5fe86f..7ffab404d 100644
--- a/app/javascript/flavours/glitch/actions/markers.js
+++ b/app/javascript/flavours/glitch/actions/markers.js
@@ -1,9 +1,15 @@
+import api from 'flavours/glitch/util/api';
+
+export const MARKERS_FETCH_REQUEST = 'MARKERS_FETCH_REQUEST';
+export const MARKERS_FETCH_SUCCESS = 'MARKERS_FETCH_SUCCESS';
+export const MARKERS_FETCH_FAIL    = 'MARKERS_FETCH_FAIL';
+
 export const submitMarkers = () => (dispatch, getState) => {
   const accessToken = getState().getIn(['meta', 'access_token'], '');
   const params      = {};
 
   const lastHomeId         = getState().getIn(['timelines', 'home', 'items', 0]);
-  const lastNotificationId = getState().getIn(['notifications', 'items', 0, 'id']);
+  const lastNotificationId = getState().getIn(['notifications', 'lastReadId']);
 
   if (lastHomeId) {
     params.home = {
@@ -11,7 +17,7 @@ export const submitMarkers = () => (dispatch, getState) => {
     };
   }
 
-  if (lastNotificationId) {
+  if (lastNotificationId && lastNotificationId !== '0') {
     params.notifications = {
       last_read_id: lastNotificationId,
     };
@@ -28,3 +34,39 @@ export const submitMarkers = () => (dispatch, getState) => {
   client.setRequestHeader('Authorization', `Bearer ${accessToken}`);
   client.send(JSON.stringify(params));
 };
+
+export const fetchMarkers = () => (dispatch, getState) => {
+    const params = { timeline: ['notifications'] };
+
+    dispatch(fetchMarkersRequest());
+
+    api(getState).get('/api/v1/markers', { params }).then(response => {
+      dispatch(fetchMarkersSuccess(response.data));
+    }).catch(error => {
+      dispatch(fetchMarkersFail(error));
+    });
+};
+
+export function fetchMarkersRequest() {
+  return {
+    type: MARKERS_FETCH_REQUEST,
+    skipLoading: true,
+  };
+};
+
+export function fetchMarkersSuccess(markers) {
+  return {
+    type: MARKERS_FETCH_SUCCESS,
+    markers,
+    skipLoading: true,
+  };
+};
+
+export function fetchMarkersFail(error) {
+  return {
+    type: MARKERS_FETCH_FAIL,
+    error,
+    skipLoading: true,
+    skipAlert: true,
+  };
+};
diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js
index 940f3c3d4..b3de7b5bf 100644
--- a/app/javascript/flavours/glitch/actions/notifications.js
+++ b/app/javascript/flavours/glitch/actions/notifications.js
@@ -168,9 +168,9 @@ export function expandNotifications({ maxId } = {}, done = noOp) {
 
       dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems));
       fetchRelatedRelationships(dispatch, response.data);
-      done();
     }).catch(error => {
       dispatch(expandNotificationsFail(error, isLoadingMore));
+    }).finally(() => {
       done();
     });
   };
@@ -199,6 +199,7 @@ export function expandNotificationsFail(error, isLoadingMore) {
     type: NOTIFICATIONS_EXPAND_FAIL,
     error,
     skipLoading: !isLoadingMore,
+    skipAlert: !isLoadingMore,
   };
 };
 
diff --git a/app/javascript/flavours/glitch/actions/streaming.js b/app/javascript/flavours/glitch/actions/streaming.js
index 21379f492..2f82ea805 100644
--- a/app/javascript/flavours/glitch/actions/streaming.js
+++ b/app/javascript/flavours/glitch/actions/streaming.js
@@ -8,6 +8,12 @@ import {
 } from './timelines';
 import { updateNotifications, expandNotifications } from './notifications';
 import { updateConversations } from './conversations';
+import {
+  fetchAnnouncements,
+  updateAnnouncements,
+  updateReaction as updateAnnouncementsReaction,
+  deleteAnnouncement,
+} from './announcements';
 import { fetchFilters } from './filters';
 import { getLocale } from 'mastodon/locales';
 
@@ -44,6 +50,15 @@ export function connectTimelineStream (timelineId, path, pollingRefresh = null,
         case 'filters_changed':
           dispatch(fetchFilters());
           break;
+        case 'announcement':
+          dispatch(updateAnnouncements(JSON.parse(data.payload)));
+          break;
+        case 'announcement.reaction':
+          dispatch(updateAnnouncementsReaction(JSON.parse(data.payload)));
+          break;
+        case 'announcement.delete':
+          dispatch(deleteAnnouncement(data.payload));
+          break;
         }
       },
     };
@@ -51,7 +66,9 @@ export function connectTimelineStream (timelineId, path, pollingRefresh = null,
 }
 
 const refreshHomeTimelineAndNotification = (dispatch, done) => {
-  dispatch(expandHomeTimeline({}, () => dispatch(expandNotifications({}, done))));
+  dispatch(expandHomeTimeline({}, () =>
+    dispatch(expandNotifications({}, () =>
+      dispatch(fetchAnnouncements(done))))));
 };
 
 export const connectUserStream      = () => connectTimelineStream('home', 'user', refreshHomeTimelineAndNotification);
diff --git a/app/javascript/flavours/glitch/actions/timelines.js b/app/javascript/flavours/glitch/actions/timelines.js
index 097878c3b..2ef78025e 100644
--- a/app/javascript/flavours/glitch/actions/timelines.js
+++ b/app/javascript/flavours/glitch/actions/timelines.js
@@ -112,9 +112,9 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) {
 
       dispatch(importFetchedStatuses(response.data));
       dispatch(expandTimelineSuccess(timelineId, response.data, next ? next.uri : null, response.status === 206, isLoadingRecent, isLoadingMore, isLoadingRecent && preferPendingItems));
-      done();
     }).catch(error => {
       dispatch(expandTimelineFail(timelineId, error, isLoadingMore));
+    }).finally(() => {
       done();
     });
   };
diff --git a/app/javascript/flavours/glitch/components/animated_number.js b/app/javascript/flavours/glitch/components/animated_number.js
new file mode 100644
index 000000000..e3235e368
--- /dev/null
+++ b/app/javascript/flavours/glitch/components/animated_number.js
@@ -0,0 +1,65 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { FormattedNumber } from 'react-intl';
+import TransitionMotion from 'react-motion/lib/TransitionMotion';
+import spring from 'react-motion/lib/spring';
+import { reduceMotion } from 'flavours/glitch/util/initial_state';
+
+export default class AnimatedNumber extends React.PureComponent {
+
+  static propTypes = {
+    value: PropTypes.number.isRequired,
+  };
+
+  state = {
+    direction: 1,
+  };
+
+  componentWillReceiveProps (nextProps) {
+    if (nextProps.value > this.props.value) {
+      this.setState({ direction: 1 });
+    } else if (nextProps.value < this.props.value) {
+      this.setState({ direction: -1 });
+    }
+  }
+
+  willEnter = () => {
+    const { direction } = this.state;
+
+    return { y: -1 * direction };
+  }
+
+  willLeave = () => {
+    const { direction } = this.state;
+
+    return { y: spring(1 * direction, { damping: 35, stiffness: 400 }) };
+  }
+
+  render () {
+    const { value } = this.props;
+    const { direction } = this.state;
+
+    if (reduceMotion) {
+      return <FormattedNumber value={value} />;
+    }
+
+    const styles = [{
+      key: `${value}`,
+      data: value,
+      style: { y: spring(0, { damping: 35, stiffness: 400 }) },
+    }];
+
+    return (
+      <TransitionMotion styles={styles} willEnter={this.willEnter} willLeave={this.willLeave}>
+        {items => (
+          <span className='animated-number'>
+            {items.map(({ key, data, style }) => (
+              <span key={key} style={{ position: (direction * style.y) > 0 ? 'absolute' : 'static', transform: `translateY(${style.y * 100}%)` }}><FormattedNumber value={data} /></span>
+            ))}
+          </span>
+        )}
+      </TransitionMotion>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/components/column_header.js b/app/javascript/flavours/glitch/components/column_header.js
index dd1162429..01bd4a246 100644
--- a/app/javascript/flavours/glitch/components/column_header.js
+++ b/app/javascript/flavours/glitch/components/column_header.js
@@ -2,18 +2,14 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import { createPortal } from 'react-dom';
 import classNames from 'classnames';
-import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
-import ImmutablePropTypes from 'react-immutable-proptypes';
+import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
 import Icon from 'flavours/glitch/components/icon';
 
-import NotificationPurgeButtonsContainer from 'flavours/glitch/containers/notification_purge_buttons_container';
-
 const messages = defineMessages({
   show: { id: 'column_header.show_settings', defaultMessage: 'Show settings' },
   hide: { id: 'column_header.hide_settings', defaultMessage: 'Hide settings' },
   moveLeft: { id: 'column_header.moveLeft_settings', defaultMessage: 'Move column to the left' },
   moveRight: { id: 'column_header.moveRight_settings', defaultMessage: 'Move column to the right' },
-  enterNotifCleaning : { id: 'notification_purge.start', defaultMessage: 'Enter notification cleaning mode' },
 });
 
 export default @injectIntl
@@ -28,26 +24,21 @@ class ColumnHeader extends React.PureComponent {
     title: PropTypes.node,
     icon: PropTypes.string,
     active: PropTypes.bool,
-    localSettings : ImmutablePropTypes.map,
     multiColumn: PropTypes.bool,
     extraButton: PropTypes.node,
     showBackButton: PropTypes.bool,
-    notifCleaning: PropTypes.bool, // true only for the notification column
-    notifCleaningActive: PropTypes.bool,
-    onEnterCleaningMode: PropTypes.func,
     children: PropTypes.node,
     pinned: PropTypes.bool,
     placeholder: PropTypes.bool,
     onPin: PropTypes.func,
     onMove: PropTypes.func,
     onClick: PropTypes.func,
-    intl: PropTypes.object.isRequired,
+    appendContent: PropTypes.node,
   };
 
   state = {
     collapsed: true,
     animating: false,
-    animatingNCD: false,
   };
 
   historyBack = (skip) => {
@@ -89,10 +80,6 @@ class ColumnHeader extends React.PureComponent {
     this.setState({ animating: false });
   }
 
-  handleTransitionEndNCD = () => {
-    this.setState({ animatingNCD: false });
-  }
-
   handlePin = () => {
     if (!this.props.pinned) {
       this.historyBack();
@@ -100,16 +87,9 @@ class ColumnHeader extends React.PureComponent {
     this.props.onPin();
   }
 
-  onEnterCleaningMode = () => {
-    this.setState({ animatingNCD: true });
-    this.props.onEnterCleaningMode(!this.props.notifCleaningActive);
-  }
-
   render () {
-    const { intl, icon, active, children, pinned, multiColumn, extraButton, showBackButton, intl: { formatMessage }, notifCleaning, notifCleaningActive, placeholder } = this.props;
-    const { collapsed, animating, animatingNCD } = this.state;
-
-    let title = this.props.title;
+    const { title, icon, active, children, pinned, multiColumn, extraButton, showBackButton, intl: { formatMessage }, placeholder, appendContent } = this.props;
+    const { collapsed, animating } = this.state;
 
     const wrapperClassName = classNames('column-header__wrapper', {
       'active': active,
@@ -128,20 +108,8 @@ class ColumnHeader extends React.PureComponent {
       'active': !collapsed,
     });
 
-    const notifCleaningButtonClassName = classNames('column-header__button', {
-      'active': notifCleaningActive,
-    });
-
-    const notifCleaningDrawerClassName = classNames('ncd column-header__collapsible', {
-      'collapsed': !notifCleaningActive,
-      'animating': animatingNCD,
-    });
-
     let extraContent, pinButton, moveButtons, backButton, collapseButton;
 
-    //*glitch
-    const msgEnterNotifCleaning = intl.formatMessage(messages.enterNotifCleaning);
-
     if (children) {
       extraContent = (
         <div key='extra-content' className='column-header__collapsible__extra'>
@@ -202,33 +170,17 @@ class ColumnHeader extends React.PureComponent {
           <div className='column-header__buttons'>
             {hasTitle && backButton}
             {extraButton}
-            { notifCleaning ? (
-              <button
-                aria-label={msgEnterNotifCleaning}
-                title={msgEnterNotifCleaning}
-                onClick={this.onEnterCleaningMode}
-                className={notifCleaningButtonClassName}
-              >
-                <Icon id='eraser' />
-              </button>
-            ) : null}
             {collapseButton}
           </div>
         </h1>
 
-        { notifCleaning ? (
-          <div className={notifCleaningDrawerClassName} onTransitionEnd={this.handleTransitionEndNCD}>
-            <div className='column-header__collapsible-inner nopad-drawer'>
-              {(notifCleaningActive || animatingNCD) ? (<NotificationPurgeButtonsContainer />) : null }
-            </div>
-          </div>
-        ) : null}
-
         <div className={collapsibleClassName} tabIndex={collapsed ? -1 : null} onTransitionEnd={this.handleTransitionEnd}>
           <div className='column-header__collapsible-inner'>
             {(!collapsed || animating) && collapsedContent}
           </div>
         </div>
+
+        {appendContent}
       </div>
     );
 
diff --git a/app/javascript/flavours/glitch/components/dropdown_menu.js b/app/javascript/flavours/glitch/components/dropdown_menu.js
index ab5b7a572..cc4d714e8 100644
--- a/app/javascript/flavours/glitch/components/dropdown_menu.js
+++ b/app/javascript/flavours/glitch/components/dropdown_menu.js
@@ -184,7 +184,7 @@ export default class Dropdown extends React.PureComponent {
     icon: PropTypes.string.isRequired,
     items: PropTypes.array.isRequired,
     size: PropTypes.number.isRequired,
-    ariaLabel: PropTypes.string,
+    title: PropTypes.string,
     disabled: PropTypes.bool,
     status: ImmutablePropTypes.map,
     isUserTouching: PropTypes.func,
@@ -197,7 +197,7 @@ export default class Dropdown extends React.PureComponent {
   };
 
   static defaultProps = {
-    ariaLabel: 'Menu',
+    title: 'Menu',
   };
 
   state = {
@@ -277,14 +277,14 @@ export default class Dropdown extends React.PureComponent {
   }
 
   render () {
-    const { icon, items, size, ariaLabel, disabled, dropdownPlacement, openDropdownId, openedViaKeyboard } = this.props;
+    const { icon, items, size, title, disabled, dropdownPlacement, openDropdownId, openedViaKeyboard } = this.props;
     const open = this.state.id === openDropdownId;
 
     return (
       <div>
         <IconButton
           icon={icon}
-          title={ariaLabel}
+          title={title}
           active={open}
           disabled={disabled}
           size={size}
diff --git a/app/javascript/flavours/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js
index 85ee79e11..9754c73dc 100644
--- a/app/javascript/flavours/glitch/components/media_gallery.js
+++ b/app/javascript/flavours/glitch/components/media_gallery.js
@@ -43,6 +43,7 @@ class Item extends React.PureComponent {
     onClick: PropTypes.func.isRequired,
     displayWidth: PropTypes.number,
     visible: PropTypes.bool.isRequired,
+    autoplay: PropTypes.bool,
   };
 
   static defaultProps = {
@@ -68,9 +69,13 @@ class Item extends React.PureComponent {
     }
   }
 
+  getAutoPlay() {
+    return this.props.autoplay || autoPlayGif;
+  }
+
   hoverToPlay () {
     const { attachment } = this.props;
-    return !autoPlayGif && attachment.get('type') === 'gifv';
+    return !this.getAutoPlay() && attachment.get('type') === 'gifv';
   }
 
   handleClick = (e) => {
@@ -222,7 +227,7 @@ class Item extends React.PureComponent {
         </a>
       );
     } else if (attachment.get('type') === 'gifv') {
-      const autoPlay = !isIOS() && autoPlayGif;
+      const autoPlay = !isIOS() && this.getAutoPlay();
 
       thumbnail = (
         <div className={classNames('media-gallery__gifv', { autoplay: autoPlay })}>
@@ -271,6 +276,7 @@ class MediaGallery extends React.PureComponent {
     defaultWidth: PropTypes.number,
     cacheWidth: PropTypes.func,
     visible: PropTypes.bool,
+    autoplay: PropTypes.bool,
     onToggleVisibility: PropTypes.func,
   };
 
@@ -328,7 +334,7 @@ class MediaGallery extends React.PureComponent {
   }
 
   render () {
-    const { media, intl, sensitive, letterbox, fullwidth, defaultWidth } = this.props;
+    const { media, intl, sensitive, letterbox, fullwidth, defaultWidth, autoplay } = this.props;
     const { visible } = this.state;
     const size     = media.take(4).size;
     const uncached = media.every(attachment => attachment.get('type') === 'unknown');
@@ -350,9 +356,9 @@ class MediaGallery extends React.PureComponent {
     }
 
     if (this.isStandaloneEligible()) {
-      children = <Item standalone onClick={this.handleClick} attachment={media.get(0)} displayWidth={width} visible={visible} />;
+      children = <Item standalone autoplay={autoplay} onClick={this.handleClick} attachment={media.get(0)} displayWidth={width} visible={visible} />;
     } else {
-      children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} onClick={this.handleClick} attachment={attachment} index={i} size={size} letterbox={letterbox} displayWidth={width} visible={visible || uncached} />);
+      children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} autoplay={autoplay} onClick={this.handleClick} attachment={attachment} index={i} size={size} letterbox={letterbox} displayWidth={width} visible={visible || uncached} />);
     }
 
     if (uncached) {
diff --git a/app/javascript/flavours/glitch/components/relative_timestamp.js b/app/javascript/flavours/glitch/components/relative_timestamp.js
index aa4b73cfe..711181dcd 100644
--- a/app/javascript/flavours/glitch/components/relative_timestamp.js
+++ b/app/javascript/flavours/glitch/components/relative_timestamp.js
@@ -3,6 +3,7 @@ import { injectIntl, defineMessages } from 'react-intl';
 import PropTypes from 'prop-types';
 
 const messages = defineMessages({
+  today: { id: 'relative_time.today', defaultMessage: 'today' },
   just_now: { id: 'relative_time.just_now', defaultMessage: 'now' },
   seconds: { id: 'relative_time.seconds', defaultMessage: '{number}s' },
   minutes: { id: 'relative_time.minutes', defaultMessage: '{number}m' },
@@ -65,12 +66,14 @@ const getUnitDelay = units => {
   }
 };
 
-export const timeAgoString = (intl, date, now, year) => {
+export const timeAgoString = (intl, date, now, year, timeGiven = true) => {
   const delta = now - date.getTime();
 
   let relativeTime;
 
-  if (delta < 10 * SECOND) {
+  if (delta < DAY && !timeGiven) {
+    relativeTime = intl.formatMessage(messages.today);
+  } else if (delta < 10 * SECOND) {
     relativeTime = intl.formatMessage(messages.just_now);
   } else if (delta < 7 * DAY) {
     if (delta < MINUTE) {
@@ -91,12 +94,14 @@ export const timeAgoString = (intl, date, now, year) => {
   return relativeTime;
 };
 
-const timeRemainingString = (intl, date, now) => {
+const timeRemainingString = (intl, date, now, timeGiven = true) => {
   const delta = date.getTime() - now;
 
   let relativeTime;
 
-  if (delta < 10 * SECOND) {
+  if (delta < DAY && !timeGiven) {
+    relativeTime = intl.formatMessage(messages.today);
+  } else if (delta < 10 * SECOND) {
     relativeTime = intl.formatMessage(messages.moments_remaining);
   } else if (delta < MINUTE) {
     relativeTime = intl.formatMessage(messages.seconds_remaining, { number: Math.floor(delta / SECOND) });
@@ -173,8 +178,9 @@ class RelativeTimestamp extends React.Component {
   render () {
     const { timestamp, intl, year, futureDate } = this.props;
 
+    const timeGiven    = timestamp.includes('T');
     const date         = new Date(timestamp);
-    const relativeTime = futureDate ? timeRemainingString(intl, date, this.state.now) : timeAgoString(intl, date, this.state.now, year);
+    const relativeTime = futureDate ? timeRemainingString(intl, date, this.state.now, timeGiven) : timeAgoString(intl, date, this.state.now, year, timeGiven);
 
     return (
       <time dateTime={timestamp} title={intl.formatDate(date, dateFormatOptions)}>
diff --git a/app/javascript/flavours/glitch/components/status_content.js b/app/javascript/flavours/glitch/components/status_content.js
index 2c79de4db..a5822866a 100644
--- a/app/javascript/flavours/glitch/components/status_content.js
+++ b/app/javascript/flavours/glitch/components/status_content.js
@@ -42,6 +42,14 @@ const isLinkMisleading = (link) => {
   const linkText = linkTextParts.join('');
   const targetURL = new URL(link.href);
 
+  if (targetURL.protocol === 'magnet:') {
+    return !linkText.startsWith('magnet:');
+  }
+
+  if (targetURL.protocol === 'xmpp:') {
+    return !(linkText === targetURL.href || 'xmpp:' + linkText === targetURL.href);
+  }
+
   // The following may not work with international domain names
   if (textMatchesTarget(linkText, targetURL.origin, targetURL.host) || textMatchesTarget(linkText.toLowerCase(), targetURL.origin, targetURL.host)) {
     return false;
@@ -120,9 +128,19 @@ export default class StatusContent extends React.PureComponent {
           if (tagLinks && isLinkMisleading(link)) {
             // Add a tag besides the link to display its origin
 
+            const url = new URL(link.href);
             const tag = document.createElement('span');
             tag.classList.add('link-origin-tag');
-            tag.textContent = `[${new URL(link.href).host}]`;
+            switch (url.protocol) {
+            case 'xmpp:':
+              tag.textContent = `[${url.href}]`;
+              break;
+            case 'magnet:':
+              tag.textContent = '(magnet)';
+              break;
+            default:
+              tag.textContent = `[${url.host}]`;
+            }
             link.insertAdjacentText('beforeend', ' ');
             link.insertAdjacentElement('beforeend', tag);
           }
diff --git a/app/javascript/flavours/glitch/features/account_timeline/index.js b/app/javascript/flavours/glitch/features/account_timeline/index.js
index 2ef4ff602..f25c82a00 100644
--- a/app/javascript/flavours/glitch/features/account_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/account_timeline/index.js
@@ -112,6 +112,7 @@ class AccountTimeline extends ImmutablePureComponent {
           onLoadMore={this.handleLoadMore}
           emptyMessage={<FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />}
           bindToDocument={!multiColumn}
+          timelineId='account'
         />
       </Column>
     );
diff --git a/app/javascript/flavours/glitch/features/directory/components/account_card.js b/app/javascript/flavours/glitch/features/directory/components/account_card.js
index d1c406933..557120960 100644
--- a/app/javascript/flavours/glitch/features/directory/components/account_card.js
+++ b/app/javascript/flavours/glitch/features/directory/components/account_card.js
@@ -22,6 +22,7 @@ const messages = defineMessages({
   requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' },
   unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
   unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
+  unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
 });
 
 const makeMapStateToProps = () => {
diff --git a/app/javascript/flavours/glitch/features/emoji_picker/index.js b/app/javascript/flavours/glitch/features/emoji_picker/index.js
index 6e5518b0c..3717fcd82 100644
--- a/app/javascript/flavours/glitch/features/emoji_picker/index.js
+++ b/app/javascript/flavours/glitch/features/emoji_picker/index.js
@@ -372,6 +372,7 @@ class EmojiPickerDropdown extends React.PureComponent {
     onPickEmoji: PropTypes.func.isRequired,
     onSkinTone: PropTypes.func.isRequired,
     skinTone: PropTypes.number.isRequired,
+    button: PropTypes.node,
   };
 
   state = {
@@ -432,18 +433,18 @@ class EmojiPickerDropdown extends React.PureComponent {
   }
 
   render () {
-    const { intl, onPickEmoji, onSkinTone, skinTone, frequentlyUsedEmojis } = this.props;
+    const { intl, onPickEmoji, onSkinTone, skinTone, frequentlyUsedEmojis, button } = this.props;
     const title = intl.formatMessage(messages.emoji);
     const { active, loading, placement } = this.state;
 
     return (
       <div className='emoji-picker-dropdown' onKeyDown={this.handleKeyDown}>
         <div ref={this.setTargetRef} className='emoji-button' title={title} aria-label={title} aria-expanded={active} role='button' onClick={this.onToggle} onKeyDown={this.onToggle} tabIndex={0}>
-          <img
+          {button || <img
             className={classNames('emojione', { 'pulse-loading': active && loading })}
             alt='🙂'
             src={`${assetHost}/emoji/1f602.svg`}
-          />
+          />}
         </div>
 
         <Overlay show={active} placement={placement} target={this.findTarget}>
diff --git a/app/javascript/flavours/glitch/features/getting_started/components/announcements.js b/app/javascript/flavours/glitch/features/getting_started/components/announcements.js
new file mode 100644
index 000000000..e34c9009b
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/getting_started/components/announcements.js
@@ -0,0 +1,436 @@
+import React from 'react';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import ReactSwipeableViews from 'react-swipeable-views';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import PropTypes from 'prop-types';
+import IconButton from 'flavours/glitch/components/icon_button';
+import Icon from 'flavours/glitch/components/icon';
+import { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl';
+import { autoPlayGif, reduceMotion } from 'flavours/glitch/util/initial_state';
+import elephantUIPlane from 'mastodon/../images/elephant_ui_plane.svg';
+import { mascot } from 'flavours/glitch/util/initial_state';
+import unicodeMapping from 'flavours/glitch/util/emoji/emoji_unicode_mapping_light';
+import classNames from 'classnames';
+import EmojiPickerDropdown from 'flavours/glitch/features/emoji_picker';
+import AnimatedNumber from 'flavours/glitch/components/animated_number';
+import TransitionMotion from 'react-motion/lib/TransitionMotion';
+import spring from 'react-motion/lib/spring';
+
+const messages = defineMessages({
+  close: { id: 'lightbox.close', defaultMessage: 'Close' },
+  previous: { id: 'lightbox.previous', defaultMessage: 'Previous' },
+  next: { id: 'lightbox.next', defaultMessage: 'Next' },
+});
+
+class Content extends ImmutablePureComponent {
+
+  static contextTypes = {
+    router: PropTypes.object,
+  };
+
+  static propTypes = {
+    announcement: ImmutablePropTypes.map.isRequired,
+  };
+
+  setRef = c => {
+    this.node = c;
+  }
+
+  componentDidMount () {
+    this._updateLinks();
+    this._updateEmojis();
+  }
+
+  componentDidUpdate () {
+    this._updateLinks();
+    this._updateEmojis();
+  }
+
+  _updateEmojis () {
+    const node = this.node;
+
+    if (!node || autoPlayGif) {
+      return;
+    }
+
+    const emojis = node.querySelectorAll('.custom-emoji');
+
+    for (var i = 0; i < emojis.length; i++) {
+      let emoji = emojis[i];
+
+      if (emoji.classList.contains('status-emoji')) {
+        continue;
+      }
+
+      emoji.classList.add('status-emoji');
+
+      emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false);
+      emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false);
+    }
+  }
+
+  _updateLinks () {
+    const node = this.node;
+
+    if (!node) {
+      return;
+    }
+
+    const links = node.querySelectorAll('a');
+
+    for (var i = 0; i < links.length; ++i) {
+      let link = links[i];
+
+      if (link.classList.contains('status-link')) {
+        continue;
+      }
+
+      link.classList.add('status-link');
+
+      let mention = this.props.announcement.get('mentions').find(item => link.href === item.get('url'));
+
+      if (mention) {
+        link.addEventListener('click', this.onMentionClick.bind(this, mention), false);
+        link.setAttribute('title', mention.get('acct'));
+      } else if (link.textContent[0] === '#' || (link.previousSibling && link.previousSibling.textContent && link.previousSibling.textContent[link.previousSibling.textContent.length - 1] === '#')) {
+        link.addEventListener('click', this.onHashtagClick.bind(this, link.text), false);
+      } else {
+        link.setAttribute('title', link.href);
+        link.classList.add('unhandled-link');
+      }
+
+      link.setAttribute('target', '_blank');
+      link.setAttribute('rel', 'noopener noreferrer');
+    }
+  }
+
+  onMentionClick = (mention, e) => {
+    if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
+      e.preventDefault();
+      this.context.router.history.push(`/accounts/${mention.get('id')}`);
+    }
+  }
+
+  onHashtagClick = (hashtag, e) => {
+    hashtag = hashtag.replace(/^#/, '');
+
+    if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
+      e.preventDefault();
+      this.context.router.history.push(`/timelines/tag/${hashtag}`);
+    }
+  }
+
+  handleEmojiMouseEnter = ({ target }) => {
+    target.src = target.getAttribute('data-original');
+  }
+
+  handleEmojiMouseLeave = ({ target }) => {
+    target.src = target.getAttribute('data-static');
+  }
+
+  render () {
+    const { announcement } = this.props;
+
+    return (
+      <div
+        className='announcements__item__content'
+        ref={this.setRef}
+        dangerouslySetInnerHTML={{ __html: announcement.get('contentHtml') }}
+      />
+    );
+  }
+
+}
+
+const assetHost = process.env.CDN_HOST || '';
+
+class Emoji extends React.PureComponent {
+
+  static propTypes = {
+    emoji: PropTypes.string.isRequired,
+    emojiMap: ImmutablePropTypes.map.isRequired,
+    hovered: PropTypes.bool.isRequired,
+  };
+
+  render () {
+    const { emoji, emojiMap, hovered } = this.props;
+
+    if (unicodeMapping[emoji]) {
+      const { filename, shortCode } = unicodeMapping[this.props.emoji];
+      const title = shortCode ? `:${shortCode}:` : '';
+
+      return (
+        <img
+          draggable='false'
+          className='emojione'
+          alt={emoji}
+          title={title}
+          src={`${assetHost}/emoji/${filename}.svg`}
+        />
+      );
+    } else if (emojiMap.get(emoji)) {
+      const filename  = (autoPlayGif || hovered) ? emojiMap.getIn([emoji, 'url']) : emojiMap.getIn([emoji, 'static_url']);
+      const shortCode = `:${emoji}:`;
+
+      return (
+        <img
+          draggable='false'
+          className='emojione custom-emoji'
+          alt={shortCode}
+          title={shortCode}
+          src={filename}
+        />
+      );
+    } else {
+      return null;
+    }
+  }
+
+}
+
+class Reaction extends ImmutablePureComponent {
+
+  static propTypes = {
+    announcementId: PropTypes.string.isRequired,
+    reaction: ImmutablePropTypes.map.isRequired,
+    addReaction: PropTypes.func.isRequired,
+    removeReaction: PropTypes.func.isRequired,
+    emojiMap: ImmutablePropTypes.map.isRequired,
+    style: PropTypes.object,
+  };
+
+  state = {
+    hovered: false,
+  };
+
+  handleClick = () => {
+    const { reaction, announcementId, addReaction, removeReaction } = this.props;
+
+    if (reaction.get('me')) {
+      removeReaction(announcementId, reaction.get('name'));
+    } else {
+      addReaction(announcementId, reaction.get('name'));
+    }
+  }
+
+  handleMouseEnter = () => this.setState({ hovered: true })
+
+  handleMouseLeave = () => this.setState({ hovered: false })
+
+  render () {
+    const { reaction } = this.props;
+
+    let shortCode = reaction.get('name');
+
+    if (unicodeMapping[shortCode]) {
+      shortCode = unicodeMapping[shortCode].shortCode;
+    }
+
+    return (
+      <button className={classNames('reactions-bar__item', { active: reaction.get('me') })} onClick={this.handleClick} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} title={`:${shortCode}:`} style={this.props.style}>
+        <span className='reactions-bar__item__emoji'><Emoji hovered={this.state.hovered} emoji={reaction.get('name')} emojiMap={this.props.emojiMap} /></span>
+        <span className='reactions-bar__item__count'><AnimatedNumber value={reaction.get('count')} /></span>
+      </button>
+    );
+  }
+
+}
+
+class ReactionsBar extends ImmutablePureComponent {
+
+  static propTypes = {
+    announcementId: PropTypes.string.isRequired,
+    reactions: ImmutablePropTypes.list.isRequired,
+    addReaction: PropTypes.func.isRequired,
+    removeReaction: PropTypes.func.isRequired,
+    emojiMap: ImmutablePropTypes.map.isRequired,
+  };
+
+  handleEmojiPick = data => {
+    const { addReaction, announcementId } = this.props;
+    addReaction(announcementId, data.native.replace(/:/g, ''));
+  }
+
+  willEnter () {
+    return { scale: reduceMotion ? 1 : 0 };
+  }
+
+  willLeave () {
+    return { scale: reduceMotion ? 0 : spring(0, { stiffness: 170, damping: 26 }) };
+  }
+
+  render () {
+    const { reactions } = this.props;
+    const visibleReactions = reactions.filter(x => x.get('count') > 0);
+
+    const styles = visibleReactions.map(reaction => ({
+      key: reaction.get('name'),
+      data: reaction,
+      style: { scale: reduceMotion ? 1 : spring(1, { stiffness: 150, damping: 13 }) },
+    })).toArray();
+
+    return (
+      <TransitionMotion styles={styles} willEnter={this.willEnter} willLeave={this.willLeave}>
+        {items => (
+          <div className={classNames('reactions-bar', { 'reactions-bar--empty': visibleReactions.isEmpty() })}>
+            {items.map(({ key, data, style }) => (
+              <Reaction
+                key={key}
+                reaction={data}
+                style={{ transform: `scale(${style.scale})`, position: style.scale < 0.5 ? 'absolute' : 'static' }}
+                announcementId={this.props.announcementId}
+                addReaction={this.props.addReaction}
+                removeReaction={this.props.removeReaction}
+                emojiMap={this.props.emojiMap}
+              />
+            ))}
+
+            {visibleReactions.size < 8 && <EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} button={<Icon id='plus' />} />}
+          </div>
+        )}
+      </TransitionMotion>
+    );
+  }
+
+}
+
+class Announcement extends ImmutablePureComponent {
+
+  static propTypes = {
+    announcement: ImmutablePropTypes.map.isRequired,
+    emojiMap: ImmutablePropTypes.map.isRequired,
+    addReaction: PropTypes.func.isRequired,
+    removeReaction: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
+    selected: PropTypes.bool,
+  };
+
+  state = {
+    unread: !this.props.announcement.get('read'),
+  };
+
+  componentDidUpdate () {
+    const { selected, announcement } = this.props;
+    if (!selected && this.state.unread !== !announcement.get('read')) {
+      this.setState({ unread: !announcement.get('read') });
+    }
+  }
+
+  render () {
+    const { announcement } = this.props;
+    const { unread } = this.state;
+    const startsAt = announcement.get('starts_at') && new Date(announcement.get('starts_at'));
+    const endsAt = announcement.get('ends_at') && new Date(announcement.get('ends_at'));
+    const now = new Date();
+    const hasTimeRange = startsAt && endsAt;
+    const skipYear = hasTimeRange && startsAt.getFullYear() === endsAt.getFullYear() && endsAt.getFullYear() === now.getFullYear();
+    const skipEndDate = hasTimeRange && startsAt.getDate() === endsAt.getDate() && startsAt.getMonth() === endsAt.getMonth() && startsAt.getFullYear() === endsAt.getFullYear();
+    const skipTime = announcement.get('all_day');
+
+    return (
+      <div className='announcements__item'>
+        <strong className='announcements__item__range'>
+          <FormattedMessage id='announcement.announcement' defaultMessage='Announcement' />
+          {hasTimeRange && <span> · <FormattedDate value={startsAt} hour12={false} year={(skipYear || startsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month='short' day='2-digit' hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /> - <FormattedDate value={endsAt} hour12={false} year={(skipYear || endsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month={skipEndDate ? undefined : 'short'} day={skipEndDate ? undefined : '2-digit'} hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /></span>}
+        </strong>
+
+        <Content announcement={announcement} />
+
+        <ReactionsBar
+          reactions={announcement.get('reactions')}
+          announcementId={announcement.get('id')}
+          addReaction={this.props.addReaction}
+          removeReaction={this.props.removeReaction}
+          emojiMap={this.props.emojiMap}
+        />
+
+        {unread && <span className='announcements__item__unread' />}
+      </div>
+    );
+  }
+
+}
+
+export default @injectIntl
+class Announcements extends ImmutablePureComponent {
+
+  static propTypes = {
+    announcements: ImmutablePropTypes.list,
+    emojiMap: ImmutablePropTypes.map.isRequired,
+    dismissAnnouncement: PropTypes.func.isRequired,
+    addReaction: PropTypes.func.isRequired,
+    removeReaction: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
+  };
+
+  state = {
+    index: 0,
+  };
+
+  componentDidMount () {
+    this._markAnnouncementAsRead();
+  }
+
+  componentDidUpdate () {
+    this._markAnnouncementAsRead();
+  }
+
+  _markAnnouncementAsRead () {
+    const { dismissAnnouncement, announcements } = this.props;
+    const { index } = this.state;
+    const announcement = announcements.get(index);
+    if (!announcement.get('read')) dismissAnnouncement(announcement.get('id'));
+  }
+
+  handleChangeIndex = index => {
+    this.setState({ index: index % this.props.announcements.size });
+  }
+
+  handleNextClick = () => {
+    this.setState({ index: (this.state.index + 1) % this.props.announcements.size });
+  }
+
+  handlePrevClick = () => {
+    this.setState({ index: (this.props.announcements.size + this.state.index - 1) % this.props.announcements.size });
+  }
+
+  render () {
+    const { announcements, intl } = this.props;
+    const { index } = this.state;
+
+    if (announcements.isEmpty()) {
+      return null;
+    }
+
+    return (
+      <div className='announcements'>
+        <img className='announcements__mastodon' alt='' draggable='false' src={mascot || elephantUIPlane} />
+
+        <div className='announcements__container'>
+          <ReactSwipeableViews animateHeight={!reduceMotion} adjustHeight={reduceMotion} index={index} onChangeIndex={this.handleChangeIndex}>
+            {announcements.map((announcement, idx) => (
+              <Announcement
+                key={announcement.get('id')}
+                announcement={announcement}
+                emojiMap={this.props.emojiMap}
+                addReaction={this.props.addReaction}
+                removeReaction={this.props.removeReaction}
+                intl={intl}
+                selected={index === idx}
+              />
+            ))}
+          </ReactSwipeableViews>
+
+          {announcements.size > 1 && (
+            <div className='announcements__pagination'>
+              <IconButton disabled={announcements.size === 1} title={intl.formatMessage(messages.previous)} icon='chevron-left' onClick={this.handlePrevClick} size={13} />
+              <span>{index + 1} / {announcements.size}</span>
+              <IconButton disabled={announcements.size === 1} title={intl.formatMessage(messages.next)} icon='chevron-right' onClick={this.handleNextClick} size={13} />
+            </div>
+          )}
+        </div>
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js b/app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js
new file mode 100644
index 000000000..d472323f8
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/getting_started/containers/announcements_container.js
@@ -0,0 +1,20 @@
+import { connect } from 'react-redux';
+import { addReaction, removeReaction, dismissAnnouncement } from 'flavours/glitch/actions/announcements';
+import Announcements from '../components/announcements';
+import { createSelector } from 'reselect';
+import { Map as ImmutableMap } from 'immutable';
+
+const customEmojiMap = createSelector([state => state.get('custom_emojis')], items => items.reduce((map, emoji) => map.set(emoji.get('shortcode'), emoji), ImmutableMap()));
+
+const mapStateToProps = state => ({
+  announcements: state.getIn(['announcements', 'items']),
+  emojiMap: customEmojiMap(state),
+});
+
+const mapDispatchToProps = dispatch => ({
+  dismissAnnouncement: id => dispatch(dismissAnnouncement(id)),
+  addReaction: (id, name) => dispatch(addReaction(id, name)),
+  removeReaction: (id, name) => dispatch(removeReaction(id, name)),
+});
+
+export default connect(mapStateToProps, mapDispatchToProps)(Announcements);
diff --git a/app/javascript/flavours/glitch/features/getting_started/containers/trends_container.js b/app/javascript/flavours/glitch/features/getting_started/containers/trends_container.js
index 1df3fb4fe..7a5268780 100644
--- a/app/javascript/flavours/glitch/features/getting_started/containers/trends_container.js
+++ b/app/javascript/flavours/glitch/features/getting_started/containers/trends_container.js
@@ -1,5 +1,5 @@
 import { connect } from 'react-redux';
-import { fetchTrends } from '../../../actions/trends';
+import { fetchTrends } from 'mastodon/actions/trends';
 import Trends from '../components/trends';
 
 const mapStateToProps = state => ({
diff --git a/app/javascript/flavours/glitch/features/home_timeline/index.js b/app/javascript/flavours/glitch/features/home_timeline/index.js
index 9b71a4404..cc8e4664c 100644
--- a/app/javascript/flavours/glitch/features/home_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/home_timeline/index.js
@@ -9,14 +9,23 @@ import { addColumn, removeColumn, moveColumn } from 'flavours/glitch/actions/col
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ColumnSettingsContainer from './containers/column_settings_container';
 import { Link } from 'react-router-dom';
+import { fetchAnnouncements, toggleShowAnnouncements } from 'flavours/glitch/actions/announcements';
+import AnnouncementsContainer from 'flavours/glitch/features/getting_started/containers/announcements_container';
+import classNames from 'classnames';
+import IconWithBadge from 'flavours/glitch/components/icon_with_badge';
 
 const messages = defineMessages({
   title: { id: 'column.home', defaultMessage: 'Home' },
+  show_announcements: { id: 'home.show_announcements', defaultMessage: 'Show announcements' },
+  hide_announcements: { id: 'home.hide_announcements', defaultMessage: 'Hide announcements' },
 });
 
 const mapStateToProps = state => ({
   hasUnread: state.getIn(['timelines', 'home', 'unread']) > 0,
   isPartial: state.getIn(['timelines', 'home', 'isPartial']),
+  hasAnnouncements: !state.getIn(['announcements', 'items']).isEmpty(),
+  unreadAnnouncements: state.getIn(['announcements', 'items']).count(item => !item.get('read')),
+  showAnnouncements: state.getIn(['announcements', 'show']),
 });
 
 export default @connect(mapStateToProps)
@@ -30,6 +39,9 @@ class HomeTimeline extends React.PureComponent {
     isPartial: PropTypes.bool,
     columnId: PropTypes.string,
     multiColumn: PropTypes.bool,
+    hasAnnouncements: PropTypes.bool,
+    unreadAnnouncements: PropTypes.number,
+    showAnnouncements: PropTypes.bool,
   };
 
   handlePin = () => {
@@ -60,6 +72,7 @@ class HomeTimeline extends React.PureComponent {
   }
 
   componentDidMount () {
+    this.props.dispatch(fetchAnnouncements());
     this._checkIfReloadNeeded(false, this.props.isPartial);
   }
 
@@ -92,10 +105,31 @@ class HomeTimeline extends React.PureComponent {
     }
   }
 
+  handleToggleAnnouncementsClick = (e) => {
+    e.stopPropagation();
+    this.props.dispatch(toggleShowAnnouncements());
+  }
+
   render () {
-    const { intl, hasUnread, columnId, multiColumn } = this.props;
+    const { intl, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props;
     const pinned = !!columnId;
 
+    let announcementsButton = null;
+
+    if (hasAnnouncements) {
+      announcementsButton = (
+        <button
+          className={classNames('column-header__button', { 'active': showAnnouncements })}
+          title={intl.formatMessage(showAnnouncements ? messages.hide_announcements : messages.show_announcements)}
+          aria-label={intl.formatMessage(showAnnouncements ? messages.hide_announcements : messages.show_announcements)}
+          aria-pressed={showAnnouncements ? 'true' : 'false'}
+          onClick={this.handleToggleAnnouncementsClick}
+        >
+          <IconWithBadge id='bullhorn' count={unreadAnnouncements} />
+        </button>
+      );
+    }
+
     return (
       <Column bindToDocument={!multiColumn} ref={this.setRef} name='home' label={intl.formatMessage(messages.title)}>
         <ColumnHeader
@@ -107,6 +141,8 @@ class HomeTimeline extends React.PureComponent {
           onClick={this.handleHeaderClick}
           pinned={pinned}
           multiColumn={multiColumn}
+          extraButton={announcementsButton}
+          appendContent={hasAnnouncements && showAnnouncements && <AnnouncementsContainer />}
         >
           <ColumnSettingsContainer />
         </ColumnHeader>
diff --git a/app/javascript/flavours/glitch/features/local_settings/page/index.js b/app/javascript/flavours/glitch/features/local_settings/page/index.js
index e08c12c76..0b3428027 100644
--- a/app/javascript/flavours/glitch/features/local_settings/page/index.js
+++ b/app/javascript/flavours/glitch/features/local_settings/page/index.js
@@ -168,6 +168,14 @@ class LocalSettingsPage extends React.PureComponent {
         </LocalSettingsPageItem>
         <LocalSettingsPageItem
           settings={settings}
+          item={['prepend_cw_re']}
+          id='mastodon-settings--prepend_cw_re'
+          onChange={onChange}
+        >
+          <FormattedMessage id='settings.prepend_cw_re' defaultMessage='Prepend “re: ” to content warnings when replying' />
+        </LocalSettingsPageItem>
+        <LocalSettingsPageItem
+          settings={settings}
           item={['preselect_on_reply']}
           id='mastodon-settings--preselect_on_reply'
           onChange={onChange}
diff --git a/app/javascript/flavours/glitch/features/notifications/index.js b/app/javascript/flavours/glitch/features/notifications/index.js
index 7f06d70c5..26710feff 100644
--- a/app/javascript/flavours/glitch/features/notifications/index.js
+++ b/app/javascript/flavours/glitch/features/notifications/index.js
@@ -1,5 +1,6 @@
 import React from 'react';
 import { connect } from 'react-redux';
+import classNames from 'classnames';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import Column from 'flavours/glitch/components/column';
@@ -22,9 +23,13 @@ import { List as ImmutableList } from 'immutable';
 import { debounce } from 'lodash';
 import ScrollableList from 'flavours/glitch/components/scrollable_list';
 import LoadGap from 'flavours/glitch/components/load_gap';
+import Icon from 'flavours/glitch/components/icon';
+
+import NotificationPurgeButtonsContainer from 'flavours/glitch/containers/notification_purge_buttons_container';
 
 const messages = defineMessages({
   title: { id: 'column.notifications', defaultMessage: 'Notifications' },
+  enterNotifCleaning : { id: 'notification_purge.start', defaultMessage: 'Enter notification cleaning mode' },
 });
 
 const getNotifications = createSelector([
@@ -94,6 +99,10 @@ class Notifications extends React.PureComponent {
     trackScroll: true,
   };
 
+  state = {
+    animatingNCD: false,
+  };
+
   handleLoadGap = (maxId) => {
     this.props.dispatch(expandNotifications({ maxId }));
   };
@@ -176,8 +185,19 @@ class Notifications extends React.PureComponent {
     }
   }
 
+  handleTransitionEndNCD = () => {
+    this.setState({ animatingNCD: false });
+  }
+
+  onEnterCleaningMode = () => {
+    this.setState({ animatingNCD: true });
+    this.props.onEnterCleaningMode(!this.props.notifCleaningActive);
+  }
+
   render () {
     const { intl, notifications, shouldUpdateScroll, isLoading, isUnread, columnId, multiColumn, hasMore, numPending, showFilterBar } = this.props;
+    const { notifCleaning, notifCleaningActive } = this.props;
+    const { animatingNCD } = this.state;
     const pinned = !!columnId;
     const emptyMessage = <FormattedMessage id='empty_column.notifications' defaultMessage="You don't have any notifications yet. Interact with others to start the conversation." />;
 
@@ -232,6 +252,36 @@ class Notifications extends React.PureComponent {
       </ScrollableList>
     );
 
+    const notifCleaningButtonClassName = classNames('column-header__button', {
+      'active': notifCleaningActive,
+    });
+
+    const notifCleaningDrawerClassName = classNames('ncd column-header__collapsible', {
+      'collapsed': !notifCleaningActive,
+      'animating': animatingNCD,
+    });
+
+    const msgEnterNotifCleaning = intl.formatMessage(messages.enterNotifCleaning);
+
+    const notifCleaningButton = (
+      <button
+        aria-label={msgEnterNotifCleaning}
+        title={msgEnterNotifCleaning}
+        onClick={this.onEnterCleaningMode}
+        className={notifCleaningButtonClassName}
+      >
+        <Icon id='eraser' />
+      </button>
+    );
+
+    const notifCleaningDrawer = (
+      <div className={notifCleaningDrawerClassName} onTransitionEnd={this.handleTransitionEndNCD}>
+        <div className='column-header__collapsible-inner nopad-drawer'>
+          {(notifCleaningActive || animatingNCD) ? (<NotificationPurgeButtonsContainer />) : null }
+        </div>
+      </div>
+    );
+
     return (
       <Column
         bindToDocument={!multiColumn}
@@ -250,9 +300,8 @@ class Notifications extends React.PureComponent {
           pinned={pinned}
           multiColumn={multiColumn}
           localSettings={this.props.localSettings}
-          notifCleaning
-          notifCleaningActive={this.props.notifCleaningActive} // this is used to toggle the header text
-          onEnterCleaningMode={this.props.onEnterCleaningMode}
+          extraButton={notifCleaningButton}
+          appendContent={notifCleaningDrawer}
         >
           <ColumnSettingsContainer />
         </ColumnHeader>
diff --git a/app/javascript/flavours/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js
index c48bfaccd..d71a3ae08 100644
--- a/app/javascript/flavours/glitch/features/status/components/action_bar.js
+++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js
@@ -18,6 +18,7 @@ const messages = defineMessages({
   cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
   favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },
   bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
+  more: { id: 'status.more', defaultMessage: 'More' },
   mute: { id: 'status.mute', defaultMessage: 'Mute @{name}' },
   muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },
   unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },
@@ -207,7 +208,7 @@ class ActionBar extends React.PureComponent {
         <div className='detailed-status__button'><IconButton className='bookmark-icon' active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /></div>
 
         <div className='detailed-status__action-bar-dropdown'>
-          <DropdownMenuContainer size={18} icon='ellipsis-h' items={menu} direction='left' ariaLabel='More' />
+          <DropdownMenuContainer size={18} icon='ellipsis-h' items={menu} direction='left' title={intl.formatMessage(messages.more)} />
         </div>
       </div>
     );
diff --git a/app/javascript/flavours/glitch/features/status/components/detailed_status.js b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
index 898011c88..c4ac8f0a6 100644
--- a/app/javascript/flavours/glitch/features/status/components/detailed_status.js
+++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
@@ -7,7 +7,7 @@ import StatusContent from 'flavours/glitch/components/status_content';
 import MediaGallery from 'flavours/glitch/components/media_gallery';
 import AttachmentList from 'flavours/glitch/components/attachment_list';
 import { Link } from 'react-router-dom';
-import { FormattedDate, FormattedNumber } from 'react-intl';
+import { FormattedDate } from 'react-intl';
 import Card from './card';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import Video from 'flavours/glitch/features/video';
@@ -17,6 +17,7 @@ import scheduleIdleTask from 'flavours/glitch/util/schedule_idle_task';
 import classNames from 'classnames';
 import PollContainer from 'flavours/glitch/containers/poll_container';
 import Icon from 'flavours/glitch/components/icon';
+import AnimatedNumber from 'flavours/glitch/components/animated_number';
 
 export default class DetailedStatus extends ImmutablePureComponent {
 
@@ -204,7 +205,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
         <Link to={`/statuses/${status.get('id')}/reblogs`} className='detailed-status__link'>
           <Icon id={reblogIcon} />
           <span className='detailed-status__reblogs'>
-            <FormattedNumber value={status.get('reblogs_count')} />
+            <AnimatedNumber value={status.get('reblogs_count')} />
           </span>
         </Link>
       );
@@ -213,7 +214,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
         <a href={`/interact/${status.get('id')}?type=reblog`} className='detailed-status__link' onClick={this.handleModalLink}>
           <Icon id={reblogIcon} />
           <span className='detailed-status__reblogs'>
-            <FormattedNumber value={status.get('reblogs_count')} />
+            <AnimatedNumber value={status.get('reblogs_count')} />
           </span>
         </a>
       );
@@ -224,7 +225,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
         <Link to={`/statuses/${status.get('id')}/favourites`} className='detailed-status__link'>
           <Icon id='star' />
           <span className='detailed-status__favorites'>
-            <FormattedNumber value={status.get('favourites_count')} />
+            <AnimatedNumber value={status.get('favourites_count')} />
           </span>
         </Link>
       );
@@ -233,7 +234,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
         <a href={`/interact/${status.get('id')}?type=favourite`} className='detailed-status__link' onClick={this.handleModalLink}>
           <Icon id='star' />
           <span className='detailed-status__favorites'>
-            <FormattedNumber value={status.get('favourites_count')} />
+            <AnimatedNumber value={status.get('favourites_count')} />
           </span>
         </a>
       );
diff --git a/app/javascript/flavours/glitch/features/status/index.js b/app/javascript/flavours/glitch/features/status/index.js
index 322f92477..411d2a88d 100644
--- a/app/javascript/flavours/glitch/features/status/index.js
+++ b/app/javascript/flavours/glitch/features/status/index.js
@@ -568,6 +568,7 @@ class Status extends ImmutablePureComponent {
             <HotKeys handlers={handlers}>
               <div className='focusable' tabIndex='0' aria-label={textForScreenReader(intl, status, false, !status.get('hidden'))}>
                 <DetailedStatus
+                  key={`details-${status.get('id')}`}
                   status={status}
                   settings={settings}
                   onOpenVideo={this.handleOpenVideo}
@@ -580,6 +581,7 @@ class Status extends ImmutablePureComponent {
                 />
 
                 <ActionBar
+                  key={`action-bar-${status.get('id')}`}
                   status={status}
                   onReply={this.handleReplyClick}
                   onFavourite={this.handleFavouriteClick}
diff --git a/app/javascript/flavours/glitch/features/ui/components/media_modal.js b/app/javascript/flavours/glitch/features/ui/components/media_modal.js
index c7d6c374c..23e8dac7e 100644
--- a/app/javascript/flavours/glitch/features/ui/components/media_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/media_modal.js
@@ -191,7 +191,6 @@ class MediaModal extends ImmutablePureComponent {
             style={swipeableViewsStyle}
             containerStyle={containerStyle}
             onChangeIndex={this.handleSwipe}
-            onSwitching={this.handleSwitching}
             index={index}
           >
             {content}
diff --git a/app/javascript/flavours/glitch/features/ui/index.js b/app/javascript/flavours/glitch/features/ui/index.js
index 5c861fdee..9f9ef561a 100644
--- a/app/javascript/flavours/glitch/features/ui/index.js
+++ b/app/javascript/flavours/glitch/features/ui/index.js
@@ -12,7 +12,7 @@ import { expandHomeTimeline } from 'flavours/glitch/actions/timelines';
 import { expandNotifications, notificationsSetVisibility } from 'flavours/glitch/actions/notifications';
 import { fetchFilters } from 'flavours/glitch/actions/filters';
 import { clearHeight } from 'flavours/glitch/actions/height_cache';
-import { submitMarkers } from 'flavours/glitch/actions/markers';
+import { submitMarkers, fetchMarkers } from 'flavours/glitch/actions/markers';
 import { WrappedSwitch, WrappedRoute } from 'flavours/glitch/util/react_router_helpers';
 import UploadArea from './components/upload_area';
 import PermaLink from 'flavours/glitch/components/permalink';
@@ -388,6 +388,7 @@ class UI extends React.Component {
 
     this.favicon = new Favico({ animation:"none" });
 
+    this.props.dispatch(fetchMarkers());
     this.props.dispatch(expandHomeTimeline());
     this.props.dispatch(expandNotifications());
     setTimeout(() => this.props.dispatch(fetchFilters()), 500);
diff --git a/app/javascript/flavours/glitch/locales/ast.js b/app/javascript/flavours/glitch/locales/ast.js
new file mode 100644
index 000000000..41355c24c
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ast.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/ast.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/bn.js b/app/javascript/flavours/glitch/locales/bn.js
new file mode 100644
index 000000000..a453498b3
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/bn.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/bn.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/br.js b/app/javascript/flavours/glitch/locales/br.js
new file mode 100644
index 000000000..966bd1b2f
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/br.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/br.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/co.js b/app/javascript/flavours/glitch/locales/co.js
new file mode 100644
index 000000000..6e9e46797
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/co.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/co.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/cs.js b/app/javascript/flavours/glitch/locales/cs.js
new file mode 100644
index 000000000..ac7db0327
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/cs.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/cs.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/cy.js b/app/javascript/flavours/glitch/locales/cy.js
new file mode 100644
index 000000000..09412bd72
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/cy.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/cy.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/da.js b/app/javascript/flavours/glitch/locales/da.js
new file mode 100644
index 000000000..2b08806be
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/da.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/da.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/el.js b/app/javascript/flavours/glitch/locales/el.js
new file mode 100644
index 000000000..2d9bb829f
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/el.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/el.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/es-AR.js b/app/javascript/flavours/glitch/locales/es-AR.js
new file mode 100644
index 000000000..0dffabcd4
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/es-AR.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/es-AR.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/et.js b/app/javascript/flavours/glitch/locales/et.js
new file mode 100644
index 000000000..e3ea6b2a9
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/et.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/et.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/eu.js b/app/javascript/flavours/glitch/locales/eu.js
new file mode 100644
index 000000000..946410b67
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/eu.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/eu.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ga.js b/app/javascript/flavours/glitch/locales/ga.js
new file mode 100644
index 000000000..af2846ff8
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ga.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/ga.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/gl.js b/app/javascript/flavours/glitch/locales/gl.js
new file mode 100644
index 000000000..6a9140b1a
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/gl.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/gl.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/hi.js b/app/javascript/flavours/glitch/locales/hi.js
new file mode 100644
index 000000000..1a569495f
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/hi.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/hi.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/hy.js b/app/javascript/flavours/glitch/locales/hy.js
new file mode 100644
index 000000000..96f6a4d19
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/hy.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/hy.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/is.js b/app/javascript/flavours/glitch/locales/is.js
new file mode 100644
index 000000000..b05a08ad0
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/is.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/is.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ka.js b/app/javascript/flavours/glitch/locales/ka.js
new file mode 100644
index 000000000..3e06f4282
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ka.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/ka.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/kab.js b/app/javascript/flavours/glitch/locales/kab.js
new file mode 100644
index 000000000..5ed1156ef
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/kab.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/kab.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/kk.js b/app/javascript/flavours/glitch/locales/kk.js
new file mode 100644
index 000000000..8d00fb035
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/kk.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/kk.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/kn.js b/app/javascript/flavours/glitch/locales/kn.js
new file mode 100644
index 000000000..1c50e3628
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/kn.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/kn.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/lt.js b/app/javascript/flavours/glitch/locales/lt.js
new file mode 100644
index 000000000..47453aeeb
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/lt.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/lt.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/lv.js b/app/javascript/flavours/glitch/locales/lv.js
new file mode 100644
index 000000000..cdbcdf799
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/lv.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/lv.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/mk.js b/app/javascript/flavours/glitch/locales/mk.js
new file mode 100644
index 000000000..55e510b59
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/mk.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/mk.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ml.js b/app/javascript/flavours/glitch/locales/ml.js
new file mode 100644
index 000000000..d00331a1a
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ml.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/ml.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/mr.js b/app/javascript/flavours/glitch/locales/mr.js
new file mode 100644
index 000000000..fb3cde92a
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/mr.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/mr.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ms.js b/app/javascript/flavours/glitch/locales/ms.js
new file mode 100644
index 000000000..61033c521
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ms.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/ms.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/nn.js b/app/javascript/flavours/glitch/locales/nn.js
new file mode 100644
index 000000000..4c42368cb
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/nn.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/nn.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ro.js b/app/javascript/flavours/glitch/locales/ro.js
new file mode 100644
index 000000000..a16446c6a
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ro.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/ro.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sk.js b/app/javascript/flavours/glitch/locales/sk.js
new file mode 100644
index 000000000..5fba6ab97
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sk.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/sk.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sl.js b/app/javascript/flavours/glitch/locales/sl.js
new file mode 100644
index 000000000..c53c1bae8
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sl.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/sl.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sq.js b/app/javascript/flavours/glitch/locales/sq.js
new file mode 100644
index 000000000..2fb7a2973
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sq.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/sq.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sr-Latn.js b/app/javascript/flavours/glitch/locales/sr-Latn.js
new file mode 100644
index 000000000..b42d5eaaf
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sr-Latn.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/sr-Latn.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sr.js b/app/javascript/flavours/glitch/locales/sr.js
new file mode 100644
index 000000000..8793d8d1e
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sr.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/sr.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ta.js b/app/javascript/flavours/glitch/locales/ta.js
new file mode 100644
index 000000000..d6ecdcb1b
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ta.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/ta.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/te.js b/app/javascript/flavours/glitch/locales/te.js
new file mode 100644
index 000000000..afd6e4f7b
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/te.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/te.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/ur.js b/app/javascript/flavours/glitch/locales/ur.js
new file mode 100644
index 000000000..97ba291b0
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ur.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/ur.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/vi.js b/app/javascript/flavours/glitch/locales/vi.js
new file mode 100644
index 000000000..499a96727
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/vi.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/vi.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/packs/public.js b/app/javascript/flavours/glitch/packs/public.js
index 973d6ee46..d1adfb17a 100644
--- a/app/javascript/flavours/glitch/packs/public.js
+++ b/app/javascript/flavours/glitch/packs/public.js
@@ -97,15 +97,6 @@ function main() {
 
     delegate(document, '.custom-emoji', 'mouseover', getEmojiAnimationHandler('data-original'));
     delegate(document, '.custom-emoji', 'mouseout', getEmojiAnimationHandler('data-static'));
-
-    delegate(document, '.blocks-table button.icon-button', 'click', function(e) {
-      e.preventDefault();
-
-      const classList = this.firstElementChild.classList;
-      classList.toggle('fa-chevron-down');
-      classList.toggle('fa-chevron-up');
-      this.parentElement.parentElement.nextElementSibling.classList.toggle('hidden');
-    });
   });
 
   delegate(document, '.sidebar__toggle__icon', 'click', () => {
diff --git a/app/javascript/flavours/glitch/reducers/announcements.js b/app/javascript/flavours/glitch/reducers/announcements.js
new file mode 100644
index 000000000..34e08eac8
--- /dev/null
+++ b/app/javascript/flavours/glitch/reducers/announcements.js
@@ -0,0 +1,102 @@
+import {
+  ANNOUNCEMENTS_FETCH_REQUEST,
+  ANNOUNCEMENTS_FETCH_SUCCESS,
+  ANNOUNCEMENTS_FETCH_FAIL,
+  ANNOUNCEMENTS_UPDATE,
+  ANNOUNCEMENTS_REACTION_UPDATE,
+  ANNOUNCEMENTS_REACTION_ADD_REQUEST,
+  ANNOUNCEMENTS_REACTION_ADD_FAIL,
+  ANNOUNCEMENTS_REACTION_REMOVE_REQUEST,
+  ANNOUNCEMENTS_REACTION_REMOVE_FAIL,
+  ANNOUNCEMENTS_TOGGLE_SHOW,
+  ANNOUNCEMENTS_DELETE,
+  ANNOUNCEMENTS_DISMISS_SUCCESS,
+} from '../actions/announcements';
+import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
+
+const initialState = ImmutableMap({
+  items: ImmutableList(),
+  isLoading: false,
+  show: false,
+});
+
+const updateReaction = (state, id, name, updater) => state.update('items', list => list.map(announcement => {
+  if (announcement.get('id') === id) {
+    return announcement.update('reactions', reactions => {
+      const idx = reactions.findIndex(reaction => reaction.get('name') === name);
+
+      if (idx > -1) {
+        return reactions.update(idx, reaction => updater(reaction));
+      }
+
+      return reactions.push(updater(fromJS({ name, count: 0 })));
+    });
+  }
+
+  return announcement;
+}));
+
+const updateReactionCount = (state, reaction) => updateReaction(state, reaction.announcement_id, reaction.name, x => x.set('count', reaction.count));
+
+const addReaction = (state, id, name) => updateReaction(state, id, name, x => x.set('me', true).update('count', y => y + 1));
+
+const removeReaction = (state, id, name) => updateReaction(state, id, name, x => x.set('me', false).update('count', y => y - 1));
+
+const sortAnnouncements = list => list.sortBy(x => x.get('starts_at') || x.get('published_at'));
+
+const updateAnnouncement = (state, announcement) => {
+  const idx = state.get('items').findIndex(x => x.get('id') === announcement.get('id'));
+
+  if (idx > -1) {
+    // Deep merge is used because announcements from the streaming API do not contain
+    // personalized data about which reactions have been selected by the given user,
+    // and that is information we want to preserve
+    return state.update('items', list => sortAnnouncements(list.update(idx, x => x.mergeDeep(announcement))));
+  }
+
+  return state.update('items', list => sortAnnouncements(list.unshift(announcement)));
+};
+
+export default function announcementsReducer(state = initialState, action) {
+  switch(action.type) {
+  case ANNOUNCEMENTS_TOGGLE_SHOW:
+    return state.withMutations(map => {
+      map.set('show', !map.get('show'));
+    });
+  case ANNOUNCEMENTS_FETCH_REQUEST:
+    return state.set('isLoading', true);
+  case ANNOUNCEMENTS_FETCH_SUCCESS:
+    return state.withMutations(map => {
+      const items = fromJS(action.announcements);
+
+      map.set('items', items);
+      map.set('isLoading', false);
+    });
+  case ANNOUNCEMENTS_FETCH_FAIL:
+    return state.set('isLoading', false);
+  case ANNOUNCEMENTS_UPDATE:
+    return updateAnnouncement(state, fromJS(action.announcement));
+  case ANNOUNCEMENTS_REACTION_UPDATE:
+    return updateReactionCount(state, action.reaction);
+  case ANNOUNCEMENTS_REACTION_ADD_REQUEST:
+  case ANNOUNCEMENTS_REACTION_REMOVE_FAIL:
+    return addReaction(state, action.id, action.name);
+  case ANNOUNCEMENTS_REACTION_REMOVE_REQUEST:
+  case ANNOUNCEMENTS_REACTION_ADD_FAIL:
+    return removeReaction(state, action.id, action.name);
+  case ANNOUNCEMENTS_DISMISS_SUCCESS:
+    return updateAnnouncement(state, fromJS({ 'id': action.id, 'read': true }));
+  case ANNOUNCEMENTS_DELETE:
+    return state.update('items', list => {
+      const idx = list.findIndex(x => x.get('id') === action.id);
+
+      if (idx > -1) {
+        return list.delete(idx);
+      }
+
+      return list;
+    });
+  default:
+    return state;
+  }
+};
diff --git a/app/javascript/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js
index 0f807790b..92a9859d9 100644
--- a/app/javascript/flavours/glitch/reducers/compose.js
+++ b/app/javascript/flavours/glitch/reducers/compose.js
@@ -387,7 +387,7 @@ export default function compose(state = initialState, action) {
 
       if (action.status.get('spoiler_text').length > 0) {
         let spoiler_text = action.status.get('spoiler_text');
-        if (!spoiler_text.match(/^re[: ]/i)) {
+        if (action.prependCWRe && !spoiler_text.match(/^re[: ]/i)) {
           spoiler_text = 're: '.concat(spoiler_text);
         }
         map.set('spoiler', true);
diff --git a/app/javascript/flavours/glitch/reducers/index.js b/app/javascript/flavours/glitch/reducers/index.js
index 7dbca3a29..586b84749 100644
--- a/app/javascript/flavours/glitch/reducers/index.js
+++ b/app/javascript/flavours/glitch/reducers/index.js
@@ -35,8 +35,10 @@ import pinnedAccountsEditor from './pinned_accounts_editor';
 import polls from './polls';
 import identity_proofs from './identity_proofs';
 import trends from './trends';
+import announcements from './announcements';
 
 const reducers = {
+  announcements,
   dropdown_menu,
   timelines,
   meta,
diff --git a/app/javascript/flavours/glitch/reducers/local_settings.js b/app/javascript/flavours/glitch/reducers/local_settings.js
index ad94ea243..3d94d665c 100644
--- a/app/javascript/flavours/glitch/reducers/local_settings.js
+++ b/app/javascript/flavours/glitch/reducers/local_settings.js
@@ -17,6 +17,7 @@ const initialState = ImmutableMap({
   confirm_missing_media_description: false,
   confirm_boost_missing_media_description: false,
   confirm_before_clearing_draft: true,
+  prepend_cw_re: true,
   preselect_on_reply: true,
   inline_preview_cards: true,
   hicolor_privacy_icons: false,
diff --git a/app/javascript/flavours/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js
index 3623e90da..d0eb7bb5a 100644
--- a/app/javascript/flavours/glitch/reducers/notifications.js
+++ b/app/javascript/flavours/glitch/reducers/notifications.js
@@ -23,6 +23,9 @@ import {
   FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
   FOLLOW_REQUEST_REJECT_SUCCESS,
 } from 'flavours/glitch/actions/accounts';
+import {
+  MARKERS_FETCH_SUCCESS,
+} from 'flavours/glitch/actions/markers';
 import { DOMAIN_BLOCK_SUCCESS } from 'flavours/glitch/actions/domain_blocks';
 import { TIMELINE_DELETE, TIMELINE_DISCONNECT } from 'flavours/glitch/actions/timelines';
 import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
@@ -104,7 +107,7 @@ const expandNormalizedNotifications = (state, notifications, next, isLoadingRece
         mutable.update('lastReadId', id => compareId(id, items.first().get('id')) > 0 ? id : items.first().get('id'));
       }
     } else {
-      mutable.update('unread', unread => unread + items.filter(item => compareId(item.get('id'), lastReadId) > 0).size);
+      mutable.update('unread', unread => unread + items.count(item => compareId(item.get('id'), lastReadId) > 0));
     }
 
     if (!next) {
@@ -197,10 +200,24 @@ const shouldCountUnreadNotifications = (state) => {
   return !(state.get('isTabVisible') && state.get('top') && state.get('mounted') > 0);
 };
 
+const recountUnread = (state, last_read_id) => {
+  return state.withMutations(mutable => {
+    if (compareId(last_read_id, mutable.get('lastReadId')) > 0) {
+      mutable.set('lastReadId', last_read_id);
+    }
+
+    if (state.get('unread') > 0 || shouldCountUnreadNotifications(state)) {
+      mutable.set('unread', mutable.get('pendingItems').count(item => item !== null) + mutable.get('items').count(item => item && compareId(item.get('id'), last_read_id) > 0));
+    }
+  });
+}
+
 export default function notifications(state = initialState, action) {
   let st;
 
   switch(action.type) {
+  case MARKERS_FETCH_SUCCESS:
+    return action.markers.notifications ? recountUnread(state, action.markers.notifications.last_read_id) : state;
   case NOTIFICATIONS_MOUNT:
     return updateMounted(state);
   case NOTIFICATIONS_UNMOUNT:
diff --git a/app/javascript/flavours/glitch/reducers/statuses.js b/app/javascript/flavours/glitch/reducers/statuses.js
index ee8ac929d..8926e49f1 100644
--- a/app/javascript/flavours/glitch/reducers/statuses.js
+++ b/app/javascript/flavours/glitch/reducers/statuses.js
@@ -41,8 +41,7 @@ export default function statuses(state = initialState, action) {
   case FAVOURITE_REQUEST:
     return state.setIn([action.status.get('id'), 'favourited'], true);
   case UNFAVOURITE_SUCCESS:
-    const favouritesCount = action.status.get('favourites_count');
-    return state.setIn([action.status.get('id'), 'favourites_count'], favouritesCount - 1);
+    return state.updateIn([action.status.get('id'), 'favourites_count'], x => Math.max(0, x - 1));
   case FAVOURITE_FAIL:
     return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'favourited'], false);
   case BOOKMARK_REQUEST:
diff --git a/app/javascript/flavours/glitch/selectors/index.js b/app/javascript/flavours/glitch/selectors/index.js
index 8ceb71d03..ab7dac66a 100644
--- a/app/javascript/flavours/glitch/selectors/index.js
+++ b/app/javascript/flavours/glitch/selectors/index.js
@@ -27,6 +27,7 @@ export const toServerSideType = columnType => {
   case 'notifications':
   case 'public':
   case 'thread':
+  case 'account':
     return columnType;
   default:
     if (columnType.indexOf('list:') > -1) {
diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss
index d2f477d19..26a98c66f 100644
--- a/app/javascript/flavours/glitch/styles/admin.scss
+++ b/app/javascript/flavours/glitch/styles/admin.scss
@@ -186,17 +186,22 @@ $content-width: 840px;
 
       padding-bottom: 40px;
       border-bottom: 1px solid lighten($ui-base-color, 8%);
-      margin-bottom: 40px;
+
+      margin: -15px -15px 40px 0;
 
       flex-wrap: wrap;
       align-items: center;
-
       justify-content: space-between;
 
+      & > * {
+        margin-top: 15px;
+        margin-right: 15px;
+      }
+
       &-actions {
         display: inline-flex;
 
-        & > * {
+        & > :not(:first-child) {
           margin-left: 5px;
         }
       }
@@ -894,3 +899,50 @@ a.name-tag,
     color: $primary-text-color;
   }
 }
+
+.center-text {
+  text-align: center;
+}
+
+.announcements-list {
+  border: 1px solid lighten($ui-base-color, 4%);
+  border-radius: 4px;
+
+  &__item {
+    padding: 15px 0;
+    background: $ui-base-color;
+    border-bottom: 1px solid lighten($ui-base-color, 4%);
+
+    &__title {
+      padding: 0 15px;
+      display: block;
+      font-weight: 500;
+      font-size: 18px;
+      line-height: 1.5;
+      color: $secondary-text-color;
+      text-decoration: none;
+      margin-bottom: 10px;
+
+      &:hover,
+      &:focus,
+      &:active {
+        color: $primary-text-color;
+      }
+    }
+
+    &__meta {
+      padding: 0 15px;
+      color: $dark-text-color;
+    }
+
+    &__action-bar {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+    }
+
+    &:last-child {
+      border-bottom: 0;
+    }
+  }
+}
diff --git a/app/javascript/flavours/glitch/styles/components/accounts.scss b/app/javascript/flavours/glitch/styles/components/accounts.scss
index 5be4da48a..6305e2a4d 100644
--- a/app/javascript/flavours/glitch/styles/components/accounts.scss
+++ b/app/javascript/flavours/glitch/styles/components/accounts.scss
@@ -681,13 +681,13 @@
     &__links {
       font-size: 14px;
       color: $darker-text-color;
+      padding: 10px 0;
 
       a {
         display: inline-block;
         color: $darker-text-color;
         text-decoration: none;
-        padding: 10px;
-        padding-top: 20px;
+        padding: 5px 10px;
         font-weight: 500;
 
         strong {
diff --git a/app/javascript/flavours/glitch/styles/components/announcements.scss b/app/javascript/flavours/glitch/styles/components/announcements.scss
new file mode 100644
index 000000000..ac4c199cd
--- /dev/null
+++ b/app/javascript/flavours/glitch/styles/components/announcements.scss
@@ -0,0 +1,225 @@
+.announcements__item__content {
+  word-wrap: break-word;
+
+  .emojione {
+    width: 20px;
+    height: 20px;
+    margin: -3px 0 0;
+  }
+
+  p {
+    margin-bottom: 10px;
+    white-space: pre-wrap;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
+
+  a {
+    color: $secondary-text-color;
+    text-decoration: none;
+
+    &:hover {
+      text-decoration: underline;
+    }
+
+    &.mention {
+      &:hover {
+        text-decoration: none;
+
+        span {
+          text-decoration: underline;
+        }
+      }
+    }
+
+    &.unhandled-link {
+      color: lighten($ui-highlight-color, 8%);
+    }
+  }
+}
+
+.announcements {
+  background: lighten($ui-base-color, 8%);
+  font-size: 13px;
+  display: flex;
+  align-items: flex-end;
+
+  &__mastodon {
+    width: 124px;
+    flex: 0 0 auto;
+
+    @media screen and (max-width: 124px + 300px) {
+      display: none;
+    }
+  }
+
+  &__container {
+    width: calc(100% - 124px);
+    flex: 0 0 auto;
+    position: relative;
+
+    @media screen and (max-width: 124px + 300px) {
+      width: 100%;
+    }
+  }
+
+  &__item {
+    box-sizing: border-box;
+    width: 100%;
+    padding: 15px;
+    padding-right: 15px + 18px;
+    position: relative;
+    font-size: 15px;
+    line-height: 20px;
+    word-wrap: break-word;
+    font-weight: 400;
+
+    &__range {
+      display: block;
+      font-weight: 500;
+      margin-bottom: 10px;
+    }
+
+    &__unread {
+      position: absolute;
+      top: 15px;
+      right: 15px;
+      display: inline-block;
+      background: $highlight-text-color;
+      border-radius: 50%;
+      width: 0.625rem;
+      height: 0.625rem;
+      margin: 0 .15em;
+    }
+  }
+
+  &__pagination {
+    padding: 15px;
+    color: $darker-text-color;
+    position: absolute;
+    bottom: 3px;
+    right: 0;
+  }
+}
+
+.layout-multiple-columns .announcements__mastodon {
+  display: none;
+}
+
+.layout-multiple-columns .announcements__container {
+  width: 100%;
+}
+
+.reactions-bar {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  margin-top: 15px;
+  margin-left: -2px;
+  width: calc(100% - (90px - 33px));
+
+  &__item {
+    flex-shrink: 0;
+    background: lighten($ui-base-color, 12%);
+    border: 0;
+    border-radius: 3px;
+    margin: 2px;
+    cursor: pointer;
+    user-select: none;
+    padding: 0 6px;
+    display: flex;
+    align-items: center;
+    transition: all 100ms ease-in;
+    transition-property: background-color, color;
+
+    &__emoji {
+      display: block;
+      margin: 3px 0;
+      width: 16px;
+      height: 16px;
+
+      img {
+        display: block;
+        margin: 0;
+        width: 100%;
+        height: 100%;
+        min-width: auto;
+        min-height: auto;
+        vertical-align: bottom;
+        object-fit: contain;
+      }
+    }
+
+    &__count {
+      display: block;
+      min-width: 9px;
+      font-size: 13px;
+      font-weight: 500;
+      text-align: center;
+      margin-left: 6px;
+      color: $darker-text-color;
+    }
+
+    &:hover,
+    &:focus,
+    &:active {
+      background: lighten($ui-base-color, 16%);
+      transition: all 200ms ease-out;
+      transition-property: background-color, color;
+
+      &__count {
+        color: lighten($darker-text-color, 4%);
+      }
+    }
+
+    &.active {
+      transition: all 100ms ease-in;
+      transition-property: background-color, color;
+      background-color: mix(lighten($ui-base-color, 12%), $ui-highlight-color, 80%);
+
+      .reactions-bar__item__count {
+        color: lighten($highlight-text-color, 8%);
+      }
+    }
+  }
+
+  .emoji-picker-dropdown {
+    margin: 2px;
+  }
+
+  &:hover .emoji-button {
+    opacity: 0.85;
+  }
+
+  .emoji-button {
+    color: $darker-text-color;
+    margin: 0;
+    font-size: 16px;
+    width: auto;
+    flex-shrink: 0;
+    padding: 0 6px;
+    height: 22px;
+    display: flex;
+    align-items: center;
+    opacity: 0.5;
+    transition: all 100ms ease-in;
+    transition-property: background-color, color;
+
+    &:hover,
+    &:active,
+    &:focus {
+      opacity: 1;
+      color: lighten($darker-text-color, 4%);
+      transition: all 200ms ease-out;
+      transition-property: background-color, color;
+    }
+  }
+
+  &--empty {
+    .emoji-button {
+      padding: 0;
+    }
+  }
+}
diff --git a/app/javascript/flavours/glitch/styles/components/columns.scss b/app/javascript/flavours/glitch/styles/components/columns.scss
index 6ba9698c5..525dcaf90 100644
--- a/app/javascript/flavours/glitch/styles/components/columns.scss
+++ b/app/javascript/flavours/glitch/styles/components/columns.scss
@@ -224,13 +224,16 @@
 .column-header__wrapper {
   position: relative;
   flex: 0 0 auto;
+  z-index: 1;
 
   &.active {
+    box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);
+
     &::before {
       display: block;
       content: "";
       position: absolute;
-      top: 35px;
+      bottom: -13px;
       left: 0;
       right: 0;
       margin: 0 auto;
@@ -241,6 +244,11 @@
       background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);
     }
   }
+
+  .announcements {
+    z-index: 1;
+    position: relative;
+  }
 }
 
 .column-header {
@@ -273,8 +281,6 @@
   }
 
   &.active {
-    box-shadow: 0 1px 0 rgba($ui-highlight-color, 0.3);
-
     .column-header__icon {
       color: $highlight-text-color;
       text-shadow: 0 0 10px rgba($ui-highlight-color, 0.4);
@@ -378,6 +384,8 @@
   color: $darker-text-color;
   transition: max-height 150ms ease-in-out, opacity 300ms linear;
   opacity: 1;
+  z-index: 1;
+  position: relative;
 
   &.collapsed {
     max-height: 0;
diff --git a/app/javascript/flavours/glitch/styles/components/composer.scss b/app/javascript/flavours/glitch/styles/components/composer.scss
index 51287f62e..943776010 100644
--- a/app/javascript/flavours/glitch/styles/components/composer.scss
+++ b/app/javascript/flavours/glitch/styles/components/composer.scss
@@ -1,5 +1,16 @@
 .composer {
   padding: 10px;
+
+  .emoji-picker-dropdown {
+    position: absolute;
+    right: 5px;
+    top: 5px;
+
+    ::-webkit-scrollbar-track:hover,
+    ::-webkit-scrollbar-track:active {
+      background-color: rgba($base-overlay-background, 0.3);
+    }
+  }
 }
 
 .character-counter {
@@ -235,17 +246,6 @@
   }
 }
 
-.emoji-picker-dropdown {
-  position: absolute;
-  right: 5px;
-  top: 5px;
-
-  ::-webkit-scrollbar-track:hover,
-  ::-webkit-scrollbar-track:active {
-    background-color: rgba($base-overlay-background, 0.3);
-  }
-}
-
 .compose-form__autosuggest-wrapper,
 .autosuggest-input {
   position: relative;
diff --git a/app/javascript/flavours/glitch/styles/components/drawer.scss b/app/javascript/flavours/glitch/styles/components/drawer.scss
index 93a3f62ed..d5463e406 100644
--- a/app/javascript/flavours/glitch/styles/components/drawer.scss
+++ b/app/javascript/flavours/glitch/styles/components/drawer.scss
@@ -210,7 +210,7 @@
     display: block;
     object-fit: contain;
     object-position: bottom left;
-    width: 100%;
+    width: 85%;
     height: 100%;
     pointer-events: none;
     user-drag: none;
diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss
index 8e576fd86..d97ab436d 100644
--- a/app/javascript/flavours/glitch/styles/components/index.scss
+++ b/app/javascript/flavours/glitch/styles/components/index.scss
@@ -3,6 +3,14 @@
   -ms-overflow-style: -ms-autohiding-scrollbar;
 }
 
+.animated-number {
+  display: inline-flex;
+  flex-direction: column;
+  align-items: stretch;
+  overflow: hidden;
+  position: relative;
+}
+
 .link-button {
   display: block;
   font-size: 15px;
@@ -1649,3 +1657,4 @@ noscript {
 @import 'local_settings';
 @import 'error_boundary';
 @import 'single_column';
+@import 'announcements';
diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index 00f947cdc..fa26c4706 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -510,6 +510,7 @@
   .status-check-box__status {
     margin: 10px 0 10px 10px;
     flex: 1;
+    overflow: hidden;
 
     .media-gallery {
       max-width: 250px;
diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss
index 1920c33ea..396e87c6c 100644
--- a/app/javascript/flavours/glitch/styles/forms.scss
+++ b/app/javascript/flavours/glitch/styles/forms.scss
@@ -213,6 +213,12 @@ code {
     }
   }
 
+  .input.datetime .label_input select {
+    display: inline-block;
+    width: auto;
+    flex: 0;
+  }
+
   .required abbr {
     text-decoration: none;
     color: lighten($error-value-color, 12%);
diff --git a/app/javascript/flavours/glitch/styles/polls.scss b/app/javascript/flavours/glitch/styles/polls.scss
index 49d0e7f71..9c86cca58 100644
--- a/app/javascript/flavours/glitch/styles/polls.scss
+++ b/app/javascript/flavours/glitch/styles/polls.scss
@@ -170,6 +170,7 @@
 
 .compose-form__poll-wrapper {
   border-top: 1px solid darken($simple-background-color, 8%);
+  overflow-x: hidden;
 
   ul {
     padding: 10px;
diff --git a/app/javascript/flavours/glitch/styles/statuses.scss b/app/javascript/flavours/glitch/styles/statuses.scss
index 611d5185b..22fa7b3fd 100644
--- a/app/javascript/flavours/glitch/styles/statuses.scss
+++ b/app/javascript/flavours/glitch/styles/statuses.scss
@@ -222,3 +222,20 @@
     }
   }
 }
+
+.status__content__read-more-button {
+  display: block;
+  font-size: 15px;
+  line-height: 20px;
+  color: lighten($ui-highlight-color, 8%);
+  border: 0;
+  background: transparent;
+  padding: 0;
+  padding-top: 8px;
+  text-decoration: none;
+
+  &:hover,
+  &:active {
+    text-decoration: underline;
+  }
+}
diff --git a/app/javascript/flavours/glitch/util/numbers.js b/app/javascript/flavours/glitch/util/numbers.js
index f7e4ceb93..af18dcfdd 100644
--- a/app/javascript/flavours/glitch/util/numbers.js
+++ b/app/javascript/flavours/glitch/util/numbers.js
@@ -4,9 +4,13 @@ import { FormattedNumber } from 'react-intl';
 export const shortNumberFormat = number => {
   if (number < 1000) {
     return <FormattedNumber value={number} />;
-  } else if (number < 1000000) {
+  } else if (number < 10000) {
     return <Fragment><FormattedNumber value={number / 1000} maximumFractionDigits={1} />K</Fragment>;
-  } else {
+  } else if (number < 1000000) {
+    return <Fragment><FormattedNumber value={number / 1000} maximumFractionDigits={0} />K</Fragment>;
+  } else if (number < 10000000) {
     return <Fragment><FormattedNumber value={number / 1000000} maximumFractionDigits={1} />M</Fragment>;
+  } else {
+    return <Fragment><FormattedNumber value={number / 1000000} maximumFractionDigits={0} />M</Fragment>;
   }
 };
diff --git a/app/javascript/flavours/glitch/util/stream.js b/app/javascript/flavours/glitch/util/stream.js
index 50f90d44c..0cb2b228f 100644
--- a/app/javascript/flavours/glitch/util/stream.js
+++ b/app/javascript/flavours/glitch/util/stream.js
@@ -2,6 +2,14 @@ import WebSocketClient from '@gamestdio/websocket';
 
 const randomIntUpTo = max => Math.floor(Math.random() * Math.floor(max));
 
+const knownEventTypes = [
+  'update',
+  'delete',
+  'notification',
+  'conversation',
+  'filters_changed',
+];
+
 export function connectStream(path, pollingRefresh = null, callbacks = () => ({ onConnect() {}, onDisconnect() {}, onReceive() {} })) {
   return (dispatch, getState) => {
     const streamingAPIBaseURL = getState().getIn(['meta', 'streaming_api_base_url']);
@@ -69,14 +77,43 @@ export function connectStream(path, pollingRefresh = null, callbacks = () => ({
 
 
 export default function getStream(streamingAPIBaseURL, accessToken, stream, { connected, received, disconnected, reconnected }) {
-  const params = [ `stream=${stream}` ];
-
-  const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?${params.join('&')}`, accessToken);
-
-  ws.onopen      = connected;
-  ws.onmessage   = e => received(JSON.parse(e.data));
-  ws.onclose     = disconnected;
-  ws.onreconnect = reconnected;
+  const params = stream.split('&');
+  stream = params.shift();
+
+  if (streamingAPIBaseURL.startsWith('ws')) {
+    params.unshift(`stream=${stream}`);
+    const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?${params.join('&')}`, accessToken);
+
+    ws.onopen      = connected;
+    ws.onmessage   = e => received(JSON.parse(e.data));
+    ws.onclose     = disconnected;
+    ws.onreconnect = reconnected;
+
+    return ws;
+  }
+
+  stream = stream.replace(/:/g, '/');
+  params.push(`access_token=${accessToken}`);
+  const es = new EventSource(`${streamingAPIBaseURL}/api/v1/streaming/${stream}?${params.join('&')}`);
+
+  let firstConnect = true;
+  es.onopen = () => {
+    if (firstConnect) {
+      firstConnect = false;
+      connected();
+    } else {
+      reconnected();
+    }
+  };
+  for (let type of knownEventTypes) {
+    es.addEventListener(type, (e) => {
+      received({
+        event: e.type,
+        payload: e.data,
+      });
+    });
+  }
+  es.onerror = disconnected;
 
-  return ws;
+  return es;
 };
diff --git a/app/javascript/images/elephant_ui_plane.svg b/app/javascript/images/elephant_ui_plane.svg
index a2624d170..ca675c9eb 100644
--- a/app/javascript/images/elephant_ui_plane.svg
+++ b/app/javascript/images/elephant_ui_plane.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 292.85862 204.49997" width="292.85861" height="204.49997"><g transform="translate(-395.89999 -820.4)"><defs><path id="a" d="M395.89999 745.09998H690.5v279.79999H395.89999z"/></defs><clipPath id="b"><use xlink:href="#a" width="100%" height="100%" overflow="visible"/></clipPath><path class="st53" d="M339.3 1028.6c1.5-3.2 14.4-31.3 27.4-58.8-6-9.3-2-17 1.5-23.7 1.9-3.7 3.8-7.1 3.6-10.4-.8-22 8.1-38.3 22.8-41.6 2.8-.6 5.2-.9 7.5-.9 3 0 5.6.5 8.1 1.6 1.4-1.3 2.8-2.6 4.2-3.8-2.8-2.6-4.3-5.5-4.5-8.8-.3-4.5 2.2-9.5 6.8-13.7 5.3-4.8 16.5-12.9 31.7-12.9.9 0 1.7 0 2.6.1-.4-.9-1-2-2.1-2.9-2.1-1.6-1.9-3.2-1.6-4 .7-2.1 3.6-3.2 8.1-3.2 3.9 0 9.7 1.2 14 4.4.3-.7.7-1.3 1.3-1.7.5-.3 1.3-.5 2.2-.5 3.4 0 10.6 2.7 15.5 9.9 3.6 5.3 3.6 10.8.1 16 18.3 4.7 30.1 15.6 39.5 24.4 2.5 2.4 5 4.6 7.3 6.5 10.7 8.9 21.4 13.2 32.7 13.2.9 0 1.8 0 2.7-.1 2-13.5-4.1-25.5-10-35.7-6.2-10.7-6.4-12.1-4.9-13.9l.1-.1c.6-.7 1.3-1 2.1-1.1h.3c1.7 0 4.5 1 13 8.7 9.9 9 16.9 22.2 19.2 36.5 8.9-4.9 15.2-12.5 17.1-20.3 2-8.6.5-16.8-4.2-22.7l-13.1 6.1-7-16.9-15.6 3.2 7.2-19.5h.1l-.2-.5 4.6-11.1 65.7 11.9c3.1.6 3.9 2.7 3.6 4.5l-.2 1-.4-.1c-.3.4-.6.7-1 .9-.7.3-7.5 3.6-21 9.9 2.1 2.9 2.2 6.1.4 9.4-1.1 1.9-2.5 6.2.4 13.3 3.7 8.9 3.5 29.2-8.3 46.2-8.1 11.7-18.3 23-37.6 26.6-3 4.6-6.5 9-10.2 12.6-7.8 7.6-24 15.3-42.3 15.3-5.3 0-10.7-.6-15.9-1.9-7.6 12.9-10.5 26.2-10.6 32.1-.2 11 .9 16.1.9 16.2l.4 1.8-164.9.8.9-2.3z" clip-path="url(#b)"/><path class="st53" d="M339.8 1028.8c.1-.3 13.9-30.1 27.5-59.1-6.1-9.2-2.1-16.8 1.4-23.5 2-3.7 3.8-7.3 3.7-10.6-.8-21.7 8-37.9 22.4-41 2.7-.6 5.1-.9 7.4-.9 3 0 5.7.5 8.2 1.7 1.6-1.6 3.2-3 4.9-4.4-3-2.6-4.6-5.5-4.8-8.8-.3-4.4 2.1-9.2 6.6-13.3 5.3-4.8 16.4-12.8 31.4-12.8 1.1 0 2.2 0 3.3.1-.3-1.1-1-2.7-2.5-3.8-1.8-1.4-1.7-2.8-1.5-3.4.6-1.8 3.4-2.9 7.6-2.9 4.4 0 10.3 1.5 14.3 4.8.1-.9.6-1.7 1.3-2.1.4-.3 1.1-.4 1.9-.4 3.3 0 10.3 2.6 15.1 9.7 3.6 5.3 3.5 10.9-.3 16.1 18.6 4.6 30.5 15.6 40 24.4 2.6 2.4 5 4.6 7.3 6.5 10.8 8.9 21.6 13.3 33.1 13.3 1 0 2.1 0 3.1-.1 2.2-13.9-4-26.1-10-36.4-6.3-10.9-6.2-11.8-5-13.3l.1-.1c.2-.2.7-.9 1.8-.9h.2c1.5 0 4.2 1 12.7 8.6 10 9.1 17 22.5 19.2 36.9 9.3-5 16-12.8 17.9-20.9 2.1-8.9.4-17.4-4.5-23.4l-13 6.1-6.9-16.8-15.1 3.1 6.8-18.4h.6l-.5-1 4.4-10.6 65.3 11.8c3.5.7 3.3 3.2 3.2 3.9l-.1.5h-.2c-.2.4-.6.8-1 1-.7.3-7.9 3.7-21.6 10.2.1.1.2.2.3.4 2 2.7 2.2 5.8.4 8.9-1.1 2-2.6 6.4.4 13.7 3.6 8.8 3.4 28.8-8.2 45.7-8.1 11.7-18.2 22.9-37.5 26.4-3 4.7-6.5 9.1-10.3 12.7-7.8 7.5-23.7 15.1-42 15.1-5.4 0-10.9-.7-16.1-2-7.7 13.1-10.7 26.7-10.9 32.7-.2 11.1.9 16.2.9 16.3l.3 1.2-163.5.8.5-1.7z" clip-path="url(#b)"/><path d="M577.5 843.7l-1-2.1 3.9-9.4 64.5 11.6c2.4.5 2.5 2 2.4 2.8" clip-path="url(#b)" fill="#fff" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M584.2 856.7l6.9 16.6s53.7-25.1 55.5-26c.9-.5 1.5-2.2-1-2.3-2.5-.1-69.6-1.4-69.6-1.4l-5.9 16 14.1-2.9z" clip-path="url(#b)" fill="#fff" stroke="#000" stroke-width="1.70000005" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M585.1 857l58.9-11.2 1.4-.5h.4c.8 0 .7.3.8.6.1.3-.1.6-.4.8L587 861.5l-1.9-4.5z" clip-path="url(#b)" fill="#d1d3d4"/><path class="st57" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M584.20001 856.70001l61.79999-11.5"/><path class="st58" d="M388.5 927.9c20-40 49.9-56.3 83.4-54.9 33.6 1.4 48.8 21.7 62.4 32.9 13.6 11.2 27.5 15.6 43.4 12.5 15.9-3.1 28.5-14.6 31.2-26.1 2.7-11.5-1-20.7-6.1-25.8-5.1-5.1-1.4-8.1 4.1-6.8 5.4 1.4 8.1 3.4 8.1 3.4s7.8-6.4 9.8-3.7c2 2.7 1.7 5.4.3 7.8-1.4 2.4-2.7 7.1.3 14.6 3.1 7.5 4.1 27.1-8.1 44.8-12.2 17.6-26.5 30.1-62.1 26.5-38.5-3.9-54.6 44.2-54.9 59-.2 11.5.9 16.5.9 16.5l-160.7.8c.2-.1 33.4-72.4 48-101.5z" clip-path="url(#b)" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st59" d="M399.4 989.3c-6.1 0-9.9-4.3-10-4.3l-.2-.2-.3.1c-3.1 1-6.1 1.5-9 1.5-6.1 0-11.4-2.2-15.6-6.5 1.4-3 2.9-6.1 4.3-9.1.1.1.1.2.2.3 6.1 8 12.7 9.7 17 9.7 3.2 0 5.6-.9 6.6-1.3.7 1.3 3 4.7 7.5 4.7 1.2 0 2.5-.3 3.9-.8 6.7-2.5 15.7-13.1 18.3-22.1 3.2 5.7-2.8 18.3-13.8 25.3-3 1.7-6 2.7-8.9 2.7zm24.5-78.1c-5.7-11.1-10.8-14.2-12.4-14.9 15.7-15.3 34.7-23 56.6-23 1.3 0 2.5 0 3.8.1 2.1.1 4.2.3 6.4.5 1.5 2.7-.4 5.6-.8 6.3-3 .8-11.2 6.5-18.5 11.6-1.9 1.3-3.7 2.6-5.3 3.7-5.3 3.7-13.6 4.2-18 4.2-1.8 0-2.9-.1-2.9-.1h-.3l-8.6 11.6zm95.3 49c4.2-7.1 12.6-15.2 28.3-15.2 3.5 0 7.2.4 11 1.2 3.4.7 7 1.1 10.6 1.1 15.9 0 29.8-7.9 34.8-12.5 6.5-6 10.5-9.8 12-12.4 1.4-2.4 3.2-2.8 4.7-2 .1.1-.7 1.1-.6 1.1-.9 1.7-1.9 3.3-3 4.8-11.5 16.6-23.9 26.9-50 26.9-3.6 0-7.5-.2-11.6-.6-1.5-.2-3-.2-4.4-.2-9.4 0-18.1 3.2-25.9 9.4l-5.9-1.6z" clip-path="url(#b)" fill="#38434f"/><path class="st58" d="M427.4 920.5c-9.1-24.2-19-27.9-32.4-25-13.4 3-22.4 18-21.6 40 .4 10.2-15.5 20.5-4.3 35s23.5 8 23.5 8 3 7.1 11 4.1 16.7-13.5 18.5-21.6" clip-path="url(#b)" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st59" d="M417.2 934.2c-7.3.5-8.6-4.8-7.3-7 1.2-2.1 4.6-3.2 4.6-3.2s-5.3-.2-6.3-4c-1-3.7 4-5.3 4-5.3s-2.9-8.6-13.3-6.1-14.4 11.7-14.2 19c.6 15.3-10.2 22.8 0 29.7 10.1 6.9 23.7-2.8 28.5-11.3 4.8-8.5 4-11.8 4-11.8z" clip-path="url(#b)" fill="#38434f"/><path class="st57" d="M392.6 978.6c6.3-3.9 9.1-7.5 9.1-7.5m15.5-36.9c-7.3.5-8.6-4.8-7.3-7 1.2-2.1 4.6-3.2 4.6-3.2s-5.3-.2-6.3-4c-1-3.7 4-5.3 4-5.3s-2.9-8.6-13.3-6.1-14.6 11.7-14.2 19" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M417.5 891.4c-9.8-6.9-6.2-16 .3-21.8 6.5-5.8 19-14 35.2-12.2 0 0-.2-3.5-3.1-5.8s-.5-4.5 5.5-4.5 12.9 2.6 15.8 6.9c0 0-1.4-3.2.4-4.4 1.8-1.2 10.2 1 15.6 9s1.1 14.9-5.2 19.9c-6.3 5-36.2 11.6-48.8 10.9" clip-path="url(#b)" fill="#53606c"/><g class="st53" clip-path="url(#b)"><path class="st36" d="M459.5 878.7c-11.1.6-22.1 3.3-32.9 6.1-4.1 1.1-8.2 2.2-12.4 2-.4 0-.8-.1-1.3-.1 1 1.6 2.5 3.2 4.6 4.7l15.6-2.1c11.3.7 37-4.7 46.4-9.4-6.5-1.1-13.3-1.5-20-1.2z" fill="#38434f"/></g><path class="st59" d="M417.5 890.8c-3.5-2.5-5.3-5.5-5.5-8.8-.2-3.2 1.2-6.7 4-9.9-.4 1.6-.2 3.2.5 4.7 1.2 2.5 3.6 4 6.3 4 2.1 0 4.3-.9 6.3-2.6 7.2-6 19.4-10.4 29.1-10.4 1.9 0 3.7.2 5.3.5 7.7 1.6 12.3 3.7 13.8 6.7.8 1.6.8 3.3 0 5.4-10.1 4.3-31.2 8.6-42.1 8.6-.7 0-1.4 0-2.1-.1-1.4-.1-2.8-.1-4-.1-7.5-.1-10.6 1.4-11.6 2z" clip-path="url(#b)" fill="#38434f"/><path class="st57" d="M471.2 854c2.2 3.4 1.1 6.7 1.1 6.7" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M489.6 967.9c34.6 23.5 68.7 8.7 80.2-2.4 11.4-11.1 20.8-28.5 20-45.9-.8-17.4-8.5-32.9-19.5-42.8-10.7-9.6-12.4-8.7-13.2-7.7-.8 1-1.4 1.1 5 12.2s13.4 24.6 9.5 40.2c-3.9 15.6-15.6 29.9-29.6 34-14 4-21.6-1.4-26.1-3.2 0 0 1 4-3.4 4.3-4.3.3-11.1-2.9-11.1-2.9s2.7 3 .1 5-5.9-.9-5.9-.9 2.5 2.2 1.5 3.3c-1 1.1-2.3.8-4.2-.6 0 0 3.2 3.6 1 5.5s-4.3 1.9-4.3 1.9z" clip-path="url(#b)" fill="#b3becd" stroke="#000" stroke-width="1.60000002" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M528.6 979.9c-13.1 0-25.8-3.9-37.6-11.7.9-.2 2.1-.7 3.3-1.8 1.4-1.3 1-3 .3-4.3.4.1.8.2 1.1.2.7 0 1.3-.3 1.8-.8.3-.3.4-.6.4-1 0-.3-.1-.6-.2-.9.6.2 1.2.4 1.9.4.9 0 1.7-.3 2.4-.8.3-.2.5-.5.7-.8 12.6 6.2 22.6 9.1 31.5 9.1 7.8 0 14.7-2.3 21.1-6.9 16.8-12.3 21.3-21.3 24.6-27.9l.3-.6c2.3-4.5 4.2-6.5 6.4-6.5.9 0 1.7.3 2.7.9-1.4 13.6-8.7 28-19.6 38.6-7.9 7.4-23.4 14.8-41.1 14.8z" clip-path="url(#b)" fill="#92a1b5"/><path class="st57" d="M489.6 967.9c-3.9.1-6.7-.9-6.7-.9" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M484 908.3c-2.2.9-2.1 3.2.1 6.7 2.1 3.5 4.5 7.9 5.9 10.3 1.4 2.4 2.6 3.5 4 2.8 1.4-.6 1.8-2 .4-4.9-1.4-2.9-5.8-11-7.2-12.7-1.6-1.7-2.4-2.5-3.2-2.2z" clip-path="url(#b)" fill="#38434f" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st57" d="M525.9 907.8c2.5-3.7 4.8-5.2 4.8-5.2m3.8 11.9c1.5-3.1 3.7-5.6 3.7-5.6m11.9 13.3c1-3.9 2.7-5.6 2.7-5.6m10.7 9c.6-4.6.9-6.6.9-6.6" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><g class="st53" clip-path="url(#b)"><path class="st49" d="M504.9 862.2c.8-.4 1.5-.8 2.2-1.1" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M519.8 856.2c13.6-3.5 22.1.5 28.2 3.3 5.3 2.4 11.6 4.7 17.6 5.3" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="4.5286,13.5857"/><path class="st49" d="M572.4 864.5c.8-.2 1.6-.4 2.4-.7" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></g><g class="st53" clip-path="url(#b)"><path d="M491.2 946.7c-4.1 1.1-6.1 1.8-10 3.5-2.1.9-4.6.1-5.6-1.9s0-4.6 2.3-5.6c4.3-1.9 6.6-2.7 11.2-3.9 2.4-.6 4.8.8 5.3 2.9.4 2.2-1 4.4-3.2 5z" fill="#505762"/></g><path class="st57" d="M515.8 952.3c-.2-2.3-1.7-3.3-1.7-3.3" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><g class="st53" clip-path="url(#b)"><path d="M454.5 887.5c-3.5.7-7.1 1.3-10.6 1.7-3.6.4-7.2.8-10.8.6-.3 0-.5-.2-.5-.5s.2-.5.5-.5c3.5.2 7.1-.1 10.6-.4 3.5-.4 7.1-.9 10.6-1.6.2 0 .4.1.4.3.1.2 0 .4-.2.4z"/></g><g class="st53" clip-path="url(#b)"><path d="M417.2 891.8c-2.2-1.6-4.3-3.6-5.4-6.2l-.4-1-.2-1-.1-.5v-.5c0-.4-.1-.7-.1-1.1 0-1.4.2-2.8.7-4.1.9-2.6 2.6-4.9 4.4-6.9 1.9-2 4-3.6 6.2-5.2s4.6-2.9 7-4.1c2.4-1.2 5-2.2 7.6-2.9 5.2-1.5 10.7-1.9 16.1-1.4l-.6.5c-.2-1.3-.7-2.7-1.4-3.8-.4-.6-.8-1.1-1.4-1.5-.5-.5-1.2-1-1.5-1.9-.1-.2-.1-.5-.1-.7.1-.2.1-.5.2-.7.2-.4.6-.7.9-.9.7-.5 1.4-.7 2.2-.9 1.5-.3 3-.4 4.4-.4 2.9.1 5.9.7 8.6 1.8 2.7 1.1 5.3 2.8 7.1 5.3l-.9.5c-.3-.7-.5-1.3-.5-2.1-.1-.7 0-1.5.4-2.3.3-.3.5-.7 1-.8.2-.1.4-.1.6-.2.2 0 .4-.1.6-.1.7 0 1.4.1 2.1.2 1.4.3 2.6.8 3.9 1.4 1.2.6 2.4 1.3 3.5 2.1 2.2 1.6 4.1 3.6 5.6 5.9.7 1.2 1.4 2.4 1.8 3.7.3.6.4 1.3.5 2 .1.3.1.7.1 1v1c-.1 2.8-1.3 5.5-3 7.6-1.7 2.2-3.6 4-5.9 5.6-2.4 1.4-4.9 2.3-7.4 3.2-2.5.8-5.1 1.5-7.8 1.9 1.2-.5 2.5-.9 3.7-1.4l3.7-1.3c2.5-.9 5-1.8 7.2-3.2 2.1-1.5 4-3.3 5.6-5.4 1.5-2.1 2.6-4.5 2.7-7 .1-2.5-.8-5-2.2-7.1-1.4-2.2-3.2-4.1-5.3-5.6-2.1-1.5-4.4-2.8-6.9-3.4-.6-.1-1.2-.2-1.8-.2-.6 0-1 .1-1.3.5-.5.8-.2 2.3.2 3.4.1.3 0 .5-.3.6-.2.1-.4 0-.6-.2-1.6-2.3-4-3.8-6.6-4.9-2.6-1.1-5.4-1.7-8.2-1.7-1.4 0-2.8.1-4.2.4-.7.2-1.3.4-1.8.7-.5.4-.8.8-.7 1.3.1.5.6.9 1.2 1.4.6.5 1.1 1.1 1.5 1.7.9 1.3 1.4 2.7 1.6 4.3 0 .3-.2.5-.4.5h-.1c-5.3-.5-10.7-.1-15.8 1.4-2.5.7-5 1.7-7.4 2.8-2.4 1.2-4.7 2.5-6.8 4.1-2.2 1.5-4.3 3.2-6.1 5.1-1.8 1.9-3.4 4.1-4.2 6.5-.4 1.2-.6 2.5-.7 3.8 0 .3.1.6.1 1v.5l.1.5.2.9.4.9c1 2.4 2.9 4.3 5 5.8.2.2.3.5.1.7-.2.2-.4.3-.7.1z"/></g><g class="st53" clip-path="url(#b)"><path class="st36" d="M615.1 863.2c2 1.2 2.3 1.8 2.3 1.8" fill="#38434f"/><path d="M615.3 862.9l1.2.9c.2.2.4.3.6.5.2.2.3.4.5.6 0 .1 0 .2-.1.2h-.2l-.5-.5c-.2-.1-.4-.3-.6-.4-.4-.3-.8-.5-1.3-.7-.2-.1-.2-.3-.1-.5s.2-.2.5-.1c-.1 0-.1 0 0 0z"/></g></g></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 252.85863 194.49997" width="252.85863" height="194.49997"><g transform="translate(-395.89999 -830.4)"><defs><path id="a" d="M395.89999 745.09998H690.5V1024.9H395.89999z"/></defs><clipPath id="b"><use xlink:href="#a" width="100%" height="100%" overflow="visible"/></clipPath><path class="st53" d="M339.3 1028.6c1.5-3.2 14.4-31.3 27.4-58.8-6-9.3-2-17 1.5-23.7 1.9-3.7 3.8-7.1 3.6-10.4-.8-22 8.1-38.3 22.8-41.6 2.8-.6 5.2-.9 7.5-.9 3 0 5.6.5 8.1 1.6 1.4-1.3 2.8-2.6 4.2-3.8-2.8-2.6-4.3-5.5-4.5-8.8-.3-4.5 2.2-9.5 6.8-13.7 5.3-4.8 16.5-12.9 31.7-12.9.9 0 1.7 0 2.6.1-.4-.9-1-2-2.1-2.9-2.1-1.6-1.9-3.2-1.6-4 .7-2.1 3.6-3.2 8.1-3.2 3.9 0 9.7 1.2 14 4.4.3-.7.7-1.3 1.3-1.7.5-.3 1.3-.5 2.2-.5 3.4 0 10.6 2.7 15.5 9.9 3.6 5.3 3.6 10.8.1 16 18.3 4.7 30.1 15.6 39.5 24.4 2.5 2.4 5 4.6 7.3 6.5 10.7 8.9 21.4 13.2 32.7 13.2.9 0 1.8 0 2.7-.1 2-13.5-4.1-25.5-10-35.7-6.2-10.7-6.4-12.1-4.9-13.9l.1-.1c.6-.7 1.3-1 2.1-1.1h.3c1.7 0 4.5 1 13 8.7 9.9 9 16.9 22.2 19.2 36.5 8.9-4.9 15.2-12.5 17.1-20.3 2-8.6.5-16.8-4.2-22.7l-13.1 6.1-7-16.9-15.6 3.2 7.2-19.5h.1l-.2-.5 4.6-11.1 65.7 11.9c3.1.6 3.9 2.7 3.6 4.5l-.2 1-.4-.1c-.3.4-.6.7-1 .9-.7.3-7.5 3.6-21 9.9 2.1 2.9 2.2 6.1.4 9.4-1.1 1.9-2.5 6.2.4 13.3 3.7 8.9 3.5 29.2-8.3 46.2-8.1 11.7-18.3 23-37.6 26.6-3 4.6-6.5 9-10.2 12.6-7.8 7.6-24 15.3-42.3 15.3-5.3 0-10.7-.6-15.9-1.9-7.6 12.9-10.5 26.2-10.6 32.1-.2 11 .9 16.1.9 16.2l.4 1.8-164.9.8.9-2.3z" clip-path="url(#b)"/><path class="st53" d="M339.8 1028.8c.1-.3 13.9-30.1 27.5-59.1-6.1-9.2-2.1-16.8 1.4-23.5 2-3.7 3.8-7.3 3.7-10.6-.8-21.7 8-37.9 22.4-41 2.7-.6 5.1-.9 7.4-.9 3 0 5.7.5 8.2 1.7 1.6-1.6 3.2-3 4.9-4.4-3-2.6-4.6-5.5-4.8-8.8-.3-4.4 2.1-9.2 6.6-13.3 5.3-4.8 16.4-12.8 31.4-12.8 1.1 0 2.2 0 3.3.1-.3-1.1-1-2.7-2.5-3.8-1.8-1.4-1.7-2.8-1.5-3.4.6-1.8 3.4-2.9 7.6-2.9 4.4 0 10.3 1.5 14.3 4.8.1-.9.6-1.7 1.3-2.1.4-.3 1.1-.4 1.9-.4 3.3 0 10.3 2.6 15.1 9.7 3.6 5.3 3.5 10.9-.3 16.1 18.6 4.6 30.5 15.6 40 24.4 2.6 2.4 5 4.6 7.3 6.5 10.8 8.9 21.6 13.3 33.1 13.3 1 0 2.1 0 3.1-.1 2.2-13.9-4-26.1-10-36.4-6.3-10.9-6.2-11.8-5-13.3l.1-.1c.2-.2.7-.9 1.8-.9h.2c1.5 0 4.2 1 12.7 8.6 10 9.1 17 22.5 19.2 36.9 9.3-5 16-12.8 17.9-20.9 2.1-8.9.4-17.4-4.5-23.4l-13 6.1-6.9-16.8-15.1 3.1 6.8-18.4h.6l-.5-1 4.4-10.6 65.3 11.8c3.5.7 3.3 3.2 3.2 3.9l-.1.5h-.2c-.2.4-.6.8-1 1-.7.3-7.9 3.7-21.6 10.2.1.1.2.2.3.4 2 2.7 2.2 5.8.4 8.9-1.1 2-2.6 6.4.4 13.7 3.6 8.8 3.4 28.8-8.2 45.7-8.1 11.7-18.2 22.9-37.5 26.4-3 4.7-6.5 9.1-10.3 12.7-7.8 7.5-23.7 15.1-42 15.1-5.4 0-10.9-.7-16.1-2-7.7 13.1-10.7 26.7-10.9 32.7-.2 11.1.9 16.2.9 16.3l.3 1.2-163.5.8.5-1.7z" clip-path="url(#b)"/><path d="M577.5 843.7l-1-2.1 3.9-9.4 64.5 11.6c2.4.5 2.5 2 2.4 2.8" clip-path="url(#b)" stroke-miterlimit="10" fill="#fff" stroke="#000" stroke-linecap="round" stroke-linejoin="round"/><path d="M584.2 856.7l6.9 16.6s53.7-25.1 55.5-26c.9-.5 1.5-2.2-1-2.3-2.5-.1-69.6-1.4-69.6-1.4l-5.9 16 14.1-2.9z" clip-path="url(#b)" stroke-miterlimit="10" fill="#fff" stroke="#000" stroke-width="1.70000005" stroke-linecap="round" stroke-linejoin="round"/><path d="M585.1 857l58.9-11.2 1.4-.5h.4c.8 0 .7.3.8.6.1.3-.1.6-.4.8L587 861.5l-1.9-4.5z" clip-path="url(#b)" fill="#d1d3d4"/><path class="st57" clip-path="url(#b)" stroke-miterlimit="10" d="M584.20001 856.70001l61.79999-11.5" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round"/><path class="st58" d="M388.5 927.9c20-40 49.9-56.3 83.4-54.9 33.6 1.4 48.8 21.7 62.4 32.9 13.6 11.2 27.5 15.6 43.4 12.5 15.9-3.1 28.5-14.6 31.2-26.1 2.7-11.5-1-20.7-6.1-25.8-5.1-5.1-1.4-8.1 4.1-6.8 5.4 1.4 8.1 3.4 8.1 3.4s7.8-6.4 9.8-3.7c2 2.7 1.7 5.4.3 7.8-1.4 2.4-2.7 7.1.3 14.6 3.1 7.5 4.1 27.1-8.1 44.8-12.2 17.6-26.5 30.1-62.1 26.5-38.5-3.9-54.6 44.2-54.9 59-.2 11.5.9 16.5.9 16.5l-160.7.8c.2-.1 33.4-72.4 48-101.5z" clip-path="url(#b)" stroke-miterlimit="10" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round"/><path class="st59" d="M399.4 989.3c-6.1 0-9.9-4.3-10-4.3l-.2-.2-.3.1c-3.1 1-6.1 1.5-9 1.5-6.1 0-11.4-2.2-15.6-6.5 1.4-3 2.9-6.1 4.3-9.1.1.1.1.2.2.3 6.1 8 12.7 9.7 17 9.7 3.2 0 5.6-.9 6.6-1.3.7 1.3 3 4.7 7.5 4.7 1.2 0 2.5-.3 3.9-.8 6.7-2.5 15.7-13.1 18.3-22.1 3.2 5.7-2.8 18.3-13.8 25.3-3 1.7-6 2.7-8.9 2.7zm24.5-78.1c-5.7-11.1-10.8-14.2-12.4-14.9 15.7-15.3 34.7-23 56.6-23 1.3 0 2.5 0 3.8.1 2.1.1 4.2.3 6.4.5 1.5 2.7-.4 5.6-.8 6.3-3 .8-11.2 6.5-18.5 11.6-1.9 1.3-3.7 2.6-5.3 3.7-5.3 3.7-13.6 4.2-18 4.2-1.8 0-2.9-.1-2.9-.1h-.3l-8.6 11.6zm95.3 49c4.2-7.1 12.6-15.2 28.3-15.2 3.5 0 7.2.4 11 1.2 3.4.7 7 1.1 10.6 1.1 15.9 0 29.8-7.9 34.8-12.5 6.5-6 10.5-9.8 12-12.4 1.4-2.4 3.2-2.8 4.7-2 .1.1-.7 1.1-.6 1.1-.9 1.7-1.9 3.3-3 4.8-11.5 16.6-23.9 26.9-50 26.9-3.6 0-7.5-.2-11.6-.6-1.5-.2-3-.2-4.4-.2-9.4 0-18.1 3.2-25.9 9.4l-5.9-1.6z" clip-path="url(#b)" fill="#38434f"/><path class="st58" d="M427.4 920.5c-9.1-24.2-19-27.9-32.4-25-13.4 3-22.4 18-21.6 40 .4 10.2-15.5 20.5-4.3 35s23.5 8 23.5 8 3 7.1 11 4.1 16.7-13.5 18.5-21.6" clip-path="url(#b)" stroke-miterlimit="10" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round"/><path class="st59" d="M417.2 934.2c-7.3.5-8.6-4.8-7.3-7 1.2-2.1 4.6-3.2 4.6-3.2s-5.3-.2-6.3-4c-1-3.7 4-5.3 4-5.3s-2.9-8.6-13.3-6.1-14.4 11.7-14.2 19c.6 15.3-10.2 22.8 0 29.7 10.1 6.9 23.7-2.8 28.5-11.3 4.8-8.5 4-11.8 4-11.8z" clip-path="url(#b)" fill="#38434f"/><path class="st57" d="M392.6 978.6c6.3-3.9 9.1-7.5 9.1-7.5m15.5-36.9c-7.3.5-8.6-4.8-7.3-7 1.2-2.1 4.6-3.2 4.6-3.2s-5.3-.2-6.3-4c-1-3.7 4-5.3 4-5.3s-2.9-8.6-13.3-6.1-14.6 11.7-14.2 19" clip-path="url(#b)" stroke-miterlimit="10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round"/><path d="M417.5 891.4c-9.8-6.9-6.2-16 .3-21.8 6.5-5.8 19-14 35.2-12.2 0 0-.2-3.5-3.1-5.8s-.5-4.5 5.5-4.5 12.9 2.6 15.8 6.9c0 0-1.4-3.2.4-4.4 1.8-1.2 10.2 1 15.6 9s1.1 14.9-5.2 19.9c-6.3 5-36.2 11.6-48.8 10.9" clip-path="url(#b)" fill="#53606c"/><g class="st53" clip-path="url(#b)"><path class="st36" d="M459.5 878.7c-11.1.6-22.1 3.3-32.9 6.1-4.1 1.1-8.2 2.2-12.4 2-.4 0-.8-.1-1.3-.1 1 1.6 2.5 3.2 4.6 4.7l15.6-2.1c11.3.7 37-4.7 46.4-9.4-6.5-1.1-13.3-1.5-20-1.2z" fill="#38434f"/></g><path class="st59" d="M417.5 890.8c-3.5-2.5-5.3-5.5-5.5-8.8-.2-3.2 1.2-6.7 4-9.9-.4 1.6-.2 3.2.5 4.7 1.2 2.5 3.6 4 6.3 4 2.1 0 4.3-.9 6.3-2.6 7.2-6 19.4-10.4 29.1-10.4 1.9 0 3.7.2 5.3.5 7.7 1.6 12.3 3.7 13.8 6.7.8 1.6.8 3.3 0 5.4-10.1 4.3-31.2 8.6-42.1 8.6-.7 0-1.4 0-2.1-.1-1.4-.1-2.8-.1-4-.1-7.5-.1-10.6 1.4-11.6 2z" clip-path="url(#b)" fill="#38434f"/><path class="st57" d="M471.2 854c2.2 3.4 1.1 6.7 1.1 6.7" clip-path="url(#b)" stroke-miterlimit="10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round"/><path d="M489.6 967.9c34.6 23.5 68.7 8.7 80.2-2.4 11.4-11.1 20.8-28.5 20-45.9-.8-17.4-8.5-32.9-19.5-42.8-10.7-9.6-12.4-8.7-13.2-7.7-.8 1-1.4 1.1 5 12.2s13.4 24.6 9.5 40.2c-3.9 15.6-15.6 29.9-29.6 34-14 4-21.6-1.4-26.1-3.2 0 0 1 4-3.4 4.3-4.3.3-11.1-2.9-11.1-2.9s2.7 3 .1 5-5.9-.9-5.9-.9 2.5 2.2 1.5 3.3c-1 1.1-2.3.8-4.2-.6 0 0 3.2 3.6 1 5.5s-4.3 1.9-4.3 1.9z" clip-path="url(#b)" stroke-miterlimit="10" fill="#b3becd" stroke="#000" stroke-width="1.60000002" stroke-linecap="round" stroke-linejoin="round"/><path d="M528.6 979.9c-13.1 0-25.8-3.9-37.6-11.7.9-.2 2.1-.7 3.3-1.8 1.4-1.3 1-3 .3-4.3.4.1.8.2 1.1.2.7 0 1.3-.3 1.8-.8.3-.3.4-.6.4-1 0-.3-.1-.6-.2-.9.6.2 1.2.4 1.9.4.9 0 1.7-.3 2.4-.8.3-.2.5-.5.7-.8 12.6 6.2 22.6 9.1 31.5 9.1 7.8 0 14.7-2.3 21.1-6.9 16.8-12.3 21.3-21.3 24.6-27.9l.3-.6c2.3-4.5 4.2-6.5 6.4-6.5.9 0 1.7.3 2.7.9-1.4 13.6-8.7 28-19.6 38.6-7.9 7.4-23.4 14.8-41.1 14.8z" clip-path="url(#b)" fill="#92a1b5"/><path class="st57" d="M489.6 967.9c-3.9.1-6.7-.9-6.7-.9" clip-path="url(#b)" stroke-miterlimit="10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round"/><path d="M484 908.3c-2.2.9-2.1 3.2.1 6.7 2.1 3.5 4.5 7.9 5.9 10.3 1.4 2.4 2.6 3.5 4 2.8 1.4-.6 1.8-2 .4-4.9-1.4-2.9-5.8-11-7.2-12.7-1.6-1.7-2.4-2.5-3.2-2.2z" clip-path="url(#b)" stroke-miterlimit="10" fill="#38434f" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path class="st57" d="M525.9 907.8c2.5-3.7 4.8-5.2 4.8-5.2m3.8 11.9c1.5-3.1 3.7-5.6 3.7-5.6m11.9 13.3c1-3.9 2.7-5.6 2.7-5.6m10.7 9c.6-4.6.9-6.6.9-6.6" clip-path="url(#b)" stroke-miterlimit="10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round"/><g class="st53" clip-path="url(#b)"><path class="st49" d="M504.9 862.2c.8-.4 1.5-.8 2.2-1.1" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M519.8 856.2c13.6-3.5 22.1.5 28.2 3.3 5.3 2.4 11.6 4.7 17.6 5.3" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="4.5286,13.5857"/><path class="st49" d="M572.4 864.5c.8-.2 1.6-.4 2.4-.7" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></g><g class="st53" clip-path="url(#b)"><path d="M491.2 946.7c-4.1 1.1-6.1 1.8-10 3.5-2.1.9-4.6.1-5.6-1.9s0-4.6 2.3-5.6c4.3-1.9 6.6-2.7 11.2-3.9 2.4-.6 4.8.8 5.3 2.9.4 2.2-1 4.4-3.2 5z" fill="#505762"/></g><path class="st57" d="M515.8 952.3c-.2-2.3-1.7-3.3-1.7-3.3" clip-path="url(#b)" stroke-miterlimit="10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round"/><g class="st53" clip-path="url(#b)"><path d="M454.5 887.5c-3.5.7-7.1 1.3-10.6 1.7-3.6.4-7.2.8-10.8.6-.3 0-.5-.2-.5-.5s.2-.5.5-.5c3.5.2 7.1-.1 10.6-.4 3.5-.4 7.1-.9 10.6-1.6.2 0 .4.1.4.3.1.2 0 .4-.2.4z"/></g><g class="st53" clip-path="url(#b)"><path d="M417.2 891.8c-2.2-1.6-4.3-3.6-5.4-6.2l-.4-1-.2-1-.1-.5v-.5c0-.4-.1-.7-.1-1.1 0-1.4.2-2.8.7-4.1.9-2.6 2.6-4.9 4.4-6.9 1.9-2 4-3.6 6.2-5.2s4.6-2.9 7-4.1c2.4-1.2 5-2.2 7.6-2.9 5.2-1.5 10.7-1.9 16.1-1.4l-.6.5c-.2-1.3-.7-2.7-1.4-3.8-.4-.6-.8-1.1-1.4-1.5-.5-.5-1.2-1-1.5-1.9-.1-.2-.1-.5-.1-.7.1-.2.1-.5.2-.7.2-.4.6-.7.9-.9.7-.5 1.4-.7 2.2-.9 1.5-.3 3-.4 4.4-.4 2.9.1 5.9.7 8.6 1.8 2.7 1.1 5.3 2.8 7.1 5.3l-.9.5c-.3-.7-.5-1.3-.5-2.1-.1-.7 0-1.5.4-2.3.3-.3.5-.7 1-.8.2-.1.4-.1.6-.2.2 0 .4-.1.6-.1.7 0 1.4.1 2.1.2 1.4.3 2.6.8 3.9 1.4 1.2.6 2.4 1.3 3.5 2.1 2.2 1.6 4.1 3.6 5.6 5.9.7 1.2 1.4 2.4 1.8 3.7.3.6.4 1.3.5 2 .1.3.1.7.1 1v1c-.1 2.8-1.3 5.5-3 7.6-1.7 2.2-3.6 4-5.9 5.6-2.4 1.4-4.9 2.3-7.4 3.2-2.5.8-5.1 1.5-7.8 1.9 1.2-.5 2.5-.9 3.7-1.4l3.7-1.3c2.5-.9 5-1.8 7.2-3.2 2.1-1.5 4-3.3 5.6-5.4 1.5-2.1 2.6-4.5 2.7-7 .1-2.5-.8-5-2.2-7.1-1.4-2.2-3.2-4.1-5.3-5.6-2.1-1.5-4.4-2.8-6.9-3.4-.6-.1-1.2-.2-1.8-.2-.6 0-1 .1-1.3.5-.5.8-.2 2.3.2 3.4.1.3 0 .5-.3.6-.2.1-.4 0-.6-.2-1.6-2.3-4-3.8-6.6-4.9-2.6-1.1-5.4-1.7-8.2-1.7-1.4 0-2.8.1-4.2.4-.7.2-1.3.4-1.8.7-.5.4-.8.8-.7 1.3.1.5.6.9 1.2 1.4.6.5 1.1 1.1 1.5 1.7.9 1.3 1.4 2.7 1.6 4.3 0 .3-.2.5-.4.5h-.1c-5.3-.5-10.7-.1-15.8 1.4-2.5.7-5 1.7-7.4 2.8-2.4 1.2-4.7 2.5-6.8 4.1-2.2 1.5-4.3 3.2-6.1 5.1-1.8 1.9-3.4 4.1-4.2 6.5-.4 1.2-.6 2.5-.7 3.8 0 .3.1.6.1 1v.5l.1.5.2.9.4.9c1 2.4 2.9 4.3 5 5.8.2.2.3.5.1.7-.2.2-.4.3-.7.1z"/></g><g class="st53" clip-path="url(#b)"><path class="st36" d="M615.1 863.2c2 1.2 2.3 1.8 2.3 1.8" fill="#38434f"/><path d="M615.3 862.9l1.2.9c.2.2.4.3.6.5.2.2.3.4.5.6 0 .1 0 .2-.1.2h-.2l-.5-.5c-.2-.1-.4-.3-.6-.4-.4-.3-.8-.5-1.3-.7-.2-.1-.2-.3-.1-.5s.2-.2.5-.1c-.1 0-.1 0 0 0z"/></g></g></svg>
diff --git a/app/javascript/mastodon/actions/announcements.js b/app/javascript/mastodon/actions/announcements.js
new file mode 100644
index 000000000..1bdea909f
--- /dev/null
+++ b/app/javascript/mastodon/actions/announcements.js
@@ -0,0 +1,180 @@
+import api from '../api';
+import { normalizeAnnouncement } from './importer/normalizer';
+
+export const ANNOUNCEMENTS_FETCH_REQUEST = 'ANNOUNCEMENTS_FETCH_REQUEST';
+export const ANNOUNCEMENTS_FETCH_SUCCESS = 'ANNOUNCEMENTS_FETCH_SUCCESS';
+export const ANNOUNCEMENTS_FETCH_FAIL    = 'ANNOUNCEMENTS_FETCH_FAIL';
+export const ANNOUNCEMENTS_UPDATE        = 'ANNOUNCEMENTS_UPDATE';
+export const ANNOUNCEMENTS_DELETE        = 'ANNOUNCEMENTS_DELETE';
+
+export const ANNOUNCEMENTS_DISMISS_REQUEST = 'ANNOUNCEMENTS_DISMISS_REQUEST';
+export const ANNOUNCEMENTS_DISMISS_SUCCESS = 'ANNOUNCEMENTS_DISMISS_SUCCESS';
+export const ANNOUNCEMENTS_DISMISS_FAIL    = 'ANNOUNCEMENTS_DISMISS_FAIL';
+
+export const ANNOUNCEMENTS_REACTION_ADD_REQUEST = 'ANNOUNCEMENTS_REACTION_ADD_REQUEST';
+export const ANNOUNCEMENTS_REACTION_ADD_SUCCESS = 'ANNOUNCEMENTS_REACTION_ADD_SUCCESS';
+export const ANNOUNCEMENTS_REACTION_ADD_FAIL    = 'ANNOUNCEMENTS_REACTION_ADD_FAIL';
+
+export const ANNOUNCEMENTS_REACTION_REMOVE_REQUEST = 'ANNOUNCEMENTS_REACTION_REMOVE_REQUEST';
+export const ANNOUNCEMENTS_REACTION_REMOVE_SUCCESS = 'ANNOUNCEMENTS_REACTION_REMOVE_SUCCESS';
+export const ANNOUNCEMENTS_REACTION_REMOVE_FAIL    = 'ANNOUNCEMENTS_REACTION_REMOVE_FAIL';
+
+export const ANNOUNCEMENTS_REACTION_UPDATE = 'ANNOUNCEMENTS_REACTION_UPDATE';
+
+export const ANNOUNCEMENTS_TOGGLE_SHOW = 'ANNOUNCEMENTS_TOGGLE_SHOW';
+
+const noOp = () => {};
+
+export const fetchAnnouncements = (done = noOp) => (dispatch, getState) => {
+  dispatch(fetchAnnouncementsRequest());
+
+  api(getState).get('/api/v1/announcements').then(response => {
+    dispatch(fetchAnnouncementsSuccess(response.data.map(x => normalizeAnnouncement(x))));
+  }).catch(error => {
+    dispatch(fetchAnnouncementsFail(error));
+  }).finally(() => {
+    done();
+  });
+};
+
+export const fetchAnnouncementsRequest = () => ({
+  type: ANNOUNCEMENTS_FETCH_REQUEST,
+  skipLoading: true,
+});
+
+export const fetchAnnouncementsSuccess = announcements => ({
+  type: ANNOUNCEMENTS_FETCH_SUCCESS,
+  announcements,
+  skipLoading: true,
+});
+
+export const fetchAnnouncementsFail= error => ({
+  type: ANNOUNCEMENTS_FETCH_FAIL,
+  error,
+  skipLoading: true,
+  skipAlert: true,
+});
+
+export const updateAnnouncements = announcement => ({
+  type: ANNOUNCEMENTS_UPDATE,
+  announcement: normalizeAnnouncement(announcement),
+});
+
+export const dismissAnnouncement = announcementId => (dispatch, getState) => {
+  dispatch(dismissAnnouncementRequest(announcementId));
+
+  api(getState).post(`/api/v1/announcements/${announcementId}/dismiss`).then(() => {
+    dispatch(dismissAnnouncementSuccess(announcementId));
+  }).catch(error => {
+    dispatch(dismissAnnouncementFail(announcementId, error));
+  });
+};
+
+export const dismissAnnouncementRequest = announcementId => ({
+  type: ANNOUNCEMENTS_DISMISS_REQUEST,
+  id: announcementId,
+});
+
+export const dismissAnnouncementSuccess = announcementId => ({
+  type: ANNOUNCEMENTS_DISMISS_SUCCESS,
+  id: announcementId,
+});
+
+export const dismissAnnouncementFail = (announcementId, error) => ({
+  type: ANNOUNCEMENTS_DISMISS_FAIL,
+  id: announcementId,
+  error,
+});
+
+export const addReaction = (announcementId, name) => (dispatch, getState) => {
+  const announcement = getState().getIn(['announcements', 'items']).find(x => x.get('id') === announcementId);
+
+  let alreadyAdded = false;
+
+  if (announcement) {
+    const reaction = announcement.get('reactions').find(x => x.get('name') === name);
+    if (reaction && reaction.get('me')) {
+      alreadyAdded = true;
+    }
+  }
+
+  if (!alreadyAdded) {
+    dispatch(addReactionRequest(announcementId, name, alreadyAdded));
+  }
+
+  api(getState).put(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => {
+    dispatch(addReactionSuccess(announcementId, name, alreadyAdded));
+  }).catch(err => {
+    if (!alreadyAdded) {
+      dispatch(addReactionFail(announcementId, name, err));
+    }
+  });
+};
+
+export const addReactionRequest = (announcementId, name) => ({
+  type: ANNOUNCEMENTS_REACTION_ADD_REQUEST,
+  id: announcementId,
+  name,
+  skipLoading: true,
+});
+
+export const addReactionSuccess = (announcementId, name) => ({
+  type: ANNOUNCEMENTS_REACTION_ADD_SUCCESS,
+  id: announcementId,
+  name,
+  skipLoading: true,
+});
+
+export const addReactionFail = (announcementId, name, error) => ({
+  type: ANNOUNCEMENTS_REACTION_ADD_FAIL,
+  id: announcementId,
+  name,
+  error,
+  skipLoading: true,
+});
+
+export const removeReaction = (announcementId, name) => (dispatch, getState) => {
+  dispatch(removeReactionRequest(announcementId, name));
+
+  api(getState).delete(`/api/v1/announcements/${announcementId}/reactions/${name}`).then(() => {
+    dispatch(removeReactionSuccess(announcementId, name));
+  }).catch(err => {
+    dispatch(removeReactionFail(announcementId, name, err));
+  });
+};
+
+export const removeReactionRequest = (announcementId, name) => ({
+  type: ANNOUNCEMENTS_REACTION_REMOVE_REQUEST,
+  id: announcementId,
+  name,
+  skipLoading: true,
+});
+
+export const removeReactionSuccess = (announcementId, name) => ({
+  type: ANNOUNCEMENTS_REACTION_REMOVE_SUCCESS,
+  id: announcementId,
+  name,
+  skipLoading: true,
+});
+
+export const removeReactionFail = (announcementId, name, error) => ({
+  type: ANNOUNCEMENTS_REACTION_REMOVE_FAIL,
+  id: announcementId,
+  name,
+  error,
+  skipLoading: true,
+});
+
+export const updateReaction = reaction => ({
+  type: ANNOUNCEMENTS_REACTION_UPDATE,
+  reaction,
+});
+
+export const toggleShowAnnouncements = () => ({
+  type: ANNOUNCEMENTS_TOGGLE_SHOW,
+});
+
+export const deleteAnnouncement = id => ({
+  type: ANNOUNCEMENTS_DELETE,
+  id,
+});
diff --git a/app/javascript/mastodon/actions/importer/normalizer.js b/app/javascript/mastodon/actions/importer/normalizer.js
index 78f321da4..f7cbe4c1c 100644
--- a/app/javascript/mastodon/actions/importer/normalizer.js
+++ b/app/javascript/mastodon/actions/importer/normalizer.js
@@ -76,7 +76,6 @@ export function normalizeStatus(status, normalOldStatus) {
 
 export function normalizePoll(poll) {
   const normalPoll = { ...poll };
-
   const emojiMap = makeEmojiMap(normalPoll);
 
   normalPoll.options = poll.options.map((option, index) => ({
@@ -87,3 +86,12 @@ export function normalizePoll(poll) {
 
   return normalPoll;
 }
+
+export function normalizeAnnouncement(announcement) {
+  const normalAnnouncement = { ...announcement };
+  const emojiMap = makeEmojiMap(normalAnnouncement);
+
+  normalAnnouncement.contentHtml = emojify(normalAnnouncement.content, emojiMap);
+
+  return normalAnnouncement;
+}
diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js
index 798f9b37e..8a066b896 100644
--- a/app/javascript/mastodon/actions/notifications.js
+++ b/app/javascript/mastodon/actions/notifications.js
@@ -157,9 +157,9 @@ export function expandNotifications({ maxId } = {}, done = noOp) {
 
       dispatch(expandNotificationsSuccess(response.data, next ? next.uri : null, isLoadingMore, isLoadingRecent, isLoadingRecent && preferPendingItems));
       fetchRelatedRelationships(dispatch, response.data);
-      done();
     }).catch(error => {
       dispatch(expandNotificationsFail(error, isLoadingMore));
+    }).finally(() => {
       done();
     });
   };
@@ -188,6 +188,7 @@ export function expandNotificationsFail(error, isLoadingMore) {
     type: NOTIFICATIONS_EXPAND_FAIL,
     error,
     skipLoading: !isLoadingMore,
+    skipAlert: !isLoadingMore,
   };
 };
 
diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js
index 06a19afc3..5640201c6 100644
--- a/app/javascript/mastodon/actions/statuses.js
+++ b/app/javascript/mastodon/actions/statuses.js
@@ -26,8 +26,9 @@ export const STATUS_UNMUTE_REQUEST = 'STATUS_UNMUTE_REQUEST';
 export const STATUS_UNMUTE_SUCCESS = 'STATUS_UNMUTE_SUCCESS';
 export const STATUS_UNMUTE_FAIL    = 'STATUS_UNMUTE_FAIL';
 
-export const STATUS_REVEAL = 'STATUS_REVEAL';
-export const STATUS_HIDE   = 'STATUS_HIDE';
+export const STATUS_REVEAL   = 'STATUS_REVEAL';
+export const STATUS_HIDE     = 'STATUS_HIDE';
+export const STATUS_COLLAPSE = 'STATUS_COLLAPSE';
 
 export const REDRAFT = 'REDRAFT';
 
@@ -320,3 +321,11 @@ export function revealStatus(ids) {
     ids,
   };
 };
+
+export function toggleStatusCollapse(id, isCollapsed) {
+  return {
+    type: STATUS_COLLAPSE,
+    id,
+    isCollapsed,
+  };
+}
diff --git a/app/javascript/mastodon/actions/streaming.js b/app/javascript/mastodon/actions/streaming.js
index c678e9393..79b08bdda 100644
--- a/app/javascript/mastodon/actions/streaming.js
+++ b/app/javascript/mastodon/actions/streaming.js
@@ -8,6 +8,12 @@ import {
 } from './timelines';
 import { updateNotifications, expandNotifications } from './notifications';
 import { updateConversations } from './conversations';
+import {
+  fetchAnnouncements,
+  updateAnnouncements,
+  updateReaction as updateAnnouncementsReaction,
+  deleteAnnouncement,
+} from './announcements';
 import { fetchFilters } from './filters';
 import { getLocale } from '../locales';
 
@@ -44,6 +50,15 @@ export function connectTimelineStream (timelineId, path, pollingRefresh = null,
         case 'filters_changed':
           dispatch(fetchFilters());
           break;
+        case 'announcement':
+          dispatch(updateAnnouncements(JSON.parse(data.payload)));
+          break;
+        case 'announcement.reaction':
+          dispatch(updateAnnouncementsReaction(JSON.parse(data.payload)));
+          break;
+        case 'announcement.delete':
+          dispatch(deleteAnnouncement(data.payload));
+          break;
         }
       },
     };
@@ -51,7 +66,9 @@ export function connectTimelineStream (timelineId, path, pollingRefresh = null,
 }
 
 const refreshHomeTimelineAndNotification = (dispatch, done) => {
-  dispatch(expandHomeTimeline({}, () => dispatch(expandNotifications({}, done))));
+  dispatch(expandHomeTimeline({}, () =>
+    dispatch(expandNotifications({}, () =>
+      dispatch(fetchAnnouncements(done))))));
 };
 
 export const connectUserStream      = () => connectTimelineStream('home', 'user', refreshHomeTimelineAndNotification);
diff --git a/app/javascript/mastodon/actions/timelines.js b/app/javascript/mastodon/actions/timelines.js
index bc2ac5e82..054668655 100644
--- a/app/javascript/mastodon/actions/timelines.js
+++ b/app/javascript/mastodon/actions/timelines.js
@@ -98,9 +98,9 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
       dispatch(importFetchedStatuses(response.data));
       dispatch(expandTimelineSuccess(timelineId, response.data, next ? next.uri : null, response.status === 206, isLoadingRecent, isLoadingMore, isLoadingRecent && preferPendingItems));
-      done();
     }).catch(error => {
       dispatch(expandTimelineFail(timelineId, error, isLoadingMore));
+    }).finally(() => {
       done();
     });
   };
diff --git a/app/javascript/mastodon/components/animated_number.js b/app/javascript/mastodon/components/animated_number.js
new file mode 100644
index 000000000..f3127c88e
--- /dev/null
+++ b/app/javascript/mastodon/components/animated_number.js
@@ -0,0 +1,65 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { FormattedNumber } from 'react-intl';
+import TransitionMotion from 'react-motion/lib/TransitionMotion';
+import spring from 'react-motion/lib/spring';
+import { reduceMotion } from 'mastodon/initial_state';
+
+export default class AnimatedNumber extends React.PureComponent {
+
+  static propTypes = {
+    value: PropTypes.number.isRequired,
+  };
+
+  state = {
+    direction: 1,
+  };
+
+  componentWillReceiveProps (nextProps) {
+    if (nextProps.value > this.props.value) {
+      this.setState({ direction: 1 });
+    } else if (nextProps.value < this.props.value) {
+      this.setState({ direction: -1 });
+    }
+  }
+
+  willEnter = () => {
+    const { direction } = this.state;
+
+    return { y: -1 * direction };
+  }
+
+  willLeave = () => {
+    const { direction } = this.state;
+
+    return { y: spring(1 * direction, { damping: 35, stiffness: 400 }) };
+  }
+
+  render () {
+    const { value } = this.props;
+    const { direction } = this.state;
+
+    if (reduceMotion) {
+      return <FormattedNumber value={value} />;
+    }
+
+    const styles = [{
+      key: `${value}`,
+      data: value,
+      style: { y: spring(0, { damping: 35, stiffness: 400 }) },
+    }];
+
+    return (
+      <TransitionMotion styles={styles} willEnter={this.willEnter} willLeave={this.willLeave}>
+        {items => (
+          <span className='animated-number'>
+            {items.map(({ key, data, style }) => (
+              <span key={key} style={{ position: (direction * style.y) > 0 ? 'absolute' : 'static', transform: `translateY(${style.y * 100}%)` }}><FormattedNumber value={data} /></span>
+            ))}
+          </span>
+        )}
+      </TransitionMotion>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/components/column_header.js b/app/javascript/mastodon/components/column_header.js
index 0038995c8..ea82f9ef9 100644
--- a/app/javascript/mastodon/components/column_header.js
+++ b/app/javascript/mastodon/components/column_header.js
@@ -33,6 +33,7 @@ class ColumnHeader extends React.PureComponent {
     onPin: PropTypes.func,
     onMove: PropTypes.func,
     onClick: PropTypes.func,
+    appendContent: PropTypes.node,
   };
 
   state = {
@@ -81,7 +82,7 @@ class ColumnHeader extends React.PureComponent {
   }
 
   render () {
-    const { title, icon, active, children, pinned, multiColumn, extraButton, showBackButton, intl: { formatMessage }, placeholder } = this.props;
+    const { title, icon, active, children, pinned, multiColumn, extraButton, showBackButton, intl: { formatMessage }, placeholder, appendContent } = this.props;
     const { collapsed, animating } = this.state;
 
     const wrapperClassName = classNames('column-header__wrapper', {
@@ -172,6 +173,8 @@ class ColumnHeader extends React.PureComponent {
             {(!collapsed || animating) && collapsedContent}
           </div>
         </div>
+
+        {appendContent}
       </div>
     );
 
diff --git a/app/javascript/mastodon/components/error_boundary.js b/app/javascript/mastodon/components/error_boundary.js
index 800b1c270..4e1c882e2 100644
--- a/app/javascript/mastodon/components/error_boundary.js
+++ b/app/javascript/mastodon/components/error_boundary.js
@@ -58,7 +58,7 @@ export default class ErrorBoundary extends React.PureComponent {
         <div>
           <p className='error-boundary__error'><FormattedMessage id='error.unexpected_crash.explanation' defaultMessage='Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.' /></p>
           <p><FormattedMessage id='error.unexpected_crash.next_steps' defaultMessage='Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.' /></p>
-          <p className='error-boundary__footer'>Mastodon v{version} · <a href={source_url} rel='noopener noreferrer' target='_blank'><FormattedMessage id='errors.unexpected_crash.report_issue' defaultMessage='Report issue' /></a> · <button onClick={this.handleCopyStackTrace} className={copied && 'copied'}><FormattedMessage id='errors.unexpected_crash.copy_stacktrace' defaultMessage='Copy stacktrace to clipboard' /></button></p>
+          <p className='error-boundary__footer'>Mastodon v{version} · <a href={source_url} rel='noopener noreferrer' target='_blank'><FormattedMessage id='errors.unexpected_crash.report_issue' defaultMessage='Report issue' /></a> · <button onClick={this.handleCopyStackTrace} className={copied ? 'copied' : ''}><FormattedMessage id='errors.unexpected_crash.copy_stacktrace' defaultMessage='Copy stacktrace to clipboard' /></button></p>
         </div>
       </div>
     );
diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/mastodon/components/media_gallery.js
index 12b7e5b66..cfe164a50 100644
--- a/app/javascript/mastodon/components/media_gallery.js
+++ b/app/javascript/mastodon/components/media_gallery.js
@@ -23,6 +23,7 @@ class Item extends React.PureComponent {
     onClick: PropTypes.func.isRequired,
     displayWidth: PropTypes.number,
     visible: PropTypes.bool.isRequired,
+    autoplay: PropTypes.bool,
   };
 
   static defaultProps = {
@@ -48,9 +49,13 @@ class Item extends React.PureComponent {
     }
   }
 
+  getAutoPlay() {
+    return this.props.autoplay || autoPlayGif;
+  }
+
   hoverToPlay () {
     const { attachment } = this.props;
-    return !autoPlayGif && attachment.get('type') === 'gifv';
+    return !this.getAutoPlay() && attachment.get('type') === 'gifv';
   }
 
   handleClick = (e) => {
@@ -201,7 +206,7 @@ class Item extends React.PureComponent {
         </a>
       );
     } else if (attachment.get('type') === 'gifv') {
-      const autoPlay = !isIOS() && autoPlayGif;
+      const autoPlay = !isIOS() && this.getAutoPlay();
 
       thumbnail = (
         <div className={classNames('media-gallery__gifv', { autoplay: autoPlay })}>
@@ -248,6 +253,7 @@ class MediaGallery extends React.PureComponent {
     defaultWidth: PropTypes.number,
     cacheWidth: PropTypes.func,
     visible: PropTypes.bool,
+    autoplay: PropTypes.bool,
     onToggleVisibility: PropTypes.func,
   };
 
@@ -297,7 +303,7 @@ class MediaGallery extends React.PureComponent {
   }
 
   render () {
-    const { media, intl, sensitive, height, defaultWidth, standalone } = this.props;
+    const { media, intl, sensitive, height, defaultWidth, standalone, autoplay } = this.props;
     const { visible } = this.state;
 
     const width = this.state.width || defaultWidth;
@@ -320,9 +326,9 @@ class MediaGallery extends React.PureComponent {
     const uncached = media.every(attachment => attachment.get('type') === 'unknown');
 
     if (standalone && this.isFullSizeEligible()) {
-      children = <Item standalone onClick={this.handleClick} attachment={media.get(0)} displayWidth={width} visible={visible} />;
+      children = <Item standalone autoplay={autoplay} onClick={this.handleClick} attachment={media.get(0)} displayWidth={width} visible={visible} />;
     } else {
-      children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} onClick={this.handleClick} attachment={attachment} index={i} size={size} displayWidth={width} visible={visible || uncached} />);
+      children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} autoplay={autoplay} onClick={this.handleClick} attachment={attachment} index={i} size={size} displayWidth={width} visible={visible || uncached} />);
     }
 
     if (uncached) {
diff --git a/app/javascript/mastodon/components/relative_timestamp.js b/app/javascript/mastodon/components/relative_timestamp.js
index aa4b73cfe..711181dcd 100644
--- a/app/javascript/mastodon/components/relative_timestamp.js
+++ b/app/javascript/mastodon/components/relative_timestamp.js
@@ -3,6 +3,7 @@ import { injectIntl, defineMessages } from 'react-intl';
 import PropTypes from 'prop-types';
 
 const messages = defineMessages({
+  today: { id: 'relative_time.today', defaultMessage: 'today' },
   just_now: { id: 'relative_time.just_now', defaultMessage: 'now' },
   seconds: { id: 'relative_time.seconds', defaultMessage: '{number}s' },
   minutes: { id: 'relative_time.minutes', defaultMessage: '{number}m' },
@@ -65,12 +66,14 @@ const getUnitDelay = units => {
   }
 };
 
-export const timeAgoString = (intl, date, now, year) => {
+export const timeAgoString = (intl, date, now, year, timeGiven = true) => {
   const delta = now - date.getTime();
 
   let relativeTime;
 
-  if (delta < 10 * SECOND) {
+  if (delta < DAY && !timeGiven) {
+    relativeTime = intl.formatMessage(messages.today);
+  } else if (delta < 10 * SECOND) {
     relativeTime = intl.formatMessage(messages.just_now);
   } else if (delta < 7 * DAY) {
     if (delta < MINUTE) {
@@ -91,12 +94,14 @@ export const timeAgoString = (intl, date, now, year) => {
   return relativeTime;
 };
 
-const timeRemainingString = (intl, date, now) => {
+const timeRemainingString = (intl, date, now, timeGiven = true) => {
   const delta = date.getTime() - now;
 
   let relativeTime;
 
-  if (delta < 10 * SECOND) {
+  if (delta < DAY && !timeGiven) {
+    relativeTime = intl.formatMessage(messages.today);
+  } else if (delta < 10 * SECOND) {
     relativeTime = intl.formatMessage(messages.moments_remaining);
   } else if (delta < MINUTE) {
     relativeTime = intl.formatMessage(messages.seconds_remaining, { number: Math.floor(delta / SECOND) });
@@ -173,8 +178,9 @@ class RelativeTimestamp extends React.Component {
   render () {
     const { timestamp, intl, year, futureDate } = this.props;
 
+    const timeGiven    = timestamp.includes('T');
     const date         = new Date(timestamp);
-    const relativeTime = futureDate ? timeRemainingString(intl, date, this.state.now) : timeAgoString(intl, date, this.state.now, year);
+    const relativeTime = futureDate ? timeRemainingString(intl, date, this.state.now, timeGiven) : timeAgoString(intl, date, this.state.now, year, timeGiven);
 
     return (
       <time dateTime={timestamp} title={intl.formatDate(date, dateFormatOptions)}>
diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js
index 421756803..3a490e78e 100644
--- a/app/javascript/mastodon/components/scrollable_list.js
+++ b/app/javascript/mastodon/components/scrollable_list.js
@@ -208,10 +208,13 @@ export default class ScrollableList extends PureComponent {
   }
 
   attachIntersectionObserver () {
-    this.intersectionObserverWrapper.connect({
+    let nodeOptions = {
       root: this.node,
       rootMargin: '300% 0px',
-    });
+    };
+
+    this.intersectionObserverWrapper
+      .connect(this.props.bindToDocument ? {} : nodeOptions);
   }
 
   detachIntersectionObserver () {
@@ -293,7 +296,7 @@ export default class ScrollableList extends PureComponent {
           </div>
         </div>
       );
-    } else if (isLoading || childrenCount > 0 || hasMore || !emptyMessage) {
+    } else if (isLoading || childrenCount > 0 || numPending > 0 || hasMore || !emptyMessage) {
       scrollableArea = (
         <div className={classNames('scrollable', { fullscreen })} ref={this.setRef} onMouseMove={this.handleMouseMove}>
           <div role='feed' className='item-list'>
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js
index e120278a0..0dc00cb98 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/mastodon/components/status.js
@@ -76,6 +76,7 @@ class Status extends ImmutablePureComponent {
     onEmbed: PropTypes.func,
     onHeightChange: PropTypes.func,
     onToggleHidden: PropTypes.func,
+    onToggleCollapsed: PropTypes.func,
     muted: PropTypes.bool,
     hidden: PropTypes.bool,
     unread: PropTypes.bool,
@@ -102,19 +103,6 @@ class Status extends ImmutablePureComponent {
     statusId: undefined,
   };
 
-  // Track height changes we know about to compensate scrolling
-  componentDidMount () {
-    this.didShowCard = !this.props.muted && !this.props.hidden && this.props.status && this.props.status.get('card');
-  }
-
-  getSnapshotBeforeUpdate () {
-    if (this.props.getScrollPosition) {
-      return this.props.getScrollPosition();
-    } else {
-      return null;
-    }
-  }
-
   static getDerivedStateFromProps(nextProps, prevState) {
     if (nextProps.status && nextProps.status.get('id') !== prevState.statusId) {
       return {
@@ -126,32 +114,6 @@ class Status extends ImmutablePureComponent {
     }
   }
 
-  // Compensate height changes
-  componentDidUpdate (prevProps, prevState, snapshot) {
-    const doShowCard  = !this.props.muted && !this.props.hidden && this.props.status && this.props.status.get('card');
-
-    if (doShowCard && !this.didShowCard) {
-      this.didShowCard = true;
-
-      if (snapshot !== null && this.props.updateScrollBottom) {
-        if (this.node && this.node.offsetTop < snapshot.top) {
-          this.props.updateScrollBottom(snapshot.height - snapshot.top);
-        }
-      }
-    }
-  }
-
-  componentWillUnmount() {
-    if (this.node && this.props.getScrollPosition) {
-      const position = this.props.getScrollPosition();
-      if (position !== null && this.node.offsetTop < position.top) {
-        requestAnimationFrame(() => {
-          this.props.updateScrollBottom(position.height - position.top);
-        });
-      }
-    }
-  }
-
   handleToggleMediaVisibility = () => {
     this.setState({ showMedia: !this.state.showMedia });
   }
@@ -196,7 +158,11 @@ class Status extends ImmutablePureComponent {
 
   handleExpandedToggle = () => {
     this.props.onToggleHidden(this._properStatus());
-  };
+  }
+
+  handleCollapsedToggle = isCollapsed => {
+    this.props.onToggleCollapsed(this._properStatus(), isCollapsed);
+  }
 
   renderLoadingMediaGallery () {
     return <div className='media-gallery' style={{ height: '110px' }} />;
@@ -466,7 +432,7 @@ class Status extends ImmutablePureComponent {
               </a>
             </div>
 
-            <StatusContent status={status} onClick={this.handleClick} expanded={!status.get('hidden')} onExpandedToggle={this.handleExpandedToggle} collapsable />
+            <StatusContent status={status} onClick={this.handleClick} expanded={!status.get('hidden')} onExpandedToggle={this.handleExpandedToggle} collapsable onCollapsedToggle={this.handleCollapsedToggle} />
 
             {media}
 
diff --git a/app/javascript/mastodon/components/status_content.js b/app/javascript/mastodon/components/status_content.js
index d13091325..5d921fd41 100644
--- a/app/javascript/mastodon/components/status_content.js
+++ b/app/javascript/mastodon/components/status_content.js
@@ -23,11 +23,11 @@ export default class StatusContent extends React.PureComponent {
     onExpandedToggle: PropTypes.func,
     onClick: PropTypes.func,
     collapsable: PropTypes.bool,
+    onCollapsedToggle: PropTypes.func,
   };
 
   state = {
     hidden: true,
-    collapsed: null, //  `collapsed: null` indicates that an element doesn't need collapsing, while `true` or `false` indicates that it does (and is/isn't).
   };
 
   _updateStatusLinks () {
@@ -62,14 +62,16 @@ export default class StatusContent extends React.PureComponent {
       link.setAttribute('rel', 'noopener noreferrer');
     }
 
-    if (
-      this.props.collapsable
-      && this.props.onClick
-      && this.state.collapsed === null
-      && node.clientHeight > MAX_HEIGHT
-      && this.props.status.get('spoiler_text').length === 0
-    ) {
-      this.setState({ collapsed: true });
+    if (this.props.status.get('collapsed', null) === null) {
+      let collapsed =
+          this.props.collapsable
+          && this.props.onClick
+          && node.clientHeight > MAX_HEIGHT
+          && this.props.status.get('spoiler_text').length === 0;
+
+      if(this.props.onCollapsedToggle) this.props.onCollapsedToggle(collapsed);
+
+      this.props.status.set('collapsed', collapsed);
     }
   }
 
@@ -178,6 +180,7 @@ export default class StatusContent extends React.PureComponent {
     }
 
     const hidden = this.props.onExpandedToggle ? !this.props.expanded : this.state.hidden;
+    const renderReadMore = this.props.onClick && status.get('collapsed');
 
     const content = { __html: status.get('contentHtml') };
     const spoilerContent = { __html: status.get('spoilerHtml') };
@@ -185,7 +188,7 @@ export default class StatusContent extends React.PureComponent {
     const classNames = classnames('status__content', {
       'status__content--with-action': this.props.onClick && this.context.router,
       'status__content--with-spoiler': status.get('spoiler_text').length > 0,
-      'status__content--collapsed': this.state.collapsed === true,
+      'status__content--collapsed': renderReadMore,
     });
 
     if (isRtl(status.get('search_index'))) {
@@ -237,7 +240,7 @@ export default class StatusContent extends React.PureComponent {
         </div>,
       ];
 
-      if (this.state.collapsed) {
+      if (renderReadMore) {
         output.push(readMoreButton);
       }
 
diff --git a/app/javascript/mastodon/containers/status_container.js b/app/javascript/mastodon/containers/status_container.js
index 35c16a20c..2ba3a3123 100644
--- a/app/javascript/mastodon/containers/status_container.js
+++ b/app/javascript/mastodon/containers/status_container.js
@@ -23,6 +23,7 @@ import {
   deleteStatus,
   hideStatus,
   revealStatus,
+  toggleStatusCollapse,
 } from '../actions/statuses';
 import {
   unmuteAccount,
@@ -190,6 +191,10 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
     }
   },
 
+  onToggleCollapsed (status, isCollapsed) {
+    dispatch(toggleStatusCollapse(status.get('id'), isCollapsed));
+  },
+
   onBlockDomain (domain) {
     dispatch(openModal('CONFIRM', {
       message: <FormattedMessage id='confirmations.domain_block.message' defaultMessage='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.' values={{ domain: <strong>{domain}</strong> }} />,
diff --git a/app/javascript/mastodon/features/account_timeline/index.js b/app/javascript/mastodon/features/account_timeline/index.js
index 8d0cbe5a1..37622d4c0 100644
--- a/app/javascript/mastodon/features/account_timeline/index.js
+++ b/app/javascript/mastodon/features/account_timeline/index.js
@@ -115,6 +115,7 @@ class AccountTimeline extends ImmutablePureComponent {
           shouldUpdateScroll={shouldUpdateScroll}
           emptyMessage={emptyMessage}
           bindToDocument={!multiColumn}
+          timelineId='account'
         />
       </Column>
     );
diff --git a/app/javascript/mastodon/features/audio/index.js b/app/javascript/mastodon/features/audio/index.js
index 1b4cdbb4f..fda5a074f 100644
--- a/app/javascript/mastodon/features/audio/index.js
+++ b/app/javascript/mastodon/features/audio/index.js
@@ -37,15 +37,14 @@ class Audio extends React.PureComponent {
     volume: 0.5,
   };
 
-  // hard coded in components.scss
-  // any way to get ::before values programatically?
-
-  volWidth = 50;
-
+  // Hard coded in components.scss
+  // Any way to get ::before values programatically?
+  volWidth  = 50;
   volOffset = 70;
 
   volHandleOffset = v => {
     const offset = v * this.volWidth + this.volOffset;
+
     return (offset > 110) ? 110 : offset;
   }
 
@@ -61,6 +60,8 @@ class Audio extends React.PureComponent {
     if (this.waveform) {
       this._updateWaveform();
     }
+
+    window.addEventListener('scroll', this.handleScroll);
   }
 
   componentDidUpdate (prevProps) {
@@ -70,6 +71,8 @@ class Audio extends React.PureComponent {
   }
 
   componentWillUnmount () {
+    window.removeEventListener('scroll', this.handleScroll);
+
     if (this.wavesurfer) {
       this.wavesurfer.destroy();
       this.wavesurfer = null;
@@ -128,16 +131,15 @@ class Audio extends React.PureComponent {
         this.loaded = true;
       }
 
-      this.wavesurfer.play();
-      this.setState({ paused: false });
+      this.setState({ paused: false }, () => this.wavesurfer.play());
     } else {
-      this.wavesurfer.pause();
-      this.setState({ paused: true });
+      this.setState({ paused: true }, () => this.wavesurfer.pause());
     }
   }
 
   toggleMute = () => {
-    this.wavesurfer.setMute(!this.state.muted);
+    const muted = !this.state.muted;
+    this.setState({ muted }, () => this.wavesurfer.setMute(muted));
   }
 
   handleVolumeMouseDown = e => {
@@ -176,6 +178,19 @@ class Audio extends React.PureComponent {
     }
   }, 60);
 
+  handleScroll = throttle(() => {
+    if (!this.waveform || !this.wavesurfer) {
+      return;
+    }
+
+    const { top, height } = this.waveform.getBoundingClientRect();
+    const inView = (top <= (window.innerHeight || document.documentElement.clientHeight)) && (top + height >= 0);
+
+    if (!this.state.paused && !inView) {
+      this.setState({ paused: true }, () => this.wavesurfer.pause());
+    }
+  }, 150, { trailing: true })
+
   render () {
     const { height, intl, alt, editable } = this.props;
     const { paused, muted, volume, currentTime } = this.state;
diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
index e57c3c20c..582bb0d39 100644
--- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
@@ -290,6 +290,7 @@ class EmojiPickerDropdown extends React.PureComponent {
     onPickEmoji: PropTypes.func.isRequired,
     onSkinTone: PropTypes.func.isRequired,
     skinTone: PropTypes.number.isRequired,
+    button: PropTypes.node,
   };
 
   state = {
@@ -350,18 +351,18 @@ class EmojiPickerDropdown extends React.PureComponent {
   }
 
   render () {
-    const { intl, onPickEmoji, onSkinTone, skinTone, frequentlyUsedEmojis } = this.props;
+    const { intl, onPickEmoji, onSkinTone, skinTone, frequentlyUsedEmojis, button } = this.props;
     const title = intl.formatMessage(messages.emoji);
     const { active, loading, placement } = this.state;
 
     return (
       <div className='emoji-picker-dropdown' onKeyDown={this.handleKeyDown}>
         <div ref={this.setTargetRef} className='emoji-button' title={title} aria-label={title} aria-expanded={active} role='button' onClick={this.onToggle} onKeyDown={this.onToggle} tabIndex={0}>
-          <img
+          {button || <img
             className={classNames('emojione', { 'pulse-loading': active && loading })}
             alt='🙂'
             src={`${assetHost}/emoji/1f602.svg`}
-          />
+          />}
         </div>
 
         <Overlay show={active} placement={placement} target={this.findTarget}>
diff --git a/app/javascript/mastodon/features/directory/components/account_card.js b/app/javascript/mastodon/features/directory/components/account_card.js
index 50ad74450..cb47d9db4 100644
--- a/app/javascript/mastodon/features/directory/components/account_card.js
+++ b/app/javascript/mastodon/features/directory/components/account_card.js
@@ -22,6 +22,7 @@ const messages = defineMessages({
   requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' },
   unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
   unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
+  unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },
 });
 
 const makeMapStateToProps = () => {
diff --git a/app/javascript/mastodon/features/getting_started/components/announcements.js b/app/javascript/mastodon/features/getting_started/components/announcements.js
new file mode 100644
index 000000000..91cf6215e
--- /dev/null
+++ b/app/javascript/mastodon/features/getting_started/components/announcements.js
@@ -0,0 +1,436 @@
+import React from 'react';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import ReactSwipeableViews from 'react-swipeable-views';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import PropTypes from 'prop-types';
+import IconButton from 'mastodon/components/icon_button';
+import Icon from 'mastodon/components/icon';
+import { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl';
+import { autoPlayGif, reduceMotion } from 'mastodon/initial_state';
+import elephantUIPlane from 'mastodon/../images/elephant_ui_plane.svg';
+import { mascot } from 'mastodon/initial_state';
+import unicodeMapping from 'mastodon/features/emoji/emoji_unicode_mapping_light';
+import classNames from 'classnames';
+import EmojiPickerDropdown from 'mastodon/features/compose/containers/emoji_picker_dropdown_container';
+import AnimatedNumber from 'mastodon/components/animated_number';
+import TransitionMotion from 'react-motion/lib/TransitionMotion';
+import spring from 'react-motion/lib/spring';
+
+const messages = defineMessages({
+  close: { id: 'lightbox.close', defaultMessage: 'Close' },
+  previous: { id: 'lightbox.previous', defaultMessage: 'Previous' },
+  next: { id: 'lightbox.next', defaultMessage: 'Next' },
+});
+
+class Content extends ImmutablePureComponent {
+
+  static contextTypes = {
+    router: PropTypes.object,
+  };
+
+  static propTypes = {
+    announcement: ImmutablePropTypes.map.isRequired,
+  };
+
+  setRef = c => {
+    this.node = c;
+  }
+
+  componentDidMount () {
+    this._updateLinks();
+    this._updateEmojis();
+  }
+
+  componentDidUpdate () {
+    this._updateLinks();
+    this._updateEmojis();
+  }
+
+  _updateEmojis () {
+    const node = this.node;
+
+    if (!node || autoPlayGif) {
+      return;
+    }
+
+    const emojis = node.querySelectorAll('.custom-emoji');
+
+    for (var i = 0; i < emojis.length; i++) {
+      let emoji = emojis[i];
+
+      if (emoji.classList.contains('status-emoji')) {
+        continue;
+      }
+
+      emoji.classList.add('status-emoji');
+
+      emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false);
+      emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false);
+    }
+  }
+
+  _updateLinks () {
+    const node = this.node;
+
+    if (!node) {
+      return;
+    }
+
+    const links = node.querySelectorAll('a');
+
+    for (var i = 0; i < links.length; ++i) {
+      let link = links[i];
+
+      if (link.classList.contains('status-link')) {
+        continue;
+      }
+
+      link.classList.add('status-link');
+
+      let mention = this.props.announcement.get('mentions').find(item => link.href === item.get('url'));
+
+      if (mention) {
+        link.addEventListener('click', this.onMentionClick.bind(this, mention), false);
+        link.setAttribute('title', mention.get('acct'));
+      } else if (link.textContent[0] === '#' || (link.previousSibling && link.previousSibling.textContent && link.previousSibling.textContent[link.previousSibling.textContent.length - 1] === '#')) {
+        link.addEventListener('click', this.onHashtagClick.bind(this, link.text), false);
+      } else {
+        link.setAttribute('title', link.href);
+        link.classList.add('unhandled-link');
+      }
+
+      link.setAttribute('target', '_blank');
+      link.setAttribute('rel', 'noopener noreferrer');
+    }
+  }
+
+  onMentionClick = (mention, e) => {
+    if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
+      e.preventDefault();
+      this.context.router.history.push(`/accounts/${mention.get('id')}`);
+    }
+  }
+
+  onHashtagClick = (hashtag, e) => {
+    hashtag = hashtag.replace(/^#/, '');
+
+    if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {
+      e.preventDefault();
+      this.context.router.history.push(`/timelines/tag/${hashtag}`);
+    }
+  }
+
+  handleEmojiMouseEnter = ({ target }) => {
+    target.src = target.getAttribute('data-original');
+  }
+
+  handleEmojiMouseLeave = ({ target }) => {
+    target.src = target.getAttribute('data-static');
+  }
+
+  render () {
+    const { announcement } = this.props;
+
+    return (
+      <div
+        className='announcements__item__content'
+        ref={this.setRef}
+        dangerouslySetInnerHTML={{ __html: announcement.get('contentHtml') }}
+      />
+    );
+  }
+
+}
+
+const assetHost = process.env.CDN_HOST || '';
+
+class Emoji extends React.PureComponent {
+
+  static propTypes = {
+    emoji: PropTypes.string.isRequired,
+    emojiMap: ImmutablePropTypes.map.isRequired,
+    hovered: PropTypes.bool.isRequired,
+  };
+
+  render () {
+    const { emoji, emojiMap, hovered } = this.props;
+
+    if (unicodeMapping[emoji]) {
+      const { filename, shortCode } = unicodeMapping[this.props.emoji];
+      const title = shortCode ? `:${shortCode}:` : '';
+
+      return (
+        <img
+          draggable='false'
+          className='emojione'
+          alt={emoji}
+          title={title}
+          src={`${assetHost}/emoji/${filename}.svg`}
+        />
+      );
+    } else if (emojiMap.get(emoji)) {
+      const filename  = (autoPlayGif || hovered) ? emojiMap.getIn([emoji, 'url']) : emojiMap.getIn([emoji, 'static_url']);
+      const shortCode = `:${emoji}:`;
+
+      return (
+        <img
+          draggable='false'
+          className='emojione custom-emoji'
+          alt={shortCode}
+          title={shortCode}
+          src={filename}
+        />
+      );
+    } else {
+      return null;
+    }
+  }
+
+}
+
+class Reaction extends ImmutablePureComponent {
+
+  static propTypes = {
+    announcementId: PropTypes.string.isRequired,
+    reaction: ImmutablePropTypes.map.isRequired,
+    addReaction: PropTypes.func.isRequired,
+    removeReaction: PropTypes.func.isRequired,
+    emojiMap: ImmutablePropTypes.map.isRequired,
+    style: PropTypes.object,
+  };
+
+  state = {
+    hovered: false,
+  };
+
+  handleClick = () => {
+    const { reaction, announcementId, addReaction, removeReaction } = this.props;
+
+    if (reaction.get('me')) {
+      removeReaction(announcementId, reaction.get('name'));
+    } else {
+      addReaction(announcementId, reaction.get('name'));
+    }
+  }
+
+  handleMouseEnter = () => this.setState({ hovered: true })
+
+  handleMouseLeave = () => this.setState({ hovered: false })
+
+  render () {
+    const { reaction } = this.props;
+
+    let shortCode = reaction.get('name');
+
+    if (unicodeMapping[shortCode]) {
+      shortCode = unicodeMapping[shortCode].shortCode;
+    }
+
+    return (
+      <button className={classNames('reactions-bar__item', { active: reaction.get('me') })} onClick={this.handleClick} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} title={`:${shortCode}:`} style={this.props.style}>
+        <span className='reactions-bar__item__emoji'><Emoji hovered={this.state.hovered} emoji={reaction.get('name')} emojiMap={this.props.emojiMap} /></span>
+        <span className='reactions-bar__item__count'><AnimatedNumber value={reaction.get('count')} /></span>
+      </button>
+    );
+  }
+
+}
+
+class ReactionsBar extends ImmutablePureComponent {
+
+  static propTypes = {
+    announcementId: PropTypes.string.isRequired,
+    reactions: ImmutablePropTypes.list.isRequired,
+    addReaction: PropTypes.func.isRequired,
+    removeReaction: PropTypes.func.isRequired,
+    emojiMap: ImmutablePropTypes.map.isRequired,
+  };
+
+  handleEmojiPick = data => {
+    const { addReaction, announcementId } = this.props;
+    addReaction(announcementId, data.native.replace(/:/g, ''));
+  }
+
+  willEnter () {
+    return { scale: reduceMotion ? 1 : 0 };
+  }
+
+  willLeave () {
+    return { scale: reduceMotion ? 0 : spring(0, { stiffness: 170, damping: 26 }) };
+  }
+
+  render () {
+    const { reactions } = this.props;
+    const visibleReactions = reactions.filter(x => x.get('count') > 0);
+
+    const styles = visibleReactions.map(reaction => ({
+      key: reaction.get('name'),
+      data: reaction,
+      style: { scale: reduceMotion ? 1 : spring(1, { stiffness: 150, damping: 13 }) },
+    })).toArray();
+
+    return (
+      <TransitionMotion styles={styles} willEnter={this.willEnter} willLeave={this.willLeave}>
+        {items => (
+          <div className={classNames('reactions-bar', { 'reactions-bar--empty': visibleReactions.isEmpty() })}>
+            {items.map(({ key, data, style }) => (
+              <Reaction
+                key={key}
+                reaction={data}
+                style={{ transform: `scale(${style.scale})`, position: style.scale < 0.5 ? 'absolute' : 'static' }}
+                announcementId={this.props.announcementId}
+                addReaction={this.props.addReaction}
+                removeReaction={this.props.removeReaction}
+                emojiMap={this.props.emojiMap}
+              />
+            ))}
+
+            {visibleReactions.size < 8 && <EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} button={<Icon id='plus' />} />}
+          </div>
+        )}
+      </TransitionMotion>
+    );
+  }
+
+}
+
+class Announcement extends ImmutablePureComponent {
+
+  static propTypes = {
+    announcement: ImmutablePropTypes.map.isRequired,
+    emojiMap: ImmutablePropTypes.map.isRequired,
+    addReaction: PropTypes.func.isRequired,
+    removeReaction: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
+    selected: PropTypes.bool,
+  };
+
+  state = {
+    unread: !this.props.announcement.get('read'),
+  };
+
+  componentDidUpdate () {
+    const { selected, announcement } = this.props;
+    if (!selected && this.state.unread !== !announcement.get('read')) {
+      this.setState({ unread: !announcement.get('read') });
+    }
+  }
+
+  render () {
+    const { announcement } = this.props;
+    const { unread } = this.state;
+    const startsAt = announcement.get('starts_at') && new Date(announcement.get('starts_at'));
+    const endsAt = announcement.get('ends_at') && new Date(announcement.get('ends_at'));
+    const now = new Date();
+    const hasTimeRange = startsAt && endsAt;
+    const skipYear = hasTimeRange && startsAt.getFullYear() === endsAt.getFullYear() && endsAt.getFullYear() === now.getFullYear();
+    const skipEndDate = hasTimeRange && startsAt.getDate() === endsAt.getDate() && startsAt.getMonth() === endsAt.getMonth() && startsAt.getFullYear() === endsAt.getFullYear();
+    const skipTime = announcement.get('all_day');
+
+    return (
+      <div className='announcements__item'>
+        <strong className='announcements__item__range'>
+          <FormattedMessage id='announcement.announcement' defaultMessage='Announcement' />
+          {hasTimeRange && <span> · <FormattedDate value={startsAt} hour12={false} year={(skipYear || startsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month='short' day='2-digit' hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /> - <FormattedDate value={endsAt} hour12={false} year={(skipYear || endsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month={skipEndDate ? undefined : 'short'} day={skipEndDate ? undefined : '2-digit'} hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /></span>}
+        </strong>
+
+        <Content announcement={announcement} />
+
+        <ReactionsBar
+          reactions={announcement.get('reactions')}
+          announcementId={announcement.get('id')}
+          addReaction={this.props.addReaction}
+          removeReaction={this.props.removeReaction}
+          emojiMap={this.props.emojiMap}
+        />
+
+        {unread && <span className='announcements__item__unread' />}
+      </div>
+    );
+  }
+
+}
+
+export default @injectIntl
+class Announcements extends ImmutablePureComponent {
+
+  static propTypes = {
+    announcements: ImmutablePropTypes.list,
+    emojiMap: ImmutablePropTypes.map.isRequired,
+    dismissAnnouncement: PropTypes.func.isRequired,
+    addReaction: PropTypes.func.isRequired,
+    removeReaction: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
+  };
+
+  state = {
+    index: 0,
+  };
+
+  componentDidMount () {
+    this._markAnnouncementAsRead();
+  }
+
+  componentDidUpdate () {
+    this._markAnnouncementAsRead();
+  }
+
+  _markAnnouncementAsRead () {
+    const { dismissAnnouncement, announcements } = this.props;
+    const { index } = this.state;
+    const announcement = announcements.get(index);
+    if (!announcement.get('read')) dismissAnnouncement(announcement.get('id'));
+  }
+
+  handleChangeIndex = index => {
+    this.setState({ index: index % this.props.announcements.size });
+  }
+
+  handleNextClick = () => {
+    this.setState({ index: (this.state.index + 1) % this.props.announcements.size });
+  }
+
+  handlePrevClick = () => {
+    this.setState({ index: (this.props.announcements.size + this.state.index - 1) % this.props.announcements.size });
+  }
+
+  render () {
+    const { announcements, intl } = this.props;
+    const { index } = this.state;
+
+    if (announcements.isEmpty()) {
+      return null;
+    }
+
+    return (
+      <div className='announcements'>
+        <img className='announcements__mastodon' alt='' draggable='false' src={mascot || elephantUIPlane} />
+
+        <div className='announcements__container'>
+          <ReactSwipeableViews animateHeight={!reduceMotion} adjustHeight={reduceMotion} index={index} onChangeIndex={this.handleChangeIndex}>
+            {announcements.map((announcement, idx) => (
+              <Announcement
+                key={announcement.get('id')}
+                announcement={announcement}
+                emojiMap={this.props.emojiMap}
+                addReaction={this.props.addReaction}
+                removeReaction={this.props.removeReaction}
+                intl={intl}
+                selected={index === idx}
+              />
+            ))}
+          </ReactSwipeableViews>
+
+          {announcements.size > 1 && (
+            <div className='announcements__pagination'>
+              <IconButton disabled={announcements.size === 1} title={intl.formatMessage(messages.previous)} icon='chevron-left' onClick={this.handlePrevClick} size={13} />
+              <span>{index + 1} / {announcements.size}</span>
+              <IconButton disabled={announcements.size === 1} title={intl.formatMessage(messages.next)} icon='chevron-right' onClick={this.handleNextClick} size={13} />
+            </div>
+          )}
+        </div>
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/getting_started/containers/announcements_container.js b/app/javascript/mastodon/features/getting_started/containers/announcements_container.js
new file mode 100644
index 000000000..9d03ad6f7
--- /dev/null
+++ b/app/javascript/mastodon/features/getting_started/containers/announcements_container.js
@@ -0,0 +1,20 @@
+import { connect } from 'react-redux';
+import { addReaction, removeReaction, dismissAnnouncement } from 'mastodon/actions/announcements';
+import Announcements from '../components/announcements';
+import { createSelector } from 'reselect';
+import { Map as ImmutableMap } from 'immutable';
+
+const customEmojiMap = createSelector([state => state.get('custom_emojis')], items => items.reduce((map, emoji) => map.set(emoji.get('shortcode'), emoji), ImmutableMap()));
+
+const mapStateToProps = state => ({
+  announcements: state.getIn(['announcements', 'items']),
+  emojiMap: customEmojiMap(state),
+});
+
+const mapDispatchToProps = dispatch => ({
+  dismissAnnouncement: id => dispatch(dismissAnnouncement(id)),
+  addReaction: (id, name) => dispatch(addReaction(id, name)),
+  removeReaction: (id, name) => dispatch(removeReaction(id, name)),
+});
+
+export default connect(mapStateToProps, mapDispatchToProps)(Announcements);
diff --git a/app/javascript/mastodon/features/getting_started/containers/trends_container.js b/app/javascript/mastodon/features/getting_started/containers/trends_container.js
index 1df3fb4fe..7a5268780 100644
--- a/app/javascript/mastodon/features/getting_started/containers/trends_container.js
+++ b/app/javascript/mastodon/features/getting_started/containers/trends_container.js
@@ -1,5 +1,5 @@
 import { connect } from 'react-redux';
-import { fetchTrends } from '../../../actions/trends';
+import { fetchTrends } from 'mastodon/actions/trends';
 import Trends from '../components/trends';
 
 const mapStateToProps = state => ({
diff --git a/app/javascript/mastodon/features/home_timeline/index.js b/app/javascript/mastodon/features/home_timeline/index.js
index 1cafb88ed..577ff33bb 100644
--- a/app/javascript/mastodon/features/home_timeline/index.js
+++ b/app/javascript/mastodon/features/home_timeline/index.js
@@ -9,14 +9,23 @@ import { addColumn, removeColumn, moveColumn } from '../../actions/columns';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import ColumnSettingsContainer from './containers/column_settings_container';
 import { Link } from 'react-router-dom';
+import { fetchAnnouncements, toggleShowAnnouncements } from 'mastodon/actions/announcements';
+import AnnouncementsContainer from 'mastodon/features/getting_started/containers/announcements_container';
+import classNames from 'classnames';
+import IconWithBadge from 'mastodon/components/icon_with_badge';
 
 const messages = defineMessages({
   title: { id: 'column.home', defaultMessage: 'Home' },
+  show_announcements: { id: 'home.show_announcements', defaultMessage: 'Show announcements' },
+  hide_announcements: { id: 'home.hide_announcements', defaultMessage: 'Hide announcements' },
 });
 
 const mapStateToProps = state => ({
   hasUnread: state.getIn(['timelines', 'home', 'unread']) > 0,
   isPartial: state.getIn(['timelines', 'home', 'isPartial']),
+  hasAnnouncements: !state.getIn(['announcements', 'items']).isEmpty(),
+  unreadAnnouncements: state.getIn(['announcements', 'items']).count(item => !item.get('read')),
+  showAnnouncements: state.getIn(['announcements', 'show']),
 });
 
 export default @connect(mapStateToProps)
@@ -31,6 +40,9 @@ class HomeTimeline extends React.PureComponent {
     isPartial: PropTypes.bool,
     columnId: PropTypes.string,
     multiColumn: PropTypes.bool,
+    hasAnnouncements: PropTypes.bool,
+    unreadAnnouncements: PropTypes.number,
+    showAnnouncements: PropTypes.bool,
   };
 
   handlePin = () => {
@@ -61,6 +73,7 @@ class HomeTimeline extends React.PureComponent {
   }
 
   componentDidMount () {
+    this.props.dispatch(fetchAnnouncements());
     this._checkIfReloadNeeded(false, this.props.isPartial);
   }
 
@@ -93,10 +106,31 @@ class HomeTimeline extends React.PureComponent {
     }
   }
 
+  handleToggleAnnouncementsClick = (e) => {
+    e.stopPropagation();
+    this.props.dispatch(toggleShowAnnouncements());
+  }
+
   render () {
-    const { intl, shouldUpdateScroll, hasUnread, columnId, multiColumn } = this.props;
+    const { intl, shouldUpdateScroll, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props;
     const pinned = !!columnId;
 
+    let announcementsButton = null;
+
+    if (hasAnnouncements) {
+      announcementsButton = (
+        <button
+          className={classNames('column-header__button', { 'active': showAnnouncements })}
+          title={intl.formatMessage(showAnnouncements ? messages.hide_announcements : messages.show_announcements)}
+          aria-label={intl.formatMessage(showAnnouncements ? messages.hide_announcements : messages.show_announcements)}
+          aria-pressed={showAnnouncements ? 'true' : 'false'}
+          onClick={this.handleToggleAnnouncementsClick}
+        >
+          <IconWithBadge id='bullhorn' count={unreadAnnouncements} />
+        </button>
+      );
+    }
+
     return (
       <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>
         <ColumnHeader
@@ -108,6 +142,8 @@ class HomeTimeline extends React.PureComponent {
           onClick={this.handleHeaderClick}
           pinned={pinned}
           multiColumn={multiColumn}
+          extraButton={announcementsButton}
+          appendContent={hasAnnouncements && showAnnouncements && <AnnouncementsContainer />}
         >
           <ColumnSettingsContainer />
         </ColumnHeader>
diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js
index bf6469f2f..657d2bb1c 100644
--- a/app/javascript/mastodon/features/status/components/action_bar.js
+++ b/app/javascript/mastodon/features/status/components/action_bar.js
@@ -19,6 +19,7 @@ const messages = defineMessages({
   cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
   favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },
   bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },
+  more: { id: 'status.more', defaultMessage: 'More' },
   mute: { id: 'status.mute', defaultMessage: 'Mute @{name}' },
   muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },
   unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },
@@ -275,7 +276,7 @@ class ActionBar extends React.PureComponent {
         <div className='detailed-status__button'><IconButton className='bookmark-icon' active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /></div>
 
         <div className='detailed-status__action-bar-dropdown'>
-          <DropdownMenuContainer size={18} icon='ellipsis-h' status={status} items={menu} direction='left' title='More' />
+          <DropdownMenuContainer size={18} icon='ellipsis-h' status={status} items={menu} direction='left' title={intl.formatMessage(messages.more)} />
         </div>
       </div>
     );
diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js
index d5bc82735..2fec247c1 100644
--- a/app/javascript/mastodon/features/status/components/detailed_status.js
+++ b/app/javascript/mastodon/features/status/components/detailed_status.js
@@ -6,7 +6,7 @@ import DisplayName from '../../../components/display_name';
 import StatusContent from '../../../components/status_content';
 import MediaGallery from '../../../components/media_gallery';
 import { Link } from 'react-router-dom';
-import { FormattedDate, FormattedNumber } from 'react-intl';
+import { FormattedDate } from 'react-intl';
 import Card from './card';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import Video from '../../video';
@@ -14,6 +14,7 @@ import Audio from '../../audio';
 import scheduleIdleTask from '../../ui/util/schedule_idle_task';
 import classNames from 'classnames';
 import Icon from 'mastodon/components/icon';
+import AnimatedNumber from 'mastodon/components/animated_number';
 
 export default class DetailedStatus extends ImmutablePureComponent {
 
@@ -172,7 +173,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
         <Link to={`/statuses/${status.get('id')}/reblogs`} className='detailed-status__link'>
           <Icon id={reblogIcon} />
           <span className='detailed-status__reblogs'>
-            <FormattedNumber value={status.get('reblogs_count')} />
+            <AnimatedNumber value={status.get('reblogs_count')} />
           </span>
         </Link>
       );
@@ -181,7 +182,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
         <a href={`/interact/${status.get('id')}?type=reblog`} className='detailed-status__link' onClick={this.handleModalLink}>
           <Icon id={reblogIcon} />
           <span className='detailed-status__reblogs'>
-            <FormattedNumber value={status.get('reblogs_count')} />
+            <AnimatedNumber value={status.get('reblogs_count')} />
           </span>
         </a>
       );
@@ -192,7 +193,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
         <Link to={`/statuses/${status.get('id')}/favourites`} className='detailed-status__link'>
           <Icon id='star' />
           <span className='detailed-status__favorites'>
-            <FormattedNumber value={status.get('favourites_count')} />
+            <AnimatedNumber value={status.get('favourites_count')} />
           </span>
         </Link>
       );
@@ -201,7 +202,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
         <a href={`/interact/${status.get('id')}?type=favourite`} className='detailed-status__link' onClick={this.handleModalLink}>
           <Icon id='star' />
           <span className='detailed-status__favorites'>
-            <FormattedNumber value={status.get('favourites_count')} />
+            <AnimatedNumber value={status.get('favourites_count')} />
           </span>
         </a>
       );
diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js
index 6b18f34d1..c058120d6 100644
--- a/app/javascript/mastodon/features/status/index.js
+++ b/app/javascript/mastodon/features/status/index.js
@@ -542,6 +542,7 @@ class Status extends ImmutablePureComponent {
             <HotKeys handlers={handlers}>
               <div className={classNames('focusable', 'detailed-status__wrapper')} tabIndex='0' aria-label={textForScreenReader(intl, status, false)}>
                 <DetailedStatus
+                  key={`details-${status.get('id')}`}
                   status={status}
                   onOpenVideo={this.handleOpenVideo}
                   onOpenMedia={this.handleOpenMedia}
@@ -552,6 +553,7 @@ class Status extends ImmutablePureComponent {
                 />
 
                 <ActionBar
+                  key={`action-bar-${status.get('id')}`}
                   status={status}
                   onReply={this.handleReplyClick}
                   onFavourite={this.handleFavouriteClick}
diff --git a/app/javascript/mastodon/features/ui/components/media_modal.js b/app/javascript/mastodon/features/ui/components/media_modal.js
index a785551c0..d7f97f210 100644
--- a/app/javascript/mastodon/features/ui/components/media_modal.js
+++ b/app/javascript/mastodon/features/ui/components/media_modal.js
@@ -211,7 +211,6 @@ class MediaModal extends ImmutablePureComponent {
             style={swipeableViewsStyle}
             containerStyle={containerStyle}
             onChangeIndex={this.handleSwipe}
-            onSwitching={this.handleSwitching}
             index={index}
           >
             {content}
diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js
index f6aeb8c9a..0e2a99416 100644
--- a/app/javascript/mastodon/features/video/index.js
+++ b/app/javascript/mastodon/features/video/index.js
@@ -124,12 +124,14 @@ class Video extends React.PureComponent {
     revealed: this.props.visible !== undefined ? this.props.visible : (displayMedia !== 'hide_all' && !this.props.sensitive || displayMedia === 'show_all'),
   };
 
-  // hard coded in components.scss
-  // any way to get ::before values programatically?
-  volWidth = 50;
+  // Hard-coded in components.scss
+  // Any way to get ::before values programatically?
+  volWidth  = 50;
   volOffset = 70;
+
   volHandleOffset = v => {
     const offset = v * this.volWidth + this.volOffset;
+
     return (offset > 110) ? 110 : offset;
   }
 
@@ -138,6 +140,7 @@ class Video extends React.PureComponent {
 
     if (c) {
       if (this.props.cacheWidth) this.props.cacheWidth(this.player.offsetWidth);
+
       this.setState({
         containerWidth: c.offsetWidth,
       });
@@ -205,12 +208,14 @@ class Video extends React.PureComponent {
     const x = (e.clientX - rect.left) / this.volWidth; //x position within the element.
 
     if(!isNaN(x)) {
-      var slideamt = x;
+      let slideamt = x;
+
       if(x > 1) {
         slideamt = 1;
       } else if(x < 0) {
         slideamt = 0;
       }
+
       this.video.volume = slideamt;
       this.setState({ volume: slideamt });
     }
@@ -252,9 +257,9 @@ class Video extends React.PureComponent {
 
   togglePlay = () => {
     if (this.state.paused) {
-      this.video.play();
+      this.setState({ paused: false }, () => this.video.play());
     } else {
-      this.video.pause();
+      this.setState({ paused: true }, () => this.video.pause());
     }
   }
 
@@ -272,12 +277,16 @@ class Video extends React.PureComponent {
     document.addEventListener('mozfullscreenchange', this.handleFullscreenChange, true);
     document.addEventListener('MSFullscreenChange', this.handleFullscreenChange, true);
 
+    window.addEventListener('scroll', this.handleScroll);
+
     if (this.props.blurhash) {
       this._decode();
     }
   }
 
   componentWillUnmount () {
+    window.removeEventListener('scroll', this.handleScroll);
+
     document.removeEventListener('fullscreenchange', this.handleFullscreenChange, true);
     document.removeEventListener('webkitfullscreenchange', this.handleFullscreenChange, true);
     document.removeEventListener('mozfullscreenchange', this.handleFullscreenChange, true);
@@ -294,6 +303,7 @@ class Video extends React.PureComponent {
     if (prevState.revealed && !this.state.revealed && this.video) {
       this.video.pause();
     }
+
     if (prevProps.blurhash !== this.props.blurhash && this.props.blurhash) {
       this._decode();
     }
@@ -313,6 +323,19 @@ class Video extends React.PureComponent {
     }
   }
 
+  handleScroll = throttle(() => {
+    if (!this.video) {
+      return;
+    }
+
+    const { top, height } = this.video.getBoundingClientRect();
+    const inView = (top <= (window.innerHeight || document.documentElement.clientHeight)) && (top + height >= 0);
+
+    if (!this.state.paused && !inView) {
+      this.setState({ paused: true }, () => this.video.pause());
+    }
+  }, 150, { trailing: true })
+
   handleFullscreenChange = () => {
     this.setState({ fullscreen: isFullscreen() });
   }
@@ -326,8 +349,11 @@ class Video extends React.PureComponent {
   }
 
   toggleMute = () => {
-    this.video.muted = !this.video.muted;
-    this.setState({ muted: this.video.muted });
+    const muted = !this.video.muted;
+
+    this.setState({ muted }, () => {
+      this.video.muted = muted;
+    });
   }
 
   toggleReveal = () => {
@@ -430,7 +456,6 @@ class Video extends React.PureComponent {
           src={src}
           poster={preview}
           preload={preload}
-          loop
           role='button'
           tabIndex='0'
           aria-label={alt}
@@ -495,13 +520,8 @@ class Video extends React.PureComponent {
               {(!onCloseVideo && !editable) && <button type='button' aria-label={intl.formatMessage(messages.hide)} onClick={this.toggleReveal}><Icon id='eye-slash' fixedWidth /></button>}
               {(!fullscreen && onOpenVideo) && <button type='button' aria-label={intl.formatMessage(messages.expand)} onClick={this.handleOpenVideo}><Icon id='expand' fixedWidth /></button>}
               {onCloseVideo && <button type='button' aria-label={intl.formatMessage(messages.close)} onClick={this.handleCloseVideo}><Icon id='compress' fixedWidth /></button>}
-              <button type='button' aria-label={intl.formatMessage(messages.download)}>
-                <a className='video-player__download__icon' href={this.props.src} download>
-                  <Icon id={'download'} fixedWidth />
-                </a>
-              </button>
+              <button type='button' aria-label={intl.formatMessage(messages.download)}><a className='video-player__download__icon' href={this.props.src} download><Icon id={'download'} fixedWidth /></a></button>
               <button type='button' aria-label={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} onClick={this.toggleFullscreen}><Icon id={fullscreen ? 'compress' : 'arrows-alt'} fixedWidth /></button>
-
             </div>
           </div>
         </div>
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index e65c81e64..5ce5eb12e 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -1,18 +1,19 @@
 {
   "account.add_or_remove_from_list": "أضفه أو أزله من القائمة",
   "account.badges.bot": "روبوت",
+  "account.badges.group": "Group",
   "account.block": "حظر @{name}",
   "account.block_domain": "إخفاء كل شيئ قادم من اسم النطاق {domain}",
   "account.blocked": "محظور",
   "account.cancel_follow_request": "إلغاء طلب المتابَعة",
   "account.direct": "رسالة خاصة إلى @{name}",
   "account.domain_blocked": "النطاق مخفي",
-  "account.edit_profile": "تعديل الملف التعريفي",
+  "account.edit_profile": "تعديل الملف الشخصي",
   "account.endorse": "أوصِ به على صفحتك",
   "account.follow": "تابِع",
   "account.followers": "مُتابِعون",
   "account.followers.empty": "لا أحد يتبع هذا الحساب بعد.",
-  "account.follows": "يتبع",
+  "account.follows": "يتابع",
   "account.follows.empty": "هذا الحساب لا يتبع أحدًا بعد.",
   "account.follows_you": "يتابعك",
   "account.hide_reblogs": "إخفاء ترقيات @{name}",
@@ -39,9 +40,10 @@
   "account.unmute": "إلغاء الكتم عن @{name}",
   "account.unmute_notifications": "إلغاء كتم إخطارات @{name}",
   "alert.rate_limited.message": "يرجى إعادة المحاولة بعد {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.title": "المعدل محدود",
   "alert.unexpected.message": "لقد طرأ هناك خطأ غير متوقّع.",
   "alert.unexpected.title": "المعذرة!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} في الأسبوع",
   "boost_modal.combo": "يمكنك/ي ضغط {combo} لتخطّي هذه في المرّة القادمة",
   "bundle_column_error.body": "لقد وقع هناك خطأ أثناء عملية تحميل هذا العنصر.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "لقد وقع هناك خطأ أثناء عملية تحميل هذا العنصر.",
   "bundle_modal_error.retry": "إعادة المحاولة",
   "column.blocks": "الحسابات المحجوبة",
+  "column.bookmarks": "الفواصل المرجعية",
   "column.community": "الخيط العام المحلي",
   "column.direct": "الرسائل المباشرة",
   "column.directory": "استعراض الملفات التعريفية",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "مدة استطلاع الرأي",
   "compose_form.poll.option_placeholder": "الخيار {number}",
   "compose_form.poll.remove_option": "إزالة هذا الخيار",
+  "compose_form.poll.switch_to_multiple": "عدّل استطلاع الرأي وغيّره لإتاحة الخيارات المتعددة",
+  "compose_form.poll.switch_to_single": "عدّل استطلاع الرأي وغيّره لإتاحة خيار واحد فقط",
   "compose_form.publish": "بوّق",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "تحديد الوسائط كحساسة",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "ليس هناك تبويقات!",
   "empty_column.account_unavailable": "الملف التعريفي غير متوفر",
   "empty_column.blocks": "لم تقم بحظر أي مستخدِم بعد.",
+  "empty_column.bookmarked_statuses": "ليس لديك أية تبويقات في الفواصل المرجعية بعد. عندما ستقوم بإضافة البعض منها، ستظهر هنا.",
   "empty_column.community": "الخط العام المحلي فارغ. أكتب شيئا ما للعامة كبداية!",
   "empty_column.direct": "لم تتلق أية رسالة خاصة مباشِرة بعد. سوف يتم عرض الرسائل المباشرة هنا إن قمت بإرسال واحدة أو تلقيت البعض منها.",
   "empty_column.domain_blocks": "ليس هناك نطاقات مخفية بعد.",
@@ -153,8 +159,8 @@
   "empty_column.notifications": "لم تتلق أي إشعار بعدُ. تفاعل مع المستخدمين الآخرين لإنشاء محادثة.",
   "empty_column.public": "لا يوجد أي شيء هنا! قم بنشر شيء ما للعامة، أو اتبع المستخدمين الآخرين المتواجدين على الخوادم الأخرى لملء خيط المحادثات",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.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.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "error.unexpected_crash.next_steps": "حاول إعادة إنعاش الصفحة. إن لم تُحلّ المشكلة ، يمكنك دائمًا استخدام ماستدون عبر متصفّح آخر أو تطبيق أصلي.",
+  "errors.unexpected_crash.copy_stacktrace": "انسخ تتبع الارتباطات إلى الحافظة",
   "errors.unexpected_crash.report_issue": "الإبلاغ عن خلل",
   "follow_request.authorize": "ترخيص",
   "follow_request.reject": "رفض",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "لفتح قائمة المستخدِمين المكتومين",
   "keyboard_shortcuts.my_profile": "لفتح ملفك التعريفي",
   "keyboard_shortcuts.notifications": "لفتح عمود الإشعارات",
+  "keyboard_shortcuts.open_media": "لفتح الوسائط",
   "keyboard_shortcuts.pinned": "لفتح قائمة التبويقات المدبسة",
   "keyboard_shortcuts.profile": "لفتح الملف التعريفي للناشر",
   "keyboard_shortcuts.reply": "للردّ",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "هل تود إخفاء الإخطارات القادمة من هذا المستخدم ؟",
   "navigation_bar.apps": "تطبيقات الأجهزة المحمولة",
   "navigation_bar.blocks": "الحسابات المحجوبة",
+  "navigation_bar.bookmarks": "الفواصل المرجعية",
   "navigation_bar.community_timeline": "الخيط العام المحلي",
   "navigation_bar.compose": "تحرير تبويق جديد",
   "navigation_bar.direct": "الرسائل المباشِرة",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "الأمان",
   "notification.favourite": "أُعجِب {name} بمنشورك",
   "notification.follow": "{name} يتابعك",
+  "notification.follow_request": "لقد طلب {name} متابعتك",
   "notification.mention": "{name} ذكرك",
+  "notification.own_poll": "انتهى استطلاعك للرأي",
   "notification.poll": "لقد إنتها تصويت شاركت فيه",
   "notification.reblog": "{name} قام بترقية تبويقك",
   "notifications.clear": "امسح الإخطارات",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "شريط الفلترة السريعة",
   "notifications.column_settings.filter_bar.show": "اظهِره",
   "notifications.column_settings.follow": "متابعُون جُدُد:",
+  "notifications.column_settings.follow_request": "الطلبات الجديد لِمتابَعتك:",
   "notifications.column_settings.mention": "الإشارات:",
   "notifications.column_settings.poll": "نتائج استطلاع الرأي:",
   "notifications.column_settings.push": "الإخطارات المدفوعة",
@@ -344,6 +355,7 @@
   "status.admin_account": "افتح الواجهة الإدارية لـ @{name}",
   "status.admin_status": "افتح هذا المنشور على واجهة الإشراف",
   "status.block": "احجب @{name}",
+  "status.bookmark": "أضفه إلى الفواصل المرجعية",
   "status.cancel_reblog_private": "إلغاء الترقية",
   "status.cannot_reblog": "تعذرت ترقية هذا المنشور",
   "status.copy": "نسخ رابط المنشور",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "رقّاه {name}",
   "status.reblogs.empty": "لم يقم أي أحد بترقية هذا التبويق بعد. عندما يقوم أحدهم بذلك سوف تظهر هنا.",
   "status.redraft": "إزالة و إعادة الصياغة",
+  "status.remove_bookmark": "احذفه مِن الفواصل المرجعية",
   "status.reply": "ردّ",
   "status.replyAll": "رُد على الخيط",
   "status.report": "ابلِغ عن @{name}",
@@ -400,18 +413,21 @@
   "upload_button.label": "إضافة وسائط ({formats})",
   "upload_error.limit": "لقد تم بلوغ الحد الأقصى المسموح به لإرسال الملفات.",
   "upload_error.poll": "لا يمكن إدراج ملفات في استطلاعات الرأي.",
+  "upload_form.audio_description": "وصف للأشخاص ذي قِصر السمع",
   "upload_form.description": "وصف للمعاقين بصريا",
   "upload_form.edit": "تعديل",
   "upload_form.undo": "حذف",
+  "upload_form.video_description": "وصف للمعاقين بصريا أو لِذي قِصر السمع",
   "upload_modal.analyzing_picture": "جارٍ فحص الصورة…",
   "upload_modal.apply": "طبّق",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
   "upload_modal.detect_text": "اكتشف النص مِن الصورة",
   "upload_modal.edit_media": "تعديل الوسائط",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.hint": "اضغط أو اسحب الدائرة على خانة المعاينة لاختيار نقطة التركيز التي ستُعرَض دائمًا على كل المصغرات.",
   "upload_modal.preview_label": "معاينة ({ratio})",
   "upload_progress.label": "يرفع...",
   "video.close": "إغلاق الفيديو",
+  "video.download": "تنزيل الملف",
   "video.exit_fullscreen": "الخروج من وضع الشاشة المليئة",
   "video.expand": "توسيع الفيديو",
   "video.fullscreen": "ملء الشاشة",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 5145a6579..e570fc3b7 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Add or Remove from lists",
   "account.badges.bot": "Robó",
+  "account.badges.group": "Group",
   "account.block": "Bloquiar a @{name}",
   "account.block_domain": "Anubrir tolo de {domain}",
   "account.blocked": "Blocked",
@@ -21,15 +22,15 @@
   "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
   "account.media": "Media",
   "account.mention": "Mentar a @{name}",
-  "account.moved_to": "{name} has moved to:",
+  "account.moved_to": "{name} mudóse a:",
   "account.mute": "Silenciar a @{name}",
   "account.mute_notifications": "Mute notifications from @{name}",
   "account.muted": "Muted",
-  "account.never_active": "Never",
-  "account.posts": "Toots",
-  "account.posts_with_replies": "Toots y rempuestes",
+  "account.never_active": "Enxamás",
+  "account.posts": "Barritos",
+  "account.posts_with_replies": "Barritos y rempuestes",
   "account.report": "Report @{name}",
-  "account.requested": "Awaiting approval",
+  "account.requested": "Esperando pola aprobación. Calca pa encaboxar la solicitú de siguimientu",
   "account.share": "Share @{name}'s profile",
   "account.show_reblogs": "Show boosts from @{name}",
   "account.unblock": "Desbloquiar a @{name}",
@@ -41,16 +42,18 @@
   "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "Asocedió un fallu inesperáu.",
-  "alert.unexpected.title": "¡Ups!",
-  "autosuggest_hashtag.per_week": "{count} per week",
+  "alert.unexpected.title": "¡Meca!",
+  "announcement.announcement": "Announcement",
+  "autosuggest_hashtag.per_week": "{count} per selmana",
   "boost_modal.combo": "Pues primir {combo} pa saltar esto la próxima vegada",
-  "bundle_column_error.body": "Something went wrong while loading this component.",
+  "bundle_column_error.body": "Asocedió daqué malo mentanto se cargaba esti componente.",
   "bundle_column_error.retry": "Try again",
   "bundle_column_error.title": "Network error",
   "bundle_modal_error.close": "Close",
-  "bundle_modal_error.message": "Something went wrong while loading this component.",
+  "bundle_modal_error.message": "Asocedió daqué malo mentanto se cargaba esti componente.",
   "bundle_modal_error.retry": "Try again",
   "column.blocks": "Usuarios bloquiaos",
+  "column.bookmarks": "Marcadores",
   "column.community": "Llinia temporal llocal",
   "column.direct": "Mensaxes direutos",
   "column.directory": "Browse profiles",
@@ -61,7 +64,7 @@
   "column.lists": "Llistes",
   "column.mutes": "Usuarios silenciaos",
   "column.notifications": "Avisos",
-  "column.pins": "Toots fixaos",
+  "column.pins": "Barritos fixaos",
   "column.public": "Llinia temporal federada",
   "column_back_button.label": "Atrás",
   "column_header.hide_settings": "Hide settings",
@@ -71,25 +74,27 @@
   "column_header.show_settings": "Show settings",
   "column_header.unpin": "Desfixar",
   "column_subheading.settings": "Axustes",
-  "community.column_settings.media_only": "Media only",
-  "compose_form.direct_message_warning": "Esti toot namái va unviase a los usuarios mentaos.",
+  "community.column_settings.media_only": "Namái multimedia",
+  "compose_form.direct_message_warning": "Esti barritu namái va unviase a los usuarios mentaos.",
   "compose_form.direct_message_warning_learn_more": "Learn more",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "locked",
   "compose_form.placeholder": "¿En qué pienses?",
-  "compose_form.poll.add_option": "Add a choice",
+  "compose_form.poll.add_option": "Amestar una escoyeta",
   "compose_form.poll.duration": "Poll duration",
-  "compose_form.poll.option_placeholder": "Choice {number}",
+  "compose_form.poll.option_placeholder": "Escoyeta {number}",
   "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
+  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
   "compose_form.sensitive.marked": "Media is marked as sensitive",
   "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
   "compose_form.spoiler.marked": "El testu nun va anubrise darrera d'una alvertencia",
-  "compose_form.spoiler.unmarked": "El testu va anubrise",
-  "compose_form.spoiler_placeholder": "Escribi equí l'avertencia",
+  "compose_form.spoiler.unmarked": "El testu nun va anubrise",
+  "compose_form.spoiler_placeholder": "Escribi equí l'alvertencia",
   "confirmation_modal.cancel": "Encaboxar",
   "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Block",
@@ -106,7 +111,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": "¿De xuru que quies silenciar a {name}?",
   "confirmations.redraft.confirm": "Desaniciar y reeditar",
-  "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": "¿De xuru que quies desaniciar esti estáu y reeditalu? Van perdese los favoritos y comparticiones, y les rempuestes al toot orixinal van quedar güérfanes.",
   "confirmations.reply.confirm": "Reply",
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
   "confirmations.unfollow.confirm": "Unfollow",
@@ -115,80 +120,81 @@
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
   "conversation.with": "With {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
+  "directory.federated": "Dende'l fediversu",
+  "directory.local": "Dende {domain} namái",
+  "directory.new_arrivals": "Cuentes nueves",
   "directory.recently_active": "Recently active",
   "embed.instructions": "Empotra esti estáu nun sitiu web copiando'l códigu d'embaxo.",
-  "embed.preview": "Asina ye como va vese:",
+  "embed.preview": "Asina ye cómo va vese:",
   "emoji_button.activity": "Actividaes",
   "emoji_button.custom": "Custom",
   "emoji_button.flags": "Banderes",
   "emoji_button.food": "Comida y bébora",
-  "emoji_button.label": "Insert emoji",
+  "emoji_button.label": "Inxertar un fustaxe",
   "emoji_button.nature": "Natura",
   "emoji_button.not_found": "¡Nun hai fustaxes! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "Oxetos",
   "emoji_button.people": "Xente",
   "emoji_button.recent": "Úsase davezu",
-  "emoji_button.search": "Guetar...",
+  "emoji_button.search": "Guetar…",
   "emoji_button.search_results": "Search results",
   "emoji_button.symbols": "Símbolos",
   "emoji_button.travel": "Viaxes y llugares",
-  "empty_column.account_timeline": "No toots here!",
+  "empty_column.account_timeline": "¡Equí nun hai barritos!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "Entá nun bloquiesti a dengún usuariu.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
   "empty_column.direct": "Entá nun tienes dengún mensaxe direutu. Cuando unvies o recibas dalgún, va apaecer equí.",
   "empty_column.domain_blocks": "Entá nun hai dominios anubríos.",
   "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
   "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
   "empty_column.follow_requests": "Entá nun tienes denguna solicitú de siguimientu. Cuando recibas una, va amosase equí.",
-  "empty_column.hashtag": "There is nothing in this hashtag yet.",
+  "empty_column.hashtag": "Entá nun hai nada nesta etiqueta.",
   "empty_column.home": "¡Tienes la llinia temporal balera! Visita {public} o usa la gueta pa entamar y conocer a otros usuarios.",
   "empty_column.home.public_timeline": "la llinia temporal pública",
   "empty_column.list": "Entá nun hai nada nesta llista. Cuando los miembros d'esta llista espublicen estaos nuevos, van apaecer equí.",
   "empty_column.lists": "Entá nun tienes denguna llista. Cuando crees una, va amosase equí.",
   "empty_column.mutes": "Entá nun silenciesti a dengún usuariu.",
-  "empty_column.notifications": "Entá nun tienes dengún avisu. Interactua con otros p'aniciar la conversación.",
-  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "empty_column.notifications": "Entá nun tienes dengún avisu. Interactúa con otros p'aniciar la conversación.",
+  "empty_column.public": "¡Equí nun hai nada! Escribi daqué público o sigui a usuarios d'otros sirvidores pa rellenar esto",
+  "error.unexpected_crash.explanation": "Pola mor d'un fallu nel códigu o un problema de compatibilidá del restolador, esta páxina nun pudo amosase correutamente.",
   "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.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Refugar",
   "getting_started.developers": "Desendolcadores",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Direutoriu de perfiles",
   "getting_started.documentation": "Documentación",
   "getting_started.heading": "Entamu",
-  "getting_started.invite": "Convidar xente",
-  "getting_started.open_source_notice": "Mastodon ye software de códigu abiertu. Pues collaborar o informar de fallos en {github} (GitHub).",
-  "getting_started.security": "Seguranza",
+  "getting_started.invite": "Convidar a persones",
+  "getting_started.open_source_notice": "Mastodon ye software de códigu abiertu. Pues collaborar o informar de fallos en GitHub: {github}.",
+  "getting_started.security": "Axustes de la cuenta",
   "getting_started.terms": "Términos del serviciu",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_header.tag_mode.all": "y {additional}",
+  "hashtag.column_header.tag_mode.any": "o {additional}",
+  "hashtag.column_header.tag_mode.none": "ensin {additional}",
   "hashtag.column_settings.select.no_options_message": "No suggestions found",
   "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
-  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "hashtag.column_settings.tag_toggle": "Incluyir les etiquetes adicionales d'esta columna",
   "home.column_settings.basic": "Basic",
   "home.column_settings.show_reblogs": "Amosar toots compartíos",
   "home.column_settings.show_replies": "Amosar rempuestes",
-  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
-  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
-  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "intervals.full.days": "{number, plural, one {# día} other {# díes}}",
+  "intervals.full.hours": "{number, plural, one {# hora} other {# hores}}",
+  "intervals.full.minutes": "{number, plural, one {# minutu} other {# minutos}}",
   "introduction.federation.action": "Next",
   "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.federated.text": "Los espublizamientos públicos de los demás sirvidores del fediversu van apaecer na llinia temporal federada.",
   "introduction.federation.home.headline": "Home",
   "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
   "introduction.federation.local.headline": "Local",
   "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish toot-orial!",
+  "introduction.interactions.action": "¡Finar el tutorial!",
   "introduction.interactions.favourite.headline": "Favourite",
   "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
   "introduction.interactions.reblog.headline": "Boost",
@@ -196,18 +202,18 @@
   "introduction.interactions.reply.headline": "Reply",
   "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
   "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "introduction.welcome.headline": "Primeros pasos",
+  "introduction.welcome.text": "¡Afáyate nel fediversu! Nun momentu vas ser a tresmitir mensaxes y falar colos collacios d'una montonera de sirvidores. Pero esti sirvidor, {domain}, ye especial: agospia'l to perfil, asina qu'alcuérdate de cómo se llama.",
   "keyboard_shortcuts.back": "pa dir p'atrás",
   "keyboard_shortcuts.blocked": "p'abrir la llista d'usuarios bloquiaos",
   "keyboard_shortcuts.boost": "pa compartir un toot",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
-  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.compose": "pa enfocar l'área de composición",
   "keyboard_shortcuts.description": "Descripción",
   "keyboard_shortcuts.direct": "p'abrir la columna de los mensaxes direutos",
   "keyboard_shortcuts.down": "pa baxar na llista",
   "keyboard_shortcuts.enter": "to open status",
-  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourite": "p'amestar a Favoritos",
   "keyboard_shortcuts.favourites": "p'abrir la llista de favoritos",
   "keyboard_shortcuts.federated": "p'abrir la llinia temporal federada",
   "keyboard_shortcuts.heading": "Atayos del tecláu",
@@ -217,18 +223,19 @@
   "keyboard_shortcuts.local": "p'abrir la llinia temporal llocal",
   "keyboard_shortcuts.mention": "pa mentar al autor",
   "keyboard_shortcuts.muted": "p'abrir la llista d'usuarios silenciaos",
-  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.my_profile": "p'abrir el to perfil",
   "keyboard_shortcuts.notifications": "p'abrir la columna d'avisos",
-  "keyboard_shortcuts.pinned": "p'abrir la llista de toots fixaos",
+  "keyboard_shortcuts.open_media": "to open media",
+  "keyboard_shortcuts.pinned": "p'abrir la llista de barritos fixaos",
   "keyboard_shortcuts.profile": "p'abrir el perfil del autor",
   "keyboard_shortcuts.reply": "pa responder",
   "keyboard_shortcuts.requests": "p'abrir la llista de solicitúes de siguimientu",
-  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.search": "pa enfocar la gueta",
   "keyboard_shortcuts.start": "p'abrir la columna «entamar»",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
-  "keyboard_shortcuts.toot": "p'apenzar un toot nuevu",
-  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.toot": "p'apenzar un barritu nuevu",
+  "keyboard_shortcuts.unfocus": "pa desenfocar l'área de composición/gueta",
   "keyboard_shortcuts.up": "pa xubir na llista",
   "lightbox.close": "Close",
   "lightbox.next": "Siguiente",
@@ -243,14 +250,15 @@
   "lists.new.title_placeholder": "Títulu nuevu de la llista",
   "lists.search": "Guetar ente la xente que sigues",
   "lists.subheading": "Les tos llistes",
-  "load_pending": "{count, plural, one {# new item} other {# new items}}",
-  "loading_indicator.label": "Cargando...",
+  "load_pending": "{count, plural, one {# elementu nuevu} other {# elementos nuevos}}",
+  "loading_indicator.label": "Cargando…",
   "media_gallery.toggle_visible": "Toggle visibility",
   "missing_indicator.label": "Nun s'alcontró",
   "missing_indicator.sublabel": "Esti recursu nun pudo alcontrase",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Aplicaciones pa móviles",
   "navigation_bar.blocks": "Usuarios bloquiaos",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Llinia temporal llocal",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Mensaxes direutos",
@@ -267,13 +275,15 @@
   "navigation_bar.logout": "Zarrar sesión",
   "navigation_bar.mutes": "Usuarios silenciaos",
   "navigation_bar.personal": "Personal",
-  "navigation_bar.pins": "Toots fixaos",
+  "navigation_bar.pins": "Barritos fixaos",
   "navigation_bar.preferences": "Preferencies",
   "navigation_bar.public_timeline": "Llinia temporal federada",
   "navigation_bar.security": "Seguranza",
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} siguióte",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentóte",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} compartió'l to estáu",
   "notifications.clear": "Llimpiar avisos",
@@ -282,19 +292,20 @@
   "notifications.column_settings.favourite": "Favoritos:",
   "notifications.column_settings.filter_bar.advanced": "Display all categories",
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.show": "Amosar",
   "notifications.column_settings.follow": "Siguidores nuevos:",
+  "notifications.column_settings.follow_request": "Solicitúes de siguimientu nueves:",
   "notifications.column_settings.mention": "Menciones:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
-  "notifications.column_settings.reblog": "Toots compartíos:",
+  "notifications.column_settings.reblog": "Barritos compartíos:",
   "notifications.column_settings.show": "Amosar en columna",
-  "notifications.column_settings.sound": "Reproducir soníu",
+  "notifications.column_settings.sound": "Reproducir un soníu",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.mentions": "Menciones",
   "notifications.filter.polls": "Poll results",
   "notifications.group": "{count} avisos",
   "poll.closed": "Closed",
@@ -312,11 +323,11 @@
   "privacy.private.short": "Namái siguidores",
   "privacy.public.long": "Post to public timelines",
   "privacy.public.short": "Public",
-  "privacy.unlisted.long": "Do not show in public timelines",
-  "privacy.unlisted.short": "Unlisted",
+  "privacy.unlisted.long": "Nun apaez nes llinies temporales públiques",
+  "privacy.unlisted.short": "Nun llistar",
   "refresh": "Refresh",
   "regeneration_indicator.label": "Cargando…",
-  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "regeneration_indicator.sublabel": "¡Tamos tresnando'l feed d'Aniciu!",
   "relative_time.days": "{number}d",
   "relative_time.hours": "{number}h",
   "relative_time.just_now": "agora",
@@ -325,7 +336,7 @@
   "reply_indicator.cancel": "Encaboxar",
   "report.forward": "Forward to {target}",
   "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
-  "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.hint": "L'informe va unviase a los llendadores del to sirvidor. Embaxo, pues desplicar por qué informes d'esta cuenta:",
   "report.placeholder": "Comentarios adicionales",
   "report.submit": "Submit",
   "report.target": "Report {target}",
@@ -338,12 +349,13 @@
   "search_popout.tips.user": "usuariu",
   "search_results.accounts": "Xente",
   "search_results.hashtags": "Etiquetes",
-  "search_results.statuses": "Toots",
-  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
-  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+  "search_results.statuses": "Barritos",
+  "search_results.statuses_fts_disabled": "Esti sirvidor de Mastodon tien activada la gueta de barritos pol so conteníu.",
+  "search_results.total": "{count, number} {count, plural, one {resultáu} other {resultaos}}",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Bloquiar a @{name}",
+  "status.bookmark": "Bookmark",
   "status.cancel_reblog_private": "Dexar de compartir",
   "status.cannot_reblog": "Esti artículu nun pue compartise",
   "status.copy": "Copy link to status",
@@ -354,20 +366,21 @@
   "status.favourite": "Favourite",
   "status.filtered": "Filtered",
   "status.load_more": "Cargar más",
-  "status.media_hidden": "Mediu anubríu",
+  "status.media_hidden": "Multimedia anubrida",
   "status.mention": "Mentar a @{name}",
   "status.more": "Más",
   "status.mute": "Silenciar a @{name}",
   "status.mute_conversation": "Silenciar la conversación",
   "status.open": "Espander esti estáu",
   "status.pin": "Fixar nel perfil",
-  "status.pinned": "Toot fixáu",
+  "status.pinned": "Barritu fixáu",
   "status.read_more": "Read more",
   "status.reblog": "Compartir",
   "status.reblog_private": "Compartir cola audiencia orixinal",
   "status.reblogged_by": "{name} compartió",
-  "status.reblogs.empty": "Naide nun compartió esti toot entá. Cuando daquién lo faiga, va amosase equí.",
+  "status.reblogs.empty": "Naide nun compartió esti barritu entá. Cuando daquién lo faiga, va amosase equí.",
   "status.redraft": "Desaniciar y reeditar",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Responder",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
@@ -377,7 +390,7 @@
   "status.show_less_all": "Show less for all",
   "status.show_more": "Amosar más",
   "status.show_more_all": "Show more for all",
-  "status.show_thread": "Show thread",
+  "status.show_thread": "Amosar el filu",
   "status.uncached_media_warning": "Not available",
   "status.unmute_conversation": "Unmute conversation",
   "status.unpin": "Desfixar del perfil",
@@ -388,30 +401,33 @@
   "tabs_bar.local_timeline": "Llocal",
   "tabs_bar.notifications": "Avisos",
   "tabs_bar.search": "Search",
-  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
+  "time_remaining.days": "{number, plural, one {# día} other {# díes}} que queden",
   "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
-  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {persones}} falando",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "El borrador va perdese si coles de Mastodon.",
   "upload_area.title": "Drag & drop to upload",
-  "upload_button.label": "Add media",
+  "upload_button.label": "Add media ({formats})",
   "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": "Descripción pa discapacitaos visuales",
-  "upload_form.edit": "Edit",
+  "upload_form.edit": "Editar",
   "upload_form.undo": "Desaniciar",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
+  "upload_modal.analyzing_picture": "Analizando la semeya…",
+  "upload_modal.apply": "Aplicar",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
   "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
+  "upload_modal.edit_media": "Edición",
   "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.preview_label": "Preview ({ratio})",
-  "upload_progress.label": "Xubiendo...",
+  "upload_modal.preview_label": "Previsualización ({ratio})",
+  "upload_progress.label": "Xubiendo…",
   "video.close": "Zarrar el videu",
+  "video.download": "Download file",
   "video.exit_fullscreen": "Colar de la pantalla completa",
   "video.expand": "Espander el videu",
   "video.fullscreen": "Pantalla completa",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 2ec155362..6a6f9a309 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Добави или премахни от списъците",
   "account.badges.bot": "бот",
+  "account.badges.group": "Group",
   "account.block": "Блокирай",
   "account.block_domain": "скрий всичко от (домейн)",
   "account.blocked": "Блокирани",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Something went wrong while loading this component.",
   "bundle_modal_error.retry": "Try again",
   "column.blocks": "Blocked users",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
   "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "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": "Раздумай",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
   "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "to reply",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} хареса твоята публикация",
   "notification.follow": "{name} те последва",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} те спомена",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} сподели твоята публикация",
   "notifications.clear": "Clear notifications",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Нови последователи:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Споменавания:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
@@ -344,6 +355,7 @@
   "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",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} сподели",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Отговор",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Добави медия",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "Edit",
   "upload_form.undo": "Отмяна",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
   "upload_modal.analyzing_picture": "Analyzing picture…",
   "upload_modal.apply": "Apply",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "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",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index 5cf5f7a76..283812fdf 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -1,56 +1,59 @@
 {
-  "account.add_or_remove_from_list": "তালিকা হতে মুছুন অথবা যুক্ত করুন",
+  "account.add_or_remove_from_list": "তালিকাতে যুক্ত বা অপসারণ করুন",
   "account.badges.bot": "বট",
+  "account.badges.group": "Group",
   "account.block": "@{name} কে ব্লক করুন",
-  "account.block_domain": "{domain} থেকে সব লুকান",
-  "account.blocked": "ব্লককৃত",
-  "account.cancel_follow_request": "অসুসারণ অনুরোধ বাতিল করুন",
+  "account.block_domain": "{domain} থেকে সব আড়াল করুন",
+  "account.blocked": "অবরুদ্ধ",
+  "account.cancel_follow_request": "অনুসরণ অনুরোধ বাতিল করুন",
   "account.direct": "@{name} কে সরাসরি বার্তা",
-  "account.domain_blocked": "ডোমেন লুকানো আছে",
-  "account.edit_profile": "প্রোফাইল সম্পাদন করুন",
+  "account.domain_blocked": "ডোমেন গোপন করুন",
+  "account.edit_profile": "প্রোফাইল পরিবর্তন করুন",
   "account.endorse": "নিজের পাতায় দেখান",
   "account.follow": "অনুসরণ করুন",
-  "account.followers": "অনুসরণকারক",
-  "account.followers.empty": "এই ব্যবহারকারীকে কেও এখনো অনুসরণ করে না।",
+  "account.followers": "অনুসরণকারী",
+  "account.followers.empty": "এই সদস্যকে এখনো কেউ অনুসরণ করে না।.",
   "account.follows": "যাদেরকে অনুসরণ করেন",
-  "account.follows.empty": "এই ব্যবহারকারী কাওকে এখনো অনুসরণ করেন না।",
+  "account.follows.empty": "এই সদস্য কাওকে এখনো অনুসরণ করেন না.",
   "account.follows_you": "আপনাকে অনুসরণ করে",
   "account.hide_reblogs": "@{name}'র সমর্থনগুলি লুকিয়ে ফেলুন",
   "account.last_status": "শেষ সক্রিয় ছিল",
-  "account.link_verified_on": "এই লিংকের মালিকানা চেক করা হয়েছে {date} তারিকে",
+  "account.link_verified_on": "এই লিংকের মালিকানা চেক করা হয়েছে {date} তারিখে",
   "account.locked_info": "এই নিবন্ধনের গোপনীয়তার ক্ষেত্র তালা দেওয়া আছে। নিবন্ধনকারী অনুসরণ করার অনুমতি যাদেরকে দেবেন, শুধু তারাই অনুসরণ করতে পারবেন।",
   "account.media": "মিডিয়া",
   "account.mention": "@{name} কে উল্লেখ করুন",
   "account.moved_to": "{name} কে এখানে সরানো হয়েছে:",
   "account.mute": "@{name} কে নিঃশব্দ করুন",
-  "account.mute_notifications": "@{name}র প্রজ্ঞাপন আপনার কাছ থেকে সরিয়ে ফেলুন",
-  "account.muted": "সরানো আছে",
+  "account.mute_notifications": "@{name} র প্রজ্ঞাপন আপনার কাছে নিঃশব্দ করুন",
+  "account.muted": "নিঃশব্দ",
   "account.never_active": "কখনও নয়",
   "account.posts": "টুট",
   "account.posts_with_replies": "টুট এবং মতামত",
-  "account.report": "@{name} কে রিপোর্ট করতে",
-  "account.requested": "অনুমতির অপেক্ষায় আছে। অনুসরণ করার অনুরোধ বাতিল করতে এখানে ক্লিক করুন",
-  "account.share": "@{name}র পাতা অন্যদের দেখান",
-  "account.show_reblogs": "@{name}র সমর্থনগুলো দেখুন",
-  "account.unblock": "@{name}র কার্যকলাপ আবার দেখুন",
-  "account.unblock_domain": "{domain} থেকে আবার দেখুন",
-  "account.unendorse": "আপনার নিজের পাতায় এটা না দেখাতে",
+  "account.report": "@{name} কে রিপোর্ট করুন",
+  "account.requested": "অনুমতির অপেক্ষা। অনুসরণ করার অনুরোধ বাতিল করতে এখানে ক্লিক করুন",
+  "account.share": "@{name} র প্রোফাইল অন্যদের দেখান",
+  "account.show_reblogs": "@{name} র সমর্থনগুলো দেখান",
+  "account.unblock": "@{name} র কার্যকলাপ দেখুন",
+  "account.unblock_domain": "{domain} কে আবার দেখুন",
+  "account.unendorse": "আপনার নিজের পাতায় এটা দেখবেন না",
   "account.unfollow": "অনুসরণ না করতে",
-  "account.unmute": "@{name}র কার্যকলাপ আবার দেখুন",
-  "account.unmute_notifications": "@{name}র প্রজ্ঞাপন দেওয়ার অনুমতি দিন",
+  "account.unmute": "@{name} র কার্যকলাপ আবার দেখুন",
+  "account.unmute_notifications": "@{name} র প্রজ্ঞাপন দেখুন",
   "alert.rate_limited.message": "{retry_time, time, medium} -এর পরে আবার প্রচেষ্টা করুন।",
   "alert.rate_limited.title": "হার সীমিত",
-  "alert.unexpected.message": "অপ্রত্যাশিত একটি সমস্যা হয়েছে।",
+  "alert.unexpected.message": "সমস্যা অপ্রত্যাশিত.",
   "alert.unexpected.title": "ওহো!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "প্রতি সপ্তাহে {count}",
-  "boost_modal.combo": "পরেরবার আপনি {combo} চাপ দিলে এটার শেষে চলে যেতে পারবেন",
-  "bundle_column_error.body": "এই অংশটি দেখতে যেয়ে কোনো সমস্যা হয়েছে।",
+  "boost_modal.combo": "পরেরবার আপনি {combo} টিপলে এটি আর আসবে না",
+  "bundle_column_error.body": "এই অংশটি দেখতে যেয়ে কোনো সমস্যা হয়েছে।.",
   "bundle_column_error.retry": "আবার চেষ্টা করুন",
-  "bundle_column_error.title": "নেটওয়ার্কের সমস্যা হচ্ছে",
+  "bundle_column_error.title": "নেটওয়ার্কের সমস্যা",
   "bundle_modal_error.close": "বন্ধ করুন",
-  "bundle_modal_error.message": "এই অংশটি দেখাতে যেয়ে কোনো সমস্যা হয়েছে।",
+  "bundle_modal_error.message": "এই অংশটি দেখাতে যেয়ে কোনো সমস্যা হয়েছে।.",
   "bundle_modal_error.retry": "আবার চেষ্টা করুন",
-  "column.blocks": "যাদের ব্লক করে রাখা হয়েছে",
+  "column.blocks": "যাদের ব্লক করা হয়েছে",
+  "column.bookmarks": "Bookmarks",
   "column.community": "স্থানীয় সময়সারি",
   "column.direct": "সরাসরি লেখা",
   "column.directory": "প্রোফাইল ব্রাউজ করুন",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "ভোটগ্রহনের সময়",
   "compose_form.poll.option_placeholder": "বিকল্প {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করতে",
@@ -138,6 +143,7 @@
   "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.direct": "আপনার কাছে সরাসরি পাঠানো কোনো লেখা নেই। যদি কেও পাঠায়, সেটা এখানে দেখা যাবে।",
   "empty_column.domain_blocks": "এখনও কোনও লুকানো ডোমেন নেই।",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "বন্ধ করা ব্যবহারকারীদের তালিকা খুলতে",
   "keyboard_shortcuts.my_profile": "আপনার নিজের পাতা দেখতে",
   "keyboard_shortcuts.notifications": "প্রজ্ঞাপনের কলাম খুলতে",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "পিন দেওয়া টুটের তালিকা খুলতে",
   "keyboard_shortcuts.profile": "লেখকের পাতা দেখতে",
   "keyboard_shortcuts.reply": "মতামত দিতে",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "এই ব্যবহারকারীর প্রজ্ঞাপন বন্ধ করবেন ?",
   "navigation_bar.apps": "মোবাইলের আপ্প",
   "navigation_bar.blocks": "বন্ধ করা ব্যবহারকারী",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "স্থানীয় সময়রেখা",
   "navigation_bar.compose": "নতুন টুট লিখুন",
   "navigation_bar.direct": "সরাসরি লেখাগুলি",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "নিরাপত্তা",
   "notification.favourite": "{name} আপনার কার্যক্রম পছন্দ করেছেন",
   "notification.follow": "{name} আপনাকে অনুসরণ করেছেন",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} আপনাকে উল্লেখ করেছেন",
+  "notification.own_poll": "আপনার পোল শেষ হয়েছে",
   "notification.poll": "আপনি ভোট দিয়েছিলেন এমন এক  নির্বাচনের ভোটের সময় শেষ হয়েছে",
   "notification.reblog": "{name} আপনার কার্যক্রমে সমর্থন দেখিয়েছেন",
   "notifications.clear": "প্রজ্ঞাপনগুলো মুছে ফেলতে",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "সংক্ষিপ্ত ছাঁকনি অংশ",
   "notifications.column_settings.filter_bar.show": "দেখানো",
   "notifications.column_settings.follow": "নতুন অনুসরণকারীরা:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "প্রজ্ঞাপনগুলো:",
   "notifications.column_settings.poll": "নির্বাচনের ফলাফল:",
   "notifications.column_settings.push": "পুশ প্রজ্ঞাপনগুলি",
@@ -344,6 +355,7 @@
   "status.admin_account": "@{name} র জন্য পরিচালনার ইন্টারফেসে ঢুকুন",
   "status.admin_status": "যায় লেখাটি পরিচালনার ইন্টারফেসে খুলুন",
   "status.block": "@{name} কে ব্লক করুন",
+  "status.bookmark": "Bookmark",
   "status.cancel_reblog_private": "সমর্থন বাতিল করতে",
   "status.cannot_reblog": "এটিতে সমর্থন দেওয়া যাবেনা",
   "status.copy": "লেখাটির লিংক কপি করতে",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} সমর্থন দিয়েছে",
   "status.reblogs.empty": "এখনো কেও এটাতে সমর্থন দেয়নি। যখন কেও দেয়, সেটা তখন এখানে দেখা যাবে।",
   "status.redraft": "মুছে আবার নতুন করে লিখতে",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "মতামত জানাতে",
   "status.replyAll": "লেখাযুক্ত সবার কাছে মতামত জানাতে",
   "status.report": "@{name} কে রিপোর্ট করতে",
@@ -400,9 +413,11 @@
   "upload_button.label": "ছবি বা ভিডিও যুক্ত করতে (এসব ধরণের: JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "যা যুক্ত করতে চাচ্ছেন সেটি বেশি বড়, এখানকার সর্বাধিকের মেমোরির উপরে চলে গেছে।",
   "upload_error.poll": "নির্বাচনক্ষেত্রে কোনো ফাইল যুক্ত করা যাবেনা।",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "যারা দেখতে পায়না তাদের জন্য এটা বর্ণনা করতে",
   "upload_form.edit": "সম্পাদন",
   "upload_form.undo": "মুছে ফেলতে",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
   "upload_modal.analyzing_picture": "চিত্র বিশ্লেষণ করা হচ্ছে…",
   "upload_modal.apply": "প্রয়োগ করুন",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "পূর্বরূপ({ratio})",
   "upload_progress.label": "যুক্ত করতে পাঠানো হচ্ছে...",
   "video.close": "ভিডিওটি বন্ধ করতে",
+  "video.download": "ফাইলটি ডাউনলোড করুন",
   "video.exit_fullscreen": "পূর্ণ পর্দা থেকে বাইরে বের হতে",
   "video.expand": "ভিডিওটি বড়ো করতে",
   "video.fullscreen": "পূর্ণ পর্দা করতে",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index db07f1aba..b6bf0eb8a 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Ouzhpenn pe lemel ag ar listennadoù",
   "account.badges.bot": "Robot",
+  "account.badges.group": "Strollad",
   "account.block": "Stankañ @{name}",
   "account.block_domain": "Kuzh kement tra a {domain}",
   "account.blocked": "Stanket",
@@ -13,7 +14,7 @@
   "account.followers": "Heilour·ezed·ion",
   "account.followers.empty": "Den na heul an implijour-mañ c'hoazh.",
   "account.follows": "Koumanantoù",
-  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows.empty": "An implijer-mañ na heul ket den ebet.",
   "account.follows_you": "Ho heul",
   "account.hide_reblogs": "Kuzh toudoù skignet gant @{name}",
   "account.last_status": "Oberiantiz zivezhañ",
@@ -29,21 +30,22 @@
   "account.posts": "Toudoù",
   "account.posts_with_replies": "Toudoù ha respontoù",
   "account.report": "Disklêriañ @{name}",
-  "account.requested": "Awaiting approval",
+  "account.requested": "É c'hortoz bout aprouet. Clikit da nullañ ar pedad heuliañ",
   "account.share": "Skignañ profil @{name}",
   "account.show_reblogs": "Diskouez toudoù a @{name}",
   "account.unblock": "Distankañ @{name}",
   "account.unblock_domain": "Diguzh {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "Paouez da lakaat war-wel war ar profil",
   "account.unfollow": "Diheuliañ",
   "account.unmute": "Diguzhat @{name}",
   "account.unmute_notifications": "Diguzhat kemennoù a @{name}",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "alert.rate_limited.message": "Klaskit en-dro a-benn {retry_time, time, medium}.",
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "Ur fazi dic'hortozet zo degouezhet.",
   "alert.unexpected.title": "C'hem !",
+  "announcement.announcement": "Kemenn",
   "autosuggest_hashtag.per_week": "{count} bep sizhun",
-  "boost_modal.combo": "You can press {combo} to skip this next time",
+  "boost_modal.combo": "Ar wezh kentañ e c'halliot gwaskañ war {combo} evit tremen hebiou",
   "bundle_column_error.body": "Something went wrong while loading this component.",
   "bundle_column_error.retry": "Klask endro",
   "bundle_column_error.title": "Fazi rouedad",
@@ -51,65 +53,68 @@
   "bundle_modal_error.message": "Something went wrong while loading this component.",
   "bundle_modal_error.retry": "Klask endro",
   "column.blocks": "Implijour·ezed·ion stanket",
+  "column.bookmarks": "Sinedoù",
   "column.community": "Red-amzer lec'hel",
   "column.direct": "Kemennadoù prevez",
   "column.directory": "Mont a-dreuz ar profiloù",
   "column.domain_blocks": "Domani kuzhet",
-  "column.favourites": "Favourites",
-  "column.follow_requests": "Follow requests",
-  "column.home": "Home",
-  "column.lists": "Lists",
-  "column.mutes": "Muted users",
-  "column.notifications": "Notifications",
-  "column.pins": "Pinned toot",
-  "column.public": "Federated timeline",
-  "column_back_button.label": "Back",
-  "column_header.hide_settings": "Hide settings",
+  "column.favourites": "Ar re vuiañ-karet",
+  "column.follow_requests": "Pedadoù heuliañ",
+  "column.home": "Degemer",
+  "column.lists": "Listennoù",
+  "column.mutes": "Implijer·ion·ezed kuzhet",
+  "column.notifications": "Kemennoù",
+  "column.pins": "Toudoù spilhennet",
+  "column.public": "Red-amzer kevreet",
+  "column_back_button.label": "Distro",
+  "column_header.hide_settings": "Kuzhat an arventennoù",
   "column_header.moveLeft_settings": "Move column to the left",
   "column_header.moveRight_settings": "Move column to the right",
-  "column_header.pin": "Pin",
-  "column_header.show_settings": "Show settings",
-  "column_header.unpin": "Unpin",
-  "column_subheading.settings": "Settings",
-  "community.column_settings.media_only": "Media only",
-  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "column_header.pin": "Spilhennañ",
+  "column_header.show_settings": "Diskouez an arventennoù",
+  "column_header.unpin": "Dispilhennañ",
+  "column_subheading.settings": "Arventennoù",
+  "community.column_settings.media_only": "Nemet Mediaoù",
+  "compose_form.direct_message_warning": "An toud-mañ a vo kaset nemet d'an implijer·ion·ezed meneget.",
+  "compose_form.direct_message_warning_learn_more": "Gouiet hiroc'h",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
-  "compose_form.lock_disclaimer.lock": "locked",
-  "compose_form.placeholder": "What is on your mind?",
-  "compose_form.poll.add_option": "Add a choice",
+  "compose_form.lock_disclaimer.lock": "prennet",
+  "compose_form.placeholder": "Petra eh oc'h é soñjal a-barzh ?",
+  "compose_form.poll.add_option": "Ouzhpenniñ un dibab",
   "compose_form.poll.duration": "Poll duration",
-  "compose_form.poll.option_placeholder": "Choice {number}",
-  "compose_form.poll.remove_option": "Remove this choice",
-  "compose_form.publish": "Toot",
-  "compose_form.publish_loud": "{publish}!",
+  "compose_form.poll.option_placeholder": "Dibab {number}",
+  "compose_form.poll.remove_option": "Lemel an dibab-mañ",
+  "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": "Toudañ",
+  "compose_form.publish_loud": "{publish} !",
   "compose_form.sensitive.hide": "Mark media as sensitive",
   "compose_form.sensitive.marked": "Media is marked as sensitive",
   "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
-  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.spoiler.unmarked": "N'eo ket kuzhet an destenn",
   "compose_form.spoiler_placeholder": "Write your warning here",
-  "confirmation_modal.cancel": "Cancel",
+  "confirmation_modal.cancel": "Nullañ",
   "confirmations.block.block_and_report": "Block & Report",
   "confirmations.block.confirm": "Block",
   "confirmations.block.message": "Are you sure you want to block {name}?",
-  "confirmations.delete.confirm": "Delete",
+  "confirmations.delete.confirm": "Dilemel",
   "confirmations.delete.message": "Are you sure you want to delete this status?",
-  "confirmations.delete_list.confirm": "Delete",
-  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
-  "confirmations.domain_block.confirm": "Hide entire domain",
+  "confirmations.delete_list.confirm": "Dilemel",
+  "confirmations.delete_list.message": "Ha sur eo hoc'h eus c'hoant da zilemel ar roll-mañ da vat ?",
+  "confirmations.domain_block.confirm": "Kuzhat an domani a-bezh",
   "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.confirm": "Digevreañ",
   "confirmations.logout.message": "Are you sure you want to log out?",
-  "confirmations.mute.confirm": "Mute",
+  "confirmations.mute.confirm": "Kuzhat",
   "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
-  "confirmations.mute.message": "Are you sure you want to mute {name}?",
-  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.mute.message": "Ha sur oc'h e fell deoc'h kuzhaat {name} ?",
+  "confirmations.redraft.confirm": "Diverkañ ha skrivañ en-dro",
   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
-  "confirmations.reply.confirm": "Reply",
+  "confirmations.reply.confirm": "Respont",
   "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
-  "confirmations.unfollow.confirm": "Unfollow",
+  "confirmations.unfollow.confirm": "Diheuliañ",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
   "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "to reply",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mentions:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
@@ -344,6 +355,7 @@
   "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",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boosted",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Reply",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Add media ({formats})",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "Edit",
   "upload_form.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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "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",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 396e4a325..65ec5750b 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -1,14 +1,15 @@
 {
   "account.add_or_remove_from_list": "Afegir o Treure de les llistes",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Grup",
   "account.block": "Bloqueja @{name}",
   "account.block_domain": "Amaga-ho tot de {domain}",
   "account.blocked": "Bloquejat",
   "account.cancel_follow_request": "Anul·la la sol·licitud de seguiment",
   "account.direct": "Missatge directe @{name}",
   "account.domain_blocked": "Domini ocult",
-  "account.edit_profile": "Editar el perfil",
-  "account.endorse": "Recomanar en el teu perfil",
+  "account.edit_profile": "Edita el perfil",
+  "account.endorse": "Recomana en el teu perfil",
   "account.follow": "Segueix",
   "account.followers": "Seguidors",
   "account.followers.empty": "Encara ningú no segueix aquest usuari.",
@@ -26,15 +27,15 @@
   "account.mute_notifications": "Notificacions desactivades de @{name}",
   "account.muted": "Silenciat",
   "account.never_active": "Mai",
-  "account.posts": "Toots",
-  "account.posts_with_replies": "Toots i respostes",
-  "account.report": "Informe @{name}",
+  "account.posts": "Tuts",
+  "account.posts_with_replies": "Tuts i respostes",
+  "account.report": "Informar sobre @{name}",
   "account.requested": "Esperant aprovació. Clic per a cancel·lar la petició de seguiment",
   "account.share": "Comparteix el perfil de @{name}",
   "account.show_reblogs": "Mostra els impulsos de @{name}",
-  "account.unblock": "Desbloca @{name}",
+  "account.unblock": "Desbloqueja @{name}",
   "account.unblock_domain": "Mostra {domain}",
-  "account.unendorse": "No es mostren al perfil",
+  "account.unendorse": "No recomanar en el perfil",
   "account.unfollow": "Deixa de seguir",
   "account.unmute": "Treure silenci de @{name}",
   "account.unmute_notifications": "Activar notificacions de @{name}",
@@ -42,8 +43,9 @@
   "alert.rate_limited.title": "Límit de freqüència",
   "alert.unexpected.message": "S'ha produït un error inesperat.",
   "alert.unexpected.title": "Vaja!",
+  "announcement.announcement": "Anunci",
   "autosuggest_hashtag.per_week": "{count} per setmana",
-  "boost_modal.combo": "Pots premer {combo} per saltar-te això el proper cop",
+  "boost_modal.combo": "Pots prémer {combo} per saltar-te això el proper cop",
   "bundle_column_error.body": "S'ha produït un error en carregar aquest component.",
   "bundle_column_error.retry": "Torna-ho a provar",
   "bundle_column_error.title": "Error de connexió",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "S'ha produït un error en carregar aquest component.",
   "bundle_modal_error.retry": "Torna-ho a provar",
   "column.blocks": "Usuaris bloquejats",
+  "column.bookmarks": "Marcadors",
   "column.community": "Línia de temps local",
   "column.direct": "Missatges directes",
   "column.directory": "Navega els perfils",
@@ -61,7 +64,7 @@
   "column.lists": "Llistes",
   "column.mutes": "Usuaris silenciats",
   "column.notifications": "Notificacions",
-  "column.pins": "Toots fixats",
+  "column.pins": "Tuts fixats",
   "column.public": "Línia de temps federada",
   "column_back_button.label": "Enrere",
   "column_header.hide_settings": "Amaga la configuració",
@@ -72,9 +75,9 @@
   "column_header.unpin": "No fixis",
   "column_subheading.settings": "Configuració",
   "community.column_settings.media_only": "Només multimèdia",
-  "compose_form.direct_message_warning": "Aquest toot només serà enviat als usuaris esmentats.",
+  "compose_form.direct_message_warning": "Aquest tut només serà enviat als usuaris esmentats.",
   "compose_form.direct_message_warning_learn_more": "Aprèn més",
-  "compose_form.hashtag_warning": "Aquest toot no es mostrarà en cap etiqueta ja que no està llistat. Només els toots públics poden ser cercats per etiqueta.",
+  "compose_form.hashtag_warning": "Aquesta tut no es mostrarà en cap etiqueta ja que no està llistat. Només els tuts públics poden ser cercats per etiqueta.",
   "compose_form.lock_disclaimer": "El teu compte no està bloquejat {locked}. Tothom pot seguir-te i veure els teus missatges a seguidors.",
   "compose_form.lock_disclaimer.lock": "bloquejat",
   "compose_form.placeholder": "En què penses?",
@@ -82,7 +85,9 @@
   "compose_form.poll.duration": "Durada de l'enquesta",
   "compose_form.poll.option_placeholder": "Opció {number}",
   "compose_form.poll.remove_option": "Elimina aquesta opció",
-  "compose_form.publish": "Toot",
+  "compose_form.poll.switch_to_multiple": "Canvia l’enquesta per a permetre diverses opcions",
+  "compose_form.poll.switch_to_single": "Canvia l’enquesta per a permetre una única opció",
+  "compose_form.publish": "Tut",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Marcar mèdia com a sensible",
   "compose_form.sensitive.marked": "Mèdia marcat com a sensible",
@@ -95,18 +100,18 @@
   "confirmations.block.confirm": "Bloqueja",
   "confirmations.block.message": "Estàs segur que vols bloquejar a {name}?",
   "confirmations.delete.confirm": "Suprimeix",
-  "confirmations.delete.message": "Estàs segur que vols suprimir aquest toot?",
+  "confirmations.delete.message": "Estàs segur que vols suprimir aquest tut?",
   "confirmations.delete_list.confirm": "Suprimeix",
   "confirmations.delete_list.message": "Estàs segur que vols suprimir permanentment aquesta llista?",
   "confirmations.domain_block.confirm": "Amaga tot el domini",
-  "confirmations.domain_block.message": "Estàs segur, realment segur que vols bloquejar totalment {domain}? En la majoria dels casos bloquejar o silenciar uns pocs objectius és suficient i preferible. No veuràs contingut d’aquest domini en cap de les línies públiques ni en les notificacions. Els teus seguidors d’aquest domini seran eliminats.",
+  "confirmations.domain_block.message": "Estàs segur, realment segur que vols bloquejar totalment {domain}? En la majoria dels casos bloquejar o silenciar uns pocs objectius és suficient i preferible. No veuràs contingut d’aquest domini en cap de les línies de temps ni en les notificacions. Els teus seguidors d’aquest domini seran eliminats.",
   "confirmations.logout.confirm": "Tancar sessió",
   "confirmations.logout.message": "Segur que vols tancar la sessió?",
   "confirmations.mute.confirm": "Silencia",
   "confirmations.mute.explanation": "Això amagarà les seves publicacions i les que els mencionen però encara els permetrà veure les teves i seguir-te.",
   "confirmations.mute.message": "Estàs segur que vols silenciar {name}?",
   "confirmations.redraft.confirm": "Esborrar i refer",
-  "confirmations.redraft.message": "Estàs segur que vols esborrar aquest toot i tornar a redactar-lo? Perderàs totes els impulsos i favorits, i les respostes al toot original es quedaran orfes.",
+  "confirmations.redraft.message": "Estàs segur que vols esborrar aquest tut i tornar a redactar-lo? Perdràs tots els impulsos i favorits, i les respostes al tut original es quedaran orfes.",
   "confirmations.reply.confirm": "Respon",
   "confirmations.reply.message": "Responen ara es sobreescriurà el missatge que estàs editant. Estàs segur que vols continuar?",
   "confirmations.unfollow.confirm": "Deixa de seguir",
@@ -119,8 +124,8 @@
   "directory.local": "Només de {domain}",
   "directory.new_arrivals": "Arribades noves",
   "directory.recently_active": "Recentment actius",
-  "embed.instructions": "Incrusta aquest toot al lloc web copiant el codi a continuació.",
-  "embed.preview": "Aquí tenim quin aspecte tindrá:",
+  "embed.instructions": "Incrusta aquest tut al lloc web copiant el codi a continuació.",
+  "embed.preview": "Aquí tenim quin aspecte tindrà:",
   "emoji_button.activity": "Activitat",
   "emoji_button.custom": "Personalitzat",
   "emoji_button.flags": "Banderes",
@@ -135,19 +140,20 @@
   "emoji_button.search_results": "Resultats de la cerca",
   "emoji_button.symbols": "Símbols",
   "emoji_button.travel": "Viatges i Llocs",
-  "empty_column.account_timeline": "No hi ha toots aquí!",
+  "empty_column.account_timeline": "No hi ha tuts aquí!",
   "empty_column.account_unavailable": "Perfil no disponible",
   "empty_column.blocks": "Encara no has bloquejat cap usuari.",
+  "empty_column.bookmarked_statuses": "Encara no tens marcat cap tut. Quan marquis un apareixerà aquí.",
   "empty_column.community": "La línia de temps local és buida. Escriu alguna cosa públicament per a fer rodar la pilota!",
   "empty_column.direct": "Encara no tens missatges directes. Quan enviïs o rebis un, es mostrarà aquí.",
   "empty_column.domain_blocks": "Encara no hi ha dominis ocults.",
-  "empty_column.favourited_statuses": "Encara no tens cap toot favorit. Quan en tinguis, apareixerà aquí.",
-  "empty_column.favourites": "Encara ningú ha marcat aquest toot com a favorit. Quan algú ho faci, apareixera aquí.",
-  "empty_column.follow_requests": "Encara no teniu cap petició de seguiment. Quan rebis una, apareixerà aquí.",
+  "empty_column.favourited_statuses": "Encara no has marcat com a favorit cap tut. Quan en facis, apareixerà aquí.",
+  "empty_column.favourites": "Ningú no ha marcat aquest tut com a preferit encara. Quan algú ho faci, apareixerà aquí.",
+  "empty_column.follow_requests": "Encara no tens cap petició de seguiment. Quan rebis una, apareixerà aquí.",
   "empty_column.hashtag": "Encara no hi ha res en aquesta etiqueta.",
   "empty_column.home": "Encara no segueixes ningú. Visita {public} o fes cerca per començar i conèixer altres usuaris.",
   "empty_column.home.public_timeline": "la línia de temps pública",
-  "empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres d'aquesta llista publiquin nous toots, apareixeran aquí.",
+  "empty_column.list": "Encara no hi ha res en aquesta llista. Quan els membres d'aquesta llista publiquin nous tuts, apareixeran aquí.",
   "empty_column.lists": "Encara no tens cap llista. Quan en facis una, apareixerà aquí.",
   "empty_column.mutes": "Encara no has silenciat cap usuari.",
   "empty_column.notifications": "Encara no tens notificacions. Interactua amb altres per iniciar la conversa.",
@@ -163,7 +169,7 @@
   "getting_started.documentation": "Documentació",
   "getting_started.heading": "Començant",
   "getting_started.invite": "Convida gent",
-  "getting_started.open_source_notice": "Mastodon és un programari de codi obert. Pots contribuir o informar de problemes a GitHub a {github}.",
+  "getting_started.open_source_notice": "Mastodon és un programari de codi obert. Pots contribuir-hi o informar de problemes a GitHub a {github}.",
   "getting_started.security": "Seguretat",
   "getting_started.terms": "Termes del servei",
   "hashtag.column_header.tag_mode.all": "i {additional}",
@@ -176,8 +182,8 @@
   "hashtag.column_settings.tag_mode.none": "Cap d’aquests",
   "hashtag.column_settings.tag_toggle": "Inclou etiquetes addicionals per a aquesta columna",
   "home.column_settings.basic": "Bàsic",
-  "home.column_settings.show_reblogs": "Mostrar impulsos",
-  "home.column_settings.show_replies": "Mostrar respostes",
+  "home.column_settings.show_reblogs": "Mostra els impulsos",
+  "home.column_settings.show_replies": "Mostra les respostes",
   "intervals.full.days": "{number, plural, one {# dia} other {# dies}}",
   "intervals.full.hours": "{number, plural, one {# hora} other {# hores}}",
   "intervals.full.minutes": "{number, plural, one {# minut} other {# minuts}}",
@@ -190,27 +196,27 @@
   "introduction.federation.local.text": "Les publicacions públiques de les persones del teu mateix servidor apareixeran a la línia de temps local.",
   "introduction.interactions.action": "Finalitza el tutorial!",
   "introduction.interactions.favourite.headline": "Favorit",
-  "introduction.interactions.favourite.text": "Pots desar un toot per a més tard i deixar que l'autor sàpiga que t'ha agradat, marcant-lo com a favorit.",
+  "introduction.interactions.favourite.text": "Pots desar un tut per a més tard i deixar que l'autor sàpiga que t'ha agradat, marcant-lo com a favorit.",
   "introduction.interactions.reblog.headline": "Impuls",
-  "introduction.interactions.reblog.text": "Pots compartir amb els teus seguidors els toots d'altres usuaris, impulsant-los.",
+  "introduction.interactions.reblog.text": "Pots compartir amb els teus seguidors els tuts d'altres usuaris, impulsant-los.",
   "introduction.interactions.reply.headline": "Respondre",
-  "introduction.interactions.reply.text": "Pots respondre als toots d'altres persones i als teus propis, que els unirà en una conversa.",
+  "introduction.interactions.reply.text": "Pots respondre als tuts d'altres persones i als teus propis, que els unirà en una conversa.",
   "introduction.welcome.action": "Som-hi!",
   "introduction.welcome.headline": "Primers passos",
   "introduction.welcome.text": "Benvingut al fedivers! En uns moments podràs emetre missatges i conversar amb els teus amics en una gran varietat de servidors. Però aquest servidor, {domain}, és especial: allotja el teu perfil així que recorda el seu nom.",
-  "keyboard_shortcuts.back": "navegar enrera",
+  "keyboard_shortcuts.back": "navegar enrere",
   "keyboard_shortcuts.blocked": "per obrir la llista d'usuaris bloquejats",
   "keyboard_shortcuts.boost": "impulsar",
-  "keyboard_shortcuts.column": "per a centrar un toot en una de les columnes",
-  "keyboard_shortcuts.compose": "per centrar l'area de composició de text",
+  "keyboard_shortcuts.column": "per a centrar un tut en una de les columnes",
+  "keyboard_shortcuts.compose": "per centrar l'àrea de composició de text",
   "keyboard_shortcuts.description": "Descripció",
   "keyboard_shortcuts.direct": "per obrir la columna de missatges directes",
   "keyboard_shortcuts.down": "per baixar en la llista",
-  "keyboard_shortcuts.enter": "ampliar el toot",
+  "keyboard_shortcuts.enter": "per a obrir el tut",
   "keyboard_shortcuts.favourite": "afavorir",
   "keyboard_shortcuts.favourites": "per obrir la llista de favorits",
   "keyboard_shortcuts.federated": "per obrir la línia de temps federada",
-  "keyboard_shortcuts.heading": "Dreçeres de teclat",
+  "keyboard_shortcuts.heading": "Dreceres de teclat",
   "keyboard_shortcuts.home": "per a obrir la línia de temps Inici",
   "keyboard_shortcuts.hotkey": "Tecla d'accés directe",
   "keyboard_shortcuts.legend": "per a mostrar aquesta llegenda",
@@ -219,16 +225,17 @@
   "keyboard_shortcuts.muted": "per a obrir la llista d'usuaris silenciats",
   "keyboard_shortcuts.my_profile": "per a obrir el teu perfil",
   "keyboard_shortcuts.notifications": "per a obrir la columna de notificacions",
-  "keyboard_shortcuts.pinned": "per a obrir la llista de toots fixats",
+  "keyboard_shortcuts.open_media": "obrir mèdia",
+  "keyboard_shortcuts.pinned": "per a obrir la llista de tuts fixats",
   "keyboard_shortcuts.profile": "per a obrir el perfil de l'autor",
   "keyboard_shortcuts.reply": "respondre",
   "keyboard_shortcuts.requests": "per a obrir la llista de sol·licituds de seguiment",
   "keyboard_shortcuts.search": "per a centrar la cerca",
   "keyboard_shortcuts.start": "per a obrir la columna \"Començar\"",
-  "keyboard_shortcuts.toggle_hidden": "per a mostrar/amagar text sota CW",
-  "keyboard_shortcuts.toggle_sensitivity": "per a mostrar/amagar mèdia",
-  "keyboard_shortcuts.toot": "per a començar un toot nou de trinca",
-  "keyboard_shortcuts.unfocus": "descentrar l'area de composició de text/cerca",
+  "keyboard_shortcuts.toggle_hidden": "per a mostrar o amagar text sota CW",
+  "keyboard_shortcuts.toggle_sensitivity": "per a mostrar o amagar contingut multimèdia",
+  "keyboard_shortcuts.toot": "per a començar un tut nou de trinca",
+  "keyboard_shortcuts.unfocus": "descentrar l'àrea de composició de text/cerca",
   "keyboard_shortcuts.up": "moure amunt en la llista",
   "lightbox.close": "Tancar",
   "lightbox.next": "Següent",
@@ -251,13 +258,14 @@
   "mute_modal.hide_notifications": "Amagar notificacions d'aquest usuari?",
   "navigation_bar.apps": "Apps mòbils",
   "navigation_bar.blocks": "Usuaris bloquejats",
+  "navigation_bar.bookmarks": "Marcadors",
   "navigation_bar.community_timeline": "Línia de temps Local",
-  "navigation_bar.compose": "Redacta nou toot",
+  "navigation_bar.compose": "Redacta un nou tut",
   "navigation_bar.direct": "Missatges directes",
   "navigation_bar.discover": "Descobreix",
   "navigation_bar.domain_blocks": "Dominis ocults",
   "navigation_bar.edit_profile": "Editar perfil",
-  "navigation_bar.favourites": "Favorits",
+  "navigation_bar.favourites": "Preferits",
   "navigation_bar.filters": "Paraules silenciades",
   "navigation_bar.follow_requests": "Sol·licituds de seguiment",
   "navigation_bar.follows_and_followers": "Seguits i seguidors",
@@ -267,29 +275,32 @@
   "navigation_bar.logout": "Tancar sessió",
   "navigation_bar.mutes": "Usuaris silenciats",
   "navigation_bar.personal": "Personal",
-  "navigation_bar.pins": "Toots fixats",
+  "navigation_bar.pins": "Tuts fixats",
   "navigation_bar.preferences": "Preferències",
   "navigation_bar.public_timeline": "Línia de temps federada",
   "navigation_bar.security": "Seguretat",
   "notification.favourite": "{name} ha afavorit el teu estat",
   "notification.follow": "{name} et segueix",
+  "notification.follow_request": "{name} ha sol·licitat seguir-te",
   "notification.mention": "{name} t'ha esmentat",
+  "notification.own_poll": "La teva enquesta ha finalitzat",
   "notification.poll": "Ha finalitzat una enquesta en la que has votat",
   "notification.reblog": "{name} ha impulsat el teu estat",
   "notifications.clear": "Netejar notificacions",
-  "notifications.clear_confirmation": "Estàs segur que vols esborrar permanenment totes les teves notificacions?",
+  "notifications.clear_confirmation": "Estàs segur que vols esborrar permanentment totes les teves notificacions?",
   "notifications.column_settings.alert": "Notificacions d'escriptori",
-  "notifications.column_settings.favourite": "Favorits:",
+  "notifications.column_settings.favourite": "Preferits:",
   "notifications.column_settings.filter_bar.advanced": "Mostra totes les categories",
   "notifications.column_settings.filter_bar.category": "Barra ràpida de filtres",
   "notifications.column_settings.filter_bar.show": "Mostra",
   "notifications.column_settings.follow": "Nous seguidors:",
+  "notifications.column_settings.follow_request": "Nova sol·licitud de seguiment:",
   "notifications.column_settings.mention": "Mencions:",
   "notifications.column_settings.poll": "Resultats de l’enquesta:",
   "notifications.column_settings.push": "Notificacions push",
   "notifications.column_settings.reblog": "Impulsos:",
-  "notifications.column_settings.show": "Mostrar en la columna",
-  "notifications.column_settings.sound": "Reproduïr so",
+  "notifications.column_settings.show": "Mostra en la columna",
+  "notifications.column_settings.sound": "Reproduir so",
   "notifications.filter.all": "Tots",
   "notifications.filter.boosts": "Impulsos",
   "notifications.filter.favourites": "Favorits",
@@ -333,20 +344,21 @@
   "search_popout.search_format": "Format de cerca avançada",
   "search_popout.tips.full_text": "Text simple recupera publicacions que has escrit, les marcades com a favorites, les impulsades o en les que has estat esmentat, així com usuaris, noms d'usuari i etiquetes.",
   "search_popout.tips.hashtag": "etiqueta",
-  "search_popout.tips.status": "estat",
+  "search_popout.tips.status": "tut",
   "search_popout.tips.text": "El text simple retorna coincidències amb els noms de visualització, els noms d'usuari i les etiquetes",
   "search_popout.tips.user": "usuari",
   "search_results.accounts": "Gent",
   "search_results.hashtags": "Etiquetes",
-  "search_results.statuses": "Toots",
-  "search_results.statuses_fts_disabled": "La cerca de toots pel seu contingut no està habilitada en aquest servidor Mastodon.",
+  "search_results.statuses": "Tuts",
+  "search_results.statuses_fts_disabled": "La cerca de tuts pel seu contingut no està habilitada en aquest servidor Mastodon.",
   "search_results.total": "{count, number} {count, plural, one {resultat} other {resultats}}",
   "status.admin_account": "Obre l'interfície de moderació per a @{name}",
-  "status.admin_status": "Obre aquest toot a la interfície de moderació",
+  "status.admin_status": "Obre aquest tut a la interfície de moderació",
   "status.block": "Bloqueja @{name}",
+  "status.bookmark": "Marcador",
   "status.cancel_reblog_private": "Desfer l'impuls",
   "status.cannot_reblog": "Aquesta publicació no pot ser impulsada",
-  "status.copy": "Copia l'enllaç al toot",
+  "status.copy": "Copia l'enllaç al tut",
   "status.delete": "Esborrar",
   "status.detailed_status": "Visualització detallada de la conversa",
   "status.direct": "Missatge directe @{name}",
@@ -361,13 +373,14 @@
   "status.mute_conversation": "Silenciar conversació",
   "status.open": "Ampliar aquest estat",
   "status.pin": "Fixat en el perfil",
-  "status.pinned": "Toot fixat",
+  "status.pinned": "Tut fixat",
   "status.read_more": "Llegir més",
   "status.reblog": "Impuls",
   "status.reblog_private": "Impulsar a l'audiència original",
   "status.reblogged_by": "{name} ha impulsat",
-  "status.reblogs.empty": "Encara ningú no ha impulsat aquest toot. Quan algú ho faci, apareixeran aquí.",
+  "status.reblogs.empty": "Encara ningú no ha impulsat aquest tut. Quan algú ho faci, apareixeran aquí.",
   "status.redraft": "Esborrar i reescriure",
+  "status.remove_bookmark": "Suprimeix el marcador",
   "status.reply": "Respondre",
   "status.replyAll": "Respondre al tema",
   "status.report": "Informar sobre @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Afegir multimèdia (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "S'ha superat el límit de càrrega d'arxius.",
   "upload_error.poll": "No es permet l'enviament de fitxers en les enquestes.",
+  "upload_form.audio_description": "Descriviu per a les persones amb pèrdua auditiva",
   "upload_form.description": "Descriure els problemes visuals",
   "upload_form.edit": "Edita",
   "upload_form.undo": "Esborra",
+  "upload_form.video_description": "Descriu per a les persones amb pèrdua auditiva o deficiència visual",
   "upload_modal.analyzing_picture": "Analitzant imatge…",
   "upload_modal.apply": "Aplica",
   "upload_modal.description_placeholder": "Uns salts ràpids de guineu marró sobre el gos gandul",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Previsualitza ({ratio})",
   "upload_progress.label": "Pujant...",
   "video.close": "Tancar el vídeo",
+  "video.download": "Descarrega l’arxiu",
   "video.exit_fullscreen": "Sortir de pantalla completa",
   "video.expand": "Ampliar el vídeo",
   "video.fullscreen": "Pantalla completa",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 6c680f13f..8f3c99f8a 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Aghjunghje o toglie da e liste",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Gruppu",
   "account.block": "Bluccà @{name}",
   "account.block_domain": "Piattà tuttu da {domain}",
   "account.blocked": "Bluccatu",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Ghjettu limitatu",
   "alert.unexpected.message": "Un prublemu inaspettatu hè accadutu.",
   "alert.unexpected.title": "Uups!",
+  "announcement.announcement": "Annunziu",
   "autosuggest_hashtag.per_week": "{count} per settimana",
   "boost_modal.combo": "Pudete appughjà nant'à {combo} per saltà quessa a prussima volta",
   "bundle_column_error.body": "C'hè statu un prublemu caricandu st'elementu.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "C'hè statu un prublemu caricandu st'elementu.",
   "bundle_modal_error.retry": "Pruvà torna",
   "column.blocks": "Utilizatori bluccati",
+  "column.bookmarks": "Segnalibri",
   "column.community": "Linea pubblica lucale",
   "column.direct": "Missaghji diretti",
   "column.directory": "Percorre i prufili",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Durata di u scandagliu",
   "compose_form.poll.option_placeholder": "Scelta {number}",
   "compose_form.poll.remove_option": "Toglie sta scelta",
+  "compose_form.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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Indicà u media cum'è sensibile",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Nisun statutu quì!",
   "empty_column.account_unavailable": "Prufile micca dispunibule",
   "empty_column.blocks": "Per avà ùn avete bluccatu manc'un utilizatore.",
+  "empty_column.bookmarked_statuses": "Ùn avete manc'un segnalibru. Quandu aghjunghjerate unu, sarà mustratu quì.",
   "empty_column.community": "Ùn c'hè nunda indè a linea lucale. Scrivete puru qualcosa!",
   "empty_column.direct": "Ùn avete ancu nisun missaghju direttu. S'è voi mandate o ricevete unu, u vidarete quì.",
   "empty_column.domain_blocks": "Ùn c'hè manc'un duminiu bluccatu avà.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "per apre a lista di l'utilizatori piattati",
   "keyboard_shortcuts.my_profile": "per apre u vostru prufile",
   "keyboard_shortcuts.notifications": "per apre a culonna di nutificazione",
+  "keyboard_shortcuts.open_media": "per apre i media",
   "keyboard_shortcuts.pinned": "per apre a lista di statuti puntarulati",
   "keyboard_shortcuts.profile": "per apre u prufile di l'autore",
   "keyboard_shortcuts.reply": "risponde",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Piattà nutificazione da st'utilizatore?",
   "navigation_bar.apps": "Applicazione per u telefuninu",
   "navigation_bar.blocks": "Utilizatori bluccati",
+  "navigation_bar.bookmarks": "Segnalibri",
   "navigation_bar.community_timeline": "Linea pubblica lucale",
   "navigation_bar.compose": "Scrive un novu statutu",
   "navigation_bar.direct": "Missaghji diretti",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Sicurità",
   "notification.favourite": "{name} hà aghjuntu u vostru statutu à i so favuriti",
   "notification.follow": "{name} v'hà seguitatu",
+  "notification.follow_request": "{name} vole abbunassi à u vostru contu",
   "notification.mention": "{name} v'hà mintuvatu",
+  "notification.own_poll": "U vostru scandagliu hè compiu",
   "notification.poll": "Un scandagliu induve avete vutatu hè finitu",
   "notification.reblog": "{name} hà spartutu u vostru statutu",
   "notifications.clear": "Purgà e nutificazione",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Barra di ricerca pronta",
   "notifications.column_settings.filter_bar.show": "Mustrà",
   "notifications.column_settings.follow": "Abbunati novi:",
+  "notifications.column_settings.follow_request": "Nove dumande d'abbunamentu:",
   "notifications.column_settings.mention": "Minzione:",
   "notifications.column_settings.poll": "Risultati:",
   "notifications.column_settings.push": "Nutificazione Push",
@@ -344,6 +355,7 @@
   "status.admin_account": "Apre l'interfaccia di muderazione per @{name}",
   "status.admin_status": "Apre stu statutu in l'interfaccia di muderazione",
   "status.block": "Bluccà @{name}",
+  "status.bookmark": "Segnalibru",
   "status.cancel_reblog_private": "Ùn sparte più",
   "status.cannot_reblog": "Stu statutu ùn pò micca esse spartutu",
   "status.copy": "Cupià ligame indè u statutu",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} hà spartutu",
   "status.reblogs.empty": "Per avà nisunu hà spartutu u statutu. Quandu qualch'unu u sparterà, u so contu sarà mustratu quì.",
   "status.redraft": "Sguassà è riscrive",
+  "status.remove_bookmark": "Toglie segnalibru",
   "status.reply": "Risponde",
   "status.replyAll": "Risponde à tutti",
   "status.report": "Palisà @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Aghjunghje un media (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Limita di caricamentu di fugliali trapassata.",
   "upload_error.poll": "Ùn si pò micca caricà fugliali cù i scandagli.",
+  "upload_form.audio_description": "Discrizzione per i ciochi",
   "upload_form.description": "Discrive per i malvistosi",
   "upload_form.edit": "Mudificà",
   "upload_form.undo": "Sguassà",
+  "upload_form.video_description": "Discrizzione per i ciochi o cechi",
   "upload_modal.analyzing_picture": "Analisi di u ritrattu…",
   "upload_modal.apply": "Affettà",
   "upload_modal.description_placeholder": "Chì tempi brevi ziu, quandu solfeghji",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Vista ({ratio})",
   "upload_progress.label": "Caricamentu...",
   "video.close": "Chjudà a video",
+  "video.download": "Scaricà fugliale",
   "video.exit_fullscreen": "Caccià u pienu screnu",
   "video.expand": "Ingrandà a video",
   "video.fullscreen": "Pienu screnu",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index fc807d45e..f180b7f94 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -1,14 +1,15 @@
 {
   "account.add_or_remove_from_list": "Přidat nebo odstranit ze seznamů",
   "account.badges.bot": "Robot",
+  "account.badges.group": "Skupina",
   "account.block": "Zablokovat uživatele @{name}",
-  "account.block_domain": "Skrýt vše z {domain}",
-  "account.blocked": "Blokován/a",
-  "account.cancel_follow_request": "Zrušit požadavek o sledování",
-  "account.direct": "Poslat přímou zprávu uživateli @{name}",
+  "account.block_domain": "Skrýt vše ze serveru {domain}",
+  "account.blocked": "Blokováno",
+  "account.cancel_follow_request": "Zrušit žádost o sledování",
+  "account.direct": "Poslat uživateli @{name} přímou zprávu",
   "account.domain_blocked": "Doména skryta",
   "account.edit_profile": "Upravit profil",
-  "account.endorse": "Představit na profilu",
+  "account.endorse": "Zvýraznit na profilu",
   "account.follow": "Sledovat",
   "account.followers": "Sledující",
   "account.followers.empty": "Tohoto uživatele ještě nikdo nesleduje.",
@@ -21,42 +22,44 @@
   "account.locked_info": "Stav soukromí tohoto účtu je nastaven na zamčeno. Jeho vlastník ručně posuzuje, kdo ho může sledovat.",
   "account.media": "Média",
   "account.mention": "Zmínit uživatele @{name}",
-  "account.moved_to": "{name} se přesunul/a na:",
+  "account.moved_to": "Uživatel {name} se přesunul na:",
   "account.mute": "Skrýt uživatele @{name}",
   "account.mute_notifications": "Skrýt oznámení od uživatele @{name}",
-  "account.muted": "Skryt/a",
+  "account.muted": "Uživatel skryt",
   "account.never_active": "Nikdy",
   "account.posts": "Tooty",
   "account.posts_with_replies": "Tooty a odpovědi",
   "account.report": "Nahlásit uživatele @{name}",
-  "account.requested": "Čekám na schválení. Kliknutím zrušíte požadavek o sledování",
+  "account.requested": "Čeká na schválení. Kliknutím žádost o sledování zrušíte",
   "account.share": "Sdílet profil uživatele @{name}",
   "account.show_reblogs": "Zobrazit boosty od uživatele @{name}",
   "account.unblock": "Odblokovat uživatele @{name}",
   "account.unblock_domain": "Odkrýt doménu {domain}",
-  "account.unendorse": "Nepředstavit na profilu",
+  "account.unendorse": "Nezvýrazňovat na profilu",
   "account.unfollow": "Přestat sledovat",
   "account.unmute": "Odkrýt uživatele @{name}",
   "account.unmute_notifications": "Odkrýt oznámení od uživatele @{name}",
-  "alert.rate_limited.message": "Prosím zkuste to znovu za {retry_time, time, medium}.",
+  "alert.rate_limited.message": "Zkuste to prosím znovu za {retry_time, time, medium}.",
   "alert.rate_limited.title": "Rychlost omezena",
   "alert.unexpected.message": "Objevila se neočekávaná chyba.",
   "alert.unexpected.title": "Jejda!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} za týden",
   "boost_modal.combo": "Příště můžete pro přeskočení stisknout {combo}",
-  "bundle_column_error.body": "Při načítání tohoto komponentu se něco pokazilo.",
+  "bundle_column_error.body": "Při načítání této komponenty se něco pokazilo.",
   "bundle_column_error.retry": "Zkuste to znovu",
   "bundle_column_error.title": "Chyba sítě",
   "bundle_modal_error.close": "Zavřít",
-  "bundle_modal_error.message": "Při načítání tohoto komponentu se něco pokazilo.",
+  "bundle_modal_error.message": "Při načítání této komponenty se něco pokazilo.",
   "bundle_modal_error.retry": "Zkusit znovu",
   "column.blocks": "Blokovaní uživatelé",
+  "column.bookmarks": "Záložky",
   "column.community": "Místní časová osa",
   "column.direct": "Přímé zprávy",
   "column.directory": "Prozkoumat profily",
   "column.domain_blocks": "Skryté domény",
   "column.favourites": "Oblíbené",
-  "column.follow_requests": "Požadavky o sledování",
+  "column.follow_requests": "Žádosti o sledování",
   "column.home": "Domů",
   "column.lists": "Seznamy",
   "column.mutes": "Skrytí uživatelé",
@@ -75,13 +78,15 @@
   "compose_form.direct_message_warning": "Tento toot bude odeslán pouze zmíněným uživatelům.",
   "compose_form.direct_message_warning_learn_more": "Zjistit více",
   "compose_form.hashtag_warning": "Tento toot nebude zobrazen pod žádným hashtagem, neboť je neuvedený. Pouze veřejné tooty mohou být vyhledány podle hashtagu.",
-  "compose_form.lock_disclaimer": "Váš účet není {locked}. Kdokoliv vás může sledovat a vidět vaše příspěvky pouze pro sledující.",
+  "compose_form.lock_disclaimer": "Váš účet není {locked}. Kdokoliv vás může sledovat a vidět vaše příspěvky učené pouze pro sledující.",
   "compose_form.lock_disclaimer.lock": "uzamčen",
   "compose_form.placeholder": "Co se vám honí hlavou?",
   "compose_form.poll.add_option": "Přidat volbu",
-  "compose_form.poll.duration": "Délka ankety",
+  "compose_form.poll.duration": "Doba trvání ankety",
   "compose_form.poll.option_placeholder": "Volba {number}",
   "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": "Tootnout",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Označit média jako citlivá",
@@ -93,30 +98,30 @@
   "confirmation_modal.cancel": "Zrušit",
   "confirmations.block.block_and_report": "Blokovat a nahlásit",
   "confirmations.block.confirm": "Blokovat",
-  "confirmations.block.message": "Jste si jistý/á, že chcete zablokovat uživatele {name}?",
+  "confirmations.block.message": "Opravdu chcete zablokovat uživatele {name}?",
   "confirmations.delete.confirm": "Smazat",
-  "confirmations.delete.message": "Jste si jistý/á, že chcete smazat tento toot?",
+  "confirmations.delete.message": "Opravdu chcete smazat tento toot?",
   "confirmations.delete_list.confirm": "Smazat",
-  "confirmations.delete_list.message": "Jste si jistý/á, že chcete tento seznam navždy smazat?",
+  "confirmations.delete_list.message": "Opravdu chcete tento seznam navždy smazat?",
   "confirmations.domain_block.confirm": "Skrýt celou doménu",
-  "confirmations.domain_block.message": "Jste si opravdu, opravdu jistý/á, že chcete blokovat celou doménu {domain}? Ve většině případů stačí zablokovat nebo skrýt pár konkrétních uživatelů, což se doporučuje. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.",
+  "confirmations.domain_block.message": "Opravdu chcete blokovat celou doménu {domain}? Ve většině případů stačí zablokovat nebo skrýt pár konkrétních uživatelů, což také doporučujeme. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.",
   "confirmations.logout.confirm": "Odhlásit",
-  "confirmations.logout.message": "Jste si jistý/á, že se chcete odhlásit?",
+  "confirmations.logout.message": "Opravdu se chcete odhlásit?",
   "confirmations.mute.confirm": "Skrýt",
-  "confirmations.mute.explanation": "Tohle skryje jeho příspěvky a příspěvky, které ho zmiňují, ale uživatel pořád bude moci vidět vaše příspěvky a sledovat vás.",
-  "confirmations.mute.message": "Jste si jistý/á, že chcete skrýt uživatele {name}?",
+  "confirmations.mute.explanation": "Tohle skryje uživatelovi příspěvky a příspěvky, které ho zmiňují, ale uživatel stále uvidí vaše příspěvky a může vás sledovat.",
+  "confirmations.mute.message": "Opravdu chcete uživatele {name} skrýt?",
   "confirmations.redraft.confirm": "Smazat a přepsat",
   "confirmations.redraft.message": "Jste si jistý/á, že chcete smazat a přepsat tento toot? Oblíbení a boosty budou ztraceny a odpovědi na původní příspěvek budou opuštěny.",
   "confirmations.reply.confirm": "Odpovědět",
-  "confirmations.reply.message": "Odpovězením nyní přepíšete zprávu, kterou aktuálně píšete. Jste si jistý/á, že chcete pokračovat?",
+  "confirmations.reply.message": "Odpověď přepíše vaši rozepsanou zprávu. Opravdu chcete pokračovat?",
   "confirmations.unfollow.confirm": "Přestat sledovat",
-  "confirmations.unfollow.message": "jste si jistý/á, že chcete přestat sledovat uživatele {name}?",
+  "confirmations.unfollow.message": "Opravdu chcete uživatele {name} přestat sledovat?",
   "conversation.delete": "Smazat konverzaci",
   "conversation.mark_as_read": "Označit jako přečtenou",
   "conversation.open": "Zobrazit konverzaci",
   "conversation.with": "S {names}",
   "directory.federated": "Ze známého fedivesmíru",
-  "directory.local": "Pouze z {domain}",
+  "directory.local": "Pouze z domény {domain}",
   "directory.new_arrivals": "Nově příchozí",
   "directory.recently_active": "Nedávno aktivní",
   "embed.instructions": "Pro přidání tootu na vaši webovou stránku zkopírujte níže uvedený kód.",
@@ -127,33 +132,34 @@
   "emoji_button.food": "Jídla a nápoje",
   "emoji_button.label": "Vložit emoji",
   "emoji_button.nature": "Příroda",
-  "emoji_button.not_found": "Žádná emoji!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "Žádné emoji! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "Předměty",
   "emoji_button.people": "Lidé",
-  "emoji_button.recent": "Často používaná",
+  "emoji_button.recent": "Často používané",
   "emoji_button.search": "Hledat…",
   "emoji_button.search_results": "Výsledky hledání",
   "emoji_button.symbols": "Symboly",
   "emoji_button.travel": "Cestování a místa",
-  "empty_column.account_timeline": "Tady nejsou žádné tooty!",
+  "empty_column.account_timeline": "Nejsou tu žádné tooty!",
   "empty_column.account_unavailable": "Profil nedostupný",
-  "empty_column.blocks": "Ještě jste nezablokoval/a žádného uživatele.",
+  "empty_column.blocks": "Ještě jste nezablokovali žádného uživatele.",
+  "empty_column.bookmarked_statuses": "Ještě nemáte v záložkách žádné tooty. Pokud si do nich nějaký přidáte, zobrazí se zde.",
   "empty_column.community": "Místní časová osa je prázdná. Napište něco veřejně a rozhýbejte to tu!",
   "empty_column.direct": "Ještě nemáte žádné přímé zprávy. Pokud nějakou pošlete nebo dostanete, zobrazí se zde.",
-  "empty_column.domain_blocks": "Ještě nejsou žádné skryté domény.",
+  "empty_column.domain_blocks": "Ještě nemáte žádné skryté domény.",
   "empty_column.favourited_statuses": "Ještě nemáte žádné oblíbené tooty. Pokud si nějaký oblíbíte, zobrazí se zde.",
   "empty_column.favourites": "Tento toot si ještě nikdo neoblíbil. Pokud to někdo udělá, zobrazí se zde.",
-  "empty_column.follow_requests": "Ještě nemáte žádné požadavky o sledování. Pokud nějaký obdržíte, zobrazí se zde.",
+  "empty_column.follow_requests": "Ještě nemáte žádné žádosti o sledování. Pokud nějakou obdržíte, zobrazí se zde.",
   "empty_column.hashtag": "Pod tímto hashtagem ještě nic není.",
-  "empty_column.home": "Vaše domovská časová osa je prázdná! Začněte navštívením {public} nebo použijte hledání a seznamte se s dalšími uživateli.",
+  "empty_column.home": "Vaše domovská časová osa je prázdná! Začněte návštěvou {public} nebo použijte hledání a seznamte se s dalšími uživateli.",
   "empty_column.home.public_timeline": "veřejné časové osy",
-  "empty_column.list": "V tomto seznamu ještě nic není. Pokud budou členové tohoto seznamu psát nové tooty, objeví se zde.",
+  "empty_column.list": "V tomto seznamu ještě nic není. Pokud nějaký člen z tohoto seznamu napíše nový toot, objeví se zde.",
   "empty_column.lists": "Ještě nemáte žádný seznam. Pokud nějaký vytvoříte, zobrazí se zde.",
-  "empty_column.mutes": "Ještě jste neskryl/a žádné uživatele.",
-  "empty_column.notifications": "Ještě nemáte žádná oznámení. Začněte konverzaci komunikováním s ostatními.",
+  "empty_column.mutes": "Ještě jste neskryli žádného uživatele.",
+  "empty_column.notifications": "Ještě nemáte žádná oznámení. Začněte s někým konverzaci.",
   "empty_column.public": "Tady nic není! Napište něco veřejně, nebo začněte ručně sledovat uživatele z jiných serverů, aby tu něco přibylo",
   "error.unexpected_crash.explanation": "Kvůli chybě v našem kódu nebo problému s kompatibilitou prohlížeče nemohla být tato stránka načtena správně.",
-  "error.unexpected_crash.next_steps": "Zkuste obnovit stránku. Pokud to nepomůže, budete možná moci dále používat Mastodon pomocí jiného prohlížeče nebo nativní aplikace.",
+  "error.unexpected_crash.next_steps": "Zkuste stránku načíst znovu. Pokud to nepomůže, zkuste Mastodon používat pomocí jiného prohlížeče nebo nativní aplikace.",
   "errors.unexpected_crash.copy_stacktrace": "Zkopírovat stacktrace do schránky",
   "errors.unexpected_crash.report_issue": "Nahlásit problém",
   "follow_request.authorize": "Autorizovat",
@@ -163,13 +169,13 @@
   "getting_started.documentation": "Dokumentace",
   "getting_started.heading": "Začínáme",
   "getting_started.invite": "Pozvat lidi",
-  "getting_started.open_source_notice": "Mastodon je otevřený software. Na GitHubu k němu můžete přispět nebo nahlásit chyby: {github}.",
+  "getting_started.open_source_notice": "Mastodon je otevřený software. Přispět do jeho vývoje nebo hlásit chyby můžete na GitHubu {github}.",
   "getting_started.security": "Nastavení účtu",
   "getting_started.terms": "Podmínky používání",
   "hashtag.column_header.tag_mode.all": "a {additional}",
   "hashtag.column_header.tag_mode.any": "nebo {additional}",
   "hashtag.column_header.tag_mode.none": "bez {additional}",
-  "hashtag.column_settings.select.no_options_message": "Žádné návrhy nenalezeny",
+  "hashtag.column_settings.select.no_options_message": "Nenalezeny žádné návrhy",
   "hashtag.column_settings.select.placeholder": "Zadejte hashtagy…",
   "hashtag.column_settings.tag_mode.all": "Všechny z těchto",
   "hashtag.column_settings.tag_mode.any": "Jakékoliv z těchto",
@@ -178,14 +184,14 @@
   "home.column_settings.basic": "Základní",
   "home.column_settings.show_reblogs": "Zobrazit boosty",
   "home.column_settings.show_replies": "Zobrazit odpovědi",
-  "intervals.full.days": "{number, plural, one {# den} few {# dny} many {# dne} other {# dní}}",
-  "intervals.full.hours": "{number, plural, one {# hodina} few {# hodiny} many {# hodiny} other {# hodin}}",
-  "intervals.full.minutes": "{number, plural, one {# minuta} few {# minuty} many {# minuty} other {# minut}}",
+  "intervals.full.days": "{number, plural, one {# den} few {# dny} many {# dní} other {# dní}}",
+  "intervals.full.hours": "{number, plural, one {# hodina} few {# hodiny} many {# hodin} other {# hodin}}",
+  "intervals.full.minutes": "{number, plural, one {# minuta} few {# minuty} many {# minut} other {# minut}}",
   "introduction.federation.action": "Další",
   "introduction.federation.federated.headline": "Federovaná",
   "introduction.federation.federated.text": "Veřejné příspěvky z jiných serverů ve fedivesmíru se zobrazí na federované časové ose.",
   "introduction.federation.home.headline": "Domů",
-  "introduction.federation.home.text": "Příspěvky od lidí, které sledujete, se objeví ve vašem domovském proudu. Můžete sledovat kohokoliv na jakémkoliv serveru!",
+  "introduction.federation.home.text": "Příspěvky od lidí, které sledujete, se objeví ve vašem domovském kanálu. Můžete sledovat kohokoliv na jakémkoliv serveru!",
   "introduction.federation.local.headline": "Místní",
   "introduction.federation.local.text": "Veřejné příspěvky od lidí ze stejného serveru jako vy se zobrazí na místní časové ose.",
   "introduction.interactions.action": "Dokončit tutoriál!",
@@ -197,39 +203,40 @@
   "introduction.interactions.reply.text": "Můžete odpovídat na tooty jiných lidí i vaše vlastní, což je propojí do konverzace.",
   "introduction.welcome.action": "Jdeme na to!",
   "introduction.welcome.headline": "První kroky",
-  "introduction.welcome.text": "Vítejte ve fedivesmíru! Za malou chvíli budete moci posílat zprávy a povídat si se svými přátely přes širokou škálu serverů. Tento server, {domain}, je však speciální—je na něm váš profil, proto si zapamatujte jeho jméno.",
-  "keyboard_shortcuts.back": "k návratu zpět",
-  "keyboard_shortcuts.blocked": "k otevření seznamu blokovaných uživatelů",
-  "keyboard_shortcuts.boost": "k boostnutí",
-  "keyboard_shortcuts.column": "k zaměření na toot v jednom ze sloupců",
-  "keyboard_shortcuts.compose": "k zaměření na psací prostor",
+  "introduction.welcome.text": "Vítejte ve fedivesmíru! Za malou chvíli budete moci posílat zprávy a povídat si se svými přáteli z mnoha serverů. Tento server {domain}, je však speciální — je na něm váš profil a proto si zapamatujte jeho jméno.",
+  "keyboard_shortcuts.back": "návrat zpět",
+  "keyboard_shortcuts.blocked": "otevřít seznam blokovaných uživatelů",
+  "keyboard_shortcuts.boost": "boost",
+  "keyboard_shortcuts.column": "zaměření na toot v jednom ze sloupců",
+  "keyboard_shortcuts.compose": "zaměření na oblast pro psaní",
   "keyboard_shortcuts.description": "Popis",
-  "keyboard_shortcuts.direct": "k otevření sloupce s přímými zprávami",
-  "keyboard_shortcuts.down": "k posunutí dolů v seznamu",
-  "keyboard_shortcuts.enter": "k otevření tootu",
-  "keyboard_shortcuts.favourite": "k oblíbení",
-  "keyboard_shortcuts.favourites": "k otevření seznamu oblíbených",
-  "keyboard_shortcuts.federated": "k otevření federované časové osy",
+  "keyboard_shortcuts.direct": "otevření sloupce s přímými zprávami",
+  "keyboard_shortcuts.down": "posunutí dolů v seznamu",
+  "keyboard_shortcuts.enter": "otevření tootu",
+  "keyboard_shortcuts.favourite": "oblíbení",
+  "keyboard_shortcuts.favourites": "otevření seznamu oblíbených",
+  "keyboard_shortcuts.federated": "otevření federované časové osy",
   "keyboard_shortcuts.heading": "Klávesové zkratky",
-  "keyboard_shortcuts.home": "k otevření domovské časové osy",
+  "keyboard_shortcuts.home": "otevření domovské časové osy",
   "keyboard_shortcuts.hotkey": "Klávesová zkratka",
-  "keyboard_shortcuts.legend": "k zobrazení této legendy",
-  "keyboard_shortcuts.local": "k otevření místní časové osy",
-  "keyboard_shortcuts.mention": "ke zmínění autora",
-  "keyboard_shortcuts.muted": "k otevření seznamu skrytých uživatelů",
-  "keyboard_shortcuts.my_profile": "k otevření vašeho profilu",
-  "keyboard_shortcuts.notifications": "k otevření sloupce s oznámeními",
-  "keyboard_shortcuts.pinned": "k otevření seznamu připnutých tootů",
-  "keyboard_shortcuts.profile": "k otevření autorova profilu",
-  "keyboard_shortcuts.reply": "k odpovězení",
-  "keyboard_shortcuts.requests": "k otevření seznamu požadavků o sledování",
-  "keyboard_shortcuts.search": "k zaměření na hledání",
-  "keyboard_shortcuts.start": "k otevření sloupce „začínáme“",
-  "keyboard_shortcuts.toggle_hidden": "k zobrazení/skrytí textu za varováním o obsahu",
-  "keyboard_shortcuts.toggle_sensitivity": "k zobrazení/skrytí médií",
-  "keyboard_shortcuts.toot": "k napsání úplně nového tootu",
-  "keyboard_shortcuts.unfocus": "ke zrušení zaměření na psací prostor/hledání",
-  "keyboard_shortcuts.up": "k posunutí nahoru v seznamu",
+  "keyboard_shortcuts.legend": "zobrazení této legendy",
+  "keyboard_shortcuts.local": "otevření místní časové osy",
+  "keyboard_shortcuts.mention": "zmínění autora",
+  "keyboard_shortcuts.muted": "otevření seznamu skrytých uživatelů",
+  "keyboard_shortcuts.my_profile": "otevření vašeho profilu",
+  "keyboard_shortcuts.notifications": "otevření sloupce s oznámeními",
+  "keyboard_shortcuts.open_media": "otevření médií",
+  "keyboard_shortcuts.pinned": "otevření seznamu připnutých tootů",
+  "keyboard_shortcuts.profile": "otevření autorova profilu",
+  "keyboard_shortcuts.reply": "odpovědět",
+  "keyboard_shortcuts.requests": "otevření seznamu požadavků o sledování",
+  "keyboard_shortcuts.search": "zaměření na hledání",
+  "keyboard_shortcuts.start": "otevření sloupce „začínáme“",
+  "keyboard_shortcuts.toggle_hidden": "zobrazení/skrytí textu za varováním o obsahu",
+  "keyboard_shortcuts.toggle_sensitivity": "zobrazení/skrytí médií",
+  "keyboard_shortcuts.toot": "napsání úplně nového tootu",
+  "keyboard_shortcuts.unfocus": "zrušení zaměření na psací prostor/hledání",
+  "keyboard_shortcuts.up": "posunutí nahoru v seznamu",
   "lightbox.close": "Zavřít",
   "lightbox.next": "Další",
   "lightbox.previous": "Předchozí",
@@ -244,13 +251,14 @@
   "lists.search": "Hledejte mezi lidmi, které sledujete",
   "lists.subheading": "Vaše seznamy",
   "load_pending": "{count, plural, one {# nová položka} few {# nové položky} many {# nových položek} other {# nových položek}}",
-  "loading_indicator.label": "Načítám…",
-  "media_gallery.toggle_visible": "Přepínat viditelnost",
+  "loading_indicator.label": "Načítání…",
+  "media_gallery.toggle_visible": "Přepnout viditelnost",
   "missing_indicator.label": "Nenalezeno",
   "missing_indicator.sublabel": "Tento zdroj se nepodařilo najít",
   "mute_modal.hide_notifications": "Skrýt oznámení od tohoto uživatele?",
   "navigation_bar.apps": "Mobilní aplikace",
   "navigation_bar.blocks": "Blokovaní uživatelé",
+  "navigation_bar.bookmarks": "Záložky",
   "navigation_bar.community_timeline": "Místní časová osa",
   "navigation_bar.compose": "Vytvořit nový toot",
   "navigation_bar.direct": "Přímé zprávy",
@@ -259,7 +267,7 @@
   "navigation_bar.edit_profile": "Upravit profil",
   "navigation_bar.favourites": "Oblíbené",
   "navigation_bar.filters": "Skrytá slova",
-  "navigation_bar.follow_requests": "Požadavky o sledování",
+  "navigation_bar.follow_requests": "Žádosti o sledování",
   "navigation_bar.follows_and_followers": "Sledovaní a sledující",
   "navigation_bar.info": "O tomto serveru",
   "navigation_bar.keyboard_shortcuts": "Klávesové zkratky",
@@ -271,19 +279,22 @@
   "navigation_bar.preferences": "Předvolby",
   "navigation_bar.public_timeline": "Federovaná časová osa",
   "navigation_bar.security": "Zabezpečení",
-  "notification.favourite": "{name} si oblíbil/a váš toot",
-  "notification.follow": "{name} vás začal/a sledovat",
-  "notification.mention": "{name} vás zmínil/a",
-  "notification.poll": "Anketa, ve které jste hlasoval/a, skončila",
-  "notification.reblog": "{name} boostnul/a váš toot",
-  "notifications.clear": "Vymazat oznámení",
-  "notifications.clear_confirmation": "Jste si jistý/á, že chcete trvale vymazat všechna vaše oznámení?",
-  "notifications.column_settings.alert": "Desktopová oznámení",
+  "notification.favourite": "Uživatel {name} si oblíbil váš toot",
+  "notification.follow": "Uživatel {name} vás začal sledovat",
+  "notification.follow_request": "Uživatel {name} požádal o povolení vás sledovat",
+  "notification.mention": "Uživatel {name} vás zmínil",
+  "notification.own_poll": "Vaše anketa skončila",
+  "notification.poll": "Anketa, ve které jste hlasovali, skončila",
+  "notification.reblog": "Uživatel {name} boostnul váš toot",
+  "notifications.clear": "Smazat oznámení",
+  "notifications.clear_confirmation": "Opravdu chcete trvale smazat všechna vaše oznámení?",
+  "notifications.column_settings.alert": "Oznámení na počítači",
   "notifications.column_settings.favourite": "Oblíbení:",
   "notifications.column_settings.filter_bar.advanced": "Zobrazit všechny kategorie",
   "notifications.column_settings.filter_bar.category": "Panel rychlého filtrování",
   "notifications.column_settings.filter_bar.show": "Zobrazit",
   "notifications.column_settings.follow": "Noví sledující:",
+  "notifications.column_settings.follow_request": "Nové žádosti o sledování:",
   "notifications.column_settings.mention": "Zmínky:",
   "notifications.column_settings.poll": "Výsledky anket:",
   "notifications.column_settings.push": "Push oznámení",
@@ -297,12 +308,12 @@
   "notifications.filter.mentions": "Zmínky",
   "notifications.filter.polls": "Výsledky anket",
   "notifications.group": "{count} oznámení",
-  "poll.closed": "Uzavřena",
+  "poll.closed": "Uzavřeno",
   "poll.refresh": "Obnovit",
   "poll.total_people": "{count, plural, one {# člověk} few {# lidé} many {# lidí} other {# lidí}}",
-  "poll.total_votes": "{count, plural, one {# hlas} few {# hlasy} many {# hlasu} other {# hlasů}}",
+  "poll.total_votes": "{count, plural, one {# hlas} few {# hlasy} many {# hlasů} other {# hlasů}}",
   "poll.vote": "Hlasovat",
-  "poll.voted": "Pro tuto odpověď jste hlasoval/a",
+  "poll.voted": "Pro tuto odpověď jste hlasovali",
   "poll_button.add_poll": "Přidat anketu",
   "poll_button.remove_poll": "Odstranit anketu",
   "privacy.change": "Změnit soukromí tootu",
@@ -312,11 +323,11 @@
   "privacy.private.short": "Pouze pro sledující",
   "privacy.public.long": "Odeslat na veřejné časové osy",
   "privacy.public.short": "Veřejný",
-  "privacy.unlisted.long": "Neodeslat na veřejné časové osy",
+  "privacy.unlisted.long": "Neodesílat na veřejné časové osy",
   "privacy.unlisted.short": "Neuvedený",
   "refresh": "Obnovit",
-  "regeneration_indicator.label": "Načítám…",
-  "regeneration_indicator.sublabel": "Váš domovský proud se připravuje!",
+  "regeneration_indicator.label": "Načítání…",
+  "regeneration_indicator.sublabel": "Váš domovský kanál se připravuje!",
   "relative_time.days": "{number} d",
   "relative_time.hours": "{number} h",
   "relative_time.just_now": "teď",
@@ -325,13 +336,13 @@
   "reply_indicator.cancel": "Zrušit",
   "report.forward": "Přeposlat na {target}",
   "report.forward_hint": "Tento účet je z jiného serveru. Chcete na něj také poslat anonymizovanou kopii?",
-  "report.hint": "Nahlášení bude zasláno moderátorům vašeho serveru. Níže můžete uvést, proč tento účet nahlašujete:",
+  "report.hint": "Hlášení bude zasláno moderátorům vašeho serveru. Níže můžete uvést, proč tento účet nahlašujete:",
   "report.placeholder": "Dodatečné komentáře",
   "report.submit": "Odeslat",
   "report.target": "Nahlášení uživatele {target}",
   "search.placeholder": "Hledat",
   "search_popout.search_format": "Pokročilé hledání",
-  "search_popout.tips.full_text": "Jednoduchý text navrátí tooty, které jste napsal/a, oblíbil/a si, boostnul/a, nebo v nich byl/a zmíněn/a, a také odpovídající přezdívky, zobrazovaná jména a hashtagy.",
+  "search_popout.tips.full_text": "Jednoduchý text navrátí tooty, které jste napsali, oblíbili si, boostnuli, nebo vás v nich někdo zmínil, a také odpovídající přezdívky, zobrazovaná jména a hashtagy.",
   "search_popout.tips.hashtag": "hashtag",
   "search_popout.tips.status": "toot",
   "search_popout.tips.text": "Jednoduchý text navrátí odpovídající zobrazovaná jména, přezdívky a hashtagy",
@@ -340,16 +351,17 @@
   "search_results.hashtags": "Hashtagy",
   "search_results.statuses": "Tooty",
   "search_results.statuses_fts_disabled": "Vyhledávání tootů podle jejich obsahu není na tomto serveru Mastodon povoleno.",
-  "search_results.total": "{count, number} {count, plural, one {výsledek} few {výsledky} many {výsledku} other {výsledků}}",
+  "search_results.total": "{count, number} {count, plural, one {výsledek} few {výsledky} many {výsledků} other {výsledků}}",
   "status.admin_account": "Otevřít moderátorské rozhraní pro uživatele @{name}",
   "status.admin_status": "Otevřít tento toot v moderátorském rozhraní",
   "status.block": "Zablokovat uživatele @{name}",
+  "status.bookmark": "Přidat do záložek",
   "status.cancel_reblog_private": "Zrušit boost",
   "status.cannot_reblog": "Tento příspěvek nemůže být boostnutý",
   "status.copy": "Kopírovat odkaz k tootu",
   "status.delete": "Smazat",
-  "status.detailed_status": "Detailní zobrazení konverzace",
-  "status.direct": "Poslat přímou zprávu uživateli @{name}",
+  "status.detailed_status": "Podrobné zobrazení konverzace",
+  "status.direct": "Poslat uživateli @{name} přímou zprávu",
   "status.embed": "Vložit na web",
   "status.favourite": "Oblíbit",
   "status.filtered": "Filtrováno",
@@ -365,9 +377,10 @@
   "status.read_more": "Číst více",
   "status.reblog": "Boostnout",
   "status.reblog_private": "Boostnout původnímu publiku",
-  "status.reblogged_by": "{name} boostnul/a",
+  "status.reblogged_by": "Uživatel {name} boostnul",
   "status.reblogs.empty": "Tento toot ještě nikdo neboostnul. Pokud to někdo udělá, zobrazí se zde.",
   "status.redraft": "Smazat a přepsat",
+  "status.remove_bookmark": "Odstranit ze záložek",
   "status.reply": "Odpovědět",
   "status.replyAll": "Odpovědět na vlákno",
   "status.report": "Nahlásit uživatele @{name}",
@@ -382,37 +395,40 @@
   "status.unmute_conversation": "Odkrýt konverzaci",
   "status.unpin": "Odepnout z profilu",
   "suggestions.dismiss": "Odmítnout návrh",
-  "suggestions.header": "Mohli by vás zajímat…",
+  "suggestions.header": "Mohlo by vás zajímat…",
   "tabs_bar.federated_timeline": "Federovaná",
   "tabs_bar.home": "Domů",
   "tabs_bar.local_timeline": "Místní",
   "tabs_bar.notifications": "Oznámení",
   "tabs_bar.search": "Hledat",
-  "time_remaining.days": "{number, plural, one {Zbývá # den} few {Zbývají # dny} many {Zbývá # dne} other {Zbývá # dní}}",
-  "time_remaining.hours": "{number, plural, one {Zbývá # hodina} few {Zbývají # hodiny} many {Zbývá # hodiny} other {Zbývá # hodin}}",
-  "time_remaining.minutes": "{number, plural, one {Zbývá # minuta} few {Zbývají # minuty} many {Zbývá # minuty} other {Zbývá # minut}}",
+  "time_remaining.days": "{number, plural, one {Zbývá # den} few {Zbývají # dny} many {Zbývá # dní} other {Zbývá # dní}}",
+  "time_remaining.hours": "{number, plural, one {Zbývá # hodina} few {Zbývají # hodiny} many {Zbývá # hodin} other {Zbývá # hodin}}",
+  "time_remaining.minutes": "{number, plural, one {Zbývá # minuta} few {Zbývají # minuty} many {Zbývá # minut} other {Zbývá # minut}}",
   "time_remaining.moments": "Zbývá několik sekund",
-  "time_remaining.seconds": "{number, plural, one {Zbývá # sekunda} few {Zbývají # sekundy} many {Zbývá # sekundy} other {Zbývá # sekund}}",
+  "time_remaining.seconds": "{number, plural, one {Zbývá # sekunda} few {Zbývají # sekundy} many {Zbývá # sekund} other {Zbývá # sekund}}",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {člověk} few {lidé} many {lidí} other {lidí}} hovoří",
   "trends.trending_now": "Aktuální trendy",
-  "ui.beforeunload": "Váš koncept se ztratí, pokud Mastodon opustíte.",
-  "upload_area.title": "Přetažením nahrajete",
-  "upload_button.label": "Přidat média (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "ui.beforeunload": "Pokud Mastodon opustíte, váš koncept se ztratí.",
+  "upload_area.title": "Nahrajte přetažením",
+  "upload_button.label": "Přidat média ({formats})",
   "upload_error.limit": "Byl překročen limit nahraných souborů.",
-  "upload_error.poll": "Nahrávání souborů není povoleno u anket.",
+  "upload_error.poll": "U anket není nahrávání souborů povoleno.",
+  "upload_form.audio_description": "Popis pro sluchově postižené",
   "upload_form.description": "Popis pro zrakově postižené",
   "upload_form.edit": "Upravit",
   "upload_form.undo": "Smazat",
+  "upload_form.video_description": "Popis pro sluchově či zrakově postižené",
   "upload_modal.analyzing_picture": "Analyzuji obrázek…",
   "upload_modal.apply": "Použít",
   "upload_modal.description_placeholder": "Příliš žluťoučký kůň úpěl ďábelské ódy",
   "upload_modal.detect_text": "Detekovat text z obrázku",
   "upload_modal.edit_media": "Upravit média",
-  "upload_modal.hint": "Kliknutím na nebo přetáhnutím kruhu na náhledu vyberte bod soustředění, který bude vždy zobrazen na všech náhledech.",
+  "upload_modal.hint": "Kliknutím na nebo přetáhnutím kruhu na náhledu vyberte oblast, která bude na všech náhledech vždy zobrazen.",
   "upload_modal.preview_label": "Náhled ({ratio})",
-  "upload_progress.label": "Nahrávám…",
+  "upload_progress.label": "Nahrávání…",
   "video.close": "Zavřít video",
-  "video.exit_fullscreen": "Ukončit celou obrazovku",
+  "video.download": "Stáhnout soubor",
+  "video.exit_fullscreen": "Ukončit režim celé obrazovky",
   "video.expand": "Otevřít video",
   "video.fullscreen": "Celá obrazovka",
   "video.hide": "Skrýt video",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index a8a952798..ee58c7168 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Ychwanegu neu Dileu o'r rhestrau",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Grŵp",
   "account.block": "Blocio @{name}",
   "account.block_domain": "Cuddio popeth rhag {domain}",
   "account.blocked": "Blociwyd",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Cyfradd gyfyngedig",
   "alert.unexpected.message": "Digwyddodd gwall annisgwyl.",
   "alert.unexpected.title": "Wps!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} yr wythnos",
   "boost_modal.combo": "Mae modd gwasgu {combo} er mwyn sgipio hyn tro nesa",
   "bundle_column_error.body": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Aeth rhywbeth o'i le tra'n llwytho'r elfen hon.",
   "bundle_modal_error.retry": "Ceiswich eto",
   "column.blocks": "Defnyddwyr a flociwyd",
+  "column.bookmarks": "Tudalnodau",
   "column.community": "Ffrwd lleol",
   "column.direct": "Negeseuon preifat",
   "column.directory": "Pori proffiliau",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Cyfnod pleidlais",
   "compose_form.poll.option_placeholder": "Dewisiad {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Marcio cyfryngau fel eu bod yn sensitif",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Dim tŵtiau fama!",
   "empty_column.account_unavailable": "Proffil ddim ar gael",
   "empty_column.blocks": "Nid ydych wedi blocio unrhyw ddefnyddwyr eto.",
+  "empty_column.bookmarked_statuses": "Nid oes gennych unrhyw dwtiau tudalnodiedig eto. Pan y byddwch yn tudalnodi un, mi fydd yn ymddangos yma.",
   "empty_column.community": "Mae'r ffrwd lleol yn wag. Ysgrifenwch rhywbeth yn gyhoeddus i gael dechrau arni!",
   "empty_column.direct": "Nid oes gennych unrhyw negeseuon preifat eto. Pan y byddwch yn anfon neu derbyn un, mi fydd yn ymddangos yma.",
   "empty_column.domain_blocks": "Nid oes yna unrhyw barthau cuddiedig eto.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "i agor rhestr defnyddwyr a dawelwyd",
   "keyboard_shortcuts.my_profile": "i agor eich proffil",
   "keyboard_shortcuts.notifications": "i agor colofn hysbysiadau",
+  "keyboard_shortcuts.open_media": "i agor cyfryngau",
   "keyboard_shortcuts.pinned": "i agor rhestr tŵtiau wedi'i pinio",
   "keyboard_shortcuts.profile": "i agor proffil yr awdur",
   "keyboard_shortcuts.reply": "i ateb",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Cuddio hysbysiadau rhag y defnyddiwr hwn?",
   "navigation_bar.apps": "Apiau symudol",
   "navigation_bar.blocks": "Defnyddwyr wedi eu blocio",
+  "navigation_bar.bookmarks": "Tudalnodau",
   "navigation_bar.community_timeline": "Ffrwd leol",
   "navigation_bar.compose": "Cyfansoddi tŵt newydd",
   "navigation_bar.direct": "Negeseuon preifat",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Diogelwch",
   "notification.favourite": "hoffodd {name} eich tŵt",
   "notification.follow": "dilynodd {name} chi",
+  "notification.follow_request": "Mae {name} wedi gwneud cais i'ch dilyn",
   "notification.mention": "Soniodd {name} amdanoch chi",
+  "notification.own_poll": "Mae eich pôl wedi diweddu",
   "notification.poll": "Mae pleidlais rydych wedi pleidleisio ynddi wedi dod i ben",
   "notification.reblog": "Hysbysebodd {name} eich tŵt",
   "notifications.clear": "Clirio hysbysiadau",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Bar hidlo",
   "notifications.column_settings.filter_bar.show": "Dangos",
   "notifications.column_settings.follow": "Dilynwyr newydd:",
+  "notifications.column_settings.follow_request": "Ceisiadau dilyn newydd:",
   "notifications.column_settings.mention": "Crybwylliadau:",
   "notifications.column_settings.poll": "Canlyniadau pleidlais:",
   "notifications.column_settings.push": "Hysbysiadau gwthiadwy",
@@ -344,6 +355,7 @@
   "status.admin_account": "Agor rhyngwyneb goruwchwylio ar gyfer @{name}",
   "status.admin_status": "Agor y tŵt yn y rhyngwyneb goruwchwylio",
   "status.block": "Blocio @{name}",
+  "status.bookmark": "Tudalnodi",
   "status.cancel_reblog_private": "Dadfŵstio",
   "status.cannot_reblog": "Ni ellir sbarduno'r tŵt hwn",
   "status.copy": "Copïo cysylltiad i'r tŵt",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "Bŵstio {name}",
   "status.reblogs.empty": "Does neb wedi bŵstio'r tŵt yma eto. Pan y bydd rhywun yn gwneud, byddent yn ymddangos yma.",
   "status.redraft": "Dileu & ailddrafftio",
+  "status.remove_bookmark": "Tynnu'r tudalnod",
   "status.reply": "Ateb",
   "status.replyAll": "Ateb i edefyn",
   "status.report": "Adrodd @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Wedi mynd heibio'r uchafswm terfyn uwchlwytho.",
   "upload_error.poll": "Nid oes modd uwchlwytho ffeiliau â phleidleisiau.",
+  "upload_form.audio_description": "Disgrifio ar gyfer pobl sydd â cholled clyw",
   "upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg",
   "upload_form.edit": "Golygu",
   "upload_form.undo": "Dileu",
+  "upload_form.video_description": "Disgrifio ar gyfer pobl sydd â cholled clyw neu amhariad golwg",
   "upload_modal.analyzing_picture": "Dadansoddi llun…",
   "upload_modal.apply": "Gweithredu",
   "upload_modal.description_placeholder": "Mae ei phen bach llawn jocs, 'run peth a fy nghot golff, rhai dyddiau",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Rhagolwg ({ratio})",
   "upload_progress.label": "Uwchlwytho...",
   "video.close": "Cau fideo",
+  "video.download": "Lawrlwytho ffeil",
   "video.exit_fullscreen": "Gadael sgrîn llawn",
   "video.expand": "Ymestyn fideo",
   "video.fullscreen": "Sgrîn llawn",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 4719d5ca5..a699aaf54 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Tilføj eller fjern fra lister",
   "account.badges.bot": "Robot",
+  "account.badges.group": "Group",
   "account.block": "Bloker @{name}",
   "account.block_domain": "Skjul alt fra {domain}",
   "account.blocked": "Blokeret",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Gradsbegrænset",
   "alert.unexpected.message": "Der opstod en uventet fejl.",
   "alert.unexpected.title": "Ups!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per uge",
   "boost_modal.combo": "Du kan trykke {combo} for at springe dette over næste gang",
   "bundle_column_error.body": "Noget gik galt under indlæsningen af dette komponent.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Noget gik galt under indlæsningen af dette komponent.",
   "bundle_modal_error.retry": "Prøv igen",
   "column.blocks": "Blokerede brugere",
+  "column.bookmarks": "Bogmærker",
   "column.community": "Lokal tidslinje",
   "column.direct": "Direkte beskeder",
   "column.directory": "Gennemse profiler",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Afstemningens varighed",
   "compose_form.poll.option_placeholder": "Valgmulighed {number}",
   "compose_form.poll.remove_option": "Fjern denne valgmulighed",
+  "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": "Trut",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Markér medie som følsomt",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Ingen bidrag her!",
   "empty_column.account_unavailable": "Profil utilgængelig",
   "empty_column.blocks": "Du har ikke blokeret nogen endnu.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at starte lavinen!",
   "empty_column.direct": "Du har endnu ingen direkte beskeder. Når du sender eller modtager en, vil den vises her.",
   "empty_column.domain_blocks": "Der er endnu ikke nogle skjulte domæner.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "for at åbne listen over dæmpede brugere",
   "keyboard_shortcuts.my_profile": "for at åbne din profil",
   "keyboard_shortcuts.notifications": "for at åbne notifikations kolonnen",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "for at åbne listen over fastgjorte trut",
   "keyboard_shortcuts.profile": "til profil af åben forfatter",
   "keyboard_shortcuts.reply": "for at svare",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Skjul notifikationer fra denne bruger?",
   "navigation_bar.apps": "Mobil apps",
   "navigation_bar.blocks": "Blokerede brugere",
+  "navigation_bar.bookmarks": "Bogmærker",
   "navigation_bar.community_timeline": "Lokal tidslinje",
   "navigation_bar.compose": "Skriv nyt trut",
   "navigation_bar.direct": "Direkte beskeder",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Sikkerhed",
   "notification.favourite": "{name} favoriserede din status",
   "notification.follow": "{name} fulgte dig",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} nævnte dig",
+  "notification.own_poll": "Din afstemning er afsluttet",
   "notification.poll": "En afstemning, du stemte i, er slut",
   "notification.reblog": "{name} boostede din status",
   "notifications.clear": "Ryd notifikationer",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Hurtigfilter",
   "notifications.column_settings.filter_bar.show": "Vis",
   "notifications.column_settings.follow": "Nye følgere:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Statusser der nævner dig:",
   "notifications.column_settings.poll": "Afstemningsresultat:",
   "notifications.column_settings.push": "Pushnotifikationer",
@@ -344,6 +355,7 @@
   "status.admin_account": "Åben modereringsvisning for @{name}",
   "status.admin_status": "Åben denne status i modereringsvisningen",
   "status.block": "Bloker @{name}",
+  "status.bookmark": "Bogmærke",
   "status.cancel_reblog_private": "Fjern boost",
   "status.cannot_reblog": "Denne post kan ikke boostes",
   "status.copy": "Kopiér link til status",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boostede",
   "status.reblogs.empty": "Der er endnu ingen der har boostet dette trut. Når der er nogen der gør, vil det blive vist her.",
   "status.redraft": "Slet og omskriv",
+  "status.remove_bookmark": "Fjern bogmærke",
   "status.reply": "Besvar",
   "status.replyAll": "Besvar samtale",
   "status.report": "Anmeld @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Tilføj medie (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Uploadgrænse overskredet.",
   "upload_error.poll": "Filupload ikke tilladt sammen med afstemninger.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Beskriv for svagtseende",
   "upload_form.edit": "Redigér",
   "upload_form.undo": "Slet",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
   "upload_modal.analyzing_picture": "Analyserer billede…",
   "upload_modal.apply": "Anvend",
   "upload_modal.description_placeholder": "En hurtig brun ræv hopper over den dovne hund",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Forhåndsvisning ({ratio})",
   "upload_progress.label": "Uploader...",
   "video.close": "Luk video",
+  "video.download": "Hent fil",
   "video.exit_fullscreen": "Forlad fuldskærm",
   "video.expand": "Udvid video",
   "video.fullscreen": "Fuldskærm",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index c916028be..aae5ad1c1 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Hinzufügen oder Entfernen von Listen",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Gruppe",
   "account.block": "@{name} blockieren",
   "account.block_domain": "Alles von {domain} verstecken",
   "account.blocked": "Blockiert",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Anfragelimit überschritten",
   "alert.unexpected.message": "Ein unerwarteter Fehler ist aufgetreten.",
   "alert.unexpected.title": "Hoppla!",
+  "announcement.announcement": "Ankündigung",
   "autosuggest_hashtag.per_week": "{count} pro Woche",
   "boost_modal.combo": "Drücke {combo}, um dieses Fenster zu überspringen",
   "bundle_column_error.body": "Etwas ist beim Laden schiefgelaufen.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Etwas ist beim Laden schiefgelaufen.",
   "bundle_modal_error.retry": "Erneut versuchen",
   "column.blocks": "Blockierte Profile",
+  "column.bookmarks": "Lesezeichen",
   "column.community": "Lokale Zeitleiste",
   "column.direct": "Direktnachrichten",
   "column.directory": "Profile durchsuchen",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Umfragedauer",
   "compose_form.poll.option_placeholder": "Wahl {number}",
   "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 ermöglichen",
   "compose_form.publish": "Tröt",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Medien als heikel markieren",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Keine Beiträge!",
   "empty_column.account_unavailable": "Konto nicht verfügbar",
   "empty_column.blocks": "Du hast keine Profile blockiert.",
+  "empty_column.bookmarked_statuses": "Du hast bis jetzt keine Beiträge als Lesezeichen gespeichert. Wenn du einen Beitrag als Lesezeichen speicherst wird er hier erscheinen.",
   "empty_column.community": "Die lokale Zeitleiste ist leer. Schreibe einen öffentlichen Beitrag, um den Ball ins Rollen zu bringen!",
   "empty_column.direct": "Du hast noch keine Direktnachrichten erhalten. Wenn du eine sendest oder empfängst, wird sie hier zu sehen sein.",
   "empty_column.domain_blocks": "Es ist noch keine versteckten Domains.",
@@ -164,7 +170,7 @@
   "getting_started.heading": "Erste Schritte",
   "getting_started.invite": "Leute einladen",
   "getting_started.open_source_notice": "Mastodon ist quelloffene Software. Du kannst auf GitHub unter {github} dazu beitragen oder Probleme melden.",
-  "getting_started.security": "Sicherheit",
+  "getting_started.security": "Konto & Sicherheit",
   "getting_started.terms": "Nutzungsbedingungen",
   "hashtag.column_header.tag_mode.all": "und {additional}",
   "hashtag.column_header.tag_mode.any": "oder {additional}",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "Liste stummgeschalteter Profile öffnen",
   "keyboard_shortcuts.my_profile": "Dein Profil öffnen",
   "keyboard_shortcuts.notifications": "Benachrichtigungsspalte öffnen",
+  "keyboard_shortcuts.open_media": "um Medien zu öffnen",
   "keyboard_shortcuts.pinned": "Liste angehefteter Beiträge öffnen",
   "keyboard_shortcuts.profile": "Profil des Autors öffnen",
   "keyboard_shortcuts.reply": "antworten",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Benachrichtigungen von diesem Account verbergen?",
   "navigation_bar.apps": "Mobile Apps",
   "navigation_bar.blocks": "Blockierte Profile",
+  "navigation_bar.bookmarks": "Lesezeichen",
   "navigation_bar.community_timeline": "Lokale Zeitleiste",
   "navigation_bar.compose": "Neuen Beitrag verfassen",
   "navigation_bar.direct": "Direktnachrichten",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Sicherheit",
   "notification.favourite": "{name} hat deinen Beitrag favorisiert",
   "notification.follow": "{name} folgt dir",
+  "notification.follow_request": "{name} möchte dir folgen",
   "notification.mention": "{name} hat dich erwähnt",
+  "notification.own_poll": "Deine Umfrage ist beendet",
   "notification.poll": "Eine Umfrage in der du abgestimmt hast ist vorbei",
   "notification.reblog": "{name} hat deinen Beitrag geteilt",
   "notifications.clear": "Mitteilungen löschen",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Schnellfilterleiste",
   "notifications.column_settings.filter_bar.show": "Anzeigen",
   "notifications.column_settings.follow": "Neue Folgende:",
+  "notifications.column_settings.follow_request": "Neue Folge-Anfragen:",
   "notifications.column_settings.mention": "Erwähnungen:",
   "notifications.column_settings.poll": "Ergebnisse von Umfragen:",
   "notifications.column_settings.push": "Push-Benachrichtigungen",
@@ -344,6 +355,7 @@
   "status.admin_account": "Öffne Moderationsoberfläche für @{name}",
   "status.admin_status": "Öffne Beitrag in der Moderationsoberfläche",
   "status.block": "Blockiere @{name}",
+  "status.bookmark": "Lesezeichen",
   "status.cancel_reblog_private": "Nicht mehr teilen",
   "status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden",
   "status.copy": "Kopiere Link zum Beitrag",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} teilte",
   "status.reblogs.empty": "Diesen Beitrag hat noch niemand geteilt. Sobald es jemand tut, wird diese Person hier angezeigt.",
   "status.redraft": "Löschen und neu erstellen",
+  "status.remove_bookmark": "Lesezeichen entfernen",
   "status.reply": "Antworten",
   "status.replyAll": "Allen antworten",
   "status.report": "@{name} melden",
@@ -400,18 +413,21 @@
   "upload_button.label": "Mediendatei hinzufügen ({formats})",
   "upload_error.limit": "Dateiupload-Limit erreicht.",
   "upload_error.poll": "Dateiuploads sind in Kombination mit Umfragen nicht erlaubt.",
+  "upload_form.audio_description": "Beschreibe die Audiodatei für Menschen mit Hörschädigungen",
   "upload_form.description": "Für Menschen mit Sehbehinderung beschreiben",
   "upload_form.edit": "Bearbeiten",
   "upload_form.undo": "Löschen",
+  "upload_form.video_description": "Beschreibe das Video für Menschen mit einer Hör- oder Sehbehinderung",
   "upload_modal.analyzing_picture": "Analysiere Bild…",
   "upload_modal.apply": "Übernehmen",
-  "upload_modal.description_placeholder": "Die heiße Zypernsonne quälte Max und Victoria ja böse auf dem Weg bis zur Küste.",
+  "upload_modal.description_placeholder": "Die heiße Zypernsonne quälte Max und Victoria ja böse auf dem Weg bis zur Küste",
   "upload_modal.detect_text": "Text aus Bild erkennen",
   "upload_modal.edit_media": "Medien bearbeiten",
   "upload_modal.hint": "Klicke oder ziehe den Kreis auf die Vorschau, um den Brennpunkt auszuwählen, der immer auf allen Vorschaubilder angezeigt wird.",
   "upload_modal.preview_label": "Vorschau ({ratio})",
   "upload_progress.label": "Wird hochgeladen …",
   "video.close": "Video schließen",
+  "video.download": "Datei herunterladen",
   "video.exit_fullscreen": "Vollbild verlassen",
   "video.expand": "Video vergrößern",
   "video.fullscreen": "Vollbild",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 16e3e402a..18692bc44 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -294,6 +294,10 @@
   {
     "descriptors": [
       {
+        "defaultMessage": "today",
+        "id": "relative_time.today"
+      },
+      {
         "defaultMessage": "now",
         "id": "relative_time.just_now"
       },
@@ -777,6 +781,10 @@
         "id": "account.badges.bot"
       },
       {
+        "defaultMessage": "Group",
+        "id": "account.badges.group"
+      },
+      {
         "defaultMessage": "Toots",
         "id": "account.posts"
       },
@@ -1036,6 +1044,14 @@
         "id": "compose_form.poll.duration"
       },
       {
+        "defaultMessage": "Change poll to allow multiple choices",
+        "id": "compose_form.poll.switch_to_multiple"
+      },
+      {
+        "defaultMessage": "Change poll to allow for a single choice",
+        "id": "compose_form.poll.switch_to_single"
+      },
+      {
         "defaultMessage": "{number, plural, one {# minute} other {# minutes}}",
         "id": "intervals.full.minutes"
       },
@@ -1396,6 +1412,10 @@
         "id": "account.unmute"
       },
       {
+        "defaultMessage": "Unfollow",
+        "id": "confirmations.unfollow.confirm"
+      },
+      {
         "defaultMessage": "Are you sure you want to unfollow {name}?",
         "id": "confirmations.unfollow.message"
       },
@@ -1541,6 +1561,27 @@
   {
     "descriptors": [
       {
+        "defaultMessage": "Close",
+        "id": "lightbox.close"
+      },
+      {
+        "defaultMessage": "Previous",
+        "id": "lightbox.previous"
+      },
+      {
+        "defaultMessage": "Next",
+        "id": "lightbox.next"
+      },
+      {
+        "defaultMessage": "Announcement",
+        "id": "announcement.announcement"
+      }
+    ],
+    "path": "app/javascript/mastodon/features/getting_started/components/announcements.json"
+  },
+  {
+    "descriptors": [
+      {
         "defaultMessage": "Trending now",
         "id": "trends.trending_now"
       }
@@ -1706,6 +1747,14 @@
         "id": "column.home"
       },
       {
+        "defaultMessage": "Show announcements",
+        "id": "home.show_announcements"
+      },
+      {
+        "defaultMessage": "Hide announcements",
+        "id": "home.hide_announcements"
+      },
+      {
         "defaultMessage": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
         "id": "empty_column.home"
       },
@@ -2283,6 +2332,10 @@
         "id": "status.bookmark"
       },
       {
+        "defaultMessage": "More",
+        "id": "status.more"
+      },
+      {
         "defaultMessage": "Mute @{name}",
         "id": "status.mute"
       },
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index ab000fa8d..abb6f0d33 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -1,8 +1,9 @@
 {
   "account.add_or_remove_from_list": "Προσθήκη ή Αφαίρεση από λίστες",
   "account.badges.bot": "Μποτ",
+  "account.badges.group": "Ομάδα",
   "account.block": "Αποκλεισμός @{name}",
-  "account.block_domain": "Απόκρυψε τα πάντα από το {domain}",
+  "account.block_domain": "Απόκρυψη όλων από {domain}",
   "account.blocked": "Αποκλεισμένος/η",
   "account.cancel_follow_request": "Ακύρωση αιτήματος παρακολούθησης",
   "account.direct": "Προσωπικό μήνυμα προς @{name}",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Περιορισμός συχνότητας",
   "alert.unexpected.message": "Προέκυψε απροσδόκητο σφάλμα.",
   "alert.unexpected.title": "Εεπ!",
+  "announcement.announcement": "Ανακοίνωση",
   "autosuggest_hashtag.per_week": "{count} ανα εβδομάδα",
   "boost_modal.combo": "Μπορείς να πατήσεις {combo} για να το προσπεράσεις αυτό την επόμενη φορά",
   "bundle_column_error.body": "Κάτι πήγε στραβά ενώ φορτωνόταν αυτό το στοιχείο.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Κάτι πήγε στραβά κατά τη φόρτωση του στοιχείου.",
   "bundle_modal_error.retry": "Δοκίμασε ξανά",
   "column.blocks": "Αποκλεισμένοι χρήστες",
+  "column.bookmarks": "Σελιδοδείκτες",
   "column.community": "Τοπική ροή",
   "column.direct": "Προσωπικά μηνύματα",
   "column.directory": "Δες προφίλ",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Διάρκεια δημοσκόπησης",
   "compose_form.poll.option_placeholder": "Επιλογή {number}",
   "compose_form.poll.remove_option": "Αφαίρεση επιλογής",
+  "compose_form.poll.switch_to_multiple": "Ενημέρωση δημοσκόπησης με πολλαπλές επιλογές",
+  "compose_form.poll.switch_to_single": "Ενημέρωση δημοσκόπησης με μοναδική επιλογή",
   "compose_form.publish": "Τουτ",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Σημείωσε τα πολυμέσα ως ευαίσθητα",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Δεν έχει τουτ εδώ!",
   "empty_column.account_unavailable": "Μη διαθέσιμο προφίλ",
   "empty_column.blocks": "Δεν έχεις αποκλείσει κανέναν χρήστη ακόμα.",
+  "empty_column.bookmarked_statuses": "Δεν έχεις κανένα αποθηκευμένο τουτ ακόμα. Μόλις αποθηκεύσεις κάποιο, θα εμφανιστεί εδώ.",
   "empty_column.community": "Η τοπική ροή είναι κενή. Γράψε κάτι δημόσιο παραμύθι ν' αρχινίσει!",
   "empty_column.direct": "Δεν έχεις προσωπικά μηνύματα ακόμα. Όταν στείλεις ή λάβεις κανένα, θα εμφανιστεί εδώ.",
   "empty_column.domain_blocks": "Δεν υπάρχουν αποκλεισμένοι τομείς ακόμα.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "άνοιγμα λίστας αποσιωπημενων χρηστών",
   "keyboard_shortcuts.my_profile": "άνοιγμα του προφίλ σου",
   "keyboard_shortcuts.notifications": "άνοιγμα στήλης ειδοποιήσεων",
+  "keyboard_shortcuts.open_media": "εμφάνιση πολυμέσου",
   "keyboard_shortcuts.pinned": "άνοιγμα λίστας καρφιτσωμένων τουτ",
   "keyboard_shortcuts.profile": "άνοιγμα προφίλ συγγραφέα",
   "keyboard_shortcuts.reply": "απάντηση",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Απόκρυψη ειδοποιήσεων αυτού του χρήστη;",
   "navigation_bar.apps": "Εφαρμογές φορητών συσκευών",
   "navigation_bar.blocks": "Αποκλεισμένοι χρήστες",
+  "navigation_bar.bookmarks": "Σελιδοδείκτες",
   "navigation_bar.community_timeline": "Τοπική ροή",
   "navigation_bar.compose": "Γράψε νέο τουτ",
   "navigation_bar.direct": "Προσωπικά μηνύματα",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Ασφάλεια",
   "notification.favourite": "Ο/Η {name} σημείωσε ως αγαπημένη την κατάστασή σου",
   "notification.follow": "Ο/Η {name} σε ακολούθησε",
+  "notification.follow_request": "Ο/H {name} ζήτησε να σε παρακολουθεί",
   "notification.mention": "Ο/Η {name} σε ανέφερε",
+  "notification.own_poll": "Η ψηφοφορία σου έληξε",
   "notification.poll": "Τελείωσε μια από τις ψηφοφορίες που συμμετείχες",
   "notification.reblog": "Ο/Η {name} προώθησε την κατάστασή σου",
   "notifications.clear": "Καθαρισμός ειδοποιήσεων",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Μπάρα γρήγορου φίλτρου",
   "notifications.column_settings.filter_bar.show": "Εμφάνιση",
   "notifications.column_settings.follow": "Νέοι ακόλουθοι:",
+  "notifications.column_settings.follow_request": "Νέο αίτημα παρακολούθησης:",
   "notifications.column_settings.mention": "Αναφορές:",
   "notifications.column_settings.poll": "Αποτελέσματα ψηφοφορίας:",
   "notifications.column_settings.push": "Άμεσες ειδοποιήσεις",
@@ -344,6 +355,7 @@
   "status.admin_account": "Άνοιγμα λειτουργίας διαμεσολάβησης για τον/την @{name}",
   "status.admin_status": "Άνοιγμα αυτής της δημοσίευσης στη λειτουργία διαμεσολάβησης",
   "status.block": "Αποκλεισμός @{name}",
+  "status.bookmark": "Σελιδοδείκτης",
   "status.cancel_reblog_private": "Ακύρωσε την προώθηση",
   "status.cannot_reblog": "Αυτή η δημοσίευση δεν μπορεί να προωθηθεί",
   "status.copy": "Αντιγραφή συνδέσμου της δημοσίευσης",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} προώθησε",
   "status.reblogs.empty": "Κανείς δεν προώθησε αυτό το τουτ ακόμα. Μόλις το κάνει κάποια, θα εμφανιστούν εδώ.",
   "status.redraft": "Σβήσε & ξαναγράψε",
+  "status.remove_bookmark": "Αφαίρεση σελιδοδείκτη",
   "status.reply": "Απάντησε",
   "status.replyAll": "Απάντησε στην συζήτηση",
   "status.report": "Κατάγγειλε @{name}",
@@ -393,16 +406,18 @@
   "time_remaining.minutes": "απομένουν {number, plural, one {# λεπτό} other {# λεπτά}}",
   "time_remaining.moments": "Απομένουν στιγμές",
   "time_remaining.seconds": "απομένουν {number, plural, one {# δευτερόλεπτο} other {# δευτερόλεπτα}}",
-  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} μιλάνε",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {άτομο μιλάει} other {άτομα μιλάνε}}",
   "trends.trending_now": "Δημοφιλή τώρα",
   "ui.beforeunload": "Το προσχέδιό σου θα χαθεί αν φύγεις από το Mastodon.",
   "upload_area.title": "Drag & drop για να ανεβάσεις",
   "upload_button.label": "Πρόσθεσε πολυμέσα ({formats})",
   "upload_error.limit": "Υπέρβαση ορίου μεγέθους ανεβασμένων αρχείων.",
   "upload_error.poll": "Στις δημοσκοπήσεις δεν επιτρέπεται η μεταφόρτωση αρχείου.",
+  "upload_form.audio_description": "Περιγραφή για άτομα με προβλήματα ακοής",
   "upload_form.description": "Περιέγραψε για όσους & όσες έχουν προβλήματα όρασης",
   "upload_form.edit": "Ενημέρωση",
   "upload_form.undo": "Διαγραφή",
+  "upload_form.video_description": "Περιγραφή για άτομα με προβλήματα ακοής ή όρασης",
   "upload_modal.analyzing_picture": "Ανάλυση εικόνας…",
   "upload_modal.apply": "Εφαρμογή",
   "upload_modal.description_placeholder": "Λύκος μαύρος και ισχνός του πατέρα του καημός",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Προεπισκόπηση ({ratio})",
   "upload_progress.label": "Ανεβαίνει...",
   "video.close": "Κλείσε το βίντεο",
+  "video.download": "Λήψη αρχείου",
   "video.exit_fullscreen": "Έξοδος από πλήρη οθόνη",
   "video.expand": "Επέκταση βίντεο",
   "video.fullscreen": "Πλήρης οθόνη",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 84e40a9fc..e25199905 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Add or Remove from lists",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Group",
   "account.block": "Block @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
@@ -87,6 +89,8 @@
   "compose_form.poll.duration": "Poll duration",
   "compose_form.poll.option_placeholder": "Choice {number}",
   "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
+  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -184,6 +188,8 @@
   "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}}",
@@ -334,6 +340,7 @@
   "relative_time.just_now": "now",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
+  "relative_time.today": "today",
   "reply_indicator.cancel": "Cancel",
   "report.forward": "Forward to {target}",
   "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 0070cdb5c..e84e59b2e 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Aldoni al aŭ forigi el listoj",
   "account.badges.bot": "Roboto",
+  "account.badges.group": "Grupo",
   "account.block": "Bloki @{name}",
   "account.block_domain": "Kaŝi ĉion de {domain}",
   "account.blocked": "Blokita",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Mesaĝkvante limigita",
   "alert.unexpected.message": "Neatendita eraro okazis.",
   "alert.unexpected.title": "Ups!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} semajne",
   "boost_modal.combo": "Vi povas premi {combo} por preterpasi sekvafoje",
   "bundle_column_error.body": "Io misfunkciis en la ŝargado de ĉi tiu elemento.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Io misfunkciis en la ŝargado de ĉi tiu elemento.",
   "bundle_modal_error.retry": "Bonvolu reprovi",
   "column.blocks": "Blokitaj uzantoj",
+  "column.bookmarks": "Legosignoj",
   "column.community": "Loka tempolinio",
   "column.direct": "Rektaj mesaĝoj",
   "column.directory": "Trarigardi profilojn",
@@ -82,6 +85,8 @@
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Marki la aŭdovidaĵojn kiel tiklaj",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Neniu mesaĝo ĉi tie!",
   "empty_column.account_unavailable": "Profilo ne disponebla",
   "empty_column.blocks": "Vi ankoraŭ ne blokis uzanton.",
+  "empty_column.bookmarked_statuses": "Vi ankoraŭ ne aldonis mesaĝon al viaj legosignoj. Kiam vi aldonos iun, tiu aperos ĉi tie.",
   "empty_column.community": "La loka tempolinio estas malplena. Skribu ion por plenigi ĝin!",
   "empty_column.direct": "Vi ankoraŭ ne havas rektan mesaĝon. Kiam vi sendos aŭ ricevos iun, ĝi aperos ĉi tie.",
   "empty_column.domain_blocks": "Ankoraŭ neniu domajno estas blokita.",
@@ -154,7 +160,7 @@
   "empty_column.public": "Estas nenio ĉi tie! Publike skribu ion, aŭ mane sekvu uzantojn de aliaj serviloj por plenigi la publikan tempolinion",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
   "error.unexpected_crash.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.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "errors.unexpected_crash.copy_stacktrace": "Kopii stakspuron en tondujo",
   "errors.unexpected_crash.report_issue": "Raporti problemon",
   "follow_request.authorize": "Rajtigi",
   "follow_request.reject": "Rifuzi",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "por malfermi la liston de silentigitaj uzantoj",
   "keyboard_shortcuts.my_profile": "por malfermi vian profilon",
   "keyboard_shortcuts.notifications": "por malfermi la kolumnon de sciigoj",
+  "keyboard_shortcuts.open_media": "por malfermi aŭdovidaĵon",
   "keyboard_shortcuts.pinned": "por malfermi la liston de alpinglitaj mesaĝoj",
   "keyboard_shortcuts.profile": "por malfermi la profilon de la aŭtoro",
   "keyboard_shortcuts.reply": "por respondi",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Ĉu vi volas kaŝi la sciigojn de ĉi tiu uzanto?",
   "navigation_bar.apps": "Telefonaj aplikaĵoj",
   "navigation_bar.blocks": "Blokitaj uzantoj",
+  "navigation_bar.bookmarks": "Legosignoj",
   "navigation_bar.community_timeline": "Loka tempolinio",
   "navigation_bar.compose": "Skribi novan mesaĝon",
   "navigation_bar.direct": "Rektaj mesaĝoj",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Sekureco",
   "notification.favourite": "{name} stelumis vian mesaĝon",
   "notification.follow": "{name} eksekvis vin",
+  "notification.follow_request": "{name} petis sekvi vin",
   "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",
   "notifications.clear": "Forviŝi sciigojn",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Rapida filtra breto",
   "notifications.column_settings.filter_bar.show": "Montri",
   "notifications.column_settings.follow": "Novaj sekvantoj:",
+  "notifications.column_settings.follow_request": "Novaj petoj de sekvado:",
   "notifications.column_settings.mention": "Mencioj:",
   "notifications.column_settings.poll": "Balotenketaj rezultoj:",
   "notifications.column_settings.push": "Puŝsciigoj",
@@ -344,6 +355,7 @@
   "status.admin_account": "Malfermi la kontrolan interfacon por @{name}",
   "status.admin_status": "Malfermi ĉi tiun mesaĝon en la kontrola interfaco",
   "status.block": "Bloki @{name}",
+  "status.bookmark": "Aldoni al la legosignoj",
   "status.cancel_reblog_private": "Ne plu diskonigi",
   "status.cannot_reblog": "Ĉi tiu mesaĝo ne diskonigeblas",
   "status.copy": "Kopii la ligilon al la mesaĝo",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} diskonigis",
   "status.reblogs.empty": "Ankoraŭ neniu diskonigis tiun mesaĝon. Kiam iu faros tion, tiu aperos ĉi tie.",
   "status.redraft": "Forigi kaj reskribi",
+  "status.remove_bookmark": "Forigi legosignon",
   "status.reply": "Respondi",
   "status.replyAll": "Respondi al la fadeno",
   "status.report": "Signali @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Aldoni aŭdovidaĵon (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Limo de dosiera alŝutado transpasita.",
   "upload_error.poll": "Alŝuto de dosiero ne permesita kun balotenketo.",
+  "upload_form.audio_description": "Priskribi por homoj kiuj malfacile aŭdi",
   "upload_form.description": "Priskribi por misvidantaj homoj",
   "upload_form.edit": "Redakti",
   "upload_form.undo": "Forigi",
+  "upload_form.video_description": "Priskribi por homoj kiuj malfacile aŭdi aŭ vidi",
   "upload_modal.analyzing_picture": "Bilda analizado…",
   "upload_modal.apply": "Apliki",
   "upload_modal.description_placeholder": "Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Antaŭvido ({ratio})",
   "upload_progress.label": "Alŝutado…",
   "video.close": "Fermi la videon",
+  "video.download": "Elŝuti dosieron",
   "video.exit_fullscreen": "Eksigi plenekrana",
   "video.expand": "Grandigi la videon",
   "video.fullscreen": "Igi plenekrana",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index 56f8781a1..f83e5a251 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Agregar o quitar de las listas",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Grupo",
   "account.block": "Bloquear a @{name}",
   "account.block_domain": "Ocultar todo de {domain}",
   "account.blocked": "Bloqueado",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Tarifa limitada",
   "alert.unexpected.message": "Ocurrió un error.",
   "alert.unexpected.title": "¡Epa!",
+  "announcement.announcement": "Anuncio",
   "autosuggest_hashtag.per_week": "{count} por semana",
   "boost_modal.combo": "Podés hacer clic en {combo} para saltar esto la próxima vez",
   "bundle_column_error.body": "Algo salió mal al cargar este componente.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Algo salió mal al cargar este componente.",
   "bundle_modal_error.retry": "Intentá de nuevo",
   "column.blocks": "Usuarios bloqueados",
+  "column.bookmarks": "Marcadores",
   "column.community": "Línea temporal local",
   "column.direct": "Mensajes directos",
   "column.directory": "Explorar perfiles",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Duración de la encuesta",
   "compose_form.poll.option_placeholder": "Opción {number}",
   "compose_form.poll.remove_option": "Quitá 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": "Tootear",
   "compose_form.publish_loud": "¡{publish}!",
   "compose_form.sensitive.hide": "Marcar medio como sensible",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "¡No hay toots aquí!",
   "empty_column.account_unavailable": "Perfil no disponible",
   "empty_column.blocks": "Todavía no bloqueaste a ningún usuario.",
+  "empty_column.bookmarked_statuses": "Todavía no tenés toots guardados en marcadores. Cuando guardés uno en marcadores, se mostrará acá.",
   "empty_column.community": "La línea temporal local está vacía. ¡Escribí algo en modo público para que se empiece a correr la bola!",
   "empty_column.direct": "Todavía no tenés ningún mensaje directo. Cuando enviés o recibás uno, se mostrará acá.",
   "empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
@@ -185,7 +191,7 @@
   "introduction.federation.federated.headline": "Federado",
   "introduction.federation.federated.text": "Los toots públicos de otros servidores del fediverso aparecerán en la línea temporal federada.",
   "introduction.federation.home.headline": "Principal",
-  "introduction.federation.home.text": "Los toots de las personas que seguíss aparecerán en tu línea temporal principal. ¡Podés seguir a cualquiera en cualquier servidor!",
+  "introduction.federation.home.text": "Los toots de las personas que seguís aparecerán en tu línea temporal principal. ¡Podés seguir a cualquiera en cualquier servidor!",
   "introduction.federation.local.headline": "Local",
   "introduction.federation.local.text": "Los toots públicos de las personas en el mismo servidor aparecerán en la línea temporal local.",
   "introduction.interactions.action": "¡Terminar tutorial!",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "abrir la lista de usuarios silenciados",
   "keyboard_shortcuts.my_profile": "para abrir tu perfil",
   "keyboard_shortcuts.notifications": "para abrir la columna de notificaciones",
+  "keyboard_shortcuts.open_media": "para abrir archivos de medios",
   "keyboard_shortcuts.pinned": "para abrir lista de toots fijados",
   "keyboard_shortcuts.profile": "para abrir el perfil del autor",
   "keyboard_shortcuts.reply": "para responder",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "¿Querés ocultar las notificaciones de este usuario?",
   "navigation_bar.apps": "Aplicaciones móviles",
   "navigation_bar.blocks": "Usuarios bloqueados",
+  "navigation_bar.bookmarks": "Marcadores",
   "navigation_bar.community_timeline": "Línea temporal local",
   "navigation_bar.compose": "Redactar un nuevo toot",
   "navigation_bar.direct": "Mensajes directos",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Seguridad",
   "notification.favourite": "{name} marcó tu estado como favorito",
   "notification.follow": "{name} te empezó a seguir",
+  "notification.follow_request": "{name} solicitó seguirte",
   "notification.mention": "{name} te mencionó",
+  "notification.own_poll": "Tu encuesta finalizó",
   "notification.poll": "Finalizó una encuesta en la que votaste",
   "notification.reblog": "{name} retooteó tu estado",
   "notifications.clear": "Limpiar notificaciones",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
   "notifications.column_settings.filter_bar.show": "Mostrar",
   "notifications.column_settings.follow": "Nuevos seguidores:",
+  "notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:",
   "notifications.column_settings.mention": "Menciones:",
   "notifications.column_settings.poll": "Resultados de la encuesta:",
   "notifications.column_settings.push": "Notificaciones push",
@@ -344,6 +355,7 @@
   "status.admin_account": "Abrir interface de moderación para @{name}",
   "status.admin_status": "Abrir este estado en la interface de moderación",
   "status.block": "Bloquear a @{name}",
+  "status.bookmark": "Marcador",
   "status.cancel_reblog_private": "Quitar retoot",
   "status.cannot_reblog": "No se puede retootear este toot",
   "status.copy": "Copiar enlace al estado",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} retooteó",
   "status.reblogs.empty": "Todavía nadie retooteó este toot. Cuando alguien lo haga, se mostrará acá.",
   "status.redraft": "Eliminar toot original y editarlo",
+  "status.remove_bookmark": "Quitar marcador",
   "status.reply": "Responder",
   "status.replyAll": "Responder al hilo",
   "status.report": "Denunciar a @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Agregar medios ({formats})",
   "upload_error.limit": "Se excedió el límite de subida de archivos.",
   "upload_error.poll": "No se permite la subida de archivos en encuestas.",
+  "upload_form.audio_description": "Describir para personas con problemas auditivos",
   "upload_form.description": "Agregar descripción para los usuarios con dificultades visuales",
   "upload_form.edit": "Editar",
   "upload_form.undo": "Eliminar",
+  "upload_form.video_description": "Describir para personas con problemas auditivos o visuales",
   "upload_modal.analyzing_picture": "Analizando imagen…",
   "upload_modal.apply": "Aplicar",
   "upload_modal.description_placeholder": "El veloz murciélago hindú comía feliz cardillo y kiwi. La cigüeña tocaba el saxofón detrás del palenque de paja.",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Previsualización ({ratio})",
   "upload_progress.label": "Subiendo…",
   "video.close": "Cerrar video",
+  "video.download": "Descargar archivo",
   "video.exit_fullscreen": "Salir de pantalla completa",
   "video.expand": "Expandir vídeo",
   "video.fullscreen": "Pantalla completa",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index c213a03e1..93484b412 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Agregar o eliminar de listas",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Grupo",
   "account.block": "Bloquear a @{name}",
   "account.block_domain": "Ocultar todo de {domain}",
   "account.blocked": "Bloqueado",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Tarifa limitada",
   "alert.unexpected.message": "Hubo un error inesperado.",
   "alert.unexpected.title": "¡Ups!",
+  "announcement.announcement": "Anuncio",
   "autosuggest_hashtag.per_week": "{count} por semana",
   "boost_modal.combo": "Puedes hacer clic en {combo} para saltar este aviso la próxima vez",
   "bundle_column_error.body": "Algo salió mal al cargar este componente.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Algo salió mal al cargar este componente.",
   "bundle_modal_error.retry": "Inténtalo de nuevo",
   "column.blocks": "Usuarios bloqueados",
+  "column.bookmarks": "Marcadores",
   "column.community": "Línea de tiempo local",
   "column.direct": "Mensajes directos",
   "column.directory": "Buscar perfiles",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Duración de la encuesta",
   "compose_form.poll.option_placeholder": "Elección {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Marcar multimedia como sensible",
@@ -127,7 +132,7 @@
   "emoji_button.food": "Comida y bebida",
   "emoji_button.label": "Insertar emoji",
   "emoji_button.nature": "Naturaleza",
-  "emoji_button.not_found": "No hay emojos!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "No hay emojis!! ¯\\_(ツ)_/¯",
   "emoji_button.objects": "Objetos",
   "emoji_button.people": "Gente",
   "emoji_button.recent": "Usados frecuentemente",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "¡No hay toots aquí!",
   "empty_column.account_unavailable": "Perfil no disponible",
   "empty_column.blocks": "Aún no has bloqueado a ningún usuario.",
+  "empty_column.bookmarked_statuses": "Aún no tienes ningún toot guardado como marcador. Cuando guardes uno, se mostrará aquí.",
   "empty_column.community": "La línea de tiempo local está vacía. ¡Escribe algo para empezar la fiesta!",
   "empty_column.direct": "Aún no tienes ningún mensaje directo. Cuando envíes o recibas uno, se mostrará aquí.",
   "empty_column.domain_blocks": "Todavía no hay dominios ocultos.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "abrir la lista de usuarios silenciados",
   "keyboard_shortcuts.my_profile": "abrir tu perfil",
   "keyboard_shortcuts.notifications": "abrir la columna de notificaciones",
+  "keyboard_shortcuts.open_media": "para abrir archivos multimedia",
   "keyboard_shortcuts.pinned": "abrir la lista de toots destacados",
   "keyboard_shortcuts.profile": "abrir el perfil del autor",
   "keyboard_shortcuts.reply": "para responder",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Ocultar notificaciones de este usuario?",
   "navigation_bar.apps": "Aplicaciones móviles",
   "navigation_bar.blocks": "Usuarios bloqueados",
+  "navigation_bar.bookmarks": "Marcadores",
   "navigation_bar.community_timeline": "Historia local",
   "navigation_bar.compose": "Escribir un nuevo toot",
   "navigation_bar.direct": "Mensajes directos",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Seguridad",
   "notification.favourite": "{name} marcó tu estado como favorito",
   "notification.follow": "{name} te empezó a seguir",
+  "notification.follow_request": "{name} ha solicitado seguirte",
   "notification.mention": "{name} te ha mencionado",
+  "notification.own_poll": "Tu encuesta ha terminado",
   "notification.poll": "Una encuesta en la que has votado ha terminado",
   "notification.reblog": "{name} ha retooteado tu estado",
   "notifications.clear": "Limpiar notificaciones",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
   "notifications.column_settings.filter_bar.show": "Mostrar",
   "notifications.column_settings.follow": "Nuevos seguidores:",
+  "notifications.column_settings.follow_request": "Nuevas solicitudes de seguimiento:",
   "notifications.column_settings.mention": "Menciones:",
   "notifications.column_settings.poll": "Resultados de la votación:",
   "notifications.column_settings.push": "Notificaciones push",
@@ -344,6 +355,7 @@
   "status.admin_account": "Abrir interfaz de moderación para @{name}",
   "status.admin_status": "Abrir este estado en la interfaz de moderación",
   "status.block": "Bloquear a @{name}",
+  "status.bookmark": "Marcador",
   "status.cancel_reblog_private": "Des-impulsar",
   "status.cannot_reblog": "Este toot no puede retootearse",
   "status.copy": "Copiar enlace al estado",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "Retooteado por {name}",
   "status.reblogs.empty": "Nadie impulsó este toot todavía. Cuando alguien lo haga, aparecerá aqui.",
   "status.redraft": "Borrar y volver a borrador",
+  "status.remove_bookmark": "Eliminar marcador",
   "status.reply": "Responder",
   "status.replyAll": "Responder al hilo",
   "status.report": "Reportar",
@@ -400,9 +413,11 @@
   "upload_button.label": "Subir multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Límite de subida de archivos excedido.",
   "upload_error.poll": "Subida de archivos no permitida con encuestas.",
+  "upload_form.audio_description": "Describir para personas con problemas auditivos",
   "upload_form.description": "Describir para los usuarios con dificultad visual",
   "upload_form.edit": "Editar",
   "upload_form.undo": "Borrar",
+  "upload_form.video_description": "Describir para personas con problemas auditivos o visuales",
   "upload_modal.analyzing_picture": "Analizando imagen…",
   "upload_modal.apply": "Aplicar",
   "upload_modal.description_placeholder": "Un rápido zorro marrón salta sobre el perro perezoso",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Vista previa ({ratio})",
   "upload_progress.label": "Subiendo…",
   "video.close": "Cerrar video",
+  "video.download": "Descargar archivo",
   "video.exit_fullscreen": "Salir de pantalla completa",
   "video.expand": "Expandir vídeo",
   "video.fullscreen": "Pantalla completa",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index 6b97393d2..9a13b4ee0 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Lisa või Eemalda nimekirjadest",
   "account.badges.bot": "Robot",
+  "account.badges.group": "Grupp",
   "account.block": "Blokeeri @{name}",
   "account.block_domain": "Peida kõik domeenist {domain}",
   "account.blocked": "Blokeeritud",
@@ -14,7 +15,7 @@
   "account.followers.empty": "Keegi ei jälgi seda kasutajat veel.",
   "account.follows": "Jälgib",
   "account.follows.empty": "See kasutaja ei jälgi veel kedagi.",
-  "account.follows_you": "Jälgib sind",
+  "account.follows_you": "Jälgib Teid",
   "account.hide_reblogs": "Peida upitused kasutajalt @{name}",
   "account.last_status": "Viimati aktiivne",
   "account.link_verified_on": "Selle lingi autorsust kontrolliti {date}",
@@ -42,15 +43,17 @@
   "alert.rate_limited.title": "Piiratud",
   "alert.unexpected.message": "Tekkis ootamatu viga.",
   "alert.unexpected.title": "Oih!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} nädalas",
-  "boost_modal.combo": "Saad vajutada {combo}, et see järgmine kord vahele jätta",
-  "bundle_column_error.body": "Mindagi läks valesti selle komponendi laadimisel.",
+  "boost_modal.combo": "Võite vajutada {combo}, et see järgmine kord vahele jätta",
+  "bundle_column_error.body": "Midagi läks valesti selle komponendi laadimisel.",
   "bundle_column_error.retry": "Proovi uuesti",
   "bundle_column_error.title": "Võrgu viga",
   "bundle_modal_error.close": "Sulge",
   "bundle_modal_error.message": "Selle komponendi laadimisel läks midagi viltu.",
   "bundle_modal_error.retry": "Proovi uuesti",
   "column.blocks": "Blokeeritud kasutajad",
+  "column.bookmarks": "Järjehoidjad",
   "column.community": "Kohalik ajajoon",
   "column.direct": "Otsesõnumid",
   "column.directory": "Sirvi profiile",
@@ -61,7 +64,7 @@
   "column.lists": "Nimekirjad",
   "column.mutes": "Vaigistatud kasutajad",
   "column.notifications": "Teated",
-  "column.pins": "Kinnitatud upitused",
+  "column.pins": "Kinnitatud tuututused",
   "column.public": "Föderatiivne ajajoon",
   "column_back_button.label": "Tagasi",
   "column_header.hide_settings": "Peida sätted",
@@ -75,13 +78,15 @@
   "compose_form.direct_message_warning": "See tuut saadetakse ainult mainitud kasutajatele.",
   "compose_form.direct_message_warning_learn_more": "Vaata veel",
   "compose_form.hashtag_warning": "Seda tuuti ei kuvata ühegi sildi all, sest see on kirjendamata. Ainult avalikud tuutid on sildi järgi otsitavad.",
-  "compose_form.lock_disclaimer": "Sinu konto ei ole {locked}. Igaüks saab sind jälgida ja näha su ainult-jälgijatele postitusi.",
+  "compose_form.lock_disclaimer": "Teie konto ei ole {locked}. Igaüks saab Teid jälgida ja näha Teie ainult-jälgijatele postitusi.",
   "compose_form.lock_disclaimer.lock": "lukus",
-  "compose_form.placeholder": "Millest mõtled?",
+  "compose_form.placeholder": "Millest mõtlete?",
   "compose_form.poll.add_option": "Lisa valik",
   "compose_form.poll.duration": "Küsitluse kestus",
   "compose_form.poll.option_placeholder": "Valik {number}",
   "compose_form.poll.remove_option": "Eemalda see valik",
+  "compose_form.poll.switch_to_multiple": "Muuda küsitlust lubamaks mitut valikut",
+  "compose_form.poll.switch_to_single": "Muuda küsitlust lubamaks ainult ühte valikut",
   "compose_form.publish": "Tuut",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Märgista meedia tundlikuks",
@@ -89,28 +94,28 @@
   "compose_form.sensitive.unmarked": "Meedia ei ole sensitiivseks märgitud",
   "compose_form.spoiler.marked": "Tekst on hoiatuse taha peidetud",
   "compose_form.spoiler.unmarked": "Tekst ei ole peidetud",
-  "compose_form.spoiler_placeholder": "Kirjuta oma hoiatus siia",
+  "compose_form.spoiler_placeholder": "Kirjutage oma hoiatus siia",
   "confirmation_modal.cancel": "Katkesta",
   "confirmations.block.block_and_report": "Blokeeri & Teata",
   "confirmations.block.confirm": "Blokeeri",
-  "confirmations.block.message": "Oled kindel, et soovid blokkida {name}?",
+  "confirmations.block.message": "Olete kindel, et soovite blokeerida {name}?",
   "confirmations.delete.confirm": "Kustuta",
-  "confirmations.delete.message": "Oled kindel, et soovid selle staatuse kustutada?",
+  "confirmations.delete.message": "Olete kindel, et soovite selle staatuse kustutada?",
   "confirmations.delete_list.confirm": "Kustuta",
-  "confirmations.delete_list.message": "Oled kindel, et soovid selle nimekirja püsivalt kustutada?",
+  "confirmations.delete_list.message": "Olete kindel, et soovite selle nimekirja püsivalt kustutada?",
   "confirmations.domain_block.confirm": "Peida terve domeen",
-  "confirmations.domain_block.message": "Oled ikka päris kindel, et soovid blokeerida terve  {domain}? Enamikul juhtudel piisab mõnest sihitud blokist või vaigistusest, mis on eelistatav. Sa ei näe selle domeeni sisu üheski avalikus ajajoones või teadetes. Sinu jälgijad sellest domeenist eemaldatakse.",
+  "confirmations.domain_block.message": "Olete ikka päris kindel, et soovite blokeerida terve {domain}? Enamikul juhtudel piisab mõnest sihitud blokist või vaigistusest, mis on eelistatav. Te ei näe selle domeeni sisu üheski avalikus ajajoones või teadetes. Teie jälgijad sellest domeenist eemaldatakse.",
   "confirmations.logout.confirm": "Välju",
-  "confirmations.logout.message": "Kas oled kindel, et soovid välja logida?",
+  "confirmations.logout.message": "Kas olete kindel, et soovite välja logida?",
   "confirmations.mute.confirm": "Vaigista",
   "confirmations.mute.explanation": "See peidab postitusi temalt ning postitusi, kus mainitakse neid, kuid see lubab neil ikka näha Teie postitusi ning Teid jälgida.",
-  "confirmations.mute.message": "Oled kindel, et soovid {name} vaigistada?",
+  "confirmations.mute.message": "Olete kindel, et soovite {name} vaigistada?",
   "confirmations.redraft.confirm": "Kustuta & taasalusta",
-  "confirmations.redraft.message": "Oled kindel, et soovid selle staatuse kustutada ja alustada uuesti? Lemmikud ja upitused lähevad kaotsi ja vastused originaaalpostitusele jäävad orvuks.",
+  "confirmations.redraft.message": "Olete kindel, et soovite selle staatuse kustutada ja alustada uuesti? Lemmikud ja upitused lähevad kaotsi ja vastused originaaalpostitusele jäävad orvuks.",
   "confirmations.reply.confirm": "Vasta",
-  "confirmations.reply.message": "Kohene vastamine kirjutab üle sõnumi, mida hetkel koostad. Oled kindel, et soovid jätkata?",
+  "confirmations.reply.message": "Praegu vastamine kirjutab üle sõnumi, mida hetkel koostate. Olete kindel, et soovite jätkata?",
   "confirmations.unfollow.confirm": "Ära jälgi",
-  "confirmations.unfollow.message": "Oled kindel, et ei soovi jälgida {name}?",
+  "confirmations.unfollow.message": "Olete kindel, et ei soovi rohkem jälgida kasutajat {name}?",
   "conversation.delete": "Kustuta vestlus",
   "conversation.mark_as_read": "Märgi loetuks",
   "conversation.open": "Vaata vestlust",
@@ -138,19 +143,20 @@
   "empty_column.account_timeline": "Siin tuute ei ole!",
   "empty_column.account_unavailable": "Profiil pole saadaval",
   "empty_column.blocks": "Sa ei ole veel ühtegi kasutajat blokeerinud.",
-  "empty_column.community": "Kohalik ajajoon on tühi. Kirjuta midagi avalikult, et pall veerema saada!",
-  "empty_column.direct": "Sul ei veel otsesõnumeid. Kui saadad või võtad mõne vastu, ilmuvad nad siia.",
+  "empty_column.bookmarked_statuses": "Teil pole veel järjehoidjatesse lisatud tuututusi. Kui lisate mõne, näete neid siin.",
+  "empty_column.community": "Kohalik ajajoon on tühi. Kirjutage midagi avalikult, et pall veerema ajada!",
+  "empty_column.direct": "Teil ei ole veel otsesõnumeid. Kui saadate või võtate mõne vastu, ilmuvad nad siia.",
   "empty_column.domain_blocks": "Siin ei ole veel peidetud domeene.",
-  "empty_column.favourited_statuses": "Sul pole veel lemmikuid tuute. Kui märgid mõne, näed neid siin.",
+  "empty_column.favourited_statuses": "Teil pole veel lemmikuid tuute. Kui märgite mõne, näete neid siin.",
   "empty_column.favourites": "Keegi pole veel seda tuuti lemmikuks märkinud. Kui seegi seda teeb, näed seda siin.",
-  "empty_column.follow_requests": "Sul pole veel ühtegi jälgimise taotlust. Kui saad mõne, näed seda siin.",
+  "empty_column.follow_requests": "Teil pole veel ühtegi jälgimise taotlust. Kui saate mõne, näete neid siin.",
   "empty_column.hashtag": "Selle sildiga pole veel midagi.",
-  "empty_column.home": "Sinu kodu ajajoon on tühi! Külasta {public} või kasuta otsingut alustamaks ja kohtamaks teisi kasutajaid.",
+  "empty_column.home": "Teie kodu ajajoon on tühi! Külastage {public} või kasutage otsingut alustamaks ja kohtamaks teisi kasutajaid.",
   "empty_column.home.public_timeline": "avalik ajajoon",
   "empty_column.list": "Siin nimstus pole veel midagi. Kui selle nimistu liikmed postitavad uusi staatusi, näed neid siin.",
-  "empty_column.lists": "Sul ei ole veel ühtegi nimekirja. Kui lood mõne, näed seda siin.",
-  "empty_column.mutes": "Sa pole veel ühtegi kasutajat vaigistanud.",
-  "empty_column.notifications": "Sul ei ole veel teateid. Suhtle teistega alustamaks vestlust.",
+  "empty_column.lists": "Teil ei ole veel ühtegi nimekirja. Kui loote mõne, näete neid siin.",
+  "empty_column.mutes": "Te pole veel ühtegi kasutajat vaigistanud.",
+  "empty_column.notifications": "Teil ei ole veel teateid. Suhelge teistega alustamaks vestlust.",
   "empty_column.public": "Siin pole midagi! Kirjuta midagi avalikut või jälgi ise kasutajaid täitmaks seda ruumi",
   "error.unexpected_crash.explanation": "Meie poolse probleemi või veebilehitseja ühilduvus probleemi tõttu ei suutnud me Teile seda lehekülge korrektselt näidata.",
   "error.unexpected_crash.next_steps": "Proovige lehekülge uuesti avada. Kui see ei aita, võite proovida kasutada Mastodoni mõne muu veebilehitseja või äppi kaudu.",
@@ -163,7 +169,7 @@
   "getting_started.documentation": "Dokumentatsioon",
   "getting_started.heading": "Alustamine",
   "getting_started.invite": "Kutsu inimesi",
-  "getting_started.open_source_notice": "Mastodon on avatud lähtekoodiga tarkvara. Saad panustada või teatada probleemidest GitHubis {github}.",
+  "getting_started.open_source_notice": "Mastodon on avatud lähtekoodiga tarkvara. Saate panustada või teatada probleemidest GitHubis {github}.",
   "getting_started.security": "Turvalisus",
   "getting_started.terms": "Kasutustingimused",
   "hashtag.column_header.tag_mode.all": "ja {additional}",
@@ -185,19 +191,19 @@
   "introduction.federation.federated.headline": "Föderatiivne",
   "introduction.federation.federated.text": "Avalikud postitused teistest föderatsiooni serveritest kuvatakse föderatiivsel ajajoonel.",
   "introduction.federation.home.headline": "Kodu",
-  "introduction.federation.home.text": "Inimest postitused keda jälgid kuvatakse sinu koduajajoonel. Saad jälgida igaüht igas serveris!",
+  "introduction.federation.home.text": "Inimeste, keda jälgite, postitused kuvatakse Teie koduajajoonel. Saate jälgida igaüht igas serveris!",
   "introduction.federation.local.headline": "Kohalik",
   "introduction.federation.local.text": "Samas serveris olevate inimeste postitused kuvatakse kohalikul ajajoonel.",
   "introduction.interactions.action": "Välju õpetusest!",
   "introduction.interactions.favourite.headline": "Lemmik",
-  "introduction.interactions.favourite.text": "Saad tuuti salvestada ja anda autorile teada, et meeldis märkides selle lemmikuks.",
+  "introduction.interactions.favourite.text": "Saate tuuti salvestada ja anda autorile teada, et see meeldis Teile, märkides selle lemmikuks.",
   "introduction.interactions.reblog.headline": "Upita",
-  "introduction.interactions.reblog.text": "Saad jagada teiste inimeste tuute oma jälgijatega upitades neid.",
+  "introduction.interactions.reblog.text": "Saate jagada teiste inimeste tuute oma jälgijatega neid upitades.",
   "introduction.interactions.reply.headline": "Vasta",
-  "introduction.interactions.reply.text": "Saad vastata teiste ja enda tuutidele, mis ühendab nad kokku aruteluks.",
+  "introduction.interactions.reply.text": "Saate vastata teiste ja enda tuutidele, mis ühendab nad kokku aruteluks.",
   "introduction.welcome.action": "Lähme!",
   "introduction.welcome.headline": "Esimesed sammud",
-  "introduction.welcome.text": "Teretulemast fediversumisse! Mõne aja pärast saad avaldada sõnumeid ja rääkida oma sõpradega läbi laia valiku serverite. Aga see server, {domain}, on eriline—ta majutab sinu profiili. Seega jäta ta nimi meelde.",
+  "introduction.welcome.text": "Teretulemast fediversumisse! Mõne aja pärast saate avaldada sõnumeid ja rääkida oma sõpradega läbi laia valiku serverite. Aga see server, {domain}, on eriline—see majutab sinu profiili. Seega jäta selle nimi meelde.",
   "keyboard_shortcuts.back": "tagasiminekuks",
   "keyboard_shortcuts.blocked": "avamaks blokeeritud kasutajate nimistut",
   "keyboard_shortcuts.boost": "upitamiseks",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "avamaks vaigistatud kasutajate nimistut",
   "keyboard_shortcuts.my_profile": "avamaks profiili",
   "keyboard_shortcuts.notifications": "avamaks teadete tulpa",
+  "keyboard_shortcuts.open_media": "et avada meedia",
   "keyboard_shortcuts.pinned": "avamaks kinnitatud tuutide nimistut",
   "keyboard_shortcuts.profile": "avamaks autori profiili",
   "keyboard_shortcuts.reply": "vastamiseks",
@@ -241,8 +248,8 @@
   "lists.edit.submit": "Muuda pealkiri",
   "lists.new.create": "Lisa nimistu",
   "lists.new.title_placeholder": "Uus nimistu pealkiri",
-  "lists.search": "Otsi sinu poolt jälgitavate inimese hulgast",
-  "lists.subheading": "Sinu nimistud",
+  "lists.search": "Otsi Teie poolt jälgitavate inimese hulgast",
+  "lists.subheading": "Teie nimistud",
   "load_pending": "{count, plural, one {# uus kirje} other {# uut kirjet}}",
   "loading_indicator.label": "Laeb..",
   "media_gallery.toggle_visible": "Lülita nähtavus",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Kas peita teated sellelt kasutajalt?",
   "navigation_bar.apps": "Mobiilrakendused",
   "navigation_bar.blocks": "Blokeeritud kasutajad",
+  "navigation_bar.bookmarks": "Järjehoidjad",
   "navigation_bar.community_timeline": "Kohalik ajajoon",
   "navigation_bar.compose": "Koosta uus tuut",
   "navigation_bar.direct": "Otsesõnumid",
@@ -271,19 +279,22 @@
   "navigation_bar.preferences": "Eelistused",
   "navigation_bar.public_timeline": "Föderatiivne ajajoon",
   "navigation_bar.security": "Turvalisus",
-  "notification.favourite": "{name} märkis su staatuse lemmikuks",
-  "notification.follow": "{name} jälgib sind",
-  "notification.mention": "{name} mainis sind",
-  "notification.poll": "Küsitlus, milles osalesid, on lõppenud",
-  "notification.reblog": "{name} upitas su staatust",
+  "notification.favourite": "{name} märkis Teie staatuse lemmikuks",
+  "notification.follow": "{name} jälgib nüüd Teid",
+  "notification.follow_request": "{name} soovib Teid jälgida",
+  "notification.mention": "{name} mainis Teid",
+  "notification.own_poll": "Teie küsitlus on lõppenud",
+  "notification.poll": "Küsitlus, milles osalesite, on lõppenud",
+  "notification.reblog": "{name} upitas Teie staatust",
   "notifications.clear": "Puhasta teated",
-  "notifications.clear_confirmation": "Oled kindel, et soovid püsivalt kõik oma teated puhastada?",
+  "notifications.clear_confirmation": "Olete kindel, et soovite püsivalt kõik oma teated eemaldada?",
   "notifications.column_settings.alert": "Töölauateated",
   "notifications.column_settings.favourite": "Lemmikud:",
   "notifications.column_settings.filter_bar.advanced": "Kuva kõik kategooriad",
   "notifications.column_settings.filter_bar.category": "Kiirfiltri riba",
   "notifications.column_settings.filter_bar.show": "Kuva",
   "notifications.column_settings.follow": "Uued jälgijad:",
+  "notifications.column_settings.follow_request": "Uued jälgimistaotlused:",
   "notifications.column_settings.mention": "Mainimised:",
   "notifications.column_settings.poll": "Küsitluse tulemused:",
   "notifications.column_settings.push": "Push teated",
@@ -316,7 +327,7 @@
   "privacy.unlisted.short": "Määramata",
   "refresh": "Värskenda",
   "regeneration_indicator.label": "Laeb…",
-  "regeneration_indicator.sublabel": "Sinu kodu voog on ettevalmistamisel!",
+  "regeneration_indicator.sublabel": "Teie kodu voog on ettevalmistamisel!",
   "relative_time.days": "{number}p",
   "relative_time.hours": "{number}t",
   "relative_time.just_now": "nüüd",
@@ -325,7 +336,7 @@
   "reply_indicator.cancel": "Tühista",
   "report.forward": "Edasta kasutajale {target}",
   "report.forward_hint": "See kasutaja on teisest serverist. Kas saadan anonümiseeritud koopia sellest teatest sinna ka?",
-  "report.hint": "See teade saadetakse sinu serveri moderaatoritele. Te saate lisada selgituse selle kohta, miks selle kasutaja kohta teate esitasite, siin:",
+  "report.hint": "See teade saadetakse Teie serveri moderaatoritele. Te saate lisada selgituse selle kohta, miks selle kasutaja kohta teate esitasite, siin:",
   "report.placeholder": "Lisaks kommentaarid",
   "report.submit": "Saada",
   "report.target": "Teatamine {target} kohta",
@@ -344,6 +355,7 @@
   "status.admin_account": "Ava moderaatoriliides kasutajale @{name}",
   "status.admin_status": "Ava see staatus moderaatoriliites",
   "status.block": "Blokeeri @{name}",
+  "status.bookmark": "Järjehoidja",
   "status.cancel_reblog_private": "Äraupita",
   "status.cannot_reblog": "Seda postitust ei saa upitada",
   "status.copy": "Kopeeri link staatusesse",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} upitatud",
   "status.reblogs.empty": "Keegi pole seda tuuti veel upitanud. Kui keegi upitab, näed seda siin.",
   "status.redraft": "Kustuta & alga uuesti",
+  "status.remove_bookmark": "Eemalda järjehoidja",
   "status.reply": "Vasta",
   "status.replyAll": "Vasta lõimele",
   "status.report": "Raport @{name}",
@@ -382,7 +395,7 @@
   "status.unmute_conversation": "Ära vaigista vestlust",
   "status.unpin": "Kinnita profiililt lahti",
   "suggestions.dismiss": "Eira soovitust",
-  "suggestions.header": "Sind võib huvitada…",
+  "suggestions.header": "Teid võib huvitada…",
   "tabs_bar.federated_timeline": "Föderatiivne",
   "tabs_bar.home": "Kodu",
   "tabs_bar.local_timeline": "Kohalik",
@@ -395,14 +408,16 @@
   "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekundit}} left",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {inimene} other {inimesed}} talking",
   "trends.trending_now": "Praegu populaarne",
-  "ui.beforeunload": "Sinu mustand läheb kaotsi, kui lahkud Mastodonist.",
+  "ui.beforeunload": "Teie mustand läheb kaotsi, kui lahkute Mastodonist.",
   "upload_area.title": "Lohista & aseta üleslaadimiseks",
   "upload_button.label": "Lisa meedia (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Faili üleslaadimise limiit ületatud.",
   "upload_error.poll": "Küsitlustes pole faili üleslaadimine lubatud.",
+  "upload_form.audio_description": "Kirjelda kuulmispuudega inimeste jaoks",
   "upload_form.description": "Kirjelda vaegnägijatele",
   "upload_form.edit": "Redigeeri",
   "upload_form.undo": "Kustuta",
+  "upload_form.video_description": "Kirjelda kuulmis- või nägemispuudega inimeste jaoks",
   "upload_modal.analyzing_picture": "Analüüsime pilti…",
   "upload_modal.apply": "Rakenda",
   "upload_modal.description_placeholder": "Kiire pruun rebane hüppab üle laisa koera",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Eelvaade ({ratio})",
   "upload_progress.label": "Laeb üles....",
   "video.close": "Sulge video",
+  "video.download": "Faili allalaadimine",
   "video.exit_fullscreen": "Välju täisekraanist",
   "video.expand": "Suurenda video",
   "video.fullscreen": "Täisekraan",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 9e383e85a..c89cb151f 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -1,6 +1,7 @@
 {
-  "account.add_or_remove_from_list": "Gehitu edo Kendu zerrendetatik",
+  "account.add_or_remove_from_list": "Gehitu edo kendu zerrendetatik",
   "account.badges.bot": "Bot-a",
+  "account.badges.group": "Taldea",
   "account.block": "Blokeatu @{name}",
   "account.block_domain": "Ezkutatu {domain} domeinuko guztia",
   "account.blocked": "Blokeatuta",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Abiadura mugatua",
   "alert.unexpected.message": "Ustekabeko errore bat gertatu da.",
   "alert.unexpected.title": "Ene!",
+  "announcement.announcement": "Iragarpena",
   "autosuggest_hashtag.per_week": "{count} asteko",
   "boost_modal.combo": "{combo} sakatu dezakezu hurrengoan hau saltatzeko",
   "bundle_column_error.body": "Zerbait okerra gertatu da osagai hau kargatzean.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Zerbait okerra gertatu da osagai hau kargatzean.",
   "bundle_modal_error.retry": "Saiatu berriro",
   "column.blocks": "Blokeatutako erabiltzaileak",
+  "column.bookmarks": "Laster-markak",
   "column.community": "Denbora-lerro lokala",
   "column.direct": "Mezu zuzenak",
   "column.directory": "Arakatu profilak",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Inkestaren iraupena",
   "compose_form.poll.option_placeholder": "{number}. aukera",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Markatu multimedia hunkigarri gisa",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Ez dago toot-ik hemen!",
   "empty_column.account_unavailable": "Profila ez dago eskuragarri",
   "empty_column.blocks": "Ez duzu erabiltzailerik blokeatu oraindik.",
+  "empty_column.bookmarked_statuses": "Oraindik ez dituzu toot laster-markatutarik. Bat laster-markatzerakoan, hemen agertuko da.",
   "empty_column.community": "Denbora-lerro lokala hutsik dago. Idatzi zerbait publikoki pilota biraka jartzeko!",
   "empty_column.direct": "Ez duzu mezu zuzenik oraindik. Baten bat bidali edo jasotzen duzunean, hemen agertuko da.",
   "empty_column.domain_blocks": "Ez dago ezkutatutako domeinurik oraindik.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "mutututako erabiltzaileen zerrenda irekitzeko",
   "keyboard_shortcuts.my_profile": "zure profila irekitzeko",
   "keyboard_shortcuts.notifications": "jakinarazpenen zutabea irekitzeko",
+  "keyboard_shortcuts.open_media": "media zabaltzeko",
   "keyboard_shortcuts.pinned": "finkatutako toot-en zerrenda irekitzeko",
   "keyboard_shortcuts.profile": "egilearen profila irekitzeko",
   "keyboard_shortcuts.reply": "erantzutea",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Ezkutatu erabiltzaile honen jakinarazpenak?",
   "navigation_bar.apps": "Mugikorrerako aplikazioak",
   "navigation_bar.blocks": "Blokeatutako erabiltzaileak",
+  "navigation_bar.bookmarks": "Laster-markak",
   "navigation_bar.community_timeline": "Denbora-lerro lokala",
   "navigation_bar.compose": "Idatzi toot berria",
   "navigation_bar.direct": "Mezu zuzenak",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Segurtasuna",
   "notification.favourite": "{name}(e)k zure mezua gogoko du",
   "notification.follow": "{name}(e)k jarraitzen zaitu",
+  "notification.follow_request": "{name}(e)k zu jarraitzeko eskaera egin du",
   "notification.mention": "{name}(e)k aipatu zaitu",
+  "notification.own_poll": "Zure inkesta amaitu da",
   "notification.poll": "Zuk erantzun duzun inkesta bat bukatu da",
   "notification.reblog": "{name}(e)k bultzada eman dio zure mezuari",
   "notifications.clear": "Garbitu jakinarazpenak",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Iragazki azkarraren barra",
   "notifications.column_settings.filter_bar.show": "Erakutsi",
   "notifications.column_settings.follow": "Jarraitzaile berriak:",
+  "notifications.column_settings.follow_request": "Jarraitzeko eskaera berriak:",
   "notifications.column_settings.mention": "Aipamenak:",
   "notifications.column_settings.poll": "Inkestaren emaitzak:",
   "notifications.column_settings.push": "Push jakinarazpenak",
@@ -318,7 +329,7 @@
   "regeneration_indicator.label": "Kargatzen…",
   "regeneration_indicator.sublabel": "Zure hasiera-jarioa prestatzen ari da!",
   "relative_time.days": "{number}e",
-  "relative_time.hours": "{number}o",
+  "relative_time.hours": "{number}h",
   "relative_time.just_now": "orain",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
@@ -340,10 +351,11 @@
   "search_results.hashtags": "Traolak",
   "search_results.statuses": "Toot-ak",
   "search_results.statuses_fts_disabled": "Mastodon zerbitzari honek ez du Toot-en edukiaren bilaketa gaitu.",
-  "search_results.total": "{count, number} {count, plural, one {emaitza} other {emaitzak}}",
+  "search_results.total": "{count, number} {count, plural, one {emaitza} other {emaitza}}",
   "status.admin_account": "Ireki @{name} erabiltzailearen moderazio interfazea",
   "status.admin_status": "Ireki mezu hau moderazio interfazean",
   "status.block": "Blokeatu @{name}",
+  "status.bookmark": "Laster-marka",
   "status.cancel_reblog_private": "Kendu bultzada",
   "status.cannot_reblog": "Mezu honi ezin zaio bultzada eman",
   "status.copy": "Kopiatu mezuaren esteka",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name}(r)en bultzada",
   "status.reblogs.empty": "Ez dio inork bultzada eman toot honi oraindik. Inork egiten duenean, hemen agertuko dira.",
   "status.redraft": "Ezabatu eta berridatzi",
+  "status.remove_bookmark": "Kendu laster-marka",
   "status.reply": "Erantzun",
   "status.replyAll": "Erantzun harian",
   "status.report": "Salatu @{name}",
@@ -393,25 +406,28 @@
   "time_remaining.minutes": "{number, plural, one {minutu #} other {# minutu}} amaitzeko",
   "time_remaining.moments": "Amaitzekotan",
   "time_remaining.seconds": "{number, plural, one {segundo #} other {# segundo}} amaitzeko",
-  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} hitz egiten",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {pertsona} other {pertsona}} hitz egiten",
   "trends.trending_now": "Joera orain",
   "ui.beforeunload": "Zure zirriborroa galduko da Mastodon uzten baduzu.",
   "upload_area.title": "Arrastatu eta jaregin igotzeko",
   "upload_button.label": "Gehitu multimedia  (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Fitxategi igoera muga gaindituta.",
   "upload_error.poll": "Ez da inkestetan fitxategiak igotzea onartzen.",
+  "upload_form.audio_description": "Deskribatu entzumen galera duten pertsonentzat",
   "upload_form.description": "Deskribatu ikusmen arazoak dituztenentzat",
   "upload_form.edit": "Editatu",
   "upload_form.undo": "Ezabatu",
+  "upload_form.video_description": "Deskribatu entzumen galera edo ikusmen urritasuna duten pertsonentzat",
   "upload_modal.analyzing_picture": "Irudia aztertzen…",
   "upload_modal.apply": "Aplikatu",
-  "upload_modal.description_placeholder": "Azeri marroi azkar batek txakur alferraren gainetik salto egiten du",
+  "upload_modal.description_placeholder": "Vaudeville itxurako filmean yogi ñaño bat jipoitzen dute Quebec-en whiski truk",
   "upload_modal.detect_text": "Antzeman testua iruditik",
   "upload_modal.edit_media": "Editatu media",
   "upload_modal.hint": "Sakatu eta jaregin aurrebistako zirkulua iruditxoetan beti ikusgai egongo den puntu fokala hautatzeko.",
   "upload_modal.preview_label": "Aurreikusi ({ratio})",
   "upload_progress.label": "Igotzen...",
   "video.close": "Itxi bideoa",
+  "video.download": "Deskargatu fitxategia",
   "video.exit_fullscreen": "Irten pantaila osotik",
   "video.expand": "Hedatu bideoa",
   "video.fullscreen": "Pantaila osoa",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index b651edd32..3bb2f0ee8 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -1,47 +1,49 @@
 {
-  "account.add_or_remove_from_list": "افزودن یا برداشتن از فهرست",
+  "account.add_or_remove_from_list": "افزودن یا برداشتن از فهرست‌ها",
   "account.badges.bot": "ربات",
+  "account.badges.group": "گروه",
   "account.block": "مسدودسازی @{name}",
-  "account.block_domain": "پنهان‌سازی همه چیز از سرور {domain}",
-  "account.blocked": "مسدود شده",
+  "account.block_domain": "نهفتن همه چیز از {domain}",
+  "account.blocked": "مسدود",
   "account.cancel_follow_request": "لغو درخواست پیگیری",
-  "account.direct": "پیغام خصوصی به @{name}",
-  "account.domain_blocked": "دامین پنهان‌شده",
+  "account.direct": "پیام خصوصی به @{name}",
+  "account.domain_blocked": "دامنهٔ نهفته",
   "account.edit_profile": "ویرایش نمایه",
-  "account.endorse": "نمایش در نمایه",
+  "account.endorse": "معرّفی در نمایه",
   "account.follow": "پی بگیرید",
-  "account.followers": "پیگیران",
-  "account.followers.empty": "هنوز هیچ کسی پیگیر این کاربر نیست.",
+  "account.followers": "پی‌گیران",
+  "account.followers.empty": "هنوز کسی پیگیر این کاربر نیست.",
   "account.follows": "پی می‌گیرد",
-  "account.follows.empty": "این کاربر هنوز هیچ کسی را پی نمی‌گیرد.",
+  "account.follows.empty": "این کاربر هنوز پیگیر کسی نیست.",
   "account.follows_you": "پیگیر شماست",
-  "account.hide_reblogs": "پنهان کردن بازبوق‌های @{name}",
+  "account.hide_reblogs": "نهفتن بازبوق‌های @{name}",
   "account.last_status": "آخرین فعالیت",
-  "account.link_verified_on": "مالکیت این نشانی در تاریخ {date} بررسی شد",
-  "account.locked_info": "این حساب خصوصی است. صاحب این حساب تصمیم می‌گیرد که چه کسی می‌تواند پیگیرش باشد.",
-  "account.media": "عکس و ویدیو",
+  "account.link_verified_on": "مالکیت این پیوند در {date} بررسی شد",
+  "account.locked_info": "این حساب خصوصی است. صاحبش تصمیم می‌گیرد که چه کسی بتواند پیگیرش باشد.",
+  "account.media": "رسانه",
   "account.mention": "نام‌بردن از @{name}",
-  "account.moved_to": "{name} منتقل شده است به:",
-  "account.mute": "بی‌صدا کردن @{name}",
-  "account.mute_notifications": "بی‌صداکردن اعلان‌ها از طرف @{name}",
-  "account.muted": "بی‌صداشده",
+  "account.moved_to": "{name} منتقل شده به:",
+  "account.mute": "خموشی @{name}",
+  "account.mute_notifications": "خموشی اعلان‌ها از @{name}",
+  "account.muted": "خموش",
   "account.never_active": "هرگز",
   "account.posts": "نوشته‌ها",
   "account.posts_with_replies": "نوشته‌ها و پاسخ‌ها",
   "account.report": "گزارش @{name}",
-  "account.requested": "در انتظار پذیرش",
+  "account.requested": "منتظر پذیرش. برای لغو درخواست پی‌گیری کلیک کنید",
   "account.share": "هم‌رسانی نمایهٔ @{name}",
-  "account.show_reblogs": "نشان‌دادن بازبوق‌های  @{name}",
+  "account.show_reblogs": "نمایش بازبوق‌های @{name}",
   "account.unblock": "رفع انسداد @{name}",
-  "account.unblock_domain": "رفع پنهان‌سازی از {domain}",
-  "account.unendorse": "نهفتن از نمایه",
+  "account.unblock_domain": "رفع نهفتن {domain}",
+  "account.unendorse": "معرّفی نکردن در نمایه",
   "account.unfollow": "پایان پیگیری",
-  "account.unmute": "باصدا کردن @{name}",
-  "account.unmute_notifications": "باصداکردن اعلان‌ها از طرف @{name}",
-  "alert.rate_limited.message": "لطفاً پس از {retry_time, time, medium} دوباره تلاش کنید.",
+  "account.unmute": "رفع خموشی @{name}",
+  "account.unmute_notifications": "رفع خموشی اعلان‌ها از @{name}",
+  "alert.rate_limited.message": "لطفاً پس از {retry_time, time, medium} دوباره بیازمایید.",
   "alert.rate_limited.title": "محدودیت تعداد",
-  "alert.unexpected.message": "خطای پیش‌بینی‌نشده‌ای رخ داد.",
+  "alert.unexpected.message": "خطایی غیرمنتظره رخ داد.",
   "alert.unexpected.title": "ای وای!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} در هفته",
   "boost_modal.combo": "دکمهٔ {combo} را بزنید تا دیگر این را نبینید",
   "bundle_column_error.body": "هنگام بازکردن این بخش خطایی رخ داد.",
@@ -50,18 +52,19 @@
   "bundle_modal_error.close": "بستن",
   "bundle_modal_error.message": "هنگام بازکردن این بخش خطایی رخ داد.",
   "bundle_modal_error.retry": "تلاش دوباره",
-  "column.blocks": "کاربران مسدودشده",
+  "column.blocks": "کاربران مسدود",
+  "column.bookmarks": "نشانک‌ها",
   "column.community": "نوشته‌های محلی",
-  "column.direct": "پیغام‌های خصوصی",
+  "column.direct": "پیام‌های خصوصی",
   "column.directory": "مرور نمایه‌ها",
-  "column.domain_blocks": "دامین‌های پنهان‌شده",
+  "column.domain_blocks": "دامنه‌های نهفته",
   "column.favourites": "پسندیده‌ها",
   "column.follow_requests": "درخواست‌های پیگیری",
   "column.home": "خانه",
   "column.lists": "فهرست‌ها",
-  "column.mutes": "کاربران بی‌صداشده",
+  "column.mutes": "کاربران خموش",
   "column.notifications": "اعلان‌ها",
-  "column.pins": "نوشته‌های ثابت",
+  "column.pins": "بوق‌های ثابت",
   "column.public": "نوشته‌های همه‌جا",
   "column_back_button.label": "بازگشت",
   "column_header.hide_settings": "نهفتن تنظیمات",
@@ -71,56 +74,58 @@
   "column_header.show_settings": "نمایش تنظیمات",
   "column_header.unpin": "رهاکردن",
   "column_subheading.settings": "تنظیمات",
-  "community.column_settings.media_only": "فقط عکس و ویدیو",
+  "community.column_settings.media_only": "فقط رسانه",
   "compose_form.direct_message_warning": "این بوق تنها به کاربرانی که از آن‌ها نام برده شده فرستاده خواهد شد.",
   "compose_form.direct_message_warning_learn_more": "بیشتر بدانید",
-  "compose_form.hashtag_warning": "از آن‌جا که این بوق فهرست‌نشده است، در نتایج جستجوی هشتگ‌ها پیدا نخواهد شد. تنها بوق‌های عمومی را می‌توان با جستجوی هشتگ پیدا کرد.",
-  "compose_form.lock_disclaimer": "حساب شما {locked} نیست. هر کسی می‌تواند پیگیر شما شود و نوشته‌های ویژهٔ پیگیران شما را ببیند.",
+  "compose_form.hashtag_warning": "از آن‌جا که این بوق فهرست‌نشده است، در نتایج جست‌وجوی هشتگ‌ها پیدا نخواهد شد. تنها بوق‌های عمومی را می‌توان با جست‌وجوی هشتگ یافت.",
+  "compose_form.lock_disclaimer": "حسابتان {locked} نیست. هر کسی می‌تواند پیگیرتان شده و فرسته‌های ویژهٔ پیگیرانتان را ببیند.",
   "compose_form.lock_disclaimer.lock": "قفل",
   "compose_form.placeholder": "تازه چه خبر؟",
   "compose_form.poll.add_option": "افزودن گزینه",
   "compose_form.poll.duration": "مدت نظرسنجی",
   "compose_form.poll.option_placeholder": "گزینهٔ {number}",
-  "compose_form.poll.remove_option": "حذف این گزینه",
+  "compose_form.poll.remove_option": "برداشتن این گزینه",
+  "compose_form.poll.switch_to_multiple": "تبدیل به نظرسنجی چندگزینه‌ای",
+  "compose_form.poll.switch_to_single": "تبدیل به نظرسنجی تک‌گزینه‌ای",
   "compose_form.publish": "بوق",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "علامت‌گذاری به عنوان حساس",
-  "compose_form.sensitive.marked": "این تصویر به عنوان حساس علامت‌گذاری شده",
-  "compose_form.sensitive.unmarked": "این تصویر به عنوان حساس علامت‌گذاری نشده",
-  "compose_form.spoiler.marked": "نوشته پشت هشدار محتوا پنهان است",
+  "compose_form.sensitive.marked": "رسانه به عنوان حساس علامت‌گذاری شده",
+  "compose_form.sensitive.unmarked": "رسانه به عنوان حساس علامت‌گذاری نشده",
+  "compose_form.spoiler.marked": "نوشته پشت هشدار پنهان است",
   "compose_form.spoiler.unmarked": "نوشته پنهان نیست",
-  "compose_form.spoiler_placeholder": "هشدار محتوا",
+  "compose_form.spoiler_placeholder": "هشدارتان را این‌جا بنویسید",
   "confirmation_modal.cancel": "بی‌خیال",
   "confirmations.block.block_and_report": "مسدودسازی و گزارش",
   "confirmations.block.confirm": "مسدود کن",
-  "confirmations.block.message": "آیا واقعاً می‌خواهید {name} را مسدود کنید؟",
+  "confirmations.block.message": "مطمئنید که می‌خواهید {name} را مسدود کنید؟",
   "confirmations.delete.confirm": "پاک کن",
-  "confirmations.delete.message": "آیا واقعاً می‌خواهید این نوشته را پاک کنید؟",
+  "confirmations.delete.message": "آیا مطمئنید که می‌خواهید این بوق را پاک کنید؟",
   "confirmations.delete_list.confirm": "پاک کن",
-  "confirmations.delete_list.message": "آیا واقعاً می‌خواهید این فهرست را برای همیشه پاک کنید؟",
-  "confirmations.domain_block.confirm": "پنهان‌سازی کل دامین",
-  "confirmations.domain_block.message": "آیا جدی جدی می‌خواهید کل دامین {domain} را مسدود کنید؟ بیشتر وقت‌ها مسدودکردن یا بی‌صداکردن چند حساب کاربری خاص کافی است و توصیه می‌شود. پس از این کار شما هیچ نوشته‌ای را از این دامین در فهرست نوشته‌های عمومی یا اعلان‌هایتان نخواهید دید. پیگیران شما از این دامین هم حذف خواهد شد.",
+  "confirmations.delete_list.message": "مطمئنید می‌خواهید این فهرست را برای همیشه پاک کنید؟",
+  "confirmations.domain_block.confirm": "نهفتن تمام دامنه",
+  "confirmations.domain_block.message": "آیا جدی جدی می‌خواهید تمام دامنهٔ {domain} را مسدود کنید؟ در بیشتر موارد مسدودسازی یا خموشیدن چند حساب خاص کافی است و توصیه می‌شود. پس از این کار شما هیچ نوشته‌ای را از این دامنه در فهرست نوشته‌های عمومی یا اعلان‌هایتان نخواهید دید. پیگیرانتان از این دامنه هم حذف خواهند شد.",
   "confirmations.logout.confirm": "خروج",
-  "confirmations.logout.message": "آیا مطمئنید که می‌خواهید خارج شوید؟",
-  "confirmations.mute.confirm": "بی‌صدا کن",
-  "confirmations.mute.explanation": "این کار نوشته‌های آن‌ها و نوشته‌هایی را که از آن‌ها نام برده پنهان می‌کند، ولی آن‌ها همچنان اجازه دارند نوشته‌های شما را ببینند و شما را پی بگیرند.",
-  "confirmations.mute.message": "آیا واقعاً می‌خواهید {name} را بی‌صدا کنید؟",
+  "confirmations.logout.message": "مطمئنید می‌خواهید خارج شوید؟",
+  "confirmations.mute.confirm": "خموشی",
+  "confirmations.mute.explanation": "این کار فرسته‌های آن‌ها و فرسته‌هایی را که از آن‌ها نام برده پنهان می‌کند، ولی آن‌ها همچنان اجازه دارند فرسته‌های شما را ببینند و شما را پی بگیرند.",
+  "confirmations.mute.message": "مطمئنید می‌خواهید {name} را بخموشید؟",
   "confirmations.redraft.confirm": "پاک‌کردن و بازنویسی",
-  "confirmations.redraft.message": "آیا واقعاً می‌خواهید این نوشته را پاک کنید و آن را از نو بنویسید؟ با این کار بازبوق‌ها و پسندیده‌شدن‌های آن از دست می‌رود و پاسخ‌ها به آن بی‌مرجع می‌شود.",
+  "confirmations.redraft.message": "مطمئنید که می‌خواهید این بوق را پاک کنید و از نو بنویسید؟ با این کار بازبوق‌ها و پسندهای آن از دست می‌رود و پاسخ‌ها به آن بی‌مرجع می‌شود.",
   "confirmations.reply.confirm": "پاسخ",
-  "confirmations.reply.message": "اگر الان پاسخ دهید، چیزی که در حال نوشتنش بودید پاک خواهد شد. آیا همین را می‌خواهید؟",
-  "confirmations.unfollow.confirm": "لغو پیگیری",
-  "confirmations.unfollow.message": "آیا واقعاً می‌خواهید به پیگیری از {name} پایان دهید؟",
+  "confirmations.reply.message": "اگر الان پاسخ دهید، چیزی که در حال نوشتنش بودید پاک خواهد شد. می‌خواهید ادامه دهید؟",
+  "confirmations.unfollow.confirm": "پایان پیگیری",
+  "confirmations.unfollow.message": "مطمئنید که می‌خواهید به پیگیری از {name} پایان دهید؟",
   "conversation.delete": "حذف گفتگو",
   "conversation.mark_as_read": "علامت‌گذاری به عنوان خوانده شده",
   "conversation.open": "دیدن گفتگو",
   "conversation.with": "با {names}",
-  "directory.federated": "از سرورهای همسایه",
+  "directory.federated": "از کارسازهای شناخته‌شده",
   "directory.local": "تنها از {domain}",
   "directory.new_arrivals": "تازه‌واردان",
   "directory.recently_active": "کاربران فعال اخیر",
-  "embed.instructions": "برای جاگذاری این نوشته در سایت خودتان، کد زیر را کپی کنید.",
-  "embed.preview": "نوشتهٔ جاگذاری‌شده این گونه به نظر خواهد رسید:",
+  "embed.instructions": "برای جاگذاری این بوق در سایت خودتان، کد زیر را کپی کنید.",
+  "embed.preview": "این گونه دیده خواهد شد:",
   "emoji_button.activity": "فعالیت",
   "emoji_button.custom": "سفارشی",
   "emoji_button.flags": "پرچم‌ها",
@@ -130,42 +135,43 @@
   "emoji_button.not_found": "این‌جا شکلکی نیست!! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "اشیا",
   "emoji_button.people": "مردم",
-  "emoji_button.recent": "زیاد به‌کاررفته",
+  "emoji_button.recent": "پراستفاده",
   "emoji_button.search": "جستجو...",
   "emoji_button.search_results": "نتایج جستجو",
   "emoji_button.symbols": "نمادها",
   "emoji_button.travel": "سفر و مکان",
   "empty_column.account_timeline": "هیچ بوقی این‌جا نیست!",
   "empty_column.account_unavailable": "نمایهٔ ناموجود",
-  "empty_column.blocks": "شما هنوز هیچ کسی را مسدود نکرده‌اید.",
+  "empty_column.blocks": "هنوز کسی را مسدود نکرده‌اید.",
+  "empty_column.bookmarked_statuses": "هنوز هیچ بوق نشان‌شده‌ای ندارید. وقتی بوقی را نشان‌کنید، این‌جا دیده خواهد شد.",
   "empty_column.community": "فهرست نوشته‌های محلی خالی است. چیزی بنویسید تا چرخش بچرخد!",
-  "empty_column.direct": "شما هیچ پیغام مستقیمی ندارید. اگر چنین پیغامی بگیرید یا بفرستید این‌جا نمایش خواهد یافت.",
-  "empty_column.domain_blocks": "هنوز هیچ دامینی پنهان نشده است.",
+  "empty_column.direct": "هنوز هیچ پیام مستقیمی ندارید. هروقت چنین پیامی بگیرید یا بفرستید این‌جا نمایش خواهد یافت.",
+  "empty_column.domain_blocks": "هنوز هیچ دامنه‌ای پنهان نشده است.",
   "empty_column.favourited_statuses": "شما هنوز هیچ بوقی را نپسندیده‌اید. وقتی بوقی را بپسندید، این‌جا نمایش خواهد یافت.",
   "empty_column.favourites": "هنوز هیچ کسی این بوق را نپسندیده است. وقتی کسی آن را بپسندد، نامش این‌جا نمایش خواهد یافت.",
   "empty_column.follow_requests": "شما هنوز هیچ درخواست پیگیری‌ای ندارید. وقتی چنین درخواستی بگیرید، این‌جا نمایش خواهد یافت.",
-  "empty_column.hashtag": "هنوز هیچ چیزی با این برچسب (هشتگ) نیست.",
-  "empty_column.home": "شما هنوز پیگیر کسی نیستید. {public} را ببینید یا چیزی را جستجو کنید تا کاربران دیگر را ببینید.",
+  "empty_column.hashtag": "هنوز هیچ چیزی در این برچسب نیست.",
+  "empty_column.home": "فهرست خانگی شما خالی است! {public} را ببینید یا چیزی را جستجو کنید تا کاربران دیگر را ببینید.",
   "empty_column.home.public_timeline": "فهرست نوشته‌های همه‌جا",
-  "empty_column.list": "در این فهرست هنوز چیزی نیست. وقتی اعضای این فهرست چیزی بنویسند، این‌جا ظاهر خواهد شد.",
-  "empty_column.lists": "شما هنوز هیچ فهرستی ندارید. اگر فهرستی بسازید، این‌جا نمایش خواهد یافت.",
-  "empty_column.mutes": "شما هنوز هیچ کاربری را بی‌صدا نکرده‌اید.",
-  "empty_column.notifications": "هنوز هیچ اعلانی ندارید. به نوشته‌های دیگران واکنش نشان دهید تا گفتگو آغاز شود.",
-  "empty_column.public": "این‌جا هنوز چیزی نیست! خودتان چیزی بنویسید یا کاربران سرورهای دیگر را پی بگیرید تا این‌جا پر شود",
+  "empty_column.list": "در این فهرست هنوز چیزی نیست. وقتی اعضای این فهرست چیزی بفرستند، این‌جا ظاهر خواهد شد.",
+  "empty_column.lists": "هنوز هیچ فهرستی ندارید. هنگامی که فهرستی بسازید، این‌جا دیده خواهد شد.",
+  "empty_column.mutes": "هنوز هیچ کاربری را خموش نکرده‌اید.",
+  "empty_column.notifications": "هنوز هیچ اعلانی ندارید. به دیگران واکنش نشان دهید تا گفتگو آغاز شود.",
+  "empty_column.public": "این‌جا هنوز چیزی نیست! خودتان چیزی بنویسید یا کاربران کارسازهای دیگر را پی بگیرید تا این‌جا پر شود",
   "error.unexpected_crash.explanation": "به خاطر اشکالی در کدهای ما یا ناسازگاری با مرورگر شما، این صفحه به درستی نمایش نیافت.",
-  "error.unexpected_crash.next_steps": "لطفاً صفحه را دوباره باز کنید. اگر آن هم کمکی نکرد، همچنان شاید بتوانید با ماستدون از راه یکی از اپ‌های آن کار کنید.",
-  "errors.unexpected_crash.copy_stacktrace": "کپی جزئیات اشکال",
-  "errors.unexpected_crash.report_issue": "گزارش اشکال",
+  "error.unexpected_crash.next_steps": "لطفاً صفحه را دوباره باز کنید. اگر کمکی نکرد، شاید همچنان بتوانید با ماستدون از راه یک مرورگر دیگر یا با یکی از اپ‌های آن کار کنید.",
+  "errors.unexpected_crash.copy_stacktrace": "رونوشت از جزئیات اشکال",
+  "errors.unexpected_crash.report_issue": "گزارش مشکل",
   "follow_request.authorize": "اجازه دهید",
-  "follow_request.reject": "اجازه ندهید",
-  "getting_started.developers": "برای برنامه‌نویسان",
+  "follow_request.reject": "رد کنید",
+  "getting_started.developers": "توسعه‌دهندگان",
   "getting_started.directory": "فهرست گزیدهٔ کاربران",
-  "getting_started.documentation": "راهنما",
+  "getting_started.documentation": "مستندات",
   "getting_started.heading": "آغاز کنید",
-  "getting_started.invite": "دعوت از دوستان",
-  "getting_started.open_source_notice": "ماستدون یک نرم‌افزار آزاد است. می‌توانید در ساخت آن مشارکت کنید یا مشکلاتش را در {github} گزارش دهید.",
-  "getting_started.security": "امنیت",
-  "getting_started.terms": "شرایط استفاده",
+  "getting_started.invite": "دعوت از دیگران",
+  "getting_started.open_source_notice": "ماستودون نرم‌افزاری آزاد است. می‌توانید روی {github} در آن مشارکت کرده یا مشکلاتش را گزارش دهید.",
+  "getting_started.security": "تنظیمات حساب",
+  "getting_started.terms": "شرایط خدمات",
   "hashtag.column_header.tag_mode.all": "و {additional}",
   "hashtag.column_header.tag_mode.any": "یا {additional}",
   "hashtag.column_header.tag_mode.none": "بدون {additional}",
@@ -174,41 +180,41 @@
   "hashtag.column_settings.tag_mode.all": "همهٔ این‌ها",
   "hashtag.column_settings.tag_mode.any": "هرکدام از این‌ها",
   "hashtag.column_settings.tag_mode.none": "هیچ‌کدام از این‌ها",
-  "hashtag.column_settings.tag_toggle": "برچسب‌های بیشتری به این ستون بیفزایید",
-  "home.column_settings.basic": "اصلی",
+  "hashtag.column_settings.tag_toggle": "افزودن برچسب‌هایی بیشتر به این ستون",
+  "home.column_settings.basic": "پایه‌ای",
   "home.column_settings.show_reblogs": "نمایش بازبوق‌ها",
   "home.column_settings.show_replies": "نمایش پاسخ‌ها",
   "intervals.full.days": "{number, plural, one {# روز} other {# روز}}",
   "intervals.full.hours": "{number, plural, one {# ساعت} other {# ساعت}}",
   "intervals.full.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}}",
   "introduction.federation.action": "بعدی",
-  "introduction.federation.federated.headline": "فهرست همهٔ سرورها",
-  "introduction.federation.federated.text": "نوشته‌های عمومی سرورهای دیگر در این فهرست نمایش می‌یابند.",
+  "introduction.federation.federated.headline": "همگانی",
+  "introduction.federation.federated.text": "نوشته‌های عمومی کارسازهای دیگر در این فهرست نمایش می‌یابند.",
   "introduction.federation.home.headline": "خانه",
-  "introduction.federation.home.text": "نوشته‌های کسانی که شما آن‌ها را پی می‌گیرید این‌جا نمایش می‌یابند. شما می‌توانید هر کسی را از هر سروری پی بگیرید!",
-  "introduction.federation.local.headline": "محلی",
-  "introduction.federation.local.text": "نوشته‌های عمومی کسانی که روی سرور شما هستند در فهرست نوشته‌های محلی نمایش می‌یابند.",
+  "introduction.federation.home.text": "فرسته‌های کسانی که شما آن‌ها را پی می‌گیرید این‌جا نمایش می‌یابند. شما می‌توانید هر کسی را روی هر کارسازی پی بگیرید!",
+  "introduction.federation.local.headline": "محلّی",
+  "introduction.federation.local.text": "فرسته‌های عمومی کسانی که روی کارساز شما هستند در فهرست نوشته‌های محلی نمایش می‌یابند.",
   "introduction.interactions.action": "پایان خودآموز!",
   "introduction.interactions.favourite.headline": "پسندیدن",
   "introduction.interactions.favourite.text": "با پسندیدن یک بوق، شما آن را برای آینده ذخیره می‌کنید و به نویسنده می‌گویید که از بوقش خوشتان آمده.",
   "introduction.interactions.reblog.headline": "بازبوقیدن",
   "introduction.interactions.reblog.text": "اگر بخواهید نوشته‌ای را با پیگیران خودتان به اشتراک بگذارید، آن را بازمی‌بوقید.",
   "introduction.interactions.reply.headline": "پاسخ",
-  "introduction.interactions.reply.text": "شما می‌توانید به بوق‌های خودتان و دیگران پاسخ دهید، تا همهٔ این بوق‌ها به شکل رشتهٔ به‌هم‌پیوسته‌ای در یک گفتگو درآیند.",
+  "introduction.interactions.reply.text": "می‌توانید به بوق‌های خودتان و دیگران پاسخ دهید، تا در یک گفتگو به هم زنجیر شوند.",
   "introduction.welcome.action": "بزن بریم!",
   "introduction.welcome.headline": "نخستین گام‌ها",
-  "introduction.welcome.text": "به دنیای شبکه‌های اجتماعی غیرمتمرکز خوش آمدید! به زودی می‌توانید نوشته‌های خودتان را منتشر کنید و با دوستانتان که روی سرورهای مختلفی هستند حرف بزنید. ولی این سرور، {domain}، با بقیه فرق دارد زیرا حساب شما روی آن ساخته شده است، پس نامش را یادتان نگه دارید.",
+  "introduction.welcome.text": "به دنیای شبکه‌های اجتماعی غیرمتمرکز خوش آمدید! به زودی می‌توانید نوشته‌هایتان را منتشر کرده و با دوستانتان روی دامنهٔ وسیعی از کارسازها حرف بزنید. ولی این کارساز، {domain}، با بقیه فرق دارد، چرا که میزبان نمایهٔ شماست، پس نامش را به خاطر بسپارید.",
   "keyboard_shortcuts.back": "برای بازگشت",
-  "keyboard_shortcuts.blocked": "برای گشودن کاربران بی‌صداشده",
+  "keyboard_shortcuts.blocked": "برای گشودن فهرست کاربران خموش",
   "keyboard_shortcuts.boost": "برای بازبوقیدن",
-  "keyboard_shortcuts.column": "برای برجسته‌کردن یک نوشته در یکی از ستون‌ها",
-  "keyboard_shortcuts.compose": "برای فعال‌کردن کادر نوشتهٔ تازه",
+  "keyboard_shortcuts.column": "برای تمرکز روی یک بوق در یکی از ستون‌ها",
+  "keyboard_shortcuts.compose": "برای تمرکز روی محیط نوشتن",
   "keyboard_shortcuts.description": "توضیح",
   "keyboard_shortcuts.direct": "برای گشودن ستون پیغام‌های مستقیم",
-  "keyboard_shortcuts.down": "برای پایین‌رفتن در فهرست",
+  "keyboard_shortcuts.down": "برای پایین رفتن در فهرست",
   "keyboard_shortcuts.enter": "برای گشودن نوشته",
   "keyboard_shortcuts.favourite": "برای پسندیدن",
-  "keyboard_shortcuts.favourites": "برای گشودن پیغام‌های پسندیده‌شده",
+  "keyboard_shortcuts.favourites": "برای گشودن فهرست پسندیده‌ها",
   "keyboard_shortcuts.federated": "برای گشودن فهرست نوشته‌های همه‌جا",
   "keyboard_shortcuts.heading": "میان‌برهای صفحه‌کلید",
   "keyboard_shortcuts.home": "برای گشودن ستون اصلی پیگیری‌ها",
@@ -216,31 +222,32 @@
   "keyboard_shortcuts.legend": "برای نمایش این راهنما",
   "keyboard_shortcuts.local": "برای گشودن فهرست نوشته‌های محلی",
   "keyboard_shortcuts.mention": "برای نام‌بردن از نویسنده",
-  "keyboard_shortcuts.muted": "برای گشودن فهرست کاربران بی‌صداشده",
-  "keyboard_shortcuts.my_profile": "برای گشودن صفحهٔ نمایهٔ شما",
+  "keyboard_shortcuts.muted": "برای گشودن فهرست کاربران خموش",
+  "keyboard_shortcuts.my_profile": "برای گشودن نمایه‌تان",
   "keyboard_shortcuts.notifications": "برای گشودن ستون اعلان‌ها",
-  "keyboard_shortcuts.pinned": "برای گشودن فهرست نوشته‌‌های ثابت",
-  "keyboard_shortcuts.profile": "گشودن نمایهٔ نویسنده",
-  "keyboard_shortcuts.reply": "برای پاسخ‌دادن",
+  "keyboard_shortcuts.open_media": "برای باز کردن رسانه",
+  "keyboard_shortcuts.pinned": "برای گشودن فهرست بوق‌های ثابت",
+  "keyboard_shortcuts.profile": "برای گشودن نمایهٔ نویسنده",
+  "keyboard_shortcuts.reply": "برای پاسخ",
   "keyboard_shortcuts.requests": "برای گشودن فهرست درخواست‌های پیگیری",
-  "keyboard_shortcuts.search": "برای فعال‌کردن جستجو",
+  "keyboard_shortcuts.search": "برای تمرکز روی جستجو",
   "keyboard_shortcuts.start": "برای گشودن ستون «آغاز کنید»",
   "keyboard_shortcuts.toggle_hidden": "برای نمایش/نهفتن نوشتهٔ پشت هشدار محتوا",
-  "keyboard_shortcuts.toggle_sensitivity": "برای نمایش/نهفتن عکس و ویدیو",
+  "keyboard_shortcuts.toggle_sensitivity": "برای نمایش/نهفتن رسانه",
   "keyboard_shortcuts.toot": "برای آغاز یک بوق تازه",
-  "keyboard_shortcuts.unfocus": "برای برداشتن توجه از نوشتن/جستجو",
+  "keyboard_shortcuts.unfocus": "برای برداشتن تمرکز از نوشتن/جستجو",
   "keyboard_shortcuts.up": "برای بالا رفتن در فهرست",
   "lightbox.close": "بستن",
   "lightbox.next": "بعدی",
   "lightbox.previous": "قبلی",
   "lightbox.view_context": "نمایش گفتگو",
   "lists.account.add": "افزودن به فهرست",
-  "lists.account.remove": "پاک‌کردن از فهرست",
+  "lists.account.remove": "برداشتن از فهرست",
   "lists.delete": "حذف فهرست",
   "lists.edit": "ویرایش فهرست",
   "lists.edit.submit": "تغییر عنوان",
   "lists.new.create": "افزودن فهرست",
-  "lists.new.title_placeholder": "نام فهرست تازه",
+  "lists.new.title_placeholder": "عنوان فهرست تازه",
   "lists.search": "بین کسانی که پی می‌گیرید بگردید",
   "lists.subheading": "فهرست‌های شما",
   "load_pending": "{count, plural, one {# مورد تازه} other {# مورد تازه}}",
@@ -251,39 +258,43 @@
   "mute_modal.hide_notifications": "اعلان‌های این کاربر پنهان شود؟",
   "navigation_bar.apps": "اپ‌های موبایل",
   "navigation_bar.blocks": "کاربران مسدودشده",
+  "navigation_bar.bookmarks": "نشانک‌ها",
   "navigation_bar.community_timeline": "نوشته‌های محلی",
   "navigation_bar.compose": "نوشتن بوق تازه",
-  "navigation_bar.direct": "پیغام‌های مستقیم",
+  "navigation_bar.direct": "پیام‌های مستقیم",
   "navigation_bar.discover": "گشت و گذار",
-  "navigation_bar.domain_blocks": "دامین‌های پنهان‌شده",
+  "navigation_bar.domain_blocks": "دامنه‌های نهفته",
   "navigation_bar.edit_profile": "ویرایش نمایه",
   "navigation_bar.favourites": "پسندیده‌ها",
-  "navigation_bar.filters": "واژگان بی‌صداشده",
+  "navigation_bar.filters": "واژگان خموش",
   "navigation_bar.follow_requests": "درخواست‌های پیگیری",
   "navigation_bar.follows_and_followers": "پیگیری‌ها و پیگیران",
-  "navigation_bar.info": "دربارهٔ این سرور",
-  "navigation_bar.keyboard_shortcuts": "میان‌برهای صفحه‌کلید",
+  "navigation_bar.info": "دربارهٔ این کارساز",
+  "navigation_bar.keyboard_shortcuts": "میان‌برها",
   "navigation_bar.lists": "فهرست‌ها",
   "navigation_bar.logout": "خروج",
-  "navigation_bar.mutes": "کاربران بی‌صداشده",
+  "navigation_bar.mutes": "کاربران خموشیده",
   "navigation_bar.personal": "شخصی",
-  "navigation_bar.pins": "نوشته‌های ثابت",
+  "navigation_bar.pins": "بوق‌های ثابت",
   "navigation_bar.preferences": "ترجیحات",
   "navigation_bar.public_timeline": "نوشته‌های همه‌جا",
   "navigation_bar.security": "امنیت",
   "notification.favourite": "‫{name}‬ نوشتهٔ شما را پسندید",
-  "notification.follow": "‫{name}‬ پیگیر شما شد",
+  "notification.follow": "‫{name}‬ پیگیرتان شد",
+  "notification.follow_request": "{name} می‌خواهد پیگیر شما باشد",
   "notification.mention": "‫{name}‬ از شما نام برد",
+  "notification.own_poll": "نظرسنجی شما به پایان رسید",
   "notification.poll": "نظرسنجی‌ای که در آن رأی دادید به پایان رسیده است",
   "notification.reblog": "‫{name}‬ نوشتهٔ شما را بازبوقید",
   "notifications.clear": "پاک‌کردن اعلان‌ها",
-  "notifications.clear_confirmation": "واقعاً می‌خواهید همهٔ اعلان‌هایتان را برای همیشه پاک کنید؟",
-  "notifications.column_settings.alert": "اعلان در کامپیوتر",
+  "notifications.clear_confirmation": "مطمئنید می‌خواهید همهٔ اعلان‌هایتان را برای همیشه پاک کنید؟",
+  "notifications.column_settings.alert": "اعلان‌های میزکار",
   "notifications.column_settings.favourite": "پسندیده‌ها:",
-  "notifications.column_settings.filter_bar.advanced": "نمایش همهٔ گروه‌ها",
-  "notifications.column_settings.filter_bar.category": "فیلتر سریع",
+  "notifications.column_settings.filter_bar.advanced": "نمایش همهٔ دسته‌ها",
+  "notifications.column_settings.filter_bar.category": "نوار پالایش سریع",
   "notifications.column_settings.filter_bar.show": "نمایش",
   "notifications.column_settings.follow": "پیگیران تازه:",
+  "notifications.column_settings.follow_request": "درخواست‌های جدید پی‌گیری:",
   "notifications.column_settings.mention": "نام‌بردن‌ها:",
   "notifications.column_settings.poll": "نتایج نظرسنجی:",
   "notifications.column_settings.push": "اعلان‌ها از سمت سرور",
@@ -292,9 +303,9 @@
   "notifications.column_settings.sound": "پخش صدا",
   "notifications.filter.all": "همه",
   "notifications.filter.boosts": "بازبوق‌ها",
-  "notifications.filter.favourites": "پسندیده‌ها",
+  "notifications.filter.favourites": "پسندها",
   "notifications.filter.follows": "پیگیری‌ها",
-  "notifications.filter.mentions": "گفتگوها",
+  "notifications.filter.mentions": "نام‌بردن‌ها",
   "notifications.filter.polls": "نتایج نظرسنجی",
   "notifications.group": "{count} اعلان",
   "poll.closed": "پایان‌یافته",
@@ -305,9 +316,9 @@
   "poll.voted": "شما به این گزینه رأی دادید",
   "poll_button.add_poll": "افزودن نظرسنجی",
   "poll_button.remove_poll": "حذف نظرسنجی",
-  "privacy.change": "تنظیم حریم خصوصی نوشته‌ها",
+  "privacy.change": "تنظیم محرمانگی نوشته",
   "privacy.direct.long": "تنها به کاربران نام‌برده‌شده نشان بده",
-  "privacy.direct.short": "مستقیم",
+  "privacy.direct.short": "خصوصی",
   "privacy.private.long": "تنها به پیگیران نشان بده",
   "privacy.private.short": "خصوصی",
   "privacy.public.long": "نمایش در فهرست عمومی",
@@ -324,100 +335,105 @@
   "relative_time.seconds": "{number} ثانیه",
   "reply_indicator.cancel": "لغو",
   "report.forward": "فرستادن به {target}",
-  "report.forward_hint": "این حساب در سرور دیگری ثبت شده. آیا می‌خواهید رونوشتی از این گزارش به طور ناشناس به آن‌جا هم فرستاده شود؟",
-  "report.hint": "این گزارش به مدیران سرور شما فرستاده خواهد شد. می‌توانید دلیل گزارش‌دادن این حساب را در این‌جا بنویسید:",
+  "report.forward_hint": "این حساب در کارساز دیگری ثبت شده. آیا می‌خواهید رونوشتی ناشناس از این گزارش به آن‌جا هم فرستاده شود؟",
+  "report.hint": "این گزارش به مدیران کارسازتان فرستاده خواهد شد. می‌توانید دلیل گزارش این حساب را در ادامه بنویسید:",
   "report.placeholder": "توضیح اضافه",
   "report.submit": "بفرست",
-  "report.target": "گزارش‌دادن",
+  "report.target": "در حال گزارش {target}",
   "search.placeholder": "جستجو",
   "search_popout.search_format": "راهنمای جستجوی پیشرفته",
-  "search_popout.tips.full_text": "جستجوی متنی ساده می‌تواند بوق‌هایی که شما نوشته‌اید، پسندیده‌اید، بازبوقیده‌اید، یا در آن‌ها از شما نام برده شده است را پیدا کند. همچنین نام‌های کاربری، نام نمایش‌یافته، و هشتگ‌ها را هم شامل می‌شود.",
+  "search_popout.tips.full_text": "جست‌وجوی متنی ساده وضعیت‌هایی که که نوشته، برگزیده، تقویت‌کرده یا در آن‌ها اشاره‌شده‌اید را به اضافهٔ نام‌های کاربری، نام‌های نمایشی و برچسب‌های مطابق برمی‌گرداند.",
   "search_popout.tips.hashtag": "برچسب",
-  "search_popout.tips.status": "نوشته",
-  "search_popout.tips.text": "جستجوی متنی ساده برای نام‌ها، نام‌های کاربری، و برچسب‌ها",
+  "search_popout.tips.status": "وضعیت",
+  "search_popout.tips.text": "جست‌وجوی متنی ساده، نام‌های نمایشی، نام‌های کاربری، و برچسب‌ها را برمی‌گرداند",
   "search_popout.tips.user": "کاربر",
   "search_results.accounts": "افراد",
   "search_results.hashtags": "برچسب‌ها",
   "search_results.statuses": "بوق‌ها",
-  "search_results.statuses_fts_disabled": "جستجوی محتوای بوق‌ها در این سرور ماستدون ممکن نیست.",
+  "search_results.statuses_fts_disabled": "جست‌وجوی بوق‌ها بر اساس محتوایشان روی این کارساز ماستودون به کار نیفتاده است.",
   "search_results.total": "{count, number} {count, plural, one {نتیجه} other {نتیجه}}",
-  "status.admin_account": "محیط مدیریت مربوط به @{name} را باز کن",
-  "status.admin_status": "این نوشته را در محیط مدیریت باز کن",
-  "status.block": "مسدودسازی @{name}",
-  "status.cancel_reblog_private": "حذف بازبوق",
-  "status.cannot_reblog": "این نوشته را نمی‌شود بازبوقید",
-  "status.copy": "رونوشت‌برداری از نشانی این نوشته",
-  "status.delete": "پاک‌کردن",
-  "status.detailed_status": "نمایش کامل گفتگو",
-  "status.direct": "پیغام مستقیم به @{name}",
+  "status.admin_account": "گشودن واسط مدیریت برای @{name}",
+  "status.admin_status": "گشودن این وضعیت در واسط مدیریت",
+  "status.block": "انسداد @{name}",
+  "status.bookmark": "نشانک",
+  "status.cancel_reblog_private": "ناتقویت",
+  "status.cannot_reblog": "این نوشته نمی‌تواند تقویت شود",
+  "status.copy": "رونوشت از پیوند به وضعیت",
+  "status.delete": "حذف",
+  "status.detailed_status": "نمای گفت‌وگوی باجزییات",
+  "status.direct": "پیام خصوصی به @{name}",
   "status.embed": "جاگذاری",
-  "status.favourite": "پسندیدن",
-  "status.filtered": "فیلترشده",
-  "status.load_more": "بیشتر نشان بده",
-  "status.media_hidden": "تصویر پنهان شده",
-  "status.mention": "نام‌بردن از @{name}",
+  "status.favourite": "برگزیدن",
+  "status.filtered": "پالوده",
+  "status.load_more": "بار کردن بیشتر",
+  "status.media_hidden": "رسانهٔ نهفته",
+  "status.mention": "اشاره به @{name}",
   "status.more": "بیشتر",
-  "status.mute": "بی‌صدا کردن @{name}",
-  "status.mute_conversation": "بی‌صداکردن گفتگو",
-  "status.open": "این نوشته را باز کن",
-  "status.pin": "نوشتهٔ ثابت نمایه",
-  "status.pinned": "بوق ثابت",
+  "status.mute": "خموشی @{name}",
+  "status.mute_conversation": "خموشی گفت‌وگو",
+  "status.open": "گسترش این وضعیت",
+  "status.pin": "سنجاق به نمایه",
+  "status.pinned": "بوق سنجاق‌شده",
   "status.read_more": "بیشتر بخوانید",
-  "status.reblog": "بازبوقیدن",
-  "status.reblog_private": "بازبوق به مخاطبان اولیه",
-  "status.reblogged_by": "‫{name}‬ بازبوقید",
-  "status.reblogs.empty": "هنوز هیچ کسی این بوق را بازنبوقیده است. وقتی کسی چنین کاری کند، این‌جا نمایش خواهد یافت.",
-  "status.redraft": "پاک‌کردن و بازنویسی",
+  "status.reblog": "تقویت",
+  "status.reblog_private": "تقویت برای مخاطبان نخستین",
+  "status.reblogged_by": "‫{name}‬ تقویت کرد",
+  "status.reblogs.empty": "هنوز کسی این بوق را تقویت نکرده است. وقتی کسی چنین کاری کند، این‌جا دیده خواهد شد.",
+  "status.redraft": "حذف و بازنویسی",
+  "status.remove_bookmark": "برداشتن نشانک",
   "status.reply": "پاسخ",
-  "status.replyAll": "به نوشته پاسخ دهید",
-  "status.report": "گزارش دادن @{name}",
+  "status.replyAll": "پاسخ به رشته",
+  "status.report": "گزارش @{name}",
   "status.sensitive_warning": "محتوای حساس",
   "status.share": "هم‌رسانی",
-  "status.show_less": "نهفتن",
-  "status.show_less_all": "نمایش کمتر همه",
-  "status.show_more": "نمایش",
-  "status.show_more_all": "نمایش بیشتر همه",
-  "status.show_thread": "نمایش گفتگو",
+  "status.show_less": "نمایش کمتر",
+  "status.show_less_all": "نمایش کمتر برای همه",
+  "status.show_more": "نمایش بیشتر",
+  "status.show_more_all": "نمایش بیشتر برای همه",
+  "status.show_thread": "نمایش رشته",
   "status.uncached_media_warning": "ناموجود",
-  "status.unmute_conversation": "باصداکردن گفتگو",
-  "status.unpin": "برداشتن نوشتهٔ ثابت نمایه",
-  "suggestions.dismiss": "پیشنهاد را نادیده بگیر",
+  "status.unmute_conversation": "رفع خموشی گفت‌وگو",
+  "status.unpin": "برداشتن سنجاق از نمایه",
+  "suggestions.dismiss": "نادیده گرفتن پیشنهاد",
   "suggestions.header": "شاید این هم برایتان جالب باشد…",
   "tabs_bar.federated_timeline": "همگانی",
   "tabs_bar.home": "خانه",
-  "tabs_bar.local_timeline": "محلی",
-  "tabs_bar.notifications": "اعلان‌ها",
-  "tabs_bar.search": "جستجو",
+  "tabs_bar.local_timeline": "محلّی",
+  "tabs_bar.notifications": "آگاهی‌ها",
+  "tabs_bar.search": "جست‌وجو",
   "time_remaining.days": "{number, plural, one {# روز} other {# روز}} باقی مانده",
   "time_remaining.hours": "{number, plural, one {# ساعت} other {# ساعت}} باقی مانده",
   "time_remaining.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}} باقی مانده",
-  "time_remaining.moments": "زمان باقی‌مانده",
+  "time_remaining.moments": "لحظاتی باقی‌مانده",
   "time_remaining.seconds": "{number, plural, one {# ثانیه} other {# ثانیه}} باقی مانده",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {نفر نوشته است} other {نفر نوشته‌اند}}",
   "trends.trending_now": "پرطرفدار",
-  "ui.beforeunload": "اگر از ماستدون خارج شوید پیش‌نویس شما پاک خواهد شد.",
+  "ui.beforeunload": "در صورت خروج از از ماستودون، پیش‌نویستان از دست خواهد رفت.",
   "upload_area.title": "برای بارگذاری به این‌جا بکشید",
-  "upload_button.label": "افزودن عکس و ویدیو (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "از حد مجاز باگذاری فراتر رفتید.",
-  "upload_error.poll": "باگذاری پرونده در نظرسنجی‌ها ممکن نیست.",
-  "upload_form.description": "نوشتهٔ توضیحی برای کم‌بینایان و نابینایان",
+  "upload_button.label": "افزودن رسانه ({formats})",
+  "upload_error.limit": "تجاوز از کران بارگذاری پرونده.",
+  "upload_error.poll": "بارگذاری پرونده در نظرسنجی‌ها مجاز نیست.",
+  "upload_form.audio_description": "توصیف برای افراد فاقد شنوایی",
+  "upload_form.description": "توضیح برای کم‌بینایان",
   "upload_form.edit": "ویرایش",
   "upload_form.undo": "حذف",
+  "upload_form.video_description": "توصیف برای افراد با اختلال دید یا فاقد شنوایی",
   "upload_modal.analyzing_picture": "در حال پردازش تصویر…",
-  "upload_modal.apply": "اجرا",
-  "upload_modal.description_placeholder": "مردی با بیل مادرزنش را کشت",
-  "upload_modal.detect_text": "پیدا کردن نوشته از درون تصویر",
-  "upload_modal.edit_media": "ویرایش تصویر",
-  "upload_modal.hint": "حتی اگر تصویر بریده یا کوچک شود، نقطهٔ کانونی آن همیشه دیده خواهد شد. نقطهٔ کانونی را با کلیک یا جابه‌جا کردن آن تنظیم کنید.",
+  "upload_modal.apply": "اعمال",
+  "upload_modal.description_placeholder": "الا یا ایّها الساقی، ادر کأساً و ناولها",
+  "upload_modal.detect_text": "تشخیص متن درون عکس",
+  "upload_modal.edit_media": "ویرایش رسانه",
+  "upload_modal.hint": "دایره را روی پیش‌نمایش کشیده یا کلیک کنید تا نقطهٔ کانونی‌ای که همواره باید در تمام بندانگشتی‌ها داخل نما باشد را برگزینید.",
   "upload_modal.preview_label": "پیش‌نمایش ({ratio})",
-  "upload_progress.label": "بارگذاری...",
+  "upload_progress.label": "در حال بارگذاری…",
   "video.close": "بستن ویدیو",
-  "video.exit_fullscreen": "خروج از حالت تمام صفحه",
-  "video.expand": "بزرگ‌کردن ویدیو",
-  "video.fullscreen": "تمام صفحه",
+  "video.download": "بارگیری پرونده",
+  "video.exit_fullscreen": "خروج از حالت تمام‌صفحه",
+  "video.expand": "گسترش ویدیو",
+  "video.fullscreen": "تمام‌صفحه",
   "video.hide": "نهفتن ویدیو",
-  "video.mute": "قطع صدا",
-  "video.pause": "توقف",
+  "video.mute": "خموشی صدا",
+  "video.pause": "مکث",
   "video.play": "پخش",
-  "video.unmute": "پخش صدا"
+  "video.unmute": "رفع خموشی صدا"
 }
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 60fa0c296..8a069f2a3 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Lisää tai poista listoilta",
   "account.badges.bot": "Botti",
+  "account.badges.group": "Group",
   "account.block": "Estä @{name}",
   "account.block_domain": "Piilota kaikki sisältö verkkotunnuksesta {domain}",
   "account.blocked": "Estetty",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Määrää rajoitettu",
   "alert.unexpected.message": "Tapahtui odottamaton virhe.",
   "alert.unexpected.title": "Hups!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} viikossa",
   "boost_modal.combo": "Ensi kerralla voit ohittaa tämän painamalla {combo}",
   "bundle_column_error.body": "Jokin meni vikaan komponenttia ladattaessa.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Jokin meni vikaan komponenttia ladattaessa.",
   "bundle_modal_error.retry": "Yritä uudestaan",
   "column.blocks": "Estetyt käyttäjät",
+  "column.bookmarks": "Kirjanmerkit",
   "column.community": "Paikallinen aikajana",
   "column.direct": "Viestit",
   "column.directory": "Selaa profiileja",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Äänestyksen kesto",
   "compose_form.poll.option_placeholder": "Valinta numero",
   "compose_form.poll.remove_option": "Poista tämä valinta",
+  "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": "Tuuttaa",
   "compose_form.publish_loud": "Julkista!",
   "compose_form.sensitive.hide": "Valitse tämä arkaluontoisena",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Ei ole 'toots' täällä!",
   "empty_column.account_unavailable": "Profiilia ei löydy",
   "empty_column.blocks": "Et ole vielä estänyt yhtään käyttäjää.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "Paikallinen aikajana on tyhjä. Homma lähtee käyntiin, kun kirjoitat jotain julkista!",
   "empty_column.direct": "Sinulla ei ole vielä yhtään viestiä yksittäiselle käyttäjälle. Kun lähetät tai vastaanotat sellaisen, se näkyy täällä.",
   "empty_column.domain_blocks": "Yhtään verkko-osoitetta ei ole vielä piilotettu.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "avaa lista mykistetyistä käyttäjistä",
   "keyboard_shortcuts.my_profile": "avaa profiilisi",
   "keyboard_shortcuts.notifications": "avaa ilmoitukset-sarake",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "avaa lista kiinnitetyistä tuuttauksista",
   "keyboard_shortcuts.profile": "avaa kirjoittajan profiili",
   "keyboard_shortcuts.reply": "vastaa",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Piilota tältä käyttäjältä tulevat ilmoitukset?",
   "navigation_bar.apps": "Mobiilisovellukset",
   "navigation_bar.blocks": "Estetyt käyttäjät",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Paikallinen aikajana",
   "navigation_bar.compose": "Kirjoita uusi tuuttaus",
   "navigation_bar.direct": "Viestit",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Tunnukset",
   "notification.favourite": "{name} tykkäsi tilastasi",
   "notification.follow": "{name} seurasi sinua",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mainitsi sinut",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "Kysely, johon osallistuit, on päättynyt",
   "notification.reblog": "{name} buustasi tilaasi",
   "notifications.clear": "Tyhjennä ilmoitukset",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Pikasuodatuspalkki",
   "notifications.column_settings.filter_bar.show": "Näytä",
   "notifications.column_settings.follow": "Uudet seuraajat:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Maininnat:",
   "notifications.column_settings.poll": "Kyselyn tulokset:",
   "notifications.column_settings.push": "Push-ilmoitukset",
@@ -344,6 +355,7 @@
   "status.admin_account": "Avaa moderaattorinäkymä tilistä @{name}",
   "status.admin_status": "Avaa tilapäivitys moderaattorinäkymässä",
   "status.block": "Estä @{name}",
+  "status.bookmark": "Bookmark",
   "status.cancel_reblog_private": "Peru buustaus",
   "status.cannot_reblog": "Tätä julkaisua ei voi buustata",
   "status.copy": "Kopioi linkki tilapäivitykseen",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} buustasi",
   "status.reblogs.empty": "Kukaan ei ole vielä buustannut tätä tuuttausta. Kun joku tekee niin, näkyy kyseinen henkilö tässä.",
   "status.redraft": "Poista & palauta muokattavaksi",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Vastaa",
   "status.replyAll": "Vastaa ketjuun",
   "status.report": "Raportoi @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Lisää mediaa",
   "upload_error.limit": "Tiedostolatauksien raja ylitetty.",
   "upload_error.poll": "Tiedon lataaminen ei ole sallittua kyselyissä.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Anna kuvaus näkörajoitteisia varten",
   "upload_form.edit": "Muokkaa",
   "upload_form.undo": "Peru",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
   "upload_modal.analyzing_picture": "Analysoidaan kuvaa…",
   "upload_modal.apply": "Käytä",
   "upload_modal.description_placeholder": "Eräänä jäätävänä ja pimeänä yönä gorilla ratkaisi sudokun kahdessa minuutissa",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Esikatselu ({ratio})",
   "upload_progress.label": "Ladataan...",
   "video.close": "Sulje video",
+  "video.download": "Lataa tiedosto",
   "video.exit_fullscreen": "Poistu koko näytön tilasta",
   "video.expand": "Laajenna video",
   "video.fullscreen": "Koko näyttö",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index a92f23415..7cd5ec0e3 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Ajouter ou retirer des listes",
   "account.badges.bot": "Robot",
+  "account.badges.group": "Groupe",
   "account.block": "Bloquer @{name}",
   "account.block_domain": "Tout masquer venant de {domain}",
   "account.blocked": "Bloqué·e",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Débit limité",
   "alert.unexpected.message": "Une erreur inattendue s’est produite.",
   "alert.unexpected.title": "Oups !",
+  "announcement.announcement": "Annonce",
   "autosuggest_hashtag.per_week": "{count} par semaine",
   "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour passer ceci, la prochaine fois",
   "bundle_column_error.body": "Une erreur s’est produite lors du chargement de ce composant.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Une erreur s’est produite lors du chargement de ce composant.",
   "bundle_modal_error.retry": "Réessayer",
   "column.blocks": "Comptes bloqués",
+  "column.bookmarks": "Marque-pages",
   "column.community": "Fil public local",
   "column.direct": "Messages privés",
   "column.directory": "Parcourir les profils",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Durée du sondage",
   "compose_form.poll.option_placeholder": "Choix {number}",
   "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_loud": "{publish} !",
   "compose_form.sensitive.hide": "Marquer le média comme sensible",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Aucun pouet ici !",
   "empty_column.account_unavailable": "Profil non disponible",
   "empty_column.blocks": "Vous n’avez bloqué aucun·e utilisateur·rice pour le moment.",
+  "empty_column.bookmarked_statuses": "Vous n'avez pas de pouets enregistrés comme marque-pages pour le moment. Lorsque vous en ajouterez un, il apparaîtra ici.",
   "empty_column.community": "Le fil public local est vide. Écrivez donc quelque chose pour le remplir !",
   "empty_column.direct": "Vous n’avez pas encore de messages directs. Lorsque vous en enverrez ou recevrez un, il s’affichera ici.",
   "empty_column.domain_blocks": "Il n’y a aucun domaine caché pour le moment.",
@@ -197,7 +203,7 @@
   "introduction.interactions.reply.text": "Vous pouvez répondre aux pouets d'autres personnes et à vos propres pouets, ce qui les enchaînera dans une conversation.",
   "introduction.welcome.action": "Allons-y !",
   "introduction.welcome.headline": "Premiers pas",
-  "introduction.welcome.text": "Bienvenue dans le fediverse ! Dans quelques instants, vous pourrez diffuser des messages et parler à vos amis sur une grande variété de serveurs. Mais ce serveur, {domain}, est spécial - il héberge votre profil, alors souvenez-vous de son nom.",
+  "introduction.welcome.text": "Bienvenue dans le fédiverse ! Dans quelques instants, vous pourrez diffuser des messages et parler à vos ami·e·s sur une grande variété de serveurs. Mais ce serveur, {domain}, est spécial - il héberge votre profil, alors souvenez-vous de son nom.",
   "keyboard_shortcuts.back": "pour revenir en arrière",
   "keyboard_shortcuts.blocked": "pour ouvrir la liste des comptes bloqués",
   "keyboard_shortcuts.boost": "pour partager",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "pour ouvrir la liste des utilisateur·rice·s muté·e·s",
   "keyboard_shortcuts.my_profile": "pour ouvrir votre profil",
   "keyboard_shortcuts.notifications": "pour ouvrir votre colonne de notifications",
+  "keyboard_shortcuts.open_media": "pour ouvrir le média",
   "keyboard_shortcuts.pinned": "pour ouvrir une liste des pouets épinglés",
   "keyboard_shortcuts.profile": "pour ouvrir le profil de l’auteur·rice",
   "keyboard_shortcuts.reply": "pour répondre",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Masquer les notifications de cette personne ?",
   "navigation_bar.apps": "Applications mobiles",
   "navigation_bar.blocks": "Comptes bloqués",
+  "navigation_bar.bookmarks": "Marque-pages",
   "navigation_bar.community_timeline": "Fil public local",
   "navigation_bar.compose": "Rédiger un nouveau pouet",
   "navigation_bar.direct": "Messages directs",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Sécurité",
   "notification.favourite": "{name} a ajouté à ses favoris :",
   "notification.follow": "{name} vous suit",
+  "notification.follow_request": "{name} a demandé à vous suivre",
   "notification.mention": "{name} vous a mentionné·e :",
+  "notification.own_poll": "Votre sondage est terminé",
   "notification.poll": "Un sondage auquel vous avez participé vient de se terminer",
   "notification.reblog": "{name} a partagé votre statut :",
   "notifications.clear": "Nettoyer les notifications",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Barre de filtrage rapide",
   "notifications.column_settings.filter_bar.show": "Afficher",
   "notifications.column_settings.follow": "Nouveaux⋅elles abonné⋅e·s :",
+  "notifications.column_settings.follow_request": "Nouvelles demandes d’abonnement :",
   "notifications.column_settings.mention": "Mentions :",
   "notifications.column_settings.poll": "Résultats des sondage :",
   "notifications.column_settings.push": "Notifications push",
@@ -291,7 +302,7 @@
   "notifications.column_settings.show": "Afficher dans la colonne",
   "notifications.column_settings.sound": "Émettre un son",
   "notifications.filter.all": "Tout",
-  "notifications.filter.boosts": "Repartages",
+  "notifications.filter.boosts": "Partages",
   "notifications.filter.favourites": "Favoris",
   "notifications.filter.follows": "Abonné·e·s",
   "notifications.filter.mentions": "Mentions",
@@ -331,7 +342,7 @@
   "report.target": "Signalement de {target}",
   "search.placeholder": "Rechercher",
   "search_popout.search_format": "Recherche avancée",
-  "search_popout.tips.full_text": "Les textes simples retournent les pouets que vous avez écris, mis en favori, épinglés, ou vous mentionnant, ainsi que les identifiants, les noms affichés, et les hashtags des personnes et messages correspondant.",
+  "search_popout.tips.full_text": "Un texte normal retourne les pouets que vous avez écris, mis en favori, partagés, ou vous mentionnant, ainsi que les identifiants, les noms affichés, et les hashtags des personnes et messages correspondant.",
   "search_popout.tips.hashtag": "hashtag",
   "search_popout.tips.status": "statuts",
   "search_popout.tips.text": "Un texte simple renvoie les noms affichés, les identifiants et les hashtags correspondants",
@@ -344,7 +355,8 @@
   "status.admin_account": "Ouvrir l’interface de modération pour @{name}",
   "status.admin_status": "Ouvrir ce statut dans l’interface de modération",
   "status.block": "Bloquer @{name}",
-  "status.cancel_reblog_private": "Dé-booster",
+  "status.bookmark": "Ajouter aux marque-pages",
+  "status.cancel_reblog_private": "Annuler le partage",
   "status.cannot_reblog": "Ce pouet ne peut pas être partagé",
   "status.copy": "Copier le lien vers le pouet",
   "status.delete": "Effacer",
@@ -364,10 +376,11 @@
   "status.pinned": "Pouet épinglé",
   "status.read_more": "En savoir plus",
   "status.reblog": "Partager",
-  "status.reblog_private": "Booster vers l’audience originale",
+  "status.reblog_private": "Partager à l’audience originale",
   "status.reblogged_by": "{name} a partagé :",
   "status.reblogs.empty": "Personne n’a encore partagé ce pouet. Lorsque quelqu’un le fera, il apparaîtra ici.",
   "status.redraft": "Effacer et ré-écrire",
+  "status.remove_bookmark": "Retirer des marque-pages",
   "status.reply": "Répondre",
   "status.replyAll": "Répondre au fil",
   "status.report": "Signaler @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Joindre un média ({formats})",
   "upload_error.limit": "Taille maximale d'envoi de fichier dépassée.",
   "upload_error.poll": "L’envoi de fichiers n’est pas autorisé avec les sondages.",
+  "upload_form.audio_description": "Décrire pour les personnes ayant des difficultés d’audition",
   "upload_form.description": "Décrire pour les malvoyant·e·s",
   "upload_form.edit": "Modifier",
   "upload_form.undo": "Supprimer",
+  "upload_form.video_description": "Décrire pour les personnes ayant des problèmes d’audition ou de vision",
   "upload_modal.analyzing_picture": "Analyse de l’image en cours…",
   "upload_modal.apply": "Appliquer",
   "upload_modal.description_placeholder": "Buvez de ce whisky que le patron juge fameux",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Aperçu ({ratio})",
   "upload_progress.label": "Envoi en cours…",
   "video.close": "Fermer la vidéo",
+  "video.download": "Télécharger le fichier",
   "video.exit_fullscreen": "Quitter le plein écran",
   "video.expand": "Agrandir la vidéo",
   "video.fullscreen": "Plein écran",
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index 2dd0dbbad..508456736 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Add or Remove from lists",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Group",
   "account.block": "Block @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Something went wrong while loading this component.",
   "bundle_modal_error.retry": "Try again",
   "column.blocks": "Blocked users",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
   "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Poll duration",
   "compose_form.poll.option_placeholder": "Choice {number}",
   "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
+  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
   "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "to reply",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mentions:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
@@ -344,6 +355,7 @@
   "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",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boosted",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Reply",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Add media ({formats})",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "Edit",
   "upload_form.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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "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",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 0125754b1..81ba22987 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -1,27 +1,28 @@
 {
-  "account.add_or_remove_from_list": "Engadir ou Eliminar das listas",
+  "account.add_or_remove_from_list": "Engadir ou eliminar das listaxes",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Grupo",
   "account.block": "Bloquear @{name}",
-  "account.block_domain": "Ocultar calquer contido de {domain}",
+  "account.block_domain": "Agochar todo de {domain}",
   "account.blocked": "Bloqueada",
-  "account.cancel_follow_request": "Cancelar petición de seguemento",
+  "account.cancel_follow_request": "Desbotar solicitude de seguimento",
   "account.direct": "Mensaxe directa @{name}",
   "account.domain_blocked": "Dominio agochado",
   "account.edit_profile": "Editar perfil",
-  "account.endorse": "Mostrado no perfil",
+  "account.endorse": "Amosar no perfil",
   "account.follow": "Seguir",
   "account.followers": "Seguidoras",
-  "account.followers.empty": "Ninguén está a seguir esta usuaria por agora.",
+  "account.followers.empty": "Aínda ninguén segue esta usuaria.",
   "account.follows": "Seguindo",
   "account.follows.empty": "Esta usuaria aínda non segue a ninguén.",
   "account.follows_you": "Séguete",
-  "account.hide_reblogs": "Ocultar repeticións de @{name}",
-  "account.last_status": "Último activo",
-  "account.link_verified_on": "A propiedade de esta ligazón foi comprobada en {date}",
-  "account.locked_info": "O estado da intimidade de esta conta estableceuse en pechado. A persoa dona da conta revisa quen pode seguila.",
-  "account.media": "Medios",
+  "account.hide_reblogs": "Agochar repeticións de @{name}",
+  "account.last_status": "Última actividade",
+  "account.link_verified_on": "A propiedade desta ligazón foi verificada o {date}",
+  "account.locked_info": "Esta é unha conta privada. A propietaria revisa de xeito manual quen pode seguila.",
+  "account.media": "Multimedia",
   "account.mention": "Mencionar @{name}",
-  "account.moved_to": "{name} marchou a:",
+  "account.moved_to": "{name} mudouse a:",
   "account.mute": "Acalar @{name}",
   "account.mute_notifications": "Acalar as notificacións de @{name}",
   "account.muted": "Acalada",
@@ -29,395 +30,410 @@
   "account.posts": "Toots",
   "account.posts_with_replies": "Toots e respostas",
   "account.report": "Informar sobre @{name}",
-  "account.requested": "Agardando aceptación. Pulse para cancelar a solicitude de seguimento",
+  "account.requested": "Agardando aprovación. Preme para desbotar a solicitude de seguimento",
   "account.share": "Compartir o perfil de @{name}",
-  "account.show_reblogs": "Mostrar repeticións de @{name}",
+  "account.show_reblogs": "Amosar compartidos de @{name}",
   "account.unblock": "Desbloquear @{name}",
-  "account.unblock_domain": "Non ocultar {domain}",
-  "account.unendorse": "Non mostrar no perfil",
-  "account.unfollow": "Non seguir",
-  "account.unmute": "Non acalar @{name}",
-  "account.unmute_notifications": "Desbloquear as notificacións de @{name}",
-  "alert.rate_limited.message": "Por favor inténteo tras {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Taxa limitada",
-  "alert.unexpected.message": "Aconteceu un fallo non agardado.",
-  "alert.unexpected.title": "Vaia!",
+  "account.unblock_domain": "Amosar {domain}",
+  "account.unendorse": "Non amosar no perfil",
+  "account.unfollow": "Deixar de seguir",
+  "account.unmute": "Deixar de silenciar a @{name}",
+  "account.unmute_notifications": "Deixar de silenciar as notificacións de @{name}",
+  "alert.rate_limited.message": "Téntao novamente após {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Límite de intentos",
+  "alert.unexpected.message": "Ocorreu un erro non agardado.",
+  "alert.unexpected.title": "Vaites!",
+  "announcement.announcement": "Anuncio",
   "autosuggest_hashtag.per_week": "{count} por semana",
-  "boost_modal.combo": "Pulse {combo} para saltar esto a próxima vez",
-  "bundle_column_error.body": "Houbo un fallo mentras se cargaba este compoñente.",
-  "bundle_column_error.retry": "Inténteo de novo",
+  "boost_modal.combo": "Preme {combo} para ignorar isto na seguinte vez",
+  "bundle_column_error.body": "Ocorreu un erro ó cargar este compoñente.",
+  "bundle_column_error.retry": "Téntao de novo",
   "bundle_column_error.title": "Fallo na rede",
   "bundle_modal_error.close": "Pechar",
-  "bundle_modal_error.message": "Algo fallou mentras se cargaba este compoñente.",
-  "bundle_modal_error.retry": "Inténteo de novo",
+  "bundle_modal_error.message": "Ocorreu un erro ó cargar este compoñente.",
+  "bundle_modal_error.retry": "Téntao de novo",
   "column.blocks": "Usuarias bloqueadas",
-  "column.community": "Liña temporal local",
+  "column.bookmarks": "Marcadores",
+  "column.community": "Cronoloxía local",
   "column.direct": "Mensaxes directas",
-  "column.directory": "Ver perfiles",
+  "column.directory": "Procurar perfís",
   "column.domain_blocks": "Dominios agochados",
-  "column.favourites": "Favoritas",
+  "column.favourites": "Favoritos",
   "column.follow_requests": "Peticións de seguimento",
   "column.home": "Inicio",
-  "column.lists": "Listas",
+  "column.lists": "Listaxes",
   "column.mutes": "Usuarias acaladas",
   "column.notifications": "Notificacións",
-  "column.pins": "Mensaxes fixadas",
-  "column.public": "Liña temporal federada",
-  "column_back_button.label": "Atrás",
+  "column.pins": "Toots fixados",
+  "column.public": "Cronoloxía federada",
+  "column_back_button.label": "Voltar",
   "column_header.hide_settings": "Agochar axustes",
-  "column_header.moveLeft_settings": "Mover a columna hacia a esquerda",
-  "column_header.moveRight_settings": "Mover a columna hacia a dereita",
+  "column_header.moveLeft_settings": "Mover columna cara a esquerda",
+  "column_header.moveRight_settings": "Mover columna cara a dereita",
   "column_header.pin": "Fixar",
-  "column_header.show_settings": "Mostras axustes",
-  "column_header.unpin": "Soltar",
+  "column_header.show_settings": "Amosar axustes",
+  "column_header.unpin": "Desafixar",
   "column_subheading.settings": "Axustes",
-  "community.column_settings.media_only": "Só medios",
-  "compose_form.direct_message_warning": "Este toot enviarase só as usuarias mencionadas. Porén, a súa proveedora de internet e calquera das instancias receptoras poderían examinar esta mensaxe.",
+  "community.column_settings.media_only": "Só multimedia",
+  "compose_form.direct_message_warning": "Este toot só será enviado ás usuarias mencionadas.",
   "compose_form.direct_message_warning_learn_more": "Coñecer máis",
-  "compose_form.hashtag_warning": "Esta mensaxe non será listada baixo ningunha etiqueta xa que está marcada como non listada. Só os toots públicos poden buscarse por etiquetas.",
-  "compose_form.lock_disclaimer": "A súa conta non está {locked}. Calquera pode seguila para ver as súas mensaxes só-para-seguidoras.",
-  "compose_form.lock_disclaimer.lock": "bloqueado",
+  "compose_form.hashtag_warning": "Este toot non aparecerá baixo ningún cancelo (hashtag) porque non está listado. Só se poden procurar toots públicos por cancelos.",
+  "compose_form.lock_disclaimer": "A túa conta non está {locked}. Todas poden seguirte para ollar os teus toots só para seguidoras.",
+  "compose_form.lock_disclaimer.lock": "bloqueada",
   "compose_form.placeholder": "Qué contas?",
   "compose_form.poll.add_option": "Engadir unha opción",
-  "compose_form.poll.duration": "Duración da sondaxe",
+  "compose_form.poll.duration": "Duración da enquisa",
   "compose_form.poll.option_placeholder": "Opción {number}",
   "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_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Marcar medios como sensibles",
-  "compose_form.sensitive.marked": "Medios marcados como sensibles",
-  "compose_form.sensitive.unmarked": "Os medios non están marcados como sensibles",
+  "compose_form.sensitive.hide": "Marcar coma contido multimedia sensíbel",
+  "compose_form.sensitive.marked": "Contido multimedia marcado coma sensíbel",
+  "compose_form.sensitive.unmarked": "Contido multimedia non marcado coma sensíbel",
   "compose_form.spoiler.marked": "O texto está agochado tras un aviso",
   "compose_form.spoiler.unmarked": "O texto non está agochado",
-  "compose_form.spoiler_placeholder": "Escriba o aviso aquí",
-  "confirmation_modal.cancel": "Cancelar",
-  "confirmations.block.block_and_report": "Bloquear e Informar",
+  "compose_form.spoiler_placeholder": "Escribe o teu aviso aquí",
+  "confirmation_modal.cancel": "Desbotar",
+  "confirmations.block.block_and_report": "Bloquear e denunciar",
   "confirmations.block.confirm": "Bloquear",
-  "confirmations.block.message": "Está segura de querer bloquear a {name}?",
-  "confirmations.delete.confirm": "Borrar",
-  "confirmations.delete.message": "Está segura de que quere eliminar este estado?",
+  "confirmations.block.message": "Tes a certeza de querer bloquear a {name}?",
+  "confirmations.delete.confirm": "Eliminar",
+  "confirmations.delete.message": "Tes a certeza de querer eliminar este estado?",
   "confirmations.delete_list.confirm": "Eliminar",
-  "confirmations.delete_list.message": "Estás seguro de que queres eliminar permanentemente esta lista?",
-  "confirmations.domain_block.confirm": "Agochar un dominio completo",
-  "confirmations.domain_block.message": "Realmente está segura de que quere bloquear por completo o dominio {domain}? Normalmente é suficiente, e preferible, bloquear de xeito selectivo varios elementos. Non verá contidos de ese dominio en ningunha liña temporal ou nas notificacións. As súas seguidoras en ese dominio serán eliminadas.",
-  "confirmations.logout.confirm": "Desconectar",
-  "confirmations.logout.message": "Seguro que desexa desconectar?",
+  "confirmations.delete_list.message": "Tes a certeza de querer eliminar de xeito permanente esta listaxe?",
+  "confirmations.domain_block.confirm": "Agochar dominio enteiro",
+  "confirmations.domain_block.message": "Tes a certeza de querer bloquear todo de {domain}? Na meirande parte dos casos uns bloqueos ou silenciados específicos son suficientes. Non verás máis o contido deste dominio en ningunha cronoloxía pública ou nas túas notificacións. As túas seguidoras deste dominio serán eliminadas.",
+  "confirmations.logout.confirm": "Pechar sesión",
+  "confirmations.logout.message": "Desexas pechar a sesión?",
   "confirmations.mute.confirm": "Acalar",
-  "confirmations.mute.explanation": "Esto ocultará as publicacións delas e as que as mencionen, pero poderán seguir lendo as túas publicacións e seguirte.",
-  "confirmations.mute.message": "Está segura de que quere acalar a {name}?",
+  "confirmations.mute.explanation": "Isto agochará as publicacións delas ou nas que as mencionen, mais permitirá que vexan as túas publicacións e sexan seguidoras túas.",
+  "confirmations.mute.message": "Tes a certeza de querer acalar a {name}?",
   "confirmations.redraft.confirm": "Eliminar e reescribir",
-  "confirmations.redraft.message": "Está segura de querer eliminar este estado e voltalo a escribir? Perderá réplicas e favoritas, e as respostas ao orixinal quedarán orfas.",
-  "confirmations.reply.confirm": "Respostar",
-  "confirmations.reply.message": "Respostando agora sobreescribirá a mensaxe que está a compoñer. Segura de querer proceder?",
+  "confirmations.redraft.message": "Tes a certeza de querer eliminar este estado e reescribilo? Perderás os compartidos e favoritos, e as respostas á publicación orixinal ficarán orfas.",
+  "confirmations.reply.confirm": "Responder",
+  "confirmations.reply.message": "Responder agora sobrescribirá a mensaxe que estás a compor. Tes a certeza de que queres continuar?",
   "confirmations.unfollow.confirm": "Deixar de seguir",
-  "confirmations.unfollow.message": "Quere deixar de seguir a {name}?",
+  "confirmations.unfollow.message": "Desexas deixar de seguir a {name}?",
   "conversation.delete": "Eliminar conversa",
   "conversation.mark_as_read": "Marcar como lido",
-  "conversation.open": "Ver conversa",
+  "conversation.open": "Ollar conversa",
   "conversation.with": "Con {names}",
-  "directory.federated": "Desde o fediverso coñecido",
-  "directory.local": "Só desde {domain}",
-  "directory.new_arrivals": "Novas achegas",
-  "directory.recently_active": "Activo recentemente",
-  "embed.instructions": "Copie o código inferior para incrustar no seu sitio web este estado.",
+  "directory.federated": "Do fediverso coñecido",
+  "directory.local": "Só de {domain}",
+  "directory.new_arrivals": "Recén chegadas",
+  "directory.recently_active": "Activas recentemente",
+  "embed.instructions": "Engade este estado ó teu sitio web copiando o seguinte código.",
   "embed.preview": "Así será mostrado:",
   "emoji_button.activity": "Actividade",
-  "emoji_button.custom": "Persoalizado",
-  "emoji_button.flags": "Marcas",
-  "emoji_button.food": "Comida e Bebida",
-  "emoji_button.label": "Insertar emoji",
+  "emoji_button.custom": "Personalizado",
+  "emoji_button.flags": "Bandeiras",
+  "emoji_button.food": "Comida e bebida",
+  "emoji_button.label": "Inserir emoticona",
   "emoji_button.nature": "Natureza",
-  "emoji_button.not_found": "Sen emojos!! (╯°□°)╯︵ ┻━┻",
-  "emoji_button.objects": "Obxetos",
-  "emoji_button.people": "Xente",
-  "emoji_button.recent": "Utilizadas con frecuencia",
-  "emoji_button.search": "Buscar...",
-  "emoji_button.search_results": "Resultados da busca",
+  "emoji_button.not_found": "Non hai emoticonas!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Obxectos",
+  "emoji_button.people": "Persoas",
+  "emoji_button.recent": "Empregadas acotío",
+  "emoji_button.search": "Procurar...",
+  "emoji_button.search_results": "Resultados da procura",
   "emoji_button.symbols": "Símbolos",
-  "emoji_button.travel": "Viaxes e Lugares",
-  "empty_column.account_timeline": "Sen toots por aquí!",
-  "empty_column.account_unavailable": "Perfil non dispoñible",
-  "empty_column.blocks": "Non bloqueou ningunha usuaria polo de agora.",
-  "empty_column.community": "A liña temporal local está baldeira. Escriba algo de xeito público para que rule!",
-  "empty_column.direct": "Aínda non ten mensaxes directas. Cando envíe ou reciba unha, aparecerá aquí.",
-  "empty_column.domain_blocks": "Aínda non  ocultou ningún dominio.",
-  "empty_column.favourited_statuses": "Aínda non ten toots favoritos. Cando favoreza algún, aparecerá aquí.",
-  "empty_column.favourites": "Ninguén favoreceu este toot polo momento. Cando o faga alguén, aparecerán aquí.",
-  "empty_column.follow_requests": "Non ten peticións de seguimento. Cando reciba unha, mostrarase aquí.",
-  "empty_column.hashtag": "Aínda non hai nada con esta etiqueta.",
-  "empty_column.home": "A súa liña temporal de inicio está baldeira! Visite {public} ou utilice a busca para atopar outras usuarias.",
-  "empty_column.home.public_timeline": "a liña temporal pública",
+  "emoji_button.travel": "Viaxes e lugares",
+  "empty_column.account_timeline": "Non hai toots aquí!",
+  "empty_column.account_unavailable": "Perfil non dispoñíbel",
+  "empty_column.blocks": "Aínda non bloqueaches a ningún usuaria.",
+  "empty_column.bookmarked_statuses": "Aínda non marcaches ningún toot. Cando o fagas, amosaranse aquí.",
+  "empty_column.community": "A cronoloxía local está baleira. Escribe algo de xeito público para espallalo!",
+  "empty_column.direct": "Aínda non tes mensaxes directas. Cando envíes ou recibas unha, amosarase aquí.",
+  "empty_column.domain_blocks": "Aínda non hai dominios agochados.",
+  "empty_column.favourited_statuses": "Aínda non tes toots favoritos. Cando che goste algún, aparecerá aquí.",
+  "empty_column.favourites": "A ninguén lle gostou este toot polo momento. Cando a alguén lle goste, aparecerá aquí.",
+  "empty_column.follow_requests": "Non tes peticións de seguimento. Cando recibas unha, amosarase aquí.",
+  "empty_column.hashtag": "Aínda non hai nada con este cancelo.",
+  "empty_column.home": "A túa cronoloxía inicial está baleira! Visita {public} ou emprega a procura para atopar outras usuarias.",
+  "empty_column.home.public_timeline": "a cronoloxía pública",
   "empty_column.list": "Aínda non hai nada en esta lista. Cando as usuarias incluídas na lista publiquen mensaxes, aparecerán aquí.",
-  "empty_column.lists": "Aínda non ten listas. Cando cree unha, mostrarase aquí.",
-  "empty_column.mutes": "Non acalou ningunha usuaria polo de agora.",
-  "empty_column.notifications": "Aínda non ten notificacións. Interactúe con outras para iniciar unha conversa.",
-  "empty_column.public": "Nada por aquí! Escriba algo de xeito público, ou siga manualmente usuarias de outros servidores para ir enchéndoa",
-  "error.unexpected_crash.explanation": "Non se mostra correctamente a páxina debido a un fallo no código ou problema de compatibilidade do navegador.",
-  "error.unexpected_crash.next_steps": "Intenta actualizar a páxina. Se esto non axuda podes tamén utilizar Mastodon en outro navegador ou app nativa.",
-  "errors.unexpected_crash.copy_stacktrace": "Copiar trazas ao portaretallos",
-  "errors.unexpected_crash.report_issue": "Informar de problema",
+  "empty_column.lists": "Aínda non tes listaxes. Cando crees unha, amosarase aquí.",
+  "empty_column.mutes": "Aínda non silenciaches a ningúnha usuaria.",
+  "empty_column.notifications": "Aínda non tes notificacións. Interactúa con outros para comezar unha conversa.",
+  "empty_column.public": "Nada por aquí! Escribe algo de xeito público, ou segue de xeito manual usuarias doutros servidores para ir enchéndoo",
+  "error.unexpected_crash.explanation": "Debido a un erro no noso código ou a unha compatilidade co teu navegador, esta páxina non pode ser amosada correctamente.",
+  "error.unexpected_crash.next_steps": "Tenta actualizar a páxina. Se esto non axuda podes tamén empregar o Mastodon noutro navegador ou aplicación nativa.",
+  "errors.unexpected_crash.copy_stacktrace": "Copiar trazas (stacktrace) ó portapapeis",
+  "errors.unexpected_crash.report_issue": "Denunciar un problema",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rexeitar",
-  "getting_started.developers": "Desenvolvedoras",
+  "getting_started.developers": "Desenvolvedores",
   "getting_started.directory": "Directorio do perfil",
   "getting_started.documentation": "Documentación",
-  "getting_started.heading": "Comezando",
-  "getting_started.invite": "Convide a xente",
-  "getting_started.open_source_notice": "Mastodon é software de código aberto. Pode contribuír ou informar de fallos en GitHub en {github}.",
-  "getting_started.security": "Seguridade",
+  "getting_started.heading": "Primeiros pasos",
+  "getting_started.invite": "Convidar persoas",
+  "getting_started.open_source_notice": "O Mastodon é software de código aberto. Podes contribuír ou informar de fallos no GitHub en {github}.",
+  "getting_started.security": "Seguranza",
   "getting_started.terms": "Termos do servizo",
   "hashtag.column_header.tag_mode.all": "e {additional}",
   "hashtag.column_header.tag_mode.any": "ou {additional}",
   "hashtag.column_header.tag_mode.none": "sen {additional}",
-  "hashtag.column_settings.select.no_options_message": "Non se atopan suxestións",
-  "hashtag.column_settings.select.placeholder": "Introducir etiquetas…",
-  "hashtag.column_settings.tag_mode.all": "Todos estos",
-  "hashtag.column_settings.tag_mode.any": "Calquera de estos",
-  "hashtag.column_settings.tag_mode.none": "Ningún de estos",
+  "hashtag.column_settings.select.no_options_message": "Non se atoparon suxestións",
+  "hashtag.column_settings.select.placeholder": "Inserir cancelos…",
+  "hashtag.column_settings.tag_mode.all": "Todos estes",
+  "hashtag.column_settings.tag_mode.any": "Calquera destes",
+  "hashtag.column_settings.tag_mode.none": "Ningún destes",
   "hashtag.column_settings.tag_toggle": "Incluír etiquetas adicionais para esta columna",
   "home.column_settings.basic": "Básico",
-  "home.column_settings.show_reblogs": "Mostrar repeticións",
-  "home.column_settings.show_replies": "Mostrar respostas",
+  "home.column_settings.show_reblogs": "Amosar compartidos",
+  "home.column_settings.show_replies": "Amosar respostas",
   "intervals.full.days": "{number, plural,one {# día} other {# días}}",
   "intervals.full.hours": "{number, plural, one {# hora} other {# horas}}",
   "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}",
   "introduction.federation.action": "Seguinte",
   "introduction.federation.federated.headline": "Federado",
-  "introduction.federation.federated.text": "Publicacións públicas desde outros servidores do fediverso aparecerán na liña temporal federada.",
-  "introduction.federation.home.headline": "Inicio",
-  "introduction.federation.home.text": "Publicacións de xente que vostede segue aparecerán no TL de Inicio. Pode seguir a calquera en calquer servidor!",
+  "introduction.federation.federated.text": "Publicacións públicas doutros servidores do fediverso aparecerán na cronoloxía federada.",
+  "introduction.federation.home.headline": "Páxina inicial",
+  "introduction.federation.home.text": "Publicacións de persoas que ti segues aparecerán na cronoloxía do inicio. Podes seguir calquera persoa en calquera servidor!",
   "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Publicacións públicas de xente no seu mesmo servidor aparecerán na liña temporal local.",
+  "introduction.federation.local.text": "Publicacións públicas de persoas no teu mesmo servidor aparecerán na cronoloxía local.",
   "introduction.interactions.action": "Rematar titorial!",
   "introduction.interactions.favourite.headline": "Favorito",
-  "introduction.interactions.favourite.text": "Pode gardar un toot para máis tarde, e facerlle saber a autora que lle gustou, dándolle a Favorito.",
-  "introduction.interactions.reblog.headline": "Promocionar",
-  "introduction.interactions.reblog.text": "Pode compartir os toots de outra xente coas súas seguidoras promocionándoos.",
-  "introduction.interactions.reply.headline": "Respostar",
-  "introduction.interactions.reply.text": "Pode respostar aos toots de outras persoas e aos seus propios, así quedarán encadeados nunha conversa.",
+  "introduction.interactions.favourite.text": "Podes gardar un toot para depois e facer saber ó autor que che gostou marcandoo coma favorito.",
+  "introduction.interactions.reblog.headline": "Promover",
+  "introduction.interactions.reblog.text": "Podes compartir os toots doutras persoas coas túas seguidoras.",
+  "introduction.interactions.reply.headline": "Responder",
+  "introduction.interactions.reply.text": "Podes responder ós toots doutras persoas e ós teus propios, así ficarán encadeados nunha conversa.",
   "introduction.welcome.action": "Imos!",
   "introduction.welcome.headline": "Primeiros pasos",
-  "introduction.welcome.text": "Benvida ao fediverso! Nun intre poderá difundir mensaxes e falar cos seus amigos nun gran número de servidores. Pero este servidor (dominio) é especial—hospeda o seu perfil, así que lémbreo.",
-  "keyboard_shortcuts.back": "voltar atrás",
+  "introduction.welcome.text": "Benvido ó fediverso! Nun intre poderás difundir mensaxes e falar coas túas amizades nun grande número de servidores. Mais este servidor, {domain}, é especial—hospeda o teu perfil, por iso lémbrate do seu nome.",
+  "keyboard_shortcuts.back": "para voltar atrás",
   "keyboard_shortcuts.blocked": "abrir lista de usuarias bloqueadas",
   "keyboard_shortcuts.boost": "promover",
-  "keyboard_shortcuts.column": "destacar un estado en unha das columnas",
-  "keyboard_shortcuts.compose": "Foco no área de escritura",
+  "keyboard_shortcuts.column": "para destacar un estado nunha das columnas",
+  "keyboard_shortcuts.compose": "para destacar a área de escritura",
   "keyboard_shortcuts.description": "Descrición",
-  "keyboard_shortcuts.direct": "abrir columna de mensaxes directas",
-  "keyboard_shortcuts.down": "ir hacia abaixo na lista",
-  "keyboard_shortcuts.enter": "abrir estado",
-  "keyboard_shortcuts.favourite": "marcar como favorito",
-  "keyboard_shortcuts.favourites": "abrir lista de favoritos",
-  "keyboard_shortcuts.federated": "abrir liña temporal federada",
+  "keyboard_shortcuts.direct": "para abrir a columna de mensaxes directas",
+  "keyboard_shortcuts.down": "para mover cara abaixo na listaxe",
+  "keyboard_shortcuts.enter": "para abrir estado",
+  "keyboard_shortcuts.favourite": "para engadir a favoritos",
+  "keyboard_shortcuts.favourites": "para abrir a listaxe dos favoritos",
+  "keyboard_shortcuts.federated": "para abrir a cronoloxía federada",
   "keyboard_shortcuts.heading": "Atallos do teclado",
-  "keyboard_shortcuts.home": "abrir liña temporal de inicio",
-  "keyboard_shortcuts.hotkey": "Tecla de acceso directo",
-  "keyboard_shortcuts.legend": "para mostrar esta lenda",
-  "keyboard_shortcuts.local": "abrir liña temporal local",
-  "keyboard_shortcuts.mention": "para mencionar o autor",
+  "keyboard_shortcuts.home": "para abrir a cronoloxía inicial",
+  "keyboard_shortcuts.hotkey": "Tecla de atallo",
+  "keyboard_shortcuts.legend": "para amosar esta lenda",
+  "keyboard_shortcuts.local": "para abrir a cronoloxía local",
+  "keyboard_shortcuts.mention": "para mencionar ó autor",
   "keyboard_shortcuts.muted": "abrir lista de usuarias acaladas",
-  "keyboard_shortcuts.my_profile": "abrir o seu perfil",
-  "keyboard_shortcuts.notifications": "abrir columna de notificacións",
-  "keyboard_shortcuts.pinned": "abrir lista de toots fixados",
-  "keyboard_shortcuts.profile": "abrir perfil da autora",
+  "keyboard_shortcuts.my_profile": "para abrir o teu perfil",
+  "keyboard_shortcuts.notifications": "para abrir a columna das notificacións",
+  "keyboard_shortcuts.open_media": "para abrir o contido multimedia",
+  "keyboard_shortcuts.pinned": "para abrir a listaxe dos toots fixados",
+  "keyboard_shortcuts.profile": "para abrir o perfil do autor",
   "keyboard_shortcuts.reply": "para responder",
-  "keyboard_shortcuts.requests": "abrir lista de peticións de seguimento",
-  "keyboard_shortcuts.search": "para centrar a busca",
-  "keyboard_shortcuts.start": "abrir columna \"comezando\"",
-  "keyboard_shortcuts.toggle_hidden": "mostrar/agochar un texto detrás do AC",
-  "keyboard_shortcuts.toggle_sensitivity": "mostrar/ocultar medios",
-  "keyboard_shortcuts.toot": "escribir un toot novo",
-  "keyboard_shortcuts.unfocus": "quitar o foco do área de escritura/busca",
-  "keyboard_shortcuts.up": "ir hacia arriba na lista",
+  "keyboard_shortcuts.requests": "para abrir a listaxe das peticións de seguimento",
+  "keyboard_shortcuts.search": "para destacar a procura",
+  "keyboard_shortcuts.start": "para abrir a columna dos \"primeiros pasos\"",
+  "keyboard_shortcuts.toggle_hidden": "para amosar/agochar texto detrás do aviso de contido (AC)",
+  "keyboard_shortcuts.toggle_sensitivity": "para amosar/agochar contido multimedia",
+  "keyboard_shortcuts.toot": "para escribir un novo toot",
+  "keyboard_shortcuts.unfocus": "para deixar de destacar a área de escritura/procura",
+  "keyboard_shortcuts.up": "para mover cara arriba na listaxe",
   "lightbox.close": "Fechar",
   "lightbox.next": "Seguinte",
   "lightbox.previous": "Anterior",
-  "lightbox.view_context": "Ver contexto",
-  "lists.account.add": "Engadir á lista",
-  "lists.account.remove": "Eliminar da lista",
-  "lists.delete": "Eliminar lista",
-  "lists.edit": "Editar lista",
-  "lists.edit.submit": "Cambiar título",
-  "lists.new.create": "Engadir lista",
-  "lists.new.title_placeholder": "Novo título da lista",
-  "lists.search": "Procurar entre a xente que segues",
-  "lists.subheading": "As túas listas",
+  "lightbox.view_context": "Ollar contexto",
+  "lists.account.add": "Engadir á listaxe",
+  "lists.account.remove": "Eliminar da listaxe",
+  "lists.delete": "Eliminar listaxe",
+  "lists.edit": "Editar listaxe",
+  "lists.edit.submit": "Mudar o título",
+  "lists.new.create": "Engadir listaxe",
+  "lists.new.title_placeholder": "Título da nova listaxe",
+  "lists.search": "Procurar entre as persoas que segues",
+  "lists.subheading": "As túas listaxes",
   "load_pending": "{count, plural, one {# novo elemento} other {# novos elementos}}",
-  "loading_indicator.label": "Cargando...",
-  "media_gallery.toggle_visible": "Ocultar",
+  "loading_indicator.label": "Estase a cargar...",
+  "media_gallery.toggle_visible": "Trocar visibilidade",
   "missing_indicator.label": "Non atopado",
-  "missing_indicator.sublabel": "Non se puido atopar o recurso",
-  "mute_modal.hide_notifications": "Esconder notificacións deste usuario?",
-  "navigation_bar.apps": "Apps móbiles",
+  "missing_indicator.sublabel": "Este recurso non foi atopado",
+  "mute_modal.hide_notifications": "Agochar notificacións desta usuaria?",
+  "navigation_bar.apps": "Aplicacións móbiles",
   "navigation_bar.blocks": "Usuarias bloqueadas",
-  "navigation_bar.community_timeline": "Liña temporal local",
-  "navigation_bar.compose": "Escribir novo toot",
+  "navigation_bar.bookmarks": "Marcadores",
+  "navigation_bar.community_timeline": "Cronoloxía local",
+  "navigation_bar.compose": "Escribir un novo toot",
   "navigation_bar.direct": "Mensaxes directas",
   "navigation_bar.discover": "Descubrir",
   "navigation_bar.domain_blocks": "Dominios agochados",
   "navigation_bar.edit_profile": "Editar perfil",
-  "navigation_bar.favourites": "Favoritas",
-  "navigation_bar.filters": "Palabras acaladas",
+  "navigation_bar.favourites": "Favoritos",
+  "navigation_bar.filters": "Palabras silenciadas",
   "navigation_bar.follow_requests": "Peticións de seguimento",
-  "navigation_bar.follows_and_followers": "Seguindo e seguidoras",
+  "navigation_bar.follows_and_followers": "Seguindo e seguidores",
   "navigation_bar.info": "Sobre este servidor",
-  "navigation_bar.keyboard_shortcuts": "Atallos",
-  "navigation_bar.lists": "Listas",
-  "navigation_bar.logout": "Sair",
-  "navigation_bar.mutes": "Usuarias acaladas",
+  "navigation_bar.keyboard_shortcuts": "Atallos do teclado",
+  "navigation_bar.lists": "Listaxes",
+  "navigation_bar.logout": "Pechar sesión",
+  "navigation_bar.mutes": "Usuarias silenciadas",
   "navigation_bar.personal": "Persoal",
-  "navigation_bar.pins": "Mensaxes fixadas",
+  "navigation_bar.pins": "Toots fixados",
   "navigation_bar.preferences": "Preferencias",
-  "navigation_bar.public_timeline": "Liña temporal federada",
-  "navigation_bar.security": "Seguridade",
-  "notification.favourite": "{name} marcou como favorito o seu estado",
-  "notification.follow": "{name} está a seguila",
+  "navigation_bar.public_timeline": "Cronoloxía federada",
+  "navigation_bar.security": "Seguranza",
+  "notification.favourite": "{name} marcou o teu estado coma favorito",
+  "notification.follow": "{name} comezou a seguirte",
+  "notification.follow_request": "{name} solicitou seguirte",
   "notification.mention": "{name} mencionoute",
-  "notification.poll": "Unha sondaxe na que votou xa rematou",
-  "notification.reblog": "{name} promoveu o seu estado",
+  "notification.own_poll": "A túa enquisa rematou",
+  "notification.poll": "Unha enquisa na que votaches rematou",
+  "notification.reblog": "{name} promoveu o teu estado",
   "notifications.clear": "Limpar notificacións",
-  "notifications.clear_confirmation": "Estás seguro de que queres limpar permanentemente todas as túas notificacións?",
+  "notifications.clear_confirmation": "Tes a certeza de querer limpar de xeito permanente todas as túas notificacións?",
   "notifications.column_settings.alert": "Notificacións de escritorio",
-  "notifications.column_settings.favourite": "Favoritas:",
-  "notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorías",
+  "notifications.column_settings.favourite": "Favoritos:",
+  "notifications.column_settings.filter_bar.advanced": "Amosar todas as categorías",
   "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido",
-  "notifications.column_settings.filter_bar.show": "Mostrar",
+  "notifications.column_settings.filter_bar.show": "Amosar",
   "notifications.column_settings.follow": "Novos seguidores:",
+  "notifications.column_settings.follow_request": "Novas peticións de seguimento:",
   "notifications.column_settings.mention": "Mencións:",
-  "notifications.column_settings.poll": "Resultados da sondaxe:",
-  "notifications.column_settings.push": "Enviar notificacións",
+  "notifications.column_settings.poll": "Resultados da enquisa:",
+  "notifications.column_settings.push": "Notificacións emerxentes",
   "notifications.column_settings.reblog": "Promocións:",
-  "notifications.column_settings.show": "Mostrar en columna",
+  "notifications.column_settings.show": "Amosar en columna",
   "notifications.column_settings.sound": "Reproducir son",
   "notifications.filter.all": "Todo",
-  "notifications.filter.boosts": "Promocións",
+  "notifications.filter.boosts": "Compartidos",
   "notifications.filter.favourites": "Favoritos",
   "notifications.filter.follows": "Seguimentos",
   "notifications.filter.mentions": "Mencións",
-  "notifications.filter.polls": "Resultados da sondaxe",
+  "notifications.filter.polls": "Resultados da enquisa",
   "notifications.group": "{count} notificacións",
   "poll.closed": "Pechado",
   "poll.refresh": "Actualizar",
   "poll.total_people": "{count, plural,one {# persoa}other {# persoas}}",
   "poll.total_votes": "{count, plural, one {# voto} outros {# votos}}",
   "poll.vote": "Votar",
-  "poll.voted": "Votou por esta opción",
-  "poll_button.add_poll": "Engadir sondaxe",
-  "poll_button.remove_poll": "Eliminar sondaxe",
-  "privacy.change": "Axustar a intimidade do estado",
-  "privacy.direct.long": "Enviar exclusivamente as usuarias mencionadas",
-  "privacy.direct.short": "Directa",
-  "privacy.private.long": "Enviar só as seguidoras",
-  "privacy.private.short": "Só-seguidoras",
-  "privacy.public.long": "Publicar na liña temporal pública",
-  "privacy.public.short": "Pública",
-  "privacy.unlisted.long": "Non publicar en liñas temporais públicas",
-  "privacy.unlisted.short": "Non listada",
+  "poll.voted": "Votaches por esta opción",
+  "poll_button.add_poll": "Engadir unha enquisa",
+  "poll_button.remove_poll": "Eliminar enquisa",
+  "privacy.change": "Axustar privacidade",
+  "privacy.direct.long": "Só para as usuarias mencionadas",
+  "privacy.direct.short": "Directo",
+  "privacy.private.long": "Só para os seguidores",
+  "privacy.private.short": "Só seguidores",
+  "privacy.public.long": "Publicar nas cronoloxías públicas",
+  "privacy.public.short": "Público",
+  "privacy.unlisted.long": "Non publicar nas cronoloxías públicas",
+  "privacy.unlisted.short": "Non listado",
   "refresh": "Actualizar",
-  "regeneration_indicator.label": "Cargando…",
-  "regeneration_indicator.sublabel": "Estase a preparar a súa liña temporal de inicio!",
+  "regeneration_indicator.label": "Estase a cargar…",
+  "regeneration_indicator.sublabel": "Estase a preparar a túa cronoloxía de inicio!",
   "relative_time.days": "{number}d",
   "relative_time.hours": "{number}h",
   "relative_time.just_now": "agora",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
-  "reply_indicator.cancel": "Cancelar",
+  "reply_indicator.cancel": "Desbotar",
   "report.forward": "Reenviar a {target}",
-  "report.forward_hint": "A conta pertence a outro servidor. Enviar unha copia anónima do informe alí tamén?",
-  "report.hint": "O informe enviarase a moderación do seu servidor. Abaixo pode explicar a razón pola que está a informar:",
+  "report.forward_hint": "A conta é doutro servidor. Enviar unha copia anónima da denuncia aló tamén?",
+  "report.hint": "A denuncia enviarase á moderación do teu servidor. Abaixo podes explicar a razón pola que estás a denunciar:",
   "report.placeholder": "Comentarios adicionais",
   "report.submit": "Enviar",
-  "report.target": "Informar {target}",
-  "search.placeholder": "Buscar",
-  "search_popout.search_format": "Formato de busca avanzada",
-  "search_popout.tips.full_text": "Texto simple devolve estados que vostede escribeu, promoveu, marcou favoritos, ou foi mencionada, así como nomes de usuaria coincidentes, nomes públicos e etiquetas.",
-  "search_popout.tips.hashtag": "etiqueta",
+  "report.target": "Denunciar a {target}",
+  "search.placeholder": "Procurar",
+  "search_popout.search_format": "Formato de procura avanzada",
+  "search_popout.tips.full_text": "Texto simple devolve estados que ti escribiches, promoviches, marcaches  favoritos, ou foches mencionada, así como nomes de usuaria coincidentes, nomes públicos e etiquetas.",
+  "search_popout.tips.hashtag": "cancelo",
   "search_popout.tips.status": "estado",
   "search_popout.tips.text": "Texto simple devolve coincidencias con nomes públicos, nomes de usuaria e etiquetas",
   "search_popout.tips.user": "usuaria",
-  "search_results.accounts": "Xente",
-  "search_results.hashtags": "Etiquetas",
+  "search_results.accounts": "Persoas",
+  "search_results.hashtags": "Cancelos",
   "search_results.statuses": "Toots",
-  "search_results.statuses_fts_disabled": "Non está activada neste servidor Mastodon a busca de toots polo seu contido.",
-  "search_results.total": "{count, number} {count,plural,one {result} outros {results}}",
+  "search_results.statuses_fts_disabled": "Procurar toots polo seu contido non está activado neste servidor do Mastodon.",
+  "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
   "status.admin_account": "Abrir interface de moderación para @{name}",
   "status.admin_status": "Abrir este estado na interface de moderación",
   "status.block": "Bloquear @{name}",
-  "status.cancel_reblog_private": "Non promover",
-  "status.cannot_reblog": "Esta mensaxe non pode ser promovida",
-  "status.copy": "Copiar ligazón ao estado",
+  "status.bookmark": "Marcar",
+  "status.cancel_reblog_private": "Desfacer compartido",
+  "status.cannot_reblog": "Esta publicación non pode ser promovida",
+  "status.copy": "Copiar ligazón ó estado",
   "status.delete": "Eliminar",
   "status.detailed_status": "Vista detallada da conversa",
   "status.direct": "Mensaxe directa @{name}",
-  "status.embed": "Incrustar",
-  "status.favourite": "Favorita",
+  "status.embed": "Embeber nunha web",
+  "status.favourite": "Favorito",
   "status.filtered": "Filtrado",
   "status.load_more": "Cargar máis",
-  "status.media_hidden": "Medios ocultos",
+  "status.media_hidden": "Contido multimedia agochado",
   "status.mention": "Mencionar @{name}",
   "status.more": "Máis",
-  "status.mute": "Acalar @{name}",
-  "status.mute_conversation": "Acalar conversa",
+  "status.mute": "Silenciar @{name}",
+  "status.mute_conversation": "Silenciar conversa",
   "status.open": "Expandir este estado",
   "status.pin": "Fixar no perfil",
   "status.pinned": "Toot fixado",
-  "status.read_more": "Lea máis",
+  "status.read_more": "Ler máis",
   "status.reblog": "Promover",
-  "status.reblog_private": "Promover a audiencia orixinal",
+  "status.reblog_private": "Compartir á audiencia orixinal",
   "status.reblogged_by": "{name} promoveu",
-  "status.reblogs.empty": "Ninguén promoveu este toot polo de agora. Cando alguén o faga, mostraránse aquí.",
-  "status.redraft": "Eliminar & reescribir",
-  "status.reply": "Resposta",
-  "status.replyAll": "Resposta a conversa",
-  "status.report": "Informar @{name}",
-  "status.sensitive_warning": "Contido sensible",
+  "status.reblogs.empty": "Aínda ninguén promoveu este toot. Cando alguén o faga, amosarase aquí.",
+  "status.redraft": "Eliminar e reescribir",
+  "status.remove_bookmark": "Eliminar marcador",
+  "status.reply": "Responder",
+  "status.replyAll": "Responder ó fío",
+  "status.report": "Denunciar @{name}",
+  "status.sensitive_warning": "Contido sensíbel",
   "status.share": "Compartir",
-  "status.show_less": "Mostrar menos",
-  "status.show_less_all": "Mostrar menos para todas",
-  "status.show_more": "Mostrar máis",
-  "status.show_more_all": "Mostrar máis para todas",
-  "status.show_thread": "Mostrar fío",
-  "status.uncached_media_warning": "Non dispoñible",
-  "status.unmute_conversation": "Non acalar a conversa",
-  "status.unpin": "Despegar do perfil",
+  "status.show_less": "Amosar menos",
+  "status.show_less_all": "Amosar menos para todos",
+  "status.show_more": "Amosar máis",
+  "status.show_more_all": "Amosar máis para todos",
+  "status.show_thread": "Amosar fío",
+  "status.uncached_media_warning": "Non dispoñíbel",
+  "status.unmute_conversation": "Deixar de silenciar conversa",
+  "status.unpin": "Desafixar do perfil",
   "suggestions.dismiss": "Rexeitar suxestión",
-  "suggestions.header": "Podería estar interesada en…",
-  "tabs_bar.federated_timeline": "Federado",
+  "suggestions.header": "Poderíache interesar…",
+  "tabs_bar.federated_timeline": "Federada",
   "tabs_bar.home": "Inicio",
   "tabs_bar.local_timeline": "Local",
   "tabs_bar.notifications": "Notificacións",
-  "tabs_bar.search": "Buscar",
-  "time_remaining.days": "{number, plural, one {# dia} other {# días}} restantes",
+  "tabs_bar.search": "Procurar",
+  "time_remaining.days": "{number, plural, one {# día} other {# días}} restantes",
   "time_remaining.hours": "{number, plural, one {# hora} other {# horas}} restantes",
   "time_remaining.minutes": "{number, plural, one {# minuto} other {# minutos}} restantes",
-  "time_remaining.moments": "Está rematando",
+  "time_remaining.moments": "Momentos restantes",
   "time_remaining.seconds": "{number, plural, one {# segundo} other {# segundos}} restantes",
-  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} outras {people}} conversando",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {persoa} other {persoas}} falando",
   "trends.trending_now": "Tendencias actuais",
-  "ui.beforeunload": "O borrador perderase se sae de Mastodon.",
-  "upload_area.title": "Arrastre e solte para subir",
-  "upload_button.label": "Engadir medios ({formats})",
-  "upload_error.limit": "Excedeu o límite de subida de ficheiros.",
-  "upload_error.poll": "Non se poden subir ficheiros nas sondaxes.",
-  "upload_form.description": "Describa para deficientes visuais",
+  "ui.beforeunload": "O borrador perderase se saes do Mastodon.",
+  "upload_area.title": "Arrastra e solta para subir",
+  "upload_button.label": "Engadir multimedia ({formats})",
+  "upload_error.limit": "Límite máximo do ficheiro a subir excedido.",
+  "upload_error.poll": "Non se poden subir ficheiros nas enquisas.",
+  "upload_form.audio_description": "Describir para persoas con problemas auditivos",
+  "upload_form.description": "Describir para persoas con problemas visuais",
   "upload_form.edit": "Editar",
   "upload_form.undo": "Eliminar",
-  "upload_modal.analyzing_picture": "Analizando imaxe…",
+  "upload_form.video_description": "Describir para persoas con problemas visuais ou auditivos",
+  "upload_modal.analyzing_picture": "Estase a analizar a imaxe…",
   "upload_modal.apply": "Aplicar",
-  "upload_modal.description_placeholder": "Un raposo moi feitiño salta sobre o can preguiceiro",
+  "upload_modal.description_placeholder": "Un raposo veloz brinca sobre o can preguiceiro",
   "upload_modal.detect_text": "Detectar texto na imaxe",
-  "upload_modal.edit_media": "Editar medios",
-  "upload_modal.hint": "Prema ou arrastre o círculo na vista previa para escolle o punto focal que se verá na vista de todas as miniaturas.",
+  "upload_modal.edit_media": "Editar multimedia",
+  "upload_modal.hint": "Preme ou arrastra o círculo na vista previa para escoller o punto focal que sempre estará á vista en todas as miniaturas.",
   "upload_modal.preview_label": "Vista previa ({ratio})",
-  "upload_progress.label": "Subindo...",
-  "video.close": "Pechar video",
+  "upload_progress.label": "Estase a subir...",
+  "video.close": "Pechar vídeo",
+  "video.download": "Baixar ficheiro",
   "video.exit_fullscreen": "Saír da pantalla completa",
   "video.expand": "Expandir vídeo",
   "video.fullscreen": "Pantalla completa",
   "video.hide": "Agochar vídeo",
-  "video.mute": "Acalar son",
-  "video.pause": "Pausar",
+  "video.mute": "Silenciar son",
+  "video.pause": "Deter",
   "video.play": "Reproducir",
   "video.unmute": "Permitir son"
 }
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index 70aec3279..07217364a 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "הוסף או הסר מהרשימות",
   "account.badges.bot": "בוט",
+  "account.badges.group": "Group",
   "account.block": "חסימת @{name}",
   "account.block_domain": "להסתיר הכל מהקהילה {domain}",
   "account.blocked": "חסום",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "אירעה שגיאה בלתי צפויה.",
   "alert.unexpected.title": "אופס!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה",
   "bundle_column_error.body": "משהו השתבש בעת הצגת הרכיב הזה.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "משהו השתבש בעת טעינת הרכיב הזה.",
   "bundle_modal_error.retry": "לנסות שוב",
   "column.blocks": "חסימות",
+  "column.bookmarks": "Bookmarks",
   "column.community": "ציר זמן מקומי",
   "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "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": "ללחוש",
   "compose_form.publish_loud": "לחצרץ!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "טור הסביבה ריק. יש לפרסם משהו כדי שדברים יתרחילו להתגלגל!",
   "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "לענות",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "להסתיר הודעות מחשבון זה?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "חסימות",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "ציר זמן מקומי",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "חצרוצך חובב על ידי {name}",
   "notification.follow": "{name} במעקב אחרייך",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "אוזכרת על ידי {name}",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "חצרוצך הודהד על ידי {name}",
   "notifications.clear": "הסרת התראות",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "עוקבים חדשים:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "פניות:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "הודעות בדחיפה",
@@ -344,6 +355,7 @@
   "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": "לא ניתן להדהד הודעה זו",
   "status.copy": "Copy link to status",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "הודהד על ידי {name}",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "תגובה",
   "status.replyAll": "תגובה לכולם",
   "status.report": "דיווח על @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "הוספת מדיה",
   "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": "תיאור לכבדי ראיה",
   "upload_form.edit": "Edit",
   "upload_form.undo": "ביטול",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
   "upload_modal.analyzing_picture": "Analyzing picture…",
   "upload_modal.apply": "Apply",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "עולה...",
   "video.close": "סגירת וידאו",
+  "video.download": "Download file",
   "video.exit_fullscreen": "יציאה ממסך מלא",
   "video.expand": "להרחיב וידאו",
   "video.fullscreen": "Full screen",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index c50567aac..ff7ea9e6a 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "सूची में जोड़ें या हटाए",
   "account.badges.bot": "बॉट",
+  "account.badges.group": "Group",
   "account.block": "@{name} को ब्लॉक करें",
   "account.block_domain": "{domain} के सारी चीज़े छुपाएं",
   "account.blocked": "ब्लॉक",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "सीमित दर",
   "alert.unexpected.message": "एक अप्रत्याशित त्रुटि हुई है!",
   "alert.unexpected.title": "उफ़!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} हर सप्ताह",
   "boost_modal.combo": "अगली बार स्किप करने के लिए आप {combo} दबा सकते है",
   "bundle_column_error.body": "इस कॉम्पोनेन्ट को लोड करते वक्त कुछ गलत हो गया",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "इस कॉम्पोनेन्ट को लोड करते वक्त कुछ गलत हो गया",
   "bundle_modal_error.retry": "दुबारा कोशिश करें",
   "column.blocks": "ब्लॉक्ड यूज़र्स",
+  "column.bookmarks": "Bookmarks",
   "column.community": "लोकल टाइम्लाइन",
   "column.direct": "सीधा संदेश",
   "column.directory": "प्रोफाइल्स खोजें",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "चुनाव की अवधि",
   "compose_form.poll.option_placeholder": "कुल विकल्प {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "मीडिया को संवेदनशील के रूप में चिह्नित करें",
@@ -138,6 +143,7 @@
   "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.direct": "आपके पास कोई सीधा सन्देश नहीं है, जब आप कोई भेजेंगे प्राप्त करेंगे तो यहाँ दिखेगा।",
   "empty_column.domain_blocks": "अभी तक कोई छुपा हुआ डोमेन नहीं है।",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "म्यूटेड यूजर की लिस्ट खोलने के लिए",
   "keyboard_shortcuts.my_profile": "आपकी प्रोफाइल खोलने के लिए",
   "keyboard_shortcuts.notifications": "नोटिफिकेशन कॉलम खोलने के लिए",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "पिनड टूट्स की लिस्ट खोलने के लिए",
   "keyboard_shortcuts.profile": "लेखक की प्रोफाइल खोलने के लिए",
   "keyboard_shortcuts.reply": "जवाब के लिए",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "मोबाइल एप्लिकेशंस",
   "navigation_bar.blocks": "ब्लॉक्ड यूज़र्स",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "लोकल टाइम्लाइन",
   "navigation_bar.compose": "नया टूट् लिखें",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "फ़िल्टर बार",
   "notifications.column_settings.filter_bar.show": "दिखाएँ",
   "notifications.column_settings.follow": "नए फ़ॉलोअर्स",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "उल्लेख:",
   "notifications.column_settings.poll": "चुनाव परिणाम",
   "notifications.column_settings.push": "पुश सूचनाएँ",
@@ -344,6 +355,7 @@
   "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",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boosted",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "जवाब",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Add media ({formats})",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "संशोधन करें",
   "upload_form.undo": "मिटाए",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
   "upload_modal.analyzing_picture": "Analyzing picture…",
   "upload_modal.apply": "लागू करें",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "अपलोडिंग...",
   "video.close": "Close video",
+  "video.download": "फाइल डाउनलोड करें",
   "video.exit_fullscreen": "Exit full screen",
   "video.expand": "Expand video",
   "video.fullscreen": "Full screen",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index 09298a7ad..31327e3d3 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Add or Remove from lists",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Group",
   "account.block": "Blokiraj @{name}",
   "account.block_domain": "Sakrij sve sa {domain}",
   "account.blocked": "Blocked",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "Možeš pritisnuti {combo} kako bi ovo preskočio sljedeći put",
   "bundle_column_error.body": "Something went wrong while loading this component.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Something went wrong while loading this component.",
   "bundle_modal_error.retry": "Try again",
   "column.blocks": "Blokirani korisnici",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Lokalni timeline",
   "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Poll duration",
   "compose_form.poll.option_placeholder": "Choice {number}",
   "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
+  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "Lokalni timeline je prazan. Napiši nešto javno kako bi pokrenuo stvari!",
   "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "to reply",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokirani korisnici",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Lokalni timeline",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} je lajkao tvoj status",
   "notification.follow": "{name} te sada slijedi",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} te je spomenuo",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} je podigao tvoj status",
   "notifications.clear": "Očisti notifikacije",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Novi sljedbenici:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Spominjanja:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
@@ -344,6 +355,7 @@
   "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": "Ovaj post ne može biti boostan",
   "status.copy": "Copy link to status",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} je podigao",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Odgovori",
   "status.replyAll": "Odgovori na temu",
   "status.report": "Prijavi @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Dodaj media",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "Edit",
   "upload_form.undo": "Poništi",
+  "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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploadam...",
   "video.close": "Close video",
+  "video.download": "Download file",
   "video.exit_fullscreen": "Exit full screen",
   "video.expand": "Expand video",
   "video.fullscreen": "Full screen",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 72dd6b986..e8dc573fa 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Hozzáadás vagy eltávolítás a listáról",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Csoport",
   "account.block": "@{name} letiltása",
   "account.block_domain": "Minden elrejtése innen: {domain}",
   "account.blocked": "Letiltva",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Forgalomkorlátozás",
   "alert.unexpected.message": "Váratlan hiba történt.",
   "alert.unexpected.title": "Hoppá!",
+  "announcement.announcement": "Közlemény",
   "autosuggest_hashtag.per_week": "{count}/hét",
   "boost_modal.combo": "Hogy átugord ezt következő alkalommal, használd {combo}",
   "bundle_column_error.body": "Hiba történt a komponens betöltése közben.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Hiba történt a komponens betöltésekor.",
   "bundle_modal_error.retry": "Próbáld újra",
   "column.blocks": "Letiltott felhasználók",
+  "column.bookmarks": "Könyvjelzők",
   "column.community": "Helyi idővonal",
   "column.direct": "Közvetlen üzenetek",
   "column.directory": "Profilok böngészése",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Szavazás időtartama",
   "compose_form.poll.option_placeholder": "{number}. lehetőség",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Média megjelölése szenzitívként",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Itt nincs tülkölés!",
   "empty_column.account_unavailable": "A profil nem érhető el",
   "empty_column.blocks": "Még senkit sem tiltottál le.",
+  "empty_column.bookmarked_statuses": "Még nincs egyetlen könyvjelzőzött tülköd sem. Ha könyvjelzőzöl egyet, itt fog megjelenni.",
   "empty_column.community": "A helyi idővonal üres. Tülkölj egyet nyilvánosan, hogy elindítsd az eseményeket!",
   "empty_column.direct": "Még nincs egy közvetlen üzeneted sem. Ha küldesz vagy kapsz egyet, itt fog megjelenni.",
   "empty_column.domain_blocks": "Még nem rejtettél el egyetlen domaint sem.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "némított felhasználók listájának megnyitása",
   "keyboard_shortcuts.my_profile": "profilod megnyitása",
   "keyboard_shortcuts.notifications": "értesítések megnyitása",
+  "keyboard_shortcuts.open_media": "média megnyitása",
   "keyboard_shortcuts.pinned": "kitűzött tülkök listájának megnyitása",
   "keyboard_shortcuts.profile": "szerző profiljának megnyitása",
   "keyboard_shortcuts.reply": "válasz",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Rejtsük el a felhasználótól származó értesítéseket?",
   "navigation_bar.apps": "Mobil appok",
   "navigation_bar.blocks": "Letiltott felhasználók",
+  "navigation_bar.bookmarks": "Könyvjelzők",
   "navigation_bar.community_timeline": "Helyi idővonal",
   "navigation_bar.compose": "Új tülk írása",
   "navigation_bar.direct": "Közvetlen üzenetek",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Biztonság",
   "notification.favourite": "{name} kedvencnek jelölte egy tülködet",
   "notification.follow": "{name} követ téged",
+  "notification.follow_request": "{name} követni szeretne téged",
   "notification.mention": "{name} megemlített",
+  "notification.own_poll": "A szavazásod véget ért",
   "notification.poll": "Egy szavazás, melyben részt vettél, véget ért",
   "notification.reblog": "{name} megtolta a tülködet",
   "notifications.clear": "Értesítések törlése",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Gyorskereső mező",
   "notifications.column_settings.filter_bar.show": "Mutat",
   "notifications.column_settings.follow": "Új követők:",
+  "notifications.column_settings.follow_request": "Új követési kérelmek:",
   "notifications.column_settings.mention": "Megemlítések:",
   "notifications.column_settings.poll": "Szavazás eredménye:",
   "notifications.column_settings.push": "Push értesítések",
@@ -344,6 +355,7 @@
   "status.admin_account": "Moderáció megnyitása @{name} felhasználóhoz",
   "status.admin_status": "Tülk megnyitása moderációra",
   "status.block": "@{name} letiltása",
+  "status.bookmark": "Könyvjelzőzés",
   "status.cancel_reblog_private": "Megtolás törlése",
   "status.cannot_reblog": "Ez a tülk nem tolható meg",
   "status.copy": "Link másolása tülkbe",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} megtolta",
   "status.reblogs.empty": "Senki sem tolta még meg ezt a tülköt. Ha valaki megteszi, itt fog megjelenni.",
   "status.redraft": "Törlés és újraírás",
+  "status.remove_bookmark": "Könyvjelző eltávolítása",
   "status.reply": "Válasz",
   "status.replyAll": "Válasz a beszélgetésre",
   "status.report": "@{name} jelentése",
@@ -400,9 +413,11 @@
   "upload_button.label": "Média hozzáadása ({formats})",
   "upload_error.limit": "Túllépted a fájlfeltöltési korlátot.",
   "upload_error.poll": "Szavazásnál nem lehet fájlt feltölteni.",
+  "upload_form.audio_description": "Írja le a hallássérültek számára",
   "upload_form.description": "Leírás látáskorlátozottak számára",
   "upload_form.edit": "Szerkesztés",
   "upload_form.undo": "Mégsem",
+  "upload_form.video_description": "Írja le a hallás- vagy látássérültek számára",
   "upload_modal.analyzing_picture": "Kép elemzése…",
   "upload_modal.apply": "Alkalmaz",
   "upload_modal.description_placeholder": "A gyors, barna róka átugrik a lusta kutya fölött",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Előnézet ({ratio})",
   "upload_progress.label": "Feltöltés...",
   "video.close": "Videó bezárása",
+  "video.download": "Fájl letöltése",
   "video.exit_fullscreen": "Kilépés teljes képernyőből",
   "video.expand": "Videó nagyítása",
   "video.fullscreen": "Teljes képernyő",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index a4c155dfe..1ad3cb0fd 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -1,32 +1,33 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "Աւելացնել կամ հեռացնել ցանկերից",
   "account.badges.bot": "Բոտ",
+  "account.badges.group": "Խումբ",
   "account.block": "Արգելափակել @{name}֊ին",
   "account.block_domain": "Թաքցնել ամենը հետեւյալ տիրույթից՝ {domain}",
-  "account.blocked": "Blocked",
-  "account.cancel_follow_request": "Cancel follow request",
+  "account.blocked": "Արգելափակուած է",
+  "account.cancel_follow_request": "չեղարկել հետեւելու հայցը",
   "account.direct": "Direct Message @{name}",
-  "account.domain_blocked": "Domain hidden",
+  "account.domain_blocked": "Թաքցրած տիրոյթ",
   "account.edit_profile": "Խմբագրել անձնական էջը",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "Ցուցադրել անձնական էջում",
   "account.follow": "Հետեւել",
   "account.followers": "Հետեւողներ",
-  "account.followers.empty": "No one follows this user yet.",
+  "account.followers.empty": "Այս օգտատիրոջը դեռ ոչ մէկ չի հետեւում։",
   "account.follows": "Հետեւում է",
-  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows.empty": "Այս օգտատէրն դեռ ոչ մէկի չի հետեւում։",
   "account.follows_you": "Հետեւում է քեզ",
   "account.hide_reblogs": "Թաքցնել @{name}֊ի տարածածները",
-  "account.last_status": "Last active",
-  "account.link_verified_on": "Ownership of this link was checked on {date}",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.last_status": "Վերջին անգամ ակտիւ էր",
+  "account.link_verified_on": "Սոյն յղման տիրապետումը ստուգուած է՝ {date}֊ին",
+  "account.locked_info": "Սոյն հաշուի գաղտնիութեան մակարդակը նշուած է որպէս՝ փակ։ Հաշուի տէրն ընտրում է, թէ ով կարող է հետեւել իրեն։",
   "account.media": "Մեդիա",
   "account.mention": "Նշել @{name}֊ին",
   "account.moved_to": "{name}֊ը տեղափոխվել է՝",
   "account.mute": "Լռեցնել @{name}֊ին",
   "account.mute_notifications": "Անջատել ծանուցումները @{name}֊ից",
-  "account.muted": "Muted",
-  "account.never_active": "Never",
-  "account.posts": "Գրառումներ",
+  "account.muted": "Լռեցուած",
+  "account.never_active": "Երբեք",
+  "account.posts": "Թութ",
   "account.posts_with_replies": "Toots with replies",
   "account.report": "Բողոքել @{name}֊ից",
   "account.requested": "Հաստատման կարիք ունի։ Սեղմիր՝ հետեւելու հայցը չեղարկելու համար։",
@@ -34,15 +35,16 @@
   "account.show_reblogs": "Ցուցադրել @{name}֊ի տարածածները",
   "account.unblock": "Ապաարգելափակել @{name}֊ին",
   "account.unblock_domain": "Ցուցադրել {domain} թաքցված տիրույթի գրառումները",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "Չցուցադրել անձնական էջում",
   "account.unfollow": "Չհետեւել",
   "account.unmute": "Ապալռեցնել @{name}֊ին",
   "account.unmute_notifications": "Միացնել ծանուցումները @{name}֊ից",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "alert.rate_limited.message": "Փորձէք  որոշ ժամանակ անց՝ {retry_time, time, medium}։",
   "alert.rate_limited.title": "Rate limited",
-  "alert.unexpected.message": "An unexpected error occurred.",
+  "alert.unexpected.message": "Անսպասելի սխալ տեղի ունեցաւ։",
   "alert.unexpected.title": "Վա՜յ",
-  "autosuggest_hashtag.per_week": "{count} per week",
+  "announcement.announcement": "Announcement",
+  "autosuggest_hashtag.per_week": "շաբաթը՝ {count}",
   "boost_modal.combo": "Կարող ես սեղմել {combo}՝ սա հաջորդ անգամ բաց թողնելու համար",
   "bundle_column_error.body": "Այս բաղադրիչը բեռնելու ընթացքում ինչ֊որ բան խափանվեց։",
   "bundle_column_error.retry": "Կրկին փորձել",
@@ -51,10 +53,11 @@
   "bundle_modal_error.message": "Այս բաղադրիչը բեռնելու ընթացքում ինչ֊որ բան խափանվեց։",
   "bundle_modal_error.retry": "Կրկին փորձել",
   "column.blocks": "Արգելափակված օգտատերեր",
+  "column.bookmarks": "Էջանիշեր",
   "column.community": "Տեղական հոսք",
-  "column.direct": "Direct messages",
-  "column.directory": "Browse profiles",
-  "column.domain_blocks": "Hidden domains",
+  "column.direct": "Հասցէագրուած հաղորդագրութիւններ",
+  "column.directory": "Զննել անձնական էջերը",
+  "column.domain_blocks": "Թաքցուած տիրոյթները",
   "column.favourites": "Հավանածներ",
   "column.follow_requests": "Հետեւելու հայցեր",
   "column.home": "Հիմնական",
@@ -78,20 +81,22 @@
   "compose_form.lock_disclaimer": "Քո հաշիվը {locked} չէ։ Յուրաքանչյուր ոք կարող է հետեւել քեզ եւ տեսնել միայն հետեւողների համար նախատեսված գրառումները։",
   "compose_form.lock_disclaimer.lock": "փակ",
   "compose_form.placeholder": "Ի՞նչ կա մտքիդ",
-  "compose_form.poll.add_option": "Add a choice",
-  "compose_form.poll.duration": "Poll duration",
-  "compose_form.poll.option_placeholder": "Choice {number}",
-  "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.add_option": "Աւելացնել տարբերակ",
+  "compose_form.poll.duration": "Հարցման տեւողութիւնը",
+  "compose_form.poll.option_placeholder": "Տարբերակ {number}",
+  "compose_form.poll.remove_option": "Հեռացնել այս տարբերակը",
+  "compose_form.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_loud": "Թթե՜լ",
-  "compose_form.sensitive.hide": "Mark media as sensitive",
-  "compose_form.sensitive.marked": "Media is marked as sensitive",
-  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
-  "compose_form.spoiler.marked": "Text is hidden behind warning",
-  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.sensitive.hide": "Նշել մեդիան որպէս դիւրազգաց",
+  "compose_form.sensitive.marked": "Մեդիան նշուած է որպէս դիւրազգաց",
+  "compose_form.sensitive.unmarked": "Մեդիան նշուած չէ որպէս դիւրազգաց",
+  "compose_form.spoiler.marked": "Տեքստը թաքցուած է զգուշացման ետեւում",
+  "compose_form.spoiler.unmarked": "Տեքստը թաքցուած չէ",
   "compose_form.spoiler_placeholder": "Գրիր նախազգուշացումդ այստեղ",
   "confirmation_modal.cancel": "Չեղարկել",
-  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.block_and_report": "Արգելափակել եւ բողոքել",
   "confirmations.block.confirm": "Արգելափակել",
   "confirmations.block.message": "Վստա՞հ ես, որ ուզում ես արգելափակել {name}֊ին։",
   "confirmations.delete.confirm": "Ջնջել",
@@ -101,24 +106,24 @@
   "confirmations.domain_block.confirm": "Թաքցնել ամբողջ տիրույթը",
   "confirmations.domain_block.message": "Հաստատ֊հաստա՞տ վստահ ես, որ ուզում ես արգելափակել ամբողջ {domain} տիրույթը։ Սովորաբար մի երկու թիրախավորված արգելափակում կամ լռեցում բավական է ու նախընտրելի։",
   "confirmations.logout.confirm": "Ելք",
-  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.logout.message": "Համոզո՞ւած ես, որ ուզում ես դուրս գալ",
   "confirmations.mute.confirm": "Լռեցնել",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "Սա թաքցնելու ա իրենց գրառումներն, ինչպէս նաեւ իրենց նշող գրառումներն, բայց իրենք միեւնոյն է կը կարողանան հետեւել ձեզ եւ տեսնել ձեր գրառումները։",
   "confirmations.mute.message": "Վստա՞հ ես, որ ուզում ես {name}֊ին լռեցնել։",
-  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.redraft.confirm": "Ջնջել եւ խմբագրել նորից",
   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
-  "confirmations.reply.confirm": "Reply",
-  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+  "confirmations.reply.confirm": "Պատասխանել",
+  "confirmations.reply.message": "Այս պահին պատասխանելը կը չեղարկի ձեր՝ այս պահին անաւարտ հաղորդագրութիւնը։ Համոզուա՞ծ էք։",
   "confirmations.unfollow.confirm": "Ապահետեւել",
   "confirmations.unfollow.message": "Վստա՞հ ես, որ ուզում ես այլեւս չհետեւել {name}֊ին։",
-  "conversation.delete": "Delete conversation",
-  "conversation.mark_as_read": "Mark as read",
-  "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
+  "conversation.delete": "Ջնջել խօսակցութիւնը",
+  "conversation.mark_as_read": "Նշել որպէս ընթերցուած",
+  "conversation.open": "Դիտել խօսակցութիւնը",
+  "conversation.with": "{names}֊երի հետ",
+  "directory.federated": "Յայտնի դաշնեզերքից",
+  "directory.local": "{domain} տիրոյթից միայն",
+  "directory.new_arrivals": "Նորութիւններ",
+  "directory.recently_active": "Վերջերս ակտիւ",
   "embed.instructions": "Այս թութը քո կայքում ներդնելու համար կարող ես պատճենել ներքոհիշյալ կոդը։",
   "embed.preview": "Ահա, թե ինչ տեսք կունենա այն՝",
   "emoji_button.activity": "Զբաղմունքներ",
@@ -135,45 +140,46 @@
   "emoji_button.search_results": "Որոնման արդյունքներ",
   "emoji_button.symbols": "Նշաններ",
   "emoji_button.travel": "Ուղեւորություն եւ տեղանքներ",
-  "empty_column.account_timeline": "No toots here!",
-  "empty_column.account_unavailable": "Profile unavailable",
-  "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.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.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
-  "empty_column.domain_blocks": "There are no hidden domains yet.",
-  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
-  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
+  "empty_column.direct": "Դու դեռ չունես ոչ մի հասցէագրուած հաղորդագրութիւն։ Երբ ուղարկես կամ ստանաս որեւէ անձնական նամակ, այն այստեղ կերեւայ։",
+  "empty_column.domain_blocks": "Թաքցուած տիրոյթներ դեռ չկան։",
+  "empty_column.favourited_statuses": "Դու դեռ չունես որեւէ հաւանած թութ։ Երբ հաւանես, դրանք կերեւան այստեղ։",
+  "empty_column.favourites": "Այս թութը ոչ մէկ դեռ չի հաւանել։ Հաւանողները կերեւան այստեղ, երբ նշեն թութը հաւանած։",
   "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
   "empty_column.hashtag": "Այս պիտակով դեռ ոչինչ չկա։",
   "empty_column.home": "Քո հիմնական հոսքը դատա՛րկ է։ Այցելի՛ր {public}ը կամ օգտվիր որոնումից՝ այլ մարդկանց հանդիպելու համար։",
   "empty_column.home.public_timeline": "հրապարակային հոսք",
   "empty_column.list": "Այս ցանկում դեռ ոչինչ չկա։ Երբ ցանկի անդամներից որեւէ մեկը նոր թութ գրի, այն կհայտնվի այստեղ։",
   "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
-  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.mutes": "Առայժմ ոչ ոքի չեք արգելափակել։",
   "empty_column.notifications": "Ոչ մի ծանուցում դեռ չունես։ Բզիր մյուսներին՝ խոսակցությունը սկսելու համար։",
   "empty_column.public": "Այստեղ բան չկա՛։ Հրապարակային մի բան գրիր կամ հետեւիր այլ հանգույցներից էակների՝ այն լցնելու համար։",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
   "error.unexpected_crash.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.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "errors.unexpected_crash.report_issue": "Զեկուցել խնդրի մասին",
   "follow_request.authorize": "Վավերացնել",
   "follow_request.reject": "Մերժել",
-  "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
-  "getting_started.documentation": "Documentation",
+  "getting_started.developers": "Մշակողներ",
+  "getting_started.directory": "Պրոֆիլի տեղադրավայրը",
+  "getting_started.documentation": "Փաստաթղթեր",
   "getting_started.heading": "Ինչպես սկսել",
-  "getting_started.invite": "Invite people",
+  "getting_started.invite": "Հրավիրել մարդկանց",
   "getting_started.open_source_notice": "Մաստոդոնը բաց ելատեքստով ծրագրակազմ է։ Կարող ես ներդրում անել կամ վրեպներ զեկուցել ԳիթՀաբում՝ {github}։",
-  "getting_started.security": "Security",
-  "getting_started.terms": "Terms of service",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
+  "getting_started.security": "Հաշվի կարգավորումներ",
+  "getting_started.terms": "Ծառայության պայմանները",
+  "hashtag.column_header.tag_mode.all": "և {additional}",
+  "hashtag.column_header.tag_mode.any": "կամ {additional}",
+  "hashtag.column_header.tag_mode.none": "առանց {additional}",
   "hashtag.column_settings.select.no_options_message": "No suggestions found",
   "hashtag.column_settings.select.placeholder": "Enter hashtags…",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_settings.tag_mode.all": "Բոլորը",
+  "hashtag.column_settings.tag_mode.any": "Ցանկացածը",
+  "hashtag.column_settings.tag_mode.none": "Ոչ մեկը",
   "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
   "home.column_settings.basic": "Հիմնական",
   "home.column_settings.show_reblogs": "Ցուցադրել տարածածները",
@@ -181,25 +187,25 @@
   "intervals.full.days": "{number, plural, one {# day} other {# days}}",
   "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
   "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
-  "introduction.federation.action": "Next",
+  "introduction.federation.action": "Հաջորդ",
   "introduction.federation.federated.headline": "Federated",
   "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
-  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.headline": "Հիմնական",
   "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
-  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.headline": "Տեղային",
   "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
   "introduction.interactions.action": "Finish toot-orial!",
-  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.favourite.headline": "Նախընտրելի",
   "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.headline": "Տարածել",
   "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.headline": "Պատասխանել",
   "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.action": "Գնացի՜նք։",
+  "introduction.welcome.headline": "Առաջին քայլեր",
   "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
   "keyboard_shortcuts.back": "ետ նավարկելու համար",
-  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.blocked": "արգելափակված օգտատերերի ցանկը բացելու համար",
   "keyboard_shortcuts.boost": "տարածելու համար",
   "keyboard_shortcuts.column": "սյուներից մեկի վրա սեւեռվելու համար",
   "keyboard_shortcuts.compose": "շարադրման տիրույթին սեւեռվելու համար",
@@ -219,26 +225,27 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
-  "keyboard_shortcuts.pinned": "to open pinned toots list",
-  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.open_media": "to open media",
+  "keyboard_shortcuts.pinned": "ամրացուած թթերի ցանկը բացելու համար",
+  "keyboard_shortcuts.profile": "հեղինակի անձնական էջը բացելու համար",
   "keyboard_shortcuts.reply": "պատասխանելու համար",
-  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.requests": "հետեւելու հայցերի ցանկը դիտելու համար",
   "keyboard_shortcuts.search": "որոնման դաշտին սեւեռվելու համար",
-  "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.start": "«սկսել» սիւնակը բացելու համար",
+  "keyboard_shortcuts.toggle_hidden": "CW֊ի ետեւի տեքստը ցուցադրել֊թաքցնելու համար",
+  "keyboard_shortcuts.toggle_sensitivity": "մեդիան ցուցադրել֊թաքցնելու համար",
   "keyboard_shortcuts.toot": "թարմ թութ սկսելու համար",
   "keyboard_shortcuts.unfocus": "տեքստի/որոնման տիրույթից ապասեւեռվելու համար",
   "keyboard_shortcuts.up": "ցանկով վերեւ շարժվելու համար",
   "lightbox.close": "Փակել",
   "lightbox.next": "Հաջորդ",
   "lightbox.previous": "Նախորդ",
-  "lightbox.view_context": "View context",
+  "lightbox.view_context": "Տեսնել ենթատեքստը",
   "lists.account.add": "Ավելացնել ցանկին",
   "lists.account.remove": "Հանել ցանկից",
   "lists.delete": "Ջնջել ցանկը",
   "lists.edit": "Փոփոխել ցանկը",
-  "lists.edit.submit": "Change title",
+  "lists.edit.submit": "Փոխել վերնագիրը",
   "lists.new.create": "Ավելացնել ցանկ",
   "lists.new.title_placeholder": "Նոր ցանկի վերնագիր",
   "lists.search": "Փնտրել քո հետեւած մարդկանց մեջ",
@@ -247,20 +254,21 @@
   "loading_indicator.label": "Բեռնվում է…",
   "media_gallery.toggle_visible": "Ցուցադրել/թաքցնել",
   "missing_indicator.label": "Չգտնվեց",
-  "missing_indicator.sublabel": "This resource could not be found",
+  "missing_indicator.sublabel": "Պաշարը չի գտնւում",
   "mute_modal.hide_notifications": "Թաքցնե՞լ ցանուցումներն այս օգտատիրոջից։",
-  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.apps": "Դիւրակիր յաւելուածներ",
   "navigation_bar.blocks": "Արգելափակված օգտատերեր",
+  "navigation_bar.bookmarks": "Էջանիշեր",
   "navigation_bar.community_timeline": "Տեղական հոսք",
-  "navigation_bar.compose": "Compose new toot",
-  "navigation_bar.direct": "Direct messages",
-  "navigation_bar.discover": "Discover",
-  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.compose": "Գրել նոր թութ",
+  "navigation_bar.direct": "Հասցէագրուած",
+  "navigation_bar.discover": "Բացայայտել",
+  "navigation_bar.domain_blocks": "Թաքցուած տիրոյթներ",
   "navigation_bar.edit_profile": "Խմբագրել անձնական էջը",
   "navigation_bar.favourites": "Հավանածներ",
-  "navigation_bar.filters": "Muted words",
+  "navigation_bar.filters": "Լռեցուած բառեր",
   "navigation_bar.follow_requests": "Հետեւելու հայցեր",
-  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.follows_and_followers": "Հետեւածներ եւ հետեւողներ",
   "navigation_bar.info": "Այս հանգույցի մասին",
   "navigation_bar.keyboard_shortcuts": "Ստեղնաշարի կարճատներ",
   "navigation_bar.lists": "Ցանկեր",
@@ -273,38 +281,41 @@
   "navigation_bar.security": "Անվտանգություն",
   "notification.favourite": "{name} հավանեց թութդ",
   "notification.follow": "{name} սկսեց հետեւել քեզ",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} նշեց քեզ",
-  "notification.poll": "A poll you have voted in has ended",
+  "notification.own_poll": "Հարցումդ աւարտուեց",
+  "notification.poll": "Հարցումը, ուր դու քուէարկել ես, աւարտուեց։",
   "notification.reblog": "{name} տարածեց թութդ",
   "notifications.clear": "Մաքրել ծանուցումները",
   "notifications.clear_confirmation": "Վստա՞հ ես, որ ուզում ես մշտապես մաքրել քո բոլոր ծանուցումները։",
   "notifications.column_settings.alert": "Աշխատատիրույթի ծանուցումներ",
   "notifications.column_settings.favourite": "Հավանածներից՝",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.advanced": "Ցուցադրել բոլոր կատեգորիաները",
+  "notifications.column_settings.filter_bar.category": "Արագ զտման վահանակ",
+  "notifications.column_settings.filter_bar.show": "Ցուցադրել",
   "notifications.column_settings.follow": "Նոր հետեւողներ՝",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Նշումներ՝",
-  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.poll": "Հարցման արդիւնքները՝",
   "notifications.column_settings.push": "Հրելու ծանուցումներ",
   "notifications.column_settings.reblog": "Տարածածներից՝",
   "notifications.column_settings.show": "Ցուցադրել սյունում",
   "notifications.column_settings.sound": "Ձայն հանել",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
-  "notifications.filter.polls": "Poll results",
-  "notifications.group": "{count} notifications",
-  "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
+  "notifications.filter.all": "Բոլորը",
+  "notifications.filter.boosts": "Տարածածները",
+  "notifications.filter.favourites": "Հաւանածները",
+  "notifications.filter.follows": "Հետեւածները",
+  "notifications.filter.mentions": "Նշումները",
+  "notifications.filter.polls": "Հարցման արդիւնքները",
+  "notifications.group": "{count} ծանուցում",
+  "poll.closed": "Փակ",
+  "poll.refresh": "Թարմացնել",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
   "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Vote",
-  "poll.voted": "You voted for this answer",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll.vote": "Քուէարկել",
+  "poll.voted": "Դու քուէարկել ես այս տարբերակի համար",
+  "poll_button.add_poll": "Աւելացնել հարցում",
+  "poll_button.remove_poll": "Հեռացնել հարցումը",
   "privacy.change": "Կարգավորել թթի գաղտնիությունը",
   "privacy.direct.long": "Թթել միայն նշված օգտատերերի համար",
   "privacy.direct.short": "Հասցեագրված",
@@ -314,37 +325,38 @@
   "privacy.public.short": "Հրապարակային",
   "privacy.unlisted.long": "Չթթել հրապարակային հոսքերում",
   "privacy.unlisted.short": "Ծածուկ",
-  "refresh": "Refresh",
-  "regeneration_indicator.label": "Loading…",
-  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "refresh": "Թարմացնել",
+  "regeneration_indicator.label": "Բեռնւում է…",
+  "regeneration_indicator.sublabel": "պատրաստւում է հիմնական հոսքդ",
   "relative_time.days": "{number}օր",
   "relative_time.hours": "{number}ժ",
   "relative_time.just_now": "նոր",
   "relative_time.minutes": "{number}ր",
   "relative_time.seconds": "{number}վ",
   "reply_indicator.cancel": "Չեղարկել",
-  "report.forward": "Forward to {target}",
-  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.forward": "Փոխանցել {target}֊ին",
+  "report.forward_hint": "Այս հաշիւ այլ հանգոյցից է։ Ուղարկե՞մ այնտեղ էլ այս բողոքի անոնիմ պատճէնը։",
   "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
   "report.placeholder": "Լրացուցիչ մեկնաբանություններ",
   "report.submit": "Ուղարկել",
   "report.target": "Բողոքել {target}֊ի մասին",
   "search.placeholder": "Փնտրել",
   "search_popout.search_format": "Փնտրելու առաջադեմ ձեւ",
-  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.full_text": "Պարզ տեքստը վերադարձնում է գրառումներդ, հաւանածներդ, տարածածներդ, որտեղ ես նշուած եղել, ինչպէս նաեւ նման օգտանուններ, անուններ եւ պիտակներ։",
   "search_popout.tips.hashtag": "պիտակ",
   "search_popout.tips.status": "թութ",
   "search_popout.tips.text": "Հասարակ տեքստը կվերադարձնի համընկնող անուններ, օգտանուններ ու պիտակներ",
   "search_popout.tips.user": "օգտատեր",
   "search_results.accounts": "Մարդիկ",
-  "search_results.hashtags": "Hashtags",
-  "search_results.statuses": "Toots",
-  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+  "search_results.hashtags": "Պիտակներ",
+  "search_results.statuses": "Թթեր",
+  "search_results.statuses_fts_disabled": "Այս հանգոյցում միացուած չէ ըստ բովանդակութեան թթեր փնտրելու հնարաւորութիւնը։",
   "search_results.total": "{count, number} {count, plural, one {արդյունք} other {արդյունք}}",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Բացել @{name} օգտատիրոջ մոդերացիայի դիմերէսը։",
+  "status.admin_status": "Բացել այս գրառումը մոդերատորի դիմերէսի մէջ",
   "status.block": "Արգելափակել @{name}֊ին",
-  "status.cancel_reblog_private": "Unboost",
+  "status.bookmark": "Էջանիշ",
+  "status.cancel_reblog_private": "Ապատարածել",
   "status.cannot_reblog": "Այս թութը չի կարող տարածվել",
   "status.copy": "Copy link to status",
   "status.delete": "Ջնջել",
@@ -352,7 +364,7 @@
   "status.direct": "Direct message @{name}",
   "status.embed": "Ներդնել",
   "status.favourite": "Հավանել",
-  "status.filtered": "Filtered",
+  "status.filtered": "Զտված",
   "status.load_more": "Բեռնել ավելին",
   "status.media_hidden": "մեդիաբովանդակությունը թաքցված է",
   "status.mention": "Նշել @{name}֊ին",
@@ -362,12 +374,13 @@
   "status.open": "Ընդարձակել այս թութը",
   "status.pin": "Ամրացնել անձնական էջում",
   "status.pinned": "Pinned toot",
-  "status.read_more": "Read more",
+  "status.read_more": "Կարդալ ավելին",
   "status.reblog": "Տարածել",
   "status.reblog_private": "Boost to original audience",
   "status.reblogged_by": "{name} տարածել է",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Պատասխանել",
   "status.replyAll": "Պատասխանել թելին",
   "status.report": "Բողոքել @{name}֊ից",
@@ -378,7 +391,7 @@
   "status.show_more": "Ավելին",
   "status.show_more_all": "Show more for all",
   "status.show_thread": "Show thread",
-  "status.uncached_media_warning": "Not available",
+  "status.uncached_media_warning": "Անհասանելի",
   "status.unmute_conversation": "Ապալռեցնել խոսակցությունը",
   "status.unpin": "Հանել անձնական էջից",
   "suggestions.dismiss": "Dismiss suggestion",
@@ -389,29 +402,32 @@
   "tabs_bar.notifications": "Ծանուցումներ",
   "tabs_bar.search": "Փնտրել",
   "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
-  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
-  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
+  "time_remaining.hours": "{number, plural, one {# ժամ} other {# ժամ}} անց",
+  "time_remaining.minutes": "{number, plural, one {# րոպե} other {# րոպե}} անց",
   "time_remaining.moments": "Moments remaining",
-  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "time_remaining.seconds": "{number, plural, one {# վայրկյան} other {# վայրկյան}} անց",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
-  "trends.trending_now": "Trending now",
+  "trends.trending_now": "Այժմ արդիական",
   "ui.beforeunload": "Քո սեւագիրը կկորի, եթե լքես Մաստոդոնը։",
   "upload_area.title": "Քաշիր ու նետիր՝ վերբեռնելու համար",
   "upload_button.label": "Ավելացնել մեդիա",
-  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.limit": "Ֆայլի վերբեռնման սահմանաչափը գերազանցված է։",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Նկարագրություն ավելացրու տեսողական խնդիրներ ունեցողների համար",
-  "upload_form.edit": "Edit",
+  "upload_form.edit": "Խմբագրել",
   "upload_form.undo": "Հետարկել",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
-  "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_form.video_description": "Describe for people with hearing loss or visual impairment",
+  "upload_modal.analyzing_picture": "Լուսանկարի վերլուծում…",
+  "upload_modal.apply": "Կիրառել",
+  "upload_modal.description_placeholder": "Ճկուն շագանակագույն աղվեսը ցատկում է ծույլ շան վրայով",
+  "upload_modal.detect_text": "Հայտնբերել տեքստը նկարից",
+  "upload_modal.edit_media": "Խմբագրել մեդիան",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_modal.preview_label": "Նախադիտում ({ratio})",
   "upload_progress.label": "Վերբեռնվում է…",
   "video.close": "Փակել  տեսագրությունը",
+  "video.download": "Ներբեռնել ֆայլը",
   "video.exit_fullscreen": "Անջատել լիաէկրան դիտումը",
   "video.expand": "Ընդարձակել տեսագրությունը",
   "video.fullscreen": "Լիաէկրան",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 167c2a766..b1605ac60 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Tambah atau Hapus dari daftar",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Grup",
   "account.block": "Blokir @{name}",
   "account.block_domain": "Sembunyikan segalanya dari {domain}",
   "account.blocked": "Terblokir",
@@ -39,9 +40,10 @@
   "account.unmute": "Berhenti membisukan @{name}",
   "account.unmute_notifications": "Munculkan notifikasi dari @{name}",
   "alert.rate_limited.message": "Tolong ulangi setelah {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.title": "Batasan tingkat",
   "alert.unexpected.message": "Terjadi kesalahan yang tidak terduga.",
   "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per minggu",
   "boost_modal.combo": "Anda dapat menekan {combo} untuk melewati ini",
   "bundle_column_error.body": "Kesalahan terjadi saat memuat komponen ini.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Kesalahan terjadi saat memuat komponen ini.",
   "bundle_modal_error.retry": "Coba lagi",
   "column.blocks": "Pengguna diblokir",
+  "column.bookmarks": "Markah",
   "column.community": "Linimasa Lokal",
   "column.direct": "Pesan langsung",
   "column.directory": "Jelajahi profil",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Durasi jajak pendapat",
   "compose_form.poll.option_placeholder": "Pilihan {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Tandai sebagai media sensitif",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Tidak ada toot di sini!",
   "empty_column.account_unavailable": "Profil tidak tersedia",
   "empty_column.blocks": "Anda belum memblokir siapapun.",
+  "empty_column.bookmarked_statuses": "Anda belum memiliki toot termarkah. Saat Anda menandainya sebagai markah, ia akan muncul di sini.",
   "empty_column.community": "Linimasa lokal masih kosong. Tulis sesuatu secara publik dan buat roda berputar!",
   "empty_column.direct": "Anda belum memiliki pesan langsung. Ketika Anda mengirim atau menerimanya, maka akan muncul di sini.",
   "empty_column.domain_blocks": "Tidak ada topik tersembunyi.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "buka daftar pengguna terbisukan",
   "keyboard_shortcuts.my_profile": "buka profil Anda",
   "keyboard_shortcuts.notifications": "buka kolom notifikasi",
+  "keyboard_shortcuts.open_media": "membuka media",
   "keyboard_shortcuts.pinned": "buka daftar toot tersemat",
   "keyboard_shortcuts.profile": "buka profil pencipta",
   "keyboard_shortcuts.reply": "balas",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Sembunyikan notifikasi dari pengguna ini?",
   "navigation_bar.apps": "Aplikasi mobile",
   "navigation_bar.blocks": "Pengguna diblokir",
+  "navigation_bar.bookmarks": "Markah",
   "navigation_bar.community_timeline": "Linimasa lokal",
   "navigation_bar.compose": "Tulis toot baru",
   "navigation_bar.direct": "Pesan langsung",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Keamanan",
   "notification.favourite": "{name} menyukai status anda",
   "notification.follow": "{name} mengikuti anda",
+  "notification.follow_request": "{name} ingin mengikuti Anda",
   "notification.mention": "{name} menyebut Anda",
+  "notification.own_poll": "Japat Anda telah berakhir",
   "notification.poll": "Japat yang Anda ikuti telah berakhir",
   "notification.reblog": "{name} mem-boost status anda",
   "notifications.clear": "Hapus notifikasi",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Bilah penyaring cepat",
   "notifications.column_settings.filter_bar.show": "Tampilkan",
   "notifications.column_settings.follow": "Pengikut baru:",
+  "notifications.column_settings.follow_request": "Permintaan mengikuti baru:",
   "notifications.column_settings.mention": "Balasan:",
   "notifications.column_settings.poll": "Hasil japat:",
   "notifications.column_settings.push": "Notifikasi dorong",
@@ -344,6 +355,7 @@
   "status.admin_account": "Buka antar muka moderasi untuk @{name}",
   "status.admin_status": "Buka status ini dalam antar muka moderasi",
   "status.block": "Blokir @{name}",
+  "status.bookmark": "Markah",
   "status.cancel_reblog_private": "Batalkan boost",
   "status.cannot_reblog": "Pos ini tak dapat di-boost",
   "status.copy": "Salin tautan ke status",
@@ -368,15 +380,16 @@
   "status.reblogged_by": "di-boost {name}",
   "status.reblogs.empty": "Belum ada yang mem-boost toot ini. Ketika seseorang melakukannya, maka akan muncul di sini.",
   "status.redraft": "Hapus & redraf",
+  "status.remove_bookmark": "Hapus markah",
   "status.reply": "Balas",
   "status.replyAll": "Balas ke semua",
   "status.report": "Laporkan @{name}",
   "status.sensitive_warning": "Konten sensitif",
   "status.share": "Bagikan",
   "status.show_less": "Tampilkan lebih sedikit",
-  "status.show_less_all": "Show less for all",
+  "status.show_less_all": "Tampilkan lebih sedikit",
   "status.show_more": "Tampilkan semua",
-  "status.show_more_all": "Show more for all",
+  "status.show_more_all": "Tampilkan lebih banyak",
   "status.show_thread": "Tampilkan utas",
   "status.uncached_media_warning": "Tak tersedia",
   "status.unmute_conversation": "Bunyikan percakapan",
@@ -400,9 +413,11 @@
   "upload_button.label": "Tambahkan media",
   "upload_error.limit": "Batas unggah berkas terlampaui.",
   "upload_error.poll": "Unggah berkas tak diizinkan di japat ini.",
+  "upload_form.audio_description": "Penjelasan untuk orang dengan gangguan pendengaran",
   "upload_form.description": "Deskripsikan untuk mereka yang tidak bisa melihat dengan jelas",
   "upload_form.edit": "Sunting",
   "upload_form.undo": "Undo",
+  "upload_form.video_description": "Penjelasan untuk orang dengan gangguan pendengaran atau penglihatan",
   "upload_modal.analyzing_picture": "Analisis gambar…",
   "upload_modal.apply": "Terapkan",
   "upload_modal.description_placeholder": "Muharjo seorang xenofobia universal yang takut pada warga jazirah, contohnya Qatar",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Pratinjau ({ratio})",
   "upload_progress.label": "Mengunggah...",
   "video.close": "Tutup video",
+  "video.download": "Unduh berkas",
   "video.exit_fullscreen": "Keluar dari layar penuh",
   "video.expand": "Perbesar video",
   "video.fullscreen": "Layar penuh",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 076835218..36bf1a588 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Add or Remove from lists",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Group",
   "account.block": "Blokusar @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "Tu povas presar sur {combo} por omisar co en la venonta foyo",
   "bundle_column_error.body": "Something went wrong while loading this component.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Something went wrong while loading this component.",
   "bundle_modal_error.retry": "Try again",
   "column.blocks": "Blokusita uzeri",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Lokala tempolineo",
   "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "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": "Siflar",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "La lokala tempolineo esas vakua. Skribez ulo publike por iniciar la agiveso!",
   "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "to reply",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokusita uzeri",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Lokala tempolineo",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} favorizis tua mesajo",
   "notification.follow": "{name} sequeskis tu",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mencionis tu",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} repetis tua mesajo",
   "notifications.clear": "Efacar savigi",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Nova sequanti:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mencioni:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
@@ -344,6 +355,7 @@
   "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",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} repetita",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Respondar",
   "status.replyAll": "Respondar a filo",
   "status.report": "Denuncar @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Adjuntar kontenajo",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "Edit",
   "upload_form.undo": "Desfacar",
+  "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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Kargante...",
   "video.close": "Close video",
+  "video.download": "Download file",
   "video.exit_fullscreen": "Exit full screen",
   "video.expand": "Expand video",
   "video.fullscreen": "Full screen",
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
new file mode 100644
index 000000000..53b2a150a
--- /dev/null
+++ b/app/javascript/mastodon/locales/is.json
@@ -0,0 +1,439 @@
+{
+  "account.add_or_remove_from_list": "Bæta á eða fjarlægja af listum",
+  "account.badges.bot": "Róbót",
+  "account.badges.group": "Hópur",
+  "account.block": "Útiloka @{name}",
+  "account.block_domain": "Fela allt frá {domain}",
+  "account.blocked": "Útilokaður",
+  "account.cancel_follow_request": "Hætta við beiðni um að fylgjast með",
+  "account.direct": "Bein skilaboð til @{name}",
+  "account.domain_blocked": "Lén falið",
+  "account.edit_profile": "Breyta notandasniði",
+  "account.endorse": "Birta á notandasniði",
+  "account.follow": "Fylgjast með",
+  "account.followers": "Fylgjendur",
+  "account.followers.empty": "Ennþá fylgist enginn með þessum notanda.",
+  "account.follows": "Fylgist með",
+  "account.follows.empty": "Þessi notandi fylgist ennþá ekki með neinum.",
+  "account.follows_you": "Fylgir þér",
+  "account.hide_reblogs": "Fela endurbirtingar fyrir @{name}",
+  "account.last_status": "Síðasta virkni",
+  "account.link_verified_on": "Eignarhald á þessum tengli var athugað þann {date}",
+  "account.locked_info": "Staða gagnaleyndar á þessum aðgangi er stillt á læsingu. Eigandinn yfirfer handvirkt hverjir geti fylgst með honum.",
+  "account.media": "Myndskrár",
+  "account.mention": "Minnast á @{name}",
+  "account.moved_to": "{name} hefur verið færður til:",
+  "account.mute": "Þagga niður í @{name}",
+  "account.mute_notifications": "Þagga tilkynningar frá @{name}",
+  "account.muted": "Þaggað",
+  "account.never_active": "Aldrei",
+  "account.posts": "Tíst",
+  "account.posts_with_replies": "Tíst og svör",
+  "account.report": "Kæra @{name}",
+  "account.requested": "Bíður eftir samþykki. Smelltu til að hætta við beiðni um að fylgjast með",
+  "account.share": "Deila notandasniði fyrir @{name}",
+  "account.show_reblogs": "Sýna endurbirtingar frá @{name}",
+  "account.unblock": "Aflétta útilokun af @{name}",
+  "account.unblock_domain": "Hætta að fela {domain}",
+  "account.unendorse": "Ekki birta á notandasniði",
+  "account.unfollow": "Hætta að fylgja",
+  "account.unmute": "Hætta að þagga niður í @{name}",
+  "account.unmute_notifications": "Hætta að þagga tilkynningar frá @{name}",
+  "alert.rate_limited.message": "Prófaðu aftur eftir {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Með takmörkum",
+  "alert.unexpected.message": "Upp kom óvænt villa.",
+  "alert.unexpected.title": "Úbbs!",
+  "announcement.announcement": "Announcement",
+  "autosuggest_hashtag.per_week": "{count} á viku",
+  "boost_modal.combo": "Þú getur ýtt á {combo} til að sleppa þessu næst",
+  "bundle_column_error.body": "Eitthvað fór úrskeiðis við að hlaða inn þessari einingu.",
+  "bundle_column_error.retry": "Reyndu aftur",
+  "bundle_column_error.title": "Villa í netkerfi",
+  "bundle_modal_error.close": "Loka",
+  "bundle_modal_error.message": "Eitthvað fór úrskeiðis við að hlaða inn þessari einingu.",
+  "bundle_modal_error.retry": "Reyndu aftur",
+  "column.blocks": "Útilokaðir notendur",
+  "column.bookmarks": "Bókamerki",
+  "column.community": "Staðvær tímalína",
+  "column.direct": "Bein skilaboð",
+  "column.directory": "Skoða notandasnið",
+  "column.domain_blocks": "Falin lén",
+  "column.favourites": "Eftirlæti",
+  "column.follow_requests": "Fylgja beiðnum",
+  "column.home": "Heim",
+  "column.lists": "Listar",
+  "column.mutes": "Þaggaðir notendur",
+  "column.notifications": "Tilkynningar",
+  "column.pins": "Föst tíst",
+  "column.public": "Sameiginleg tímalína",
+  "column_back_button.label": "Til baka",
+  "column_header.hide_settings": "Fela stillingar",
+  "column_header.moveLeft_settings": "Færa dálk til vinstri",
+  "column_header.moveRight_settings": "Færa dálk til hægri",
+  "column_header.pin": "Festa",
+  "column_header.show_settings": "Birta stillingar",
+  "column_header.unpin": "Losa",
+  "column_subheading.settings": "Stillingar",
+  "community.column_settings.media_only": "Einungis myndskrár",
+  "compose_form.direct_message_warning": "Þetta tíst verður aðeins sent á notendur sem minnst er á.",
+  "compose_form.direct_message_warning_learn_more": "Kanna nánar",
+  "compose_form.hashtag_warning": "Þetta tíst verður ekki talið með undir nokkru myllumerki þar sem það er óskráð. Einungis er hægt að leita að opinberum tístum eftir myllumerkjum.",
+  "compose_form.lock_disclaimer": "Aðgangurinn þinn er ekki {locked}. Hver sem er getur fylgst með þeim færslum þínum sem einungis eru til fylgjenda þinna.",
+  "compose_form.lock_disclaimer.lock": "læst",
+  "compose_form.placeholder": "Hvað varstu að hugsa?",
+  "compose_form.poll.add_option": "Bæta við valkosti",
+  "compose_form.poll.duration": "Tímalengd könnunar",
+  "compose_form.poll.option_placeholder": "Valkostur {number}",
+  "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_loud": "{publish}!",
+  "compose_form.sensitive.hide": "Merkja myndir sem viðkvæmar",
+  "compose_form.sensitive.marked": "Mynd er merkt sem viðkvæm",
+  "compose_form.sensitive.unmarked": "Mynd er ekki merkt sem viðkvæm",
+  "compose_form.spoiler.marked": "Texti er falinn á bak við aðvörun",
+  "compose_form.spoiler.unmarked": "Texti er ekki falinn",
+  "compose_form.spoiler_placeholder": "Skrifaðu aðvörunina þína hér",
+  "confirmation_modal.cancel": "Hætta við",
+  "confirmations.block.block_and_report": "Útiloka og kæra",
+  "confirmations.block.confirm": "Útiloka",
+  "confirmations.block.message": "Ertu viss um að þú viljir loka á {name}?",
+  "confirmations.delete.confirm": "Eyða",
+  "confirmations.delete.message": "Ertu viss um að þú viljir eyða þessari stöðufærslu?",
+  "confirmations.delete_list.confirm": "Eyða",
+  "confirmations.delete_list.message": "Ertu viss um að þú viljir eyða þessum lista endanlega?",
+  "confirmations.domain_block.confirm": "Fela allt lénið",
+  "confirmations.domain_block.message": "Ertu alveg algjörlega viss um að þú viljir loka á allt {domain}? Í flestum tilfellum er vænlegra að nota færri en markvissari útilokanir eða að þagga niður tiltekna aðila. Þú munt ekki sjá efni frá þessu léni í neinum opinberum tímalínum eða í tilkynningunum þínum. Fylgjendur þínir frá þessu léni verða fjarlægðir.",
+  "confirmations.logout.confirm": "Skrá út",
+  "confirmations.logout.message": "Ertu viss um að þú viljir skrá þig út?",
+  "confirmations.mute.confirm": "Þagga",
+  "confirmations.mute.explanation": "Þetta mun fela færslur frá þeim og þær færslur þar sem minnst er á þau, en það mun samt sem áður gera þeim kleift að sjá færslurnar þínar og að fylgjast með þér.",
+  "confirmations.mute.message": "Ertu viss um að þú viljir þagga niður í {name}?",
+  "confirmations.redraft.confirm": "Eyða og enduvinna drög",
+  "confirmations.redraft.message": "Ertu viss um að þú viljir eyða þessari stöðufærslu og enduvinna drögin? Eftirlæti og endurbirtingar munu tapast og svör við upprunalegu fæerslunni munu verða munaðarlaus.",
+  "confirmations.reply.confirm": "Svara",
+  "confirmations.reply.message": "Ef þú svarar núna verður skrifað yfir skilaboðin sem þú ert að semja núna. Ertu viss um að þú viljir halda áfram?",
+  "confirmations.unfollow.confirm": "Hætta að fylgja",
+  "confirmations.unfollow.message": "Ertu viss um að þú viljir hætta að fylgjast með {name}?",
+  "conversation.delete": "Eyða samtali",
+  "conversation.mark_as_read": "Merkja sem lesið",
+  "conversation.open": "Skoða samtal",
+  "conversation.with": "Með {names}",
+  "directory.federated": "Frá samtengdum vefþjónum",
+  "directory.local": "Einungis frá {domain}",
+  "directory.new_arrivals": "Nýkomnir",
+  "directory.recently_active": "Nýleg virkni",
+  "embed.instructions": "Felldu þessa færslu inn í vefsvæðið þitt með því að afrita kóðann hér fyrir neðan.",
+  "embed.preview": "Svona mun þetta líta út:",
+  "emoji_button.activity": "Virkni",
+  "emoji_button.custom": "Sérsniðið",
+  "emoji_button.flags": "Flögg",
+  "emoji_button.food": "Matur og drykkur",
+  "emoji_button.label": "Setja inn tjáningartákn",
+  "emoji_button.nature": "Náttúra",
+  "emoji_button.not_found": "Engin tjáningartákn!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Hlutir",
+  "emoji_button.people": "Fólk",
+  "emoji_button.recent": "Oft notað",
+  "emoji_button.search": "Leita...",
+  "emoji_button.search_results": "Leitarniðurstöður",
+  "emoji_button.symbols": "Tákn",
+  "emoji_button.travel": "Ferðalög og staðir",
+  "empty_column.account_timeline": "Engin tíst hér!",
+  "empty_column.account_unavailable": "Notandasnið ekki tiltækt",
+  "empty_column.blocks": "Þú hefur ekki ennþá útilokað neina notendur.",
+  "empty_column.bookmarked_statuses": "Þú ert ekki ennþá með nein bókamerkt tíst. Þegar þú gefur tísti bókamerki, munu það birtast hér.",
+  "empty_column.community": "Staðværa tímalínan er tóm. Skrifaðu eitthvað opinberlega til að láta boltann fara að rúlla!",
+  "empty_column.direct": "Þú átt ennþá engin bein skilaboð. Þegar þú sendir eða tekur á móti slíkum skilaboðum, munu þau birtast hér.",
+  "empty_column.domain_blocks": "Það eru engin falin lén ennþá.",
+  "empty_column.favourited_statuses": "Þú átt ennþá engin eftirlætistíst. Þegar þú setur tíst í eftirlæti, munu þau birtast hér.",
+  "empty_column.favourites": "Enginn hefur ennþá set þetta tíst í eftirlæti. Þegar einhverjir gera það, munu þeir birtast hér.",
+  "empty_column.follow_requests": "Þú átt ennþá engar beiðnir um að fylgja þér. Þegar þú færð slíkar beiðnir, munu þær birtast hér.",
+  "empty_column.hashtag": "Það er ekkert ennþá undir þessu myllumerki.",
+  "empty_column.home": "Heimatímalínan þín er tóm! Skoðaðu {public} eða notaðu leitina til að komast í ganf og finna annað fólk.",
+  "empty_column.home.public_timeline": "opinbera tímalínan",
+  "empty_column.list": "Það er ennþá ekki neitt á þessum lista. Þegar meðlimir á listanum senda inn nýjar stöðufærslur, munu þær birtast hér.",
+  "empty_column.lists": "Þú ert ennþá ekki með neina lista. Þegar þú byrð til einhvern lista, munu hann birtast hér.",
+  "empty_column.mutes": "Þú hefur ekki þaggað niður í neinum notendum ennþá.",
+  "empty_column.notifications": "Þú ert ekki ennþá með neinar tilkynningar. Vertu í samskiptum við aðra til að umræður fari af stað.",
+  "empty_column.public": "Það er ekkert hér! Skrifaðu eitthvað opinberlega, eða fylgstu með notendum á öðrum netþjónum til að fylla upp í þetta",
+  "error.unexpected_crash.explanation": "Vegna villu í kóðanum okkar eða samhæfnivandamála í vafra er ekki hægt að birta þessa síðu svo vel sé.",
+  "error.unexpected_crash.next_steps": "Prófaðu að endurlesa síðuna. Ef það hjálpar ekki til, má samt vera að þú getir notað Mastodon í gegnum annan vafra eða forrit.",
+  "errors.unexpected_crash.copy_stacktrace": "Afrita rakningarupplýsingar (stacktrace) á klippispjald",
+  "errors.unexpected_crash.report_issue": "Tilkynna vandamál",
+  "follow_request.authorize": "Heimila",
+  "follow_request.reject": "Hafna",
+  "getting_started.developers": "Forritarar",
+  "getting_started.directory": "Notandasniðamappa",
+  "getting_started.documentation": "Hjálparskjöl",
+  "getting_started.heading": "Komast í gang",
+  "getting_started.invite": "Bjóða fólki",
+  "getting_started.open_source_notice": "Mastodon er opinn og frjáls hugbúnaður. Þú getur lagt þitt af mörkum eða tilkynnt um vandamál á GitHub á slóðinni {github}.",
+  "getting_started.security": "Stillingar notandaaðgangs",
+  "getting_started.terms": "Þjónustuskilmálar",
+  "hashtag.column_header.tag_mode.all": "og {additional}",
+  "hashtag.column_header.tag_mode.any": "eða {additional}",
+  "hashtag.column_header.tag_mode.none": "án {additional}",
+  "hashtag.column_settings.select.no_options_message": "Engar tillögur fundust",
+  "hashtag.column_settings.select.placeholder": "Settu inn myllumerki…",
+  "hashtag.column_settings.tag_mode.all": "Allt þetta",
+  "hashtag.column_settings.tag_mode.any": "Hvað sem er af þessu",
+  "hashtag.column_settings.tag_mode.none": "Ekkert af þessu",
+  "hashtag.column_settings.tag_toggle": "Taka með viðbótarmerki fyrir þennan dálk",
+  "home.column_settings.basic": "Einfalt",
+  "home.column_settings.show_reblogs": "Sýna endurbirtingar",
+  "home.column_settings.show_replies": "Birta svör",
+  "intervals.full.days": "{number, plural, one {# dagur} other {# dagar}}",
+  "intervals.full.hours": "{number, plural, one {# klukkustund} other {# klukkustundir}}",
+  "intervals.full.minutes": "{number, plural, one {# mínúta} other {# mínútur}}",
+  "introduction.federation.action": "Næsta",
+  "introduction.federation.federated.headline": "Sameiginlegt",
+  "introduction.federation.federated.text": "Opinberar færslur frá öðrum vefþjónum í skýjasambandinu birtast á sameiginlegu tímalínunni.",
+  "introduction.federation.home.headline": "Heim",
+  "introduction.federation.home.text": "Færslur frá fólki sem þú fylgist með birtast í heimastreyminu þínu. Þú getur fylgst með hverjum sem er á hvaða vefþjóni sem er!",
+  "introduction.federation.local.headline": "Staðvært",
+  "introduction.federation.local.text": "Opinberar færslur frá fólki á sama vefþjóni og þú birtast á staðværu tímalínunni.",
+  "introduction.interactions.action": "Ljúka leiðarvísinum!",
+  "introduction.interactions.favourite.headline": "Eftirlæti",
+  "introduction.interactions.favourite.text": "Þú getur vistað tíst til að eiga í handraðanum og látið höfundinn vita að þér hafi líkað það með því að setja það í eftirlætin þín.",
+  "introduction.interactions.reblog.headline": "Endurbirting",
+  "introduction.interactions.reblog.text": "Þú getur deilt tístum frá öðru fólki til þeirra sem fylgjast með þér með því að endurbirta færslurnar.",
+  "introduction.interactions.reply.headline": "Svara",
+  "introduction.interactions.reply.text": "Þú getur svarað tístum frá öðru fólki og eins sjálfum þér, sem mun binda tístin saman í samtal.",
+  "introduction.welcome.action": "Drífum okkur!",
+  "introduction.welcome.headline": "Fyrstu skrefin",
+  "introduction.welcome.text": "Velkomin í skýjasambandið (fediverse)! Eftir augnablik geturðu farið að útvarpa skilaboðum og spjalla við vini þína úti um víða veröld, allt í gegnum ýmsar gerðir vefþjóna sem samt geta talað saman. En þessi vefþjónn, {domain}, er sérstakur — hann hýsir notandasniðið þitt, þannig að þú skalt muna hvað hann heitir.",
+  "keyboard_shortcuts.back": "að fara til baka",
+  "keyboard_shortcuts.blocked": "að opna lista yfir útilokaða notendur",
+  "keyboard_shortcuts.boost": "að endurbirta",
+  "keyboard_shortcuts.column": "að setja virkni á stöðufærslu í einum af dálkunum",
+  "keyboard_shortcuts.compose": "að setja virkni á textainnsetningarreit",
+  "keyboard_shortcuts.description": "Lýsing",
+  "keyboard_shortcuts.direct": "að opna dálk með beinum skilaboðum",
+  "keyboard_shortcuts.down": "að fara neðar í listanum",
+  "keyboard_shortcuts.enter": "að opna stöðufærslu",
+  "keyboard_shortcuts.favourite": "að setja í eftirlæti",
+  "keyboard_shortcuts.favourites": "að opna eftirlætislista",
+  "keyboard_shortcuts.federated": "að opna sameiginlega tímalínu",
+  "keyboard_shortcuts.heading": "Flýtileiðir á lyklaborði",
+  "keyboard_shortcuts.home": "að opna heimatímalínu",
+  "keyboard_shortcuts.hotkey": "Flýtilykill",
+  "keyboard_shortcuts.legend": "að birta þessa skýringu",
+  "keyboard_shortcuts.local": "að opna staðværa tímalínu",
+  "keyboard_shortcuts.mention": "að minnast á höfund",
+  "keyboard_shortcuts.muted": "að opna lista yfir þaggaða notendur",
+  "keyboard_shortcuts.my_profile": "að opna notandasniðið þitt",
+  "keyboard_shortcuts.notifications": "að opna tilkynningadálk",
+  "keyboard_shortcuts.open_media": "til að opna margmiðlunargögn",
+  "keyboard_shortcuts.pinned": "að opna lista yfir föst tíst",
+  "keyboard_shortcuts.profile": "að opna notandasnið höfundar",
+  "keyboard_shortcuts.reply": "að svara",
+  "keyboard_shortcuts.requests": "að opna lista yfir fylgjendabeiðnir",
+  "keyboard_shortcuts.search": "að setja virkni í leit",
+  "keyboard_shortcuts.start": "að opna \"komast í gang\" dálk",
+  "keyboard_shortcuts.toggle_hidden": "að birta/fela texta á bak við aðvörun vegna efnis",
+  "keyboard_shortcuts.toggle_sensitivity": "að birta/fela myndir",
+  "keyboard_shortcuts.toot": "að byrja glænýtt tíst",
+  "keyboard_shortcuts.unfocus": "að taka virkni úr textainnsetningarreit eða leit",
+  "keyboard_shortcuts.up": "að fara ofar í listanum",
+  "lightbox.close": "Loka",
+  "lightbox.next": "Næsta",
+  "lightbox.previous": "Fyrra",
+  "lightbox.view_context": "Skoða samhengi",
+  "lists.account.add": "Bæta á lista",
+  "lists.account.remove": "Fjarlægja af lista",
+  "lists.delete": "Eyða lista",
+  "lists.edit": "Breyta lista",
+  "lists.edit.submit": "Breyta titli",
+  "lists.new.create": "Bæta við lista",
+  "lists.new.title_placeholder": "Titill á nýjum lista",
+  "lists.search": "Leita meðal þeirra sem þú fylgist með",
+  "lists.subheading": "Listarnir þínir",
+  "load_pending": "{count, plural, one {# nýtt atriði} other {# ný atriði}}",
+  "loading_indicator.label": "Hleð inn...",
+  "media_gallery.toggle_visible": "Víxla sýnileika",
+  "missing_indicator.label": "Fannst ekki",
+  "missing_indicator.sublabel": "Tilfangið fannst ekki",
+  "mute_modal.hide_notifications": "Fela tilkynningar frá þessum notanda?",
+  "navigation_bar.apps": "Farsímaforrit",
+  "navigation_bar.blocks": "Útilokaðir notendur",
+  "navigation_bar.bookmarks": "Bókamerki",
+  "navigation_bar.community_timeline": "Staðvær tímalína",
+  "navigation_bar.compose": "Semja nýtt tíst",
+  "navigation_bar.direct": "Bein skilaboð",
+  "navigation_bar.discover": "Uppgötva",
+  "navigation_bar.domain_blocks": "Falin lén",
+  "navigation_bar.edit_profile": "Breyta notandasniði",
+  "navigation_bar.favourites": "Eftirlæti",
+  "navigation_bar.filters": "Þögguð orð",
+  "navigation_bar.follow_requests": "Beiðnir um að fylgjast með",
+  "navigation_bar.follows_and_followers": "Fylgist með og fylgjendur",
+  "navigation_bar.info": "Um þennan vefþjón",
+  "navigation_bar.keyboard_shortcuts": "Flýtilyklar",
+  "navigation_bar.lists": "Listar",
+  "navigation_bar.logout": "Útskráning",
+  "navigation_bar.mutes": "Þaggaðir notendur",
+  "navigation_bar.personal": "Einka",
+  "navigation_bar.pins": "Föst tíst",
+  "navigation_bar.preferences": "Kjörstillingar",
+  "navigation_bar.public_timeline": "Sameiginleg tímalína",
+  "navigation_bar.security": "Öryggi",
+  "notification.favourite": "{name} setti stöðufærslu þína í eftirlæti",
+  "notification.follow": "{name} fylgist með þér",
+  "notification.follow_request": "{name} hefur beðið um að fylgjast með þér",
+  "notification.mention": "{name} minntist á þig",
+  "notification.own_poll": "Könnuninni þinni er lokið",
+  "notification.poll": "Könnun sem þú tókst þátt í er lokið",
+  "notification.reblog": "{name} endurbirti stöðufærsluna þína",
+  "notifications.clear": "Hreinsa tilkynningar",
+  "notifications.clear_confirmation": "Ertu viss um að þú viljir endanlega eyða öllum tilkynningunum þínum?",
+  "notifications.column_settings.alert": "Tilkynningar á skjáborði",
+  "notifications.column_settings.favourite": "Eftirlæti:",
+  "notifications.column_settings.filter_bar.advanced": "Birta alla flokka",
+  "notifications.column_settings.filter_bar.category": "Skyndisíustika",
+  "notifications.column_settings.filter_bar.show": "Sýna",
+  "notifications.column_settings.follow": "Nýir fylgjendur:",
+  "notifications.column_settings.follow_request": "Nýjar beiðnir um að fylgjast með:",
+  "notifications.column_settings.mention": "Tilvísanir:",
+  "notifications.column_settings.poll": "Niðurstöður könnunar:",
+  "notifications.column_settings.push": "Ýti-tilkynningar",
+  "notifications.column_settings.reblog": "Endurbirtingar:",
+  "notifications.column_settings.show": "Sýna í dálki",
+  "notifications.column_settings.sound": "Spila hljóð",
+  "notifications.filter.all": "Allt",
+  "notifications.filter.boosts": "Endurbirtingar",
+  "notifications.filter.favourites": "Eftirlæti",
+  "notifications.filter.follows": "Fylgist með",
+  "notifications.filter.mentions": "Tilvísanir",
+  "notifications.filter.polls": "Niðurstöður könnunar",
+  "notifications.group": "{count} tilkynningar",
+  "poll.closed": "Lokað",
+  "poll.refresh": "Endurlesa",
+  "poll.total_people": "{count, plural, one {# aðili} other {# aðilar}}",
+  "poll.total_votes": "{count, plural, one {# atkvæði} other {# atkvæði}}",
+  "poll.vote": "Greiða atkvæði",
+  "poll.voted": "Þú kaust þetta svar",
+  "poll_button.add_poll": "Bæta við könnun",
+  "poll_button.remove_poll": "Fjarlægja könnun",
+  "privacy.change": "Aðlaga gagnaleynd stöðufærslu",
+  "privacy.direct.long": "Senda einungis á notendur sem minnst er á",
+  "privacy.direct.short": "Beint",
+  "privacy.private.long": "Senda einungis á fylgjendur",
+  "privacy.private.short": "Einungis fylgjendur",
+  "privacy.public.long": "Senda á opinberar tímalínur",
+  "privacy.public.short": "Opinbert",
+  "privacy.unlisted.long": "Ekki senda á opinberar tímalínur",
+  "privacy.unlisted.short": "Óskráð",
+  "refresh": "Endurlesa",
+  "regeneration_indicator.label": "Hleð inn…",
+  "regeneration_indicator.sublabel": "Verið er að útbúa heimastreymið þitt!",
+  "relative_time.days": "{number}d",
+  "relative_time.hours": "{number}kl.",
+  "relative_time.just_now": "núna",
+  "relative_time.minutes": "{number}mín",
+  "relative_time.seconds": "{number}sek",
+  "reply_indicator.cancel": "Hætta við",
+  "report.forward": "Áframsenda til {target}",
+  "report.forward_hint": "Notandaaðgangurinn er af öðrum vefþjóni. Á einnig að senda nafnlaust afrit af kærunni þangað?",
+  "report.hint": "Kæran verður send á umsjónarmenn vefþjónsins þíns. Þú getur gefið skýringu hér fyrir neðan á því af hverju þú ert að kæra þennan notandaaðgang:",
+  "report.placeholder": "Viðbótarathugasemdir",
+  "report.submit": "Senda inn",
+  "report.target": "Kæri {target}",
+  "search.placeholder": "Leita",
+  "search_popout.search_format": "Snið ítarlegrar leitar",
+  "search_popout.tips.full_text": "Einfaldur texti skilar stöðufærslum sem þú hefur skrifað, sett í eftirlæti, endurbirt eða verið minnst á þig í, ásamt samsvarandi birtingarnöfnum, notendanöfnum og myllumerkjum.",
+  "search_popout.tips.hashtag": "myllumerki",
+  "search_popout.tips.status": "stöðufærsla",
+  "search_popout.tips.text": "Einfaldur texti skilar samsvarandi birtingarnöfnum, notendanöfnum og myllumerkjum",
+  "search_popout.tips.user": "notandi",
+  "search_results.accounts": "Fólk",
+  "search_results.hashtags": "Myllumerki",
+  "search_results.statuses": "Tíst",
+  "search_results.statuses_fts_disabled": "Að leita í efni tísta er ekki virk á þessum Mastodon-þjóni.",
+  "search_results.total": "{count, number} {count, plural, one {niðurstaða} other {niðurstöður}}",
+  "status.admin_account": "Opna umsjónarviðmót fyrir @{name}",
+  "status.admin_status": "Opna þessa stöðufærslu í umsjónarviðmótinu",
+  "status.block": "Útiloka @{name}",
+  "status.bookmark": "Bókamerki",
+  "status.cancel_reblog_private": "Taka úr endurbirtingu",
+  "status.cannot_reblog": "Þessa færslu er ekki hægt að endurbirta",
+  "status.copy": "Afrita tengil í stöðufærslu",
+  "status.delete": "Eyða",
+  "status.detailed_status": "Nákvæm spjallþráðasýn",
+  "status.direct": "Bein skilaboð @{name}",
+  "status.embed": "Ívefja",
+  "status.favourite": "Eftirlæti",
+  "status.filtered": "Síað",
+  "status.load_more": "Hlaða inn meiru",
+  "status.media_hidden": "Mynd er falin",
+  "status.mention": "Minnast á @{name}",
+  "status.more": "Meira",
+  "status.mute": "Þagga niður í @{name}",
+  "status.mute_conversation": "Þagga niður í samtali",
+  "status.open": "Útliða þessa stöðu",
+  "status.pin": "Festa á notandasnið",
+  "status.pinned": "Fast tíst",
+  "status.read_more": "Lesa meira",
+  "status.reblog": "Endurbirting",
+  "status.reblog_private": "Endurbirta til upphaflegra lesenda",
+  "status.reblogged_by": "{name} endurbirti",
+  "status.reblogs.empty": "Enginn hefur ennþá endurbirt þetta tíst. Þegar einhverjir gera það, munu þeir birtast hér.",
+  "status.redraft": "Eyða og enduvinna drög",
+  "status.remove_bookmark": "Fjarlægja bókamerki",
+  "status.reply": "Svara",
+  "status.replyAll": "Svara þræði",
+  "status.report": "Kæra @{name}",
+  "status.sensitive_warning": "Viðkvæmt efni",
+  "status.share": "Deila",
+  "status.show_less": "Sýna minna",
+  "status.show_less_all": "Sýna minna fyrir allt",
+  "status.show_more": "Sýna meira",
+  "status.show_more_all": "Sýna meira fyrir allt",
+  "status.show_thread": "Birta þráð",
+  "status.uncached_media_warning": "Ekki tiltækt",
+  "status.unmute_conversation": "Hætta að þagga niður í samtali",
+  "status.unpin": "Losa af notandasniði",
+  "suggestions.dismiss": "Hafna tillögu",
+  "suggestions.header": "Þú gætir haft áhuga á…",
+  "tabs_bar.federated_timeline": "Sameiginlegt",
+  "tabs_bar.home": "Heim",
+  "tabs_bar.local_timeline": "Staðvært",
+  "tabs_bar.notifications": "Tilkynningar",
+  "tabs_bar.search": "Leita",
+  "time_remaining.days": "{number, plural, one {# dagur} other {# dagar}} eftir",
+  "time_remaining.hours": "{number, plural, one {# klukkustund} other {# klukkustundir}} eftir",
+  "time_remaining.minutes": "{number, plural, one {# mínúta} other {# mínútur}} eftir",
+  "time_remaining.moments": "Tími eftir",
+  "time_remaining.seconds": "{number, plural, one {# sekúnda} other {# sekúndur}} eftir",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {aðili} other {aðilar}} að tala",
+  "trends.trending_now": "Í umræðunni núna",
+  "ui.beforeunload": "Drögin tapast ef þú ferð út úr Mastodon.",
+  "upload_area.title": "Dragðu-og-slepptu hér til að senda inn",
+  "upload_button.label": "Bæta við ({formats}) myndskrá",
+  "upload_error.limit": "Fór yfir takmörk á innsendingum skráa.",
+  "upload_error.poll": "Innsending skráa er ekki leyfð í könnunum.",
+  "upload_form.audio_description": "Lýstu þessu fyrir heyrnarskerta",
+  "upload_form.description": "Lýstu þessu fyrir sjónskerta",
+  "upload_form.edit": "Breyta",
+  "upload_form.undo": "Eyða",
+  "upload_form.video_description": "Lýstu þessu fyrir fólk sem heyrir illa eða er með skerta sjón",
+  "upload_modal.analyzing_picture": "Greini mynd…",
+  "upload_modal.apply": "Virkja",
+  "upload_modal.description_placeholder": "Öllum dýrunum í skóginum þætti bezt að vera vinir",
+  "upload_modal.detect_text": "Skynja texta úr mynd",
+  "upload_modal.edit_media": "Breyta myndskrá",
+  "upload_modal.hint": "Smelltu eða dragðu til hringinn á forskoðuninni til að velja miðpunktinn sem verður alltaf sýnilegastur á öllum smámyndum.",
+  "upload_modal.preview_label": "Forskoðun ({ratio})",
+  "upload_progress.label": "Er að senda inn...",
+  "video.close": "Loka myndskeiði",
+  "video.download": "Sækja skrá",
+  "video.exit_fullscreen": "Hætta í skjáfylli",
+  "video.expand": "Stækka myndskeið",
+  "video.fullscreen": "Skjáfylli",
+  "video.hide": "Fela myndskeið",
+  "video.mute": "Þagga hljóð",
+  "video.pause": "Gera hlé",
+  "video.play": "Spila",
+  "video.unmute": "Kveikja á hljóði"
+}
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 757882523..1b31f90f6 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Aggiungi o togli dalle liste",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Gruppo",
   "account.block": "Blocca @{name}",
   "account.block_domain": "Nascondi tutto da {domain}",
   "account.blocked": "Bloccato",
@@ -39,9 +40,10 @@
   "account.unmute": "Non silenziare @{name}",
   "account.unmute_notifications": "Non silenziare più le notifiche da @{name}",
   "alert.rate_limited.message": "Riprova dopo {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.title": "Numero massimo di richieste superato",
   "alert.unexpected.message": "Si è verificato un errore inatteso.",
   "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per settimana",
   "boost_modal.combo": "Puoi premere {combo} per saltare questo passaggio la prossima volta",
   "bundle_column_error.body": "E' avvenuto un errore durante il caricamento di questo componente.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "C'è stato un errore mentre questo componente veniva caricato.",
   "bundle_modal_error.retry": "Riprova",
   "column.blocks": "Utenti bloccati",
+  "column.bookmarks": "Segnalibri",
   "column.community": "Timeline locale",
   "column.direct": "Messaggi diretti",
   "column.directory": "Sfoglia profili",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Durata del sondaggio",
   "compose_form.poll.option_placeholder": "Scelta {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Segna media come sensibile",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Non ci sono toot qui!",
   "empty_column.account_unavailable": "Profilo non disponibile",
   "empty_column.blocks": "Non hai ancora bloccato nessun utente.",
+  "empty_column.bookmarked_statuses": "Non hai ancora nessun toot tra i segnalibri. Quando ne aggiungerai qualcuno, comparirà qui.",
   "empty_column.community": "La timeline locale è vuota. Condividi qualcosa pubblicamente per dare inizio alla festa!",
   "empty_column.direct": "Non hai ancora nessun messaggio privato. Quando ne manderai o riceverai qualcuno, apparirà qui.",
   "empty_column.domain_blocks": "Non vi sono domini nascosti.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "per aprire l'elenco degli utenti silenziati",
   "keyboard_shortcuts.my_profile": "per aprire il tuo profilo",
   "keyboard_shortcuts.notifications": "per aprire la colonna delle notifiche",
+  "keyboard_shortcuts.open_media": "per aprire media",
   "keyboard_shortcuts.pinned": "per aprire l'elenco dei toot fissati in cima",
   "keyboard_shortcuts.profile": "per aprire il profilo dell'autore",
   "keyboard_shortcuts.reply": "per rispondere",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Nascondere le notifiche da quest'utente?",
   "navigation_bar.apps": "App per dispositivi mobili",
   "navigation_bar.blocks": "Utenti bloccati",
+  "navigation_bar.bookmarks": "Segnalibri",
   "navigation_bar.community_timeline": "Timeline locale",
   "navigation_bar.compose": "Componi nuovo toot",
   "navigation_bar.direct": "Messaggi diretti",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Sicurezza",
   "notification.favourite": "{name} ha apprezzato il tuo post",
   "notification.follow": "{name} ha iniziato a seguirti",
+  "notification.follow_request": "{name} ha chiesto di seguirti",
   "notification.mention": "{name} ti ha menzionato",
+  "notification.own_poll": "Il tuo sondaggio è terminato",
   "notification.poll": "Un sondaggio in cui hai votato è terminato",
   "notification.reblog": "{name} ha condiviso il tuo post",
   "notifications.clear": "Cancella notifiche",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Filtro rapido",
   "notifications.column_settings.filter_bar.show": "Mostra",
   "notifications.column_settings.follow": "Nuovi seguaci:",
+  "notifications.column_settings.follow_request": "Nuove richieste di essere seguito:",
   "notifications.column_settings.mention": "Menzioni:",
   "notifications.column_settings.poll": "Risultati del sondaggio:",
   "notifications.column_settings.push": "Notifiche push",
@@ -344,6 +355,7 @@
   "status.admin_account": "Apri interfaccia di moderazione per @{name}",
   "status.admin_status": "Apri questo status nell'interfaccia di moderazione",
   "status.block": "Blocca @{name}",
+  "status.bookmark": "Aggiungi segnalibro",
   "status.cancel_reblog_private": "Annulla condivisione",
   "status.cannot_reblog": "Questo post non può essere condiviso",
   "status.copy": "Copia link allo status",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} ha condiviso",
   "status.reblogs.empty": "Nessuno ha ancora condiviso questo toot. Quando qualcuno lo farà, comparirà qui.",
   "status.redraft": "Cancella e riscrivi",
+  "status.remove_bookmark": "Elimina segnalibro",
   "status.reply": "Rispondi",
   "status.replyAll": "Rispondi alla conversazione",
   "status.report": "Segnala @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Aggiungi file multimediale",
   "upload_error.limit": "Limite al caricamento di file superato.",
   "upload_error.poll": "Caricamento file non consentito nei sondaggi.",
+  "upload_form.audio_description": "Descrizione per persone con difetti uditivi",
   "upload_form.description": "Descrizione per utenti con disabilità visive",
   "upload_form.edit": "Modifica",
   "upload_form.undo": "Cancella",
+  "upload_form.video_description": "Descrizione per persone con difetti uditivi o visivi",
   "upload_modal.analyzing_picture": "Analisi immagine…",
   "upload_modal.apply": "Applica",
   "upload_modal.description_placeholder": "Ma la volpe col suo balzo ha raggiunto il quieto Fido",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Anteprima ({ratio})",
   "upload_progress.label": "Sto caricando...",
   "video.close": "Chiudi video",
+  "video.download": "Scarica file",
   "video.exit_fullscreen": "Esci da modalità a schermo intero",
   "video.expand": "Espandi video",
   "video.fullscreen": "Schermo intero",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index fdcbe53a2..67cee9276 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "リストから追加または外す",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Group",
   "account.block": "@{name}さんをブロック",
   "account.block_domain": "{domain}全体を非表示",
   "account.blocked": "ブロック済み",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "制限に達しました",
   "alert.unexpected.message": "不明なエラーが発生しました。",
   "alert.unexpected.title": "エラー!",
+  "announcement.announcement": "お知らせ",
   "autosuggest_hashtag.per_week": "{count} 回 / 週",
   "boost_modal.combo": "次からは{combo}を押せばスキップできます",
   "bundle_column_error.body": "コンポーネントの読み込み中に問題が発生しました。",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "コンポーネントの読み込み中に問題が発生しました。",
   "bundle_modal_error.retry": "再試行",
   "column.blocks": "ブロックしたユーザー",
+  "column.bookmarks": "ブックマーク",
   "column.community": "ローカルタイムライン",
   "column.direct": "ダイレクトメッセージ",
   "column.directory": "ディレクトリ",
@@ -86,6 +89,8 @@
   "compose_form.poll.duration": "アンケート期間",
   "compose_form.poll.option_placeholder": "項目 {number}",
   "compose_form.poll.remove_option": "この項目を削除",
+  "compose_form.poll.switch_to_multiple": "複数選択に変更",
+  "compose_form.poll.switch_to_single": "単一選択に変更",
   "compose_form.publish": "トゥート",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "メディアを閲覧注意にする",
@@ -107,7 +112,7 @@
   "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": "本当にこのトゥートを削除して下書きに戻しますか? このトゥートへのお気に入り登録やブーストは失われ、返信は孤立することになります。",
@@ -142,6 +147,7 @@
   "empty_column.account_timeline": "トゥートがありません!",
   "empty_column.account_unavailable": "プロフィールは利用できません",
   "empty_column.blocks": "まだ誰もブロックしていません。",
+  "empty_column.bookmarked_statuses": "まだ何もブックマーク登録していません。ブックマーク登録するとここに表示されます。",
   "empty_column.community": "ローカルタイムラインはまだ使われていません。何か書いてみましょう!",
   "empty_column.direct": "ダイレクトメッセージはまだありません。ダイレクトメッセージをやりとりすると、ここに表示されます。",
   "empty_column.domain_blocks": "非表示にしているドメインはありません。",
@@ -223,6 +229,7 @@
   "keyboard_shortcuts.muted": "ミュートしたユーザーのリストを開く",
   "keyboard_shortcuts.my_profile": "自分のプロフィールを開く",
   "keyboard_shortcuts.notifications": "通知カラムを開く",
+  "keyboard_shortcuts.open_media": "メディアを開く",
   "keyboard_shortcuts.pinned": "固定したトゥートのリストを開く",
   "keyboard_shortcuts.profile": "プロフィールを開く",
   "keyboard_shortcuts.reply": "返信",
@@ -255,6 +262,7 @@
   "mute_modal.hide_notifications": "このユーザーからの通知を隠しますか?",
   "navigation_bar.apps": "アプリ",
   "navigation_bar.blocks": "ブロックしたユーザー",
+  "navigation_bar.bookmarks": "ブックマーク",
   "navigation_bar.community_timeline": "ローカルタイムライン",
   "navigation_bar.compose": "トゥートの新規作成",
   "navigation_bar.direct": "ダイレクトメッセージ",
@@ -278,7 +286,9 @@
   "navigation_bar.security": "セキュリティ",
   "notification.favourite": "{name}さんがあなたのトゥートをお気に入りに登録しました",
   "notification.follow": "{name}さんにフォローされました",
+  "notification.follow_request": "{name} さんがあなたにフォローリクエストしました",
   "notification.mention": "{name}さんがあなたに返信しました",
+  "notification.own_poll": "アンケートが終了しました",
   "notification.poll": "アンケートが終了しました",
   "notification.reblog": "{name}さんがあなたのトゥートをブーストしました",
   "notifications.clear": "通知を消去",
@@ -289,6 +299,7 @@
   "notifications.column_settings.filter_bar.category": "クイックフィルターバー",
   "notifications.column_settings.filter_bar.show": "表示",
   "notifications.column_settings.follow": "新しいフォロワー:",
+  "notifications.column_settings.follow_request": "新しいフォローリクエスト:",
   "notifications.column_settings.mention": "返信:",
   "notifications.column_settings.poll": "アンケート結果:",
   "notifications.column_settings.push": "プッシュ通知",
@@ -349,6 +360,7 @@
   "status.admin_account": "@{name} のモデレーション画面を開く",
   "status.admin_status": "このトゥートをモデレーション画面で開く",
   "status.block": "@{name}さんをブロック",
+  "status.bookmark": "ブックマーク",
   "status.cancel_reblog_private": "ブースト解除",
   "status.cannot_reblog": "この投稿はブーストできません",
   "status.copy": "トゥートへのリンクをコピー",
@@ -373,6 +385,7 @@
   "status.reblogged_by": "{name}さんがブースト",
   "status.reblogs.empty": "まだ誰もブーストしていません。ブーストされるとここに表示されます。",
   "status.redraft": "削除して下書きに戻す",
+  "status.remove_bookmark": "ブックマークを削除",
   "status.reply": "返信",
   "status.replyAll": "全員に返信",
   "status.report": "@{name}さんを通報",
@@ -405,9 +418,11 @@
   "upload_button.label": "メディアを追加 ({formats})",
   "upload_error.limit": "アップロードできる上限を超えています。",
   "upload_error.poll": "アンケートではファイルをアップロードできません。",
-  "upload_form.description": "視覚障害者のための説明",
+  "upload_form.audio_description": "聴取が難しいユーザーへの説明",
+  "upload_form.description": "閲覧が難しいユーザーへの説明",
   "upload_form.edit": "編集",
   "upload_form.undo": "削除",
+  "upload_form.video_description": "視聴が難しいユーザーへの説明",
   "upload_modal.analyzing_picture": "画像を解析中…",
   "upload_modal.apply": "適用",
   "upload_modal.description_placeholder": "あのイーハトーヴォのすきとおった風",
@@ -417,6 +432,7 @@
   "upload_modal.preview_label": "プレビュー ({ratio})",
   "upload_progress.label": "アップロード中...",
   "video.close": "動画を閉じる",
+  "video.download": "ダウンロード",
   "video.exit_fullscreen": "全画面を終了する",
   "video.expand": "動画を拡大する",
   "video.fullscreen": "全画面",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 35789374a..1222702a4 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Add or Remove from lists",
   "account.badges.bot": "ბოტი",
+  "account.badges.group": "Group",
   "account.block": "დაბლოკე @{name}",
   "account.block_domain": "დაიმალოს ყველაფერი დომენიდან {domain}",
   "account.blocked": "დაიბლოკა",
@@ -42,7 +43,8 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "წარმოიშვა მოულოდნელი შეცდომა.",
   "alert.unexpected.title": "უპს!",
-  "autosuggest_hashtag.per_week": "{count} per week",
+  "announcement.announcement": "Announcement",
+  "autosuggest_hashtag.per_week": "კვირაში {count}",
   "boost_modal.combo": "შეგიძლიათ დააჭიროთ {combo}-ს რათა შემდეგ ჯერზე გამოტოვოთ ეს",
   "bundle_column_error.body": "ამ კომპონენტის ჩატვირთვისას რაღაც აირია.",
   "bundle_column_error.retry": "სცადეთ კიდევ ერთხელ",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "ამ კომპონენტის ჩატვირთვისას რაღაც აირია.",
   "bundle_modal_error.retry": "სცადეთ კიდევ ერთხელ",
   "column.blocks": "დაბლოკილი მომხმარებლები",
+  "column.bookmarks": "Bookmarks",
   "column.community": "ლოკალური თაიმლაინი",
   "column.direct": "პირდაპირი წერილები",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "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": "ტუტი",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "ლოკალური თაიმლაინი ცარიელია. დაწერეთ რაიმე ღიად ან ქენით რაიმე სხვა!",
   "empty_column.direct": "ჯერ პირდაპირი წერილები არ გაქვთ. როდესაც მიიღებთ ან გააგზავნით, გამოჩნდება აქ.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "ავტორის პროფილის გასახსნელად",
   "keyboard_shortcuts.reply": "პასუხისთვის",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "დავმალოთ შეტყობინებები ამ მომხმარებლისგან?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "დაბლოკილი მომხმარებლები",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "ლოკალური თაიმლაინი",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "პირდაპირი წერილები",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "უსაფრთხოება",
   "notification.favourite": "{name}-მა თქვენი სტატუსი აქცია ფავორიტად",
   "notification.follow": "{name} გამოგყვათ",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name}-მა გასახელათ",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name}-მა დაბუსტა თქვენი სტატუსი",
   "notifications.clear": "შეტყობინებების გასუფთავება",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "ახალი მიმდევრები:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "ხსენებები:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "ფუშ შეტყობინებები",
@@ -344,6 +355,7 @@
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "დაბლოკე @{name}",
+  "status.bookmark": "Bookmark",
   "status.cancel_reblog_private": "ბუსტის მოშორება",
   "status.cannot_reblog": "ეს პოსტი ვერ დაიბუსტება",
   "status.copy": "Copy link to status",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} დაიბუსტა",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "გაუქმდეს და გადანაწილდეს",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "პასუხი",
   "status.replyAll": "უპასუხე თემას",
   "status.report": "დაარეპორტე @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "მედიის დამატება",
   "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": "აღწერილობა ვიზუალურად უფასურისთვის",
   "upload_form.edit": "Edit",
   "upload_form.undo": "გაუქმება",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
   "upload_modal.analyzing_picture": "Analyzing picture…",
   "upload_modal.apply": "Apply",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "იტვირთება...",
   "video.close": "ვიდეოს დახურვა",
+  "video.download": "Download file",
   "video.exit_fullscreen": "სრულ ეკრანზე ჩვენების გათიშვა",
   "video.expand": "ვიდეოს გაფართოება",
   "video.fullscreen": "ჩვენება სრულ ეკრანზე",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
new file mode 100644
index 000000000..ec77fa9e4
--- /dev/null
+++ b/app/javascript/mastodon/locales/kab.json
@@ -0,0 +1,439 @@
+{
+  "account.add_or_remove_from_list": "Rnu neγ kkes seg tebdarin",
+  "account.badges.bot": "Aṛubut",
+  "account.badges.group": "Agraw",
+  "account.block": "Seḥbes @{name}",
+  "account.block_domain": "Ffer kra i d-yekkan seg {domain}",
+  "account.blocked": "Yettuseḥbes",
+  "account.cancel_follow_request": "Sefsex asuter n weḍfaṛ",
+  "account.direct": "Izen usrid i @{name}",
+  "account.domain_blocked": "Taγult yeffren",
+  "account.edit_profile": "Ẓreg amaγnu",
+  "account.endorse": "Welleh fell-as deg umaγnu-inek",
+  "account.follow": "Ḍfeṛ",
+  "account.followers": "Imeḍfaṛen",
+  "account.followers.empty": "Ar tura, ulac yiwen i yeṭṭafaṛen amseqdac-agi.",
+  "account.follows": "Aḍfaṛen",
+  "account.follows.empty": "Ar tura, amseqdac-agi ur yeṭṭafaṛ yiwen.",
+  "account.follows_you": "Yeṭṭafaṛ-ik",
+  "account.hide_reblogs": "Ffer ayen i ibeṭṭu @{name}",
+  "account.last_status": "Armud aneggaru",
+  "account.link_verified_on": "Taγara n useγwen-a tettwasenqed ass n {date}",
+  "account.locked_info": "Amiḍan-agi uslig isekweṛ. D bab-is kan i izemren ad yeǧǧ, s ufus-is, win ara t-iḍefṛen.",
+  "account.media": "Allal n teywalt",
+  "account.mention": "Bder-d @{name}",
+  "account.moved_to": "{name} ibeddel γer:",
+  "account.mute": "Sgugem @{name}",
+  "account.mute_notifications": "Susem ilγa sγur @{name}",
+  "account.muted": "Yettwasgugem",
+  "account.never_active": "Werǧin",
+  "account.posts": "Tiberraḥin",
+  "account.posts_with_replies": "Tibarraḥin d tririyin",
+  "account.report": "Sewɛed @{name}",
+  "account.requested": "Di laɛḍil ad yettwaqbel. Ssit iwakken ad yefsex usuter n weḍfar",
+  "account.share": "Bḍu amaγnu n @{name}",
+  "account.show_reblogs": "Sken-d inebḍa n @{name}",
+  "account.unblock": "Serreḥ i @{name}",
+  "account.unblock_domain": "Kkes tuffra i {domain}",
+  "account.unendorse": "Ur ttwellih ara fell-as deg umaγnu-inek",
+  "account.unfollow": "Ur ṭṭafaṛ ara",
+  "account.unmute": "Kkes asgugem γef @{name}",
+  "account.unmute_notifications": "Serreḥ ilγa sγur @{name}",
+  "alert.rate_limited.message": "Ma ulac aγilif ɛreḍ tikelt-nniḍen mbeɛd {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Aktum s talast",
+  "alert.unexpected.message": "Tella-d tuccḍa i ɣef ur nedmi ara.",
+  "alert.unexpected.title": "Ayhuh!",
+  "announcement.announcement": "Announcement",
+  "autosuggest_hashtag.per_week": "{count} i yimalas",
+  "boost_modal.combo": "Tzemreḍ ad tetekkiḍ γef {combo} akken ad tessurfeḍ aya tikelt-nniḍen",
+  "bundle_column_error.body": "Tella-d kra n tuccḍa mi d-yettali ugbur-agi.",
+  "bundle_column_error.retry": "Ɛreḍ tikelt-nniḍen",
+  "bundle_column_error.title": "Tuccḍa deg uẓeṭṭa",
+  "bundle_modal_error.close": "Mdel",
+  "bundle_modal_error.message": "Tella-d kra n tuccḍa mi d-yettali ugbur-agi.",
+  "bundle_modal_error.retry": "Ɛreḍ tikelt-nniḍen",
+  "column.blocks": "Imiḍanen yettusḥebsen",
+  "column.bookmarks": "Ticraḍ",
+  "column.community": "Tasuddemt tadigant",
+  "column.direct": "Iznan usriden",
+  "column.directory": "Qelleb deg imaγnuten",
+  "column.domain_blocks": "Tiγula yettwaffren",
+  "column.favourites": "Ismenyifen",
+  "column.follow_requests": "Isuturen n teḍfeṛt",
+  "column.home": "Agejdan",
+  "column.lists": "Tibdarin",
+  "column.mutes": "Imiḍanen yettwasgugmen",
+  "column.notifications": "Tilγa",
+  "column.pins": "Tiberraḥin yettwasenṭḍen",
+  "column.public": "Tasuddemt tamatut",
+  "column_back_button.label": "Tuγalin",
+  "column_header.hide_settings": "Ffer iγewwaṛen",
+  "column_header.moveLeft_settings": "Err ajgu γer tama tazelmaḍt",
+  "column_header.moveRight_settings": "Err ajgu γer tama tayfust",
+  "column_header.pin": "Senteḍ",
+  "column_header.show_settings": "Sken iγewwaṛen",
+  "column_header.unpin": "Kkes asenteḍ",
+  "column_subheading.settings": "Iγewwaṛen",
+  "community.column_settings.media_only": "Allal n teywalt kan",
+  "compose_form.direct_message_warning": "Taberraḥt-a ad d-tettwasken kan i yimseqdacen i d-yettwabedren.",
+  "compose_form.direct_message_warning_learn_more": "Issin ugar",
+  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.lock_disclaimer": "Amiḍan-ik ur yelli ara {locked}. Menwala yezmer ad k-yeḍfeṛ akken ad iẓer acu tbeṭṭuḍ akked yimeḍfaṛen-ik.",
+  "compose_form.lock_disclaimer.lock": "yettwacekkel",
+  "compose_form.placeholder": "D acu i itezzin deg uqaṛṛu-ik?",
+  "compose_form.poll.add_option": "Rnu afran",
+  "compose_form.poll.duration": "Tanzagt n tefrant",
+  "compose_form.poll.option_placeholder": "Afran {number}",
+  "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": "Taberraḥt",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.sensitive.hide": "Creḍ allal n teywalt d anafri",
+  "compose_form.sensitive.marked": "Allal n teywalt yettwacreḍ d anafri",
+  "compose_form.sensitive.unmarked": "Allal n teywalt ur yettwacreḍ ara d anafri",
+  "compose_form.spoiler.marked": "Aḍris yeffer deffir n walγu",
+  "compose_form.spoiler.unmarked": "Aḍris ur yettwaffer ara",
+  "compose_form.spoiler_placeholder": "Aru alγu-inek da",
+  "confirmation_modal.cancel": "Sefsex",
+  "confirmations.block.block_and_report": "Sewḥel & sewɛed",
+  "confirmations.block.confirm": "Sewḥel",
+  "confirmations.block.message": "Tebγiḍ s tidet ad tesḥebseḍ {name}?",
+  "confirmations.delete.confirm": "Kkes",
+  "confirmations.delete.message": "Tebγiḍ s tidet ad tekkseḍ tasuffeγt-agi?",
+  "confirmations.delete_list.confirm": "Kkes",
+  "confirmations.delete_list.message": "Tebγiḍ s tidet ad tekkseḍ tabdert-agi i lebda?",
+  "confirmations.domain_block.confirm": "Ffer taγult meṛṛa",
+  "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": "Ffeγ",
+  "confirmations.logout.message": "D tidet tebγiḍ ad teffγeḍ?",
+  "confirmations.mute.confirm": "Sgugem",
+  "confirmations.mute.explanation": "Aya ad yeffer iznan-is d wid i deg d-yettwabder neγ d-tettwabder, maca xas akka yezmer neγ tezmer awali n yiznan-inek d uḍfaṛ-ik.",
+  "confirmations.mute.message": "Tetḥeqqeḍ belli tebγiḍ asɛuggen n {name}?",
+  "confirmations.redraft.confirm": "Sfeḍ & Ɛiwed tira",
+  "confirmations.redraft.message": "Tetḥeqqeḍ belli tebγiḍ asfaḍ n waddad-agi iwakken ad s-tɛiwdeḍ tira? Ismenyifen d beḍḍuwat ad ṛuḥen, ma d tiririyin-is ad uγalent d tigujilin.",
+  "confirmations.reply.confirm": "Err",
+  "confirmations.reply.message": "Tiririt akka tura ad k-degger izen-agi i tettaruḍ. Tebγiḍ ad tkemmleḍ?",
+  "confirmations.unfollow.confirm": "Ur ḍḍafaṛ ara",
+  "confirmations.unfollow.message": "Tetḥeqqeḍ belli tebγiḍ ur teḍḍafaṛeḍ ara {name}?",
+  "conversation.delete": "Sfeḍ adiwenni",
+  "conversation.mark_as_read": "Creḍ yettwaγṛa",
+  "conversation.open": "Sken adiwenni",
+  "conversation.with": "Akked {names}",
+  "directory.federated": "Seg fedivers yettwasnen",
+  "directory.local": "Seg {domain} kan",
+  "directory.new_arrivals": "Inebgawen imaynuten",
+  "directory.recently_active": "Yermed xas melmi kan",
+  "embed.instructions": "Ẓẓu addad-agi deg usmel-inek s wenγal n tangalt yellan sdaw-agi.",
+  "embed.preview": "Akka ara d-iban:",
+  "emoji_button.activity": "Aqeddic",
+  "emoji_button.custom": "Udmawan",
+  "emoji_button.flags": "Innayen",
+  "emoji_button.food": "Tegwella & Tissit",
+  "emoji_button.label": "Sekcem imuji",
+  "emoji_button.nature": "Agama",
+  "emoji_button.not_found": "Ulac izamulen n yiḥulfan  !! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Tiγawsiwin",
+  "emoji_button.people": "Medden",
+  "emoji_button.recent": "Wid yettuseqdacen s waṭas",
+  "emoji_button.search": "Nadi…",
+  "emoji_button.search_results": "Igmaḍ u unadi",
+  "emoji_button.symbols": "Izamulen",
+  "emoji_button.travel": "Imeḍqan d Yinigen",
+  "empty_column.account_timeline": "Ulac tiberraḥin dagi!",
+  "empty_column.account_unavailable": "Ur nufi ara amaγnu-a",
+  "empty_column.blocks": "Ur tesḥebseḍ ula yiwen n umseqdac ar tura.",
+  "empty_column.bookmarked_statuses": "Ulac tiberraḥin i terniḍ γer yismenyifen-ik ar tura. Ticki terniḍ yiwet, ad d-tettwasken da.",
+  "empty_column.community": "Tasuddemt tazayezt tadigant n yisallen d tilemt. Aru ihi kra akken ad tt-teččareḍ!",
+  "empty_column.direct": "Ulac γur-k ula yiwen n yizen usrid. Ad d-yettwasken da, ticki tuzneḍ neγ teṭṭfeḍ-d yiwen.",
+  "empty_column.domain_blocks": "Ulac kra n taγult yettwaffren ar tura.",
+  "empty_column.favourited_statuses": "Ulac ula yiwet n tberraḥt deg yismenyifen-ik ar tura. Ticki Tella-d yiwet, ad d-ban da.",
+  "empty_column.favourites": "Ula yiwen ur yerri taberraḥt-agi deg yismenyifen-is. Melmi i d-yella waya, ad d-yettwasken da.",
+  "empty_column.follow_requests": "Ulac γur-k ula yiwen n usuter n teḍfeṛt. Ticki teṭṭfeḍ-d yiwen ad d-yettwasken da.",
+  "empty_column.hashtag": "Ar tura ulac kra n ugbur yesɛan assaγ γer uhacṭag-agi.",
+  "empty_column.home": "Tasuddemt tagejdant n yisallen d tilemt! Ẓer {public} neγ nadi ad tafeḍ imseqdacen-nniḍen ad ten-ḍefṛeḍ.",
+  "empty_column.home.public_timeline": "tasuddemt tazayezt n yisallen",
+  "empty_column.list": "Ar tura ur yelli kra deg tebdert-a. Ad d-yettwasken da ticki iɛeggalen n tebdert-a suffγen-d kra.",
+  "empty_column.lists": "Ulac γur-k kra n tebdert yakan. Ad d-tettwasken da ticki tesluleḍ-d yiwet.",
+  "empty_column.mutes": "Ulac γur-k imseqdacen i yettwasgugmen.",
+  "empty_column.notifications": "Ulac γur-k tilγa. Sedmer akked yemdanen-nniḍen akken ad tebduḍ adiwenni.",
+  "empty_column.public": "Ulac kra da! Aru kra, neγ ḍfeṛ imdanen i yellan deg yiqeddacen-nniḍen akken ad d-teččar tsuddemt tazayezt",
+  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.next_steps": "Smiren asebter-a, ma ur yekkis ara wugur, ẓer d akken tzemreḍ ad tesqedceḍ Masṭudun deg yiminig-nniḍen neγ deg usnas anaṣli.",
+  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "errors.unexpected_crash.report_issue": "Mmel ugur",
+  "follow_request.authorize": "Ssireg",
+  "follow_request.reject": "Agi",
+  "getting_started.developers": "Ineflayen",
+  "getting_started.directory": "Imaγnuten",
+  "getting_started.documentation": "Amnir",
+  "getting_started.heading": "Bdu",
+  "getting_started.invite": "Snebgi-d imdanen",
+  "getting_started.open_source_notice": "Mastudun d aseγzan s uγbalu yeldin. Tzemreḍ ad tɛiwneḍ neγ ad temmleḍ uguren deg GitHub {github}.",
+  "getting_started.security": "Iγewwaṛen n umiḍan",
+  "getting_started.terms": "Tiwetlin n useqdec",
+  "hashtag.column_header.tag_mode.all": "d {additional}",
+  "hashtag.column_header.tag_mode.any": "neγ {additional}",
+  "hashtag.column_header.tag_mode.none": "war {additional}",
+  "hashtag.column_settings.select.no_options_message": "Ulac isumar",
+  "hashtag.column_settings.select.placeholder": "Rnu-d ihacṭagen…",
+  "hashtag.column_settings.tag_mode.all": "Kra yellan",
+  "hashtag.column_settings.tag_mode.any": "Yiwen seg-sen",
+  "hashtag.column_settings.tag_mode.none": "Yiwen ala seg-sen",
+  "hashtag.column_settings.tag_toggle": "Glu-d s yihacṭagen imerna i ujgu-agi",
+  "home.column_settings.basic": "Igejdanen",
+  "home.column_settings.show_reblogs": "Sken-d beṭṭu",
+  "home.column_settings.show_replies": "Sken-d tiririyin",
+  "intervals.full.days": "{number, plural, one {# n wass} other {# n wussan}}",
+  "intervals.full.hours": "{number, plural, one {# n usarag} other {# n yesragen}}",
+  "intervals.full.minutes": "{number, plural, one {# n tesdat} other {# n tesdatin}}",
+  "introduction.federation.action": "Uḍfiṛ",
+  "introduction.federation.federated.headline": "Amatu",
+  "introduction.federation.federated.text": "Iznan izuyaz i d-yekkan seg yiqeddacen-nniḍen n fediverse ad banen deg tsuddemt tazayezt tamatut n yisallen.",
+  "introduction.federation.home.headline": "Agejdan",
+  "introduction.federation.home.text": "Iznan n yemdanen i teṭṭafaṛeḍ ad banen deg tsuddemt n umagger. Tzemreḍ ad tḍefṛeḍ win tebγiḍ deg uqeddac i tebγiḍ!",
+  "introduction.federation.local.headline": "Adigan",
+  "introduction.federation.local.text": "Iznan izuyaz n yemdanen i yellan deg yiwen uqeddac akked kečč ad d-banen deg tsuddemt tazayezt tadigant.",
+  "introduction.interactions.action": "Fakk tameskant!",
+  "introduction.interactions.favourite.headline": "Ismenyifen",
+  "introduction.interactions.favourite.text": "Tzemreḍ ad teǧǧeḍ kra n tberraḥt i ticki, daγen ad tiniḍ i bab-is d akken taɛǧeb-ik, s tmerna-ines γer yismenyifen-ik.",
+  "introduction.interactions.reblog.headline": "Bḍu tikelt-nniḍen",
+  "introduction.interactions.reblog.text": "Tzemreḍ ad tebḍuḍ akked yimeḍfaṛen-ik tiberraḥin n yemdanen-nniḍen s beṭṭu-nsent tikelt-nniḍen.",
+  "introduction.interactions.reply.headline": "Err",
+  "introduction.interactions.reply.text": "Tzemreḍ ad terreḍ γef tberraḥin-ik d tid n medden-nniḍen, d acu ara tent-id-iɛeqden ta deffir ta deg udiwenni.",
+  "introduction.welcome.action": "Bdu!",
+  "introduction.welcome.headline": "Isurifen imenza",
+  "introduction.welcome.text": "Anṣuf γer fediverse! Deg kra n yimiren, ad tizmireḍ ad tzzuzreḍ iznan neɣ ad tmeslayeḍ i yemddukkal deg waṭas n yiqeddacen. Maca aqeddac-agi, {domain}, mačči am wiyaḍ - deg-s i yella umaγnu-ik, ihi cfu γef yisem-is.",
+  "keyboard_shortcuts.back": "uγal ar deffir",
+  "keyboard_shortcuts.blocked": "akken ad teldiḍ tabdert n yimseqdacen yettwasḥebsen",
+  "keyboard_shortcuts.boost": "i beṭṭu tikelt-nniḍen",
+  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.description": "Aglam",
+  "keyboard_shortcuts.direct": "akken ad teldiḍ ajgu n yiznan usriden",
+  "keyboard_shortcuts.down": "i kennu γer wadda n tebdert",
+  "keyboard_shortcuts.enter": "i tildin n tsuffeγt",
+  "keyboard_shortcuts.favourite": "akken ad ternuḍ γer yismenyifen",
+  "keyboard_shortcuts.favourites": "i tildin n tebdert n yismenyifen",
+  "keyboard_shortcuts.federated": "i tildin n tsuddemt tamatut n yisallen",
+  "keyboard_shortcuts.heading": "Inegzumen n unasiw",
+  "keyboard_shortcuts.home": "i tildin n tsuddemt tagejdant n yisallen",
+  "keyboard_shortcuts.hotkey": "Inegzumen",
+  "keyboard_shortcuts.legend": "to display this legend",
+  "keyboard_shortcuts.local": "i tildin n tsuddemt tadigant n yisallen",
+  "keyboard_shortcuts.mention": "akken ad d-bedreḍ ameskar",
+  "keyboard_shortcuts.muted": "akken ad teldiḍ tabdert n yimseqdacen yettwasgugmen",
+  "keyboard_shortcuts.my_profile": "akken ad d-teldiḍ amaγnu-ik",
+  "keyboard_shortcuts.notifications": "akken ad d-teldiḍ ajgu n tilγa",
+  "keyboard_shortcuts.open_media": "to open media",
+  "keyboard_shortcuts.pinned": "i tildin n tebdert n tberraḥin yettwasentḍen",
+  "keyboard_shortcuts.profile": "akken ad d-teldiḍ amaγnu n umeskar",
+  "keyboard_shortcuts.reply": "i tririt",
+  "keyboard_shortcuts.requests": "akken ad d-teldiḍ tabdert n yisuturen n teḍfeṛt",
+  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.start": "akken ad d-teldiḍ ajgu n \"bdu\"",
+  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+  "keyboard_shortcuts.toggle_sensitivity": "i teskent/tuffra n yimidyaten",
+  "keyboard_shortcuts.toot": "i beddu n tberraḥt tamaynut",
+  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.up": "i tulin γer ufella n tebdert",
+  "lightbox.close": "Mdel",
+  "lightbox.next": "Γer zdat",
+  "lightbox.previous": "Γer deffir",
+  "lightbox.view_context": "Ẓer amnaḍ",
+  "lists.account.add": "Rnu γer tabdart",
+  "lists.account.remove": "Kkes seg tebdart",
+  "lists.delete": "Kkes tabdert",
+  "lists.edit": "Ẓreg tabdert",
+  "lists.edit.submit": "Beddel azwel",
+  "lists.new.create": "Rnu tabdart",
+  "lists.new.title_placeholder": "Azwel n tebdert tamaynut",
+  "lists.search": "Nadi gar yemdanen i teṭṭafaṛeḍ",
+  "lists.subheading": "Tibdarin-ik·im",
+  "load_pending": "{count, plural, one {# n uferdis amaynut} other {# n yiferdisen imaynuten}}",
+  "loading_indicator.label": "Asali...",
+  "media_gallery.toggle_visible": "Sken / Ffer",
+  "missing_indicator.label": "Ulac-it",
+  "missing_indicator.sublabel": "Ur nufi ara aγbalu-a",
+  "mute_modal.hide_notifications": "Tebγiḍ ad teffreḍ talγutin n umseqdac-a?",
+  "navigation_bar.apps": "Isnasen izirazen",
+  "navigation_bar.blocks": "Imseqdacen yettusḥebsen",
+  "navigation_bar.bookmarks": "Ticraḍ",
+  "navigation_bar.community_timeline": "Tasuddemt tadigant",
+  "navigation_bar.compose": "Aru taberraḥt tamaynut",
+  "navigation_bar.direct": "Iznan usridden",
+  "navigation_bar.discover": "Ẓer",
+  "navigation_bar.domain_blocks": "Tiγula yeffren",
+  "navigation_bar.edit_profile": "Ẓreg amaγnu",
+  "navigation_bar.favourites": "Ismenyifen",
+  "navigation_bar.filters": "Awalen i yettwasgugmen",
+  "navigation_bar.follow_requests": "Isuturen n teḍfeṛt",
+  "navigation_bar.follows_and_followers": "Imeḍfaṛen akked wid i teṭṭafaṛeḍ",
+  "navigation_bar.info": "Γef uqeddac-a",
+  "navigation_bar.keyboard_shortcuts": "Inegzumen n unasiw",
+  "navigation_bar.lists": "Tibdarin",
+  "navigation_bar.logout": "Ffeγ",
+  "navigation_bar.mutes": "Iseqdacen yettwasusmen",
+  "navigation_bar.personal": "Udmawan",
+  "navigation_bar.pins": "Tiberraḥin yettwasentḍen",
+  "navigation_bar.preferences": "Imenyafen",
+  "navigation_bar.public_timeline": "Tasuddemt tazayezt tamatut",
+  "navigation_bar.security": "Taγellist",
+  "notification.favourite": "{name} yesmenyef tasuffeγt-ik",
+  "notification.follow": "{name} yeṭṭafaṛ-ik",
+  "notification.follow_request": "{name} yessuter-d ad k-yeḍfeṛ",
+  "notification.mention": "{name} yebder-ik-id",
+  "notification.own_poll": "Your poll has ended",
+  "notification.poll": "A poll you have voted in has ended",
+  "notification.reblog": "{name} yebḍa taberraḥ-ik i tikelt-nniḍen",
+  "notifications.clear": "Sfeḍ tilγa",
+  "notifications.clear_confirmation": "Tebγiḍ s tidet ad tekkseḍ akk tilγa-ik i lebda?",
+  "notifications.column_settings.alert": "Tilγa n tnarit",
+  "notifications.column_settings.favourite": "Ismenyifen:",
+  "notifications.column_settings.filter_bar.advanced": "Sken-d meṛṛa tiggayin",
+  "notifications.column_settings.filter_bar.category": "Iri n usizdeg uzrib",
+  "notifications.column_settings.filter_bar.show": "Sken",
+  "notifications.column_settings.follow": "Imeḍfaṛen imaynuten:",
+  "notifications.column_settings.follow_request": "Isuturen imaynuten n teḍfeṛt:",
+  "notifications.column_settings.mention": "Abdar:",
+  "notifications.column_settings.poll": "Igemmaḍ n usenqed:",
+  "notifications.column_settings.push": "Tilγa yettudemmren",
+  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.show": "Sken-d tilγa deg ujgu",
+  "notifications.column_settings.sound": "Rmed imesli",
+  "notifications.filter.all": "Akk",
+  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.favourites": "Ismenyifen",
+  "notifications.filter.follows": "Yeṭafaṛ",
+  "notifications.filter.mentions": "Abdar",
+  "notifications.filter.polls": "Igemmaḍ n usenqed",
+  "notifications.group": "{count} n tilγa",
+  "poll.closed": "Ifukk",
+  "poll.refresh": "Smiren",
+  "poll.total_people": "{count, plural, one {# n wemdan} other {# n yemdanen}}",
+  "poll.total_votes": "{count, plural, one {# n udγaṛ} other {# n yedγaṛen}}",
+  "poll.vote": "Dγeṛ",
+  "poll.voted": "Tdeγṛeḍ γef tririt-agi",
+  "poll_button.add_poll": "Rnu asenqed",
+  "poll_button.remove_poll": "Kkes asenqed",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Bḍu gar yimseqdacen i tbedreḍ kan",
+  "privacy.direct.short": "Usrid",
+  "privacy.private.long": "Bḍu i yimeḍfaṛen-ik kan",
+  "privacy.private.short": "Imeḍfaṛen kan",
+  "privacy.public.long": "Bḍu deg tsuddemt tazayezt",
+  "privacy.public.short": "Azayez",
+  "privacy.unlisted.long": "Ur beṭṭu ara deg tsuddemt tazayezt",
+  "privacy.unlisted.short": "War tabdert",
+  "refresh": "Smiren",
+  "regeneration_indicator.label": "Asali…",
+  "regeneration_indicator.sublabel": "Tasuddemt tagejdant ara d-tettwaheggay!",
+  "relative_time.days": "{number}u",
+  "relative_time.hours": "{number}h",
+  "relative_time.just_now": "tura",
+  "relative_time.minutes": "{number}t",
+  "relative_time.seconds": "{number}s",
+  "reply_indicator.cancel": "Sefsex",
+  "report.forward": "Forward to {target}",
+  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.placeholder": "Iwenniten-nniḍen",
+  "report.submit": "Azen",
+  "report.target": "Mmel {target}",
+  "search.placeholder": "Nadi",
+  "search_popout.search_format": "Anadi yenneflin",
+  "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": "ahacṭag",
+  "search_popout.tips.status": "status",
+  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.user": "amseqdac",
+  "search_results.accounts": "Medden",
+  "search_results.hashtags": "Ihacṭagen",
+  "search_results.statuses": "Tibeṛṛaniyin",
+  "search_results.statuses_fts_disabled": "Anadi n tberraḥin s ugbur-nsent ur yermid ara deg uqeddac-agi n Mastudun.",
+  "search_results.total": "{count, number} {count, plural, one {n ugemmuḍ} other {n yigemmuḍen}}",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
+  "status.block": "Seḥbes @{name}",
+  "status.bookmark": "Creḍ",
+  "status.cancel_reblog_private": "Sefsex beṭṭu",
+  "status.cannot_reblog": "Tasuffeγt-a ur tezmir ara ad tettwabḍu tikelt-nniḍen",
+  "status.copy": "Nγel assaγ γer tasuffeγt",
+  "status.delete": "Kkes",
+  "status.detailed_status": "Detailed conversation view",
+  "status.direct": "Izen usrid i @{name}",
+  "status.embed": "Embed",
+  "status.favourite": "Rnu γer yismenyifen",
+  "status.filtered": "Yettwasizdeg",
+  "status.load_more": "Sali ugar",
+  "status.media_hidden": "Media hidden",
+  "status.mention": "Bder-d @{name}",
+  "status.more": "Ugar",
+  "status.mute": "Sussem @{name}",
+  "status.mute_conversation": "Mute conversation",
+  "status.open": "Semγeṛ tasuffeγt-agi",
+  "status.pin": "Senteḍ-itt deg umaγnu",
+  "status.pinned": "Tiberraḥin yettwasentḍen",
+  "status.read_more": "Issin ugar",
+  "status.reblog": "Bḍu",
+  "status.reblog_private": "Boost to original audience",
+  "status.reblogged_by": "{name} boosted",
+  "status.reblogs.empty": "Ula yiwen ur yebḍi taberraḥt-agi ar tura. Ticki yebḍa-tt yiwen, ad d-iban da.",
+  "status.redraft": "Sfeḍ tɛiwdeḍ tira",
+  "status.remove_bookmark": "Kkes tacreḍt",
+  "status.reply": "Err",
+  "status.replyAll": "Reply to thread",
+  "status.report": "Cetki γef @{name}",
+  "status.sensitive_warning": "Agbur amḥulfu",
+  "status.share": "Bḍu",
+  "status.show_less": "Sken-d drus",
+  "status.show_less_all": "Semẓi akk tisuffγin",
+  "status.show_more": "Sken-ed ugar",
+  "status.show_more_all": "Ẓerr ugar lebda",
+  "status.show_thread": "Show thread",
+  "status.uncached_media_warning": "Ulac-it",
+  "status.unmute_conversation": "Kkes asgugem n udiwenni",
+  "status.unpin": "Kkes asenteḍ seg umaγnu",
+  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.header": "Ahat ad tcelgeḍ deg…",
+  "tabs_bar.federated_timeline": "Amatu",
+  "tabs_bar.home": "Agejdan",
+  "tabs_bar.local_timeline": "Adigan",
+  "tabs_bar.notifications": "Tilγa",
+  "tabs_bar.search": "Nadi",
+  "time_remaining.days": "Mazal {number, plural, one {# n wass} other {# n wussan}}",
+  "time_remaining.hours": "Mazal {number, plural, one {# n usrag} other {# n yesragen}}",
+  "time_remaining.minutes": "Mazal {number, plural, one {# n tesdat} other {# n tesdatin}}",
+  "time_remaining.moments": "Moments remaining",
+  "time_remaining.seconds": "Mazal {number, plural, one {# n tasint} other {# n tsinin}}",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {n umdan} other {n yemdanen}} i yettmeslayen",
+  "trends.trending_now": "Trending now",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add media ({formats})",
+  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt",
+  "upload_form.description": "Glem-d i yemdaneni yesɛan ugur deg yiẓri",
+  "upload_form.edit": "Ẓreg",
+  "upload_form.undo": "Kkes",
+  "upload_form.video_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt neγ deg yiẓri",
+  "upload_modal.analyzing_picture": "Tasleḍt n tugna tetteddu…",
+  "upload_modal.apply": "Snes",
+  "upload_modal.description_placeholder": "Aberraγ arurad ineggez nnig n uqjun amuṭṭis",
+  "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.preview_label": "Preview ({ratio})",
+  "upload_progress.label": "Asali iteddu...",
+  "video.close": "Mdel tabidyutt",
+  "video.download": "Sidered afaylu",
+  "video.exit_fullscreen": "Ffeγ seg ugdil aččuran",
+  "video.expand": "Semγeṛ tavidyut",
+  "video.fullscreen": "Agdil aččuran",
+  "video.hide": "Ffer tabidyutt",
+  "video.mute": "Gzem imesli",
+  "video.pause": "Sgunfu",
+  "video.play": "Seddu",
+  "video.unmute": "Rmed imesli"
+}
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index ba13c7ddf..b307a3161 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Тізімге қосу немесе жою",
   "account.badges.bot": "Бот",
+  "account.badges.group": "Group",
   "account.block": "Бұғаттау @{name}",
   "account.block_domain": "Домендегі барлығын бұғатта {domain}",
   "account.blocked": "Бұғатталды",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Бағалау шектеулі",
   "alert.unexpected.message": "Бір нәрсе дұрыс болмады.",
   "alert.unexpected.title": "Өй!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} аптасына",
   "boost_modal.combo": "Келесіде өткізіп жіберу үшін басыңыз {combo}",
   "bundle_column_error.body": "Бұл компонентті жүктеген кезде бір қате пайда болды.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Бұл компонентті жүктеген кезде бір қате пайда болды.",
   "bundle_modal_error.retry": "Қайтадан көріңіз",
   "column.blocks": "Бұғатталғандар",
+  "column.bookmarks": "Бетбелгілер",
   "column.community": "Жергілікті желі",
   "column.direct": "Жеке хаттар",
   "column.directory": "Профильдерді аралау",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Сауалнама мерзімі",
   "compose_form.poll.option_placeholder": "Жауап {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Сезімтал ретінде белгіле",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Жазба жоқ ешқандай!",
   "empty_column.account_unavailable": "Профиль қолжетімді емес",
   "empty_column.blocks": "Ешкімді бұғаттамағансыз.",
+  "empty_column.bookmarked_statuses": "Ешқандай жазба Бетбелгілер тізіміне қосылмапты. Қосылғаннан кейін осында жинала бастайды.",
   "empty_column.community": "Жергілікті желі бос. Сіз бастап жазыңыз!",
   "empty_column.direct": "Әзірше дым хат жоқ. Өзіңіз жазып көріңіз алдымен.",
   "empty_column.domain_blocks": "Бұғатталған домен жоқ.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "үнсіздер тізімін ашу",
   "keyboard_shortcuts.my_profile": "профиліңізді ашу",
   "keyboard_shortcuts.notifications": "ескертпелер бағанын ашу",
+  "keyboard_shortcuts.open_media": "медианы ашу үшін",
   "keyboard_shortcuts.pinned": "жабыстырылған жазбаларды көру",
   "keyboard_shortcuts.profile": "автор профилін қарау",
   "keyboard_shortcuts.reply": "жауап жазу",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Бұл қолданушы ескертпелерін жасырамыз ба?",
   "navigation_bar.apps": "Мобиль қосымшалар",
   "navigation_bar.blocks": "Бұғатталғандар",
+  "navigation_bar.bookmarks": "Бетбелгілер",
   "navigation_bar.community_timeline": "Жергілікті желі",
   "navigation_bar.compose": "Жаңа жазба бастау",
   "navigation_bar.direct": "Жеке хаттар",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Қауіпсіздік",
   "notification.favourite": "{name} жазбаңызды таңдаулыға қосты",
   "notification.follow": "{name} сізге жазылды",
+  "notification.follow_request": "{name} сізге жазылғысы келеді",
   "notification.mention": "{name} сізді атап өтті",
+  "notification.own_poll": "Сауалнама аяқталды",
   "notification.poll": "Бұл сауалнаманың мерзімі аяқталыпты",
   "notification.reblog": "{name} жазбаңызды бөлісті",
   "notifications.clear": "Ескертпелерді тазарт",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Жедел сүзгі",
   "notifications.column_settings.filter_bar.show": "Көрсету",
   "notifications.column_settings.follow": "Жаңа оқырмандар:",
+  "notifications.column_settings.follow_request": "Жазылуға жаңа сұранымдар:",
   "notifications.column_settings.mention": "Аталымдар:",
   "notifications.column_settings.poll": "Нәтижелері:",
   "notifications.column_settings.push": "Push ескертпелер",
@@ -344,6 +355,7 @@
   "status.admin_account": "@{name} үшін модерация интерфейсін аш",
   "status.admin_status": "Бұл жазбаны модерация интерфейсінде аш",
   "status.block": "Бұғаттау @{name}",
+  "status.bookmark": "Бетбелгі",
   "status.cancel_reblog_private": "Бөліспеу",
   "status.cannot_reblog": "Бұл жазба бөлісілмейді",
   "status.copy": "Жазба сілтемесін көшір",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} бөлісті",
   "status.reblogs.empty": "Бұл жазбаны әлі ешкім бөліспеді. Біреу бөліскен кезде осында көрінеді.",
   "status.redraft": "Өшіру & қайта қарастыру",
+  "status.remove_bookmark": "Бетбелгілерден алып тастау",
   "status.reply": "Жауап",
   "status.replyAll": "Тақырыпқа жауап",
   "status.report": "Шағым @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Медиа қосу (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Файл жүктеу лимитінен асып кеттіңіз.",
   "upload_error.poll": "Сауалнамамен бірге файл жүктеуге болмайды.",
+  "upload_form.audio_description": "Есту қабілеті нашар адамдарға сипаттама беріңіз",
   "upload_form.description": "Көру қабілеті нашар адамдар үшін сипаттаңыз",
   "upload_form.edit": "Түзету",
   "upload_form.undo": "Өшіру",
+  "upload_form.video_description": "Есту немесе көру қабілеті нашар адамдарға сипаттама беріңіз",
   "upload_modal.analyzing_picture": "Суретті анализ жасау…",
   "upload_modal.apply": "Қолдану",
   "upload_modal.description_placeholder": "Щучинск съезіндегі өрт пе? Вагон-үй, аэромобиль һәм ұшақ фюзеляжы цехінен ғой",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Превью ({ratio})",
   "upload_progress.label": "Жүктеп жатыр...",
   "video.close": "Видеоны жабу",
+  "video.download": "Файлды түсіру",
   "video.exit_fullscreen": "Толық экраннан шық",
   "video.expand": "Видеоны аш",
   "video.fullscreen": "Толық экран",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index 39ca86a0c..278f6b14c 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Add or Remove from lists",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Group",
   "account.block": "Block @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Something went wrong while loading this component.",
   "bundle_modal_error.retry": "Try again",
   "column.blocks": "Blocked users",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
   "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Poll duration",
   "compose_form.poll.option_placeholder": "Choice {number}",
   "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
+  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
   "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "to reply",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mentions:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
@@ -344,6 +355,7 @@
   "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",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boosted",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Reply",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Add media ({formats})",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "Edit",
   "upload_form.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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "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",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index e7c59d68f..5a3b409c0 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -1,19 +1,20 @@
 {
   "account.add_or_remove_from_list": "리스트에 추가 혹은 삭제",
   "account.badges.bot": "봇",
+  "account.badges.group": "그룹",
   "account.block": "@{name}을 차단",
   "account.block_domain": "{domain} 전체를 숨김",
-  "account.blocked": "차단 됨",
+  "account.blocked": "차단됨",
   "account.cancel_follow_request": "팔로우 요청 취소",
-  "account.direct": "@{name}으로부터의 다이렉트 메시지",
+  "account.direct": "@{name}의 다이렉트 메시지",
   "account.domain_blocked": "도메인 숨겨짐",
   "account.edit_profile": "프로필 편집",
-  "account.endorse": "프로필에 나타내기",
+  "account.endorse": "프로필에 보이기",
   "account.follow": "팔로우",
   "account.followers": "팔로워",
-  "account.followers.empty": "아직 아무도 이 유저를 팔로우 하고 있지 않습니다.",
+  "account.followers.empty": "아직 아무도 이 유저를 팔로우하고 있지 않습니다.",
   "account.follows": "팔로우",
-  "account.follows.empty": "이 유저는 아직 아무도 팔로우 하고 있지 않습니다.",
+  "account.follows.empty": "이 유저는 아직 아무도 팔로우하고 있지 않습니다.",
   "account.follows_you": "날 팔로우합니다",
   "account.hide_reblogs": "@{name}의 부스트를 숨기기",
   "account.last_status": "마지막 활동",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "빈도 제한",
   "alert.unexpected.message": "예측하지 못한 에러가 발생했습니다.",
   "alert.unexpected.title": "앗!",
+  "announcement.announcement": "공지사항",
   "autosuggest_hashtag.per_week": "주간 {count}회",
   "boost_modal.combo": "{combo}를 누르면 다음부터 이 과정을 건너뛸 수 있습니다",
   "bundle_column_error.body": "컴포넌트를 불러오는 과정에서 문제가 발생했습니다.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "컴포넌트를 불러오는 과정에서 문제가 발생했습니다.",
   "bundle_modal_error.retry": "다시 시도",
   "column.blocks": "차단 중인 사용자",
+  "column.bookmarks": "갈무리",
   "column.community": "로컬 타임라인",
   "column.direct": "다이렉트 메시지",
   "column.directory": "프로필 둘러보기",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "투표 기간",
   "compose_form.poll.option_placeholder": "{number}번 항목",
   "compose_form.poll.remove_option": "이 항목 삭제",
+  "compose_form.poll.switch_to_multiple": "다중 선택이 가능한 투표로 변경",
+  "compose_form.poll.switch_to_single": "단일 선택 투표로 변경",
   "compose_form.publish": "툿",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "미디어를 민감함으로 설정하기",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "여긴 툿이 없어요!",
   "empty_column.account_unavailable": "프로필 사용 불가",
   "empty_column.blocks": "아직 아무도 차단하지 않았습니다.",
+  "empty_column.bookmarked_statuses": "아직 갈무리한 툿이 없습니다. 툿을 갈무리하면 여기에 나타납니다.",
   "empty_column.community": "로컬 타임라인에 아무 것도 없습니다. 아무거나 적어 보세요!",
   "empty_column.direct": "아직 다이렉트 메시지가 없습니다. 다이렉트 메시지를 보내거나 받은 경우, 여기에 표시 됩니다.",
   "empty_column.domain_blocks": "아직 숨겨진 도메인이 없습니다.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "뮤트 된 유저 리스트 열기",
   "keyboard_shortcuts.my_profile": "내 프로필 열기",
   "keyboard_shortcuts.notifications": "알림 컬럼 열기",
+  "keyboard_shortcuts.open_media": "미디어 열기",
   "keyboard_shortcuts.pinned": "고정 툿 리스트 열기",
   "keyboard_shortcuts.profile": "프로필 열기",
   "keyboard_shortcuts.reply": "답장",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "이 사용자로부터의 알림을 숨기시겠습니까?",
   "navigation_bar.apps": "모바일 앱",
   "navigation_bar.blocks": "차단한 사용자",
+  "navigation_bar.bookmarks": "갈무리",
   "navigation_bar.community_timeline": "로컬 타임라인",
   "navigation_bar.compose": "새 툿 작성",
   "navigation_bar.direct": "다이렉트 메시지",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "보안",
   "notification.favourite": "{name}님이 즐겨찾기 했습니다",
   "notification.follow": "{name}님이 나를 팔로우 했습니다",
+  "notification.follow_request": "{name}님이 팔로우 요청을 보냈습니다",
   "notification.mention": "{name}님이 답글을 보냈습니다",
+  "notification.own_poll": "내 투표가 끝났습니다",
   "notification.poll": "당신이 참여 한 투표가 종료되었습니다",
   "notification.reblog": "{name}님이 부스트 했습니다",
   "notifications.clear": "알림 지우기",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "퀵 필터 바",
   "notifications.column_settings.filter_bar.show": "표시",
   "notifications.column_settings.follow": "새 팔로워:",
+  "notifications.column_settings.follow_request": "새 팔로우 요청:",
   "notifications.column_settings.mention": "답글:",
   "notifications.column_settings.poll": "투표 결과:",
   "notifications.column_settings.push": "푸시 알림",
@@ -341,9 +352,10 @@
   "search_results.statuses": "툿",
   "search_results.statuses_fts_disabled": "이 마스토돈 서버에선 툿의 내용을 통한 검색이 활성화 되어 있지 않습니다.",
   "search_results.total": "{count, number}건의 결과",
-  "status.admin_account": "@{name}에 대한 모더레이션 인터페이스 열기",
-  "status.admin_status": "모더레이션 인터페이스에서 이 게시물 열기",
+  "status.admin_account": "@{name}에 대한 중재 화면 열기",
+  "status.admin_status": "중재 화면에서 이 게시물 열기",
   "status.block": "@{name} 차단",
+  "status.bookmark": "갈무리",
   "status.cancel_reblog_private": "부스트 취소",
   "status.cannot_reblog": "이 포스트는 부스트 할 수 없습니다",
   "status.copy": "게시물 링크 복사",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name}님이 부스트 했습니다",
   "status.reblogs.empty": "아직 아무도 이 툿을 부스트하지 않았습니다. 부스트 한 사람들이 여기에 표시 됩니다.",
   "status.redraft": "지우고 다시 쓰기",
+  "status.remove_bookmark": "갈무리 삭제",
   "status.reply": "답장",
   "status.replyAll": "전원에게 답장",
   "status.report": "신고",
@@ -400,9 +413,11 @@
   "upload_button.label": "미디어 추가 (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "파일 업로드 제한에 도달했습니다.",
   "upload_error.poll": "파일 업로드는 투표와 함께 첨부할 수 없습니다.",
+  "upload_form.audio_description": "청각 장애인을 위한 설명",
   "upload_form.description": "시각장애인을 위한 설명",
   "upload_form.edit": "편집",
   "upload_form.undo": "삭제",
+  "upload_form.video_description": "청각, 시각 장애인을 위한 설명",
   "upload_modal.analyzing_picture": "이미지 분석 중…",
   "upload_modal.apply": "적용",
   "upload_modal.description_placeholder": "다람쥐 헌 쳇바퀴 타고파",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "미리보기 ({ratio})",
   "upload_progress.label": "업로드 중...",
   "video.close": "동영상 닫기",
+  "video.download": "파일 다운로드",
   "video.exit_fullscreen": "전체화면 나가기",
   "video.expand": "동영상 확장",
   "video.fullscreen": "전체화면",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 39ca86a0c..278f6b14c 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Add or Remove from lists",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Group",
   "account.block": "Block @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Something went wrong while loading this component.",
   "bundle_modal_error.retry": "Try again",
   "column.blocks": "Blocked users",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
   "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Poll duration",
   "compose_form.poll.option_placeholder": "Choice {number}",
   "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
+  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
   "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "to reply",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mentions:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
@@ -344,6 +355,7 @@
   "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",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boosted",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Reply",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Add media ({formats})",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "Edit",
   "upload_form.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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "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",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 1c0e35501..b2f8fedbf 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Pievienot vai noņemt no saraksta",
   "account.badges.bot": "Bots",
+  "account.badges.group": "Group",
   "account.block": "Bloķēt @{name}",
   "account.block_domain": "Slēpt visu no {domain}",
   "account.blocked": "Bloķēts",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "Negaidīta kļūda.",
   "alert.unexpected.title": "Ups!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "Nospied {combo} lai izlaistu šo nākamreiz",
   "bundle_column_error.body": "Kaut kas nogāja greizi ielādējot šo komponenti.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Kaut kas nogāja greizi ielādējot šo komponenti.",
   "bundle_modal_error.retry": "Mēģini vēlreiz",
   "column.blocks": "Bloķētie lietotāji",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Lokālā laika līnija",
   "column.direct": "Privātās ziņas",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "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": "Publicēt",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Šeit ziņojumu nav!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "Tu neesi vēl nevienu bloķējis.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "Lokālā laika līnija ir tukša. :/ Ieraksti kaut ko lai sākas rosība!",
   "empty_column.direct": "Tev nav privāto ziņu. Tiklīdz saņemsi tās šeit parādīsies.",
   "empty_column.domain_blocks": "Slēpto domēnu vēl nav.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "to reply",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mentions:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
@@ -344,6 +355,7 @@
   "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",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boosted",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Reply",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Add media ({formats})",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "Edit",
   "upload_form.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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "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",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index 5189e8ea8..90c8d2418 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Додади или одстрани од листа",
   "account.badges.bot": "Бот",
+  "account.badges.group": "Group",
   "account.block": "Блокирај @{name}",
   "account.block_domain": "Сокријај се од {domain}",
   "account.blocked": "Блокиран",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "Неочекувана грешка.",
   "alert.unexpected.title": "Упс!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} неделно",
   "boost_modal.combo": "Кликни {combo} за да го прескокниш ова нареден пат",
   "bundle_column_error.body": "Се случи проблем при вчитувањето.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Настана грешка при прикажувањето на оваа веб-страница.",
   "bundle_modal_error.retry": "Обидете се повторно",
   "column.blocks": "Блокирани корисници",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Локална временска зона",
   "column.direct": "Директна порака",
   "column.directory": "Види профили",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Времетрање на анкета",
   "compose_form.poll.option_placeholder": "Избери {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Обележи медиа како сензитивна",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "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.direct": "Немате директни пораки. Кога ќе пратите или примите, ќе се појават тука.",
   "empty_column.domain_blocks": "Немате сокриени домеини уште.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "одговори",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Безбедност",
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mentions:",
   "notifications.column_settings.poll": "Резултати од анкета:",
   "notifications.column_settings.push": "Пуш нотификации",
@@ -344,6 +355,7 @@
   "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",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boosted",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Reply",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Add media ({formats})",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "Edit",
   "upload_form.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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "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",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index f331590de..6a042e8c4 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -1,16 +1,17 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "പട്ടികയിൽ ചേർക്കുകയോ അല്ലെങ്കിൽ മാറ്റുകയോ ചെയ്യുക",
   "account.badges.bot": "റോബോട്ട്",
+  "account.badges.group": "Group",
   "account.block": "@{name} നെ ബ്ലോക്ക് ചെയ്യുക",
-  "account.block_domain": "{domain} ഇൽ നിന്നുള്ള എല്ലാം മറയ്കുക",
+  "account.block_domain": "{domain} ൽ നിന്നുള്ള എല്ലാം മറയ്കുക",
   "account.blocked": "തടഞ്ഞു",
-  "account.cancel_follow_request": "Cancel follow request",
-  "account.direct": "നേരിട്ട് മെസേജ് അയക്കുക{name}",
-  "account.domain_blocked": "Domain hidden",
+  "account.cancel_follow_request": "പിന്തുടരാനുള്ള അപേക്ഷ നിരസിക്കുക",
+  "account.direct": "@{name} ന് നേരിട്ട് മെസേജ് അയക്കുക",
+  "account.domain_blocked": "മേഖല മറയ്ക്കപ്പെട്ടിരിക്കുന്നു",
   "account.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "പ്രൊഫൈലിൽ പ്രകടമാക്കുക",
   "account.follow": "പിന്തുടരുക",
-  "account.followers": "നിങ്ങളെ പിന്തുടരുന്നവർ",
+  "account.followers": "പിന്തുടരുന്നവർ",
   "account.followers.empty": "ഈ ഉപയോക്താവിനെ ആരും ഇതുവരെ പിന്തുടരുന്നില്ല.",
   "account.follows": "പിന്തുടരുന്നു",
   "account.follows.empty": "ഈ ഉപയോക്താവ് ആരേയും ഇതുവരെ പിന്തുടരുന്നില്ല.",
@@ -18,131 +19,136 @@
   "account.hide_reblogs": "@{name} ബൂസ്റ്റ് ചെയ്തവ മറയ്കുക",
   "account.last_status": "അവസാനം കണ്ടത്",
   "account.link_verified_on": "ഈ ലിങ്കിന്റെ ഉടമസ്തത {date} ഇൽ ഉറപ്പാക്കിയതാണ്",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.locked_info": "ഈ അംഗത്വത്തിന്റെ സ്വകാര്യതാ നിലപാട് അനുസരിച്ച് പിന്തുടരുന്നവരെ തിരഞ്ഞെടുക്കാനുള്ള വിവേചനാധികാരം ഉടമസ്ഥനിൽ നിഷിപ്തമായിരിക്കുന്നു.",
   "account.media": "മീഡിയ",
-  "account.mention": "Mention @{name}",
-  "account.moved_to": "{name} has moved to:",
+  "account.mention": "@{name} സൂചിപ്പിക്കുക",
+  "account.moved_to": "{name} ഇതിലേക്ക് മാറിയിരിക്കുന്നു:",
   "account.mute": "നിശ്ശബ്ദമാക്കുക @{name}",
-  "account.mute_notifications": "Mute notifications from @{name}",
+  "account.mute_notifications": "@{name} യിൽ നിന്നുള്ള അറിയിപ്പുകൾ നിശബ്ദമാക്കുക",
   "account.muted": "നിശ്ശബ്ദമാക്കിയിരിക്കുന്നു",
-  "account.never_active": "ഒരിക്കലും വേണ്ട",
+  "account.never_active": "ഒരിക്കലും ഇല്ല",
   "account.posts": "ടൂട്ടുകൾ",
   "account.posts_with_replies": "ടൂട്ടുകളും മറുപടികളും",
   "account.report": "റിപ്പോർട്ട് ചെയ്യുക @{name}",
-  "account.requested": "Awaiting approval",
-  "account.share": "Share @{name}'s profile",
-  "account.show_reblogs": "Show boosts from @{name}",
+  "account.requested": "അനുവാദത്തിനായി കാത്തിരിക്കുന്നു. പിന്തുടരാനുള്ള അപേക്ഷ റദ്ദാക്കുവാൻ ഞെക്കുക",
+  "account.share": "@{name} ന്റെ പ്രൊഫൈൽ പങ്കുവെക്കുക",
+  "account.show_reblogs": "@{name} ൽ നിന്നുള്ള ബൂസ്റ്റുകൾ കാണിക്കുക",
   "account.unblock": "ബ്ലോക്ക് മാറ്റുക @{name}",
-  "account.unblock_domain": "Unhide {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unblock_domain": "{domain} വെളിപ്പെടുത്തുക",
+  "account.unendorse": "പ്രൊഫൈലിൽ പ്രകടമാക്കാതിരിക്കുക",
   "account.unfollow": "പിന്തുടരുന്നത് നിര്‍ത്തുക",
   "account.unmute": "നിശ്ശബ്ദമാക്കുന്നത് നിർത്തുക @{name}",
-  "account.unmute_notifications": "Unmute notifications from @{name}",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "account.unmute_notifications": "@{name} യിൽ നിന്നുള്ള അറിയിപ്പുകൾ പ്രസിദ്ധപ്പെടുത്തുക",
+  "alert.rate_limited.message": "{retry_time, time, medium} നു ശേഷം വീണ്ടും ശ്രമിക്കുക.",
+  "alert.rate_limited.title": "തോത് പരിമിതപ്പെടുത്തിയിരിക്കുന്നു",
   "alert.unexpected.message": "അപ്രതീക്ഷിതമായി എന്തോ സംഭവിച്ചു.",
   "alert.unexpected.title": "ശ്ശോ!",
-  "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.",
+  "announcement.announcement": "Announcement",
+  "autosuggest_hashtag.per_week": "ആഴ്ച തോറും {count}",
+  "boost_modal.combo": "അടുത്ത തവണ ഇത് ഒഴിവാക്കുവാൻ {combo} ഞെക്കാവുന്നതാണ്",
+  "bundle_column_error.body": "ഈ ഘടകം പ്രദശിപ്പിക്കുമ്പോൾ എന്തോ കുഴപ്പം സംഭവിച്ചു.",
   "bundle_column_error.retry": "വീണ്ടും ശ്രമിക്കുക",
-  "bundle_column_error.title": "Network error",
+  "bundle_column_error.title": "ശൃംഖലയിലെ പിഴവ്",
   "bundle_modal_error.close": "അടയ്ക്കുക",
   "bundle_modal_error.message": "ഈ വെബ്പേജ് പ്രദർശിപ്പിക്കുമ്പോൾ എന്തോ കുഴപ്പം സംഭവിച്ചു.",
   "bundle_modal_error.retry": "വീണ്ടും ശ്രമിക്കുക",
-  "column.blocks": "Blocked users",
-  "column.community": "Local timeline",
-  "column.direct": "Direct messages",
-  "column.directory": "Browse profiles",
-  "column.domain_blocks": "Hidden domains",
-  "column.favourites": "Favourites",
-  "column.follow_requests": "Follow requests",
-  "column.home": "Home",
-  "column.lists": "Lists",
-  "column.mutes": "Muted users",
-  "column.notifications": "Notifications",
-  "column.pins": "Pinned toot",
-  "column.public": "Federated timeline",
-  "column_back_button.label": "Back",
-  "column_header.hide_settings": "Hide settings",
-  "column_header.moveLeft_settings": "Move column to the left",
-  "column_header.moveRight_settings": "Move column to the right",
-  "column_header.pin": "Pin",
-  "column_header.show_settings": "Show settings",
-  "column_header.unpin": "Unpin",
-  "column_subheading.settings": "Settings",
-  "community.column_settings.media_only": "Media only",
-  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "column.blocks": "തടയപ്പെട്ട ഉപയോക്താക്കൾ",
+  "column.bookmarks": "Bookmarks",
+  "column.community": "പ്രാദേശികമായ സമയരേഖ",
+  "column.direct": "നേരിട്ടുള്ള സന്ദേശങ്ങൾ",
+  "column.directory": "പ്രൊഫൈലുകൾ മറിച്ചുനോക്കുക",
+  "column.domain_blocks": "മറയ്ക്കപ്പെട്ട മേഖലകൾ",
+  "column.favourites": "പ്രിയപ്പെട്ടവ",
+  "column.follow_requests": "പിന്തുടരാനുള്ള അഭ്യർത്ഥനകൾ",
+  "column.home": "ഭവനം",
+  "column.lists": "പട്ടികകൾ",
+  "column.mutes": "നിശബ്ദമാക്കപ്പെട്ട ഉപയോക്താക്കൾ",
+  "column.notifications": "അറിയിപ്പുകൾ",
+  "column.pins": "ഉറപ്പിച്ചു നിറുത്തിയിരിക്കുന്ന ടൂട്ടുകൾ",
+  "column.public": "സംയുക്തമായ സമയരേഖ",
+  "column_back_button.label": "പുറകിലേക്ക്",
+  "column_header.hide_settings": "സജ്ജീകരണങ്ങള്‍ മറയ്ക്കുക",
+  "column_header.moveLeft_settings": "എഴുത്തുപംക്തി ഇടത്തോട്ട് മാറ്റുക",
+  "column_header.moveRight_settings": "എഴുത്തുപംക്തി വലത്തോട്ട് മാറ്റുക",
+  "column_header.pin": "ഉറപ്പിച്ചു നിറുത്തുക",
+  "column_header.show_settings": "ക്രമീകരണങ്ങൾ കാണിക്കുക",
+  "column_header.unpin": "ഇളക്കി മാറ്റുക",
+  "column_subheading.settings": "ക്രമീകരണങ്ങള്‍",
+  "community.column_settings.media_only": "മാധ്യമങ്ങൾ മാത്രം",
+  "compose_form.direct_message_warning": "പരാമർശിക്കപ്പെട്ടിരിക്കുന്ന ഉപയോഗ്താക്കൾക്കെ ഈ ടൂട്ട് അയക്കപ്പെടുകയുള്ളു.",
+  "compose_form.direct_message_warning_learn_more": "കൂടുതൽ പഠിക്കുക",
+  "compose_form.hashtag_warning": "ഈ ടൂട്ട് പട്ടികയിൽ ഇല്ലാത്തതിനാൽ ഒരു ചർച്ചാവിഷയത്തിന്റെ പട്ടികയിലും പെടുകയില്ല. പരസ്യമായ ടൂട്ടുകൾ മാത്രമേ ചർച്ചാവിഷയം അടിസ്ഥാനമാക്കി തിരയുവാൻ സാധിക്കുകയുള്ളു.",
   "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
   "compose_form.lock_disclaimer.lock": "locked",
-  "compose_form.placeholder": "What is on your mind?",
+  "compose_form.placeholder": "നിങ്ങളുടെ മനസ്സിൽ എന്താണ്?",
   "compose_form.poll.add_option": "Add a choice",
-  "compose_form.poll.duration": "Poll duration",
+  "compose_form.poll.duration": "തിരഞ്ഞെടുപ്പിന്റെ സമയദൈർഖ്യം",
   "compose_form.poll.option_placeholder": "Choice {number}",
   "compose_form.poll.remove_option": "Remove this choice",
-  "compose_form.publish": "Toot",
+  "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
   "compose_form.sensitive.marked": "Media is marked as sensitive",
   "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
-  "compose_form.spoiler.marked": "Text is hidden behind warning",
-  "compose_form.spoiler.unmarked": "Text is not hidden",
-  "compose_form.spoiler_placeholder": "Write your warning here",
-  "confirmation_modal.cancel": "Cancel",
+  "compose_form.spoiler.marked": "എഴുത്ത് മുന്നറിയിപ്പിനാൽ മറച്ചിരിക്കുന്നു",
+  "compose_form.spoiler.unmarked": "എഴുത്ത് മറയ്ക്കപ്പെട്ടിട്ടില്ല",
+  "compose_form.spoiler_placeholder": "നിങ്ങളുടെ മുന്നറിയിപ്പ് ഇവിടെ എഴുതുക",
+  "confirmation_modal.cancel": "റദ്ദാക്കുക",
   "confirmations.block.block_and_report": "Block & Report",
-  "confirmations.block.confirm": "Block",
+  "confirmations.block.confirm": "തടയുക",
   "confirmations.block.message": "Are you sure you want to block {name}?",
-  "confirmations.delete.confirm": "Delete",
+  "confirmations.delete.confirm": "മായ്ക്കുക",
   "confirmations.delete.message": "Are you sure you want to delete this status?",
-  "confirmations.delete_list.confirm": "Delete",
+  "confirmations.delete_list.confirm": "മായ്ക്കുക",
   "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
   "confirmations.domain_block.confirm": "Hide entire domain",
   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
-  "confirmations.logout.confirm": "Log out",
+  "confirmations.logout.confirm": "പുറത്തുകടക്കുക",
   "confirmations.logout.message": "Are you sure you want to log out?",
-  "confirmations.mute.confirm": "Mute",
+  "confirmations.mute.confirm": "നിശ്ശബ്ദമാക്കുക",
   "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
   "confirmations.mute.message": "Are you sure you want to mute {name}?",
-  "confirmations.redraft.confirm": "Delete & redraft",
-  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
-  "confirmations.reply.confirm": "Reply",
-  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
-  "confirmations.unfollow.confirm": "Unfollow",
-  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
-  "conversation.delete": "Delete conversation",
-  "conversation.mark_as_read": "Mark as read",
-  "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
+  "confirmations.redraft.confirm": "മായിച്ച് മാറ്റങ്ങൾ വരുത്തി വീണ്ടും എഴുതുക",
+  "confirmations.redraft.message": "നിങ്ങൾ ഉറപ്പായും ഈ കുറിപ്പ് മായ്ച്ച് മാറ്റങ്ങൾ വരുത്തി വീണ്ടും എഴുതുവാൻ താല്പര്യപ്പെടുന്നുവോ? അങ്ങനെ ചെയ്യുന്ന പക്ഷം ഇതിനു ലഭിച്ചിരിക്കുന്ന പ്രിയപ്പെടലുകളും ബൂസ്റ്റുകളും ആദ്യമുണ്ടായിരുന്ന കുറിപ്പിന് ലഭിച്ചിരുന്ന മറുപടികൾ ഒറ്റപ്പെടുകയും ചെയ്യും.",
+  "confirmations.reply.confirm": "മറുപടി",
+  "confirmations.reply.message": "ഇപ്പോൾ മറുപടി കൊടുക്കുന്നത് നിങ്ങൾ എഴുതിക്കൊണ്ടിരിക്കുന്ന സന്ദേശത്തിന് മുകളിൽ എഴുതാൻ കാരണമാകും. തീർച്ചയായും മുൻപോട്ട് പോകാൻ തീരുമാനിച്ചുവോ?",
+  "confirmations.unfollow.confirm": "പിന്തുടരുന്നത് നിര്‍ത്തുക",
+  "confirmations.unfollow.message": "നിങ്ങൾ {name} യെ പിന്തുടരുന്നത് നിർത്തുവാൻ തീർച്ചയായും തീരുമാനിച്ചുവോ?",
+  "conversation.delete": "സംഭാഷണം മായിക്കുക",
+  "conversation.mark_as_read": "വായിച്ചതായി അടയാളപ്പെടുത്തുക",
+  "conversation.open": "സംഭാഷണം കാണുക",
+  "conversation.with": "{names} കൂടെ",
+  "directory.federated": "അറിയപ്പെടുന്ന ഫെഡിവേഴ്‌സ്ൽ നിന്ന്",
+  "directory.local": "{domain} ൽ നിന്ന് മാത്രം",
+  "directory.new_arrivals": "പുതിയ വരവുകൾ",
+  "directory.recently_active": "അടുത്തിടെയായി സജീവമായ",
   "embed.instructions": "Embed this status on your website by copying the code below.",
-  "embed.preview": "Here is what it will look like:",
-  "emoji_button.activity": "Activity",
-  "emoji_button.custom": "Custom",
-  "emoji_button.flags": "Flags",
-  "emoji_button.food": "Food & Drink",
-  "emoji_button.label": "Insert emoji",
-  "emoji_button.nature": "Nature",
+  "embed.preview": "ഇത് ഇങ്ങനെ കാണപ്പെടും:",
+  "emoji_button.activity": "പ്രവര്‍ത്തനം",
+  "emoji_button.custom": "സ്വന്തമായ ഭേദഗതി",
+  "emoji_button.flags": "കൊടികൾ",
+  "emoji_button.food": "ഭക്ഷണവും പാനീയവും",
+  "emoji_button.label": "ഇമോജി ചേർക്കുക",
+  "emoji_button.nature": "പ്രകൃതി",
   "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
-  "emoji_button.objects": "Objects",
-  "emoji_button.people": "People",
-  "emoji_button.recent": "Frequently used",
-  "emoji_button.search": "Search...",
-  "emoji_button.search_results": "Search results",
-  "emoji_button.symbols": "Symbols",
-  "emoji_button.travel": "Travel & Places",
-  "empty_column.account_timeline": "No toots here!",
-  "empty_column.account_unavailable": "Profile unavailable",
-  "empty_column.blocks": "You haven't blocked any users yet.",
-  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
-  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
-  "empty_column.domain_blocks": "There are no hidden domains yet.",
-  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
-  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
+  "emoji_button.objects": "വസ്തുക്കൾ",
+  "emoji_button.people": "ആളുകൾ",
+  "emoji_button.recent": "അടിക്കടി ഉപയോഗിക്കുന്നവ",
+  "emoji_button.search": "തിരയുക...",
+  "emoji_button.search_results": "തിരച്ചിൽ ഫലങ്ങൾ",
+  "emoji_button.symbols": "ചിഹ്നങ്ങൾ",
+  "emoji_button.travel": "യാത്രയും സ്ഥലങ്ങളും",
+  "empty_column.account_timeline": "ഇവിടെ ടൂട്ടുകൾ ഇല്ല!",
+  "empty_column.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.direct": "നിങ്ങൾക്ക് ഇതുവരെ നേരിട്ടുള്ള സന്ദേശങ്ങൾ ഒന്നുമില്ല. നിങ്ങൾ അങ്ങനെ ഒന്ന് അയക്കുകയോ, നിങ്ങൾക്ക് ലഭിക്കുകയോ ചെയ്യുന്നപക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.",
+  "empty_column.domain_blocks": "മറയ്ക്കപ്പെട്ടിരിക്കുന്ന മേഖലകൾ ഇതുവരെ ഇല്ല.",
+  "empty_column.favourited_statuses": "നിങ്ങൾക്ക് ഇത് വരെ ഒരു പ്രിയപ്പെട്ട ടൂട്ടും ഇല്ല. നിങ്ങൾ അങ്ങനെ ഒന്ന് പ്രിയപ്പെടുന്ന പക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.",
+  "empty_column.favourites": "ഇതുവരെ ആരും ഈ ടൂട്ട് പ്രിയപ്പെട്ടതായി അടയാളപ്പെടുത്തിയിട്ടില്ല. ആരെങ്കിലും അങ്ങനെ ചെയ്യുന്നപക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.",
   "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
   "empty_column.hashtag": "There is nothing in this hashtag yet.",
   "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
@@ -150,67 +156,67 @@
   "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
   "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
   "empty_column.mutes": "You haven't muted any users yet.",
-  "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
-  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
+  "empty_column.notifications": "നിങ്ങൾക്ക് ഇതുവരെ ഒരു അറിയിപ്പുകളും ഇല്ല. മറ്റുള്ളവരുമായി ഇടപെട്ട് സംഭാഷണത്തിന് തുടക്കം കുറിക്കു.",
+  "empty_column.public": "ഇവിടെ ഒന്നുമില്ലല്ലോ! ഇവിടെ നിറയ്ക്കാൻ എന്തെങ്കിലും പരസ്യമായി എഴുതുകയോ മറ്റ് ഉപഭോക്താക്കളെ പിന്തുടരുകയോ ചെയ്യുക",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
   "error.unexpected_crash.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.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
-  "follow_request.authorize": "Authorize",
-  "follow_request.reject": "Reject",
-  "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
-  "getting_started.documentation": "Documentation",
-  "getting_started.heading": "Getting started",
-  "getting_started.invite": "Invite people",
-  "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
-  "getting_started.security": "Security",
-  "getting_started.terms": "Terms of service",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.select.no_options_message": "No suggestions found",
-  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
-  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
-  "home.column_settings.basic": "Basic",
-  "home.column_settings.show_reblogs": "Show boosts",
-  "home.column_settings.show_replies": "Show replies",
+  "errors.unexpected_crash.report_issue": "പ്രശ്നം അറിയിക്കുക",
+  "follow_request.authorize": "ചുമതലപ്പെടുത്തുക",
+  "follow_request.reject": "നിരസിക്കുക",
+  "getting_started.developers": "വികസിപ്പിക്കുന്നവർ",
+  "getting_started.directory": "രൂപരേഖ നാമഗൃഹസൂചി",
+  "getting_started.documentation": "രേഖാ സമാഹരണം",
+  "getting_started.heading": "തുടക്കം കുറിക്കുക",
+  "getting_started.invite": "ആളുകളെ ക്ഷണിക്കുക",
+  "getting_started.open_source_notice": "മാസ്റ്റഡോൺ ഒരു സ്വതന്ത്ര സോഫ്ട്‍വെയർ ആണ്. നിങ്ങൾക്ക് {github} GitHub ൽ സംഭാവന ചെയ്യുകയോ പ്രശ്നങ്ങൾ അറിയിക്കുകയോ ചെയ്യാം.",
+  "getting_started.security": "അംഗത്വ ക്രമീകരണങ്ങൾ",
+  "getting_started.terms": "സേവന വ്യവസ്ഥകൾ",
+  "hashtag.column_header.tag_mode.all": "{additional} ഉം കൂടെ",
+  "hashtag.column_header.tag_mode.any": "അല്ലെങ്കിൽ {additional}",
+  "hashtag.column_header.tag_mode.none": "{additional} ഇല്ലാതെ",
+  "hashtag.column_settings.select.no_options_message": "ഒരു സൂചനയും കണ്ടെത്തിയില്ല",
+  "hashtag.column_settings.select.placeholder": "ചർച്ചാവിഷയങ്ങൾ എഴുതുക…",
+  "hashtag.column_settings.tag_mode.all": "ഇവയെല്ലാം",
+  "hashtag.column_settings.tag_mode.any": "ഇവയിലേതെങ്കിലും",
+  "hashtag.column_settings.tag_mode.none": "ഇതിലൊന്നുമല്ല",
+  "hashtag.column_settings.tag_toggle": "ഈ എഴുത്തുപംക്തിക്ക് കൂടുതൽ ഉപനാമങ്ങൾ ചേർക്കുക",
+  "home.column_settings.basic": "അടിസ്ഥാനം",
+  "home.column_settings.show_reblogs": "ബൂസ്റ്റുകൾ കാണിക്കുക",
+  "home.column_settings.show_replies": "മറുപടികൾ കാണിക്കുക",
   "intervals.full.days": "{number, plural, one {# day} other {# days}}",
   "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
   "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
-  "introduction.federation.action": "Next",
-  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.action": "അടുത്തത്",
+  "introduction.federation.federated.headline": "സംയുക്തമാക്കിയ",
   "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
-  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.headline": "ഭവനം",
   "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
-  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.headline": "പ്രാദേശികം",
   "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish toot-orial!",
-  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.action": "പഠനസഹായി പൂർത്തീകരിക്കുക!",
+  "introduction.interactions.favourite.headline": "പ്രിയപ്പെട്ടത്",
   "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.headline": "ബൂസ്റ്റ് ചെയ്യുക",
   "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.headline": "മറുപടി",
   "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.action": "നമുക്ക് തുടങ്ങാം!",
+  "introduction.welcome.headline": "ആദ്യ ചുവടുവെപ്പുകൾ",
   "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
-  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.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.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.heading": "കീബോർഡ് എളുപ്പവഴികൾ",
   "keyboard_shortcuts.home": "to open home timeline",
   "keyboard_shortcuts.hotkey": "Hotkey",
   "keyboard_shortcuts.legend": "to display this legend",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "to reply",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mentions:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
@@ -344,6 +355,7 @@
   "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",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boosted",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Reply",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Add media ({formats})",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "Edit",
   "upload_form.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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "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",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index 8af8e3493..f265042f2 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "यादीत घाला किंवा यादीतून काढून टाका",
   "account.badges.bot": "स्वयंचलित खाते",
+  "account.badges.group": "Group",
   "account.block": "@{name} यांना ब्लॉक करा",
   "account.block_domain": "{domain} पासून सर्व लपवा",
   "account.blocked": "ब्लॉक केले आहे",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "अरेरे!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} प्रतिसप्ताह",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "हा घटक लोड करतांना काहीतरी चुकले आहे.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "हा घटक लोड करतांना काहीतरी चुकले आहे.",
   "bundle_modal_error.retry": "पुन्हा प्रयत्न करा",
   "column.blocks": "ब्लॉक केलेले खातेधारक",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
   "column.direct": "थेट संदेश",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Poll duration",
   "compose_form.poll.option_placeholder": "निवड {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
   "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "to reply",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mentions:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
@@ -344,6 +355,7 @@
   "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",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boosted",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Reply",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Add media ({formats})",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "Edit",
   "upload_form.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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "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",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 6881d3be3..3bd6e145e 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Add or Remove from lists",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Group",
   "account.block": "Block @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "You can press {combo} to skip this next time",
   "bundle_column_error.body": "Something went wrong while loading this component.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Something went wrong while loading this component.",
   "bundle_modal_error.retry": "Try again",
   "column.blocks": "Blocked users",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Local timeline",
   "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Poll duration",
   "compose_form.poll.option_placeholder": "Choice {number}",
   "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
+  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
   "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "to reply",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mentions:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
@@ -344,6 +355,7 @@
   "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",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boosted",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Reply",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Add media ({formats})",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "Edit",
   "upload_form.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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "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",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index 74aaad970..d570f3612 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -1,11 +1,12 @@
 {
   "account.add_or_remove_from_list": "Toevoegen of verwijderen vanuit lijsten",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Group",
   "account.block": "Blokkeer @{name}",
   "account.block_domain": "Verberg alles van {domain}",
   "account.blocked": "Geblokkeerd",
   "account.cancel_follow_request": "Volgverzoek annuleren",
-  "account.direct": "Direct Message @{name}",
+  "account.direct": "Direct bericht @{name}",
   "account.domain_blocked": "Domein verborgen",
   "account.edit_profile": "Profiel bewerken",
   "account.endorse": "Op profiel weergeven",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Beperkt te gebruiken",
   "alert.unexpected.message": "Er deed zich een onverwachte fout voor",
   "alert.unexpected.title": "Oeps!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "Je kunt {combo} klikken om dit de volgende keer over te slaan",
   "bundle_column_error.body": "Tijdens het laden van dit onderdeel is er iets fout gegaan.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Tijdens het laden van dit onderdeel is er iets fout gegaan.",
   "bundle_modal_error.retry": "Opnieuw proberen",
   "column.blocks": "Geblokkeerde gebruikers",
+  "column.bookmarks": "Bladwijzers",
   "column.community": "Lokale tijdlijn",
   "column.direct": "Directe berichten",
   "column.directory": "Gebruikersgids",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Duur van de poll",
   "compose_form.poll.option_placeholder": "Keuze {number}",
   "compose_form.poll.remove_option": "Deze keuze verwijderen",
+  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
+  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Media als gevoelig markeren",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Hier zijn geen toots!",
   "empty_column.account_unavailable": "Profiel is niet beschikbaar",
   "empty_column.blocks": "Jij hebt nog geen enkele gebruiker geblokkeerd.",
+  "empty_column.bookmarked_statuses": "Jij hebt nog geen toots aan je bladwijzers toegevoegd. Wanneer je er een aan jouw bladwijzers toevoegt, valt deze hier te zien.",
   "empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!",
   "empty_column.direct": "Je hebt nog geen directe berichten. Wanneer je er een verzend of ontvangt, zijn deze hier te zien.",
   "empty_column.domain_blocks": "Er zijn nog geen genegeerde servers.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "om de door jou genegeerde gebruikers te tonen",
   "keyboard_shortcuts.my_profile": "om jouw profiel te tonen",
   "keyboard_shortcuts.notifications": "om jouw meldingen te tonen",
+  "keyboard_shortcuts.open_media": "om media te openen",
   "keyboard_shortcuts.pinned": "om jouw vastgezette toots te tonen",
   "keyboard_shortcuts.profile": "om het gebruikersprofiel te openen",
   "keyboard_shortcuts.reply": "om te reageren",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Verberg meldingen van deze persoon?",
   "navigation_bar.apps": "Mobiele apps",
   "navigation_bar.blocks": "Geblokkeerde gebruikers",
+  "navigation_bar.bookmarks": "Bladwijzers",
   "navigation_bar.community_timeline": "Lokale tijdlijn",
   "navigation_bar.compose": "Nieuw toot schrijven",
   "navigation_bar.direct": "Directe berichten",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Beveiliging",
   "notification.favourite": "{name} voegde jouw toot als favoriet toe",
   "notification.follow": "{name} volgt jou nu",
+  "notification.follow_request": "{name} wil jou graag volgen",
   "notification.mention": "{name} vermeldde jou",
+  "notification.own_poll": "Jouw poll is beëindigd",
   "notification.poll": "Een poll waaraan jij hebt meegedaan is beëindigd",
   "notification.reblog": "{name} boostte jouw toot",
   "notifications.clear": "Meldingen verwijderen",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Snelle filterbalk",
   "notifications.column_settings.filter_bar.show": "Tonen",
   "notifications.column_settings.follow": "Nieuwe volgers:",
+  "notifications.column_settings.follow_request": "Nieuw volgverzoek:",
   "notifications.column_settings.mention": "Vermeldingen:",
   "notifications.column_settings.poll": "Pollresultaten:",
   "notifications.column_settings.push": "Pushmeldingen",
@@ -344,12 +355,13 @@
   "status.admin_account": "Moderatie-omgeving van @{name} openen",
   "status.admin_status": "Deze toot in de moderatie-omgeving openen",
   "status.block": "Blokkeer @{name}",
+  "status.bookmark": "Bladwijzer toevoegen",
   "status.cancel_reblog_private": "Niet langer boosten",
   "status.cannot_reblog": "Deze toot kan niet geboost worden",
   "status.copy": "Link naar toot kopiëren",
   "status.delete": "Verwijderen",
   "status.detailed_status": "Uitgebreide gespreksweergave",
-  "status.direct": "Directe toot @{name}",
+  "status.direct": "Direct bericht @{name}",
   "status.embed": "Insluiten",
   "status.favourite": "Favoriet",
   "status.filtered": "Gefilterd",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boostte",
   "status.reblogs.empty": "Niemand heeft deze toot nog geboost. Wanneer iemand dit doet, valt dat hier te zien.",
   "status.redraft": "Verwijderen en herschrijven",
+  "status.remove_bookmark": "Bladwijzer verwijderen",
   "status.reply": "Reageren",
   "status.replyAll": "Reageer op iedereen",
   "status.report": "Rapporteer @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Media toevoegen ({formats})",
   "upload_error.limit": "Uploadlimiet van bestand overschreden.",
   "upload_error.poll": "Het uploaden van bestanden is in polls niet toegestaan.",
+  "upload_form.audio_description": "Omschrijf dit voor mensen met een auditieve beperking",
   "upload_form.description": "Omschrijf dit voor mensen met een visuele beperking",
   "upload_form.edit": "Bewerken",
   "upload_form.undo": "Verwijderen",
+  "upload_form.video_description": "Omschrijf dit voor mensen met een auditieve of visuele beperking",
   "upload_modal.analyzing_picture": "Afbeelding analyseren…",
   "upload_modal.apply": "Toepassen",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Voorvertoning ({ratio})",
   "upload_progress.label": "Uploaden...",
   "video.close": "Video sluiten",
+  "video.download": "Bestand downloaden",
   "video.exit_fullscreen": "Volledig scherm sluiten",
   "video.expand": "Video groter maken",
   "video.fullscreen": "Volledig scherm",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index 039381cf0..c04b30e04 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -1,376 +1,389 @@
 {
-  "account.add_or_remove_from_list": "Legg til eller ta vekk fra liste",
+  "account.add_or_remove_from_list": "Legg til eller tak vekk frå listene",
   "account.badges.bot": "Robot",
-  "account.block": "Blokkér @{name}",
-  "account.block_domain": "Gøyme alt innhald for domenet {domain}",
+  "account.badges.group": "Gruppe",
+  "account.block": "Blokker @{name}",
+  "account.block_domain": "Skjul alt frå {domain}",
   "account.blocked": "Blokkert",
-  "account.cancel_follow_request": "Avslutt føljar-førespurnad",
-  "account.direct": "Direkte meld @{name}",
+  "account.cancel_follow_request": "Fjern fylgjeførespurnad",
+  "account.direct": "Send melding til @{name}",
   "account.domain_blocked": "Domenet er gøymt",
   "account.edit_profile": "Rediger profil",
-  "account.endorse": "Framhev på profilen din",
-  "account.follow": "Følj",
-  "account.followers": "Føljare",
-  "account.followers.empty": "Er ikkje nokon som føljar denne brukaren ennå.",
-  "account.follows": "Føljingar",
-  "account.follows.empty": "Denne brukaren foljer ikkje nokon ennå.",
-  "account.follows_you": "Føljar deg",
-  "account.hide_reblogs": "Gøym fremhevingar for @{name}",
+  "account.endorse": "Framhev på profil",
+  "account.follow": "Fylg",
+  "account.followers": "Fylgjarar",
+  "account.followers.empty": "Ingen fylgjer denne brukaren enno.",
+  "account.follows": "Fylgjer",
+  "account.follows.empty": "Denne brukaren fylgjer ikkje nokon enno.",
+  "account.follows_you": "Fylgjer deg",
+  "account.hide_reblogs": "Gøym fremhevingar frå @{name}",
   "account.last_status": "Sist aktiv",
-  "account.link_verified_on": "Eigerskap for denne linken er sist sjekket den {date}",
-  "account.locked_info": "Brukarens privat-status er satt til lukka. Eigaren må manuelt døme kvem som kan følje honom.",
+  "account.link_verified_on": "Eigarskap for denne lenkja vart sist sjekka {date}",
+  "account.locked_info": "Denne kontoen er privat. Eigaren kan sjølv velja kven som kan fylgja han.",
   "account.media": "Media",
-  "account.mention": "Nemne @{name}",
+  "account.mention": "Nemn @{name}",
   "account.moved_to": "{name} har flytta til:",
   "account.mute": "Målbind @{name}",
-  "account.mute_notifications": "Målbind varslingar ifrå @{name}",
-  "account.muted": "Målbindt",
+  "account.mute_notifications": "Målbind varsel frå @{name}",
+  "account.muted": "Målbunden",
   "account.never_active": "Aldri",
-  "account.posts": "Tutar",
-  "account.posts_with_replies": "Tutar og svar",
+  "account.posts": "Tut",
+  "account.posts_with_replies": "Tut og svar",
   "account.report": "Rapporter @{name}",
-  "account.requested": "Venter på samtykke. Klikk for å avbryte føljar-førespurnad",
+  "account.requested": "Ventar på samtykke. Klikk for å avbryta fylgjeførespurnaden",
   "account.share": "Del @{name} sin profil",
-  "account.show_reblogs": "Sjå framhevingar ifrå @{name}",
-  "account.unblock": "Avblokker @{name}",
+  "account.show_reblogs": "Vis framhevingar frå @{name}",
+  "account.unblock": "Slutt å blokera @{name}",
   "account.unblock_domain": "Vis {domain}",
   "account.unendorse": "Ikkje framhev på profil",
-  "account.unfollow": "Avfølja",
+  "account.unfollow": "Slutt å fylgja",
   "account.unmute": "Av-demp @{name}",
-  "account.unmute_notifications": "Av-demp notifikasjoner ifrå @{name}",
-  "alert.rate_limited.message": "Ver vennlig og prøv igjen {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Bregrensa rate",
-  "alert.unexpected.message": "Eit uforventa problem har hendt.",
-  "alert.unexpected.title": "Oops!",
+  "account.unmute_notifications": "Vis varsel frå @{name}",
+  "alert.rate_limited.message": "Ver venleg å prøva igjen etter {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Begrensa rate",
+  "alert.unexpected.message": "Eit uventa problem oppstod.",
+  "alert.unexpected.title": "Oi sann!",
+  "announcement.announcement": "Kunngjøring",
   "autosuggest_hashtag.per_week": "{count} per veke",
-  "boost_modal.combo": "Du kan trykke {combo} for å hoppe over dette neste gong",
-  "bundle_column_error.body": "Noko gikk gale mens komponent ble nedlasta.",
+  "boost_modal.combo": "Du kan trykkja {combo} for å hoppa over dette neste gong",
+  "bundle_column_error.body": "Noko gjekk gale mens denne komponenten vart lasta ned.",
   "bundle_column_error.retry": "Prøv igjen",
-  "bundle_column_error.title": "Tenarmaskin feil",
+  "bundle_column_error.title": "Nettverksfeil",
   "bundle_modal_error.close": "Lukk",
-  "bundle_modal_error.message": "Noko gikk gale mens komponent var i ferd med å bli nedlasta.",
+  "bundle_modal_error.message": "Noko gjekk gale under lastinga av denne komponenten.",
   "bundle_modal_error.retry": "Prøv igjen",
-  "column.blocks": "Blokka brukare",
-  "column.community": "Lokal samtid",
-  "column.direct": "Direkte meldingar",
-  "column.directory": "Sjå gjennom profiler",
-  "column.domain_blocks": "Gøymte domener",
+  "column.blocks": "Blokkerte brukarar",
+  "column.bookmarks": "Bokmerke",
+  "column.community": "Lokal tidsline",
+  "column.direct": "Meldingar",
+  "column.directory": "Sjå gjennom profilar",
+  "column.domain_blocks": "Gøymde domene",
   "column.favourites": "Favorittar",
-  "column.follow_requests": "Føljarførespurnad",
+  "column.follow_requests": "Fylgjeførespurnadar",
   "column.home": "Heim",
   "column.lists": "Lister",
-  "column.mutes": "Målbindte brukare",
-  "column.notifications": "Varslingar",
-  "column.pins": "Festa tuter",
-  "column.public": "Federert samtid",
+  "column.mutes": "Målbundne brukarar",
+  "column.notifications": "Varsel",
+  "column.pins": "Festa tut",
+  "column.public": "Samla tidsline",
   "column_back_button.label": "Tilbake",
-  "column_header.hide_settings": "Skjul innstillingar",
-  "column_header.moveLeft_settings": "Flytt feltet til venstre",
-  "column_header.moveRight_settings": "Flytt feltet til høgre",
+  "column_header.hide_settings": "Gøym innstillingar",
+  "column_header.moveLeft_settings": "Flytt kolonne til venstre",
+  "column_header.moveRight_settings": "Flytt kolonne til høgre",
   "column_header.pin": "Fest",
   "column_header.show_settings": "Vis innstillingar",
   "column_header.unpin": "Løys",
   "column_subheading.settings": "Innstillingar",
-  "community.column_settings.media_only": "Kun medie",
-  "compose_form.direct_message_warning": "Denne tuten vil kun verte synleg for nemnde brukarar.",
+  "community.column_settings.media_only": "Berre media",
+  "compose_form.direct_message_warning": "Dette tutet vert berre synleg for nemnde brukarar.",
   "compose_form.direct_message_warning_learn_more": "Lær meir",
-  "compose_form.hashtag_warning": "Denne tuten vill ikkje bli lista under nokon knagg ettersom den ikkje er opplista. Berre offentlege tutar kan ble søkt på ved emneknagg.",
-  "compose_form.lock_disclaimer": "Din brukar er ikkje {locked}. Alle kan følje deg for å sjå føljar-modus poster.",
+  "compose_form.hashtag_warning": "Dette tutet vert ikkje oppført under nokon emneknagg sidan det ikkje er oppført. Berre offentlege tut kan verta søkt etter med emneknagg.",
+  "compose_form.lock_disclaimer": "Kontoen din er ikkje {locked}. Kven som helst kan fylgja deg for å sjå innlegga dine som berre visast til fylgjarar.",
   "compose_form.lock_disclaimer.lock": "låst",
-  "compose_form.placeholder": "Kva har du på hjartet?",
-  "compose_form.poll.add_option": "Legg til eit punkt",
-  "compose_form.poll.duration": "Varigheit for spørring",
+  "compose_form.placeholder": "Kva har du på hjarta?",
+  "compose_form.poll.add_option": "Legg til eit val",
+  "compose_form.poll.duration": "Varigskap for røysting",
   "compose_form.poll.option_placeholder": "Val {number}",
-  "compose_form.poll.remove_option": "Ta burt dette valet",
+  "compose_form.poll.remove_option": "Ta vekk dette valet",
+  "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_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Merk media som sensitivt",
-  "compose_form.sensitive.marked": "Media er markert som sensitivt",
-  "compose_form.sensitive.unmarked": "Media er ikkje merka som sensitivt",
-  "compose_form.spoiler.marked": "Tekst er gøymt bak ein advarsel",
-  "compose_form.spoiler.unmarked": "Tekst er ikkje gøymt",
-  "compose_form.spoiler_placeholder": "Skriv varselen din her",
-  "confirmation_modal.cancel": "Avbrot",
-  "confirmations.block.block_and_report": "Blokk & rapportér",
-  "confirmations.block.confirm": "Blokkér",
-  "confirmations.block.message": "Er du sikker på at du vill blokke {name}?",
+  "compose_form.sensitive.hide": "Merk medium som sensitivt",
+  "compose_form.sensitive.marked": "Medium er markert som sensitivt",
+  "compose_form.sensitive.unmarked": "Medium er ikkje merka som sensitivt",
+  "compose_form.spoiler.marked": "Tekst er gøymd bak åtvaring",
+  "compose_form.spoiler.unmarked": "Tekst er ikkje gøymd",
+  "compose_form.spoiler_placeholder": "Skriv åtvaringa di her",
+  "confirmation_modal.cancel": "Avbryt",
+  "confirmations.block.block_and_report": "Blokker & rapporter",
+  "confirmations.block.confirm": "Blokker",
+  "confirmations.block.message": "Er du sikker på at du vil blokkera {name}?",
   "confirmations.delete.confirm": "Slett",
-  "confirmations.delete.message": "Er du sikker på at du vill slette denne statusen?",
+  "confirmations.delete.message": "Er du sikker på at du vil sletta denne statusen?",
   "confirmations.delete_list.confirm": "Slett",
-  "confirmations.delete_list.message": "Er du sikker på at du vill slette denne listen for alltid?",
+  "confirmations.delete_list.message": "Er du sikker på at du vil sletta denne lista for alltid?",
   "confirmations.domain_block.confirm": "Gøym heile domenet",
-  "confirmations.domain_block.message": "Er du ordentleg, ordentleg sikker på at du vill blokkere heile {domain}? I dei tilfeller er det bedre med ein målretta blokkering eller demping av individuelle brukare.",
+  "confirmations.domain_block.message": "Er du heilt, heilt sikker på at du vil blokkera heile {domain}? I dei fleste tilfelle er det godt nok og føretrekt med nokre få målretta blokkeringar eller målbindingar. Du kjem ikkje til å sjå innhald frå det domenet i nokon fødererte tidsliner eller i varsla dine. Fylgjarane dine frå det domenet vert fjerna.",
   "confirmations.logout.confirm": "Logg ut",
-  "confirmations.logout.message": "Er du sikker på at du vill logge ut?",
+  "confirmations.logout.message": "Er du sikker på at du vil logga ut?",
   "confirmations.mute.confirm": "Målbind",
-  "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": "Er du sikker på at d vill målbinde {name}?",
-  "confirmations.redraft.confirm": "Slett & gjennopprett",
-  "confirmations.redraft.message": "Er du sikker på at du vill slette statusen og gjennoprette den? Favoritter og framhevinger vill bli borte, og svar til den originale posten vill bli einstøing.",
+  "confirmations.mute.explanation": "Dette gøymer innlegg frå dei og innlegg som nemner dei, men tillèt dei framleis å sjå dine innlegg og fylgja deg.",
+  "confirmations.mute.message": "Er du sikker på at du vil målbinda {name}?",
+  "confirmations.redraft.confirm": "Slett & skriv på nytt",
+  "confirmations.redraft.message": "Er du sikker på at du vil sletta denne statusen og skriva han på nytt? Då misser du favorittar og framhevingar, og svar til det opphavlege innlegget vert einstøingar.",
   "confirmations.reply.confirm": "Svar",
-  "confirmations.reply.message": "Å svare nå vill overskrive meldingen du er i ferd med å skrive. Er du sikker på at du vill gå fram?",
-  "confirmations.unfollow.confirm": "Avfølj",
-  "confirmations.unfollow.message": "Er du sikker på at du vill avfølje {name}?",
+  "confirmations.reply.message": "Å svara no vil overskriva meldinga du skriv no. Er du sikker på at du vil halda fram?",
+  "confirmations.unfollow.confirm": "Slutt å fylgja",
+  "confirmations.unfollow.message": "Er du sikker på at du vil slutta å fylgja {name}?",
   "conversation.delete": "Slett samtale",
-  "conversation.mark_as_read": "Merk som lest",
+  "conversation.mark_as_read": "Merk som lese",
   "conversation.open": "Sjå samtale",
   "conversation.with": "Med {names}",
-  "directory.federated": "Fra kjent fedivers",
-  "directory.local": "Fra berre {domain} domenet",
+  "directory.federated": "Frå kjent fedivers",
+  "directory.local": "Berre frå {domain}",
   "directory.new_arrivals": "Nyankommne",
-  "directory.recently_active": "Nylig aktiv",
-  "embed.instructions": "Embed this status on your website by copying the code below.",
-  "embed.preview": "Dette er korleis den vil sjå ut:",
+  "directory.recently_active": "Nyleg aktive",
+  "embed.instructions": "Bygg inn denne statusen på nettsida di ved å kopiera koden under.",
+  "embed.preview": "Slik bid det å sjå ut:",
   "emoji_button.activity": "Aktivitet",
-  "emoji_button.custom": "Custom",
+  "emoji_button.custom": "Eige",
   "emoji_button.flags": "Flagg",
   "emoji_button.food": "Mat & drikke",
-  "emoji_button.label": "Legg til smilefjes",
+  "emoji_button.label": "Legg til emoji",
   "emoji_button.nature": "Natur",
   "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
-  "emoji_button.objects": "Objektar",
+  "emoji_button.objects": "Objekt",
   "emoji_button.people": "Folk",
   "emoji_button.recent": "Ofte brukt",
   "emoji_button.search": "Søk...",
-  "emoji_button.search_results": "Søke resultater",
-  "emoji_button.symbols": "Symbolar",
-  "emoji_button.travel": "Reise & steder",
-  "empty_column.account_timeline": "Ikkje nokon tutar her!",
+  "emoji_button.search_results": "Søkeresultat",
+  "emoji_button.symbols": "Symbol",
+  "emoji_button.travel": "Reise & stader",
+  "empty_column.account_timeline": "Ingen tut her!",
   "empty_column.account_unavailable": "Profil ikkje tilgjengelig",
-  "empty_column.blocks": "Du har ikkje blokkért nokon brukarar ennå.",
+  "empty_column.blocks": "Du har ikkje blokkert nokon brukarar enno.",
+  "empty_column.bookmarked_statuses": "Du har ikkje nokon bokmerkte tut enno. Når du bokmerkjer eit, dukkar det opp her.",
   "empty_column.community": "Den lokale samtiden er tom. Skriv noko offentleg å få ballen til å rulle!",
-  "empty_column.direct": "Du har ikkje nokon direkte meldingar ennå. Når du sendar eller får ein, så vill den ende opp her.",
-  "empty_column.domain_blocks": "Der er ikkje nokon gøymte domener enno.",
-  "empty_column.favourited_statuses": "Du har ikkje favorisert nokon tutar enno. Når du favoriserer noko, så vill det ende opp her.",
-  "empty_column.favourites": "Ikkje nokon har favorisert denne tuten enno. Når nokon gjer det, så vill den ende opp her.",
-  "empty_column.follow_requests": "Du har ikkje nokon føljar førespurnad enno. Når du får ein, så vill den sjåast her.",
-  "empty_column.hashtag": "Det er ikkje noko i denne emneknaggen her enno.",
-  "empty_column.home": "Din heime-tidslinja er tom! Dra til {public} eller søk for å starte å møte andre brukare.",
-  "empty_column.home.public_timeline": "Den offentlege tidslinja",
-  "empty_column.list": "Det er ikkje noko i denne lista enno. Når medlemmar av denne lista poster statuser, så vill dei sjåast her.",
-  "empty_column.lists": "Du har ikkje nokon liste enno. Når du lagar ein, så vill den ende up her.",
-  "empty_column.mutes": "Du har ikkje dempet nokon brukare enno.",
-  "empty_column.notifications": "Der er ikkje nokon varsler her enno. Kommuniser med andre for å starte samtalen.",
-  "empty_column.public": "Det er ikkje noko her! Skriv noko offentleg, eller manuelt følje brukare fra andre tenarmaskiner for å fylle det opp",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.next_steps": "Prøv å laste på nytt. Om det ikkje hjelper så kan du fortsatt bruke mastodon gjennom ein anna nettlesar eller ein applikasjon.",
-  "errors.unexpected_crash.copy_stacktrace": "Kopiér stacktrace til klippebord",
-  "errors.unexpected_crash.report_issue": "Rapportér problem",
+  "empty_column.direct": "Du har ingen direktemeldingar ennå. Når du sender eller får ein vil den dukke opp her.",
+  "empty_column.domain_blocks": "Det er ingen gøymde domene ennå.",
+  "empty_column.favourited_statuses": "Du har ingen favoritt-tut ennå. Når du merkjer ein som favoritt, så dukkar det opp her.",
+  "empty_column.favourites": "Ingen har merkt dette tutet som favoritt enno. Når nokon gjer det, så dukkar det opp her.",
+  "empty_column.follow_requests": "Du har ingen følgjeførespurnadar ennå. Når du får ein, så vil den dukke opp her.",
+  "empty_column.hashtag": "Det er ingenting i denne emneknaggen ennå.",
+  "empty_column.home": "Heime-tidslinja di er tom! Besøk {public} eller søk for å starte og å møte andre brukarar.",
+  "empty_column.home.public_timeline": "den offentlege tidslina",
+  "empty_column.list": "Det er ingenting i denne lista enno. Når medlemer av denne lista legg ut nye statusar, så dukkar dei opp her.",
+  "empty_column.lists": "Du har ingen lister enno. Når du lagar ei, så dukkar ho opp her.",
+  "empty_column.mutes": "Du har ikkje målbunde nokon brukarar enno.",
+  "empty_column.notifications": "Du har ingen varsel ennå. Kommuniser med andre for å starte samtalen.",
+  "empty_column.public": "Det er ingenting her! Skriv noko offentleg, eller følg brukarar frå andre tenarar manuelt for å fylle det opp",
+  "error.unexpected_crash.explanation": "På grunn av ein feil i vår kode eller eit nettlesarkompatibilitetsproblem, kunne ikkje denne sida verte vist korrekt.",
+  "error.unexpected_crash.next_steps": "Prøv å lasta inn sida på nytt. Om det ikkje hjelper så kan du framleis nytta Mastodon i ein annan nettlesar eller app.",
+  "errors.unexpected_crash.copy_stacktrace": "Kopier stacktrace til utklippstavla",
+  "errors.unexpected_crash.report_issue": "Rapporter problem",
   "follow_request.authorize": "Autoriser",
-  "follow_request.reject": "Reject",
-  "getting_started.developers": "Utviklare",
-  "getting_started.directory": "Profile directory",
+  "follow_request.reject": "Avvis",
+  "getting_started.developers": "Utviklarar",
+  "getting_started.directory": "Profilkatalog",
   "getting_started.documentation": "Dokumentasjon",
-  "getting_started.heading": "Komme i gong",
-  "getting_started.invite": "Inviter folk",
-  "getting_started.open_source_notice": "Mastodon har åpen kilde kode. Du kan hjelpe til med problemar på GitHub gjennom {github}.",
-  "getting_started.security": "Brukar instillingar",
-  "getting_started.terms": "Brukarvillkår",
+  "getting_started.heading": "Kom i gang",
+  "getting_started.invite": "Byd folk inn",
+  "getting_started.open_source_notice": "Mastodon er fri programvare. Du kan bidraga eller rapportera problem med GitHub på {github}.",
+  "getting_started.security": "Kontoinnstillingar",
+  "getting_started.terms": "Brukarvilkår",
   "hashtag.column_header.tag_mode.all": "og {additional}",
   "hashtag.column_header.tag_mode.any": "eller {additional}",
-  "hashtag.column_header.tag_mode.none": "uten {additional}",
-  "hashtag.column_settings.select.no_options_message": "Ingen forslag funnet",
-  "hashtag.column_settings.select.placeholder": "Legg til emneknagger…",
+  "hashtag.column_header.tag_mode.none": "utan {additional}",
+  "hashtag.column_settings.select.no_options_message": "Fann ingen forslag",
+  "hashtag.column_settings.select.placeholder": "Legg til emneknaggar…",
   "hashtag.column_settings.tag_mode.all": "Alle disse",
-  "hashtag.column_settings.tag_mode.any": "Kvem som helst av disse",
+  "hashtag.column_settings.tag_mode.any": "Kva som helst av desse",
   "hashtag.column_settings.tag_mode.none": "Ikkje nokon av disse",
-  "hashtag.column_settings.tag_toggle": "Inkludér ekstra emneknagger til denne kolonnen",
-  "home.column_settings.basic": "Enkel",
-  "home.column_settings.show_reblogs": "Vis fremhevingar",
+  "hashtag.column_settings.tag_toggle": "Inkluder ekstra emneknaggar for denne kolonna",
+  "home.column_settings.basic": "Enkelt",
+  "home.column_settings.show_reblogs": "Vis framhevingar",
   "home.column_settings.show_replies": "Vis svar",
-  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
-  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
-  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
+  "intervals.full.days": "{number, plural, one {# dag} other {# dagar}}",
+  "intervals.full.hours": "{number, plural, one {# time} other {# timar}}",
+  "intervals.full.minutes": "{number, plural, one {# minutt} other {# minutt}}",
   "introduction.federation.action": "Neste",
-  "introduction.federation.federated.headline": "Federert",
-  "introduction.federation.federated.text": "Offentlege poster fra tenarmaskiner i fediverset kjem fram i den federerte tidslinja.",
+  "introduction.federation.federated.headline": "Føderert",
+  "introduction.federation.federated.text": "Offentlege innlegg frå andre tenarar i fødiverset dukkar opp i den fødererte tidslina.",
   "introduction.federation.home.headline": "Heim",
-  "introduction.federation.home.text": "Poster frå folk du kjenner kjem i heime tidslinja. Du kan følje kvem som helst ifrå alle tenarmaskiner!",
+  "introduction.federation.home.text": "Innlegg frå folk du fylgjer dukkar opp i heimetidslina di. Du kan fylgja kven som helst frå kva tenar som helst!",
   "introduction.federation.local.headline": "Lokal",
-  "introduction.federation.local.text": "Offentlege poster frå folk på samme tenarmaskin som deg vill du finne i den lokale tidslinja.",
+  "introduction.federation.local.text": "Offentlege innlegg frå folk på same tenar som deg, dukkar opp i den lokale tidslina.",
   "introduction.interactions.action": "Fullfør omvisning!",
-  "introduction.interactions.favourite.headline": "Lik",
-  "introduction.interactions.favourite.text": "Du kan lagre ein tut til seinere, og la forfatteren vite at ut likte den ved å trykke likar på tuten.",
-  "introduction.interactions.reblog.headline": "Fremhev",
-  "introduction.interactions.reblog.text": "Du kan dela folks tutar ved å \"booste\" døm.",
+  "introduction.interactions.favourite.headline": "Merk som favoritt",
+  "introduction.interactions.favourite.text": "Du kan lagra eit tut til seinare og lata forfattaren vita at du likte det med å merkja det som favoritt.",
+  "introduction.interactions.reblog.headline": "Framhev",
+  "introduction.interactions.reblog.text": "Du kan dela andre folk sine tut med å framheva dei.",
   "introduction.interactions.reply.headline": "Svar",
-  "introduction.interactions.reply.text": "Du kan svare på andre folk sine tuter, om så vill tutane lenkes i hop i ein samtale.",
-  "introduction.welcome.action": "Ta åt!",
-  "introduction.welcome.headline": "Første steg",
-  "introduction.welcome.text": "Velkommen til fediverset! Om ein kort tid vill det være mogleg å skrive til verden og venner gjennom ein stor variasjon av tenarmaskiner. Men denne tenarmaskinen, {domain}, er spesiell - den holder din profil, så ikkje gløym namnet dens.",
-  "keyboard_shortcuts.back": "for å navigere tilbake",
-  "keyboard_shortcuts.blocked": "for å åpne lista for blokka brukare",
-  "keyboard_shortcuts.boost": "for å dele",
-  "keyboard_shortcuts.column": "for å fokusere på ein status i ein av kollonene",
-  "keyboard_shortcuts.compose": "for å fokusera på status-skrivaren",
-  "keyboard_shortcuts.description": "Beskrivelse",
-  "keyboard_shortcuts.direct": "forå åpne direkte meldingar i ein kollone",
-  "keyboard_shortcuts.down": "for å bevege seg opp og ned",
-  "keyboard_shortcuts.enter": "for å åpne status",
-  "keyboard_shortcuts.favourite": "for å favorisere",
-  "keyboard_shortcuts.favourites": "for å åpne favoriserings lista",
-  "keyboard_shortcuts.federated": "for å åpne den fødererte tidslinja",
-  "keyboard_shortcuts.heading": "Tastatur hurtigtaster",
-  "keyboard_shortcuts.home": "for åpne heime tidslinja",
-  "keyboard_shortcuts.hotkey": "Hurtigtast",
-  "keyboard_shortcuts.legend": "to display this legend",
-  "keyboard_shortcuts.local": "for å åpne den lokale tidslinja",
-  "keyboard_shortcuts.mention": "for å nemne forfatteren",
-  "keyboard_shortcuts.muted": "for å åpne lista over dempa brukare",
-  "keyboard_shortcuts.my_profile": "for å åpne profilen din",
-  "keyboard_shortcuts.notifications": "for å åpne notifikasjons kolonnen",
-  "keyboard_shortcuts.pinned": "forå åpne lista for festa statuser",
-  "keyboard_shortcuts.profile": "for å åpne forfatteren's profil",
-  "keyboard_shortcuts.reply": "for å svare",
-  "keyboard_shortcuts.requests": "for å åpne lista for føljar førespurnader",
-  "keyboard_shortcuts.search": "for å fokus søkje",
-  "keyboard_shortcuts.start": "for å åpne \"kjem i gong\" kolonna",
-  "keyboard_shortcuts.toggle_hidden": "for å vise/gøyme tekst bak innholds varsel",
-  "keyboard_shortcuts.toggle_sensitivity": "for å vise/gøyme media",
-  "keyboard_shortcuts.toot": "Start ein heilt ny tut",
-  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
-  "keyboard_shortcuts.up": "for å bevege seg oppover i lista",
-  "lightbox.close": "Lukk",
+  "introduction.interactions.reply.text": "Du kan svare på andre folk sine tutar, som gjer at dei vert lenka saman i ein samtale.",
+  "introduction.welcome.action": "Lat oss koma i gang!",
+  "introduction.welcome.headline": "Fyrste steg",
+  "introduction.welcome.text": "Velkommen til fediverset! Om nokre minutt vil du kunne kringkaste meldingar og snakke med dine vener rundt omkring på eit bredt spekter av tenarar. Men denne tenaren, {domain}, er spesiell – den er vert for profilen din, så hugs namnet på den.",
+  "keyboard_shortcuts.back": "for å gå tilbake",
+  "keyboard_shortcuts.blocked": "for å opna lista med blokkerte brukarar",
+  "keyboard_shortcuts.boost": "for å framheva",
+  "keyboard_shortcuts.column": "for å fokusera på ein status i ei av kolonnane",
+  "keyboard_shortcuts.compose": "for å fokusera tekstfeltet for skriving",
+  "keyboard_shortcuts.description": "Skildring",
+  "keyboard_shortcuts.direct": "for å opna direktemeldingskolonna",
+  "keyboard_shortcuts.down": "for å flytta seg opp og ned i lista",
+  "keyboard_shortcuts.enter": "for å opna status",
+  "keyboard_shortcuts.favourite": "for å merkja som favoritt",
+  "keyboard_shortcuts.favourites": "for å opna favorittlista",
+  "keyboard_shortcuts.federated": "for å opna den samla tidslina",
+  "keyboard_shortcuts.heading": "Snøggtastar",
+  "keyboard_shortcuts.home": "for opna heimetidslina",
+  "keyboard_shortcuts.hotkey": "Snøggtast",
+  "keyboard_shortcuts.legend": "for å visa denne forklåringa",
+  "keyboard_shortcuts.local": "for å opna den lokale tidslina",
+  "keyboard_shortcuts.mention": "for å nemna forfattaren",
+  "keyboard_shortcuts.muted": "for å opna lista over målbundne brukarar",
+  "keyboard_shortcuts.my_profile": "for å opna profilen din",
+  "keyboard_shortcuts.notifications": "for å opna varselskolonna",
+  "keyboard_shortcuts.open_media": "for å opna media",
+  "keyboard_shortcuts.pinned": "for å opna lista over festa tut",
+  "keyboard_shortcuts.profile": "for å opna forfattaren sin profil",
+  "keyboard_shortcuts.reply": "for å svara",
+  "keyboard_shortcuts.requests": "for å opna lista med fylgjeførespurnader",
+  "keyboard_shortcuts.search": "for å fokusera søket",
+  "keyboard_shortcuts.start": "for å opna \"kom i gang\"-feltet",
+  "keyboard_shortcuts.toggle_hidden": "for å visa/gøyma tekst bak innhaldsvarsel",
+  "keyboard_shortcuts.toggle_sensitivity": "for å visa/gøyma media",
+  "keyboard_shortcuts.toot": "for å laga ein heilt ny tut",
+  "keyboard_shortcuts.unfocus": "å ufokusere komponerings-/søkefeltet",
+  "keyboard_shortcuts.up": "for å flytta seg opp på lista",
+  "lightbox.close": "Lukk att",
   "lightbox.next": "Neste",
-  "lightbox.previous": "Forrige",
+  "lightbox.previous": "Førre",
   "lightbox.view_context": "Sjå kontekst",
   "lists.account.add": "Legg til i liste",
-  "lists.account.remove": "Ta burt fra liste",
+  "lists.account.remove": "Fjern frå liste",
   "lists.delete": "Slett liste",
   "lists.edit": "Rediger liste",
-  "lists.edit.submit": "Bytt tittel",
+  "lists.edit.submit": "Endre tittel",
   "lists.new.create": "Legg til liste",
-  "lists.new.title_placeholder": "Ny liste tittel",
-  "lists.search": "Søk gjennom folk du føljar",
+  "lists.new.title_placeholder": "Ny listetittel",
+  "lists.search": "Søk gjennom folk du følgjer",
   "lists.subheading": "Dine lister",
-  "load_pending": "{count, plural, one {# new item} other {# new items}}",
-  "loading_indicator.label": "Laster...",
-  "media_gallery.toggle_visible": "Toggle visibility",
+  "load_pending": "{count, plural, one {# nytt element} other {# nye element}}",
+  "loading_indicator.label": "Lastar...",
+  "media_gallery.toggle_visible": "Gjer synleg/usynleg",
   "missing_indicator.label": "Ikkje funne",
-  "missing_indicator.sublabel": "Denne ressursen ble ikkje funne",
-  "mute_modal.hide_notifications": "Gøyme notifikasjoner frå denne brukaren?",
-  "navigation_bar.apps": "Mobil apper",
-  "navigation_bar.blocks": "Blokka brukare",
-  "navigation_bar.community_timeline": "Lokal tidslinje",
-  "navigation_bar.compose": "Lag ein ny status",
-  "navigation_bar.direct": "Direkte meldingar",
+  "missing_indicator.sublabel": "Fann ikkje ressursen",
+  "mute_modal.hide_notifications": "Gøyme varsel frå denne brukaren?",
+  "navigation_bar.apps": "Mobilappar",
+  "navigation_bar.blocks": "Blokkerte brukarar",
+  "navigation_bar.bookmarks": "Bokmerke",
+  "navigation_bar.community_timeline": "Lokal tidsline",
+  "navigation_bar.compose": "Lag eit nytt tut",
+  "navigation_bar.direct": "Direktemeldingar",
   "navigation_bar.discover": "Oppdag",
-  "navigation_bar.domain_blocks": "Gøymte domener",
+  "navigation_bar.domain_blocks": "Skjulte domene",
   "navigation_bar.edit_profile": "Rediger profil",
-  "navigation_bar.favourites": "Favoritter",
-  "navigation_bar.filters": "Demp ord",
-  "navigation_bar.follow_requests": "Føljar førespurnader",
-  "navigation_bar.follows_and_followers": "Føljer og føljare",
-  "navigation_bar.info": "Om denne tenarmaskinen",
-  "navigation_bar.keyboard_shortcuts": "Hurtigtaster",
+  "navigation_bar.favourites": "Favorittar",
+  "navigation_bar.filters": "Målbundne ord",
+  "navigation_bar.follow_requests": "Fylgjeførespurnader",
+  "navigation_bar.follows_and_followers": "Fylgje og fylgjarar",
+  "navigation_bar.info": "Om denne tenaren",
+  "navigation_bar.keyboard_shortcuts": "Snøggtastar",
   "navigation_bar.lists": "Lister",
   "navigation_bar.logout": "Logg ut",
-  "navigation_bar.mutes": "Dempa brukare",
-  "navigation_bar.personal": "Personlig",
-  "navigation_bar.pins": "Festa tuter",
-  "navigation_bar.preferences": "Preferanser",
-  "navigation_bar.public_timeline": "Federert tidslinje",
-  "navigation_bar.security": "Sikkerheit",
-  "notification.favourite": "{name} likte din status",
-  "notification.follow": "{name} fulgte deg",
-  "notification.mention": "{name} nevnte deg",
-  "notification.poll": "Ein avstemming du har votert i har endt",
-  "notification.reblog": "{name} delte statusen din",
-  "notifications.clear": "Klarer notifikasjoner",
-  "notifications.clear_confirmation": "Er du sikker på at du vill permanent klarere alle notifikasjonene dine?",
-  "notifications.column_settings.alert": "Desktop notifikasjoner",
-  "notifications.column_settings.favourite": "Favoritter:",
-  "notifications.column_settings.filter_bar.advanced": "Vis alle kategorier",
-  "notifications.column_settings.filter_bar.category": "Rask filter bar",
+  "navigation_bar.mutes": "Målbundne brukarar",
+  "navigation_bar.personal": "Personleg",
+  "navigation_bar.pins": "Festa tut",
+  "navigation_bar.preferences": "Innstillingar",
+  "navigation_bar.public_timeline": "Føderert tidsline",
+  "navigation_bar.security": "Tryggleik",
+  "notification.favourite": "{name} merkte statusen din som favoritt",
+  "notification.follow": "{name} fylgde deg",
+  "notification.follow_request": "{name} har bedt om å fylgja deg",
+  "notification.mention": "{name} nemnde deg",
+  "notification.own_poll": "Rundspørjinga di er ferdig",
+  "notification.poll": "Ei rundspørjing du har røysta i er ferdig",
+  "notification.reblog": "{name} framheva statusen din",
+  "notifications.clear": "Tøm varsel",
+  "notifications.clear_confirmation": "Er du sikker på at du vil fjerna alle varsla dine for alltid?",
+  "notifications.column_settings.alert": "Skrivebordsvarsel",
+  "notifications.column_settings.favourite": "Favorittar:",
+  "notifications.column_settings.filter_bar.advanced": "Vis alle kategoriar",
+  "notifications.column_settings.filter_bar.category": "Snarfilterlinje",
   "notifications.column_settings.filter_bar.show": "Vis",
-  "notifications.column_settings.follow": "Nye føljare:",
+  "notifications.column_settings.follow": "Nye fylgjarar:",
+  "notifications.column_settings.follow_request": "Ny fylgjarførespurnader:",
   "notifications.column_settings.mention": "Nemningar:",
-  "notifications.column_settings.poll": "Avstemming resultater:",
-  "notifications.column_settings.push": "Push varsler",
-  "notifications.column_settings.reblog": "Framhevinger:",
+  "notifications.column_settings.poll": "Røysteresultat:",
+  "notifications.column_settings.push": "Pushvarsel",
+  "notifications.column_settings.reblog": "Framhevingar:",
   "notifications.column_settings.show": "Vis i kolonne",
-  "notifications.column_settings.sound": "Køyr lyd",
+  "notifications.column_settings.sound": "Spel av lyd",
   "notifications.filter.all": "Alle",
-  "notifications.filter.boosts": "Framhevinger",
-  "notifications.filter.favourites": "Favoritter",
-  "notifications.filter.follows": "Føljare",
+  "notifications.filter.boosts": "Framhevingar",
+  "notifications.filter.favourites": "Favorittar",
+  "notifications.filter.follows": "Fylgjer",
   "notifications.filter.mentions": "Nemningar",
-  "notifications.filter.polls": "Avstemmings resultater",
-  "notifications.group": "{count} notifikasjoner",
+  "notifications.filter.polls": "Røysteresultat",
+  "notifications.group": "{count} varsel",
   "poll.closed": "Lukka",
-  "poll.refresh": "Forfriske",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
-  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Voter",
-  "poll.voted": "Du voterte for dette svaret",
-  "poll_button.add_poll": "Start ein avstemming",
-  "poll_button.remove_poll": "Slett avstemming",
-  "privacy.change": "Juster status synligheit",
-  "privacy.direct.long": "Post berre direkte til nemnte brukare",
+  "poll.refresh": "Oppdater",
+  "poll.total_people": "{count, plural, one {# person} other {# folk}}",
+  "poll.total_votes": "{count, plural, one {# røyst} other {# røyster}}",
+  "poll.vote": "Røyst",
+  "poll.voted": "Du røysta på dette svaret",
+  "poll_button.add_poll": "Start ei meiningsmåling",
+  "poll_button.remove_poll": "Fjern røyst",
+  "privacy.change": "Juster status-synlegheit",
+  "privacy.direct.long": "Legg berre ut for nemnde brukarar",
   "privacy.direct.short": "Direkte",
-  "privacy.private.long": "Post til berre føljare",
-  "privacy.private.short": "Berre-føljare",
-  "privacy.public.long": "Post til offentlege tidslinjar",
+  "privacy.private.long": "Post kun til følgjarar",
+  "privacy.private.short": "Kun følgjarar",
+  "privacy.public.long": "Post til offentlege tidslinjer",
   "privacy.public.short": "Offentleg",
-  "privacy.unlisted.long": "Do not show in public timelines",
+  "privacy.unlisted.long": "Ikkje post til offentlege tidslinjer",
   "privacy.unlisted.short": "Uoppført",
-  "refresh": "Forfrisk",
+  "refresh": "Oppdater",
   "regeneration_indicator.label": "Lastar…",
-  "regeneration_indicator.sublabel": "Din startside driver å blir forberedt!",
-  "relative_time.days": "{number}d",
-  "relative_time.hours": "{number}h",
-  "relative_time.just_now": "no",
-  "relative_time.minutes": "{number}m",
-  "relative_time.seconds": "{number}s",
-  "reply_indicator.cancel": "Avbrot",
-  "report.forward": "Send videre til {target}",
-  "report.forward_hint": "Denne brukaren er frå ein anna tenarmaskin. Send ein anonymisert versjon av rapporten til døm også?",
-  "report.hint": "Denne rapporten vill bli sendt til din tenarmaskin moderator. Du kan gi ein forklaring til kvifor du rapportérer denne brukaren under:",
-  "report.placeholder": "Tilleggskommentarer",
+  "regeneration_indicator.sublabel": "Heimetidslinja di vert førebudd!",
+  "relative_time.days": "{number}dg",
+  "relative_time.hours": "{number}t",
+  "relative_time.just_now": "nå",
+  "relative_time.minutes": "{number}min",
+  "relative_time.seconds": "{number}sek",
+  "reply_indicator.cancel": "Avbryt",
+  "report.forward": "Vidaresend til {target}",
+  "report.forward_hint": "Kontoen er frå ein annan tenar. Vil du senda ein anonymisert kopi av rapporten dit òg?",
+  "report.hint": "Rapporten vil verte sendt til dine tenarmoderatorar. Du kan oppgje ei forklaring på kvifor du rapporterer denne kontoen, under:",
+  "report.placeholder": "Tilleggskommentarar",
   "report.submit": "Send inn",
-  "report.target": "Rapportér {target}",
+  "report.target": "Rapporterer {target}",
   "search.placeholder": "Søk",
-  "search_popout.search_format": "Avansert søke 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.search_format": "Avansert søkeformat",
+  "search_popout.tips.full_text": "Enkel tekst returnerer statusar du har skrive, likt, framheva eller vorte nemnd i, i tillegg til samsvarande brukarnamn, visningsnamn og emneknaggar.",
   "search_popout.tips.hashtag": "emneknagg",
   "search_popout.tips.status": "status",
-  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.text": "Enkel tekst returnerer samsvarande visningsnamn, brukarnamn og emneknaggar",
   "search_popout.tips.user": "brukar",
   "search_results.accounts": "Folk",
-  "search_results.hashtags": "Emneknagger",
-  "search_results.statuses": "Tutar",
-  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
-  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
-  "status.block": "Block @{name}",
-  "status.cancel_reblog_private": "Unboost",
-  "status.cannot_reblog": "This post cannot be boosted",
-  "status.copy": "Copy link to status",
+  "search_results.hashtags": "Emneknaggar",
+  "search_results.statuses": "Tut",
+  "search_results.statuses_fts_disabled": "På denne Matsodon-tenaren kan du ikkje søkja på tut etter innhaldet deira.",
+  "search_results.total": "{count, number} {count, plural, one {treff} other {treff}}",
+  "status.admin_account": "Opne moderasjonsgrensesnitt for @{name}",
+  "status.admin_status": "Opne denne statusen i moderasjonsgrensesnittet",
+  "status.block": "Blokker @{name}",
+  "status.bookmark": "Bokmerk",
+  "status.cancel_reblog_private": "Opphev framheving",
+  "status.cannot_reblog": "Denne posten kan ikkje framhevast",
+  "status.copy": "Kopier lenke til status",
   "status.delete": "Slett",
-  "status.detailed_status": "Detaljert samtale syn",
-  "status.direct": "Direkte meld @{name}",
-  "status.embed": "Bygge inn",
-  "status.favourite": "Lik",
-  "status.filtered": "Filter",
+  "status.detailed_status": "Detaljert samtalevisning",
+  "status.direct": "Send melding til @{name}",
+  "status.embed": "Bygg inn",
+  "status.favourite": "Favoritt",
+  "status.filtered": "Filtrert",
   "status.load_more": "Last inn meir",
-  "status.media_hidden": "Media gøymt",
+  "status.media_hidden": "Medium gøymd",
   "status.mention": "Nemn @{name}",
   "status.more": "Meir",
-  "status.mute": "Demp @{name}",
-  "status.mute_conversation": "Demp samtale",
-  "status.open": "Utvid statusen",
+  "status.mute": "Målbind @{name}",
+  "status.mute_conversation": "Målbind samtale",
+  "status.open": "Utvid denne statusen",
   "status.pin": "Fest på profil",
-  "status.pinned": "Fasta tut",
+  "status.pinned": "Festa tut",
   "status.read_more": "Les meir",
-  "status.reblog": "Fremhev",
-  "status.reblog_private": "Fremhev til orginale sjåare",
-  "status.reblogged_by": "{name} fremheivd",
-  "status.reblogs.empty": "Ikkje nokon har fremhevd tuten enno. Om nokon gjør det kjem det opp her.",
-  "status.redraft": "Slett & gjer om",
+  "status.reblog": "Framhev",
+  "status.reblog_private": "Framhev til dei originale mottakarane",
+  "status.reblogged_by": "{name} framheva",
+  "status.reblogs.empty": "Ingen har framheva dette tutet enno. Om nokon gjer, så dukkar det opp her.",
+  "status.redraft": "Slett & skriv på nytt",
+  "status.remove_bookmark": "Fjern bokmerke",
   "status.reply": "Svar",
   "status.replyAll": "Svar til tråd",
-  "status.report": "Rapportér @{name}",
+  "status.report": "Rapporter @{name}",
   "status.sensitive_warning": "Sensitivt innhald",
   "status.share": "Del",
   "status.show_less": "Vis mindre",
@@ -379,45 +392,48 @@
   "status.show_more_all": "Vis meir for alle",
   "status.show_thread": "Vis tråd",
   "status.uncached_media_warning": "Ikkje tilgjengeleg",
-  "status.unmute_conversation": "Ikke demp samtale",
-  "status.unpin": "Angre festing på profil",
-  "suggestions.dismiss": "Avbrot forslag",
-  "suggestions.header": "Du e kanskje interessert i…",
+  "status.unmute_conversation": "Opphev målbinding av samtalen",
+  "status.unpin": "Løys frå profil",
+  "suggestions.dismiss": "Avslå framlegg",
+  "suggestions.header": "Du er kanskje interessert i…",
   "tabs_bar.federated_timeline": "Føderert",
   "tabs_bar.home": "Heim",
   "tabs_bar.local_timeline": "Lokal",
-  "tabs_bar.notifications": "Notifikasjoner",
+  "tabs_bar.notifications": "Varsel",
   "tabs_bar.search": "Søk",
-  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
-  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
-  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
-  "time_remaining.moments": "Kort tid gjennstår",
-  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
-  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
-  "trends.trending_now": "Kva som trender no",
-  "ui.beforeunload": "Din kladd vil bli forkastet om du forlater Mastodon.",
-  "upload_area.title": "Dra & slipp for å laste opp",
-  "upload_button.label": "Legg til media ({formats})",
-  "upload_error.limit": "Fil størrelsen er for stor.",
-  "upload_error.poll": "Fil opplasting ikkje lov i hop med avstemming.",
-  "upload_form.description": "Beskriv for synshemmede",
-  "upload_form.edit": "Redigér",
+  "time_remaining.days": "{number, plural, one {# dag} other {# dagar}} igjen",
+  "time_remaining.hours": "{number, plural, one {# time} other {# timar}} igjen",
+  "time_remaining.minutes": "{number, plural, one {# minutt} other {# minutt}} igjen",
+  "time_remaining.moments": "Kort tid igjen",
+  "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekund}} igjen",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {folk}} snakkar",
+  "trends.trending_now": "Populært no",
+  "ui.beforeunload": "Kladden din forsvinn om du forlèt Mastodon no.",
+  "upload_area.title": "Drag & slepp for å lasta opp",
+  "upload_button.label": "Legg til medium ({formats})",
+  "upload_error.limit": "Du har gått over opplastingsgrensa.",
+  "upload_error.poll": "Filopplasting ikkje tillate med meiningsmålingar.",
+  "upload_form.audio_description": "Beskriv det for folk med hørselstap",
+  "upload_form.description": "Skildr for synshemja",
+  "upload_form.edit": "Rediger",
   "upload_form.undo": "Slett",
-  "upload_modal.analyzing_picture": "Analyserer bilde…",
+  "upload_form.video_description": "Beskriv det for folk med hørselstap eller synshemminger",
+  "upload_modal.analyzing_picture": "Analyserer bilete…",
   "upload_modal.apply": "Bruk",
   "upload_modal.description_placeholder": "Ein rask brun rev hoppar over den late hunden",
-  "upload_modal.detect_text": "Finn tekst i bildet",
-  "upload_modal.edit_media": "Redigér media",
-  "upload_modal.hint": "Klikk og dra sirkelen på forsyneren for å fokusere synspunktet slik det ska synes i alle minityrbildene.",
-  "upload_modal.preview_label": "Framsyn ({ratio})",
+  "upload_modal.detect_text": "Gjenkjenn tekst i biletet",
+  "upload_modal.edit_media": "Rediger medium",
+  "upload_modal.hint": "Klikk og dra sirkelen på førehandsvisninga for å velge fokuspunktet som alltid vil vere synleg på alle miniatyrbileta.",
+  "upload_modal.preview_label": "Førehandsvis ({ratio})",
   "upload_progress.label": "Lastar opp...",
   "video.close": "Lukk video",
+  "video.download": "Last ned fil",
   "video.exit_fullscreen": "Lukk fullskjerm",
-  "video.expand": "Expand video",
+  "video.expand": "Utvid video",
   "video.fullscreen": "Fullskjerm",
   "video.hide": "Gøym video",
   "video.mute": "Demp lyd",
   "video.pause": "Pause",
-  "video.play": "Spel",
+  "video.play": "Spel av",
   "video.unmute": "Av-dempe lyd"
 }
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index 5c84c08fe..215cdb150 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Legg til eller fjern fra lister",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Gruppe",
   "account.block": "Blokkér @{name}",
   "account.block_domain": "Skjul alt fra {domain}",
   "account.blocked": "Blokkert",
@@ -8,7 +9,7 @@
   "account.direct": "Direct Message @{name}",
   "account.domain_blocked": "Domenet skjult",
   "account.edit_profile": "Rediger profil",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "Vis frem på profilen",
   "account.follow": "Følg",
   "account.followers": "Følgere",
   "account.followers.empty": "Ingen følger denne brukeren ennå.",
@@ -24,7 +25,7 @@
   "account.moved_to": "{name} har flyttet til:",
   "account.mute": "Demp @{name}",
   "account.mute_notifications": "Ignorer varsler fra @{name}",
-  "account.muted": "Muted",
+  "account.muted": "Dempet",
   "account.never_active": "Aldri",
   "account.posts": "Innlegg",
   "account.posts_with_replies": "Toots with replies",
@@ -34,14 +35,15 @@
   "account.show_reblogs": "Vis boosts fra @{name}",
   "account.unblock": "Avblokker @{name}",
   "account.unblock_domain": "Vis {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "Ikke vis frem på profilen",
   "account.unfollow": "Avfølg",
   "account.unmute": "Avdemp @{name}",
   "account.unmute_notifications": "Vis varsler fra @{name}",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.message": "Vennligst prøv igjen etter kl. {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Hastighetsbegrenset",
   "alert.unexpected.message": "En uventet feil oppstod.",
   "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Kunngjøring",
   "autosuggest_hashtag.per_week": "{count} per uke",
   "boost_modal.combo": "You kan trykke {combo} for å hoppe over dette neste gang",
   "bundle_column_error.body": "Noe gikk galt mens denne komponenten lastet.",
@@ -51,10 +53,11 @@
   "bundle_modal_error.message": "Noe gikk galt da denne komponenten lastet.",
   "bundle_modal_error.retry": "Prøv igjen",
   "column.blocks": "Blokkerte brukere",
+  "column.bookmarks": "Bokmerker",
   "column.community": "Lokal tidslinje",
   "column.direct": "Direktemeldinger",
   "column.directory": "Bla gjennom profiler",
-  "column.domain_blocks": "Hidden domains",
+  "column.domain_blocks": "Skjulte domener",
   "column.favourites": "Likt",
   "column.follow_requests": "Følgeforespørsler",
   "column.home": "Hjem",
@@ -82,16 +85,18 @@
   "compose_form.poll.duration": "Avstemningens varighet",
   "compose_form.poll.option_placeholder": "Valg {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Merk media som sensitivt",
-  "compose_form.sensitive.marked": "Media is marked as sensitive",
-  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
-  "compose_form.spoiler.marked": "Text is hidden behind warning",
-  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.sensitive.marked": "Mediet er merket som sensitiv",
+  "compose_form.sensitive.unmarked": "Mediet er ikke merket som sensitiv",
+  "compose_form.spoiler.marked": "Teksten er skjult bak en advarsel",
+  "compose_form.spoiler.unmarked": "Teksten er ikke skjult",
   "compose_form.spoiler_placeholder": "Innholdsadvarsel",
   "confirmation_modal.cancel": "Avbryt",
-  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.block_and_report": "Blokker og rapporter",
   "confirmations.block.confirm": "Blokkèr",
   "confirmations.block.message": "Er du sikker på at du vil blokkere {name}?",
   "confirmations.delete.confirm": "Slett",
@@ -103,22 +108,22 @@
   "confirmations.logout.confirm": "Logg ut",
   "confirmations.logout.message": "Er du sikker på at du vil logge ut?",
   "confirmations.mute.confirm": "Demp",
-  "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.explanation": "Dette vil skjule innlegg fra dem og innlegg som nevner dem, men det vil fortsatt la dem se dine innlegg og å følge deg.",
   "confirmations.mute.message": "Er du sikker på at du vil dempe {name}?",
-  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.redraft.confirm": "Slett og drøft på nytt",
   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
   "confirmations.reply.confirm": "Svar",
-  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+  "confirmations.reply.message": "Å svare nå vil overskrive meldingen du skriver for øyeblikket. Er du sikker på at du vil fortsette?",
   "confirmations.unfollow.confirm": "Slutt å følge",
   "confirmations.unfollow.message": "Er du sikker på at du vil slutte å følge {name}?",
-  "conversation.delete": "Delete conversation",
-  "conversation.mark_as_read": "Mark as read",
-  "conversation.open": "View conversation",
+  "conversation.delete": "Slett samtalen",
+  "conversation.mark_as_read": "Marker som lest",
+  "conversation.open": "Vis samtale",
   "conversation.with": "Med {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
+  "directory.federated": "Fra det kjente strømiverset",
+  "directory.local": "Kun fra {domain}",
+  "directory.new_arrivals": "Nye ankomster",
+  "directory.recently_active": "Nylig aktiv",
   "embed.instructions": "Kopier koden under for å bygge inn denne statusen på hjemmesiden din.",
   "embed.preview": "Slik kommer det til å se ut:",
   "emoji_button.activity": "Aktivitet",
@@ -135,176 +140,182 @@
   "emoji_button.search_results": "Søkeresultat",
   "emoji_button.symbols": "Symboler",
   "emoji_button.travel": "Reise & steder",
-  "empty_column.account_timeline": "No toots here!",
-  "empty_column.account_unavailable": "Profile unavailable",
-  "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.account_timeline": "Ingen tuter er her!",
+  "empty_column.account_unavailable": "Profilen er utilgjengelig",
+  "empty_column.blocks": "Du har ikke blokkert noen brukere enda.",
+  "empty_column.bookmarked_statuses": "Du har ikke bokmerket noen tuter enda. Når du bokmerker en, vil den dukke opp her.",
   "empty_column.community": "Den lokale tidslinjen er tom. Skriv noe offentlig for å få snøballen til å rulle!",
-  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
-  "empty_column.domain_blocks": "There are no hidden domains yet.",
-  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
-  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
-  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.direct": "Du har ingen direktemeldinger enda. Når du mottar eller sender en, vil den dukke opp her.",
+  "empty_column.domain_blocks": "Det er ingen skjulte domener enda.",
+  "empty_column.favourited_statuses": "Du har ikke likt noen tuter enda. Når du liker en, vil den dukke opp her.",
+  "empty_column.favourites": "Ingen har likt denne tuten enda. Når noen gjør det, vil de dukke opp her.",
+  "empty_column.follow_requests": "Du har ingen følgeforespørsler enda. Når du mottar en, vil den dukke opp her.",
   "empty_column.hashtag": "Det er ingenting i denne hashtagen ennå.",
   "empty_column.home": "Du har ikke fulgt noen ennå. Besøk {publlic} eller bruk søk for å komme i gang og møte andre brukere.",
   "empty_column.home.public_timeline": "en offentlig tidslinje",
   "empty_column.list": "Det er ingenting i denne listen ennå. Når medlemmene av denne listen legger ut nye statuser vil de dukke opp her.",
-  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
-  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.lists": "Du har ingen lister enda. Når du lager en, vil den dukke opp her.",
+  "empty_column.mutes": "Du har ikke dempet noen brukere enda.",
   "empty_column.notifications": "Du har ingen varsler ennå. Kommuniser med andre for å begynne samtalen.",
   "empty_column.public": "Det er ingenting her! Skriv noe offentlig, eller følg brukere manuelt fra andre instanser for å fylle den opp",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.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.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "error.unexpected_crash.explanation": "På grunn av en bug i koden vår eller et nettleserkompatibilitetsproblem, kunne denne siden ikke vises riktig.",
+  "error.unexpected_crash.next_steps": "Prøv å oppfriske siden. Dersom det ikke hjelper, vil du kanskje fortsatt kunne bruke Mastodon gjennom en annen nettleser eller app.",
+  "errors.unexpected_crash.copy_stacktrace": "Kopier stacktrace-en til utklippstavlen",
+  "errors.unexpected_crash.report_issue": "Rapporter en feil",
   "follow_request.authorize": "Autorisér",
   "follow_request.reject": "Avvis",
-  "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
-  "getting_started.documentation": "Documentation",
+  "getting_started.developers": "Utviklere",
+  "getting_started.directory": "Profilmappe",
+  "getting_started.documentation": "Dokumentasjon",
   "getting_started.heading": "Kom i gang",
-  "getting_started.invite": "Invite people",
+  "getting_started.invite": "Inviter folk",
   "getting_started.open_source_notice": "Mastodon er fri programvare. Du kan bidra eller rapportere problemer på GitHub på {github}.",
-  "getting_started.security": "Security",
-  "getting_started.terms": "Terms of service",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.select.no_options_message": "No suggestions found",
-  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
+  "getting_started.security": "Kontoinnstillinger",
+  "getting_started.terms": "Bruksvilkår",
+  "hashtag.column_header.tag_mode.all": "og {additional}",
+  "hashtag.column_header.tag_mode.any": "eller {additional}",
+  "hashtag.column_header.tag_mode.none": "uten {additional}",
+  "hashtag.column_settings.select.no_options_message": "Ingen forslag ble funnet",
+  "hashtag.column_settings.select.placeholder": "Skriv inn emneknagger …",
+  "hashtag.column_settings.tag_mode.all": "Alle disse",
+  "hashtag.column_settings.tag_mode.any": "Enhver av disse",
+  "hashtag.column_settings.tag_mode.none": "Ingen av disse",
   "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
-  "home.column_settings.basic": "Enkel",
+  "home.column_settings.basic": "Enkelt",
   "home.column_settings.show_reblogs": "Vis fremhevinger",
   "home.column_settings.show_replies": "Vis svar",
-  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
-  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
-  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
-  "introduction.federation.action": "Next",
-  "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
-  "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
-  "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish toot-orial!",
-  "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
+  "intervals.full.days": "{number, plural,one {# dag} other {# dager}}",
+  "intervals.full.hours": "{number, plural, one {# time} other {# timer}}",
+  "intervals.full.minutes": "{number, plural, one {# minutt} other {# minutter}}",
+  "introduction.federation.action": "Neste",
+  "introduction.federation.federated.headline": "Felles",
+  "introduction.federation.federated.text": "Offentlige innlegg fra andre tjenere i strømiverset vil dukke opp i fellestidslinjen.",
+  "introduction.federation.home.headline": "Hjem",
+  "introduction.federation.home.text": "Innlegg fra folk du følger vil dukke opp på hjemmestrømmen din. Du kan følge hvem som helst på enhver tjener!",
+  "introduction.federation.local.headline": "Lokalt",
+  "introduction.federation.local.text": "Offentlige innlegg fra folk på samme tjener som deg, vil dukke opp i den lokale tidslinjen.",
+  "introduction.interactions.action": "Avslutt veiledningen!",
+  "introduction.interactions.favourite.headline": "Lik",
+  "introduction.interactions.favourite.text": "Du kan lagre en tut til senere, og la forfatteren vite at du satte pris på det, ved å like det.",
+  "introduction.interactions.reblog.headline": "Fremhev",
+  "introduction.interactions.reblog.text": "Du kan dele andre folks tutinger med dine følgere ved å fremheve dem.",
   "introduction.interactions.reply.headline": "Svar",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "introduction.interactions.reply.text": "Du kan svare på tuten til andre folk og til deg selv, som vil binde dem sammen til en samtale.",
+  "introduction.welcome.action": "La oss sette i gang!",
+  "introduction.welcome.headline": "De første skritt",
+  "introduction.welcome.text": "Velkommen til strømiverset! Om noen øyeblikk, vil du kunne sende meldinger og snakke med dine venner over et bredt spekter av tjenere. Men denne tjeneren, {domain}, er spesiell, for den inneholder profilen din, så husk på navnet dens.",
   "keyboard_shortcuts.back": "for å navigere tilbake",
-  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.blocked": "åpne listen over blokkerte brukere",
   "keyboard_shortcuts.boost": "å fremheve",
   "keyboard_shortcuts.column": "å fokusere en status i en av kolonnene",
   "keyboard_shortcuts.compose": "å fokusere komponeringsfeltet",
   "keyboard_shortcuts.description": "Beskrivelse",
-  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.direct": "åpne direktemeldingskolonnen",
   "keyboard_shortcuts.down": "for å flytte ned i listen",
-  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.enter": "å åpne status",
   "keyboard_shortcuts.favourite": "for å favorittmarkere",
-  "keyboard_shortcuts.favourites": "to open favourites list",
-  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.favourites": "åpne listen over likte ting",
+  "keyboard_shortcuts.federated": "for å åpne fellestidslinjen",
   "keyboard_shortcuts.heading": "Keyboard Shortcuts",
-  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.home": "åpne hjemmetidslinjen",
   "keyboard_shortcuts.hotkey": "Lyntast",
   "keyboard_shortcuts.legend": "å vise denne forklaringen",
-  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.local": "åpne den lokale tidslinjen",
   "keyboard_shortcuts.mention": "å nevne forfatter",
-  "keyboard_shortcuts.muted": "to open muted users list",
-  "keyboard_shortcuts.my_profile": "to open your profile",
-  "keyboard_shortcuts.notifications": "to open notifications column",
-  "keyboard_shortcuts.pinned": "to open pinned toots list",
-  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.muted": "åpne listen over dempede brukere",
+  "keyboard_shortcuts.my_profile": "å åpne profilen din",
+  "keyboard_shortcuts.notifications": "åpne varslingskolonnen",
+  "keyboard_shortcuts.open_media": "å åpne media",
+  "keyboard_shortcuts.pinned": "åpne listen over klistrede tuter",
+  "keyboard_shortcuts.profile": "åpne forfatterens profil",
   "keyboard_shortcuts.reply": "for å svare",
-  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.requests": "åpne følgingsforespørselslisten",
   "keyboard_shortcuts.search": "å fokusere søk",
-  "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.start": "åpne «Sett i gang»-kolonnen",
+  "keyboard_shortcuts.toggle_hidden": "å vise/skjule tekst bak en innholdsadvarsel",
+  "keyboard_shortcuts.toggle_sensitivity": "å vise/skjule media",
   "keyboard_shortcuts.toot": "å starte en helt ny tut",
   "keyboard_shortcuts.unfocus": "å ufokusere komponerings-/søkefeltet",
   "keyboard_shortcuts.up": "å flytte opp i listen",
   "lightbox.close": "Lukk",
   "lightbox.next": "Neste",
   "lightbox.previous": "Forrige",
-  "lightbox.view_context": "View context",
+  "lightbox.view_context": "Vis sammenheng",
   "lists.account.add": "Legg til i listen",
   "lists.account.remove": "Fjern fra listen",
   "lists.delete": "Slett listen",
   "lists.edit": "Rediger listen",
-  "lists.edit.submit": "Change title",
+  "lists.edit.submit": "Endre tittel",
   "lists.new.create": "Ligg til liste",
   "lists.new.title_placeholder": "Ny listetittel",
   "lists.search": "Søk blant personer du følger",
   "lists.subheading": "Dine lister",
-  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "load_pending": "{count, plural,one {# ny gjenstand} other {# nye gjenstander}}",
   "loading_indicator.label": "Laster...",
   "media_gallery.toggle_visible": "Veksle synlighet",
   "missing_indicator.label": "Ikke funnet",
   "missing_indicator.sublabel": "Denne ressursen ble ikke funnet",
   "mute_modal.hide_notifications": "Skjul varslinger fra denne brukeren?",
-  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.apps": "Mobilapper",
   "navigation_bar.blocks": "Blokkerte brukere",
+  "navigation_bar.bookmarks": "Bokmerker",
   "navigation_bar.community_timeline": "Lokal tidslinje",
-  "navigation_bar.compose": "Compose new toot",
-  "navigation_bar.direct": "Direct messages",
-  "navigation_bar.discover": "Discover",
-  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.compose": "Skriv en ny tut",
+  "navigation_bar.direct": "Direktemeldinger",
+  "navigation_bar.discover": "Oppdag",
+  "navigation_bar.domain_blocks": "Skjulte domener",
   "navigation_bar.edit_profile": "Rediger profil",
   "navigation_bar.favourites": "Favoritter",
-  "navigation_bar.filters": "Muted words",
+  "navigation_bar.filters": "Stilnede ord",
   "navigation_bar.follow_requests": "Følgeforespørsler",
-  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.follows_and_followers": "Følginger og følgere",
   "navigation_bar.info": "Utvidet informasjon",
   "navigation_bar.keyboard_shortcuts": "Tastatursnarveier",
   "navigation_bar.lists": "Lister",
   "navigation_bar.logout": "Logg ut",
   "navigation_bar.mutes": "Dempede brukere",
-  "navigation_bar.personal": "Personal",
+  "navigation_bar.personal": "Personlig",
   "navigation_bar.pins": "Festa tuter",
   "navigation_bar.preferences": "Preferanser",
   "navigation_bar.public_timeline": "Felles tidslinje",
   "navigation_bar.security": "Sikkerhet",
   "notification.favourite": "{name} likte din status",
   "notification.follow": "{name} fulgte deg",
+  "notification.follow_request": "{name} har bedt om å få følge deg",
   "notification.mention": "{name} nevnte deg",
-  "notification.poll": "A poll you have voted in has ended",
+  "notification.own_poll": "Avstemningen din er ferdig",
+  "notification.poll": "En avstemning du har stemt på har avsluttet",
   "notification.reblog": "{name} fremhevde din status",
   "notifications.clear": "Fjern varsler",
   "notifications.clear_confirmation": "Er du sikker på at du vil fjerne alle dine varsler permanent?",
   "notifications.column_settings.alert": "Skrivebordsvarslinger",
   "notifications.column_settings.favourite": "Likt:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.advanced": "Vis alle kategorier",
+  "notifications.column_settings.filter_bar.category": "Hurtigfiltreringslinje",
+  "notifications.column_settings.filter_bar.show": "Vis",
   "notifications.column_settings.follow": "Nye følgere:",
+  "notifications.column_settings.follow_request": "Nye følgerforespørsler:",
   "notifications.column_settings.mention": "Nevnt:",
-  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.poll": "Avstemningsresultater:",
   "notifications.column_settings.push": "Push varsler",
   "notifications.column_settings.reblog": "Fremhevet:",
   "notifications.column_settings.show": "Vis i kolonne",
   "notifications.column_settings.sound": "Spill lyd",
   "notifications.filter.all": "Alle",
-  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.boosts": "Fremhevinger",
   "notifications.filter.favourites": "Favoritter",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
-  "notifications.filter.polls": "Poll results",
-  "notifications.group": "{count} notifications",
-  "poll.closed": "Closed",
+  "notifications.filter.follows": "Følginger",
+  "notifications.filter.mentions": "Nevnelser",
+  "notifications.filter.polls": "Avstemningsresultater",
+  "notifications.group": "{count} varslinger",
+  "poll.closed": "Lukket",
   "poll.refresh": "Oppdater",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
-  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Vote",
-  "poll.voted": "You voted for this answer",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll.total_people": "{count, plural, one {# person} other {# personer}}",
+  "poll.total_votes": "{count, plural, one {# stemme} other {# stemmer}}",
+  "poll.vote": "Stem",
+  "poll.voted": "Du stemte på dette svaret",
+  "poll_button.add_poll": "Legg til en avstemning",
+  "poll_button.remove_poll": "Fjern avstemningen",
   "privacy.change": "Justér synlighet",
   "privacy.direct.long": "Post kun til nevnte brukere",
   "privacy.direct.short": "Direkte",
@@ -314,45 +325,46 @@
   "privacy.public.short": "Offentlig",
   "privacy.unlisted.long": "Ikke vis i offentlige tidslinjer",
   "privacy.unlisted.short": "Uoppført",
-  "refresh": "Refresh",
+  "refresh": "Oppfrisk",
   "regeneration_indicator.label": "Laster…",
   "regeneration_indicator.sublabel": "Dine startside forberedes!",
   "relative_time.days": "{number}d",
-  "relative_time.hours": "{number}h",
+  "relative_time.hours": "{number}t",
   "relative_time.just_now": "nå",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
   "reply_indicator.cancel": "Avbryt",
-  "report.forward": "Forward to {target}",
-  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.forward": "Videresend til {target}",
+  "report.forward_hint": "Denne kontoen er fra en annen tjener. Vil du sende en anonymisert kopi av rapporten dit også?",
   "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
   "report.placeholder": "Tilleggskommentarer",
   "report.submit": "Send inn",
   "report.target": "Rapporterer",
   "search.placeholder": "Søk",
   "search_popout.search_format": "Avansert søkeformat",
-  "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.full_text": "Enkel tekst gir resultater for statuser du har skrevet, likt, fremhevet, eller har blitt nevnt i, i tillegg til samsvarende brukernavn, visningsnavn og emneknagger.",
   "search_popout.tips.hashtag": "emneknagg",
   "search_popout.tips.status": "status",
   "search_popout.tips.text": "Enkel tekst returnerer matchende visningsnavn, brukernavn og emneknagger",
   "search_popout.tips.user": "bruker",
-  "search_results.accounts": "People",
-  "search_results.hashtags": "Hashtags",
-  "search_results.statuses": "Toots",
-  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+  "search_results.accounts": "Folk",
+  "search_results.hashtags": "Emneknagger",
+  "search_results.statuses": "Tuter",
+  "search_results.statuses_fts_disabled": "Å søke i tuter etter innhold er ikke skrudd på i denne Mastodon-tjeneren.",
   "search_results.total": "{count, number} {count, plural, one {resultat} other {resultater}}",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
-  "status.block": "Block @{name}",
-  "status.cancel_reblog_private": "Unboost",
+  "status.admin_account": "Åpne moderatorgrensesnittet for @{name}",
+  "status.admin_status": "Åpne denne statusen i moderatorgrensesnittet",
+  "status.block": "Blokkér @{name}",
+  "status.bookmark": "Bokmerke",
+  "status.cancel_reblog_private": "Fjern fremheving",
   "status.cannot_reblog": "Denne posten kan ikke fremheves",
-  "status.copy": "Copy link to status",
+  "status.copy": "Kopier lenken til statusen",
   "status.delete": "Slett",
-  "status.detailed_status": "Detailed conversation view",
-  "status.direct": "Direct message @{name}",
+  "status.detailed_status": "Detaljert samtalevisning",
+  "status.direct": "Send direktemelding til @{name}",
   "status.embed": "Bygge inn",
   "status.favourite": "Lik",
-  "status.filtered": "Filtered",
+  "status.filtered": "Filtrert",
   "status.load_more": "Last mer",
   "status.media_hidden": "Media skjult",
   "status.mention": "Nevn @{name}",
@@ -361,57 +373,61 @@
   "status.mute_conversation": "Demp samtale",
   "status.open": "Utvid denne statusen",
   "status.pin": "Fest på profilen",
-  "status.pinned": "Pinned toot",
+  "status.pinned": "Festet tut",
   "status.read_more": "Les mer",
   "status.reblog": "Fremhev",
-  "status.reblog_private": "Boost to original audience",
+  "status.reblog_private": "Fremhev til det opprinnelige publikummet",
   "status.reblogged_by": "Fremhevd av {name}",
-  "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
-  "status.redraft": "Delete & re-draft",
+  "status.reblogs.empty": "Ingen har fremhevet denne tuten enda. Når noen gjør det, vil de dukke opp her.",
+  "status.redraft": "Slett og drøft på nytt",
+  "status.remove_bookmark": "Fjern bokmerke",
   "status.reply": "Svar",
   "status.replyAll": "Svar til samtale",
   "status.report": "Rapporter @{name}",
   "status.sensitive_warning": "Følsomt innhold",
   "status.share": "Del",
   "status.show_less": "Vis mindre",
-  "status.show_less_all": "Show less for all",
+  "status.show_less_all": "Vis mindre for alle",
   "status.show_more": "Vis mer",
-  "status.show_more_all": "Show more for all",
-  "status.show_thread": "Show thread",
+  "status.show_more_all": "Vis mer for alle",
+  "status.show_thread": "Vis tråden",
   "status.uncached_media_warning": "Ikke tilgjengelig",
   "status.unmute_conversation": "Ikke demp samtale",
   "status.unpin": "Angre festing på profilen",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
+  "suggestions.dismiss": "Utelukk forslaget",
+  "suggestions.header": "Du er kanskje interessert i …",
   "tabs_bar.federated_timeline": "Felles",
   "tabs_bar.home": "Hjem",
   "tabs_bar.local_timeline": "Lokal",
   "tabs_bar.notifications": "Varslinger",
   "tabs_bar.search": "Søk",
-  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
-  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
-  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
-  "time_remaining.moments": "Moments remaining",
-  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
-  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
-  "trends.trending_now": "Trending now",
+  "time_remaining.days": "{number, plural,one {# dag} other {# dager}} igjen",
+  "time_remaining.hours": "{number, plural, one {# time} other {# timer}} igjen",
+  "time_remaining.minutes": "{number, plural, one {# minutt} other {# minutter}} igjen",
+  "time_remaining.moments": "Gjenværende øyeblikk",
+  "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekunder}} igjen",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {personer}} snakker om det",
+  "trends.trending_now": "Trender nå",
   "ui.beforeunload": "Din kladd vil bli forkastet om du forlater Mastodon.",
   "upload_area.title": "Dra og slipp for å laste opp",
   "upload_button.label": "Legg til media",
-  "upload_error.limit": "File upload limit exceeded.",
-  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_error.limit": "Filopplastingsgrensen er oversteget.",
+  "upload_error.poll": "Filopplasting inni avstemninger er ikke tillatt.",
+  "upload_form.audio_description": "Beskriv det for folk med hørselstap",
   "upload_form.description": "Beskriv for synshemmede",
-  "upload_form.edit": "Edit",
+  "upload_form.edit": "Rediger",
   "upload_form.undo": "Angre",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
+  "upload_form.video_description": "Beskriv det for folk med hørselstap eller synshemminger",
+  "upload_modal.analyzing_picture": "Analyserer bildet …",
   "upload_modal.apply": "Bruk",
-  "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.preview_label": "Preview ({ratio})",
+  "upload_modal.description_placeholder": "Når du en gang kommer, neste sommer, skal vi atter drikke vin",
+  "upload_modal.detect_text": "Oppdag tekst i bildet",
+  "upload_modal.edit_media": "Rediger media",
+  "upload_modal.hint": "Klikk eller dra sirkelen i forhåndsvisningen for å velge hovedpunktet som alltid vil bli vist i alle miniatyrbilder.",
+  "upload_modal.preview_label": "Forhåndsvisning ({ratio})",
   "upload_progress.label": "Laster opp...",
   "video.close": "Lukk video",
+  "video.download": "Last ned fil",
   "video.exit_fullscreen": "Lukk fullskjerm",
   "video.expand": "Utvid video",
   "video.fullscreen": "Fullskjerm",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 1ca5f42ed..b7701c17e 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Ajustar o tirar de las listas",
   "account.badges.bot": "Robòt",
+  "account.badges.group": "Group",
   "account.block": "Blocar @{name}",
   "account.block_domain": "Tot amagar del domeni {domain}",
   "account.blocked": "Blocat",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Taus limitat",
   "alert.unexpected.message": "Una error s’es producha.",
   "alert.unexpected.title": "Ops !",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per setmana",
   "boost_modal.combo": "Podètz botar {combo} per passar aquò lo còp que ven",
   "bundle_column_error.body": "Quicòm a fach mèuca pendent lo cargament d’aqueste compausant.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Quicòm a fach mèuca pendent lo cargament d’aqueste compausant.",
   "bundle_modal_error.retry": "Tornar ensajar",
   "column.blocks": "Personas blocadas",
+  "column.bookmarks": "Marcadors",
   "column.community": "Flux public local",
   "column.direct": "Messatges dirèctes",
   "column.directory": "Percórrer los perfils",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Durada del sondatge",
   "compose_form.poll.option_placeholder": "Opcion {number}",
   "compose_form.poll.remove_option": "Levar aquesta opcion",
+  "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": "Tut",
   "compose_form.publish_loud": "{publish} !",
   "compose_form.sensitive.hide": "Marcar coma sensible",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Cap de tuts aquí !",
   "empty_column.account_unavailable": "Perfil pas disponible",
   "empty_column.blocks": "Avètz pas blocat degun pel moment.",
+  "empty_column.bookmarked_statuses": "Avètz pas cap de tuts marcats pel moment. Quand ne marquetz un, serà mostrat aquí.",
   "empty_column.community": "Lo flux public local es void. Escrivètz quicòm per lo garnir !",
   "empty_column.direct": "Avètz pas encara cap de messatges. Quand ne mandatz un o que ne recebètz un, serà mostrat aquí.",
   "empty_column.domain_blocks": "I a pas encara cap de domeni amagat.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "dobrir la lista dels utilizaires silenciats",
   "keyboard_shortcuts.my_profile": "dobrir vòstre perfil",
   "keyboard_shortcuts.notifications": "dobrir la colomna de notificacions",
+  "keyboard_shortcuts.open_media": "dobrir lo mèdia",
   "keyboard_shortcuts.pinned": "dobrir la lista dels tuts penjats",
   "keyboard_shortcuts.profile": "dobrir lo perfil de l’autor",
   "keyboard_shortcuts.reply": "respondre",
@@ -226,7 +233,7 @@
   "keyboard_shortcuts.search": "anar a la recèrca",
   "keyboard_shortcuts.start": "dobrir la colomna « Per començar »",
   "keyboard_shortcuts.toggle_hidden": "mostrar/amagar lo tèxte dels avertiments",
-  "keyboard_shortcuts.toggle_sensitivity": "per mostrar/rescondre los mèdias",
+  "keyboard_shortcuts.toggle_sensitivity": "mostrar/rescondre los mèdias",
   "keyboard_shortcuts.toot": "començar un estatut tot novèl",
   "keyboard_shortcuts.unfocus": "quitar lo camp tèxte/de recèrca",
   "keyboard_shortcuts.up": "far montar dins la lista",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Rescondre las notificacions d’aquesta persona ?",
   "navigation_bar.apps": "Aplicacions mobil",
   "navigation_bar.blocks": "Personas blocadas",
+  "navigation_bar.bookmarks": "Marcadors",
   "navigation_bar.community_timeline": "Flux public local",
   "navigation_bar.compose": "Escriure un nòu tut",
   "navigation_bar.direct": "Messatges dirèctes",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Seguretat",
   "notification.favourite": "{name} a ajustat a sos favorits",
   "notification.follow": "{name} vos sèc",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} vos a mencionat",
+  "notification.own_poll": "Vòstre sondatge es acabat",
   "notification.poll": "Avètz participat a un sondatge que ven de s’acabar",
   "notification.reblog": "{name} a partejat vòstre estatut",
   "notifications.clear": "Escafar",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Barra de recèrca rapida",
   "notifications.column_settings.filter_bar.show": "Mostrar",
   "notifications.column_settings.follow": "Nòus seguidors :",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mencions :",
   "notifications.column_settings.poll": "Resultats del sondatge :",
   "notifications.column_settings.push": "Notificacions",
@@ -344,6 +355,7 @@
   "status.admin_account": "Dobrir l’interfàcia de moderacion per @{name}",
   "status.admin_status": "Dobrir aqueste estatut dins l’interfàcia de moderacion",
   "status.block": "Blocar @{name}",
+  "status.bookmark": "Marcador",
   "status.cancel_reblog_private": "Quitar de partejar",
   "status.cannot_reblog": "Aqueste estatut pòt pas èsser partejat",
   "status.copy": "Copiar lo ligam de l’estatut",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} a partejat",
   "status.reblogs.empty": "Degun a pas encara partejat aqueste tut. Quand qualqu’un o farà, apareisserà aquí.",
   "status.redraft": "Escafar e tornar formular",
+  "status.remove_bookmark": "Suprimir lo marcador",
   "status.reply": "Respondre",
   "status.replyAll": "Respondre a la conversacion",
   "status.report": "Senhalar @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Ajustar un mèdia (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Talha maximum pels mandadís subrepassada.",
   "upload_error.poll": "Lo mandadís de fichièr es pas autorizat pels sondatges.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Descripcion pels mal vesents",
   "upload_form.edit": "Modificar",
   "upload_form.undo": "Suprimir",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
   "upload_modal.analyzing_picture": "Analisi de l’imatge…",
   "upload_modal.apply": "Aplicar",
   "upload_modal.description_placeholder": "Lo dròlle bilingüe manja un yaourt de ròcs exagonals e kiwis verds farà un an mai",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Apercebut ({ratio})",
   "upload_progress.label": "Mandadís…",
   "video.close": "Tampar la vidèo",
+  "video.download": "Telecargar lo fichièr",
   "video.exit_fullscreen": "Sortir plen ecran",
   "video.expand": "Agrandir la vidèo",
   "video.fullscreen": "Ecran complèt",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index b3513ea46..3874f1596 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Dodaj lub usuń z list",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Group",
   "account.block": "Blokuj @{name}",
   "account.block_domain": "Blokuj wszystko z {domain}",
   "account.blocked": "Zablokowany(-a)",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Ograniczony czasowo",
   "alert.unexpected.message": "Wystąpił nieoczekiwany błąd.",
   "alert.unexpected.title": "O nie!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} co tydzień",
   "boost_modal.combo": "Naciśnij {combo}, aby pominąć to następnym razem",
   "bundle_column_error.body": "Coś poszło nie tak podczas ładowania tego składnika.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Coś poszło nie tak podczas ładowania tego składnika.",
   "bundle_modal_error.retry": "Spróbuj ponownie",
   "column.blocks": "Zablokowani użytkownicy",
+  "column.bookmarks": "Zakładki",
   "column.community": "Lokalna oś czasu",
   "column.direct": "Wiadomości bezpośrednie",
   "column.directory": "Przeglądaj profile",
@@ -86,6 +89,8 @@
   "compose_form.poll.duration": "Czas trwania głosowania",
   "compose_form.poll.option_placeholder": "Opcja {number}",
   "compose_form.poll.remove_option": "Usuń tę opcję",
+  "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": "Wyślij",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Oznacz multimedia jako wrażliwe",
@@ -142,6 +147,7 @@
   "empty_column.account_timeline": "Brak wpisów tutaj!",
   "empty_column.account_unavailable": "Profil niedostępny",
   "empty_column.blocks": "Nie zablokowałeś(-aś) jeszcze żadnego użytkownika.",
+  "empty_column.bookmarked_statuses": "Nie dodałeś(-aś) żadnego wpisu do zakładek. Kiedy to zrobisz, pojawi się on tutaj.",
   "empty_column.community": "Lokalna oś czasu jest pusta. Napisz coś publicznie, aby zagaić!",
   "empty_column.direct": "Nie masz żadnych wiadomości bezpośrednich. Kiedy dostaniesz lub wyślesz jakąś, pojawi się ona tutaj.",
   "empty_column.domain_blocks": "Brak ukrytych domen.",
@@ -223,6 +229,7 @@
   "keyboard_shortcuts.muted": "aby przejść do listy wyciszonych użytkowników",
   "keyboard_shortcuts.my_profile": "aby otworzyć własny profil",
   "keyboard_shortcuts.notifications": "aby otworzyć kolumnę powiadomień",
+  "keyboard_shortcuts.open_media": "aby otworzyć zawartość multimedialną",
   "keyboard_shortcuts.pinned": "aby przejść do listy przypiętych wpisów",
   "keyboard_shortcuts.profile": "aby przejść do profilu autora wpisu",
   "keyboard_shortcuts.reply": "aby odpowiedzieć",
@@ -255,6 +262,7 @@
   "mute_modal.hide_notifications": "Chcesz ukryć powiadomienia od tego użytkownika?",
   "navigation_bar.apps": "Aplikacje mobilne",
   "navigation_bar.blocks": "Zablokowani użytkownicy",
+  "navigation_bar.bookmarks": "Zakładki",
   "navigation_bar.community_timeline": "Lokalna oś czasu",
   "navigation_bar.compose": "Utwórz nowy wpis",
   "navigation_bar.direct": "Wiadomości bezpośrednie",
@@ -278,7 +286,9 @@
   "navigation_bar.security": "Bezpieczeństwo",
   "notification.favourite": "{name} dodał(a) Twój wpis do ulubionych",
   "notification.follow": "{name} zaczął(-ęła) Cię śledzić",
+  "notification.follow_request": "{name} poprosił(a) o możliwość śledzenia Cię",
   "notification.mention": "{name} wspomniał(a) o tobie",
+  "notification.own_poll": "Twoje głosowanie zakończyło się",
   "notification.poll": "Głosowanie w którym brałeś(-aś) udział zakończyła się",
   "notification.reblog": "{name} podbił(a) Twój wpis",
   "notifications.clear": "Wyczyść powiadomienia",
@@ -289,6 +299,7 @@
   "notifications.column_settings.filter_bar.category": "Szybkie filtrowanie",
   "notifications.column_settings.filter_bar.show": "Pokaż",
   "notifications.column_settings.follow": "Nowi śledzący:",
+  "notifications.column_settings.follow_request": "Nowe prośby o możliwość śledzenia:",
   "notifications.column_settings.mention": "Wspomnienia:",
   "notifications.column_settings.poll": "Wyniki głosowania:",
   "notifications.column_settings.push": "Powiadomienia push",
@@ -349,6 +360,7 @@
   "status.admin_account": "Otwórz interfejs moderacyjny dla @{name}",
   "status.admin_status": "Otwórz ten wpis w interfejsie moderacyjnym",
   "status.block": "Zablokuj @{name}",
+  "status.bookmark": "Dodaj zakładkę",
   "status.cancel_reblog_private": "Cofnij podbicie",
   "status.cannot_reblog": "Ten wpis nie może zostać podbity",
   "status.copy": "Skopiuj odnośnik do wpisu",
@@ -373,6 +385,7 @@
   "status.reblogged_by": "{name} podbił(a)",
   "status.reblogs.empty": "Nikt nie podbił jeszcze tego wpisu. Gdy ktoś to zrobi, pojawi się tutaj.",
   "status.redraft": "Usuń i przeredaguj",
+  "status.remove_bookmark": "Usuń zakładkę",
   "status.reply": "Odpowiedz",
   "status.replyAll": "Odpowiedz na wątek",
   "status.report": "Zgłoś @{name}",
@@ -405,9 +418,11 @@
   "upload_button.label": "Dodaj zawartość multimedialną (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Przekroczono limit plików do wysłania.",
   "upload_error.poll": "Dołączanie plików nie dozwolone z głosowaniami.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Wprowadź opis dla niewidomych i niedowidzących",
   "upload_form.edit": "Edytuj",
   "upload_form.undo": "Usuń",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
   "upload_modal.analyzing_picture": "Analizowanie obrazu…",
   "upload_modal.apply": "Zastosuj",
   "upload_modal.description_placeholder": "Pchnąć w tę łódź jeża lub ośm skrzyń fig",
@@ -417,6 +432,7 @@
   "upload_modal.preview_label": "Podgląd ({ratio})",
   "upload_progress.label": "Wysyłanie…",
   "video.close": "Zamknij film",
+  "video.download": "Pobierz plik",
   "video.exit_fullscreen": "Opuść tryb pełnoekranowy",
   "video.expand": "Rozszerz film",
   "video.fullscreen": "Pełny ekran",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 7c6a1fd22..f78c327fb 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -1,29 +1,30 @@
 {
-  "account.add_or_remove_from_list": "Adicionar ou remover de listas",
+  "account.add_or_remove_from_list": "Adicionar ou remover das listas",
   "account.badges.bot": "Robô",
+  "account.badges.group": "Grupo",
   "account.block": "Bloquear @{name}",
-  "account.block_domain": "Esconder tudo de {domain}",
+  "account.block_domain": "Bloquear {domain}",
   "account.blocked": "Bloqueado",
   "account.cancel_follow_request": "Cancelar solicitação para seguir",
-  "account.direct": "Direct Message @{name}",
-  "account.domain_blocked": "Domínio escondido",
+  "account.direct": "Enviar toot direto para @{name}",
+  "account.domain_blocked": "Domínio bloqueado",
   "account.edit_profile": "Editar perfil",
   "account.endorse": "Destacar no perfil",
   "account.follow": "Seguir",
   "account.followers": "Seguidores",
-  "account.followers.empty": "Ninguém segue esse usuário no momento.",
-  "account.follows": "Segue",
-  "account.follows.empty": "Esse usuário não segue ninguém no momento.",
+  "account.followers.empty": "Nada aqui.",
+  "account.follows": "Seguindo",
+  "account.follows.empty": "Nada aqui.",
   "account.follows_you": "Segue você",
-  "account.hide_reblogs": "Esconder compartilhamentos de @{name}",
+  "account.hide_reblogs": "Ocultar boosts de @{name}",
   "account.last_status": "Última atividade",
-  "account.link_verified_on": "A posse desse link foi verificada em {date}",
-  "account.locked_info": "Essa conta está trancada. Se você a seguir sua solicitação será revisada manualmente.",
+  "account.link_verified_on": "O link foi verificado em {date}",
+  "account.locked_info": "Esta conta está trancada. Sua solicitação para seguir requer aprovação manual do usuário.",
   "account.media": "Mídia",
   "account.mention": "Mencionar @{name}",
   "account.moved_to": "{name} se mudou para:",
   "account.mute": "Silenciar @{name}",
-  "account.mute_notifications": "Silenciar notificações de @{name}",
+  "account.mute_notifications": "Ocultar notificações de @{name}",
   "account.muted": "Silenciado",
   "account.never_active": "Nunca",
   "account.posts": "Toots",
@@ -31,40 +32,42 @@
   "account.report": "Denunciar @{name}",
   "account.requested": "Aguardando aprovação. Clique para cancelar a solicitação",
   "account.share": "Compartilhar perfil de @{name}",
-  "account.show_reblogs": "Mostra compartilhamentos de @{name}",
+  "account.show_reblogs": "Mostrar boosts de @{name}",
   "account.unblock": "Desbloquear @{name}",
   "account.unblock_domain": "Desbloquear {domain}",
   "account.unendorse": "Não destacar no perfil",
   "account.unfollow": "Deixar de seguir",
-  "account.unmute": "Não silenciar @{name}",
-  "account.unmute_notifications": "Retirar silêncio das notificações vindas de @{name}",
+  "account.unmute": "Desfazer silêncio de @{name}",
+  "account.unmute_notifications": "Mostrar notificações de @{name}",
   "alert.rate_limited.message": "Por favor tente novamente após {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Limite de tentativas",
-  "alert.unexpected.message": "Um erro inesperado ocorreu.",
+  "alert.rate_limited.title": "Tentativas limitadas",
+  "alert.unexpected.message": "Ocorreu um erro inesperado.",
   "alert.unexpected.title": "Eita!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} por semana",
-  "boost_modal.combo": "Você pode pressionar {combo} para ignorar este diálogo na próxima vez",
-  "bundle_column_error.body": "Algo de errado aconteceu enquanto este componente era carregado.",
+  "boost_modal.combo": "Pressione {combo} para ignorar este diálogo na próxima vez",
+  "bundle_column_error.body": "Ocorreu um problema ao carregar este componente.",
   "bundle_column_error.retry": "Tente novamente",
   "bundle_column_error.title": "Erro de rede",
   "bundle_modal_error.close": "Fechar",
-  "bundle_modal_error.message": "Algo de errado aconteceu enquanto este componente era carregado.",
+  "bundle_modal_error.message": "Ocorreu um problema ao carregar este componente.",
   "bundle_modal_error.retry": "Tente novamente",
   "column.blocks": "Usuários bloqueados",
+  "column.bookmarks": "Salvos",
   "column.community": "Local",
-  "column.direct": "Mensagens diretas",
+  "column.direct": "Mensagens Diretas",
   "column.directory": "Explorar perfis",
-  "column.domain_blocks": "Domínios escondidos",
+  "column.domain_blocks": "Domínios bloqueados",
   "column.favourites": "Favoritos",
   "column.follow_requests": "Seguidores pendentes",
   "column.home": "Página inicial",
   "column.lists": "Listas",
   "column.mutes": "Usuários silenciados",
   "column.notifications": "Notificações",
-  "column.pins": "Postagens fixadas",
-  "column.public": "Global",
+  "column.pins": "Toots fixados",
+  "column.public": "Linha global",
   "column_back_button.label": "Voltar",
-  "column_header.hide_settings": "Esconder configurações",
+  "column_header.hide_settings": "Ocultar configurações",
   "column_header.moveLeft_settings": "Mover coluna para a esquerda",
   "column_header.moveRight_settings": "Mover coluna para a direita",
   "column_header.pin": "Fixar",
@@ -73,192 +76,197 @@
   "column_subheading.settings": "Configurações",
   "community.column_settings.media_only": "Apenas mídia",
   "compose_form.direct_message_warning": "Este toot só será enviado aos usuários mencionados.",
-  "compose_form.direct_message_warning_learn_more": "Saber mais",
-  "compose_form.hashtag_warning": "Esse toot não será listado em nenhuma hashtag por ser não listado. Somente toots públicos podem ser pesquisados por hashtag.",
-  "compose_form.lock_disclaimer": "A sua conta não está {locked}. Qualquer pessoa pode te seguir e visualizar postagens direcionadas a apenas seguidores.",
+  "compose_form.direct_message_warning_learn_more": "Saiba mais",
+  "compose_form.hashtag_warning": "O toot não será listado nas hashtags porque não é público. Somente toots públicos podem ser pesquisados por hashtag. Dica: Poste como Não-listado.",
+  "compose_form.lock_disclaimer": "Sua conta não está {locked}. Qualquer pessoa pode te seguir e ver seus toots privados.",
   "compose_form.lock_disclaimer.lock": "trancada",
   "compose_form.placeholder": "No que você está pensando?",
-  "compose_form.poll.add_option": "Adicionar uma opção",
+  "compose_form.poll.add_option": "Adicionar opção",
   "compose_form.poll.duration": "Duração da enquete",
   "compose_form.poll.option_placeholder": "Opção {number}",
-  "compose_form.poll.remove_option": "Remover essa opção",
-  "compose_form.publish": "Publicar",
+  "compose_form.poll.remove_option": "Remover opção",
+  "compose_form.poll.switch_to_multiple": "Alterar para múltiplos votos",
+  "compose_form.poll.switch_to_single": "Alterar para voto único",
+  "compose_form.publish": "TOOT",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Marcar mídia como sensível",
   "compose_form.sensitive.marked": "Mídia está marcada como sensível",
   "compose_form.sensitive.unmarked": "Mídia não está marcada como sensível",
-  "compose_form.spoiler.marked": "O texto está escondido por um aviso de conteúdo",
-  "compose_form.spoiler.unmarked": "O texto não está escondido",
-  "compose_form.spoiler_placeholder": "Aviso de conteúdo",
+  "compose_form.spoiler.marked": "O texto está oculto por um aviso de conteúdo",
+  "compose_form.spoiler.unmarked": "Sem Aviso de Conteúdo",
+  "compose_form.spoiler_placeholder": "Aviso de Conteúdo aqui",
   "confirmation_modal.cancel": "Cancelar",
   "confirmations.block.block_and_report": "Bloquear e denunciar",
   "confirmations.block.confirm": "Bloquear",
-  "confirmations.block.message": "Você tem certeza de que quer bloquear {name}?",
+  "confirmations.block.message": "Você tem certeza de que deseja bloquear {name}?",
   "confirmations.delete.confirm": "Excluir",
-  "confirmations.delete.message": "Você tem certeza de que quer excluir esta postagem?",
+  "confirmations.delete.message": "Excluir este toot?",
   "confirmations.delete_list.confirm": "Excluir",
-  "confirmations.delete_list.message": "Você tem certeza que quer deletar permanentemente a lista?",
-  "confirmations.domain_block.confirm": "Esconder o domínio inteiro",
-  "confirmations.domain_block.message": "Você quer mesmo bloquear {domain} inteiro? Na maioria dos casos, silenciar ou bloquear alguns usuários é o suficiente e o recomendado. Você não vai ver conteúdo desse domínio em nenhuma das timelines públicas ou nas suas notificações. Seus seguidores desse domínio serão removidos.",
+  "confirmations.delete_list.message": "Você tem certeza de que deseja excluir esta lista?",
+  "confirmations.domain_block.confirm": "Bloquear domínio",
+  "confirmations.domain_block.message": "Você tem certeza de que deseja bloquear tudo de {domain}? Você não verá mais o conteúdo desta instância em nenhuma linha do tempo pública ou nas suas notificações. Seus seguidores desta instância serão removidos.",
   "confirmations.logout.confirm": "Sair",
-  "confirmations.logout.message": "Tem certeza que deseja encerrar a sessão?",
+  "confirmations.logout.message": "Você tem certeza de que deseja sair?",
   "confirmations.mute.confirm": "Silenciar",
-  "confirmations.mute.explanation": "Isto irá esconder postagens e postagens que mencionam, mas ainda vai permitir que eles vejam suas publicações e sigam você.",
-  "confirmations.mute.message": "Você tem certeza de que quer silenciar {name}?",
-  "confirmations.redraft.confirm": "Apagar & usar como rascunho",
-  "confirmations.redraft.message": "Você tem certeza que deseja apagar esse status e usá-lo como rascunho? Seus compartilhamentos e favoritos serão perdidos e as respostas ao toot original ficarão desconectadas.",
+  "confirmations.mute.explanation": "Isso ocultará toots deles e toots mencionando-os, mas ainda permitirá que eles vejam seus toots e te sigam.",
+  "confirmations.mute.message": "Você tem certeza de que deseja silenciar {name}?",
+  "confirmations.redraft.confirm": "Excluir e rascunhar",
+  "confirmations.redraft.message": "Você tem certeza de que deseja apagar o toot e usá-lo como rascunho? Boosts e favoritos serão perdidos e as respostas ao toot original ficarão desconectadas.",
   "confirmations.reply.confirm": "Responder",
-  "confirmations.reply.message": "Responder agora vai sobrescrever a mensagem que você está compondo. Você tem certeza que quer continuar?",
+  "confirmations.reply.message": "Responder agora vai sobrescrever o toot que você está compondo. Deseja continuar?",
   "confirmations.unfollow.confirm": "Deixar de seguir",
-  "confirmations.unfollow.message": "Você tem certeza de que quer deixar de seguir {name}?",
+  "confirmations.unfollow.message": "Deixar de seguir {name}?",
   "conversation.delete": "Excluir conversa",
   "conversation.mark_as_read": "Marcar como lida",
   "conversation.open": "Ver conversa",
   "conversation.with": "Com {names}",
-  "directory.federated": "De fediverso conhecido",
-  "directory.local": "De {domain} apenas",
+  "directory.federated": "Do fediverso",
+  "directory.local": "Apenas do {domain}",
   "directory.new_arrivals": "Acabaram de chegar",
-  "directory.recently_active": "Reverta esta propriedade para seu valor padrão",
-  "embed.instructions": "Incorpore esta postagem em seu site copiando o código abaixo.",
-  "embed.preview": "Aqui está uma previsão de como ficará:",
+  "directory.recently_active": "Ativos recentemente",
+  "embed.instructions": "Incorpore este toot no seu site copiando o código abaixo.",
+  "embed.preview": "Veja como vai ficar:",
   "emoji_button.activity": "Atividades",
-  "emoji_button.custom": "Customizados",
+  "emoji_button.custom": "Personalizados",
   "emoji_button.flags": "Bandeiras",
-  "emoji_button.food": "Comidas & Bebidas",
-  "emoji_button.label": "Inserir Emoji",
+  "emoji_button.food": "Comidas e Bebidas",
+  "emoji_button.label": "Inserir emoji",
   "emoji_button.nature": "Natureza",
-  "emoji_button.not_found": "Não tem emojos! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "Sem emojis! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "Objetos",
   "emoji_button.people": "Pessoas",
   "emoji_button.recent": "Usados frequentemente",
-  "emoji_button.search": "Buscar...",
-  "emoji_button.search_results": "Resultados da busca",
+  "emoji_button.search": "Pesquisar...",
+  "emoji_button.search_results": "Resultados da pesquisa",
   "emoji_button.symbols": "Símbolos",
-  "emoji_button.travel": "Viagens & Lugares",
-  "empty_column.account_timeline": "Não há toots aqui!",
+  "emoji_button.travel": "Viagens e Lugares",
+  "empty_column.account_timeline": "Nada aqui!",
   "empty_column.account_unavailable": "Perfil indisponível",
-  "empty_column.blocks": "Você ainda não bloqueou nenhum usuário.",
-  "empty_column.community": "A timeline local está vazia. Escreva algo publicamente para começar!",
-  "empty_column.direct": "Você não tem nenhuma mensagem direta ainda. Quando você enviar ou receber uma, as mensagens aparecerão por aqui.",
-  "empty_column.domain_blocks": "Ainda não há nenhum domínio escondido.",
-  "empty_column.favourited_statuses": "Você ainda não tem nenhum toot favorito. Quando você favoritar um toot, ele aparecerá aqui.",
-  "empty_column.favourites": "Ninguém favoritou esse toot até agora. Quando alguém favoritar, a pessoa aparecerá aqui.",
-  "empty_column.follow_requests": "Você não tem nenhum pedido de seguir por agora. Quando você receber um, ele aparecerá aqui.",
-  "empty_column.hashtag": "Ainda não há qualquer conteúdo com essa hashtag.",
-  "empty_column.home": "Você ainda não segue usuário algum. Visite a timeline {public} ou use o buscador para procurar e conhecer outros usuários.",
-  "empty_column.home.public_timeline": "global",
-  "empty_column.list": "Ainda não há nada nesta lista. Quando membros dessa lista fizerem novas postagens, elas aparecerão aqui.",
-  "empty_column.lists": "Você ainda não tem nenhuma lista. Quando você criar uma, ela aparecerá aqui.",
-  "empty_column.mutes": "Você ainda não silenciou nenhum usuário.",
-  "empty_column.notifications": "Você ainda não possui notificações. Interaja com outros usuários para começar a conversar.",
-  "empty_column.public": "Não há nada aqui! Escreva algo publicamente ou siga manualmente usuários de outras instâncias",
-  "error.unexpected_crash.explanation": "Devido a um bug em nosso código ou a um problema de compatibilidade do navegador, esta página não pode ser exibida corretamente.",
-  "error.unexpected_crash.next_steps": "Tente atualizar a página. Se isso não ajudar, você ainda pode usar Mastodon através de um navegador diferente ou aplicativo nativo.",
-  "errors.unexpected_crash.copy_stacktrace": "Copiar stacktrace para a área de transferência",
+  "empty_column.blocks": "Nada aqui.",
+  "empty_column.bookmarked_statuses": "Sem toots salvos. Quando você salvar alguns, eles aparecerão aqui.",
+  "empty_column.community": "A linha do tempo local está vazia. Poste algo publicamente para começar!",
+  "empty_column.direct": "Nada aqui. Quando você enviar ou receber toots diretos, eles aparecerão aqui.",
+  "empty_column.domain_blocks": "Nada aqui.",
+  "empty_column.favourited_statuses": "Nada aqui. Quando você favoritar um toot, ele aparecerá aqui.",
+  "empty_column.favourites": "Nada aqui. Quando alguém favoritar, o autor aparecerá aqui.",
+  "empty_column.follow_requests": "Nada aqui. Quando você receber solicitações de seguidores, elas aparecerão aqui.",
+  "empty_column.hashtag": "Nada aqui.",
+  "empty_column.home": "Sua linha do tempo está vazia. Visite a linha {public} ou use a pesquisa para conhecer outros usuários!",
+  "empty_column.home.public_timeline": "a linha do tempo pública",
+  "empty_column.list": "Nada aqui. Quando os usuários nesta lista postarem toots, eles aparecerão aqui.",
+  "empty_column.lists": "Nada aqui. Quando você criar listas, elas aparecerão aqui.",
+  "empty_column.mutes": "Nada aqui.",
+  "empty_column.notifications": "Nada aqui. Interaja com outros usuários para começar a conversar.",
+  "empty_column.public": "Nada aqui! Poste algo publicamente ou siga usuários de outras instâncias",
+  "error.unexpected_crash.explanation": "Devido a um problema em nosso código ou de compatibilidade com o navegador, esta página não pôde ser exibida corretamente.",
+  "error.unexpected_crash.next_steps": "Tente atualizar a página. Se não resolver, você ainda pode usar o Mastodon em outro navegador ou aplicativo.",
+  "errors.unexpected_crash.copy_stacktrace": "Copiar estado da pilha para a área de transferência",
   "errors.unexpected_crash.report_issue": "Reportar problema",
-  "follow_request.authorize": "Autorizar",
-  "follow_request.reject": "Rejeitar",
+  "follow_request.authorize": "Aprovar",
+  "follow_request.reject": "Vetar",
   "getting_started.developers": "Desenvolvedores",
   "getting_started.directory": "Diretório de perfis",
   "getting_started.documentation": "Documentação",
   "getting_started.heading": "Primeiros passos",
-  "getting_started.invite": "Convide pessoas",
-  "getting_started.open_source_notice": "Mastodon é um software de código aberto. Você pode contribuir ou reportar problemas na página do GitHub do projeto: {github}.",
-  "getting_started.security": "Segurança",
+  "getting_started.invite": "Convidar pessoas",
+  "getting_started.open_source_notice": "Mastodon é um software de código aberto. Você pode contribuir ou reportar problemas na página do projeto no GitHub em {github}.",
+  "getting_started.security": "Configurações da conta",
   "getting_started.terms": "Termos de serviço",
   "hashtag.column_header.tag_mode.all": "e {additional}",
   "hashtag.column_header.tag_mode.any": "ou {additional}",
   "hashtag.column_header.tag_mode.none": "sem {additional}",
   "hashtag.column_settings.select.no_options_message": "Nenhuma sugestão encontrada",
-  "hashtag.column_settings.select.placeholder": "Adicione as hashtags…",
+  "hashtag.column_settings.select.placeholder": "Adicione hashtags…",
   "hashtag.column_settings.tag_mode.all": "Todas essas",
   "hashtag.column_settings.tag_mode.any": "Qualquer uma dessas",
   "hashtag.column_settings.tag_mode.none": "Nenhuma dessas",
-  "hashtag.column_settings.tag_toggle": "Incluir outras hashtags nessa coluna",
+  "hashtag.column_settings.tag_toggle": "Adicionar mais hashtags",
   "home.column_settings.basic": "Básico",
-  "home.column_settings.show_reblogs": "Mostrar compartilhamentos",
-  "home.column_settings.show_replies": "Mostrar as respostas",
+  "home.column_settings.show_reblogs": "Mostrar boosts",
+  "home.column_settings.show_replies": "Mostrar respostas",
   "intervals.full.days": "{number, plural, one {# dia} other {# dias}}",
   "intervals.full.hours": "{number, plural, one {# hora} other {# horas}}",
   "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}",
   "introduction.federation.action": "Próximo",
   "introduction.federation.federated.headline": "Global",
-  "introduction.federation.federated.text": "Posts públicos de outros servidores do fediverso vão aparecer na timeline global.",
-  "introduction.federation.home.headline": "Início",
-  "introduction.federation.home.text": "Posts de pessoas que você segue vão aparecer na sua página inicial. Você pode seguir pessoas de qualquer servidor!",
+  "introduction.federation.federated.text": "Toots públicos de outras instâncias do fediverso aparecerão na linha global.",
+  "introduction.federation.home.headline": "Página inicial",
+  "introduction.federation.home.text": "Os toots das pessoas que você segue aparecerão na página inicial. Você pode seguir pessoas de qualquer instância!",
   "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Posts públicos de pessoas no mesmo servidor que você vão aparecer na timeline local.",
-  "introduction.interactions.action": "Finalizar o tutorial!",
+  "introduction.federation.local.text": "Toots públicos de pessoas na mesma instância que você aparecerão na linha local.",
+  "introduction.interactions.action": "Terminar o tutorial!",
   "introduction.interactions.favourite.headline": "Favoritos",
-  "introduction.interactions.favourite.text": "Você pode salvar um toot pra mais tarde, e deixar a pessoa que postou saber que você gostou, favoritando-o.",
-  "introduction.interactions.reblog.headline": "Compartilhamento",
-  "introduction.interactions.reblog.text": "Você pode mostrar toots de outras pessoas aos seus seguidores compartilhando.",
+  "introduction.interactions.favourite.text": "Ao favoritar, você salva o toot para mais tarde ou sinaliza ao autor que você gostou do toot.",
+  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.text": "Ao dar boost, você compartilha toots de outras pessoas para seus seguidores.",
   "introduction.interactions.reply.headline": "Responder",
-  "introduction.interactions.reply.text": "Você pode responder a toots de outras pessoas e aos seus, e isso vai uni-los em uma conversa.",
-  "introduction.welcome.action": "Vamos!",
+  "introduction.interactions.reply.text": "Você pode responder aos toots de outras pessoas e formar uma conversa ou responder aos seus e formar uma sequência.",
+  "introduction.welcome.action": "É HORA DO SHOW!",
   "introduction.welcome.headline": "Primeiros passos",
-  "introduction.welcome.text": "Boas vindas ao fediverso! Em alguns momentos, você vai poder transmitir mensagens e falar com pessoas amigas através de uma variedade de servidores. Mas esse servidor, {domain}, é especial—é onde o seu perfil está hospedado, então lembre do nome.",
-  "keyboard_shortcuts.back": "para navegar de volta",
-  "keyboard_shortcuts.blocked": "para abrir a lista de usuários bloqueados",
-  "keyboard_shortcuts.boost": "para compartilhar",
-  "keyboard_shortcuts.column": "Focar um status em uma das colunas",
-  "keyboard_shortcuts.compose": "para focar a área de redação",
+  "introduction.welcome.text": "Boas vindas ao fediverso! Logo você vai poder publicar mensagens e falar com pessoas amigas através de uma variedade de instâncias. Mas esta instância, {domain}, é especial — é onde o seu perfil está guardado, então lembre do nome dela com carinho.",
+  "keyboard_shortcuts.back": "voltar",
+  "keyboard_shortcuts.blocked": "abrir lista de usuários bloqueados",
+  "keyboard_shortcuts.boost": "dar boost",
+  "keyboard_shortcuts.column": "focar no toot de uma das colunas",
+  "keyboard_shortcuts.compose": "focar na composição",
   "keyboard_shortcuts.description": "Descrição",
-  "keyboard_shortcuts.direct": "para abrir a coluna de mensagens diretas",
-  "keyboard_shortcuts.down": "para mover para baixo na lista",
-  "keyboard_shortcuts.enter": "para expandir um status",
-  "keyboard_shortcuts.favourite": "para adicionar aos favoritos",
-  "keyboard_shortcuts.favourites": "para abrir a lista de favoritos",
-  "keyboard_shortcuts.federated": "para abrir a timeline global",
+  "keyboard_shortcuts.direct": "abrir Mensagens Diretas",
+  "keyboard_shortcuts.down": "mover para baixo na linha",
+  "keyboard_shortcuts.enter": "expandir um toot",
+  "keyboard_shortcuts.favourite": "favoritar",
+  "keyboard_shortcuts.favourites": "abrir os favoritos",
+  "keyboard_shortcuts.federated": "abrir linha global",
   "keyboard_shortcuts.heading": "Atalhos de teclado",
-  "keyboard_shortcuts.home": "para abrir a página inicial",
+  "keyboard_shortcuts.home": "abrir página inicial",
   "keyboard_shortcuts.hotkey": "Atalho",
-  "keyboard_shortcuts.legend": "para mostrar essa legenda",
-  "keyboard_shortcuts.local": "para abrir a timeline local",
-  "keyboard_shortcuts.mention": "para mencionar o autor",
-  "keyboard_shortcuts.muted": "para abrir a lista de usuários silenciados",
-  "keyboard_shortcuts.my_profile": "para abrir o seu perfil",
-  "keyboard_shortcuts.notifications": "para abrir a coluna de notificações",
-  "keyboard_shortcuts.pinned": "para abrir a lista de toots fixados",
-  "keyboard_shortcuts.profile": "para abrir o perfil do autor",
-  "keyboard_shortcuts.reply": "para responder",
-  "keyboard_shortcuts.requests": "para abrir a lista de seguidores pendentes",
-  "keyboard_shortcuts.search": "para focar a pesquisa",
-  "keyboard_shortcuts.start": "para abrir a coluna \"primeiros passos\"",
-  "keyboard_shortcuts.toggle_hidden": "mostrar/esconder o texto com aviso de conteúdo",
-  "keyboard_shortcuts.toggle_sensitivity": "mostrar/esconder mídia",
-  "keyboard_shortcuts.toot": "para compor um novo toot",
-  "keyboard_shortcuts.unfocus": "para remover o foco da área de composição/pesquisa",
-  "keyboard_shortcuts.up": "para mover para cima na lista",
+  "keyboard_shortcuts.legend": "mostrar estes atalhos",
+  "keyboard_shortcuts.local": "abrir linha local",
+  "keyboard_shortcuts.mention": "mencionar autor",
+  "keyboard_shortcuts.muted": "abrir lista de usuários silenciados",
+  "keyboard_shortcuts.my_profile": "abrir seu perfil",
+  "keyboard_shortcuts.notifications": "abrir notificações",
+  "keyboard_shortcuts.open_media": "abrir mídia",
+  "keyboard_shortcuts.pinned": "abrir toots fixados",
+  "keyboard_shortcuts.profile": "abrir o perfil do autor",
+  "keyboard_shortcuts.reply": "responder",
+  "keyboard_shortcuts.requests": "abrir lista de seguidores pendentes",
+  "keyboard_shortcuts.search": "focar na pesquisa",
+  "keyboard_shortcuts.start": "abrir o \"Primeiros passos\"",
+  "keyboard_shortcuts.toggle_hidden": "mostrar/ocultar o toot com Aviso de Conteúdo",
+  "keyboard_shortcuts.toggle_sensitivity": "mostrar/ocultar mídia",
+  "keyboard_shortcuts.toot": "compor novo toot",
+  "keyboard_shortcuts.unfocus": "sair da composição ou da pesquisa",
+  "keyboard_shortcuts.up": "mover para cima na linha",
   "lightbox.close": "Fechar",
   "lightbox.next": "Próximo",
   "lightbox.previous": "Anterior",
   "lightbox.view_context": "Ver contexto",
-  "lists.account.add": "Adicionar a listas",
+  "lists.account.add": "Adicionar à lista",
   "lists.account.remove": "Remover da lista",
   "lists.delete": "Excluir lista",
   "lists.edit": "Editar lista",
-  "lists.edit.submit": "Mudar o título",
-  "lists.new.create": "Adicionar lista",
-  "lists.new.title_placeholder": "Novo título da lista",
+  "lists.edit.submit": "Renomear",
+  "lists.new.create": "Criar lista",
+  "lists.new.title_placeholder": "Nome da lista",
   "lists.search": "Procurar entre as pessoas que você segue",
   "lists.subheading": "Suas listas",
   "load_pending": "{count, plural, one {# novo item} other {# novos items}}",
   "loading_indicator.label": "Carregando...",
-  "media_gallery.toggle_visible": "Esconder/Mostrar",
+  "media_gallery.toggle_visible": "Mostrar/Ocultar",
   "missing_indicator.label": "Não encontrado",
   "missing_indicator.sublabel": "Esse recurso não pôde ser encontrado",
-  "mute_modal.hide_notifications": "Esconder notificações deste usuário?",
-  "navigation_bar.apps": "Apps",
+  "mute_modal.hide_notifications": "Ocultar notificações deste usuário?",
+  "navigation_bar.apps": "Aplicativos",
   "navigation_bar.blocks": "Usuários bloqueados",
+  "navigation_bar.bookmarks": "Salvos",
   "navigation_bar.community_timeline": "Local",
-  "navigation_bar.compose": "Compor um novo toot",
-  "navigation_bar.direct": "Mensagens diretas",
+  "navigation_bar.compose": "Compor novo toot",
+  "navigation_bar.direct": "Mensagens Diretas",
   "navigation_bar.discover": "Descobrir",
-  "navigation_bar.domain_blocks": "Domínios escondidos",
+  "navigation_bar.domain_blocks": "Domínios bloqueados",
   "navigation_bar.edit_profile": "Editar perfil",
   "navigation_bar.favourites": "Favoritos",
-  "navigation_bar.filters": "Palavras silenciadas",
+  "navigation_bar.filters": "Palavras filtradas",
   "navigation_bar.follow_requests": "Seguidores pendentes",
   "navigation_bar.follows_and_followers": "Seguindo e seguidores",
   "navigation_bar.info": "Mais informações",
@@ -267,53 +275,56 @@
   "navigation_bar.logout": "Sair",
   "navigation_bar.mutes": "Usuários silenciados",
   "navigation_bar.personal": "Pessoal",
-  "navigation_bar.pins": "Postagens fixadas",
+  "navigation_bar.pins": "Toots fixados",
   "navigation_bar.preferences": "Preferências",
   "navigation_bar.public_timeline": "Global",
   "navigation_bar.security": "Segurança",
-  "notification.favourite": "{name} adicionou a sua postagem aos favoritos",
+  "notification.favourite": "{name} favoritou seu toot",
   "notification.follow": "{name} te seguiu",
+  "notification.follow_request": "{name} quer te seguir",
   "notification.mention": "{name} te mencionou",
-  "notification.poll": "Uma enquete em que você votou chegou ao fim",
-  "notification.reblog": "{name} compartilhou a sua postagem",
+  "notification.own_poll": "Sua enquete terminou",
+  "notification.poll": "Uma enquete que você votou terminou",
+  "notification.reblog": "{name} deu boost no seu toot",
   "notifications.clear": "Limpar notificações",
-  "notifications.clear_confirmation": "Você tem certeza de que quer limpar todas as suas notificações permanentemente?",
+  "notifications.clear_confirmation": "Você tem certeza de que quer limpar todas as suas notificações?",
   "notifications.column_settings.alert": "Notificações no computador",
   "notifications.column_settings.favourite": "Favoritos:",
   "notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorias",
   "notifications.column_settings.filter_bar.category": "Barra de filtro rápido",
   "notifications.column_settings.filter_bar.show": "Mostrar",
-  "notifications.column_settings.follow": "Novos seguidores:",
+  "notifications.column_settings.follow": "Seguidores:",
+  "notifications.column_settings.follow_request": "Novos seguidores pendentes:",
   "notifications.column_settings.mention": "Menções:",
-  "notifications.column_settings.poll": "Resultados da enquete:",
+  "notifications.column_settings.poll": "Enquetes:",
   "notifications.column_settings.push": "Enviar notificações",
-  "notifications.column_settings.reblog": "Compartilhamento:",
+  "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Mostrar nas colunas",
   "notifications.column_settings.sound": "Reproduzir som",
   "notifications.filter.all": "Tudo",
-  "notifications.filter.boosts": "Compartilhamentos",
+  "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favoritos",
   "notifications.filter.follows": "Seguidores",
   "notifications.filter.mentions": "Menções",
-  "notifications.filter.polls": "Resultados da enquete",
+  "notifications.filter.polls": "Enquetes",
   "notifications.group": "{count} notificações",
-  "poll.closed": "Fechada",
+  "poll.closed": "Terminou",
   "poll.refresh": "Atualizar",
   "poll.total_people": "{count, plural, one {# pessoa} other {# pessoas}}",
   "poll.total_votes": "{count, plural, one {# voto} other {# votos}}",
   "poll.vote": "Votar",
-  "poll.voted": "Você votou nesta resposta",
-  "poll_button.add_poll": "Adicionar uma enquete",
+  "poll.voted": "Você votou nesta opção",
+  "poll_button.add_poll": "Adicionar enquete",
   "poll_button.remove_poll": "Remover enquete",
-  "privacy.change": "Ajustar a privacidade da mensagem",
-  "privacy.direct.long": "Apenas para usuários mencionados",
-  "privacy.direct.short": "Direta",
-  "privacy.private.long": "Apenas para seus seguidores",
-  "privacy.private.short": "Privada",
-  "privacy.public.long": "Publicar em todos os feeds",
-  "privacy.public.short": "Pública",
-  "privacy.unlisted.long": "Não publicar em feeds públicos",
-  "privacy.unlisted.short": "Não listada",
+  "privacy.change": "Ajustar privacidade do toot",
+  "privacy.direct.long": "Postar apenas para usuários mencionados",
+  "privacy.direct.short": "Direto",
+  "privacy.private.long": "Postar apenas para seguidores",
+  "privacy.private.short": "Privado",
+  "privacy.public.long": "Postar em linhas públicas",
+  "privacy.public.short": "Público",
+  "privacy.unlisted.long": "Não postar em linhas públicas",
+  "privacy.unlisted.short": "Não-listado",
   "refresh": "Atualizar",
   "regeneration_indicator.label": "Carregando…",
   "regeneration_indicator.sublabel": "Sua página inicial está sendo preparada!",
@@ -323,38 +334,39 @@
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
   "reply_indicator.cancel": "Cancelar",
-  "report.forward": "Encaminhar para {target}",
-  "report.forward_hint": "Essa conta pertence à um outro servidor. Encaminhar uma cópia da denúncia com seus dados tornados anônimos para esse servidor?",
-  "report.hint": "A sua denúncia será enviada aos moderadores da instância. Você pode adicionar uma explicação de porque você está denunciando essa conta abaixo:",
+  "report.forward": "Enviar cópia para {target}",
+  "report.forward_hint": "A conta está em outra instância. Enviar uma cópia anônima da denúncia para lá?",
+  "report.hint": "A denúncia será enviada aos moderadores da instância. Você pode explicar por que você denunciou a conta:",
   "report.placeholder": "Comentários adicionais",
   "report.submit": "Enviar",
-  "report.target": "Denunciar",
+  "report.target": "Denunciando {target}",
   "search.placeholder": "Pesquisar",
-  "search_popout.search_format": "Formato de busca avançado",
-  "search_popout.tips.full_text": "Texto simples retorna status que você escreveu, favoritou, compartilhou ou em que tenha sido mencionado; também retorna nomes de exibição, usuários e hashtags correspondentes.",
+  "search_popout.search_format": "Pesquisa avançada",
+  "search_popout.tips.full_text": "Texto simples retorna seus toots, favoritos, boosts ou toots em que foi mencionado, como também nomes de exibição, usuários e hashtags correspondentes.",
   "search_popout.tips.hashtag": "hashtag",
-  "search_popout.tips.status": "status",
+  "search_popout.tips.status": "toot",
   "search_popout.tips.text": "Texto simples retorna nomes de exibição, usuários e hashtags correspondentes",
   "search_popout.tips.user": "usuário",
   "search_results.accounts": "Pessoas",
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
-  "search_results.statuses_fts_disabled": "Pesquisar toots por seu conteúdo não está habilitado neste servidor Mastodon.",
+  "search_results.statuses_fts_disabled": "Pesquisar toots por seu conteúdo não está ativado nesta instância Mastodon.",
   "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
   "status.admin_account": "Abrir interface de moderação para @{name}",
-  "status.admin_status": "Abrir esse status na interface de moderação",
+  "status.admin_status": "Abrir o toot na interface de moderação",
   "status.block": "Bloquear @{name}",
-  "status.cancel_reblog_private": "Desfazer compartilhamento",
-  "status.cannot_reblog": "Esta postagem não pode ser compartilhada",
-  "status.copy": "Copiar o link para o status",
+  "status.bookmark": "Salvar",
+  "status.cancel_reblog_private": "Desfazer boost",
+  "status.cannot_reblog": "Não foi possível dar boost",
+  "status.copy": "Copiar o link do toot",
   "status.delete": "Excluir",
   "status.detailed_status": "Visão detalhada da conversa",
-  "status.direct": "Enviar mensagem direta a @{name}",
+  "status.direct": "Toot direto para @{name}",
   "status.embed": "Incorporar",
-  "status.favourite": "Adicionar aos favoritos",
+  "status.favourite": "Favoritar",
   "status.filtered": "Filtrado",
-  "status.load_more": "Carregar mais",
-  "status.media_hidden": "Mídia escondida",
+  "status.load_more": "Ver mais",
+  "status.media_hidden": "Mídia oculta",
   "status.mention": "Mencionar @{name}",
   "status.more": "Mais",
   "status.mute": "Silenciar @{name}",
@@ -363,61 +375,65 @@
   "status.pin": "Fixar no perfil",
   "status.pinned": "Toot fixado",
   "status.read_more": "Ler mais",
-  "status.reblog": "Compartilhar",
-  "status.reblog_private": "Compartilhar com a audiência original",
-  "status.reblogged_by": "{name} compartilhou",
-  "status.reblogs.empty": "Ninguém compartilhou esse toot até agora. Quando alguém o fizer, eles aparecerão aqui.",
-  "status.redraft": "Apagar & usar como rascunho",
+  "status.reblog": "Dar boost",
+  "status.reblog_private": "Dar boost para audiência original",
+  "status.reblogged_by": "{name} deu boost",
+  "status.reblogs.empty": "Nada aqui. Quando alguém der boost, o autor aparecerá aqui.",
+  "status.redraft": "Excluir e rascunhar",
+  "status.remove_bookmark": "Remover dos Salvos",
   "status.reply": "Responder",
-  "status.replyAll": "Responder à sequência",
+  "status.replyAll": "Responder à conversa",
   "status.report": "Denunciar @{name}",
   "status.sensitive_warning": "Conteúdo sensível",
   "status.share": "Compartilhar",
   "status.show_less": "Mostrar menos",
-  "status.show_less_all": "Mostrar menos para todas as mensagens",
+  "status.show_less_all": "Mostrar menos para todos os toots",
   "status.show_more": "Mostrar mais",
-  "status.show_more_all": "Mostrar mais para todas as mensagens",
-  "status.show_thread": "Mostrar sequência",
+  "status.show_more_all": "Mostrar mais para todos os toots",
+  "status.show_thread": "Mostrar conversa",
   "status.uncached_media_warning": "Não disponível",
   "status.unmute_conversation": "Desativar silêncio desta conversa",
   "status.unpin": "Desafixar do perfil",
-  "suggestions.dismiss": "Ignorar a sugestão",
+  "suggestions.dismiss": "Ignorar sugestão",
   "suggestions.header": "Você pode se interessar por…",
   "tabs_bar.federated_timeline": "Global",
   "tabs_bar.home": "Página inicial",
   "tabs_bar.local_timeline": "Local",
   "tabs_bar.notifications": "Notificações",
-  "tabs_bar.search": "Buscar",
+  "tabs_bar.search": "Pesquisar",
   "time_remaining.days": "{number, plural, one {# dia restante} other {# dias restantes}}",
   "time_remaining.hours": "{number, plural, one {# hora restante} other {# horas restantes}}",
   "time_remaining.minutes": "{number, plural, one {# minuto restante} other {# minutos restantes}}",
-  "time_remaining.moments": "Momentos restantes",
+  "time_remaining.moments": "Tempo restante",
   "time_remaining.seconds": "{number, plural, one {# segundo restante} other {# segundos restantes}}",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {pessoa} other {pessoas}} falando sobre",
   "trends.trending_now": "Em alta no momento",
   "ui.beforeunload": "Seu rascunho será perdido se você sair do Mastodon.",
   "upload_area.title": "Arraste e solte para enviar",
-  "upload_button.label": "Adicionar mídia (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_button.label": "Adicionar mídia ({formats})",
   "upload_error.limit": "Limite de envio de arquivos excedido.",
-  "upload_error.poll": "Envio de arquivos não é permitido com enquetes.",
-  "upload_form.description": "Descreva a imagem para deficientes visuais",
+  "upload_error.poll": "Não é possível enviar arquivos com enquetes.",
+  "upload_form.audio_description": "Descrever para deficientes auditivos",
+  "upload_form.description": "Descrever para deficientes visuais",
   "upload_form.edit": "Editar",
   "upload_form.undo": "Remover",
+  "upload_form.video_description": "Descrever para deficientes auditivos e visuais",
   "upload_modal.analyzing_picture": "Analisando imagem…",
   "upload_modal.apply": "Aplicar",
-  "upload_modal.description_placeholder": "Grave e cabisbaixo, o filho justo zelava pela querida mãe doente",
+  "upload_modal.description_placeholder": "Um pequeno jabuti xereta viu dez cegonhas felizes",
   "upload_modal.detect_text": "Detectar texto da imagem",
   "upload_modal.edit_media": "Editar mídia",
-  "upload_modal.hint": "Clique ou arraste o círculo na visualização para escolher o ponto focal que sempre será visto em todas as miniaturas.",
+  "upload_modal.hint": "Clique ou arraste o círculo na prévia para escolher o ponto focal que ficará visível em todas as miniaturas.",
   "upload_modal.preview_label": "Prévia ({ratio})",
-  "upload_progress.label": "Salvando...",
+  "upload_progress.label": "Enviando...",
   "video.close": "Fechar vídeo",
+  "video.download": "Baixar arquivo",
   "video.exit_fullscreen": "Sair da tela cheia",
   "video.expand": "Expandir vídeo",
   "video.fullscreen": "Tela cheia",
-  "video.hide": "Esconder vídeo",
+  "video.hide": "Ocultar vídeo",
   "video.mute": "Silenciar",
-  "video.pause": "Parar",
+  "video.pause": "Pausar",
   "video.play": "Reproduzir",
-  "video.unmute": "Retirar silêncio"
+  "video.unmute": "Desativar silêncio"
 }
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index bb8a94516..b2fb2a012 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Adicionar ou remover das listas",
   "account.badges.bot": "Robô",
+  "account.badges.group": "Grupo",
   "account.block": "Bloquear @{name}",
   "account.block_domain": "Esconder tudo do domínio {domain}",
   "account.blocked": "Bloqueado",
@@ -39,9 +40,10 @@
   "account.unmute": "Não silenciar @{name}",
   "account.unmute_notifications": "Deixar de silenciar @{name}",
   "alert.rate_limited.message": "Volte a tentar depois das {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.title": "Limite de tentativas",
   "alert.unexpected.message": "Ocorreu um erro inesperado.",
   "alert.unexpected.title": "Bolas!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} por semana",
   "boost_modal.combo": "Pode clicar {combo} para não voltar a ver",
   "bundle_column_error.body": "Algo de errado aconteceu enquanto este componente era carregado.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Algo de errado aconteceu enquanto este componente era carregado.",
   "bundle_modal_error.retry": "Tente de novo",
   "column.blocks": "Utilizadores Bloqueados",
+  "column.bookmarks": "Favoritos",
   "column.community": "Cronologia local",
   "column.direct": "Mensagens directas",
   "column.directory": "Procurar perfis",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Duração da votação",
   "compose_form.poll.option_placeholder": "Opção {number}",
   "compose_form.poll.remove_option": "Eliminar esta opção",
+  "compose_form.poll.switch_to_multiple": "Alterar a votação para permitir múltiplas escolhas",
+  "compose_form.poll.switch_to_single": "Alterar a votação para permitir uma única escolha",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Marcar multimédia como sensível",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Sem toots por aqui!",
   "empty_column.account_unavailable": "Perfil indisponível",
   "empty_column.blocks": "Ainda não bloqueaste qualquer utilizador.",
+  "empty_column.bookmarked_statuses": "Ainda não assinalou toots como favoritos. Quando o fizer, eles aparecerão aqui.",
   "empty_column.community": "A timeline local está vazia. Escreve algo publicamente para começar!",
   "empty_column.direct": "Ainda não tens qualquer mensagem directa. Quando enviares ou receberes alguma, ela irá aparecer aqui.",
   "empty_column.domain_blocks": "Ainda não há qualquer domínio escondido.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "para abrir a lista dos utilizadores silenciados",
   "keyboard_shortcuts.my_profile": "para abrir o teu perfil",
   "keyboard_shortcuts.notifications": "para abrir a coluna das notificações",
+  "keyboard_shortcuts.open_media": "para abrir média",
   "keyboard_shortcuts.pinned": "para abrir a lista dos toots fixados",
   "keyboard_shortcuts.profile": "para abrir o perfil do autor",
   "keyboard_shortcuts.reply": "para responder",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Esconder notificações deste utilizador?",
   "navigation_bar.apps": "Aplicações móveis",
   "navigation_bar.blocks": "Utilizadores bloqueados",
+  "navigation_bar.bookmarks": "Favoritos",
   "navigation_bar.community_timeline": "Cronologia local",
   "navigation_bar.compose": "Escrever novo toot",
   "navigation_bar.direct": "Mensagens directas",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Segurança",
   "notification.favourite": "{name} adicionou o teu estado aos favoritos",
   "notification.follow": "{name} começou a seguir-te",
+  "notification.follow_request": "{name} pediu para segui-lo",
   "notification.mention": "{name} mencionou-te",
+  "notification.own_poll": "A sua votação terminou",
   "notification.poll": "Uma votação em participaste chegou ao fim",
   "notification.reblog": "{name} fez boost ao teu o teu estado",
   "notifications.clear": "Limpar notificações",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Barra de filtros rápidos",
   "notifications.column_settings.filter_bar.show": "Mostrar",
   "notifications.column_settings.follow": "Novos seguidores:",
+  "notifications.column_settings.follow_request": "Novos pedidos de seguidor:",
   "notifications.column_settings.mention": "Menções:",
   "notifications.column_settings.poll": "Resultados da votação:",
   "notifications.column_settings.push": "Notificações Push",
@@ -344,6 +355,7 @@
   "status.admin_account": "Abrir a interface de moderação para @{name}",
   "status.admin_status": "Abrir esta publicação na interface de moderação",
   "status.block": "Bloquear @{name}",
+  "status.bookmark": "Favorito",
   "status.cancel_reblog_private": "Remover boost",
   "status.cannot_reblog": "Não é possível fazer boost a esta publicação",
   "status.copy": "Copiar o link para a publicação",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} fez boost",
   "status.reblogs.empty": "Ainda ninguém fez boost a este toot. Quando alguém o fizer, ele irá aparecer aqui.",
   "status.redraft": "Apagar & reescrever",
+  "status.remove_bookmark": "Remover favorito",
   "status.reply": "Responder",
   "status.replyAll": "Responder à conversa",
   "status.report": "Denunciar @{name}",
@@ -394,15 +407,17 @@
   "time_remaining.moments": "Momentos restantes",
   "time_remaining.seconds": "{número, plural, um {# second} outro {# seconds}} faltam",
   "trends.count_by_accounts": "{count} {rawCount, plural, uma {person} outra {people}} a falar",
-  "trends.trending_now": "Tendencias actuais",
+  "trends.trending_now": "Tendências atuais",
   "ui.beforeunload": "O teu rascunho será perdido se abandonares o Mastodon.",
   "upload_area.title": "Arraste e solte para enviar",
   "upload_button.label": "Adicionar media",
   "upload_error.limit": "Limite máximo do ficheiro a carregar excedido.",
   "upload_error.poll": "Carregamento de ficheiros não é permitido em votações.",
+  "upload_form.audio_description": "Descreva para pessoas com diminuição da acuidade auditiva",
   "upload_form.description": "Descrição da imagem para pessoas com dificuldades visuais",
   "upload_form.edit": "Editar",
   "upload_form.undo": "Apagar",
+  "upload_form.video_description": "Descreva para pessoas com diminuição da acuidade auditiva ou visual",
   "upload_modal.analyzing_picture": "A analizar imagem…",
   "upload_modal.apply": "Aplicar",
   "upload_modal.description_placeholder": "Grave e cabisbaixo, o filho justo zelava pela querida mãe doente",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Pré-visualizar ({ratio})",
   "upload_progress.label": "A enviar...",
   "video.close": "Fechar vídeo",
+  "video.download": "Descarregar ficheiro",
   "video.exit_fullscreen": "Sair de full screen",
   "video.expand": "Expandir vídeo",
   "video.fullscreen": "Ecrã completo",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index 617dbcc0d..4d01ad3a5 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Adaugă sau Elimină din liste",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Group",
   "account.block": "Blochează @{name}",
   "account.block_domain": "Ascunde tot de la {domain}",
   "account.blocked": "Blocat",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "A apărut o eroare neașteptată.",
   "alert.unexpected.title": "Hopa!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "Poți apăsa {combo} pentru a omite asta data viitoare",
   "bundle_column_error.body": "Ceva nu a funcționat la încărcarea acestui component.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Ceva nu a funcționat în timupul încărcării acestui component.",
   "bundle_modal_error.retry": "Încearcă din nou",
   "column.blocks": "Utilizatori blocați",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Fluxul Local",
   "column.direct": "Mesaje directe",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "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": "Postează",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Nici o postare aici!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "Nu ai blocat nici un utilizator incă.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "Fluxul local este gol. Scrie ceva public pentru a împinge bila la vale!",
   "empty_column.direct": "Nu ai nici un mesaj direct incă. Când trimiți sau primești unul, va fi afișat aici.",
   "empty_column.domain_blocks": "Nu sunt domenii ascunse incă.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "să deschidă lista utilizatorilor opriți",
   "keyboard_shortcuts.my_profile": "să deschidă profilul tău",
   "keyboard_shortcuts.notifications": "să deschidă coloana cu notificări",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "să deschidă lista postărilor fixate",
   "keyboard_shortcuts.profile": "să deschidă porfilul autorului",
   "keyboard_shortcuts.reply": "să răspundă",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Ascunzi notificările de la acest utilizator?",
   "navigation_bar.apps": "Aplicații mobile",
   "navigation_bar.blocks": "Utilizatori blocați",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Flux local",
   "navigation_bar.compose": "Compune o nouă postare",
   "navigation_bar.direct": "Mesaje directe",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Securitate",
   "notification.favourite": "{name} a adăugat statusul tău la favorite",
   "notification.follow": "{name} te urmărește",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} te-a menționat",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} a redistribuit postarea ta",
   "notifications.clear": "Șterge notificările",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Bară de filtrare rapidă",
   "notifications.column_settings.filter_bar.show": "Arată",
   "notifications.column_settings.follow": "Noi urmăritori:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mențiuni:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Notificări push",
@@ -344,6 +355,7 @@
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Blochează @{name}",
+  "status.bookmark": "Bookmark",
   "status.cancel_reblog_private": "Nedistribuit",
   "status.cannot_reblog": "Această postare nu poate fi redistribuită",
   "status.copy": "Copy link to status",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} a redistribuit",
   "status.reblogs.empty": "Nimeni nu a redistribuit această postare până acum. Când cineva o va face, va apărea aici.",
   "status.redraft": "Șterge și adaugă la ciorne",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Răspunde",
   "status.replyAll": "Răspunde la topic",
   "status.report": "Raportează @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Adaugă media (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Adaugă o descriere pentru persoanele cu deficiențe de vedere",
   "upload_form.edit": "Edit",
   "upload_form.undo": "Șterge",
+  "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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Se Încarcă...",
   "video.close": "Închide video",
+  "video.download": "Download file",
   "video.exit_fullscreen": "Închide",
   "video.expand": "Extinde video",
   "video.fullscreen": "Ecran întreg",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index c8767e535..6e63a418c 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -1,8 +1,9 @@
 {
-  "account.add_or_remove_from_list": "Добавить или удалить из списков",
+  "account.add_or_remove_from_list": "Управление списками",
   "account.badges.bot": "Бот",
-  "account.block": "Блокировать",
-  "account.block_domain": "Блокировать все с {domain}",
+  "account.badges.group": "Группа",
+  "account.block": "Заблокировать @{name}",
+  "account.block_domain": "Заблокировать {domain}",
   "account.blocked": "Заблокирован(а)",
   "account.cancel_follow_request": "Отменить запрос",
   "account.direct": "Написать @{name}",
@@ -15,19 +16,19 @@
   "account.follows": "Подписки",
   "account.follows.empty": "Этот пользователь пока ни на кого не подписался.",
   "account.follows_you": "Подписан(а) на вас",
-  "account.hide_reblogs": "Скрыть реблоги от @{name}",
+  "account.hide_reblogs": "Скрыть продвижения от @{name}",
   "account.last_status": "Последняя активность",
   "account.link_verified_on": "Владение этой ссылкой было проверено {date}",
   "account.locked_info": "Это закрытый аккаунт. Его владелец вручную одобряет подписчиков.",
   "account.media": "Медиа",
-  "account.mention": "Упомянуть",
+  "account.mention": "Упомянуть @{name}",
   "account.moved_to": "Ищите {name} здесь:",
-  "account.mute": "Заглушить",
+  "account.mute": "Игнорировать @{name}",
   "account.mute_notifications": "Скрыть уведомления от @{name}",
-  "account.muted": "Приглушён",
+  "account.muted": "Игнорируется",
   "account.never_active": "Никогда",
   "account.posts": "Посты",
-  "account.posts_with_replies": "Посты с ответами",
+  "account.posts_with_replies": "Посты и ответы",
   "account.report": "Пожаловаться",
   "account.requested": "Ожидает подтверждения. Нажмите для отмены",
   "account.share": "Поделиться профилем @{name}",
@@ -36,30 +37,32 @@
   "account.unblock_domain": "Разблокировать {domain}",
   "account.unendorse": "Не рекомендовать в профиле",
   "account.unfollow": "Отписаться",
-  "account.unmute": "Не скрывать @{name}",
+  "account.unmute": "Не игнорировать @{name}",
   "account.unmute_notifications": "Показывать уведомления от @{name}",
-  "alert.rate_limited.message": "Пожалуйста, повторите через {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Скорость ограничена",
+  "alert.rate_limited.message": "Пожалуйста, повторите после {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Вы выполняете действие слишком часто",
   "alert.unexpected.message": "Что-то пошло не так.",
   "alert.unexpected.title": "Ой!",
+  "announcement.announcement": "Объявление",
   "autosuggest_hashtag.per_week": "{count} / неделю",
-  "boost_modal.combo": "Нажмите {combo}, чтобы пропустить это в следующий раз",
+  "boost_modal.combo": "{combo}, чтобы пропустить это в следующий раз",
   "bundle_column_error.body": "Что-то пошло не так при загрузке этого компонента.",
   "bundle_column_error.retry": "Попробовать снова",
   "bundle_column_error.title": "Ошибка сети",
   "bundle_modal_error.close": "Закрыть",
   "bundle_modal_error.message": "Что-то пошло не так при загрузке этого компонента.",
   "bundle_modal_error.retry": "Попробовать снова",
-  "column.blocks": "Список блокировки",
+  "column.blocks": "Заблокированные пользователи",
+  "column.bookmarks": "Закладки",
   "column.community": "Локальная лента",
   "column.direct": "Личные сообщения",
   "column.directory": "Просмотр профилей",
   "column.domain_blocks": "Скрытые домены",
-  "column.favourites": "Понравившееся",
+  "column.favourites": "Избранное",
   "column.follow_requests": "Запросы на подписку",
   "column.home": "Главная",
   "column.lists": "Списки",
-  "column.mutes": "Список скрытых пользователей",
+  "column.mutes": "Игнорируемые пользователи",
   "column.notifications": "Уведомления",
   "column.pins": "Закреплённый пост",
   "column.public": "Глобальная лента",
@@ -72,21 +75,23 @@
   "column_header.unpin": "Открепить",
   "column_subheading.settings": "Настройки",
   "community.column_settings.media_only": "Только с медиа",
-  "compose_form.direct_message_warning": "Этот статус будет виден только упомянутым пользователям.",
-  "compose_form.direct_message_warning_learn_more": "Узнать больше",
-  "compose_form.hashtag_warning": "Этот пост не будет показывается в поиске по хэштегу, т.к. он непубличный. Только публичные посты можно найти в поиске по хэштегу.",
-  "compose_form.lock_disclaimer": "Ваша учётная запись не {locked}. Любой пользователь может подписаться на вас и просматривать посты для подписчиков.",
-  "compose_form.lock_disclaimer.lock": "закрыт",
-  "compose_form.placeholder": "О чем вы думаете?",
+  "compose_form.direct_message_warning": "Адресованные посты отправляются и видны только упомянутым в них пользователям.",
+  "compose_form.direct_message_warning_learn_more": "Узнать подробнее",
+  "compose_form.hashtag_warning": "Так как этот пост не публичный, он не отобразится в поиске по хэштегам.",
+  "compose_form.lock_disclaimer": "Ваша учётная запись {locked}. Любой пользователь сможет подписаться на вас и просматривать посты для подписчиков.",
+  "compose_form.lock_disclaimer.lock": "не закрыта",
+  "compose_form.placeholder": "О чём думаете?",
   "compose_form.poll.add_option": "Добавить вариант",
   "compose_form.poll.duration": "Продолжительность опроса",
   "compose_form.poll.option_placeholder": "Вариант {number}",
-  "compose_form.poll.remove_option": "Удалить этот вариант",
+  "compose_form.poll.remove_option": "Убрать этот вариант",
+  "compose_form.poll.switch_to_multiple": "Переключить в режим выбора нескольких ответов",
+  "compose_form.poll.switch_to_single": "Переключить в режим выбора одного ответа",
   "compose_form.publish": "Запостить",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Пометить медиафайл как чувствительный",
-  "compose_form.sensitive.marked": "Медиафайлы не отмечены как чувствительные",
-  "compose_form.sensitive.unmarked": "Медиафайлы не отмечены как чувствительные",
+  "compose_form.sensitive.hide": "Отметить медиафайл как деликатный",
+  "compose_form.sensitive.marked": "Медиафайл отмечен как деликатный",
+  "compose_form.sensitive.unmarked": "Медиафайл не отмечен как деликатный",
   "compose_form.spoiler.marked": "Текст скрыт за предупреждением",
   "compose_form.spoiler.unmarked": "Текст не скрыт",
   "compose_form.spoiler_placeholder": "Текст предупреждения",
@@ -95,20 +100,20 @@
   "confirmations.block.confirm": "Заблокировать",
   "confirmations.block.message": "Вы уверены, что хотите заблокировать {name}?",
   "confirmations.delete.confirm": "Удалить",
-  "confirmations.delete.message": "Вы уверены, что хотите удалить этот статус?",
+  "confirmations.delete.message": "Вы уверены, что хотите удалить этот пост?",
   "confirmations.delete_list.confirm": "Удалить",
   "confirmations.delete_list.message": "Вы действительно хотите навсегда удалить этот список?",
-  "confirmations.domain_block.confirm": "Блокировать весь домен",
-  "confirmations.domain_block.message": "Вы на самом деле уверены, что хотите блокировать весь {domain}? В большинстве случаев нескольких отдельных блокировок или глушений достаточно.",
+  "confirmations.domain_block.confirm": "Да, заблокировать узел",
+  "confirmations.domain_block.message": "Вы точно уверены, что хотите скрыть все посты с узла {domain}? В большинстве случаев пары блокировок и скрытий вполне достаточно.\n\nПри блокировке узла, вы перестанете получать уведомления оттуда, все посты будут скрыты из публичных лент, а подписчики убраны.",
   "confirmations.logout.confirm": "Выйти",
   "confirmations.logout.message": "Вы уверены, что хотите выйти?",
-  "confirmations.mute.confirm": "Заглушить",
+  "confirmations.mute.confirm": "Игнорировать",
   "confirmations.mute.explanation": "Это скроет посты этого пользователя и те, в которых он упоминается, но при этом он по-прежнему сможет подписаться на вас и смотреть ваши посты.",
-  "confirmations.mute.message": "Вы уверены, что хотите заглушить {name}?",
+  "confirmations.mute.message": "Вы уверены, что хотите добавить {name} в список игнорируемых?",
   "confirmations.redraft.confirm": "Удалить и исправить",
-  "confirmations.redraft.message": "Вы уверены, что хотите удалить этот статус и превратить в черновик? Вы потеряете все ответы, продвижения и отметки 'нравится' к нему.",
+  "confirmations.redraft.message": "Вы уверены, что хотите переписать этот пост? Старый пост будет удалён, а вместе с ним пропадут отметки «избранного», продвижения и ответы.",
   "confirmations.reply.confirm": "Ответить",
-  "confirmations.reply.message": "При ответе текст набираемого сообщения будет перезаписан. Продолжить?",
+  "confirmations.reply.message": "При ответе, текст набираемого поста будет очищен. Продолжить?",
   "confirmations.unfollow.confirm": "Отписаться",
   "confirmations.unfollow.message": "Вы уверены, что хотите отписаться от {name}?",
   "conversation.delete": "Удалить беседу",
@@ -116,13 +121,13 @@
   "conversation.open": "Просмотр беседы",
   "conversation.with": "С {names}",
   "directory.federated": "Со всей федерации",
-  "directory.local": "Только из {domain}",
+  "directory.local": "Только с {domain}",
   "directory.new_arrivals": "Новички",
   "directory.recently_active": "Недавно активные",
   "embed.instructions": "Встройте этот пост на свой сайт, скопировав следующий код:",
   "embed.preview": "Так это будет выглядеть:",
   "emoji_button.activity": "Занятия",
-  "emoji_button.custom": "Особенные",
+  "emoji_button.custom": "С этого узла",
   "emoji_button.flags": "Флаги",
   "emoji_button.food": "Еда и напитки",
   "emoji_button.label": "Вставить эмодзи",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Здесь нет постов!",
   "empty_column.account_unavailable": "Профиль недоступен",
   "empty_column.blocks": "Вы ещё никого не заблокировали.",
+  "empty_column.bookmarked_statuses": "У вас пока нет постов в закладках. Как добавите один, он отобразится здесь.",
   "empty_column.community": "Локальная лента пуста. Напишите что-нибудь, чтобы разогреть народ!",
   "empty_column.direct": "У вас пока нет личных сообщений. Как только вы отправите или получите одно, оно появится здесь.",
   "empty_column.domain_blocks": "Скрытых доменов пока нет.",
@@ -149,7 +155,7 @@
   "empty_column.home.public_timeline": "публичные ленты",
   "empty_column.list": "В этом списке пока ничего нет.",
   "empty_column.lists": "У вас ещё нет списков. Созданные вами списки будут показаны здесь.",
-  "empty_column.mutes": "Вы ещё никого не скрывали.",
+  "empty_column.mutes": "Вы никого не игнорируете и всех внимательно выслушиваете.",
   "empty_column.notifications": "У вас пока нет уведомлений. Взаимодействуйте с другими, чтобы завести разговор.",
   "empty_column.public": "Здесь ничего нет! Опубликуйте что-нибудь или подпишитесь на пользователей с других узлов, чтобы заполнить ленту",
   "error.unexpected_crash.explanation": "Из-за несовместимого браузера или ошибки в нашем коде, эта страница не может быть корректно отображена.",
@@ -183,16 +189,16 @@
   "intervals.full.minutes": "{number, plural, one {# минута} few {# минуты} other {# минут}}",
   "introduction.federation.action": "Далее",
   "introduction.federation.federated.headline": "Глобальная лента",
-  "introduction.federation.federated.text": "Публичные статусы с других серверов федеративной сети расположатся в глобальной ленте.",
+  "introduction.federation.federated.text": "Публичные посты с других серверов федеративной сети расположатся в глобальной ленте.",
   "introduction.federation.home.headline": "Домашняя лента",
   "introduction.federation.home.text": "Посты людей, на которых вы подписаны, будут отображаться в домашней ленте. Подписываться можно на кого угодно, независимо от узла.",
   "introduction.federation.local.headline": "Локальная лента",
-  "introduction.federation.local.text": "Публичные статусы от людей с того же сервера, что и вы, будут отображены в локальной ленте.",
+  "introduction.federation.local.text": "Публичные посты от людей с того же сервера, что и вы, будут отображены в локальной ленте.",
   "introduction.interactions.action": "Завершить обучение",
   "introduction.interactions.favourite.headline": "Отметки «нравится»",
-  "introduction.interactions.favourite.text": "Вы можете отметить статус, чтобы вернуться к нему позже и дать знать автору, что запись вам понравилась, поставив отметку \"нравится\".",
+  "introduction.interactions.favourite.text": "Дайте автору знать, что пост вам понравился и вернитесь к нему позже, добавив его в избранное.",
   "introduction.interactions.reblog.headline": "Продвижения",
-  "introduction.interactions.reblog.text": "Вы можете делиться статусами других людей, продвигая их в своей учётной записи.",
+  "introduction.interactions.reblog.text": "Вы можете делиться постами других людей, продвигая их в своей учётной записи.",
   "introduction.interactions.reply.headline": "Ответы",
   "introduction.interactions.reply.text": "Вы можете отвечать свои и чужие посты, образуя цепочки сообщений (обсуждения).",
   "introduction.welcome.action": "Поехали!",
@@ -206,9 +212,9 @@
   "keyboard_shortcuts.description": "Описание",
   "keyboard_shortcuts.direct": "чтобы показать колонку личных сообщений",
   "keyboard_shortcuts.down": "вниз по списку",
-  "keyboard_shortcuts.enter": "развернуть пост",
+  "keyboard_shortcuts.enter": "открыть пост",
   "keyboard_shortcuts.favourite": "в избранное",
-  "keyboard_shortcuts.favourites": "открыть 'Избранное'",
+  "keyboard_shortcuts.favourites": "открыть «Избранное»",
   "keyboard_shortcuts.federated": "перейти к глобальной ленте",
   "keyboard_shortcuts.heading": "Сочетания клавиш",
   "keyboard_shortcuts.home": "перейти к домашней ленте",
@@ -216,10 +222,11 @@
   "keyboard_shortcuts.legend": "показать это окно",
   "keyboard_shortcuts.local": "перейти к локальной ленте",
   "keyboard_shortcuts.mention": "упомянуть автора поста",
-  "keyboard_shortcuts.muted": "открыть список заглушённых",
+  "keyboard_shortcuts.muted": "открыть список игнорируемых",
   "keyboard_shortcuts.my_profile": "перейти к своему профилю",
   "keyboard_shortcuts.notifications": "перейти к уведомлениям",
-  "keyboard_shortcuts.pinned": "перейти к закреплённым статусам",
+  "keyboard_shortcuts.open_media": "открыть вложение",
+  "keyboard_shortcuts.pinned": "перейти к закреплённым постам",
   "keyboard_shortcuts.profile": "перейти к профилю автора",
   "keyboard_shortcuts.reply": "ответить",
   "keyboard_shortcuts.requests": "перейти к запросам на подписку",
@@ -239,8 +246,8 @@
   "lists.delete": "Удалить список",
   "lists.edit": "Изменить список",
   "lists.edit.submit": "Изменить название",
-  "lists.new.create": "Новый список",
-  "lists.new.title_placeholder": "Заголовок списка",
+  "lists.new.create": "Создать список",
+  "lists.new.title_placeholder": "Название для нового списка",
   "lists.search": "Искать среди подписок",
   "lists.subheading": "Ваши списки",
   "load_pending": "{count, plural, one {# новый элемент} few {# новых элемента} other {# новых элементов}}",
@@ -248,17 +255,18 @@
   "media_gallery.toggle_visible": "Показать/скрыть",
   "missing_indicator.label": "Не найдено",
   "missing_indicator.sublabel": "Запрашиваемый ресурс не найден",
-  "mute_modal.hide_notifications": "Убрать уведомления от этого пользователя?",
+  "mute_modal.hide_notifications": "Скрыть уведомления от этого пользователя?",
   "navigation_bar.apps": "Мобильные приложения",
   "navigation_bar.blocks": "Список блокировки",
+  "navigation_bar.bookmarks": "Закладки",
   "navigation_bar.community_timeline": "Локальная лента",
-  "navigation_bar.compose": "Создать новый статус",
+  "navigation_bar.compose": "Создать новый пост",
   "navigation_bar.direct": "Личные сообщения",
   "navigation_bar.discover": "Изучайте",
   "navigation_bar.domain_blocks": "Скрытые домены",
   "navigation_bar.edit_profile": "Изменить профиль",
-  "navigation_bar.favourites": "Понравившееся",
-  "navigation_bar.filters": "Заглушенные слова",
+  "navigation_bar.favourites": "Избранное",
+  "navigation_bar.filters": "Игнорируемые слова",
   "navigation_bar.follow_requests": "Запросы на подписку",
   "navigation_bar.follows_and_followers": "Подписки и подписчики",
   "navigation_bar.info": "Об узле",
@@ -271,29 +279,32 @@
   "navigation_bar.preferences": "Настройки",
   "navigation_bar.public_timeline": "Глобальная лента",
   "navigation_bar.security": "Безопасность",
-  "notification.favourite": "{name} добавил(а) ваш статус в избранное",
+  "notification.favourite": "{name} добавил(а) ваш пост в избранное",
   "notification.follow": "{name} подписался (-лась) на вас",
+  "notification.follow_request": "{name} отправил запрос на подписку",
   "notification.mention": "{name} упомянул(а) вас",
+  "notification.own_poll": "Ваш опрос закончился",
   "notification.poll": "Опрос, в котором вы приняли участие, завершился",
-  "notification.reblog": "{name} продвинул(а) ваш статус",
+  "notification.reblog": "{name} продвинул(а) ваш пост",
   "notifications.clear": "Очистить уведомления",
   "notifications.clear_confirmation": "Вы уверены, что хотите очистить все уведомления?",
-  "notifications.column_settings.alert": "Десктопные уведомления",
-  "notifications.column_settings.favourite": "Нравится:",
+  "notifications.column_settings.alert": "Уведомления в фоне",
+  "notifications.column_settings.favourite": "Ваш пост добавили в «избранное»:",
   "notifications.column_settings.filter_bar.advanced": "Отображать все категории",
-  "notifications.column_settings.filter_bar.category": "Фильтры по категориям",
-  "notifications.column_settings.filter_bar.show": "Показывать",
-  "notifications.column_settings.follow": "Новые подписчики:",
-  "notifications.column_settings.mention": "Упоминания:",
-  "notifications.column_settings.poll": "Результаты опроса:",
-  "notifications.column_settings.push": "Push-уведомления",
-  "notifications.column_settings.reblog": "Продвижения:",
-  "notifications.column_settings.show": "Показывать в колонке",
+  "notifications.column_settings.filter_bar.category": "Панель сортировки",
+  "notifications.column_settings.filter_bar.show": "Отображать панель сортировки",
+  "notifications.column_settings.follow": "У вас новый подписчик:",
+  "notifications.column_settings.follow_request": "Новые запросы на подписку:",
+  "notifications.column_settings.mention": "Вас упомянули в посте:",
+  "notifications.column_settings.poll": "Опрос, в котором вы приняли участие, завершился:",
+  "notifications.column_settings.push": "Пуш-уведомления",
+  "notifications.column_settings.reblog": "Ваш пост продвинули:",
+  "notifications.column_settings.show": "Отображать в списке",
   "notifications.column_settings.sound": "Проигрывать звук",
-  "notifications.filter.all": "Все",
+  "notifications.filter.all": "Всё",
   "notifications.filter.boosts": "Продвижения",
-  "notifications.filter.favourites": "Отметки \"нравится\"",
-  "notifications.filter.follows": "Новые подписчики",
+  "notifications.filter.favourites": "Отметки «избранного»",
+  "notifications.filter.follows": "Подписки",
   "notifications.filter.mentions": "Упоминания",
   "notifications.filter.polls": "Результаты опросов",
   "notifications.group": "{count} уведомл.",
@@ -305,26 +316,26 @@
   "poll.voted": "Вы проголосовали за этот вариант",
   "poll_button.add_poll": "Добавить опрос",
   "poll_button.remove_poll": "Удалить опрос",
-  "privacy.change": "Изменить видимость статуса",
+  "privacy.change": "Изменить видимость поста",
   "privacy.direct.long": "Показать только упомянутым",
-  "privacy.direct.short": "Направленный",
+  "privacy.direct.short": "Адресованный",
   "privacy.private.long": "Показать только подписчикам",
   "privacy.private.short": "Приватный",
   "privacy.public.long": "Показать в публичных лентах",
   "privacy.public.short": "Публичный",
-  "privacy.unlisted.long": "Не показывать в лентах",
+  "privacy.unlisted.long": "Не показывать в публичных лентах",
   "privacy.unlisted.short": "Скрытый",
   "refresh": "Обновить",
   "regeneration_indicator.label": "Загрузка…",
   "regeneration_indicator.sublabel": "Один момент, мы подготавливаем вашу ленту!",
-  "relative_time.days": "{number}д",
-  "relative_time.hours": "{number}ч",
+  "relative_time.days": "{number} д",
+  "relative_time.hours": "{number} ч",
   "relative_time.just_now": "только что",
-  "relative_time.minutes": "{number}м",
-  "relative_time.seconds": "{number}с",
+  "relative_time.minutes": "{number} мин",
+  "relative_time.seconds": "{number} с",
   "reply_indicator.cancel": "Отмена",
   "report.forward": "Переслать в {target}",
-  "report.forward_hint": "Этот аккаунт расположен на другом узле. Отправить туда анонимную копию вашей жалобы?",
+  "report.forward_hint": "Эта учётная запись расположена на другом узле. Отправить туда анонимную копию вашей жалобы?",
   "report.hint": "Жалоба будет отправлена модераторам вашего узла. Вы также можете указать подробную причину жалобы ниже:",
   "report.placeholder": "Комментарий",
   "report.submit": "Отправить",
@@ -333,53 +344,55 @@
   "search_popout.search_format": "Продвинутый формат поиска",
   "search_popout.tips.full_text": "Поиск по простому тексту отобразит посты, которые вы написали, добавили в избранное, продвинули или в которых были упомянуты, а также подходящие имена пользователей и хэштеги.",
   "search_popout.tips.hashtag": "хэштег",
-  "search_popout.tips.status": "статус",
+  "search_popout.tips.status": "пост",
   "search_popout.tips.text": "Простой ввод текста покажет совпадающие имена пользователей, отображаемые имена и хэштеги",
   "search_popout.tips.user": "пользователь",
   "search_results.accounts": "Люди",
   "search_results.hashtags": "Хэштеги",
   "search_results.statuses": "Посты",
-  "search_results.statuses_fts_disabled": "Поиск постов по их контенту не поддерживается на этом сервере Mastodon.",
+  "search_results.statuses_fts_disabled": "Поиск постов по их содержанию не поддерживается данным узлом Mastodon.",
   "search_results.total": "{count, number} {count, plural, one {результат} few {результата} many {результатов} other {результатов}}",
   "status.admin_account": "Открыть интерфейс модератора для @{name}",
-  "status.admin_status": "Открыть этот статус в интерфейсе модератора",
+  "status.admin_status": "Открыть этот пост в интерфейсе модератора",
   "status.block": "Заблокировать @{name}",
+  "status.bookmark": "Добавить в закладки",
   "status.cancel_reblog_private": "Не продвигать",
-  "status.cannot_reblog": "Этот статус не может быть продвинут",
-  "status.copy": "Копировать ссылку на запись",
+  "status.cannot_reblog": "Этот пост не может быть продвинут",
+  "status.copy": "Скопировать ссылку на пост",
   "status.delete": "Удалить",
   "status.detailed_status": "Подробный просмотр обсуждения",
   "status.direct": "Написать @{name}",
-  "status.embed": "Встроить",
+  "status.embed": "Встроить на свой сайт",
   "status.favourite": "Нравится",
   "status.filtered": "Отфильтровано",
-  "status.load_more": "Показать еще",
-  "status.media_hidden": "Медиа скрыто",
+  "status.load_more": "Загрузить остальное",
+  "status.media_hidden": "Файл скрыт",
   "status.mention": "Упомянуть @{name}",
   "status.more": "Больше",
-  "status.mute": "Заглушить @{name}",
-  "status.mute_conversation": "Заглушить всё обсуждение",
-  "status.open": "Развернуть статус",
+  "status.mute": "Игнорировать @{name}",
+  "status.mute_conversation": "Игнорировать обсуждение",
+  "status.open": "Открыть пост",
   "status.pin": "Закрепить в профиле",
-  "status.pinned": "Закреплённый статус",
+  "status.pinned": "Закреплённый пост",
   "status.read_more": "Ещё",
   "status.reblog": "Продвинуть",
   "status.reblog_private": "Продвинуть для своей аудитории",
   "status.reblogged_by": "{name} продвинул(а)",
-  "status.reblogs.empty": "Никто ещё не продвинул этот статус. Как только кто-то это сделает, они появятся здесь.",
+  "status.reblogs.empty": "Никто ещё не продвинул этот пост. Как только кто-то это сделает, они появятся здесь.",
   "status.redraft": "Удалить и исправить",
+  "status.remove_bookmark": "Убрать из закладок",
   "status.reply": "Ответить",
   "status.replyAll": "Ответить всем",
   "status.report": "Пожаловаться",
-  "status.sensitive_warning": "Чувствительный контент",
+  "status.sensitive_warning": "Деликатное содержимое",
   "status.share": "Поделиться",
   "status.show_less": "Свернуть",
-  "status.show_less_all": "Свернуть для всех",
+  "status.show_less_all": "Свернуть все спойлеры в ветке",
   "status.show_more": "Развернуть",
-  "status.show_more_all": "Развернуть для всех",
+  "status.show_more_all": "Развернуть все спойлеры в ветке",
   "status.show_thread": "Показать обсуждение",
-  "status.uncached_media_warning": "Недоступно",
-  "status.unmute_conversation": "Снять глушение с обсуждения",
+  "status.uncached_media_warning": "Файл недоступен",
+  "status.unmute_conversation": "Не игнорировать обсуждение",
   "status.unpin": "Открепить от профиля",
   "suggestions.dismiss": "Удалить предложение",
   "suggestions.header": "Вам может быть интересно…",
@@ -392,31 +405,34 @@
   "time_remaining.hours": "{number, plural, one {остался # час} few {осталось # часа} many {осталось # часов} other {осталось # часов}}",
   "time_remaining.minutes": "{number, plural, one {осталась # минута} few {осталось # минуты} many {осталось # минут} other {осталось # минут}}",
   "time_remaining.moments": "остались считанные мгновения",
-  "time_remaining.seconds": "{number, plural, one {осталась # секунду} few {осталось # секунды} many {осталось # секунд} other {осталось # секунд}}",
+  "time_remaining.seconds": "{number, plural, one {# секунда} many {# секунд} other {# секунды}}",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {человек говорит} few {человека говорят} other {человек говорят}} про это",
   "trends.trending_now": "Самое актуальное",
   "ui.beforeunload": "Ваш черновик будет утерян, если вы покинете Mastodon.",
   "upload_area.title": "Перетащите сюда, чтобы загрузить",
-  "upload_button.label": "Добавить медиаконтент",
+  "upload_button.label": "Прикрепить фото, видео или аудио",
   "upload_error.limit": "Достигнут лимит загруженных файлов.",
   "upload_error.poll": "К опросам нельзя прикреплять файлы.",
+  "upload_form.audio_description": "Опишите аудиофайл для людей с нарушением слуха",
   "upload_form.description": "Добавьте описание для людей с нарушениями зрения:",
   "upload_form.edit": "Изменить",
   "upload_form.undo": "Отменить",
+  "upload_form.video_description": "Опишите видео для людей с нарушением слуха или зрения",
   "upload_modal.analyzing_picture": "Обработка изображения…",
   "upload_modal.apply": "Применить",
   "upload_modal.description_placeholder": "На дворе трава, на траве дрова",
   "upload_modal.detect_text": "Найти текст на картинке",
-  "upload_modal.edit_media": "Изменение медиа",
+  "upload_modal.edit_media": "Изменить файл",
   "upload_modal.hint": "Нажмите и перетащите круг в предпросмотре в точку фокуса, которая всегда будет видна на эскизах.",
   "upload_modal.preview_label": "Предпросмотр ({ratio})",
   "upload_progress.label": "Загрузка...",
   "video.close": "Закрыть видео",
+  "video.download": "Загрузить файл",
   "video.exit_fullscreen": "Покинуть полноэкранный режим",
   "video.expand": "Развернуть видео",
   "video.fullscreen": "Полноэкранный режим",
   "video.hide": "Скрыть видео",
-  "video.mute": "Заглушить звук",
+  "video.mute": "Выключить звук",
   "video.pause": "Пауза",
   "video.play": "Пуск",
   "video.unmute": "Включить звук"
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 0766e703f..976dc572e 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -1,10 +1,11 @@
 {
   "account.add_or_remove_from_list": "Pridaj do, alebo odober zo zoznamov",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Skupina",
   "account.block": "Blokuj @{name}",
   "account.block_domain": "Ukry všetko z {domain}",
   "account.blocked": "Blokovaný/á",
-  "account.cancel_follow_request": "Zruš požiadanie o sledovanie",
+  "account.cancel_follow_request": "Zruš žiadosť o sledovanie",
   "account.direct": "Priama správa pre @{name}",
   "account.domain_blocked": "Doména ukrytá",
   "account.edit_profile": "Uprav profil",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Tempo obmedzené",
   "alert.unexpected.message": "Vyskytla sa nečakaná chyba.",
   "alert.unexpected.title": "Ups!",
+  "announcement.announcement": "Oboznámenie",
   "autosuggest_hashtag.per_week": "{count} týždenne",
   "boost_modal.combo": "Nabudúce môžeš kliknúť {combo} pre preskočenie",
   "bundle_column_error.body": "Pri načítaní tohto prvku nastala nejaká chyba.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Nastala chyba pri načítaní tohto komponentu.",
   "bundle_modal_error.retry": "Skúsiť znova",
   "column.blocks": "Blokovaní užívatelia",
+  "column.bookmarks": "Záložky",
   "column.community": "Miestna časová os",
   "column.direct": "Priame správy",
   "column.directory": "Prehľadávaj profily",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Trvanie ankety",
   "compose_form.poll.option_placeholder": "Voľba {number}",
   "compose_form.poll.remove_option": "Odstráň túto voľbu",
+  "compose_form.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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Označ médiá ako chúlostivé",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Niesú tu žiadne príspevky!",
   "empty_column.account_unavailable": "Profil nedostupný",
   "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": "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é.",
@@ -176,8 +182,8 @@
   "hashtag.column_settings.tag_mode.none": "Žiaden z týchto",
   "hashtag.column_settings.tag_toggle": "Vlož dodatočné haštagy pre tento stĺpec",
   "home.column_settings.basic": "Základné",
-  "home.column_settings.show_reblogs": "Zobraziť povýšené",
-  "home.column_settings.show_replies": "Ukázať odpovede",
+  "home.column_settings.show_reblogs": "Ukáž vyzdvihnuté",
+  "home.column_settings.show_replies": "Ukáž odpovede",
   "intervals.full.days": "{number, plural, one {# deň} few {# dní} many {# dní} other {# dní}}",
   "intervals.full.hours": "{number, plural, one {# hodina} few {# hodín} many {# hodín} other {# hodín}}",
   "intervals.full.minutes": "{number, plural, one {# minúta} few {# minút} many {# minút} other {# minút}}",
@@ -192,7 +198,7 @@
   "introduction.interactions.favourite.headline": "Obľúbené",
   "introduction.interactions.favourite.text": "Obľúbením si môžeš príspevok uložiť na neskôr, a zároveň dať jeho autorovi vedieť, že sa ti páčil.",
   "introduction.interactions.reblog.headline": "Vyzdvihni",
-  "introduction.interactions.reblog.text": "Môžeš zdieľať príspevky iných ľudí s vašimi následovateľmi tým, že ich povýšiš.",
+  "introduction.interactions.reblog.text": "Môžeš zdieľať príspevky iných ľudí s tvojími následovateľmi tak, že ich vyzdvihneš.",
   "introduction.interactions.reply.headline": "Odpovedz",
   "introduction.interactions.reply.text": "Odpovedať môžeš na príspevky iných ľudí, aj na svoje vlastné, čím sa spolu prepoja do konverzácie.",
   "introduction.welcome.action": "Poďme do toho!",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "otvor zoznam stíšených užívateľov",
   "keyboard_shortcuts.my_profile": "otvor svoj profil",
   "keyboard_shortcuts.notifications": "otvor panel oboznámení",
+  "keyboard_shortcuts.open_media": "na otvorenie médií",
   "keyboard_shortcuts.pinned": "otvor zoznam pripnutých príspevkov",
   "keyboard_shortcuts.profile": "otvor autorov profil",
   "keyboard_shortcuts.reply": "odpovedať",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Skry oznámenia od tohto používateľa?",
   "navigation_bar.apps": "Aplikácie",
   "navigation_bar.blocks": "Blokovaní užívatelia",
+  "navigation_bar.bookmarks": "Záložky",
   "navigation_bar.community_timeline": "Miestna časová os",
   "navigation_bar.compose": "Napíš nový príspevok",
   "navigation_bar.direct": "Priame správy",
@@ -268,12 +276,14 @@
   "navigation_bar.mutes": "Ignorovaní užívatelia",
   "navigation_bar.personal": "Osobné",
   "navigation_bar.pins": "Pripnuté príspevky",
-  "navigation_bar.preferences": "Voľby",
+  "navigation_bar.preferences": "Nastavenia",
   "navigation_bar.public_timeline": "Federovaná časová os",
   "navigation_bar.security": "Zabezbečenie",
   "notification.favourite": "{name} si obľúbil/a tvoj príspevok",
   "notification.follow": "{name} ťa začal/a následovať",
+  "notification.follow_request": "{name} žiada ťa následovať",
   "notification.mention": "{name} ťa spomenul/a",
+  "notification.own_poll": "Tvoja anketa sa skončila",
   "notification.poll": "Anketa v ktorej si hlasoval/a sa skončila",
   "notification.reblog": "{name} zdieľal/a tvoj príspevok",
   "notifications.clear": "Vyčisti oboznámenia",
@@ -284,11 +294,12 @@
   "notifications.column_settings.filter_bar.category": "Rýchle triedenie",
   "notifications.column_settings.filter_bar.show": "Ukáž",
   "notifications.column_settings.follow": "Noví sledujúci:",
+  "notifications.column_settings.follow_request": "Nové žiadosti o následovanie:",
   "notifications.column_settings.mention": "Zmienenia:",
   "notifications.column_settings.poll": "Výsledky ankiet:",
   "notifications.column_settings.push": "Push notifikácie",
   "notifications.column_settings.reblog": "Vyzdvihnutia:",
-  "notifications.column_settings.show": "Zobraz v stĺpci",
+  "notifications.column_settings.show": "Ukáž v stĺpci",
   "notifications.column_settings.sound": "Prehraj zvuk",
   "notifications.filter.all": "Všetky",
   "notifications.filter.boosts": "Vyzdvihnutia",
@@ -344,6 +355,7 @@
   "status.admin_account": "Otvor moderovacie rozhranie užívateľa @{name}",
   "status.admin_status": "Otvor tento príspevok v moderovacom rozhraní",
   "status.block": "Blokuj @{name}",
+  "status.bookmark": "Záložka",
   "status.cancel_reblog_private": "Nezdieľaj",
   "status.cannot_reblog": "Tento príspevok nemôže byť zdieľaný",
   "status.copy": "Skopíruj odkaz na príspevok",
@@ -365,9 +377,10 @@
   "status.read_more": "Čítaj ďalej",
   "status.reblog": "Vyzdvihni",
   "status.reblog_private": "Vyzdvihni k pôvodnému publiku",
-  "status.reblogged_by": "{name} povýšil/a",
+  "status.reblogged_by": "{name} vyzdvihli",
   "status.reblogs.empty": "Nikto ešte nevyzdvihol tento príspevok. Keď tak niekto urobí, bude to zobrazené práve tu.",
   "status.redraft": "Vymaž a prepíš",
+  "status.remove_bookmark": "Odstráň záložku",
   "status.reply": "Odpovedať",
   "status.replyAll": "Odpovedz na diskusiu",
   "status.report": "Nahlás @{name}",
@@ -393,25 +406,28 @@
   "time_remaining.minutes": "Ostáva {number, plural, one {# minúta} few {# minút} many {# minút} other {# minúty}}",
   "time_remaining.moments": "Ostáva už iba chviľka",
   "time_remaining.seconds": "Ostáva {number, plural, one {# sekunda} few {# sekúnd} many {# sekúnd} other {# sekúnd}}",
-  "trends.count_by_accounts": "{count} {rawCount, plural, one {človek vraví} other {ľudia vravia}}",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {človek spomína} other {ľudí spomína}}",
   "trends.trending_now": "Teraz populárne",
   "ui.beforeunload": "Čo máš rozpísané sa stratí, ak opustíš Mastodon.",
   "upload_area.title": "Pretiahni a pusť pre nahratie",
   "upload_button.label": "Pridaj médiálny súbor (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Limit pre nahrávanie súborov bol prekročený.",
   "upload_error.poll": "Nahrávanie súborov pri anketách nieje možné.",
+  "upload_form.audio_description": "Popíš, pre ľudí so stratou sluchu",
   "upload_form.description": "Opis pre slabo vidiacich",
   "upload_form.edit": "Uprav",
   "upload_form.undo": "Vymaž",
+  "upload_form.video_description": "Popíš, pre ľudí so stratou sluchu, alebo očným znevýhodnením",
   "upload_modal.analyzing_picture": "Analyzujem obrázok…",
   "upload_modal.apply": "Použi",
   "upload_modal.description_placeholder": "Rýchla hnedá líška skáče ponad lenivého psa",
   "upload_modal.detect_text": "Rozpoznaj text z obrázka",
   "upload_modal.edit_media": "Uprav médiá",
-  "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.hint": "Klikni, alebo potiahni okruh ukážky pre zvolenie z ktorého východzieho bodu bude vždy v dohľadne na všetkých náhľadoch.",
   "upload_modal.preview_label": "Náhľad ({ratio})",
   "upload_progress.label": "Nahráva sa...",
   "video.close": "Zavri video",
+  "video.download": "Stiahni súbor",
   "video.exit_fullscreen": "Vypni zobrazenie na celú obrazovku",
   "video.expand": "Zväčši video",
   "video.fullscreen": "Zobraz na celú obrazovku",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index ecac0d9c7..bcf3b8d1a 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Dodaj ali odstrani iz seznama",
   "account.badges.bot": "Robot",
+  "account.badges.group": "Group",
   "account.block": "Blokiraj @{name}",
   "account.block_domain": "Skrij vse iz {domain}",
   "account.blocked": "Blokirano",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "Zgodila se je nepričakovana napaka.",
   "alert.unexpected.title": "Uups!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "Če želite preskočiti to, lahko pritisnete {combo}",
   "bundle_column_error.body": "Med nalaganjem te komponente je prišlo do napake.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Med nalaganjem te komponente je prišlo do napake.",
   "bundle_modal_error.retry": "Poskusi ponovno",
   "column.blocks": "Blokirani uporabniki",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Lokalna časovnica",
   "column.direct": "Neposredna sporočila",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Trajanje ankete",
   "compose_form.poll.option_placeholder": "Izbira {number}",
   "compose_form.poll.remove_option": "Odstrani to izbiro",
+  "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Označi medij kot občutljiv",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Tukaj ni tutov!",
   "empty_column.account_unavailable": "Profil ni na voljo",
   "empty_column.blocks": "Niste še blokirali nobenega uporabnika.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "Lokalna časovnica je prazna. Napišite nekaj javnega, da se bo žoga zakotalila!",
   "empty_column.direct": "Nimate še nobenih neposrednih sporočil. Ko ga boste poslali ali prejeli, se bo prikazal tukaj.",
   "empty_column.domain_blocks": "Še vedno ni skritih domen.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "odpri seznam utišanih uporabnikov",
   "keyboard_shortcuts.my_profile": "odpri svoj profil",
   "keyboard_shortcuts.notifications": "odpri stolpec z obvestili",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "odpri seznam pripetih tutov",
   "keyboard_shortcuts.profile": "odpri avtorjev profil",
   "keyboard_shortcuts.reply": "odgovori",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Skrij obvestila tega uporabnika?",
   "navigation_bar.apps": "Mobilne aplikacije",
   "navigation_bar.blocks": "Blokirani uporabniki",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Lokalna časovnica",
   "navigation_bar.compose": "Sestavi nov tut",
   "navigation_bar.direct": "Neposredna sporočila",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Varnost",
   "notification.favourite": "{name} je vzljubil/a vaš status",
   "notification.follow": "{name} vam sledi",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} vas je omenil/a",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "Glasovanje, v katerem ste sodelovali, se je končalo",
   "notification.reblog": "{name} je spodbudil/a vaš status",
   "notifications.clear": "Počisti obvestila",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Vrstica za hitro filtriranje",
   "notifications.column_settings.filter_bar.show": "Pokaži",
   "notifications.column_settings.follow": "Novi sledilci:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Omembe:",
   "notifications.column_settings.poll": "Rezultati glasovanja:",
   "notifications.column_settings.push": "Potisna obvestila",
@@ -344,6 +355,7 @@
   "status.admin_account": "Odpri vmesnik za moderiranje za @{name}",
   "status.admin_status": "Odpri status v vmesniku za moderiranje",
   "status.block": "Blokiraj @{name}",
+  "status.bookmark": "Bookmark",
   "status.cancel_reblog_private": "Prekini spodbudo",
   "status.cannot_reblog": "Te objave ni mogoče spodbuditi",
   "status.copy": "Kopiraj povezavo do statusa",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} spodbuja",
   "status.reblogs.empty": "Nihče še ni spodbudil tega tuta. Ko se bo to zgodilo, se bodo pojavili tukaj.",
   "status.redraft": "Izbriši in preoblikuj",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Odgovori",
   "status.replyAll": "Odgovori na objavo",
   "status.report": "Prijavi @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Dodaj medije ({formats})",
   "upload_error.limit": "Omejitev prenosa datoteke je presežena.",
   "upload_error.poll": "Prenos datoteke z anketami ni dovoljen.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Opišite za slabovidne",
   "upload_form.edit": "Edit",
   "upload_form.undo": "Izbriši",
+  "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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Pošiljanje...",
   "video.close": "Zapri video",
+  "video.download": "Download file",
   "video.exit_fullscreen": "Izhod iz celozaslonskega načina",
   "video.expand": "Razširi video",
   "video.fullscreen": "Celozaslonski način",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index f58466d87..617c3aee3 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Shtoni ose Hiqni prej listash",
   "account.badges.bot": "Robot",
+  "account.badges.group": "Group",
   "account.block": "Blloko @{name}",
   "account.block_domain": "Fshih gjithçka prej {domain}",
   "account.blocked": "E bllokuar",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "Ndodhi një gabim të papritur.",
   "alert.unexpected.title": "Hëm!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "Mund të shtypni {combo}, që të anashkalohet kjo herës tjetër",
   "bundle_column_error.body": "Diç shkoi ters teksa ngarkohej ky përbërës.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Diç shkoi ters teksa ngarkohej ky përbërës.",
   "bundle_modal_error.retry": "Riprovoni",
   "column.blocks": "Përdorues të bllokuar",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Rrjedhë kohore vendore",
   "column.direct": "Mesazhe të drejtpërdrejta",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "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": "Mesazh",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "S’ka mesazhe këtu!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "S’keni bllokuar ende ndonjë përdorues.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "Rrjedha kohore vendore është e zbrazët. Shkruani diçka publikisht që t’i hyhet valles!",
   "empty_column.direct": "S’keni ende ndonjë mesazh të drejtpërdrejt. Kur dërgoni ose merrni një të tillë, ai do të shfaqet këtu.",
   "empty_column.domain_blocks": "Ende s’ka përkatësi të fshehura.",
@@ -219,6 +225,7 @@
   "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": "to open media",
   "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",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Të fshihen njoftimet prej këtij përdoruesi?",
   "navigation_bar.apps": "Aplikacione për celular",
   "navigation_bar.blocks": "Përdorues të bllokuar",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Rrjedhë kohore vendore",
   "navigation_bar.compose": "Hartoni mesazh të ri",
   "navigation_bar.direct": "Mesazhe të drejtpërdrejta",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Siguri",
   "notification.favourite": "{name} parapëlqeu gjendjen tuaj",
   "notification.follow": "{name} zuri t’ju ndjekë",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} ju ka përmendur",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} përforcoi gjendjen tuaj",
   "notifications.clear": "Pastroji njoftimet",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Shtyllë filtrimesh të shpejta",
   "notifications.column_settings.filter_bar.show": "Shfaq",
   "notifications.column_settings.follow": "Ndjekës të rinj:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Përmendje:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Njoftime Push",
@@ -344,6 +355,7 @@
   "status.admin_account": "Hap ndërfaqe moderimi për @{name}",
   "status.admin_status": "Hape këtë gjendje te ndërfaqja e moderimit",
   "status.block": "Blloko @{name}",
+  "status.bookmark": "Bookmark",
   "status.cancel_reblog_private": "Shpërforcojeni",
   "status.cannot_reblog": "Ky postim s’mund të përforcohet",
   "status.copy": "Kopjoje lidhjen te gjendje",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} përforcoi",
   "status.reblogs.empty": "Këtë mesazh s’e ka përforcuar njeri deri tani. Kur ta bëjë dikush, kjo do të duket këtu.",
   "status.redraft": "Fshijeni & rihartojeni",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Përgjigjuni",
   "status.replyAll": "Përgjigjuni rrjedhës",
   "status.report": "Raportojeni @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Shtoni media (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "U tejkalua kufi ngarkimi kartelash.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Përshkruajeni për persona me probleme shikimi",
   "upload_form.edit": "Edit",
   "upload_form.undo": "Fshije",
+  "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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Po ngarkohet…",
   "video.close": "Mbylle videon",
+  "video.download": "Download file",
   "video.exit_fullscreen": "Dil nga mënyra Sa Krejt Ekrani",
   "video.expand": "Zgjeroje videon",
   "video.fullscreen": "Sa krejt ekrani",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index 59b8459ae..09b30ff5f 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Add or Remove from lists",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Group",
   "account.block": "Blokiraj korisnika @{name}",
   "account.block_domain": "Sakrij sve sa domena {domain}",
   "account.blocked": "Blocked",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "An unexpected error occurred.",
   "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "Možete pritisnuti {combo} da preskočite ovo sledeći put",
   "bundle_column_error.body": "Nešto je pošlo po zlu prilikom učitavanja ove komponente.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Nešto nije bilo u redu pri učitavanju ove komponente.",
   "bundle_modal_error.retry": "Pokušajte ponovo",
   "column.blocks": "Blokirani korisnici",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Lokalna lajna",
   "column.direct": "Direct messages",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "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": "Tutni",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile unavailable",
   "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
   "empty_column.community": "Lokalna lajna je prazna. Napišite nešto javno da lajna produva!",
   "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
   "empty_column.domain_blocks": "There are no hidden domains yet.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "da odgovorite",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Sakrij obaveštenja od ovog korisnika?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokirani korisnici",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Lokalna lajna",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} je stavio Vaš status kao omiljeni",
   "notification.follow": "{name} Vas je zapratio",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} Vas je pomenuo",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} je podržao(la) Vaš status",
   "notifications.clear": "Očisti obaveštenja",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Novi pratioci:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Pominjanja:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Guraj obaveštenja",
@@ -344,6 +355,7 @@
   "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": "Ovaj status ne može da se podrži",
   "status.copy": "Copy link to status",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} podržao(la)",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Odgovori",
   "status.replyAll": "Odgovori na diskusiju",
   "status.report": "Prijavi korisnika @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Dodaj multimediju",
   "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": "Opiši za slabovide osobe",
   "upload_form.edit": "Edit",
   "upload_form.undo": "Opozovi",
+  "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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Otpremam...",
   "video.close": "Zatvori video",
+  "video.download": "Download file",
   "video.exit_fullscreen": "Napusti ceo ekran",
   "video.expand": "Proširi video",
   "video.fullscreen": "Ceo ekran",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index d222e774d..5b04f9826 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Add or Remove from lists",
   "account.badges.bot": "Бот",
+  "account.badges.group": "Group",
   "account.block": "Блокирај @{name}",
   "account.block_domain": "Сакриј све са домена {domain}",
   "account.blocked": "Блокиран",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "Појавила се неочекивана грешка.",
   "alert.unexpected.title": "Упс!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "Можете притиснути {combo} да прескочите ово следећи пут",
   "bundle_column_error.body": "Нешто је пошло по злу приликом учитавања ове компоненте.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Нешто није било у реду при учитавању ове компоненте.",
   "bundle_modal_error.retry": "Покушајте поново",
   "column.blocks": "Блокирани корисници",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Локална временска линија",
   "column.direct": "Директне поруке",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "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": "Труби",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "No toots here!",
   "empty_column.account_unavailable": "Profile 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.direct": "Још увек немате директних порука. Када пошаљете или примите једну, појавиће се овде.",
   "empty_column.domain_blocks": "Још увек нема сакривених домена.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "да отворите листу ућутканих корисника",
   "keyboard_shortcuts.my_profile": "да отворите ваш профил",
   "keyboard_shortcuts.notifications": "да отворите колону обавештења",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "да отворите листу закачених труба",
   "keyboard_shortcuts.profile": "да отворите профил аутора",
   "keyboard_shortcuts.reply": "да одговорите",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Сакриј обавештења од овог корисника?",
   "navigation_bar.apps": "Мобилне апликације",
   "navigation_bar.blocks": "Блокирани корисници",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Локална временска линија",
   "navigation_bar.compose": "Саставите нову трубу",
   "navigation_bar.direct": "Директне поруке",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Безбедност",
   "notification.favourite": "{name} је ставио/ла Ваш статус као омиљени",
   "notification.follow": "{name} Вас је запратио/ла",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} Вас је поменуо/ла",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} је подржао/ла Ваш статус",
   "notifications.clear": "Очисти обавештења",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "Нови пратиоци:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Помињања:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Гурај обавештења",
@@ -344,6 +355,7 @@
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this status in the moderation interface",
   "status.block": "Блокирај @{name}",
+  "status.bookmark": "Bookmark",
   "status.cancel_reblog_private": "Уклони подршку",
   "status.cannot_reblog": "Овај статус не може да се подржи",
   "status.copy": "Copy link to status",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} подржао/ла",
   "status.reblogs.empty": "Још увек нико није подржао ову трубу. Када буде подржана, појавиће се овде.",
   "status.redraft": "Избриши и преправи",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Одговори",
   "status.replyAll": "Одговори на дискусију",
   "status.report": "Пријави корисника @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Додај мултимедију (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Опишите за особе са оштећеним видом",
   "upload_form.edit": "Edit",
   "upload_form.undo": "Обриши",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
   "upload_modal.analyzing_picture": "Analyzing picture…",
   "upload_modal.apply": "Apply",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Отпремам...",
   "video.close": "Затвори видео",
+  "video.download": "Download file",
   "video.exit_fullscreen": "Напусти цео екран",
   "video.expand": "Прошири видео",
   "video.fullscreen": "Цео екран",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 9b12f337b..4e778a481 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Lägg till i eller ta bort från listor",
   "account.badges.bot": "Robot",
+  "account.badges.group": "Grupp",
   "account.block": "Blockera @{name}",
   "account.block_domain": "Dölj allt från {domain}",
   "account.blocked": "Blockerad",
@@ -37,11 +38,12 @@
   "account.unendorse": "Visa inte på profil",
   "account.unfollow": "Sluta följ",
   "account.unmute": "Sluta tysta @{name}",
-  "account.unmute_notifications": "Återaktivera notifieringar från @{name}",
+  "account.unmute_notifications": "Återaktivera aviseringar från @{name}",
   "alert.rate_limited.message": "Vänligen försök igen efter {retry_time, time, medium}.",
   "alert.rate_limited.title": "Mängd begränsad",
   "alert.unexpected.message": "Ett oväntat fel uppstod.",
   "alert.unexpected.title": "Hoppsan!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per vecka",
   "boost_modal.combo": "Du kan trycka {combo} för att slippa detta nästa gång",
   "bundle_column_error.body": "Något gick fel medan denna komponent laddades.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Något gick fel när denna komponent laddades.",
   "bundle_modal_error.retry": "Försök igen",
   "column.blocks": "Blockerade användare",
+  "column.bookmarks": "Bokmärken",
   "column.community": "Lokal tidslinje",
   "column.direct": "Direktmeddelanden",
   "column.directory": "Bläddra bland profiler",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Varaktighet för omröstning",
   "compose_form.poll.option_placeholder": "Val {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Markera media som känsligt",
@@ -99,7 +104,7 @@
   "confirmations.delete_list.confirm": "Ta bort",
   "confirmations.delete_list.message": "Är du säker på att du vill radera denna lista permanent?",
   "confirmations.domain_block.confirm": "Dölj hela domänen",
-  "confirmations.domain_block.message": "Är du verkligen, verkligen säker på att du vill blockera hela {domain}? I de flesta fall är några riktade blockeringar eller nedtystade konton tillräckligt och att föredra. Du kommer inte se innehåll från den domänen i den allmänna tidslinjen eller i dina notifieringar. Dina följare från den domänen komer att tas bort.",
+  "confirmations.domain_block.message": "Är du verkligen, verkligen säker på att du vill blockera hela {domain}? I de flesta fall är några riktade blockeringar eller nedtystade konton tillräckligt och att föredra. Du kommer inte se innehåll från den domänen i den allmänna tidslinjen eller i dina aviseringar. Dina följare från den domänen komer att tas bort.",
   "confirmations.logout.confirm": "Logga ut",
   "confirmations.logout.message": "Är du säker på att du vill logga ut?",
   "confirmations.mute.confirm": "Tysta",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Inga inlägg här!",
   "empty_column.account_unavailable": "Profilen ej tillgänglig",
   "empty_column.blocks": "Du har ännu ej blockerat några användare.",
+  "empty_column.bookmarked_statuses": "Du har inte bokmärkt några tutar än. När du gör ett bokmärke kommer det synas här.",
   "empty_column.community": "Den lokala tidslinjen är tom. Skriv något offentligt för att sätta bollen i rullning!",
   "empty_column.direct": "Du har inga direktmeddelanden än. När du skickar eller tar emot ett kommer det att visas här.",
   "empty_column.domain_blocks": "Det finns ännu inga dolda domäner.",
@@ -164,7 +170,7 @@
   "getting_started.heading": "Kom igång",
   "getting_started.invite": "Skicka inbjudningar",
   "getting_started.open_source_notice": "Mastodon är programvara med öppen källkod. Du kan bidra eller rapportera problem via GitHub på {github}.",
-  "getting_started.security": "Säkerhet",
+  "getting_started.security": "Kontoinställningar",
   "getting_started.terms": "Användarvillkor",
   "hashtag.column_header.tag_mode.all": "och {additional}",
   "hashtag.column_header.tag_mode.any": "eller {additional}",
@@ -179,8 +185,8 @@
   "home.column_settings.show_reblogs": "Visa knuffar",
   "home.column_settings.show_replies": "Visa svar",
   "intervals.full.days": "{number, plural, one {# dag} other {# dagar}}",
-  "intervals.full.hours": "{hours, plural, one {# timme} other {# timmar}}",
-  "intervals.full.minutes": "{minutes, plural, one {1 minut} other {# minuter}}",
+  "intervals.full.hours": "{number, plural, one {# timme} other {# timmar}}",
+  "intervals.full.minutes": "{number, plural, one {# minut} other {# minuter}}",
   "introduction.federation.action": "Nästa",
   "introduction.federation.federated.headline": "Federerad",
   "introduction.federation.federated.text": "Publika inlägg från andra servrar i servernätverket visas i den förenade tidslinjen.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "för att öppna listan över tystade användare",
   "keyboard_shortcuts.my_profile": "för att öppna din profil",
   "keyboard_shortcuts.notifications": "för att öppna Meddelanden",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "för att öppna Nålade toots",
   "keyboard_shortcuts.profile": "för att öppna skaparens profil",
   "keyboard_shortcuts.reply": "för att svara",
@@ -248,9 +255,10 @@
   "media_gallery.toggle_visible": "Växla synlighet",
   "missing_indicator.label": "Hittades inte",
   "missing_indicator.sublabel": "Den här resursen kunde inte hittas",
-  "mute_modal.hide_notifications": "Dölj notifikationer från denna användare?",
+  "mute_modal.hide_notifications": "Dölj aviseringar från denna användare?",
   "navigation_bar.apps": "Mobilappar",
   "navigation_bar.blocks": "Blockerade användare",
+  "navigation_bar.bookmarks": "Bokmärken",
   "navigation_bar.community_timeline": "Lokal tidslinje",
   "navigation_bar.compose": "Författa ny toot",
   "navigation_bar.direct": "Direktmeddelanden",
@@ -273,20 +281,23 @@
   "navigation_bar.security": "Säkerhet",
   "notification.favourite": "{name} favoriserade din status",
   "notification.follow": "{name} följer dig",
+  "notification.follow_request": "{name} har begärt att följa dig",
   "notification.mention": "{name} nämnde dig",
+  "notification.own_poll": "Din röstning har avslutats",
   "notification.poll": "En omröstning du röstat i har avslutats",
   "notification.reblog": "{name} knuffade din status",
-  "notifications.clear": "Rensa meddelanden",
-  "notifications.clear_confirmation": "Är du säker på att du vill radera alla dina meddelanden permanent?",
-  "notifications.column_settings.alert": "Skrivbordsmeddelanden",
+  "notifications.clear": "Rensa aviseringar",
+  "notifications.clear_confirmation": "Är du säker på att du vill rensa alla dina aviseringar permanent?",
+  "notifications.column_settings.alert": "Skrivbordsaviseringar",
   "notifications.column_settings.favourite": "Favoriter:",
   "notifications.column_settings.filter_bar.advanced": "Visa alla kategorier",
   "notifications.column_settings.filter_bar.category": "Snabbfilter",
   "notifications.column_settings.filter_bar.show": "Visa",
   "notifications.column_settings.follow": "Nya följare:",
+  "notifications.column_settings.follow_request": "Ny följ-förfrågan:",
   "notifications.column_settings.mention": "Omnämningar:",
   "notifications.column_settings.poll": "Omröstningsresultat:",
-  "notifications.column_settings.push": "Push meddelanden",
+  "notifications.column_settings.push": "Push-aviseringar",
   "notifications.column_settings.reblog": "Knuffar:",
   "notifications.column_settings.show": "Visa i kolumnen",
   "notifications.column_settings.sound": "Spela upp ljud",
@@ -344,6 +355,7 @@
   "status.admin_account": "Öppet modereringsgränssnitt för @{name}",
   "status.admin_status": "Öppna denna status i modereringsgränssnittet",
   "status.block": "Blockera @{name}",
+  "status.bookmark": "Bokmärk",
   "status.cancel_reblog_private": "Ta bort knuff",
   "status.cannot_reblog": "Detta inlägg kan inte knuffas",
   "status.copy": "Kopiera länk till status",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} knuffade",
   "status.reblogs.empty": "Ingen har favoriserat den här tutningen än. När någon gör det kommer den att synas här.",
   "status.redraft": "Radera & gör om",
+  "status.remove_bookmark": "Ta bort bokmärke",
   "status.reply": "Svara",
   "status.replyAll": "Svara på tråden",
   "status.report": "Rapportera @{name}",
@@ -386,7 +399,7 @@
   "tabs_bar.federated_timeline": "Förenad",
   "tabs_bar.home": "Hem",
   "tabs_bar.local_timeline": "Lokal",
-  "tabs_bar.notifications": "Meddelanden",
+  "tabs_bar.notifications": "Aviseringar",
   "tabs_bar.search": "Sök",
   "time_remaining.days": "{number, plural, one {# dag} other {# dagar}} kvar",
   "time_remaining.hours": "{hours, plural, one {# timme} other {# timmar}} kvar",
@@ -400,9 +413,11 @@
   "upload_button.label": "Lägg till media",
   "upload_error.limit": "Filöverföringsgränsen överskriden.",
   "upload_error.poll": "Filuppladdning tillåts inte med omröstningar.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Beskriv för synskadade",
   "upload_form.edit": "Redigera",
   "upload_form.undo": "Ta bort",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
   "upload_modal.analyzing_picture": "Analyserar bild…",
   "upload_modal.apply": "Verkställ",
   "upload_modal.description_placeholder": "En snabb brun räv hoppar över den lata hunden",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Förhandstitt ({ratio})",
   "upload_progress.label": "Laddar upp...",
   "video.close": "Stäng video",
+  "video.download": "Ladda ner fil",
   "video.exit_fullscreen": "Stäng helskärm",
   "video.expand": "Expandera video",
   "video.fullscreen": "Helskärm",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 9be141523..8d1a8f14d 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -1,16 +1,17 @@
 {
-  "account.add_or_remove_from_list": "பட்டியல்களில் இருந்து சேர் அல்லது நீக்குக",
+  "account.add_or_remove_from_list": "பட்டியல்களில் சேர்/நீக்கு",
   "account.badges.bot": "பாட்",
+  "account.badges.group": "குழு",
   "account.block": "@{name} -ஐத் தடு",
   "account.block_domain": "{domain} யில் இருந்து வரும் எல்லாவற்றையும் மறை",
   "account.blocked": "முடக்கப்பட்டது",
-  "account.cancel_follow_request": "பின்தொடரும் முடிவைக் கைவிடவும்",
+  "account.cancel_follow_request": "பின்தொடரும் கோரிக்கையை நிராகரி",
   "account.direct": "நேரடி செய்தி @{name}",
   "account.domain_blocked": "மறைக்கப்பட்டத் தளங்கள்",
   "account.edit_profile": "சுயவிவரத்தை மாற்று",
   "account.endorse": "சுயவிவரத்தில் வெளிப்படுத்து",
   "account.follow": "பின்தொடர்",
-  "account.followers": "பின்பற்றுபவர்கள்",
+  "account.followers": "பின்தொடர்பவர்கள்",
   "account.followers.empty": "இதுவரை யாரும் இந்த பயனரைப் பின்தொடரவில்லை.",
   "account.follows": "பின்தொடர்",
   "account.follows.empty": "இந்த பயனர் இதுவரை யாரையும் பின்தொடரவில்லை.",
@@ -18,7 +19,7 @@
   "account.hide_reblogs": "இருந்து ஊக்கியாக மறை @{name}",
   "account.last_status": "கடைசி செயல்பாடு",
   "account.link_verified_on": "இந்த இணைப்பை உரிமையாளர் சரிபார்க்கப்பட்டது {date}",
-  "account.locked_info": "இந்த கணக்கின் தனியுரிமை நிலை பூட்டப்படவுள்ளது. உரிமையாளர் தன்னை யார் பின்தொடரலாம் என்பதை தானே முடிவு செய்வார்.",
+  "account.locked_info": "இந்தக் கணக்கு தனியுரிமை நிலை பூட்டப்பட்டுள்ளது. அவர்களைப் பின்தொடர்பவர் யார் என்பதை உரிமையாளர் கைமுறையாக மதிப்பாய்வு செய்கிறார்.",
   "account.media": "ஊடகங்கள்",
   "account.mention": "குறிப்பிடு @{name}",
   "account.moved_to": "{name} நகர்த்தப்பட்டது:",
@@ -29,37 +30,39 @@
   "account.posts": "டூட்டுகள்",
   "account.posts_with_replies": "Toots மற்றும் பதில்கள்",
   "account.report": "@{name} -ஐப் புகாரளி",
-  "account.requested": "ஒப்புதலுக்காக காத்திருக்கிறது. கோரிக்கையை ரத்துசெய்ய கிளிக் செய்க",
+  "account.requested": "ஒப்புதலுக்காகக் காத்திருக்கிறது. பின்தொடரும் கோரிக்கையை நீக்க அழுத்தவும்",
   "account.share": "@{name} உடைய விவரத்தை பகிர்",
   "account.show_reblogs": "காட்டு boosts இருந்து @{name}",
-  "account.unblock": "விடுவி @{name}",
-  "account.unblock_domain": "காண்பி {domain}",
-  "account.unendorse": "சுயவிவரத்தில் அம்சம் இல்லை",
-  "account.unfollow": "பின்தொடராட்",
-  "account.unmute": "தடுப்புநீக்கு @{name}",
-  "account.unmute_notifications": "அறிவிப்புகளை அகற்றவும் @{name}",
-  "alert.rate_limited.message": "{retry_time, time, medium} மணிக்குப் பிறகு மீண்டும் முயற்சிக்கவும்.",
-  "alert.rate_limited.title": "விகித அளவுக்கு உட்படுத்தப்பட்டது",
+  "account.unblock": "@{name} மீது தடை நீக்குக",
+  "account.unblock_domain": "{domain} ஐ காண்பி",
+  "account.unendorse": "சுயவிவரத்தில் இடம்பெற வேண்டாம்",
+  "account.unfollow": "பின்தொடர்வதை நிறுத்துக",
+  "account.unmute": "@{name} இன் மீது மௌனத் தடையை நீக்குக",
+  "account.unmute_notifications": "@{name} இலிருந்து அறிவிப்புகளின் மீது மௌனத் தடையை நீக்குக",
+  "alert.rate_limited.message": "{retry_time, time, medium} க்கு பிறகு மீண்டும் முயற்சிக்கவும்.",
+  "alert.rate_limited.title": "விகிதம் வரையறுக்கப்பட்டுள்ளது",
   "alert.unexpected.message": "எதிர்பாராத பிழை ஏற்பட்டுவிட்டது.",
   "alert.unexpected.title": "அச்சச்சோ!",
-  "autosuggest_hashtag.per_week": "வாரத்திற்கு {count}",
+  "announcement.announcement": "Announcement",
+  "autosuggest_hashtag.per_week": "ஒவ்வொரு வாரம் {count}",
   "boost_modal.combo": "நீங்கள் இதை அடுத்தமுறை தவிர்க்க {combo} வை அழுத்தவும்",
-  "bundle_column_error.body": "இந்த பகுதி கூறை ஏற்றம் செய்யும் பொது ஏதோ தவறு ஏற்பட்டுள்ளது.",
-  "bundle_column_error.retry": "மீண்டும் முயற்சி செய்",
+  "bundle_column_error.body": "இக்கூற்றை ஏற்றம் செய்யும்பொழுது ஏதோ தவறு ஏற்பட்டுள்ளது.",
+  "bundle_column_error.retry": "மீண்டும் முயல்க",
   "bundle_column_error.title": "பிணையப் பிழை",
-  "bundle_modal_error.close": "நெருக்கமாக",
-  "bundle_modal_error.message": "இந்த கூறுகளை ஏற்றும்போது ஏதோ தவறு ஏற்பட்டது.",
+  "bundle_modal_error.close": "மூடுக",
+  "bundle_modal_error.message": "இக்கூற்றை ஏற்றம் செய்யும்பொழுது ஏதோ தவறு ஏற்பட்டுள்ளது.",
   "bundle_modal_error.retry": "மீண்டும் முயற்சி செய்",
   "column.blocks": "தடுக்கப்பட்ட பயனர்கள்",
-  "column.community": "உள்ளூர் காலக்கெடு",
-  "column.direct": "நேரடி செய்திகள்",
+  "column.bookmarks": "Bookmarks",
+  "column.community": "சுய நிகழ்வு காலவரிசை",
+  "column.direct": "நேர் சேதிகள்",
   "column.directory": "சுயவிவரங்களை உலாவு",
-  "column.domain_blocks": "மறைந்த களங்கள்",
-  "column.favourites": "விருப்பத்துக்குகந்த",
-  "column.follow_requests": "கோரிக்கைகளை பின்பற்றவும்",
-  "column.home": "முதற்பக்கம்",
-  "column.lists": "குதிரை வீர்ர்கள்",
-  "column.mutes": "முடக்கப்பட்ட பயனர்கள்",
+  "column.domain_blocks": "மறைந்திருக்கும் திரளங்கள்",
+  "column.favourites": "பிடித்தவைகள்",
+  "column.follow_requests": "பின்தொடர அனுமதிகள்",
+  "column.home": "முகப்பு",
+  "column.lists": "பட்டியல்கள்",
+  "column.mutes": "மௌனத் தடை செய்யப்பட்ட பயனர்கள்",
   "column.notifications": "அறிவிப்புகள்",
   "column.pins": "Pinned toot",
   "column.public": "கூட்டாட்சி காலக்கெடு",
@@ -71,7 +74,7 @@
   "column_header.show_settings": "அமைப்புகளைக் காட்டு",
   "column_header.unpin": "பொருத்தப்படாத",
   "column_subheading.settings": "அமைப்புகள்",
-  "community.column_settings.media_only": "மீடியா மட்டுமே",
+  "community.column_settings.media_only": "படங்கள் மட்டுமே",
   "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
   "compose_form.direct_message_warning_learn_more": "மேலும் அறிக",
   "compose_form.hashtag_warning": "இந்த toot பட்டியலிடப்படாதது போல எந்த ஹேஸ்டேக்கின் கீழ் பட்டியலிடப்படாது. ஹேஸ்டேக் மூலம் பொது டோட்டல்கள் மட்டுமே தேட முடியும்.",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "வாக்கெடுப்பு காலம்",
   "compose_form.poll.option_placeholder": "தேர்ந்தெடுப்ப {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "அனைவருக்கும் ஏற்ற ஊடகம் இல்லை எனக் குறியிடுக",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "இல்லை toots இங்கே!",
   "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.direct": "உங்களிடம் நேரடியான செய்திகள் எதுவும் இல்லை. நீங்கள் ஒன்றை அனுப்பி அல்லது பெறும் போது, அது இங்கே காண்பிக்கும்.",
   "empty_column.domain_blocks": "இன்னும் மறைந்த களங்கள் இல்லை.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "முடக்கப்பட்ட பயனர்களின் பட்டியலைத் திறக்க",
   "keyboard_shortcuts.my_profile": "உங்கள் சுயவிவரத்தை திறக்க",
   "keyboard_shortcuts.notifications": "அறிவிப்பு நெடுவரிசையைத் திறக்க",
+  "keyboard_shortcuts.open_media": "படத்தைத் திறக்க‌",
   "keyboard_shortcuts.pinned": "திறக்க பொருத்தப்பட்டன toots பட்டியல்",
   "keyboard_shortcuts.profile": "ஆசிரியரின் சுயவிவரத்தைத் திறக்க",
   "keyboard_shortcuts.reply": "பதிலளிக்க",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "இந்த பயனரின் அறிவிப்புகளை மறைக்கவா?",
   "navigation_bar.apps": "மொபைல் பயன்பாடுகள்",
   "navigation_bar.blocks": "தடுக்கப்பட்ட பயனர்கள்",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "உள்ளூர் காலக்கெடு",
   "navigation_bar.compose": "புதியவற்றை எழுதுக toot",
   "navigation_bar.direct": "நேரடி செய்திகள்",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "பத்திரம்",
   "notification.favourite": "{name} ஆர்வம் கொண்டவர், உங்கள் நிலை",
   "notification.follow": "{name} உங்களைப் பின்தொடர்கிறார்",
+  "notification.follow_request": "{name} உங்களைப் பின்தொடரக் கோருகிறார்",
   "notification.mention": "{name} நீங்கள் குறிப்பிட்டுள்ளீர்கள்",
+  "notification.own_poll": "கருத்துக்கணிப்பு நிறைவடைந்தது",
   "notification.poll": "நீங்கள் வாக்களித்த வாக்கெடுப்பு முடிவடைந்தது",
   "notification.reblog": "{name} உங்கள் நிலை அதிகரித்தது",
   "notifications.clear": "அறிவிப்புகளை அழிக்கவும்",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "விரைவு வடிகட்டி பட்டை",
   "notifications.column_settings.filter_bar.show": "காட்டு",
   "notifications.column_settings.follow": "புதிய பின்பற்றுபவர்கள்:",
+  "notifications.column_settings.follow_request": "புதிய பின்தொடர் கோரிக்கைகள்:",
   "notifications.column_settings.mention": "குறிப்பிடுகிறது:",
   "notifications.column_settings.poll": "கருத்துக்கணிப்பு முடிவுகள்:",
   "notifications.column_settings.push": "தள் அறிவிப்புகள்",
@@ -344,6 +355,7 @@
   "status.admin_account": "மிதமான இடைமுகத்தை திறக்க @{name}",
   "status.admin_status": "மிதமான இடைமுகத்தில் இந்த நிலையை திறக்கவும்",
   "status.block": "@{name} -ஐத் தடு",
+  "status.bookmark": "அடையாளம் குறி",
   "status.cancel_reblog_private": "இல்லை பூஸ்ட்",
   "status.cannot_reblog": "இந்த இடுகை அதிகரிக்க முடியாது",
   "status.copy": "நிலைக்கு இணைப்பை நகலெடு",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} மதிப்பை உயர்த்து",
   "status.reblogs.empty": "இதுவரை யாரும் இந்த மோதலை அதிகரிக்கவில்லை. யாராவது செய்தால், அவர்கள் இங்கே காண்பார்கள்.",
   "status.redraft": "நீக்கு மற்றும் மீண்டும் வரைவு",
+  "status.remove_bookmark": "அடையாளம் நீக்கு",
   "status.reply": "பதில்",
   "status.replyAll": "நூலுக்கு பதிலளிக்கவும்",
   "status.report": "@{name} மீது புகாரளி",
@@ -400,9 +413,11 @@
   "upload_button.label": "மீடியாவைச் சேர்க்கவும் (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "கோப்பு பதிவேற்ற வரம்பு மீறப்பட்டது.",
   "upload_error.poll": "கோப்பு பதிவேற்றம் அனுமதிக்கப்படவில்லை.",
+  "upload_form.audio_description": "செவித்திறன் குறைபாடு உள்ளவர்களுக்காக விளக்குக‌",
   "upload_form.description": "பார்வையற்ற விவரிக்கவும்",
   "upload_form.edit": "தொகு",
   "upload_form.undo": "நீக்கு",
+  "upload_form.video_description": "செவித்திறன் மற்றும் பார்வைக் குறைபாடு உள்ளவர்களுக்காக விளக்குக‌",
   "upload_modal.analyzing_picture": "படம் ஆராயப்படுகிறது…",
   "upload_modal.apply": "உபயோகி",
   "upload_modal.description_placeholder": "பொருள் விளக்கம்",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "முன்னோட்டம் ({ratio})",
   "upload_progress.label": "ஏற்றுகிறது ...",
   "video.close": "வீடியோவை மூடு",
+  "video.download": "கோப்பைப் பதிவிறக்கவும்",
   "video.exit_fullscreen": "முழு திரையில் இருந்து வெளியேறவும்",
   "video.expand": "வீடியோவை விரிவாக்கு",
   "video.fullscreen": "முழுத்திரை",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 3cfbc5786..8b47fec52 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "జాబితాల నుండి చేర్చు లేదా తీసివేయి",
   "account.badges.bot": "బాట్",
+  "account.badges.group": "Group",
   "account.block": "@{name} ను బ్లాక్ చేయి",
   "account.block_domain": "{domain} నుంచి అన్నీ దాచిపెట్టు",
   "account.blocked": "బ్లాక్ అయినవి",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "అనుకోని తప్పు జరిగినది.",
   "alert.unexpected.title": "అయ్యో!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "మీరు తదుపరిసారి దీనిని దాటవేయడానికి {combo} నొక్కవచ్చు",
   "bundle_column_error.body": "ఈ భాగం లోడ్ అవుతున్నప్పుడు ఏదో తప్పు జరిగింది.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "ఈ భాగం లోడ్ అవుతున్నప్పుడు ఏదో తప్పు జరిగింది.",
   "bundle_modal_error.retry": "మళ్ళీ ప్రయత్నించండి",
   "column.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు",
+  "column.bookmarks": "Bookmarks",
   "column.community": "స్థానిక కాలక్రమం",
   "column.direct": "ప్రత్యక్ష సందేశాలు",
   "column.directory": "Browse profiles",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "ఎన్నిక వ్యవధి",
   "compose_form.poll.option_placeholder": "ఎంపిక {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Mark media as sensitive",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "ఇక్కడ ఏ టూట్లూ లేవు!No toots here!",
   "empty_column.account_unavailable": "Profile 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.direct": "మీకు ఇంకా ఏ ప్రత్యక్ష సందేశాలు లేవు. మీరు ఒకదాన్ని పంపినప్పుడు లేదా స్వీకరించినప్పుడు, అది ఇక్కడ చూపబడుతుంది.",
   "empty_column.domain_blocks": "దాచబడిన డొమైన్లు ఇంకా ఏమీ లేవు.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "మ్యూట్ చేయబడిన వినియోగదారుల జాబితాను తెరవడానికి",
   "keyboard_shortcuts.my_profile": "మీ ప్రొఫైల్ను తెరవడానికి",
   "keyboard_shortcuts.notifications": "నోటిఫికేషన్ల నిలువు వరుసను తెరవడానికి",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "అతికించబడిన టూట్ల జాబితాను తెరవడానికి",
   "keyboard_shortcuts.profile": "రచయిత ప్రొఫైల్ ను తెరవాలంటే",
   "keyboard_shortcuts.reply": "ప్రత్యుత్తరం ఇవ్వడానికి",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "ఈ వినియోగదారు నుండి నోటిఫికేషన్లను దాచాలా?",
   "navigation_bar.apps": "మొబైల్ ఆప్ లు",
   "navigation_bar.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "స్థానిక కాలక్రమం",
   "navigation_bar.compose": "కొత్త టూట్ను రాయండి",
   "navigation_bar.direct": "ప్రత్యక్ష సందేశాలు",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "భద్రత",
   "notification.favourite": "{name} మీ స్టేటస్ ను ఇష్టపడ్డారు",
   "notification.follow": "{name} మిమ్మల్ని అనుసరిస్తున్నారు",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} మిమ్మల్ని ప్రస్తావించారు",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "మీరు పాల్గొనిన ఎన్సిక ముగిసినది",
   "notification.reblog": "{name} మీ స్టేటస్ ను బూస్ట్ చేసారు",
   "notifications.clear": "ప్రకటనలను తుడిచివేయు",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "క్విక్ ఫిల్టర్ బార్",
   "notifications.column_settings.filter_bar.show": "చూపించు",
   "notifications.column_settings.follow": "క్రొత్త అనుచరులు:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "ప్రస్తావనలు:",
   "notifications.column_settings.poll": "ఎన్నిక ఫలితాలు:",
   "notifications.column_settings.push": "పుష్ ప్రకటనలు",
@@ -344,6 +355,7 @@
   "status.admin_account": "@{name} కొరకు సమన్వయ వినిమయసీమను తెరువు",
   "status.admin_status": "సమన్వయ వినిమయసీమలో ఈ స్టేటస్ ను తెరవండి",
   "status.block": "@{name} ను బ్లాక్ చేయి",
+  "status.bookmark": "Bookmark",
   "status.cancel_reblog_private": "బూస్ట్ను తొలగించు",
   "status.cannot_reblog": "ఈ పోస్ట్ను బూస్ట్ చేయడం సాధ్యం కాదు",
   "status.copy": "లంకెను స్టేటస్కు కాపీ చేయి",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} బూస్ట్ చేసారు",
   "status.reblogs.empty": "ఈ టూట్ను ఇంకా ఎవరూ బూస్ట్ చేయలేదు. ఎవరైనా చేసినప్పుడు, అవి ఇక్కడ కనబడతాయి.",
   "status.redraft": "తొలగించు & తిరగరాయు",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "ప్రత్యుత్తరం",
   "status.replyAll": "సంభాషణకు ప్రత్యుత్తరం ఇవ్వండి",
   "status.report": "@{name}పై ఫిర్యాదుచేయు",
@@ -400,9 +413,11 @@
   "upload_button.label": "మీడియాను జోడించండి (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "దృష్టి లోపమున్న వారి కోసం వివరించండి",
   "upload_form.edit": "Edit",
   "upload_form.undo": "తొలగించు",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
   "upload_modal.analyzing_picture": "Analyzing picture…",
   "upload_modal.apply": "Apply",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "అప్లోడ్ అవుతోంది...",
   "video.close": "వీడియోని మూసివేయి",
+  "video.download": "Download file",
   "video.exit_fullscreen": "పూర్తి స్క్రీన్ నుండి నిష్క్రమించు",
   "video.expand": "వీడియోను విస్తరించండి",
   "video.fullscreen": "పూర్తి స్క్రీన్",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 7db168338..2d009b851 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -1,9 +1,10 @@
 {
   "account.add_or_remove_from_list": "เพิ่มหรือเอาออกจากรายการ",
   "account.badges.bot": "บอต",
-  "account.block": "บล็อค @{name}",
+  "account.badges.group": "กลุ่ม",
+  "account.block": "ปิดกั้น @{name}",
   "account.block_domain": "ซ่อนทุกอย่างจาก {domain}",
-  "account.blocked": "ถูกบล็อค",
+  "account.blocked": "ปิดกั้นอยู่",
   "account.cancel_follow_request": "ยกเลิกคำขอติดตาม",
   "account.direct": "ส่งข้อความโดยตรงถึง @{name}",
   "account.domain_blocked": "ซ่อนโดเมนอยู่",
@@ -39,9 +40,10 @@
   "account.unmute": "เลิกปิดเสียง @{name}",
   "account.unmute_notifications": "เลิกปิดเสียงการแจ้งเตือนจาก @{name}",
   "alert.rate_limited.message": "โปรดลองใหม่หลังจาก {retry_time, time, medium}",
-  "alert.rate_limited.title": "เข้าใช้งานบ่อยเกินไป",
+  "alert.rate_limited.title": "มีการจำกัดอัตรา",
   "alert.unexpected.message": "เกิดข้อผิดพลาดที่ไม่คาดคิด",
   "alert.unexpected.title": "อุปส์!",
+  "announcement.announcement": "ประกาศ",
   "autosuggest_hashtag.per_week": "{count} ต่อสัปดาห์",
   "boost_modal.combo": "คุณสามารถกด {combo} เพื่อข้ามสิ่งนี้ในครั้งถัดไป",
   "bundle_column_error.body": "มีบางอย่างผิดพลาดขณะโหลดส่วนประกอบนี้",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "มีบางอย่างผิดพลาดขณะโหลดส่วนประกอบนี้",
   "bundle_modal_error.retry": "ลองอีกครั้ง",
   "column.blocks": "ผู้ใช้ที่ปิดกั้นอยู่",
+  "column.bookmarks": "ที่คั่นหน้า",
   "column.community": "เส้นเวลาในเว็บ",
   "column.direct": "ข้อความโดยตรง",
   "column.directory": "เรียกดูโปรไฟล์",
@@ -79,9 +82,11 @@
   "compose_form.lock_disclaimer.lock": "ล็อคอยู่",
   "compose_form.placeholder": "คุณกำลังคิดอะไรอยู่?",
   "compose_form.poll.add_option": "เพิ่มทางเลือก",
-  "compose_form.poll.duration": "ระยะเวลาโพล",
+  "compose_form.poll.duration": "ระยะเวลาการสำรวจความคิดเห็น",
   "compose_form.poll.option_placeholder": "ทางเลือก {number}",
   "compose_form.poll.remove_option": "เอาทางเลือกนี้ออก",
+  "compose_form.poll.switch_to_multiple": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตหลายทางเลือก",
+  "compose_form.poll.switch_to_single": "เปลี่ยนการสำรวจความคิดเห็นเป็นอนุญาตทางเลือกเดี่ยว",
   "compose_form.publish": "โพสต์",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "ทำเครื่องหมายสื่อว่าละเอียดอ่อน",
@@ -99,11 +104,11 @@
   "confirmations.delete_list.confirm": "ลบ",
   "confirmations.delete_list.message": "คุณแน่ใจหรือไม่ว่าต้องการลบรายการนี้อย่างถาวร?",
   "confirmations.domain_block.confirm": "ซ่อนทั้งโดเมน",
-  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",
+  "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": "คุณแน่ใจหรือไม่ว่าต้องการลบสถานะนี้แล้วร่างใหม่? รายการโปรดและการดันจะหายไป และการตอบกลับโพสต์ดั้งเดิมจะไม่มีความเกี่ยวพัน",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "ไม่มีโพสต์ที่นี่!",
   "empty_column.account_unavailable": "ไม่มีโปรไฟล์",
   "empty_column.blocks": "คุณยังไม่ได้ปิดกั้นผู้ใช้ใด ๆ",
+  "empty_column.bookmarked_statuses": "คุณยังไม่มีโพสต์ที่เพิ่มที่คั่นหน้าไว้ใด ๆ เมื่อคุณเพิ่มที่คั่นหน้าโพสต์ โพสต์จะปรากฏที่นี่",
   "empty_column.community": "เส้นเวลาในเว็บว่างเปล่า เขียนบางอย่างเป็นสาธารณะเพื่อเริ่มต้น!",
   "empty_column.direct": "คุณยังไม่มีข้อความโดยตรงใด ๆ เมื่อคุณส่งหรือรับข้อความ ข้อความจะปรากฏที่นี่",
   "empty_column.domain_blocks": "ยังไม่มีโดเมนที่ซ่อนอยู่",
@@ -152,8 +158,8 @@
   "empty_column.mutes": "คุณยังไม่ได้ปิดเสียงผู้ใช้ใด ๆ",
   "empty_column.notifications": "คุณยังไม่มีการแจ้งเตือนใด ๆ โต้ตอบกับผู้อื่นเพื่อเริ่มการสนทนา",
   "empty_column.public": "ไม่มีสิ่งใดที่นี่! เขียนบางอย่างเป็นสาธารณะ หรือติดตามผู้ใช้จากเซิร์ฟเวอร์อื่น ๆ ด้วยตนเองเพื่อเติมให้เต็ม",
-  "error.unexpected_crash.explanation": "หน้านี้ไม่สามารถแสดงผลได้อย่างถูกต้อง เนื่องจากบั๊กในโค้ดของเราหรือปัญหาความเข้ากับได้กับเบราเซอร์",
-  "error.unexpected_crash.next_steps": "ลองรีเฟรชหน้านี้ หากไม่สามารถช่วยได้ คุณอาจจะยังคงใช้ Mastodon ผ่านเบราเซอร์อื่นหรือผ่านแอปได้",
+  "error.unexpected_crash.explanation": "เนื่องจากข้อบกพร่องในโค้ดของเราหรือปัญหาความเข้ากันได้ของเบราว์เซอร์ จึงไม่สามารถแสดงหน้านี้ได้อย่างถูกต้อง",
+  "error.unexpected_crash.next_steps": "ลองรีเฟรชหน้า หากนั่นไม่ช่วย คุณอาจยังสามารถใช้ Mastodon ผ่านเบราว์เซอร์อื่นหรือแอป",
   "errors.unexpected_crash.copy_stacktrace": "คัดลอกการติดตามสแตกไปยังคลิปบอร์ด",
   "errors.unexpected_crash.report_issue": "รายงานปัญหา",
   "follow_request.authorize": "อนุญาต",
@@ -164,7 +170,7 @@
   "getting_started.heading": "เริ่มต้นใช้งาน",
   "getting_started.invite": "เชิญผู้คน",
   "getting_started.open_source_notice": "Mastodon เป็นซอฟต์แวร์เปิดต้นฉบับ คุณสามารถมีส่วนร่วมหรือรายงานปัญหาที่ GitHub ที่ {github}",
-  "getting_started.security": "ความปลอดภัย",
+  "getting_started.security": "การตั้งค่าบัญชี",
   "getting_started.terms": "เงื่อนไขการให้บริการ",
   "hashtag.column_header.tag_mode.all": "และ {additional}",
   "hashtag.column_header.tag_mode.any": "หรือ {additional}",
@@ -190,14 +196,14 @@
   "introduction.federation.local.text": "โพสต์สาธารณะจากผู้คนในเซิร์ฟเวอร์เดียวกันกับคุณจะปรากฏในเส้นเวลาในเว็บ",
   "introduction.interactions.action": "เสร็จสิ้นบทช่วยสอน!",
   "introduction.interactions.favourite.headline": "ชื่นชอบ",
-  "introduction.interactions.favourite.text": "คุณสามารถบันทึกโพสต์เพื่ออ่านทีหลัง และแจ้งให้ผู้เขียนโพสต์ทราบว่าคุณชอบโพสต์นั้นโดยการชื่นชอบโพสต์",
+  "introduction.interactions.favourite.text": "คุณสามารถบันทึกโพสต์ไว้ในภายหลังและแจ้งให้ผู้สร้างทราบว่าคุณชอบโพสต์โดยการชื่นชอบโพสต์",
   "introduction.interactions.reblog.headline": "ดัน",
-  "introduction.interactions.reblog.text": "คุณสามารถแชร์โพสต์ของผู้อื่นให้กับผู้ติดตามของคุณได้โดยการดันโพสต์",
+  "introduction.interactions.reblog.text": "คุณสามารถแบ่งปันโพสต์ของผู้อื่นกับผู้ติดตามของคุณโดยการดันโพสต์",
   "introduction.interactions.reply.headline": "ตอบกลับ",
-  "introduction.interactions.reply.text": "คุณสามารถตอบกลับโพสต์ของผู้อื่นและโพสต์ของคุณได้ ซึ่งจะถูกรวมเข้าด้วยกันเป็นบทสนทนา",
+  "introduction.interactions.reply.text": "คุณสามารถตอบกลับโพสต์ของผู้อื่นและของคุณเอง ซึ่งจะเชื่อมโยงโพสต์เข้าด้วยกันในการสนทนา",
   "introduction.welcome.action": "ไปกันเลย!",
   "introduction.welcome.headline": "ขั้นตอนแรก",
-  "introduction.welcome.text": "ยินดีต้อนรับสู่เฟดิเวิร์ส! ในอีกสักครู่คุณจะได้เผยแพร่ข้อความและคุยกับเพื่อนของคุณในหลากหลายเซิร์ฟเวอร์ แต่เซิร์ฟเวอร์ {domain} นี้มีความพิเศษ เพราะเป็นที่ที่โปรไฟล์ของคุณตั้งอยู่ จำชื่อไว้ด้วยนะ",
+  "introduction.welcome.text": "ยินดีต้อนรับสู่เฟดิเวิร์ส! ในอีกสักครู่ คุณจะสามารถออกอากาศข้อความและพูดคุยกับเพื่อน ๆ ของคุณผ่านเซิร์ฟเวอร์ที่หลากหลาย แต่เซิร์ฟเวอร์นี้ {domain} มีความพิเศษคือเป็นเซิร์ฟเวอร์ที่โฮสต์โปรไฟล์ของคุณ ดังนั้นจดจำชื่อของเซิร์ฟเวอร์ไว้",
   "keyboard_shortcuts.back": "เพื่อนำทางย้อนกลับ",
   "keyboard_shortcuts.blocked": "เพื่อเปิดรายการผู้ใช้ที่ปิดกั้นอยู่",
   "keyboard_shortcuts.boost": "เพื่อดัน",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "เพื่อเปิดรายการผู้ใช้ที่ปิดเสียงอยู่",
   "keyboard_shortcuts.my_profile": "เพื่อเปิดโปรไฟล์ของคุณ",
   "keyboard_shortcuts.notifications": "เพื่อเปิดคอลัมน์การแจ้งเตือน",
+  "keyboard_shortcuts.open_media": "เพื่อเปิดสื่อ",
   "keyboard_shortcuts.pinned": "เพื่อเปิดรายการโพสต์ที่ปักหมุด",
   "keyboard_shortcuts.profile": "เพื่อเปิดโปรไฟล์ของผู้สร้าง",
   "keyboard_shortcuts.reply": "เพื่อตอบกลับ",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "ซ่อนการแจ้งเตือนจากผู้ใช้นี้?",
   "navigation_bar.apps": "แอปมือถือ",
   "navigation_bar.blocks": "ผู้ใช้ที่ปิดกั้นอยู่",
+  "navigation_bar.bookmarks": "ที่คั่นหน้า",
   "navigation_bar.community_timeline": "เส้นเวลาในเว็บ",
   "navigation_bar.compose": "เขียนโพสต์ใหม่",
   "navigation_bar.direct": "ข้อความโดยตรง",
@@ -273,8 +281,10 @@
   "navigation_bar.security": "ความปลอดภัย",
   "notification.favourite": "{name} ได้ชื่นชอบสถานะของคุณ",
   "notification.follow": "{name} ได้ติดตามคุณ",
+  "notification.follow_request": "{name} ได้ขอติดตามคุณ",
   "notification.mention": "{name} ได้กล่าวถึงคุณ",
-  "notification.poll": "โพลที่คุณได้ลงคะแนนได้สิ้นสุดแล้ว",
+  "notification.own_poll": "การสำรวจความคิดเห็นของคุณได้สิ้นสุดแล้ว",
+  "notification.poll": "การสำรวจความคิดเห็นที่คุณได้ลงคะแนนได้สิ้นสุดแล้ว",
   "notification.reblog": "{name} ได้ดันสถานะของคุณ",
   "notifications.clear": "ล้างการแจ้งเตือน",
   "notifications.clear_confirmation": "คุณแน่ใจหรือไม่ว่าต้องการล้างการแจ้งเตือนทั้งหมดของคุณอย่างถาวร?",
@@ -284,8 +294,9 @@
   "notifications.column_settings.filter_bar.category": "แถบตัวกรองด่วน",
   "notifications.column_settings.filter_bar.show": "แสดง",
   "notifications.column_settings.follow": "ผู้ติดตามใหม่:",
+  "notifications.column_settings.follow_request": "คำขอติดตามใหม่:",
   "notifications.column_settings.mention": "การกล่าวถึง:",
-  "notifications.column_settings.poll": "ผลลัพธ์โพล:",
+  "notifications.column_settings.poll": "ผลลัพธ์การสำรวจความคิดเห็น:",
   "notifications.column_settings.push": "การแจ้งเตือนแบบผลัก",
   "notifications.column_settings.reblog": "การดัน:",
   "notifications.column_settings.show": "แสดงในคอลัมน์",
@@ -295,7 +306,7 @@
   "notifications.filter.favourites": "รายการโปรด",
   "notifications.filter.follows": "การติดตาม",
   "notifications.filter.mentions": "การกล่าวถึง",
-  "notifications.filter.polls": "ผลลัพธ์โพล",
+  "notifications.filter.polls": "ผลลัพธ์การสำรวจความคิดเห็น",
   "notifications.group": "{count} การแจ้งเตือน",
   "poll.closed": "ปิดแล้ว",
   "poll.refresh": "รีเฟรช",
@@ -303,8 +314,8 @@
   "poll.total_votes": "{count, plural, other {# การลงคะแนน}}",
   "poll.vote": "ลงคะแนน",
   "poll.voted": "คุณได้ลงคะแนนให้กับคำตอบนี้",
-  "poll_button.add_poll": "เพิ่มโพล",
-  "poll_button.remove_poll": "เอาโพลออก",
+  "poll_button.add_poll": "เพิ่มการสำรวจความคิดเห็น",
+  "poll_button.remove_poll": "เอาการสำรวจความคิดเห็นออก",
   "privacy.change": "ปรับเปลี่ยนความเป็นส่วนตัวของสถานะ",
   "privacy.direct.long": "โพสต์ไปยังผู้ใช้ที่กล่าวถึงเท่านั้น",
   "privacy.direct.short": "โดยตรง",
@@ -339,11 +350,12 @@
   "search_results.accounts": "ผู้คน",
   "search_results.hashtags": "แฮชแท็ก",
   "search_results.statuses": "โพสต์",
-  "search_results.statuses_fts_disabled": "การค้นหาเนื้อหาในโพสต์ถูกปิดบนเซิร์ฟเวอร์ Mastodon นี้",
+  "search_results.statuses_fts_disabled": "ไม่มีการเปิดใช้งานการค้นหาโพสต์โดยเนื้อหาของโพสต์ในเซิร์ฟเวอร์ Mastodon นี้",
   "search_results.total": "{count, number} {count, plural, other {ผลลัพธ์}}",
   "status.admin_account": "เปิดส่วนติดต่อการควบคุมสำหรับ @{name}",
   "status.admin_status": "เปิดสถานะนี้ในส่วนติดต่อการควบคุม",
   "status.block": "ปิดกั้น @{name}",
+  "status.bookmark": "เพิ่มที่คั่นหน้า",
   "status.cancel_reblog_private": "เลิกดัน",
   "status.cannot_reblog": "ไม่สามารถดันโพสต์นี้",
   "status.copy": "คัดลอกลิงก์ไปยังสถานะ",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} ได้ดัน",
   "status.reblogs.empty": "ยังไม่มีใครดันโพสต์นี้ เมื่อใครสักคนดัน เขาจะปรากฏที่นี่",
   "status.redraft": "ลบแล้วร่างใหม่",
+  "status.remove_bookmark": "เอาที่คั่นหน้าออก",
   "status.reply": "ตอบกลับ",
   "status.replyAll": "ตอบกลับกระทู้",
   "status.report": "รายงาน @{name}",
@@ -378,7 +391,7 @@
   "status.show_more": "แสดงเพิ่มเติม",
   "status.show_more_all": "แสดงเพิ่มเติมทั้งหมด",
   "status.show_thread": "แสดงกระทู้",
-  "status.uncached_media_warning": "ไม่สามารถดูได้",
+  "status.uncached_media_warning": "ไม่พร้อมใช้งาน",
   "status.unmute_conversation": "เลิกปิดเสียงการสนทนา",
   "status.unpin": "ถอนหมุดจากโปรไฟล์",
   "suggestions.dismiss": "ยกเลิกข้อเสนอแนะ",
@@ -397,21 +410,24 @@
   "trends.trending_now": "กำลังนิยม",
   "ui.beforeunload": "แบบร่างของคุณจะหายไปหากคุณออกจาก Mastodon",
   "upload_area.title": "ลากแล้วปล่อยเพื่ออัปโหลด",
-  "upload_button.label": "เพิ่มสื่อ (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_button.label": "เพิ่มสื่อ ({formats})",
   "upload_error.limit": "เกินขีดจำกัดการอัปโหลดไฟล์",
   "upload_error.poll": "ไม่อนุญาตให้อัปโหลดไฟล์กับการลงคะแนน",
+  "upload_form.audio_description": "อธิบายสำหรับผู้สูญเสียการได้ยิน",
   "upload_form.description": "อธิบายสำหรับผู้บกพร่องทางการมองเห็น",
   "upload_form.edit": "แก้ไข",
   "upload_form.undo": "ลบ",
+  "upload_form.video_description": "อธิบายสำหรับผู้สูญเสียการได้ยินหรือบกพร่องทางการมองเห็น",
   "upload_modal.analyzing_picture": "กำลังวิเคราะห์รูปภาพ…",
   "upload_modal.apply": "นำไปใช้",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "ตรวจจับข้อความจากรูปภาพ",
+  "upload_modal.description_placeholder": "สุนัขจิ้งจอกสีน้ำตาลที่ว่องไวกระโดดข้ามสุนัขขี้เกียจ",
+  "upload_modal.detect_text": "ตรวจหาข้อความจากรูปภาพ",
   "upload_modal.edit_media": "แก้ไขสื่อ",
-  "upload_modal.hint": "คลิกหรือลากวงกลมในภาพเพื่อเลือกจุดโฟกัส ซึ่งจะทำให้ส่วนนั้นอยู่ในกรอบของภาพขนาดย่อตลอดเวลา",
+  "upload_modal.hint": "คลิกหรือลากวงกลมในตัวอย่างเพื่อเลือกจุดโฟกัส ซึ่งจะอยู่ในมุมมองของภาพขนาดย่อทั้งหมดเสมอ",
   "upload_modal.preview_label": "ตัวอย่าง ({ratio})",
   "upload_progress.label": "กำลังอัปโหลด...",
   "video.close": "ปิดวิดีโอ",
+  "video.download": "ดาวน์โหลดไฟล์",
   "video.exit_fullscreen": "ออกจากเต็มหน้าจอ",
   "video.expand": "ขยายวิดีโอ",
   "video.fullscreen": "เต็มหน้าจอ",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 89efafd1d..11f9ff2ef 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -1,11 +1,12 @@
 {
   "account.add_or_remove_from_list": "Listelere ekle veya kaldır",
   "account.badges.bot": "Bot",
+  "account.badges.group": "Grup",
   "account.block": "@{name} adlı kişiyi engelle",
   "account.block_domain": "{domain} alanından her şeyi gizle",
   "account.blocked": "Engellenmiş",
   "account.cancel_follow_request": "Takip isteğini iptal et",
-  "account.direct": "Mesaj gönder : @{name}",
+  "account.direct": "Mesaj gönder @{name}",
   "account.domain_blocked": "Alan adı gizlendi",
   "account.edit_profile": "Profili düzenle",
   "account.endorse": "Profildeki özellik",
@@ -17,7 +18,7 @@
   "account.follows_you": "Seni takip ediyor",
   "account.hide_reblogs": "@{name} kişisinin yinelemelerini gizle",
   "account.last_status": "Son aktivite",
-  "account.link_verified_on": "Bu bağlantının mülkiyeti {date} tarihinde kontrol edildi",
+  "account.link_verified_on": "Bu bağlantının sahipliği {date} tarihinde kontrol edildi",
   "account.locked_info": "Bu hesabın gizlilik durumu kilitli olarak ayarlanmış. Sahibi, onu kimin takip edebileceğini elle inceliyor.",
   "account.media": "Medya",
   "account.mention": "@{name} kullanıcısından bahset",
@@ -35,13 +36,14 @@
   "account.unblock": "@{name} adlı kişinin engelini kaldır",
   "account.unblock_domain": "{domain} göster",
   "account.unendorse": "Profilde özellik yok",
-  "account.unfollow": "Takipi bırak",
+  "account.unfollow": "Takibi bırak",
   "account.unmute": "@{name} adlı kişinin sesini aç",
   "account.unmute_notifications": "@{name} adlı kişinin bildirimlerini aç",
   "alert.rate_limited.message": "Lütfen sonra tekrar deneyin {retry_time, time, medium}.",
   "alert.rate_limited.title": "Oran sınırlıdır",
   "alert.unexpected.message": "Beklenmedik bir hata oluştu.",
   "alert.unexpected.title": "Hay aksi!",
+  "announcement.announcement": "Duyuru",
   "autosuggest_hashtag.per_week": "Haftada {count}",
   "boost_modal.combo": "Bir daha ki sefere {combo} tuşuna basabilirsiniz",
   "bundle_column_error.body": "Bu bileşen yüklenirken bir şeyler ters gitti.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Bu bileşen yüklenirken bir şeyler ters gitti.",
   "bundle_modal_error.retry": "Tekrar deneyin",
   "column.blocks": "Engellenen kullanıcılar",
+  "column.bookmarks": "Yer imleri",
   "column.community": "Yerel zaman tüneli",
   "column.direct": "Doğrudan mesajlar",
   "column.directory": "Profillere göz at",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Anket süresi",
   "compose_form.poll.option_placeholder": "Seçim {number}",
   "compose_form.poll.remove_option": "Bu seçimi 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_loud": "{publish}!",
   "compose_form.sensitive.hide": "Medyayı hassas olarak işaretle",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Burada hiç toot yok!",
   "empty_column.account_unavailable": "Profil kullanılamıyor",
   "empty_column.blocks": "Henüz bir kullanıcıyı engellemediniz.",
+  "empty_column.bookmarked_statuses": "Hiç işaretlediğiniz tootunuz yok. Bir tane olduğunda burada görünecek.",
   "empty_column.community": "Yerel zaman çizelgesi boş. Daha fazla eğlence için herkese açık bir gönderi paylaşın!",
   "empty_column.direct": "Henüz doğrudan mesajınız yok. Bir tane gönderdiğinizde veya aldığınızda burada görünecektir.",
   "empty_column.domain_blocks": "Henüz hiçbir gizli alan adı yok.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "susturulmuş kullanıcı listesini açmak için",
   "keyboard_shortcuts.my_profile": "profilinizi açmak için",
   "keyboard_shortcuts.notifications": "bildirimler sütununu açmak için",
+  "keyboard_shortcuts.open_media": "medyayı açmak için",
   "keyboard_shortcuts.pinned": "sabitlenmiş tootların listesini açmak için",
   "keyboard_shortcuts.profile": "yazarın profilini açmak için",
   "keyboard_shortcuts.reply": "cevaplamak için",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Bu kullanıcıdan bildirimler gizlensin mı?",
   "navigation_bar.apps": "Mobil uygulamalar",
   "navigation_bar.blocks": "Engellenen kullanıcılar",
+  "navigation_bar.bookmarks": "Yer imleri",
   "navigation_bar.community_timeline": "Yerel zaman tüneli",
   "navigation_bar.compose": "Yeni toot oluştur",
   "navigation_bar.direct": "Direkt Mesajlar",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Güvenlik",
   "notification.favourite": "{name} senin durumunu favorilere ekledi",
   "notification.follow": "{name} seni takip ediyor",
+  "notification.follow_request": "{name} sizi takip etme isteği gönderdi",
   "notification.mention": "{name} senden bahsetti",
+  "notification.own_poll": "Anketiniz sona erdi",
   "notification.poll": "Oy verdiğiniz bir anket bitti",
   "notification.reblog": "{name} senin durumunu boost etti",
   "notifications.clear": "Bildirimleri temizle",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Hızlı filtre çubuğu",
   "notifications.column_settings.filter_bar.show": "Göster",
   "notifications.column_settings.follow": "Yeni takipçiler:",
+  "notifications.column_settings.follow_request": "Yeni takip istekleri:",
   "notifications.column_settings.mention": "Bahsedilenler:",
   "notifications.column_settings.poll": "Anket sonuçları:",
   "notifications.column_settings.push": "Push bildirimleri",
@@ -344,6 +355,7 @@
   "status.admin_account": "@{name} için denetim arayüzünü açın",
   "status.admin_status": "Denetim arayüzünde bu durumu açın",
   "status.block": "Engelle : @{name}",
+  "status.bookmark": "Yer imlerine ekle",
   "status.cancel_reblog_private": "Boost'u geri al",
   "status.cannot_reblog": "Bu gönderi boost edilemez",
   "status.copy": "Bağlantı durumunu kopyala",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boost etti",
   "status.reblogs.empty": "Henüz kimse bu tootu yinelemedi. Biri yaptığında burada görünecek.",
   "status.redraft": "Sil & tekrar taslakla",
+  "status.remove_bookmark": "Yer imini kaldır",
   "status.reply": "Cevapla",
   "status.replyAll": "Konuşmayı cevapla",
   "status.report": "@{name}'i raporla",
@@ -400,9 +413,11 @@
   "upload_button.label": "Görsel ekle",
   "upload_error.limit": "Dosya yükleme sınırı aşıldı.",
   "upload_error.poll": "Anketlerde dosya yüklemesine izin verilmez.",
+  "upload_form.audio_description": "İşitme kaybı olan kişiler için tarif edin",
   "upload_form.description": "Görme engelliler için açıklama",
   "upload_form.edit": "Düzenle",
   "upload_form.undo": "Geri al",
+  "upload_form.video_description": "İşitme kaybı veya görme engeli olan kişiler için tarif edin",
   "upload_modal.analyzing_picture": "Resmi analiz ediyor…",
   "upload_modal.apply": "Uygula",
   "upload_modal.description_placeholder": "Pijamalı hasta yağız şoföre çabucak güvendi",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Ön izleme ({ratio})",
   "upload_progress.label": "Yükleniyor...",
   "video.close": "Videoyu kapat",
+  "video.download": "Dosyayı indir",
   "video.exit_fullscreen": "Tam ekrandan çık",
   "video.expand": "Videoyu genişlet",
   "video.fullscreen": "Tam ekran",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index c3b3e45b9..061fc50cb 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "Додати або видалити зі списків",
   "account.badges.bot": "Бот",
+  "account.badges.group": "Група",
   "account.block": "Заблокувати @{name}",
   "account.block_domain": "Заглушити {domain}",
   "account.blocked": "Заблоковані",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "Швидкість обмежена",
   "alert.unexpected.message": "Трапилась неочікувана помилка.",
   "alert.unexpected.title": "Ой!",
+  "announcement.announcement": "Оголошення",
   "autosuggest_hashtag.per_week": "{count} в тиждень",
   "boost_modal.combo": "Ви можете натиснути {combo}, щоб пропустити це наступного разу",
   "bundle_column_error.body": "Щось пішло не так під час завантаження компоненту.",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "Щось пішло не так під час завантаження компоненту.",
   "bundle_modal_error.retry": "Спробувати ще раз",
   "column.blocks": "Заблоковані користувачі",
+  "column.bookmarks": "Bookmarks",
   "column.community": "Локальна стрічка",
   "column.direct": "Прямі повідомлення",
   "column.directory": "Переглянути профілі",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "Тривалість опитування",
   "compose_form.poll.option_placeholder": "Варіант {number}",
   "compose_form.poll.remove_option": "Видалити цей варіант",
+  "compose_form.poll.switch_to_multiple": "Перемкнути у режим вибору декількох відповідей",
+  "compose_form.poll.switch_to_single": "Перемкнути у режим вибору однієї відповіді",
   "compose_form.publish": "Дмухнути",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Позначити медіа як дражливе",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "Тут дмухалок немає!",
   "empty_column.account_unavailable": "Профіль недоступний",
   "empty_column.blocks": "Ви ще не заблокували жодного користувача.",
+  "empty_column.bookmarked_statuses": "У вас ще немає дмухів у закладках. Коли ви щось додасте до заклкдок, воно з'явиться тут.",
   "empty_column.community": "Локальна стрічка пуста. Напишіть щось, щоб розігріти народ!",
   "empty_column.direct": "У вас ще немає прямих повідомлень. Коли ви відправите чи отримаєте якесь, воно з'явиться тут.",
   "empty_column.domain_blocks": "Тут поки немає прихованих доменів.",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "відкрити список заглушених користувачів",
   "keyboard_shortcuts.my_profile": "відкрити ваш профіль",
   "keyboard_shortcuts.notifications": "відкрити колонку сповіщень",
+  "keyboard_shortcuts.open_media": "відкрити медіа",
   "keyboard_shortcuts.pinned": "відкрити список закріплених дмухів",
   "keyboard_shortcuts.profile": "відкрити профіль автора",
   "keyboard_shortcuts.reply": "відповісти",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Приховати сповіщення від користувача?",
   "navigation_bar.apps": "Мобільні додатки",
   "navigation_bar.blocks": "Заблоковані користувачі",
+  "navigation_bar.bookmarks": "Закладки",
   "navigation_bar.community_timeline": "Локальна стрічка",
   "navigation_bar.compose": "Написати новий дмух",
   "navigation_bar.direct": "Прямі повідомлення",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Безпека",
   "notification.favourite": "{name} вподобав(-ла) ваш допис",
   "notification.follow": "{name} підписався(-лась) на Вас",
+  "notification.follow_request": "{name} хоче підписатися на Вас",
   "notification.mention": "{name} згадав(-ла) Вас",
+  "notification.own_poll": "Ваше опитування завершено",
   "notification.poll": "Опитування, у якому ви голосували, закінчилося",
   "notification.reblog": "{name} передмухнув(-ла) Ваш допис",
   "notifications.clear": "Очистити сповіщення",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Панель швидкого фільтру",
   "notifications.column_settings.filter_bar.show": "Показати",
   "notifications.column_settings.follow": "Нові підписники:",
+  "notifications.column_settings.follow_request": "Нові запити на підписку:",
   "notifications.column_settings.mention": "Згадки:",
   "notifications.column_settings.poll": "Результати опитування:",
   "notifications.column_settings.push": "Push-сповіщення",
@@ -344,6 +355,7 @@
   "status.admin_account": "Відкрити інтерфейс модерації для @{name}",
   "status.admin_status": "Відкрити цей статус в інтерфейсі модерації",
   "status.block": "Заблокувати @{name}",
+  "status.bookmark": "У закладки",
   "status.cancel_reblog_private": "Відмінити передмухання",
   "status.cannot_reblog": "Цей допис не може бути передмухнутий",
   "status.copy": "Копіювати посилання до статусу",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} передмухнув(-ла)",
   "status.reblogs.empty": "Ніхто ще не передмухнув цього дмуху. Коли якісь користувачі це зроблять, вони будуть відображені тут.",
   "status.redraft": "Видалити та перестворити",
+  "status.remove_bookmark": "Видалити закладку",
   "status.reply": "Відповісти",
   "status.replyAll": "Відповісти на ланцюжок",
   "status.report": "Поскаржитися на @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Додати медіаконтент ({formats})",
   "upload_error.limit": "Ліміт завантаження файлів перевищено.",
   "upload_error.poll": "Не можна завантажувати файли до опитувань.",
+  "upload_form.audio_description": "Опишіть для людей із вадами слуху",
   "upload_form.description": "Опишіть для людей з вадами зору",
   "upload_form.edit": "Змінити",
   "upload_form.undo": "Видалити",
+  "upload_form.video_description": "Опишіть для людей із вадами слуху або зору",
   "upload_modal.analyzing_picture": "Аналізуємо малюнок…",
   "upload_modal.apply": "Застосувати",
   "upload_modal.description_placeholder": "Щурячий бугай із їжаком-харцизом в'ючись підписали ґешефт у єнах",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "Переглянути ({ratio})",
   "upload_progress.label": "Завантаження...",
   "video.close": "Закрити відео",
+  "video.download": "Завантаження файла",
   "video.exit_fullscreen": "Вийти з повноекранного режиму",
   "video.expand": "Розширити відео",
   "video.fullscreen": "На весь екран",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index 39ca86a0c..01477906c 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -1,91 +1,96 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
-  "account.badges.bot": "Bot",
-  "account.block": "Block @{name}",
-  "account.block_domain": "Hide everything from {domain}",
-  "account.blocked": "Blocked",
-  "account.cancel_follow_request": "Cancel follow request",
-  "account.direct": "Direct message @{name}",
-  "account.domain_blocked": "Domain hidden",
-  "account.edit_profile": "Edit profile",
-  "account.endorse": "Feature on profile",
-  "account.follow": "Follow",
-  "account.followers": "Followers",
-  "account.followers.empty": "No one follows this user yet.",
-  "account.follows": "Follows",
-  "account.follows.empty": "This user doesn't follow anyone yet.",
-  "account.follows_you": "Follows you",
-  "account.hide_reblogs": "Hide boosts from @{name}",
-  "account.last_status": "Last active",
-  "account.link_verified_on": "Ownership of this link was checked on {date}",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
-  "account.media": "Media",
-  "account.mention": "Mention @{name}",
-  "account.moved_to": "{name} has moved to:",
-  "account.mute": "Mute @{name}",
-  "account.mute_notifications": "Mute notifications from @{name}",
-  "account.muted": "Muted",
-  "account.never_active": "Never",
-  "account.posts": "Toots",
-  "account.posts_with_replies": "Toots and replies",
-  "account.report": "Report @{name}",
-  "account.requested": "Awaiting approval",
-  "account.share": "Share @{name}'s profile",
-  "account.show_reblogs": "Show boosts from @{name}",
-  "account.unblock": "Unblock @{name}",
-  "account.unblock_domain": "Unhide {domain}",
-  "account.unendorse": "Don't feature on profile",
-  "account.unfollow": "Unfollow",
-  "account.unmute": "Unmute @{name}",
-  "account.unmute_notifications": "Unmute notifications from @{name}",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "account.add_or_remove_from_list": "فہرست میں شامل یا برطرف کریں",
+  "account.badges.bot": "روبوٹ",
+  "account.badges.group": "Group",
+  "account.block": "مسدود @{name}",
+  "account.block_domain": "{domain} سے سب چھپائیں",
+  "account.blocked": "مسدود کردہ",
+  "account.cancel_follow_request": "درخواستِ پیروی منسوخ کریں",
+  "account.direct": "راست پیغام @{name}",
+  "account.domain_blocked": "پوشیدہ ڈومین",
+  "account.edit_profile": "مشخص ترمیم کریں",
+  "account.endorse": "مشکص پر نمایاں کریں",
+  "account.follow": "پیروی کریں",
+  "account.followers": "پیروکار",
+  "account.followers.empty": "\"ہنوز اس صارف کی کوئی پیروی نہیں کرتا\".",
+  "account.follows": "پیروی کرتے ہیں",
+  "account.follows.empty": "\"یہ صارف ہنوز کسی کی پیروی نہیں کرتا ہے\".",
+  "account.follows_you": "آپ کا پیروکار ہے",
+  "account.hide_reblogs": "@{name} سے فروغ چھپائیں",
+  "account.last_status": "آخری فعال",
+  "account.link_verified_on": "اس لنک کی ملکیت کی توثیق {date} پر کی گئی تھی",
+  "account.locked_info": "اس اکاونٹ کا اخفائی ضابطہ مقفل ہے۔ صارف کی پیروی کون کر سکتا ہے اس کا جائزہ وہ خود لیتا ہے.",
+  "account.media": "وسائل",
+  "account.mention": "ذکر @{name}",
+  "account.moved_to": "{name} منتقل ہگیا ہے بہ:",
+  "account.mute": "خاموش @{name}",
+  "account.mute_notifications": "@{name} سے اطلاعات خاموش کریں",
+  "account.muted": "خاموش کردہ",
+  "account.never_active": "کبھی نہیں",
+  "account.posts": "ٹوٹ",
+  "account.posts_with_replies": "ٹوٹ اور جوابات",
+  "account.report": "@{name} اطلاع کریں",
+  "account.requested": "منظوری کا منتظر۔ درخواستِ پیروی منسوخ کرنے کیلئے کلک کریں",
+  "account.share": "@{name} کے مشخص کو بانٹیں",
+  "account.show_reblogs": "@{name} کی افزائشات کو دکھائیں",
+  "account.unblock": "@{name} کو بحال کریں",
+  "account.unblock_domain": "{domain} کو نہ چھپائیں",
+  "account.unendorse": "مشخص پر نمایاں نہ کریں",
+  "account.unfollow": "پیروی ترک کریں",
+  "account.unmute": "@{name} کو با آواز کریں",
+  "account.unmute_notifications": "@{name} سے اطلاعات کو با آواز کریں",
+  "alert.rate_limited.message": "\"{retry_time, time, medium} کے بعد کوشش کریں\".",
   "alert.rate_limited.title": "Rate limited",
-  "alert.unexpected.message": "An unexpected error occurred.",
-  "alert.unexpected.title": "Oops!",
-  "autosuggest_hashtag.per_week": "{count} per week",
-  "boost_modal.combo": "You can press {combo} to skip this next time",
-  "bundle_column_error.body": "Something went wrong while loading this component.",
-  "bundle_column_error.retry": "Try again",
-  "bundle_column_error.title": "Network error",
-  "bundle_modal_error.close": "Close",
-  "bundle_modal_error.message": "Something went wrong while loading this component.",
-  "bundle_modal_error.retry": "Try again",
-  "column.blocks": "Blocked users",
-  "column.community": "Local timeline",
-  "column.direct": "Direct messages",
-  "column.directory": "Browse profiles",
-  "column.domain_blocks": "Hidden domains",
-  "column.favourites": "Favourites",
-  "column.follow_requests": "Follow requests",
-  "column.home": "Home",
-  "column.lists": "Lists",
-  "column.mutes": "Muted users",
-  "column.notifications": "Notifications",
-  "column.pins": "Pinned toot",
-  "column.public": "Federated timeline",
-  "column_back_button.label": "Back",
-  "column_header.hide_settings": "Hide settings",
-  "column_header.moveLeft_settings": "Move column to the left",
-  "column_header.moveRight_settings": "Move column to the right",
-  "column_header.pin": "Pin",
-  "column_header.show_settings": "Show settings",
-  "column_header.unpin": "Unpin",
-  "column_subheading.settings": "Settings",
-  "community.column_settings.media_only": "Media only",
-  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
-  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
-  "compose_form.lock_disclaimer.lock": "locked",
-  "compose_form.placeholder": "What is on your mind?",
-  "compose_form.poll.add_option": "Add a choice",
-  "compose_form.poll.duration": "Poll duration",
-  "compose_form.poll.option_placeholder": "Choice {number}",
-  "compose_form.poll.remove_option": "Remove this choice",
-  "compose_form.publish": "Toot",
+  "alert.unexpected.message": "ایک غیر متوقع سہو ہوا ہے.",
+  "alert.unexpected.title": "ا رے!",
+  "announcement.announcement": "Announcement",
+  "autosuggest_hashtag.per_week": "{count} فی ہفتہ",
+  "boost_modal.combo": "آئیندہ یہ نہ دیکھنے کیلئے آپ {combo} دبا سکتے ہیں",
+  "bundle_column_error.body": "اس عنصر کو برآمد کرتے وقت کچھ خرابی پیش آئی ہے.",
+  "bundle_column_error.retry": "دوبارہ کوشش کریں",
+  "bundle_column_error.title": "نیٹ ورک کی خرابی",
+  "bundle_modal_error.close": "بند کریں",
+  "bundle_modal_error.message": "اس عنصر کو برآمد کرتے وقت کچھ خرابی پیش آئی ہے.",
+  "bundle_modal_error.retry": "دوبارہ کوشش کریں",
+  "column.blocks": "مسدود صارفین",
+  "column.bookmarks": "Bookmarks",
+  "column.community": "مقامی زمانی جدول",
+  "column.direct": "راست پیغام",
+  "column.directory": "مشخصات کا مطالعہ کریں",
+  "column.domain_blocks": "پوشیدہ ڈومین",
+  "column.favourites": "پسندیدہ",
+  "column.follow_requests": "پیروی درخواست",
+  "column.home": "خانہ",
+  "column.lists": "فہرستیں",
+  "column.mutes": "خاموش کردہ صارفین",
+  "column.notifications": "اطلاعات",
+  "column.pins": "چسپاں ٹوٹ",
+  "column.public": "مجموعی زمانی جدول",
+  "column_back_button.label": "واپس",
+  "column_header.hide_settings": "ترتیبات کو چھپائیں",
+  "column_header.moveLeft_settings": "کالم کو بائیں جانب منتقل کریں",
+  "column_header.moveRight_settings": "کالم کو دائیں جانب منتقل کریں",
+  "column_header.pin": "چسپاں کریں",
+  "column_header.show_settings": "ترتیبات دکھائیں",
+  "column_header.unpin": "رہا کریں",
+  "column_subheading.settings": "ترتیبات",
+  "community.column_settings.media_only": "وسائل فقط",
+  "compose_form.direct_message_warning": "یہ ٹوٹ صرف مذکورہ صارفین کو بھیجا جائے گا.",
+  "compose_form.direct_message_warning_learn_more": "مزید جانیں",
+  "compose_form.hashtag_warning": "چونکہ یہ ٹوٹ غیر مندرجہ ہے لہذا یہ کسی بھی ہیش ٹیگ کے تحت درج نہیں کیا جائے گا. ہیش ٹیگ کے تحت صرف \nعمومی ٹوٹ تلاش کئے جا سکتے ہیں.",
+  "compose_form.lock_disclaimer": "آپ کا اکاؤنٹ {locked} نہیں ہے. کوئی بھی آپ کے مخصوص برائے پیروکار ٹوٹ دیکھنے کی خاطر آپ کی پیروی کر سکتا ہے.",
+  "compose_form.lock_disclaimer.lock": "مقفل",
+  "compose_form.placeholder": "آپ کیا سوچ رہے ہیں؟",
+  "compose_form.poll.add_option": "انتخاب شامل کریں",
+  "compose_form.poll.duration": "مدتِ رائے",
+  "compose_form.poll.option_placeholder": "انتخاب {number}",
+  "compose_form.poll.remove_option": "یہ انتخاب ہٹا دیں",
+  "compose_form.poll.switch_to_multiple": "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_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Mark media as sensitive",
-  "compose_form.sensitive.marked": "Media is marked as sensitive",
+  "compose_form.sensitive.hide": "وسائل کو حساس نشاندہ کریں",
+  "compose_form.sensitive.marked": "وسائل حساس نشاندہ ہے",
   "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
@@ -135,54 +140,55 @@
   "emoji_button.search_results": "Search results",
   "emoji_button.symbols": "Symbols",
   "emoji_button.travel": "Travel & Places",
-  "empty_column.account_timeline": "No toots here!",
-  "empty_column.account_unavailable": "Profile unavailable",
-  "empty_column.blocks": "You haven't blocked any users yet.",
-  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
-  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
-  "empty_column.domain_blocks": "There are no hidden domains yet.",
-  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
-  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
-  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
-  "empty_column.hashtag": "There is nothing in this hashtag yet.",
-  "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
-  "empty_column.home.public_timeline": "the public timeline",
-  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
-  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
-  "empty_column.mutes": "You haven't muted any users yet.",
-  "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
-  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
+  "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.direct": "آپ کیلئے کوئی راست پیغام نہیں ہے. جب آپ بھیجیں گے یا وصول کریں گے، یہاں نظر آئےگا.",
+  "empty_column.domain_blocks": "ابھی تک کوئی چھپا ہوا ڈومین نہیں ہے.",
+  "empty_column.favourited_statuses": "آپ کا کوئی پسندیدہ ٹوٹ نہیں ہے. جب آپ پسند کریں گے، یہاں نظر آئےگا.",
+  "empty_column.favourites": "ابھی تک کسی نے بھی اس ٹوٹ کو پسند نہیں کیا ہے. جب بھی کوئی اسے پسند کرے گا، ان کا نام یہاں نظر آئے گا.",
+  "empty_column.follow_requests": "ابھی تک آپ کی پیری کرنے کی درخواست نہیں کی ہے. جب کوئی درخواست کرے گا، ان کا نام یہاں نظر آئے گا.",
+  "empty_column.hashtag": "ابھی یہ ہیش ٹیگ خالی ہے.",
+  "empty_column.home": "آپ کا خانگی جدول خالی ہے! {public} دیکھیں یا شروعات کیلئے تلاش کریں اور دیگر صارفین سے ملیں.",
+  "empty_column.home.public_timeline": "جدولِ عام",
+  "empty_column.list": "یہ فہرست ابھی خالی ہے. جب اس فہرست کے ارکان کچھ تحریر کریں گے، یہاں نظر آئے گا.",
+  "empty_column.lists": "ابھی آپ کی کوئی فہرست نہیں ہے. جب آپ بنائیں گے، وہ یہاں نظر آئے گی.",
+  "empty_column.mutes": "آپ نے ابھی کسی صارف کو خاموش نہیں کیا ہے.",
+  "empty_column.notifications": "ابھی آپ کیلئے کوئی اطلاعات نہیں ہیں. گفتگو شروع کرنے کے لئے دیگر صارفین سے متعامل ہوں.",
+  "empty_column.public": "یہاں کچھ بھی نہیں ہے! کچھ عمومی تحریر کریں یا اس جگہ کو پُر کرنے کے لئے از خود دیگر سرورس کے صارفین کی پیروی کریں",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.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": "صفحے کو تازہ کرنے کی کوشش کریں. اگر کارآمد نہ ہو تو آپ کسی دیگر براؤزر یا مقامی ایپ سے ہنوز ماسٹوڈون استعمال کر سکتے ہیں.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
-  "follow_request.authorize": "Authorize",
-  "follow_request.reject": "Reject",
+  "errors.unexpected_crash.report_issue": "مسئلہ کی اطلاع کریں",
+  "follow_request.authorize": "اجازت دیں",
+  "follow_request.reject": "انکار کریں",
   "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
-  "getting_started.documentation": "Documentation",
-  "getting_started.heading": "Getting started",
-  "getting_started.invite": "Invite people",
-  "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
-  "getting_started.security": "Security",
-  "getting_started.terms": "Terms of service",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.select.no_options_message": "No suggestions found",
-  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
-  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
-  "home.column_settings.basic": "Basic",
-  "home.column_settings.show_reblogs": "Show boosts",
-  "home.column_settings.show_replies": "Show replies",
-  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
-  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
+  "getting_started.directory": "فہرست مشخصات",
+  "getting_started.documentation": "اسناد",
+  "getting_started.heading": "آغاز کریں",
+  "getting_started.invite": "دوستوں کو دعوت دیں",
+  "getting_started.open_source_notice": "ماسٹوڈون آزاد منبع سوفٹویر ہے. آپ {github} گِٹ ہب پر مسائل میں معاونت یا مشکلات کی اطلاع دے سکتے ہیں.",
+  "getting_started.security": "ترتیباتِ اکاؤنٹ",
+  "getting_started.terms": "شرائط خدمات",
+  "hashtag.column_header.tag_mode.all": "اور {additional}",
+  "hashtag.column_header.tag_mode.any": "یا {additional}",
+  "hashtag.column_header.tag_mode.none": "بغیر {additional}",
+  "hashtag.column_settings.select.no_options_message": "کوئی ترغیبات نہیں ملیں",
+  "hashtag.column_settings.select.placeholder": "ہیش ٹیگ داخل کریں…",
+  "hashtag.column_settings.tag_mode.all": "یہ تمام",
+  "hashtag.column_settings.tag_mode.any": "ان میں سے کوئی",
+  "hashtag.column_settings.tag_mode.none": "ان میں سے کوئی بھی نہیں",
+  "hashtag.column_settings.tag_toggle": "اس کالم کے لئے مزید ٹیگز شامل کریں",
+  "home.column_settings.basic": "بنیادی",
+  "home.column_settings.show_reblogs": "افزائشات دکھائیں",
+  "home.column_settings.show_replies": "جوابات دکھائیں",
+  "intervals.full.days": "{number, plural, one {# روز} other {# روز}}",
+  "intervals.full.hours": "{number, plural, one {# ساعت} other {# ساعت}}",
   "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
-  "introduction.federation.action": "Next",
-  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.action": "اگلا",
+  "introduction.federation.federated.headline": "مجموعی",
   "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
   "introduction.federation.home.headline": "Home",
   "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "to open muted users list",
   "keyboard_shortcuts.my_profile": "to open your profile",
   "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.open_media": "to open media",
   "keyboard_shortcuts.pinned": "to open pinned toots list",
   "keyboard_shortcuts.profile": "to open author's profile",
   "keyboard_shortcuts.reply": "to reply",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "Hide notifications from this user?",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.bookmarks": "Bookmarks",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.compose": "Compose new toot",
   "navigation_bar.direct": "Direct messages",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "Security",
   "notification.favourite": "{name} favourited your status",
   "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
   "notifications.clear": "Clear notifications",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "Quick filter bar",
   "notifications.column_settings.filter_bar.show": "Show",
   "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
   "notifications.column_settings.mention": "Mentions:",
   "notifications.column_settings.poll": "Poll results:",
   "notifications.column_settings.push": "Push notifications",
@@ -344,6 +355,7 @@
   "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",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} boosted",
   "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
   "status.redraft": "Delete & re-draft",
+  "status.remove_bookmark": "Remove bookmark",
   "status.reply": "Reply",
   "status.replyAll": "Reply to thread",
   "status.report": "Report @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "Add media ({formats})",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.edit": "Edit",
   "upload_form.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.description_placeholder": "A quick brown fox jumps over the lazy dog",
@@ -412,6 +427,7 @@
   "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",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
new file mode 100644
index 000000000..07dff79fa
--- /dev/null
+++ b/app/javascript/mastodon/locales/vi.json
@@ -0,0 +1,439 @@
+{
+  "account.add_or_remove_from_list": "Thêm hoặc Xóa khỏi danh sách",
+  "account.badges.bot": "Robot",
+  "account.badges.group": "Nhóm",
+  "account.block": "Chặn @{name}",
+  "account.block_domain": "Ẩn mọi thứ từ {domain}",
+  "account.blocked": "Đã chặn",
+  "account.cancel_follow_request": "Hủy theo yêu cầu",
+  "account.direct": "Nhắn riêng @{name}",
+  "account.domain_blocked": "Miền đã ẩn",
+  "account.edit_profile": "Sửa hồ sơ",
+  "account.endorse": "Đưa lên hồ sơ",
+  "account.follow": "Quan tâm",
+  "account.followers": "Người quan tâm",
+  "account.followers.empty": "Chưa có ai quan tâm",
+  "account.follows": "Đang quan tâm",
+  "account.follows.empty": "Chưa quan tâm ai",
+  "account.follows_you": "Đã quan tâm bạn",
+  "account.hide_reblogs": "Ẩn loan tin từ @{name}",
+  "account.last_status": "Hoạt động lần cuối",
+  "account.link_verified_on": "Quyền sở hữu của liên kết này đã được kiểm tra vào {date}",
+  "account.locked_info": "Tài khoản này đã mở chế độ ẩn. Người sở hữu tài khoản này sẽ tự mình chấp nhận các yêu cầu quan tâm.",
+  "account.media": "Ảnh và video",
+  "account.mention": "Nhắc đến @{name}",
+  "account.moved_to": "{name} đã chuyển đến:",
+  "account.mute": "Ẩn @{name}",
+  "account.mute_notifications": "Tắt thông báo từ @{name}",
+  "account.muted": "Đã ẩn",
+  "account.never_active": "Không bao giờ",
+  "account.posts": "Tút",
+  "account.posts_with_replies": "Tút và trả lời",
+  "account.report": "Báo cáo @{name}",
+  "account.requested": "Đang chờ chấp nhận. Nhấn vào đây để hủy bỏ yêu cầu sau",
+  "account.share": "Chia sẻ hồ sơ @{name}",
+  "account.show_reblogs": "Hiện loan tin các từ @{name}",
+  "account.unblock": "Mở chặn @{name}",
+  "account.unblock_domain": "Bỏ ẩn {domain}",
+  "account.unendorse": "Không đưa lên nổi bật",
+  "account.unfollow": "Ngưng quan tâm",
+  "account.unmute": "Huỷ bỏ qua @{name}",
+  "account.unmute_notifications": "Hiển thị thông báo từ @{name}",
+  "alert.rate_limited.message": "Vui lòng thử lại sau {retry_time, time, Medium}.",
+  "alert.rate_limited.title": "Tỷ lệ giới hạn",
+  "alert.unexpected.message": "Đã xảy ra lỗi không mong muốn.",
+  "alert.unexpected.title": "Ốiii!",
+  "announcement.announcement": "Announcement",
+  "autosuggest_hashtag.per_week": "{tính} mỗi tuần",
+  "boost_modal.combo": "Bạn có thể nhấn {combo} để bỏ qua lần sau",
+  "bundle_column_error.body": "Có gì đó sai sai trong khi tải nội dung này",
+  "bundle_column_error.retry": "Thử lại",
+  "bundle_column_error.title": "Lỗi mạng",
+  "bundle_modal_error.close": "Tắt",
+  "bundle_modal_error.message": "Có gì đó sai sai trong khi tải nội dung này",
+  "bundle_modal_error.retry": "Thử lại",
+  "column.blocks": "Người bị chặn",
+  "column.bookmarks": "Đã lưu",
+  "column.community": "Dòng thời gian của miền",
+  "column.direct": "Tin nhắn",
+  "column.directory": "Duyệt hồ sơ",
+  "column.domain_blocks": "Miền đã ẩn",
+  "column.favourites": "Đã thích",
+  "column.follow_requests": "Yêu cầu quan tâm",
+  "column.home": "Bảng tin",
+  "column.lists": "Danh sách",
+  "column.mutes": "Đã ẩn",
+  "column.notifications": "Thông báo",
+  "column.pins": "Tút được ghim",
+  "column.public": "Dòng thời gian liên kết",
+  "column_back_button.label": "Quay lại",
+  "column_header.hide_settings": "Ẩn các thiết lập",
+  "column_header.moveLeft_settings": "Di chuyển cột sang trái",
+  "column_header.moveRight_settings": "Di chuyển cột sang phải",
+  "column_header.pin": "Ghim",
+  "column_header.show_settings": "Hiển thị cài đặt",
+  "column_header.unpin": "Bỏ ghim",
+  "column_subheading.settings": "Cài đặt",
+  "community.column_settings.media_only": "Chỉ tút có media",
+  "compose_form.direct_message_warning": "Tút này sẽ chỉ gửi cho người được nhắc đến.",
+  "compose_form.direct_message_warning_learn_more": "Tìm hiểu thêm",
+  "compose_form.hashtag_warning": "Tút này sẽ không được xuất hiện khi tìm kiếm theo hashtag vì nó không công khai. Chỉ Tút công khai có thể được tìm kiếm theo hashtag.",
+  "compose_form.lock_disclaimer": "Tài khoản của bạn không được {locked}. Bất cứ ai cũng có thể quan tâm bạn và xem bài viết đi bạn đăng cho người quan tâm",
+  "compose_form.lock_disclaimer.lock": "khóa",
+  "compose_form.placeholder": "Bạn đang nghĩ gì?",
+  "compose_form.poll.add_option": "Thêm lựa chọn",
+  "compose_form.poll.duration": "Thời hạn",
+  "compose_form.poll.option_placeholder": "Lựa chọn {number}",
+  "compose_form.poll.remove_option": "Xóa lựa chọn này",
+  "compose_form.poll.switch_to_multiple": "Sửa thăm dò để cho phép nhiều lựa chọn",
+  "compose_form.poll.switch_to_single": "Sửa thăm dò để cho phép một lựa chọn",
+  "compose_form.publish": "Tút",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.sensitive.hide": "Đánh dấu hình ảnh nhạy cảm",
+  "compose_form.sensitive.marked": "Media đã được đánh dấu nhạy cảm",
+  "compose_form.sensitive.unmarked": "Media đã không được đánh dấu nhạy cảm",
+  "compose_form.spoiler.marked": "Văn bản ẩn dấu sau lời cảnh báo",
+  "compose_form.spoiler.unmarked": "Văn bản không bị ẩn",
+  "compose_form.spoiler_placeholder": "Viết cảnh báo của bạn ở đây",
+  "confirmation_modal.cancel": "Hủy bỏ",
+  "confirmations.block.block_and_report": "Chặn và Báo cáo",
+  "confirmations.block.confirm": "Chặn",
+  "confirmations.block.message": "Bạn có chắc chắn muốn chặn {name}?",
+  "confirmations.delete.confirm": "Xóa bỏ",
+  "confirmations.delete.message": "Bạn có chắc chắn muốn xóa tút này?",
+  "confirmations.delete_list.confirm": "Xóa bỏ",
+  "confirmations.delete_list.message": "Bạn có chắc chắn muốn xóa vĩnh viễn danh sách này?",
+  "confirmations.domain_block.confirm": "Ẩn toàn bộ miền",
+  "confirmations.domain_block.message": "Bạn có thực sự, thực sự chắc chắn rằng bạn muốn ẩn toàn bộ từ {domain}? Hầu hết các trường hợp, bạn chỉ cần chặn hoặc ẩn một vài tài khoản thì phù hợp hơn. Ẩn toàn bộ miền khiến bạn sẽ không thấy nội dung từ miền đó trong bất kỳ nơi nào kể cả thông báo. người quan tâm bạn từ miền đó sẽ bị xóa luôn.",
+  "confirmations.logout.confirm": "Đăng xuất",
+  "confirmations.logout.message": "Bạn có chắc chắn bạn muốn thoát?",
+  "confirmations.mute.confirm": "Ẩn",
+  "confirmations.mute.explanation": "Điều này sẽ ẩn bài đăng từ họ và bài viết đề cập đến họ, nhưng nó vẫn sẽ cho phép họ xem bài đăng của bạn và quan tâm bạn.",
+  "confirmations.mute.message": "Bạn có chắc chắn muốn ẩn {name}?",
+  "confirmations.redraft.confirm": "Xóa & đưa vào nháp",
+  "confirmations.redraft.message": "Bạn có chắc chắn muốn xóa tút này và đưa nó vào nháp? Những lượt thích và loan tin tút sẽ bị mất, và những tút trả lời tút này sẽ mất đầu mối.",
+  "confirmations.reply.confirm": "Trả lời",
+  "confirmations.reply.message": "Nội dung bạn đang soạn thảo sẽ bị ghi đè, bạn có tiếp tục?",
+  "confirmations.unfollow.confirm": "Ngưng quan tâm",
+  "confirmations.unfollow.message": "Bạn có chắc chắn muốn ngưng quan tâm {name}?",
+  "conversation.delete": "Xóa cuộc hội thoại",
+  "conversation.mark_as_read": "đánh dấu là đã đọc",
+  "conversation.open": "Xem cuộc hội thoại",
+  "conversation.with": "Với {tên}",
+  "directory.federated": "Từ fediverse được biết đến",
+  "directory.local": "Chỉ từ {domain}",
+  "directory.new_arrivals": "Điểm đến mới",
+  "directory.recently_active": "Mới hoạt động",
+  "embed.instructions": "Nhúng tút này trên trang web của bạn bằng cách sao chép đoạn mã dưới đây.",
+  "embed.preview": "Nó sẽ hiển thị như dưới đây:",
+  "emoji_button.activity": "Hoạt động",
+  "emoji_button.custom": "Riêng",
+  "emoji_button.flags": "Cờ",
+  "emoji_button.food": "Ăn uống",
+  "emoji_button.label": "Chèn biểu emoj",
+  "emoji_button.nature": "Thiên nhiên",
+  "emoji_button.not_found": "Không emojos !! (╯ ° □ °) ╯( ┻━┻",
+  "emoji_button.objects": "Đối tượng",
+  "emoji_button.people": "Người",
+  "emoji_button.recent": "Hay dùng",
+  "emoji_button.search": "Tìm kiếm...",
+  "emoji_button.search_results": "Kết quả tìm kiếm",
+  "emoji_button.symbols": "Biểu tượng",
+  "emoji_button.travel": "Du lịch",
+  "empty_column.account_timeline": "Chưa có tút nào",
+  "empty_column.account_unavailable": "Hồ sơ không truy cập được",
+  "empty_column.blocks": "Bạn chưa chặn ai cả.",
+  "empty_column.bookmarked_statuses": "Bạn chưa lưu tút nào, nếu có sẽ thấy ở đây.",
+  "empty_column.community": "Chưa có gì trong dòng thời gian chung của miền cả, bạn hãy tút gì đó đi!",
+  "empty_column.direct": "Bạn không có bất kỳ tin nhắn trực tiếp nêu ra. Khi bạn gửi hoặc nhận một, nó sẽ hiển thị ở đây.",
+  "empty_column.domain_blocks": "Chưa ẩn miền nào",
+  "empty_column.favourited_statuses": "Bạn chưa thích tút nào, nếu có sẽ thấy ở đây.",
+  "empty_column.favourites": "Chưa ai thích tút này, nếu có bạn sẽ thấy ở đây.",
+  "empty_column.follow_requests": "Bạn chưa có yêu cầu nào. Khi bạn nhận được yêu cầu, nó sẽ hiển ở đây.",
+  "empty_column.hashtag": "Chưa có bài đăng nào sử dụng hashtag này.",
+  "empty_column.home": "Bảng tin của bạn đang trống! Truy cập {public} hoặc sử dụng tìm kiếm để quan tâm và trao đổi với những người khác đi.",
+  "empty_column.home.public_timeline": "Dòng thời gian công khai",
+  "empty_column.list": "Không có gì trong danh sách này là nêu ra. Khi các thành viên của danh sách này gửi trạng thái mới, họ sẽ xuất hiện ở đây.",
+  "empty_column.lists": "Bạn không có bất kỳ danh sách được nêu ra. Khi bạn tạo một, nó sẽ hiển thị ở đây.",
+  "empty_column.mutes": "Bạn chưa tắt bất kỳ người dùng nào.",
+  "empty_column.notifications": "Bạn không có thông báo nào. Tương tác với những người khác để bắt đầu trao đổi.",
+  "empty_column.public": "Chưa có gì cả, bạn hãy đăng gì đó đi đừng để nó trắng trơn",
+  "error.unexpected_crash.explanation": "Do lỗi trong mã của chúng tôi hoặc sự cố tương thích trình duyệt, trang này không thể được hiển thị chính xác.",
+  "error.unexpected_crash.next_steps": "Hãy thử làm mới trang. Nếu điều đó không có ích, bạn vẫn có thể sử dụng Mastodon thông qua một trình duyệt hoặc ứng dụng gốc khác.",
+  "errors.unexpected_crash.copy_stacktrace": "Sao chép stacktrace vào clipboard",
+  "errors.unexpected_crash.report_issue": "Báo cáo phát hành",
+  "follow_request.authorize": "Cho phép",
+  "follow_request.reject": "Từ chối",
+  "getting_started.developers": "Nhà phát triển",
+  "getting_started.directory": "Danh mục thành viên",
+  "getting_started.documentation": "Tài liệu",
+  "getting_started.heading": "Bắt đầu",
+  "getting_started.invite": "Mời bạn bè",
+  "getting_started.open_source_notice": "Mastodon là phần mềm mã nguồn mở. Bạn có thể đóng góp hoặc báo cáo vấn đề gặp phải trên GitHub tại {github}.",
+  "getting_started.security": "Bảo mật",
+  "getting_started.terms": "Điều khoản dịch vụ",
+  "hashtag.column_header.tag_mode.all": "Và {additional} thêm",
+  "hashtag.column_header.tag_mode.any": "Hoặc {additional} thêm",
+  "hashtag.column_header.tag_mode.none": "Mà không {additional} thêm",
+  "hashtag.column_settings.select.no_options_message": "Không tìm thấy đề xuất nào",
+  "hashtag.column_settings.select.placeholder": "Nhập hashtags ...",
+  "hashtag.column_settings.tag_mode.all": "Tất cả những cái này",
+  "hashtag.column_settings.tag_mode.any": "Bất kỳ trong số này",
+  "hashtag.column_settings.tag_mode.none": "Không ai trong số những",
+  "hashtag.column_settings.tag_toggle": "Bao gồm thêm thẻ cho cột này",
+  "home.column_settings.basic": "Cơ bản",
+  "home.column_settings.show_reblogs": "Hiện tút được loan tin",
+  "home.column_settings.show_replies": "Hiện trả lời",
+  "intervals.full.days": "{number} days",
+  "intervals.full.hours": "{number} hours",
+  "intervals.full.minutes": "{number} minutes",
+  "introduction.federation.action": "Tiếp",
+  "introduction.federation.federated.headline": "Miền liên kết",
+  "introduction.federation.federated.text": "Bài đăng công khai từ các miền khác có liên hệ với miền của bạn sẽ xuất hiện ở Dòng thời gian liên kết",
+  "introduction.federation.home.headline": "Bảng tin",
+  "introduction.federation.home.text": "Bài đăng từ những người bạn quan tâm sẽ xuất hiện ở bảng tin của bạn. Bạn có thể quan tâm bất cứ ai trên bất cứ miền nào!",
+  "introduction.federation.local.headline": "Cùng miền",
+  "introduction.federation.local.text": "Bài đăng công khai từ những người trên cùng một miền như bạn sẽ xuất hiện trong Dòng thời gian cùng miền.",
+  "introduction.interactions.action": "Hoàn thành hướng dẫn!",
+  "introduction.interactions.favourite.headline": "Thích",
+  "introduction.interactions.favourite.text": "Bạn có thể lưu tút để sau này xem lại, và để cho các tác giả biết rằng bạn thích tút của họ bằng cách bấm thích tút đó.",
+  "introduction.interactions.reblog.headline": "Loan tin",
+  "introduction.interactions.reblog.text": "Bạn có thể chia sẻ Tút của người khác với những người quan tâm bạn bằng cách loan tin.",
+  "introduction.interactions.reply.headline": "Trả lời",
+  "introduction.interactions.reply.text": "Bạn có thể trả lời tút của những người khác và tút riêng của bạn, từ đó tạo nên những cuộc hội thoại.",
+  "introduction.welcome.action": "Ok đi thôi!",
+  "introduction.welcome.headline": "Bước đầu tiên",
+  "introduction.welcome.text": "Chào mừng bạn đến mạng xã hội đa liên kết! Trong vài phút tới, bạn sẽ có thể phát đi những nội dung và trao đổi với bạn bè của bạn trên một loạt các trang hay còn gọi là các miền. Đặc biệt ở là {domain}, là nơi lưu trữ hồ sơ của bạn, vì vậy đừng quên miền này.",
+  "keyboard_shortcuts.back": "để trở lại",
+  "keyboard_shortcuts.blocked": "để mở danh sách người dùng bị chặn",
+  "keyboard_shortcuts.boost": "để loan tin",
+  "keyboard_shortcuts.column": "để tập trung một tút cụ thể từ một trong các cột",
+  "keyboard_shortcuts.compose": "để vào khung soạn tút",
+  "keyboard_shortcuts.description": "Mô tả",
+  "keyboard_shortcuts.direct": "để mở thư cột trực tiếp",
+  "keyboard_shortcuts.down": "để di chuyển xuống trong danh sách",
+  "keyboard_shortcuts.enter": "để mở trạng thái",
+  "keyboard_shortcuts.favourite": "để thích",
+  "keyboard_shortcuts.favourites": "để mở danh sách yêu thích",
+  "keyboard_shortcuts.federated": "để mở dòng thời gian liên kết",
+  "keyboard_shortcuts.heading": "Các phím tắt",
+  "keyboard_shortcuts.home": "để mở bảng tin",
+  "keyboard_shortcuts.hotkey": "Phím tắt",
+  "keyboard_shortcuts.legend": "để hiển thị bảng hướng dẫn này",
+  "keyboard_shortcuts.local": "để mở dòng thời gian của miền",
+  "keyboard_shortcuts.mention": "để nhắc đến tác giả",
+  "keyboard_shortcuts.muted": "để mở danh sách người dùng tắt tiếng",
+  "keyboard_shortcuts.my_profile": "để mở hồ sơ của bạn",
+  "keyboard_shortcuts.notifications": "để mở thông báo cột",
+  "keyboard_shortcuts.open_media": "để mở media",
+  "keyboard_shortcuts.pinned": "để mở danh sách tút được ghim",
+  "keyboard_shortcuts.profile": "để mở hồ sơ của tác giả",
+  "keyboard_shortcuts.reply": "để trả lời",
+  "keyboard_shortcuts.requests": "để mở danh sách các yêu cầu",
+  "keyboard_shortcuts.search": "để vào ô tìm kiếm",
+  "keyboard_shortcuts.start": "để mở cột \"Bắt đầu\"",
+  "keyboard_shortcuts.toggle_hidden": "để ẩn/hiện đằng sau văn bản CW",
+  "keyboard_shortcuts.toggle_sensitivity": "để hiển thị / ẩn media",
+  "keyboard_shortcuts.toot": "để viết tút mới",
+  "keyboard_shortcuts.unfocus": "để đưa con trỏ ra khỏi ô soạn thảo hoặc ô tìm kiếm",
+  "keyboard_shortcuts.up": "để di chuyển lên trong danh sách",
+  "lightbox.close": "Tắt",
+  "lightbox.next": "Tiếp",
+  "lightbox.previous": "Trước",
+  "lightbox.view_context": "Xem bối cảnh",
+  "lists.account.add": "Thêm vào danh sách",
+  "lists.account.remove": "Xóa khỏi danh sách",
+  "lists.delete": "Xóa danh sách",
+  "lists.edit": "Sửa danh sách",
+  "lists.edit.submit": "Thay đổi tiêu đề",
+  "lists.new.create": "Thêm vào danh sách",
+  "lists.new.title_placeholder": "Tên danh sách mới",
+  "lists.search": "Tìm kiếm trong số những người bạn quan tâm",
+  "lists.subheading": "Danh sách của bạn",
+  "load_pending": "{count, plural, other {}}",
+  "loading_indicator.label": "Đang tải...",
+  "media_gallery.toggle_visible": "Bật/tắt",
+  "missing_indicator.label": "Không tìm thấy",
+  "missing_indicator.sublabel": "Tài liệu này không thể được tìm thấy",
+  "mute_modal.hide_notifications": "Ẩn thông báo từ thành viên này?",
+  "navigation_bar.apps": "Ứng dụng di động",
+  "navigation_bar.blocks": "Người dùng bị chặn",
+  "navigation_bar.bookmarks": "Đã lưu",
+  "navigation_bar.community_timeline": "Dòng thời gian của miền",
+  "navigation_bar.compose": "Soạn tút mới",
+  "navigation_bar.direct": "Tin nhắn trực tiếp",
+  "navigation_bar.discover": "Khám phá",
+  "navigation_bar.domain_blocks": "Miền đã ẩn",
+  "navigation_bar.edit_profile": "Sửa hồ sơ cá nhân",
+  "navigation_bar.favourites": "Đã thích",
+  "navigation_bar.filters": "Nói cách tắt tiếng",
+  "navigation_bar.follow_requests": "Yêu cầu quan tâm",
+  "navigation_bar.follows_and_followers": "Đang quan tâm và được quan tâm",
+  "navigation_bar.info": "Giới thiệu",
+  "navigation_bar.keyboard_shortcuts": "Phím tắt",
+  "navigation_bar.lists": "Danh sách",
+  "navigation_bar.logout": "Đăng xuất",
+  "navigation_bar.mutes": "Người sử dụng tắt tiếng",
+  "navigation_bar.personal": "Cá nhân",
+  "navigation_bar.pins": "Tút được ghim",
+  "navigation_bar.preferences": "Tùy chỉnh",
+  "navigation_bar.public_timeline": "Dòng thời gian liên kết",
+  "navigation_bar.security": "Bảo mật",
+  "notification.favourite": "{name} favourited trạng thái của bạn",
+  "notification.follow": "{name} đã quan tâm bạn",
+  "notification.follow_request": "{name} đã yêu cầu theo dõi bạn",
+  "notification.mention": "{name} nhắc đến bạn",
+  "notification.own_poll": "Cuộc thăm dò của bạn đã kết thúc",
+  "notification.poll": "Một cuộc thăm dò bạn đã bỏ phiếu tại đã kết thúc",
+  "notification.reblog": "{name} loan tin tút của bạn",
+  "notifications.clear": "Xóa thông báo",
+  "notifications.clear_confirmation": "Bạn có chắc chắn muốn xóa vĩnh viễn tất cả các thông báo của mình?",
+  "notifications.column_settings.alert": "Thông báo trên máy tính",
+  "notifications.column_settings.favourite": "Đã thích:",
+  "notifications.column_settings.filter_bar.advanced": "Hiển thị tất cả các loại",
+  "notifications.column_settings.filter_bar.category": "Lọc nhanh",
+  "notifications.column_settings.filter_bar.show": "Hiện",
+  "notifications.column_settings.follow": "Người mới quan tâm :",
+  "notifications.column_settings.follow_request": "Yêu cầu theo dõi mới:",
+  "notifications.column_settings.mention": "Nhắc đến:",
+  "notifications.column_settings.poll": "Kết quả cuộc thăm dò:",
+  "notifications.column_settings.push": "Thông báo đẩy",
+  "notifications.column_settings.reblog": "Loan tin:",
+  "notifications.column_settings.show": "Hiện trong cột",
+  "notifications.column_settings.sound": "Mở tiếng",
+  "notifications.filter.all": "Toàn bộ",
+  "notifications.filter.boosts": "Loan tin",
+  "notifications.filter.favourites": "Đã thích",
+  "notifications.filter.follows": "Quan tâm",
+  "notifications.filter.mentions": "Nhắc đến",
+  "notifications.filter.polls": "Kết quả cuộc thăm dò",
+  "notifications.group": "{count} thông báo",
+  "poll.closed": "Đóng",
+  "poll.refresh": "Làm mới",
+  "poll.total_people": "{count, plural, other {}}",
+  "poll.total_votes": "{count, plural, other {}}",
+  "poll.vote": "Bỏ phiếu",
+  "poll.voted": "Bạn đã bình chọn cho câu trả lời này",
+  "poll_button.add_poll": "Tạo thăm dò",
+  "poll_button.remove_poll": "Bỏ thăm dò",
+  "privacy.change": "Điều chỉnh chế độ của tút",
+  "privacy.direct.long": "Chỉ gửi cho người được nhắc đến",
+  "privacy.direct.short": "Nhắn riêng",
+  "privacy.private.long": "Chỉ người quan tâm mới xem được",
+  "privacy.private.short": "Chỉ người quan tâm",
+  "privacy.public.long": "Đăng lên các dòng thời gian công khai",
+  "privacy.public.short": "Công khai",
+  "privacy.unlisted.long": "Không đăng lên các dòng thời gian công khai",
+  "privacy.unlisted.short": "Không công khai",
+  "refresh": "Làm tươi",
+  "regeneration_indicator.label": "Đang tải…",
+  "regeneration_indicator.sublabel": "Bảng tin của bạn đang được cập nhật!",
+  "relative_time.days": "{number} ngày",
+  "relative_time.hours": "{number} giờ",
+  "relative_time.just_now": "vừa xong",
+  "relative_time.minutes": "{number} phút",
+  "relative_time.seconds": "{number} giây",
+  "reply_indicator.cancel": "Hủy bỏ",
+  "report.forward": "Chuyển đến {target}",
+  "report.forward_hint": "Tài khoản này từ miền khác. Gửi thêm một báo cáo ẩn danh tới miền của tài khoản này?",
+  "report.hint": "Báo cáo này sẽ được gửi đến điều hành viên miền của bạn. Bạn có thể cung cấp lý do tại sao bạn lại báo cáo tài khoản vào này dưới đây:",
+  "report.placeholder": "Ý kiến ​​khác",
+  "report.submit": "Gửi đi",
+  "report.target": "Báo xấu {target}",
+  "search.placeholder": "Tìm kiếm",
+  "search_popout.search_format": "Tìm kiếm nâng cao theo cú pháp",
+  "search_popout.tips.full_text": "Không dùng ký tự đặc biệt sẽ trả về tút của bạn, tút bạn thích, tút bạn loan tin hoặc bạn được nhắc đến, kể cả tên tài khoản, tên hiển thị và hashtag.",
+  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.status": "tút",
+  "search_popout.tips.text": "không dùng ký tự đặc biệt sẽ trả về nội dung tương ứng, tên tài khoản và các hashtag.",
+  "search_popout.tips.user": "thành viên",
+  "search_results.accounts": "Người",
+  "search_results.hashtags": "Hashtags",
+  "search_results.statuses": "Tút",
+  "search_results.statuses_fts_disabled": "Tìm kiếm các tút theo nội dung của chúng không được kích hoạt trên trang Mastodon này.",
+  "search_results.total": "{đếm, số} {đếm, số nhiều, một {kết quả} khác {kết quả}}",
+  "status.admin_account": "Mở giao diện quản trị @{name}",
+  "status.admin_status": "Mở tút này trong giao diện quản trị",
+  "status.block": "Chặn @{name}",
+  "status.bookmark": "Lưu",
+  "status.cancel_reblog_private": "Hủy loan tin",
+  "status.cannot_reblog": "Không thể loan tin tút này",
+  "status.copy": "Sao chép liên kết đến tút",
+  "status.delete": "Xóa bỏ",
+  "status.detailed_status": "Chi tiết xem cuộc hội thoại",
+  "status.direct": "Nhắn riêng @{name}",
+  "status.embed": "Nhúng",
+  "status.favourite": "Thích",
+  "status.filtered": "Lọc qua",
+  "status.load_more": "Tải thêm",
+  "status.media_hidden": "Media đã ẩn",
+  "status.mention": "Nhắc đến @{name}",
+  "status.more": "Thêm nữa",
+  "status.mute": "Ẩn @{name}",
+  "status.mute_conversation": "Ẩn trao đổi",
+  "status.open": "Mở rộng tút này",
+  "status.pin": "Ghim trong hồ sơ",
+  "status.pinned": "Tút được ghim",
+  "status.read_more": "Đọc thêm",
+  "status.reblog": "Loan tin",
+  "status.reblog_private": "Loan tin đến những người có thể xem",
+  "status.reblogged_by": "{name} loan tin",
+  "status.reblogs.empty": "Chưa ai loan tin tút này, nếu có bạn sẽ thấy ở đây.",
+  "status.redraft": "Xóa & nháp lại",
+  "status.remove_bookmark": "Xóa",
+  "status.reply": "Trả lời",
+  "status.replyAll": "Trả lời chủ đề",
+  "status.report": "Báo cáo @{name}",
+  "status.sensitive_warning": "Nội dung nhạy cảm",
+  "status.share": "Chia sẻ",
+  "status.show_less": "Hiện ít hơn",
+  "status.show_less_all": "Hiển thị ít hơn cho tất cả",
+  "status.show_more": "Xem nhiều hơn",
+  "status.show_more_all": "Hiển thị thêm cho tất cả",
+  "status.show_thread": "Xem chủ đề",
+  "status.uncached_media_warning": "Không có sẵn",
+  "status.unmute_conversation": "Bỏ ẩn hội thoại",
+  "status.unpin": "Bỏ ghim khỏi hồ sơ",
+  "suggestions.dismiss": "Tắt đề xuất",
+  "suggestions.header": "Có thể bạn quan tâm…",
+  "tabs_bar.federated_timeline": "Miền liên kết",
+  "tabs_bar.home": "Bảng tin",
+  "tabs_bar.local_timeline": "Cùng miền",
+  "tabs_bar.notifications": "Thông báo",
+  "tabs_bar.search": "Tìm kiếm",
+  "time_remaining.days": "{number, plural, other {}} left",
+  "time_remaining.hours": "{number, plural, other {}} left",
+  "time_remaining.minutes": "{number, plural, other {}} left",
+  "time_remaining.moments": "Còn lại",
+  "time_remaining.seconds": "{number, plural, other {}} left",
+  "trends.count_by_accounts": "{Count} {rawCount, số nhiều, một {người} khác {người}} nói chuyện",
+  "trends.trending_now": "Đang là xu hướng",
+  "ui.beforeunload": "Bản nháp của bạn sẽ bị mất nếu bạn rời của Mastodon.",
+  "upload_area.title": "Kéo và thả để tải lên",
+  "upload_button.label": "Thêm media (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "Giới hạn tải lên tập tin vượt quá.",
+  "upload_error.poll": "Không thể tải file lên cùng với thăm dò",
+  "upload_form.audio_description": "Mô tả cho người có vấn đề về thính giác",
+  "upload_form.description": "Mô tả cho người khiếm thị",
+  "upload_form.edit": "Biên tập",
+  "upload_form.undo": "Xóa bỏ",
+  "upload_form.video_description": "Mô tả cho người có vấn đề về thính giác",
+  "upload_modal.analyzing_picture": "Phân tích hình ảnh",
+  "upload_modal.apply": "Ứng dụng",
+  "upload_modal.description_placeholder": "Một con cáo nâu nhanh nhẹn nhảy qua con chó lười",
+  "upload_modal.detect_text": "Phát hiện văn bản từ hình ảnh",
+  "upload_modal.edit_media": "Chỉnh sửa phương tiện truyền thông",
+  "upload_modal.hint": "Nhấp hoặc kéo vòng tròn trên bản xem trước để chọn tiêu điểm sẽ luôn được xem trên tất cả các hình thu nhỏ.",
+  "upload_modal.preview_label": "Xem trước ({tỷ lệ})",
+  "upload_progress.label": "Đang tải lên ...",
+  "video.close": "Đóng video",
+  "video.download": "Download file",
+  "video.exit_fullscreen": "Thoát toàn màn hình",
+  "video.expand": "Mở rộng video",
+  "video.fullscreen": "Toàn màn hình",
+  "video.hide": "Ẩn video",
+  "video.mute": "Tắt tiếng",
+  "video.pause": "Pause",
+  "video.play": "Play",
+  "video.unmute": "Mở tiếng"
+}
diff --git a/app/javascript/mastodon/locales/whitelist_is.json b/app/javascript/mastodon/locales/whitelist_is.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_is.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/whitelist_kab.json b/app/javascript/mastodon/locales/whitelist_kab.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_kab.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/whitelist_vi.json b/app/javascript/mastodon/locales/whitelist_vi.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_vi.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 550810680..62a86e75b 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "从列表中添加或删除",
   "account.badges.bot": "机器人",
+  "account.badges.group": "Group",
   "account.block": "屏蔽 @{name}",
   "account.block_domain": "隐藏来自 {domain} 的内容",
   "account.blocked": "已屏蔽",
@@ -38,10 +39,11 @@
   "account.unfollow": "取消关注",
   "account.unmute": "不再隐藏 @{name}",
   "account.unmute_notifications": "不再隐藏来自 @{name} 的通知",
-  "alert.rate_limited.message": "请在 {retry_time, time, medium} 后重试。",
+  "alert.rate_limited.message": "请在{retry_time, time, medium}后重试。",
   "alert.rate_limited.title": "频率受限",
   "alert.unexpected.message": "发生了意外错误。",
   "alert.unexpected.title": "哎呀!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "每星期 {count} 条",
   "boost_modal.combo": "下次按住 {combo} 即可跳过此提示",
   "bundle_column_error.body": "载入这个组件时发生了错误。",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "载入这个组件时发生了错误。",
   "bundle_modal_error.retry": "重试",
   "column.blocks": "已屏蔽的用户",
+  "column.bookmarks": "书签",
   "column.community": "本站时间轴",
   "column.direct": "私信",
   "column.directory": "浏览用户资料",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "投票持续时间",
   "compose_form.poll.option_placeholder": "选项 {number}",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "标记媒体为敏感内容",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "这里没有嘟文!",
   "empty_column.account_unavailable": "个人资料不可用",
   "empty_column.blocks": "你目前没有屏蔽任何用户。",
+  "empty_column.bookmarked_statuses": "你还没有给任何嘟文添加过书签。在你添加书签后,嘟文就会显示在这里。",
   "empty_column.community": "本站时间轴暂时没有内容,快写点什么让它动起来吧!",
   "empty_column.direct": "你还没有使用过私信。当你发出或者收到私信时,它会在这里显示。",
   "empty_column.domain_blocks": "目前没有被隐藏的站点。",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "打开隐藏用户列表",
   "keyboard_shortcuts.my_profile": "打开你的个人资料",
   "keyboard_shortcuts.notifications": "打开通知栏",
+  "keyboard_shortcuts.open_media": "打开媒体",
   "keyboard_shortcuts.pinned": "打开置顶嘟文列表",
   "keyboard_shortcuts.profile": "打开作者的个人资料",
   "keyboard_shortcuts.reply": "回复嘟文",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "同时隐藏来自这个用户的通知?",
   "navigation_bar.apps": "移动应用",
   "navigation_bar.blocks": "已屏蔽的用户",
+  "navigation_bar.bookmarks": "书签",
   "navigation_bar.community_timeline": "本站时间轴",
   "navigation_bar.compose": "撰写新嘟文",
   "navigation_bar.direct": "私信",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "安全",
   "notification.favourite": "{name} 喜欢了你的嘟文",
   "notification.follow": "{name} 开始关注你",
+  "notification.follow_request": "{name} 向你发送了关注请求",
   "notification.mention": "{name} 提及了你",
+  "notification.own_poll": "您的投票已经结束",
   "notification.poll": "你参与的一个投票已经结束",
   "notification.reblog": "{name} 转嘟了你的嘟文",
   "notifications.clear": "清空通知列表",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "快速过滤栏",
   "notifications.column_settings.filter_bar.show": "显示",
   "notifications.column_settings.follow": "当有人关注你时:",
+  "notifications.column_settings.follow_request": "新的关注请求:",
   "notifications.column_settings.mention": "当有人在嘟文中提及你时:",
   "notifications.column_settings.poll": "投票结果:",
   "notifications.column_settings.push": "推送通知",
@@ -299,7 +310,7 @@
   "notifications.group": "{count} 条通知",
   "poll.closed": "已关闭",
   "poll.refresh": "刷新",
-  "poll.total_people": "{count, plural, one {# 人} other {# 人}}",
+  "poll.total_people": "{count}人",
   "poll.total_votes": "{count} 票",
   "poll.vote": "投票",
   "poll.voted": "您已经对这个答案投过票了",
@@ -316,14 +327,14 @@
   "privacy.unlisted.short": "不公开",
   "refresh": "刷新",
   "regeneration_indicator.label": "加载中……",
-  "regeneration_indicator.sublabel": "你的主页时间轴正在准备中!",
+  "regeneration_indicator.sublabel": "你的主页动态正在准备中!",
   "relative_time.days": "{number}天",
   "relative_time.hours": "{number}时",
   "relative_time.just_now": "刚刚",
   "relative_time.minutes": "{number}分",
   "relative_time.seconds": "{number}秒",
   "reply_indicator.cancel": "取消",
-  "report.forward": "发送举报至 {target}",
+  "report.forward": "转发举报至 {target}",
   "report.forward_hint": "这名用户来自另一个服务器。是否要向那个服务器发送一条匿名的举报?",
   "report.hint": "举报将会发送给你所在服务器的监察员。你可以在下面填写举报该用户的理由:",
   "report.placeholder": "备注",
@@ -344,6 +355,7 @@
   "status.admin_account": "打开 @{name} 的管理界面",
   "status.admin_status": "打开这条嘟文的管理界面",
   "status.block": "屏蔽 @{name}",
+  "status.bookmark": "添加到书签",
   "status.cancel_reblog_private": "取消转嘟",
   "status.cannot_reblog": "这条嘟文不允许被转嘟",
   "status.copy": "复制嘟文链接",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} 转嘟了",
   "status.reblogs.empty": "没有人转嘟过此条嘟文。如果有人转嘟了,就会显示在这里。",
   "status.redraft": "删除并重新编辑",
+  "status.remove_bookmark": "移除书签",
   "status.reply": "回复",
   "status.replyAll": "回复所有人",
   "status.report": "举报 @{name}",
@@ -400,9 +413,11 @@
   "upload_button.label": "上传媒体文件 (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "文件大小超过限制。",
   "upload_error.poll": "投票中不允许上传文件。",
+  "upload_form.audio_description": "为听障人士添加文字描述",
   "upload_form.description": "为视觉障碍人士添加文字说明",
   "upload_form.edit": "编辑",
   "upload_form.undo": "删除",
+  "upload_form.video_description": "为听障人士和视障人士添加文字描述",
   "upload_modal.analyzing_picture": "分析图片…",
   "upload_modal.apply": "应用",
   "upload_modal.description_placeholder": "天地玄黄 宇宙洪荒 日月盈仄 辰宿列张",
@@ -412,6 +427,7 @@
   "upload_modal.preview_label": "预览 ({ratio})",
   "upload_progress.label": "上传中……",
   "video.close": "关闭视频",
+  "video.download": "下载文件",
   "video.exit_fullscreen": "退出全屏",
   "video.expand": "展开视频",
   "video.fullscreen": "全屏",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 3ca9f0e2e..4dcf70e6b 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -1,31 +1,32 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "從名單中新增或移除",
   "account.badges.bot": "機械人",
+  "account.badges.group": "Group",
   "account.block": "封鎖 @{name}",
   "account.block_domain": "隱藏來自 {domain} 的一切文章",
   "account.blocked": "封鎖",
-  "account.cancel_follow_request": "Cancel follow request",
+  "account.cancel_follow_request": "取消關注請求",
   "account.direct": "私訊 @{name}",
   "account.domain_blocked": "服務站被隱藏",
   "account.edit_profile": "修改個人資料",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "在個人資料推薦對方",
   "account.follow": "關注",
   "account.followers": "關注的人",
-  "account.followers.empty": "No one follows this user yet.",
+  "account.followers.empty": "尚沒有人關注這位使用者。",
   "account.follows": "正關注",
-  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows.empty": "這位使用者尚未關注任何使用者。",
   "account.follows_you": "關注你",
   "account.hide_reblogs": "隱藏 @{name} 的轉推",
-  "account.last_status": "Last active",
-  "account.link_verified_on": "Ownership of this link was checked on {date}",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.last_status": "上次活躍時間",
+  "account.link_verified_on": "此連結的所有權已在 {date} 檢查過",
+  "account.locked_info": "這隻帳戶的隱私狀態被設成鎖定。該擁有者會手動審核能關注這隻帳號的人。",
   "account.media": "媒體",
   "account.mention": "提及 @{name}",
   "account.moved_to": "{name} 已經遷移到:",
   "account.mute": "將 @{name} 靜音",
   "account.mute_notifications": "將來自 @{name} 的通知靜音",
   "account.muted": "靜音",
-  "account.never_active": "Never",
+  "account.never_active": "永不",
   "account.posts": "文章",
   "account.posts_with_replies": "包含回覆的文章",
   "account.report": "舉報 @{name}",
@@ -34,15 +35,16 @@
   "account.show_reblogs": "顯示 @{name} 的推文",
   "account.unblock": "解除對 @{name} 的封鎖",
   "account.unblock_domain": "不再隱藏 {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "不再於個人資料頁面推薦對方",
   "account.unfollow": "取消關注",
   "account.unmute": "取消 @{name} 的靜音",
   "account.unmute_notifications": "取消來自 @{name} 通知的靜音",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
+  "alert.rate_limited.message": "請在 {retry_time, time, medium} 過後重試",
+  "alert.rate_limited.title": "已限速",
   "alert.unexpected.message": "發生不可預期的錯誤。",
   "alert.unexpected.title": "噢!",
-  "autosuggest_hashtag.per_week": "{count} per week",
+  "announcement.announcement": "Announcement",
+  "autosuggest_hashtag.per_week": "{count} / 週",
   "boost_modal.combo": "如你想在下次路過這顯示,請按{combo},",
   "bundle_column_error.body": "加載本組件出錯。",
   "bundle_column_error.retry": "重試",
@@ -51,9 +53,10 @@
   "bundle_modal_error.message": "加載本組件出錯。",
   "bundle_modal_error.retry": "重試",
   "column.blocks": "封鎖用戶",
+  "column.bookmarks": "書籤",
   "column.community": "本站時間軸",
   "column.direct": "個人訊息",
-  "column.directory": "Browse profiles",
+  "column.directory": "瀏覽個人資料",
   "column.domain_blocks": "隱藏的服務站",
   "column.favourites": "最愛的文章",
   "column.follow_requests": "關注請求",
@@ -78,20 +81,22 @@
   "compose_form.lock_disclaimer": "你的用戶狀態為「{locked}」,任何人都能立即關注你,然後看到「只有關注者能看」的文章。",
   "compose_form.lock_disclaimer.lock": "公共",
   "compose_form.placeholder": "你在想甚麼?",
-  "compose_form.poll.add_option": "Add a choice",
-  "compose_form.poll.duration": "Poll duration",
-  "compose_form.poll.option_placeholder": "Choice {number}",
-  "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.add_option": "新增選擇",
+  "compose_form.poll.duration": "投票期限",
+  "compose_form.poll.option_placeholder": "第 {number} 個選擇",
+  "compose_form.poll.remove_option": "移除此選擇",
+  "compose_form.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_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Mark media as sensitive",
+  "compose_form.sensitive.hide": "標記媒體為敏感內容",
   "compose_form.sensitive.marked": "媒體被標示為敏感",
   "compose_form.sensitive.unmarked": "媒體沒有被標示為敏感",
   "compose_form.spoiler.marked": "文字被警告隱藏",
   "compose_form.spoiler.unmarked": "文字沒有被隱藏",
   "compose_form.spoiler_placeholder": "敏感警告訊息",
   "confirmation_modal.cancel": "取消",
-  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.block_and_report": "封鎖並檢舉",
   "confirmations.block.confirm": "封鎖",
   "confirmations.block.message": "你確定要封鎖{name}嗎?",
   "confirmations.delete.confirm": "刪除",
@@ -100,25 +105,25 @@
   "confirmations.delete_list.message": "你確定要永久刪除這列表嗎?",
   "confirmations.domain_block.confirm": "隱藏整個網站",
   "confirmations.domain_block.message": "你真的真的確定要隱藏整個 {domain} ?多數情況下,比較推薦封鎖或靜音幾個特定目標就好。你從此將不會再看到該站的內容和通知。來自該站的關注者亦會被移除。",
-  "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.logout.confirm": "登出",
+  "confirmations.logout.message": "確定要登出嗎?",
   "confirmations.mute.confirm": "靜音",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "這將會隱藏來自他們的貼文與通知,但是他們還是可以查閱你的貼文與關注你。",
   "confirmations.mute.message": "你確定要將{name}靜音嗎?",
   "confirmations.redraft.confirm": "刪除並編輯",
   "confirmations.redraft.message": "你確定要刪除並重新編輯嗎?所有相關的回覆、轉推與最愛都會被刪除。",
-  "confirmations.reply.confirm": "Reply",
-  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+  "confirmations.reply.confirm": "回覆",
+  "confirmations.reply.message": "現在回覆將蓋掉您目前正在撰寫的訊息。是否仍要回覆?",
   "confirmations.unfollow.confirm": "取消關注",
   "confirmations.unfollow.message": "真的不要繼續關注 {name} 了嗎?",
-  "conversation.delete": "Delete conversation",
-  "conversation.mark_as_read": "Mark as read",
-  "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
-  "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
-  "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
+  "conversation.delete": "刪除對話",
+  "conversation.mark_as_read": "標為已讀",
+  "conversation.open": "檢視對話",
+  "conversation.with": "與 {names}",
+  "directory.federated": "來自已知聯邦宇宙",
+  "directory.local": "僅來自 {domain}",
+  "directory.new_arrivals": "新貨",
+  "directory.recently_active": "最近活躍",
   "embed.instructions": "要內嵌此文章,請將以下代碼貼進你的網站。",
   "embed.preview": "看上去會是這樣:",
   "emoji_button.activity": "活動",
@@ -135,176 +140,182 @@
   "emoji_button.search_results": "搜尋結果",
   "emoji_button.symbols": "符號",
   "emoji_button.travel": "旅遊景物",
-  "empty_column.account_timeline": "No toots here!",
-  "empty_column.account_unavailable": "Profile unavailable",
-  "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.account_timeline": "這裡還沒有嘟文!",
+  "empty_column.account_unavailable": "無法取得個人資料",
+  "empty_column.blocks": "你還沒有封鎖任何使用者。",
+  "empty_column.bookmarked_statuses": "你還沒建立任何書籤。這裡將會顯示你建立的書籤。",
   "empty_column.community": "本站時間軸暫時未有內容,快寫一點東西來搶頭香啊!",
   "empty_column.direct": "你沒有個人訊息。當你發出或接收個人訊息,就會在這裡出現。",
-  "empty_column.domain_blocks": "There are no hidden domains yet.",
-  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
-  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
-  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.domain_blocks": "尚未隱藏任何網域。",
+  "empty_column.favourited_statuses": "你還沒收藏任何嘟文。這裡將會顯示你收藏的嘟文。",
+  "empty_column.favourites": "還沒有人收藏這則嘟文。這裡將會顯示被收藏的嘟文。",
+  "empty_column.follow_requests": "您尚未收到任何關注請求。這裡將會顯示收到的關注請求。",
   "empty_column.hashtag": "這個標籤暫時未有內容。",
   "empty_column.home": "你還沒有關注任何用戶。快看看{public},向其他用戶搭訕吧。",
   "empty_column.home.public_timeline": "公共時間軸",
   "empty_column.list": "這個列表暫時未有內容。",
-  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
-  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.lists": "你還沒有建立任何名單。這裡將會顯示你所建立的名單。",
+  "empty_column.mutes": "你尚未靜音任何使用者。",
   "empty_column.notifications": "你沒有任何通知紀錄,快向其他用戶搭訕吧。",
   "empty_column.public": "跨站時間軸暫時沒有內容!快寫一些公共的文章,或者關注另一些服務站的用戶吧!你和本站、友站的交流,將決定這裏出現的內容。",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.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.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "error.unexpected_crash.explanation": "由於發生系統故障或瀏覽器相容性問題,故無法正常顯示頁面。",
+  "error.unexpected_crash.next_steps": "請嘗試重新整理頁面。如果狀況沒有進展,你可以使用不同的瀏覽器或 Mastodon 應用程式來檢視。",
+  "errors.unexpected_crash.copy_stacktrace": "複製到剪貼簿",
+  "errors.unexpected_crash.report_issue": "舉報問題",
   "follow_request.authorize": "批准",
   "follow_request.reject": "拒絕",
   "getting_started.developers": "開發者",
-  "getting_started.directory": "Profile directory",
-  "getting_started.documentation": "Documentation",
+  "getting_started.directory": "個人資料目錄",
+  "getting_started.documentation": "文件",
   "getting_started.heading": "開始使用",
   "getting_started.invite": "邀請使用者",
   "getting_started.open_source_notice": "Mastodon(萬象)是一個開放源碼的軟件。你可以在官方 GitHub ({github}) 貢獻或者回報問題。",
   "getting_started.security": "帳戶安全",
   "getting_started.terms": "服務條款",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.select.no_options_message": "No suggestions found",
-  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_header.tag_mode.all": "以及{additional}",
+  "hashtag.column_header.tag_mode.any": "或是{additional}",
+  "hashtag.column_header.tag_mode.none": "而無需{additional}",
+  "hashtag.column_settings.select.no_options_message": "找不到建議",
+  "hashtag.column_settings.select.placeholder": "輸入主題標籤…",
+  "hashtag.column_settings.tag_mode.all": "全部",
+  "hashtag.column_settings.tag_mode.any": "任一",
+  "hashtag.column_settings.tag_mode.none": "全不",
   "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
   "home.column_settings.basic": "基本",
   "home.column_settings.show_reblogs": "顯示被轉推的文章",
   "home.column_settings.show_replies": "顯示回應文章",
-  "intervals.full.days": "{number, plural, one {# day} other {# days}}",
-  "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}",
-  "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}",
-  "introduction.federation.action": "Next",
-  "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
-  "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
-  "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
+  "intervals.full.days": "{number, plural, one {# 天} other {# 天}}",
+  "intervals.full.hours": "{number, plural, one {# 小時} other {# 小時}}",
+  "intervals.full.minutes": "{number, plural, one {# 分鐘} other {# 分鐘}}",
+  "introduction.federation.action": "下一步",
+  "introduction.federation.federated.headline": "站台聯盟",
+  "introduction.federation.federated.text": "來自聯盟宇宙中其他站台的公開嘟文將會在站點聯盟時間軸中顯示。",
+  "introduction.federation.home.headline": "首頁",
+  "introduction.federation.home.text": "你關注使用者的嘟文將會在首頁動態中顯示。你可以關注任何伺服器上的任何人!",
+  "introduction.federation.local.headline": "本機",
+  "introduction.federation.local.text": "跟您同伺服器之使用者所發的公開嘟文將會顯示在本機時間軸中。",
   "introduction.interactions.action": "Finish toot-orial!",
-  "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "introduction.interactions.favourite.headline": "關注",
+  "introduction.interactions.favourite.text": "您能儲存嘟文供稍候觀看,或者收藏嘟文,讓作者知道您喜歡這則嘟文。",
+  "introduction.interactions.reblog.headline": "轉嘟",
+  "introduction.interactions.reblog.text": "您能藉由轉嘟他人嘟文來分享給您的關注者。",
+  "introduction.interactions.reply.headline": "回覆",
+  "introduction.interactions.reply.text": "您能回覆其他人或自己的嘟文,這麼做會把這些回覆串成一串對話。",
+  "introduction.welcome.action": "開始旅程吧!",
+  "introduction.welcome.headline": "第一步",
+  "introduction.welcome.text": "歡迎來到聯盟宇宙!等等你就可以廣播訊息及跨越各種各式各樣的伺服器與朋友聊天。但這台伺服器,{domain},非常特別 - 它寄管了你的個人資料,所以請記住它的名字。",
   "keyboard_shortcuts.back": "後退",
-  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.blocked": "開啟「封鎖使用者」名單",
   "keyboard_shortcuts.boost": "轉推",
   "keyboard_shortcuts.column": "把標示移動到其中一列",
   "keyboard_shortcuts.compose": "把標示移動到文字輸入區",
   "keyboard_shortcuts.description": "描述",
-  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.direct": "開啟私訊欄",
   "keyboard_shortcuts.down": "在列表往下移動",
   "keyboard_shortcuts.enter": "打開文章",
   "keyboard_shortcuts.favourite": "收藏",
-  "keyboard_shortcuts.favourites": "to open favourites list",
-  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.favourites": "開啟收藏名單",
+  "keyboard_shortcuts.federated": "開啟站點聯盟時間軸",
   "keyboard_shortcuts.heading": "鍵盤快速鍵",
-  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.home": "開啟首頁時間軸",
   "keyboard_shortcuts.hotkey": "快速鍵",
   "keyboard_shortcuts.legend": "顯示這個說明",
-  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.local": "開啟本機時間軸",
   "keyboard_shortcuts.mention": "提及作者",
-  "keyboard_shortcuts.muted": "to open muted users list",
-  "keyboard_shortcuts.my_profile": "to open your profile",
-  "keyboard_shortcuts.notifications": "to open notifications column",
-  "keyboard_shortcuts.pinned": "to open pinned toots list",
-  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.muted": "開啟靜音使用者名單",
+  "keyboard_shortcuts.my_profile": "開啟個人資料頁面",
+  "keyboard_shortcuts.notifications": "開啟通知欄",
+  "keyboard_shortcuts.open_media": "開啟媒體",
+  "keyboard_shortcuts.pinned": "開啟釘選的嘟文名單",
+  "keyboard_shortcuts.profile": "開啟作者的個人資料頁面",
   "keyboard_shortcuts.reply": "回覆",
-  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.requests": "開啟關注請求名單",
   "keyboard_shortcuts.search": "把標示移動到搜索",
-  "keyboard_shortcuts.start": "to open \"get started\" column",
+  "keyboard_shortcuts.start": "開啟「開始使用」欄位",
   "keyboard_shortcuts.toggle_hidden": "顯示或隱藏被標為敏感的文字",
-  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+  "keyboard_shortcuts.toggle_sensitivity": "顯示 / 隱藏媒體",
   "keyboard_shortcuts.toot": "新的推文",
   "keyboard_shortcuts.unfocus": "把標示移離文字輸入和搜索",
   "keyboard_shortcuts.up": "在列表往上移動",
   "lightbox.close": "關閉",
   "lightbox.next": "繼續",
   "lightbox.previous": "回退",
-  "lightbox.view_context": "View context",
+  "lightbox.view_context": "檢視內文",
   "lists.account.add": "新增到列表",
   "lists.account.remove": "從列表刪除",
   "lists.delete": "刪除列表",
   "lists.edit": "編輯列表",
-  "lists.edit.submit": "Change title",
+  "lists.edit.submit": "變更標題",
   "lists.new.create": "新增列表",
   "lists.new.title_placeholder": "新列表標題",
   "lists.search": "從你關注的用戶中搜索",
   "lists.subheading": "列表",
-  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "load_pending": "{count, plural, other {# 個新項目}}",
   "loading_indicator.label": "載入中...",
   "media_gallery.toggle_visible": "打開或關上",
   "missing_indicator.label": "找不到內容",
   "missing_indicator.sublabel": "無法找到內容",
   "mute_modal.hide_notifications": "隱藏來自這用戶的通知嗎?",
-  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.apps": "封鎖的使用者",
   "navigation_bar.blocks": "被你封鎖的用戶",
+  "navigation_bar.bookmarks": "書籤",
   "navigation_bar.community_timeline": "本站時間軸",
-  "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.compose": "撰寫新嘟文",
   "navigation_bar.direct": "個人訊息",
   "navigation_bar.discover": "探索",
   "navigation_bar.domain_blocks": "隱藏的服務站",
   "navigation_bar.edit_profile": "修改個人資料",
   "navigation_bar.favourites": "最愛的內容",
-  "navigation_bar.filters": "Muted words",
+  "navigation_bar.filters": "靜音詞彙",
   "navigation_bar.follow_requests": "關注請求",
-  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.follows_and_followers": "關注及關注者",
   "navigation_bar.info": "關於本服務站",
   "navigation_bar.keyboard_shortcuts": "鍵盤快速鍵",
   "navigation_bar.lists": "列表",
   "navigation_bar.logout": "登出",
   "navigation_bar.mutes": "被你靜音的用戶",
-  "navigation_bar.personal": "Personal",
+  "navigation_bar.personal": "個人",
   "navigation_bar.pins": "置頂文章",
   "navigation_bar.preferences": "偏好設定",
   "navigation_bar.public_timeline": "跨站時間軸",
   "navigation_bar.security": "安全",
   "notification.favourite": "{name} 收藏了你的文章",
   "notification.follow": "{name} 開始關注你",
+  "notification.follow_request": "{name} 要求關注你",
   "notification.mention": "{name} 提及你",
-  "notification.poll": "A poll you have voted in has ended",
+  "notification.own_poll": "您的投票已結束",
+  "notification.poll": "您投過的投票已經結束",
   "notification.reblog": "{name} 轉推你的文章",
   "notifications.clear": "清空通知紀錄",
   "notifications.clear_confirmation": "你確定要清空通知紀錄嗎?",
   "notifications.column_settings.alert": "顯示桌面通知",
   "notifications.column_settings.favourite": "收藏了你的文章:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.advanced": "顯示所有分類",
+  "notifications.column_settings.filter_bar.category": "快速過濾欄",
+  "notifications.column_settings.filter_bar.show": "顯示",
   "notifications.column_settings.follow": "關注你:",
+  "notifications.column_settings.follow_request": "新的關注請求:",
   "notifications.column_settings.mention": "提及你:",
-  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.poll": "投票結果:",
   "notifications.column_settings.push": "推送通知",
   "notifications.column_settings.reblog": "轉推你的文章:",
   "notifications.column_settings.show": "在通知欄顯示",
   "notifications.column_settings.sound": "播放音效",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
-  "notifications.filter.polls": "Poll results",
+  "notifications.filter.all": "全部",
+  "notifications.filter.boosts": "轉嘟",
+  "notifications.filter.favourites": "最愛",
+  "notifications.filter.follows": "關注的使用者",
+  "notifications.filter.mentions": "提及",
+  "notifications.filter.polls": "投票結果",
   "notifications.group": "{count} 條通知",
-  "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
-  "poll.total_votes": "{count, plural, one {# vote} other {# votes}}",
-  "poll.vote": "Vote",
-  "poll.voted": "You voted for this answer",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll.closed": "已關閉",
+  "poll.refresh": "重新整理",
+  "poll.total_people": "{count, plural, one {# 個投票} other {# 個投票}}",
+  "poll.total_votes": "{count, plural, one {# 個投票} other {# 個投票}}",
+  "poll.vote": "投票",
+  "poll.voted": "你已對此問題投票",
+  "poll_button.add_poll": "建立投票",
+  "poll_button.remove_poll": "移除投票",
   "privacy.change": "調整私隱設定",
   "privacy.direct.long": "只有提及的用戶能看到",
   "privacy.direct.short": "私人訊息",
@@ -314,7 +325,7 @@
   "privacy.public.short": "公共",
   "privacy.unlisted.long": "公開,但不在公共時間軸顯示",
   "privacy.unlisted.short": "公開",
-  "refresh": "Refresh",
+  "refresh": "重新整理",
   "regeneration_indicator.label": "載入中……",
   "regeneration_indicator.sublabel": "你的主頁時間軸正在準備中!",
   "relative_time.days": "{number}日",
@@ -339,20 +350,21 @@
   "search_results.accounts": "使用者",
   "search_results.hashtags": "標籤",
   "search_results.statuses": "文章",
-  "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
+  "search_results.statuses_fts_disabled": "「依內容搜尋嘟文」未在此 Mastodon 伺服器啟用。",
   "search_results.total": "{count, number} 項結果",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "開啟 @{name} 的管理介面",
+  "status.admin_status": "在管理介面開啟此嘟文",
   "status.block": "封鎖 @{name}",
+  "status.bookmark": "書籤",
   "status.cancel_reblog_private": "取消轉推",
   "status.cannot_reblog": "這篇文章無法被轉推",
-  "status.copy": "Copy link to status",
+  "status.copy": "將連結複製到嘟文中",
   "status.delete": "刪除",
-  "status.detailed_status": "Detailed conversation view",
+  "status.detailed_status": "對話的詳細內容",
   "status.direct": "私訊 @{name}",
   "status.embed": "鑲嵌",
   "status.favourite": "收藏",
-  "status.filtered": "Filtered",
+  "status.filtered": "已過濾",
   "status.load_more": "載入更多",
   "status.media_hidden": "隱藏媒體內容",
   "status.mention": "提及 @{name}",
@@ -362,12 +374,13 @@
   "status.open": "展開文章",
   "status.pin": "置頂到資料頁",
   "status.pinned": "置頂文章",
-  "status.read_more": "Read more",
+  "status.read_more": "閱讀更多",
   "status.reblog": "轉推",
   "status.reblog_private": "轉推到原讀者",
   "status.reblogged_by": "{name} 轉推",
-  "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
+  "status.reblogs.empty": "還沒有人轉嘟。如果有,會顯示在這裡。",
   "status.redraft": "刪除並編輯",
+  "status.remove_bookmark": "移除書籤",
   "status.reply": "回應",
   "status.replyAll": "回應所有人",
   "status.report": "舉報 @{name}",
@@ -377,41 +390,44 @@
   "status.show_less_all": "減少顯示這類文章",
   "status.show_more": "顯示更多",
   "status.show_more_all": "顯示更多這類文章",
-  "status.show_thread": "Show thread",
-  "status.uncached_media_warning": "Not available",
+  "status.show_thread": "顯示討論串",
+  "status.uncached_media_warning": "無法使用",
   "status.unmute_conversation": "解禁對話",
   "status.unpin": "解除置頂",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
+  "suggestions.dismiss": "關閉建議",
+  "suggestions.header": "您可能對這些東西有興趣…",
   "tabs_bar.federated_timeline": "跨站",
   "tabs_bar.home": "主頁",
   "tabs_bar.local_timeline": "本站",
   "tabs_bar.notifications": "通知",
   "tabs_bar.search": "搜尋",
-  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
-  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
-  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
-  "time_remaining.moments": "Moments remaining",
-  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "time_remaining.days": "剩餘{number, plural, one {# 天數} other {# 天數}}",
+  "time_remaining.hours": "剩餘{number, plural, one {# 小時} other {# 小時}}",
+  "time_remaining.minutes": "剩餘{number, plural, one {# 分鐘} other {# 分鐘}}",
+  "time_remaining.moments": "剩餘時間",
+  "time_remaining.seconds": "剩餘 {number, plural, one {# 秒} other {# 秒}}",
   "trends.count_by_accounts": "{count} 位用戶在討論",
-  "trends.trending_now": "Trending now",
+  "trends.trending_now": "目前趨勢",
   "ui.beforeunload": "如果你現在離開 Mastodon,你的草稿內容將會被丟棄。",
   "upload_area.title": "將檔案拖放至此上載",
   "upload_button.label": "上載媒體檔案",
-  "upload_error.limit": "File upload limit exceeded.",
-  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_error.limit": "已達到檔案上傳限制。",
+  "upload_error.poll": "不允許在投票上傳檔案。",
+  "upload_form.audio_description": "簡單描述內容給聽障人士",
   "upload_form.description": "為視覺障礙人士添加文字說明",
-  "upload_form.edit": "Edit",
+  "upload_form.edit": "編輯",
   "upload_form.undo": "刪除",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
-  "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.preview_label": "Preview ({ratio})",
+  "upload_form.video_description": "簡單描述給聽障或視障人士",
+  "upload_modal.analyzing_picture": "正在分析圖片…",
+  "upload_modal.apply": "套用",
+  "upload_modal.description_placeholder": "A quick brown fox 跳過那隻懶狗",
+  "upload_modal.detect_text": "從圖片偵測文字",
+  "upload_modal.edit_media": "編輯媒體",
+  "upload_modal.hint": "點擊或拖曳圓圈以選擇預覽縮圖。",
+  "upload_modal.preview_label": "預覽 ({ratio})",
   "upload_progress.label": "上載中……",
   "video.close": "關閉影片",
+  "video.download": "下載檔案",
   "video.exit_fullscreen": "退出全熒幕",
   "video.expand": "展開影片",
   "video.fullscreen": "全熒幕",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index 136573381..ab680223e 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -1,6 +1,7 @@
 {
   "account.add_or_remove_from_list": "從名單中新增或移除",
   "account.badges.bot": "機器人",
+  "account.badges.group": "Group",
   "account.block": "封鎖 @{name}",
   "account.block_domain": "隱藏來自 {domain} 的所有內容",
   "account.blocked": "已封鎖",
@@ -42,6 +43,7 @@
   "alert.rate_limited.title": "已限速",
   "alert.unexpected.message": "發生了非預期的錯誤。",
   "alert.unexpected.title": "哎呀!",
+  "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} / 週",
   "boost_modal.combo": "下次您可以按 {combo} 跳過",
   "bundle_column_error.body": "載入此元件時發生錯誤。",
@@ -51,6 +53,7 @@
   "bundle_modal_error.message": "載入此元件時發生錯誤。",
   "bundle_modal_error.retry": "重試",
   "column.blocks": "封鎖的使用者",
+  "column.bookmarks": "書籤",
   "column.community": "本機時間軸",
   "column.direct": "私訊",
   "column.directory": "瀏覽個人資料",
@@ -82,6 +85,8 @@
   "compose_form.poll.duration": "投票期限",
   "compose_form.poll.option_placeholder": "第 {number} 個選擇",
   "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_loud": "{publish}!",
   "compose_form.sensitive.hide": "標記媒體為敏感內容",
@@ -103,7 +108,7 @@
   "confirmations.logout.confirm": "登出",
   "confirmations.logout.message": "確定要登出嗎?",
   "confirmations.mute.confirm": "靜音",
-  "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
+  "confirmations.mute.explanation": "這將會隱藏來自他們的貼文與通知,但是他們還是可以查閱你的貼文與關注你。",
   "confirmations.mute.message": "確定靜音 {name} ?",
   "confirmations.redraft.confirm": "刪除並重新編輯",
   "confirmations.redraft.message": "確定刪掉這則嘟文並重新編輯嗎?將會失去這則嘟文的轉嘟及收藏,且回覆這則的嘟文將會變成獨立的嘟文。",
@@ -138,6 +143,7 @@
   "empty_column.account_timeline": "這裡還沒有嘟文!",
   "empty_column.account_unavailable": "無法取得個人資料",
   "empty_column.blocks": "你還沒有封鎖任何使用者。",
+  "empty_column.bookmarked_statuses": "你還沒建立任何書籤。這裡將會顯示你建立的書籤。",
   "empty_column.community": "本地時間軸是空的。快公開嘟些文搶頭香啊!",
   "empty_column.direct": "您還沒有任何私訊。當您私訊別人或收到私訊時,它將於此顯示。",
   "empty_column.domain_blocks": "尚未隱藏任何網域。",
@@ -152,10 +158,10 @@
   "empty_column.mutes": "你尚未靜音任何使用者。",
   "empty_column.notifications": "您尚未收到任何通知,和別人互動開啟對話吧。",
   "empty_column.public": "這裡什麼都沒有!嘗試寫些公開的嘟文,或著自己關注其他伺服器的使用者後就會有嘟文出現了",
-  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
-  "error.unexpected_crash.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.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "error.unexpected_crash.explanation": "由於發生系統故障或瀏覽器相容性問題,故無法正常顯示頁面。",
+  "error.unexpected_crash.next_steps": "請嘗試重新整理頁面。如果狀況沒有進展,你可以使用不同的瀏覽器或 Mastodon 應用程式來檢視。",
+  "errors.unexpected_crash.copy_stacktrace": "複製到剪貼簿",
+  "errors.unexpected_crash.report_issue": "舉報問題",
   "follow_request.authorize": "授權",
   "follow_request.reject": "拒絕",
   "getting_started.developers": "開發者",
@@ -219,6 +225,7 @@
   "keyboard_shortcuts.muted": "開啟靜音使用者名單",
   "keyboard_shortcuts.my_profile": "開啟個人資料頁面",
   "keyboard_shortcuts.notifications": "開啟通知欄",
+  "keyboard_shortcuts.open_media": "開啟媒體",
   "keyboard_shortcuts.pinned": "開啟釘選的嘟文名單",
   "keyboard_shortcuts.profile": "開啟作者的個人資料頁面",
   "keyboard_shortcuts.reply": "回覆",
@@ -251,6 +258,7 @@
   "mute_modal.hide_notifications": "隱藏來自這位使用者的通知?",
   "navigation_bar.apps": "封鎖的使用者",
   "navigation_bar.blocks": "封鎖使用者",
+  "navigation_bar.bookmarks": "書籤",
   "navigation_bar.community_timeline": "本機時間軸",
   "navigation_bar.compose": "撰寫新嘟文",
   "navigation_bar.direct": "私訊",
@@ -273,7 +281,9 @@
   "navigation_bar.security": "安全性",
   "notification.favourite": "{name} 把你的嘟文加入了最愛",
   "notification.follow": "{name} 關注了你",
+  "notification.follow_request": "{name} 要求關注你",
   "notification.mention": "{name} 提到了你",
+  "notification.own_poll": "您的投票已結束",
   "notification.poll": "您投過的投票已經結束",
   "notification.reblog": "{name}轉嘟了你的嘟文",
   "notifications.clear": "清除通知",
@@ -284,6 +294,7 @@
   "notifications.column_settings.filter_bar.category": "快速過濾欄",
   "notifications.column_settings.filter_bar.show": "顯示",
   "notifications.column_settings.follow": "新關注者:",
+  "notifications.column_settings.follow_request": "新的關注請求:",
   "notifications.column_settings.mention": "提及:",
   "notifications.column_settings.poll": "投票結果:",
   "notifications.column_settings.push": "推送通知",
@@ -299,7 +310,7 @@
   "notifications.group": "{count} 條通知",
   "poll.closed": "已關閉",
   "poll.refresh": "重新整理",
-  "poll.total_people": "{count, plural, one {# person} other {# people}}",
+  "poll.total_people": "{count, plural, one {# 個投票} other {# 個投票}}",
   "poll.total_votes": "{count, plural, one {# 個投票} other {# 個投票}}",
   "poll.vote": "投票",
   "poll.voted": "你已對此問題投票",
@@ -314,7 +325,7 @@
   "privacy.public.short": "公開",
   "privacy.unlisted.long": "公開,但不會顯示在公開時間軸",
   "privacy.unlisted.short": "不公開",
-  "refresh": "Refresh",
+  "refresh": "重新整理",
   "regeneration_indicator.label": "載入中…",
   "regeneration_indicator.sublabel": "你的主頁時間軸正在準備中!",
   "relative_time.days": "{number} 天",
@@ -344,6 +355,7 @@
   "status.admin_account": "開啟 @{name} 的管理介面",
   "status.admin_status": "在管理介面開啟此嘟文",
   "status.block": "封鎖 @{name}",
+  "status.bookmark": "書籤",
   "status.cancel_reblog_private": "取消轉嘟",
   "status.cannot_reblog": "這篇嘟文無法被轉嘟",
   "status.copy": "將連結複製到嘟文中",
@@ -368,6 +380,7 @@
   "status.reblogged_by": "{name} 轉嘟了",
   "status.reblogs.empty": "還沒有人轉嘟。如果有,會顯示在這裡。",
   "status.redraft": "刪除 & 編輯",
+  "status.remove_bookmark": "移除書籤",
   "status.reply": "回覆",
   "status.replyAll": "回覆所有人",
   "status.report": "檢舉 @{name}",
@@ -400,18 +413,21 @@
   "upload_button.label": "上傳媒體檔案 (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "已達到檔案上傳限制。",
   "upload_error.poll": "不允許在投票上傳檔案。",
+  "upload_form.audio_description": "簡單描述內容給聽障人士",
   "upload_form.description": "為視障人士增加文字說明",
   "upload_form.edit": "編輯",
   "upload_form.undo": "刪除",
+  "upload_form.video_description": "簡單描述給聽障或視障人士",
   "upload_modal.analyzing_picture": "正在分析圖片…",
   "upload_modal.apply": "套用",
   "upload_modal.description_placeholder": "A quick brown fox 跳過那隻懶狗",
   "upload_modal.detect_text": "從圖片偵測文字",
   "upload_modal.edit_media": "編輯媒體",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.hint": "點擊或拖曳圓圈以選擇預覽縮圖。",
   "upload_modal.preview_label": "預覽 ({ratio})",
   "upload_progress.label": "上傳中...",
   "video.close": "關閉影片",
+  "video.download": "下載檔案",
   "video.exit_fullscreen": "退出全螢幕",
   "video.expand": "展開影片",
   "video.fullscreen": "全螢幕",
diff --git a/app/javascript/mastodon/reducers/announcements.js b/app/javascript/mastodon/reducers/announcements.js
new file mode 100644
index 000000000..34e08eac8
--- /dev/null
+++ b/app/javascript/mastodon/reducers/announcements.js
@@ -0,0 +1,102 @@
+import {
+  ANNOUNCEMENTS_FETCH_REQUEST,
+  ANNOUNCEMENTS_FETCH_SUCCESS,
+  ANNOUNCEMENTS_FETCH_FAIL,
+  ANNOUNCEMENTS_UPDATE,
+  ANNOUNCEMENTS_REACTION_UPDATE,
+  ANNOUNCEMENTS_REACTION_ADD_REQUEST,
+  ANNOUNCEMENTS_REACTION_ADD_FAIL,
+  ANNOUNCEMENTS_REACTION_REMOVE_REQUEST,
+  ANNOUNCEMENTS_REACTION_REMOVE_FAIL,
+  ANNOUNCEMENTS_TOGGLE_SHOW,
+  ANNOUNCEMENTS_DELETE,
+  ANNOUNCEMENTS_DISMISS_SUCCESS,
+} from '../actions/announcements';
+import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
+
+const initialState = ImmutableMap({
+  items: ImmutableList(),
+  isLoading: false,
+  show: false,
+});
+
+const updateReaction = (state, id, name, updater) => state.update('items', list => list.map(announcement => {
+  if (announcement.get('id') === id) {
+    return announcement.update('reactions', reactions => {
+      const idx = reactions.findIndex(reaction => reaction.get('name') === name);
+
+      if (idx > -1) {
+        return reactions.update(idx, reaction => updater(reaction));
+      }
+
+      return reactions.push(updater(fromJS({ name, count: 0 })));
+    });
+  }
+
+  return announcement;
+}));
+
+const updateReactionCount = (state, reaction) => updateReaction(state, reaction.announcement_id, reaction.name, x => x.set('count', reaction.count));
+
+const addReaction = (state, id, name) => updateReaction(state, id, name, x => x.set('me', true).update('count', y => y + 1));
+
+const removeReaction = (state, id, name) => updateReaction(state, id, name, x => x.set('me', false).update('count', y => y - 1));
+
+const sortAnnouncements = list => list.sortBy(x => x.get('starts_at') || x.get('published_at'));
+
+const updateAnnouncement = (state, announcement) => {
+  const idx = state.get('items').findIndex(x => x.get('id') === announcement.get('id'));
+
+  if (idx > -1) {
+    // Deep merge is used because announcements from the streaming API do not contain
+    // personalized data about which reactions have been selected by the given user,
+    // and that is information we want to preserve
+    return state.update('items', list => sortAnnouncements(list.update(idx, x => x.mergeDeep(announcement))));
+  }
+
+  return state.update('items', list => sortAnnouncements(list.unshift(announcement)));
+};
+
+export default function announcementsReducer(state = initialState, action) {
+  switch(action.type) {
+  case ANNOUNCEMENTS_TOGGLE_SHOW:
+    return state.withMutations(map => {
+      map.set('show', !map.get('show'));
+    });
+  case ANNOUNCEMENTS_FETCH_REQUEST:
+    return state.set('isLoading', true);
+  case ANNOUNCEMENTS_FETCH_SUCCESS:
+    return state.withMutations(map => {
+      const items = fromJS(action.announcements);
+
+      map.set('items', items);
+      map.set('isLoading', false);
+    });
+  case ANNOUNCEMENTS_FETCH_FAIL:
+    return state.set('isLoading', false);
+  case ANNOUNCEMENTS_UPDATE:
+    return updateAnnouncement(state, fromJS(action.announcement));
+  case ANNOUNCEMENTS_REACTION_UPDATE:
+    return updateReactionCount(state, action.reaction);
+  case ANNOUNCEMENTS_REACTION_ADD_REQUEST:
+  case ANNOUNCEMENTS_REACTION_REMOVE_FAIL:
+    return addReaction(state, action.id, action.name);
+  case ANNOUNCEMENTS_REACTION_REMOVE_REQUEST:
+  case ANNOUNCEMENTS_REACTION_ADD_FAIL:
+    return removeReaction(state, action.id, action.name);
+  case ANNOUNCEMENTS_DISMISS_SUCCESS:
+    return updateAnnouncement(state, fromJS({ 'id': action.id, 'read': true }));
+  case ANNOUNCEMENTS_DELETE:
+    return state.update('items', list => {
+      const idx = list.findIndex(x => x.get('id') === action.id);
+
+      if (idx > -1) {
+        return list.delete(idx);
+      }
+
+      return list;
+    });
+  default:
+    return state;
+  }
+};
diff --git a/app/javascript/mastodon/reducers/index.js b/app/javascript/mastodon/reducers/index.js
index b8d608888..b9817cd38 100644
--- a/app/javascript/mastodon/reducers/index.js
+++ b/app/javascript/mastodon/reducers/index.js
@@ -34,8 +34,10 @@ import polls from './polls';
 import identity_proofs from './identity_proofs';
 import trends from './trends';
 import missed_updates from './missed_updates';
+import announcements from './announcements';
 
 const reducers = {
+  announcements,
   dropdown_menu,
   timelines,
   meta,
diff --git a/app/javascript/mastodon/reducers/statuses.js b/app/javascript/mastodon/reducers/statuses.js
index 772f98bcb..2554c008d 100644
--- a/app/javascript/mastodon/reducers/statuses.js
+++ b/app/javascript/mastodon/reducers/statuses.js
@@ -12,6 +12,7 @@ import {
   STATUS_UNMUTE_SUCCESS,
   STATUS_REVEAL,
   STATUS_HIDE,
+  STATUS_COLLAPSE,
 } from '../actions/statuses';
 import { TIMELINE_DELETE } from '../actions/timelines';
 import { STATUS_IMPORT, STATUSES_IMPORT } from '../actions/importer';
@@ -41,8 +42,7 @@ export default function statuses(state = initialState, action) {
   case FAVOURITE_REQUEST:
     return state.setIn([action.status.get('id'), 'favourited'], true);
   case UNFAVOURITE_SUCCESS:
-    const favouritesCount = action.status.get('favourites_count');
-    return state.setIn([action.status.get('id'), 'favourites_count'], favouritesCount - 1);
+    return state.updateIn([action.status.get('id'), 'favourites_count'], x => Math.max(0, x - 1));
   case FAVOURITE_FAIL:
     return state.get(action.status.get('id')) === undefined ? state : state.setIn([action.status.get('id'), 'favourited'], false);
   case BOOKMARK_REQUEST:
@@ -73,6 +73,8 @@ export default function statuses(state = initialState, action) {
         }
       });
     });
+  case STATUS_COLLAPSE:
+    return state.setIn([action.id, 'collapsed'], action.isCollapsed);
   case TIMELINE_DELETE:
     return deleteStatus(state, action.id, action.references);
   default:
diff --git a/app/javascript/mastodon/selectors/index.js b/app/javascript/mastodon/selectors/index.js
index 6f1ce9602..6a48f3b3f 100644
--- a/app/javascript/mastodon/selectors/index.js
+++ b/app/javascript/mastodon/selectors/index.js
@@ -26,6 +26,7 @@ const toServerSideType = columnType => {
   case 'notifications':
   case 'public':
   case 'thread':
+  case 'account':
     return columnType;
   default:
     if (columnType.indexOf('list:') > -1) {
diff --git a/app/javascript/mastodon/stream.js b/app/javascript/mastodon/stream.js
index 50f90d44c..0cb2b228f 100644
--- a/app/javascript/mastodon/stream.js
+++ b/app/javascript/mastodon/stream.js
@@ -2,6 +2,14 @@ import WebSocketClient from '@gamestdio/websocket';
 
 const randomIntUpTo = max => Math.floor(Math.random() * Math.floor(max));
 
+const knownEventTypes = [
+  'update',
+  'delete',
+  'notification',
+  'conversation',
+  'filters_changed',
+];
+
 export function connectStream(path, pollingRefresh = null, callbacks = () => ({ onConnect() {}, onDisconnect() {}, onReceive() {} })) {
   return (dispatch, getState) => {
     const streamingAPIBaseURL = getState().getIn(['meta', 'streaming_api_base_url']);
@@ -69,14 +77,43 @@ export function connectStream(path, pollingRefresh = null, callbacks = () => ({
 
 
 export default function getStream(streamingAPIBaseURL, accessToken, stream, { connected, received, disconnected, reconnected }) {
-  const params = [ `stream=${stream}` ];
-
-  const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?${params.join('&')}`, accessToken);
-
-  ws.onopen      = connected;
-  ws.onmessage   = e => received(JSON.parse(e.data));
-  ws.onclose     = disconnected;
-  ws.onreconnect = reconnected;
+  const params = stream.split('&');
+  stream = params.shift();
+
+  if (streamingAPIBaseURL.startsWith('ws')) {
+    params.unshift(`stream=${stream}`);
+    const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?${params.join('&')}`, accessToken);
+
+    ws.onopen      = connected;
+    ws.onmessage   = e => received(JSON.parse(e.data));
+    ws.onclose     = disconnected;
+    ws.onreconnect = reconnected;
+
+    return ws;
+  }
+
+  stream = stream.replace(/:/g, '/');
+  params.push(`access_token=${accessToken}`);
+  const es = new EventSource(`${streamingAPIBaseURL}/api/v1/streaming/${stream}?${params.join('&')}`);
+
+  let firstConnect = true;
+  es.onopen = () => {
+    if (firstConnect) {
+      firstConnect = false;
+      connected();
+    } else {
+      reconnected();
+    }
+  };
+  for (let type of knownEventTypes) {
+    es.addEventListener(type, (e) => {
+      received({
+        event: e.type,
+        payload: e.data,
+      });
+    });
+  }
+  es.onerror = disconnected;
 
-  return ws;
+  return es;
 };
diff --git a/app/javascript/mastodon/utils/numbers.js b/app/javascript/mastodon/utils/numbers.js
index f7e4ceb93..af18dcfdd 100644
--- a/app/javascript/mastodon/utils/numbers.js
+++ b/app/javascript/mastodon/utils/numbers.js
@@ -4,9 +4,13 @@ import { FormattedNumber } from 'react-intl';
 export const shortNumberFormat = number => {
   if (number < 1000) {
     return <FormattedNumber value={number} />;
-  } else if (number < 1000000) {
+  } else if (number < 10000) {
     return <Fragment><FormattedNumber value={number / 1000} maximumFractionDigits={1} />K</Fragment>;
-  } else {
+  } else if (number < 1000000) {
+    return <Fragment><FormattedNumber value={number / 1000} maximumFractionDigits={0} />K</Fragment>;
+  } else if (number < 10000000) {
     return <Fragment><FormattedNumber value={number / 1000000} maximumFractionDigits={1} />M</Fragment>;
+  } else {
+    return <Fragment><FormattedNumber value={number / 1000000} maximumFractionDigits={0} />M</Fragment>;
   }
 };
diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js
index 3eae1a457..640f0af0a 100644
--- a/app/javascript/packs/public.js
+++ b/app/javascript/packs/public.js
@@ -101,15 +101,6 @@ function main() {
 
     delegate(document, '.custom-emoji', 'mouseover', getEmojiAnimationHandler('data-original'));
     delegate(document, '.custom-emoji', 'mouseout', getEmojiAnimationHandler('data-static'));
-
-    delegate(document, '.blocks-table button.icon-button', 'click', function(e) {
-      e.preventDefault();
-
-      const classList = this.firstElementChild.classList;
-      classList.toggle('fa-chevron-down');
-      classList.toggle('fa-chevron-up');
-      this.parentElement.parentElement.nextElementSibling.classList.toggle('hidden');
-    });
   });
 
   delegate(document, '.sidebar__toggle__icon', 'click', () => {
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index cba552433..fb136d1a3 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -186,17 +186,22 @@ $content-width: 840px;
 
       padding-bottom: 40px;
       border-bottom: 1px solid lighten($ui-base-color, 8%);
-      margin-bottom: 40px;
+
+      margin: -15px -15px 40px 0;
 
       flex-wrap: wrap;
       align-items: center;
-
       justify-content: space-between;
 
+      & > * {
+        margin-top: 15px;
+        margin-right: 15px;
+      }
+
       &-actions {
         display: inline-flex;
 
-        & > * {
+        & > :not(:first-child) {
           margin-left: 5px;
         }
       }
@@ -910,3 +915,50 @@ a.name-tag,
     color: $primary-text-color;
   }
 }
+
+.center-text {
+  text-align: center;
+}
+
+.announcements-list {
+  border: 1px solid lighten($ui-base-color, 4%);
+  border-radius: 4px;
+
+  &__item {
+    padding: 15px 0;
+    background: $ui-base-color;
+    border-bottom: 1px solid lighten($ui-base-color, 4%);
+
+    &__title {
+      padding: 0 15px;
+      display: block;
+      font-weight: 500;
+      font-size: 18px;
+      line-height: 1.5;
+      color: $secondary-text-color;
+      text-decoration: none;
+      margin-bottom: 10px;
+
+      &:hover,
+      &:focus,
+      &:active {
+        color: $primary-text-color;
+      }
+    }
+
+    &__meta {
+      padding: 0 15px;
+      color: $dark-text-color;
+    }
+
+    &__action-bar {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+    }
+
+    &:last-child {
+      border-bottom: 0;
+    }
+  }
+}
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 01a633c5f..54372022a 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -3,6 +3,14 @@
   -ms-overflow-style: -ms-autohiding-scrollbar;
 }
 
+.animated-number {
+  display: inline-flex;
+  flex-direction: column;
+  align-items: stretch;
+  overflow: hidden;
+  position: relative;
+}
+
 .link-button {
   display: block;
   font-size: 15px;
@@ -860,6 +868,48 @@
   }
 }
 
+.announcements__item__content {
+  word-wrap: break-word;
+
+  .emojione {
+    width: 20px;
+    height: 20px;
+    margin: -3px 0 0;
+  }
+
+  p {
+    margin-bottom: 10px;
+    white-space: pre-wrap;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
+
+  a {
+    color: $secondary-text-color;
+    text-decoration: none;
+
+    &:hover {
+      text-decoration: underline;
+    }
+
+    &.mention {
+      &:hover {
+        text-decoration: none;
+
+        span {
+          text-decoration: underline;
+        }
+      }
+    }
+
+    &.unhandled-link {
+      color: lighten($ui-highlight-color, 8%);
+    }
+  }
+}
+
 .status__content.status__content--collapsed {
   max-height: 20px * 15; // 15 lines is roughly above 500 characters
 }
@@ -873,6 +923,7 @@
   background: transparent;
   padding: 0;
   padding-top: 8px;
+  text-decoration: none;
 
   &:hover,
   &:active {
@@ -1042,6 +1093,7 @@
   .status-check-box__status {
     margin: 10px 0 10px 10px;
     flex: 1;
+    overflow: hidden;
 
     .media-gallery {
       max-width: 250px;
@@ -2471,7 +2523,7 @@ a.account__display-name {
     display: block;
     object-fit: contain;
     object-position: bottom left;
-    width: 100%;
+    width: 85%;
     height: 100%;
     pointer-events: none;
     user-drag: none;
@@ -3183,13 +3235,16 @@ a.status-card.compact:hover {
 .column-header__wrapper {
   position: relative;
   flex: 0 0 auto;
+  z-index: 1;
 
   &.active {
+    box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);
+
     &::before {
       display: block;
       content: "";
       position: absolute;
-      top: 35px;
+      bottom: -13px;
       left: 0;
       right: 0;
       margin: 0 auto;
@@ -3200,6 +3255,11 @@ a.status-card.compact:hover {
       background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);
     }
   }
+
+  .announcements {
+    z-index: 1;
+    position: relative;
+  }
 }
 
 .column-header {
@@ -3232,8 +3292,6 @@ a.status-card.compact:hover {
   }
 
   &.active {
-    box-shadow: 0 1px 0 rgba($highlight-text-color, 0.3);
-
     .column-header__icon {
       color: $highlight-text-color;
       text-shadow: 0 0 10px rgba($highlight-text-color, 0.4);
@@ -3289,6 +3347,8 @@ a.status-card.compact:hover {
   color: $darker-text-color;
   transition: max-height 150ms ease-in-out, opacity 300ms linear;
   opacity: 1;
+  z-index: 1;
+  position: relative;
 
   &.collapsed {
     max-height: 0;
@@ -5702,6 +5762,8 @@ a.status-card.compact:hover {
     text-align: center;
     text-decoration: none;
     position: relative;
+    width: 100%;
+    white-space: nowrap;
 
     &.active {
       color: $secondary-text-color;
@@ -6399,13 +6461,13 @@ noscript {
     &__links {
       font-size: 14px;
       color: $darker-text-color;
+      padding: 10px 0;
 
       a {
         display: inline-block;
         color: $darker-text-color;
         text-decoration: none;
-        padding: 10px;
-        padding-top: 20px;
+        padding: 5px 10px;
         font-weight: 500;
 
         strong {
@@ -6590,3 +6652,187 @@ noscript {
     }
   }
 }
+
+.announcements {
+  background: lighten($ui-base-color, 8%);
+  font-size: 13px;
+  display: flex;
+  align-items: flex-end;
+
+  &__mastodon {
+    width: 124px;
+    flex: 0 0 auto;
+
+    @media screen and (max-width: 124px + 300px) {
+      display: none;
+    }
+  }
+
+  &__container {
+    width: calc(100% - 124px);
+    flex: 0 0 auto;
+    position: relative;
+
+    @media screen and (max-width: 124px + 300px) {
+      width: 100%;
+    }
+  }
+
+  &__item {
+    box-sizing: border-box;
+    width: 100%;
+    padding: 15px;
+    padding-right: 15px + 18px;
+    position: relative;
+    font-size: 15px;
+    line-height: 20px;
+    word-wrap: break-word;
+    font-weight: 400;
+
+    &__range {
+      display: block;
+      font-weight: 500;
+      margin-bottom: 10px;
+    }
+
+    &__unread {
+      position: absolute;
+      top: 15px;
+      right: 15px;
+      display: inline-block;
+      background: $highlight-text-color;
+      border-radius: 50%;
+      width: 0.625rem;
+      height: 0.625rem;
+      margin: 0 .15em;
+    }
+  }
+
+  &__pagination {
+    padding: 15px;
+    color: $darker-text-color;
+    position: absolute;
+    bottom: 3px;
+    right: 0;
+  }
+}
+
+.layout-multiple-columns .announcements__mastodon {
+  display: none;
+}
+
+.layout-multiple-columns .announcements__container {
+  width: 100%;
+}
+
+.reactions-bar {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  margin-top: 15px;
+  margin-left: -2px;
+  width: calc(100% - (90px - 33px));
+
+  &__item {
+    flex-shrink: 0;
+    background: lighten($ui-base-color, 12%);
+    border: 0;
+    border-radius: 3px;
+    margin: 2px;
+    cursor: pointer;
+    user-select: none;
+    padding: 0 6px;
+    display: flex;
+    align-items: center;
+    transition: all 100ms ease-in;
+    transition-property: background-color, color;
+
+    &__emoji {
+      display: block;
+      margin: 3px 0;
+      width: 16px;
+      height: 16px;
+
+      img {
+        display: block;
+        margin: 0;
+        width: 100%;
+        height: 100%;
+        min-width: auto;
+        min-height: auto;
+        vertical-align: bottom;
+        object-fit: contain;
+      }
+    }
+
+    &__count {
+      display: block;
+      min-width: 9px;
+      font-size: 13px;
+      font-weight: 500;
+      text-align: center;
+      margin-left: 6px;
+      color: $darker-text-color;
+    }
+
+    &:hover,
+    &:focus,
+    &:active {
+      background: lighten($ui-base-color, 16%);
+      transition: all 200ms ease-out;
+      transition-property: background-color, color;
+
+      &__count {
+        color: lighten($darker-text-color, 4%);
+      }
+    }
+
+    &.active {
+      transition: all 100ms ease-in;
+      transition-property: background-color, color;
+      background-color: mix(lighten($ui-base-color, 12%), $ui-highlight-color, 80%);
+
+      .reactions-bar__item__count {
+        color: lighten($highlight-text-color, 8%);
+      }
+    }
+  }
+
+  .emoji-picker-dropdown {
+    margin: 2px;
+  }
+
+  &:hover .emoji-button {
+    opacity: 0.85;
+  }
+
+  .emoji-button {
+    color: $darker-text-color;
+    margin: 0;
+    font-size: 16px;
+    width: auto;
+    flex-shrink: 0;
+    padding: 0 6px;
+    height: 22px;
+    display: flex;
+    align-items: center;
+    opacity: 0.5;
+    transition: all 100ms ease-in;
+    transition-property: background-color, color;
+
+    &:hover,
+    &:active,
+    &:focus {
+      opacity: 1;
+      color: lighten($darker-text-color, 4%);
+      transition: all 200ms ease-out;
+      transition-property: background-color, color;
+    }
+  }
+
+  &--empty {
+    .emoji-button {
+      padding: 0;
+    }
+  }
+}
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index a0478bf7f..c9ad68f94 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -222,6 +222,12 @@ code {
     }
   }
 
+  .input.datetime .label_input select {
+    display: inline-block;
+    width: auto;
+    flex: 0;
+  }
+
   .required abbr {
     text-decoration: none;
     color: lighten($error-value-color, 12%);
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 49b1dc9cd..ee35e1e8d 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -21,7 +21,7 @@ class ActivityPub::Activity
   class << self
     def factory(json, account, **options)
       @json = json
-      klass&.new(json, account, options)
+      klass&.new(json, account, **options)
     end
 
     private
diff --git a/app/lib/entity_cache.rb b/app/lib/entity_cache.rb
index 8fff544a0..35a3773d2 100644
--- a/app/lib/entity_cache.rb
+++ b/app/lib/entity_cache.rb
@@ -8,7 +8,7 @@ class EntityCache
   MAX_EXPIRATION = 7.days.freeze
 
   def mention(username, domain)
-    Rails.cache.fetch(to_key(:mention, username, domain), expires_in: MAX_EXPIRATION) { Account.select(:username, :domain, :url).find_remote(username, domain) }
+    Rails.cache.fetch(to_key(:mention, username, domain), expires_in: MAX_EXPIRATION) { Account.select(:id, :username, :domain, :url).find_remote(username, domain) }
   end
 
   def emoji(shortcodes, domain)
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index cdb8383df..3ce182809 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -11,6 +11,10 @@ class FeedManager
   # Must be <= MAX_ITEMS or the tracking sets will grow forever
   REBLOG_FALLOFF = 40
 
+  def with_active_accounts(&block)
+    Account.joins(:user).where('users.current_sign_in_at > ?', User::ACTIVE_DURATION.ago).find_each(&block)
+  end
+
   def key(type, id, subtype = nil)
     return "feed:#{type}:#{id}" unless subtype
 
diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
index 9159db2a1..f1a751f84 100644
--- a/app/lib/formatter.rb
+++ b/app/lib/formatter.rb
@@ -308,8 +308,9 @@ class Formatter
     end
 
     standard = Extractor.extract_entities_with_indices(text, options)
+    extra = Extractor.extract_extra_uris_with_indices(text, options)
 
-    Extractor.remove_overlapping_entities(special + standard)
+    Extractor.remove_overlapping_entities(special + standard + extra)
   end
 
   def html_friendly_extractor(html, options = {})
@@ -370,7 +371,7 @@ class Formatter
 
   def link_html(url)
     url    = Addressable::URI.parse(url).to_s
-    prefix = url.match(/\Ahttps?:\/\/(www\.)?/).to_s
+    prefix = url.match(/\A(https?:\/\/(www\.)?|xmpp:)/).to_s
     text   = url[prefix.length, 30]
     suffix = url[prefix.length + 30..-1]
     cutoff = url[prefix.length..-1].length > 30
diff --git a/app/lib/inline_renderer.rb b/app/lib/inline_renderer.rb
index 761a8822d..27e334a4d 100644
--- a/app/lib/inline_renderer.rb
+++ b/app/lib/inline_renderer.rb
@@ -15,6 +15,10 @@ class InlineRenderer
       serializer = REST::NotificationSerializer
     when :conversation
       serializer = REST::ConversationSerializer
+    when :announcement
+      serializer = REST::AnnouncementSerializer
+    when :reaction
+      serializer = REST::ReactionSerializer
     else
       return
     end
diff --git a/app/lib/request.rb b/app/lib/request.rb
index 42ccc6513..c476e7785 100644
--- a/app/lib/request.rb
+++ b/app/lib/request.rb
@@ -59,7 +59,7 @@ class Request
     begin
       response = http_client.public_send(@verb, @url.to_s, @options.merge(headers: headers))
     rescue => e
-      raise e.class, "#{e.message} on #{@url}", e.backtrace
+      raise e.class, "#{e.message} on #{@url}", e.backtrace[0]
     end
 
     begin
@@ -73,6 +73,8 @@ class Request
       response.body_with_limit if http_client.persistent?
 
       yield response if block_given?
+    rescue => e
+      raise e.class, e.message, e.backtrace[0]
     ensure
       http_client.close unless http_client.persistent?
     end
@@ -94,7 +96,7 @@ class Request
     end
 
     def http_client
-      HTTP.use(:auto_inflate).timeout(:per_operation, TIMEOUT.dup).follow(max_hops: 2)
+      HTTP.use(:auto_inflate).timeout(TIMEOUT.dup).follow(max_hops: 2)
     end
   end
 
diff --git a/app/lib/sanitize_config.rb b/app/lib/sanitize_config.rb
index 9f5bf0125..2b5d554b5 100644
--- a/app/lib/sanitize_config.rb
+++ b/app/lib/sanitize_config.rb
@@ -2,7 +2,7 @@
 
 class Sanitize
   module Config
-    HTTP_PROTOCOLS ||= ['http', 'https', 'dat', 'dweb', 'ipfs', 'ipns', 'ssb', 'gopher', :relative].freeze
+    HTTP_PROTOCOLS ||= ['http', 'https', 'dat', 'dweb', 'ipfs', 'ipns', 'ssb', 'gopher', 'xmpp', 'magnet', :relative].freeze
 
     CLASS_WHITELIST_TRANSFORMER = lambda do |env|
       node = env[:node]
diff --git a/app/lib/search_query_transformer.rb b/app/lib/search_query_transformer.rb
index 6a299f59d..e07ebfffe 100644
--- a/app/lib/search_query_transformer.rb
+++ b/app/lib/search_query_transformer.rb
@@ -78,7 +78,7 @@ class SearchQueryTransformer < Parslet::Transform
     elsif clause[:shortcode]
       TermClause.new(prefix, operator, ":#{clause[:term]}:")
     elsif clause[:phrase]
-      PhraseClause.new(prefix, operator, clause[:phrase].map { |p| p[:term].to_s }.join(' '))
+      PhraseClause.new(prefix, operator, clause[:phrase].is_a?(Array) ? clause[:phrase].map { |p| p[:term].to_s }.join(' ') : clause[:phrase].to_s)
     else
       raise "Unexpected clause type: #{clause}"
     end
diff --git a/app/lib/spam_check.rb b/app/lib/spam_check.rb
index 5b40514fd..652d03615 100644
--- a/app/lib/spam_check.rb
+++ b/app/lib/spam_check.rb
@@ -143,7 +143,7 @@ class SpamCheck
   end
 
   def trusted?
-    @account.trust_level > Account::TRUST_LEVELS[:untrusted]
+    @account.trust_level > Account::TRUST_LEVELS[:untrusted] || (@account.local? && @account.user_staff?)
   end
 
   def no_unsolicited_mentions?
diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb
index c30bec80b..88a11f761 100644
--- a/app/mailers/user_mailer.rb
+++ b/app/mailers/user_mailer.rb
@@ -6,6 +6,7 @@ class UserMailer < Devise::Mailer
   helper :accounts
   helper :application
   helper :instance
+  helper :statuses
 
   add_template_helper RoutingHelper
 
diff --git a/app/models/account.rb b/app/models/account.rb
index 25cde6d6c..e46888415 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -50,7 +50,7 @@
 
 class Account < ApplicationRecord
   USERNAME_RE = /[a-z0-9_]+([a-z0-9_\.-]+[a-z0-9_]+)?/i
-  MENTION_RE  = /(?<=^|[^\/[:word:]])@((#{USERNAME_RE})(?:@[a-z0-9\.\-]+[a-z0-9]+)?)/i
+  MENTION_RE  = /(?<=^|[^\/[:word:]])@((#{USERNAME_RE})(?:@[[:word:]\.\-]+[a-z0-9]+)?)/i
 
   include AccountAssociations
   include AccountAvatar
@@ -74,14 +74,13 @@ class Account < ApplicationRecord
   enum protocol: [:ostatus, :activitypub]
 
   validates :username, presence: true
+  validates_with UniqueUsernameValidator, if: -> { will_save_change_to_username? }
 
   # Remote user validations
-  validates :username, uniqueness: { scope: :domain, case_sensitive: true }, if: -> { !local? && will_save_change_to_username? }
   validates :username, format: { with: /\A#{USERNAME_RE}\z/i }, if: -> { !local? && will_save_change_to_username? }
 
   # Local user validations
   validates :username, format: { with: /\A[a-z0-9_]+\z/i }, length: { maximum: 30 }, if: -> { local? && will_save_change_to_username? && actor_type != 'Application' }
-  validates_with UniqueUsernameValidator, if: -> { local? && will_save_change_to_username? }
   validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? }
   validates :display_name, length: { maximum: MAX_DISPLAY_NAME_LENGTH }, if: -> { local? && will_save_change_to_display_name? }
   validates :note, note_length: { maximum: MAX_NOTE_LENGTH }, if: -> { local? && will_save_change_to_note? }
@@ -168,6 +167,10 @@ class Account < ApplicationRecord
     local? ? username : "#{username}@#{domain}"
   end
 
+  def pretty_acct
+    local? ? username : "#{username}@#{Addressable::IDNA.to_unicode(domain)}"
+  end
+
   def local_username_and_domain
     "#{username}@#{Rails.configuration.x.local_domain}"
   end
@@ -312,10 +315,6 @@ class Account < ApplicationRecord
     self.fields = tmp
   end
 
-  def subscription(webhook_url)
-    @subscription ||= OStatus2::Subscription.new(remote_url, secret: secret, webhook: webhook_url, hub: hub_url)
-  end
-
   def save_with_optional_media!
     save!
   rescue ActiveRecord::RecordInvalid
@@ -478,6 +477,12 @@ class Account < ApplicationRecord
       records
     end
 
+    def from_text(text)
+      return [] if text.blank?
+
+      text.scan(MENTION_RE).map { |match| match.first.split('@', 2) }.uniq.map { |(username, domain)| EntityCache.instance.mention(username, domain) }
+    end
+
     private
 
     def generate_query_for_search(terms)
diff --git a/app/models/account_filter.rb b/app/models/account_filter.rb
index c3b1fe08d..c7bf07787 100644
--- a/app/models/account_filter.rb
+++ b/app/models/account_filter.rb
@@ -1,6 +1,21 @@
 # frozen_string_literal: true
 
 class AccountFilter
+  KEYS = %i(
+    local
+    remote
+    by_domain
+    active
+    pending
+    silenced
+    suspended
+    username
+    display_name
+    email
+    ip
+    staff
+  ).freeze
+
   attr_reader :params
 
   def initialize(params)
@@ -50,7 +65,7 @@ class AccountFilter
     when 'email'
       accounts_with_users.merge User.matches_email(value)
     when 'ip'
-      valid_ip?(value) ? accounts_with_users.where('users.current_sign_in_ip <<= ?', value) : Account.none
+      valid_ip?(value) ? accounts_with_users.merge(User.matches_ip(value)) : Account.none
     when 'staff'
       accounts_with_users.merge User.staff
     else
diff --git a/app/models/announcement.rb b/app/models/announcement.rb
new file mode 100644
index 000000000..d99502f44
--- /dev/null
+++ b/app/models/announcement.rb
@@ -0,0 +1,86 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: announcements
+#
+#  id           :bigint(8)        not null, primary key
+#  text         :text             default(""), not null
+#  published    :boolean          default(FALSE), not null
+#  all_day      :boolean          default(FALSE), not null
+#  scheduled_at :datetime
+#  starts_at    :datetime
+#  ends_at      :datetime
+#  created_at   :datetime         not null
+#  updated_at   :datetime         not null
+#  published_at :datetime
+#
+
+class Announcement < ApplicationRecord
+  scope :unpublished, -> { where(published: false) }
+  scope :published, -> { where(published: true) }
+  scope :without_muted, ->(account) { joins("LEFT OUTER JOIN announcement_mutes ON announcement_mutes.announcement_id = announcements.id AND announcement_mutes.account_id = #{account.id}").where('announcement_mutes.id IS NULL') }
+  scope :chronological, -> { order(Arel.sql('COALESCE(announcements.starts_at, announcements.scheduled_at, announcements.published_at, announcements.created_at) ASC')) }
+
+  has_many :announcement_mutes, dependent: :destroy
+  has_many :announcement_reactions, dependent: :destroy
+
+  validates :text, presence: true
+  validates :starts_at, presence: true, if: -> { ends_at.present? }
+  validates :ends_at, presence: true, if: -> { starts_at.present? }
+
+  before_validation :set_all_day
+  before_validation :set_published, on: :create
+
+  def publish!
+    update!(published: true, published_at: Time.now.utc, scheduled_at: nil)
+  end
+
+  def unpublish!
+    update!(published: false, scheduled_at: nil)
+  end
+
+  def time_range?
+    starts_at.present? && ends_at.present?
+  end
+
+  def mentions
+    @mentions ||= Account.from_text(text)
+  end
+
+  def tags
+    @tags ||= Tag.find_or_create_by_names(Extractor.extract_hashtags(text))
+  end
+
+  def emojis
+    @emojis ||= CustomEmoji.from_text(text)
+  end
+
+  def reactions(account = nil)
+    records = begin
+      scope = announcement_reactions.group(:announcement_id, :name, :custom_emoji_id).order(Arel.sql('MIN(created_at) ASC'))
+
+      if account.nil?
+        scope.select('name, custom_emoji_id, count(*) as count, false as me')
+      else
+        scope.select("name, custom_emoji_id, count(*) as count, exists(select 1 from announcement_reactions r where r.account_id = #{account.id} and r.announcement_id = announcement_reactions.announcement_id and r.name = announcement_reactions.name) as me")
+      end
+    end
+
+    ActiveRecord::Associations::Preloader.new.preload(records, :custom_emoji)
+    records
+  end
+
+  private
+
+  def set_all_day
+    self.all_day = false if starts_at.blank? || ends_at.blank?
+  end
+
+  def set_published
+    return unless scheduled_at.blank? || scheduled_at.past?
+
+    self.published = true
+    self.published_at = Time.now.utc
+  end
+end
diff --git a/app/models/announcement_filter.rb b/app/models/announcement_filter.rb
new file mode 100644
index 000000000..950852460
--- /dev/null
+++ b/app/models/announcement_filter.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+class AnnouncementFilter
+  KEYS = %i(
+    published
+    unpublished
+  ).freeze
+
+  attr_reader :params
+
+  def initialize(params)
+    @params = params
+  end
+
+  def results
+    scope = Announcement.unscoped
+
+    params.each do |key, value|
+      next if key.to_s == 'page'
+
+      scope.merge!(scope_for(key, value.to_s.strip)) if value.present?
+    end
+
+    scope.chronological
+  end
+
+  private
+
+  def scope_for(key, _value)
+    case key.to_s
+    when 'published'
+      Announcement.published
+    when 'unpublished'
+      Announcement.unpublished
+    else
+      raise "Unknown filter: #{key}"
+    end
+  end
+end
diff --git a/app/models/announcement_mute.rb b/app/models/announcement_mute.rb
new file mode 100644
index 000000000..46fda2f5d
--- /dev/null
+++ b/app/models/announcement_mute.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: announcement_mutes
+#
+#  id              :bigint(8)        not null, primary key
+#  account_id      :bigint(8)
+#  announcement_id :bigint(8)
+#  created_at      :datetime         not null
+#  updated_at      :datetime         not null
+#
+
+class AnnouncementMute < ApplicationRecord
+  belongs_to :account
+  belongs_to :announcement, inverse_of: :announcement_mutes
+
+  validates :account_id, uniqueness: { scope: :announcement_id }
+end
diff --git a/app/models/announcement_reaction.rb b/app/models/announcement_reaction.rb
new file mode 100644
index 000000000..d22771034
--- /dev/null
+++ b/app/models/announcement_reaction.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: announcement_reactions
+#
+#  id              :bigint(8)        not null, primary key
+#  account_id      :bigint(8)
+#  announcement_id :bigint(8)
+#  name            :string           default(""), not null
+#  custom_emoji_id :bigint(8)
+#  created_at      :datetime         not null
+#  updated_at      :datetime         not null
+#
+
+class AnnouncementReaction < ApplicationRecord
+  after_commit :queue_publish
+
+  belongs_to :account
+  belongs_to :announcement, inverse_of: :announcement_reactions
+  belongs_to :custom_emoji, optional: true
+
+  validates :name, presence: true
+  validates_with ReactionValidator
+
+  before_validation :set_custom_emoji
+
+  private
+
+  def set_custom_emoji
+    self.custom_emoji = CustomEmoji.local.find_by(disabled: false, shortcode: name) if name.present?
+  end
+
+  def queue_publish
+    PublishAnnouncementReactionWorker.perform_async(announcement_id, name) unless announcement.destroyed?
+  end
+end
diff --git a/app/models/backup.rb b/app/models/backup.rb
index 8eeb1748a..d242fd62c 100644
--- a/app/models/backup.rb
+++ b/app/models/backup.rb
@@ -7,11 +7,11 @@
 #  user_id           :bigint(8)
 #  dump_file_name    :string
 #  dump_content_type :string
-#  dump_file_size    :bigint
 #  dump_updated_at   :datetime
 #  processed         :boolean          default(FALSE), not null
 #  created_at        :datetime         not null
 #  updated_at        :datetime         not null
+#  dump_file_size    :bigint(8)
 #
 
 class Backup < ApplicationRecord
diff --git a/app/models/bookmark.rb b/app/models/bookmark.rb
index 01dc48ee7..916261a17 100644
--- a/app/models/bookmark.rb
+++ b/app/models/bookmark.rb
@@ -3,11 +3,11 @@
 #
 # Table name: bookmarks
 #
-#  id         :integer          not null, primary key
+#  id         :bigint(8)        not null, primary key
+#  account_id :bigint(8)        not null
+#  status_id  :bigint(8)        not null
 #  created_at :datetime         not null
 #  updated_at :datetime         not null
-#  account_id :integer          not null
-#  status_id  :integer          not null
 #
 
 class Bookmark < ApplicationRecord
diff --git a/app/models/concerns/account_finder_concern.rb b/app/models/concerns/account_finder_concern.rb
index a54c2174d..04b2c981b 100644
--- a/app/models/concerns/account_finder_concern.rb
+++ b/app/models/concerns/account_finder_concern.rb
@@ -48,7 +48,7 @@ module AccountFinderConcern
     end
 
     def with_usernames
-      Account.where.not(username: '')
+      Account.where.not(Account.arel_table[:username].lower.eq '')
     end
 
     def matching_username
@@ -56,11 +56,7 @@ module AccountFinderConcern
     end
 
     def matching_domain
-      if domain.nil?
-        Account.where(domain: nil)
-      else
-        Account.where(Account.arel_table[:domain].lower.eq domain.to_s.downcase)
-      end
+      Account.where(Account.arel_table[:domain].lower.eq(domain.nil? ? nil : domain.to_s.downcase))
     end
   end
 end
diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb
index f27d39483..14bcf7bb1 100644
--- a/app/models/concerns/account_interactions.rb
+++ b/app/models/concerns/account_interactions.rb
@@ -84,6 +84,7 @@ module AccountInteractions
     has_many :muted_by, -> { order('mutes.id desc') }, through: :muted_by_relationships, source: :account
     has_many :conversation_mutes, dependent: :destroy
     has_many :domain_blocks, class_name: 'AccountDomainBlock', dependent: :destroy
+    has_many :announcement_mutes, dependent: :destroy
   end
 
   def follow!(other_account, reblogs: nil, uri: nil)
diff --git a/app/models/concerns/attachmentable.rb b/app/models/concerns/attachmentable.rb
index 3bbc6453c..43ff8ac12 100644
--- a/app/models/concerns/attachmentable.rb
+++ b/app/models/concerns/attachmentable.rb
@@ -9,6 +9,7 @@ module Attachmentable
   GIF_MATRIX_LIMIT = 921_600    # 1280x720px
 
   included do
+    before_post_process :obfuscate_file_name
     before_post_process :set_file_extensions
     before_post_process :check_image_dimensions
     before_post_process :set_file_content_type
@@ -68,4 +69,14 @@ module Attachmentable
   rescue Terrapin::CommandLineError
     ''
   end
+
+  def obfuscate_file_name
+    self.class.attachment_definitions.each_key do |attachment_name|
+      attachment = send(attachment_name)
+
+      next if attachment.blank? || attachment.queued_for_write[:original].blank?
+
+      attachment.instance_write :file_name, SecureRandom.hex(8) + File.extname(attachment.instance_read(:file_name))
+    end
+  end
 end
diff --git a/app/models/concerns/status_threading_concern.rb b/app/models/concerns/status_threading_concern.rb
index 15eb695cd..a0ead1995 100644
--- a/app/models/concerns/status_threading_concern.rb
+++ b/app/models/concerns/status_threading_concern.rb
@@ -81,12 +81,12 @@ module StatusThreadingConcern
   end
 
   def find_statuses_from_tree_path(ids, account, promote: false)
-    statuses    = statuses_with_accounts(ids).to_a
+    statuses    = Status.with_accounts(ids).to_a
     account_ids = statuses.map(&:account_id).uniq
     domains     = statuses.map(&:account_domain).compact.uniq
     relations   = relations_map_for_account(account, account_ids, domains)
 
-    statuses.reject! { |status| filter_from_context?(status, account, relations) }
+    statuses.reject! { |status| StatusFilter.new(status, account, relations).filtered? }
 
     # Order ancestors/descendants by tree path
     statuses.sort_by! { |status| ids.index(status.id) }
@@ -125,12 +125,4 @@ module StatusThreadingConcern
       domain_blocking_by_domain: Account.domain_blocking_map_by_domain(domains, account.id),
     }
   end
-
-  def statuses_with_accounts(ids)
-    Status.where(id: ids).includes(:account)
-  end
-
-  def filter_from_context?(status, account, relations)
-    StatusFilter.new(status, account, relations).filtered?
-  end
 end
diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb
index 0dacaf654..d177cf281 100644
--- a/app/models/custom_emoji.rb
+++ b/app/models/custom_emoji.rb
@@ -67,7 +67,7 @@ class CustomEmoji < ApplicationRecord
   end
 
   class << self
-    def from_text(text, domain)
+    def from_text(text, domain = nil)
       return [] if text.blank?
 
       shortcodes = text.scan(SCAN_RE).map(&:first).uniq
diff --git a/app/models/custom_emoji_filter.rb b/app/models/custom_emoji_filter.rb
index 15b8da1d1..414e1fcdd 100644
--- a/app/models/custom_emoji_filter.rb
+++ b/app/models/custom_emoji_filter.rb
@@ -1,6 +1,13 @@
 # frozen_string_literal: true
 
 class CustomEmojiFilter
+  KEYS = %i(
+    local
+    remote
+    by_domain
+    shortcode
+  ).freeze
+
   attr_reader :params
 
   def initialize(params)
diff --git a/app/models/custom_filter.rb b/app/models/custom_filter.rb
index 382562fb8..8df8a4fbf 100644
--- a/app/models/custom_filter.rb
+++ b/app/models/custom_filter.rb
@@ -20,6 +20,7 @@ class CustomFilter < ApplicationRecord
     notifications
     public
     thread
+    account
   ).freeze
 
   include Expireable
diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb
index 4e865b850..f0a5bd296 100644
--- a/app/models/domain_block.rb
+++ b/app/models/domain_block.rb
@@ -54,7 +54,7 @@ class DomainBlock < ApplicationRecord
       segments = uri.normalized_host.split('.')
       variants = segments.map.with_index { |_, i| segments[i..-1].join('.') }
 
-      where(domain: variants[0..-2]).order(Arel.sql('char_length(domain) desc')).first
+      where(domain: variants).order(Arel.sql('char_length(domain) desc')).first
     end
   end
 
diff --git a/app/models/instance_filter.rb b/app/models/instance_filter.rb
index 8bfab826d..9c467bc27 100644
--- a/app/models/instance_filter.rb
+++ b/app/models/instance_filter.rb
@@ -1,6 +1,11 @@
 # frozen_string_literal: true
 
 class InstanceFilter
+  KEYS = %i(
+    limited
+    by_domain
+  ).freeze
+
   attr_reader :params
 
   def initialize(params)
diff --git a/app/models/invite_filter.rb b/app/models/invite_filter.rb
index 7d89bad4a..9685d4abb 100644
--- a/app/models/invite_filter.rb
+++ b/app/models/invite_filter.rb
@@ -1,6 +1,11 @@
 # frozen_string_literal: true
 
 class InviteFilter
+  KEYS = %i(
+    available
+    expired
+  ).freeze
+
   attr_reader :params
 
   def initialize(params)
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index 880599028..6a0b892f6 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -142,6 +142,7 @@ class MediaAttachment < ApplicationRecord
 
   validates :account, presence: true
   validates :description, length: { maximum: MAX_DESCRIPTION_LENGTH }, if: :local?
+  validates :file, presence: true, if: :local?
 
   scope :attached,   -> { where.not(status_id: nil).or(where.not(scheduled_status_id: nil)) }
   scope :unattached, -> { where(status_id: nil, scheduled_status_id: nil) }
@@ -202,9 +203,12 @@ class MediaAttachment < ApplicationRecord
   end
 
   after_commit :reset_parent_cache, on: :update
+
   before_create :prepare_description, unless: :local?
   before_create :set_shortcode
+
   before_post_process :set_type_and_extension
+
   before_save :set_meta
 
   class << self
diff --git a/app/models/relationship_filter.rb b/app/models/relationship_filter.rb
new file mode 100644
index 000000000..e6859bf3d
--- /dev/null
+++ b/app/models/relationship_filter.rb
@@ -0,0 +1,120 @@
+# frozen_string_literal: true
+
+class RelationshipFilter
+  KEYS = %i(
+    relationship
+    status
+    by_domain
+    activity
+    order
+    location
+  ).freeze
+
+  attr_reader :params, :account
+
+  def initialize(account, params)
+    @account = account
+    @params  = params
+
+    set_defaults!
+  end
+
+  def results
+    scope = scope_for('relationship', params['relationship'].to_s.strip)
+
+    params.each do |key, value|
+      next if key.to_s == 'page'
+
+      scope.merge!(scope_for(key.to_s, value.to_s.strip)) if value.present?
+    end
+
+    scope
+  end
+
+  private
+
+  def set_defaults!
+    params['relationship'] = 'following' if params['relationship'].blank?
+    params['order']        = 'recent' if params['order'].blank?
+  end
+
+  def scope_for(key, value)
+    case key
+    when 'relationship'
+      relationship_scope(value)
+    when 'by_domain'
+      by_domain_scope(value)
+    when 'location'
+      location_scope(value)
+    when 'status'
+      status_scope(value)
+    when 'order'
+      order_scope(value)
+    when 'activity'
+      activity_scope(value)
+    else
+      raise "Unknown filter: #{key}"
+    end
+  end
+
+  def relationship_scope(value)
+    case value
+    when 'following'
+      account.following.eager_load(:account_stat).reorder(nil)
+    when 'followed_by'
+      account.followers.eager_load(:account_stat).reorder(nil)
+    when 'mutual'
+      account.followers.eager_load(:account_stat).reorder(nil).merge(Account.where(id: account.following))
+    when 'invited'
+      Account.joins(user: :invite).merge(Invite.where(user: account.user)).eager_load(:account_stat).reorder(nil)
+    else
+      raise "Unknown relationship: #{value}"
+    end
+  end
+
+  def by_domain_scope(value)
+    Account.where(domain: value)
+  end
+
+  def location_scope(value)
+    case value
+    when 'local'
+      Account.local
+    when 'remote'
+      Account.remote
+    else
+      raise "Unknown location: #{value}"
+    end
+  end
+
+  def status_scope(value)
+    case value
+    when 'moved'
+      Account.where.not(moved_to_account_id: nil)
+    when 'primary'
+      Account.where(moved_to_account_id: nil)
+    else
+      raise "Unknown status: #{value}"
+    end
+  end
+
+  def order_scope(value)
+    case value
+    when 'active'
+      Account.by_recent_status
+    when 'recent'
+      params[:relationship] == 'invited' ? Account.recent : Follow.recent
+    else
+      raise "Unknown order: #{value}"
+    end
+  end
+
+  def activity_scope(value)
+    case value
+    when 'dormant'
+      AccountStat.where(last_status_at: nil).or(AccountStat.where(AccountStat.arel_table[:last_status_at].lt(1.month.ago)))
+    else
+      raise "Unknown activity: #{value}"
+    end
+  end
+end
diff --git a/app/models/report_filter.rb b/app/models/report_filter.rb
index abf53cbab..c32d4359e 100644
--- a/app/models/report_filter.rb
+++ b/app/models/report_filter.rb
@@ -1,6 +1,13 @@
 # frozen_string_literal: true
 
 class ReportFilter
+  KEYS = %i(
+    resolved
+    account_id
+    target_account_id
+    by_target_domain
+  ).freeze
+
   attr_reader :params
 
   def initialize(params)
diff --git a/app/models/status.rb b/app/models/status.rb
index c189d19bf..f4284f771 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -87,6 +87,7 @@ class Status < ApplicationRecord
   scope :remote, -> { where(local: false).where.not(uri: nil) }
   scope :local,  -> { where(local: true).or(where(uri: nil)) }
 
+  scope :with_accounts, ->(ids) { where(id: ids).includes(:account) }
   scope :without_replies, -> { where('statuses.reply = FALSE OR statuses.in_reply_to_account_id = statuses.account_id') }
   scope :without_reblogs, -> { where('statuses.reblog_of_id IS NULL') }
   scope :with_public_visibility, -> { where(visibility: :public) }
@@ -200,8 +201,12 @@ class Status < ApplicationRecord
   def title
     if destroyed?
       "#{account.acct} deleted status"
+    elsif reblog?
+      preview = sensitive ? '<sensitive>' : text.slice(0, 10).split("\n")[0]
+      "#{account.acct} shared #{reblog.account.acct}'s: #{preview}"
     else
-      reblog? ? "#{account.acct} shared a status by #{reblog.account.acct}" : "New status by #{account.acct}"
+      preview = sensitive ? '<sensitive>' : text.slice(0, 20).split("\n")[0]
+      "#{account.acct}: #{preview}"
     end
   end
 
diff --git a/app/models/tag_filter.rb b/app/models/tag_filter.rb
index 8921e186b..a9ff5b703 100644
--- a/app/models/tag_filter.rb
+++ b/app/models/tag_filter.rb
@@ -1,6 +1,16 @@
 # frozen_string_literal: true
 
 class TagFilter
+  KEYS = %i(
+    directory
+    reviewed
+    unreviewed
+    pending_review
+    popular
+    active
+    name
+  ).freeze
+
   attr_reader :params
 
   def initialize(params)
diff --git a/app/models/user.rb b/app/models/user.rb
index 49cfc25ca..cd8a6f273 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -93,6 +93,7 @@ class User < ApplicationRecord
   scope :inactive, -> { where(arel_table[:current_sign_in_at].lt(ACTIVE_DURATION.ago)) }
   scope :active, -> { confirmed.where(arel_table[:current_sign_in_at].gteq(ACTIVE_DURATION.ago)).joins(:account).where(accounts: { suspended_at: nil }) }
   scope :matches_email, ->(value) { where(arel_table[:email].matches("#{value}%")) }
+  scope :matches_ip, ->(value) { left_joins(:session_activations).where('users.current_sign_in_ip <<= ?', value).or(left_joins(:session_activations).where('users.last_sign_in_ip <<= ?', value)).or(left_joins(:session_activations).where('session_activations.ip <<= ?', value)) }
   scope :emailable, -> { confirmed.enabled.joins(:account).merge(Account.searchable) }
 
   before_validation :sanitize_languages
@@ -128,9 +129,7 @@ class User < ApplicationRecord
   end
 
   def disable!
-    update!(disabled: true,
-            last_sign_in_at: current_sign_in_at,
-            current_sign_in_at: nil)
+    update!(disabled: true)
   end
 
   def enable!
@@ -247,7 +246,7 @@ class User < ApplicationRecord
                                  ip: request.remote_ip).session_id
   end
 
-  def exclusive_session(id)
+  def clear_other_sessions(id)
     session_activations.exclusive(id)
   end
 
@@ -290,6 +289,21 @@ class User < ApplicationRecord
     setting_display_media == 'hide_all'
   end
 
+  def recent_ips
+    @recent_ips ||= begin
+      arr = []
+
+      session_activations.each do |session_activation|
+        arr << [session_activation.updated_at, session_activation.ip]
+      end
+
+      arr << [current_sign_in_at, current_sign_in_ip] if current_sign_in_ip.present?
+      arr << [last_sign_in_at, last_sign_in_ip] if last_sign_in_ip.present?
+
+      arr.sort_by { |pair| pair.first || Time.now.utc }.uniq(&:last).reverse!
+    end
+  end
+
   protected
 
   def send_devise_notification(notification, *args)
diff --git a/app/policies/announcement_policy.rb b/app/policies/announcement_policy.rb
new file mode 100644
index 000000000..0a4e4575c
--- /dev/null
+++ b/app/policies/announcement_policy.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AnnouncementPolicy < ApplicationPolicy
+  def index?
+    staff?
+  end
+
+  def create?
+    admin?
+  end
+
+  def update?
+    admin?
+  end
+
+  def destroy?
+    admin?
+  end
+end
diff --git a/app/serializers/rest/account_serializer.rb b/app/serializers/rest/account_serializer.rb
index 7bdb5d7ff..4e497cdbd 100644
--- a/app/serializers/rest/account_serializer.rb
+++ b/app/serializers/rest/account_serializer.rb
@@ -24,6 +24,10 @@ class REST::AccountSerializer < ActiveModel::Serializer
     object.id.to_s
   end
 
+  def acct
+    object.pretty_acct
+  end
+
   def note
     Formatter.instance.simplified_format(object)
   end
@@ -52,6 +56,10 @@ class REST::AccountSerializer < ActiveModel::Serializer
     object.moved? && object.moved_to_account.moved_to_account_id.nil?
   end
 
+  def last_status_at
+    object.last_status_at&.to_date&.iso8601
+  end
+
   def followers_count
     (Setting.hide_followers_count || object.user&.setting_hide_followers_count) ? -1 : object.followers_count
   end
diff --git a/app/serializers/rest/announcement_serializer.rb b/app/serializers/rest/announcement_serializer.rb
new file mode 100644
index 000000000..ae72f9ace
--- /dev/null
+++ b/app/serializers/rest/announcement_serializer.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+class REST::AnnouncementSerializer < ActiveModel::Serializer
+  attributes :id, :content, :starts_at, :ends_at, :all_day,
+             :published_at, :updated_at
+
+  attribute :read, if: :current_user?
+
+  has_many :mentions
+  has_many :tags, serializer: REST::StatusSerializer::TagSerializer
+  has_many :emojis, serializer: REST::CustomEmojiSerializer
+  has_many :reactions, serializer: REST::ReactionSerializer
+
+  def current_user?
+    !current_user.nil?
+  end
+
+  def id
+    object.id.to_s
+  end
+
+  def read
+    object.announcement_mutes.where(account: current_user.account).exists?
+  end
+
+  def content
+    Formatter.instance.linkify(object.text)
+  end
+
+  def reactions
+    object.reactions(current_user&.account)
+  end
+
+  class AccountSerializer < ActiveModel::Serializer
+    attributes :id, :username, :url, :acct
+
+    def id
+      object.id.to_s
+    end
+
+    def url
+      ActivityPub::TagManager.instance.url_for(object)
+    end
+  end
+end
diff --git a/app/serializers/rest/reaction_serializer.rb b/app/serializers/rest/reaction_serializer.rb
new file mode 100644
index 000000000..1a5dca018
--- /dev/null
+++ b/app/serializers/rest/reaction_serializer.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class REST::ReactionSerializer < ActiveModel::Serializer
+  include RoutingHelper
+
+  attributes :name, :count
+
+  attribute :me, if: :current_user?
+  attribute :url, if: :custom_emoji?
+  attribute :static_url, if: :custom_emoji?
+
+  def count
+    object.respond_to?(:count) ? object.count : 0
+  end
+
+  def current_user?
+    !current_user.nil?
+  end
+
+  def custom_emoji?
+    object.custom_emoji.present?
+  end
+
+  def url
+    full_asset_url(object.custom_emoji.image.url)
+  end
+
+  def static_url
+    full_asset_url(object.custom_emoji.image.url(:static))
+  end
+end
diff --git a/app/services/activitypub/process_collection_service.rb b/app/services/activitypub/process_collection_service.rb
index a2a2e7071..e6ccaccc9 100644
--- a/app/services/activitypub/process_collection_service.rb
+++ b/app/services/activitypub/process_collection_service.rb
@@ -37,7 +37,7 @@ class ActivityPub::ProcessCollectionService < BaseService
   end
 
   def process_item(item)
-    activity = ActivityPub::Activity.factory(item, @account, @options)
+    activity = ActivityPub::Activity.factory(item, @account, **@options)
     activity&.perform
   end
 
diff --git a/app/services/backup_service.rb b/app/services/backup_service.rb
index 0b57b6d0c..ab6d090a0 100644
--- a/app/services/backup_service.rb
+++ b/app/services/backup_service.rb
@@ -166,7 +166,7 @@ class BackupService < BaseService
         io.write(buffer)
       end
     end
-  rescue Errno::ENOENT
+  rescue Errno::ENOENT, Seahorse::Client::NetworkingError
     Rails.logger.warn "Could not backup file #{filename}: file not found"
   end
 end
diff --git a/app/services/fetch_resource_service.rb b/app/services/fetch_resource_service.rb
index 34382d279..abe7766d4 100644
--- a/app/services/fetch_resource_service.rb
+++ b/app/services/fetch_resource_service.rb
@@ -3,7 +3,7 @@
 class FetchResourceService < BaseService
   include JsonLdHelper
 
-  ACCEPT_HEADER = 'application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams", text/html'
+  ACCEPT_HEADER = 'application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams", text/html;q=0.1'
 
   def call(url)
     return if url.blank?
diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb
index 19de37717..3c257451c 100644
--- a/app/services/process_mentions_service.rb
+++ b/app/services/process_mentions_service.rb
@@ -14,7 +14,16 @@ class ProcessMentionsService < BaseService
     mentions = []
 
     status.text = status.text.gsub(Account::MENTION_RE) do |match|
-      username, domain  = Regexp.last_match(1).split('@')
+      username, domain = Regexp.last_match(1).split('@')
+
+      domain = begin
+        if TagManager.instance.local_domain?(domain)
+          nil
+        else
+          TagManager.instance.normalize_domain(domain)
+        end
+      end
+
       mentioned_account = Account.find_remote(username, domain)
 
       if mention_undeliverable?(mentioned_account)
diff --git a/app/services/resolve_url_service.rb b/app/services/resolve_url_service.rb
index 79b1bad0c..1a2b0d60c 100644
--- a/app/services/resolve_url_service.rb
+++ b/app/services/resolve_url_service.rb
@@ -12,6 +12,8 @@ class ResolveURLService < BaseService
       process_local_url
     elsif !fetched_resource.nil?
       process_url
+    elsif @on_behalf_of.present?
+      process_url_from_db
     end
   end
 
@@ -24,15 +26,19 @@ class ResolveURLService < BaseService
       status = FetchRemoteStatusService.new.call(resource_url, body)
       authorize_with @on_behalf_of, status, :show? unless status.nil?
       status
-    elsif fetched_resource.nil? && @on_behalf_of.present?
-      # It may happen that the resource is a private toot, and thus not fetchable,
-      # but we can return the toot if we already know about it.
-      status = Status.find_by(uri: @url) || Status.find_by(url: @url)
-      authorize_with @on_behalf_of, status, :show? unless status.nil?
-      status
     end
   end
 
+  def process_url_from_db
+    # It may happen that the resource is a private toot, and thus not fetchable,
+    # but we can return the toot if we already know about it.
+    status = Status.find_by(uri: @url) || Status.find_by(url: @url)
+    authorize_with @on_behalf_of, status, :show? unless status.nil?
+    status
+  rescue Mastodon::NotPermittedError
+    nil
+  end
+
   def fetched_resource
     @fetched_resource ||= FetchResourceService.new.call(@url)
   end
diff --git a/app/services/vote_service.rb b/app/services/vote_service.rb
index cb7dce6e8..19e453332 100644
--- a/app/services/vote_service.rb
+++ b/app/services/vote_service.rb
@@ -20,7 +20,7 @@ class VoteService < BaseService
 
         ApplicationRecord.transaction do
           @choices.each do |choice|
-            @votes << @poll.votes.create!(account: @account, choice: choice)
+            @votes << @poll.votes.create!(account: @account, choice: Integer(choice))
           end
         end
       else
diff --git a/app/validators/reaction_validator.rb b/app/validators/reaction_validator.rb
new file mode 100644
index 000000000..494b6041b
--- /dev/null
+++ b/app/validators/reaction_validator.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+class ReactionValidator < ActiveModel::Validator
+  SUPPORTED_EMOJIS = Oj.load(File.read(Rails.root.join('app', 'javascript', 'mastodon', 'features', 'emoji', 'emoji_map.json'))).keys.freeze
+
+  LIMIT = 8
+
+  def validate(reaction)
+    return if reaction.name.blank?
+
+    reaction.errors.add(:name, I18n.t('reactions.errors.unrecognized_emoji')) if reaction.custom_emoji_id.blank? && !unicode_emoji?(reaction.name)
+    reaction.errors.add(:base, I18n.t('reactions.errors.limit_reached')) if new_reaction?(reaction) && limit_reached?(reaction)
+  end
+
+  private
+
+  def unicode_emoji?(name)
+    SUPPORTED_EMOJIS.include?(name)
+  end
+
+  def new_reaction?(reaction)
+    !reaction.announcement.announcement_reactions.where(name: reaction.name).exists?
+  end
+
+  def limit_reached?(reaction)
+    reaction.announcement.announcement_reactions.where.not(name: reaction.name).count('distinct name') >= LIMIT
+  end
+end
diff --git a/app/validators/unique_username_validator.rb b/app/validators/unique_username_validator.rb
index 4e24e3f5f..f87eb06ba 100644
--- a/app/validators/unique_username_validator.rb
+++ b/app/validators/unique_username_validator.rb
@@ -7,8 +7,9 @@ class UniqueUsernameValidator < ActiveModel::Validator
     return if account.username.nil?
 
     normalized_username = account.username.downcase
+    normalized_domain = account.domain&.downcase
 
-    scope = Account.where(domain: nil).where('lower(username) = ?', normalized_username)
+    scope = Account.where(Account.arel_table[:username].lower.eq normalized_username).where(Account.arel_table[:domain].lower.eq normalized_domain)
     scope = scope.where.not(id: account.id) if account.persisted?
 
     account.errors.add(:username, :taken) if scope.exists?
diff --git a/app/validators/vote_validator.rb b/app/validators/vote_validator.rb
index 2e1818bdb..b1692562d 100644
--- a/app/validators/vote_validator.rb
+++ b/app/validators/vote_validator.rb
@@ -4,10 +4,18 @@ class VoteValidator < ActiveModel::Validator
   def validate(vote)
     vote.errors.add(:base, I18n.t('polls.errors.expired')) if vote.poll.expired?
 
+    vote.errors.add(:base, I18n.t('polls.errors.invalid_choice')) if invalid_choice?(vote)
+
     if vote.poll.multiple? && vote.poll.votes.where(account: vote.account, choice: vote.choice).exists?
       vote.errors.add(:base, I18n.t('polls.errors.already_voted'))
     elsif !vote.poll.multiple? && vote.poll.votes.where(account: vote.account).exists?
       vote.errors.add(:base, I18n.t('polls.errors.already_voted'))
     end
   end
+
+  private
+
+  def invalid_choice?(vote)
+    vote.choice.negative? || vote.choice >= vote.poll.options.size
+  end
 end
diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml
index 9c26dbabc..c312fe2bd 100644
--- a/app/views/accounts/show.html.haml
+++ b/app/views/accounts/show.html.haml
@@ -2,8 +2,6 @@
   = "#{display_name(@account)} (@#{@account.local_username_and_domain})"
 
 - content_for :header_tags do
-  %meta{ name: 'description', content: account_description(@account) }/
-
   - if @account.user&.setting_noindex
     %meta{ name: 'robots', content: 'noindex, noarchive' }/
 
diff --git a/app/views/admin/accounts/index.html.haml b/app/views/admin/accounts/index.html.haml
index 7e9adb3ff..3a85324c9 100644
--- a/app/views/admin/accounts/index.html.haml
+++ b/app/views/admin/accounts/index.html.haml
@@ -22,7 +22,7 @@
 
 = form_tag admin_accounts_url, method: 'GET', class: 'simple_form' do
   .fields-group
-    - Admin::FilterHelper::ACCOUNT_FILTERS.each do |key|
+    - AccountFilter::KEYS.each do |key|
       - if params[key].present?
         = hidden_field_tag key, params[key]
 
diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml
index 9f1e3816b..a83f77134 100644
--- a/app/views/admin/accounts/show.html.haml
+++ b/app/views/admin/accounts/show.html.haml
@@ -41,7 +41,7 @@
       .dashboard__counters__num= number_to_human_size @account.media_attachments.sum('file_file_size')
       .dashboard__counters__label= t 'admin.accounts.media_attachments'
   %div
-    = link_to admin_account_followers_path(@account.id) do
+    = link_to admin_account_relationships_path(@account.id, location: 'local', relationship: 'followed_by') do
       .dashboard__counters__num= number_with_delimiter @account.local_followers_count
       .dashboard__counters__label= t 'admin.accounts.followers'
   %div
@@ -139,12 +139,12 @@
               %time.formatted{ datetime: @account.created_at.iso8601, title: l(@account.created_at) }= l @account.created_at
             %td
 
-          %tr
-            %th= t('admin.accounts.most_recent_ip')
-            %td= @account.user_current_sign_in_ip
-            %td
-              - if @account.user_current_sign_in_ip
-                = table_link_to 'search', t('admin.accounts.search_same_ip'), admin_accounts_path(ip: @account.user_current_sign_in_ip)
+          - @account.user.recent_ips.each_with_index do |(_, ip), i|
+            %tr
+              - if i.zero?
+                %th{ rowspan: @account.user.recent_ips.size }= t('admin.accounts.most_recent_ip')
+              %td= ip
+              %td= table_link_to 'search', t('admin.accounts.search_same_ip'), admin_accounts_path(ip: ip)
 
           %tr
             %th= t('admin.accounts.most_recent_activity')
diff --git a/app/views/admin/announcements/_announcement.html.haml b/app/views/admin/announcements/_announcement.html.haml
new file mode 100644
index 000000000..1c7f89ef2
--- /dev/null
+++ b/app/views/admin/announcements/_announcement.html.haml
@@ -0,0 +1,19 @@
+.announcements-list__item
+  = link_to edit_admin_announcement_path(announcement), class: 'announcements-list__item__title' do
+    = truncate(announcement.text)
+
+  .announcements-list__item__action-bar
+    .announcements-list__item__meta
+      - if announcement.scheduled_at.present?
+        = t('admin.announcements.scheduled_for', time: l(announcement.scheduled_at))
+      - else
+        = l(announcement.created_at)
+
+    %div
+      - if can?(:update, announcement)
+        - if announcement.published?
+          = table_link_to 'toggle-off', t('admin.announcements.unpublish'), unpublish_admin_announcement_path(announcement), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }
+        - else
+          = table_link_to 'toggle-on', t('admin.announcements.publish'), publish_admin_announcement_path(announcement), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }
+
+      = table_link_to 'trash', t('generic.delete'), admin_announcement_path(announcement), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, announcement)
diff --git a/app/views/admin/announcements/edit.html.haml b/app/views/admin/announcements/edit.html.haml
new file mode 100644
index 000000000..5f56db5e7
--- /dev/null
+++ b/app/views/admin/announcements/edit.html.haml
@@ -0,0 +1,22 @@
+- content_for :page_title do
+  = t('.title')
+
+= simple_form_for @announcement, url: admin_announcement_path(@announcement) do |f|
+  = render 'shared/error_messages', object: @announcement
+
+  .fields-group
+    = f.input :starts_at, include_blank: true, wrapper: :with_block_label
+    = f.input :ends_at, include_blank: true, wrapper: :with_block_label
+
+  .fields-group
+    = f.input :all_day, as: :boolean, wrapper: :with_label
+
+  .fields-group
+    = f.input :text, wrapper: :with_block_label
+
+  - unless @announcement.published?
+    .fields-group
+      = f.input :scheduled_at, include_blank: true, wrapper: :with_block_label
+
+  .actions
+    = f.button :button, t('generic.save_changes'), type: :submit
diff --git a/app/views/admin/announcements/index.html.haml b/app/views/admin/announcements/index.html.haml
new file mode 100644
index 000000000..40f02b914
--- /dev/null
+++ b/app/views/admin/announcements/index.html.haml
@@ -0,0 +1,22 @@
+- content_for :page_title do
+  = t('admin.announcements.title')
+
+- content_for :heading_actions do
+  = link_to t('admin.announcements.new.title'), new_admin_announcement_path, class: 'button'
+
+.filters
+  .filter-subset
+    %strong= t('admin.relays.status')
+    %ul
+      %li= filter_link_to t('generic.all'), published: nil, unpublished: nil
+      %li= filter_link_to safe_join([t('admin.announcements.live'), "(#{number_with_delimiter(Announcement.published.count)})"], ' '), published: '1', unpublished: nil
+
+- if @announcements.empty?
+  %div.muted-hint.center-text
+    = t 'admin.announcements.empty'
+- else
+  .announcements-list
+    = render partial: 'announcement', collection: @announcements
+
+= paginate @announcements
+
diff --git a/app/views/admin/announcements/new.html.haml b/app/views/admin/announcements/new.html.haml
new file mode 100644
index 000000000..a5298c5f6
--- /dev/null
+++ b/app/views/admin/announcements/new.html.haml
@@ -0,0 +1,21 @@
+- content_for :page_title do
+  = t('.title')
+
+= simple_form_for @announcement, url: admin_announcements_path do |f|
+  = render 'shared/error_messages', object: @announcement
+
+  .fields-group
+    = f.input :starts_at, include_blank: true, wrapper: :with_block_label
+    = f.input :ends_at, include_blank: true, wrapper: :with_block_label
+
+  .fields-group
+    = f.input :all_day, as: :boolean, wrapper: :with_label
+
+  .fields-group
+    = f.input :text, wrapper: :with_block_label
+
+  .fields-group
+    = f.input :scheduled_at, include_blank: true, wrapper: :with_block_label
+
+  .actions
+    = f.button :button, t('.create'), type: :submit
diff --git a/app/views/admin/custom_emojis/index.html.haml b/app/views/admin/custom_emojis/index.html.haml
index 4fbadee90..d3705a36e 100644
--- a/app/views/admin/custom_emojis/index.html.haml
+++ b/app/views/admin/custom_emojis/index.html.haml
@@ -1,6 +1,9 @@
 - content_for :page_title do
   = t('admin.custom_emojis.title')
 
+- content_for :heading_actions do
+  = link_to t('admin.custom_emojis.upload'), new_admin_custom_emoji_path, class: 'button'
+
 .filters
   .filter-subset
     %strong= t('admin.accounts.location.title')
@@ -19,7 +22,7 @@
 
 = form_tag admin_custom_emojis_url, method: 'GET', class: 'simple_form' do
   .fields-group
-    - Admin::FilterHelper::CUSTOM_EMOJI_FILTERS.each do |key|
+    - CustomEmojiFilter::KEYS.each do |key|
       = hidden_field_tag key, params[key] if params[key].present?
 
     - %i(shortcode by_domain).each do |key|
@@ -33,7 +36,7 @@
 = form_for(@form, url: batch_admin_custom_emojis_path) do |f|
   = hidden_field_tag :page, params[:page] || 1
 
-  - Admin::FilterHelper::CUSTOM_EMOJI_FILTERS.each do |key|
+  - CustomEmojiFilter::KEYS.each do |key|
     = hidden_field_tag key, params[key] if params[key].present?
 
   .batch-table
@@ -78,6 +81,3 @@
 
 = paginate @custom_emojis
 
-%hr.spacer/
-
-= link_to t('admin.custom_emojis.upload'), new_admin_custom_emoji_path, class: 'button'
diff --git a/app/views/admin/email_domain_blocks/index.html.haml b/app/views/admin/email_domain_blocks/index.html.haml
index 7bb204e52..6015cfac0 100644
--- a/app/views/admin/email_domain_blocks/index.html.haml
+++ b/app/views/admin/email_domain_blocks/index.html.haml
@@ -1,14 +1,19 @@
 - content_for :page_title do
   = t('admin.email_domain_blocks.title')
 
-.table-wrapper
-  %table.table
-    %thead
-      %tr
-        %th= t('admin.email_domain_blocks.domain')
-        %th
-    %tbody
-      = render @email_domain_blocks
+- content_for :heading_actions do
+  = link_to t('admin.email_domain_blocks.add_new'), new_admin_email_domain_block_path, class: 'button'
+
+- if @email_domain_blocks.empty?
+  %div.muted-hint.center-text=t 'admin.email_domain_blocks.empty'
+- else
+  .table-wrapper
+    %table.table
+      %thead
+        %tr
+          %th= t('admin.email_domain_blocks.domain')
+          %th
+      %tbody
+        = render @email_domain_blocks
 
 = paginate @email_domain_blocks
-= link_to t('admin.email_domain_blocks.add_new'), new_admin_email_domain_block_path, class: 'button'
diff --git a/app/views/admin/followers/index.html.haml b/app/views/admin/followers/index.html.haml
deleted file mode 100644
index 25f1f290f..000000000
--- a/app/views/admin/followers/index.html.haml
+++ /dev/null
@@ -1,28 +0,0 @@
-- content_for :page_title do
-  = t('admin.followers.title', acct: @account.acct)
-
-.filters
-  .filter-subset
-    %strong= t('admin.accounts.location.title')
-    %ul
-      %li= link_to t('admin.accounts.location.local'), admin_account_followers_path(@account.id), class: 'selected'
-  .back-link{ style: 'flex: 1 1 auto; text-align: right' }
-    = link_to admin_account_path(@account.id) do
-      = fa_icon 'chevron-left fw'
-      = t('admin.followers.back_to_account')
-
-%hr.spacer/
-
-.table-wrapper
-  %table.table
-    %thead
-      %tr
-        %th= t('admin.accounts.username')
-        %th= t('admin.accounts.role')
-        %th= t('admin.accounts.most_recent_ip')
-        %th= t('admin.accounts.most_recent_activity')
-        %th
-    %tbody
-      = render partial: 'admin/accounts/account', collection: @followers
-
-= paginate @followers
diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml
index 1d85aa75e..0b299acc5 100644
--- a/app/views/admin/instances/index.html.haml
+++ b/app/views/admin/instances/index.html.haml
@@ -19,9 +19,8 @@
 - unless whitelist_mode?
   = form_tag admin_instances_url, method: 'GET', class: 'simple_form' do
     .fields-group
-      - Admin::FilterHelper::INSTANCES_FILTERS.each do |key|
-        - if params[key].present?
-          = hidden_field_tag key, params[key]
+      - InstanceFilter::KEYS.each do |key|
+        = hidden_field_tag key, params[key] if params[key].present?
 
       - %i(by_domain).each do |key|
         .input.string.optional
diff --git a/app/views/admin/relationships/index.html.haml b/app/views/admin/relationships/index.html.haml
new file mode 100644
index 000000000..3afaff615
--- /dev/null
+++ b/app/views/admin/relationships/index.html.haml
@@ -0,0 +1,39 @@
+- content_for :page_title do
+  = t('admin.relationships.title', acct: @account.acct)
+
+.filters
+  .filter-subset
+    %strong= t 'relationships.relationship'
+    %ul
+      %li= filter_link_to t('relationships.following'), relationship: nil
+      %li= filter_link_to t('relationships.followers'), relationship: 'followed_by'
+      %li= filter_link_to t('relationships.mutual'), relationship: 'mutual'
+      %li= filter_link_to t('relationships.invited'), relationship: 'invited'
+
+  .filter-subset
+    %strong= t('admin.accounts.location.title')
+    %ul
+      %li= filter_link_to t('admin.accounts.moderation.all'), location: nil
+      %li= filter_link_to t('admin.accounts.location.local'), location: 'local'
+      %li= filter_link_to t('admin.accounts.location.remote'), location: 'remote'
+
+  .back-link{ style: 'flex: 1 1 auto; text-align: right' }
+    = link_to admin_account_path(@account.id) do
+      = fa_icon 'chevron-left fw'
+      = t('admin.statuses.back_to_account')
+
+%hr.spacer/
+
+.table-wrapper
+  %table.table
+    %thead
+      %tr
+        %th= t('admin.accounts.username')
+        %th= t('admin.accounts.role')
+        %th= t('admin.accounts.most_recent_ip')
+        %th= t('admin.accounts.most_recent_activity')
+        %th
+    %tbody
+      = render partial: 'admin/accounts/account', collection: @accounts
+
+= paginate @accounts
diff --git a/app/views/admin/reports/_status.html.haml b/app/views/admin/reports/_status.html.haml
index 425d315e1..fa15796d2 100644
--- a/app/views/admin/reports/_status.html.haml
+++ b/app/views/admin/reports/_status.html.haml
@@ -14,9 +14,12 @@
     - unless status.proper.media_attachments.empty?
       - if status.proper.media_attachments.first.video?
         - video = status.proper.media_attachments.first
-        = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), sensitive: !current_account&.user&.show_all_media? && status.proper.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description
+        = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), blurhash: video.blurhash, sensitive: status.proper.sensitive?, visible: false, width: 610, height: 343, inline: true, alt: video.description
+      - elsif status.proper.media_attachments.first.audio?
+        - audio = status.proper.media_attachments.first
+        = react_component :audio, src: audio.file.url(:original), height: 110, alt: audio.description, duration: audio.file.meta.dig(:original, :duration)
       - else
-        = react_component :media_gallery, height: 343, sensitive: !current_account&.user&.show_all_media? && status.proper.sensitive? || current_account&.user&.hide_all_media?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif, media: status.proper.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }
+        = react_component :media_gallery, height: 343, sensitive: status.proper.sensitive?, visible: false, media: status.proper.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json }
 
     .detailed-status__meta
       = link_to ActivityPub::TagManager.instance.url_for(status), class: 'detailed-status__datetime', target: stream_link_target, rel: 'noopener noreferrer' do
diff --git a/app/views/admin/reports/index.html.haml b/app/views/admin/reports/index.html.haml
index 30c7549b0..0263b80fb 100644
--- a/app/views/admin/reports/index.html.haml
+++ b/app/views/admin/reports/index.html.haml
@@ -10,9 +10,8 @@
 
 = form_tag admin_reports_url, method: 'GET', class: 'simple_form' do
   .fields-group
-    - Admin::FilterHelper::REPORT_FILTERS.each do |key|
-      - if params[key].present?
-        = hidden_field_tag key, params[key]
+    - ReportFilter::KEYS.each do |key|
+      = hidden_field_tag key, params[key] if params[key].present?
 
     - %i(by_target_domain).each do |key|
       .input.string.optional
diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml
index 4321bb199..b12ea4270 100644
--- a/app/views/admin/reports/show.html.haml
+++ b/app/views/admin/reports/show.html.haml
@@ -1,7 +1,7 @@
 - content_for :page_title do
   = t('admin.reports.report', id: @report.id)
 
-- content_for :page_heading_actions do
+- content_for :heading_actions do
   - if @report.unresolved?
     = link_to t('admin.reports.mark_as_resolved'), resolve_admin_report_path(@report), method: :post, class: 'button'
   - else
diff --git a/app/views/admin/tags/_tag.html.haml b/app/views/admin/tags/_tag.html.haml
index 670f3bc05..287d28e53 100644
--- a/app/views/admin/tags/_tag.html.haml
+++ b/app/views/admin/tags/_tag.html.haml
@@ -1,6 +1,7 @@
 .batch-table__row
-  %label.batch-table__row__select.batch-table__row__select--aligned.batch-checkbox
-    = f.check_box :tag_ids, { multiple: true, include_hidden: false }, tag.id
+  - if batch_available
+    %label.batch-table__row__select.batch-table__row__select--aligned.batch-checkbox
+      = f.check_box :tag_ids, { multiple: true, include_hidden: false }, tag.id
 
   .directory__tag
     = link_to admin_tag_path(tag.id) do
diff --git a/app/views/admin/tags/index.html.haml b/app/views/admin/tags/index.html.haml
index 298ac59e9..d20ed80f8 100644
--- a/app/views/admin/tags/index.html.haml
+++ b/app/views/admin/tags/index.html.haml
@@ -25,7 +25,7 @@
 
 = form_tag admin_tags_url, method: 'GET', class: 'simple_form' do
   .fields-group
-    - Admin::FilterHelper::TAGS_FILTERS.each do |key|
+    - TagFilter::KEYS.each do |key|
       = hidden_field_tag key, params[key] if params[key].present?
 
     - %i(name).each do |key|
@@ -40,32 +40,32 @@
 
 = form_for(@form, url: batch_admin_tags_path) do |f|
   = hidden_field_tag :page, params[:page] || 1
-  = hidden_field_tag :name, params[:name] if params[:name].present?
 
-  - Admin::FilterHelper::TAGS_FILTERS.each do |key|
+  - TagFilter::KEYS.each do |key|
     = hidden_field_tag key, params[key] if params[key].present?
 
   .batch-table.optional
     .batch-table__toolbar
-      %label.batch-table__toolbar__select.batch-checkbox-all
-        = check_box_tag :batch_checkbox_all, nil, false
-      .batch-table__toolbar__actions
-        - if params[:pending_review] == '1'
+      - if params[:pending_review] == '1' || params[:unreviewed] == '1'
+        %label.batch-table__toolbar__select.batch-checkbox-all
+          = check_box_tag :batch_checkbox_all, nil, false
+        .batch-table__toolbar__actions
           = f.button safe_join([fa_icon('check'), t('admin.accounts.approve')]), name: :approve, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
 
           = f.button safe_join([fa_icon('times'), t('admin.accounts.reject')]), name: :reject, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
-        - else
+      - else
+        .batch-table__toolbar__actions
           %span.neutral-hint= t('generic.no_batch_actions_available')
 
     .batch-table__body
       - if @tags.empty?
         = nothing_here 'nothing-here--under-tabs'
       - else
-        = render partial: 'tag', collection: @tags, locals: { f: f }
+        = render partial: 'tag', collection: @tags, locals: { f: f, batch_available: params[:pending_review] == '1' || params[:unreviewed] == '1' }
 
 = paginate @tags
 
-- if params[:pending_review] == '1'
+- if params[:pending_review] == '1' || params[:unreviewed] == '1'
   %hr.spacer/
 
   %div{ style: 'overflow: hidden' }
diff --git a/app/views/directories/index.html.haml b/app/views/directories/index.html.haml
index dee99475a..ecf12b649 100644
--- a/app/views/directories/index.html.haml
+++ b/app/views/directories/index.html.haml
@@ -47,7 +47,7 @@
             %small= t('accounts.followers', count: account.followers_count).downcase
           .accounts-table__count
             - if account.last_status_at.present?
-              %time.time-ago{ datetime: account.last_status_at.iso8601, title: l(account.last_status_at) }= l account.last_status_at
+              %time.time-ago{ datetime: account.last_status_at.to_date.iso8601, title: l(account.last_status_at.to_date) }= l account.last_status_at.to_date
             - else
               = t('accounts.never_active')
 
diff --git a/app/views/filters/index.html.haml b/app/views/filters/index.html.haml
index 18ebee570..b4d5333aa 100644
--- a/app/views/filters/index.html.haml
+++ b/app/views/filters/index.html.haml
@@ -1,20 +1,24 @@
 - content_for :page_title do
   = t('filters.index.title')
 
-.table-wrapper
-  %table.table
-    %thead
-      %tr
-        %th= t('simple_form.labels.defaults.phrase')
-        %th= t('simple_form.labels.defaults.context')
-        %th
-    %tbody
-      - @filters.each do |filter|
-        %tr
-          %td= filter.phrase
-          %td= filter.context.map { |context| I18n.t("filters.contexts.#{context}") }.join(', ')
-          %td
-            = table_link_to 'pencil', t('filters.edit.title'), edit_filter_path(filter)
-            = table_link_to 'times', t('filters.index.delete'), filter_path(filter), method: :delete
+- content_for :heading_actions do
+  = link_to t('filters.new.title'), new_filter_path, class: 'button'
 
-= link_to t('filters.new.title'), new_filter_path, class: 'button'
+- if @filters.empty?
+  %div.muted-hint.center-text= t 'filters.index.empty'
+- else
+  .table-wrapper
+    %table.table
+      %thead
+        %tr
+          %th= t('simple_form.labels.defaults.phrase')
+          %th= t('simple_form.labels.defaults.context')
+          %th
+      %tbody
+        - @filters.each do |filter|
+          %tr
+            %td= filter.phrase
+            %td= filter.context.map { |context| I18n.t("filters.contexts.#{context}") }.join(', ')
+            %td
+              = table_link_to 'pencil', t('filters.edit.title'), edit_filter_path(filter)
+              = table_link_to 'times', t('filters.index.delete'), filter_path(filter), method: :delete
diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml
index 9fceb54eb..ec3629dd8 100644
--- a/app/views/layouts/admin.html.haml
+++ b/app/views/layouts/admin.html.haml
@@ -1,3 +1,6 @@
+- content_for :header_tags do
+  = render_initial_state
+
 - content_for :content do
   .admin-wrapper
     .sidebar-wrapper
@@ -21,9 +24,9 @@
         .content-heading
           %h2= yield :page_title
 
-          - if :page_heading_actions
+          - if :heading_actions
             .content-heading-actions
-              = yield :page_heading_actions
+              = yield :heading_actions
 
         = render 'application/flashes'
 
diff --git a/app/views/layouts/embedded.html.haml b/app/views/layouts/embedded.html.haml
index 33e3714f8..6695b12dd 100644
--- a/app/views/layouts/embedded.html.haml
+++ b/app/views/layouts/embedded.html.haml
@@ -10,6 +10,7 @@
     - if storage_host?
       %link{ rel: 'dns-prefetch', href: storage_host }/
 
+    = render_initial_state
     = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous'
     - if @theme
       - if @theme[:supported_locales].include? I18n.locale.to_s
@@ -21,3 +22,6 @@
 
   %body.embed
     = yield
+
+    %div{ style: 'display: none'}
+      = render file: Rails.root.join('app', 'javascript', 'images', 'logo_transparent.svg')
diff --git a/app/views/relationships/_account.html.haml b/app/views/relationships/_account.html.haml
index 6c22deb51..af5a4aaf7 100644
--- a/app/views/relationships/_account.html.haml
+++ b/app/views/relationships/_account.html.haml
@@ -14,7 +14,7 @@
             %small= t('accounts.followers', count: account.followers_count).downcase
           %td.accounts-table__count
             - if account.last_status_at.present?
-              %time.time-ago{ datetime: account.last_status_at.iso8601, title: l(account.last_status_at) }= l account.last_status_at
+              %time.time-ago{ datetime: account.last_status_at.to_date.iso8601, title: l(account.last_status_at.to_date) }= l account.last_status_at
             - else
               \-
             %small= t('accounts.last_active')
diff --git a/app/views/relationships/show.html.haml b/app/views/relationships/show.html.haml
index 408390a35..a6f8cdc15 100644
--- a/app/views/relationships/show.html.haml
+++ b/app/views/relationships/show.html.haml
@@ -30,10 +30,9 @@
 
 = form_for(@form, url: relationships_path, method: :patch) do |f|
   = hidden_field_tag :page, params[:page] || 1
-  = hidden_field_tag :relationship, params[:relationship]
-  = hidden_field_tag :status, params[:status]
-  = hidden_field_tag :activity, params[:activity]
-  = hidden_field_tag :order, params[:order]
+
+  - RelationshipFilter::KEYS.each do |key|
+    = hidden_field_tag key, params[key] if params[key].present?
 
   .batch-table
     .batch-table__toolbar
diff --git a/app/views/settings/applications/index.html.haml b/app/views/settings/applications/index.html.haml
index 919472c2e..a1f904a3a 100644
--- a/app/views/settings/applications/index.html.haml
+++ b/app/views/settings/applications/index.html.haml
@@ -1,20 +1,25 @@
 - content_for :page_title do
   = t('doorkeeper.applications.index.title')
 
-.table-wrapper
-  %table.table
-    %thead
-      %tr
-        %th= t('doorkeeper.applications.index.application')
-        %th= t('doorkeeper.applications.index.scopes')
-        %th
-    %tbody
-      - @applications.each do |application|
+- content_for :heading_actions do
+  = link_to t('doorkeeper.applications.index.new'), new_settings_application_path, class: 'button'
+
+- if @applications.empty?
+  %div.muted-hint.center-text=t 'doorkeeper.applications.index.empty'
+- else
+  .table-wrapper
+    %table.table
+      %thead
         %tr
-          %td= link_to application.name, settings_application_path(application)
-          %th= application.scopes
-          %td
-            = table_link_to 'times', t('doorkeeper.applications.index.delete'), settings_application_path(application), method: :delete, data: { confirm: t('doorkeeper.applications.confirmations.destroy') }
+          %th= t('doorkeeper.applications.index.application')
+          %th= t('doorkeeper.applications.index.scopes')
+          %th
+      %tbody
+        - @applications.each do |application|
+          %tr
+            %td= link_to application.name, settings_application_path(application)
+            %th= application.scopes
+            %td
+              = table_link_to 'times', t('doorkeeper.applications.index.delete'), settings_application_path(application), method: :delete, data: { confirm: t('doorkeeper.applications.confirmations.destroy') }
 
 = paginate @applications
-= link_to t('doorkeeper.applications.index.new'), new_settings_application_path, class: 'button'
diff --git a/app/views/settings/preferences/appearance/show.html.haml b/app/views/settings/preferences/appearance/show.html.haml
index f1e3d2e97..f460cebba 100644
--- a/app/views/settings/preferences/appearance/show.html.haml
+++ b/app/views/settings/preferences/appearance/show.html.haml
@@ -5,6 +5,10 @@
   .fields-group
     = f.input :locale, collection: I18n.available_locales, wrapper: :with_label, include_blank: false, label_method: lambda { |locale| human_locale(locale) }, selected: I18n.locale, hint: false
 
+  - unless I18n.locale == :en
+    .flash-message{ style: "text-align: unset; color: unset" }
+      #{t 'appearance.localization.body'} #{content_tag(:a, t('appearance.localization.guide_link_text'), href: t('appearance.localization.guide_link'), target: "_blank", rel: "noopener", style: "text-decoration: underline")}
+
   %h4= t 'appearance.advanced_web_interface'
 
   %p.hint= t 'appearance.advanced_web_interface_hint'
diff --git a/app/views/statuses/_detailed_status.html.haml b/app/views/statuses/_detailed_status.html.haml
index 3fa52d3f2..021390e47 100644
--- a/app/views/statuses/_detailed_status.html.haml
+++ b/app/views/statuses/_detailed_status.html.haml
@@ -29,14 +29,14 @@
   - if !status.media_attachments.empty?
     - if status.media_attachments.first.video?
       - video = status.media_attachments.first
-      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), blurhash: video.blurhash, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 670, height: 380, detailed: true, inline: true, alt: video.description do
+      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), blurhash: video.blurhash, sensitive: status.sensitive?, width: 670, height: 380, detailed: true, inline: true, alt: video.description do
         = render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
     - elsif status.media_attachments.first.audio?
       - audio = status.media_attachments.first
       = react_component :audio, src: audio.file.url(:original), height: 130, alt: audio.description, preload: true, duration: audio.file.meta.dig(:original, :duration) do
         = render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
     - else
-      = react_component :media_gallery, height: 380, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, standalone: true, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, 'reduceMotion': current_account&.user&.setting_reduce_motion, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
+      = react_component :media_gallery, height: 380, sensitive: status.sensitive?, standalone: true, autoplay: autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
         = render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
   - elsif status.preview_card
     = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml
index e9c22d9ba..8a418a1d5 100644
--- a/app/views/statuses/_simple_status.html.haml
+++ b/app/views/statuses/_simple_status.html.haml
@@ -33,18 +33,22 @@
   - if !status.media_attachments.empty?
     - if status.media_attachments.first.video?
       - video = status.media_attachments.first
-      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), blurhash: video.blurhash, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, width: 610, height: 343, inline: true, alt: video.description do
+      = react_component :video, src: video.file.url(:original), preview: video.file.url(:small), blurhash: video.blurhash, sensitive: status.sensitive?, width: 610, height: 343, inline: true, alt: video.description do
         = render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
     - elsif status.media_attachments.first.audio?
       - audio = status.media_attachments.first
       = react_component :audio, src: audio.file.url(:original), height: 110, alt: audio.description, duration: audio.file.meta.dig(:original, :duration) do
         = render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
     - else
-      = react_component :media_gallery, height: 343, sensitive: !current_account&.user&.show_all_media? && status.sensitive? || current_account&.user&.hide_all_media?, 'autoPlayGif': current_account&.user&.setting_auto_play_gif || autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
+      = react_component :media_gallery, height: 343, sensitive: status.sensitive?, autoplay: autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
         = render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
   - elsif status.preview_card
     = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
 
+  - if !status.in_reply_to_id.nil? && status.in_reply_to_account_id == status.account.id
+    = link_to ActivityPub::TagManager.instance.url_for(status), class: 'status__content__read-more-button', target: stream_link_target, rel: 'noopener noreferrer' do
+      = t 'statuses.show_thread'
+
   .status__action-bar
     .status__action-bar__counter
       = link_to remote_interaction_path(status, type: :reply), class: 'status__action-bar-button icon-button modal-button', style: 'font-size: 18px; width: 23.1429px; height: 23.1429px; line-height: 23.15px;' do
diff --git a/app/views/statuses/embed.html.haml b/app/views/statuses/embed.html.haml
index 6f2ec646f..2f111f53f 100644
--- a/app/views/statuses/embed.html.haml
+++ b/app/views/statuses/embed.html.haml
@@ -1,3 +1,2 @@
-- cache @status do
-  .activity-stream.activity-stream--headless
-    = render 'status', status: @status, centered: true, autoplay: @autoplay
+.activity-stream.activity-stream--headless
+  = render 'status', status: @status, centered: true, autoplay: @autoplay
diff --git a/app/workers/activitypub/delivery_worker.rb b/app/workers/activitypub/delivery_worker.rb
index 5457d9d4b..196af4af1 100644
--- a/app/workers/activitypub/delivery_worker.rb
+++ b/app/workers/activitypub/delivery_worker.rb
@@ -50,9 +50,13 @@ class ActivityPub::DeliveryWorker
       end
     end
 
-    light.with_threshold(STOPLIGHT_FAILURE_THRESHOLD)
-         .with_cool_off_time(STOPLIGHT_COOLDOWN)
-         .run
+    begin
+      light.with_threshold(STOPLIGHT_FAILURE_THRESHOLD)
+           .with_cool_off_time(STOPLIGHT_COOLDOWN)
+           .run
+    rescue Stoplight::Error::RedLight => e
+      raise e.class, e.message, e.backtrace.first(3)
+    end
   end
 
   def failure_tracker
diff --git a/app/workers/publish_announcement_reaction_worker.rb b/app/workers/publish_announcement_reaction_worker.rb
new file mode 100644
index 000000000..418dc7127
--- /dev/null
+++ b/app/workers/publish_announcement_reaction_worker.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class PublishAnnouncementReactionWorker
+  include Sidekiq::Worker
+  include Redisable
+
+  def perform(announcement_id, name)
+    announcement = Announcement.find(announcement_id)
+
+    reaction,  = announcement.announcement_reactions.where(name: name).group(:announcement_id, :name, :custom_emoji_id).select('name, custom_emoji_id, count(*) as count, false as me')
+    reaction ||= announcement.announcement_reactions.new(name: name)
+
+    payload = InlineRenderer.render(reaction, nil, :reaction).tap { |h| h[:announcement_id] = announcement_id.to_s }
+    payload = Oj.dump(event: :'announcement.reaction', payload: payload)
+
+    FeedManager.instance.with_active_accounts do |account|
+      redis.publish("timeline:#{account.id}", payload) if redis.exists("subscribed:timeline:#{account.id}")
+    end
+  rescue ActiveRecord::RecordNotFound
+    true
+  end
+end
diff --git a/app/workers/publish_scheduled_announcement_worker.rb b/app/workers/publish_scheduled_announcement_worker.rb
new file mode 100644
index 000000000..efca39d3d
--- /dev/null
+++ b/app/workers/publish_scheduled_announcement_worker.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class PublishScheduledAnnouncementWorker
+  include Sidekiq::Worker
+  include Redisable
+
+  def perform(announcement_id)
+    announcement = Announcement.find(announcement_id)
+
+    announcement.publish! unless announcement.published?
+
+    payload = InlineRenderer.render(announcement, nil, :announcement)
+    payload = Oj.dump(event: :announcement, payload: payload)
+
+    FeedManager.instance.with_active_accounts do |account|
+      redis.publish("timeline:#{account.id}", payload) if redis.exists("subscribed:timeline:#{account.id}")
+    end
+  end
+end
diff --git a/app/workers/refollow_worker.rb b/app/workers/refollow_worker.rb
index 12f2bf671..9b07ce1b5 100644
--- a/app/workers/refollow_worker.rb
+++ b/app/workers/refollow_worker.rb
@@ -7,15 +7,18 @@ class RefollowWorker
 
   def perform(target_account_id)
     target_account = Account.find(target_account_id)
-    return unless target_account.protocol == :activitypub
+    return unless target_account.activitypub?
+
+    target_account.passive_relationships.where(account: Account.where(domain: nil)).includes(:account).reorder(nil).find_each do |follow|
+      reblogs = follow.show_reblogs?
 
-    target_account.followers.where(domain: nil).reorder(nil).find_each do |follower|
       # Locally unfollow remote account
+      follower = follow.account
       follower.unfollow!(target_account)
 
       # Schedule re-follow
       begin
-        FollowService.new.call(follower, target_account)
+        FollowService.new.call(follower, target_account, reblogs: reblogs)
       rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound, Mastodon::UnexpectedResponseError, HTTP::Error, OpenSSL::SSL::SSLError
         next
       end
diff --git a/app/workers/scheduler/scheduled_statuses_scheduler.rb b/app/workers/scheduler/scheduled_statuses_scheduler.rb
index 1772a246b..9cfe949de 100644
--- a/app/workers/scheduler/scheduled_statuses_scheduler.rb
+++ b/app/workers/scheduler/scheduled_statuses_scheduler.rb
@@ -6,14 +6,38 @@ class Scheduler::ScheduledStatusesScheduler
   sidekiq_options unique: :until_executed, retry: 0
 
   def perform
+    publish_scheduled_statuses!
+    publish_scheduled_announcements!
+    unpublish_expired_announcements!
+  end
+
+  private
+
+  def publish_scheduled_statuses!
     due_statuses.find_each do |scheduled_status|
       PublishScheduledStatusWorker.perform_at(scheduled_status.scheduled_at, scheduled_status.id)
     end
   end
 
-  private
-
   def due_statuses
     ScheduledStatus.where('scheduled_at <= ?', Time.now.utc + PostStatusService::MIN_SCHEDULE_OFFSET)
   end
+
+  def publish_scheduled_announcements!
+    due_announcements.find_each do |announcement|
+      PublishScheduledAnnouncementWorker.perform_at(announcement.scheduled_at, announcement.id)
+    end
+  end
+
+  def due_announcements
+    Announcement.unpublished.where('scheduled_at IS NOT NULL AND scheduled_at <= ?', Time.now.utc + PostStatusService::MIN_SCHEDULE_OFFSET)
+  end
+
+  def unpublish_expired_announcements!
+    expired_announcements.in_batches.update_all(published: false, scheduled_at: nil)
+  end
+
+  def expired_announcements
+    Announcement.published.where('ends_at IS NOT NULL AND ends_at <= ?', Time.now.utc)
+  end
 end
diff --git a/app/workers/unpublish_announcement_worker.rb b/app/workers/unpublish_announcement_worker.rb
new file mode 100644
index 000000000..e99d70cf8
--- /dev/null
+++ b/app/workers/unpublish_announcement_worker.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class UnpublishAnnouncementWorker
+  include Sidekiq::Worker
+  include Redisable
+
+  def perform(announcement_id)
+    payload = Oj.dump(event: :'announcement.delete', payload: announcement_id.to_s)
+
+    FeedManager.instance.with_active_accounts do |account|
+      redis.publish("timeline:#{account.id}", payload) if redis.exists("subscribed:timeline:#{account.id}")
+    end
+  end
+end
diff --git a/config/application.rb b/config/application.rb
index e1f7ae707..1baa166ce 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -69,9 +69,11 @@ module Mastodon
       :hy,
       :id,
       :io,
+      :is,
       :it,
       :ja,
       :ka,
+      :kab,
       :kk,
       :kn,
       :ko,
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index 7784bec62..e03380cec 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -8,20 +8,15 @@ Doorkeeper.configure do
   end
 
   resource_owner_from_credentials do |_routes|
-    if Devise.ldap_authentication
-      user = User.authenticate_with_ldap({ :email => request.params[:username], :password => request.params[:password] })
-    end
-
-    if Devise.pam_authentication
-      user ||= User.authenticate_with_ldap({ :email => request.params[:username], :password => request.params[:password] })
-    end
+    user   = User.authenticate_with_ldap(email: request.params[:username], password: request.params[:password]) if Devise.ldap_authentication
+    user ||= User.authenticate_with_pam(email: request.params[:username], password: request.params[:password]) if Devise.pam_authentication
 
     if user.nil?
       user = User.find_by(email: request.params[:username])
-      user = nil unless user.valid_password?(request.params[:password])
+      user = nil unless user&.valid_password?(request.params[:password])
     end
 
-    user if !user&.otp_required_for_login?
+    user unless user&.otp_required_for_login?
   end
 
   # If you want to restrict access to the web interface for adding oauth authorized applications, you need to declare the block below.
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
index 5109baff7..8909678d6 100644
--- a/config/initializers/paperclip.rb
+++ b/config/initializers/paperclip.rb
@@ -1,5 +1,7 @@
 # frozen_string_literal: true
 
+Paperclip::DataUriAdapter.register
+
 Paperclip.interpolates :filename do |attachment, style|
   if style == :original
     attachment.original_filename
diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb
index 273cac9ca..3cd7ea3a6 100644
--- a/config/initializers/rack_attack.rb
+++ b/config/initializers/rack_attack.rb
@@ -46,10 +46,7 @@ class Rack::Attack
 
   PROTECTED_PATHS_REGEX = Regexp.union(PROTECTED_PATHS.map { |path| /\A#{Regexp.escape(path)}/ })
 
-  # Always allow requests from localhost
-  # (blocklist & throttles are skipped)
   Rack::Attack.safelist('allow from localhost') do |req|
-    # Requests are allowed if the return value is truthy
     req.remote_ip == '127.0.0.1' || req.remote_ip == '::1'
   end
 
diff --git a/config/initializers/simple_form.rb b/config/initializers/simple_form.rb
index 964526819..3dc48ef08 100644
--- a/config/initializers/simple_form.rb
+++ b/config/initializers/simple_form.rb
@@ -98,7 +98,7 @@ SimpleForm.setup do |config|
     b.use :html5
     b.use :label
     b.use :hint, wrap_with: { tag: :span, class: :hint }
-    b.use :input
+    b.use :input, wrap_with: { tag: :div, class: :label_input }
     b.use :error, wrap_with: { tag: :span, class: :error }
   end
 
diff --git a/config/initializers/twitter_regex.rb b/config/initializers/twitter_regex.rb
index 0ddbbee98..f84f7c0cb 100644
--- a/config/initializers/twitter_regex.rb
+++ b/config/initializers/twitter_regex.rb
@@ -29,7 +29,7 @@ module Twitter
       (                                                                                     #   $1 total match
         (#{REGEXEN[:valid_url_preceding_chars]})                                            #   $2 Preceding character
         (                                                                                   #   $3 URL
-          ((https?|dat|dweb|ipfs|ipns|ssb|gopher):\/\/)?                                    #   $4 Protocol (optional)
+          ((?:https?|dat|dweb|ipfs|ipns|ssb|gopher):\/\/)?                                  #   $4 Protocol (optional)
           (#{REGEXEN[:valid_domain]})                                                       #   $5 Domain(s)
           (?::(#{REGEXEN[:valid_port_number]}))?                                            #   $6 Port number (optional)
           (/#{REGEXEN[:valid_url_path]}*)?                                                  #   $7 URL Path and anchor
@@ -37,5 +37,61 @@ module Twitter
         )
       )
     }iox
+    REGEXEN[:validate_nodeid] = /(?:
+      #{REGEXEN[:validate_url_unreserved]}|
+      #{REGEXEN[:validate_url_pct_encoded]}|
+      [!$()*+,;=]
+    )/iox
+    REGEXEN[:validate_resid] = /(?:
+      #{REGEXEN[:validate_url_unreserved]}|
+      #{REGEXEN[:validate_url_pct_encoded]}|
+      #{REGEXEN[:validate_url_sub_delims]}
+    )/iox
+    REGEXEN[:xmpp_uri] = %r{
+      (xmpp:)                                                                           # Protocol
+      (//#{REGEXEN[:validate_nodeid]}+@#{REGEXEN[:valid_domain]}/)?                     # Authority (optional)
+      (#{REGEXEN[:validate_nodeid]}+@)?                                                 # Username in path (optional)
+      (#{REGEXEN[:valid_domain]})                                                       # Domain in path
+      (/#{REGEXEN[:validate_resid]}+)?                                                  # Resource in path (optional)
+      (\?#{REGEXEN[:valid_url_query_chars]}*#{REGEXEN[:valid_url_query_ending_chars]})? # Query String
+    }iox
+    REGEXEN[:magnet_uri] = %r{
+      (magnet:)                                                                         # Protocol
+      (\?#{REGEXEN[:valid_url_query_chars]}*#{REGEXEN[:valid_url_query_ending_chars]})  # Query String
+    }iox
+    REGEXEN[:valid_extended_uri] = %r{
+      (                                                                                 #   $1 total match
+        (#{REGEXEN[:valid_url_preceding_chars]})                                        #   $2 Preceding character
+        (                                                                               #   $3 URL
+          (#{REGEXEN[:xmpp_uri]}) | (#{REGEXEN[:magnet_uri]})
+        )
+      )
+    }iox
+  end
+
+  module Extractor
+    # Extracts a list of all XMPP and magnet URIs included in the Toot <tt>text</tt> along
+    # with the indices. If the <tt>text</tt> is <tt>nil</tt> or contains no
+    # XMPP or magnet URIs an empty array will be returned.
+    #
+    # If a block is given then it will be called for each XMPP URI.
+    def extract_extra_uris_with_indices(text, options = {}) # :yields: uri, start, end
+      return [] unless text && text.index(":")
+      urls = []
+
+      text.to_s.scan(Twitter::Regex[:valid_extended_uri]) do
+        valid_uri_match_data = $~
+
+        start_position = valid_uri_match_data.char_begin(3)
+        end_position = valid_uri_match_data.char_end(3)
+
+        urls << {
+          :url => valid_uri_match_data[3],
+          :indices => [start_position, end_position]
+        }
+      end
+      urls.each{|url| yield url[:url], url[:indices].first, url[:indices].last} if block_given?
+      urls
+    end
   end
 end
diff --git a/config/locales/activerecord.ast.yml b/config/locales/activerecord.ast.yml
index de95817c1..4dfa507fc 100644
--- a/config/locales/activerecord.ast.yml
+++ b/config/locales/activerecord.ast.yml
@@ -1,6 +1,9 @@
 ---
 ast:
   activerecord:
+    attributes:
+      poll:
+        options: Escoyetes
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.ca.yml b/config/locales/activerecord.ca.yml
index 2795a6b33..67dd9a094 100644
--- a/config/locales/activerecord.ca.yml
+++ b/config/locales/activerecord.ca.yml
@@ -14,4 +14,4 @@ ca:
         status:
           attributes:
             reblog:
-              taken: de l'estat ja existeix
+              taken: del tut ja existeix
diff --git a/config/locales/activerecord.is.yml b/config/locales/activerecord.is.yml
new file mode 100644
index 000000000..b5d656130
--- /dev/null
+++ b/config/locales/activerecord.is.yml
@@ -0,0 +1,17 @@
+---
+is:
+  activerecord:
+    attributes:
+      poll:
+        expires_at: Lokadagur
+        options: Valkostir
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: aðeins bókstafir, tölur og undirstrik
+        status:
+          attributes:
+            reblog:
+              taken: af stöðu er þegar fyrirliggjandi
diff --git a/config/locales/activerecord.kab.yml b/config/locales/activerecord.kab.yml
new file mode 100644
index 000000000..21007347c
--- /dev/null
+++ b/config/locales/activerecord.kab.yml
@@ -0,0 +1,12 @@
+---
+kab:
+  activerecord:
+    attributes:
+      poll:
+        options: Tifranin
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: isekkilen, uṭṭunen d yijerriden n wadda kan
diff --git a/config/locales/activerecord.ml.yml b/config/locales/activerecord.ml.yml
index 6931a683d..baecb9e82 100644
--- a/config/locales/activerecord.ml.yml
+++ b/config/locales/activerecord.ml.yml
@@ -1 +1,12 @@
+---
 ml:
+  activerecord:
+    attributes:
+      poll:
+        expires_at: സമയപരിധി
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: അക്ഷരങ്ങളും, അക്കങ്ങളും, പിന്നെ അടിവരയും മാത്രം
diff --git a/config/locales/activerecord.nn.yml b/config/locales/activerecord.nn.yml
index 777f4e600..31f1682bd 100644
--- a/config/locales/activerecord.nn.yml
+++ b/config/locales/activerecord.nn.yml
@@ -1 +1,17 @@
+---
 nn:
+  activerecord:
+    attributes:
+      poll:
+        expires_at: Frist
+        options: Val
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: bare bokstaver, tall og understreker
+        status:
+          attributes:
+            reblog:
+              taken: av status eksisterer allerede
diff --git a/config/locales/activerecord.no.yml b/config/locales/activerecord.no.yml
index 3676b953c..553bd65bf 100644
--- a/config/locales/activerecord.no.yml
+++ b/config/locales/activerecord.no.yml
@@ -1,6 +1,10 @@
 ---
 'no':
   activerecord:
+    attributes:
+      poll:
+        expires_at: Tidsfrist
+        options: Valg
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.pt-BR.yml b/config/locales/activerecord.pt-BR.yml
index 3f2b6aaaa..5a7d48bc3 100644
--- a/config/locales/activerecord.pt-BR.yml
+++ b/config/locales/activerecord.pt-BR.yml
@@ -4,13 +4,13 @@ pt-BR:
     attributes:
       poll:
         expires_at: Expira em
-        options: Escolhas
+        options: Opções
     errors:
       models:
         account:
           attributes:
             username:
-              invalid: apenas letras, números e '_' são permitidos
+              invalid: apenas letras, números e underlines ( "_" )
         status:
           attributes:
             reblog:
diff --git a/config/locales/activerecord.pt-PT.yml b/config/locales/activerecord.pt-PT.yml
index cbb053a90..884b79fa1 100644
--- a/config/locales/activerecord.pt-PT.yml
+++ b/config/locales/activerecord.pt-PT.yml
@@ -1,6 +1,10 @@
 ---
 pt-PT:
   activerecord:
+    attributes:
+      poll:
+        expires_at: Expira em
+        options: Escolhas
     errors:
       models:
         account:
diff --git a/config/locales/activerecord.ta.yml b/config/locales/activerecord.ta.yml
index b89c564f2..781fbd2d9 100644
--- a/config/locales/activerecord.ta.yml
+++ b/config/locales/activerecord.ta.yml
@@ -3,15 +3,15 @@ ta:
   activerecord:
     attributes:
       poll:
-        expires_at: இறுதிகட்டம்
+        expires_at: காலக்கெடு
         options: தேர்வுகள்
     errors:
       models:
         account:
           attributes:
             username:
-              invalid: எழுத்துக்கள், எண்கள் மற்றும் அடிக்கோடு
+              invalid: எழுத்துகள், எண்கள் மற்றும் அடிக்கோடுகள் மட்டுமே
         status:
           attributes:
             reblog:
-              taken: அந்த நிலையறிக்கை ஏற்கனவே உள்ளது
+              taken: ஏற்கனவே பதியப்பட்டது
diff --git a/config/locales/activerecord.vi.yml b/config/locales/activerecord.vi.yml
new file mode 100644
index 000000000..61d64b6c6
--- /dev/null
+++ b/config/locales/activerecord.vi.yml
@@ -0,0 +1,17 @@
+---
+vi:
+  activerecord:
+    attributes:
+      poll:
+        expires_at: Hạn chót
+        options: Lựa chọn
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: chỉ chấp nhận số, ký tự, và dấu gạch dưới
+        status:
+          attributes:
+            reblog:
+              taken: của trạng thái đã tồn tại
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 835e96769..7309ad3db 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -9,7 +9,7 @@ ar:
     administered_by: 'يُديره:'
     api: واجهة برمجة التطبيقات
     apps: تطبيقات الأجهزة المحمولة
-    apps_platforms: إستخدم ماستودون في iOS، أندرويد وأنظمة أخرى
+    apps_platforms: استخدم ماستدون على iOS وأندرويد وأنظمة أخرى
     browse_directory: تصفح دليل الصفحات التعريفية وصفّي بحسب الإهتمام
     browse_public_posts: تصفح تيارًا مباشرًا مِن منشورات عامة على ماستدون
     contact: للتواصل معنا
@@ -39,6 +39,7 @@ ar:
     unavailable_content_description:
       domain: الخادم
       reason: 'السبب:'
+      silenced: 'سيتم إخفاء المنشورات القادمة من هذه الخوادم في الخيوط الزمنية والمحادثات العامة، ولن يتم إنشاء أي إخطارات من جراء تفاعلات مستخدميها، ما لم تُتَابعهم:'
     user_count_after:
       few: مستخدمين
       many: مستخدمين
@@ -50,6 +51,7 @@ ar:
     what_is_mastodon: ما هو ماستدون ؟
   accounts:
     choices_html: 'توصيات %{name}:'
+    endorsements_hint: يمكنك التوصية بالأشخاص الذين تتابعهم من واجهة الويب، وسيظهرون هنا.
     follow: اتبع
     followers:
       few: متابِعون
@@ -84,6 +86,7 @@ ar:
     roles:
       admin: المدير
       bot: روبوت
+      group: فريق
       moderator: مُشرِف
     unavailable: الصفحة التعريفية غير متوفرة
     unfollow: إلغاء المتابعة
@@ -177,6 +180,7 @@ ar:
         staff: الفريق
         user: مستخدِم
       search: البحث
+      search_same_ip: مستخدِمون آخرون بنفس الـ IP
       shared_inbox_url: رابط الصندوق المُشترَك للبريد الوارد
       show:
         created_reports: البلاغات التي أنشأها هذا الحساب
@@ -203,10 +207,12 @@ ar:
         confirm_user: "%{name} قد قام بتأكيد عنوان البريد الإلكتروني لـ %{target}"
         create_account_warning: قام %{name} بإرسال تحذير إلى %{target}
         create_custom_emoji: "%{name} قام برفع إيموجي جديد %{target}"
+        create_domain_allow: قام %{name} بإضافة النطاق %{target} إلى القائمة البيضاء
         create_domain_block: "%{name} قام بحجب نطاق %{target}"
         create_email_domain_block: "%{name} قد قام بحظر نطاق البريد الإلكتروني %{target}"
         demote_user: "%{name} قد قام بإنزال الرتبة الوظيفية لـ %{target}"
         destroy_custom_emoji: قام %{name} بحذف الإيموجي %{target}
+        destroy_domain_allow: قام %{name} بإزالة النطاق %{target} مِن القائمة البيضاء
         destroy_domain_block: "%{name} قام بإلغاء الحجب عن النطاق %{target}"
         destroy_email_domain_block: قام %{name} بإضافة نطاق البريد الإلكتروني %{target} إلى اللائحة البيضاء
         destroy_status: لقد قام %{name} بحذف منشور %{target}
@@ -257,6 +263,7 @@ ar:
       shortcode_hint: على الأقل حرفين، و فقط رموز أبجدية عددية و أسطر سفلية
       title: الإيموجي الخاصة
       uncategorized: غير مصنّف
+      unlist: تنحية مِن القائمة
       unlisted: غير مدرج
       update_failed_msg: تعذرت عملية تحديث ذاك الإيموجي
       updated_msg: تم تحديث الإيموجي بنجاح!
@@ -337,13 +344,11 @@ ar:
       delete: حذف
       destroyed_msg: تم حذف نطاق البريد الإلكتروني من اللائحة السوداء بنجاح
       domain: النطاق
+      empty: ليس هناك أية نطاقات للبريد الإلكتروني مُدرَجة في القائمة السوداء.
       new:
         create: إضافة نطاق
         title: إضافة نطاق بريد جديد إلى اللائحة السوداء
       title: القائمة السوداء للبريد الإلكتروني
-    followers:
-      back_to_account: العودة إلى الحساب
-      title: "%{acct} مُتابِعون"
     instances:
       by_domain: النطاق
       delivery_available: التسليم متوفر
@@ -388,6 +393,7 @@ ar:
       pending: في انتظار تسريح المُرحِّل
       save_and_enable: حفظ وتشغيل
       setup: إعداد اتصال بمُرحّل
+      signatures_not_enabled: لن تعمل المُرحِّلات بشكل صحيح إن تم تنشيط الوضع الآمن أو وضع القائمة البيضاء
       status: الحالة
       title: المُرحّلات
     report_notes:
@@ -433,8 +439,12 @@ ar:
       custom_css:
         desc_html: يقوم بتغيير المظهر بواسطة سي أس أس يُحمَّل على كافة الصفحات
         title: سي أس أس مخصص
+      default_noindex:
+        title: عدم السماح مبدئيا لمحركات البحث بفهرسة الملفات التعريفية للمستخدمين
       domain_blocks:
         all: للجميع
+        disabled: لا أحد
+        title: اظهر خاصية حجب النطاقات
       domain_blocks_rationale:
         title: اظهر السبب
       hero:
@@ -492,6 +502,8 @@ ar:
         desc_html: عرض الخيط العمومي على صفحة الاستقبال
         title: مُعاينة الخيط العام
       title: إعدادات الموقع
+      trendable_by_default:
+        title: السماح للوسوم بالظهور على المتداوَلة بدون مراجعة مسبقة
       trends:
         title: الوسوم المتداولة
     statuses:
@@ -539,11 +551,19 @@ ar:
       body: قام %{reporter} بالإبلاغ عن %{target}
       body_remote: أبلغ شخص ما من %{domain} عن %{target}
       subject: تقرير جديد ل%{instance} (#%{id})
+  aliases:
+    add_new: أنشئ كُنية
+    created_msg: تم إنشاء الكُنية الجديدة بنجاح. يمكنكم الآن الشروع في الإنتقال مِن حسابكم القديم.
+    remove: إلغاء ربط الكنية
   appearance:
     advanced_web_interface: واجهة الويب المتقدمة
     animations_and_accessibility: الإتاحة والحركة
     confirmation_dialogs: نوافذ التأكيد
     discovery: استكشاف
+    localization:
+      body: ماستدون يُترجِمه متطوّعون.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: يمكن للجميع المساهمة.
     sensitive_content: محتوى حساس
     toot_layout: تصميم التبويق
   application_mailer:
@@ -571,6 +591,7 @@ ar:
     description:
       prefix_invited_by_user: يدعوك @%{name} للاتحاق بخادم ماستدون هذا!
       prefix_sign_up: أنشئ حسابًا على ماستدون اليوم!
+      suffix: بفضل حساب ، ستكون قادرا على متابعة الأشخاص ونشر تحديثات وتبادل رسائل مع مستخدمين مِن أي خادم Mastodon وأكثر!
     didnt_get_confirmation: لم تتلق تعليمات التأكيد ؟
     forgot_password: نسيت كلمة المرور ؟
     invalid_reset_password_token: رمز إعادة تعيين كلمة المرور غير صالح أو منتهي الصلاحية. يرجى طلب واحد جديد.
@@ -589,9 +610,12 @@ ar:
     security: الأمان
     set_new_password: إدخال كلمة مرور جديدة
     setup:
+      email_below_hint_html: إذا كان عنوان البريد الإلكتروني التالي غير صحيح، فيمكنك تغييره هنا واستلام بريد إلكتروني جديد للتأكيد.
+      email_settings_hint_html: لقد تم إرسال رسالة بريد إلكترونية للتأكيد إلى %{email}. إن كان عنوان البريد الإلكتروني غير صحيح ، يمكنك تغييره في إعدادات حسابك.
       title: الضبط
     status:
       account_status: حالة الحساب
+      confirming: في انتظار اكتمال تأكيد البريد الإلكتروني.
       functional: حسابك جاهز.
       redirecting_to: حسابك غير نشط لأنه تم تحويله حاليا إلى %{acct}.
     trouble_logging_in: هل صادفتكم مشكلة في الولوج؟
@@ -608,6 +632,7 @@ ar:
     title: إتباع %{acct}
   challenge:
     confirm: واصل
+    hint_html: "<strong>توصية:</strong> لن نطلب منك ثانية كلمتك السرية في غضون الساعة اللاحقة."
     invalid_password: الكلمة السرية خاطئة
     prompt: أكِّد الكلمة السرية للمواصلة
   datetime:
@@ -634,6 +659,7 @@ ar:
       before: 'يرجى قراءة هذه الملاحظات بتأنّي قبل المواصلة:'
       data_removal: سوف تُحذَف منشوراتك والبيانات الأخرى نهائيا
       email_change_html: بإمكانك <a href="%{path}">تغيير عنوان بريدك الإلكتروني</a> دون أن يُحذف حسابك
+      email_contact_html: إن لم تتلقّ أي شيء ، يمكنك مراسلة <a href="mailto:%{email}">%{email}</a> لطلب المساعدة
       irreversible: لن يكون بإمكانك استرجاع أو إعادة تنشيط حسابك
       more_details_html: للمزيد مِن التفاصيل ، يرجى الإطلاع على <a href="%{terms_path}">سياسة الخصوصية</a>.
       username_available: سيصبح اسم مستخدمك متوفرا ثانية
@@ -648,7 +674,7 @@ ar:
     '400': The request you submitted was invalid or malformed.
     '403': ليس لك الصلاحيات الكافية لعرض هذه الصفحة.
     '404': إنّ الصفحة التي تبحث عنها لا وجود لها أصلا.
-    '406': This page is not available in the requested format.
+    '406': إنّ هذه الصفحة غير متوفّرة في النسق المطلوب.
     '410': إنّ الصفحة التي تبحث عنها لم تعد موجودة.
     '422':
       content: فشل التحقق الآمن. ربما منعتَ كعكات الكوكيز؟
@@ -657,9 +683,10 @@ ar:
     '500':
       content: نحن متأسفون، لقد حدث خطأ ما مِن جانبنا.
       title: هذه الصفحة خاطئة
-    '503': The page could not be served due to a temporary server failure.
+    '503': تعذر تحميل الصفحة بسبب فشل مؤقت في الخادم.
     noscript_html: يرجى تفعيل الجافا سكريبت لاستخدام تطبيق الويب لماستدون، أو عِوض ذلك قوموا بتجريب إحدى <a href="%{apps_path}">التطبيقات الأصلية</a> الدّاعمة لماستدون على منصّتكم.
   existing_username_validator:
+    not_found: لم نتمكّن مِن العثور على مستخدم محلي باسم المستخدم هذا
     not_found_multiple: تعذر العثور على %{usernames}
   exports:
     archive_takeout:
@@ -672,7 +699,6 @@ ar:
     blocks: قمت بحظر
     csv: CSV
     domain_blocks: النطاقات المحظورة
-    follows: أنت تتبع
     lists: القوائم
     mutes: قُمتَ بكتم
     storage: ذاكرة التخزين
@@ -691,6 +717,7 @@ ar:
       invalid_irreversible: إلّا مجالات الإشعارات و الخيط الرئيسي معنية بالتصفية اللارجعية
     index:
       delete: إزالة
+      empty: ليست لديك أية عوامل تصفية.
       title: عوامل التصفية
     new:
       title: إضافة عامل تصفية جديد
@@ -776,11 +803,13 @@ ar:
     cancel: ألغِ التوجيه
     cancelled_msg: تم إلغاء التوجيه بنجاح.
     errors:
+      already_moved: هو نفسه نفس الحساب الذي قمت بالإنتقال إليه
       move_to_self: لا يمكنه أن يكون الحساب الحالي
       not_found: تعذر العثور عليه
       on_cooldown: إنّك في مرحلة الجمود
     followers_count: المتابِعين عند الإنتقال
     incoming_migrations: الانتقال مِن حساب آخر
+    incoming_migrations_html: قصد الإنتقال من حساب آخَر إلى هذا يجب عليك أوّلًا <a href="%{path}">إنشاء كُنية حساب</a>.
     not_redirecting: حاليا ، حسابك لا يقوم بالتحويل إلى أي حساب آخر.
     past_migrations: التهجيرات السابقة
     proceed_with_move: انقل مشارِكيك
@@ -788,6 +817,8 @@ ar:
     set_redirect: تعين إعادة التوجيه
     warning:
       before: 'يرجى قراءة هذه الملاحظات بتأنّي قبل المواصلة:'
+      followers: تقوم هذه العملية بنقل كافة المُتابِعين مِن الحساب الحالي إلى الحساب الجديد
+      other_data: لن يتم نقل أية بيانات أخرى تلقائيا
   moderation:
     title: الإشراف
   notification_mailer:
@@ -832,6 +863,10 @@ ar:
       body: 'قام %{name} بترقية منشورك:'
       subject: قام %{name} بترقية منشورك
       title: ترقية جديدة
+  notifications:
+    email_events: الأحداث للإشعارات عبر البريد الإلكتروني
+    email_events_hint: 'اختر الأحداث التي تريد أن تصِلَك اشعارات عنها:'
+    other_settings: إعدادات أخرى للإشعارات
   number:
     human:
       decimal_units:
@@ -855,6 +890,8 @@ ar:
       duration_too_long: بعيد جدا في المستقبَل
       duration_too_short: مبكّر جدا
       expired: لقد انتهى استطلاع الرأي
+      invalid_choice: خيار التصويت الذي قُمتَ يتحديده غير موجود
+      too_many_options: لا يمكنه أن يحتوي أكثر مِن %{max} عناصر
   preferences:
     other: إعدادات أخرى
     posting_defaults: التفضيلات الافتراضية لنشر التبويقات
@@ -862,6 +899,8 @@ ar:
   relationships:
     activity: نشاط الحساب
     dormant: في سبات
+    followers: المتابِعون
+    following: يُتابِع
     last_active: آخر نشاط
     most_recent: الأحدث
     moved: هاجر
@@ -935,6 +974,7 @@ ar:
   settings:
     account: الحساب
     account_settings: إعدادات الحساب
+    aliases: كُنيات الحساب
     appearance: المظهر
     authorized_apps: التطبيقات المرخص لها
     back: عودة إلى ماستدون
@@ -1049,11 +1089,13 @@ ar:
       subject: نسخة بيانات حسابك جاهزة للتنزيل
       title: المغادرة بأرشيف الحساب
     warning:
+      get_in_touch: يمكنك الرد على هذا البريد الإلكتروني للاتصال بفريق %{instance}.
       review_server_policies: مراجعة شروط السيرفر
       statuses: 'خصيصا لـ:'
       subject:
         disable: تم تجميد حسابك %{acct}
         none: تحذير إلى %{acct}
+        silence: إنّ حسابك %{acct} محدود
         suspend: لقد تم تعليق حسابك %{acct}
       title:
         disable: الحساب مُجمَّد
@@ -1071,10 +1113,12 @@ ar:
       full_handle: عنوانك الكامل
       full_handle_hint: هذا هو ما يجب تقديمه لأصدقائك قصد أن يكون بإمكانهم متابَعتك أو مُراسَلتك حتى و إن كانت حساباتهم على خوادم أخرى.
       review_preferences_action: تعديل التفضيلات
+      review_preferences_step: تأكد من ضبط تفضيلاتك ، مثلًا أية رسائل بريد إلكترونية ترغب في تلقيها أو أي مستوى للخصوصية ترغب في اسناده افتراضيًا لمنشوراتك. إن كانت الحركة لا تُعكّر مزاجك فيمكنك إختيار تفعيل التشغيل التلقائي لوسائط GIF المتحركة.
       subject: أهلًا بك على ماستدون
       tip_federated_timeline: الخيط الزمني الفديرالي هو بمثابة شبه نظرة شاملة على شبكة ماستدون. غير أنه لا يشمل إلا على الأشخاص المتابَعين مِن طرف جيرانك و جاراتك، لذا فهذا الخيط لا يعكس كافة الشبكة برُمّتها.
       tip_following: أنت تتبع تلقائيا مديري و مديرات الخادم. للعثور على أشخاص مميزين أو قد تهمك حساباتهم بإمكانك الإطلاع على الخيوط العامة المحلية و كذا الفدرالية.
       tip_local_timeline: الخيط العام المحلي هو بمثابة نظرة سريعة على الأشخاص المتواجدين على %{instance} يمكن اعتبارهم كجيرانك وجاراتك الأقرب إليك!
+      tip_mobile_webapp: إن كان متصفحك على جهازك المحمول يُتيح ميزة إضافة Mastodon على شاشتك الرئيسية ، فيمكنك تلقي الإشعارات المدفوعة. إنه يعمل كتطبيق أصلي بحت!
       tips: نصائح
       title: أهلاً بك، %{name}!
   users:
diff --git a/config/locales/ast.yml b/config/locales/ast.yml
index ed8aef235..d64f6b005 100644
--- a/config/locales/ast.yml
+++ b/config/locales/ast.yml
@@ -1,18 +1,29 @@
 ---
 ast:
   about:
-    about_mastodon_html: Mastodon ye una rede social basada en protocolos abiertos y software de códigu llibre. Ye descentralizada, como'l corréu electrónicu.
+    about_hashtag_html: Estos son los barritos públicos etiquetaos con <strong>#%{hashtag}</strong>. Pues interactuar con ellos si tienes una cuenta en cualesquier parte del fediversu.
+    about_mastodon_html: 'La rede social del futuru: ¡ensin anuncios nin vixilancia, con un diseñu éticu y descentralizáu! Controla los tos datos con Mastodon.'
     about_this: Tocante a
     administered_by: 'Alministráu por:'
+    api: API
+    browse_directory: Restola nun direutoriu de perfiles y peñera polos intereses
     contact: Contautu
     contact_missing: Nun s'afitó
     contact_unavailable: N/D
+    discover_users: Descubri usuarios
     documentation: Documentación
+    federation_hint_html: Con una cuenta en %{instance} vas ser a siguir a persones de cualesquier sirvidor de Mastodon y más.
     hosted_on: Mastodon ta agospiáu en %{domain}
-    learn_more: Deprendi más
+    learn_more: Deprender más
+    privacy_policy: Política de privacidá
+    server_stats: 'Estadístiques del sirvidor:'
     source_code: Códigu fonte
     status_count_before: Que crearon
+    tagline: Sigui a persones y conoz a más
     terms: Términos del serviciu
+    unavailable_content_description:
+      domain: Sirvidor
+      reason: Razón
     user_count_after:
       one: usuariu
       other: usuarios
@@ -20,29 +31,39 @@ ast:
     what_is_mastodon: "¿Qué ye Mastodon?"
   accounts:
     followers:
-      one: Xente que te sigue
+      one: Siguidor
       other: Siguidores
     joined: Xunióse en %{date}
+    last_active: última actividá
     moved_html: "%{name} mudóse a %{new_profile_link}:"
     network_hidden: Esta información nun ta disponible
+    never_active: Enxamás
     nothing_here: "¡Equí nun hai nada!"
     people_followed_by: Persones a les que sigue %{name}
     people_who_follow: Persones que siguen a %{name}
-    posts_with_replies: Toots y rempuestes
+    posts:
+      one: Barritu
+      other: Barritos
+    posts_tab_heading: Barritos
+    posts_with_replies: Barritos y rempuestes
     reserved_username: El nome d'usuariu ta acutáu
     roles:
       bot: Robó
   admin:
     accounts:
+      approve_all: Aprobar too
       are_you_sure: "¿De xuru?"
+      avatar: Avatar
       by_domain: Dominiu
       domain: Dominiu
       email: Corréu
       followers: Siguidores
+      ip: IP
       location:
         local: Llocal
         title: Allugamientu
       protocol: Protocolu
+      reject_all: Refugar too
       resend_confirmation:
         already_confirmed: Esti usuariu yá ta confirmáu
       role: Permisos
@@ -53,11 +74,21 @@ ast:
       statuses: Estaos
       title: Cuentes
       username: Nome d'usuariu
+      web: Web
     action_logs:
       actions:
+        create_account_warning: "%{name} unvió una alvertencia a %{target}"
         create_domain_block: "%{name} bloquió'l dominiu %{target}"
         disable_custom_emoji: "%{name} desactivó'l fustaxe %{target}"
         disable_user: "%{name} desactivó l'aniciu de sesión del usuariu %{target}"
+        enable_custom_emoji: "%{name} activó'l fustaxe %{target}"
+        promote_user: "%{name} ascendió al usuariu %{target}"
+        remove_avatar_user: "%{name} desanició l'avatar de %{target}"
+        reopen_report: "%{name} reabrió l'informe de %{target}"
+        reset_password_user: "%{name} reafitó la contraseña del usuariu %{target}"
+        resolve_report: "%{name} resolvió l'informe de %{target}"
+        silence_account: "%{name} silenció la cuenta de %{target}"
+        suspend_account: "%{name} suspendió la cuenta de %{target}"
     custom_emojis:
       by_domain: Dominiu
       copy_failed_msg: Nun pudo facese una copia llocal d'esi fustaxe
@@ -68,8 +99,10 @@ ast:
       feature_registrations: Rexistros
       features: Carauterístiques
       hidden_service: Federación con servicios anubríos
-      recent_users: Usuarios recientes
+      recent_users: Usuarios de recién
+      software: Software
       total_users: usuarios en total
+      trends: Tendencies
       week_interactions: interaiciones d'esta selmana
       week_users_new: usuarios d'esta selmana
     domain_blocks:
@@ -77,7 +110,8 @@ ast:
     email_domain_blocks:
       domain: Dominiu
     instances:
-      title: Instancies conocíes
+      by_domain: Dominiu
+      title: Federación
     invites:
       filter:
         available: Disponible
@@ -85,6 +119,7 @@ ast:
       title: Invitaciones
     relays:
       save_and_enable: Guardar y activar
+      status: Estáu
     reports:
       are_you_sure: "¿De xuru?"
       status: Estáu
@@ -93,28 +128,54 @@ ast:
         min_invite_role:
           disabled: Naide
       site_description:
-        title: Descipción de la instancia
-      site_title: Nome de la instancia
+        title: Descripción del sirvidor
+      site_title: Nome del sirvidor
       title: Axustes del sitiu
     statuses:
       failed_to_execute: Fallu al executar
+    tags:
+      context: Contestu
+      most_recent: Lo más recién
+      name: Etiqueta
+      title: Etiquetes
     title: Alministración
   admin_mailer:
+    new_pending_account:
+      body: Los detalles de la cuenta nueva tán embaxo. Pues aprobar o refugar esta aplicación.
     new_report:
       body_remote: Daquién dende %{domain} informó de %{target}
+    new_trending_tag:
+      body: 'Güei la etiqueta #%{name} ye tendencia pero nun se revisó anteriormente. Nun va amosase públicamente a nun ser que lo permitas o guardes el formulariu como ta pa nun saber más d''ello.'
+  appearance:
+    advanced_web_interface: Interfaz web avanzada
+    confirmation_dialogs: Diálogos de confirmación
+    discovery: Descubrición
+    localization:
+      body: Mastodon tradúcenlu voluntarios,
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: tol mundu pue collaborar.
+    toot_layout: Distribución de los barritos
   applications:
     invalid_url: La URL apurrida nun ye válida
-    warning: Ten curiáu con estos datos, ¡enxamás nun los compartas con naide!
+    warning: Ten munchu curiáu con estos datos, ¡enxamás nun los compartas con naide!
   auth:
     change_password: Contraseña
+    checkbox_agreement_html: Aceuto les <a href="%{rules_path}" target="_blank">regles del sirvidor</a> y los <a href="%{terms_path}" target="_blank">términos del serviciu</a>
+    checkbox_agreement_without_rules_html: Aceuto los <a href="%{terms_path}" target="_blank"> términos del serviciu</a>
     delete_account: Desaniciu de la cuenta
     delete_account_html: Si deseyes desaniciar la to cuenta, pues <a href="%{path}">siguir equí</a>. Va pidísete la confirmación.
+    description:
+      suffix: "¡Con una cuenta, vas ser a siguir a persones, espublizar anovamientos ya intercambiar mensaxes con usuarios de cualesquier sirvidor de Mastodon y más!"
     forgot_password: "¿Escaeciesti la contraseña?"
     login: Aniciar sesión
     migrate_account: Mudase a otra cuenta
-    migrate_account_html: Si deseyes redirixir esta cuenta a otra, pues <a href="%{path}"> configuralo equí</a>.
+    migrate_account_html: Si deseyes redirixir esta cuenta a otra, pues <a href="%{path}">configuralo equí</a>.
+    providers:
+      cas: CAS
+      saml: SAML
     register: Rexistrase
     security: Seguranza
+    trouble_logging_in: "¿Problemes col aniciu de sesión?"
   authorize_follow:
     already_following: Yá tas siguiendo a esta cuenta
     error: Desafortunadamente, hebo un fallu guetando la cuenta remota
@@ -129,10 +190,13 @@ ast:
       less_than_x_seconds: Púramente agora
   deletes:
     confirm_password: Introduz la contraseña pa verificar la to identidá
+    warning:
+      email_contact_html: Si entá nun aportó, pues unviar un corréu a<a href="mailto:%{email}">%{email}</a> pa más ayuda
+      more_details_html: Pa más detalles, mira la <a href="%{terms_path}">política de privacidá</a>.
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': Nun tienes permisu pa ver esta páxina.
-    '404': La páxina que tabes guetando nun esiste.
+    '404': La páxina que tabes guetando nun ta equí.
     '406': This page is not available in the requested format.
     '410': La páxina que tabes guetando yá nun esiste.
     '422':
@@ -144,26 +208,39 @@ ast:
   exports:
     archive_takeout:
       date: Data
-      hint_html: Pues solicitar un archivu colos tos <strong>toots y ficheros xubíos</strong>. Los datos esportaos van tar nel formatu ActivityPub, llexible pa cualesquier software que seya compatible. Pues solicitar un archivu cada 7 díes.
+      hint_html: Pues solicitar un archivu colos tos <strong>barritos y ficheros xubíos</strong>. Los datos esportaos van tar nel formatu ActivityPub, llexible pa cualesquier software que seya compatible. Pues solicitar un archivu cada 7 díes.
       request: Solicitar l'archivu
       size: Tamañu
     blocks: Xente que bloquiesti
-    follows: Xente que sigues
+    csv: CSV
+    lists: Llistes
     mutes: Xente que silenciesti
+  featured_tags:
+    add_new: Amestar
   filters:
     contexts:
       notifications: Avisos
       public: Llinies temporales públiques
       thread: Conversaciones
     index:
+      empty: Nun tienes peñeres.
       title: Peñeres
     new:
       title: Amestar una peñera nueva
+  footer:
+    developers: Desendolcadores
+    more: Más…
+    resources: Recursos
   generic:
+    all: Too
     changes_saved_msg: "¡Los cambeos guardáronse con ésitu!"
     save_changes: Guardar cambeos
+  identity_proofs:
+    authorize: Sí, autorizar
+    i_am_html: Soi %{username} de %{service}.
+    identity: Identidá
   imports:
-    preface: Pues importar los datos qu'esportares dende otra instancia, como por exemplu la llista de persones que bloquiares o tubieres siguiendo.
+    preface: Pues importar los datos qu'esportares dende otra instancia, como por exemplu la llista de persones que bloquiares o tuvieres siguiendo.
     types:
       blocking: Llista de xente bloquiao
       following: Llista de siguidores
@@ -180,13 +257,16 @@ ast:
       '604800': 1 selmana
       '86400': 1 día
     expires_in_prompt: Enxamás
+    generate: Xenerar un enllaz d'invitación
     invited_by: 'Convidóte:'
     max_uses:
       one: 1 usu
       other: "%{count} usos"
+    prompt: Xenera y comparti enllaces con otros pa da-yos accesu a esti sirividor
     table:
       expires_at: Data de caducidá
       uses: Usos
+    title: Convidar a persones
   lists:
     errors:
       limit: Algamesti la cantidá máxima de llistes
@@ -196,6 +276,8 @@ ast:
       too_many: Nun puen axuntase más de 4 ficheros
   migrations:
     acct: nome_usuariu@dominiu de la cuenta nueva
+    warning:
+      followers: Esta aición va mover tolos siguidores de la cuenta actual a la nueva
   notification_mailer:
     digest:
       body: Equí hai un resume de los mensaxes que nun viesti dende la última visita'l %{since}
@@ -213,31 +295,84 @@ ast:
     reblog:
       body: "%{name} compartió'l to estáu:"
       subject: "%{name} compartió'l to estáu"
-      title: Compartición nueva de toot
+      title: Compartición nueva de barritu
+  notifications:
+    email_events_hint: 'Esbilla los eventos de los que quies recibir avisos:'
+    other_settings: Otros axustes
   pagination:
     next: Siguiente
+  polls:
+    errors:
+      already_voted: Yá votesti nesta encuesta
+      expired: La encuesta yá finó
+      invalid_choice: El la opción de votu escoyida nun esiste
+  preferences:
+    public_timelines: Llinies temporales públiques
+  relationships:
+    followers: Siguidores
+    most_recent: Lo más recién
+    relationship: Rellación
+    remove_selected_follows: Dexar de siguir a los usuarios esbillaos
   remote_follow:
     acct: Introduz el nome_usuariu@dominiu dende'l que lo quies facer
     no_account_html: "¿Nun tienes una cuenta? Pues <a href='%{sign_up_path}' target='_blank'>rexistrate equí</a>"
     proceed: Siguir
     prompt: 'Vas siguir a:'
+  remote_interaction:
+    reblog:
+      prompt: 'Quies compartir esti barritu:'
+    reply:
+      prompt: 'Quies responder a esti barritu:'
   sessions:
     browser: Restolador
     browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Electron
+      firefox: Firefox
       generic: Restolador desconocíu
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      opera: Opera
+      otter: Otter
+      phantom_js: PhantomJS
+      qq: QQ Browser
+      safari: Safari
+      uc_browser: UCBrowser
+      weibo: Weibo
     current_session: Sesión actual
     description: "%{browser} en %{platform}"
+    ip: IP
     platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
+      mac: Mac
       other: plataforma desconocida
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
     title: Sesiones
   settings:
+    account: Cuenta
+    appearance: Aspeutu
     authorized_apps: Aplicaciones autorizaes
     back: Volver a Mastodon
-    edit_profile: Edición del perfil
+    development: Desendolcu
+    edit_profile: Editar el perfil
     export: Esportación de datos
+    featured_tags: Etiquetes destacaes
     import: Importación
+    import_and_export: Importación y esportación
     notifications: Avisos
     preferences: Preferencies
+    profile: Perfil
     two_factor_authentication: Autenticación en dos pasos
   statuses:
     attached:
@@ -247,20 +382,34 @@ ast:
       video:
         one: "%{count} videu"
         other: "%{count} vídeos"
-    boosted_from_html: Compartióse'l toot dende %{acct_link}
+    boosted_from_html: Compartióse'l barritu dende %{acct_link}
     language_detection: Deteutala automáticamente
     pin_errors:
-      limit: Yá fixesti'l númberu máxiumu de toots
-      ownership: Nun pue fixase'l toot d'otra persona
-      private: Nun puen fixase los toots que nun seyan públicos
-      reblog: Nun pue fixase un toot compartíu
+      limit: Yá fixesti'l númberu máximu de barritos
+      ownership: Nun pue fixase'l barritu d'otra persona
+      private: Nun puen fixase los barritos que nun seyan públicos
+      reblog: Nun pue fixase un barritu compartíu
+    poll:
+      total_people:
+        one: "%{count} persona"
+        other: "%{count} persones"
+      total_votes:
+        one: "%{count} votu"
+        other: "%{count} votos"
     show_more: Amosar más
     title: "%{name}: «%{quote}»"
     visibilities:
       private: Namái siguidores
+      private_long: Namái s'amuesen a los siguidores
+      public_long: Tol mundu los puen ver
+      unlisted: Nun llistar
+      unlisted_long: Tol mundu puen velos pero nun se llisten nes llinies temporales públiques
   stream_entries:
-    reblogged: compartióse
+    pinned: Barritu fixáu
+    reblogged: compartió
     sensitive_content: Conteníu sensible
+  tags:
+    does_not_match_previous_name: nun concasa col nome anterior
   themes:
     default: Mastodon
   two_factor_authentication:
@@ -269,17 +418,27 @@ ast:
     enabled: L'autenticación en dos pasos ta activada
     enabled_success: L'autenticación en dos pasos activóse con ésitu
     generate_recovery_codes: Xenerar códigos de recuperación
-    lost_recovery_codes: Los códigos de recuperación permítente recuperar l'accesu a la cuenta si pierdes el teléfonu. Si tamién pierdes esos códigos, pues xeneralos de nueves equí. Los códigos de recuperación vieyos van invalidase.
+    lost_recovery_codes: Los códigos de recuperación permítente recuperar l'accesu a la cuenta si pierdes el teléfonu. Si tamién pierdes estos códigos, pues rexeneralos equí. Los códigos de recuperación vieyos van invalidase.
     manual_instructions: 'Si nun pues escaniar el códigu QR y precises introducilu a mano, equí ta''l secretu en testu planu:'
     recovery_codes: Códigos de recuperación
     recovery_codes_regenerated: Los códigos de recuperación rexeneráronse con ésitu
   user_mailer:
+    warning:
+      explanation:
+        suspend: La to cuenta suspendióse y tolos espublizamientos qu'espublizares desaniciáronse de mou irreversible d'esti sirvidor y sirvidores onde teníes siguidores.
+      subject:
+        suspend: Suspendióse la cuenta %{acct}
+      title:
+        none: Alvertencia
+        suspend: Cuenta suspendida
     welcome:
       full_handle_hint: Esto ye lo que-yos diríes a los collacios pa que puean unviate mensaxes o siguite dende otra instancia.
       subject: Afáyate en Mastodon
       tips: Conseyos
   users:
     invalid_email: La direición de corréu nun ye válida
+    invalid_otp_token: El códigu nun ye válidu
+    otp_lost_help_html: Si pierdes l'accesu, contauta con %{email}
     seamless_external_login: Aniciesti sesión pente un serviciu esternu, polo que los axustes de la contraseña y corréu nun tán disponibles.
   verification:
     verification: Verificación
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index 85431bc8d..07149f51f 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -59,7 +59,6 @@ bg:
     '503': The page could not be served due to a temporary server failure.
   exports:
     blocks: Вашите блокирания
-    follows: Вашите следвания
     storage: Съхранение на мултимедия
   generic:
     changes_saved_msg: Успешно запазване на промените!
diff --git a/config/locales/br.yml b/config/locales/br.yml
index 3710084e7..7d15639ee 100644
--- a/config/locales/br.yml
+++ b/config/locales/br.yml
@@ -1,5 +1,10 @@
 ---
 br:
+  about:
+    about_this: Diàr-benn
+    active_count_after: oberiant
+    apps: Arloadoù pellgomz
+    apps_platforms: Ober get Mastodoñ àr iOS, Android ha savennoù arall
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': You don't have permission to view this page.
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index c3cfe3083..6cc50d6c6 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -1,8 +1,8 @@
 ---
 ca:
   about:
-    about_hashtag_html: Aquests són toots públics etiquetats amb <strong>#%{hashtag}</strong>. Pots interactuar amb ells si tens un compte a qualsevol lloc del fediverse.
-    about_mastodon_html: Mastodon és una xarxa social basada en protocols web oberts i en programari lliure i de codi obert. Està descentralitzat com el correu electrònic.
+    about_hashtag_html: Aquests són tuts públics etiquetats amb <strong>#%{hashtag}</strong>. Pots interactuar amb elles si tens un compte a qualsevol lloc del fedivers.
+    about_mastodon_html: 'La xarxa social del futur: sense anuncis, sense vigilància corporativa, disseny ètic i descentralització. Posseeix les teves dades amb Mastodon!'
     about_this: Quant a
     active_count_after: actiu
     active_footnote: Usuaris actius mensuals (UAM)
@@ -11,7 +11,7 @@ ca:
     apps: Apps mòbils
     apps_platforms: Utilitza Mastodon des de iOS, Android i altres plataformes
     browse_directory: Navega per el directori de perfils i filtra segons interessos
-    browse_local_posts: Navega un flux en directe de publicacions d’aquest servidor
+    browse_local_posts: Navega un flux en directe de publicacions públiques d’aquest servidor
     browse_public_posts: Navega per una transmissió en directe de publicacions públiques a Mastodon
     contact: Contacte
     contact_missing: No configurat
@@ -25,13 +25,13 @@ ca:
       Aquest compte és un actor virtual utilitzat per a representar al propi servidor i no cap usuari individual.
       S'utilitza per a propòsits de federació i no ha de ser bloquejat si no voleu bloquejar tota la instància, en aquest cas hauríeu d'utilitzar un bloqueig de domini.
     learn_more: Més informació
-    privacy_policy: Política de privacitat
+    privacy_policy: Política de privadesa
     see_whats_happening: Mira què està passant
     server_stats: 'Estadístiques del servidor:'
     source_code: Codi font
     status_count_after:
-      one: toot
-      other: toots
+      one: estat
+      other: tuts
     status_count_before: Que han escrit
     tagline: Segueix els teus amics i descobreix-ne de nous
     terms: Termes del servei
@@ -40,9 +40,9 @@ ca:
       domain: Servidor
       reason: Raó
       rejecting_media: 'Els arxius multimèdia d''aquests servidors no seran processats o emmagatzemats i cap miniatura serà mostrada, requerint clic manual a través de l''arxiu original:'
-      silenced: 'Les publicacions d''aquests servidors seran amagades en les línies de temps públiques i converses, i cap notificació serà generada de les interaccions dels seus usuaris, llevat que estiguis seguint-los:'
+      silenced: 'Les publicacions d''aquests servidors seran amagades en les línies de temps públiques i en les converses, i cap notificació serà generada de les interaccions dels seus usuaris, llevat que estiguis seguint-los:'
       suspended: 'Cap dada d''aquests servidors serà processada, emmagatzemada o intercanviada, fent impossible qualsevol interacció o comunicació amb els usuaris d''aquests servidors:'
-    unavailable_content_html: Mastodon generalment et permet per veure contingut i interaccionar amb usuaris de qualsevol altre servidor en el fedivers. Aquestes són les excepcions que s'han fet en aquest servidor particular.
+    unavailable_content_html: Mastodon generalment et permet veure el contingut i interaccionar amb els usuaris de qualsevol altre servidor en el fedivers. Aquestes són les excepcions que s'han fet en aquest servidor particular.
     user_count_after:
       one: usuari
       other: usuaris
@@ -70,14 +70,15 @@ ca:
     pin_errors:
       following: Has d'estar seguint la persona que vulguis avalar
     posts:
-      one: Toot
-      other: Toots
-    posts_tab_heading: Toots
-    posts_with_replies: Toots i respostes
+      one: Tut
+      other: Tuts
+    posts_tab_heading: Tuts
+    posts_with_replies: Tuts i respostes
     reserved_username: El nom d'usuari està reservat
     roles:
       admin: Administrador
       bot: Bot
+      group: Grup
       moderator: Moderador
     unavailable: Perfil inaccessible
     unfollow: Deixa de seguir
@@ -97,12 +98,12 @@ ca:
       avatar: Avatar
       by_domain: Domini
       change_email:
-        changed_msg: El correu electrònic del compte s'ha canviat correctament!
-        current_email: Correu electrònic actual
-        label: Canviar l'adreça de correu
-        new_email: Nova adreça de correu
-        submit: Canviar adreça de correu
-        title: Canviar adreça de correu de %{username}
+        changed_msg: L'adreça electrònica del compte s'ha canviat correctament!
+        current_email: Adreça electrònica actual
+        label: Canvia l'adreça electrònica
+        new_email: Adreça electrònica nova
+        submit: Canvia l'adreça electrònica
+        title: Canvia l'adreça electrònica de %{username}
       confirm: Confirma
       confirmed: Confirmat
       confirming: Confirmant
@@ -111,11 +112,11 @@ ca:
       disable: Inhabilita
       disable_two_factor_authentication: Desactiva 2FA
       disabled: Inhabilitat
-      display_name: Nom de visualització
+      display_name: Nom visible
       domain: Domini
       edit: Edita
-      email: Correu electrònic
-      email_status: Estat del correu electrònic
+      email: Adreça electrònica
+      email_status: Estat de l'adreça electrònica
       enable: Habilita
       enabled: Habilitat
       followers: Seguidors
@@ -143,7 +144,7 @@ ca:
       moderation_notes: Notes de moderació
       most_recent_activity: Activitat més recent
       most_recent_ip: IP més recent
-      no_account_selected: No s'han canviat els comptes perque no s'han seleccionat
+      no_account_selected: No s'han canviat els comptes perquè no s'han seleccionat
       no_limits_imposed: Sense límits imposats
       not_subscribed: No subscrit
       pending: Revisió pendent
@@ -178,7 +179,7 @@ ca:
         targeted_reports: Informes realitzats per altres
       silence: Silenci
       silenced: Silenciat
-      statuses: Estats
+      statuses: Tuts
       subscribe: Subscriu
       suspended: Suspès
       time_in_queue: Esperant en la cua %{time}
@@ -197,11 +198,13 @@ ca:
         change_email_user: "%{name} ha canviat l'adreça de correu electrònic del usuari %{target}"
         confirm_user: "%{name} ha confirmat l'adreça de correu electrònic de l'usuari %{target}"
         create_account_warning: "%{name} ha enviat un avís a %{target}"
+        create_announcement: "%{name} ha creat un nou anunci %{target}"
         create_custom_emoji: "%{name} ha pujat un nou emoji %{target}"
         create_domain_allow: "%{name} ha afegit a la llista blanca el domini %{target}"
         create_domain_block: "%{name} ha blocat el domini %{target}"
         create_email_domain_block: "%{name} ha afegit a la llista negra el domini del correu electrònic %{target}"
         demote_user: "%{name} ha degradat l'usuari %{target}"
+        destroy_announcement: "%{name} ha eliminat l'anunci %{target}"
         destroy_custom_emoji: "%{name} ha destruït l'emoji %{target}"
         destroy_domain_allow: "%{name} ha eliminat el domini %{target} de la llista blanca"
         destroy_domain_block: "%{name} ha desblocat el domini %{target}"
@@ -223,10 +226,22 @@ ca:
         unassigned_report: "%{name} ha des-assignat l'informe %{target}"
         unsilence_account: "%{name} ha silenciat el compte de %{target}"
         unsuspend_account: "%{name} ha llevat la suspensió del compte de %{target}"
+        update_announcement: "%{name} ha actualitzat l'anunci %{target}"
         update_custom_emoji: "%{name} ha actualitzat l'emoji %{target}"
         update_status: "%{name} estat actualitzat per %{target}"
-      deleted_status: "(toot suprimit)"
+      deleted_status: "(tut esborrat)"
       title: Registre d'auditoria
+    announcements:
+      edit:
+        title: Edita l'anunci
+      empty: No s'ha trobat cap anunci.
+      live: En viu
+      new:
+        create: Crea un anunci
+        title: Nou anunci
+      published: Publicat
+      time_range: Interval de temps
+      title: Anuncis
     custom_emojis:
       assign_category: Assigna una categoria
       by_domain: Domini
@@ -269,7 +284,7 @@ ca:
       feature_registrations: Registres
       feature_relay: Relay de la Federació
       feature_spam_check: Anti-spam
-      feature_timeline_preview: Vista previa de línia de temps
+      feature_timeline_preview: Vista prèvia de línia de temps
       features: Característiques
       hidden_service: Federació amb serveis ocults
       open_reports: informes oberts
@@ -279,7 +294,7 @@ ca:
       search: Cerca de text complet
       single_user_mode: Mode d'usuari únic
       software: Programari
-      space: Ús d’espai
+      space: Ús de l’espai
       title: Panell
       total_users: usuaris en total
       trends: Tendències
@@ -298,7 +313,7 @@ ca:
       destroyed_msg: El bloqueig de domini s'ha desfet
       domain: Domini
       edit: Editar el bloqueig del domini
-      existing_domain_block_html: Ja has imposat uns limits més estrictes a %{name}, l'hauries de <a href="%{unblock_url}">desbloquejar-lo</a> primer.
+      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
         hint: El bloqueig de domini no impedirà la creació de nous comptes en la base de dades, però s'aplicaran de manera retroactiva mètodes de moderació específics sobre aquests comptes.
@@ -338,13 +353,11 @@ ca:
       delete: Suprimeix
       destroyed_msg: S'ha eliminat correctament el bloc del domini de correu
       domain: Domini
+      empty: Cap domini de correu a la llista negre.
       new:
         create: Afegeix un domini
         title: Nova adreça de correu en la llista negra
       title: Llista negra de correus electrònics
-    followers:
-      back_to_account: Tornar al compte
-      title: Seguidors de %{acct}
     instances:
       by_domain: Domini
       delivery_available: El lliurament està disponible
@@ -373,14 +386,16 @@ ca:
       title: Convida
     pending_accounts:
       title: Comptes pendents (%{count})
+    relationships:
+      title: relacions del %{acct}
     relays:
       add_new: Afegiu un nou relay
       delete: Esborra
-      description_html: Un <strong>relay de federació</strong> és un servidor intermediari que intercanvia grans volums de toots públics entre servidors que es subscriuen i publiquen en ell. <strong>Pot ajudar a servidors petits i mitjans a descobrir contingut del fedivers</strong>, no fent necessari que els usuaris locals manualment segueixin altres persones de servidors remots.
+      description_html: Un <strong>relay de federació</strong> és un servidor intermediari que intercanvia grans volums de tuts públics entre servidors que es subscriuen i publiquen en ell. <strong>Pot ajudar a servidors petits i mitjans a descobrir contingut del fedivers</strong>, no fent necessari que els usuaris locals manualment segueixin altres persones de servidors remots.
       disable: Inhabilita
       disabled: Desactivat
       enable: Activat
-      enable_hint: Una vegada habilitat el teu servidor es subscriurà a tots els toots públics d'aquest relay i començarà a enviar-hi tots els toots públics d'aquest servidor.
+      enable_hint: Una vegada habilitat, el teu servidor es subscriurà a tots els tuts públics d'aquest relay i començarà a enviar-hi tots els tuts públics d'aquest servidor.
       enabled: Activat
       inbox_url: URL del Relay
       pending: S'està esperant l'aprovació del relay
@@ -393,22 +408,30 @@ ca:
       created_msg: La nota del informe s'ha creat correctament!
       destroyed_msg: La nota del informe s'ha esborrat correctament!
     reports:
+      account:
+        notes:
+          one: "%{count} nota"
+          other: "%{count} notes"
+        reports:
+          one: "%{count} informe"
+          other: "%{count} informes"
       action_taken_by: Mesures adoptades per
       are_you_sure: N'estàs segur?
       assign_to_self: Assignar-me
       assigned: Moderador assignat
+      by_target_domain: Domini del compte reportat
       comment:
         none: Cap
       created_at: Reportat
       mark_as_resolved: Marca com a resolt
-      mark_as_unresolved: Marcar sense resoldre
+      mark_as_unresolved: Marcar com a sense resoldre
       notes:
-        create: Afegir nota
-        create_and_resolve: Resoldre amb nota
-        create_and_unresolve: Reobrir amb nota
-        delete: Esborrar
+        create: Afegeix una nota
+        create_and_resolve: Resol amb una nota
+        create_and_unresolve: Reobre amb una nota
+        delete: Esborra
         placeholder: Descriu les accions que s'han pres o qualsevol altra actualització relacionada…
-      reopen: Reobrir informe
+      reopen: Reobre l'informe
       report: 'Informe #%{id}'
       reported_account: Compte reportat
       reported_by: Reportat per
@@ -416,25 +439,25 @@ ca:
       resolved_msg: Informe resolt amb èxit!
       status: Estat
       title: Informes
-      unassign: Treure assignació
+      unassign: Treu l'assignació
       unresolved: No resolt
       updated_at: Actualitzat
     settings:
       activity_api_enabled:
-        desc_html: Compte d'estatus publicats localment, usuaris actius i registres nous en períodes setmanals
+        desc_html: Nombre de tuts publicats localment, usuaris actius i registres nous en períodes setmanals
         title: Publica estadístiques agregades sobre l'activitat de l'usuari
       bootstrap_timeline_accounts:
         desc_html: Separa diversos noms d'usuari amb comes. Només funcionaran els comptes locals i desblocats. El valor predeterminat quan està buit és tots els administradors locals.
         title: El seguiment per defecte per als usuaris nous
       contact_information:
-        email: Introdueix una adreça de correu electrònic pública
+        email: Adreça electrònica d'empresa
         username: Nom d'usuari del contacte
       custom_css:
         desc_html: Modifica l'aspecte amb CSS carregat a cada pàgina
         title: CSS personalitzat
       default_noindex:
         desc_html: Afecta a tots els usuaris que no han canviat aquest ajustament ells mateixos
-        title: Configurar per defecte als usuaris fora de l'indexació dels motor de cerca
+        title: Configura per defecte als usuaris fora de la indexació del motor de cerca
       domain_blocks:
         all: Per a tothom
         disabled: Per a ningú
@@ -442,6 +465,8 @@ ca:
         users: Per als usuaris locals en línia
       domain_blocks_rationale:
         title: Mostra el raonament
+      enable_bootstrap_timeline_accounts:
+        title: Activa els seguiments per defecte per els usuaris nous
       hero:
         desc_html: Es mostra en pàgina frontal. Recomanat al menys 600x100px. Si no es configura es mostrarà el del servidor
         title: Imatge d’heroi
@@ -474,8 +499,8 @@ ca:
           open: Qualsevol pot registrar-se
         title: Mode de registres
       show_known_fediverse_at_about_page:
-        desc_html: Quan s'activa, mostrarà tots els toots de tot el fedivers conegut en vista prèvia. En cas contrari, només es mostraran toots locals.
-        title: Mostra el fedivers conegut en vista prèvia de la línia de temps
+        desc_html: Quan està desactivat, restringeix la línia de temps pública enllaçada des de la pàgina inicial a mostrar només contingut local
+        title: Inclou el contingut federat a la pàgina no autenticada de la línia de temps pública
       show_staff_badge:
         desc_html: Mostra una insígnia de personal en la pàgina d'usuari
         title: Mostra insígnia de personal
@@ -486,21 +511,21 @@ ca:
         desc_html: Un bon lloc per al codi de conducta, regles, directrius i altres coses que distingeixen el teu servidor. Pots utilitzar etiquetes HTML
         title: Descripció ampliada del lloc
       site_short_description:
-        desc_html: Es mostra a la barra lateral i a metaetiquetes. Descriu en un únic paràgraf què és Mastodon i què fa que aquest servidor sigui especial. Si està buit, s'estableix per defecte la descripció del servidor.
+        desc_html: Es mostra a la barra lateral i a metaetiquetes. Descriu en un únic paràgraf què és Mastodon i què fa que aquest servidor sigui especial.
         title: Descripció curta del servidor
       site_terms:
         desc_html: Pots escriure la teva pròpia política de privadesa, els termes del servei o d'altres normes legals. Pots utilitzar etiquetes HTML
         title: Termes del servei personalitzats
       site_title: Nom del servidor
       spam_check_enabled:
-        desc_html: Mastodon pot auto-silenciar i informar automàticament de comptes basat en mesures com ara la detecció de comptes que envien missatges repetits no sol·licitats. Pot haver-hi falsos positius.
+        desc_html: Mastodon pot informar automàticament de comptes que envien repetits missatges no sol·licitats. Pot haver-hi falsos positius.
         title: Anti-spam
       thumbnail:
         desc_html: S'utilitza per obtenir visualitzacions prèvies a través d'OpenGraph i API. Es recomana 1200x630px
         title: Miniatura del servidor
       timeline_preview:
-        desc_html: Mostra la línia de temps pública a la pàgina inicial
-        title: Vista prèvia de la línia de temps
+        desc_html: Mostra l'enllaç a la línia de temps pública a la pàgina inicial i permet l'accés a l'API a la línia de temps pública sense autenticació
+        title: Permet l'accés no autenticat a la línia de temps pública
       title: Configuració del lloc
       trendable_by_default:
         desc_html: Afecta a les etiquetes que no s'havien rebutjat prèviament
@@ -542,7 +567,7 @@ ca:
       updated_msg: Ajustaments d'etiquetes actualitzats amb èxit
     title: Administració
     warning_presets:
-      add_new: Afegir nou
+      add_new: Afegeix-ne un de nou
       delete: Esborra
       edit: Edita
       edit_preset: Edita l'avís predeterminat
@@ -559,17 +584,21 @@ ca:
       body: 'La etiqueta #%{name} està actualment en tendència però no s''ha revisat prèviament. No es mostrarà públicament tret que ho permetis o guardis el formulari tal com està per a no tornar a escoltar res al respecte.'
       subject: Nova etiqueta pendent de revisió a %{instance} (#%{name})
   aliases:
-    add_new: Crear àlies
+    add_new: Crea un àlies
     created_msg: Nou àlies creat amb èxit. Ara pots iniciar el moviment des de'l compte vell.
     deleted_msg: Àlies eliminat amb èxit. Moure't des d'aquell compte a aquests ja no serà possible.
     hint_html: Si et vols moure des d'un altre compte a aquest, aquí pots crear un àlies, el qual és requerit abans que puguis procedir a moure els seguidors del compte vell a aquest. Aquesta acció és per si mateixa <strong>inofensiva i reversible</strong>. <strong>La migració del compte és iniciada des de'l compte vell</strong>.
-    remove: Desvincular l'àlies
+    remove: Desvincula l'àlies
   appearance:
     advanced_web_interface: Interfície web avançada
     advanced_web_interface_hint: 'Si vols fer ús de tota l''amplada de la teva pantalla, l''interfície web avançada et permet configurar diverses columnes per a veure molta més informació al mateix temps: Inici, notificacions, línia de temps federada i qualsevol número de llistes i etiquetes.'
     animations_and_accessibility: Animacions i accessibilitat
     confirmation_dialogs: Diàlegs de confirmació
     discovery: Descobriment
+    localization:
+      body: Mastodon és traduït per voluntaris.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Tothom hi pot contribuir.
     sensitive_content: Contingut sensible
     toot_layout: Disseny del tut
   application_mailer:
@@ -602,7 +631,7 @@ ca:
     forgot_password: Has oblidat la contrasenya?
     invalid_reset_password_token: L'enllaç de restabliment de la contrasenya no és vàlid o ha caducat. Torna-ho a provar.
     login: Inicia sessió
-    logout: Tanca sessió
+    logout: Surt
     migrate_account: Mou a un compte diferent
     migrate_account_html: Si vols redirigir aquest compte a un altre diferent, el pots <a href="%{path}">configurar aquí</a>.
     or_log_in_with: O inicia sessió amb
@@ -642,6 +671,9 @@ ca:
     hint_html: "<strong>Pista:</strong> No et preguntarem un altre cop la teva contrasenya en la pròxima hora."
     invalid_password: Contrasenya no vàlida
     prompt: Confirmi la contrasenya per a continuar
+  date:
+    formats:
+      default: "%b %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count} h"
@@ -693,22 +725,21 @@ ca:
       content: Ho sentim, però alguna cosa ha fallat a la nostra banda.
       title: Aquesta pàgina no es correcta
     '503': La pàgina no podria ser servida a causa d'un error temporal del servidor.
-    noscript_html: Per a utilitzar Mastodon, activa el JavaScript. També pots provar una de les <a href="%{apps_path}"> aplicacions natives</a> de Mastodon per a la vostra plataforma.
+    noscript_html: Per a utilitzar Mastodon, activa el JavaScript. També pots provar una de les <a href="%{apps_path}"> aplicacions natives</a> de Mastodon per a la teva plataforma.
   existing_username_validator:
     not_found: no s'ha pogut trobar cap usuari local amb aquest nom d'usuari
     not_found_multiple: no s'ha pogut trobar %{usernames}
   exports:
     archive_takeout:
       date: Data
-      download: Descarrega l’arxiu
-      hint_html: Pots sol·licitar un arxiu dels teus <strong>toots i dels fitxers multimèdia pujats</strong>. Les dades exportades tindran el format ActivityPub, llegible per qualsevol programari compatible. Pots sol·licitar un arxiu cada 7 dies.
-      in_progress: Compilant el teu arxiu...
+      download: Baixa l’arxiu
+      hint_html: Pots sol·licitar un arxiu dels teus <strong>tuts i dels fitxers multimèdia pujats</strong>. Les dades exportades tindran el format ActivityPub, llegible per qualsevol programari compatible. Pots sol·licitar un arxiu cada 7 dies.
+      in_progress: S'està compilant el teu arxiu...
       request: Sol·licita el teu arxiu
-      size: Tamany
+      size: Mida
     blocks: Persones que has blocat
     csv: CSV
     domain_blocks: Bloquejos de dominis
-    follows: Persones que segueixes
     lists: Llistes
     mutes: Persones silenciades
     storage: Emmagatzematge
@@ -716,9 +747,10 @@ ca:
     add_new: Afegir nova
     errors:
       limit: Ja has mostrat la quantitat màxima d'etiquetes
-    hint_html: "<strong>Què son les etiquetes destacades?</strong> Es mostren de manera destacada en el teu perfil públic i permeten a les persones navegar per les teves publicacions amb aquestes etiquetes. Són una gran eina per fer un seguiment de treballs creatius o de projectes a llarg termini."
+    hint_html: "<strong>Què son les etiquetes destacades?</strong> Es mostren de manera destacada en el teu perfil públic i permeten a les persones navegar per les teves publicacions gràcies a aquestes etiquetes. Són una gran eina per fer un seguiment de treballs creatius o de projectes a llarg termini."
   filters:
     contexts:
+      account: Perfils
       home: Línia de temps Inici
       notifications: Notificacions
       public: Línies de temps públiques
@@ -730,9 +762,10 @@ ca:
       invalid_irreversible: El filtratge irreversible només funciona amb el contextos inici o notificacions
     index:
       delete: Esborra
+      empty: No hi tens cap filtre.
       title: Filtres
     new:
-      title: Afegir nou filtre
+      title: Afegeix un nou filtre
   footer:
     developers: Desenvolupadors
     more: Més…
@@ -742,6 +775,8 @@ ca:
     all: Tot
     changes_saved_msg: Els canvis s'han desat correctament!
     copy: Copia
+    delete: Esborra
+    edit: Edita
     no_batch_actions_available: Cap accions de lot disponibles en aquesta pàgina
     order_by: Ordena per
     save_changes: Desa els canvis
@@ -760,11 +795,11 @@ ca:
         invalid_token: Els tokens de Keybase són hashs de signatures i han de tenir 66 caràcters hexadecimals
         verification_failed: Keybase no reconeix aquest token com a signatura del usuari de Keybase %{kb_username}. Si us plau prova des de Keybase.
       wrong_user: No es pot crear una prova per a %{proving} mentre es connectava com a %{current}. Inicia sessió com a %{proving} i prova de nou.
-    explanation_html: Aquí pots connectar criptogràficament les teves altres identitats com ara el teu perfil de Keybase. Això permet que altres persones t'envïin missatges xifrats i confiar en el contingut que els hi envies.
+    explanation_html: Aquí pots connectar criptogràficament les teves altres identitats com ara el teu perfil de Keybase. Això permet que altres persones t'enviïn missatges xifrats i confiar en el contingut que els hi envies.
     i_am_html: Sóc %{username} a %{service}.
     identity: Identitat
     inactive: Inactiu
-    publicize_checkbox: 'I tooteja això:'
+    publicize_checkbox: 'I envia un tut d''això:'
     publicize_toot: 'Està provat! Sóc %{username} a %{service}: %{url}'
     status: Estat de verificació
     view_proof: Veure la prova
@@ -781,7 +816,7 @@ ca:
       domain_blocking: Llistat de dominis bloquejats
       following: Llista de seguits
       muting: Llista de silenciats
-    upload: Carregar
+    upload: Carrega
   in_memoriam_html: En Memòria.
   invites:
     delete: Desactivar
@@ -813,7 +848,7 @@ ca:
       images_and_video: No es pot adjuntar un vídeo a una publicació que ja contingui imatges
       too_many: No es poden adjuntar més de 4 fitxers
   migrations:
-    acct: usuari@domini del nou compte
+    acct: Mogut a
     cancel: Cancel·la redirecció
     cancel_explanation: Cancel·lant la redirecció reactivará el teu compte actual però no recuperarà els seguidors que han estat moguts a aquell compte.
     cancelled_msg: Redirecció cancel·lada amb èxit.
@@ -822,7 +857,7 @@ ca:
       missing_also_known_as: no fa referencia a aquest compte
       move_to_self: no pot ser el compte actual
       not_found: podria no ser trobat
-      on_cooldown: Estàs en temps de recuperació
+      on_cooldown: Estàs en temps de refredament
     followers_count: Seguidors en el moment del moviment
     incoming_migrations: Movent des d'un compte diferent
     incoming_migrations_html: Per a moure't des d'un altre compte a aquest, primer necessites <a href="%{path}">crear un àlies de compte</a>.
@@ -846,8 +881,8 @@ ca:
     title: Moderació
   notification_mailer:
     digest:
-      action: Veure totes les notificacions
-      body: Un resum del que et vas perdre desde la darrera visita el %{since}
+      action: Mostra totes les notificacions
+      body: Un resum del que et vas perdre des de la darrera visita el %{since}
       mention: "%{name} t'ha mencionat en:"
       new_followers_summary:
         one: A més, has adquirit un nou seguidor durant la teva absència! Visca!
@@ -878,6 +913,10 @@ ca:
       body: "%{name} ha impulsat el teu estat:"
       subject: "%{name} ha impulsat el teu estat"
       title: Nou impuls
+  notifications:
+    email_events: Esdeveniments per a notificacions per correu electrònic
+    email_events_hint: 'Selecciona els esdeveniments per als quals vols rebre notificacions:'
+    other_settings: Altres opcions de notificació
   number:
     human:
       decimal_units:
@@ -901,6 +940,7 @@ ca:
       duration_too_long: està massa lluny en el futur
       duration_too_short: és massa aviat
       expired: L'enquesta ja ha finalitzat
+      invalid_choice: L’opció de vot escollida no existeix
       over_character_limit: no pot ser superior a %{max} caràcters cadascun
       too_few_options: ha de tenir més d'una opció
       too_many_options: no pot contenir més de %{max} opcions
@@ -908,9 +948,15 @@ ca:
     other: Altre
     posting_defaults: Valors predeterminats de publicació
     public_timelines: Línies de temps públiques
+  reactions:
+    errors:
+      unrecognized_emoji: no és un emoji reconegut
   relationships:
     activity: Activitat del compte
     dormant: Inactiu
+    followers: Seguidors
+    following: Seguint
+    invited: Convidat
     last_active: Darrer actiu
     most_recent: Més recent
     moved: Mogut
@@ -923,7 +969,7 @@ ca:
     status: Estat del compte
   remote_follow:
     acct: Escriu el teu usuari@domini des del qual vols seguir
-    missing_resource: No s'ha pogut trobar la URL de redirecció necessaria per al compte
+    missing_resource: No s'ha pogut trobar la URL de redirecció necessària per al compte
     no_account_html: No tens cap compte? Pots <a href='%{sign_up_path}' target='_blank'>registrar-te aquí</a>
     proceed: Comença a seguir
     prompt: 'Seguiràs a:'
@@ -931,16 +977,16 @@ ca:
   remote_interaction:
     favourite:
       proceed: Procedir a afavorir
-      prompt: 'Vols marcar com a favorit aquest toot:'
+      prompt: 'Vols marcar com a favorit aquest tut:'
     reblog:
       proceed: Procedir a impulsar
-      prompt: 'Vols impulsar aquest toot:'
+      prompt: 'Vols impulsar aquest tut:'
     reply:
       proceed: Procedir a respondre
-      prompt: 'Vols respondre a aquest toot:'
+      prompt: 'Vols respondre a aquest tut:'
   scheduled_statuses:
-    over_daily_limit: Has superat el límit de %{limit} toots programats per a aquell dia
-    over_total_limit: Has superat el limit de %{limit} toots programats
+    over_daily_limit: Has superat el límit de %{limit} tuts programats per a aquell dia
+    over_total_limit: Has superat el limit de %{limit} tuts programats
     too_soon: La data programada ha de ser futura
   sessions:
     activity: Última activitat
@@ -987,17 +1033,17 @@ ca:
     account: Compte
     account_settings: Ajustos del compte
     aliases: Àlies de compte
-    appearance: Aparènça
+    appearance: Aparença
     authorized_apps: Aplicacions autoritzades
     back: Torna a Mastodon
     delete: Eliminació del compte
     development: Desenvolupament
-    edit_profile: Editar perfil
-    export: Exportar dades
+    edit_profile: Edita el perfil
+    export: Exportació de dades
     featured_tags: Etiquetes destacades
     identity_proofs: Proves d'identitat
-    import: Importar
-    import_and_export: Importar i exportar
+    import: Importació
+    import_and_export: Importació i exportació
     migrate: Migració del compte
     notifications: Notificacions
     preferences: Preferències
@@ -1024,9 +1070,9 @@ ca:
     open_in_web: Obre en la web
     over_character_limit: Límit de caràcters de %{max} superat
     pin_errors:
-      limit: Ja has fixat el màxim nombre de toots
-      ownership: No es pot fixar el toot d'algú altre
-      private: No es pot fixar el toot no públic
+      limit: Ja has fixat el màxim nombre de tuts
+      ownership: No es pot fixar el tut d'algú altre
+      private: No es pot fixar un tut no públic
       reblog: No es pot fixar un impuls
     poll:
       total_people:
@@ -1036,7 +1082,7 @@ ca:
         one: "%{count} vot"
         other: "%{count} vots"
       vote: Vota
-    show_more: Mostrar més
+    show_more: Mostra'n més
     sign_in_to_participate: Inicia la sessió per participar a la conversa
     title: '%{name}: "%{quote}"'
     visibilities:
@@ -1045,9 +1091,9 @@ ca:
       public: Públic
       public_long: Tothom pot veure-ho
       unlisted: No llistat
-      unlisted_long: Tothom ho pot veure, però no es mostra en la història federada
+      unlisted_long: Tothom ho pot veure, però no es mostra en les línies de temps públiques
   stream_entries:
-    pinned: Toot fixat
+    pinned: Tut fixat
     reblogged: ha impulsat
     sensitive_content: Contingut sensible
   tags:
@@ -1136,9 +1182,9 @@ ca:
       <p>Originalment adaptat des del <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p>
     title: "%{instance} Condicions del servei i política de privadesa"
   themes:
-    contrast: Mastodon (Alt contrast)
-    default: Mastodon (Fosc)
-    mastodon-light: Mastodon (Clar)
+    contrast: Mastodon (alt contrast)
+    default: Mastodon (fosc)
+    mastodon-light: Mastodon (clar)
   time:
     formats:
       default: "%b %d, %Y, %H:%M"
@@ -1152,23 +1198,23 @@ ca:
     enabled_success: Autenticació de dos factors activada correctament
     generate_recovery_codes: Genera codis de recuperació
     instructions_html: "<strong>Escaneja aquest codi QR desde Google Authenticator o una aplicació similar del teu telèfon</strong>. Desde ara, aquesta aplicació generarà tokens que tens que ingresar quan volguis iniciar sessió."
-    lost_recovery_codes: Els codis de recuperació et permeten recuperar l'accés al teu compte si perds el telèfon. Si has perdut els codis de recuperació els pots tornar a generar aquí. Els codis de recuperació anteriors s'anul·laran.
-    manual_instructions: 'Si no pots escanejar el codi QR code i necessites introduir-lo manualment, aquí tens el secret en text pla:'
+    lost_recovery_codes: Els codis de recuperació et permeten recuperar l'accés al teu compte si perds el telèfon. Si has perdut els codis de recuperació els pots tornar a generar aquí. S'anul·laran els codis de recuperació anteriors.
+    manual_instructions: 'Si no pots escanejar el codi QR i necessites introduir-lo manualment, aquí tens el secret en text pla:'
     recovery_codes: Codis de recuperació de còpia de seguretat
     recovery_codes_regenerated: Codis de recuperació regenerats amb èxit
-    recovery_instructions_html: Si mai perds l'accéss al teu telèfon pots utilitzar un dels codis de recuperació a continuació per a recuperar l'accés al teu compte. <strong>Cal mantenir els codis de recuperació en lloc segur</strong>. Per exemple, imprimint-los i guardar-los amb altres documents importants.
+    recovery_instructions_html: Si mai perds l'accés al teu telèfon pots utilitzar un dels codis de recuperació a continuació per a recuperar l'accés al teu compte. <strong>Cal mantenir els codis de recuperació en lloc segur</strong>. Per exemple, imprimint-los i guardar-los amb altres documents importants.
     setup: Establir
     wrong_code: El codi introduït no és vàlid! És correcta l'hora del servidor i del dispositiu?
   user_mailer:
     backup_ready:
-      explanation: Has sol·licitat una copia completa del teu compte Mastodon. Ara ja està a punt per descàrrega!
+      explanation: Has sol·licitat una copia completa del teu compte Mastodon. Ara ja està a punt per a descàrrega!
       subject: El teu arxiu està preparat per a descàrrega
       title: Recollida del arxiu
     warning:
       explanation:
         disable: Mentre el teu compte estigui congelat les dades romandran intactes però no pots dur a terme cap acció fins que no estigui desbloquejat.
         silence: Mentre el teu compte estigui limitat només les persones que ja et segueixen veuen les teves dades en aquest servidor i pots ser exclòs de diverses llistes públiques. No obstant això, d'altres encara poden seguir-te manualment.
-        suspend: El teu compte s'ha suspès i tots els teus toots i fitxers multimèdia penjats s'han eliminat irreversiblement d'aquest servidor i dels servidors on tenies seguidors.
+        suspend: El teu compte s'ha suspès i tots els teus tuts i fitxers multimèdia penjats s'han eliminat de manera irreversible d'aquest servidor i dels servidors on tenies seguidors.
       get_in_touch: Pots respondre a aquest correu electrònic per a contactar amb el personal de %{instance}.
       review_server_policies: Revisa les polítiques del servidor
       statuses: 'Concretament, per:'
@@ -1183,7 +1229,7 @@ ca:
         silence: Compte limitat
         suspend: Compte suspès
     welcome:
-      edit_profile_action: Configurar perfil
+      edit_profile_action: Configura el perfil
       edit_profile_step: Pots personalitzar el teu perfil penjant un avatar, un encapçalament, canviant el teu nom de visualització i molt més. Si prefereixes revisar els seguidors nous abans de que et puguin seguir, pots blocar el teu compte.
       explanation: Aquests són alguns consells per a començar
       final_action: Comença a publicar
@@ -1192,8 +1238,8 @@ ca:
       full_handle_hint: Això és el que has de dir als teus amics perquè puguin enviar-te missatges o seguir-te des d'un altre servidor.
       review_preferences_action: Canviar preferències
       review_preferences_step: Assegura't d'establir les teves preferències, com ara els correus electrònics que vols rebre o el nivell de privadesa per defecte que t'agradaria que tinguin les teves entrades. Si no tens malaltia de moviment, pots optar per habilitar la reproducció automàtica de GIF.
-      subject: Benvingut/da a Mastodon
-      tip_federated_timeline: La línia de temps federada és el cabal principal de la xarxa Mastodon. Però només inclou les persones a les quals els teus veïns estan subscrits, de manera que no està complet.
+      subject: Et donem la benvinguda a Mastodon
+      tip_federated_timeline: La línia de temps federada és el cabal principal de la xarxa Mastodon. Però només inclou les persones a les quals els teus veïns estan subscrits, de manera que no està completa.
       tip_following: Per defecte segueixes als administradors del servidor. Per trobar més persones interessants, consulta les línies de temps local i federada.
       tip_local_timeline: La línia de temps local és la vista del flux de publicacions dels usuaris de %{instance}. Aquests usuaris són els teus veïns més propers!
       tip_mobile_webapp: Si el teu navegador del mòbil t'ofereix afegir Mastodon a la teva pantalla d'inici, podràs rebre notificacions "push". Es comporta com una aplicació nativa en molts aspectes!
diff --git a/config/locales/co.yml b/config/locales/co.yml
index 9653363ca..c75fa3f21 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -2,7 +2,7 @@
 co:
   about:
     about_hashtag_html: Quessi sò statuti pubblichi taggati cù <strong>#%{hashtag}</strong>. Pudete interagisce cù elli sì voi avete un contu in qualche parte di u fediverse.
-    about_mastodon_html: Mastodon ghjè una rete suciale custruita incù prutucolli web aperti è lugiziali liberi. Hè decentralizatu cumu l’e-mail.
+    about_mastodon_html: 'A rete suciale di u futuru: micca pubblicità, micca surveglianza, cuncezzione etica, è dicentralizazione! Firmate in cuntrollu di i vostri dati cù Mastodon!'
     about_this: À prupositu
     active_count_after: attivi
     active_footnote: Utilizatori Attivi Mensili (UAM)
@@ -78,6 +78,7 @@ co:
     roles:
       admin: Amministratore
       bot: Bot
+      group: Gruppu
       moderator: Muderatore
     unavailable: Prufile micca dispunibule
     unfollow: Ùn siguità più
@@ -197,11 +198,13 @@ co:
         change_email_user: "%{name} hà cambiatu l’indirizzu e-mail di %{target}"
         confirm_user: "%{name} hà cunfirmatu l’indirizzu e-mail di %{target}"
         create_account_warning: "%{name} hà mandatu un'avertimentu à %{target}"
+        create_announcement: "%{name} hà creatu u novu annunziu %{target}"
         create_custom_emoji: "%{name} hà caricatu una nov’emoji %{target}"
         create_domain_allow: "%{name} hà messu u duminiu %{target} nant’a lista bianca"
         create_domain_block: "%{name} hà bluccatu u duminiu %{target}"
         create_email_domain_block: "%{name} hà messu u duminiu e-mail %{target} nant’a lista nera"
         demote_user: "%{name} hà ritrugradatu l’utilizatore %{target}"
+        destroy_announcement: "%{name} hà sguassatu u novu annunziu %{target}"
         destroy_custom_emoji: "%{name} hà sguassatu l'emoji %{target}"
         destroy_domain_allow: "%{name} hà sguassatu u duminiu %{target} da a lista bianca"
         destroy_domain_block: "%{name} hà sbluccatu u duminiu %{target}"
@@ -223,10 +226,22 @@ co:
         unassigned_report: "%{name} hà disassignatu u signalamentu %{target}"
         unsilence_account: "%{name} hà fattu che u contu di %{target} ùn hè più silenzatu"
         unsuspend_account: "%{name} hà fattu che u contu di %{target} ùn hè più suspesu"
+        update_announcement: "%{name} hà cambiatu u novu annunziu %{target}"
         update_custom_emoji: "%{name} hà messu à ghjornu l’emoji %{target}"
         update_status: "%{name} hà cambiatu u statutu di %{target}"
       deleted_status: "(statutu sguassatu)"
       title: Ghjurnale d’audit
+    announcements:
+      edit:
+        title: Mudificà annunzii
+      empty: Manc'un annunziu trovu.
+      live: Attivu
+      new:
+        create: Creà un'annunziu
+        title: Novu annunziu
+      published: Pubblicatu
+      time_range: Intervallu di tempu
+      title: Annunzii
     custom_emojis:
       assign_category: Aghjunghje categuria
       by_domain: Duminiu
@@ -314,7 +329,7 @@ co:
       public_comment_hint: Cummentariu nant'à a limitazione di stu duminiu per u pubblicu generale, s'ella hè attivata a rivelazione di a lista di limitazione di duminiu.
       reject_media: Righjittà i fugliali media
       reject_media_hint: Sguassa tutti i media caricati è ricusa caricamenti futuri. Inutile per una suspensione
-      reject_reports: Righjittà i rapporti
+      reject_reports: Righjittà i riporti
       reject_reports_hint: Ignurà tutti i signalamenti chì venenu d'issu duminiu. Senz'oghjettu pè e suspensione
       rejecting_media: righjettu di i fugliali media
       rejecting_reports: righjettu di i signalamenti
@@ -338,13 +353,11 @@ co:
       delete: Toglie
       destroyed_msg: U blucchime di u duminiu d’e-mail ùn hè più attivu
       domain: Duminiu
+      empty: Ùn c'hè manc'un duminiu d'email in lista nera.
       new:
         create: Creà un blucchime
         title: Nova iscrizzione nant’a lista nera e-mail
       title: Lista nera e-mail
-    followers:
-      back_to_account: Rivene à u Contu
-      title: Abbunati à %{acct}
     instances:
       by_domain: Duminiu
       delivery_available: Rimessa dispunibule
@@ -361,7 +374,7 @@ co:
       total_blocked_by_us: Bluccati da noi
       total_followed_by_them: Siguitati da elli
       total_followed_by_us: Siguitati da noi
-      total_reported: Rapporti nant'à elli
+      total_reported: Riporti nant'à elli
       total_storage: Media aghjunti
     invites:
       deactivate_all: Disattivà tuttu
@@ -373,6 +386,8 @@ co:
       title: Invitazione
     pending_accounts:
       title: Conti in attesa (%{count})
+    relationships:
+      title: Rilazione di %{acct}
     relays:
       add_new: Aghjunghje un ripetitore
       delete: Sguassà
@@ -393,10 +408,18 @@ co:
       created_msg: Nota di signalamentu creata!
       destroyed_msg: Nota di signalamentu sguassata!
     reports:
+      account:
+        notes:
+          one: "%{count} nota"
+          other: "%{count} note"
+        reports:
+          one: "%{count} riportu"
+          other: "%{count} riporti"
       action_taken_by: Intervenzione di
       are_you_sure: Site sicuru·a?
       assign_to_self: Assignallu à mè
       assigned: Muderatore assignatu
+      by_target_domain: Duminiu di u contu signalatu
       comment:
         none: Nisunu
       created_at: Palisatu
@@ -442,6 +465,8 @@ co:
         users: À l'utilizatori lucali cunnettati
       domain_blocks_rationale:
         title: Vede ragiò
+      enable_bootstrap_timeline_accounts:
+        title: Attivà l'abbunamenti predefiniti per l'utilizatori novi
       hero:
         desc_html: Affissatu nant’a pagina d’accolta. Ricumandemu almenu 600x100px. S’ellu ùn hè micca definiti, a vignetta di u servore sarà usata
         title: Ritrattu di cuprendula
@@ -570,6 +595,10 @@ co:
     animations_and_accessibility: Animazione è accessibilità
     confirmation_dialogs: Pop-up di cunfirmazione
     discovery: Scuperta
+    localization:
+      body: Mastodon hè tradottu da una squadra di vuluntari.
+      guide_link: https://fr.crowdin.com/project/mastodon
+      guide_link_text: Tuttu u mondu pò participà.
     sensitive_content: Cuntinutu sensibile
     toot_layout: Urganizazione
   application_mailer:
@@ -642,6 +671,9 @@ co:
     hint_html: "<strong>Astuzia:</strong> Ùn avemu micca da dumandavvi stu codice per l'ore chì vene."
     invalid_password: Chjave d'accessu micca curretta
     prompt: Cunfirmà a chjave d'accessu per cuntinuvà
+  date:
+    formats:
+      default: "%d %b %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}o"
@@ -708,7 +740,6 @@ co:
     blocks: Bluccate
     csv: CSV
     domain_blocks: Blucchime di duminiu
-    follows: Seguitate
     lists: Liste
     mutes: Piattate
     storage: I vostri media
@@ -719,6 +750,7 @@ co:
     hint_html: "<strong>Quale sò i hashtag in mostra?</strong> Sò messi in vista nant'à u vostru prufile pubblicu è permettenu à a ghjente di vede i vostri statuti ch'annu stu hashtag. Sò una bona manere di mustrà e vostre opere creative o i prughjetti à longu termine."
   filters:
     contexts:
+      account: Prufili
       home: Accolta
       notifications: Nutificazione
       public: Linee pubbliche
@@ -730,6 +762,7 @@ co:
       invalid_irreversible: A filtrazione irreversibile marchja solu per l'accolta è e nutificazione
     index:
       delete: Toglie
+      empty: Ùn avete manc'un filtru.
       title: Filtri
     new:
       title: Aghjunghje un novu filtru
@@ -742,6 +775,8 @@ co:
     all: Tuttu
     changes_saved_msg: Cambiamenti salvati!
     copy: Cupià
+    delete: Sguassà
+    edit: Mudificà
     no_batch_actions_available: Alcun'azzione di gruppu nant'à sta pagina
     order_by: Urdinà da
     save_changes: Salvà e mudificazione
@@ -878,6 +913,10 @@ co:
       body: 'U vostru statutu hè statu spartutu da %{name}:'
       subject: "%{name} hà spartutu u vostru statutu"
       title: Nova spartera
+  notifications:
+    email_events: Avvenimenti da nutificà cù l'e-mail
+    email_events_hint: 'Selezziunate l''avvenimenti per quelli vulete riceve nutificazione:'
+    other_settings: Altri parametri di nutificazione
   number:
     human:
       decimal_units:
@@ -901,6 +940,7 @@ co:
       duration_too_long: hè troppu luntanu indè u futuru
       duration_too_short: hè troppu prossimu
       expired: U scandagliu hè digià finitu
+      invalid_choice: L'uzzione di votu scelta ùn esista micca
       over_character_limit: ùn ponu micca esse più longhi chè %{max} caratteri
       too_few_options: deve avè più d'un'uzzione
       too_many_options: ùn pò micca avè più di %{max} uzzione
@@ -908,9 +948,15 @@ co:
     other: Altre
     posting_defaults: Paramettri predefiniti
     public_timelines: Linee pubbliche
+  reactions:
+    errors:
+      unrecognized_emoji: ùn hè micca un'emoji ricunisciuta
   relationships:
     activity: Attività di u contu
     dormant: Inattivu
+    followers: Abbunati
+    following: Abbunamenti
+    invited: Invitatu
     last_active: Ultima attività
     most_recent: Più ricente
     moved: Spiazzatu
@@ -939,8 +985,8 @@ co:
       proceed: Cuntinuà per risponde
       prompt: 'Vulete risponde à stu statutu:'
   scheduled_statuses:
-    over_daily_limit: Avete trapassatu a limita di %{limit} statuti planificati per stu ghjornu
-    over_total_limit: Avete trapassatu a limita di %{limit} statuti planificati
+    over_daily_limit: Avete trapassatu a limita di %{limit} statuti pianificati per stu ghjornu
+    over_total_limit: Avete trapassatu a limita di %{limit} statuti pianificati
     too_soon: A data deve esse indè u futuru
   sessions:
     activity: Ultima attività
@@ -1005,7 +1051,7 @@ co:
     relationships: Abbunamenti è abbunati
     two_factor_authentication: Identificazione à dui fattori
   spam_check:
-    spam_detected: Quessu ghjè un rapportu automaticu. Un spam hè statu ditettatu.
+    spam_detected: Quessu ghjè un riportu automaticu. Un spam hè statu ditettatu.
   statuses:
     attached:
       description: 'Aghjuntu: %{attached}'
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 81ae22680..547468e50 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -9,7 +9,7 @@ cs:
     administered_by: 'Server spravuje:'
     api: API
     apps: Mobilní aplikace
-    apps_platforms: Používejte Mastodon z iOS, Androidu a jiných platforem
+    apps_platforms: Používejte Mastodon na iOS, Androidu a dalších platformách
     browse_directory: Prozkoumejte adresář profilů a filtrujte dle zájmů
     browse_local_posts: Prozkoumejte živý proud veřejných příspěvků z tohoto serveru
     browse_public_posts: Prozkoumejte živý proud veřejných příspěvků na Mastodonu
@@ -18,14 +18,14 @@ cs:
     contact_unavailable: Neuvedeno
     discover_users: Objevujte uživatele
     documentation: Dokumentace
-    federation_hint_html: S účtem na %{instance} můžete sledovat lidi na jakémkoliv serveru Mastodon a jiných službách.
+    federation_hint_html: S účtem na serveru %{instance} můžete sledovat lidi na jakémkoliv ze serverů Mastodon a dalších službách.
     get_apps: Vyzkoušejte mobilní aplikaci
-    hosted_on: Mastodon na adrese %{domain}
+    hosted_on: Mastodon na doméně %{domain}
     instance_actor_flash: |
-      Tento účet je virtuální aktér, který představuje server samotný a ne jedotlivého uživatele.
-      Používá se pro účely federace a nesmí být blokován, pokud nechcete blokovat celý server. V tomto případě použijte doménovou blokaci.
+      Tento účet je virtuální aktér, který představuje server samotný, nikoliv účet jednotlivého uživatele.
+      Používá se pro účely federace a nesmí být blokován, pokud nechcete blokovat celý server. V takovém případě použijte blokaci domény.
     learn_more: Zjistit více
-    privacy_policy: Zásady soukromí
+    privacy_policy: Zásady ochrany osobních údajů
     see_whats_happening: Podívejte se, co se děje
     server_stats: 'Statistika serveru:'
     source_code: Zdrojový kód
@@ -62,19 +62,19 @@ cs:
       many: Sledujících
       one: Sledující
       other: Sledujících
-    following: Sledovaných
-    joined: Připojil/a se v %{date}
+    following: Sledovaní
+    joined: Uživatelem od %{date}
     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}:"
     network_hidden: Tato informace není k dispozici
     never_active: Nikdy
-    nothing_here: Tady nic není!
+    nothing_here: Nic tu není!
     people_followed_by: Lidé, které sleduje %{name}
     people_who_follow: Lidé, kteří sledují uživatele %{name}
     pin_errors:
-      following: Musíte již sledovat osobu, kterou chcete podpořit
+      following: Osobu, kterou chcete podpořit, už musíte sledovat
     posts:
       few: Tooty
       many: Tootů
@@ -86,8 +86,9 @@ cs:
     roles:
       admin: Administrátor
       bot: Robot
+      group: Skupina
       moderator: Moderátor
-    unavailable: Profil nedostupný
+    unavailable: Profil není dostupný
     unfollow: Přestat sledovat
   admin:
     account_actions:
@@ -101,7 +102,7 @@ cs:
     accounts:
       approve: Schválit
       approve_all: Schválit vše
-      are_you_sure: Jste si jistý/á?
+      are_you_sure: Opravdu?
       avatar: Avatar
       by_domain: Doména
       change_email:
@@ -117,7 +118,7 @@ cs:
       deleted: Smazáno
       demote: Degradovat
       disable: Zablokovat
-      disable_two_factor_authentication: Zakázat 2FA
+      disable_two_factor_authentication: Vypnout 2FA
       disabled: Blokováno
       display_name: Zobrazované jméno
       domain: Doména
@@ -127,12 +128,12 @@ cs:
       enable: Povolit
       enabled: Povoleno
       followers: Sledující
-      follows: Sledovaní
+      follows: Sleduje
       header: Záhlaví
       inbox_url: URL příchozí schránky
       invited_by: Pozván/a uživatelem
       ip: IP adresa
-      joined: Připojil/a se
+      joined: Uživatelem od
       location:
         all: Všechny
         local: Místní
@@ -145,8 +146,8 @@ cs:
         active: Aktivní
         all: Vše
         pending: Čekající
-        silenced: Utišen/a
-        suspended: Pozastaven/a
+        silenced: Uživatel ztišen
+        suspended: Uživatel pozastaven
         title: Moderování
       moderation_notes: Moderátorské poznámky
       most_recent_activity: Nejnovější aktivita
@@ -182,17 +183,17 @@ cs:
       search_same_ip: Další uživatelé se stejnou IP adresou
       shared_inbox_url: URL sdílené příchozí schránky
       show:
-        created_reports: Vytvořená nahlášení
+        created_reports: Vytvořená hlášení
         targeted_reports: Nahlášeni ostatními
-      silence: Utišit
-      silenced: Utišen/a
+      silence: Ztišit
+      silenced: Uživatel ztišen
       statuses: Tooty
       subscribe: Odebírat
-      suspended: Pozastaven/a
+      suspended: Uživatel pozastaven
       time_in_queue: Čeká ve frontě %{time}
       title: Účty
       unconfirmed_email: Nepotvrzený e-mail
-      undo_silenced: Zrušit utišení
+      undo_silenced: Zrušit ztišení
       undo_suspension: Zrušit pozastavení
       unsubscribe: Přestat odebírat
       username: Uživatelské jméno
@@ -201,46 +202,46 @@ cs:
       whitelisted: Na bílé listině
     action_logs:
       actions:
-        assigned_to_self_report: "%{name} přidělil/a hlášení %{target} sobě"
-        change_email_user: "%{name} změnil/a e-mailovou adresu uživatele %{target}"
-        confirm_user: "%{name} potvrdil/a e-mailovou adresu uživatele %{target}"
-        create_account_warning: "%{name} poslal/a varování uživateli %{target}"
-        create_custom_emoji: "%{name} nahrál/a nové emoji %{target}"
-        create_domain_allow: "%{name} přidal/a doménu %{target} na bílou listinu"
-        create_domain_block: "%{name} zablokoval/a doménu %{target}"
-        create_email_domain_block: "%{name} přidal/a e-mailovou doménu %{target} na černou listinu"
-        demote_user: "%{name} degradoval/a uživatele %{target}"
-        destroy_custom_emoji: "%{name} zničil/a emoji %{target}"
-        destroy_domain_allow: "%{name} odebral/a doménu %{target} z bílé listiny"
-        destroy_domain_block: "%{name} odblokoval/a doménu %{target}"
-        destroy_email_domain_block: "%{name} odebral/a e-mailovou doménu %{target} z černé listiny"
-        destroy_status: "%{name} odstranil/a toot uživatele %{target}"
-        disable_2fa_user: "%{name} vypnul/a dvoufázové ověřování pro uživatele %{target}"
-        disable_custom_emoji: "%{name} zakázal/a emoji %{target}"
-        disable_user: "%{name} zakázal/a přihlašování pro uživatele %{target}"
-        enable_custom_emoji: "%{name} povolil/a emoji %{target}"
-        enable_user: "%{name} povolil/a přihlašování pro uživatele %{target}"
-        memorialize_account: "%{name} změnil/a účet %{target} na stránku „in memoriam“"
-        promote_user: "%{name} povýšil/a uživatele %{target}"
-        remove_avatar_user: "%{name} odstranil/a avatar uživatele %{target}"
-        reopen_report: "%{name} znovuotevřel/a nahlášení %{target}"
-        reset_password_user: "%{name} obnovil/a heslo uživatele %{target}"
-        resolve_report: "%{name} vyřešil/a nahlášení %{target}"
-        silence_account: "%{name} utišil/a účet uživatele %{target}"
-        suspend_account: "%{name} pozastavil/a účet uživatele %{target}"
-        unassigned_report: "%{name} odebral/a nahlášení %{target}"
-        unsilence_account: "%{name} odtišil/a účet uživatele %{target}"
-        unsuspend_account: "%{name} zrušil/a pozastavení účtu uživatele %{target}"
-        update_custom_emoji: "%{name} aktualizoval/a emoji %{target}"
-        update_status: "%{name} aktualizoval/a toot uživatele %{target}"
+        assigned_to_self_report: Uživatel %{name} si přidělil hlášení %{target}
+        change_email_user: Uživatel %{name} změnil e-mailovou adresu uživatele %{target}
+        confirm_user: Uživatel %{name} potvrdil e-mailovou adresu uživatele %{target}
+        create_account_warning: Uživatel %{name} poslal varování uživateli %{target}
+        create_custom_emoji: Uživatel %{name} nahrál nové emoji %{target}
+        create_domain_allow: Uživatel %{name} přidal doménu %{target} na bílou listinu
+        create_domain_block: Uživatel %{name} zablokoval doménu %{target}
+        create_email_domain_block: Uživatel %{name} přidal e-mailovou doménu %{target} na černou listinu
+        demote_user: Uživatel %{name} degradoval uživatele %{target}
+        destroy_custom_emoji: Uživatel %{name} zničil emoji %{target}
+        destroy_domain_allow: Uživatel %{name} odebral doménu %{target} z bílé listiny
+        destroy_domain_block: Uživatel %{name} odblokoval doménu %{target}
+        destroy_email_domain_block: Uživatel %{name} odebral e-mailovou doménu %{target} z černé listiny
+        destroy_status: Uživatel %{name} odstranil toot uživatele %{target}
+        disable_2fa_user: Uživatel %{name} vypnul dvoufázové ověřování pro uživatele %{target}
+        disable_custom_emoji: Uživatel %{name} zakázal emoji %{target}
+        disable_user: Uživatel %{name} zakázal přihlašování pro uživatele %{target}
+        enable_custom_emoji: Uživatel %{name} povolil emoji %{target}
+        enable_user: Uživatel %{name} povolil přihlašování pro uživatele %{target}
+        memorialize_account: Uživatel %{name} změnil účet %{target} na „in memoriam“ stránku
+        promote_user: Uživatel %{name} povýšil uživatele %{target}
+        remove_avatar_user: Uživatel %{name} odstranil avatar uživatele %{target}
+        reopen_report: Uživatel %{name} znovu otevřel hlášení %{target}
+        reset_password_user: Uživatel %{name} obnovil heslo uživatele %{target}
+        resolve_report: Uživatel %{name} vyřešil hlášení %{target}
+        silence_account: Uživatel %{name} ztišil uživatele %{target}
+        suspend_account: Uživatel %{name} pozastavil účet uživatele %{target}
+        unassigned_report: Uživatel %{name} odebral hlášení %{target}
+        unsilence_account: Uživatel %{name} zrušil ztišení uživatele %{target}
+        unsuspend_account: Uživatel %{name} zrušil pozastavení účtu uživatele %{target}
+        update_custom_emoji: Uživatel %{name} aktualizoval emoji %{target}
+        update_status: Uživatel %{name} aktualizoval toot uživatele %{target}
       deleted_status: "(smazaný toot)"
-      title: Záznam auditu
+      title: Auditovací protokol
     custom_emojis:
       assign_category: Přiřadit kategorii
       by_domain: Doména
       copied_msg: Místní kopie emoji byla úspěšně vytvořena
       copy: Kopírovat
-      copy_failed_msg: Nebylo možné vytvořit místní kopii tohoto emoji
+      copy_failed_msg: Místní kopii tohoto emoji nebylo možné vytvořit
       create_new_category: Vytvořit novou kategorii
       created_msg: Emoji úspěšně vytvořeno!
       delete: Smazat
@@ -261,15 +262,15 @@ cs:
       shortcode: Zkratka
       shortcode_hint: Alespoň 2 znaky, pouze alfanumerické znaky a podtržítka
       title: Vlastní emoji
-      uncategorized: Nezařazená
+      uncategorized: Nezařazeno
       unlist: Neuvést
       unlisted: Neuvedeno
-      update_failed_msg: Nebylo možné aktualizovat toto emoji
+      update_failed_msg: Toto emoji nebylo možné aktualizovat
       updated_msg: Emoji úspěšně aktualizováno!
       upload: Nahrát
     dashboard:
       authorized_fetch_mode: Zabezpečený režim
-      backlog: opožděné úlohy
+      backlog: nevyřízené úlohy
       config: Konfigurace
       feature_deletions: Smazání účtů
       feature_invites: Odkazy pozvánek
@@ -281,8 +282,8 @@ cs:
       features: Vlastnosti
       hidden_service: Federace se skrytými službami
       open_reports: otevřená hlášení
-      pending_tags: hashtagů čeká na posouzení
-      pending_users: uživatelů
+      pending_tags: hashtagy čekající na posouzení
+      pending_users: uživatelé čekající na posouzení
       recent_users: Nedávní uživatelé
       search: Fulltextové vyhledávání
       single_user_mode: Režim jednoho uživatele
@@ -306,28 +307,28 @@ cs:
       destroyed_msg: Blokace domény byla zrušena
       domain: Doména
       edit: Upravit doménovou blokaci
-      existing_domain_block_html: Pro účet %{name} jste již nastavil/a přísnější omezení, musíte jej nejdříve <a href="%{unblock_url}">odblokovat</a>.
+      existing_domain_block_html: Pro účet %{name} jste už nastavili přísnější omezení, nejprve jej <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í.
         severity:
-          desc_html: Funkce <strong>Utišit</strong> zneviditelní příspěvky z účtu komukoliv, kdo jej nesleduje. Funkce <strong>Pozastavit</strong> odstraní všechen obsah, média a profilová data účtu. Pro pouhé odmítnutí mediálních souborů použijte funkci <strong>Žádné</strong>.
+          desc_html: "<strong>Ztišení</strong> skryje příspěvky z účtu komukoliv, kdo jej nesleduje. <strong>Pozastavení</strong> odstraní všechen obsah, média a profilová data účtu. Pro pouhé odmítnutí mediálních souborů použijte funkci <strong>Žádné</strong>."
           noop: Žádné
-          silence: Utišit
+          silence: Ztišit
           suspend: Pozastavit
-        title: Nová doménová blokace
+        title: Nová blokace domény
       private_comment: Soukromý komentář
       private_comment_hint: Komentář o tomto omezení domény pro vnitřní použití moderátory.
       public_comment: Veřejný komentář
-      public_comment_hint: Komentář o tomto omezení domény pro obecnou veřejnost, pokud je povoleno zobrazování seznamu omezení domén.
+      public_comment_hint: Komentář o tomto omezení domény pro obecnou veřejnost, pokud je povoleno zobrazování seznamu omezených domén.
       reject_media: Odmítat mediální soubory
       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 nahlášení
-      reject_reports_hint: Ignorovat všechna nahlášení pocházející z této domény. 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í
       rejecting_media: odmítají se mediální soubory
-      rejecting_reports: odmítají se nahlášení
+      rejecting_reports: odmítají se hlášení
       severity:
-        silence: utišeno
+        silence: ztišeno
         suspend: pozastaveno
       show:
         affected_accounts:
@@ -336,25 +337,23 @@ cs:
           one: Jeden účet v databázi byl ovlivněn
           other: "%{count} účtů v databázi bylo ovlivněno"
         retroactive:
-          silence: Odtišit existující ovlivněné účty z této domény
+          silence: Zrušit ztišení existujících ovlivněných účtů z této domény
           suspend: Zrušit pozastavení existujících ovlivněných účtů z této domény
         title: Zrušit blokaci domény %{domain}
         undo: Odvolat
       undo: Odvolat blokaci domény
-      view: Zobrazit doménovou blokaci
+      view: Zobrazit blokaci domény
     email_domain_blocks:
-      add_new: Přidat nový
+      add_new: Přidat
       created_msg: E-mailová doména úspěšně přidána na černou listinu
       delete: Smazat
       destroyed_msg: E-mailová doména úspěšně odstraněna z černé listiny
       domain: Doména
+      empty: Na černé listině aktuálně nejsou žádné e-mailové domény.
       new:
         create: Přidat doménu
         title: Nová položka pro černou listinu e-mailů
       title: Černá listina e-mailů
-    followers:
-      back_to_account: Zpět na účet
-      title: Sledující uživatele %{acct}
     instances:
       by_domain: Doména
       delivery_available: Doručení je k dispozici
@@ -373,14 +372,14 @@ cs:
       total_blocked_by_us: Blokované námi
       total_followed_by_them: Sledované jimi
       total_followed_by_us: Sledované námi
-      total_reported: Nahlášení o nich
+      total_reported: Hlášení o nich
       total_storage: Mediální přílohy
     invites:
       deactivate_all: Deaktivovat vše
       filter:
         all: Všechny
         available: Dostupné
-        expired: Vypršelé
+        expired: Vypršené
         title: Filtrovat
       title: Pozvánky
     pending_accounts:
@@ -388,27 +387,39 @@ cs:
     relays:
       add_new: Přidat nový most
       delete: Smazat
-      description_html: "<strong>Federovací most</strong> je přechodný server, který vyměňuje velká množství veřejných tootů mezi servery, které z něj odebírají a publikují na něj. <strong>Může pomoci malým a středně velkým serverům objevovat obsah z fedivesmíru</strong>, což by jinak vyžadovalo, aby místní uživatelé manuálně sledovali jiné lidi na vzdálených serverech."
+      description_html: "<strong>Federovací most</strong> je přechodový server, který vyměňuje velká množství veřejných tootů mezi servery, které je z něj odebírají a publikují na něj. <strong>Může pomoci malým a středně velkým serverům objevovat obsah z fedivesmíru</strong>, což by jinak vyžadovalo, aby místní uživatelé manuálně sledovali jiné lidi na vzdálených serverech."
       disable: Zakázat
       disabled: Zakázáno
       enable: Povolit
-      enable_hint: Je-li tohle povoleno, začne váš server odebírat všechny veřejné tooty z tohoto mostu a odesílat na něj své vlastní veřejné tooty.
+      enable_hint: Po zapnutí začne váš server odebírat všechny veřejné tooty z tohoto mostu a odesílat na něj své vlastní veřejné tooty.
       enabled: Povoleno
       inbox_url: URL mostu
-      pending: Čekám na souhlas mostu
+      pending: Čeká na souhlas mostu
       save_and_enable: Uložit a povolit
       setup: Nastavit připojení k mostu
-      signatures_not_enabled: Mosty nebudou fungovat správně, dokud je povolen zabezpečený režim nebo režim bílé listiny
+      signatures_not_enabled: Dokud je povolen zabezpečený režim nebo režim bílé listiny, nebudou mosty správně fungovat
       status: Stav
       title: Mosty
     report_notes:
-      created_msg: Poznámka o nahlášení úspěšně vytvořena!
-      destroyed_msg: Poznámka o nahlášení úspěšně smazána!
+      created_msg: Poznámka o hlášení úspěšně vytvořena!
+      destroyed_msg: Poznámka o hlášení úspěšně smazána!
     reports:
-      action_taken_by: Akci vykonal/a
-      are_you_sure: Jste si jistý/á?
+      account:
+        notes:
+          few: "%{count} poznámky"
+          many: "%{count} poznámek"
+          one: "%{count} poznámka"
+          other: "%{count} poznámek"
+        reports:
+          few: "%{count} hlášení"
+          many: "%{count} hlášení"
+          one: "%{count} hlášení"
+          other: "%{count} hlášení"
+      action_taken_by: Akci vykonal uživatel
+      are_you_sure: Opravu?
       assign_to_self: Přidělit ke mně
       assigned: Přiřazený moderátor
+      by_target_domain: Doména nahlášeného účtu
       comment:
         none: Žádné
       created_at: Nahlášené
@@ -420,14 +431,14 @@ cs:
         create_and_unresolve: Znovu otevřít s poznámkou
         delete: Smazat
         placeholder: Popište, jaké akce byly vykonány, nebo jakékoliv jiné související aktuality…
-      reopen: Znovu otevřít nahlášení
+      reopen: Znovu otevřít hlášení
       report: 'Nahlásit #%{id}'
       reported_account: Nahlášený účet
       reported_by: Nahlášeno uživatelem
       resolved: Vyřešeno
-      resolved_msg: Nahlášení úspěšně vyřešeno!
+      resolved_msg: Hlášení úspěšně vyřešeno!
       status: Stav
-      title: Nahlášení
+      title: Hlášení
       unassign: Odebrat
       unresolved: Nevyřešeno
       updated_at: Aktualizováno
@@ -436,29 +447,31 @@ cs:
         desc_html: Počty lokálně publikovaných tootů, aktivních uživatelů a nových registrací, v týdenních intervalech
         title: Publikovat hromadné statistiky o uživatelské aktivitě
       bootstrap_timeline_accounts:
-        desc_html: Je-li uživatelských jmen více, oddělujte je čárkami. Lze zadat pouze místní a odemknuté účty. Je-li tohle prázdné, jsou výchozí hodnotou všichni místní administrátoři.
+        desc_html: Je-li uživatelských jmen více, oddělte je čárkami. Lze zadat pouze místní a odemčené účty. Je-li seznam prázdný, jsou výchozí hodnotou všichni místní administrátoři.
         title: Výchozí sledovaní pro nové uživatele
       contact_information:
         email: Pracovní e-mail
         username: Uživatelské jméno pro kontaktování
       custom_css:
-        desc_html: Pozměnit vzhled pomocí šablony CSS načtené na každé stránce
+        desc_html: Pozměnit vzhled pomocí CSS šablony načítané na každé stránce
         title: Vlastní CSS
       default_noindex:
         desc_html: Ovlivňuje všechny uživatele, kteří toto nastavení sami nezměnili
-        title: Odhlásit uživatele z indexování vyhledávačemi ve výchozím stavu
+        title: Ve výchozím stavu odhlásit uživatele z indexování vyhledávači
       domain_blocks:
         all: Všem
         disabled: Nikomu
-        title: Zobrazit doménové blokace
+        title: Zobrazit blokované domény
         users: Přihlášeným místním uživatelům
       domain_blocks_rationale:
         title: Zobrazit odůvodnění
+      enable_bootstrap_timeline_accounts:
+        title: Povolit výchozí sledování pro nové uživatele
       hero:
-        desc_html: Zobrazuje se na hlavní stránce. Doporučuje se rozlišení alespoň 600x100 px. Pokud toto není nastaveno, bude zobrazena miniatura serveru
+        desc_html: Zobrazuje se na hlavní stránce. Doporučujeme rozlišení alespoň 600x100 px. Pokud toto není nastaveno, bude zobrazena miniatura serveru
         title: Hlavní obrázek
       mascot:
-        desc_html: Zobrazuje se na několika stránkách. Doporučuje se rozlišení alespoň 293x205 px. Pokud toto není nastaveno, bude zobrazen výchozí maskot
+        desc_html: Zobrazuje se na několika stránkách. Doporučujeme rozlišení alespoň 293x205 px. Pokud toto není nastaveno, bude zobrazen výchozí maskot
         title: Obrázek maskota
       peers_api_enabled:
         desc_html: Domény, na které tento server narazil ve fedivesmíru
@@ -474,7 +487,7 @@ cs:
           desc_html: Zobrazí se na hlavní stránce, jsou-li registrace uzavřeny. Můžete použít i HTML značky
           title: Zpráva o uzavřených registracích
         deletion:
-          desc_html: Dovolit každému smazání svého účtu
+          desc_html: Povolit komukoliv smazat svůj účet
           title: Zpřístupnit smazání účtu
         min_invite_role:
           disabled: Nikdo
@@ -492,33 +505,33 @@ cs:
         desc_html: Zobrazit na stránce uživatele odznak člena personálu
         title: Zobrazit odznak personálu
       site_description:
-        desc_html: Úvodní odstavec v API. Popište, díky čemu je tento server Mastodon zvláštní, a cokoliv jiného, co je důležité. Můžete zde používat HTML značky, hlavně <code>&lt;a&gt;</code> a <code>&lt;em&gt;</code>.
+        desc_html: Úvodní odstavec v API. Popište, čím se tento server Mastodon odlišuje od ostatních, a cokoliv jiného, co je důležité. Můžete zde používat HTML značky, hlavně <code>&lt;a&gt;</code> a <code>&lt;em&gt;</code>.
         title: Popis serveru
       site_description_extended:
         desc_html: Dobré místo pro vaše pravidla, pokyny a jiné věci, které váš server odlišují od ostatních. Lze použít HTML značky
         title: Vlastní rozšířené informace
       site_short_description:
-        desc_html: Zobrazen v postranním panelu a meta značkách. Popište, co je Mastodon a díky čemu je tento server zvláštní, v jediném odstavci.
+        desc_html: Zobrazeno v postranním panelu a meta značkách. V jednom odstavci popište, co je Mastodon a čím se tento server odlišuje od ostatních.
         title: Krátký popis serveru
       site_terms:
-        desc_html: Můžete si napsat vlastní zásady soukromí, podmínky používání či jiné legality. Můžete použít HTML značky
+        desc_html: Můžete si napsat vlastní zásady ochrany osobních údajů, podmínky používání či jiné právní dokumenty. Můžete použít HTML značky
         title: Vlastní podmínky používání
       site_title: Název serveru
       spam_check_enabled:
         desc_html: Mastodon může automaticky nahlašovat účty, které opakovaně odesílají nevyžádané zprávy. Mohou se najít špatné shody.
         title: Antispamová automatizace
       thumbnail:
-        desc_html: Používáno pro náhledy přes OpenGraph a API. Doporučuje se rozlišení 1200x630px
+        desc_html: Používáno pro náhledy přes OpenGraph a API. Doporučujeme rozlišení 1200x630px
         title: Miniatura serveru
       timeline_preview:
-        desc_html: Zobrazit na hlavní straně odkaz na veřejnou časovou osu a povolit přístup na veřejnou časovou osu pomocí API bez autentizace
+        desc_html: Zobrazit na hlavní stránce odkaz na veřejnou časovou osu a povolit přístup na veřejnou časovou osu pomocí API bez autentizace
         title: Povolit neautentizovaný přístup k časové ose
       title: Nastavení stránky
       trendable_by_default:
         desc_html: Ovlivňuje hashtagy, které nebyly dříve zakázány
-        title: Dovolit hashtagům zobrazit se na trendech bez předchozího posouzení
+        title: Povolit zobrazení hashtagů v trendech i bez předchozího posouzení
       trends:
-        desc_html: Veřejně zobrazit předtím schválené hashtagy, které jsou aktuálně populární
+        desc_html: Veřejně zobrazit populární hashtagy, které byly předtím schváleny
         title: Populární hashtagy
     statuses:
       back_to_account: Zpět na stránku účtu
@@ -535,7 +548,7 @@ cs:
       title: Tooty účtu
       with_media: S médii
     tags:
-      accounts_today: Jedinečná použití dnes
+      accounts_today: Dnešní jedinečná použití
       accounts_week: Jedinečná použití tento týden
       breakdown: Přehled dnešního používání podle zdroje
       context: Kontext
@@ -548,10 +561,10 @@ cs:
       review: Stav schválení
       reviewed: Schválen
       title: Hashtagy
-      trending_right_now: Aktuální trendy
-      unique_uses_today: "%{count} dnes píše"
-      unreviewed: Neposouzeno
-      updated_msg: Nastavení hashtagu bylo úspěšně aktualizováno
+      trending_right_now: Právě je trendy
+      unique_uses_today: Dnes použilo %{count} uživatelů
+      unreviewed: Nezkontrolováno
+      updated_msg: Nastavení hashtagů bylo úspěšně aktualizováno
     title: Administrace
     warning_presets:
       add_new: Přidat nové
@@ -561,62 +574,66 @@ cs:
       title: Spravovat předlohy pro varování
   admin_mailer:
     new_pending_account:
-      body: Detaily nového účtu jsou uvedeny níže. Můžete tento požadavek schválit nebo zamítnout.
-      subject: Nový účet čekající na posouzení na %{instance} (%{username})
+      body: Detaily nového účtu jsou uvedeny níže. Tuto žádost můžete schválit nebo zamítnout.
+      subject: Nový účet na serveru %{instance} čekající na posouzení (%{username})
     new_report:
-      body: "%{reporter} nahlásil/a uživatele %{target}"
-      body_remote: Někdo z %{domain} nahlásil uživatele %{target}
-      subject: Nové nahlášení pro %{instance} (#%{id})
+      body: Uživatel %{reporter} nahlásil uživatele %{target}
+      body_remote: Někdo z domény %{domain} nahlásil uživatele %{target}
+      subject: Nové hlášení pro %{instance} (#%{id})
     new_trending_tag:
-      body: 'Hashtag #%{name} je dnes populární, nebyl však dříve schválen. Nebude zobrazen veřejně, pokud to nedovolíte. Můžete také pouze uložit formulář tak, jak je, a nikdy o něm opět neslyšet.'
+      body: 'Hashtag #%{name} je dnes populární, ale nebyl dříve schválen. Pokud to nedovolíte, nebude veřejně zobrazen. Pokud tento formulář uložíte jak je, už o něm opět neuslyšíte.'
       subject: Nový hashtag ke schválení na %{instance} (#%{name})
   aliases:
     add_new: Vytvořit alias
     created_msg: Nový alias byl úspěšně vytvořen. Nyní můžete zahájit přesun ze starého účtu.
-    deleted_msg: Alias byl úspěšně odstraněn. Přesun z tamtoho účtu na tento již nebude možný.
+    deleted_msg: Alias byl úspěšně odstraněn. Přesun z jiného účtu na tento již nebude možný.
     hint_html: Chcete-li se přesunout z jiného účtu na tento, můžete si zde vytvořit alias, který je vyžadován předtím, než můžete pokračovat přesunem sledujících ze starého účtu na tento. Tato akce sama o sobě je <strong>neškodná a vratná</strong>. <strong>Přesun účtu se zahajuje ze starého účtu</strong>.
     remove: Odpojit alias
   appearance:
     advanced_web_interface: Pokročilé webové rozhraní
-    advanced_web_interface_hint: 'Chcete-li využít celé šířky vaší obrazovky, dovolí vám pokročilé webové rozhraní nastavit si mnoho různých sloupců, takže můžete vidět ve stejnou chvíli tolik informací, kolik chcete: domovskou časovou osu, oznámení, federovanou časovou osu a libovolný počet seznamů a hashtagů.'
+    advanced_web_interface_hint: 'Chcete-li využít celé šířky vaší obrazovky, dovolí vám pokročilé webové rozhraní nastavit si mnoho různých sloupců, takže ve stejnou chvíli uvidíte tolik informací, kolik chcete: domovskou časovou osu, oznámení, federovanou časovou osu a libovolný počet seznamů a hashtagů.'
     animations_and_accessibility: Animace a přístupnost
     confirmation_dialogs: Potvrzovací dialogy
     discovery: Objevování
+    localization:
+      body: Mastodon je přeložen do češtiny díky dobrovolníkům.
+      guide_link: https://cs.crowdin.com/project/mastodon
+      guide_link_text: Každý může pomoci.
     sensitive_content: Citlivý obsah
     toot_layout: Rozložení tootů
   application_mailer:
-    notification_preferences: Změnit volby e-mailu
+    notification_preferences: Změnit předvolby e-mailů
     salutation: "%{name},"
-    settings: 'Změnit volby e-mailu: %{link}'
+    settings: 'Změnit předvolby e-mailů: %{link}'
     view: 'Zobrazit:'
     view_profile: Zobrazit profil
     view_status: Zobrazit toot
   applications:
     created: Aplikace úspěšně vytvořena
     destroyed: Aplikace úspěšně smazána
-    invalid_url: Zadaná adresa URL je neplatná
+    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: Buďte s těmito daty velmi opatrní. Nikdy je s nikým nesdílejte!
+    warning: Zacházejte s těmito daty opatrně. Nikdy je s nikým nesdílejte!
     your_token: Váš přístupový token
   auth:
-    apply_for_account: Vyžádat si pozvánku
+    apply_for_account: Požádat o pozvánku
     change_password: Heslo
     checkbox_agreement_html: Souhlasím s <a href="%{rules_path}" target="_blank">pravidly serveru</a> a <a href="%{terms_path}" target="_blank">podmínkami používání</a>
     checkbox_agreement_without_rules_html: Souhlasím s <a href="%{terms_path}" target="_blank">podmínkami používání</a>
     delete_account: Odstranit účet
-    delete_account_html: Chcete-li odstranit svůj účet, <a href="%{path}">pokračujte zde</a>. Budete požádán/a o potvrzení.
+    delete_account_html: Chcete-li odstranit svůj účet, <a href="%{path}">pokračujte zde</a>. Budete požádáni o potvrzení.
     description:
-      prefix_invited_by_user: "@%{name} vás zve, abyste se přidal/a na tento server Mastodon!"
+      prefix_invited_by_user: "@%{name} vás zve na tento server Mastodon!"
       prefix_sign_up: Registrujte se na Mastodonu již dnes!
       suffix: S účtem budete moci sledovat lidi, psát příspěvky a vyměňovat si zprávy s uživateli z kteréhokoliv serveru Mastodon a dalších služeb!
-    didnt_get_confirmation: Neobdržel/a jste pokyny pro potvrzení?
-    forgot_password: Zapomněl/a jste heslo?
-    invalid_reset_password_token: Token pro obnovení hesla je buď neplatný, nebo vypršel. Prosím vyžádejte si nový.
+    didnt_get_confirmation: Neobdrželi jste pokyny pro potvrzení?
+    forgot_password: Zapomněli jste heslo?
+    invalid_reset_password_token: Token pro obnovení hesla je buď neplatný, nebo vypršel. Vyžádejte si prosím nový.
     login: Přihlásit
     logout: Odhlásit
     migrate_account: Přesunout se na jiný účet
-    migrate_account_html: Chcete-li přesměrovat tento účet na jiný, můžete to <a href="%{path}">nastavit zde</a>.
+    migrate_account_html: Zde můžete <a href="%{path}">nastavit přesměrování tohoto účtu na jiný</a>.
     or_log_in_with: Nebo se přihlaste pomocí
     providers:
       cas: CAS
@@ -628,21 +645,21 @@ cs:
     security: Zabezpečení
     set_new_password: Nastavit nové heslo
     setup:
-      email_below_hint_html: Pokud je níže uvedená e-mailová adresa nesprávná, můžete ji změnit zde a obdržet nový potvrzovací e-mail.
+      email_below_hint_html: Pokud je níže uvedená e-mailová adresa nesprávná, můžete ji změnit zde a nechat si poslat nový potvrzovací e-mail.
       email_settings_hint_html: Potvrzovací e-mail byl odeslán na %{email}. Pokud je tato adresa nesprávná, můžete ji změnit v nastavení účtu.
       title: Nastavení
     status:
       account_status: Stav účtu
-      confirming: Čekám na dokončení potvrzení e-mailu.
+      confirming: Čeká na dokončení potvrzení e-mailu.
       functional: Váš účet je zcela funkční.
-      pending: Váš požadavek čeká na schválení naším personálem. To může nějakou dobu trvat. Pokud bude váš požadavek schválen, obdržíte e-mail.
-      redirecting_to: Váš účet je neaktivní, protože právě přesměrovává na účet %{acct}.
-    trouble_logging_in: Problémy s přihlašováním?
+      pending: Vaše žádost čeká na schválení naším personálem. To může nějakou dobu trvat. Pokud bude váš požadavek schválen, obdržíte e-mail.
+      redirecting_to: Váš účet je neaktivní, protože je právě přesměrován na účet %{acct}.
+    trouble_logging_in: Problémy s přihlášením?
   authorize_follow:
     already_following: Tento účet již sledujete
     error: Při hledání vzdáleného účtu bohužel nastala chyba
     follow: Sledovat
-    follow_request: 'Poslal/a jste požadavek o sledování uživateli:'
+    follow_request: 'Poslali jste žádost o sledování uživateli:'
     following: 'Podařilo se! Nyní sledujete uživatele:'
     post_follow:
       close: Nebo můžete toto okno klidně zavřít.
@@ -651,7 +668,7 @@ cs:
     title: Sledovat uživatele %{acct}
   challenge:
     confirm: Pokračovat
-    hint_html: "<strong>Tip:</strong> Po dobu hodiny vás nebudeme znovu žádat o heslo."
+    hint_html: "<strong>Tip:</strong> Po dobu jedné hodiny vás o heslo nebudeme znovu žádat."
     invalid_password: Neplatné heslo
     prompt: Pokračujte potvrzením hesla
   datetime:
@@ -669,22 +686,22 @@ cs:
       x_months: "%{count} mesíců"
       x_seconds: "%{count} s"
   deletes:
-    challenge_not_passed: Informace, které jste zadal/a, nejsou správné
-    confirm_password: Zadejte svoje současné heslo pro ověření vaší identity
-    confirm_username: Zadáním svého uživatelského jména potvrdíte proces
+    challenge_not_passed: Zadané informace nejsou správné
+    confirm_password: Pro ověření vaší identity zadejte své současné heslo
+    confirm_username: Zadáním svého uživatelského jména proces potvrdíte
     proceed: Odstranit účet
     success_msg: Váš účet byl úspěšně odstraněn
     warning:
       before: 'Před pokračováním si prosím pečlivě přečtěte tyto poznámky:'
       caches: Obsah, který byl uložen do cache jiných serverů, nemusí být smazán
       data_removal: Vaše příspěvky a další data budou trvale smazána
-      email_change_html: Můžete si <a href="%{path}">změnit svou e-mailovou adresu</a> bez smazání účtu
+      email_change_html: Svou e-mailovou adresu můžete <a href="%{path}">změnit</a> i bez mazání účtu
       email_contact_html: Pokud stále nepřijde, můžete požádat o pomoc zasláním e-mailu na <a href="mailto:%{email}">%{email}</a>
       email_reconfirmation_html: Pokud neobdržíte potvrzovací e-mail, můžete si ho <a href="%{path}">vyžádat znovu</a>
-      irreversible: Nebudete moci obnovit nebo znovu aktivovat váš účet
-      more_details_html: Více detailů najdete v <a href="%{terms_path}">zásadách soukromí</a>.
+      irreversible: Váš účet nebude možné obnovit ani znovu aktivovat
+      more_details_html: Podrobnosti najdete v <a href="%{terms_path}">zásadách ochrany osobních údajů</a>.
       username_available: Vaše uživatelské jméno bude opět dostupné
-      username_unavailable: Vaše uživatelské jméno zůstane nedostupným
+      username_unavailable: Vaše uživatelské jméno zůstane nedostupné
   directories:
     directory: Adresář profilů
     explanation: Objevujte uživatele podle jejich zájmů
@@ -692,11 +709,11 @@ cs:
   domain_validator:
     invalid_domain: není platné doménové jméno
   errors:
-    '400': Požadavek, který jste odeslal/a, byl neplatný nebo poškozený.
+    '400': Žádost, kterou jste odeslali, byla neplatná nebo poškozená.
     '403': Nemáte povolení zobrazit tuto stránku.
     '404': Stránka, kterou hledáte, tu není.
-    '406': Tato stránka není dostupná v požadovaném formátu.
-    '410': Stránka, kterou hledáte, tu již neexistuje.
+    '406': Tato stránka není v požadovaném formátu dostupná.
+    '410': Stránka, kterou hledáte, tu již není.
     '422':
       content: Bezpečnostní ověření selhalo. Neblokujete cookies?
       title: Bezpečnostní ověření selhalo
@@ -712,22 +729,21 @@ cs:
   exports:
     archive_takeout:
       date: Datum
-      download: Stáhnout svůj archiv
+      download: Stáhnout váš archiv
       hint_html: Můžete si vyžádat archiv vašich <strong>tootů a nahraných médií</strong>. Exportovaná data budou ve formátu ActivityPub a budou čitelná kterýmkoliv kompatibilním softwarem. Archiv si můžete vyžádat každých 7 dní.
       in_progress: Kompiluji váš archiv…
-      request: Vyžádat svůj archiv
+      request: Vyžádat váš archiv
       size: Velikost
     blocks: Blokujete
     csv: CSV
-    domain_blocks: Blokace domén
-    follows: Sledujete
+    domain_blocks: Blokování domén
     lists: Seznamy
-    mutes: Skryl/a jste
+    mutes: Skryli jste
     storage: Paměť médií
   featured_tags:
     add_new: Přidat nový
     errors:
-      limit: Již jste zvýraznil/a maximální počet hashtagů
+      limit: Již jste zvýraznili maximální počet hashtagů
     hint_html: "<strong>Co jsou zvýrazněné hashtagy?</strong> Zobrazují se prominentně na vašem veřejném profilu a dovolují lidem prohlížet si vaše veřejné příspěvky konkrétně pod těmi hashtagy. Je to skvělý nástroj pro sledování kreativních děl nebo dlouhodobých projektů."
   filters:
     contexts:
@@ -738,10 +754,11 @@ cs:
     edit:
       title: Upravit filtr
     errors:
-      invalid_context: Nebylo poskytnuto nic, nebo má neplatný kontext
+      invalid_context: Nebyl poskytnut žádný nebo jen neplatný kontext
       invalid_irreversible: Nezvratné filtrování funguje pouze v souvislosti s domovskou osou či oznámeními
     index:
       delete: Smazat
+      empty: Nemáte žádný filtr.
       title: Filtry
     new:
       title: Přidat nový filtr
@@ -754,14 +771,14 @@ cs:
     all: Všechny
     changes_saved_msg: Změny byly úspěšně uloženy!
     copy: Kopírovat
-    no_batch_actions_available: Pro tuto stránku nejsou dostupny žádné souhrnné akce
-    order_by: Seřadit od
+    no_batch_actions_available: Pro tuto stránku nejsou dostupné žádné souhrnné akce
+    order_by: Seřadit podle
     save_changes: Uložit změny
     validation_errors:
-      few: Něco ještě není úplně v pořádku! Prosím zkontrolujte %{count} chyby níže
-      many: Něco ještě není úplně v pořádku! Prosím zkontrolujte %{count} chyb níže
-      one: Něco ještě není úplně v pořádku! Prosím zkontrolujte chybu níže
-      other: Něco ještě není úplně v pořádku! Prosím zkontrolujte %{count} chyb níže
+      few: Něco ještě není úplně v pořádku! Zkontrolujte prosím %{count} chyby uvedené níže
+      many: Něco ještě není úplně v pořádku! Zkontrolujte prosím %{count} chyb uvedených níže
+      one: Něco ještě není úplně v pořádku! Zkontrolujte prosím chybu uvedenou níže
+      other: Něco ještě není úplně v pořádku! Zkontrolujte prosím %{count} chyb uvedených níže
   html_validator:
     invalid_markup: 'obsahuje neplatný HTML kód: %{error}'
   identity_proofs:
@@ -769,11 +786,11 @@ cs:
     authorize: Ano, autorizovat
     authorize_connection_prompt: Autorizovat toto kryptografické spojení?
     errors:
-      failed: Kryptografické spojení selhalo. Prosím zkuste to znovu z %{provider}.
+      failed: Kryptografické spojení selhalo. Zkuste to prosím znovu z %{provider}.
       keybase:
-        invalid_token: Tokeny Keybase jsou hashe podpisů a musí být 66 znaků dlouhé
-        verification_failed: Keybase nerozpoznává tento token jako podpis uživatele %{kb_username} na Keybase. Prosím zkuste to znovu z Keybase.
-      wrong_user: Nelze vytvořit důkaz pro uživatele %{proving}, zatímco jste přihlášen/a jako %{current}. Přihlaste se jako %{proving} a zkuste to znovu.
+        invalid_token: Keybase tokeny jsou hashe podpisů a musí být dlouhé 66 hexadecimálních znaků
+        verification_failed: Keybase nerozpoznává tento token jako podpis uživatele %{kb_username} na Keybase. Zkuste to prosím znovu z Keybase.
+      wrong_user: Nelze vytvořit důkaz pro uživatele %{proving}, zatímco jste přihlášeni jako %{current}. Přihlaste se jako %{proving} a zkuste to znovu.
     explanation_html: Zde můžete kryptograficky připojit vaše ostatní identity, například profil Keybase. To dovolí jiným lidem vám posílat šifrované zprávy a důvěřovat obsahu, který jim pošlete.
     i_am_html: Na %{service} jsem %{username}.
     identity: Identita
@@ -788,7 +805,7 @@ cs:
       merge_long: Ponechat existující záznamy a přidat nové
       overwrite: Přepsat
       overwrite_long: Nahradit aktuální záznamy novými
-    preface: Můžete importovat data, která jste exportoval/a z jiného serveru, jako například seznam lidí, které sledujete či blokujete.
+    preface: Můžete importovat data, která jste exportovali z jiného serveru, jako například seznam lidí, které sledujete či blokujete.
     success: Vaše data byla úspěšně nahrána a nyní budou zpracována v daný čas
     types:
       blocking: Seznam blokovaných
@@ -796,26 +813,26 @@ cs:
       following: Seznam sledovaných
       muting: Seznam ignorovaných
     upload: Nahrát
-  in_memoriam_html: Navždy budeme vzpomínat.
+  in_memoriam_html: In Memoriam.
   invites:
     delete: Deaktivovat
-    expired: Vypršelé
+    expired: Expirováno
     expires_in:
       '1800': 30 minut
       '21600': 6 hodin
-      '3600': 1 hodinu
+      '3600': 1 hodina
       '43200': 12 hodin
       '604800': 1 týden
       '86400': 1 den
     expires_in_prompt: Nikdy
     generate: Vygenerovat pozvánku
-    invited_by: 'Byl/a jste pozván/a uživatelem:'
+    invited_by: 'Pozval váš uživatel:'
     max_uses:
       few: "%{count} použití"
       many: "%{count} použití"
       one: 1 použití
       other: "%{count} použití"
-    max_uses_prompt: Bez limitu
+    max_uses_prompt: Bez omezení
     prompt: Vygenerujte a sdílejte s ostatními odkazy a umožněte jim přístup na tento server
     table:
       expires_at: Vyprší
@@ -823,7 +840,7 @@ cs:
     title: Pozvat lidi
   lists:
     errors:
-      limit: Dosáhl/a jste maximálního počtu seznamů
+      limit: Dosáhli jste maximálního počtu seznamů
   media_attachments:
     validations:
       images_and_video: K tootu, který již obsahuje obrázky, nelze připojit video
@@ -834,42 +851,42 @@ cs:
     cancel_explanation: Zrušením přesměrování znovu aktivujete svůj aktuální účet, ale nevrátí se vám sledující, kteří byli přesměrováni na druhý účet.
     cancelled_msg: Přesměrování bylo úspěšně zrušeno.
     errors:
-      already_moved: je stejný účet, na který jste se již přesunul/a
+      already_moved: je stejný účet, na který jste se již přesunuli
       missing_also_known_as: neodkazuje na tento účet
       move_to_self: nemůže být aktuální účet
-      not_found: nemohl být nalezen
+      not_found: nebyl nalezen
       on_cooldown: Probíhá období odpočinku
     followers_count: Sledující v době přesunu
     incoming_migrations: Přesun z jiného účtu
     incoming_migrations_html: Chcete-li se přesunout z jiného účtu na tento, potřebujete si nejprve <a href="%{path}">vytvořit alias účtu</a>.
-    moved_msg: Váš účet nyní přesměrovává na účet %{acct} a vaši sledující se na něj přesouvají.
-    not_redirecting: Váš účet aktuálně nepřesměrovává na žádný jiný účet.
-    on_cooldown: Nedávno jste přesunul/a svůj účet. Tato funkce bude opět dostupná za %{count} dní.
+    moved_msg: Váš účet se nyní přesměrovává na účet %{acct} a vaši sledující se na něj přesouvají.
+    not_redirecting: Váš účet se aktuálně nepřesměrovává na žádný jiný účet.
+    on_cooldown: Nedávno jste svůj účet přesunuli. Tato funkce bude opět dostupná za %{count} dní.
     past_migrations: Předchozí přesuny
     proceed_with_move: Přesunout sledující
-    redirecting_to: Váš účet přesměrovává na účet %{acct}.
+    redirecting_to: Váš účet se přesměrovává na účet %{acct}.
     set_redirect: Nastavit přesměrování
     warning:
       backreference_required: Nový účet musí být nejprve nastaven, aby odkazoval zpátky na tento
       before: 'Před pokračováním si prosím pečlivě přečtěte tyto poznámky:'
       cooldown: Po přesunu nastane období odpočinku, kdy se nebudete moci opět přesunout
       disabled_account: Váš aktuální účet nebude poté zcela použitelný. Budete však mít přístup k datovým exportům a budete ho moci znovu aktivovat.
-      followers: Touto akcí přesunete všechny sledující z aktuálního účtu na nový účet
+      followers: Touto akcí přesunete všechny sledující z aktuálního účtu na nový
       only_redirect_html: Alternativně můžete <a href="%{path}">nastavit pouze přesměrování na váš profil</a>.
       other_data: Žádná další data nebudou přesunuta automaticky
-      redirect: Profil vašeho aktuálního účtu bude aktualizován s oznámením o přesměrování a bude vyloučen z hledání
+      redirect: Profil vašeho aktuálního účtu bude aktualizován s oznámením o přesměrování a bude vyloučen z výsledků hledání
   moderation:
     title: Moderování
   notification_mailer:
     digest:
       action: Zobrazit všechna oznámení
-      body: Zde najdete stručný souhrn zpráv, které jste zmeškal/a od vaší poslední návštěvy %{since}
-      mention: "%{name} vás zmínil/a v:"
+      body: Zde najdete stručný souhrn zpráv, které jste zmeškali od vaší poslední návštěvy %{since}
+      mention: 'Uživatel %{name} vás zmínil v:'
       new_followers_summary:
-        few: Navíc jste získal/a %{count} nové sledující, zatímco jste byl/a pryč! Skvělé!
-        many: Navíc jste získal/a %{count} nových sledujících, zatímco jste byl/a pryč! Úžasné!
-        one: Navíc jste získal/a jednoho nového sledujícího, zatímco jste byl/a pryč! Hurá!
-        other: Navíc jste získal/a %{count} nových sledujících, zatímco jste byl/a pryč! Úžasné!
+        few: Zatímco jste byli pryč jste navíc získali %{count} nové sledující! Skvělé!
+        many: Zatímco jste byli pryč jste navíc získali %{count} nových sledujících! Úžasné!
+        one: Zatímco jste byli pryč jste navíc získali jednoho nového sledujícího! Hurá!
+        other: Zatímco jste byli pryč jste navíc získali %{count} nových sledujících! Úžasné!
       subject:
         few: "%{count} nová oznámení od vaší poslední návštěvy \U0001F418"
         many: "%{count} nových oznámení od vaší poslední návštěvy \U0001F418"
@@ -877,27 +894,31 @@ cs:
         other: "%{count} nových oznámení od vaší poslední návštěvy \U0001F418"
       title: Ve vaší nepřítomnosti…
     favourite:
-      body: 'Váš toot si oblíbil/a %{name}:'
-      subject: "%{name} si oblíbil/a váš toot"
+      body: 'Váš toot si oblíbil uživatel %{name}:'
+      subject: Uživatel %{name} si oblíbil váš toot
       title: Nové oblíbení
     follow:
-      body: "%{name} vás nyní sleduje!"
-      subject: "%{name} vás nyní sleduje"
+      body: Uživatel %{name} vás nyní sleduje!
+      subject: Uživatel %{name} vás nyní sleduje
       title: Nový sledující
     follow_request:
-      action: Spravovat požadavky o sledování
-      body: "%{name} požádal/a o povolení vás sledovat"
+      action: Spravovat žádosti o sledování
+      body: Uživatel %{name} požádal o povolení vás sledovat
       subject: 'Čekající sledující: %{name}'
-      title: Nový požadavek o sledování
+      title: Nová žádost o sledování
     mention:
       action: Odpovědět
-      body: 'Byl/a jste zmíněn/a uživatelem %{name} v:'
-      subject: Byl/a jste zmíněn/a uživatelem %{name}
+      body: 'Uživatel %{name} vás zmínil v:'
+      subject: Uživatel %{name} vás zmínil
       title: Nová zmínka
     reblog:
-      body: 'Váš toot byl boostnutý uživatelem %{name}:'
-      subject: "%{name} boostnul/a váš toot"
+      body: 'Uživatel %{name} boostnul váš toot:'
+      subject: Uživatel %{name} boostnul váš toot
       title: Nový boost
+  notifications:
+    email_events: Události pro e-mailová oznámení
+    email_events_hint: 'Vyberte události, pro které chcete dostávat oznámení:'
+    other_settings: Další nastavení oznámení
   number:
     human:
       decimal_units:
@@ -912,18 +933,19 @@ cs:
     newer: Novější
     next: Další
     older: Starší
-    prev: Před
+    prev: Předchozí
     truncate: "&hellip;"
   polls:
     errors:
-      already_voted: V této anketě jste již hlasoval/a
+      already_voted: V této anketě jste již hlasovali
       duplicate_options: obsahuje duplicitní položky
       duration_too_long: je příliš daleko v budoucnosti
       duration_too_short: je příliš brzy
       expired: Anketa již skončila
-      over_character_limit: nesmí být každá delší než %{max} znaků
+      invalid_choice: Zvolená možnost hlasování neexistuje
+      over_character_limit: nesmí být žádná delší než %{max} znaků
       too_few_options: musí mít více než jednu položku
-      too_many_options: nesmí obsahovat více než %{max} položky
+      too_many_options: nesmí obsahovat více než %{max} položek
   preferences:
     other: Ostatní
     posting_defaults: Výchozí možnosti psaní
@@ -931,23 +953,25 @@ cs:
   relationships:
     activity: Aktivita účtu
     dormant: Nečinné
-    last_active: Naposledy aktivních
-    most_recent: Naposledy přidaných
+    followers: Sledující
+    following: Sledovaní
+    last_active: Naposledy aktivní
+    most_recent: Nejnovější
     moved: Přesunuté
     mutual: Vzájemné
     primary: Primární
     relationship: Vztah
-    remove_selected_domains: Odstranit všechny sledující ze zvolených domén
-    remove_selected_followers: Odstranit zvolené sledující
-    remove_selected_follows: Přestat sledovat zvolené uživatele
+    remove_selected_domains: Odstranit všechny sledující z vybraných domén
+    remove_selected_followers: Odstranit vybrané sledující
+    remove_selected_follows: Přestat sledovat vybrané uživatele
     status: Stav účtu
   remote_follow:
     acct: Napište svou přezdívku@doménu, ze které chcete jednat
-    missing_resource: Nemůžeme najít požadované přesměrovací URL pro váš účet
-    no_account_html: Ještě nemáte účet? Můžete se <a href='%{sign_up_path}' target='_blank'>registrovat zde</a>
+    missing_resource: Nemůžeme najít požadovanou přesměrovávací URL adresu pro váš účet
+    no_account_html: Ještě nemáte účet? Tady se můžete <a href='%{sign_up_path}' target='_blank'>zaregistrovat</a>
     proceed: Pokračovat ke sledování
     prompt: 'Budete sledovat:'
-    reason_html: "<strong>Proč je tento krok nutný?</strong> <code>%{instance}</code> nemusí být serverem, na kterém jste registrován/a, proto vás musíme nejdříve přesměrovat na váš domovský server."
+    reason_html: "<strong>Proč je tento krok nutný?</strong> <code>%{instance}</code> nemusí být serverem, na kterém jste registrováni, a proto vás musíme nejdříve přesměrovat na váš domovský server."
   remote_interaction:
     favourite:
       proceed: Pokračovat k oblíbení
@@ -956,11 +980,11 @@ cs:
       proceed: Pokračovat k boostnutí
       prompt: 'Chcete boostnout tento toot:'
     reply:
-      proceed: Pokračovat k odpovězení
+      proceed: Pokračovat k odpovědi
       prompt: 'Chcete odpovědět na tento toot:'
   scheduled_statuses:
-    over_daily_limit: Překročil/a jste limit %{limit} plánovaných tootů pro tento den
-    over_total_limit: Překročil/a jste limit %{limit} plánovaných tootů
+    over_daily_limit: Překročili jste limit %{limit} tootů naplánovaných na tento den
+    over_total_limit: Překročili jste limit %{limit} naplánovaných tootů
     too_soon: Plánované datum musí být v budoucnosti
   sessions:
     activity: Nejnovější aktivita
@@ -984,24 +1008,24 @@ cs:
       uc_browser: UCBrowser
       weibo: Weibo
     current_session: Aktuální relace
-    description: "%{browser} na %{platform}"
+    description: "%{browser} na systému %{platform}"
     explanation: Tohle jsou webové prohlížeče aktuálně přihlášené na váš účet Mastodon.
     ip: IP adresa
     platforms:
       adobe_air: Adobe Air
-      android: Androidu
+      android: Android
       blackberry: Blackberry
       chrome_os: Chrome OS
       firefox_os: Firefox OS
       ios: iOS
-      linux: Linuxu
-      mac: Macu
-      other: neznámé platformě
+      linux: Linux
+      mac: Mac
+      other: neznámá platforma
       windows: Windows
       windows_mobile: Windows Mobile
       windows_phone: Windows Phone
-    revoke: Zamítnout
-    revoke_success: Relace úspěšně zamítnuta
+    revoke: Zrušit
+    revoke_success: Relace úspěšně zrušena
     title: Relace
   settings:
     account: Účet
@@ -1025,7 +1049,7 @@ cs:
     relationships: Sledovaní a sledující
     two_factor_authentication: Dvoufázové ověřování
   spam_check:
-    spam_detected: Tohle je automatizované nahlášení. Byl detekován spam.
+    spam_detected: Tohle je automatizované hlášení. Byl detekován spam.
   statuses:
     attached:
       description: 'Přiloženo: %{attached}'
@@ -1048,12 +1072,12 @@ cs:
       other: 'obsahoval nepovolené hashtagy: %{tags}'
     language_detection: Zjistit jazyk automaticky
     open_in_web: Otevřít na webu
-    over_character_limit: limit %{max} znaků byl překročen
+    over_character_limit: byl překročen limit %{max} znaků
     pin_errors:
-      limit: Už jste si připnul/a maximální počet tootů
+      limit: Už jste si připnuli maximální počet tootů
       ownership: Nelze připnout toot někoho jiného
-      private: Nelze připnout neveřejné tooty
-      reblog: Nelze připnout boost
+      private: Neveřejné tooty nelze připnout
+      reblog: Boosty nelze připnout
     poll:
       total_people:
         few: "%{count} lidé"
@@ -1067,15 +1091,15 @@ cs:
         other: "%{count} hlasů"
       vote: Hlasovat
     show_more: Zobrazit více
-    sign_in_to_participate: Chcete-li se účastnit této konverzace, přihlaste se
+    sign_in_to_participate: Chcete-li se zúčastnit této konverzace, přihlaste se
     title: "%{name}: „%{quote}“"
     visibilities:
       private: Pouze pro sledující
       private_long: Zobrazit pouze sledujícím
       public: Veřejné
-      public_long: Všichni mohou vidět
+      public_long: Uvidí kdokoliv
       unlisted: Neuvedené
-      unlisted_long: Všichni mohou vidět, ale nebudou zahrnuty ve veřejných časových osách
+      unlisted_long: Uvidí kdokoliv, ale nebude zahrnut ve veřejných časových osách
   stream_entries:
     pinned: Připnutý toot
     reblogged: boostnul/a
@@ -1084,33 +1108,33 @@ cs:
     does_not_match_previous_name: se neshoduje s předchozím názvem
   terms:
     body_html: |
-      <h2>Zásady soukromí</h2>
+      <h2>Zásady ochrany osobních údajů</h2>
       <h3 id="collect">Jaké informace sbíráme?</h3>
 
       <ul>
-      <li><em>Základní informace o účtu</em>: Pokud se na tomto serveru zaregistrujete, můžeme vás požádat o zadání uživatelského jména, e-mailové adresy a hesla. Můžete také zadat dodatečné profilové informace, jako například zobrazované jméno a krátký životopis, a nahrát si profilovou fotografii a obrázek záhlaví. Uživatelské i zobrazované jméno, životopis, profilová fotografie a obrázek záhlaví jsou vždy uvedeny veřejně.</li>
-      <li><em>Příspěvky, sledující a další veřejné informace</em>: Seznam lidí, které sledujete, je uveden veřejně, totéž platí i pro vaše sledující. Když sem nahrajete zprávu, bude uloženo datum a čas, společně s aplikací, ze které jste zprávu odeslali. Zprávy mohou obsahovat mediální přílohy, jako jsou obrázky a videa. Veřejné a neuvedené příspěvky jsou dostupné veřejně. Pokud na vašem profilu uvedete příspěvek, je to také veřejně dostupná informace. Vaše příspěvky jsou doručeny vašim sledujícím, což v některých případech znamená, že budou doručeny na různé servery, na kterých budou ukládány kopie. Pokud příspěvky smažete, bude tohle taktéž doručeno vašim sledujícím. Akce znovusdílení nebo oblíbení jiného příspěvku je vždy veřejná.</li>
-      <li><em>Příspěvky přímé a pouze pro sledující</em>: Všechny příspěvky jsou uloženy a zpracovány na serveru. Příspěvky pouze pro sledující jsou doručeny vašim sledujícím a uživatelům v nich zmíněným a přímé příspěvky jsou doručeny pouze uživatelům v nich zmíněným. V některých případech tohle znamená, že budou doručeny na různé servery, na kterých budou ukládány kopie. Upřímně se snažíme omezit přístup k těmto příspěvkům pouze na autorizované uživatele, ovšem jiné servery tak nemusejí učinit. Proto je důležité posoudit servery, ke kterým vaši sledující patří. V nastavení si můžete zapnout volbu pro manuální schvalování či odmítnutí nových sledujících. <em>Prosím mějte na paměti, že operátoři tohoto serveru a kteréhokoliv přijímacího serveru mohou tyto zprávy vidět</em> a příjemci mohou vytvořit jejich snímek, zkopírovat je, nebo je jinak sdílet. <em>Nesdílejte přes Mastodon jakékoliv nebezpečné informace.</em></li>
-      <li><em>IP adresy a další metadata</em>: Když se přihlásíte, zaznamenáváme IP adresu, ze které se přihlašujete, jakožto i název vašeho webového prohlížeče. Všechny vaše webové relace jsou v nastavení přístupné k vašemu posouzení a odvolání. Nejpozdější IP adresa použita je uložena maximálně do 12 měsíců. Můžeme také uchovávat serverové záznamy, které obsahují IP adresy každého požadavku odeslaného na náš server.</li>
+      <li><em>Základní informace o účtu</em>: Pokud se na tomto serveru zaregistrujete, můžeme vás požádat o zadání uživatelského jména, e-mailové adresy a hesla. Můžete také zadat dodatečné profilové informace, jako například zobrazované jméno, krátký životopis, nebo si nahrát profilovou fotografii a obrázek záhlaví. Uživatelské i zobrazované jméno, životopis, profilová fotografie a obrázek záhlaví jsou vždy veřejně dostupné.</li>
+      <li><em>Příspěvky, sledující a další veřejné informace</em>: Seznam lidí, které sledujete, je uveden veřejně, totéž platí i pro uživatele sledující vás. Pro každou vámi napsanou zprávu, bude uloženo datum a čas a informace o aplikaci, ze které jste zprávu odeslali. Zprávy mohou obsahovat mediální přílohy, jako jsou obrázky a videa. Veřejné a neuvedené příspěvky jsou dostupné veřejně. Pokud na vašem profilu uvedete příspěvek, bude také dostupný veřejně. Vaše příspěvky jsou doručeny uživatelům, kteří vás sledují, což v některých případech znamená, že budou příspěvky doručeny na různé servery, na kterých budou ukládány jejich kopie. Pokud příspěvky smažete, bude tato akce taktéž doručeno vašim sledujícím. Akce opětovného sdílení nebo oblíbení jiného příspěvku je vždy veřejná.</li>
+      <li><em>Příspěvky přímé a pouze pro sledující</em>: Všechny příspěvky jsou na serveru uloženy a zpracovány. Příspěvky pouze pro sledující jsou doručeny uživatelům, kteří vás sledují, a uživatelům v příspěvcích zmíněným. Přímé příspěvky jsou doručeny pouze uživatelům v nich zmíněným. V některých případech to znamená, že budou příspěvky doručeny na různé servery, na kterých budou ukládány jejich kopie. Upřímně se snažíme omezit přístup k těmto příspěvkům pouze na autorizované uživatele, ovšem ostatní servery tak činit nemusí. Proto je důležité posoudit servery, ke kterým uživatelé, kteří vás sledují patří. V nastavení si můžete zapnout volbu pro manuální schvalování či odmítnutí nových sledujících. <em>Mějte prosím na paměti, že správci tohoto serveru a kteréhokoliv přijímacího serveru mohou tyto zprávy vidět</em> a příjemci mohou vytvořit jejich snímek, zkopírovat je, nebo je jinak sdílet. <em>Nesdílejte přes Mastodon žádné nebezpečné informace.</em></li>
+      <li><em>IP adresy a další metadata</em>: Při vašem přihlášení zaznamenáváme IP adresu, ze které se přihlašujete, a název vašeho webového prohlížeče. Všechny vaše webové relace jsou v nastavení přístupné k vašemu posouzení a odvolání. Poslední použitá IP adresa je uložena maximálně po dobu 12 měsíců. Můžeme také uchovávat serverové záznamy, které obsahují IP adresy každého požadavku odeslaného na náš server.</li>
       </ul>
 
       <hr class="spacer" />
 
-      <h3 id="use">Na co používáme vaše informace?</h3>
+      <h3 id="use">Na co vaše údaje používáme?</h3>
 
-      <p>Jakékoliv informace, které sbíráme, mohou být použity následujícími způsoby:</p>
+      <p>Všechna data, která sbíráme, mohou být použita následujícími způsoby:</p>
 
       <ul>
-      <li>K poskytnutí základních funkcí Mastodonu. Interagovat s obsahem od jiných lidí a přispívat svým vlastním obsahem můžete pouze, pokud jste přihlášeni. Můžete například sledovat jiné lidi a zobrazit si jejich kombinované příspěvky ve vaší vlastní personalizované časové ose.</li>
-      <li>Pro pomoc moderování komunity, například porovnáním vaší IP adresy s dalšími známými adresami pro určení vyhýbání se zákazům či jiných přestupků.</li>
-      <li>E-mailová adresa, kterou nám poskytnete, může být použita pro zasílání informací, oznámení o interakcích jiných uživatelů s vaším obsahem nebo přijatých zprávách a k odpovědím na dotazy a/nebo další požadavky či otázky.</li>
+      <li>K poskytnutí základních funkcí Mastodonu. K interakci s obsahem od jiných lidí a přispívat svým vlastním obsahem můžete pouze, pokud jste přihlášeni. Můžete například sledovat jiné lidi a zobrazit si jejich kombinované příspěvky ve vaší vlastní personalizované časové ose.</li>
+      <li>Pro pomoc moderování komunity, například porovnáním vaší IP adresy s dalšími známými adresami pro detekci obcházení zákazů či jiných přestupků.</li>
+      <li>E-mailová adresa, kterou nám poskytnete, může být použita pro zasílání informací, oznámení o interakcích jiných uživatelů s vaším obsahem nebo přijatých zprávách, a k odpovědím na dotazy a/nebo další požadavky či otázky.</li>
       </ul>
 
       <hr class="spacer" />
 
-      <h3 id="protect">Jak vaše informace chráníme?</h3>
+      <h3 id="protect">Jak vaše data chráníme?</h3>
 
-      <p>Implenentujeme různá bezpečnostní opatření pro udržování bezpečnosti vašich osobních dat, když zadáváte, odesíláte, či přistupujete k vašim osobním datům. Mimo jiné je vaše relace v prohlížeči, jakož i provoz mezi vašimi aplikacemi a API, zabezpečena pomocí SSL, a vaše heslo je hashováno pomocí silného jednosměrného algoritmu. Pro větší zabezpečení vašeho účtu můžete povolit dvoufázové ověřování.</p>
+      <p>Když zadáváte, odesíláte, či přistupujete k vašim osobním datům, implementujeme různá bezpečnostní opatření pro udržování bezpečnosti vašich osobních dat. Mimo jiné je vaše relace v prohlížeči, jakož i provoz mezi vašimi aplikacemi a API, zabezpečena pomocí SSL, a vaše heslo je hashováno pomocí silného jednosměrného algoritmu. Pro větší zabezpečení vašeho účtu můžete povolit dvoufázové ověřování.</p>
 
       <hr class="spacer" />
 
@@ -1119,19 +1143,19 @@ cs:
       <p>Budeme se upřímně snažit:</p>
 
       <ul>
-      <li>Uchovávat serverové záznamy obsahující IP adresy všech požadavků pro tento server, pokud se takové záznamy uchovávají, maximálně 90 dní.</li>
+      <li>Uchovávat serverové záznamy obsahující IP adresy všech požadavků na tento server, pokud se takové záznamy uchovávají, maximálně 90 dní.</li>
       <li>Uchovávat IP adresy související s registrovanými uživateli maximálně 12 měsíců.</li>
       </ul>
 
-      <p>Kdykoliv si můžete vyžádat a stáhnout archiv vašeho obsahu, včetně vašich příspěvků, mediálních příloh, profilové fotografie a obrázku záhlaví.</p>
+      <p>Kdykoliv si můžete vyžádat a stáhnout archiv svého obsahu, včetně příspěvků, mediálních příloh, profilové fotografie a obrázku záhlaví.</p>
 
-      <p>Kdykoliv můžete nenávratně smazat váš účet.</p>
+      <p>Kdykoliv můžete nenávratně smazat svůj účet.</p>
 
       <hr class="spacer"/>
 
       <h3 id="cookies">Používáme cookies?</h3>
 
-      <p>Ano. Cookies jsou malé soubory, které stránka nebo její poskytovatel uloží na pevný disk vašeho počítače (pokud to dovolíte). Tyto cookies umožňují stránce rozpoznat váš prohlížeč, a pokud máte registrovaný účet, přidružit ho s vaším registrovaným účtem.</p>
+      <p>Ano. Cookies jsou malé soubory, které stránka nebo její poskytovatel uloží do vašeho počítače (pokud to dovolíte). Tyto cookies umožňují stránce rozpoznat váš prohlížeč, a pokud máte registrovaný účet, přidružit ho s vaším registrovaným účtem.</p>
 
       <p>Používáme cookies pro pochopení a ukládání vašich předvoleb pro budoucí návštěvy.</p>
 
@@ -1139,32 +1163,32 @@ cs:
 
       <h3 id="disclose">Zveřejňujeme jakékoliv informace třetím stranám?</h3>
 
-      <p>Vaše osobně identifikovatelné informace neprodáváme, neobchodujeme s nimi, ani je nijak nepřenášíme vnějším stranám. Do tohoto se nepočítají důvěryhodné třetí strany, které nám pomáhají provozovat naši stránku, podnikat, nebo vás obsluhovat, pokud tyto strany souhlasí se zachováním důvěrnosti těchto informací. Můžeme také uvolnit vaše informace, pokud věříme, že je to nutné pro soulad se zákonem, prosazování našich zásad, nebo ochranu práv, majetku, či bezpečnost nás či ostatních.</p>
+      <p>Vaše osobně identifikovatelné informace neprodáváme, neobchodujeme s nimi, ani je nijak nepřenášíme vnějším stranám. Nepočítáme do toho důvěryhodné třetí strany, které nám pomáhají provozovat naši stránku, podnikat, nebo vás obsluhovat, pokud tyto strany souhlasí se zachováním důvěrnosti těchto informací. Vaše informace můžete uvolnit, pokud věříme, že je to nutné pro soulad se zákonem, prosazování našich zásad, nebo ochranu práv, majetku, či bezpečnost nás či ostatních.</p>
 
-      <p>Váš veřejný obsah může být stažen jinými servery na síti. Vaše příspěvky veřejné a pouze pro sledující budou doručeny na servery vašich sledujících a přímé zprávy budou doručeny na servery příjemců, pokud jsou tito sledující nebo příjemci zaregistrováni na jiném serveru, než je tento.</p>
+      <p>Váš veřejný obsah může být stažen jinými servery na síti. Vaše příspěvky veřejné a pouze pro sledující budou doručeny na servery uživatelů, kteří vás sledují, a přímé zprávy budou doručeny na servery příjemců, pokud jsou tito sledující nebo příjemci zaregistrováni na jiném serveru, než je tento.</p>
 
-      <p>Když autorizujete aplikaci, aby používala váš účet, může, v závislosti na rozsahu oprávnění, které jí udělíte, přistupovat k vašim veřejným profilovým informacím, seznamu lidí, které sledujete, vašim sledujícím, vašim seznamům, všem vašim příspěvkům a příspěvkům, které jste si oblíbili. Aplikace nikdy nemohou získat vaši e-mailovou adresu či heslo.</p>
+      <p>Při autorizaci aplikace k používání vašeho účtu může, v závislosti na rozsahu udělených oprávnění, přistupovat k vašim veřejným profilovým informacím, seznamu lidí, které sledujete, vašim sledujícím, vašim seznamům, všem vašim příspěvkům a příspěvkům, které jste si oblíbili. Aplikace nikdy nemohou získat vaši e-mailovou adresu ani heslo.</p>
 
       <hr class="spacer" />
 
       <h3 id="children">Používání stránky dětmi</h3>
 
-      <p>Pokud se tento server nachází v EU nebo EHP: Naše stránka, produkty a služby jsou všechny směřovány na lidi, kterým je alespoň 16 let. Pokud je vám méně než 16, dle požadavků nařízení GDPR (<a href="https://cs.wikipedia.org/wiki/Obecn%C3%A9_na%C5%99%C3%ADzen%C3%AD_o_ochran%C4%9B_osobn%C3%ADch_%C3%BAdaj%C5%AF">Obecné nařízení o ochraně osobních údajů</a>) tuto stránku nepoužívejte.</p>
+      <p>Pokud se tento server nachází v EU nebo EHP: Naše stránka, produkty a služby jsou určeny lidem, kterým je alespoň 16 let. Pokud je vám méně než 16 let, dle požadavků nařízení GDPR (<a href="https://cs.wikipedia.org/wiki/Obecn%C3%A9_na%C5%99%C3%ADzen%C3%AD_o_ochran%C4%9B_osobn%C3%ADch_%C3%BAdaj%C5%AF">Obecné nařízení o ochraně osobních údajů</a>) tuto stránku nepoužívejte.</p>
 
-      <p>Pokud se tento server nachází v USA: Naše stránka, produkty a služby jsou všechny směřovány na lidi, kterým je alespoň 13 let. Pokud je vám méně než 13, dle požadavků zákona COPPA (<a href="https://cs.wikipedia.org/wiki/Children%27s_online_privacy_protection_act">Children's Online Privacy Protection Act</a>) tuto stránku nepoužívejte.</p>
+      <p>Pokud se tento server nachází v USA: Naše stránka, produkty a služby jsou učeny lidem, kterým je alespoň 13 let. Pokud je vám méně než 13 let, dle požadavků zákona COPPA (<a href="https://cs.wikipedia.org/wiki/Children%27s_online_privacy_protection_act">Children's Online Privacy Protection Act</a>) tuto stránku nepoužívejte.</p>
 
       <p>Právní požadavky mohou být jiné, pokud se tento server nachází v jiné jurisdikci.</p>
 
       <hr class="spacer" />
 
-      <h3 id="changes">Změny v našich zásadách soukromí</h3>
+      <h3 id="changes">Změny v našich zásadách ochrany osobních údajů</h3>
 
-      <p>Rozhodneme-li se naše zásady soukromí změnit, zveřejníme tyto změny na této stránce.</p>
+      <p>Rozhodneme-li se naše zásady ochrany osobních údajů změnit, zveřejníme tyto změny na této stránce.</p>
 
       <p>Tento dokument je dostupný pod licencí CC-BY-SA. Byl naposledy aktualizován 7. března 2018.</p>
 
-      <p>Původně adaptováno ze <a href="https://github.com/discourse/discourse">zásad soukromí Discourse</a>.</p>
-    title: Podmínky používání a zásady soukromí %{instance}
+      <p>Původně adaptováno ze <a href="https://github.com/discourse/discourse">zásad ochrna osobních údajů projektem Discourse</a>.</p>
+    title: Podmínky používání a zásady ochrany osobních údajů na serveru %{instance}
   themes:
     contrast: Mastodon (vysoký kontrast)
     default: Mastodon (tmavý)
@@ -1175,57 +1199,57 @@ cs:
       month: "%b %Y"
   two_factor_authentication:
     code_hint: Pro potvrzení zadejte kód vygenerovaný vaší ověřovací aplikací
-    description_html: Povolíte-li <strong>dvoufázové ověřování</strong>, budete při přihlášení potřebovat telefon, který vám vygeneruje přístupové tokeny, které musíte zadat.
-    disable: Zakázat
-    enable: Povolit
-    enabled: Dvoufázové ověřování je povoleno
-    enabled_success: Dvoufázové ověřování bylo úspěšně povoleno
+    description_html: Zapnete-li <strong>dvoufázové ověřování</strong>, budete pro přihlašování potřebovat telefon, který vám vygeneruje přístupové tokeny, které musíte zadat.
+    disable: Vypnout
+    enable: Zapnout
+    enabled: Dvoufázové ověřování je zapnuto
+    enabled_success: Dvoufázové ověřování bylo úspěšně zapnuto
     generate_recovery_codes: Vygenerovat záložní kódy
-    instructions_html: "<strong>Naskenujte tento QR kód Google Authenticatorem nebo jinou TOTP aplikací na vašem telefonu</strong>. Od teď bude tato aplikace generovat tokeny, které budete muset zadat při přihlášení."
+    instructions_html: "<strong>Naskenujte tento QR kód Google Authenticatorem nebo jinou TOTP aplikací na svém telefonu</strong>. Od teď bude tato aplikace generovat tokeny, které budete muset zadat při přihlášení."
     lost_recovery_codes: Záložní kódy vám dovolí dostat se k vašemu účtu, pokud ztratíte telefon. Ztratíte-li záložní kódy, můžete je zde znovu vygenerovat. Vaše staré záložní kódy budou zneplatněny.
-    manual_instructions: 'Nemůžete-li oskenovat QR kód a je potřeba ho zadat ručně, zde je tajemství v prostém textu:'
+    manual_instructions: 'Nemůžete-li QR kód naskenovat a je potřeba ho zadat ručně, zde je secret v prostém textu:'
     recovery_codes: Záložní kódy pro obnovu
     recovery_codes_regenerated: Záložní kódy byly úspěšně znovu vygenerovány
-    recovery_instructions_html: Ztratíte-li někdy přístup k vašemu telefonu, můžete k získání přístupu k účtu použít jeden ze záložních kódů. <strong>Uchovávejte tyto kódy v bezpečí</strong>. Můžete si je například vytisknout a uložit je mezi jiné důležité dokumenty.
+    recovery_instructions_html: Ztratíte-li někdy přístup ke svému telefonu, můžete k získání přístupu k účtu použít jeden ze záložních kódů. <strong>Uchovejte tyto kódy v bezpečí</strong>. Můžete si je například vytisknout a uložit je mezi jiné důležité dokumenty.
     setup: Nastavit
     wrong_code: Zadaný kód byl neplatný! Je čas na serveru a na zařízení správný?
   user_mailer:
     backup_ready:
-      explanation: Vyžádal/a jste si úplnou zálohu svého účtu Mastodon. Nyní je připravena ke stažení!
+      explanation: Vyžádali jste si úplnou zálohu svého účtu Mastodon. Nyní je připravena ke stažení!
       subject: Váš archiv je připraven ke stažení
       title: Stažení archivu
     warning:
       explanation:
-        disable: Zatímco je váš účet zmražen, zůstávají data vašeho účtu nedotčená, ale nemůžete vykonávat žádné akce, dokud nebude odemčen.
-        silence: Zatímco je váš účet omezen, mohou vaše tooty na tomto serveru vidět pouze lidé, kteří váš již sledují, a můžete být vyloučen/a z různých veřejných výpisů. Ostatní vás však pořád mohou manuálně sledovat.
-        suspend: Váš účet byl pozastaven a všechny vaše tooty a vaše nahrané mediální soubory byly nenávratně odstraněny z tohoto serveru a serverů, na kterých jste měl/a sledující.
+        disable: Zatímco je váš účet zmrazen, zůstávají data vašeho účtu nedotčena. Dokud ale nebude odemčen, nemůžete vykonávat žádné akce.
+        silence: Zatímco je váš účet omezen, mohou vaše tooty na tomto serveru vidět pouze lidé, kteří váš již sledují, a můžete být vyloučeni z různých veřejných seznamů. Ostatní vás však pořád mohou manuálně sledovat.
+        suspend: Váš účet byl pozastaven a všechny vaše tooty a nahrané mediální soubory byly nenávratně odstraněny z tohoto serveru a serverů, na kterých jste měli sledující.
       get_in_touch: Můžete odpovědět na tento e-mail a spojit se s personálem serveru %{instance}.
-      review_server_policies: Posoudit politiku serveru
+      review_server_policies: Zkontrolujte pravidla serveru
       statuses: 'Konkrétně kvůli:'
       subject:
-        disable: Váš účet %{acct} byl zmražen
+        disable: Váš účet %{acct} byl zmrazen
         none: Varování pro uživatele %{acct}
         silence: Váš účet %{acct} byl omezen
         suspend: Váš účet %{acct} byl pozastaven
       title:
-        disable: Účet zmražen
+        disable: Účet zmrazen
         none: Varování
         silence: Účet omezen
         suspend: Účet pozastaven
     welcome:
       edit_profile_action: Nastavit profil
-      edit_profile_step: Můžete si přizpůsobit svůj profil nahráním avataru a obrázku záhlaví, změnou zobrazovaného jména a dalších. Chcete-li posoudit nové sledující předtím, než vás mohou sledovat, můžete svůj účet uzamknout.
-      explanation: Zde je pár tipů na začátek
+      edit_profile_step: Svůj profil si můžete přizpůsobit nahráním avataru a obrázku záhlaví, změnou zobrazovaného jména a další. Chcete-li posoudit nové sledující předtím, než vás mohou sledovat, můžete svůj účet uzamknout.
+      explanation: Zde je pár tipů do začátku
       final_action: Začít psát
       final_step: 'Začněte psát! I když nemáte sledující, mohou vaše zprávy vidět jiní lidé, například na místní časové ose a v hashtazích. Můžete se ostatním představit pomocí hashtagu #introductions.'
       full_handle: Vaše celá adresa profilu
-      full_handle_hint: Tohle je, co byste řekl/a svým přátelům, aby vám mohli posílat zprávy nebo vás sledovat z jiného serveru.
-      review_preferences_action: Změnit nastavení
-      review_preferences_step: Nezapomeňte si nastavit své volby, například jaké e-maily chcete přijímat či jak soukromé mají být vaše příspěvky ve výchozím stavu. Nemáte-li epilepsii, můžete si nastavit automatické přehrávání obrázků GIF.
+      full_handle_hint: Tohle je, co byste řekli svým přátelům, aby vám mohli posílat zprávy nebo vás sledovat z jiného serveru.
+      review_preferences_action: Změnit předvolby
+      review_preferences_step: Nezapomeňte si nastavit například jaké e-maily chcete přijímat či jak soukromé mají ve výchozím stavu být vaše příspěvky. Nemáte-li epilepsii, můžete si nastavit automatické přehrávání obrázků GIF.
       subject: Vítejte na Mastodonu
       tip_federated_timeline: Federovaná časová osa je náhled celé sítě Mastodon. Zahrnuje ovšem pouze lidi, které sledují vaši sousedé, takže není úplná.
-      tip_following: Administrátora/y serveru sledujete automaticky. Chcete-li najít další zajímavé lidi, podívejte se na místní a federované časové osy.
-      tip_local_timeline: Místní časová osa je náhled lidí na %{instance}. Tohle jsou vaši nejbližší sousedé!
+      tip_following: Administrátory serveru sledujete automaticky. Chcete-li najít další zajímavé lidi, podívejte se do místní a federované časové osy.
+      tip_local_timeline: Místní časová osa je náhled lidí na serveru %{instance}. Jsou to vaši nejbližší sousedé!
       tip_mobile_webapp: Pokud vám váš mobilní prohlížeč nabídne přidat si Mastodon na vaši domovskou obrazovku, můžete dostávat oznámení. V mnoha ohledech to funguje jako nativní aplikace!
       tips: Tipy
       title: Vítejte na palubě, %{name}!
@@ -1233,9 +1257,9 @@ cs:
     follow_limit_reached: Nemůžete sledovat více než %{limit} lidí
     invalid_email: E-mailová adresa je neplatná
     invalid_otp_token: Neplatný kód pro dvoufázové ověřování
-    otp_lost_help_html: Pokud jste ztratil/a přístup k oběma, můžete se spojit %{email}
-    seamless_external_login: Jste přihlášen/a přes externí službu, nastavení hesla a e-mailu proto nejsou dostupná.
-    signed_in_as: 'Přihlášen/a jako:'
+    otp_lost_help_html: Pokud jste ztratili přístup k oběma, spojte se s %{email}
+    seamless_external_login: Jste přihlášeni přes externí službu, nastavení hesla a e-mailu proto nejsou dostupná.
+    signed_in_as: 'Přihlášeni jako:'
   verification:
     explanation_html: 'Můžete se <strong>ověřit jako vlastník odkazů v metadatech profilu</strong>. Pro tento účel musí stránka v odkazu obsahovat odkaz zpět na váš profil na Mastodonu. Odkaz zpět <strong>musí</strong> mít atribut <code>rel="me"</code>. Na textu odkazu nezáleží. Zde je příklad:'
     verification: Ověření
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index fde22cc33..ee8807d20 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -11,6 +11,7 @@ cy:
     apps: Apiau symudol
     apps_platforms: Defnyddio Mastodon o iOS, Android a phlatfformau eraill
     browse_directory: Pori cyfeiriadur proffil a hidlo wrth diddordebau
+    browse_local_posts: Pori ffrwd byw o byst cyhoeddus o'r gweinydd hyn
     browse_public_posts: Pori ffrwd byw o byst cyhoeddus ar Fastodon
     contact: Cyswllt
     contact_missing: Heb ei osod
@@ -93,6 +94,7 @@ cy:
     roles:
       admin: Gweinyddwr
       bot: Bot
+      group: Grŵp
       moderator: Safonwr
     unavailable: Proffil ddim ar gael
     unfollow: Dad-ddilyn
@@ -213,10 +215,12 @@ cy:
         confirm_user: Cadarnhaodd %{name} gyfeiriad e-bost y defnyddiwr %{target}
         create_account_warning: Anfonwyd rhybudd i %{target} gan %{name}
         create_custom_emoji: Uwchlwythodd %{name} emoji newydd %{target}
+        create_domain_allow: Gwynrestrodd %{name} y parth %{target}
         create_domain_block: Blociodd %{name} y parth %{target}
         create_email_domain_block: Cosbrestrwyd parth e-bost %{target} gan %{name}
         demote_user: Diraddiodd %{name} y defnyddiwr %{target}
         destroy_custom_emoji: Dinistriodd %{name} emoji %{target}
+        destroy_domain_allow: Tynnodd %{name} parth %{target} o'r gwynrestr
         destroy_domain_block: Dadflociodd %{name} y parth %{target}
         destroy_email_domain_block: Gwynrestrodd %{name} parth e-bost %{target}
         destroy_status: Cafodd %{name} wared ar statws gan %{target}
@@ -355,13 +359,11 @@ cy:
       delete: Dileu
       destroyed_msg: Llwyddwyd i ddileu parth e-bost o'r gosbrestr
       domain: Parth
+      empty: Dim parthiau ebost ar y rhestr rhwystro.
       new:
         create: Ychwanegu parth
         title: Cofnod newydd yng nghosbrestr e-byst
       title: Cosbrestr e-bost
-    followers:
-      back_to_account: Nôl i'r gyfrif
-      title: Dilynwyr %{acct}
     instances:
       by_domain: Parth
       delivery_available: Mae'r cyflenwad ar gael
@@ -414,10 +416,26 @@ cy:
       created_msg: Llwyddwyd i greu nodyn adroddiad!
       destroyed_msg: Llwyddwyd i ddileu nodyn adroddiad!
     reports:
+      account:
+        notes:
+          few: "%{count} o nodiadau"
+          many: "%{count} o nodiadau"
+          one: "%{count} nodyn"
+          other: "%{count} o nodiadau"
+          two: "%{count} o nodiadau"
+          zero: "%{count} nodyn"
+        reports:
+          few: "%{count} o adroddiadau"
+          many: "%{count} o adroddiadau"
+          one: "%{count} adroddiad"
+          other: "%{count} o adroddiadau"
+          two: "%{count} o adroddiadau"
+          zero: "%{count} adroddiad"
       action_taken_by: Gwnaethpwyd hyn gan
       are_you_sure: Ydych chi'n sicr?
       assign_to_self: Aseinio i mi
       assigned: Arolygwr wedi'i aseinio
+      by_target_domain: Parth cyfrif a adroddir
       comment:
         none: Dim
       created_at: Adroddwyd
@@ -463,6 +481,8 @@ cy:
         users: I ddefnyddwyr lleol mewngofnodadwy
       domain_blocks_rationale:
         title: Dangos rhesymwaith
+      enable_bootstrap_timeline_accounts:
+        title: Alluogi dilyn diofyn i ddefnyddwyr newydd
       hero:
         desc_html: Yn cael ei arddangos ar y dudadlen flaen. Awgrymir 600x100px oleia. Pan nad yw wedi ei osod, mae'n ymddangos fel mân-lun yr achos
         title: Delwedd arwr
@@ -591,6 +611,10 @@ cy:
     animations_and_accessibility: Animeiddiau ac hygyrchedd
     confirmation_dialogs: Deialog cadarnhau
     discovery: Darganfyddiad
+    localization:
+      body: Caiff Mastodon ei gyfieithu gan wirfoddolwyr.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Gall pawb gyfrannu.
     sensitive_content: Cynnwys sensitif
     toot_layout: Gosodiad tŵt
   application_mailer:
@@ -729,7 +753,6 @@ cy:
     blocks: Yr ydych yn blocio
     csv: CSV
     domain_blocks: Blociau parth
-    follows: Yr ydych yn dilyn
     lists: Rhestrau
     mutes: Yr ydych yn tawelu
     storage: Storio cyfryngau
@@ -751,6 +774,7 @@ cy:
       invalid_irreversible: Mae hidlo anadferadwy ond yn gweithio yng nghyd-destun cartref neu hysbysiadau
     index:
       delete: Dileu
+      empty: Nid oes gennych chi hidlyddion.
       title: Hidlyddion
     new:
       title: Ychwanegu hidlydd newydd
@@ -915,6 +939,10 @@ cy:
       body: 'Cafodd eich statws ei fŵstio gan %{name}:'
       subject: Bŵstiodd %{name} eich statws
       title: Hwb newydd
+  notifications:
+    email_events: Digwyddiadau ar gyfer hysbysiadau e-bost
+    email_events_hint: 'Dewis digwyddiadau hoffech derbyn hysbysiadau ar eu cyfer:'
+    other_settings: Gosodiadau hysbysiadau arall
   number:
     human:
       decimal_units:
@@ -938,6 +966,7 @@ cy:
       duration_too_long: yn rhy bell yn y dyfodol
       duration_too_short: yn rhy fuan
       expired: Mae'r pleidlais wedi gorffen yn barod
+      invalid_choice: Nid yw'r dewis pleidlais hyn yn bodoli
       over_character_limit: ni all fod yn hirach na %{max} cymeriad yr un
       too_few_options: rhaid cael fwy nag un eitem
       too_many_options: ni all cynnwys fwy na %{max} o eitemau
@@ -948,6 +977,8 @@ cy:
   relationships:
     activity: Gweithgareddau cyfrif
     dormant: Segur
+    followers: Dilynwyr
+    following: Yn dilyn
     last_active: Gweithred ddiwethaf
     most_recent: Yn diweddaraf
     moved: Wedi symud
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 57f4ed879..1cdf7722e 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -5,27 +5,44 @@ da:
     about_mastodon_html: Mastodon er et socialt netværk der er baseret på åbne web protokoller og frit, open-source source software. Der er decentraliseret ligesom e-mail tjenester.
     about_this: Om
     active_count_after: aktive
+    active_footnote: Månedligt Aktive Brugere (MAU)
     administered_by: 'Administreret af:'
     api: API
     apps: Apps til mobilen
     apps_platforms: Brug Mastodon på iOS, Android og andre platformer
+    browse_directory: Gennemse en profils indholdsfortegnelse og filtrer efter interesser
+    browse_local_posts: Gennemse en live stream af offentlige indlæg fra denne server
+    browse_public_posts: Gennemse en live stream af offentlige indlæg fra Mastodon
     contact: Kontakt
     contact_missing: Ikke sat
     contact_unavailable: Ikke tilgængeligt
     discover_users: Opdag brugere
     documentation: Dokumentation
+    federation_hint_html: Med en konto på %{instance} har du har mulighed for at følge andre på en hvilken som helst Mastodon server.
     get_apps: Prøv en mobil app
     hosted_on: Mostodon hostet på %{domain}
+    instance_actor_flash: |
+      Denne konto er en virtuel aktør, der bruges til at repræsentere selve serveren og ikke nogen individuel bruger.
+      Det bruges til Federation formål og bør ikke blokeres, medmindre du vil blokere hele Instance, i hvilket tilfælde du skal bruge en domæne blokering.
     learn_more: Lær mere
     privacy_policy: Privatlivspolitik
     see_whats_happening: Se hvad der sker
+    server_stats: 'Server statstik:'
     source_code: Kildekode
     status_count_after:
       one: status
       other: statusser
     status_count_before: Som har skrevet
+    tagline: Følg venner og find nye
     terms: Vilkår for service
     unavailable_content: Utilgængeligt indhold
+    unavailable_content_description:
+      domain: Server
+      reason: Årsag
+      rejecting_media: 'Medie filer fra disse servere vil ikke blive behandlet eller gemt, og ingen miniaturebilleder vil blive vist, som kræver tilgang til den originale fil:'
+      silenced: 'Posteringer fra disse servere vil være skjulte i den offentlige tidslinje feed eller beskeder og ingen notifikationer vil blive genereret fra brugere du ikke følger:'
+      suspended: 'Ingen date fra disse servere vil blive behandlet, gemt eller udvekslet, at interagere eller kommunikere med brugere fra disse servere er ikke muligt:'
+    unavailable_content_html: Mastodon tillader dig generelt at se indhold og interagere med brugere fra enhver anden server i fediverset. Dette er undtagelser der er foretaget på netop denne server.
     user_count_after:
       one: bruger
       other: brugere
@@ -33,6 +50,7 @@ da:
     what_is_mastodon: Hvad er Mastodon?
   accounts:
     choices_html: "%{name}s valg:"
+    featured_tags_hint: Du kan tilføje specifikke hashtags der vil blive vist her.
     follow: Følg
     followers:
       one: Følger
@@ -59,12 +77,14 @@ da:
     roles:
       admin: Administrator
       bot: Robot
+      group: Gruppe
       moderator: Moderator
     unavailable: Profil utilgængelig
     unfollow: Følg ikke længere
   admin:
     account_actions:
       action: Udfør handling
+      title: Udfør moderator handlinger på %{acct}
     account_moderation_notes:
       create: Læg en note
       created_msg: Moderator notat succesfuldt oprettet!
@@ -94,10 +114,13 @@ da:
       display_name: Visningsnavn
       domain: Domæne
       edit: Rediger
+      email: Email
+      email_status: Email status
       enable: Aktiver
       enabled: Aktiveret
       followers: Følgere
       follows: Følger
+      header: Overskrift/billede
       inbox_url: Link til indbakke
       invited_by: Inviteret af
       ip: IP-adresse
@@ -120,7 +143,10 @@ da:
       moderation_notes: Moderator notater
       most_recent_activity: Seneste aktivitet
       most_recent_ip: Senest IP
+      no_account_selected: Ingen konti blev ændret da ingen var valgt
+      no_limits_imposed: Ingen ændringer gennemført
       not_subscribed: Ikke abonneret
+      pending: Afventende anmeldelser
       perform_full_suspension: Udeluk
       promote: Forfrem
       protocol: Protokol
@@ -130,6 +156,7 @@ da:
       reject: Afvis
       reject_all: Afvis alle
       remove_avatar: Fjern profilbillede
+      remove_header: Fjern overskrift/billede
       resend_confirmation:
         already_confirmed: Denne bruger er allerede blevet bekræftet
         send: Gensend bekræftelsesmail
@@ -154,6 +181,7 @@ da:
       statuses: Statusser
       subscribe: Abonner
       suspended: Udelukket
+      time_in_queue: Venter i køen %{time}
       title: Konti
       unconfirmed_email: Ikke-bekræftet email
       undo_silenced: Fortryd dæmpning
@@ -161,6 +189,7 @@ da:
       unsubscribe: Abonner ikke længere
       username: Brugernavn
       warn: Advar
+      web: Web
       whitelisted: Hvidlistet
     action_logs:
       actions:
@@ -173,6 +202,7 @@ da:
         create_domain_block: "%{name} blokerede domænet %{target}"
         create_email_domain_block: "%{name} sortlistede email domænet %{target}"
         demote_user: "%{name} degraderede %{target}"
+        destroy_custom_emoji: "%{name} fjernede emoji %{target}"
         destroy_domain_allow: "%{name} fjernede godkendelsen af domænet %{target}"
         destroy_domain_block: "%{name} fjernede blokeringen af domænet %{target}"
         destroy_email_domain_block: "%{name} hvid-listede email domænet %{target}"
@@ -198,6 +228,7 @@ da:
       deleted_status: "(slettet status)"
       title: Revisionslog
     custom_emojis:
+      assign_category: Vælg kategori
       by_domain: Domæne
       copied_msg: Succesfuldt oprettede en lokal kopi af humørikonet
       copy: Kopier
@@ -214,6 +245,7 @@ da:
       enabled: Aktiveret
       enabled_msg: Succesfuldt aktiverede det humørikon
       image_hint: PNG op til 50KB
+      list: Listet
       listed: Listet
       new:
         title: Tilføj nyt brugerdefineret humørikon
@@ -221,11 +253,14 @@ da:
       shortcode: Kortkode
       shortcode_hint: Mindst 2 tegn, kun alfabetiske tegn og understreger
       title: Brugerdefinerede humørikoner
+      uncategorized: Uden kategori
+      unlist: Ulistet
       unlisted: Ikke listet
       update_failed_msg: Kunne ikke opdatere det humørikon
       updated_msg: Humørikon succesfuldt opdateret!
       upload: Læg op
     dashboard:
+      authorized_fetch_mode: Sikker tilstand
       backlog: ophobede jobs
       config: Konfiguration
       feature_deletions: Konto sletninger
@@ -233,12 +268,17 @@ da:
       feature_profile_directory: Profilliste
       feature_registrations: Registreringer
       feature_relay: Føderations relæ
+      feature_spam_check: Anti-spam
+      feature_timeline_preview: Tidslinje eksempelvisning
       features: Funktioner
       hidden_service: Føderation med skjulte tjenester
       open_reports: åbne anmeldelser
+      pending_tags: hastags der afventer gennemgang
+      pending_users: brugere der afventer gennemgang
       recent_users: Seneste brugere
       search: Søg på fuld tekst
       single_user_mode: Enkelt bruger mode
+      software: Software
       space: Brugt lagerplads
       title: Betjeningspanel
       total_users: samlede antal brugere
@@ -246,13 +286,18 @@ da:
       week_interactions: interaktioner denne uge
       week_users_active: aktive denne uge
       week_users_new: brugere denne uge
+      whitelist_mode: Whitelist tilstand
     domain_allows:
+      add_new: Whitelist domæne
+      created_msg: Domænet er tilføjet whitelist
+      destroyed_msg: Domænet er fjernet fra whitelist
       undo: Fjern fra hvidliste
     domain_blocks:
       add_new: Tilføj ny domain block
       created_msg: Domæne blokade bliver nu behandlet
       destroyed_msg: Domæne blokade er blevet annulleret
       domain: Domæne
+      edit: Rediger domæne blokering
       new:
         create: Opret blokering
         hint: Domæne blokeringen vil ikke forhindre oprettelse af konto opslag i databasen, men vil retroaktivt og automatisk benytte specifikke moderator metoder på disse konti.
@@ -267,6 +312,8 @@ da:
       reject_media: Afvis medie filer
       reject_media_hint: Fjerner lokalt lagrede multimedie filer og nægter at hente nogen i fremtiden. Irrelevant for udelukkelser
       reject_reports: Afvis anmeldelser
+      rejecting_media: afviser mediefiler
+      rejecting_reports: afviser anmeldelser
       show:
         affected_accounts:
           one: En konto i databasen påvirket
@@ -277,6 +324,7 @@ da:
         title: Annuller domæne blokeringen for domænet %{domain}
         undo: Fortryd
       undo: Fortryd domain block
+      view: Vis domæne blokering
     email_domain_blocks:
       add_new: Tilføj ny
       created_msg: Tilføjede succesfuldt email domænet til sortliste
@@ -287,11 +335,9 @@ da:
         create: Tilføj domæne
         title: Ny email blokade opslag
       title: Email sortliste
-    followers:
-      back_to_account: Tilbage til konto
-      title: "%{acct}'s følgere"
     instances:
       by_domain: Domæne
+      delivery_available: Levering er tilgængelig
       moderation:
         all: Alle
         limited: Begrænset
@@ -370,6 +416,7 @@ da:
       domain_blocks:
         all: Til alle
         disabled: Til ingen
+        title: Vis domæne blokeringer
       hero:
         desc_html: Vist på forsiden. Mindst 600x100px anbefales. Hvis ikke sat, vil dette falde tilbage til billedet fra serveren
         title: Billede af helt
@@ -448,8 +495,15 @@ da:
       body: "%{reporter} har anmeldt %{target}"
       body_remote: Nogen fra %{domain} har anmeldt %{target}
       subject: Ny anmeldelse for %{instance} (#%{id})
+  aliases:
+    add_new: Opret alias
   appearance:
+    animations_and_accessibility: Animationer og tilgængelighed
     discovery: Opdagelse
+    localization:
+      body: Mastodon oversættes af frivillige.
+      guide_link: https://da.crowdin.com/project/mastodon
+      guide_link_text: Alle kan bidrage.
     sensitive_content: Følsomt indhold
   application_mailer:
     notification_preferences: Ændre email præferencer
@@ -525,6 +579,8 @@ da:
   directories:
     directory: Profilliste
     explore_mastodon: Uforsk %{title}
+  domain_validator:
+    invalid_domain: er ikke et gyldigt domænenavn
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': Du har ikke tilladelse til at se denne side.
@@ -553,7 +609,7 @@ da:
       size: Størrelse
     blocks: Du blokerer
     csv: CSV
-    follows: Du følger
+    domain_blocks: Domæne blokeringer
     lists: Lister
     mutes: Du dæmper
     storage: Medie lager
@@ -694,6 +750,8 @@ da:
     public_timelines: Offentlige tidslinjer
   relationships:
     activity: Aktivitet for konto
+    followers: Følgere
+    following: Følger
     last_active: Sidst aktiv
     most_recent: Seneste
     moved: Flyttet
@@ -833,7 +891,10 @@ da:
       title: Udpluk af arkiv
     warning:
       title:
+        disable: Konto frosset
         none: Advarsel
+        silence: Konto begrænset
+        suspend: Konto suspenderet
     welcome:
       edit_profile_action: Opsæt profil
       edit_profile_step: Du kan skræddersy din profil ved at uploade et profilbillede, overskrift, ændre dit visningsnavn og mere. Hvis du kunne tænke dig at gennemse nye følgere før de må følge dig, kan du låse din konto.
@@ -852,6 +913,7 @@ da:
       tips: Råd
       title: Velkommen ombord, %{name}!
   users:
+    follow_limit_reached: Du kan ikke følge mere end %{limit} personer
     invalid_email: E-mail adressen er ugyldig
     invalid_otp_token: Ugyldig to-faktor kode
     otp_lost_help_html: Hvis du har mistet adgang til begge, kan du få kontakt via %{email}
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 445205871..0fef69dff 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -78,6 +78,7 @@ de:
     roles:
       admin: Administrator
       bot: Bot
+      group: Gruppe
       moderator: Moderator
     unavailable: Profil nicht verfügbar
     unfollow: Entfolgen
@@ -197,11 +198,15 @@ de:
         change_email_user: "%{name} hat die E-Mail-Adresse des Nutzers %{target} geändert"
         confirm_user: "%{name} hat die E-Mail-Adresse von %{target} bestätigt"
         create_account_warning: "%{name} hat eine Warnung an %{target} gesendet"
+        create_announcement: "%{name} hat die neue Ankündigung %{target} erstellt"
         create_custom_emoji: "%{name} hat neues Emoji %{target} hochgeladen"
+        create_domain_allow: "%{name} hat die Domain %{target} gewhitelistet"
         create_domain_block: "%{name} hat die Domain %{target} blockiert"
         create_email_domain_block: "%{name} hat die E-Mail-Domain %{target} geblacklistet"
         demote_user: "%{name} stufte Benutzer_in %{target} herunter"
+        destroy_announcement: "%{name} hat die neue Ankündigung %{target} gelöscht"
         destroy_custom_emoji: "%{name} zerstörte Emoji %{target}"
+        destroy_domain_allow: "%{name} hat die Domain %{target} von der Whitelist entfernt"
         destroy_domain_block: "%{name} hat die Domain %{target} entblockt"
         destroy_email_domain_block: "%{name} hat die E-Mail-Domain %{target} gewhitelistet"
         destroy_status: "%{name} hat einen Beitrag von %{target} entfernt"
@@ -221,10 +226,22 @@ de:
         unassigned_report: "%{name} hat die Zuweisung der Meldung %{target} entfernt"
         unsilence_account: "%{name} hat die Stummschaltung von %{target} aufgehoben"
         unsuspend_account: "%{name} hat die Verbannung von %{target} aufgehoben"
+        update_announcement: "%{name} aktualisierte Ankündigung %{target}"
         update_custom_emoji: "%{name} hat das %{target} Emoji geändert"
         update_status: "%{name} hat einen Beitrag von %{target} aktualisiert"
       deleted_status: "(gelöschter Beitrag)"
       title: Überprüfungsprotokoll
+    announcements:
+      edit:
+        title: Ankündigung bearbeiten
+      empty: Keine Ankündigungen gefunden.
+      live: Live
+      new:
+        create: Ankündigung erstellen
+        title: Neue Ankündigung
+      published: Veröffentlicht
+      time_range: Zeitraum
+      title: Ankündigungen
     custom_emojis:
       assign_category: Kategorie zuweisen
       by_domain: Domain
@@ -336,13 +353,11 @@ de:
       delete: Löschen
       destroyed_msg: E-Mail-Domain-Blockade erfolgreich gelöscht
       domain: Domain
+      empty: Keine E-Mail-Domains sind momentan auf der Blacklist.
       new:
         create: Blockade erstellen
         title: Neue E-Mail-Domain-Blockade
       title: E-Mail-Domain-Blockade
-    followers:
-      back_to_account: Zurück zum Konto
-      title: "%{acct}'s Follower"
     instances:
       by_domain: Domain
       delivery_available: Zustellung funktioniert
@@ -371,6 +386,8 @@ de:
       title: Einladungen
     pending_accounts:
       title: Ausstehende Konten (%{count})
+    relationships:
+      title: Beziehungen von %{acct}
     relays:
       add_new: Neues Relay hinzufügen
       delete: Löschen
@@ -391,10 +408,18 @@ de:
       created_msg: Meldungs-Kommentar erfolgreich erstellt!
       destroyed_msg: Meldungs-Kommentar erfolgreich gelöscht!
     reports:
+      account:
+        notes:
+          one: "%{count} Notiz"
+          other: "%{count} Notizen"
+        reports:
+          one: "%{count} Bericht"
+          other: "%{count} Berichte"
       action_taken_by: Maßnahme ergriffen durch
       are_you_sure: Bist du dir sicher?
       assign_to_self: Mir zuweisen
       assigned: Zugewiesener Moderator
+      by_target_domain: Domain des gemeldeten Kontos
       comment:
         none: Kein
       created_at: Gemeldet
@@ -440,6 +465,8 @@ de:
         users: Für angemeldete lokale Benutzer
       domain_blocks_rationale:
         title: Rationale anzeigen
+      enable_bootstrap_timeline_accounts:
+        title: Aktiviere die Option "Konten, denen Neu-Angemeldete automatisch folgen"
       hero:
         desc_html: Wird auf der Startseite angezeigt. Mindestens 600x100px sind empfohlen. Wenn es nicht gesetzt wurde, wird das Server-Thumbnail dafür verwendet
         title: Bild für Einstiegsseite
@@ -568,6 +595,10 @@ de:
     animations_and_accessibility: Animationen und Barrierefreiheit
     confirmation_dialogs: Bestätigungsfenster
     discovery: Entdecken
+    localization:
+      body: Mastodon wurde von Freiwilligen übersetzt.
+      guide_link: https://de.crowdin.com/project/mastodon
+      guide_link_text: Jeder kann etwas dazu beitragen.
     sensitive_content: Heikle Inhalte
     toot_layout: Beitragslayout
   application_mailer:
@@ -640,6 +671,9 @@ de:
     hint_html: "<strong>Hinweis:</strong> Wir werden dich für die nächste Stunde nicht erneut nach deinem Passwort fragen."
     invalid_password: Ungültiges Passwort
     prompt: Gib dein Passwort ein um fortzufahren
+  date:
+    formats:
+      default: "%d. %b %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}h"
@@ -706,7 +740,6 @@ de:
     blocks: Du hast blockiert
     csv: CSV
     domain_blocks: Domainblockaden
-    follows: Du folgst
     lists: Listen
     mutes: Du hast stummgeschaltet
     storage: Medienspeicher
@@ -717,6 +750,7 @@ de:
     hint_html: "<strong>Was sind empfohlene Hashtags?</strong> Sie werden in deinem öffentlichen Profil deutlich angezeigt und ermöglichen es den Menschen, deine öffentlichen Beiträge speziell unter diesen Hashtags zu durchsuchen. Sie sind ein großartiges Werkzeug, um kreative Werke oder langfristige Projekte zu verfolgen."
   filters:
     contexts:
+      account: Profile
       home: Startseite
       notifications: Benachrichtigungen
       public: Öffentliche Zeitleisten
@@ -728,6 +762,7 @@ de:
       invalid_irreversible: Unwiderrufliche Filterung funktioniert nur mit Heim- oder Benachrichtigungskontext
     index:
       delete: Löschen
+      empty: Du hast keine Filter.
       title: Filter
     new:
       title: Neuen Filter hinzufügen
@@ -740,6 +775,8 @@ de:
     all: Alle
     changes_saved_msg: Änderungen gespeichert!
     copy: Kopieren
+    delete: Löschen
+    edit: Bearbeiten
     no_batch_actions_available: Keine Massenaktionen auf dieser Seite verfügbar
     order_by: Sortieren nach
     save_changes: Änderungen speichern
@@ -876,6 +913,10 @@ de:
       body: "%{name} hat deinen Beitrag geteilt:"
       subject: "%{name} hat deinen Beitrag geteilt"
       title: Dein Beitrag wurde geteilt
+  notifications:
+    email_events: Ereignisse für E-Mail-Benachrichtigungen
+    email_events_hint: 'Wähle Ereignisse, für die du Benachrichtigungen erhalten möchtest:'
+    other_settings: Weitere Benachrichtigungseinstellungen
   number:
     human:
       decimal_units:
@@ -899,6 +940,7 @@ de:
       duration_too_long: ist zu weit in der Zukunft
       duration_too_short: ist zu früh
       expired: Die Umfrage ist bereits vorbei
+      invalid_choice: Die gewählte Stimmenoption existiert nicht
       over_character_limit: kann nicht länger als jeweils %{max} Zeichen sein
       too_few_options: muss mindestens einen Eintrag haben
       too_many_options: kann nicht mehr als %{max} Einträge beinhalten
@@ -906,9 +948,16 @@ de:
     other: Weiteres
     posting_defaults: Standardeinstellungen für Beiträge
     public_timelines: Öffentliche Zeitleisten
+  reactions:
+    errors:
+      limit_reached: Limit für verschiedene Reaktionen erreicht
+      unrecognized_emoji: ist kein anerkanntes Emoji
   relationships:
     activity: Kontoaktivität
     dormant: Inaktiv
+    followers: Folgende
+    following: Folgt
+    invited: Eingeladen
     last_active: Zuletzt aktiv
     most_recent: Neuste
     moved: Umgezogen
diff --git a/config/locales/devise.ar.yml b/config/locales/devise.ar.yml
index 4662cd030..ca0b657e8 100644
--- a/config/locales/devise.ar.yml
+++ b/config/locales/devise.ar.yml
@@ -51,6 +51,9 @@ ar:
       two_factor_enabled:
         subject: 'ماستدون: تم تفعيل نظام المصادقة بخطوتين'
         title: إنّ 2FA نشِط
+      two_factor_recovery_codes_changed:
+        subject: 'ماستدون: تم إعادة توليد رموز استرجاع المصادقة بخطوتين'
+        title: تم استبدال رموز استرجاع 2FA
       unlock_instructions:
         subject: 'ماستدون: تعليمات فك القفل'
     omniauth_callbacks:
diff --git a/config/locales/devise.ast.yml b/config/locales/devise.ast.yml
index 49b0c8daf..29fde3941 100644
--- a/config/locales/devise.ast.yml
+++ b/config/locales/devise.ast.yml
@@ -1,21 +1,45 @@
 ---
 ast:
   devise:
+    confirmations:
+      confirmed: La direición de corréu confirmóse con ésitu.
+      send_instructions: Nunos minutos, vas recibir un corréu coles instrucciones pa cómo confirmar la direición de corréu. Comprueba la carpeta Puxarra si nun lu recibiesti, por favor.
+      send_paranoid_instructions: Si la direición de corréu esiste na nuesa base de datos, nunos minutos vas recibir un corréu coles instrucciones pa cómo confirmala. Comprueba la carpeta Puxarra si nun lu recibiesti.
     failure:
       already_authenticated: Yá aniciesti sesión.
       inactive: Entá nun s'activó la cuenta.
       last_attempt: Tienes un intentu más enantes de bloquiar la cuenta.
       locked: La cuenta ta bloquiada.
+      pending: La cuenta ta entá en revisión.
       timeout: La sesión caducó. Volvi aniciar sesión pa siguir, por favor.
       unauthenticated: Precises aniciar sesión o rexistrate enantes de siguir.
     mailer:
       confirmation_instructions:
-        explanation: Creesti una cuenta en %{host} con esta direición de corréu. Tas a un clic d'activala. Si nun fuisti tu, inora esti corréu.
+        explanation: Creesti una cuenta en %{host} con esta direición de corréu. Tas a un calcu d'activala. Si nun fuisti tu, inora esti corréu.
       email_changed:
-        title: Direición de corréu nueva
+        explanation: 'La direición de corréu de la cuenta camudó a:'
+        subject: 'Mastodón: Camudó la direición de corréu'
+        title: Direición nueva de corréu
+      password_change:
+        explanation: Camudó la contraseña de la cuenta.
+        subject: 'Mastodon: Camudó la contraseña'
       reset_password_instructions:
         explanation: Solicitesti una contraseña nueva pa la cuenta.
         extra: Si nun solicitesti esto, inora esti corréu. La contraseña nun va camudar hasta que nun accedas al enllaz d'enriba y crees una nueva.
+        subject: 'Mastodon: Instrucciones pa reafitar la contraseña'
+      two_factor_disabled:
+        subject: 'Mastodon: Desactivóse l''autenticación en dos pasos'
+      two_factor_enabled:
+        subject: 'Mastodon: Activóse l''autenticación en dos pasos'
+      two_factor_recovery_codes_changed:
+        subject: 'Mastodon: Rexeneráronse los códigos de l''autenticación en dos pasos'
+      unlock_instructions:
+        subject: 'Mastodon: Instrucciones de desbloquéu'
+    passwords:
+      send_instructions: Si la direición de corréu esiste na base de datos, nunos minutos vas recibir un enllaz pa recuperar la contraseña a esi corréu. Comprueba la carpeta Puxarra si nun lu recibiesti.
+      send_paranoid_instructions: Si la direición de corréu esiste na base de datos, nunos minutos vas recibir un enllaz pa recuperar la contraseña a esi corréu. Comprueba la carpeta Puxarra si nun lu recibiesti.
+      updated: La contraseña camudó con ésitu. Agora aniciesti sesión.
+      updated_not_active: La contraseña camudó con ésitu.
     registrations:
       signed_up: "¡Afáyate! Rexistréstite con ésitu."
       signed_up_but_unconfirmed: Unvióse un mensaxe de confirmación a la direición de corréu. Sigui l'enllaz p'activar la cuenta. Comprueba la carpeta Puxarra si nun recibiesti esti corréu, por favor.
@@ -28,3 +52,6 @@ ast:
     messages:
       already_confirmed: yá se confirmó, volvi aniciar sesión
       not_found: nun s'alcontró
+      not_saved:
+        one: '1 fallu torgó que %{resource} se guardare:'
+        other: "%{count} fallos torgó que %{resource} se guardaren:"
diff --git a/config/locales/devise.ca.yml b/config/locales/devise.ca.yml
index eb176c7bd..cca8764ea 100644
--- a/config/locales/devise.ca.yml
+++ b/config/locales/devise.ca.yml
@@ -2,16 +2,16 @@
 ca:
   devise:
     confirmations:
-      confirmed: L'adreça de correu s'ha confirmat correctament.
-      send_instructions: "En pocs minuts rebràs un correu electrònic amb instruccions sobre com confirmar l'adreça de correu. \nSi us plau verifica la carpeta de corrreu brossa si no has rebut aquest correu."
+      confirmed: La teva adreça de correu electrònic s'ha confirmat correctament.
+      send_instructions: "En pocs minuts rebràs un correu electrònic amb instruccions sobre com confirmar l'adreça de correu. \nSi us plau verifica la teva carpeta de correu brossa si no has rebut aquest correu."
       send_paranoid_instructions: |-
         Si l'adreça de correu electrònic existeix en la nostra base de dades, en pocs minuts rebràs un correu electrònic amb instruccions sobre com confirmar l'adreça de correu.
-        Si us plau verifica la carpeta de corrreu brossa si no has rebut aquest correu.
+        Si us plau verifica la teva carpeta de correu brossa si no has rebut aquest correu.
     failure:
       already_authenticated: Ja estàs registrat.
       inactive: El teu compte encara no s'ha activat.
       invalid: "%{authentication_keys} o contrasenya no són vàlids."
-      last_attempt: Tens un intent més, abans que es bloqueji el compte.
+      last_attempt: Tens un intent més, abans que es bloquegi el compte.
       locked: El compte s'ha bloquejat.
       not_found_in_database: "%{authentication_keys} o contrasenya no són vàlids."
       pending: El teu compte encara està en revisió.
@@ -40,13 +40,13 @@ ca:
       reconfirmation_instructions:
         explanation: Confirma la nova adreça per canviar el teu correu electrònic.
         extra: Si no has iniciat aquest canvi, ignora aquest correu electrònic. L'adreça electrònica del compte de Mastodon no canviarà fins que accedeixis a l'enllaç de dalt.
-        subject: 'Mastodon: Confirma el correu electrònic per a %{instance}'
+        subject: 'Mastodon: confirma l''adreça electrònica per a %{instance}'
         title: Verifica l'adreça de correu electrònic
       reset_password_instructions:
         action: Canviar contrasenya
         explanation: Has sol·licitat una contrasenya nova per al teu compte.
         extra: Si no ho has sol·licitat, ignora aquest correu electrònic. La teva contrasenya no canviarà fins que accedeixis a l'enllaç de dalt i creis un de nou.
-        subject: 'Mastodon: Instruccions per a reiniciar contrassenya'
+        subject: 'Mastodon: Instruccions per a reiniciar contrasenya'
         title: Contrasenya restablerta
       two_factor_disabled:
         explanation: L´autenticació de dos factors pel teu compte ha estat desactivat. L'inici de sessió és ara possible utilitzant només l'adreça de correu electrònic i la contrasenya.
@@ -61,23 +61,23 @@ ca:
         subject: 'Mastodon: codis de recuperació de Dos factors regenerats'
         title: 2FA codis de recuperació canviats
       unlock_instructions:
-        subject: 'Mastodon: Instruccions per a desblocar'
+        subject: 'Mastodon: Instruccions per a desbloquejar'
     omniauth_callbacks:
-      failure: No podem autentificar-te desde %{kind} degut a "%{reason}".
+      failure: No podem autentificar-te des de %{kind} degut a "%{reason}".
       success: Autentificat amb èxit des del compte %{kind}.
     passwords:
       no_token: No pots accedir a aquesta pàgina sense provenir des del correu de restabliment de la contrasenya. Si vens des del correu de restabliment de contrasenya, assegura't que estàs emprant l'adreça completa proporcionada.
-      send_instructions: Rebràs un correu electrònic amb instruccions sobre com reiniciar la contrasenya en pocs minuts.
+      send_instructions: Si el teu correu electrònic existeix en la nostra base de dades, rebràs en pocs minuts un enllaç de restabliment de contrasenya en l'adreça de correu. Si us plau verifica la teva carpeta de correu brossa if no rebut aquest correu.
       send_paranoid_instructions: Si el seu correu electrònic existeix en la nostra base de dades, rebràs un enllaç de restabliment de contrasenya en l'adreça de correu en pocs minuts.
-      updated: La contrassenya s'ha canviat correctament. Ara ja estàs registrat.
-      updated_not_active: La contrassenya s'ha canviat correctament.
+      updated: La contrasenya s'ha canviat correctament. Ara ja estàs registrat.
+      updated_not_active: La contrasenya s'ha canviat correctament.
     registrations:
       destroyed: Adéu! el compte s'ha cancel·lat amb èxit. Desitgem veure't de nou aviat.
       signed_up: Benvingut! T'has registrat amb èxit.
       signed_up_but_inactive: T´has registrat amb èxit. No obstant, no podem identificar-te perquè el compte encara no s'ha activat.
       signed_up_but_locked: T´has registrat amb èxit. No obstant, no podem identificar-te perquè el compte està blocat.
-      signed_up_but_pending: S'ha enviat un missatge amb un enllaç de confirmació a la teva adreça de correu electrònic. Després de que hagis fet clic a l'enllaç, revisarem la teva sol·licitud. Se't notificarà si s'aprova.
-      signed_up_but_unconfirmed: Un missatge amb un enllaç de confirmació ha estat enviat per correu electrònic. Si us plau segueixi l'enllaç per activar el seu compte.
+      signed_up_but_pending: S'ha enviat un missatge amb un enllaç de confirmació a la teva adreça de correu electrònic. Després que hagis fet clic a l'enllaç, revisarem la sol·licitud. Se't notificarà si s'aprova.
+      signed_up_but_unconfirmed: S'ha enviat per correu electrònic un missatge amb un enllaç de confirmació. Fes clic a l'enllaç per a activar el compte.
       update_needs_confirmation: Ha actualitzat el seu compte amb èxit, però necessitem verificar la nova adreça de correu. Si us plau comprovi el correu i segueixi l'enllaç per confirmar la nova adreça de correu.
       updated: El seu compte ha estat actualitzat amb èxit.
     sessions:
@@ -85,16 +85,16 @@ ca:
       signed_in: T'has registrat amb èxit.
       signed_out: Has tancat la sessió amb èxit.
     unlocks:
-      send_instructions: Rebràs un correu electrònic amb instruccions sobre com desblocar el compte en pocs minuts.
-      send_paranoid_instructions: Si el compte existeix, rebràs un correu electrònic amb instruccions sobre com desblocar-lo en pocs minuts.
-      unlocked: El compte s'ha blocat correctament. Inicia sessió per a continuar.
+      send_instructions: En pocs minuts rebràs un correu electrònic amb instruccions sobre com desbloquejar el teu compte. Si us plau verifica la teva carpeta de correu brossa si no has rebut aquest correu.
+      send_paranoid_instructions: Si el compte existeix, rebràs en pocs minuts un correu electrònic amb instruccions sobre com desbloquejar-lo. Verifica la carpeta de correu brossa si no has rebut aquest correu.
+      unlocked: El compte s'ha desblocat correctament. Inicia sessió per a continuar.
   errors:
     messages:
       already_confirmed: ja està confirmat. Intenta d'iniciar sessió
       confirmation_period_expired: calia fer la confirmació dins de %{period}, torna a sol·licitar-la
       expired: ha expirat, demana'n una altra
       not_found: no s'ha trobat
-      not_locked: no està blocada
+      not_locked: no està bloquejada
       not_saved:
         one: '1 error ha impedit desar aquest %{resource}:'
         other: "%{count} errors hab impedit desar aquest %{resource}:"
diff --git a/config/locales/devise.cs.yml b/config/locales/devise.cs.yml
index 25be731d0..743a1bfd5 100644
--- a/config/locales/devise.cs.yml
+++ b/config/locales/devise.cs.yml
@@ -3,10 +3,10 @@ cs:
   devise:
     confirmations:
       confirmed: Vaše e-mailová adresa byla úspěšně ověřena.
-      send_instructions: Za několik minut obdržíte e-mail s instrukcemi pro potvrzení vašeho účtu. Pokud tento e-mail neobdržíte, prosím zkontrolujte si složku „spam“.
-      send_paranoid_instructions: Pokud vaše e-mailová adresa existuje v naší databázi, obdržíte za několik minut e-mail s instrukcemi pro potvrzení vaší e-mailové adresy. Pokud tento e-mail neobdržíte, prosím zkontrolujte si složku „spam“.
+      send_instructions: Za několik minut obdržíte e-mail s instrukcemi pro potvrzení vašeho účtu. Pokud tento e-mail neobdržíte, podívejte se prosím také do složky „spam“.
+      send_paranoid_instructions: Pokud je vaše e-mailová adresa v naší databázi, obdržíte za několik minut e-mail s instrukcemi pro potvrzení vaší e-mailové adresy. Pokud tento e-mail neobdržíte, podívejte se prosím také do složky „spam“.
     failure:
-      already_authenticated: Již jste přihlášen/a.
+      already_authenticated: Již jste přihlášeni.
       inactive: Váš účet ještě není aktivován.
       invalid: Neplatné %{authentication_keys} nebo heslo.
       last_attempt: Máte ještě jeden pokus, než bude váš účet uzamčen.
@@ -14,46 +14,46 @@ cs:
       not_found_in_database: Neplatné %{authentication_keys} nebo heslo.
       pending: Váš účet je stále posuzován.
       timeout: Vaše relace vypršela. Pro pokračování se prosím přihlaste znovu.
-      unauthenticated: Před pokračováním se musíte přihlásit nebo registrovat.
+      unauthenticated: Před pokračováním se musíte přihlásit nebo zaregistrovat.
       unconfirmed: Před pokračováním musíte potvrdit svůj e-mail.
     mailer:
       confirmation_instructions:
         action: Potvrdit e-mailovou adresu
-        action_with_app: Potvrdit a navrátit se do %{app}
-        explanation: S touto e-mailovou adresou jste si vytvořil/a účet na %{host}. K jeho aktivaci vám zbývá jedno kliknutí. Pokud jste to nebyl/a vy, prosím ignorujte tento e-mail.
-        explanation_when_pending: S touto e-mailovou adresou jste si vyžádal/a pozvánku na %{host}. Jakmile svou e-mailovou adresu potvrdíte, posoudíme váš poadavek. Můžete se přihlásit, změnit si své detaily či smazat svůj účet, ale do schválení účtu nemáte přístup ke většině funkcí. Pokud bude váš požadavek zamítnut, budou vaše data odstraněna, takže od vás nebude vyžadována žádná další akce. Pokud jste to nebyl/a vy, prosím ignorujte tento e-mail.
-        extra_html: Prosím podívejte se také na <a href="%{terms_path}">pravidla tohoto serveru</a> a <a href="%{policy_path}">naše podmínky používání</a>.
-        subject: 'Mastodon: Potvrzovací instrukce pro %{instance}'
+        action_with_app: Potvrdit a vrátit se do %{app}
+        explanation: S touto e-mailovou adresou jste si již účet na serveru %{host} vytvořili. K jeho aktivaci vám zbývá jedno kliknutí. Pokud jste to nebyli vy, považujte tento e-mail za bezpředmětný.
+        explanation_when_pending: S touto e-mailovou adresou jste si již pozvánku na server %{host} vyžádali. Jakmile svou e-mailovou adresu potvrdíte, vaši žádost posoudíme. Můžete se přihlásit, změnit podrobnosti svého účtu nebo ho smazat, ale do schválení účtu nebudete mít k většině funkcí přístup. Pokud bude vaše žádost zamítnuta, vaše data budou odstraněna, a nebude od vás vyžadována žádná další akce. Pokud jste to nebyli vy, považujte tento e-mail za bezpředmětný.
+        extra_html: Přečtěte si prosím také <a href="%{terms_path}">pravidla tohoto serveru</a> a <a href="%{policy_path}">naše podmínky používání</a>.
+        subject: 'Mastodon: Potvrzení účtu na serveru %{instance}'
         title: Potvrďte e-mailovou adresu
       email_changed:
         explanation: 'E-mailová adresa vašeho účtu byla změněna na:'
-        extra: Pokud jste si e-mail nezměnil/a, je pravděpodobné, že někdo jiný získal přístup k vašemu účtu. Prosím změňte si okamžitě heslo, nebo, pokud se nemůžete na účet přihlásit, kontaktujte administrátora serveru.
-        subject: 'Mastodon: E-mail byl změněn'
+        extra: Pokud jste si e-mailovou adresu neměnili, je pravděpodobné, že někdo jiný získal přístup k vašemu účtu. Změňte si prosím okamžitě heslo, nebo, pokud se nemůžete na účet přihlásit, kontaktujte administrátora serveru.
+        subject: 'Mastodon: E-mailová adresa změněna'
         title: Nová e-mailová adresa
       password_change:
         explanation: Heslo k vašemu účtu bylo změněno.
-        extra: Pokud jste si heslo nezměnil/a, je pravděpodobné, že někdo jiný získal přístup k vašemu účtu. Prosím změňte si okamžitě heslo, nebo, pokud se nemůžete na účet přihlásit, kontaktujte administrátora serveru.
+        extra: Pokud jste si heslo neměnili, je pravděpodobné, že někdo jiný získal přístup k vašemu účtu. Změňte si prosím okamžitě heslo, nebo, pokud se nemůžete na účet přihlásit, kontaktujte administrátora serveru.
         subject: 'Mastodon: Heslo bylo změněno'
         title: Heslo bylo změněno
       reconfirmation_instructions:
         explanation: Potvrďte novou adresu pro změnu e-mailu.
-        extra: Pokud jste tuto změnu nevyžádal/a vy, prosím ignorujte tento e-mail. E-mailová adresa nebude změněna, dokud nepřejdete na výše uvedenou adresu.
+        extra: Pokud jste si tuto změnu nevyžádali vy, považujte tento e-mail za bezpředmětný. Pokud výše uvedenou adresu nenavštívíte, e-mailová adresa změněna nebude.
         subject: 'Mastodon: Potvrďte e-mail pro %{instance}'
         title: Ověřit e-mailovou adresu
       reset_password_instructions:
         action: Změnit heslo
-        explanation: Vyžádal/a jste si pro svůj účet nové heslo.
-        extra: Pokud jste tohle nevyžádal/a, prosím ignorujte tento e-mail. Vaše heslo nebude změněno, dokud nepřejdete na výše uvedenou adresu a nevytvoříte si nové.
+        explanation: Pro svůj účet jste si vyžádali nové heslo.
+        extra: Pokud jste si tuto změnu nevyžádali vy, považujte tento e-mail za bezpředmětný. Pokud výše uvedenou adresu nenavštívíte, vaše heslo změněno nebude.
         subject: 'Mastodon: Instrukce pro obnovení hesla'
         title: Obnovení hesla
       two_factor_disabled:
-        explanation: Dvoufázové ověřování bylo pr váš účet zakázáno. Přihlašování je nyní možné pouze pomocí e-mailové adresy a hesla.
-        subject: 'Mastodon: Dvoufázové ověřování zakázáno'
-        title: 2FA zakázáno
+        explanation: Dvoufázové ověřování bylo pro váš účet vypnuto. Pro přihlášení je nyní stačí pouze e-mailová adresa a heslo.
+        subject: 'Mastodon: Dvoufázové ověřování vypnuto'
+        title: 2FA vypnuto
       two_factor_enabled:
-        explanation: Dvoufázové ověřování bylo pr váš účet povoleno. Pro přihlášení bude vyžadován token vygenerovaný spárovanou TOTP aplikací.
-        subject: 'Mastodon: Dvoufázové ověřování povoleno'
-        title: 2FA povoleno
+        explanation: Dvoufázové ověřování bylo pro váš účet zapnuto. Pro přihlášení bude vyžadován token vygenerovaný spárovanou TOTP aplikací.
+        subject: 'Mastodon: Dvoufázové ověřování zapnuto'
+        title: 2FA zapnuto
       two_factor_recovery_codes_changed:
         explanation: Předchozí záložní kódy byly zrušeny a byly vygenerovány nové.
         subject: 'Mastodon: Dvoufázové záložní kódy znovu vygenerovány'
@@ -64,37 +64,37 @@ cs:
       failure: Nelze vás ověřit z %{kind}, protože „%{reason}“.
       success: Úspěšně ověřeno z účtu %{kind}.
     passwords:
-      no_token: Tuto stránku nemůžete navštívit, pokud nepřicházíte z e-mailu pro obnovení hesla. Pokud z něj přicházíte, ujistěte se, že jste použil/a celé URL z e-mailu.
-      send_instructions: Pokud vaše e-mailová adresa existuje v naší databázi, obdržíte za několik minut ve vašem e-mailu odkaz pro obnovení hesla. Pokud tento e-mail neobdržíte, prosím zkontrolujte si složku „spam“.
-      send_paranoid_instructions: Pokud vaše e-mailová adresa existuje v naší databázi, obdržíte za několik minut ve vašem e-mailu odkaz pro obnovení hesla. Pokud tento e-mail neobdržíte, prosím zkontrolujte si složku „spam“.
-      updated: Vaše heslo bylo úspěšně změněno. Nyní jste přihlášen/a.
+      no_token: Tuto stránku nemůžete navštívit, pokud nepřicházíte z e-mailu pro obnovení hesla. Pokud z něj přicházíte, ujistěte se, že jste použili celou URL adresu z e-mailu.
+      send_instructions: Pokud je vaše e-mailová adresa v naší databázi, obdržíte za několik minut e-mail s odkazem pro obnovení vašeho hesla. Pokud tento e-mail neobdržíte, podívejte se prosím také do složky „spam“.
+      send_paranoid_instructions: Pokud je vaše e-mailová adresa v naší databázi, obdržíte za několik minut e-mail s odkazem pro obnovení vašeho hesla. Pokud tento e-mail neobdržíte, podívejte se prosím také do složky „spam“.
+      updated: Vaše heslo bylo úspěšně změněno. Nyní jste přihlášeni.
       updated_not_active: Vaše heslo bylo úspěšně změněno.
     registrations:
       destroyed: Sbohem! Váš účet byl úspěšně zrušen. Doufáme, že vás opět brzy uvidíme.
-      signed_up: Vítejte! Registroval/a jste se úspěšně.
-      signed_up_but_inactive: Registroval/a jste se úspěšně. Nemohli jsme vás však přihlásit, protože váš účet ještě není aktivován.
-      signed_up_but_locked: Registroval/a jste se úspěšně. Nemohli jsme vás však přihlásit, protože váš účet je uzamčen.
-      signed_up_but_pending: Na vaši e-mailovou adresu byla poslána zpráva s potvrzovacím odkazem. Poté, co kliknete na odkaz, posoudíme váš požadavek. Pokud bude schválen, budete informován/a.
-      signed_up_but_unconfirmed: Na vaši e-mailovou adresu byla poslána zpráva s potvrzovacím odkazem. Pro aktivaci účtu přejděte na danou adresu. Pokud jste tento e-mail neobdržel/a, prosím zkontrolujte si složku spam.
-      update_needs_confirmation: Váš účet byl úspěšně aktualizován, ale je potřeba ověřit vaši novou e-mailovou adresu. Pokud tento e-mail neobdržíte, prosím zkontrolujte si složku „spam“.
+      signed_up: Vítejte! Vaše registrace proběhla úspěšně.
+      signed_up_but_inactive: Vaše registrace proběhla úspěšně. Nemohli jsme vás však přihlásit, protože váš účet ještě není aktivován.
+      signed_up_but_locked: Vaše registrace proběhla úspěšně. Nemohli jsme vás však přihlásit, protože váš účet je uzamčen.
+      signed_up_but_pending: Na vaši e-mailovou adresu byla poslána zpráva s odkazem pro potvrzení. Poté, co na odkaz kliknete, vaši žádost posoudíme. Pokud bude schválena, budeme vás informovat.
+      signed_up_but_unconfirmed: Na vaši e-mailovou adresu byla poslána zpráva s odkazem pro potvrzení. Pro aktivaci vašeho účtu prosím klepněte na v něm uvedený odkaz. Pokud tento e-mail neobdržíte, podívejte se prosím také do složky „spam“.
+      update_needs_confirmation: Váš účet byl úspěšně aktualizován, ale je potřeba ověřit vaši novou e-mailovou adresu. Pokud tento e-mail neobdržíte, podívejte se prosím také do složky „spam“.
       updated: Váš účet byl úspěšně aktualizován.
     sessions:
       already_signed_out: Odhlášení proběhlo úspěšně.
       signed_in: Přihlášení proběhlo úspěšně.
       signed_out: Odhlášení proběhlo úspěšně.
     unlocks:
-      send_instructions: Za několik minut obdržíte e-mail s instrukcemi pro odemčení vašeho účtu. Pokud tento e-mail neobdržíte, prosím zkontrolujte si složku „spam“.
-      send_paranoid_instructions: Pokud váš účet existuje, obdržíte za několik minut e-mail s instrukcemi pro odemčení vašeho účtu. Pokud tento e-mail neobdržíte, prosím zkontrolujte si složku „spam“.
+      send_instructions: Za několik minut obdržíte e-mail s instrukcemi pro odemčení vašeho účtu. Pokud tento e-mail neobdržíte, podívejte se prosím také do složky „spam“.
+      send_paranoid_instructions: Pokud váš účet existuje, obdržíte za několik minut e-mail s instrukcemi pro odemčení vašeho účtu. Pokud tento e-mail neobdržíte, podívejte se prosím také do složky „spam“.
       unlocked: Váš účet byl úspěšně odemčen. Pro pokračování se prosím přihlaste.
   errors:
     messages:
-      already_confirmed: byl již potvrzen, prosím zkuste se přihlásit
-      confirmation_period_expired: musí být potvrzen do %{period}, prosím vyžádejte si nový
-      expired: vypršel, prosím vyžádejte si nový
+      already_confirmed: byl již potvrzen, zkuste se prosím přihlásit
+      confirmation_period_expired: musí být potvrzen do %{period}, vyžádejte si prosím nový
+      expired: vypršel, vyžádejte si prosím nový
       not_found: nenalezen
       not_locked: nebyl uzamčen
       not_saved:
         few: "%{count} chyby zabránily uložení tohoto %{resource}:"
         many: "%{count} chyb zabránilo uložení tohoto %{resource}:"
-        one: '1 chyba zabránila uložení tohoto %{resource}:'
+        one: 'Jedna chyba zabránila uložení tohoto %{resource}:'
         other: "%{count} chyb zabránilo uložení tohoto %{resource}:"
diff --git a/config/locales/devise.da.yml b/config/locales/devise.da.yml
index 5b21dbc61..2cfd24658 100644
--- a/config/locales/devise.da.yml
+++ b/config/locales/devise.da.yml
@@ -8,8 +8,8 @@ da:
     failure:
       already_authenticated: Du er allerede logget ind.
       inactive: Din konto er endnu ikke aktiveret.
-      invalid: Ugyldig %{authentication_keys} eller ugyldigt kodeord.
-      last_attempt: Du har et forsøg tilbage før din konto låses.
+      invalid: Ugyldig %{authentication_keys} eller adgangskode.
+      last_attempt: Du har ét forsøg mere, før din konto bliver låst.
       locked: Din konto er låst.
       not_found_in_database: Ugyldig %{authentication_keys} eller ugyldigt kodeord.
       pending: Din konto er stadig under bedømmelse.
@@ -47,9 +47,17 @@ da:
         subject: 'Mastodon: Instrukser for nulstilling af adgangskode'
         title: Kodeordet er blevet nulstillet
       two_factor_disabled:
+        explanation: To-trins godkendelse for din konto er blevet deaktiveret. Det nu kun muligt at logge ind med email og kodeord.
+        subject: 'Mastodon: To-trins godkendelse er deaktiveret'
         title: 2FA deaktiveret
       two_factor_enabled:
+        explanation: To-trins godkendelse er blevet aktiveret for din konto. En token fra den parrede TOTP app vil være påkrævet for at logge ind.
+        subject: 'Mastodon: To-trins godkendelse er nu aktiveret'
         title: 2FA aktiveret
+      two_factor_recovery_codes_changed:
+        explanation: De tidligere gendannelseskoder er ugyldige og nye genereret.
+        subject: 'Mastodan: To-trins gendannelseskoder er fornyet'
+        title: 2FA gendannelseskoder er ændret
       unlock_instructions:
         subject: 'Mastodon: Instruktioner for oplåsning'
     omniauth_callbacks:
diff --git a/config/locales/devise.de.yml b/config/locales/devise.de.yml
index 372090515..c2eb057f5 100644
--- a/config/locales/devise.de.yml
+++ b/config/locales/devise.de.yml
@@ -20,7 +20,7 @@ de:
       confirmation_instructions:
         action: E-Mail-Adresse verifizieren
         action_with_app: Bestätigen und zu %{app} zurückkehren
-        explanation: Du hast einen Account auf %{host} mit dieser E-Mail-Adresse erstellt. Du bist nun einen Klick entfernt vor der Aktivierung. Wenn du das nicht warst, kannst du diese E-Mail ignorieren.
+        explanation: Du hast einen Account auf %{host} mit dieser E-Mail-Adresse erstellt. Du bist nur noch einen Klick weit entfernt von der Aktivierung. Wenn du das nicht warst, kannst du diese E-Mail ignorieren.
         explanation_when_pending: Du hast dich für eine Einladung bei %{host} mit dieser E-Mailadresse beworben. Sobald du deine E-Mailadresse bestätigst werden wir deine Anfrage überprüfen. Du kannst dich in dieser Zeit nicht anmelden. Wenn deine Anfrage abgelehnt wird, werden deine Daten entfernt, also wird keine weitere Handlung benötigt. Wenn du das nicht warst kannst du diese E-Mail ignorieren.
         extra_html: Bitte lies auch die <a href="%{terms_path}">Regeln des Servers</a> und <a href="%{policy_path}">unsere Nutzungsbedingungen</a>.
         subject: 'Mastodon: Bestätigung deines Kontos bei %{instance}'
@@ -37,7 +37,7 @@ de:
         title: Passwort geändert
       reconfirmation_instructions:
         explanation: Bestätige deine neue E-Mail-Adresse, um sie zu ändern.
-        extra: Wenn diese Änderung nicht von dir angestoßen wurde, dann solltest du diese E-Mail ignorieren. Die E-Mail-Adresse für deinen Mastodon-Account wird sich nicht ändern, bis du den obigen Link anklickst.
+        extra: Wenn diese Änderung nicht von dir ausgeführt wurde, dann solltest du diese E-Mail ignorieren. Die E-Mail-Adresse für deinen Mastodon-Account wird sich nicht ändern, bis du den obigen Link anklickst.
         subject: 'Mastodon: Bestätige E-Mail-Adresse für %{instance}'
         title: Verifiziere E-Mail-Adresse
       reset_password_instructions:
diff --git a/config/locales/devise.et.yml b/config/locales/devise.et.yml
index cc5ef3867..6772443b0 100644
--- a/config/locales/devise.et.yml
+++ b/config/locales/devise.et.yml
@@ -2,7 +2,7 @@
 et:
   devise:
     confirmations:
-      confirmed: Sinu e-postiaadress on edukalt kinnitatud.
+      confirmed: Teie e-postiaadress on edukalt kinnitatud.
       send_instructions: Te saate paari minuti pärast e-kirja juhistega, kuidas oma e-posti aadressit kinnitada. Palun kontrollige oma rämpsposti kausta juhul, kui Te ei saanud seda e-kirja.
       send_paranoid_instructions: Kui Teie e-postiaadress eksisteerib meie andmebaasis, saate paari minuti pärast e-kirja juhistega, kuidas oma e-posti aadressit kinnitada. Palun kontrollige oma rämpsposti kausta juhul, kui Te ei saanud seda e-kirja.
     failure:
@@ -10,7 +10,7 @@ et:
       inactive: Teie konto pole veel aktiveeritud.
       invalid: Valed %{authentication_keys} või parool.
       last_attempt: Teil on veel üks katse kuni teie konto on lukustatud.
-      locked: Sinu konto on lukustatud.
+      locked: Teie konto on lukustatud.
       not_found_in_database: Valed %{authentication_keys} või parool.
       pending: Teie konto on siiani läbivaatlusel.
       timeout: Teie sessioon on aegunud. Jätkamiseks palun sisenege uuesti.
diff --git a/config/locales/devise.gl.yml b/config/locales/devise.gl.yml
index 0ce335576..71439573b 100644
--- a/config/locales/devise.gl.yml
+++ b/config/locales/devise.gl.yml
@@ -2,97 +2,97 @@
 gl:
   devise:
     confirmations:
-      confirmed: O seu enderezo de email foi confirmado con éxito.
-      send_instructions: Nuns minutos recibirá un correo electrónico con instruccións sobre como confirmar o seu enderezo de correo.  Comprobe por favor o cartafol de spam se non recibe este correo.
-      send_paranoid_instructions: Si o seu enderezo existe na nosa base de datos, recibirá nuns minutos un correo con instruccións sobre como confirmar o enderezo de correo. Por favor comprobe o cartafol de spam si non recibe este correo.
+      confirmed: O teu enderezo de email foi confirmado.
+      send_instructions: Vas recibir un email coas instrucións para confirmar o teu enderezo de email dentro dalgúns minutos. Por favor, comproba o cartafol de spam se non recibiches o correo.
+      send_paranoid_instructions: Se o teu enderezo de email xa existira na nosa base de datos, vas recibir un correo coas instrucións de confirmación dentro dalgúns minutos. Por favor, comproba o cartafol de spam se non recibiches o correo.
     failure:
-      already_authenticated: Xa está conectada.
-      inactive: A súa conta aínda non foi activada.
-      invalid: Contrasinal ou %{authentication_keys} non válidos.
-      last_attempt: Quédalle un intento antes de que a conta sexa bloqueada.
-      locked: A súa conta foi bloqueada.
-      not_found_in_database: Contrasinal ou %{authentication_keys} non válidos.
-      pending: A súa conta está en proceso de revisión.
-      timeout: Caducou a sesión. Por favor conéctese de novo para seguir.
-      unauthenticated: Precisa rexistrarse ou conectarse para continuar.
-      unconfirmed: Debe confirmar o seu enderezo de correo antes de continuar.
+      already_authenticated: Xa estás rexistrado.
+      inactive: A túa conta aínda non está activada.
+      invalid: "%{authentication_keys} ou contrasinal non validos."
+      last_attempt: Tes máis dun intento antes de que a túa conta fique bloqueada.
+      locked: A túa conta está bloqueada.
+      not_found_in_database: "%{authentication_keys} ou contrasinal non válidos."
+      pending: A túa conta aínda está baixo revisión.
+      timeout: A túa sesión expirou. Por favor, entra de novo para continuares.
+      unauthenticated: Precisas de entrar na túa conta ou rexistrarte antes de continuar.
+      unconfirmed: Tes que confirmar o teu enderezo de email antes de continuar.
     mailer:
       confirmation_instructions:
-        action: Validar enderezo de correo-e
+        action: Verificar o enderezo de email
         action_with_app: Confirmar e voltar a %{app}
-        explanation: Creou unha conta en %{host} con este enderezo de correo. Está a punto de activalo, si non foi vostede quen fixo a petición, por favor ignore este correo.
-        explanation_when_pending: Vostede solicitou un convite para %{host} con este enderezo de correo. Unha vez confirme o enderezo de correo revisaremos a solicitude. Non pode conectarse ata entón. Si a solicitude fose rexeitada, os seus datos eliminaranse, así que non precisaría facer nada máis. Se non fixo vostede unha solicitude por favor ignore este correo.
-        extra_html: Por favor, lea tamén <a href="%{terms_path}">as normas do sevidor</a> e <a href="%{policy_path}">os termos do servizo</a>.
-        subject: 'Mastodon: Instruccións de confirmación para %{instance}'
-        title: Verificar enderezo de correo-e
+        explanation: Creaches unha conta en %{host} con este enderezo de email. Estás a un clic de activala. Se non foches ti o que fixeches este rexisto, por favor ignora esta mensaxe.
+        explanation_when_pending: Solicitaches un convite para %{host} com este enderezo de email. Logo de que confirmes o teu enderezo de email, imos revisar a túa inscrición. Podes iniciar sesión para mudar os teus datos ou eliminar a túa conta, mais non poderás aceder á meirande parte das funcións até que a túa conta sexa aprobada. Se a túa inscrición for rexeitada, os teus datos serán eliminados, polo que non será necesaria calquera acción adicional da túa parte. Se non solicitaches este convite, por favor, ignora este correo.
+        extra_html: Por favor, le <a href="%{terms_path}">as regras do servidor</a> e os <a href="%{policy_path}">nosos termos do servizo</a>.
+        subject: 'Mastodon: Instrucións de confirmación para %{instance}'
+        title: Verificar o enderezo de email
       email_changed:
-        explanation: 'O seu enderezo de correo para esta conta foi cambiado a:'
-        extra: Se non fixo a petición de cambio de correo-e é probable que alguén obtivese acceso a súa conta. Por favor, cambie o contrasinal inmediatamente ou contacte coa administración do servidor se non ten acceso a súa conta.
-        subject: 'Mastodon: email cambiado'
-        title: Novo enderezo de correo
+        explanation: 'O email asociado á túa conta será mudado a:'
+        extra: Se non mudaches o teu email é posíbel que alguén teña conseguido acceder á túa conta. Por favor muda o teu contrasinal de xeito imediato ou entra en contacto cun administrador do servidor se ficaste sen acceso á túa conta.
+        subject: 'Mastodon: Email mudado'
+        title: Novo enderezo de email
       password_change:
-        explanation: Cambiouse o contrasinal da súa conta.
-        extra: Se non cambiou o contrasinal, é probable que alguén obtivese acceso a súa conta. Por favor cambie o contrasinal inmediatamente ou contacte coa administración do servidor se non ten acceso a súa conta.
-        subject: 'Mastodon: contrasinal cambiado'
-        title: Contrainal cambiado
+        explanation: O contrasinal da túa conta foi mudado.
+        extra: Se non mudaches o teu contrasinal, é posíbel que alguén teña conseguido acceder á túa conta. Por favor muda o teu contrasinal de xeito imediato ou entra en contato cun administrador do servidor se ficaste sen acesso á túa conta.
+        subject: 'Mastodon: Contrasinal mudado'
+        title: Contrainal mudado
       reconfirmation_instructions:
-        explanation: Confirme o novo enderezo para cambiar o correo-e.
-        extra: Si vostede non fixo esta petición, ignore este correo por favor. Este enderezo de correo-e para a conta Mastodon non cambiará ate que acceda a ligazón superior.
-        subject: 'Mastodon: Confirme email para %{instance}'
-        title: Verificación do enderezo de correo-e
+        explanation: Confirma o teu novo enderezo para mudar o email.
+        extra: Se esta mudanza non foi comezada por ti, por favor ignora este email. O enderezo de email para a túa conta do Mastodon non mudará mentres non accedas á ligazón de enriba.
+        subject: 'Mastodon: Confirmar email para %{instance}'
+        title: Verificar o enderezo de email
       reset_password_instructions:
-        action: Cambiar contrasinal
-        explanation: Solicitou un novo contrasinal para a súa conta.
-        extra: Si non fixo esta solicitude, por favor ignore este correo. O seu contrasinal non cambiará ate que acceda a ligazón superior e cree unha nova.
-        subject: 'Mastodon: Instruccións para restablecer o contrasinal'
-        title: Restablecer contrasinal
+        action: Mudar contrasinal
+        explanation: Solicitaches un novo contrasinal para a túa conta.
+        extra: Se non fixeches esta solicitude, por favor ignora este email. O teu contrasinal non mudará se non accedes á ligazón de enriba e creas unha nova.
+        subject: 'Mastodon: Instrucións para restabelecer o contrasinal'
+        title: Restabelecer contrasinal
       two_factor_disabled:
-        explanation: Desactivouse o segundo factor de autenticación para túa conta. Agora xa podes conectarte utilizando só o correo-e e contrasinal.
-        subject: 'Mastodon: Autenticación con dobre factor desactivada'
-        title: 2FA desactivada
+        explanation: A autenticación de dobre factor para a túa conta foi desactivada. É agora posíbel acceder só co teu enderezo de email e contrasinal.
+        subject: 'Mastodon: Autenticación de dobre factor desactivada'
+        title: 2FA desactivado
       two_factor_enabled:
-        explanation: A autenticación con dobre factor foi activada para a túa conta. Pedirase o testemuño xerado pola aplicación TOTP emparellada.
-        subject: 'Mastodon: Activouse o dobre factor de autenticación'
+        explanation: A autenticación de dobre factor foi activada para a túa conta. Un token, xerado pola aplicación TOTP emparellada, será necesario para acceder.
+        subject: 'Mastodon: Activouse a autenticación de dobre factor'
         title: 2FA activado
       two_factor_recovery_codes_changed:
-        explanation: Os códigos de recuperación anteriores quedan anulados e os novos foron creados.
-        subject: 'Mastodon: Código de recuperación do dobre factor rexenerados'
-        title: Códigos de recuperación 2FA cambiados
+        explanation: Os códigos de recuperación anteriores fican anulados e os novos foron xerados.
+        subject: 'Mastodon: Xerados novos códigos de recuperación de dobre factor'
+        title: Códigos de recuperación 2FA mudados
       unlock_instructions:
-        subject: 'Mastodon: Instruccións para desbloquear'
+        subject: 'Mastodon: Instrucións para desbloquear'
     omniauth_callbacks:
-      failure: Non podemos autenticala desde %{kind} porque "%{reason}".
-      success: Autenticouse con éxito desde a conta %{kind}.
+      failure: Non foi posíbel autenticar %{kind} porque "%{reason}".
+      success: Autenticado con éxito na conta %{kind}.
     passwords:
-      no_token: Non pode acceder a esta páxina vindo desde un correo de restablecemento de contrasinal. Si vostede chega desde un correo de restablecemento de contrasinal, por favor asegúrese de que utiliza o URL completo proporcionado.
-      send_instructions: Si o seu enderezo de correo existe na nosa base de datos,  nuns minutos recibirá unha ligazón para recuperar o contrasinal. Por favor comprobe o seu cartafol de spam si non recibe este correo.
-      send_paranoid_instructions: Si o seu enderezo de correo existe na nosa base de datos, recibirá nuns minutos unha ligazón para recuperar o contrasinal. Por favor comprobe o seu cartafol de spam si non recibe este correo.
-      updated: Cambiou o contrasinal con éxito. Agora xa está conectada.
-      updated_not_active: Cambiouse o seu contrasinal correctamente.
+      no_token: Non podes acceder a esta páxina se non vés a través da ligazón enviada por email para o mudado do teu contrasinal. Se empregaches esa ligazón para chegar aquí, por favor verifica que o enderezo URL actual é o mesmo do que foi enviado no email.
+      send_instructions: Se o teu enderezo de email existe na nosa base de datos, vas recibir un email coas instrucións para mudar o contrasinal dentro duns minutos. Por favor, comproba o teu cartafol de correo lixo (spam) se ves que non recibiches o email.
+      send_paranoid_instructions: Se o teu enderezo de email existe na nosa base de datos, vas recibir unha ligazón para recuperar o contrasinal dentro duns minutos. Por favor, comproba o teu cartafol de correo lixo (spam) se ves que non recibiches o email.
+      updated: O teu contrasinal foi mudado. Estás xa autenticado na túa conta.
+      updated_not_active: O teu contrasinal foi mudado de xeito correcto.
     registrations:
-      destroyed: Adeus! A súa conta cancelouse con éxito. Agardamos vela de novo.
-      signed_up: Ben vida! Rexistrouse con éxito.
-      signed_up_but_inactive: Rexistrouse correctamente. Porén, aínda non podemos conectala porque a súa conta aínda non foi activada.
-      signed_up_but_locked: Rexistrouse correctamente. Porén, non podemos conectala porque a conta está bloqueada.
-      signed_up_but_pending: Enviouselle unha mensaxe de correo que contén unha ligazón de confirmación. Tras pulsar na ligazón, revisaremos a súa solicitude. Notificarémoslle se está aprobada.
-      signed_up_but_unconfirmed: Foi enviada unha mensaxe con unha ligazón de confirmación ao seu enderezo electrónico. Por favor siga a ligazón para activar a súa conta. Por favor comprobe o cartafol de spam si non recibe este correo.
-      update_needs_confirmation: Actualizou a súa conta correctamente, pero precisamos verificar o seu enderezo. Por favor comprobe o seu email e siga a ligazón de confirmación para confirmar o seu novo enderezo. Por favor comprobe o cartafol de spam si non recibe este correo.
-      updated: A súa conta foi actualizada correctamente.
+      destroyed: Adeus! A túa conta foi cancelada de xeito correcto. Agardamos verte de novo.
+      signed_up: Benvido! Rexistrácheste de xeito correcto.
+      signed_up_but_inactive: A túa conta foi rexistada. Porén aínda non está activada.
+      signed_up_but_locked: A túa conta foi rexistada. Porén está bloqueada.
+      signed_up_but_pending: Unha mensaxe cunha ligazón de confirmación foi enviada ó teu enderezo de email. Após premer na ligazón, revisaremos a túa aplicación. Serás notificado se a túa conta é aprobada.
+      signed_up_but_unconfirmed: Unha mensaxe cunha ligazón de confirmación foi enviada ó teu email. Por favor, segue esa ligazón para activar a túa conta. Comproba o teu cartafol de correo lixo (spam) se ves que non recibiches o correo.
+      update_needs_confirmation: Actualizaches a túa conta de xeito correcto, pero precisamos verificar o teu novo enderezo de email. Por favor, revisa o teu email e segue a ligazón para confirmar o teu novo enderezo de email. Comproba o teu cartafol de correo lixo (spam) se ves que non recibiches o correo.
+      updated: A túa conta foi actualizada de xeito correcto.
     sessions:
-      already_signed_out: Desconectouse con éxito.
-      signed_in: Conectouse correctamente.
-      signed_out: Desconectouse correctamente.
+      already_signed_out: Pechouse a sesión de xeito correcto.
+      signed_in: Iniciouse a sesión de xeito correcto.
+      signed_out: Pechouse a sesión de xeito correcto.
     unlocks:
-      send_instructions: Recibirá nuns minutos un correo con instrucións sobre como desbloquear a súa conta. Por favor comprobe o cartafol de spam si non recibe este correo.
-      send_paranoid_instructions: Si a conta existe, recibirá un correo nuns minutos sobre como desbloquear a súa conta. Por favor comprobe o cartafol de spam si non recibe este correo.
-      unlocked: A súa conta foi desbloqueada correctamente. Por favor, conéctese para continuar.
+      send_instructions: Vas recibir un email coas instrucións para desbloquear a túa conta dentro duns minutos. Por favor, comproba o teu cartafol de correo lixo (spam) se ves que non recibiches o correo.
+      send_paranoid_instructions: Se a túa conta existe, vas recibir un email coas instrucións detalladas de como desbloqueala dentro duns minutos. Por favor, comproba o teu cartafol de correo lixo (spam) se ves que non recibiches o correo.
+      unlocked: A túa conta foi desbloqueada. Por favor, inicia a sesión para continuar.
   errors:
     messages:
-      already_confirmed: xa foi confirmada, por favor intente conectarse
-      confirmation_period_expired: precisa ser confirmada en %{period}, por favor solicite unha nova
-      expired: caducou, por favor solicite unha nova
-      not_found: non se atopou
+      already_confirmed: xa confirmado, tenta iniciar a sesión
+      confirmation_period_expired: ten que ser confirmado dentro de %{period}, solicita unha nova
+      expired: expirou, solicita unha nova
+      not_found: non atopado
       not_locked: non foi bloqueada
       not_saved:
-        one: '1 erro evitou que %{resource} fose gardada:'
-        other: "%{count} erros evitaron que %{resource} fose gardada:"
+        one: '1 erro impediu este %{resource} de ser gardado:'
+        other: "%{count} erros impediron este %{resource} de ser gardado:"
diff --git a/config/locales/devise.is.yml b/config/locales/devise.is.yml
new file mode 100644
index 000000000..288617be8
--- /dev/null
+++ b/config/locales/devise.is.yml
@@ -0,0 +1,98 @@
+---
+is:
+  devise:
+    confirmations:
+      confirmed: Tölvupóstfang þitt hefur verið staðfest.
+      send_instructions: Þú munt innan nokkurra mínútna fá tölvupóst með leiðbeiningunum um hvernig eigi að staðfesta tölvupóstfangið þitt. Skoðaðu í ruslpóstmöppuna þína ef þú færð ekki þennan tölvupóst.
+      send_paranoid_instructions: Ef tölvupóstfangið þitt fyrirfinnst í gagnagrunninum okkar, munt þú innan nokkurra mínútna fá tölvupóst með leiðbeiningunum um hvernig eigi að staðfesta tölvupóstfangið þitt. Skoðaðu í ruslpóstmöppuna þína ef þú færð ekki þennan tölvupóst.
+    failure:
+      already_authenticated: Þú ert nú þegar skráð(ur) inn.
+      inactive: Aðgangur þinn hefur ekki enn verið virkjaður.
+      invalid: Ógildur %{authentication_keys} eða lykilorð.
+      last_attempt: Þú getur reynt einu sinni í viðbót áður en aðgangnum þínum verður læst.
+      locked: Notandaaðgangurinn þinn er læstur.
+      not_found_in_database: Ógildur %{authentication_keys} eða lykilorð.
+      pending: Notandaaðgangurinn þinn er enn til yfirferðar.
+      timeout: Setan þín er útrunnin. Skráðu þig aftur inn til að halda áfram.
+      unauthenticated: Þú þarft að skrá þig inn eða nýskrá þig áður en lengra er haldið.
+      unconfirmed: Þú verður að staðfesta tölvupóstfangið þitt áður en lengra er haldið.
+    mailer:
+      confirmation_instructions:
+        action: Staðfestu tölvupóstfang
+        action_with_app: Staðfestu og snúðu aftur í %{app}
+        explanation: Þú hefur búið til notandaaðgang á %{host} með þessu tölvupóstfangi. Þú ert einn smell frá því að virkja hann. Ef það varst ekki þú sem baðst um þetta, geturðu hunsað þennan tölvupóst.
+        explanation_when_pending: Þú sóttir um að vera boðinn á %{host} með þessu tölvupóstfangi. Þegar þú hefur staðfest tölvupóstfangið, munum við fara yfir umsóknina þína. Þú getur skrá þig inn og breytt ýmsum upplýsingum um þig eða jafnvel eytt aðgangnum þínum, en þú getur hinsvegar ekki nýtt þér flesta eiginleika hans fyrr en búið er að samþykkja aðganginn. Ef umsókninni er hafnað, verður öllum gögnum um þig eytt, þannig að ekki verður krafist frekari aðgerða af þinni hálfu. Ef það varst ekki þú sem baðst um þetta, geturðu hunsað þennan tölvupóst.
+        extra_html: Skoðaðu líka <a href="%{terms_path}">gildandi reglur vefþjónsins</a> og <a href="%{policy_path}">þjónustuskilmálana okkar</a>.
+        subject: 'Mastodon: Leiðbeiningar vegna staðfestingar á %{instance}'
+        title: Staðfestu tölvupóstfang
+      email_changed:
+        explanation: 'Tölvupóstfanginu fyrir notandaaðganginn þinn verður breytt í:'
+        extra: Ef það varst ekki þú sem breyttir tölvupóstfanginu þínu, þá er líklegt að einhver hafi komist inn í notandaaðganginn þinn. Skiptu núna strax um lykilorð eða hafðu samband við kerfisstjóra netþjónsins ef þú hefur verið læst/ur úti af notandaaðgangnum þínum.
+        subject: 'Mastodon: Tölvupóstfang breyttist'
+        title: Nýtt tölvupóstfang
+      password_change:
+        explanation: Lykilorðinu á notandaaðgangnum þínum hefur verið breytt.
+        extra: Ef það varst ekki þú sem breyttir lykilorðinu þínu, þá er líklegt að einhver hafi komist inn í notandaaðganginn þinn. Skiptu núna strax um lykilorð eða hafðu samband við kerfisstjóra netþjónsins ef þú hefur verið læst/ur úti af notandaaðgangnum þínum.
+        subject: 'Mastodon: Lykilorð breyttist'
+        title: Lykilorð breyttist
+      reconfirmation_instructions:
+        explanation: Staðfestu nýja vistfangið til að skipta um tölvupóstfang.
+        extra: Ef það varst ekki þú sem baðst um þessa breytingu, geturðu hunsað þennan tölvupóst. Tölvupóstfangið fyrir Mastodon-aðganginn mun ekki breytast fyrr en þú hefur fylgt tenglinum hér fyrir ofan.
+        subject: 'Mastodon: Staðfestu tölvupóst fyrir %{instance}'
+        title: Staðfestu tölvupóstfang
+      reset_password_instructions:
+        action: Breyta lykilorði
+        explanation: Þú baðst um nýtt lykilorð fyrir notandaaðganginn þinn.
+        extra: Ef það varst ekki þú sem baðst um þetta, geturðu hunsað þennan tölvupóst. Lykilorðið þitt mun ekki breytast fyrr en þú hefur fylgt tenglinum hér fyrir ofan og búið til nýtt lykilorð.
+        subject: 'Mastodon: Leiðbeiningar til að endurstilla lykilorð'
+        title: Endurstilling lykilorðs
+      two_factor_disabled:
+        explanation: Tveggja-þátta auðkenning fyrir aðganginn þinn hefur verið gerð óvirk. Núna er einungis hægt að skrá inn með tölvupóstfangi og lykilorði.
+        subject: 'Mastodon: Tveggja-þátta auðkenning er óvirk'
+        title: 2FA tveggja-þátta auðkenning er óvirk
+      two_factor_enabled:
+        explanation: Tveggja-þátta auðkenning hefur verið gerð virk fyrir aðganginn þinn. Krafist er teikns útbúnu af paraða TOTP-forritinu til að skrá inn.
+        subject: 'Mastodon: Tveggja-þátta auðkenning er virk'
+        title: 2FA tveggja-þátta auðkenning er virk
+      two_factor_recovery_codes_changed:
+        explanation: Fyrri endurheimtukóðar tveggja-þátta auðkenningar voru ógiltir og nýir útbúnir í staðinn.
+        subject: 'Mastodon: Endurheimtukóðar tveggja-þátta auðkenningar voru endurnýjaðir'
+        title: Endurheimtukóðar tveggja-þátta auðkenningar breyttust
+      unlock_instructions:
+        subject: 'Mastodon: Leiðbeiningar til að aflæsa'
+    omniauth_callbacks:
+      failure: Gat ekki auðkennt þig frá %{kind} vegna "%{reason}".
+      success: Tókst að auðkenna frá %{kind} notandaaðgangnum.
+    passwords:
+      no_token: Þú getur ekki séð þessa síðu án þess að koma á slóð úr tölvupósti fyrir endurstillingu lykilorðs. Ef svo er skaltu ganga úr skugga um að að þú hafir notað alla slóðina sem var gefin.
+      send_instructions: Ef tölvupóstfangið þitt fyrirfinnst í gagnagrunninum okkar, munt þú innan nokkurra mínútna fá tölvupóst með tengli til að endurheimta lykilorðið þitt. Skoðaðu í ruslpóstmöppuna þína ef þú færð ekki þennan tölvupóst.
+      send_paranoid_instructions: Ef tölvupóstfangið þitt fyrirfinnst í gagnagrunninum okkar, munt þú innan nokkurra mínútna fá tölvupóst með tengli til að endurheimta lykilorðið þitt. Skoðaðu í ruslpóstmöppuna þína ef þú færð ekki þennan tölvupóst.
+      updated: Það tókst að breyta lykilorðinu þínu. Þú ert núna skráð/ur inn.
+      updated_not_active: Það tókst að breyta lykilorðinu þínu.
+    registrations:
+      destroyed: Bless! Hætt hefur verið við notandaaðganginn þinn. Við vonumst samt eftir að sjá þig fljótt aftur.
+      signed_up: Velkonin/n! Það tókst að nýskrá þig.
+      signed_up_but_inactive: Þér hefur tekist að nýskrá þig. Hinsvegar gátum við ekki skráð þig inn því notandaaðgangurinn þinn hefur ekki enn verið virkjaður.
+      signed_up_but_locked: Þér hefur tekist að nýskrá þig. Hinsvegar gátum við ekki skráð þig inn því notandaaðgangurinn þinn er læstur.
+      signed_up_but_pending: Skilaboð með staðfestingartengli hafa verið send á tölvupóstfangið þitt. Þegar þú smellir á þennan tengil munum við yfirfara og staðfesta umsóknina þína. Þú færð svo að vita hvort hún verður samþykkt.
+      signed_up_but_unconfirmed: Skilaboð með staðfestingartengli hafa verið send á tölvupóstfangið þitt. Smelltu á þennan tengil til að virkja notandaaðganginn þinn. Skoðaðu í ruslpóstmöppuna þína ef þú færð ekki þessi skilaboð.
+      update_needs_confirmation: Þú uppfærðir notandaaðganginn þinn, en við þurfum að sannreyna nýja tölvupóstfangið þitt. Skoðaðu tölvupóstinn þinn og fylgdu tenglinum sem þangað á að berast til að staðfesta tölvupóstfangið þitt. Skoðaðu í ruslpóstmöppuna þína ef þú færð ekki þennan tölvupóst.
+      updated: Það tókst að uppfæra notandaaðganginn þinn.
+    sessions:
+      already_signed_out: Tókst að skrá út.
+      signed_in: Tókst að skrá inn.
+      signed_out: Tókst að skrá út.
+    unlocks:
+      send_instructions: Þú munt innan nokkurra mínútna fá tölvupóst með leiðbeiningunum um hvernig eigi að aflæsa notandaaðgangnum þínum. Skoðaðu í ruslpóstmöppuna þína ef þú færð ekki þennan tölvupóst.
+      send_paranoid_instructions: Ef notandaaðgangurinn þinn er til, munt þú innan nokkurra mínútna fá tölvupóst með leiðbeiningunum um hvernig eigi að aflæsa honum. Skoðaðu í ruslpóstmöppuna þína ef þú færð ekki þennan tölvupóst.
+      unlocked: Það tókst að aflæsa notandaaðgangnum þínum. Skráðu þig inn til að halda áfram.
+  errors:
+    messages:
+      already_confirmed: var þegar staðfest, prófaðu að skrá þig inn
+      confirmation_period_expired: þarf að staðfesta inna %{period}, biddu um nýtt
+      expired: er útrunnið, biddu um nýtt
+      not_found: fannst ekki
+      not_locked: var ekki læst
+      not_saved:
+        one: '1 villa kom í veg fyrir að þessi %{resource} væri vistað:'
+        other: "%{count} villur komu í veg fyrir að þessi %{resource} væri vistað:"
diff --git a/config/locales/devise.kab.yml b/config/locales/devise.kab.yml
new file mode 100644
index 000000000..ccfd78ca9
--- /dev/null
+++ b/config/locales/devise.kab.yml
@@ -0,0 +1,58 @@
+---
+kab:
+  devise:
+    confirmations:
+      confirmed: Tansa-ik imayl tettwasentem.
+      send_instructions: Deg kra n tesdatin, ad n-teṭṭfeḍ imayl deg-s iwellihen i ilaqen i usentem n umiḍan-ik. Ma yella ur tufiḍ ara izen-agi, ttxil-k ẓer deg ukaram spam.
+      send_paranoid_instructions: Ma yella tansa-ik imayl tella deg uzadur-nneɣ n yisefka, ad n-teṭṭfeḍ imayl deg tesdatin i d-iteddun, deg-s iwellihen i ilaqen i usentem n umiḍan-ik. Ma yella ur tufiḍ ara izen-agi, ttxil-k ẓer deg ukaram spam.
+    failure:
+      already_authenticated: Aqla-k teqqneḍ yakan.
+      inactive: Amiḍan-inek mazal ur yermed ara.
+      invalid: Tella tuccḍa deg %{authentication_keys} neɣ deg wawal uffir.
+      last_attempt: Ɣur-k yiwen n uɛraḍ-nniḍen kan qbel ad yettucekkel umiḍan-ik.
+      locked: Amiḍan-ik yewḥel.
+      not_found_in_database: Tella tuccḍa deg %{authentication_keys} neɣ deg wawal uffir.
+      pending: Amiḍan-inek mazal-it deg ɛiwed n tmuɣli.
+      timeout: Tiɣimit n tuqqna tezri. Ma ulac aɣilif ɛiwed tuqqna akken ad tkemmleḍ.
+      unauthenticated: Ilaq ad teqqneḍ neɣ ad tjerrḍeḍ akken ad tkemmelḍ.
+      unconfirmed: Ilaq ad wekdeḍ tansa-inek imayl akken ad tkemmelḍ.
+    mailer:
+      confirmation_instructions:
+        action: Senqed tansa-inek imayl
+        action_with_app: Wekked sakkin uɣal ɣer %{app}
+        explanation: Aqla-k terniḍ amiḍan deg %{host} s tansa imayl-agi. Mazal-ak yiwen utekki akken ad t-tremdeḍ. Ma mačči d kečč i yessutren ay-agi, ttxil-k ssinef izen-a.
+        explanation_when_pending: Tsutreḍ-d ajerred deg %{host} s tansa-agi imayl. Ad nɣeṛ asuter-ik ticki tsentmeḍ tansa-ik imayl. Send asentem, ur tezmireḍ ara ad teqqneḍ ɣer umiḍan-ik. Ma yella nugi asuter-ik, isefka-ik ad ttwakksen seg uqeddac, ihi ulac tigawt-nniḍen ara k-d-yettuqeblen. Ma mačči d kečč i yellan deffir n usuter-agi, ttxil-k ssinef izen-agi.
+        extra_html: Ttxil-k ẓer daɣen <a href="%{terms_path}">ilugan n uqeddac</a> akked <a href="%{policy_path}">twetlin n useqdec</a>.
+        subject: 'Mastudun: Asentem n ujerred deg uqeddac %{instance}'
+        title: Senqed tansa-inek imayl
+      email_changed:
+        extra: Ma mačči d kečč i ibeddlen tansa imayl, ihi yezmer d alebɛaḍ i ikecmen ɣer umiḍan-ik. Ttxil-k beddel awal-ik uffir tura neɣ siwel i unedbal n uqeddac ma tḥesleḍ berra n umiḍan-ik.
+        subject: 'Masṭudun: Imayl-ik yettubeddel'
+        title: Tansa imayl tamaynut
+      password_change:
+        explanation: Awal uffir n umiḍan-ik yettubeddel.
+        extra: Ma mačči d kečč i ibeddlen awal uffir, ihi yezmer d alebɛaḍ i ikecmen ɣer umiḍan-ik. Ttxil-k beddel awal-ik uffir tura neɣ siwel i unedbal n uqeddac ma tḥesleḍ berra n umiḍan-ik.
+        subject: 'Masṭudun: Yettubeddel wawal-ik uffir'
+        title: Awal uffir yettubeddel
+      reconfirmation_instructions:
+        explanation: Sentem tansa imayl tamaynut akken ad tbeddleḍ imayl-inek.
+        subject: 'Mastudun: Sentem tansa imayl n %{instance}'
+        title: Senqed tansa-inek imayl
+      reset_password_instructions:
+        action: Beddel awal uffir
+        explanation: Tessutreḍ awal uffir amaynut i umiḍan-ik.
+        title: Aɛiwed n wawal uffir
+    passwords:
+      send_paranoid_instructions: Ma nufa tansa-inek imayl tella deg uzadur-nneɣ n yisefka, ad n-teṭṭfeḍ izen deg kra n tesdatin, deg-s assaɣ i uɛawed n wawal uffir. Ma ur k-in-yewwiḍ ara yizen, ttxil-k ẓer deg ukaram spam.
+      updated: Awal-ik uffir yettwabeddel mebla ugur. Aqla-k tura tjerrḍeḍ.
+      updated_not_active: Awal-ik uffir yettwabeddel mebla ugur.
+    registrations:
+      destroyed: Ar timlilit! Amiḍan-ik yettwakkes mebla ugur. Nessaram ad k-nwali tikelt-nniḍen.
+      signed_up: Anṣuf! Aqla-k tkecmeḍ.
+    sessions:
+      signed_in: Aqla-k teqqneḍ.
+      signed_out: Aqla-k teffɣeḍ.
+  errors:
+    messages:
+      not_found: ulac-it
+      not_locked: ur yettucekkel ara
diff --git a/config/locales/devise.kn.yml b/config/locales/devise.kn.yml
index d094088d8..323889e42 100644
--- a/config/locales/devise.kn.yml
+++ b/config/locales/devise.kn.yml
@@ -1 +1,5 @@
+---
 kn:
+  devise:
+    confirmations:
+      confirmed: '"ಸಂದರ್ಭ"'
diff --git a/config/locales/devise.ml.yml b/config/locales/devise.ml.yml
index 3d4cea716..08db40224 100644
--- a/config/locales/devise.ml.yml
+++ b/config/locales/devise.ml.yml
@@ -1,8 +1,32 @@
 ---
 ml:
   devise:
+    confirmations:
+      confirmed: നിങ്ങളുടെ ഇലക്ട്രോണിക് കത്തിന്റെ മേൽവിലാസം വിജയകരമായി സ്ഥിരീകരിക്കപ്പെട്ടിരിക്കുന്നു.
+      send_instructions: ഏതാനും നിമിഷങ്ങൾക്കുള്ളിൽ നിങ്ങൾക്ക് നിങ്ങളുടെ ഇലക്ട്രോണിക് കത്തിന്റെ വിലാസം എങ്ങനെ സ്ഥിരീകരിക്കാം എന്നുള്ള നിർദ്ദേശങ്ങൾ അതെ വിലാസത്തിൽ ലഭിക്കുന്നതാണ്. അത് ലഭിച്ചില്ലെങ്കിൽ അസംബന്ധമായ കത്തുകൾ ശേഖരിക്കപ്പെടുന്ന സ്ഥലത്ത് എത്തപ്പെട്ടോ എന്ന് പരിശോധിക്കുക.
+      send_paranoid_instructions: ഞങ്ങളുടെ വിവരശേഖരണത്തിൽ നിങ്ങളുടെ ഇലക്ട്രോണിക് കത്തിന്റെ വിലാസം ഉൾപെട്ടിട്ടുണ്ടെങ്കിൽ ഏതാനും നിമിഷങ്ങൾക്കുള്ളിൽ നിങ്ങൾക്ക് അത് എങ്ങനെ സ്ഥിരീകരിക്കാം എന്നുള്ള നിർദ്ദേശങ്ങൾ അതെ വിലാസത്തിൽ ലഭിക്കുന്നതാണ്. കത്ത് ലഭിച്ചില്ലെങ്കിൽ അസംബന്ധമായ കത്തുകൾ ശേഖരിക്കപ്പെടുന്ന സ്ഥലത്ത് എത്തപ്പെട്ടോ എന്ന് പരിശോധിക്കുക.
+    failure:
+      already_authenticated: നിങ്ങൾ മുൻപേതന്നെ പ്രവേശിച്ചിരുന്നു.
+      inactive: നിങ്ങളുടെ അംഗത്വം ഇതുവരെ സജീവമാക്കപ്പെട്ടിട്ടില്ല.
+      invalid: "%{authentication_keys} അല്ലെങ്കിൽ സൂത്രവാക്യം പ്രാബല്യത്തിലില്ല."
+      last_attempt: നിങ്ങളുടെ അംഗത്വം ബന്ധിക്കപ്പെടുന്നതിന് മുൻപ് ഒരു അവസരം കൂടി ബാക്കിയുണ്ട്.
+      locked: നിങ്ങളുടെ അംഗത്വം ബന്ധിക്കപ്പെട്ടിരിക്കുന്നു.
+      not_found_in_database: "%{authentication_keys} അല്ലെങ്കിൽ സൂത്രവാക്യം പ്രാബല്യത്തിലില്ല."
+      pending: നിങ്ങളുടെ അംഗത്വം ഇപ്പോഴും അവലോകനയിലാണ്.
+      timeout: നിങ്ങളുടെ വിഹരണസമയം കാലഹരണപ്പെട്ടിരിക്കുന്നു. തുടരാൻ ദയവായി വീണ്ടും പ്രവേശിക്കുക.
+      unauthenticated: തുടരുന്നതിന് മുൻപ് നിങ്ങൾ അംഗത്വത്തോടെ പ്രവേശിക്കുകയോ അംഗത്വം എടുക്കുകയോ ചെയ്യേണ്ടതാണ്.
+      unconfirmed: തുടരുന്നതിന് മുൻപ് നിങ്ങൾ നിങ്ങളുടെ ഇലക്ട്രോണിക് കത്തിന്റെ മേൽവിലാസം സ്ഥിരീകരിക്കേണ്ടതാണ്.
     mailer:
+      confirmation_instructions:
+        action: ഇലക്ട്രോണിക് കത്തിന്റെ മേൽവിലാസം നേരാണെന്നു തെളിയിക്കുക
+        action_with_app: സ്ഥിരീകരിക്കുകയും, %{app} ലേക്ക് തിരികെ പോകുകയും ചെയ്യുക
+        title: ഇമെയിൽ മേൽവിലാസം നേരാണെന്നു തെളിയിക്കുക
+      email_changed:
+        explanation: 'നിങ്ങളുടെ അംഗത്വത്തിനായുള്ള ഇമെയിൽ വിലാസം ഇതിലേക്ക് മാറ്റുകയാണ്:'
+        subject: 'മാസ്റ്റോഡോൺ: ഇമെയിൽ മാറ്റം വരുത്തി'
+        title: പുതിയ ഇ-മെയിൽ വിലാസം
       password_change:
+        explanation: താങ്കളുടെ അംഗത്വത്തിന്റെ പാസ്സ് വേഡ് മാറ്റം വരുത്തി.
         title: പാസ് വേഡ് മാറ്റി
       reset_password_instructions:
         action: പാസ്‌വേഡ് മാറ്റുക
diff --git a/config/locales/devise.nn.yml b/config/locales/devise.nn.yml
index 777f4e600..d578b8dc5 100644
--- a/config/locales/devise.nn.yml
+++ b/config/locales/devise.nn.yml
@@ -1 +1,94 @@
+---
 nn:
+  devise:
+    confirmations:
+      confirmed: E-posten din er stadefesta.
+      send_instructions: Om nokre få minutt får du ein e-post som fortel deg korleis du skal stadfesta e-postadressa di. Sjekk søppelpostmappa di om du ikkje fekk e-posten.
+      send_paranoid_instructions: Om vi har e-postadressa di i databasen vår, får du ein e-post som fortel deg korleis du skal stadfesta e-postadressa om nokre få minutt. Ver venleg og sjekk søppelpostmappa di om du ikkje fekk denne e-posten.
+    failure:
+      already_authenticated: Du er allereie logga inn.
+      inactive: Kontoen din er ikkje aktiv enno.
+      invalid: Ugyldig %{authentication_keys} eller passord.
+      last_attempt: Du har eitt forsøk igjen før kontoen din vert låst.
+      locked: Kontoen din er låst.
+      not_found_in_database: Ugyldig %{authentication_keys} eller passord.
+      pending: Kontoen din er fortsatt under gjennomgang.
+      timeout: Økten din løp ut på tid. Logg inn på nytt for å fortsette.
+      unauthenticated: Du må logge inn eller registrere deg før du kan fortsette.
+      unconfirmed: Du må stadfesta e-postadressa di før du kan gå vidare.
+    mailer:
+      confirmation_instructions:
+        action: Stadfest e-postadresse
+        action_with_app: Stadfest og gå tilbake til %{app}
+        explanation: Du har laget en konto på %{host} med denne e-postadressen. Du er ett klikk unna å aktivere den. Hvis dette ikke var deg, vennligst se bort fra denne e-posten.
+        extra_html: Vennligst også sjekk ut <a href="%{terms_path}">instansens regler </a> og <a href="%{policy_path}">våre bruksvilkår</a>.
+        subject: 'Mastodon: Instruksjoner for å bekrefte e-postadresse %{instance}'
+        title: Stadfest e-postadresse
+      email_changed:
+        explanation: 'E-postadressa til kontoen din vert endra til:'
+        extra: Hvis du ikke endret din e-postadresse, er det sannsynlig at noen har fått tilgang til din konto. Vennligst endre ditt passord umiddelbart eller kontakt instansens administrator dersom du er utestengt fra kontoen din.
+        subject: 'Mastodon: E-postadressa er endra'
+        title: Ny e-postadresse
+      password_change:
+        explanation: Passordet til kontoen din er endra.
+        extra: Om du ikkje har endra passordet er det sannsynleg at nokon har fått tilgang til kontoen din. Ver venleg og skift passordet ditt med det same eller tak kontakt med tenaradministratoren om du er sperra ute av kontoen din.
+        subject: 'Mastodon: Passord endra'
+        title: Passord endra
+      reconfirmation_instructions:
+        explanation: Stadfest den nye adressa for å byta e-postadressa di.
+        extra: Se bort fra denne e-posten dersom du ikke gjorde denne endringen. E-postadressen for Mastadon-kontoen blir ikke endret før du trykker på lenken over.
+        subject: 'Mastodon: Bekreft e-postadresse for %{instance}'
+        title: Stadfest e-postadresse
+      reset_password_instructions:
+        action: Endr passord
+        explanation: Du har bedt om eit nytt passord til kontoen din.
+        extra: Om du ikkje bad om dette, ignorer denne e-posten. Passordet ditt vert ikkje endra før du går inn på lenkja ovanfor og lagar eit nytt.
+        subject: 'Mastodon: Instuksjonar for å endra passord'
+        title: Attstilling av passord
+      two_factor_disabled:
+        subject: 'Mastodon: To-faktor autentisering deaktivert'
+        title: 2FA deaktivert
+      two_factor_enabled:
+        explanation: To-faktor autentisering er aktivert for kontoen din. Et symbol som er generert av den sammenkoblede TOTP-appen vil være påkrevd for innlogging.
+        subject: 'Mastodon: To-faktor autentisering aktivert'
+        title: 2FA aktivert
+      two_factor_recovery_codes_changed:
+        explanation: De forrige gjenopprettingskodene er ugyldig og nye generert.
+      unlock_instructions:
+        subject: 'Mastodon: Instruksjoner for å gjenåpne konto'
+    omniauth_callbacks:
+      failure: Kunne ikke autentisere deg fra %{kind} fordi "%{reason}".
+      success: Vellykket autentisering fra %{kind}.
+    passwords:
+      no_token: Du har ingen tilgang til denne siden hvis ikke klikket på en e-post om nullstilling av passord. Hvis du kommer fra en sådan bør du dobbelsjekke at du limte inn hele URLen.
+      send_instructions: Du vil motta en e-post med instruksjoner om nullstilling av passord om noen få minutter.
+      send_paranoid_instructions: Om vi har e-postadressa di i databasen vår, får du ei lenkje til å endra passordet om nokre få minutt. Ver venleg og sjekk søppelpostmappa om du ikkje fekk denne e-posten.
+      updated: Passordet ditt er endra. No er du logga inn.
+      updated_not_active: Passordet ditt er endra.
+    registrations:
+      destroyed: Ha det! Kontoen din er sletta. Vi vonar å sjå deg igjen snart.
+      signed_up: Velkomen! No er du registrert.
+      signed_up_but_inactive: Du har registrert deg inn, men vi kunne ikkje logga deg inn fordi kontoen din er ikkje aktivert enno.
+      signed_up_but_locked: Du har registrert deg inn, men vi kunne ikkje logga deg inn fordi kontoen din er låst.
+      signed_up_but_pending: Ei melding med ei stadfestingslenkje er vorten send til e-postadressa di. Når du klikkar på lenkja skal vi sjå gjennom søknaden din. Du får ei melding om han vert godkjend.
+      signed_up_but_unconfirmed: En e-post med en bekreftelseslenke har blitt sendt til din innboks. Klikk på lenken i e-posten for å aktivere kontoen din.
+      update_needs_confirmation: Du har oppdatert kontoen din, men vi må bekrefte din nye e-postadresse. Sjekk e-posten din og følg bekreftelseslenken for å bekrefte din nye e-postadresse.
+      updated: Kontoen din ble oppdatert.
+    sessions:
+      already_signed_out: Logga ut.
+      signed_in: Logga inn.
+      signed_out: Logga ut.
+    unlocks:
+      send_instructions: Du vil motta en e-post med instruksjoner for å åpne kontoen din om noen få minutter.
+      send_paranoid_instructions: Hvis kontoen din eksisterer vil du motta en e-post med instruksjoner for å åpne kontoen din om noen få minutter.
+      unlocked: Kontoen din ble åpnet uten problemer. Logg på for å fortsette.
+  errors:
+    messages:
+      already_confirmed: har allerede blitt bekreftet, prøv å logge på istedet
+      confirmation_period_expired: må bekreftes innen %{period}. Spør om en ny e-post for bekreftelse istedet
+      expired: er utgått, ver venleg å beda om ein ny ein
+      not_found: ikkje funne
+      not_locked: var ikkje låst
+      not_saved:
+        one: '1 feil hindret denne %{resource} i å bli lagret:'
+        other: "%{count} feil hindret denne %{resource} i å bli lagret:"
diff --git a/config/locales/devise.no.yml b/config/locales/devise.no.yml
index e4fc33f01..de651f6ca 100644
--- a/config/locales/devise.no.yml
+++ b/config/locales/devise.no.yml
@@ -21,6 +21,7 @@
         action: Bekreft e-postadresse
         action_with_app: Bekreft og gå tilbake til %{app}
         explanation: Du har laget en konto på %{host} med denne e-postadressen. Du er ett klikk unna å aktivere den. Hvis dette ikke var deg, vennligst se bort fra denne e-posten.
+        explanation_when_pending: Du søkte om en invitasjon til %{host} med denne E-postadressen. Når du har bekreftet E-postadressen din, vil vi gå gjennom søknaden din. Du kan logge på for å endre dine detaljer eller slette kontoen din, men du har ikke tilgang til de fleste funksjoner før kontoen din er akseptert. Dersom søknaden din blir avslått, vil dataene dine bli fjernet, så ingen ytterligere handlinger fra deg vil være nødvendige. Dersom dette ikke var deg, vennligst ignorer denne E-posten.
         extra_html: Vennligst også sjekk ut <a href="%{terms_path}">instansens regler </a> og <a href="%{policy_path}">våre bruksvilkår</a>.
         subject: 'Mastodon: Instruksjoner for å bekrefte e-postadresse %{instance}'
         title: Bekreft e-postadresse
@@ -46,6 +47,7 @@
         subject: 'Mastodon: Hvordan nullstille passord'
         title: Nullstill passord
       two_factor_disabled:
+        explanation: 2-trinnsinnlogging for kontoen din har blitt skrudd av. Pålogging er mulig gjennom kun E-postadresse og passord.
         subject: 'Mastodon: To-faktor autentisering deaktivert'
         title: 2FA deaktivert
       two_factor_enabled:
@@ -54,6 +56,8 @@
         title: 2FA aktivert
       two_factor_recovery_codes_changed:
         explanation: De forrige gjenopprettingskodene er ugyldig og nye generert.
+        subject: 'Mastodon: 2-trinnsgjenopprettingskoder har blitt generert på nytt'
+        title: 2FA-gjenopprettingskodene ble endret
       unlock_instructions:
         subject: 'Mastodon: Instruksjoner for å gjenåpne konto'
     omniauth_callbacks:
diff --git a/config/locales/devise.pt-PT.yml b/config/locales/devise.pt-PT.yml
index 7d3f8fc55..9689b01f5 100644
--- a/config/locales/devise.pt-PT.yml
+++ b/config/locales/devise.pt-PT.yml
@@ -12,6 +12,7 @@ pt-PT:
       last_attempt: Tens mais uma tentativa antes de a tua conta ficar bloqueada.
       locked: A tua conta está bloqueada.
       not_found_in_database: "%{authentication_keys} ou palavra-passe inválida."
+      pending: A sua conta está ainda a aguardar revisão.
       timeout: A tua sessão expirou. Por favor, entra de novo para continuares.
       unauthenticated: Precisas de entrar na tua conta ou de te registares antes de continuar.
       unconfirmed: Tens de confirmar o teu endereço de email antes de continuar.
@@ -20,6 +21,7 @@ pt-PT:
         action: Verificar o endereço de e-mail
         action_with_app: Confirmar e regressar a %{app}
         explanation: Criaste uma conta em %{host} com este endereço de e-mail. Estás a um clique de activá-la. Se não foste tu que fizeste este registo, por favor ignora esta mensagem.
+        explanation_when_pending: Você solicitou um convite para %{host} com este endereço de e-mail. Logo que confirme o seu endereço de e-mail, iremos rever a sua inscrição. Pode iniciar sessão para alterar os seus dados ou eliminar a sua conta, mas não poderá aceder à maioria das funções até que a sua conta seja aprovada. Se a sua inscrição for rejeitada, os seus dados serão removidos, pelo que não será necessária qualquer acção adicional da sua parte. Se não solicitou este convite, por favor, ignore este e-mail.
         extra_html: Por favor lê <a href="%{terms_path}">as regras da instância</a> e os <a href="%{policy_path}"> nossos termos de serviço</a>.
         subject: 'Mastodon: Instruções de confirmação %{instance}'
         title: Verificar o endereço de e-mail
@@ -44,6 +46,18 @@ pt-PT:
         extra: Se não fizeste este pedido, por favor ignora este e-mail. A tua palavra-passe não irá mudar se não acederes ao link acima e criares uma nova.
         subject: 'Mastodon: Instruções para alterar a palavra-passe'
         title: Solicitar nova palavra-passe
+      two_factor_disabled:
+        explanation: A autenticação de dois fatores para sua conta foi desativada. É agora possível aceder apenas com seu endereço de e-mail e senha.
+        subject: 'Mastodon: Autenticação de dois fatores desativada'
+        title: 2FA desativado
+      two_factor_enabled:
+        explanation: A autenticação de dois fatores foi ativada para sua conta. Um token, gerado pela aplicação TOTP emparelhada, será necessário para aceder.
+        subject: 'Mastodon: Autenticação de dois fatores ativada'
+        title: 2FA ativado
+      two_factor_recovery_codes_changed:
+        explanation: Os códigos de recuperação anteriores foram invalidados e novos foram gerados.
+        subject: 'Mastodonte: Gerados novos códigos de recuperação de dois fatores'
+        title: Códigos de recuperação 2FA alterados
       unlock_instructions:
         subject: 'Mastodon: Instruções para desbloquear a tua conta'
     omniauth_callbacks:
@@ -60,6 +74,7 @@ pt-PT:
       signed_up: Bem-vindo! A tua conta foi registada com sucesso.
       signed_up_but_inactive: A tua conta foi registada. No entanto ainda não está activa.
       signed_up_but_locked: A tua conta foi registada. No entanto está bloqueada.
+      signed_up_but_pending: Uma mensagem com um link de confirmação foi enviada para o seu endereço de e-mail. Depois de clicar no link, iremos rever a sua inscrição. Será notificado se a sua conta é aprovada.
       signed_up_but_unconfirmed: Uma mensagem com um link de confirmação foi enviada para o teu email. Por favor segue esse link para activar a tua conta.
       update_needs_confirmation: Alteraste o teu endereço de email ou palavra-passe, mas é necessário confirmar essa alteração. Por favor vai ao teu email e segue link que te enviámos.
       updated: A tua conta foi actualizada com sucesso.
diff --git a/config/locales/devise.ru.yml b/config/locales/devise.ru.yml
index 950c9630e..5d7e33422 100644
--- a/config/locales/devise.ru.yml
+++ b/config/locales/devise.ru.yml
@@ -7,10 +7,10 @@ ru:
       send_paranoid_instructions: Если Ваш адрес e-mail есть в нашей базе данных, вы получите e-mail с инструкцией по подтверждению вашего адреса в течение нескольких минут.
     failure:
       already_authenticated: Вы уже авторизованы.
-      inactive: Ваш аккаунт еще не активирован.
+      inactive: Ваша учётная запись ещё не активирована.
       invalid: Неверно введены %{authentication_keys} или пароль.
       last_attempt: У Вас есть последняя попытка, после чего вход будет заблокирован.
-      locked: Ваш аккаунт заблокирован.
+      locked: Ваша учётная запись заблокирована.
       not_found_in_database: Неверно введены %{authentication_keys} или пароль.
       pending: Ваша заявка на вступление всё ещё рассматривается.
       timeout: Ваша сессия истекла. Пожалуйста, войдите снова, чтобы продолжить.
@@ -27,12 +27,12 @@ ru:
         title: Подтвердите e-mail адрес
       email_changed:
         explanation: 'E-mail адрес вашей учётной записи будет изменён на:'
-        extra: Если Вы не меняли адрес e-mail, возможно кто-то получил доступ к вашей учётной записи. Пожалуйста, срочно смените пароль или свяжитесь с администратором узла, если у вас нет доступа к учётной записи.
-        subject: 'Mastodon: Адрес e-mail изменён'
+        extra: Если вы не меняли e-mail адрес, возможно кто-то получил доступ к вашей учётной записи. Пожалуйста, немедленно смените пароль или свяжитесь с администратором узла, если вы уже потеряли доступ к ней.
+        subject: 'Mastodon: изменён e-mail адрес'
         title: Новый адрес e-mail
       password_change:
         explanation: Пароль Вашей учётной записи был изменён.
-        extra: Если Вы не меняли пароль, возможно кто-то получил доступ к вашей учётной записи. Пожалуйста, срочно смените пароль или свяжитесь с администратором узла, если у вас нет доступа к учётной записи.
+        extra: Если вы не меняли пароль, возможно кто-то получил доступ к вашей учётной записи. Пожалуйста, немедленно смените пароль или свяжитесь с администратором узла, если вы уже потеряли доступ к ней.
         subject: 'Mastodon: Пароль изменен'
         title: Пароль изменён
       reconfirmation_instructions:
@@ -47,22 +47,22 @@ ru:
         subject: 'Mastodon: инструкция по смене пароля'
         title: Сброс пароля
       two_factor_disabled:
-        explanation: Двуфакторная авторизация вашего аккаунта отключена. Войти теперь можно используя только e-mail и пароль.
-        subject: 'Mastodon: двуфакторная авторизация убрана'
-        title: 2ФА отключена
+        explanation: Для вашей учётной записи была отключена двухфакторная авторизация. Выполнить вход теперь можно используя лишь e-mail и пароль.
+        subject: 'Mastodon: двухфакторная авторизация отключена'
+        title: Двухфакторная авторизация отключена
       two_factor_enabled:
-        explanation: Двуфакторная авторизация включена для вашего аккаунта. Отныне для входа потребуется также временный код из привязанного приложения.
-        subject: 'Mastodon: двуфакторная авторизация установлена'
-        title: 2ФА включена
+        explanation: Для вашей учётной записи была настроена двухфакторная авторизация. Отныне для входа потребуется также временный код из приложения-аутентификатора.
+        subject: 'Mastodon: настроена двухфакторная авторизация'
+        title: Двухфакторная авторизация включена
       two_factor_recovery_codes_changed:
         explanation: Предыдущие резервные коды были аннулированы и созданы новые.
         subject: 'Mastodon: резервные коды двуфакторной авторизации обновлены'
-        title: Резервные коды 2ФА изменены
+        title: Резервные коды двухфакторной авторизации изменены
       unlock_instructions:
         subject: 'Mastodon: Инструкция по разблокировке'
     omniauth_callbacks:
       failure: Не получилось аутентифицировать вас с помощью %{kind} по следующей причине - "%{reason}".
-      success: Аутентификация с помощью аккаунта %{kind} прошла успешно.
+      success: Аутентификация с помощью учётной записи %{kind} прошла успешно.
     passwords:
       no_token: Вы можете получить доступ к этой странице, только перейдя по ссылке в e-mail для сброса пароля. Если вы действительно перешли по такой ссылке, пожалуйста, удостоверьтесь, что ссылка была введена полностью и без изменений.
       send_instructions: Вы получите e-mail с инструкцией по сбросу пароля в течение нескольких минут.
@@ -70,22 +70,22 @@ ru:
       updated: Ваш пароль был успешно изменен. Вход выполнен.
       updated_not_active: Ваш пароль был успешно изменен.
     registrations:
-      destroyed: До свидания! Ваш аккаунт был успешно удален. Мы надеемся скоро увидеть вас снова.
+      destroyed: До свидания! Ваша учётная запись была успешно удалена. Мы надеемся скоро увидеть вас снова.
       signed_up: Добро пожаловать! Вы успешно зарегистрировались.
-      signed_up_but_inactive: Вы успешно зарегистрировались. Тем не менее, мы не можем авторизовать вас, поскольку ваш аккаунт еще не активирован.
-      signed_up_but_locked: Вы успешно зарегистрировались. Тем не менее, мы не можем авторизовать вас, поскольку ваш аккаунт заблокирован.
+      signed_up_but_inactive: Вы успешно зарегистрировались. Тем не менее, мы не можем авторизовать вас, поскольку ваша учётная запись еще не активирована.
+      signed_up_but_locked: Вы успешно зарегистрировались. Тем не менее, мы не можем авторизовать вас, поскольку ваша учётная запись заблокирована.
       signed_up_but_pending: На ваш e-mail адрес было отправлено письмо с ссылкой для подтверждения. После перехода по ней, мы начнём рассматривать вашу заявку. В случае подтверждения, мы вас оповестим.
-      signed_up_but_unconfirmed: Сообщение со ссылкой для подтверждения было выслано на ваш адрес e-mail. Пожалуйста, пройдите по ссылке для активации вашего аккаунта.
-      update_needs_confirmation: Вы успешно обновили данные учётной записи, но нам нужно подтвердить ваш новый адрес e-mail. Пожалуйста, проверьте почту и перейдите по ссылке из письма для подтверждения вашего нового адреса.
-      updated: Ваш аккаунт был успешно обновлен.
+      signed_up_but_unconfirmed: Сообщение со ссылкой для подтверждения было выслано на ваш адрес e-mail. Пожалуйста, пройдите по ссылке для активации вашей учётной записи.
+      update_needs_confirmation: Данные учётной записи обновлены, но нам необходимо подтвердить ваш новый e-mail адрес. Проверьте почту и перейдите по ссылке из письма. Если оно не приходит, проверьте папку «спам».
+      updated: Ваша учётная запись успешно обновлена.
     sessions:
       already_signed_out: Выход прошел успешно.
       signed_in: Вход прошел успешно.
       signed_out: Выход прошел успешно.
     unlocks:
-      send_instructions: Вы получите e-mail с инструкцией по разблокировке вашего аккаунта в течение нескольких минут.
-      send_paranoid_instructions: Если Ваш аккаунт существует, вы получите e-mail с инструкцией по его разблокировке в течение нескольких минут.
-      unlocked: Ваш аккаунт был успешно разблокирован. пожалуйста, войдите для продолжения.
+      send_instructions: Вы получите e-mail с инструкцией по разблокировке вашей учётной записи в течение нескольких минут.
+      send_paranoid_instructions: Если ваша учётная запись существует, вы получите e-mail с инструкцией по её разблокировке в течение нескольких минут.
+      unlocked: Ваша учётная запись был успешно разблокирована. Пожалуйста, войдите для продолжения.
   errors:
     messages:
       already_confirmed: уже подтвержден, пожалуйста, попробуйте войти
diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml
index b61eca54e..ba2a64ed0 100644
--- a/config/locales/devise.sk.yml
+++ b/config/locales/devise.sk.yml
@@ -46,9 +46,11 @@ sk:
         subject: 'Mastodon: Pokyny pre obnovu hesla'
         title: Nastav nové heslo
       two_factor_disabled:
+        explanation: Dvojfázové overovanie tvojho účtu bolo vypnuté. Teraz sa môžeš prihlásiť len pomocou emailu a hesla.
         subject: 'Mastodon: Dvojfázové overovanie vypnuté'
         title: 2FA vypnuté
       two_factor_enabled:
+        explanation: Dvojfázové overovanie bolo zapnuté pre tvoj účet. Pre prihlásenie budeš potrebovať token vygenerovaný pre TOTP aplikáciu, ktorá je spárovaná.
         subject: 'Mastodon: Dvojfázové overovanie zapnuté'
         title: 2FA zapnuté
       two_factor_recovery_codes_changed:
diff --git a/config/locales/devise.sv.yml b/config/locales/devise.sv.yml
index 456e38581..9dfdde8e5 100644
--- a/config/locales/devise.sv.yml
+++ b/config/locales/devise.sv.yml
@@ -12,12 +12,14 @@ sv:
       last_attempt: Du har ytterligare ett försök innan ditt konto blir låst.
       locked: Ditt konto är låst.
       not_found_in_database: Ogiltigt %{authentication_keys} eller lösenord.
+      pending: Ditt konto granskas fortfarande.
       timeout: Din session löpte ut. Vänligen logga in igen för att fortsätta.
       unauthenticated: Du måste logga in eller registrera dig innan du fortsätter.
       unconfirmed: Du måste bekräfta din e-postadress innan du fortsätter.
     mailer:
       confirmation_instructions:
         action: Verifiera e-postadress
+        action_with_app: Bekräfta och återgå till %{app}
         explanation: Du har skapat ett konto på %{host} med den här e-postadressen. Du är ett klick bort från att aktivera det. Om det inte var du ignorerar det här e-postmeddelandet.
         extra_html: Kolla gärna också <a href="%{terms_path}">instansens regler</a> och <a href="%{policy_path}">våra användarvillkor</a>.
         subject: 'Mastodon: Bekräftelsesinstruktioner för %{instance}'
@@ -36,13 +38,25 @@ sv:
         explanation: Bekräfta den nya adressen för att ändra din e-postadress.
         extra: Om den här ändringen inte initierades av dig kan du ignorerar det här e-postmeddelandet. E-postadressen för Mastodon-kontot ändras inte förrän du kommer åt länken ovan.
         subject: 'Mastodon: Bekräfta e-post för %{instance}'
-        title: Verifiera e-postadressen
+        title: Verifiera e-postadress
       reset_password_instructions:
         action: Ändra lösenord
         explanation: Du begärde ett nytt lösenord för ditt konto.
         extra: Om du inte begärt detta kan du ignorerar det här e-postmeddelandet. Ditt lösenord ändras inte förrän du öppnar länken ovan och skapar ett nytt.
         subject: 'Mastodon: Instruktioner för återställning av lösenord'
         title: Lösenordsåterställning
+      two_factor_disabled:
+        explanation: Tvåfaktorsautentisering för ditt konto har inaktiverats. Det är nu möjligt att logga in med enbart e-postadress och lösenord.
+        subject: 'Mastodon: Tvåfaktorsautentisering inaktiverad'
+        title: 2FA inaktiverad
+      two_factor_enabled:
+        explanation: Tvåfaktorsautentisering har aktiverats för ditt konto. En token som genereras av en kopplad TOTP-app kommer att krävas vid inloggning.
+        subject: 'Mastodon: Tvåfaktorsautentisering aktiverad'
+        title: 2FA aktiverad
+      two_factor_recovery_codes_changed:
+        explanation: De tidigare återställningskoderna har ogiltigförklarats och nya har genererats.
+        subject: Mastodon Tvåfaktors-återställningskoder genererades på nytt
+        title: 2FA-återställningskoder ändrades
       unlock_instructions:
         subject: 'Mastodon: Lås upp instruktioner'
     omniauth_callbacks:
@@ -59,7 +73,7 @@ sv:
       signed_up: Välkommen! Du har nu registrerat dig.
       signed_up_but_inactive: Du har nu registrerat dig. Vi kunde dock inte logga in dig eftersom ditt konto ännu inte är aktiverat.
       signed_up_but_locked: Du har nu registrerat dig. Vi kunde dock inte logga in eftersom ditt konto är låst.
-      signed_up_but_unconfirmed: Ett meddelande med en bekräftelse länk har skickats till din e-postadress. Vänligen följ länken för att aktivera ditt konto. Kontrollera din spammapp om du inte fick det här e-postmeddelandet.
+      signed_up_but_unconfirmed: Ett meddelande med en bekräftelselänk har skickats till din e-postadress. Vänligen följ länken för att aktivera ditt konto. Kontrollera din skräppostmapp om du inte fick det här e-postmeddelandet.
       update_needs_confirmation: Du har uppdaterat ditt konto med framgång, men vi måste verifiera din nya e-postadress. Vänligen kolla din email och följ bekräfta länken för att bekräfta din nya e-postadress. Kontrollera din spammapp om du inte fick det här e-postmeddelandet.
       updated: Ditt konto har uppdaterats utan problem.
     sessions:
diff --git a/config/locales/devise.ta.yml b/config/locales/devise.ta.yml
index 9c1edfe43..e653f0581 100644
--- a/config/locales/devise.ta.yml
+++ b/config/locales/devise.ta.yml
@@ -2,7 +2,7 @@
 ta:
   devise:
     confirmations:
-      confirmed: உங்கள் இணைய முகவரி வெற்றிகரமாக உறுதி செய்யப்பட்டது.
+      confirmed: தங்கள் மின்னஞ்சல் முகவரி வெற்றிகரமாக உறுதி செய்யப்பட்டது.
       send_instructions: இன்னும் சற்று நேரத்தில் உங்கள் இணைய முகவரியை உறுதி செய்வது எப்படி என்று விளக்கும் இணைய செய்தி ஒன்று வந்தடையும். வரவில்லை எனில், தயவு செய்து உங்கள் ஸ்பாம் பெட்டியைப் பார்க்கவும்.
       send_paranoid_instructions: உங்கள் இணைய முகவரி எங்கள் தகவல்ப் பெட்டகத்தில் இருந்தால், இன்னும் சற்று நேரத்தில் உங்கள் இணைய முகவரியை உறுதி செய்வது எப்படி என்று விளக்கும் இணைய செய்தி ஒன்று வந்தடையும். வரவில்லை எனில், தயவு செய்து உங்கள் ஸ்பாம் பெட்டியைப் பார்க்கவும்.
     failure:
@@ -23,14 +23,26 @@ ta:
         explanation: இந்த இணைய முகவரி கொண்டு %{host}-இல் நீங்கள் ஒரு கணக்கை உருவாக்கியுள்ளீர்கள். அதை செயல்படுத்துவதில் இருந்து ஒரு சொடக்கு தூரத்தில் உள்ளீர்கள். நீங்கள் அதை செய்யவில்லை என்றால், இந்த செய்தியை கண்டுகொள்ள வேண்டாம்.
         title: மின்னஞ்சல் முகவரியை உறுதிபடுத்தவும்
       email_changed:
+        subject: 'மாஸ்டோடான்: மின்னஞ்சல் மாற்றப்பட்டது'
         title: புதிய மின்னஞ்சல் முகவரி
       password_change:
+        explanation: உங்கள் கணக்கிற்கான கடவுச்சொல் மாற்றப்பட்டது.
+        subject: 'மாஸ்டோடான்: கடவுச்சொல் மாற்றப்பட்டது'
         title: கடவுச்சொல் மாற்றப்பட்டது
       reconfirmation_instructions:
         explanation: உங்கள் மின்னஞ்சல் முகவரியை மாற்ற மீண்டும் ஒரு முறை உறுதி செய்யவும்.
+        subject: 'மாஸ்டோடான்: %{instance}-கான மின்னஞ்சலை உறுதிசெய்யவும்'
         title: மின்னஞ்சல் முகவரியை உறுதிபடுத்தவும்
       reset_password_instructions:
         action: கடவுச்சொல்லை மாற்றவும்
+        explanation: உங்கள் கணக்கிற்குப் புதிய கடவுச்சொல்லைக் கோரியிருக்கிறீர்கள்.
+        subject: 'மாஸ்டோடான்: கடவுச்சொல்லை மீட்டமைப்பதற்கான வழிமுறைகள்'
+        title: கடவுச்சொல் மீட்டமைப்பு
+      two_factor_disabled:
+        title: 2FA உபயோகத்தில் இல்லை
+    registrations:
+      destroyed: நன்றி! தங்கள் கணக்கு வெற்றிகரமாக ரத்து செய்யப்பட்டது. தங்கள் வருகையை மீண்டும் எதிர்நோக்கியிருக்கிறோம்.
+      signed_up: வருக! நீங்கள் வெற்றிகரமாகப் பதிவுசெய்துவிட்டீர்கள்.
     unlocks:
       send_instructions: இன்னும் சற்று நேரத்தில் மின்னஞ்சல் முகவரியை உறுதி செய்வதற்கான விளக்கம், உங்கள் மின்னஞ்சலை வந்தடையும். வரவில்லை எனில், தயவு செய்து உங்கள் Spam பெட்டியைப் பார்க்கவும்.
   errors:
diff --git a/config/locales/devise.th.yml b/config/locales/devise.th.yml
index e24fc187f..c88577a97 100644
--- a/config/locales/devise.th.yml
+++ b/config/locales/devise.th.yml
@@ -3,12 +3,13 @@ th:
   devise:
     confirmations:
       confirmed: ยืนยันที่อยู่อีเมลของคุณสำเร็จ
-      send_instructions: คุณจะได้รับอีเมลพร้อมวิธีการยืนยันที่อยู่อีเมลของคุณในไม่กี่นาที หากคุณไม่ได้รับอีเมล กรุณาตรวจสอบโฟลเดอร์สแปมของคุณ
-      send_paranoid_instructions: หากที่อยู่อีเมลของคุณอยู่ในระบบของเรา คุณจะได้รับอีเมลพร้อมวิธีการยืนยันที่อยู่อีเมลของคุณในไม่กี่นาที หากคุณไม่ได้รับอีเมล กรุณาตรวจสอบโฟลเดอร์สแปมของคุณ
+      send_instructions: คุณจะได้รับอีเมลพร้อมคำแนะนำวิธีการยืนยันที่อยู่อีเมลของคุณในไม่กี่นาที โปรดตรวจสอบโฟลเดอร์สแปมของคุณหากคุณไม่ได้รับอีเมลนี้
+      send_paranoid_instructions: หากมีที่อยู่อีเมลของคุณอยู่ในฐานข้อมูลของเรา คุณจะได้รับอีเมลพร้อมคำแนะนำวิธีการยืนยันที่อยู่อีเมลของคุณในไม่กี่นาที โปรดตรวจสอบโฟลเดอร์สแปมของคุณหากคุณไม่ได้รับอีเมลนี้
     failure:
       already_authenticated: คุณได้ลงชื่อเข้าอยู่แล้ว
       inactive: ยังไม่ได้เปิดใช้งานบัญชีของคุณ
       invalid: "%{authentication_keys} หรือรหัสผ่านไม่ถูกต้อง"
+      last_attempt: คุณลองได้อีกหนึ่งครั้งก่อนที่บัญชีของคุณจะถูกล็อค
       locked: มีการล็อคบัญชีของคุณอยู่
       not_found_in_database: "%{authentication_keys} หรือรหัสผ่านไม่ถูกต้อง"
       pending: บัญชีของคุณยังอยู่ระหว่างการตรวจทาน
@@ -19,36 +20,53 @@ th:
       confirmation_instructions:
         action: ยืนยันที่อยู่อีเมล
         action_with_app: ยืนยันแล้วกลับไปยัง %{app}
-        explanation: คุณได้สร้างบัญชีใหม่บน %{host} ด้วยที่อยู่อีเมลนี้ เหลืออีกเพียงคลิกเดียวก็สามารถเปิดใช้งานบัญชีได้แล้ว หากไม่ใช่คุณ กรุณาปฏิเสธอีเมลนี้
-        extra_html: นอกจากนี้ กรุณาอ่าน<a href="%{terms_path}">กฎของเซิร์ฟเวอร์</a>และ<a href="%{policy_path}">เงื่อนไขการให้บริการ</a>
+        explanation: คุณได้สร้างบัญชีใน %{host} ด้วยที่อยู่อีเมลนี้ คุณเหลืออีกคลิกเดียวเพื่อเปิดใช้งานบัญชี หากนี่ไม่ใช่คุณ โปรดเพิกเฉยต่ออีเมลนี้
+        explanation_when_pending: คุณได้สมัครเพื่อขอคำเชิญสู่ %{host} ด้วยที่อยู่อีเมลนี้ เมื่อคุณยืนยันที่อยู่อีเมลของคุณ เราจะตรวจทานใบสมัครของคุณ คุณสามารถเข้าสู่ระบบเพื่อเปลี่ยนรายละเอียดของคุณหรือลบบัญชีของคุณ แต่คุณไม่สามารถเข้าถึงฟังก์ชันส่วนใหญ่ได้จนกว่าจะมีการอนุมัติบัญชีของคุณ หากมีการปฏิเสธใบสมัครของคุณ จะเอาข้อมูลของคุณออก ดังนั้นจึงไม่ต้องมีการกระทำเพิ่มเติมจากคุณ หากนี่ไม่ใช่คุณ โปรดเพิกเฉยต่ออีเมลนี้
+        extra_html: นอกจากนี้โปรดตรวจสอบ <a href="%{terms_path}">กฎของเซิร์ฟเวอร์</a> และ <a href="%{policy_path}">เงื่อนไขการให้บริการของเรา</a>
         subject: 'Mastodon: คำแนะนำการยืนยันสำหรับ %{instance}'
         title: ยืนยันที่อยู่อีเมล
       email_changed:
         explanation: 'กำลังเปลี่ยนที่อยู่อีเมลสำหรับบัญชีของคุณเป็น:'
+        extra: หากคุณไม่ได้เปลี่ยนอีเมลของคุณ อาจเป็นไปได้ว่ามีใครสักคนได้รับสิทธิเข้าถึงบัญชีของคุณ โปรดเปลี่ยนรหัสผ่านของคุณทันทีหรือติดต่อผู้ดูแลเซิร์ฟเวอร์หากคุณถูกล็อคออกจากบัญชีของคุณ
         subject: 'Mastodon: เปลี่ยนอีเมลแล้ว'
         title: ที่อยู่อีเมลใหม่
       password_change:
         explanation: เปลี่ยนรหัสผ่านสำหรับบัญชีของคุณแล้ว
+        extra: หากคุณไม่ได้เปลี่ยนรหัสผ่านของคุณ อาจเป็นไปได้ว่ามีใครสักคนได้รับสิทธิเข้าถึงบัญชีของคุณ โปรดเปลี่ยนรหัสผ่านของคุณทันทีหรือติดต่อผู้ดูแลเซิร์ฟเวอร์หากคุณถูกล็อคออกจากบัญชีของคุณ
         subject: 'Mastodon: เปลี่ยนรหัสผ่านแล้ว'
         title: เปลี่ยนรหัสผ่านแล้ว
       reconfirmation_instructions:
         explanation: ยืนยันที่อยู่ใหม่เพื่อเปลี่ยนอีเมลของคุณ
+        extra: หากการเปลี่ยนแปลงนี้ไม่ได้ทำโดยคุณ โปรดเพิกเฉยต่ออีเมลนี้ ที่อยู่อีเมลสำหรับบัญชี Mastodon จะไม่เปลี่ยนแปลงจนกว่าคุณจะเข้าถึงลิงก์ด้านบน
         subject: 'Mastodon: ยืนยันอีเมลสำหรับ %{instance}'
         title: ยืนยันที่อยู่อีเมล
       reset_password_instructions:
         action: เปลี่ยนรหัสผ่าน
         explanation: คุณได้ขอรหัสผ่านใหม่สำหรับบัญชีของคุณ
+        extra: หากคุณไม่ได้ขอสิ่งนี้ โปรดเพิกเฉยต่ออีเมลนี้ รหัสผ่านของคุณจะไม่เปลี่ยนแปลงจนกว่าคุณจะเข้าถึงลิงก์ด้านบนและสร้างรหัสผ่านใหม่
         subject: 'Mastodon: คำแนะนำการตั้งรหัสผ่านใหม่'
-        title: ตั้งรหัสผ่านใหม่
+        title: การตั้งรหัสผ่านใหม่
       two_factor_disabled:
-        subject: 'Mastodon: ปิดการยืนยันสองขั้นตอนแล้ว'
+        explanation: ปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยสำหรับบัญชีของคุณแล้ว การเข้าสู่ระบบสามารถทำได้โดยใช้ที่อยู่อีเมลและรหัสผ่านเท่านั้น
+        subject: 'Mastodon: ปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยแล้ว'
         title: ปิดใช้งาน 2FA แล้ว
       two_factor_enabled:
-        subject: 'Mastodon: เปิดการยืนยันสองขั้นตอนแล้ว'
+        explanation: เปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยสำหรับบัญชีของคุณแล้ว จะต้องใช้โทเคนที่สร้างโดยแอป TOTP ที่จับคู่สำหรับการเข้าสู่ระบบ
+        subject: 'Mastodon: เปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยแล้ว'
         title: เปิดใช้งาน 2FA แล้ว
       two_factor_recovery_codes_changed:
+        explanation: ยกเลิกรหัสกู้คืนก่อนหน้าและสร้างรหัสใหม่แล้ว
+        subject: 'Mastodon: สร้างรหัสกู้คืนสองปัจจัยใหม่แล้ว'
         title: เปลี่ยนรหัสกู้คืน 2FA แล้ว
+      unlock_instructions:
+        subject: 'Mastodon: คำแนะนำการปลดล็อค'
+    omniauth_callbacks:
+      failure: ไม่สามารถรับรองความถูกต้องของคุณจาก %{kind} เนื่องจาก "%{reason}"
+      success: รับรองความถูกต้องจากบัญชี %{kind} สำเร็จ
     passwords:
+      no_token: คุณไม่สามารถเข้าถึงหน้านี้โดยไม่ได้มาจากอีเมลการตั้งรหัสผ่านใหม่ หากคุณมาจากอีเมลการตั้งรหัสผ่านใหม่ โปรดตรวจสอบให้แน่ใจว่าคุณได้ใช้ URL แบบเต็มที่ให้มา
+      send_instructions: หากมีที่อยู่อีเมลของคุณอยู่ในฐานข้อมูลของเรา คุณจะได้รับลิงก์กู้คืนรหัสผ่านที่ที่อยู่อีเมลของคุณในไม่กี่นาที โปรดตรวจสอบโฟลเดอร์สแปมของคุณหากคุณไม่ได้รับอีเมลนี้
+      send_paranoid_instructions: หากมีที่อยู่อีเมลของคุณอยู่ในฐานข้อมูลของเรา คุณจะได้รับลิงก์กู้คืนรหัสผ่านที่ที่อยู่อีเมลของคุณในไม่กี่นาที โปรดตรวจสอบโฟลเดอร์สแปมของคุณหากคุณไม่ได้รับอีเมลนี้
       updated: เปลี่ยนรหัสผ่านของคุณสำเร็จ ตอนนี้คุณได้ลงชื่อเข้าแล้ว
       updated_not_active: เปลี่ยนรหัสผ่านของคุณสำเร็จ
     registrations:
@@ -56,17 +74,24 @@ th:
       signed_up: ยินดีต้อนรับ! คุณได้ลงทะเบียนสำเร็จ
       signed_up_but_inactive: คุณได้ลงทะเบียนสำเร็จ อย่างไรก็ตามเราไม่สามารถลงชื่อคุณเข้าเนื่องจากยังไม่ได้เปิดใช้งานบัญชีของคุณ
       signed_up_but_locked: คุณได้ลงทะเบียนสำเร็จ อย่างไรก็ตามเราไม่สามารถลงชื่อคุณเข้าเนื่องจากมีการล็อคบัญชีของคุณอยู่
-      signed_up_but_pending: ส่งข้อความพร้อมลิงก์ยืนยันไปยังที่อยู่อีเมลของคุณแล้ว หลังจากคุณคลิกลิงก์ เราจะตรวจทานใบสมัครของคุณ คุณจะได้รับการแจ้งเตือนหากใบสมัครได้รับการอนุมัติ
+      signed_up_but_pending: ส่งข้อความพร้อมลิงก์ยืนยันไปยังที่อยู่อีเมลของคุณแล้ว หลังจากคุณคลิกลิงก์ เราจะตรวจทานใบสมัครของคุณ คุณจะได้รับการแจ้งเตือนหากมีการอนุมัติใบสมัคร
       signed_up_but_unconfirmed: ส่งข้อความพร้อมลิงก์ยืนยันไปยังที่อยู่อีเมลของคุณแล้ว โปรดไปตามลิงก์เพื่อเปิดใช้งานบัญชีของคุณ โปรดตรวจสอบโฟลเดอร์สแปมของคุณหากคุณไม่ได้รับอีเมลนี้
+      update_needs_confirmation: คุณได้อัปเดตบัญชีของคุณสำเร็จ แต่เราจำเป็นต้องยืนยันที่อยู่อีเมลใหม่ของคุณ โปรดตรวจสอบอีเมลของคุณแล้วไปตามลิงก์ยืนยันเพื่อยืนยันที่อยู่อีเมลใหม่ของคุณ โปรดตรวจสอบโฟลเดอร์สแปมของคุณหากคุณไม่ได้รับอีเมลนี้
       updated: อัปเดตบัญชีของคุณสำเร็จ
     sessions:
       already_signed_out: ลงชื่อออกสำเร็จ
       signed_in: ลงชื่อเข้าสำเร็จ
       signed_out: ลงชื่อออกสำเร็จ
     unlocks:
-      send_instructions: คุณจะได้รับอีเมลพร้อมวิธีการปลดล็อคบัญชีของคุณในไม่กี่นาที หากคุณไม่ได้รับอีเมล กรุณาตรวจสอบโฟลเดอร์สแปมของคุณ
+      send_instructions: คุณจะได้รับอีเมลพร้อมคำแนะนำวิธีการปลดล็อคบัญชีของคุณในไม่กี่นาที โปรดตรวจสอบโฟลเดอร์สแปมของคุณหากคุณไม่ได้รับอีเมลนี้
+      send_paranoid_instructions: หากมีบัญชีของคุณอยู่ คุณจะได้รับอีเมลพร้อมคำแนะนำวิธีการปลดล็อคบัญชีในไม่กี่นาที โปรดตรวจสอบโฟลเดอร์สแปมของคุณหากคุณไม่ได้รับอีเมลนี้
       unlocked: ปลดล็อคบัญชีของคุณสำเร็จ โปรดลงชื่อเข้าเพื่อดำเนินการต่อ
   errors:
     messages:
+      already_confirmed: ยืนยันอยู่แล้ว โปรดลองลงชื่อเข้า
+      confirmation_period_expired: ต้องได้รับการยืนยันภายใน %{period} โปรดขออีเมลใหม่
+      expired: หมดอายุแล้ว โปรดขออีเมลใหม่
       not_found: ไม่พบ
       not_locked: ไม่ได้ล็อคอยู่
+      not_saved:
+        other: "%{count} ข้อผิดพลาดได้ห้ามไม่ให้บันทึก %{resource} นี้:"
diff --git a/config/locales/devise.uk.yml b/config/locales/devise.uk.yml
index 85b3d14cd..eebeb106c 100644
--- a/config/locales/devise.uk.yml
+++ b/config/locales/devise.uk.yml
@@ -21,6 +21,7 @@ uk:
         action: Підтвердити адресу електронної пошти
         action_with_app: Підтвердити та повернутися до %{app}
         explanation: Ви створили обліковий запис на %{host} з цією адресою електронної пошти, і зараз на відстані одного кліку від його активації. Якщо це були не ви, проігноруйте цього листа, будь ласка.
+        explanation_when_pending: Ви подали заявку на запрошення до %{host} з цією адресою електронної пошти. Після підтвердження адреси ми розглянемо вашу заявку. Ви можете увійти, щоб змінити ваші дані або видалити свій обліковий запис, але Ви не зможете отримати доступ до більшості функцій, поки Ваш обліковий запис не буде схвалено. Якщо вашу заявку буде відхилено, ваші дані будуть видалені, тож вам не потрібно буде нічого робити. Якщо це були не ви, просто проігноруйте цей лист.
         extra_html: Також перегляньте <a href="%{terms_path}">правила серверу</a> та <a href="%{policy_path}">умови використання</a>.
         subject: 'Mastodon: Інструкції для підтвердження %{instance}'
         title: Підтвердити адресу електронної пошти
diff --git a/config/locales/devise.ur.yml b/config/locales/devise.ur.yml
index 2cace5883..5edf8e9b9 100644
--- a/config/locales/devise.ur.yml
+++ b/config/locales/devise.ur.yml
@@ -1 +1,5 @@
+---
 ur:
+  devise:
+    confirmations:
+      confirmed: آپکے ایمیل اڈرش (email address) کی تصدیق کر لی گئی ہے.
diff --git a/config/locales/devise.vi.yml b/config/locales/devise.vi.yml
new file mode 100644
index 000000000..b01fa066e
--- /dev/null
+++ b/config/locales/devise.vi.yml
@@ -0,0 +1,97 @@
+---
+vi:
+  devise:
+    confirmations:
+      confirmed: Địa chỉ email của bạn đã được xác nhận thành công.
+      send_instructions: Bạn sẽ nhận được một email với các hướng dẫn về cách xác nhận địa chỉ email của bạn trong vài phút. Vui lòng kiểm tra thư mục thư rác nếu bạn không nhận được email này.
+      send_paranoid_instructions: Nếu địa chỉ email của bạn tồn tại trong cơ sở dữ liệu của chúng tôi, bạn sẽ nhận được email có hướng dẫn cách xác nhận địa chỉ email của bạn trong vài phút. Vui lòng kiểm tra thư mục thư rác nếu bạn không nhận được email này.
+    failure:
+      already_authenticated: Bạn đã đăng nhập.
+      inactive: Tài khoản của bạn chưa được kich hoạt.
+      invalid: "%{authentication_keys} hoặc mật khẩu không hợp lệ."
+      last_attempt: Bạn có thêm một lần thử trước khi tài khoản của bạn bị khóa.
+      locked: Tài khoản của bạn bị khóa.
+      not_found_in_database: "%{authentication_keys} hoặc mật khẩu không hợp lệ."
+      pending: Tài khoản của bạn vẫn đang được xem xét.
+      timeout: Phiên của bạn đã hết hạn. Vui lòng đăng nhập lại để tiếp tục.
+      unauthenticated: Bạn cần đăng nhập hoặc đăng ký trước khi tiếp tục.
+      unconfirmed: Bạn phải xác nhận địa chỉ email của bạn trước khi tiếp tục.
+    mailer:
+      confirmation_instructions:
+        action: Xác nhận địa chỉ email
+        action_with_app: Xác nhận và quay lại %{app}
+        explanation: Bạn đã tạo một tài khoản trên %{host} với địa chỉ email này. Bạn chỉ cần một cú nhấp chuột để kích hoạt nó. Nếu đây không phải là bạn, xin vui lòng bỏ qua email này.
+        explanation_when_pending: Bạn đã đăng ký lời mời đến %{host} với địa chỉ email này. Khi bạn xác nhận địa chỉ e-mail của mình, chúng tôi sẽ xem xét đơn đăng ký của bạn. Bạn có thể đăng nhập để thay đổi chi tiết hoặc xóa tài khoản của mình, nhưng bạn không thể truy cập hầu hết các chức năng cho đến khi tài khoản của bạn được chấp thuận. Nếu ứng dụng của bạn bị từ chối, dữ liệu của bạn sẽ bị xóa, do đó bạn sẽ không cần phải thực hiện thêm hành động nào nữa. Nếu đây không phải là bạn, xin vui lòng bỏ qua email này.
+        extra_html: Vui lòng kiểm tra <a href="%{terms_path}">các quy tắc của máy chủ</a> và <a href="%{policy_path}">điều khoản dịch vụ của chúng tôi</a> .
+        subject: 'Mastodon: Hướng dẫn xác nhận cho %{instance}'
+        title: Xác nhận địa chỉ email
+      email_changed:
+        explanation: 'Địa chỉ email cho tài khoản của bạn đang được thay đổi thành:'
+        extra: Nếu bạn không thay đổi email của mình, có khả năng ai đó đã truy cập được vào tài khoản của bạn. Vui lòng thay đổi mật khẩu của bạn ngay lập tức hoặc liên hệ với quản trị viên máy chủ nếu bạn bị khóa khỏi tài khoản của bạn.
+        subject: 'Mastodon: Email đã thay đổi'
+        title: Địa chỉ thư điện tử mới
+      password_change:
+        explanation: Mật khẩu cho tài khoản của bạn đã được thay đổi.
+        extra: Nếu bạn không thay đổi mật khẩu, có khả năng ai đó đã truy cập được vào tài khoản của bạn. Vui lòng thay đổi mật khẩu của bạn ngay lập tức hoặc liên hệ với quản trị viên máy chủ nếu bạn bị khóa khỏi tài khoản của bạn.
+        subject: 'Mastodon: Mật khẩu đã thay đổi'
+        title: mật khẩu đã được thay đổi
+      reconfirmation_instructions:
+        explanation: Xác nhận địa chỉ mới để thay đổi email của bạn.
+        extra: Nếu thay đổi này không phải do bạn khởi xướng, vui lòng bỏ qua email này. Địa chỉ email cho tài khoản Mastodon sẽ không thay đổi cho đến khi bạn truy cập vào liên kết ở trên.
+        subject: 'Mastodon: Xác nhận email cho %{instance}'
+        title: Xác nhận địa chỉ email
+      reset_password_instructions:
+        action: Đổi mật khẩu
+        explanation: Bạn đã yêu cầu một mật khẩu mới cho tài khoản của bạn.
+        extra: Nếu bạn không yêu cầu điều này, xin vui lòng bỏ qua email này. Mật khẩu của bạn sẽ không thay đổi cho đến khi bạn truy cập vào liên kết ở trên và tạo một mật khẩu mới.
+        subject: 'Mastodon: Đặt lại hướng dẫn mật khẩu'
+        title: Đặt lại mật khẩu
+      two_factor_disabled:
+        explanation: Xác thực hai yếu tố cho tài khoản của bạn đã bị vô hiệu hóa. Đăng nhập bây giờ có thể chỉ bằng địa chỉ e-mail và mật khẩu.
+        subject: 'Mastodon: Xác thực hai yếu tố bị vô hiệu hóa'
+        title: Vô hiệu hóa 2FA
+      two_factor_enabled:
+        explanation: Xác thực hai yếu tố đã được kích hoạt cho tài khoản của bạn. Mã thông báo được tạo bởi ứng dụng TOTP được ghép nối sẽ được yêu cầu để đăng nhập.
+        subject: 'Mastodon: Kích hoạt xác thực hai yếu tố'
+        title: Đã bật 2FA
+      two_factor_recovery_codes_changed:
+        explanation: Các mã khôi phục trước đó đã bị vô hiệu và các mã mới được tạo.
+        subject: 'Mastodon: Mã phục hồi hai yếu tố được tạo lại'
+        title: Mã khôi phục 2FA đã thay đổi
+      unlock_instructions:
+        subject: 'Mastodon: Hướng dẫn mở khóa'
+    omniauth_callbacks:
+      failure: Không thể xác thực bạn từ %{kind} vì &quot;%{reason}&quot;.
+      success: Xác thực thành công từ tài khoản %{kind}.
+    passwords:
+      no_token: Bạn không thể truy cập trang này mà không đến từ email đặt lại mật khẩu. Nếu bạn đến từ một email đặt lại mật khẩu, vui lòng đảm bảo rằng bạn đã sử dụng URL đầy đủ được cung cấp.
+      send_instructions: Nếu địa chỉ email của bạn tồn tại trong cơ sở dữ liệu của chúng tôi, bạn sẽ nhận được liên kết khôi phục mật khẩu tại địa chỉ email của bạn sau vài phút. Vui lòng kiểm tra thư mục thư rác nếu bạn không nhận được email này.
+      send_paranoid_instructions: Nếu địa chỉ email của bạn tồn tại trong cơ sở dữ liệu của chúng tôi, bạn sẽ nhận được liên kết khôi phục mật khẩu tại địa chỉ email của bạn sau vài phút. Vui lòng kiểm tra thư mục thư rác nếu bạn không nhận được email này.
+      updated: Mật khẩu của bạn đã được thay đổi thành công. Bây giờ bạn đã đăng nhập.
+      updated_not_active: Mật khẩu của bạn đã được thay đổi thành công.
+    registrations:
+      destroyed: Tạm biệt! Tài khoản của bạn đã bị hủy thành công. Mong rằng chúng tôi sẽ sớm gặp lại bạn.
+      signed_up: Chào mừng bạn Bạn đã đăng ký thành công.
+      signed_up_but_inactive: Bạn đã đăng ký thành công. Tuy nhiên, chúng tôi không thể đăng nhập cho bạn vì tài khoản của bạn chưa được kích hoạt.
+      signed_up_but_locked: Bạn đã đăng ký thành công. Tuy nhiên, chúng tôi không thể đăng nhập cho bạn vì tài khoản của bạn bị khóa.
+      signed_up_but_pending: Một tin nhắn với một liên kết xác nhận đã được gửi đến địa chỉ email của bạn. Sau khi bạn nhấp vào liên kết, chúng tôi sẽ xem xét ứng dụng của bạn. Bạn sẽ được thông báo nếu nó được chấp thuận.
+      signed_up_but_unconfirmed: Một tin nhắn với một liên kết xác nhận đã được gửi đến địa chỉ email của bạn. Vui lòng theo liên kết để kích hoạt tài khoản của bạn. Vui lòng kiểm tra thư mục thư rác nếu bạn không nhận được email này.
+      update_needs_confirmation: Bạn đã cập nhật tài khoản thành công, nhưng chúng tôi cần xác minh địa chỉ email mới của bạn. Vui lòng kiểm tra email của bạn và theo liên kết xác nhận để xác nhận địa chỉ email mới của bạn. Vui lòng kiểm tra thư mục thư rác nếu bạn không nhận được email này.
+      updated: Tài khoản của bạn đã được cập nhật thành công.
+    sessions:
+      already_signed_out: Đăng xuất thành công.
+      signed_in: Đã đăng nhập thành công.
+      signed_out: Đăng xuất thành công.
+    unlocks:
+      send_instructions: Bạn sẽ nhận được một email với các hướng dẫn về cách mở khóa tài khoản của bạn trong vài phút. Vui lòng kiểm tra thư mục thư rác nếu bạn không nhận được email này.
+      send_paranoid_instructions: Nếu tài khoản của bạn tồn tại, bạn sẽ nhận được email có hướng dẫn cách mở khóa trong vài phút. Vui lòng kiểm tra thư mục thư rác nếu bạn không nhận được email này.
+      unlocked: Tài khoản của bạn đã được mở khóa thành công. Vui lòng đăng nhập để tiếp tục.
+  errors:
+    messages:
+      already_confirmed: đã được xác nhận, vui lòng thử đăng nhập
+      confirmation_period_expired: cần được xác nhận trong vòng %{period}, vui lòng yêu cầu một cái mới
+      expired: đã hết hạn, vui lòng yêu cầu một cái mới
+      not_found: không tìm thấy
+      not_locked: không bị khóa
+      not_saved:
+        other: "%{count} lỗi đã cấm %{resource} này được lưu:"
diff --git a/config/locales/devise.zh-CN.yml b/config/locales/devise.zh-CN.yml
index 65c0a5c9d..4c75a8816 100644
--- a/config/locales/devise.zh-CN.yml
+++ b/config/locales/devise.zh-CN.yml
@@ -12,7 +12,7 @@ zh-CN:
       last_attempt: 你还有最后一次尝试机会,再次失败你的帐户将被锁定。
       locked: 你的帐户已被锁定。
       not_found_in_database: "%{authentication_keys}或密码错误。"
-      pending: 你的账户仍在审核中。
+      pending: 你的帐号仍在审核中。
       timeout: 你已登录超时,请重新登录。
       unauthenticated: 继续操作前请注册或者登录。
       unconfirmed: 继续操作前请先确认你的帐户。
@@ -47,12 +47,12 @@ zh-CN:
         subject: Mastodon:重置密码信息
         title: 重置密码
       two_factor_disabled:
-        explanation: 账户的双重认证已禁用。现在仅使用邮箱和密码登录即可登录。
+        explanation: 帐号的双重认证已禁用。现在仅使用邮箱和密码登录即可登录。
         subject: Mastodon:双重认证已禁用。
-        title: 双重认证禁用
+        title: 双重认证已禁用
       two_factor_enabled:
-        explanation: 账户双重认证已启用。登录时将需要来自已配对的 TOTP 应用生成的验证码。
-        subject: 'Mastodon: 双重验证已开启'
+        explanation: 账号双重认证已启用。登录时将需要来自已配对的 TOTP 应用生成的验证码。
+        subject: Mastodon:双重验证已开启
         title: 已启用双重认证
       two_factor_recovery_codes_changed:
         explanation: 之前的恢复码已失效,现已生成了新的恢复码。
diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml
index 895405f4a..77472042d 100644
--- a/config/locales/devise.zh-TW.yml
+++ b/config/locales/devise.zh-TW.yml
@@ -4,17 +4,17 @@ zh-TW:
     confirmations:
       confirmed: 您的電子信箱位址已確認成功。
       send_instructions: 幾分鐘後您將收到確認信件。若未收到此信件,請檢查垃圾郵件資料夾。
-      send_paranoid_instructions: 如果您的電子信箱存在於我們的資料庫,將會在幾分鐘內收到確認信。若未收到請檢查垃圾郵件資料夾。
+      send_paranoid_instructions: 如果您的電子信箱存在於我們的資料庫,您將會在幾分鐘內收到確認信。若未收到請檢查垃圾郵件資料夾。
     failure:
       already_authenticated: 您已登入。
       inactive: 您的帳戶尚未啟用。
       invalid: 無效的 %{authentication_keys} 或密碼。
-      last_attempt: 在帳號遭封鎖前您還有最後一次嘗試機會。
-      locked: 您的帳戶已被鎖定。
+      last_attempt: 在帳號鎖定前,您還有最後一次嘗試機會。
+      locked: 已鎖定您的帳戶。
       not_found_in_database: 無效的 %{authentication_keys} 或密碼。
       pending: 您的帳戶仍在審核中。
       timeout: 登入階段逾時。請重新登入以繼續。
-      unauthenticated: 您必須先登入或註冊以繼續使用。
+      unauthenticated: 您必須先登入或註冊才能繼續使用。
       unconfirmed: 您必須先確認電子信箱才能繼續使用。
     mailer:
       confirmation_instructions:
@@ -22,7 +22,7 @@ zh-TW:
         action_with_app: 確認並返回 %{app}
         explanation: 您已經在 %{host} 上以此電子信箱位址建立了一支帳戶。您距離啟用它只剩一點之遙了。若這不是您,請忽略此信件。
         explanation_when_pending: 您使用此電子信箱位址申請了 %{host} 的邀請。當您確認電子信箱後我們將審核您的申請,而直到核准前您都無法登入。當您的申請遭拒絕,您的資料將被移除而不必做後續動作。如果這不是您,請忽略此信件。
-        extra_html: 同時也請看看<a href="%{terms_path}">該伺服器的規則</a>與<a href="%{policy_path}">服務條款</a>。
+        extra_html: 同時也請看看<a href="%{terms_path}">伺服器規則</a>與<a href="%{policy_path}">服務條款</a>。
         subject: Mastodon:%{instance} 確認說明
         title: 驗證電子信箱位址
       email_changed:
@@ -42,7 +42,7 @@ zh-TW:
         title: 驗證電子信箱位址
       reset_password_instructions:
         action: 變更密碼
-        explanation: 您已請求設定帳號的新密碼。
+        explanation: 您已請求帳戶的新密碼。
         extra: 若您並未請求,請忽略此信件。您的密碼在存取上方連結並建立新連結前不會變更。
         subject: Mastodon:重設密碼指引
         title: 重設密碼
@@ -55,14 +55,14 @@ zh-TW:
         subject: Mastodon:已啟用兩步驟驗證
         title: 已啟用 2FA
       two_factor_recovery_codes_changed:
-        explanation: 上一次的復原碼已經失效,且已產生新的復原碼。
+        explanation: 上一次的復原碼已經失效,且已產生新的。
         subject: Mastodon:兩步驟驗證復原碼已經重新產生
         title: 2FA 復原碼已變更
       unlock_instructions:
-        subject: Mastodon:帳戶解鎖指引
+        subject: Mastodon:解鎖指引
     omniauth_callbacks:
       failure: 無法透過 %{kind} 認證是否為您,因為「%{reason}」。
-      success: 成功透過 %{kind} 登入帳戶。
+      success: 成功透過 %{kind} 帳戶登入。
     passwords:
       no_token: 您必須透過密碼重設信件才能存取此頁面。若確實如此,請確定輸入的網址是完整的。
       send_instructions: 若電子信箱位址存在於資料庫,幾分鐘後您將在信箱中收到密碼復原連結。若未收到請檢查垃圾郵件資料夾。
@@ -92,6 +92,6 @@ zh-TW:
       confirmation_period_expired: 需要在 %{period} 內完成驗證。請重新申請
       expired: 已經過期,請重新請求
       not_found: 找不到
-      not_locked: 並未被鎖定
+      not_locked: 並未鎖定
       not_saved:
         other: 因 %{count} 錯誤導致 %{resource} 無法儲存:
diff --git a/config/locales/doorkeeper.ar.yml b/config/locales/doorkeeper.ar.yml
index 51d8b76b4..49c7cade9 100644
--- a/config/locales/doorkeeper.ar.yml
+++ b/config/locales/doorkeeper.ar.yml
@@ -38,6 +38,7 @@ ar:
         application: تطبيق
         callback_url: رابط رد النداء
         delete: حذف
+        empty: ليس لديك أية تطبيقات.
         name: التسمية
         new: تطبيق جديد
         scopes: المجالات
@@ -123,6 +124,7 @@ ar:
       read: قراءة كافة بيانات حسابك
       read:accounts: معاينة معلومات الحساب
       read:blocks: رؤية الحسابات التي قمت بحجبها
+      read:bookmarks: اطّلع على فواصلك المرجعية
       read:favourites: رؤية مفضلاتك
       read:filters: رؤية عوامل التصفية الخاصة بك
       read:follows: رؤية متابِعيك
@@ -135,6 +137,7 @@ ar:
       write: تغيير كافة بيانات حسابك
       write:accounts: تعديل صفحتك التعريفية
       write:blocks: حجب الحسابات و النطاقات
+      write:bookmarks: الإحتفاظ بالمنشورات في الفواصل المرجعية
       write:favourites: الإعجاب بمنشورات
       write:filters: إنشاء عوامل تصفية
       write:follows: متابَعة الأشخاص
diff --git a/config/locales/doorkeeper.ast.yml b/config/locales/doorkeeper.ast.yml
index ce88af797..5c54b5353 100644
--- a/config/locales/doorkeeper.ast.yml
+++ b/config/locales/doorkeeper.ast.yml
@@ -4,6 +4,7 @@ ast:
     attributes:
       doorkeeper/application:
         name: Nome de l'aplicación
+        scopes: Ámbitos
         website: Sitiu web de l'aplicación
     errors:
       models:
@@ -19,10 +20,22 @@ ast:
         destroy: Destruyir
         edit: Editar
         submit: Unviar
+      confirmations:
+        destroy: "¿De xuru?"
+      form:
+        error: "¡Meca! Comprueba los fallos posibles del formulariu"
+      help:
+        native_redirect_uri: Usa %{native_redirect_uri} pa pruebes llocales
       index:
+        empty: Nun tienes aplicaciones.
         name: Nome
+        new: Aplicación nueva
+        scopes: Ámbitos
+      new:
+        title: Aplicación nueva
       show:
         actions: Aiciones
+        scopes: Ámbitos
         title: 'Aplicación: %{name}'
     authorizations:
       error:
@@ -31,19 +44,27 @@ ast:
         able_to: Va ser a
         prompt: L'aplicación %{client_name} solicitó l'accesu a la to cuenta
       show:
-        title: Copia esti códigu d'autorización y apégalu na aplicación.
+        title: Copia esti códigu d'autorización y apiégalu na aplicación.
     authorized_applications:
       buttons:
         revoke: Revocar
+      confirmations:
+        revoke: "¿De xuru?"
       index:
+        application: Aplicación
+        created_at: Data d'autorización
         date_format: "%H:%M:%S %d-%m-%Y"
+        scopes: Ámbitos
         title: Les aplicaciones qu'autoricesti
     errors:
       messages:
+        access_denied: El dueñu del recursu o'l sirvidor d'autorización ñegó la solicitú.
         invalid_token:
           expired: Caducó'l pase d'accesu
           revoked: Revocóse'l pase d'accesu
           unknown: El pase d'accesu nun ye válidu
+        server_error: El sirvidor d'autorizaciones alcontró una condición inesperada qu'evitó que cumpliera la solicitú.
+        temporarily_unavailable: Anguaño'l sirvidor d'autorizaciones nun ye a remanar la solicitú pola mor d'una sobrecarga temporal o caltenimientu del sirvidor.
         unauthorized_client: El veceru nun ta autorizáu pa facer esta solicitú usando esti métodu.
         unsupported_response_type: El sirvidor d'autorización nun sofita esta triba de rempuesta.
     layouts:
@@ -52,13 +73,21 @@ ast:
           applications: Aplicaciones
           oauth2_provider: Fornidor d'OAuth2
     scopes:
+      admin:read: lleer tolos datos del sirvidor
+      admin:read:accounts: lleer la información sensible de toles cuentes
+      admin:read:reports: lleer la información sensible de tolos informe y cuentes informaes
+      admin:write: modificar tolos datos del sirvidor
+      read: lleer tolos datos de la to cuenta
       read:accounts: ver información de cuentes
       read:blocks: ver quién bloquies
+      read:bookmarks: ver los tos marcadores
+      read:favourites: ver los tos favoritos
       read:filters: ver les tos peñeres
       read:follows: ver quién sigues
       read:lists: ver les tos llistes
       read:mutes: ver quién silencies
       read:notifications: ver los tos avisos
+      read:reports: ver los tos informes
       read:statuses: ver tolos estaos
       write: modificar los datos de la to cuenta
       write:accounts: modificar el to perfil
@@ -66,7 +95,7 @@ ast:
       write:filters: crear peñeres
       write:follows: siguir a xente
       write:lists: crear llistes
-      write:media: xubir ficheros de medios
+      write:media: xubir ficheros multimedia
       write:mutes: silenciar xente y conversaciones
       write:notifications: llimpiar los tos avisos
       write:statuses: espublizar estaos
diff --git a/config/locales/doorkeeper.ca.yml b/config/locales/doorkeeper.ca.yml
index dde70f47a..3de9d4bab 100644
--- a/config/locales/doorkeeper.ca.yml
+++ b/config/locales/doorkeeper.ca.yml
@@ -38,6 +38,7 @@ ca:
         application: Aplicació
         callback_url: URL de retorn
         delete: Suprimeix
+        empty: No tens cap aplicació.
         name: Nom
         new: Aplicació nova
         scopes: Àmbits
@@ -63,18 +64,18 @@ ca:
         prompt: L'aplicació %{client_name} sol⋅licita tenir accés al teu compte
         title: Cal autorizació
       show:
-        title: Copia aquest coddi d'autorització i enganxa'l en l'aplicació.
+        title: Copia aquest codi d'autorització i enganxa'l en l'aplicació.
     authorized_applications:
       buttons:
         revoke: Revoca
       confirmations:
-        revoke: Estàs segur?
+        revoke: N'estàs segur?
       index:
         application: Aplicació
         created_at: Creat el
         date_format: "%A-%m-%d %H:%M:%S"
         scopes: Àmbits
-        title: Les teves aplicacions autoritzades
+        title: Les aplicacions autoritzades
     errors:
       messages:
         access_denied: El propietari del recurs o servidor d'autorizació ha denegat la petició.
@@ -124,7 +125,8 @@ ca:
       push: rebre notificacions push del teu compte
       read: llegir les dades del teu compte
       read:accounts: veure informació dels comptes
-      read:blocks: veure els teus bloqueijos
+      read:blocks: veure els teus bloqueigs
+      read:bookmarks: veure els teus marcadors
       read:favourites: veure els teus favorits
       read:filters: veure els teus filtres
       read:follows: veure els teus seguiments
@@ -133,11 +135,12 @@ ca:
       read:notifications: veure les teves notificacions
       read:reports: veure els teus informes
       read:search: cerca en nom teu
-      read:statuses: veure tots els toots
+      read:statuses: veure tots els tuts
       write: publicar en el teu nom
       write:accounts: modifica el teu perfil
       write:blocks: bloqueja comptes i dominis
-      write:favourites: afavoreix toots
+      write:bookmarks: publicacions a marcadors
+      write:favourites: afavoreix tuts
       write:filters: crear filtres
       write:follows: seguir usuaris
       write:lists: crear llistes
@@ -145,4 +148,4 @@ ca:
       write:mutes: silencia usuaris i converses
       write:notifications: esborra les teves notificacions
       write:reports: informe d’altres persones
-      write:statuses: publicar toots
+      write:statuses: publicar tuts
diff --git a/config/locales/doorkeeper.co.yml b/config/locales/doorkeeper.co.yml
index d45041a4e..4f03c0c32 100644
--- a/config/locales/doorkeeper.co.yml
+++ b/config/locales/doorkeeper.co.yml
@@ -38,6 +38,7 @@ co:
         application: Applicazione
         callback_url: URL di richjama
         delete: Toglie
+        empty: Ùn avete micca d'applicazione.
         name: Nome
         new: Applicazione nova
         scopes: Scopi
@@ -125,6 +126,7 @@ co:
       read: leghje tutte l’infurmazioni di u vostru contu
       read:accounts: Vede l'infurmazione di i conti
       read:blocks: vede i vostri blucchimi
+      read:bookmarks: vede i vostri segnalibri
       read:favourites: vede i vostri favuriti
       read:filters: vede i vostri filtri
       read:follows: vede i vostri abbunamenti
@@ -137,6 +139,7 @@ co:
       write: mudificà i dati di u vostru contu
       write:accounts: mudificà u prufile
       write:blocks: bluccà conti è dumini
+      write:bookmarks: segnà statuti
       write:favourites: aghjustà statuti à i favuriti
       write:filters: creà filtri
       write:follows: siguità conti
diff --git a/config/locales/doorkeeper.cs.yml b/config/locales/doorkeeper.cs.yml
index cb5cd147c..00345db76 100644
--- a/config/locales/doorkeeper.cs.yml
+++ b/config/locales/doorkeeper.cs.yml
@@ -14,8 +14,8 @@ cs:
             redirect_uri:
               fragment_present: nesmí obsahovat fragment.
               invalid_uri: musí být platné URI.
-              relative_uri: musí být apsolutní URI.
-              secured_uri: musí být URI HTTPS/SSL.
+              relative_uri: musí být absolutní URI.
+              secured_uri: musí být HTTPS/SSL URI.
   doorkeeper:
     applications:
       buttons:
@@ -25,19 +25,20 @@ cs:
         edit: Upravit
         submit: Odeslat
       confirmations:
-        destroy: Jste si jistý/á?
+        destroy: Opravdu?
       edit:
         title: Upravit aplikaci
       form:
-        error: A jéje! Zkontrolujte svůj formulář kvůli případným chybám
+        error: A jéje! Zkontrolujte ve formuláři případné chyby
       help:
         native_redirect_uri: Pro místní testy použijte %{native_redirect_uri}
         redirect_uri: Jedno URI na každý řádek
-        scopes: Oddělujte rozsahy mezerami. Pro použití výchozích rozsahů zanechte prázdné.
+        scopes: Oddělujte rozsahy mezerami. Pro použití výchozích rozsahů ponechte prázdné.
       index:
         application: Aplikace
         callback_url: Zpáteční URL
         delete: Smazat
+        empty: Nemáte žádné aplikace.
         name: Název
         new: Nová aplikace
         scopes: Rozsahy
@@ -50,7 +51,7 @@ cs:
         application_id: Klientský klíč
         callback_urls: Zpáteční URL
         scopes: Rozsahy
-        secret: Klientské tajemství
+        secret: Klientský secret
         title: 'Aplikace: %{name}'
     authorizations:
       buttons:
@@ -68,7 +69,7 @@ cs:
       buttons:
         revoke: Zamítnout
       confirmations:
-        revoke: Jste si jistý/á?
+        revoke: Opravdu?
       index:
         application: Aplikace
         created_at: Autorizováno
@@ -77,14 +78,14 @@ cs:
         title: Vaše autorizované aplikace
     errors:
       messages:
-        access_denied: Vlastník zdroje či autorizační server zamítl požadavek.
+        access_denied: Vlastník zdroje či autorizační server žádost zamítl.
         credential_flow_not_configured: Proud Resource Owner Password Credentials selhal, protože Doorkeeper.configure.resource_owner_from_credentials nebylo nakonfigurováno.
         invalid_client: Ověření klienta selhalo kvůli neznámému klientovi, chybějící klientské autentizaci či nepodporované autentizační metodě.
-        invalid_grant: Poskytnuté oprávnění je neplatné, vypršelé, zamítnuté, neshoduje se s URI přesměrování použitým v požadavku o autorizaci, nebo bylo uděleno jinému klientu.
-        invalid_redirect_uri: Přesměrovací URI není platné.
-        invalid_request: Požadavku chybí pžadovaný parametr, obsahuje nepodporovanou hodnotu parametru, či je jinak malformovaný.
+        invalid_grant: Poskytnuté oprávnění je neplatné, vypršela jeho platnost, bylo zamítnuto, neshoduje se s URI přesměrování použitým v požadavku o autorizaci, nebo bylo uděleno jinému klientu.
+        invalid_redirect_uri: URI pro přesměrování není platné.
+        invalid_request: Požadavku chybí povinný parametr, obsahuje nepodporovanou hodnotu parametru, či je jinak špatné formulovaný.
         invalid_resource_owner: Poskytnuté přihlašovací údaje vlastníka zdroje nejsou platné, nebo vlastník zdroje nemůže být nalezen
-        invalid_scope: Požadovaný rozsah je neplatný, neznámý, nebo malformovaný.
+        invalid_scope: Požadovaný rozsah je neplatný, neznámý, nebo špatně formulovaný.
         invalid_token:
           expired: Přístupový token vypršel
           revoked: Přístupový token byl zamítnut
@@ -93,8 +94,8 @@ cs:
         server_error: Autorizační server se setkal s neočekávanou chybou, která mu zabránila ve vykonání požadavku.
         temporarily_unavailable: Autorizační server vás nyní nemůže obsloužit kvůli dočasnému přetížení či údržbě serveru.
         unauthorized_client: Klient není autorizován k vykonání tohoto požadavku touto metodou.
-        unsupported_grant_type: Tento typ oprávnění není podporován autorizačním serverem.
-        unsupported_response_type: Autorizační server nepodporuje tento typ odpovědi.
+        unsupported_grant_type: Tento typ oprávnění není autorizačním serverem podporován.
+        unsupported_response_type: Autorizační server tento typ odpovědi nepodporuje.
     flash:
       applications:
         create:
@@ -119,30 +120,32 @@ cs:
       admin:read:reports: číst citlivé informace všech nahlášení a nahlášených účtů
       admin:write: měnit všechna data na serveru
       admin:write:accounts: provádět moderátorské akce s účty
-      admin:write:reports: provádět moderátorské akce s nahlášeními
+      admin:write:reports: provádět moderátorské akce s hlášeními
       follow: upravovat vztahy mezi profily
       push: přijímat vaše push oznámení
       read: vidět všechna data vašeho účtu
       read:accounts: vidět informace o účtech
       read:blocks: vidět vaše blokace
-      read:favourites: vidět vaše oblíbení
+      read:bookmarks: vidět vaše záložky
+      read:favourites: vidět vaše oblíbené příspěvky
       read:filters: vidět vaše filtry
       read:follows: vidět vaše sledování
       read:lists: vidět vaše seznamy
       read:mutes: vidět vaše skrytí
       read:notifications: vidět vaše oznámení
-      read:reports: vidět vaše nahlášení
+      read:reports: vidět vaše hlášení
       read:search: vyhledávat za vás
       read:statuses: vidět všechny tooty
       write: měnit všechna data vašeho účtu
       write:accounts: měnit váš profil
       write:blocks: blokovat účty a domény
-      write:favourites: oblibovat si tooty
+      write:bookmarks: přidávat tooty do záložek
+      write:favourites: označovat tooty jako oblíbené
       write:filters: vytvářet filtry
       write:follows: sledovat lidi
       write:lists: vytvářet seznamy
       write:media: nahrávat mediální soubory
       write:mutes: skrývat lidi a konverzace
-      write:notifications: vymazávat vaše oznámení
+      write:notifications: mazat vaše oznámení
       write:reports: nahlašovat jiné uživatele
-      write:statuses: publikovat tooty
+      write:statuses: zvařejňovat tooty
diff --git a/config/locales/doorkeeper.cy.yml b/config/locales/doorkeeper.cy.yml
index e29043e86..08e4baaff 100644
--- a/config/locales/doorkeeper.cy.yml
+++ b/config/locales/doorkeeper.cy.yml
@@ -125,6 +125,7 @@ cy:
       read: darllen holl ddata eich cyfrif
       read:accounts: gweld gwybodaeth y cyfrif
       read:blocks: gweld eich blociau
+      read:bookmarks: gweld eich tudalnodau
       read:favourites: gweld eich ffefrynnau
       read:filters: gweld eich hidlwyr
       read:follows: gweld eich dilynwyr
@@ -137,6 +138,7 @@ cy:
       write: addasu holl ddata eich cyfri
       write:accounts: addasu eich proffil
       write:blocks: blocio cyfrifon a parthau
+      write:bookmarks: statwsau tudalnod
       write:favourites: hoff dŵtiau
       write:filters: creu hidlwyr
       write:follows: dilyn pobl
diff --git a/config/locales/doorkeeper.da.yml b/config/locales/doorkeeper.da.yml
index 4d2c95aff..04f524c0a 100644
--- a/config/locales/doorkeeper.da.yml
+++ b/config/locales/doorkeeper.da.yml
@@ -61,7 +61,7 @@ da:
       new:
         able_to: Den vil være i stand til
         prompt: Applikationen %{client_name} anmoder om adgang til din konto
-        title: Godkendelse påkræves
+        title: Godkendelse påkrævet
       show:
         title: Kopiere denne godkendelseskode og indsæt den i applikationen.
     authorized_applications:
@@ -125,6 +125,7 @@ da:
       read: læse alle din kontos data
       read:accounts: se konto oplysninger
       read:blocks: se dine blokeringer
+      read:bookmarks: se dine bogmærker
       read:favourites: se dine favoritter
       read:filters: se dine filtre
       read:follows: se hvem du følger
@@ -137,6 +138,7 @@ da:
       write: ændre din kontos data
       write:accounts: ændre din profil
       write:blocks: bloker konti og domæner
+      write:bookmarks: bogmærk statusser
       write:favourites: favoriser statusser
       write:filters: opret filtre
       write:follows: følg folk
diff --git a/config/locales/doorkeeper.de.yml b/config/locales/doorkeeper.de.yml
index c41a847b2..8b850b56a 100644
--- a/config/locales/doorkeeper.de.yml
+++ b/config/locales/doorkeeper.de.yml
@@ -38,6 +38,7 @@ de:
         application: Anwendung
         callback_url: Callback-URL
         delete: Löschen
+        empty: Du hast keine Anwendungen.
         name: Name
         new: Neue Anwendung
         scopes: Befugnisse
@@ -125,6 +126,7 @@ de:
       read: all deine Daten lesen
       read:accounts: deine Konteninformationen einsehen
       read:blocks: deine Blockaden einsehen
+      read:bookmarks: deine Lesezeichen lesen
       read:favourites: deine Favoriten ansehen
       read:filters: deine Filter ansehen
       read:follows: sehen, wem du folgst
@@ -137,6 +139,7 @@ de:
       write: all deine Benutzerdaten verändern
       write:accounts: dein Profil bearbeiten
       write:blocks: Domains und Konten blockieren
+      write:bookmarks: Lesezeichen hinzufügen
       write:favourites: Beiträge favorisieren
       write:filters: Filter erstellen
       write:follows: Leuten folgen
diff --git a/config/locales/doorkeeper.el.yml b/config/locales/doorkeeper.el.yml
index 66bee0b0d..7423606d4 100644
--- a/config/locales/doorkeeper.el.yml
+++ b/config/locales/doorkeeper.el.yml
@@ -38,6 +38,7 @@ el:
         application: Εφαρμογή
         callback_url: URL επιστροφής (Callback)
         delete: Διαγραφή
+        empty: Δεν έχετε αιτήσεις.
         name: Όνομα
         new: Νέα εφαρμογή
         scopes: Εύρος εφαρμογής
@@ -125,6 +126,7 @@ el:
       read: να διαβάζει όλα τα στοιχεία του λογαριασμού σου
       read:accounts: να βλέπει τα στοιχεία λογαριασμών
       read:blocks: να βλέπει τους αποκλεισμένους σου
+      read:bookmarks: εμφάνιση των σελιδοδεικτών σας
       read:favourites: να βλέπει τα αγαπημένα σου
       read:filters: να βλέπει τα φίλτρα σου
       read:follows: να βλέπει ποιους ακολουθείς
@@ -137,6 +139,7 @@ el:
       write: να αλλάζει όλα τα στοιχεία του λογαριασμού σου
       write:accounts: να αλλάζει το προφίλ σου
       write:blocks: να μπλοκάρει λογαριασμούς και τομείς
+      write:bookmarks: προσθήκη σελιδοδεικτών
       write:favourites: να σημειώνει δημοσιεύσεις ως αγαπημένες
       write:filters: να δημιουργεί φίλτρα
       write:follows: να ακολουθεί ανθρώπους
diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml
index 4e9c83a8f..2be2ef036 100644
--- a/config/locales/doorkeeper.en.yml
+++ b/config/locales/doorkeeper.en.yml
@@ -38,6 +38,7 @@ en:
         application: Application
         callback_url: Callback URL
         delete: Delete
+        empty: You have no applications.
         name: Name
         new: New application
         scopes: Scopes
diff --git a/config/locales/doorkeeper.eo.yml b/config/locales/doorkeeper.eo.yml
index 171e7d404..89a579ae9 100644
--- a/config/locales/doorkeeper.eo.yml
+++ b/config/locales/doorkeeper.eo.yml
@@ -38,6 +38,7 @@ eo:
         application: Aplikaĵo
         callback_url: Revena URL
         delete: Forigi
+        empty: Vi havas neniun aplikaĵon.
         name: Nomo
         new: Nova aplikaĵo
         scopes: Ampleksoj
@@ -116,13 +117,16 @@ eo:
     scopes:
       admin:read: legu ĉiujn datumojn en la servilo
       admin:read:accounts: legas senteman informacion de ĉiuj kontoj
-      admin:read:reports: legas senteman informacion de ĉiuj raportoj kun raportis kontojn
+      admin:read:reports: legas konfidencajn informojn de ĉiuj signaloj kaj signalitaj kontoj
       admin:write: modifu ĉiujn datumojn en la servilo
+      admin:write:accounts: plenumi agojn de kontrolo sur kontoj
+      admin:write:reports: plenumi agojn de kontrolo sur signaloj
       follow: ŝanĝi rilatojn al aliaj kontoj
       push: ricevi viajn puŝ-sciigojn
       read: legi ĉiujn datumojn de via konto
       read:accounts: vidi la informojn de la konto
       read:blocks: vidi viajn blokojn
+      read:bookmarks: vidi viajn legosignojn
       read:favourites: vidi viajn stelumojn
       read:filters: vidi viajn filtrilojn
       read:follows: vidi viajn sekvatojn
@@ -135,6 +139,7 @@ eo:
       write: ŝanĝi ĉiujn datumojn de via konto
       write:accounts: ŝanĝi vian profilon
       write:blocks: bloki kontojn kaj domajnojn
+      write:bookmarks: aldoni mesaĝojn al la legosignoj
       write:favourites: stelumitaj mesaĝoj
       write:filters: krei filtrilojn
       write:follows: sekvi homojn
diff --git a/config/locales/doorkeeper.es-AR.yml b/config/locales/doorkeeper.es-AR.yml
index 14ac59521..85ab7729d 100644
--- a/config/locales/doorkeeper.es-AR.yml
+++ b/config/locales/doorkeeper.es-AR.yml
@@ -38,6 +38,7 @@ es-AR:
         application: Aplicación
         callback_url: Dirección web de respuesta ("callback")
         delete: Eliminar
+        empty: No tenés aplicaciones.
         name: Nombre
         new: Nueva aplicación
         scopes: Ámbitos
@@ -125,6 +126,7 @@ es-AR:
       read: leer todos los datos de tu cuenta
       read:accounts: ver información de cuentas
       read:blocks: ver qué cuentas bloqueaste
+      read:bookmarks: mirá tus marcadores
       read:favourites: ver tus favoritos
       read:filters: ver tus filtros
       read:follows: ver qué cuentas seguís
@@ -137,6 +139,7 @@ es-AR:
       write: modificar todos los datos de tu cuenta
       write:accounts: modificar tu perfil
       write:blocks: bloquear cuentas y dominios
+      write:bookmarks: estados del marcador
       write:favourites: toots favoritos
       write:filters: crear filtros
       write:follows: seguir cuentas
diff --git a/config/locales/doorkeeper.es.yml b/config/locales/doorkeeper.es.yml
index 1b03e33f2..61e6cb6a1 100644
--- a/config/locales/doorkeeper.es.yml
+++ b/config/locales/doorkeeper.es.yml
@@ -38,6 +38,7 @@ es:
         application: Aplicación
         callback_url: URL de callback
         delete: Eliminar
+        empty: No tienes aplicaciones.
         name: Nombre
         new: Nueva aplicación
         scopes: Ámbitos
@@ -125,6 +126,7 @@ es:
       read: leer los datos de tu cuenta
       read:accounts: ver información de cuentas
       read:blocks: ver a quién has bloqueado
+      read:bookmarks: ver tus marcadores
       read:favourites: ver tus favoritos
       read:filters: ver tus filtros
       read:follows: ver a quién sigues
@@ -137,6 +139,7 @@ es:
       write: publicar en tu nombre
       write:accounts: modifica tu perfil
       write:blocks: bloquear cuentas y dominios
+      write:bookmarks: guardar estados como marcadores
       write:favourites: toots favoritos
       write:filters: crear filtros
       write:follows: seguir usuarios
diff --git a/config/locales/doorkeeper.et.yml b/config/locales/doorkeeper.et.yml
index f2a33ad0a..d3b011a67 100644
--- a/config/locales/doorkeeper.et.yml
+++ b/config/locales/doorkeeper.et.yml
@@ -38,6 +38,7 @@ et:
         application: Rakendus
         callback_url: Ümbersuunamise URL
         delete: Kustuta
+        empty: Teil pole rakendusi.
         name: Nimi
         new: Uus rakendus
         scopes: Ulatused
@@ -125,6 +126,7 @@ et:
       read: lugeda kogu Teie konto andmeid
       read:accounts: näha konto informatsiooni
       read:blocks: näha Teie blokeeringuid
+      read:bookmarks: näha järjehoidjaid
       read:favourites: näha Teie lemmikuid
       read:filters: näha Teie filtreid
       read:follows: näha Teie jälgimisi
@@ -137,6 +139,7 @@ et:
       write: redigeerida kogu Teie konto andmeid
       write:accounts: redigeerida Teie profiili
       write:blocks: blokeerida kontosid ja domeene
+      write:bookmarks: lisada staatusele järjehoidjaid
       write:favourites: lisada staatuseid lemmikuks
       write:filters: luua filtreid
       write:follows: jälgida inimesi
diff --git a/config/locales/doorkeeper.eu.yml b/config/locales/doorkeeper.eu.yml
index 70e52e8ad..07fc13983 100644
--- a/config/locales/doorkeeper.eu.yml
+++ b/config/locales/doorkeeper.eu.yml
@@ -38,6 +38,7 @@ eu:
         application: Aplikazioa
         callback_url: Itzulera URLa
         delete: Ezabatu
+        empty: Ez duzu aplikaziorik.
         name: Izena
         new: Aplikazio berria
         scopes: Irismena
@@ -125,6 +126,7 @@ eu:
       read: irakurri zure kontuko datu guztiak
       read:accounts: ikusi kontuaren informazioa
       read:blocks: ikusi zure blokeoak
+      read:bookmarks: ikusi zure laster-markak
       read:favourites: ikusi zure gogokoak
       read:filters: ikusi zure iragazkiak
       read:follows: ikusi zuk jarraitutakoak
@@ -137,6 +139,7 @@ eu:
       write: kontuaren datu guztiak aldatzea
       write:accounts: zure profila aldatzea
       write:blocks: kontuak eta domeinuak blokeatzea
+      write:bookmarks: mezuen laster-marka
       write:favourites: gogoko mezuak
       write:filters: sortu iragazkiak
       write:follows: jarraitu jendea
diff --git a/config/locales/doorkeeper.fa.yml b/config/locales/doorkeeper.fa.yml
index b677c3346..c9ca1895e 100644
--- a/config/locales/doorkeeper.fa.yml
+++ b/config/locales/doorkeeper.fa.yml
@@ -5,8 +5,8 @@ fa:
       doorkeeper/application:
         name: نام برنامه
         redirect_uri: نشانی تغییرمسیر
-        scopes: محدوده
-        website: وبگاه برنامه
+        scopes: حوزه‌ها
+        website: پایگاه وب برنامه
     errors:
       models:
         doorkeeper/application:
@@ -23,6 +23,7 @@ fa:
         cancel: لغو
         destroy: پاک کردن
         edit: ویرایش
+        submit: ثبت
       confirmations:
         destroy: آیا مطمئن هستید؟
       edit:
@@ -37,6 +38,7 @@ fa:
         application: برنامه
         callback_url: نشانی Callback
         delete: حذف
+        empty: شما هیچ برنامه‌ای ندارید.
         name: نام
         new: برنامهٔ تازه
         scopes: دامنه‌ها
@@ -45,6 +47,7 @@ fa:
       new:
         title: برنامهٔ تازه
       show:
+        actions: کنش‌ها
         application_id: کلید کلاینت
         callback_urls: نشانی‌های Callabck
         scopes: دامنه‌ها
@@ -70,17 +73,29 @@ fa:
       index:
         application: برنامه
         created_at: مجازشده از
+        date_format: "%Y-%m-%d%H:%M:%S"
         scopes: اجازه‌ها
         title: برنامه‌های مجاز
     errors:
       messages:
         access_denied: دارندهٔ منبع یا سرور اجازه دهنده درخواست را نپذیرفت.
+        credential_flow_not_configured: جریان اعتبارنامهٔ گذرواژهٔ مالک منبع به دلیل پیکربندی نشده بودن Doorkeeper.configure.resource_owner_from_credentials شکست خورد.
+        invalid_client: تأیید هویت کارخواه به دلیل کارخواه ناشناخته، عدم وجود تأیید هویت کاره یا روش تأیید هویت پشتیبانی‌نشده شکست خورد.
+        invalid_grant: اعطای دسترسی فراهم ‌شده نامعتبر، منقضی یا نامطابق با نشانی بازگشت استفاده‌شده در درخواست تأیید هویت بوده و یا برای کارخواهی دیگر صادر شده است.
+        invalid_redirect_uri: نشانی بازگشت موجود، معتبر نیست.
+        invalid_request: درخواست فاقد یک پارامتر ضروری، شامل یک پارامتر پشتیبانی‌نشده یا به‌هم ریخته است.
+        invalid_resource_owner: اعتبارنامهٔ مالک منبع فراهم‌شده نامعتبر بوده یا مالک منبع نتوانست پیدا شود
+        invalid_scope: حوزهٔ درخواستی نامعتبر، ناشناخته یا دستکاری‌شده است.
         invalid_token:
           expired: کد دسترسی منقضی شده است
           revoked: کد دسترسی فسخ شده است
           unknown: کد دسترسی معتبر نیست
+        resource_owner_authenticator_not_configured: یافتن مالک منبع به دلیل پیکربندی‌نشده بودن Doorkeeper.configure.resource_owner_authenticator شکست خورد.
         server_error: خطای پیش‌بینی‌نشده‌ای برای سرور اجازه‌دهنده رخ داد که جلوی اجرای این درخواست را گرفت.
         temporarily_unavailable: سرور اجازه‌دهنده به دلیل بار زیاد یا تعمیرات سرور هم‌اینک نمی‌تواند درخواست شما را بررسی کند.
+        unauthorized_client: کارخواه مجاز نیست این درخواست را با استفاده از این روش انجام دهد.
+        unsupported_grant_type: گونهٔ اعطای تأیید هویت توسّط کارساز تأیید هویتپشتیبانی نمی‌شود.
+        unsupported_response_type: کارساز تأیید هویت این گونه از پاسخ را پشتیبانی نمی‌کند.
     flash:
       applications:
         create:
@@ -100,7 +115,37 @@ fa:
       application:
         title: درخواست اجازهٔ OAuth
     scopes:
+      admin:read: خواندن تمام داده‌ها روی کارساز
+      admin:read:accounts: خواندن اطّلاعات حساس از همهٔ حساب‌ها
+      admin:read:reports: خواندن اطّلاعات حساس از همهٔ گزارش‌ها و حساب‌های گزارش‌شده
+      admin:write: تغییر تمام داده‌ها روی کارساز
+      admin:write:accounts: انجام کنش مدیریتی روی حساب‌ها
+      admin:write:reports: انجام کنش مدیریتی روی گزارش‌ها
       follow: پیگیری، مسدودسازی، لغو مسدودسازی، و لغو پیگیری حساب‌ها
       push: برای حساب خود اعلان‌های لحظه‌ای دریافت کنید
       read: خواندن اطلاعات حساب شما
+      read:accounts: دیدن اطّلاعات حساب
+      read:blocks: دیدن انسدادهایتان
+      read:bookmarks: دیدن نشانک‌هایتان
+      read:favourites: دیدن برگزیده‌هایتان
+      read:filters: دیدن پالایه‌هایتان
+      read:follows: دیدن پی‌گیری‌هایتان
+      read:lists: دیدن فهرست‌هایتان
+      read:mutes: دیدن خموشی‌هایتان
+      read:notifications: دیدن آگاهی‌هایتان
+      read:reports: دیدن گزارش‌هایتان
+      read:search: حست‌وجو از سمت خودتان
+      read:statuses: دیدن همهٔ وضعیت‌ها
       write: انتشار مطالب از طرف شما
+      write:accounts: تغییر نمایه‌تان
+      write:blocks: انسداد حساب‌ها و دامنه‌ها
+      write:bookmarks: نشانک‌گذاری وضعیت‌ها
+      write:favourites: برگزیدن وضعیت‌ها
+      write:filters: ایحاد پالایش‌ها
+      write:follows: پی‌گیری افراد
+      write:lists: ایجاد فهرست‌ها
+      write:media: بارگذاری پرونده‌های رسانه
+      write:mutes: خموش کردن افراد و گفت‌وگوها
+      write:notifications: پام‌سازی آگاهی‌هایتان
+      write:reports: گزارش دیگر افراد
+      write:statuses: انتشار وضعیت‌ها
diff --git a/config/locales/doorkeeper.fr.yml b/config/locales/doorkeeper.fr.yml
index 5dc13af87..e9bf70cd2 100644
--- a/config/locales/doorkeeper.fr.yml
+++ b/config/locales/doorkeeper.fr.yml
@@ -33,14 +33,15 @@ fr:
       help:
         native_redirect_uri: Utiliser %{native_redirect_uri} pour les tests locaux
         redirect_uri: Utiliser une ligne par URL
-        scopes: Séparer les portées avec des espaces. Laisser vide pour utiliser les portées par défaut.
+        scopes: Séparer les permissions avec des espaces. Laisser vide pour utiliser les portées par défaut.
       index:
         application: Application
         callback_url: URL de retour d’appel
         delete: Effacer
+        empty: Vous n’avez pas d’application.
         name: Nom
         new: Nouvelle application
-        scopes: Portées
+        scopes: Permissions
         show: Voir
         title: Vos applications
       new:
@@ -49,7 +50,7 @@ fr:
         actions: Actions
         application_id: ID de l’application
         callback_urls: URL du retour d’appel
-        scopes: Portées
+        scopes: Permissions
         secret: Secret
         title: 'Application : %{name}'
     authorizations:
@@ -73,7 +74,7 @@ fr:
         application: Application
         created_at: Créé le
         date_format: "%d-%m-%Y %H:%M:%S"
-        scopes: permissions
+        scopes: Permissions
         title: Vos applications autorisées
     errors:
       messages:
@@ -84,7 +85,7 @@ fr:
         invalid_redirect_uri: L’URL de redirection n’est pas valide.
         invalid_request: La requête omet un paramètre requis, inclut une valeur de paramètre non prise en charge ou est autrement mal formée.
         invalid_resource_owner: Les identifiants fournis par le propriétaire de la ressource ne sont pas valides ou le propriétaire de la ressource ne peut être trouvé
-        invalid_scope: La portée demandée n’est pas valide, est inconnue ou mal formée.
+        invalid_scope: La permission demandée est invalide, inconnue ou mal formée.
         invalid_token:
           expired: Le jeton d’accès a expiré
           revoked: Le jeton d’accès a été révoqué
@@ -119,30 +120,32 @@ fr:
       admin:read:reports: lire les informations sensibles de tous les signalements et des comptes signalés
       admin:write: modifier toutes les données sur le serveur
       admin:write:accounts: effectuer des actions de modération sur les comptes
-      admin:write:reports: effectuer des actions de modération sur les singnalements
-      follow: modifier les relations avec les comptes
+      admin:write:reports: effectuer des actions de modération sur les signalements
+      follow: modifier les relations du compte
       push: recevoir vos notifications poussées
       read: lire toutes les données de votre compte
-      read:accounts: voir les informations du compte
-      read:blocks: voir vos bloquages
+      read:accounts: voir les informations des comptes
+      read:blocks: voir vos blocages
+      read:bookmarks: voir vos marque-pages
       read:favourites: voir vos favoris
       read:filters: voir vos filtres
-      read:follows: voir vos suivis
+      read:follows: voir vos abonnements
       read:lists: voir vos listes
       read:mutes: voir vos masquages
       read:notifications: voir vos notifications
-      read:reports: voir vos rapports
+      read:reports: voir vos signalements
       read:search: rechercher en votre nom
       read:statuses: voir tous les statuts
       write: modifier toutes les données de votre compte
       write:accounts: modifier votre profil
       write:blocks: bloquer des comptes et des domaines
-      write:favourites: statuts favoris
+      write:bookmarks: statuts des marque-pages
+      write:favourites: mettre des statuts en favori
       write:filters: créer des filtres
-      write:follows: suivre les gens
+      write:follows: suivre des personnes
       write:lists: créer des listes
-      write:media: téléverser des fichiers-média
+      write:media: téléverser des fichiers média
       write:mutes: masquer des gens et des conversations
       write:notifications: nettoyer vos notifications
-      write:reports: rapporter d’autres personnes
+      write:reports: signaler d’autres personnes
       write:statuses: publier des statuts
diff --git a/config/locales/doorkeeper.gl.yml b/config/locales/doorkeeper.gl.yml
index 90cbd9b38..281f03f84 100644
--- a/config/locales/doorkeeper.gl.yml
+++ b/config/locales/doorkeeper.gl.yml
@@ -6,7 +6,7 @@ gl:
         name: Nome do aplicativo
         redirect_uri: URI a redireccionar
         scopes: Permisos
-        website: Sitio web do aplicativo
+        website: Sitio web da aplicación
     errors:
       models:
         doorkeeper/application:
@@ -27,31 +27,32 @@ gl:
       confirmations:
         destroy: Está segura?
       edit:
-        title: Editar aplicativo
+        title: Editar aplicación
       form:
-        error: Eeeeepa! Comprobe os posibles erros no formulario
+        error: Eeeeepa! Comproba os posibles erros no formulario
       help:
-        native_redirect_uri: Utilice %{native_redirect_uri} para probas locais
-        redirect_uri: Utilice unha liña por URI
-        scopes: Separar permisos con espazos. Deixar en blanco para utilizar os permisos por omisión.
+        native_redirect_uri: Utiliza %{native_redirect_uri} para probas locais
+        redirect_uri: Utiliza unha liña por URI
+        scopes: Separar permisos con espazos. Deixar en branco para utilizar os permisos por omisión.
       index:
-        application: Aplicativo
+        application: Aplicación
         callback_url: URL de chamada
         delete: Eliminar
+        empty: Non tes aplicacións.
         name: Nome
-        new: Novo aplicativo
-        scopes: Permisos
+        new: Nova aplicación
+        scopes: Ámbitos
         show: Mostrar
-        title: Os seus aplicativos
+        title: As túas aplicacións
       new:
-        title: Novo aplicativo
+        title: Nova aplicación
       show:
         actions: Accións
         application_id: Chave do cliente
         callback_urls: URLs de chamada
-        scopes: Permisos
-        secret: Chave secreta do cliente
-        title: 'Aplicativo: %{name}'
+        scopes: Ámbitos
+        secret: Chave segreda do cliente
+        title: 'Aplicación: %{name}'
     authorizations:
       buttons:
         authorize: Autorizar
@@ -60,21 +61,21 @@ gl:
         title: Algo fallou
       new:
         able_to: Poderá
-        prompt: O aplicativo %{client_name} solicita acceso a súa conta
+        prompt: A aplicación %{client_name} solicita acceso a túa conta
         title: Autorización necesaria
       show:
-        title: Copie este código de autorización e pégueo no aplicativo.
+        title: Copia este código de autorización e pégao na aplicación.
     authorized_applications:
       buttons:
         revoke: Retirar autorización
       confirmations:
-        revoke: Está segura?
+        revoke: Estás segura?
       index:
-        application: Aplicativo
+        application: Aplicación
         created_at: Autorizado
         date_format: "%d-%m-%Y %H:%M:%S"
-        scopes: Permisos
-        title: Os seus aplicativos autorizados
+        scopes: Ámbitos
+        title: As túas aplicacións autorizadas
     errors:
       messages:
         access_denied: O propietario do recurso ou o servidor autorizado denegaron a petición.
@@ -125,6 +126,7 @@ gl:
       read: ler todos os datos da súa conta
       read:accounts: ver información das contas
       read:blocks: ver a quen bloquea
+      read:bookmarks: aquí tes os marcadores
       read:favourites: ver as súas favoritas
       read:filters: ver os seus filtros
       read:follows: ver a quen segue
@@ -137,6 +139,7 @@ gl:
       write: modificar todos os datos da súa conta
       write:accounts: modificar o seu perfil
       write:blocks: bloquear contas e dominios
+      write:bookmarks: marca os estados
       write:favourites: estados favoritos
       write:filters: crear filtros
       write:follows: seguir usuarias
diff --git a/config/locales/doorkeeper.hu.yml b/config/locales/doorkeeper.hu.yml
index 92b4e6839..32709299f 100644
--- a/config/locales/doorkeeper.hu.yml
+++ b/config/locales/doorkeeper.hu.yml
@@ -38,6 +38,7 @@ hu:
         application: Alkalmazás
         callback_url: Callback URL
         delete: Eltávolítás
+        empty: Nincsenek alkalmazásaid.
         name: Név
         new: Új alkalmazás
         scopes: Hatáskör
@@ -125,6 +126,7 @@ hu:
       read: fiókod adatainak olvasása
       read:accounts: fiók adatainak megtekintése
       read:blocks: letiltások megtekintése
+      read:bookmarks: könyvjelzőid megtekintése
       read:favourites: kedvencek megtekintése
       read:filters: szűrök megtekintése
       read:follows: követések megtekintése
@@ -137,6 +139,7 @@ hu:
       write: fiókod adatainak megváltoztatása
       write:accounts: profilod megváltoztatása
       write:blocks: fiókok és domainek letiltása
+      write:bookmarks: könyvjelzők állapota
       write:favourites: tülkök kedvencnek jelölése
       write:filters: szűrők létrehozása
       write:follows: mások követése
diff --git a/config/locales/doorkeeper.id.yml b/config/locales/doorkeeper.id.yml
index 08d2470f0..840390481 100644
--- a/config/locales/doorkeeper.id.yml
+++ b/config/locales/doorkeeper.id.yml
@@ -38,6 +38,7 @@ id:
         application: Aplikasi
         callback_url: URL Callback
         delete: Hapus
+        empty: Anda tidak memiliki aplikasi.
         name: Nama
         new: Aplikasi baru
         scopes: Cakupan
@@ -125,6 +126,7 @@ id:
       read: membaca data pada akun anda
       read:accounts: lihat informasi akun
       read:blocks: lihat blokiran Anda
+      read:bookmarks: lihat markah Anda
       read:favourites: lihat favorit Anda
       read:filters: lihat saringan Anda
       read:follows: lihat yang Anda ikuti
@@ -137,6 +139,7 @@ id:
       write: memposting sebagai anda
       write:accounts: ubah profil Anda
       write:blocks: blokir akun dan domain
+      write:bookmarks: status markah
       write:favourites: status favorit
       write:filters: buat saringan
       write:follows: ikuti orang
diff --git a/config/locales/doorkeeper.is.yml b/config/locales/doorkeeper.is.yml
new file mode 100644
index 000000000..0d15479c5
--- /dev/null
+++ b/config/locales/doorkeeper.is.yml
@@ -0,0 +1,151 @@
+---
+is:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Heiti forrits
+        redirect_uri: Slóð endurbeiningar
+        scopes: Gildissvið
+        website: Vefsvæði forrits
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: má ekki innihalda brot.
+              invalid_uri: verður að vera gild URI-slóð.
+              relative_uri: verður að vera algild URI-slóð.
+              secured_uri: verður að vera HTTPS/SSL URI-slóð.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Heimila
+        cancel: Hætta við
+        destroy: Eyðileggja
+        edit: Breyta
+        submit: Senda inn
+      confirmations:
+        destroy: Ertu viss?
+      edit:
+        title: Breyta forriti
+      form:
+        error: Úbbs! Athugaðu með mögulegar villur í útfyllingarreitum
+      help:
+        native_redirect_uri: Notaðu %{native_redirect_uri} fyrir staðværar prófanir
+        redirect_uri: Nota eina línu á hverja URI-slóð
+        scopes: Aðgreindu gildissviðin með bilum. Skildu þetta eftir autt til að nota sjálfgefin gildissvið.
+      index:
+        application: Forrit
+        callback_url: URL-slóð baksvörunar (callback)
+        delete: Eyða
+        empty: Þú ert ekki með nein forrit.
+        name: Heiti
+        new: Nýtt forrit
+        scopes: Gildissvið
+        show: Sýna
+        title: Forritin þín
+      new:
+        title: Nýtt forrit
+      show:
+        actions: Aðgerðir
+        application_id: Lykill biðlara
+        callback_urls: URL-slóðir baksvörunar (callback)
+        scopes: Gildissvið
+        secret: Leynilykill biðlara
+        title: 'Forrit: %{name}'
+    authorizations:
+      buttons:
+        authorize: Heimila
+        deny: Neita
+      error:
+        title: Villa kom upp
+      new:
+        able_to: Það mun geta
+        prompt: Forritið %{client_name} biður um aðgang að notandaaðgangnum þínum
+        title: Auðkenning er nauðsynleg
+      show:
+        title: Afritaðu þennan auðkenningarkóða og límdu hann inn hjá forritinu.
+    authorized_applications:
+      buttons:
+        revoke: Afturkalla
+      confirmations:
+        revoke: Ertu viss?
+      index:
+        application: Forrit
+        created_at: Heimilað
+        date_format: "%Y-%m-%d %H:%M:%S"
+        scopes: Gildissvið
+        title: Heimiluðu forritin þín
+    errors:
+      messages:
+        access_denied: Eigandi tilfangs eða auðkenningarþjónn höfnuðu beininni.
+        credential_flow_not_configured: Flæði á lykilorðsauðkennum eiganda tilfangs (Resource Owner) brást vegna þess að Doorkeeper.configure.resource_owner_from_credentials er óskilgreint.
+        invalid_client: Auðkenning á biðlara brást vegna þess að biðlarinn er óþekktur, að auðkenning biðlarans fylgdi ekki með, eða að notuð var óstudd auðkenningaraðferð.
+        invalid_grant: Uppgefin auðkenningarheimild er ógild, útrunnin, afturkölluð, samsvarar ekki endurbirtingarslóðinni í auðkenningarbeiðninni, eða var gefin út til annars biðlara.
+        invalid_redirect_uri: Endurbeiningarslóðin sem fylgdi er ekki gild.
+        invalid_request: Í beiðnina vantar nauðsynlega færibreytu, hún inniheldur óleyfilegt gildi á færibreytu, eða er gölluð á einhvern annan hátt.
+        invalid_resource_owner: Uppgefin auðkenni eiganda tilfangs eru ekki gild, eða að eigandi tilfangs finnst ekki
+        invalid_scope: Umbeðið gildissvið er ógilt, óþekkt eða rangt uppsett.
+        invalid_token:
+          expired: Auðkenningarteiknið er útrunnið
+          revoked: Auðkenningarteiknið var aturkallað
+          unknown: Auðkenningarteiknið er ógilt
+        resource_owner_authenticator_not_configured: Leit að eiganda tilfangs (Resource Owner) brást vegna þess að Doorkeeper.configure.resource_owner_authenticator er óskilgreint.
+        server_error: Auðkenningarþjónninn rakst á óvænt skilyrði sem kom í veg fyrir að hægt væri að uppfylla beiðnina.
+        temporarily_unavailable: Auðkenningarþjónninn hefur ekki tök á að meðhöndla beiðnina vegna of mikils tímabundins álags eða viðhalds á vefþvóninum.
+        unauthorized_client: Biðlaraforritið hefur ekki heimild til að framkvæma beiðnina með þessari aðferð.
+        unsupported_grant_type: Þessi gerð auðkenningaraðferðar er ekki studd af auðkenningarþjóninum.
+        unsupported_response_type: Auðkenningarþjónninn styður ekki þessa tegund svars.
+    flash:
+      applications:
+        create:
+          notice: Forrit útbúið.
+        destroy:
+          notice: Forriti eytt.
+        update:
+          notice: Forrit uppfært.
+      authorized_applications:
+        destroy:
+          notice: Forrit afturkallað.
+    layouts:
+      admin:
+        nav:
+          applications: Forrit
+          oauth2_provider: OAuth þjónusta
+      application:
+        title: Krafist er OAuth auðkenningar við að
+    scopes:
+      admin:read: lesa öll gögn á netþjóninum
+      admin:read:accounts: lesa viðkvæmar upplýsingar á öllum notendaaðgöngum
+      admin:read:reports: lesa viðkvæmar upplýsingar í öllum skýrslum og kærðum notendaaðgöngum
+      admin:write: breyta öllum gögnum á netþjóninum
+      admin:write:accounts: framkvæma umsjónaraðgerðir á notendaaðganga
+      admin:write:reports: framkvæma umsjónaraðgerðir á kærur
+      follow: breyta venslum aðgangs
+      push: taka á móti ýti-tilkynningum til þín
+      read: lesa öll gögn á notandaaðgangnum þínum
+      read:accounts: sjá upplýsingar í notendaaðgöngum
+      read:blocks: skoða útilokanirnar þínar
+      read:bookmarks: skoða bókamerki
+      read:favourites: skoða eftirlætin þín
+      read:filters: skoða síurnar þínar
+      read:follows: sjá hverjum þú fylgist með
+      read:lists: skoða listana þína
+      read:mutes: skoða hverja þú þaggar
+      read:notifications: sjá tilkynningarnar þínar
+      read:reports: skoða skýrslurnar þína
+      read:search: leita fyrir þína hönd
+      read:statuses: sjá allar stöðufærslur
+      write: breyta öllum gögnum á notandaaðgangnum þínum
+      write:accounts: breyta notandasniðinu þínu
+      write:blocks: útiloka notandaaðganga og lén
+      write:bookmarks: bókamerkja stöðufærslur
+      write:favourites: setja stöðufærslur í eftirlæti
+      write:filters: útbúa síur
+      write:follows: fylgjast með fólki
+      write:lists: búa til lista
+      write:media: senda inn myndefnisskrár
+      write:mutes: þagga niður í fólki og samtölum
+      write:notifications: hreinsa tilkynningarnar þínar
+      write:reports: kæra annað fólk
+      write:statuses: gefa út stöður
diff --git a/config/locales/doorkeeper.it.yml b/config/locales/doorkeeper.it.yml
index 361d0bd75..68e2b57f3 100644
--- a/config/locales/doorkeeper.it.yml
+++ b/config/locales/doorkeeper.it.yml
@@ -38,6 +38,7 @@ it:
         application: Applicazione
         callback_url: URL di callback
         delete: Elimina
+        empty: Non hai applicazioni.
         name: Nome
         new: Nuova applicazione
         scopes: Visibilità
@@ -125,6 +126,7 @@ it:
       read: leggere tutte le informazioni del tuo account
       read:accounts: vedere informazioni sull'account
       read:blocks: vedere i tuoi blocchi
+      read:bookmarks: vedi i tuoi preferiti
       read:favourites: vedere i tuoi preferiti
       read:filters: vedere i tuoi filtri
       read:follows: vedere i tuoi seguiti
@@ -137,6 +139,7 @@ it:
       write: modificare tutti i dati del tuo account
       write:accounts: modificare il tuo profilo
       write:blocks: bloccare account e domini
+      write:bookmarks: aggiungi post ai preferiti
       write:favourites: segnare status come preferiti
       write:filters: creare filtri
       write:follows: seguire persone
diff --git a/config/locales/doorkeeper.ja.yml b/config/locales/doorkeeper.ja.yml
index d80212f82..73932bafd 100644
--- a/config/locales/doorkeeper.ja.yml
+++ b/config/locales/doorkeeper.ja.yml
@@ -38,6 +38,7 @@ ja:
         application: アプリ
         callback_url: コールバックURL
         delete: 削除
+        empty: アプリはありません
         name: 名前
         new: 新規アプリ
         scopes: アクセス権
@@ -125,6 +126,7 @@ ja:
       read: アカウントのすべてのデータの読み取り
       read:accounts: アカウント情報の読み取り
       read:blocks: ブロックの読み取り
+      read:bookmarks: ブックマークの読み取り
       read:favourites: お気に入りの読み取り
       read:filters: フィルターの読み取り
       read:follows: フォローの読み取り
@@ -137,6 +139,7 @@ ja:
       write: アカウントのすべてのデータの変更
       write:accounts: プロフィールの変更
       write:blocks: ユーザーのブロックやドメインの非表示
+      write:bookmarks: トゥートのブックマーク登録
       write:favourites: トゥートのお気に入り登録
       write:filters: フィルターの変更
       write:follows: あなたの代わりにフォロー、アンフォロー
diff --git a/config/locales/doorkeeper.kab.yml b/config/locales/doorkeeper.kab.yml
new file mode 100644
index 000000000..376c86d81
--- /dev/null
+++ b/config/locales/doorkeeper.kab.yml
@@ -0,0 +1,104 @@
+---
+kab:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Isem n usnas
+        redirect_uri: URI n uwelleh
+        website: Asmel web n usnas
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: ur yezmir ad yegber afrur.
+              invalid_uri: ilaq ad tili d tansa URL tameɣtut.
+              relative_uri: ilaq ad yili d URI amagdaz.
+              secured_uri: ilaq URI ad yili HTTPS/SSL.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Ssireg
+        cancel: Sefsex
+        destroy: Hudd
+        edit: Ẓreg
+        submit: Azen
+      confirmations:
+        destroy: Tetḥeqqeḍ?
+      edit:
+        title: Ẓreg asnas
+      form:
+        error: Ay ay! Senqed tiferkit-inek ma ulac deg-s tuccḍiwin
+      help:
+        native_redirect_uri: Seqdec %{native_redirect_uri} i yisekyaden idiganen
+        redirect_uri: Seqdec yiwen n ujerrid i yal URI
+      index:
+        application: Asnas
+        callback_url: URL n tririt n wawal
+        delete: Kkes
+        name: Isem
+        new: Asnas amaynut
+        show: Ẓer
+        title: Isnasen-ik
+      new:
+        title: Asnas amaynut
+      show:
+        actions: Tigawin
+        application_id: ID n usnas
+        callback_urls: URL n tririt n wawal
+        title: 'Asnas: %{name}'
+    authorizations:
+      buttons:
+        authorize: Ssireg
+        deny: Ggami
+      error:
+        title: Tella-d tuccḍa
+      new:
+        able_to: Asnas-agi yezmer
+        prompt: Eǧǧ i %{client_name} ad yekcem ɣer umiḍan-ik
+      show:
+        title: Nɣel tangalt n wurag sakkin senteḍ-itt deg usnas.
+    authorized_applications:
+      confirmations:
+        revoke: Tetḥeqqeḍ?
+      index:
+        application: Asnas
+        created_at: Yettussireg
+        date_format: "%d-%m-%Y %H:%M:%S"
+    errors:
+      messages:
+        invalid_redirect_uri: URI n uwelleh mačči d ameɣtu.
+    flash:
+      applications:
+        create:
+          notice: Asnas yettwarna-d.
+        destroy:
+          notice: Asnan yettwakkes.
+        update:
+          notice: Asnan yettwalqem.
+    layouts:
+      admin:
+        nav:
+          applications: Isnasen
+    scopes:
+      admin:read: ɣeṛ akk isefka ɣef uqeddac
+      admin:write: ẓreg akk isefka ɣef uqeddac
+      follow: beddel assaɣen n umiḍan
+      push: ṭṭef-d tilɣa-ik yettwademren
+      read: ɣeṛ akk isefka n umiḍan-ik
+      read:accounts: ẓer isallen n yimiḍanen
+      read:blocks: ẓer imiḍanen i tesḥebseḍ
+      read:bookmarks: ẓer ticraḍ-ik
+      read:favourites: ẓer ismenyifen-ik
+      read:filters: ẓer imsizedgen-ik
+      read:follows: ẓer imeḍfaṛen-ik
+      read:lists: ẓer tibdarin-ik
+      read:mutes: ẓer wid i tesgugmeḍ
+      read:notifications: ẓer tilɣa-ik
+      read:statuses: ẓer meṛṛa tisuffaɣ
+      write: beddel meṛṛa isefka n umiḍan-ik
+      write:accounts: ẓreg amaɣnu-ik
+      write:blocks: seḥbes imiḍanen d tɣula
+      write:filters: rnu-d imsizedgen
+      write:follows: ḍfeṛ imdanen
+      write:lists: rnu-d tibdarin
diff --git a/config/locales/doorkeeper.kk.yml b/config/locales/doorkeeper.kk.yml
index cdbc89636..75f8de542 100644
--- a/config/locales/doorkeeper.kk.yml
+++ b/config/locales/doorkeeper.kk.yml
@@ -38,6 +38,7 @@ kk:
         application: Қосымша
         callback_url: Callbаck URL
         delete: Өшіру
+        empty: Сізде ешқандай қосымша жоқ.
         name: Аты
         new: Жаңа қосымша
         scopes: Scopеs
@@ -125,6 +126,7 @@ kk:
       read: read all your accоunt's data
       read:accounts: see accounts infоrmation
       read:blocks: see your blоcks
+      read:bookmarks: белгілегендерді қарау
       read:favourites: see your favоurites
       read:filters: see yоur filters
       read:follows: see your follоws
@@ -137,6 +139,7 @@ kk:
       write: modify all your accоunt's data
       write:accounts: modify your prоfile
       write:blocks: block accounts and dоmains
+      write:bookmarks: белгілер статусы
       write:favourites: favourite stаtuses
       write:filters: creаte filters
       write:follows: follow peоple
diff --git a/config/locales/doorkeeper.ko.yml b/config/locales/doorkeeper.ko.yml
index 8337325e2..6f4192ebe 100644
--- a/config/locales/doorkeeper.ko.yml
+++ b/config/locales/doorkeeper.ko.yml
@@ -38,6 +38,7 @@ ko:
         application: 애플리케이션
         callback_url: 콜백 URL
         delete: 삭제
+        empty: 어플리케이션이 없습니다.
         name: 이름
         new: 새 애플리케이션
         scopes: 범위
@@ -125,6 +126,7 @@ ko:
       read: 계정의 모든 데이터를 읽기
       read:accounts: 계정의 정보를 보기
       read:blocks: 차단을 보기
+      read:bookmarks: 내 갈무리 보기
       read:favourites: 관심글을 보기
       read:filters: 필터를 보기
       read:follows: 팔로우를 보기
@@ -137,6 +139,7 @@ ko:
       write: 계정 정보 수정
       write:accounts: 프로필 수정
       write:blocks: 계정이나 도메인 차단
+      write:bookmarks: 게시글을 갈무리하기
       write:favourites: 관심글 지정
       write:filters: 필터 만들기
       write:follows: 사람을 팔로우
diff --git a/config/locales/doorkeeper.ml.yml b/config/locales/doorkeeper.ml.yml
index 6931a683d..80a749b04 100644
--- a/config/locales/doorkeeper.ml.yml
+++ b/config/locales/doorkeeper.ml.yml
@@ -1 +1,29 @@
+---
 ml:
+  activerecord:
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              invalid_uri: URI സാധുവായിരിക്കണം.
+              relative_uri: URI വിപുലീകരിച്ചതായിരിക്കണം.
+              secured_uri: URI HTTPS/SSL ആയിരിക്കണം.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: ചുമതലപ്പെടുത്തുക
+        cancel: റദ്ദാക്കുക
+        destroy: നശിപ്പിക്കുക
+        edit: തിരുത്തുക
+        submit: സമർപ്പിക്കുക
+      confirmations:
+        destroy: നിങ്ങൾക്ക് ഉറപ്പാണോ?
+      index:
+        delete: മായ്ക്കുക
+        name: പേര്
+    authorized_applications:
+      buttons:
+        revoke: പിൻവലിക്കുക
+      confirmations:
+        revoke: നിങ്ങൾക്ക് ഉറപ്പാണോ?
diff --git a/config/locales/doorkeeper.nl.yml b/config/locales/doorkeeper.nl.yml
index 1fabfc123..3b1d10d1f 100644
--- a/config/locales/doorkeeper.nl.yml
+++ b/config/locales/doorkeeper.nl.yml
@@ -114,29 +114,31 @@ nl:
       application:
         title: OAuth-autorisatie vereist
     scopes:
-      admin:read: lees alle gegevens op de server
-      admin:read:accounts: lees gevoelige informatie van alle accounts
-      admin:read:reports: lees gevoelige informatie van alle rapportages en gerapporteerde accounts
+      admin:read: alle gegevens op de server lezen
+      admin:read:accounts: gevoelige informatie van alle accounts lezen
+      admin:read:reports: gevoelige informatie van alle rapportages en gerapporteerde accounts lezen
       admin:write: wijzig alle gegevens op de server
       admin:write:accounts: moderatieacties op accounts uitvoeren
       admin:write:reports: moderatieacties op rapportages uitvoeren
       follow: relaties tussen accounts bewerken
-      push: ontvang jouw pushmeldingen
+      push: jouw pushmeldingen ontvangen
       read: alle gegevens van jouw account lezen
-      read:accounts: zie informatie accounts
-      read:blocks: zie jouw geblokkeerde gebruikers
-      read:favourites: zie jouw favorieten
-      read:filters: zie jouw filters
-      read:follows: zie de accounts die jij volgt
-      read:lists: zie jouw lijsten
-      read:mutes: zie jouw genegeerde gebruikers
-      read:notifications: zie jouw meldingen
-      read:reports: zie jouw gerapporteerde toots
+      read:accounts: informatie accounts bekijken
+      read:blocks: jouw geblokkeerde gebruikers bekijken
+      read:bookmarks: jouw bladwijzers bekijken
+      read:favourites: jouw favorieten bekijken
+      read:filters: jouw filters bekijken
+      read:follows: de accounts die jij volgt bekijken
+      read:lists: jouw lijsten bekijken
+      read:mutes: jouw genegeerde gebruikers bekijken
+      read:notifications: jouw meldingen bekijken
+      read:reports: jouw gerapporteerde toots bekijken
       read:search: namens jou zoeken
-      read:statuses: zie alle toots
+      read:statuses: alle toots bekijken
       write: alle gegevens van jouw account bewerken
       write:accounts: jouw profiel bewerken
       write:blocks: accounts en domeinen blokkeren
+      write:bookmarks: toots aan bladwijzers toevoegen
       write:favourites: toots als favoriet markeren
       write:filters: filters aanmaken
       write:follows: mensen volgen
diff --git a/config/locales/doorkeeper.nn.yml b/config/locales/doorkeeper.nn.yml
index 777f4e600..b31e69b3b 100644
--- a/config/locales/doorkeeper.nn.yml
+++ b/config/locales/doorkeeper.nn.yml
@@ -1 +1,150 @@
+---
 nn:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Applikasjonsnamn
+        redirect_uri: Omdirigerings-URI
+        scopes: Omfang
+        website: Applikasjonsnettside
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: kan ikkje innehalde eit fragment.
+              invalid_uri: må vere ein gyldig URI.
+              relative_uri: må vere ein absolutt URI.
+              secured_uri: må vere ein HTTPS/SSL URI.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Autoriser
+        cancel: Avbryt
+        destroy: Utslett
+        edit: Rediger
+        submit: Send inn
+      confirmations:
+        destroy: Er du sikker?
+      edit:
+        title: Rediger søknad
+      form:
+        error: Oi sann! Sjekk skjemaet for eventuelle mistak
+      help:
+        native_redirect_uri: Bruk %{native_redirect_uri} for lokale testar
+        redirect_uri: Bruk ei linjer per URI
+        scopes: Adskill omfang med mellomrom. La det være blankt for å bruke standard omfang.
+      index:
+        application: Applikasjon
+        callback_url: Callback-URL
+        delete: Slett
+        name: Namn
+        new: Ny applikasjon
+        scopes: Omfang
+        show: Vis
+        title: Dine applikasjonar
+      new:
+        title: Ny applikasjon
+      show:
+        actions: Handlingar
+        application_id: Klientnøkkel
+        callback_urls: Callback-URLer
+        scopes: Omfang
+        secret: Klienthemmelegheit
+        title: 'Applikasjon: %{name}'
+    authorizations:
+      buttons:
+        authorize: Autoriser
+        deny: Avslå
+      error:
+        title: Ein feil har oppstått
+      new:
+        able_to: Den vil ha mulighet til
+        prompt: Applikasjon %{client_name} spør om tilgang til din konto
+        title: Autorisasjon nødvendig
+      show:
+        title: Kopier denne autorisasjonskoden og lim den inn i applikasjonen.
+    authorized_applications:
+      buttons:
+        revoke: Opphev
+      confirmations:
+        revoke: Er du sikker?
+      index:
+        application: Applikasjon
+        created_at: Autorisert
+        date_format: "%Y-%m-%d %H:%M:%S"
+        scopes: Omfang
+        title: Dine autoriserte applikasjonar
+    errors:
+      messages:
+        access_denied: Ressurseieren eller autoriseringstjeneren avviste forespørslen.
+        credential_flow_not_configured: Ressurseiers passordflyt feilet fordi Doorkeeper.configure.resource_owner_from_credentials ikke var konfigurert.
+        invalid_client: Klientautentisering feilet på grunn av ukjent klient, ingen autentisering inkludert, eller autentiseringsmetode er ikke støttet.
+        invalid_grant: Autoriseringen er ugyldig, utløpt, opphevet, stemmer ikke overens med omdirigerings-URIen eller var utstedt til en annen klient.
+        invalid_redirect_uri: Den inkluderte omdirigerings-URLen er ikke gyldig.
+        invalid_request: Forespørslen mangler en eller flere parametere, inkluderte en parameter som ikke støttes eller har feil struktur.
+        invalid_resource_owner: Ressurseierens detaljer er ikke gyldige, eller så er det ikke mulig å finne eieren
+        invalid_scope: Det etterspurte omfanget er ugyldig, ukjent eller har feil struktur.
+        invalid_token:
+          expired: Tilgangsbeviset har utløpt
+          revoked: Tilgangsbeviset har blitt opphevet
+          unknown: Tilgangsbeviset er ugyldig
+        resource_owner_authenticator_not_configured: Ressurseier kunne ikke finnes fordi Doorkeeper.configure.resource_owner_authenticator ikke er konfigurert.
+        server_error: Autoriseringstjeneren støtte på en uventet hendelse som hindret den i å svare på forespørslen.
+        temporarily_unavailable: Autoriseringstjeneren kan ikke håndtere forespørslen grunnet en midlertidig overbelastning eller tjenervedlikehold.
+        unauthorized_client: Klienten har ikke autorisasjon for å utføre denne forespørslen med denne metoden.
+        unsupported_grant_type: Autorisasjonstildelingstypen er ikke støttet av denne autoriseringstjeneren.
+        unsupported_response_type: Autorisasjonsserveren støtter ikke denne typen av forespørsler.
+    flash:
+      applications:
+        create:
+          notice: App laga.
+        destroy:
+          notice: Appen er sletta.
+        update:
+          notice: App oppdatert.
+      authorized_applications:
+        destroy:
+          notice: App avvist.
+    layouts:
+      admin:
+        nav:
+          applications: Appar
+          oauth2_provider: OAuth2-tilbyder
+      application:
+        title: OAuth-autorisering påkrevet
+    scopes:
+      admin:read: lese alle data på tjeneren
+      admin:read:accounts: lese sensitiv informasjon om alle kontoer
+      admin:read:reports: lese sensitiv informasjon om alle rapporter og rapporterte kontoer
+      admin:write: modifisere alle data på tjeneren
+      admin:write:accounts: utføre moderatorhandlinger på kontoer
+      admin:write:reports: utføre moderatorhandlinger på rapporter
+      follow: følg, blokkér, avblokkér, avfølg brukere
+      push: motta dine varsler
+      read: lese dine data
+      read:accounts: se informasjon om kontoer
+      read:blocks: se dine blokkeringer
+      read:bookmarks: sjå bokmerka dine
+      read:favourites: sjå favorittane dine
+      read:filters: sjå filtera dine
+      read:follows: sjå fylgjarane dine
+      read:lists: sjå listene dine
+      read:mutes: sjå kven du har målbunde
+      read:notifications: sjå varsla dine
+      read:reports: sjå rapportane dine
+      read:search: søke på dine vegne
+      read:statuses: sjå alle statusar
+      write: poste på dine vegne
+      write:accounts: rediger profilen din
+      write:blocks: blokker kontoar og domene
+      write:bookmarks: bokmerk statusar
+      write:favourites: merk statusar som favoritt
+      write:filters: lag filter
+      write:follows: fylg folk
+      write:lists: lag lister
+      write:media: last opp mediefiler
+      write:mutes: målbind folk og samtalar
+      write:notifications: tøm varsla dine
+      write:reports: rapporter andre folk
+      write:statuses: legg ut statusar
diff --git a/config/locales/doorkeeper.no.yml b/config/locales/doorkeeper.no.yml
index 263fef15e..a1970f3ea 100644
--- a/config/locales/doorkeeper.no.yml
+++ b/config/locales/doorkeeper.no.yml
@@ -72,6 +72,7 @@
       index:
         application: Applikasjon
         created_at: Autorisert
+        date_format: "%Y-%m-%d %H:%M:%S"
         scopes: Omfang
         title: Dine autoriserte applikasjoner
     errors:
@@ -113,6 +114,37 @@
       application:
         title: OAuth-autorisering påkrevet
     scopes:
+      admin:read: lese alle data på tjeneren
+      admin:read:accounts: lese sensitiv informasjon om alle kontoer
+      admin:read:reports: lese sensitiv informasjon om alle rapporter og rapporterte kontoer
+      admin:write: modifisere alle data på tjeneren
+      admin:write:accounts: utføre moderatorhandlinger på kontoer
+      admin:write:reports: utføre moderatorhandlinger på rapporter
       follow: følg, blokkér, avblokkér, avfølg brukere
+      push: motta dine varsler
       read: lese dine data
+      read:accounts: se informasjon om kontoer
+      read:blocks: se dine blokkeringer
+      read:bookmarks: se dine bokmerker
+      read:favourites: se dine likinger
+      read:filters: se dine filtre
+      read:follows: se dine følginger
+      read:lists: se listene dine
+      read:mutes: se dine dempinger
+      read:notifications: se dine varslinger
+      read:reports: se dine rapporter
+      read:search: søke på dine vegne
+      read:statuses: se alle statuser
       write: poste på dine vegne
+      write:accounts: endre på profilen din
+      write:blocks: blokkere kontoer og domener
+      write:bookmarks: bokmerke statuser
+      write:favourites: like statuser
+      write:filters: opprett filtre
+      write:follows: følg personer
+      write:lists: opprett lister
+      write:media: last opp mediafiler
+      write:mutes: dempe folk og samtaler
+      write:notifications: tømme dine varsler
+      write:reports: rapportere andre folk
+      write:statuses: legg ut statuser
diff --git a/config/locales/doorkeeper.oc.yml b/config/locales/doorkeeper.oc.yml
index e715cc7d5..749a49a4c 100644
--- a/config/locales/doorkeeper.oc.yml
+++ b/config/locales/doorkeeper.oc.yml
@@ -125,6 +125,7 @@ oc:
       read: legir totas las donadas de vòstre compte
       read:accounts: veire las informacions del compte
       read:blocks: veire vòstres blocatges
+      read:bookmarks: veire vòstres marcadors
       read:favourites: veire vòstres favorits
       read:filters: veire vòstres filtres
       read:follows: veire vòstres abonaments
@@ -137,6 +138,7 @@ oc:
       write: modificar totas las donadas de vòstre compte
       write:accounts: modificar vòstre perfil
       write:blocks: blocar de comptes e de domenis
+      write:bookmarks: ajustar als marcadors
       write:favourites: metre en favorit
       write:filters: crear de filtres
       write:follows: sègre de monde
diff --git a/config/locales/doorkeeper.pt-BR.yml b/config/locales/doorkeeper.pt-BR.yml
index dfab853c6..90d8f9358 100644
--- a/config/locales/doorkeeper.pt-BR.yml
+++ b/config/locales/doorkeeper.pt-BR.yml
@@ -4,18 +4,18 @@ pt-BR:
     attributes:
       doorkeeper/application:
         name: Nome do aplicativo
-        redirect_uri: URI de redirecionamento
+        redirect_uri: Link de redirecionamento
         scopes: Autorizações
-        website: Website do aplicativo
+        website: Site do aplicativo
     errors:
       models:
         doorkeeper/application:
           attributes:
             redirect_uri:
               fragment_present: não pode conter um fragmento.
-              invalid_uri: precisa ser uma URI válida.
-              relative_uri: precisa ser uma URI absoluta.
-              secured_uri: precisa ser uma URI HTTPS/SSL.
+              invalid_uri: precisa ser um link válido.
+              relative_uri: precisa ser um link absoluto.
+              secured_uri: precisa ser um link HTTPS/SSL.
   doorkeeper:
     applications:
       buttons:
@@ -29,26 +29,27 @@ pt-BR:
       edit:
         title: Editar aplicativo
       form:
-        error: Oops! Verifique o seu formulário para saber de possíveis erros
+        error: Eita! Verifique o seu formulário para saber de possíveis erros
       help:
         native_redirect_uri: Use %{native_redirect_uri} para testes locais
-        redirect_uri: Use uma linha para cada URI
+        redirect_uri: Use uma linha para cada link
         scopes: Separe autorizações com espaços. Deixe em branco para usar autorizações padrões.
       index:
         application: Aplicativos
-        callback_url: URL de retorno
+        callback_url: Link de retorno
         delete: Excluir
+        empty: Não tem aplicações.
         name: Nome
         new: Novo aplicativo
         scopes: Autorizações
         show: Mostrar
         title: Seus aplicativos
       new:
-        title: Novos aplicativos
+        title: Novo aplicativo
       show:
         actions: Ações
         application_id: Chave do cliente
-        callback_urls: URLs de retorno
+        callback_urls: Links de retorno
         scopes: Autorizações
         secret: Segredo do cliente
         title: 'Aplicativo: %{name}'
@@ -59,7 +60,7 @@ pt-BR:
       error:
         title: Ocorreu um erro
       new:
-        able_to: Será capaz de
+        able_to: Poderá
         prompt: O aplicativo %{client_name} solicita acesso à sua conta
         title: Autorização necessária
       show:
@@ -79,28 +80,28 @@ pt-BR:
       messages:
         access_denied: O proprietário ou servidor de autorização negou a solicitação.
         credential_flow_not_configured: Cadeira de Credenciais de Senha do Proprietário falhou porque Doorkeeper.configure.resource_owner_from_credentials não foram configuradas.
-        invalid_client: Autenticação do cliente falhou por causa de um cliente desconhecido, nenhum cliente de autenticação incluído ou método de autenticação não suportado.
-        invalid_grant: A garantia de autorização é inválida, expirou, foi revogada, não é equivalente à URI de redirecionamento usada da solicitação de autorização ou foi emitida por outro cliente.
-        invalid_redirect_uri: A URI de redirecionamento incluída não é válida.
-        invalid_request: A solicitação não possui um parâmetro obrigatório, inclui um valor não suportado ou está mal formatada.
+        invalid_client: Autenticação do cliente falhou por causa de um cliente desconhecido, nenhum cliente de autenticação foi incluído ou o método de autenticação não é suportado.
+        invalid_grant: A garantia de autorização está inválida, expirou ou foi revogada, não é equivalente ao link de redirecionamento usado na solicitação de autorização ou foi emitido por outro cliente.
+        invalid_redirect_uri: O link de redirecionamento não é válido.
+        invalid_request: A solicitação não possui um parâmetro obrigatório, inclui um valor não suportado ou está mal formatado.
         invalid_resource_owner: As credenciais do proprietário informadas não são válidas ou o proprietário não pôde ser encontrado
         invalid_scope: A autorização requirida é inválida, desconhecida ou está mal formatada.
         invalid_token:
-          expired: O token de acesso expirou
-          revoked: O token de acesso foi revogado
-          unknown: O token de acesso é inválido
-        resource_owner_authenticator_not_configured: Procura pelo proprietário falhou porque Doorkeeper.configure.resource_owner_authenticator não foi configurado.
+          expired: O código de acesso expirou
+          revoked: O código de acesso foi revogado
+          unknown: O código de acesso é inválido
+        resource_owner_authenticator_not_configured: A procura pelo Proprietário do Recurso falhou porque Doorkeeper.configure.resource_owner_authenticator não foi configurado.
         server_error: O servidor de autorização encontrou uma condição inesperada que preveniu a solicitação de ser respondida.
-        temporarily_unavailable: O servidor de autorização é incapaz de lidar com a solicitação no momento por causa d múltiplas requisições ou manutenção programada.
-        unauthorized_client: O cliente não possui autorização para performar esta solicitação usando este método.
-        unsupported_grant_type: O tipo de garantia de autorização não é suportada pelo servidor de autorização.
+        temporarily_unavailable: O servidor de autorização é incapaz de lidar com a solicitação no momento devido à múltiplas requisições ou manutenção programada.
+        unauthorized_client: O cliente não possui autorização para executar esta solicitação usando este método.
+        unsupported_grant_type: O tipo de garantia de autorização não é suportado pelo servidor de autorização.
         unsupported_response_type: O servidor de autorização não suporta este tipo de resposta.
     flash:
       applications:
         create:
           notice: Aplicativo criado.
         destroy:
-          notice: Aplicativo deletado.
+          notice: Aplicativo excluído.
         update:
           notice: Aplicativo atualizado.
       authorized_applications:
@@ -109,34 +110,42 @@ pt-BR:
     layouts:
       admin:
         nav:
-          applications: Aplicativo
+          applications: Aplicativos
           oauth2_provider: Provedor de OAuth2
       application:
         title: Autorização OAuth obrigatória
     scopes:
-      follow: modificar as relações com outras contas
-      push: receber suas notificações push
+      admin:read: ler todos os dados no servidor
+      admin:read:accounts: ler informações sensíveis de todas as contas
+      admin:read:reports: ler informações sensíveis de todas as denúncias e contas denunciadas
+      admin:write: alterar todos os dados no servidor
+      admin:write:accounts: executar ações de moderação em contas
+      admin:write:reports: executar ações de moderação em denúncias
+      follow: alterar o relacionamento das contas
+      push: receber notificações push
       read: ler todos os dados da sua conta
-      read:accounts: ver as informações da conta
+      read:accounts: ver informações das contas
       read:blocks: ver seus bloqueios
+      read:bookmarks: ver seus salvos
       read:favourites: ver seus favoritos
       read:filters: ver seus filtros
       read:follows: ver quem você segue
       read:lists: ver suas listas
-      read:mutes: ver seus usuários silenciados
+      read:mutes: ver seus silenciamentos
       read:notifications: ver suas notificações
       read:reports: ver suas denúncias
-      read:search: buscar em seu nome
-      read:statuses: ver todos os status
-      write: modificar todos os dados da sua conta
-      write:accounts: modificar seu perfil
+      read:search: pesquisar em seu nome
+      read:statuses: ver todos os toots
+      write: alterar todos os dados da sua conta
+      write:accounts: alterar seu perfil
       write:blocks: bloquear contas e domínios
-      write:favourites: status favoritos
+      write:bookmarks: salvar toots
+      write:favourites: favoritar toots
       write:filters: criar filtros
       write:follows: seguir pessoas
       write:lists: criar listas
       write:media: enviar arquivos de mídia
       write:mutes: silenciar pessoas e conversas
-      write:notifications: limpar suas notificações
-      write:reports: reportar outras pessoas
-      write:statuses: publicar status
+      write:notifications: limpar notificações
+      write:reports: denunciar outras pessoas
+      write:statuses: postar toots
diff --git a/config/locales/doorkeeper.pt-PT.yml b/config/locales/doorkeeper.pt-PT.yml
index 42068e0a0..2433f23e9 100644
--- a/config/locales/doorkeeper.pt-PT.yml
+++ b/config/locales/doorkeeper.pt-PT.yml
@@ -38,6 +38,7 @@ pt-PT:
         application: Aplicações
         callback_url: URL de retorno
         delete: Eliminar
+        empty: Não tem aplicações.
         name: Nome
         new: Nova Aplicação
         scopes: Autorizações
@@ -72,6 +73,7 @@ pt-PT:
       index:
         application: Aplicação
         created_at: Criada em
+        date_format: "%d-%m-%Y %H:%M:%S"
         scopes: Autorizações
         title: As tuas aplicações autorizadas
     errors:
@@ -113,6 +115,37 @@ pt-PT:
       application:
         title: Autorização OAuth necessária
     scopes:
+      admin:read: ler todos os dados no servidor
+      admin:read:accounts: ler informações sensíveis de todas as contas
+      admin:read:reports: ler informações sensíveis de todos os relatórios e contas reportadas
+      admin:write: modificar todos os dados no servidor
+      admin:write:accounts: executar ações de moderação em contas
+      admin:write:reports: executar ações de moderação em relatórios
       follow: siga, bloqueie, desbloqueie, e deixa de seguir contas
+      push: receber as suas notificações push
       read: tenha acesso aos dados da tua conta
+      read:accounts: ver as informações da conta
+      read:blocks: ver os seus bloqueios
+      read:bookmarks: ver os seus favoritos
+      read:favourites: ver os seus favoritos
+      read:filters: ver os seus filtros
+      read:follows: ver quem você segue
+      read:lists: ver as suas listas
+      read:mutes: ver os utilizadores que silenciou
+      read:notifications: ver as suas notificações
+      read:reports: ver as suas denúncias
+      read:search: pesquisar em seu nome
+      read:statuses: ver todos os estados
       write: publique por ti
+      write:accounts: modificar o seu perfil
+      write:blocks: bloquear contas e domínios
+      write:bookmarks: estado dos favoritos
+      write:favourites: estado dos favoritos
+      write:filters: criar filtros
+      write:follows: seguir pessoas
+      write:lists: criar listas
+      write:media: carregar arquivos de média
+      write:mutes: silenciar pessoas e conversas
+      write:notifications: limpar as suas notificações
+      write:reports: reportar outras pessoas
+      write:statuses: publicar estado
diff --git a/config/locales/doorkeeper.ru.yml b/config/locales/doorkeeper.ru.yml
index 1682205a5..532e2c9ac 100644
--- a/config/locales/doorkeeper.ru.yml
+++ b/config/locales/doorkeeper.ru.yml
@@ -5,7 +5,7 @@ ru:
       doorkeeper/application:
         name: Название
         redirect_uri: URI перенаправления
-        scopes: Права
+        scopes: Разрешения
         website: Веб-сайт приложения
     errors:
       models:
@@ -38,13 +38,14 @@ ru:
         application: Приложение
         callback_url: Callback URL
         delete: Удалить
+        empty: У вас нет созданных приложений.
         name: Название
         new: Новое приложение
-        scopes: Права
+        scopes: Разрешения
         show: Показывать
         title: Ваши приложения
       new:
-        title: Новое Приложение
+        title: Создание приложения
       show:
         actions: Действия
         application_id: Id приложения
@@ -122,27 +123,29 @@ ru:
       admin:write:reports: производить модерацию жалоб
       follow: управлять подписками и списком блокировок
       push: получать push-уведомления
-      read: читать данные Вашей учётной записи
+      read: просматривать данные вашей учётной записи
       read:accounts: видеть информацию об учётных записях
-      read:blocks: видеть ваших заблокированных
+      read:blocks: видеть ваши блокировки
+      read:bookmarks: видеть ваши закладки
       read:favourites: видеть ваше избранное
       read:filters: видеть ваши фильтры
-      read:follows: видеть, на кого вы подписаны
+      read:follows: видеть ваши подписки
       read:lists: видеть ваши списки
-      read:mutes: видеть список заглушенных
-      read:notifications: видеть ваши уведомления
+      read:mutes: видеть список игнорируемых
+      read:notifications: получать уведомления
       read:reports: видеть ваши жалобы
       read:search: использовать поиск
-      read:statuses: видеть все статусы
+      read:statuses: видеть все ваши посты
       write: изменять все данные вашей учётной записи
       write:accounts: редактировать ваш профиль
       write:blocks: блокировать учётные записи и домены
-      write:favourites: отмечать статусы как избранные
+      write:bookmarks: добавлять посты в закладки
+      write:favourites: отмечать посты как избранные
       write:filters: создавать фильтры
       write:follows: подписываться на людей
       write:lists: создавать списки
-      write:media: выкладывать медиаконтент
-      write:mutes: заглушать людей и обсуждения
+      write:media: загружать файлы
+      write:mutes: добавлять в игнорируемое людей и обсуждения
       write:notifications: очищать список уведомлений
       write:reports: отправлять жалобы на других
-      write:statuses: публиковать статусы
+      write:statuses: публиковать посты
diff --git a/config/locales/doorkeeper.sk.yml b/config/locales/doorkeeper.sk.yml
index be52a3db2..4cd80a4e0 100644
--- a/config/locales/doorkeeper.sk.yml
+++ b/config/locales/doorkeeper.sk.yml
@@ -124,6 +124,7 @@ sk:
       read: prezri si všetky dáta ohľadom svojho účetu
       read:accounts: prezri si informácie o účte
       read:blocks: prezri svoje bloky
+      read:bookmarks: pozri svoje záložky
       read:favourites: prezri svoje obľúbené
       read:filters: prezri svoje filtrovanie
       read:follows: prezri si svoje sledovania
@@ -136,6 +137,7 @@ sk:
       write: upraviť všetky dáta tvojho účtu
       write:accounts: uprav svoj profil
       write:blocks: blokuj účty a domény
+      write:bookmarks: pridaj si príspevky k záložkám
       write:favourites: obľúbené príspevky
       write:filters: vytvor roztriedenie
       write:follows: následuj ľudí
diff --git a/config/locales/doorkeeper.sv.yml b/config/locales/doorkeeper.sv.yml
index 47b11b7fd..d9367ce5e 100644
--- a/config/locales/doorkeeper.sv.yml
+++ b/config/locales/doorkeeper.sv.yml
@@ -25,7 +25,7 @@ sv:
         edit: Redigera
         submit: Skicka
       confirmations:
-        destroy: Äre du säker?
+        destroy: Är du säker?
       edit:
         title: Redigera applikation
       form:
@@ -38,6 +38,7 @@ sv:
         application: Applikation
         callback_url: Återkalls URL
         delete: Ta bort
+        empty: Du har inga program.
         name: Namn
         new: Ny applikation
         scopes: Omfattning
@@ -120,16 +121,16 @@ sv:
       admin:write:accounts: utför alla aktiviteter för moderering på konton
       admin:write:reports: utför alla aktiviteter för moderering i rapporter
       follow: följa, blockera, ta bort blockerade och sluta följa konton
-      push: ta emot push aviseringar för ditt konto
+      push: ta emot push-aviseringar för ditt konto
       read: läsa dina kontodata
       read:accounts: se kontoinformation
-      read:blocks: se dina block
+      read:blocks: se dina blockeringar
       read:favourites: se dina favoriter
       read:filters: se dina filter
       read:follows: se vem du följer
       read:lists: se dina listor
       read:mutes: se dina tystningar
-      read:notifications: se dina notifieringar
+      read:notifications: se dina aviseringar
       read:reports: se dina rapporter
       read:search: sök å dina vägnar
       read:statuses: se alla statusar
@@ -142,6 +143,6 @@ sv:
       write:lists: skapa listor
       write:media: ladda upp mediafiler
       write:mutes: tysta människor och konversationer
-      write:notifications: rensa dina notifieringar
+      write:notifications: rensa dina aviseringar
       write:reports: rapportera andra människor
       write:statuses: publicera statusar
diff --git a/config/locales/doorkeeper.th.yml b/config/locales/doorkeeper.th.yml
index 2b4f08385..597a65038 100644
--- a/config/locales/doorkeeper.th.yml
+++ b/config/locales/doorkeeper.th.yml
@@ -36,6 +36,7 @@ th:
         application: แอปพลิเคชัน
         callback_url: URL เรียกกลับ
         delete: ลบ
+        empty: คุณไม่มีแอปพลิเคชัน
         name: ชื่อ
         new: แอปพลิเคชันใหม่
         scopes: ขอบเขต
@@ -77,6 +78,8 @@ th:
       messages:
         access_denied: เจ้าของทรัพยากรหรือเซิร์ฟเวอร์การอนุญาตปฏิเสธคำขอ
         invalid_token:
+          expired: โทเคนการเข้าถึงหมดอายุแล้ว
+          revoked: เพิกถอนโทเคนการเข้าถึงแล้ว
           unknown: โทเคนการเข้าถึงไม่ถูกต้อง
     flash:
       applications:
@@ -98,12 +101,15 @@ th:
         title: ต้องมีการอนุญาต OAuth
     scopes:
       admin:read: อ่านข้อมูลทั้งหมดในเซิร์ฟเวอร์
-      admin:write: แก้ไขข้อมูลทั้งหมดในเซิร์ฟเวอร์
+      admin:read:accounts: อ่านข้อมูลที่ละเอียดอ่อนของบัญชีทั้งหมด
+      admin:read:reports: อ่านข้อมูลที่ละเอียดอ่อนของรายงานและบัญชีที่ได้รับการรายงานทั้งหมด
+      admin:write: ปรับเปลี่ยนข้อมูลทั้งหมดในเซิร์ฟเวอร์
       follow: ปรับเปลี่ยนความสัมพันธ์ของบัญชี
       push: รับการแจ้งเตือนแบบผลักของคุณ
       read: อ่านข้อมูลบัญชีทั้งหมดของคุณ
       read:accounts: ดูข้อมูลบัญชี
       read:blocks: ดูการปิดกั้นของคุณ
+      read:bookmarks: ดูที่คั่นหน้าของคุณ
       read:favourites: ดูรายการโปรดของคุณ
       read:filters: ดูตัวกรองของคุณ
       read:follows: ดูการติดตามของคุณ
@@ -116,6 +122,7 @@ th:
       write: ปรับเปลี่ยนข้อมูลบัญชีทั้งหมดของคุณ
       write:accounts: ปรับเปลี่ยนโปรไฟล์ของคุณ
       write:blocks: ปิดกั้นบัญชีและโดเมน
+      write:bookmarks: เพิ่มที่คั่นหน้าสถานะ
       write:favourites: ชื่นชอบสถานะ
       write:filters: สร้างตัวกรอง
       write:follows: ติดตามผู้คน
diff --git a/config/locales/doorkeeper.tr.yml b/config/locales/doorkeeper.tr.yml
index 120689a3a..a218e3157 100644
--- a/config/locales/doorkeeper.tr.yml
+++ b/config/locales/doorkeeper.tr.yml
@@ -38,6 +38,7 @@ tr:
         application: Uygulama
         callback_url: Geri Dönüş URL
         delete: Sil
+        empty: Hiç uygulamanız yok.
         name: İsim
         new: Yeni uygulama
         scopes: Kapsam
@@ -125,6 +126,7 @@ tr:
       read: hesabınızın tüm verilerini okuyun
       read:accounts: hesap bilgilerini gör
       read:blocks: engellemelerinizi görün
+      read:bookmarks: yer imlerinizi görün
       read:favourites: favorilerini gör
       read:filters: filtrelerinizi görün
       read:follows: izlerini gör
@@ -137,6 +139,7 @@ tr:
       write: hesabınızın tüm verilerini değiştirin
       write:accounts: profilini değiştir
       write:blocks: hesapları ve alan adlarını engelleyin
+      write:bookmarks: durumları yer imlerine ekle
       write:favourites: favori durumlar
       write:filters: filtre oluştur
       write:follows: insanları takip et
diff --git a/config/locales/doorkeeper.uk.yml b/config/locales/doorkeeper.uk.yml
index 274784b58..c5f0c64b6 100644
--- a/config/locales/doorkeeper.uk.yml
+++ b/config/locales/doorkeeper.uk.yml
@@ -38,6 +38,7 @@ uk:
         application: Додаток
         callback_url: URL зворотнього виклику
         delete: Видалити
+        empty: У вас немає створених додатків.
         name: Назва
         new: Новий додаток
         scopes: Області видимості
@@ -125,6 +126,7 @@ uk:
       read: читати усі дані вашого облікового запису
       read:accounts: бачити інформацію про облікові записи
       read:blocks: бачити Ваші блокування
+      read:bookmarks: бачити ваші закладки
       read:favourites: бачити Ваші вподобані пости
       read:filters: бачити Ваші фільтри
       read:follows: бачити Ваші підписки
@@ -137,6 +139,7 @@ uk:
       write: змінювати усі дані вашого облікового запису
       write:accounts: змінювати ваш профіль
       write:blocks: блокувати облікові записи і домени
+      write:bookmarks: додавати пости в закладки
       write:favourites: вподобані статуси
       write:filters: створювати фільтри
       write:follows: підписуйтесь на людей
diff --git a/config/locales/doorkeeper.vi.yml b/config/locales/doorkeeper.vi.yml
new file mode 100644
index 000000000..7df1d0892
--- /dev/null
+++ b/config/locales/doorkeeper.vi.yml
@@ -0,0 +1,150 @@
+---
+vi:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Tên ứng dụng
+        redirect_uri: Chuyển hướng URI
+        scopes: Phạm vi
+        website: Trang web ứng dụng
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: không thể chứa một mảnh.
+              invalid_uri: phải là một URI hợp lệ.
+              relative_uri: phải là một URI tuyệt đối.
+              secured_uri: phải là URI HTTPS / SSL.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Ủy quyền
+        cancel: Hủy bỏ
+        destroy: Xoá bỏ
+        edit: Sửa
+        submit: Gửi đi
+      confirmations:
+        destroy: Bạn có chắc không?
+      edit:
+        title: Chỉnh sửa ứng dụng
+      form:
+        error: Rất tiếc! Hãy kiểm tra thông tin của bạn vì có thể nó có lỗi
+      help:
+        native_redirect_uri: Sử dụng %{native_redirect_uri} khi kiểm thử ở máy nội bộ
+        redirect_uri: Sử dụng một dòng trên mỗi URI
+        scopes: Phạm vi riêng biệt với không gian. Để trống để sử dụng phạm vi mặc định.
+      index:
+        application: Ứng dụng
+        callback_url: gọi lại URL
+        delete: Xóa bỏ
+        name: Tên
+        new: Ứng dụng mới
+        scopes: Phạm vi
+        show: Xem
+        title: Ứng dụng của bạn
+      new:
+        title: Ứng dụng mới
+      show:
+        actions: Hành động
+        application_id: Khóa khách
+        callback_urls: URL gọi lại
+        scopes: Phạm vi
+        secret: Bí mật khách hàng
+        title: 'Ứng dụng: %{name}'
+    authorizations:
+      buttons:
+        authorize: Ủy quyền
+        deny: Từ chối
+      error:
+        title: một lỗi đã xảy ra
+      new:
+        able_to: Nó sẽ có thể
+        prompt: Ứng dụng %{client_name} yêu cầu quyền truy cập vào tài khoản của bạn
+        title: Cần được ủy quyền
+      show:
+        title: Sao chép mã ủy quyền này và dán nó vào ứng dụng.
+    authorized_applications:
+      buttons:
+        revoke: Thu hồi
+      confirmations:
+        revoke: Bạn có chắc không?
+      index:
+        application: Ứng dụng
+        created_at: Được ủy quyền
+        date_format: "% Y-% m-%d% H:% M:% S"
+        scopes: Phạm vi
+        title: Các ứng dụng đã được cấp phép
+    errors:
+      messages:
+        access_denied: Chủ sở hữu tài nguyên hoặc máy chủ ủy quyền từ chối yêu cầu.
+        credential_flow_not_configured: Resource Owner Password Credentials không thành công do Doorkeeper.configure.resource_owner_from_credentials không được định cấu hình.
+        invalid_client: Xác thực ứng dụng khách không thành công do máy khách không xác định, không bao gồm xác thực ứng dụng khách hoặc phương thức xác thực không được hỗ trợ.
+        invalid_grant: Cấp quyền được cung cấp không hợp lệ, hết hạn, bị thu hồi, không khớp với URI chuyển hướng được sử dụng trong yêu cầu ủy quyền hoặc được cấp cho một khách hàng khác.
+        invalid_redirect_uri: Uri chuyển hướng bao gồm không hợp lệ.
+        invalid_request: Yêu cầu thiếu tham số bắt buộc, bao gồm giá trị tham số không được hỗ trợ hoặc không đúng định dạng.
+        invalid_resource_owner: Thông tin xác thực chủ sở hữu tài nguyên được cung cấp không hợp lệ hoặc không thể tìm thấy chủ sở hữu tài nguyên
+        invalid_scope: Phạm vi yêu cầu không hợp lệ, không xác định hoặc không đúng định dạng.
+        invalid_token:
+          expired: Mã thông báo truy cập đã hết hạn
+          revoked: Mã thông báo truy cập đã bị thu hồi
+          unknown: Mã thông báo truy cập không hợp lệ
+        resource_owner_authenticator_not_configured: Chủ sở hữu tài nguyên tìm thấy thất bại do Doorkeeper.configure.resource_owner_authenticator không được định cấu hình.
+        server_error: Máy chủ ủy quyền đã gặp phải một điều kiện không mong muốn khiến nó không thể thực hiện yêu cầu.
+        temporarily_unavailable: Máy chủ ủy quyền hiện không thể xử lý yêu cầu do quá tải tạm thời hoặc bảo trì máy chủ.
+        unauthorized_client: Khách hàng không được phép thực hiện yêu cầu này bằng phương pháp này.
+        unsupported_grant_type: Loại cấp quyền không được hỗ trợ bởi máy chủ ủy quyền.
+        unsupported_response_type: Máy chủ ủy quyền không hỗ trợ loại phản hồi này.
+    flash:
+      applications:
+        create:
+          notice: Ứng dụng được tạo.
+        destroy:
+          notice: Ứng dụng đã bị xóa.
+        update:
+          notice: Ứng dụng cập nhật.
+      authorized_applications:
+        destroy:
+          notice: Ứng dụng bị thu hồi.
+    layouts:
+      admin:
+        nav:
+          applications: Các ứng dụng
+          oauth2_provider: Nhà cung cấp OAuth2
+      application:
+        title: Yêu cầu ủy quyền OAuth
+    scopes:
+      admin:read: đọc tất cả dữ liệu trên máy chủ
+      admin:read:accounts: đọc thông tin nhạy cảm của tất cả các tài khoản
+      admin:read:reports: đọc thông tin nhạy cảm của tất cả các báo cáo và tài khoản báo cáo
+      admin:write: sửa đổi tất cả dữ liệu trên máy chủ
+      admin:write:accounts: thực hiện các hành động kiểm duyệt trên tài khoản
+      admin:write:reports: thực hiện các hành động kiểm duyệt trên các báo cáo
+      follow: sửa đổi các mối quan hệ tài khoản
+      push: nhận thông báo đẩy của bạn
+      read: đọc tất cả dữ liệu tài khoản của bạn
+      read:accounts: xem thông tin tài khoản
+      read:blocks: xem khối của bạn
+      read:bookmarks: xem các mục đã lưu
+      read:favourites: xem yêu thích của bạn
+      read:filters: xem bộ lọc của bạn
+      read:follows: xem sau của bạn
+      read:lists: xem danh sách của bạn
+      read:mutes: xem những người bạn của bạn
+      read:notifications: xem thông báo của bạn
+      read:reports: xem báo cáo của bạn
+      read:search: thay mặt bạn tìm kiếm
+      read:statuses: xem tất cả các trạng thái
+      write: sửa đổi tất cả dữ liệu tài khoản của bạn
+      write:accounts: sửa đổi hồ sơ của bạn
+      write:blocks: chặn tài khoản và tên miền
+      write:bookmarks: những trạng thái đã lưu
+      write:favourites: trạng thái yêu thích
+      write:filters: tạo bộ lọc
+      write:follows: theo dõi mọi người
+      write:lists: tạo danh sách
+      write:media: tải lên tập tin phương tiện truyền thông
+      write:mutes: người câm và nói chuyện
+      write:notifications: xóa thông báo của bạn
+      write:reports: báo cáo người khác
+      write:statuses: xuất bản trạng thái
diff --git a/config/locales/doorkeeper.zh-CN.yml b/config/locales/doorkeeper.zh-CN.yml
index 0d3c6d57e..f186a954a 100644
--- a/config/locales/doorkeeper.zh-CN.yml
+++ b/config/locales/doorkeeper.zh-CN.yml
@@ -4,7 +4,7 @@ zh-CN:
     attributes:
       doorkeeper/application:
         name: 应用名称
-        redirect_uri: 重定向 URI
+        redirect_uri: 跳转 URI
         scopes: 权限范围
         website: 应用网站
     errors:
@@ -115,16 +115,17 @@ zh-CN:
         title: 需要 OAuth 认证
     scopes:
       admin:read: 读取服务器上的所有数据
-      admin:read:accounts: 读取所有账户的敏感信息
-      admin:read:reports: 读取所有举报和被举报账户的敏感信息
+      admin:read:accounts: 读取所有帐号的敏感信息
+      admin:read:reports: 读取所有举报和被举报帐号的敏感信息
       admin:write: 修改服务器上的所有数据
-      admin:write:accounts: 对账户执行管理操作
+      admin:write:accounts: 对帐号执行管理操作
       admin:write:reports: 对举报执行管理操作
       follow: 关注或屏蔽用户
       push: 接收你的帐户的推送通知
       read: 读取你的帐户数据
-      read:accounts: 查看账户信息
+      read:accounts: 查看账号信息
       read:blocks: 查看你的屏蔽列表
+      read:bookmarks: 查看您的书签
       read:favourites: 查看喜欢的嘟文
       read:filters: 查看你的过滤器
       read:follows: 查看你的关注
@@ -134,9 +135,10 @@ zh-CN:
       read:reports: 查看你的举报
       read:search: 以你的身份搜索
       read:statuses: 查看所有嘟文
-      write: 修改你的账户数据
+      write: 修改你的账号数据
       write:accounts: 修改你的个人资料
-      write:blocks: 屏蔽账户和域名
+      write:blocks: 屏蔽账号和域名
+      write:bookmarks: 为嘟文添加书签
       write:favourites: 喜欢的嘟文
       write:filters: 创建过滤器
       write:follows: 关注其他人
diff --git a/config/locales/doorkeeper.zh-HK.yml b/config/locales/doorkeeper.zh-HK.yml
index d9c91caf0..30971f29f 100644
--- a/config/locales/doorkeeper.zh-HK.yml
+++ b/config/locales/doorkeeper.zh-HK.yml
@@ -72,6 +72,7 @@ zh-HK:
       index:
         application: 應用程式
         created_at: 授權日期
+        date_format: "%Y-%m-%d %H:%M:%S"
         scopes: 權限範圍
         title: 已獲你授權的程用程式
     errors:
@@ -113,7 +114,37 @@ zh-HK:
       application:
         title: 需要 OAuth 授權
     scopes:
+      admin:read: 讀取伺服器的所有資料
+      admin:read:accounts: 讀取所有帳戶的敏感資訊
+      admin:read:reports: 讀取所有回報 / 被回報之帳戶的敏感資訊
+      admin:write: 修改伺服器的所有資料
+      admin:write:accounts: 對帳戶進行仲裁管理動作
+      admin:write:reports: 對報告進行仲裁管理動作
       follow: 關注、封鎖、解除封鎖及取消關注用戶
       push: 接收你的帳號的推送通知
       read: 閱讀你的用戶資料
+      read:accounts: 檢視帳戶資訊
+      read:blocks: 檢視您的封鎖名單
+      read:bookmarks: 檢視您的書籤
+      read:favourites: 檢視您的收藏項目
+      read:filters: 檢視您的過濾條件
+      read:follows: 檢視您關注的人
+      read:lists: 檢視您的名單
+      read:mutes: 檢視您靜音的人
+      read:notifications: 檢視您的通知
+      read:reports: 檢視您的檢舉
+      read:search: 以你的身份搜尋
+      read:statuses: 檢視所有嘟文
       write: 以你的名義發佈文章
+      write:accounts: 修改您的個人檔案
+      write:blocks: 封鎖帳戶及站台
+      write:bookmarks: 書籤狀態
+      write:favourites: 收藏嘟文
+      write:filters: 建立過濾條件
+      write:follows: 關注其他人
+      write:lists: 建立名單
+      write:media: 上傳媒體檔案
+      write:mutes: 靜音使用者及對話
+      write:notifications: 清除您的通知
+      write:reports: 檢舉其他人
+      write:statuses: 發布嘟文
diff --git a/config/locales/doorkeeper.zh-TW.yml b/config/locales/doorkeeper.zh-TW.yml
index 0b2624aa9..536dd704c 100644
--- a/config/locales/doorkeeper.zh-TW.yml
+++ b/config/locales/doorkeeper.zh-TW.yml
@@ -125,6 +125,7 @@ zh-TW:
       read: 讀取您所有的帳號資料
       read:accounts: 檢視帳戶資訊
       read:blocks: 檢視您的封鎖名單
+      read:bookmarks: 檢視您的書籤
       read:favourites: 檢視您的收藏項目
       read:filters: 檢視您的過濾條件
       read:follows: 檢視您關注的人
@@ -137,6 +138,7 @@ zh-TW:
       write: 修改您帳號的所有資料
       write:accounts: 修改您的個人檔案
       write:blocks: 封鎖帳戶及站台
+      write:bookmarks: 書籤狀態
       write:favourites: 收藏嘟文
       write:filters: 建立過濾條件
       write:follows: 關注其他人
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 585eefab4..c5b622ef6 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -2,7 +2,7 @@
 el:
   about:
     about_hashtag_html: Αυτά είναι κάποια από τα δημόσια τουτ σημειωμένα με <strong>#%{hashtag}</strong>. Μπορείς να αλληλεπιδράσεις με αυτά αν έχεις λογαριασμό οπουδήποτε στο fediverse.
-    about_mastodon_html: Το Mastodon είναι ένα κοινωνικό δίκτυο που βασίζεται σε ανοιχτά δικτυακά πρωτόκολλα και ελεύθερο λογισμικό ανοιχτού κώδικα. Είναι αποκεντρωμένο όπως το e-mail.
+    about_mastodon_html: 'Το κοινωνικό δίκτυο του μέλλοντος: Χωρίς διαφημίσεις, χωρίς εταιρίες να σε κατασκοπεύουν, ηθικά σχεδιασμένο και αποκεντρωμένο! Με το Mastodon τα δεδομένα σου είναι πραγματικά δικά σου!'
     about_this: Σχετικά
     active_count_after: ενεργοί
     active_footnote: Μηνιαίοι Ενεργοί Χρήστες (ΜΕΧ)
@@ -15,14 +15,14 @@ el:
     browse_public_posts: Ξεφύλλισε τη ζωντανή ροή του Mastodon
     contact: Επικοινωνία
     contact_missing: Δεν έχει οριστεί
-    contact_unavailable: Μ/Δ
+    contact_unavailable: Μη διαθέσιμο
     discover_users: Ανακάλυψε χρήστες
     documentation: Τεκμηρίωση
-    federation_hint_html: Με ένα λογαριασμό στο %{instance} θα μπορείς να ακολουθείς ανθρώπους σε οποιοδήποτε κόμβο στο Mastodon αλλά και αλλού.
+    federation_hint_html: Με ένα λογαριασμό στο %{instance} θα μπορείς να ακολουθείς ανθρώπους σε οποιοδήποτε κόμβο Mastodon αλλά και παραπέρα.
     get_apps: Δοκίμασε μια εφαρμογή κινητού
     hosted_on: Το Mastodon φιλοξενείται στο %{domain}
     instance_actor_flash: |
-      Αυτός ο λογαριασμός είναι εικονικός και απεικονίζει τον κόμβο, όχι κάποιο συγκεκριμένο χρήστη.
+      Αυτός ο λογαριασμός είναι εικονικός και απεικονίζει ολόκληρο τον κόμβο, όχι κάποιο συγκεκριμένο χρήστη.
       Χρησιμεύει στη λειτουργία της ομοσπονδίας και δε θα πρέπει να αποκλειστεί, εκτός κι αν είναι επιθυμητός ο αποκλεισμός ολόκληρου του κόμβου. Σε αυτή την περίπτωση θα πρέπει να χρησιμοποιηθεί η λειτουργία αποκλεισμού τομέα.
     learn_more: Μάθε περισσότερα
     privacy_policy: Πολιτική απορρήτου
@@ -78,6 +78,7 @@ el:
     roles:
       admin: Διαχειριστής
       bot: Μποτ (αυτόματος λογαριασμός)
+      group: Ομάδα
       moderator: Μεσολαβητής
     unavailable: Το προφίλ δεν είναι διαθέσιμο
     unfollow: Διακοπή παρακολούθησης
@@ -197,11 +198,13 @@ el:
         change_email_user: Ο/Η %{name} άλλαξε τη διεύθυνση email του χρήστη %{target}
         confirm_user: Ο/Η %{name} επιβεβαίωσε τη διεύθυνση email του χρήστη %{target}
         create_account_warning: Ο/Η %{name} έστειλε προειδοποίηση προς %{target}
+        create_announcement: Νέα ανακοίνωση %{target} από %{name}
         create_custom_emoji: Ο/Η %{name} ανέβασε νέο emoji %{target}
         create_domain_allow: Ο/Η %{name} έβαλε τον τομέα %{target} σε λευκή λίστα
         create_domain_block: Ο/Η %{name} μπλόκαρε τον τομέα %{target}
         create_email_domain_block: Ο/Η %{name} έβαλε τον τομέα email %{target} σε μαύρη λίστα
         demote_user: Ο/Η %{name} υποβίβασε το χρήστη %{target}
+        destroy_announcement: Διαγραφή ανακοίνωσης %{target} από %{name}
         destroy_custom_emoji: Ο/Η %{name} κατέστρεψε το emoji %{target}
         destroy_domain_allow: Ο/Η %{name} αφαίρεσε τον τομέα %{target} από λίστα εγκρίσεων
         destroy_domain_block: Ο/Η %{name} ξεμπλόκαρε τον τομέα %{target}
@@ -223,10 +226,22 @@ el:
         unassigned_report: Ο/Η %{name} αποδέσμευσε την καταγγελία %{target}
         unsilence_account: Ο/Η %{name} ήρε την αποσιώπηση του λογαριασμού του/της %{target}
         unsuspend_account: Ο/Η %{name} ήρε την παύση του λογαριασμού του χρήστη %{target}
+        update_announcement: Ενημέρωση ανακοίνωσης %{target} από %{name}
         update_custom_emoji: Ο/Η %{name} ενημέρωσε το emoji %{target}
         update_status: Ο/Η %{name} ενημέρωσε την κατάσταση του/της %{target}
       deleted_status: "(διαγραμμένη δημοσίευση)"
       title: Αρχείο ελέγχου
+    announcements:
+      edit:
+        title: Ενημέρωση ανακοίνωσης
+      empty: Δεν βρέθηκε ανακοίνωση.
+      live: Ενεργές
+      new:
+        create: Δημιουργία ανακοίνωσης
+        title: Νέα ανακοίνωση
+      published: Δημοσιευμένη
+      time_range: Χρονική διάρκεια
+      title: Ανακοινώσεις
     custom_emojis:
       assign_category: Κατηγορία
       by_domain: Τομέας
@@ -338,13 +353,11 @@ el:
       delete: Διαγραφή
       destroyed_msg: Επιτυχής διαγραφή email τομέα από τη μαύρη λίστα
       domain: Τομέας
+      empty: Δεν έχουν οριστεί αποκλεισμένοι τομείς email.
       new:
         create: Πρόσθεση τομέα
         title: Νέα εγγραφή email στη μαύρη λίστα
       title: Μαύρη λίστα email
-    followers:
-      back_to_account: Επιστροφή στον λογαριασμό
-      title: Ακόλουθοι του/της %{acct}
     instances:
       by_domain: Τομέας
       delivery_available: Διαθέσιμη παράδοση
@@ -373,6 +386,8 @@ el:
       title: Προσκλήσεις
     pending_accounts:
       title: Λογαριασμοί σε αναμονή (%{count})
+    relationships:
+      title: Σχέσεις %{acct}
     relays:
       add_new: Πρόσθεσε νέο ανταποκριτή (relay)
       delete: Διαγραφή
@@ -393,10 +408,18 @@ el:
       created_msg: Επιτυχής δημιουργία σημείωσης καταγγελίας!
       destroyed_msg: Επιτυχής διαγραφή σημείωσης καταγγελίας!
     reports:
+      account:
+        notes:
+          one: "%{count} σημείωση"
+          other: "%{count} σημειώσεις"
+        reports:
+          one: "%{count} αναφορά"
+          other: "%{count} αναφορές"
       action_taken_by: Ενέργεια από τον/την
       are_you_sure: Σίγουρα;
       assign_to_self: Ανάθεση σε μένα
       assigned: Αρμόδιος συντονιστής
+      by_target_domain: Κόμβος του λογαριασμού υπό καταγγελία
       comment:
         none: Κανένα
       created_at: Καταγγέλθηκε
@@ -442,6 +465,8 @@ el:
         users: Προς συνδεδεμένους τοπικούς χρήστες
       domain_blocks_rationale:
         title: Εμφάνιση σκεπτικού
+      enable_bootstrap_timeline_accounts:
+        title: Προεπιλογή παρακολούθησης για τους νέους χρήστες
       hero:
         desc_html: Εμφανίζεται στην μπροστινή σελίδα. Συνίσταται τουλάχιστον 600x100px. Όταν λείπει, χρησιμοποιείται η μικρογραφία του κόμβου
         title: Εικόνα ήρωα
@@ -570,6 +595,10 @@ el:
     animations_and_accessibility: Κίνηση και προσβασιμότητα
     confirmation_dialogs: Ερωτήσεις επιβεβαίωσης
     discovery: Εξερεύνηση
+    localization:
+      body: Το Mastodon μεταφράζεται από εθελοντές.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Μπορεί να συνεισφέρει ο οποιοσδήποτε.
     sensitive_content: Ευαίσθητο περιεχόμενο
     toot_layout: Διαρρύθμιση τουτ
   application_mailer:
@@ -592,7 +621,7 @@ el:
     change_password: Συνθηματικό
     checkbox_agreement_html: Συμφωνώ με τους <a href="%{rules_path}" target="_blank">κανονισμούς του κόμβου</a> και <a href="%{terms_path}" target="_blank">τους όρους χρήσης</a>
     checkbox_agreement_without_rules_html: Συμφωνώ με τους <a href="%{terms_path}" target="_blank">όρους χρήσης</a>
-    delete_account: Διαγραφή email
+    delete_account: Διαγραφή λογαριασμού
     delete_account_html: Αν θέλεις να διαγράψεις το λογαριασμό σου, μπορείς <a href="%{path}">να συνεχίσεις εδώ</a>. Θα σου ζητηθεί επιβεβαίωση.
     description:
       prefix_invited_by_user: Ο/Η @%{name} σε προσκαλεί να συνδεθείς με αυτό τον διακομιστή του Mastodon!
@@ -603,7 +632,7 @@ el:
     invalid_reset_password_token: Το διακριτικό επαναφοράς συνθηματικού είναι άκυρο ή ληγμένο. Παρακαλώ αιτήσου νέο.
     login: Σύνδεση
     logout: Αποσύνδεση
-    migrate_account: Μετακόμισε σε διαφορετικό λογαριασμό
+    migrate_account: Μετακόμιση σε διαφορετικό λογαριασμό
     migrate_account_html: Αν θέλεις να ανακατευθύνεις αυτό τον λογαριασμό σε έναν διαφορετικό, μπορείς να το <a href="%{path}">διαμορφώσεις εδώ</a>.
     or_log_in_with: Ή συνδέσου με
     providers:
@@ -642,6 +671,9 @@ el:
     hint_html: "<strong>Συμβουλή:</strong> Δεν θα σου ζητήσουμε τον κωδικό ασφαλείας σου ξανά για την επόμενη ώρα."
     invalid_password: Μη έγκυρο συνθηματικό
     prompt: Επιβεβαίωση συνθηματικού για συνέχεια
+  date:
+    formats:
+      default: "%b %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}ω"
@@ -701,14 +733,13 @@ el:
     archive_takeout:
       date: Ημερομηνία
       download: Κατέβασε το αρχείο σου
-      hint_html: Μπορείς να αιτηθείς ένα αρχείο των <strong>τουτ και των ανεβασμένων πολυμέσων</strong> σου. Τα δεδομένα θα είναι σε μορφή ActivityPub, προσιτά από οποιοδήποτε συμβατό πρόγραμμα. Μπορείς να αιτηθείς αρχείο κάθε 7 μέρες.
+      hint_html: Μπορείς να αιτηθείς ένα αρχείο των <strong>τουτ και των ανεβασμένων πολυμέσων</strong> σου. Τα δεδομένα θα είναι σε μορφή ActivityPub, προσπελάσιμα από οποιοδήποτε συμβατό πρόγραμμα. Μπορείς να αιτηθείς αρχείο κάθε 7 μέρες.
       in_progress: Συγκεντρώνουμε το αρχείο σου...
       request: Αιτήσου το αρχείο σου
       size: Μέγεθος
     blocks: Μπλοκάρεις
     csv: CSV
     domain_blocks: Μπλοκαρίσματα κόμβων
-    follows: Ακολουθείς
     lists: Λίστες
     mutes: Αποσιωπήσεις
     storage: Αποθήκευση πολυμέσων
@@ -719,6 +750,7 @@ el:
     hint_html: "<strong>Τι είναι οι προβεβλημένες ταμπέλες;</strong> Προβάλλονται στο δημόσιο προφίλ σου επιτρέποντας σε όποιον το βλέπει να χαζέψει τις δημοσιεύσεις που τις χρησιμοποιούν. Είναι ωραίος τρόπος να παρακολουθείς κάποια δημιουργία ή ένα μακροπρόθεσμο έργο."
   filters:
     contexts:
+      account: Προφίλ
       home: Αρχική ροή
       notifications: Ειδοποιήσεις
       public: Δημόσιες ροές
@@ -730,6 +762,7 @@ el:
       invalid_irreversible: Τα μη αντιστρέψιμα φίλτρα δουλεύουν μόνο στα πλαίσια της αρχικής ροής και των ειδοποιήσεων
     index:
       delete: Διαγραφή
+      empty: Δεν έχεις φίλτρα.
       title: Φίλτρα
     new:
       title: Πρόσθεσε νέο φίλτρο
@@ -742,6 +775,8 @@ el:
     all: Όλα
     changes_saved_msg: Οι αλλαγές αποθηκεύτηκαν!
     copy: Αντιγραφή
+    delete: Διαγραφή
+    edit: Ενημέρωση
     no_batch_actions_available: Δεν υπάρχουν ομαδικές ενέργειες σε αυτή τη σελίδα
     order_by: Ταξινόμηση κατά
     save_changes: Αποθήκευση αλλαγών
@@ -878,6 +913,10 @@ el:
       body: 'Η κατάστασή σου προωθήθηκε από τον/την %{name}:'
       subject: Ο/Η %{name} προώθησε την κατάστασή σου
       title: Νέα προώθηση
+  notifications:
+    email_events: Συμβάντα για ειδοποιήσεις μέσω email
+    email_events_hint: 'Επέλεξε συμβάντα για τα οποία θέλεις να λαμβάνεις ειδοποιήσεις μέσω email:'
+    other_settings: Άλλες ρυθμίσεις ειδοποιήσεων
   number:
     human:
       decimal_units:
@@ -901,6 +940,7 @@ el:
       duration_too_long: είναι πολύ μακριά στο μέλλον
       duration_too_short: είναι πολύ σύντομα
       expired: Η ψηφοφορία έχει ήδη λήξει
+      invalid_choice: Αυτή η επιλογή ψήφου δεν υπάρχει
       over_character_limit: δε μπορεί να υπερβαίνει τους %{max} χαρακτήρες έκαστη
       too_few_options: πρέπει να έχει περισσότερες από μια επιλογές
       too_many_options: δεν μπορεί να έχει περισσότερες από %{max} επιλογές
@@ -908,13 +948,19 @@ el:
     other: Άλλες
     posting_defaults: Προεπιλογές δημοσίευσης
     public_timelines: Δημόσιες ροές
+  reactions:
+    errors:
+      unrecognized_emoji: δεν αναγνωρίζεται ως emoji
   relationships:
     activity: Δραστηριότητα λογαριασμού
-    dormant: Αδρανής
+    dormant: Αδρανείς
+    followers: Σε ακολουθούν
+    following: Ακολουθείς
+    invited: Προσκεκλημένοι
     last_active: Τελευταία δραστηριότητα
     most_recent: Πιο πρόσφατα
     moved: Μετακόμισε
-    mutual: Αμοιβαίος
+    mutual: Αμοιβαίοι
     primary: Βασικός
     relationship: Σχέση
     remove_selected_domains: Αφαίρεση ακόλουθων που βρίσκονται στους επιλεγμένους κόμβους
@@ -1002,7 +1048,7 @@ el:
     notifications: Ειδοποιήσεις
     preferences: Προτιμήσεις
     profile: Προφίλ
-    relationships: Ακολουθεί και ακολουθείται
+    relationships: Ακολουθείς και σε ακολουθούν
     two_factor_authentication: Πιστοποίηση 2 παραγόντων (2FA)
   spam_check:
     spam_detected: Αυτή είναι μια αυτόματη αναφορά. Εντοπίστηκε ανεπιθύμητο υλικό (spam).
@@ -1025,7 +1071,7 @@ el:
     over_character_limit: υπέρβαση μέγιστου ορίου %{max} χαρακτήρων
     pin_errors:
       limit: Έχεις ήδη καρφιτσώσει το μέγιστο αριθμό επιτρεπτών τουτ
-      ownership: Δεν μπορείς να καρφιτσώσεις μη δικό σου τουτ
+      ownership: Δεν μπορείς να καρφιτσώσεις τουτ κάποιου άλλου
       private: Τα μη δημόσια τουτ δεν καρφιτσώνονται
       reblog: Οι προωθήσεις δεν καρφιτσώνονται
     poll:
@@ -1037,7 +1083,7 @@ el:
         other: "%{count} ψήφοι"
       vote: Ψήφισε
     show_more: Δείξε περισσότερα
-    sign_in_to_participate: Εγγράφου για να συμμετάσχεις στη συζήτηση
+    sign_in_to_participate: Συνδέσου για να συμμετάσχεις στη συζήτηση
     title: '%{name}: "%{quote}"'
     visibilities:
       private: Μόνο ακόλουθοι
@@ -1161,7 +1207,7 @@ el:
     wrong_code: Ο κωδικός που έβαλες ήταν άκυρος! Τα ρολόγια στον διακομιστή και τη συσκευή είναι σωστά;
   user_mailer:
     backup_ready:
-      explanation: Ζήτησες ένα εφεδρικό αντίγραφο του λογαριασμού σου στο Mastodon. Είναι έτοιμο για κατέβασμα!
+      explanation: Είχες ζητήσει εφεδρικό αντίγραφο του λογαριασμού σου στο Mastodon. Είναι έτοιμο για κατέβασμα!
       subject: Το εφεδρικό αντίγραφό σου είναι έτοιμο για κατέβασμα
       title: Λήψη εφεδρικού αρχείου
     warning:
@@ -1181,7 +1227,7 @@ el:
         disable: Παγωμένος λογαριασμός
         none: Προειδοποίηση
         silence: Περιορισμένος λογαριασμός
-        suspend: Ανασταλμένος λογαριασμός
+        suspend: Λογαριασμός σε αναστολή
     welcome:
       edit_profile_action: Στήσιμο προφίλ
       edit_profile_step: Μπορείς να προσαρμόσεις το προφίλ σου ανεβάζοντας μια εικόνα εμφάνισης & επικεφαλίδας, αλλάζοντας το εμφανιζόμενο όνομά σου και άλλα. Αν θες να ελέγχεις τους νέου σου ακόλουθους πριν αυτοί σε ακολουθήσουν, μπορείς να κλειδώσεις το λογαριασμό σου.
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 43c24fc4e..dcfe5f1cc 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -198,11 +198,13 @@ en:
         change_email_user: "%{name} changed the e-mail address of user %{target}"
         confirm_user: "%{name} confirmed e-mail address of user %{target}"
         create_account_warning: "%{name} sent a warning to %{target}"
+        create_announcement: "%{name} created new announcement %{target}"
         create_custom_emoji: "%{name} uploaded new emoji %{target}"
         create_domain_allow: "%{name} whitelisted domain %{target}"
         create_domain_block: "%{name} blocked domain %{target}"
         create_email_domain_block: "%{name} blacklisted e-mail domain %{target}"
         demote_user: "%{name} demoted user %{target}"
+        destroy_announcement: "%{name} deleted announcement %{target}"
         destroy_custom_emoji: "%{name} destroyed emoji %{target}"
         destroy_domain_allow: "%{name} removed domain %{target} from whitelist"
         destroy_domain_block: "%{name} unblocked domain %{target}"
@@ -224,10 +226,26 @@ en:
         unassigned_report: "%{name} unassigned report %{target}"
         unsilence_account: "%{name} unsilenced %{target}'s account"
         unsuspend_account: "%{name} unsuspended %{target}'s account"
+        update_announcement: "%{name} updated announcement %{target}"
         update_custom_emoji: "%{name} updated emoji %{target}"
         update_status: "%{name} updated status by %{target}"
       deleted_status: "(deleted status)"
       title: Audit log
+    announcements:
+      destroyed_msg: Announcement successfully deleted!
+      edit:
+        title: Edit announcement
+      empty: No announcements found.
+      live: Live
+      new:
+        create: Create announcement
+        title: New announcement
+      published_msg: Announcement successfully published!
+      scheduled_for: Scheduled for %{time}
+      scheduled_msg: Announcement scheduled for publication!
+      title: Announcements
+      unpublished_msg: Announcement successfully unpublished!
+      updated_msg: Announcement successfully updated!
     custom_emojis:
       assign_category: Assign category
       by_domain: Domain
@@ -340,13 +358,11 @@ en:
       delete: Delete
       destroyed_msg: Successfully deleted e-mail domain from blacklist
       domain: Domain
+      empty: No e-mail domains currently blacklisted.
       new:
         create: Add domain
         title: New e-mail blacklist entry
       title: E-mail blacklist
-    followers:
-      back_to_account: Back To Account
-      title: "%{acct}'s Followers"
     instances:
       by_domain: Domain
       delivery_available: Delivery is available
@@ -375,6 +391,8 @@ en:
       title: Invites
     pending_accounts:
       title: Pending accounts (%{count})
+    relationships:
+      title: "%{acct}'s relationships"
     relays:
       add_new: Add new relay
       delete: Delete
@@ -594,6 +612,10 @@ en:
     animations_and_accessibility: Animations and accessibility
     confirmation_dialogs: Confirmation dialogs
     discovery: Discovery
+    localization:
+      body: Mastodon is translated by volunteers.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Everyone can contribute.
     sensitive_content: Sensitive content
     toot_layout: Toot layout
   application_mailer:
@@ -666,6 +688,9 @@ en:
     hint_html: "<strong>Tip:</strong> We won't ask you for your password again for the next hour."
     invalid_password: Invalid password
     prompt: Confirm password to continue
+  date:
+    formats:
+      default: "%b %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}h"
@@ -742,6 +767,7 @@ en:
     hint_html: "<strong>What are featured hashtags?</strong> They are displayed prominently on your public profile and allow people to browse your public posts specifically under those hashtags. They are a great tool for keeping track of creative works or long-term projects."
   filters:
     contexts:
+      account: Profiles
       home: Home timeline
       notifications: Notifications
       public: Public timelines
@@ -753,6 +779,7 @@ en:
       invalid_irreversible: Irreversible filtering only works with home or notifications context
     index:
       delete: Delete
+      empty: You have no filters.
       title: Filters
     new:
       title: Add new filter
@@ -765,6 +792,7 @@ en:
     all: All
     changes_saved_msg: Changes successfully saved!
     copy: Copy
+    delete: Delete
     no_batch_actions_available: No batch actions available on this page
     order_by: Order by
     save_changes: Save changes
@@ -930,6 +958,7 @@ en:
       duration_too_long: is too far into the future
       duration_too_short: is too soon
       expired: The poll has already ended
+      invalid_choice: The chosen vote option does not exist
       over_character_limit: cannot be longer than %{max} characters each
       too_few_options: must have more than one item
       too_many_options: can't contain more than %{max} items
@@ -937,11 +966,16 @@ en:
     other: Other
     posting_defaults: Posting defaults
     public_timelines: Public timelines
+  reactions:
+    errors:
+      limit_reached: Limit of different reactions reached
+      unrecognized_emoji: is not a recognized emoji
   relationships:
     activity: Account activity
     dormant: Dormant
     followers: Followers
     following: Following
+    invited: Invited
     last_active: Last active
     most_recent: Most recent
     moved: Moved
@@ -1006,7 +1040,7 @@ en:
       firefox_os: Firefox OS
       ios: iOS
       linux: Linux
-      mac: Mac
+      mac: macOS
       other: unknown platform
       windows: Windows
       windows_mobile: Windows Mobile
@@ -1069,6 +1103,7 @@ en:
         other: "%{count} votes"
       vote: Vote
     show_more: Show more
+    show_thread: Show thread
     sign_in_to_participate: Sign in to participate in the conversation
     title: '%{name}: "%{quote}"'
     visibilities:
diff --git a/config/locales/en_GB.yml b/config/locales/en_GB.yml
index 939dfe0c1..0742559ed 100644
--- a/config/locales/en_GB.yml
+++ b/config/locales/en_GB.yml
@@ -343,6 +343,9 @@ en_GB:
       created_msg: Report note successfully created!
       destroyed_msg: Report note successfully deleted!
     reports:
+      account:
+        note: note
+        report: report
       action_taken_by: Action taken by
       are_you_sure: Are you sure?
       assign_to_self: Assign to me
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index 78ea19af5..fb4d5c8be 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -11,6 +11,7 @@ eo:
     apps: Poŝtelefonaj aplikaĵoj
     apps_platforms: Uzu Mastodon ĉe iOS, Android kaj aliajn platformojn
     browse_directory: Esplori profilujo kaj filtri per interesoj
+    browse_local_posts: Vidi vivantan fluon de publikaj mesaĝoj al Mastodon
     browse_public_posts: Vidi vivantan fluon de publikaj mesaĝoj al Mastodon
     contact: Kontakti
     contact_missing: Ne elektita
@@ -71,6 +72,7 @@ eo:
     roles:
       admin: Administranto
       bot: Roboto
+      group: Grupo
       moderator: Kontrolanto
     unavailable: Profilo ne disponebla
     unfollow: Ne plu sekvi
@@ -164,6 +166,7 @@ eo:
         staff: Teamo
         user: Uzanto
       search: Serĉi
+      search_same_ip: Aliaj uzantoj kun la sama IP
       shared_inbox_url: URL de kunhavigita leterkesto
       show:
         created_reports: Kreitaj signaloj
@@ -190,12 +193,14 @@ eo:
         confirm_user: "%{name} konfirmis retadreson de uzanto %{target}"
         create_account_warning: "%{name} sendis averton al %{target}"
         create_custom_emoji: "%{name} alŝutis novan emoĝion %{target}"
+        create_domain_allow: "%{name} aldonis domajnon %{target} al la blanka listo"
         create_domain_block: "%{name} blokis domajnon %{target}"
         create_email_domain_block: "%{name} metis en nigran liston domajnon %{target}"
         demote_user: "%{name} degradis uzanton %{target}"
         destroy_custom_emoji: "%{name} neniigis la emoĝion %{target}"
+        destroy_domain_allow: "%{name} forigis domajnon %{target} el la blanka listo"
         destroy_domain_block: "%{name} malblokis domajnon %{target}"
-        destroy_email_domain_block: "%{name} metis en blankan liston domajnon %{target}"
+        destroy_email_domain_block: "%{name} aldonis retadresan domajnon %{target} al la blanka listo"
         destroy_status: "%{name} forigis mesaĝojn de %{target}"
         disable_2fa_user: "%{name} malebligis dufaktoran aŭtentigon por uzanto %{target}"
         disable_custom_emoji: "%{name} malebligis emoĝion %{target}"
@@ -218,10 +223,12 @@ eo:
       deleted_status: "(forigita mesaĝo)"
       title: Kontrola protokolo
     custom_emojis:
+      assign_category: Atribui kategorion
       by_domain: Domajno
       copied_msg: Loka kopio de la emoĝio sukcese kreita
       copy: Kopii
       copy_failed_msg: Fari lokan kopion de ĉi tiu emoĝio ne eblis
+      create_new_category: Krei novan kategorion
       created_msg: Emoĝio sukcese kreita!
       delete: Forigi
       destroyed_msg: Emoĝio sukcese forigita!
@@ -241,6 +248,7 @@ eo:
       shortcode: Mallonga kodo
       shortcode_hint: Almenaŭ 2 signoj, nur literoj, ciferoj kaj substrekoj
       title: Propraj emoĝioj
+      uncategorized: Nekategoriigita
       unlist: Nelistigi
       unlisted: Nelistigita
       update_failed_msg: Ĝisdatigi tiun emoĝion ne eblis
@@ -259,7 +267,9 @@ eo:
       feature_timeline_preview: Templinio antaŭvidi
       features: Funkcioj
       hidden_service: Federacio kun kaŝitaj servoj
-      open_reports: nefermitaj raportoj
+      open_reports: nesolvitaj signaloj
+      pending_tags: kradvortoj atendantaj revizion
+      pending_users: uzantoj atendantaj revizion
       recent_users: Lastatempaj uzantoj
       search: Tutteksta serĉado
       single_user_mode: Unuuzanta reĝimo
@@ -273,10 +283,10 @@ eo:
       week_users_new: uzantoj tiusemajne
       whitelist_mode: En la blanka listo
     domain_allows:
-      add_new: En la blanka listo domajno
-      created_msg: Domajno sukcese blanklistigita
-      destroyed_msg: Domajno estis forigita de la blanklisto
-      undo: Forigi de la blanklisto
+      add_new: Aldoni domajnon al la blanka listo
+      created_msg: Domajno estis sukcese aldonita al la blanka listo
+      destroyed_msg: Domajno estis forigita el la blanka listo
+      undo: Forigi el la blanka listo
     domain_blocks:
       add_new: Aldoni novan
       created_msg: Domajna blokado en traktado
@@ -296,11 +306,11 @@ eo:
       private_comment: Privata komento
       public_comment: Publika komento
       reject_media: Malakcepti aŭdovidajn dosierojn
-      reject_media_hint: Forigas aŭdovidaĵojn loke konservitajn kaj rifuzas alŝuti ajnan estonte. Senzorge pri haltigoj
-      reject_reports: Malakcepti raportojn
-      reject_reports_hint: Ignori ĉiujn raportojn el tiu domajno. Nur gravas por silentigoj
+      reject_media_hint: Forigas aŭdovidaĵojn loke konservitajn kaj rifuzas alŝuti ajnan estonte. Ne koncernas haltigojn
+      reject_reports: Malakcepti signalojn
+      reject_reports_hint: Ignori ĉiujn signalojn el tiu domajno. Ne koncernas haltigojn
       rejecting_media: aŭdovidaj dosieroj malakceptiĝas
-      rejecting_reports: raportoj malakceptiĝas
+      rejecting_reports: malakceptas signalojn
       severity:
         silence: silentigita
         suspend: haltigita
@@ -325,9 +335,6 @@ eo:
         create: Aldoni domajnon
         title: Nova blokado de retadresa domajno
       title: Nigra listo de retadresaj domajnoj
-    followers:
-      back_to_account: Reen al la konto
-      title: Sekvantoj de %{acct}
     instances:
       by_domain: Domajno
       delivery_available: Liverado disponeblas
@@ -344,7 +351,7 @@ eo:
       total_blocked_by_us: Blokitaj de ni
       total_followed_by_them: Sekvataj de ili
       total_followed_by_us: Sekvataj de ni
-      total_reported: Raportoj pri ili
+      total_reported: Signaloj pri ili
       total_storage: Aŭdovidaj kunsendaĵoj
     invites:
       deactivate_all: Malaktivigi ĉion
@@ -375,10 +382,18 @@ eo:
       created_msg: Signala noto sukcese kreita!
       destroyed_msg: Signala noto sukcese forigita!
     reports:
+      account:
+        notes:
+          one: "%{count} noto"
+          other: "%{count} notoj"
+        reports:
+          one: "%{count} signalo"
+          other: "%{count} signaloj"
       action_taken_by: Ago farita de
       are_you_sure: Ĉu vi certas?
       assign_to_self: Asigni al mi
       assigned: Asignita kontrolanto
+      by_target_domain: Domajno de la signalita konto
       comment:
         none: Nenio
       created_at: Signalita
@@ -419,6 +434,10 @@ eo:
         disabled: Al neniu
         title: Vidi domajna blokado
         users: Al ensalutintaj lokaj uzantoj
+      domain_blocks_rationale:
+        title: Montri la kialon
+      enable_bootstrap_timeline_accounts:
+        title: Ebligi dekomencajn sekvantojn por novaj uzantoj
       hero:
         desc_html: Montrata en la ĉefpaĝo. Almenaŭ 600x100px rekomendita. Kiam ne agordita, la bildeto de la servilo estos uzata
         title: Kapbildo
@@ -496,6 +515,8 @@ eo:
       title: Mesaĝoj de la konto
       with_media: Kun aŭdovidaĵoj
     tags:
+      accounts_today: Unikaj uzoj hodiaŭ
+      accounts_week: Unikaj uzoj je ĉi tiu semajno
       context: Kunteksto
       directory: En la adresaro
       in_directory: "%{count} en adresaro"
@@ -539,6 +560,10 @@ eo:
     animations_and_accessibility: Animacioj kaj alirebleco
     confirmation_dialogs: Konfirmaj fenestroj
     discovery: Eltrovo
+    localization:
+      body: Mastodon estas tradukita per volontuloj.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Ĉiu povas kontribui.
     sensitive_content: Tikla enhavo
     toot_layout: Mesaĝo aranĝo
   application_mailer:
@@ -619,10 +644,16 @@ eo:
       x_months: "%{count}mo"
       x_seconds: "%{count}s"
   deletes:
+    challenge_not_passed: La informaĵo ke vi enigis estis malĝusta
     confirm_password: Enmetu vian nunan pasvorton por konfirmi vian identecon
     confirm_username: Enigi vian uzantnomon por konfirmi la procedo
     proceed: Forigi konton
     success_msg: Via konto estis sukcese forigita
+    warning:
+      email_change_html: Vi povas <a href="%{path}">ŝanĝi vian retadreson</a> sen forigi vian konton
+      more_details_html: Por pli da detaloj, vidi la <a href="%{terms_path}">privatecan politikon</a>.
+      username_available: Via uzantnomo iĝos denove disponebla
+      username_unavailable: Via uzantnomo restos nedisponebla
   directories:
     directory: Profilujo
     explanation: Malkovru uzantojn per iliaj interesoj
@@ -660,7 +691,6 @@ eo:
     blocks: Vi blokas
     csv: CSV
     domain_blocks: Blokoj de domajnoj
-    follows: Vi sekvas
     lists: Listoj
     mutes: Vi silentigas
     storage: Aŭdovidaĵa konservado
@@ -682,6 +712,7 @@ eo:
       invalid_irreversible: Nemalfarebla filtrado funkcias nur por hejma aŭ sciiga kuntekstoj
     index:
       delete: Forigi
+      empty: Vi ne havas filtriloj.
       title: Filtriloj
     new:
       title: Aldoni novan filtrilon
@@ -766,15 +797,21 @@ eo:
   migrations:
     acct: uzantnomo@domajno de la nova konto
     cancel: Nuligi alidirekton
+    cancelled_msg: Sukcese forigis la alidirekton.
     errors:
       already_moved: estas la saman konton vi jam translokiĝis al
+      move_to_self: ne povas esti nuna konto
       not_found: ne povis trovi
       on_cooldown: Vi estas ĉe malvarmiĝi
     followers_count: Sekvantoj en la momento de moviĝo
-    incoming_migrations: Movi el alian konton
+    incoming_migrations: Moviĝi el alia konto
+    incoming_migrations_html: Por moviĝi el alia konto al ĉi tiu, vi unue devas <a href="%{path}">krei kromnomo de konto</a>.
     past_migrations: Pasintaj translokaj
     proceed_with_move: Translokigi sekvantoj
+    redirecting_to: Via konto alidirektas al %{acct}.
     set_redirect: Agordi alidirekton
+    warning:
+      only_redirect_html: Alie, vi povas <a href="%{path}">nur aldoni alidirekton en via profilo</a>.
   moderation:
     title: Kontrolado
   notification_mailer:
@@ -811,6 +848,10 @@ eo:
       body: "%{name} diskonigis vian mesaĝon:"
       subject: "%{name} diskonigis vian mesaĝon"
       title: Nova diskonigo
+  notifications:
+    email_events: Eventoj por retpoŝtaj sciigoj
+    email_events_hint: 'Elekti la eventojn pri kioj vi volas ricevi sciigojn:'
+    other_settings: Aliaj agordoj de sciigoj
   number:
     human:
       decimal_units:
@@ -834,6 +875,7 @@ eo:
       duration_too_long: estas tro for en la estonteco
       duration_too_short: estas tro frue
       expired: La enketo jam finiĝis
+      invalid_choice: La elektita voĉdono ne ekzistas
       over_character_limit: ne povas esti po pli longa ol %{max} signoj
       too_few_options: devas enhavi pli da unu propono
       too_many_options: ne povas enhavi pli da %{max} proponoj
@@ -844,6 +886,8 @@ eo:
   relationships:
     activity: Konta aktiveco
     dormant: Dormanta
+    followers: Sekvantoj
+    following: Sekvatoj
     last_active: Laste aktiva
     most_recent: Plej lasta
     moved: Moviĝita
@@ -981,6 +1025,8 @@ eo:
     pinned: Alpinglita
     reblogged: diskonigita
     sensitive_content: Tikla enhavo
+  tags:
+    does_not_match_previous_name: ne kongruas kun la antaŭa nomo
   terms:
     title: Uzkondiĉoj kaj privateca politiko de %{instance}
   themes:
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index c52615139..30cbdbee5 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -78,6 +78,7 @@ es-AR:
     roles:
       admin: Administrador
       bot: Bot
+      group: Grupo
       moderator: Moderador
     unavailable: Perfil no disponible
     unfollow: Dejar de seguir
@@ -181,6 +182,7 @@ es-AR:
       statuses: Estados
       subscribe: Suscribirse
       suspended: Suspendidas
+      time_in_queue: Esperando en cola %{time}
       title: Cuentas
       unconfirmed_email: Correo electrónico sin confirmar
       undo_silenced: Deshacer silenciado
@@ -196,11 +198,13 @@ es-AR:
         change_email_user: "%{name} cambió la dirección de correo electrónico del usuario %{target}"
         confirm_user: "%{name} confirmó la dirección de correo del usuario %{target}"
         create_account_warning: "%{name} envió una advertencia a %{target}"
+        create_announcement: "%{name} creó el nuevo anuncio %{target}"
         create_custom_emoji: "%{name} subió nuevo emoji %{target}"
         create_domain_allow: "%{name} aprobó el dominio %{target}"
         create_domain_block: "%{name} bloqueó el dominio %{target}"
         create_email_domain_block: "%{name} desaprobó el dominio de correo electrónico %{target}"
         demote_user: "%{name} bajó de nivel al usuario %{target}"
+        destroy_announcement: "%{name} eliminó el anuncio %{target}"
         destroy_custom_emoji: "%{name} destruyó el emoji %{target}"
         destroy_domain_allow: "%{name} quitó el dominio %{target} de los permitidos"
         destroy_domain_block: "%{name} desbloqueó el dominio %{target}"
@@ -212,6 +216,7 @@ es-AR:
         enable_custom_emoji: "%{name} habilitó el emoji %{target}"
         enable_user: "%{name} habilitó el inicio de sesión para el usuario %{target}"
         memorialize_account: "%{name} convirtió la cuenta de %{target} en una página de recordatorio"
+        promote_user: "%{name} promovió al usuario %{target}"
         remove_avatar_user: "%{name} quitó el avatar de %{target}"
         reopen_report: "%{name} reabrió la denuncia %{target}"
         reset_password_user: "%{name} cambió la contraseña del usuario %{target}"
@@ -221,10 +226,22 @@ es-AR:
         unassigned_report: "%{name} desasignó la denuncia %{target}"
         unsilence_account: "%{name} quitó el silenciado de la cuenta de %{target}"
         unsuspend_account: "%{name} quitó la suspensión de la cuenta de %{target}"
+        update_announcement: "%{name} actualizó el anuncio %{target}"
         update_custom_emoji: "%{name} actualizó el emoji %{target}"
         update_status: "%{name} actualizó el estado de %{target}"
       deleted_status: "(estado borrado)"
       title: Registro de auditoría
+    announcements:
+      edit:
+        title: Editar anuncio
+      empty: No se encontraron anuncios.
+      live: En vivo
+      new:
+        create: Crear anuncio
+        title: Nuevo anuncio
+      published: Publicados
+      time_range: Rango de tiempo
+      title: Anuncios
     custom_emojis:
       assign_category: Asignar categoría
       by_domain: Dominio
@@ -336,13 +353,11 @@ es-AR:
       delete: Eliminar
       destroyed_msg: Se aprobó dominio de correo electrónico exitosamente
       domain: Dominio
+      empty: Actualmente no hay dominios de correo electrónico desaprobados.
       new:
         create: Agregar dominio
         title: Nueva desaprobación de correo electrónico
       title: Desaprobación de correo electrónico
-    followers:
-      back_to_account: Volver a la cuenta
-      title: Seguidores de %{acct}
     instances:
       by_domain: Dominio
       delivery_available: La entrega está disponible
@@ -371,6 +386,8 @@ es-AR:
       title: Invitaciones
     pending_accounts:
       title: Cuentas pendientes (%{count})
+    relationships:
+      title: Relaciones de %{acct}
     relays:
       add_new: Agregar nuevo relé
       delete: Eliminar
@@ -391,10 +408,18 @@ es-AR:
       created_msg: "¡La nota de denuncia fue creada exitosamente!"
       destroyed_msg: "¡La nota de denuncia fue eliminada exitosamente!"
     reports:
+      account:
+        notes:
+          one: "%{count} nota"
+          other: "%{count} notas"
+        reports:
+          one: "%{count} denuncia"
+          other: "%{count} denuncias"
       action_taken_by: Acción tomada por
       are_you_sure: "¿Estás seguro?"
       assign_to_self: Asignármela a mí
       assigned: Moderador asignado
+      by_target_domain: Dominio de la cuenta denunciada
       comment:
         none: Ninguno
       created_at: Denunciado
@@ -438,6 +463,10 @@ es-AR:
         disabled: A nadie
         title: Mostrar dominios bloqueados
         users: A usuarios locales con sesiones abiertas
+      domain_blocks_rationale:
+        title: Mostrar razonamiento
+      enable_bootstrap_timeline_accounts:
+        title: Habilitar seguimientos predeterminados para nuevas cuentas
       hero:
         desc_html: Mostrado en la página principal. Se recomienda un tamaño mínimo de 600x100 píxeles. Predeterminadamente se establece a la miniatura del servidor.
         title: Imagen de portada
@@ -566,6 +595,10 @@ es-AR:
     animations_and_accessibility: Animaciones y accesibilidad
     confirmation_dialogs: Diálogos de confirmación
     discovery: Descubrimiento
+    localization:
+      body: Mastodon es localizado por voluntarios.
+      guide_link: https://es.crowdin.com/project/mastodon
+      guide_link_text: Todos pueden contribuir.
     sensitive_content: Contenido sensible
     toot_layout: Diseño del toot
   application_mailer:
@@ -638,6 +671,9 @@ es-AR:
     hint_html: "<strong>Dato:</strong> No volveremos a preguntarte por la contraseña durante la siguiente hora."
     invalid_password: Contraseña no válida
     prompt: Confirmar contraseña para seguir
+  date:
+    formats:
+      default: "%Y.%b.%d"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}h"
@@ -704,7 +740,6 @@ es-AR:
     blocks: Tus bloqueos
     csv: CSV
     domain_blocks: Dominios bloqueados
-    follows: Quienes seguís
     lists: Listas
     mutes: Quienes silenciaste
     storage: Almacenamiento de medios
@@ -715,6 +750,7 @@ es-AR:
     hint_html: "<strong>¿Qué son las etiquetas destacadas?</strong> Se muestran de forma prominente en tu perfil público y permiten a los usuarios navegar por tus toots públicos específicamente bajo esas etiquetas. Son una gran herramienta para hacer un seguimiento de trabajos creativos o proyectos a largo plazo."
   filters:
     contexts:
+      account: Perfiles
       home: Línea temporal principal
       notifications: Notificaciones
       public: Líneas temporales públicas
@@ -726,6 +762,7 @@ es-AR:
       invalid_irreversible: El filtrado irreversible sólo funciona con los contextos de "Principal" o de notificaciones
     index:
       delete: Eliminar
+      empty: No tenés filtros.
       title: Filtros
     new:
       title: Agregar nuevo filtro
@@ -738,6 +775,8 @@ es-AR:
     all: Todas
     changes_saved_msg: "¡Cambios guardados exitosamente!"
     copy: Copiar
+    delete: Eliminar
+    edit: Editar
     no_batch_actions_available: No hay acciones por lotes disponibles en esta página
     order_by: Ordenar por
     save_changes: Guardar cambios
@@ -874,6 +913,10 @@ es-AR:
       body: "%{name} retooteó tu estado:"
       subject: "%{name} retooteó tu estado"
       title: Nuevo retoot
+  notifications:
+    email_events: Eventos para notificaciones por correo electrónico
+    email_events_hint: 'Seleccioná los eventos para los que querés recibir notificaciones:'
+    other_settings: Configuración de otras notificaciones
   number:
     human:
       decimal_units:
@@ -897,6 +940,7 @@ es-AR:
       duration_too_long: está demasiado lejos en el futuro
       duration_too_short: es demasiado pronto
       expired: La encuesta ya finalizó
+      invalid_choice: La opción elegida no existe
       over_character_limit: no puede ser más largo de %{max} caracteres, cada uno
       too_few_options: debe tener más de un elemento
       too_many_options: no puede contener más de %{max} elementos
@@ -904,9 +948,15 @@ es-AR:
     other: Otros
     posting_defaults: Configuración predeterminada de publicaciones
     public_timelines: Líneas temporales públicas
+  reactions:
+    errors:
+      unrecognized_emoji: no es un emoji conocido
   relationships:
     activity: Actividad de la cuenta
     dormant: Inactivas
+    followers: Seguidores
+    following: Siguiendo
+    invited: Invitado
     last_active: Última actividad
     most_recent: Más reciente
     moved: Mudada
@@ -1189,7 +1239,9 @@ es-AR:
       review_preferences_action: Cambiar configuración
       review_preferences_step: Asegurate de establecer tu configuración, como qué tipo de correos electrónicos te gustaría recibir, o qué nivel de privacidad te gustaría que sea el predeterminado para tus toots. Si no tenés mareos, podrías elegir habilitar la reproducción automática de GIFs.
       subject: Bienvenido a Mastodon
+      tip_federated_timeline: La línea temporal federada es una línea contínua global de la red de Mastodon. Pero sólo incluye gente que tus vecinos están siguiendo, así que no es completa.
       tip_following: Predeterminadamente seguís al / a los administrador/es de tu servidor. Para encontrar más gente interesante, revisá las lineas temporales local y federada.
+      tip_local_timeline: La línea temporal local es una línea contínua global de cuentas en %{instance}. ¡Estos son tus vecinos inmediatos!
       tip_mobile_webapp: Si tu navegador web móvil te ofrece agregar Mastodon a tu página de inicio, podés recibir notificaciones PuSH. ¡Actúa como una aplicación nativa de muchas maneras!
       tips: Consejos
       title: "¡Bienvenido a bordo, %{name}!"
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 1826331b3..2d582cd7c 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -1,8 +1,8 @@
 ---
 es:
   about:
-    about_hashtag_html: Estos son toots públicos etiquetados con <strong>#%{hashtag}</strong>. Puedes interactuar con ellos si tienes una cuenta en el fediverso.
-    about_mastodon_html: Mastodon es una red social basada en protocolos web abiertos y software libre y de código abierto. Está descentralizado como correo electrónico.
+    about_hashtag_html: Estos son toots públicos etiquetados con <strong>#%{hashtag}</strong>. Puedes interactuar con ellos si tienes una cuenta en cualquier parte del fediverso.
+    about_mastodon_html: 'La red social del futuro: ¡Sin anuncios, sin vigilancia corporativa, diseño ético, y descentralización! ¡Sé dueño de tu información con Mastodon!'
     about_this: Información
     active_count_after: activo
     active_footnote: Usuarios Activos Mensuales (UAM)
@@ -78,6 +78,7 @@ es:
     roles:
       admin: Administrador
       bot: Bot
+      group: Grupo
       moderator: Moderador
     unavailable: Perfil no disponible
     unfollow: Dejar de seguir
@@ -180,7 +181,7 @@ es:
       silenced: Silenciado
       statuses: Estados
       subscribe: Suscribir
-      suspended: Susependido
+      suspended: Suspendido
       time_in_queue: Esperando en cola %{time}
       title: Cuentas
       unconfirmed_email: Correo electrónico sin confirmar
@@ -197,11 +198,13 @@ es:
         change_email_user: "%{name} ha cambiado la dirección de correo del usuario %{target}"
         confirm_user: "%{name} confirmó la dirección de correo del usuario %{target}"
         create_account_warning: "%{name} envió una advertencia a %{target}"
+        create_announcement: "%{name} creó el nuevo anuncio %{target}"
         create_custom_emoji: "%{name} subió un nuevo emoji %{target}"
         create_domain_allow: "%{name} ha añadido a la lista blanca el dominio %{target}"
         create_domain_block: "%{name} bloqueó el dominio %{target}"
         create_email_domain_block: "%{name} puso en lista negra el dominio de correos %{target}"
         demote_user: "%{name} degradó al usuario %{target}"
+        destroy_announcement: "%{name} eliminó el anuncio %{target}"
         destroy_custom_emoji: "%{name} destruyó el emoji %{target}"
         destroy_domain_allow: "%{name} ha eliminado el dominio %{target} de la lista blanca"
         destroy_domain_block: "%{name} desbloqueó el dominio %{target}"
@@ -223,10 +226,22 @@ es:
         unassigned_report: "%{name} ha desasignado la denuncia %{target}"
         unsilence_account: "%{name} desactivó el silenciado de la cuenta de %{target}"
         unsuspend_account: "%{name} desactivó la suspensión de la cuenta de %{target}"
+        update_announcement: "%{name} actualizó el anuncio %{target}"
         update_custom_emoji: "%{name} actualizó el emoji %{target}"
         update_status: "%{name} actualizó el estado de %{target}"
       deleted_status: "(estado borrado)"
       title: Log de auditoría
+    announcements:
+      edit:
+        title: Editar anuncio
+      empty: No se encontraron anuncios.
+      live: En vivo
+      new:
+        create: Crear anuncio
+        title: Nuevo anuncio
+      published: Publicados
+      time_range: Intervalo de tiempo
+      title: Anuncios
     custom_emojis:
       assign_category: Asignar categoría
       by_domain: Dominio
@@ -320,7 +335,7 @@ es:
       rejecting_reports: rechazando informes
       severity:
         silence: silenciado
-        suspend: susependido
+        suspend: suspendido
       show:
         affected_accounts:
           one: Una cuenta en la base de datos afectada
@@ -338,13 +353,11 @@ es:
       delete: Borrar
       destroyed_msg: Dominio de correo borrado de la lista negra con éxito
       domain: Dominio
+      empty: Actualmente no hay dominios de correo electrónico en la lista negra.
       new:
         create: Añadir dominio
         title: Nueva entrada en la lista negra de correo
       title: Lista negra de correo
-    followers:
-      back_to_account: Volver a la cuenta
-      title: Seguidores de %{acct}
     instances:
       by_domain: Dominio
       delivery_available: Entrega disponible
@@ -373,6 +386,8 @@ es:
       title: Invitaciones
     pending_accounts:
       title: Cuentas pendientes (%{count})
+    relationships:
+      title: Relaciones de %{acct}
     relays:
       add_new: Añadir un nuevo relés
       delete: Borrar
@@ -393,10 +408,18 @@ es:
       created_msg: "¡El registro de la denuncia se ha creado correctamente!"
       destroyed_msg: "¡El registro de la denuncia se ha borrado correctamente!"
     reports:
+      account:
+        notes:
+          one: "%{count} nota"
+          other: "%{count} notas"
+        reports:
+          one: "%{count} informe"
+          other: "%{count} informes"
       action_taken_by: Acción tomada por
       are_you_sure: "¿Estás seguro?"
       assign_to_self: Asignármela a mí
       assigned: Moderador asignado
+      by_target_domain: Dominio de la cuenta reportada
       comment:
         none: Ninguno
       created_at: Denunciado
@@ -442,6 +465,8 @@ es:
         users: Para los usuarios locales que han iniciado sesión
       domain_blocks_rationale:
         title: Mostrar la razón de ser
+      enable_bootstrap_timeline_accounts:
+        title: Habilitar seguimientos predeterminados para usuarios nuevos
       hero:
         desc_html: Mostrado en la página principal. Recomendable al menos 600x100px. Por defecto se establece a la miniatura de la instancia
         title: Imagen de portada
@@ -570,6 +595,10 @@ es:
     animations_and_accessibility: Animaciones y accesibilidad
     confirmation_dialogs: Diálogos de confirmación
     discovery: Descubrir
+    localization:
+      body: Mastodon es traducido con la ayuda de voluntarios.
+      guide_link: https://es.crowdin.com/project/mastodon
+      guide_link_text: Todos pueden contribuir.
     sensitive_content: Contenido sensible
     toot_layout: Diseño de los toots
   application_mailer:
@@ -642,6 +671,9 @@ es:
     hint_html: "<strong>Tip:</strong> No volveremos a preguntarte por la contraseña durante la siguiente hora."
     invalid_password: Contraseña incorrecta
     prompt: Confirmar contraseña para seguir
+  date:
+    formats:
+      default: "%b %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}h"
@@ -701,14 +733,13 @@ es:
     archive_takeout:
       date: Fecha
       download: Descargar tu archivo
-      hint_html: Puedes solicitar un archivo de tus <strong>toots y materiales subidos</strong>. Los datos exportados estarán en formato ActivityPub, legibles por cualquier software compatible.
+      hint_html: Puedes solicitar un archivo de tus <strong>toots y archivos multimedia subidos</strong>. Los datos exportados estarán en formato ActivityPub, legibles por cualquier software compatible.
       in_progress: Recopilando tu archivo...
       request: Solicitar tu archivo
       size: Tamaño
     blocks: Personas que has bloqueado
     csv: CSV
     domain_blocks: Bloqueos de dominios
-    follows: Personas que sigues
     lists: Listas
     mutes: Tienes en silencio
     storage: Almacenamiento
@@ -719,6 +750,7 @@ es:
     hint_html: "<strong>¿Qué son las etiquetas destacadas?</strong> Se muestran de forma prominente en tu perfil público y permiten a los usuarios navegar por tus publicaciones públicas específicamente bajo esas etiquetas. Son una gran herramienta para hacer un seguimiento de trabajos creativos o proyectos a largo plazo."
   filters:
     contexts:
+      account: Perfiles
       home: Timeline propio
       notifications: Notificaciones
       public: Timeline público
@@ -730,6 +762,7 @@ es:
       invalid_irreversible: El filtrado irreversible solo funciona con los contextos propios o de notificaciones
     index:
       delete: Borrar
+      empty: No tienes filtros.
       title: Filtros
     new:
       title: Añadir un nuevo filtro
@@ -742,6 +775,8 @@ es:
     all: Todos
     changes_saved_msg: "¡Cambios guardados con éxito!"
     copy: Copiar
+    delete: Eliminar
+    edit: Editar
     no_batch_actions_available: No hay acciones por lotes disponibles en esta página
     order_by: Ordenar por
     save_changes: Guardar cambios
@@ -878,6 +913,10 @@ es:
       body: "%{name} ha retooteado tu estado:"
       subject: "%{name} ha retooteado tu estado"
       title: Nueva difusión
+  notifications:
+    email_events: Eventos para notificaciones por correo electrónico
+    email_events_hint: 'Selecciona los eventos para los que deseas recibir notificaciones:'
+    other_settings: Otros ajustes de notificaciones
   number:
     human:
       decimal_units:
@@ -901,6 +940,7 @@ es:
       duration_too_long: está demasiado lejos en el futuro
       duration_too_short: es demasiado pronto
       expired: La encuesta ya ha terminado
+      invalid_choice: La opción de voto seleccionada no existe
       over_character_limit: no puede exceder %{max} caracteres cada uno
       too_few_options: debe tener más de un elemento
       too_many_options: no puede contener más de %{max} elementos
@@ -908,9 +948,16 @@ es:
     other: Otros
     posting_defaults: Configuración por defecto de publicaciones
     public_timelines: Líneas de tiempo públicas
+  reactions:
+    errors:
+      limit_reached: Límite de reacciones diferentes alcanzado
+      unrecognized_emoji: no es un emoji conocido
   relationships:
     activity: Actividad de la cuenta
     dormant: Inactivo
+    followers: Seguidores
+    following: Siguiendo
+    invited: Invitado
     last_active: Última actividad
     most_recent: Más reciente
     moved: Movido
diff --git a/config/locales/et.yml b/config/locales/et.yml
index 36a2931af..e0e861c33 100644
--- a/config/locales/et.yml
+++ b/config/locales/et.yml
@@ -78,6 +78,7 @@ et:
     roles:
       admin: Administraator
       bot: Robot
+      group: Grupp
       moderator: Moderaator
     unavailable: Profiil pole saadaval
     unfollow: Lõpeta jälgimine
@@ -341,13 +342,11 @@ et:
       delete: Kustuta
       destroyed_msg: E-posti aadressi keelunimekirjast kustutamine õnnestus
       domain: Domeen
+      empty: Ühtegi e-postidomeeni pole blokeeritud.
       new:
         create: Lisa domeen
         title: Uus e-posti keelunimekirja sisend
       title: E-posti keelunimekiri
-    followers:
-      back_to_account: Tagasi minu kontole
-      title: "%{acct}-i jälgijad"
     instances:
       by_domain: Domeen
       delivery_available: Üleandmine on saadaval
@@ -376,6 +375,8 @@ et:
       title: Kutsed
     pending_accounts:
       title: Ootel olevad kasutajad (%{count})
+    relationships:
+      title: "%{acct}-i suhted"
     relays:
       add_new: Lisa uus relee
       delete: Kustuta
@@ -383,7 +384,7 @@ et:
       disable: Keela
       disabled: Keelatud
       enable: Luba
-      enable_hint: Kui lubatud, siis sinu server tellib kõik avalikud tuututused sellelt releelt, ning hakkab ka enda avalikke tuututusi sellele saatma.
+      enable_hint: Kui lubatud, siis Teie server tellib kõik avalikud tuututused sellelt releelt ning hakkab ka enda avalikke tuututusi sellele saatma.
       enabled: Lubatud
       inbox_url: Relee URL
       pending: Ootab relee nõusolekut
@@ -396,10 +397,18 @@ et:
       created_msg: Teade edukalt koostatud!
       destroyed_msg: Teade edukalt kustutatud!
     reports:
+      account:
+        notes:
+          one: "%{count} märkus"
+          other: "%{count} märkust"
+        reports:
+          one: "%{count} teavitus"
+          other: "%{count} teavitust"
       action_taken_by: Meetmeid kasutanud
       are_you_sure: Olete kindel?
       assign_to_self: Määra mulle
       assigned: Määratud moderaator
+      by_target_domain: Teavitatud konto domeen
       comment:
         none: Pole
       created_at: Teavitatud
@@ -445,6 +454,8 @@ et:
         users: Sisseloginud kohalikele kasutajatele
       domain_blocks_rationale:
         title: Näita põhjendust
+      enable_bootstrap_timeline_accounts:
+        title: Luba vaikimisi jälgimisi uutele kasutajatele
       hero:
         desc_html: Kuvatud kodulehel. Vähemalt 600x100px soovitatud. Kui pole seadistatud, kuvatakse serveri pisililt
         title: Maskotipilt
@@ -573,6 +584,10 @@ et:
     animations_and_accessibility: Animatsioonid ja ligipääs
     confirmation_dialogs: Kinnitusdialoogid
     discovery: Avastus
+    localization:
+      body: Mastodon on tõlgitud vabatahtlike poolt.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Igaüks võib panustada.
     sensitive_content: Tundlik sisu
     toot_layout: Tuututuse kujundus
   application_mailer:
@@ -589,7 +604,7 @@ et:
     regenerate_token: Loo uus access token
     token_regenerated: Access tokeni loomine õnnestus
     warning: Olge nende andmetega ettevaatlikud. Ärge jagage neid kellegagi!
-    your_token: Sinu access token
+    your_token: Teie access token
   auth:
     apply_for_account: Taotle kutse
     change_password: Salasõna
@@ -711,7 +726,6 @@ et:
     blocks: Teie blokeerite
     csv: CSV
     domain_blocks: Domeeni blokeeringud
-    follows: Teie jälgite
     lists: Nimistud
     mutes: Teie vaigistate
     storage: Meedia hoidla
@@ -722,6 +736,7 @@ et:
     hint_html: "<strong>Mis on esile toodud sildid?</strong> Need sildid näidatakse nähtavalt Teie avalikul profiilil ning nad aitavad inimestel leida postitusi, millel on antud sildid. Nad on hea viis kuidas näiteks hoida järge loovtöödel või pikaajalistel projektidel."
   filters:
     contexts:
+      account: Profiilid
       home: Kodu ajajoon
       notifications: Teated
       public: Avalikud ajajooned
@@ -733,6 +748,7 @@ et:
       invalid_irreversible: Taastamatu filter töötab ainult kodu või teavituste kontekstis
     index:
       delete: Kustuta
+      empty: Teil pole filtreid.
       title: Filterid
     new:
       title: Lisa uus filter
@@ -851,7 +867,7 @@ et:
     digest:
       action: Vaata kõiki teateid
       body: Siin on kiire ülevaade sellest, mis sõnumeid Te ei näinud pärast Teie viimast külastust %{since}
-      mention: "%{name} mainis sind postituses:"
+      mention: "%{name} mainis Teid postituses:"
       new_followers_summary:
         one: Ja veel, Te saite ühe uue jälgija kui Te olite eemal! Jee!
         other: Ja veel, Te saite %{count} uut jälgijat kui Te olite eemal! Hämmastav!
@@ -881,6 +897,10 @@ et:
       body: "%{name} upitas Teie staatust:"
       subject: "%{name} upitas su staatust"
       title: Uus upitus
+  notifications:
+    email_events: E-posti teadete sündmused
+    email_events_hint: 'Valige sündmused, millest soovite teavitusi:'
+    other_settings: Muud teadete sätted
   number:
     human:
       decimal_units:
@@ -904,6 +924,7 @@ et:
       duration_too_long: kestab liiga kaua
       duration_too_short: on liiga vara
       expired: See küsitlus on juba lõppenud
+      invalid_choice: Valitud küsitluse valikut pole olemas
       over_character_limit: igaüks ei saa olla rohkem kui %{max} tähemärki
       too_few_options: peab olema rohkem kui üks vastus
       too_many_options: ei saa sisaldada rohkem kui %{max} vastust
@@ -914,6 +935,9 @@ et:
   relationships:
     activity: Konto tegevus
     dormant: Seisev
+    followers: Jälgijad
+    following: Jälgib
+    invited: Kutsutud
     last_active: Viimati aktiivne
     most_recent: Viimased
     moved: Kolinud
@@ -970,7 +994,7 @@ et:
       weibo: Weibo
     current_session: Praegune seanss
     description: "%{browser} platvormil %{platform}"
-    explanation: Need on praegused veebilehitsejad, mis on sisse logitud sinu Mastodoni kontosse.
+    explanation: Need on praegused veebilehitsejad, mis on sisse logitud Teie Mastodoni kontosse.
     ip: IP
     platforms:
       adobe_air: Adobe Air
@@ -1112,7 +1136,7 @@ et:
       explanation: Siin on mõned nõuanded, mis aitavad sul alustada
       final_action: Alusa postitamist
       final_step: 'Alusta postitamist! Isegi ilma jälgijateta näevad teised Teie avalikke postitusi, näiteks kohalikul ajajoonel ning siltidest. Te võite ennast tutvustada kasutades silti #introductions.'
-      full_handle: Sinu täisnimi
+      full_handle: Teie täisnimi
       full_handle_hint: See on mida oma sõpradega jagada, et nad saaksid Teile sõnumeid saata ning Teid jälgida teiselt serverilt.
       review_preferences_action: Muuda eelistusi
       review_preferences_step: Kindlasti seadistage oma sätted Teie maitse järgi, näiteks e-kirju, mida soovite saada, või millist privaatsustaset Te soovite vaikimisi. Kui Teil pole merehaigust, võite Te näiteks lubada GIFide automaatse mängimise.
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 9dfe5e9d3..e3cedee53 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -78,6 +78,7 @@ eu:
     roles:
       admin: Administratzailea
       bot: Bot-a
+      group: Taldea
       moderator: Moderatzailea
     unavailable: Profila ez dago eskuragarri
     unfollow: Utzi jarraitzeari
@@ -197,11 +198,13 @@ eu:
         change_email_user: "%{name}(e)k %{target}(r)en e-mail helbidea aldatu du"
         confirm_user: "%{name}(e)k %{target}(r)en e-mail helbidea berretsi du"
         create_account_warning: "%{name}-k abisua bidali dio %{target}-ri"
+        create_announcement: "%{name}(e)k %{target}(e)rako iragarpen berria sortu du"
         create_custom_emoji: "%{name}(e)k emoji berria kargatu du %{target}"
         create_domain_allow: "%{name}(e)k %{target} domeinua zerrenda zurian zartu du"
         create_domain_block: "%{name}(e)k %{target} domeinua blokeatu du"
         create_email_domain_block: "%{name}(e)k %{target} e-mail helbideen domeinua zerrenda beltzean sartu du"
         demote_user: "%{name}(e)k %{target} mailaz jaitsi du"
+        destroy_announcement: "%{name}(e)k %{target}(e)rako iragarpena kendu du"
         destroy_custom_emoji: "%{name} erabiltzaileak %{target} emojia suntsitu du"
         destroy_domain_allow: "%{name}(e)k %{target} domeinua zerrenda zuritik kendu du"
         destroy_domain_block: "%{name}(e)k %{target} domeinua desblokeatu du"
@@ -223,10 +226,22 @@ eu:
         unassigned_report: "%{name}(e)k %{target} txotenaren esleipena atzera bota du"
         unsilence_account: "%{name}(e)k %{target} isilarazteko agindua kendu du"
         unsuspend_account: "%{name}(e)k %{target} kontuaren kanporaketa atzera bota du"
+        update_announcement: "%{name}(e)k %{target}(e)rako iragarpena eguneratu du du"
         update_custom_emoji: "%{name}(e)k %{target} emoji-a eguneratu du"
         update_status: "%{name} (e)k %{target}(r)en mezua aldatu du"
       deleted_status: "(ezabatutako mezua)"
       title: Auditoria-egunkaria
+    announcements:
+      edit:
+        title: Editatu iragarpena
+      empty: Ez da iragarpenik aurkitu.
+      live: Zuzenean
+      new:
+        create: Sortu iragarpena
+        title: Iragarpen berria
+      published: Argitaratua
+      time_range: Denbora-tartea
+      title: Iragarpenak
     custom_emojis:
       assign_category: Esleitu kategoria
       by_domain: Domeinua
@@ -338,13 +353,11 @@ eu:
       delete: Ezabatu
       destroyed_msg: Ongi ezabatu da e-mail domeinua zerrenda beltzetik
       domain: Domeinua
+      empty: Ez dago e-mail domeinurik zerrenda beltzean.
       new:
         create: Gehitu domeinua
         title: Sarrera berria e-mail zerrenda beltzean
       title: E-mail zerrenda beltza
-    followers:
-      back_to_account: Itzuli kontura
-      title: "%{acct} kontuaren jarraitzaileak"
     instances:
       by_domain: Domeinua
       delivery_available: Bidalketa eskuragarri dago
@@ -373,6 +386,8 @@ eu:
       title: Gonbidapenak
     pending_accounts:
       title: Zain dauden kontuak (%{count})
+    relationships:
+      title: "%{acct}(e)ren erlazioak"
     relays:
       add_new: Gehitu hari errelea
       delete: Ezabatu
@@ -393,10 +408,18 @@ eu:
       created_msg: Salaketa oharra ongi sortu da!
       destroyed_msg: Salaketa oharra ongi ezabatu da!
     reports:
+      account:
+        notes:
+          one: Ohar %{count}
+          other: "%{count} ohar"
+        reports:
+          one: Txosten %{count}
+          other: "%{count} txosten"
       action_taken_by: Neurrien hartzailea
       are_you_sure: Ziur zaude?
       assign_to_self: Esleitu niri
       assigned: Esleitutako moderatzailea
+      by_target_domain: Jakinarazitako kontuaren domeinua
       comment:
         none: Bat ere ez
       created_at: Salatua
@@ -442,6 +465,8 @@ eu:
         users: Saioa hasita duten erabiltzaile lokalei
       domain_blocks_rationale:
         title: Erakutsi arrazoia
+      enable_bootstrap_timeline_accounts:
+        title: Gaitu lehenetsitako jarraipena erabiltzaile berrientzat
       hero:
         desc_html: Azaleko orrian bistaratua. Gutxienez 600x100px aholkatzen da. Ezartzen ez bada, zerbitzariaren irudia hartuko du
         title: Azaleko irudia
@@ -570,6 +595,10 @@ eu:
     animations_and_accessibility: Animazioak eta irisgarritasuna
     confirmation_dialogs: Berrespen dialogoak
     discovery: Aurkitzea
+    localization:
+      body: Mastodon boluntarioek itzultzen dute.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Edonork lagundu dezake.
     sensitive_content: Eduki hunkigarria
     toot_layout: Toot disposizioa
   application_mailer:
@@ -642,9 +671,12 @@ eu:
     hint_html: "<strong>Oharra:</strong> Ez dizugu pasahitza berriro eskatuko ordu batez."
     invalid_password: Pasahitz baliogabea
     prompt: Berretsi pasahitza jarraitzeko
+  date:
+    formats:
+      default: "%Y(e)ko %b %d"
   datetime:
     distance_in_words:
-      about_x_hours: "%{count}o"
+      about_x_hours: "%{count}h"
       about_x_months: "%{count} hilabete"
       about_x_years: "%{count} urte"
       almost_x_years: "%{count} urte"
@@ -708,7 +740,6 @@ eu:
     blocks: Zuk blokeatutakoak
     csv: CSV
     domain_blocks: Domeinuen blokeoak
-    follows: Zuk jarraitutakoak
     lists: Zerrendak
     mutes: Zuk mututukoak
     storage: Multimedia biltegiratzea
@@ -719,6 +750,7 @@ eu:
     hint_html: "<strong>Zer dira nabarmendutako traolak?</strong> Zure profilean toki nabarmendu batean agertzen dira eta jendeari traola hau daukaten mezu publikoak arakatzea ahalbidetzen diote. Sormen lana edo epe luzerako proiektuak jarraitzeko primerakoak dira."
   filters:
     contexts:
+      account: Profilak
       home: Hasierako denbora-lerroa
       notifications: Jakinarazpenak
       public: Denbora-lerro publikoak
@@ -730,6 +762,7 @@ eu:
       invalid_irreversible: Behin betiko iragazketa hasiera edo jakinarazpenen testuinguruan besterik ez dabil
     index:
       delete: Ezabatu
+      empty: Ez duzu iragazkirik.
       title: Iragazkiak
     new:
       title: Gehitu iragazki berria
@@ -742,6 +775,8 @@ eu:
     all: Denak
     changes_saved_msg: Aldaketak ongi gorde dira!
     copy: Kopiatu
+    delete: Ezabatu
+    edit: Editatu
     no_batch_actions_available: Ez dago ekintza masiborik orri honetan eskuragarri
     order_by: Ordenatze-irizpidea
     save_changes: Gorde aldaketak
@@ -878,6 +913,10 @@ eu:
       body: "%{name}(e)k bultzada eman dio zure mezuari:"
       subject: "%{name}(e)k bultzada eman dio zure mezuari"
       title: Bultzada berria
+  notifications:
+    email_events: Gertaerak helbide elektronikoko jakinarazpenentzat
+    email_events_hint: 'Hautatu jaso nahi dituzun gertaeren jakinarazpenak:'
+    other_settings: Bezte jakinarazpen konfigurazioak
   number:
     human:
       decimal_units:
@@ -901,6 +940,7 @@ eu:
       duration_too_long: etorkizunean urrunegi dago
       duration_too_short: goizegi da
       expired: Inkesta amaitu da jada
+      invalid_choice: Hautatutako boto aukera ez da existitzen
       over_character_limit: bakoitzak gehienez %{max} karaktere izan ditzake
       too_few_options: elementu bat baino gehiago izan behar du
       too_many_options: ezin ditu %{max} elementu baino gehiago izan
@@ -908,9 +948,15 @@ eu:
     other: Denetarik
     posting_defaults: Bidalketarako lehenetsitakoak
     public_timelines: Denbora-lerro publikoak
+  reactions:
+    errors:
+      unrecognized_emoji: ez da emoji ezaguna
   relationships:
     activity: Kontuaren aktibitatea
     dormant: Ez aktiboa
+    followers: Jarraitzaileak
+    following: Jarraitzen
+    invited: Gonbidatuta
     last_active: Azkenekoz aktiboa
     most_recent: Azkenak
     moved: Lekuz aldatua
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 02a990a40..ecf3bc391 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -2,46 +2,48 @@
 fa:
   about:
     about_hashtag_html: این‌ها نوشته‌های عمومی هستند که برچسب (هشتگ) <strong>#%{hashtag}</strong> را دارند. اگر شما روی هر سروری حساب داشته باشید می‌توانید به این نوشته‌ها واکنش نشان دهید.
-    about_mastodon_html: 'شبکهٔ اجتماعی آینده: بدون تبلیغات، بدون شنود از طرف شرکت‌ها، طراحی اخلاق‌مدار، و معماری غیرمتمرکز! با ماستدون صاحب داده‌های خودتان باشید!'
+    about_mastodon_html: 'شبکهٔ اجتماعی آینده: بدون تبلیغات، بدون شنود از طرف شرکت‌ها، طراحی اخلاق‌مدار، و معماری غیرمتمرکز! با ماستودون صاحب داده‌های خودتان باشید!'
     about_this: درباره
-    active_count_after: فعال
+    active_count_after: فعّال
     active_footnote: کاربران فعال در ماه گذشته
     administered_by: 'با مدیریت:'
     api: رابط برنامه‌نویسی کاربردی
-    apps: اپ‌های موبایل
+    apps: کاره‌های همراه
     apps_platforms: ماستدون را در iOS، اندروید، و سایر سیستم‌ها داشته باشید
     browse_directory: کاربران این سرور را بر اساس علاقه‌مندی‌هایشان پیدا کنید
     browse_local_posts: فهرست لحظه‌ای نوشته‌های عمومی در ماستدون را ببینید
     browse_public_posts: فهرست لحظه‌ای نوشته‌های عمومی در ماستدون را ببینید
     contact: تماس
-    contact_missing: تعیین نشده
+    contact_missing: تنظیم نشده
     contact_unavailable: موجود نیست
     discover_users: یافتن کاربران
     documentation: مستندات
-    federation_hint_html: با داشتن حساب روی %{instance} می‌توانید کاربران همهٔ سرورهای دیگر ماستدون (و سایر شبکه‌های سازگار با آن) را پی بگیرید.
-    get_apps: یک اپ موبایل را امتحان کنید
-    hosted_on: ماستدون، میزبانی‌شده روی %{domain}
+    federation_hint_html: با حسابی روی %{instance} می‌توانید افراد روی هر کارساز ماستودون و بیش از آن را پی بگیرید.
+    get_apps: یک کاارهٔ همراه را بیازمایید
+    hosted_on: ماستودون، میزبانی‌شده روی %{domain}
     instance_actor_flash: |
       این حساب یک بازیگر مجازی برای نمایندگی از این سرور است و متعلق به هیچ کاربری نیست.
       این حساب برای ارتباط میان‌سروری به کار می‌رود و نباید مسدود شود، مگر این که شما بخواهید کل سرور را مسدود کنید، که در آن صورت باید از راه مسدودسازی دامین پیش بروید.
     learn_more: بیشتر بدانید
-    privacy_policy: سیاست رازداری
+    privacy_policy: سیاست محرمانگی
     see_whats_happening: ببینید چه خبر است
-    server_stats: 'آمار سرور:'
+    server_stats: 'آمار کارساز:'
     source_code: کدهای منبع
     status_count_after:
       one: چیز نوشته‌اند
       other: چیز نوشته‌اند
     status_count_before: که در کنار هم
-    tagline: با دوستان خود در ارتباط باشید و دوستان تازه پیدا کنید
-    terms: شرایط کاربری
+    tagline: پی‌گیری و یافتن دوستان جدید
+    terms: شرایط خدمت
     unavailable_content: محتوای ناموجود
     unavailable_content_description:
-      domain: سرور
-      reason: 'دلیل:'
-      rejecting_media: تصاویر فرستاده شده از سمت این سرور پردازش نخواهد شد و هیچ تصویر کوچکی از آن‌ها در این‌جا نمایش نخواهد یافت، و آن‌ها را باید مستقیماً در آن سرور ببینید.
-      silenced: هیچ کدام از نوشته‌ها از طرف این سرور این‌جا نمایش نخواهند یافت مگر در فهرست پیگیری‌ها شما، اگر نویسنده‌اش را پی بگیرید.
-      suspended: شما نمی‌توانید هیچ کدام از کاربرهای این سرور را پی بگیرید، و هیچ داده‌ای از طرف این سرور پردازش یا ذخیره یا مبادله نخواهد شد.
+      domain: کارساز
+      reason: دلیل
+      rejecting_media: 'پرونده‌های رسانه از این کارسازها پردازش یا ذخیره نخواهند شد و هیچ بندانگشتی‌ای نمایش نخواهد یافت. نیازمند کلیک دستی برای رسیدن به پروندهٔ اصلی:'
+      silenced: |-
+        هیچ کدام از نوشته‌ها از طرف این سرور این‌جا نمایش نخواهند یافت مگر در فهرست پیگیری‌ها شما، اگر نویسنده‌اش را پی بگیرید.
+        فرسته‌ها از این کارسازها در گفت‌وگوها و خط زمانی عمومی نهفته خواهند بود و تا وقتی پی‌گیرشان نشوید، هیچ آگاهی‌ای از برهم‌کنش‌های کاربرانشان تولید نخواهد شد:
+      suspended: 'هیچ داده‌ای از این کارسازها پردازش، ذخیره یا مبادله نخواهد شد که هرگونه برهم‌کنش یا ارتباط با کاربران این کارسازها را غیرممکن خواهد کرد:'
     unavailable_content_html: ماستدون در حالت کلی اجازه می‌دهد که شما همهٔ مطالب و کاربران در سرورهای دیگر را نیز ببینید و با آن‌ها برهم‌کنش داشته باشید. فهرست زیر ولی استثناهای این ارتباط است که به طور خاص روی این سرور اعمال شده‌اند.
     user_count_after:
       one: کاربر
@@ -78,6 +80,7 @@ fa:
     roles:
       admin: مدیر
       bot: ربات
+      group: گروه
       moderator: ناظم
     unavailable: نمایهٔ ناموجود
     unfollow: پایان پیگیری
@@ -97,38 +100,38 @@ fa:
       avatar: تصویر نمایه
       by_domain: دامین
       change_email:
-        changed_msg: نشانی ایمیل این حساب با موفقیت تغییر کرد!
-        current_email: ایمیل کنونی
-        label: تغییر نشانی ایمیل
-        new_email: ایمیل تازه
-        submit: تغییر ایمیل
-        title: تغییر ایمیل برای %{username}
+        changed_msg: رایانامهٔ حساب با موفقیت تغییر کرد!
+        current_email: رایانامهٔ کنونی
+        label: تغییر رایانامه
+        new_email: رایانامهٔ جدید
+        submit: تغییر رایانامه
+        title: تغییر رایانامه برای %{username}
       confirm: تأیید
       confirmed: تأیید شد
       confirming: تأیید
-      deleted: پاک‌شده
+      deleted: حذف شده
       demote: تنزل‌دادن
-      disable: غیرفعال
-      disable_two_factor_authentication: غیرفعال‌سازی ورود دومرحله‌ای
-      disabled: غیرفعال
-      display_name: نمایش به نام
-      domain: دامین
+      disable: از کار انداختن
+      disable_two_factor_authentication: از کار انداختن 2FA
+      disabled: از کار افتاده
+      display_name: نام نمایشی
+      domain: دامنه
       edit: ویرایش
-      email: ایمیل
-      email_status: وضعیت ایمیل
-      enable: فعال
-      enabled: فعال
+      email: رایانامه
+      email_status: وضعیت رایانامه
+      enable: به کار انداختن
+      enabled: به کار افتاده
       followers: پیگیران
       follows: پی می‌گیرد
-      header: زمینه
+      header: سرآیند
       inbox_url: نشانی صندوق ورودی
       invited_by: دعوت‌شده از طرف
       ip: IP
-      joined: عضویت از
+      joined: پیوسته در
       location:
         all: همه
-        local: محلی
-        remote: غیرمستقیم
+        local: محلّی
+        remote: دوردست
         title: مکان
       login_status: وضعیت ورود
       media_attachments: ضمیمه‌های تصویری
@@ -198,10 +201,12 @@ fa:
         confirm_user: "%{name} نشانی ایمیل کاربر %{target} را تأیید کرد"
         create_account_warning: "%{name} هشداری برای %{target} فرستاد"
         create_custom_emoji: "%{name} شکلک تازهٔ %{target} را بارگذاشت"
+        create_domain_allow: "%{name} دامنهٔ %{target} را مجاز کرد"
         create_domain_block: "%{name} دامین %{target} را مسدود کرد"
         create_email_domain_block: "%{name} دامین ایمیل %{target} را مسدود کرد"
         demote_user: "%{name} مقام کاربر %{target} را تنزل داد"
         destroy_custom_emoji: "%{name} شکلک %{target} را حذف کرد"
+        destroy_domain_allow: "%{name} دامنهٔ %{target} را فهرست مجاز برداشت"
         destroy_domain_block: "%{name} دامین %{target} را باز کرد"
         destroy_email_domain_block: "%{name} دامین ایمیل %{target} را باز کرد"
         destroy_status: "%{name} نوشته‌ای از %{target} را پاک کرد"
@@ -336,13 +341,11 @@ fa:
       delete: پاک‌کردن
       destroyed_msg: مسدودسازی دامین ایمیل با موفقیت پاک شد
       domain: دامین
+      empty: هیچ دامنه ایمیلی در حال حاضر در لیست‌سیاه قرار نگرفته است.
       new:
         create: ساختن مسدودسازی
         title: مسدودسازی دامین ایمیل تازه
       title: مسدودسازی دامین‌های ایمیل
-    followers:
-      back_to_account: بازگشت به حساب
-      title: پیگیران %{acct}
     instances:
       by_domain: دامین
       delivery_available: پیام آماده است
@@ -391,10 +394,18 @@ fa:
       created_msg: یادداشت گزارش با موفقیت ساخته شد!
       destroyed_msg: یادداشت گزارش با موفقیت حذف شد!
     reports:
+      account:
+        notes:
+          one: "%{count} یادداشت"
+          other: "%{count} یادداشت"
+        reports:
+          one: "%{count} گزارش"
+          other: "%{count} گزارش"
       action_taken_by: انجام‌دهنده
       are_you_sure: آیا مطمئن هستید؟
       assign_to_self: به عهدهٔ من بگذار
       assigned: مدیر عهده‌دار
+      by_target_domain: دامنهٔ حساب گزارش‌شده
       comment:
         none: خالی
       created_at: گزارش‌شده
@@ -440,6 +451,8 @@ fa:
         users: برای کاربران محلی واردشده
       domain_blocks_rationale:
         title: دیدن دلیل
+      enable_bootstrap_timeline_accounts:
+        title: به کار انداختن پیگیری‌های پیش‌گزیده برای کاربران تازه
       hero:
         desc_html: در صفحهٔ آغازین نمایش می‌یابد. دست‌کم ۶۰۰×۱۰۰ پیکسل توصیه می‌شود. اگر تعیین نشود، با تصویر بندانگشتی سرور جایگزین خواهد شد
         title: تصویر سربرگ
@@ -568,6 +581,10 @@ fa:
     animations_and_accessibility: پویانمایی‌های و دسترسی‌پذیری
     confirmation_dialogs: پیغام‌های تأیید
     discovery: کاوش
+    localization:
+      body: ماستودون توسط داوطلبان ترجمه شده است.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: همه می‌توانند کمک کنند.
     sensitive_content: محتوای حساس
     toot_layout: آرایش بوق
   application_mailer:
@@ -706,7 +723,6 @@ fa:
     blocks: حساب‌های مسدودشده
     csv: CSV
     domain_blocks: دامین‌های مسدودشده
-    follows: حساب‌های پی‌گرفته
     lists: فهرست‌ها
     mutes: حساب‌های بی‌صداشده
     storage: تصویرهای ذخیره‌شده
@@ -728,6 +744,7 @@ fa:
       invalid_irreversible: فیلترهای برگشت‌ناپذیر تنها در زمینهٔ پیگیری‌ها یا اعلان‌ها کار می‌کنند
     index:
       delete: پاک‌کردن
+      empty: شما هیچ فیلتری ندارید.
       title: فیلترها
     new:
       title: افزودن فیلتر تازه
@@ -876,6 +893,10 @@ fa:
       body: "%{name} نوشتهٔ شما را بازبوقید:"
       subject: "%{name} نوشتهٔ شما را بازبوقید"
       title: بازبوق تازه
+  notifications:
+    email_events: رویدادها برای آگاهی‌های رایانامه‌ای
+    email_events_hint: 'گزینش رویدادهایی که می‌خواهید برایشان آگاهی بگیرید:'
+    other_settings: تنظیمات دیگر آگاهی‌ها
   number:
     human:
       decimal_units:
@@ -899,6 +920,7 @@ fa:
       duration_too_long: در آیندهٔ خیلی دور است
       duration_too_short: در آیندهٔ خیلی نزدیک است
       expired: این نظرسنجی به پایان رسیده است
+      invalid_choice: گزینه رای دادن وجود ندارد
       over_character_limit: هر کدام نمی‌تواند از %{max} نویسه طولانی‌تر باشد
       too_few_options: حتماً باید بیش از یک گزینه داشته باشد
       too_many_options: نمی‌تواند بیشتر از %{max} گزینه داشته باشد
@@ -909,6 +931,8 @@ fa:
   relationships:
     activity: فعالیت حساب
     dormant: غیرفعال
+    followers: پی‌گیران
+    following: پی‌گیری‌شدگان
     last_active: آخرین فعالیت
     most_recent: تازه‌ترین
     moved: منتقل‌شده
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 3ab1a590e..063e3bb91 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -299,6 +299,8 @@ fi:
       contact_information:
         email: Työsähköposti
         username: Yhteyshenkilön käyttäjänimi
+      enable_bootstrap_timeline_accounts:
+        title: Uudet käyttäjät seuraavat oletuksena tilejä
       hero:
         desc_html: Näytetään etusivulla. Suosituskoko vähintään 600x100 pikseliä. Jos kuvaa ei aseteta, käytetään instanssin pikkukuvaa
         title: Sankarin kuva
@@ -438,7 +440,6 @@ fi:
       request: Pyydä arkisto
       size: Koko
     blocks: Estot
-    follows: Seurattavat
     mutes: Mykistetyt
     storage: Media-arkisto
   generic:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 06b2916fe..09a599494 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -10,7 +10,7 @@ fr:
     api: API
     apps: Applications mobiles
     apps_platforms: Utilisez Mastodon depuis iOS, Android et d’autres plates-formes
-    browse_directory: Parcourir l’annuaire des profils et filtrer par centres d’intérêt
+    browse_directory: Parcourir l’annuaire des profils et filtrer par centres d’intérêts
     browse_local_posts: Parcourir un flux en direct de messages publics depuis ce serveur
     browse_public_posts: Parcourir un flux en direct de messages publics sur Mastodon
     contact: Contact
@@ -78,6 +78,7 @@ fr:
     roles:
       admin: Admin
       bot: Robot
+      group: Groupe
       moderator: Modérateur·trice
     unavailable: Profil non disponible
     unfollow: Ne plus suivre
@@ -197,11 +198,13 @@ fr:
         change_email_user: "%{name} a modifié l’adresse de courriel de l’utilisateur·rice %{target}"
         confirm_user: "%{name} adresse courriel confirmée de l’utilisateur·ice %{target}"
         create_account_warning: "%{name} a envoyé un avertissement à %{target}"
+        create_announcement: "%{name} a créé une nouvelle annonce %{target}"
         create_custom_emoji: "%{name} a importé de nouveaux émojis %{target}"
         create_domain_allow: "%{name} a inscrit le domaine %{target} sur liste blanche"
         create_domain_block: "%{name} a bloqué le domaine %{target}"
         create_email_domain_block: "%{name} a mis le domaine de courriel %{target} sur liste noire"
         demote_user: "%{name} a rétrogradé l’utilisateur·ice %{target}"
+        destroy_announcement: "%{name} a supprimé l’annonce %{target}"
         destroy_custom_emoji: "%{name} a détruit l’émoticône %{target}"
         destroy_domain_allow: "%{name} a supprimé le domaine %{target} de la liste blanche"
         destroy_domain_block: "%{name} a débloqué le domaine %{target}"
@@ -223,10 +226,22 @@ fr:
         unassigned_report: "%{name} a désassigné le signalement %{target}"
         unsilence_account: "%{name} a mis fin au mode silence de %{target}"
         unsuspend_account: "%{name} a réactivé le compte de %{target}"
+        update_announcement: "%{name} a actualisé l’annonce %{target}"
         update_custom_emoji: "%{name} a mis à jour l’émoji %{target}"
         update_status: "%{name} a mis à jour le statut de %{target}"
       deleted_status: "(statut supprimé)"
       title: Journal d’audit
+    announcements:
+      edit:
+        title: Modifier l’annonce
+      empty: Aucune annonce trouvée.
+      live: En direct
+      new:
+        create: Créer une annonce
+        title: Nouvelle annonce
+      published: Publié
+      time_range: Intervalle de temps
+      title: Annonces
     custom_emojis:
       assign_category: Attribuer une catégorie
       by_domain: Domaine
@@ -338,13 +353,11 @@ fr:
       delete: Supprimer
       destroyed_msg: Le blocage de domaine de courriel a été désactivé
       domain: Domaine
+      empty: Aucun domaine de courriel n’est actuellement sur liste noire.
       new:
         create: Créer le blocage
         title: Nouveau blocage de domaine de courriel
       title: Blocage de domaines de courriel
-    followers:
-      back_to_account: Retour au compte
-      title: Abonné⋅e⋅s de %{acct}
     instances:
       by_domain: Domaine
       delivery_available: Livraison disponible
@@ -373,6 +386,8 @@ fr:
       title: Invitations
     pending_accounts:
       title: Comptes en attente (%{count})
+    relationships:
+      title: Relations de %{acct}
     relays:
       add_new: Ajouter un nouveau relais
       delete: Effacer
@@ -393,10 +408,18 @@ fr:
       created_msg: Note de signalement créée avec succès !
       destroyed_msg: Note de signalement effacée avec succès !
     reports:
+      account:
+        notes:
+          one: "%{count} note"
+          other: "%{count} notes"
+        reports:
+          one: "%{count} signalement"
+          other: "%{count} signalements"
       action_taken_by: Intervention de
       are_you_sure: Êtes vous certain⋅e ?
       assign_to_self: Me l’assigner
       assigned: Modérateur assigné
+      by_target_domain: Domaine du compte signalé
       comment:
         none: Aucun
       created_at: Signalé
@@ -442,6 +465,8 @@ fr:
         users: Pour les utilisateurs locaux connectés
       domain_blocks_rationale:
         title: Montrer la raison
+      enable_bootstrap_timeline_accounts:
+        title: Activer le suivi par défaut pour les nouveaux·elles utilisateur·ice·s
       hero:
         desc_html: Affichée sur la page d’accueil. Au moins 600x100px recommandé. Lorsqu’elle n’est pas définie, se rabat sur la vignette du serveur
         title: Image d’en-tête
@@ -570,6 +595,10 @@ fr:
     animations_and_accessibility: Animations et accessibilité
     confirmation_dialogs: Dialogues de confirmation
     discovery: Découverte
+    localization:
+      body: Mastodon est traduit par des volontaires.
+      guide_link: https://fr.crowdin.com/project/mastodon
+      guide_link_text: Tout le monde peut y contribuer.
     sensitive_content: Contenu sensible
     toot_layout: Agencement du pouet
   application_mailer:
@@ -642,6 +671,9 @@ fr:
     hint_html: "<strong>Astuce :</strong> Nous ne vous demanderons plus votre mot de passe pour la prochaine heure."
     invalid_password: Mot de passe invalide
     prompt: Confirmez votre mot de passe pour continuer
+  date:
+    formats:
+      default: "%d %b %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count} h"
@@ -708,7 +740,6 @@ fr:
     blocks: Vous bloquez
     csv: CSV
     domain_blocks: Bloqueurs de domaine
-    follows: Vous suivez
     lists: Listes
     mutes: Vous masquez
     storage: Médias stockés
@@ -719,6 +750,7 @@ fr:
     hint_html: "<strong>Que sont les hashtags vedettes ?</strong> Ils sont affichés avec emphase sur votre flux d'actualités publique et permettent aux gens de parcourir vos messages publics spécifiquement sous ces hashtags. Ils sont un excellent outil pour garder trace des œuvres créatives ou des projets à long terme."
   filters:
     contexts:
+      account: Profils
       home: Accueil
       notifications: Notifications
       public: Fils publics
@@ -730,6 +762,7 @@ fr:
       invalid_irreversible: Le filtrage irréversible ne fonctionne que pour l’accueil et les notifications
     index:
       delete: Effacer
+      empty: Vous n'avez aucun filtre.
       title: Filtres
     new:
       title: Ajouter un nouveau filtre
@@ -742,6 +775,8 @@ fr:
     all: Tous
     changes_saved_msg: Les modifications ont été enregistrées avec succès !
     copy: Copier
+    delete: Supprimer
+    edit: Modifier
     no_batch_actions_available: Aucune action par lots disponible sur cette page
     order_by: Classer par
     save_changes: Enregistrer les modifications
@@ -834,7 +869,7 @@ fr:
     redirecting_to: Votre compte est redirigé vers %{acct}.
     set_redirect: Définir la redirection
     warning:
-      backreference_required: Le nouveau compte doit d'abord être configuré pour faire référence à celui-ci
+      backreference_required: Le nouveau compte doit d'abord être configuré pour faire référence à celui-ci en définissant un alias
       before: 'Avant de procéder, veuillez lire attentivement ces notes :'
       cooldown: Après le déménagement, il y a une période de gel pendant laquelle vous ne pourrez plus re-déménager
       disabled_account: Votre compte actuel ne sera pas entièrement utilisable par la suite. Cependant, vous aurez accès à l'exportation de données et à la ré-activation.
@@ -878,6 +913,10 @@ fr:
       body: "%{name} a partagé votre statut :"
       subject: "%{name} a partagé votre statut"
       title: Nouveau partage
+  notifications:
+    email_events: Événements pour les notifications par courriel
+    email_events_hint: 'Sélectionnez les événements pour lesquels vous souhaitez recevoir des notifications :'
+    other_settings: Autres paramètres de notifications
   number:
     human:
       decimal_units:
@@ -901,6 +940,7 @@ fr:
       duration_too_long: est trop loin dans le futur
       duration_too_short: est trop tôt
       expired: Ce sondage est déjà terminé
+      invalid_choice: L'option de vote choisie n'existe pas
       over_character_limit: ne peuvent être plus long que %{max} caractères chacun
       too_few_options: doit avoir plus qu’une proposition
       too_many_options: ne peut contenir plus de %{max} propositions
@@ -908,9 +948,15 @@ fr:
     other: Autre
     posting_defaults: Paramètres par défaut des pouets
     public_timelines: Fils publics
+  reactions:
+    errors:
+      unrecognized_emoji: n’est pas un émoji reconnu
   relationships:
     activity: Activité du compte
     dormant: Dormant
+    followers: Abonné·e·s
+    following: Abonnements
+    invited: Invité·e
     last_active: Dernière activité
     most_recent: Plus récent
     moved: Déménagé
@@ -933,8 +979,8 @@ fr:
       proceed: Confirmer l’ajout aux favoris
       prompt: 'Vous souhaitez mettre ce pouet en favori :'
     reblog:
-      proceed: Confirmer le repartage
-      prompt: 'Vous souhaitez repartager ce pouet :'
+      proceed: Confirmer le partage
+      prompt: 'Vous souhaitez partager ce pouet :'
     reply:
       proceed: Confirmer la réponse
       prompt: 'Vous souhaitez répondre à ce pouet :'
@@ -1015,7 +1061,7 @@ fr:
       video:
         one: "%{count} vidéo"
         other: "%{count} vidéos"
-    boosted_from_html: Repartagé depuis %{acct_link}
+    boosted_from_html: Partagé depuis %{acct_link}
     content_warning: 'Avertissement sur le contenu : %{warning}'
     disallowed_hashtags:
       one: 'contient un hashtag désactivé : %{tags}'
@@ -1207,5 +1253,5 @@ fr:
     seamless_external_login: Vous êtes connecté via un service externe, donc les paramètres concernant le mot de passe et le courriel ne sont pas disponibles.
     signed_in_as: 'Connecté·e en tant que :'
   verification:
-    explanation_html: 'Vous pouvez <strong>vérifier vous-même que vous êtes le propriétaire des liens dans les métadonnées de votre profil</strong>. Pour cela, le site Web lié doit contenir un lien vers votre profil Mastodon. Le lien de retour <strong>doit</strong>avoir un attribut <code>rel="me"</code>. Le contenu textuel du lien n’a pas d’importance. En voici un exemple :'
+    explanation_html: 'Vous pouvez <strong>vous vérifier en tant que propriétaire des liens dans les métadonnées de votre profil</strong>. Pour cela, le site web lié doit contenir un lien vers votre profil Mastodon. Le lien de retour <strong>doit</strong> avoir un attribut <code>rel="me"</code> . Le texte du lien n’a pas d’importance. Voici un exemple :'
     verification: Vérification
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 057b21566..9fa44456e 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -1,74 +1,74 @@
 ---
 gl:
   about:
-    about_hashtag_html: Estas son mensaxes públicas etiquetadas con <strong>#%{hashtag}</strong>. Podes interactuar con elas se tes unha conta nalgures do fediverso.
+    about_hashtag_html: Estes son toots públicos etiquetados con <strong>#%{hashtag}</strong>. Podes interactuar con eles se tes unha conta nalgures do fediverso.
     about_mastodon_html: Mastodon é unha rede social que se basea en protocolos web abertos e libres, software de código aberto. É descentralizada como o correo electrónico.
     about_this: Acerca de
     active_count_after: activas
     active_footnote: Usuarias Activas no Mes (UAM)
     administered_by: 'Administrada por:'
     api: API
-    apps: Apps móbiles
-    apps_platforms: Utiliza Mastodon desde iOS, Android e outras plataformas
-    browse_directory: Olla o directorio de perfís e filtra por intereses
-    browse_local_posts: Ler en directo o fluxo das publicacións públicas deste servidor
-    browse_public_posts: Vexa o fluxo de comentarios públicos en Mastodon
+    apps: Aplicacións móbiles
+    apps_platforms: Emprega Mastodon dende iOS, Android e outras plataformas
+    browse_directory: Navega polo directorio de perfís 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
     contact: Contacto
     contact_missing: Non establecido
-    contact_unavailable: N/A
-    discover_users: Descubre usuarias
+    contact_unavailable: Non dispoñíbel
+    discover_users: Descubrir usuarias
     documentation: Documentación
-    federation_hint_html: Con unha conta en %{instance} poderás seguir a outras persoas en calquera dos servidores Mastodon e incluso máis.
-    get_apps: Proba cunha app móbil
+    federation_hint_html: Cunha conta en %{instance} poderás seguir ás persoas en calquera servidor do Mastodon e alén.
+    get_apps: Probar unha aplicación móbil
     hosted_on: Mastodon aloxado en %{domain}
-    instance_actor_flash: 'Esta conta é un actor virtual utilizado para representar ao servidor e non a unha usuaria individual. Utilízase para propósitos de federación e non debería estar bloqueada a menos que queira bloquear a toda a instancia, en tal caso debería utilizar o bloqueo do dominio.
+    instance_actor_flash: 'Esta conta é un actor virtual utilizado para representar ao servidor e non a unha usuaria individual. Utilízase para propósitos de federación e non debería estar bloqueada a menos que queiras bloquear a toda a instancia, en tal caso deberías utilizar o bloqueo do dominio.
 
 '
     learn_more: Saber máis
-    privacy_policy: Política de intimidade
-    see_whats_happening: Mira o que acontece
-    server_stats: 'Estatísticas:'
+    privacy_policy: Política de privacidade
+    see_whats_happening: Ver o que está a acontecer
+    server_stats: 'Estatísticas do servidor:'
     source_code: Código fonte
     status_count_after:
       one: estado
       other: estados
     status_count_before: Que publicaron
-    tagline: Conecta coas amizades e fai outras novas
+    tagline: Segue ás túas amizades e coñece novas
     terms: Termos do servizo
-    unavailable_content: Contido non dispoñible
+    unavailable_content: Contido non dispoñíbel
     unavailable_content_description:
       domain: Servidor
-      reason: 'Razón:'
-      rejecting_media: Os ficheiros de medios de este servidor non se procesarán e non se mostrarán miniaturas, precisando solicitarse manualmente ao outro servidor.
-      silenced: As publicacións desde este servidor non se mostrarán en ningún lugar excepto no Inicio se segues ao autor.
-      suspended: Non poderás seguir a ninguén desde este servidor, e non se procesarán nin se gardarán datos que procedan del, e non se intercambiarán datos.
-    unavailable_content_html: Normalmente Mastodon permíteche ver contidos de outros servidores do fediverso e interactuar coas súas usuarias. Estas son as excepcións que se estableceron en este servidor particular.
+      reason: Razón
+      rejecting_media: 'Os ficheiros multimedia deste servidor non serán procesados e non se amosarán miniaturas, o que require un clic manual no ficheiro orixinal:'
+      silenced: 'As publicacións deste servidor non se amosarán en conversas e liñas temporais, nin terás notificacións das súas usuarias agás que as sigas:'
+      suspended: 'Non se procesarán, almacenarán nin intercambiarán datos destes servidores, o que fai imposíbel calquera interacción ou comunicación coas usuarias dende estes servidores:'
+    unavailable_content_html: O Mastodon de xeito xeral permíteche ver contidos doutros servidores do fediverso e interactuar coas súas usuarias. Estas son as excepcións que se estabeleceron neste servidor en particular.
     user_count_after:
       one: usuaria
       other: usuarias
     user_count_before: Fogar de
     what_is_mastodon: Qué é Mastodon?
   accounts:
-    choices_html: 'Eleccións de %{name}:'
-    endorsements_hint: Desde a interface web pode recomendar xente que segue, e aparecerán aquí.
-    featured_tags_hint: Pode destacar determinadas etiquetas que se mostrarán aquí.
+    choices_html: 'Escollas de %{name}:'
+    endorsements_hint: Podes suxerir a persoas que segues dende a interface web, e amosaranse aquí.
+    featured_tags_hint: Podes destacar determinadas etiquetas que se amosarán aquí.
     follow: Seguir
     followers:
       one: Seguidora
       other: Seguidoras
     following: Seguindo
-    joined: Uneuse %{date}
+    joined: Uniuse en %{date}
     last_active: última actividade
-    link_verified_on: A propiedade de esta ligazón foi comprobada en %{date}
-    media: Medios
+    link_verified_on: A propiedade desta ligazón foi verificada en %{date}
+    media: Multimedia
     moved_html: "%{name} mudouse a %{new_profile_link}:"
-    network_hidden: A información non está dispoñible
+    network_hidden: Esta información non está dispoñíbel
     never_active: Nunca
-    nothing_here: Nada por aquí!
-    people_followed_by: Personas que segue %{name}
-    people_who_follow: Personas que seguen a %{name}
+    nothing_here: Non hai nada aquí!
+    people_followed_by: Persoas que segue %{name}
+    people_who_follow: Persoas que seguen a %{name}
     pin_errors:
-      following: Debe seguir a persoa que intenta recomendar
+      following: Tes que seguir á persoa que queres engadir
     posts:
       one: Toot
       other: Toots
@@ -76,52 +76,53 @@ gl:
     posts_with_replies: Toots e respostas
     reserved_username: O nome de usuaria está reservado
     roles:
-      admin: Admin
+      admin: Administradora
       bot: Bot
-      moderator: Mod
-    unavailable: Perfil non dispoñible
+      group: Grupo
+      moderator: Moderadora
+    unavailable: Perfil non dispoñíbel
     unfollow: Deixar de seguir
   admin:
     account_actions:
-      action: Realizar acción
-      title: Realizar acción de moderación sobre %{acct}
+      action: Executar acción
+      title: Executar acción de moderación a %{acct}
     account_moderation_notes:
       create: Deixar nota
-      created_msg: Nota a moderación creada con éxito!
+      created_msg: Nota de moderación creada de xeito correcto!
       delete: Eliminar
-      destroyed_msg: Nota a moderación destruída con éxito!
+      destroyed_msg: Nota de moderación eliminada de xeito correcto!
     accounts:
       approve: Aprobar
-      approve_all: Aprobar todo
+      approve_all: Aprobar todos
       are_you_sure: Está segura?
-      avatar: Avatar
+      avatar: Imaxe de perfil
       by_domain: Dominio
       change_email:
-        changed_msg: Cambiouse correctamente o correo-e da conta!
-        current_email: Correo actual
-        label: Cambiar correo
-        new_email: Novo correo
-        submit: Cambiar correo
-        title: Cambiar o correo de %{username}
+        changed_msg: Email da conta mudado de xeito correcto!
+        current_email: Email actual
+        label: Mudar email
+        new_email: Novo email
+        submit: Mudar email
+        title: Mudar email de %{username}
       confirm: Confirmar
       confirmed: Confirmado
-      confirming: Confirmar
+      confirming: Estase a confirmar
       deleted: Eliminado
-      demote: Degradar
-      disable: Deshabilitar
-      disable_two_factor_authentication: Deshabilitar 2FA
-      disabled: Deshabilitado
-      display_name: Mostrar nome
+      demote: Rebaixar
+      disable: Desactivar
+      disable_two_factor_authentication: Desactivar 2FA
+      disabled: Desactivado
+      display_name: Nome a amosar
       domain: Dominio
       edit: Editar
-      email: Correo-e
-      email_status: Estado do correo
-      enable: Habilitar
-      enabled: Habilitado
+      email: Email
+      email_status: Estado do email
+      enable: Activar
+      enabled: Activado
       followers: Seguidoras
-      follows: Segue
+      follows: Seguindo
       header: Cabeceira
-      inbox_url: URL da Caixa de entrada
+      inbox_url: URL da caixa de entrada
       invited_by: Convidada por
       ip: IP
       joined: Uniuse
@@ -129,223 +130,237 @@ gl:
         all: Todo
         local: Local
         remote: Remoto
-        title: Lugar
-      login_status: Estado da conexión
-      media_attachments: Anexos de medios
-      memorialize: Convertir a lembranza
+        title: Localización
+      login_status: Estado da sesión
+      media_attachments: Multimedia adxunta
+      memorialize: Converter en lembranza
       moderation:
         active: Activa
         all: Todo
         pending: Pendente
-        silenced: Acalado
-        suspended: Suspendido
+        silenced: Silenciados
+        suspended: Suspendidos
         title: Moderación
       moderation_notes: Notas de moderación
       most_recent_activity: Actividade máis recente
       most_recent_ip: IP máis recente
-      no_account_selected: Non cambiou nada xa que non tiña nada seleccionado
+      no_account_selected: Ningunha conta mudou porque ningunha foi seleccionada
       no_limits_imposed: Sen límites impostos
-      not_subscribed: Non suscrita
-      pending: Pendente revisión
+      not_subscribed: Non subscrito
+      pending: Revisión pendente
       perform_full_suspension: Suspender
       promote: Promocionar
       protocol: Protocolo
       public: Público
-      push_subscription_expires: A suscrición PuSH caduca
+      push_subscription_expires: A subscrición PuSH expira
       redownload: Actualizar perfil
       reject: Rexeitar
       reject_all: Rexeitar todo
-      remove_avatar: Eliminar avatar
+      remove_avatar: Eliminar imaxe de perfil
       remove_header: Eliminar cabeceira
       resend_confirmation:
-        already_confirmed: Este usuario ya está confirmado
-        send: Reenviar el correo electrónico de confirmación
-        success: "¡Correo electrónico de confirmación enviado con éxito!"
-      reset: Restablecer
-      reset_password: Restablecer contrasinal
-      resubscribe: Voltar a suscribir
+        already_confirmed: Esta usuaria xa está confirmada
+        send: Reenviar o email de confirmación
+        success: Email de confirmación enviado de xeito correcto!
+      reset: Restabelecer
+      reset_password: Restabelecer contrasinal
+      resubscribe: Resubscribir
       role: Permisos
       roles:
         admin: Administrador
         moderator: Moderador
-        staff: Membresía
+        staff: Persoal (staff)
         user: Usuaria
-      search: Busca
-      search_same_ip: Outros usuarios co mesmo IP
+      search: Procurar
+      search_same_ip: Outras usuarias co mesmo IP
       shared_inbox_url: URL da caixa de entrada compartida
       show:
-        created_reports: Informes creados
-        targeted_reports: Informes feitos por outros
-      silence: Acalar
-      silenced: Acalada
+        created_reports: Denuncias feitas
+        targeted_reports: Denuncias feitas por outros
+      silence: Silenciar
+      silenced: Silenciado
       statuses: Estados
-      subscribe: Subscribir
-      suspended: Suspendida
-      time_in_queue: Agardando en cola %{time}
+      subscribe: Subscribirse
+      suspended: Suspendido
+      time_in_queue: Agardando na cola %{time}
       title: Contas
-      unconfirmed_email: Correo non confirmado
-      undo_silenced: Desfacer acalar
+      unconfirmed_email: Email non confirmado
+      undo_silenced: Desfacer silencio
       undo_suspension: Desfacer suspensión
-      unsubscribe: Non subscribir
+      unsubscribe: Desbotar a subscrición
       username: Nome de usuaria
       warn: Aviso
       web: Web
-      whitelisted: Lista branca
+      whitelisted: Listaxe branca
     action_logs:
       actions:
-        assigned_to_self_report: "%{name} asignou o informe %{target} a ela misma"
+        assigned_to_self_report: "%{name} atribuíu a denuncia %{target} a el mesmo"
         change_email_user: "%{name} cambiou o enderezo de correo-e da usuaria %{target}"
         confirm_user: "%{name} comfirmou o enderezo de correo da usuaria %{target}"
-        create_account_warning: "%{name} enviou un aviso sobre %{target}"
-        create_custom_emoji: "%{name} subeu un novo emoji %{target}"
+        create_account_warning: "%{name} enviou un aviso a %{target}"
+        create_announcement: "%{name} creou un novo anuncio %{target}"
+        create_custom_emoji: "%{name} subiu unha nova emoticona %{target}"
+        create_domain_allow: "%{name} engadiu á listaxe branca o dominio %{target}"
         create_domain_block: "%{name} bloqueou o dominio %{target}"
-        create_email_domain_block: "%{name} engadeu a lista negra o dominio de correo %{target}"
+        create_email_domain_block: "%{name} engadiu á listaxe negra o dominio de email %{target}"
         demote_user: "%{name} degradou a usuaria %{target}"
-        destroy_custom_emoji: "%{name} destruíu emoji %{target}"
+        destroy_announcement: "%{name} eliminou o anuncio %{target}"
+        destroy_custom_emoji: "%{name} eliminou a emoticona %{target}"
+        destroy_domain_allow: "%{name} eliminou o dominio %{target} da listaxe branca"
         destroy_domain_block: "%{name} desbloqueou o dominio %{target}"
-        destroy_email_domain_block: "%{name} meteu na lista blanca de correo o dominio %{target}"
+        destroy_email_domain_block: "%{name} engadiu á lista branca o dominio de email %{target}"
         destroy_status: "%{name} eliminou o estado de %{target}"
-        disable_2fa_user: "%{name} deshabilitou o requerimento 2FA para usuaria %{target}"
-        disable_custom_emoji: "%{name} deshabilitou emoji %{target}"
-        disable_user: "%{name} deshabilitou a conexión para a usuaria  %{target}"
-        enable_custom_emoji: "%{name} habilitou emoji %{target}"
-        enable_user: "%{name} habilitou a conexión para a usuaria %{target}"
-        memorialize_account: "%{name} converteu a conta de  %{target} nunha páxina para a lembranza"
+        disable_2fa_user: "%{name} desactivou o requirimento de dobre factor para a usuaria %{target}"
+        disable_custom_emoji: "%{name} desactivou a emoticona %{target}"
+        disable_user: "%{name} desactivou o acceso á conta para a usuaria %{target}"
+        enable_custom_emoji: "%{name} activou a emoticona %{target}"
+        enable_user: "%{name} activou o acceso á conta para a usuaria %{target}"
+        memorialize_account: "%{name} converteu a conta de %{target} nunha páxina para a lembranza"
         promote_user: "%{name} promoveu a usuaria %{target}"
-        remove_avatar_user: "%{name} eliminou o avatar de %{target}"
-        reopen_report: "%{name} voltou abrir informe  %{target}"
+        remove_avatar_user: "%{name} eliminou a imaxe de perfil de %{target}"
+        reopen_report: "%{name} reabriu a denuncia %{target}"
         reset_password_user: "%{name} restableceu o contrasinal da usuaria %{target}"
-        resolve_report: "%{name} solucionou o informe %{target}"
-        silence_account: "%{name} acalou a conta de %{target}"
+        resolve_report: "%{name} resolveu a denuncia %{target}"
+        silence_account: "%{name} silenciou a conta de %{target}"
         suspend_account: "%{name} suspendeu a conta de %{target}"
-        unassigned_report: "%{name} non asignou informe %{target}"
-        unsilence_account: "%{name} deulle voz a conta de %{target}"
-        unsuspend_account: "%{name} activou a conta de %{target}"
-        update_custom_emoji: "%{name} actualizou emoji %{target}"
-        update_status: "%{name} actualizou un estado de %{target}"
+        unassigned_report: "%{name} deixou de atribuír a denuncia %{target}"
+        unsilence_account: "%{name} deixou de silenciar a conta de %{target}"
+        unsuspend_account: "%{name} desactivou a suspensión da conta de %{target}"
+        update_announcement: "%{name} actualizou o anuncio %{target}"
+        update_custom_emoji: "%{name} actualizou a emoticona %{target}"
+        update_status: "%{name} actualizou o estado de %{target}"
       deleted_status: "(estado eliminado)"
       title: Rexistro de auditoría
+    announcements:
+      edit:
+        title: Editar anuncio
+      empty: Ningún anuncio atopado.
+      live: Ao vivo
+      new:
+        create: Crear anuncio
+        title: Novo anuncio
+      published: Publicado
+      time_range: Intre de tempo
+      title: Anuncios
     custom_emojis:
-      assign_category: Asignar categoría
+      assign_category: Atribuír categoría
       by_domain: Dominio
-      copied_msg: Creouse con éxito unha copia local dos emoji
+      copied_msg: Creouse unha copia local das emoticonas de xeito correcto
       copy: Copiar
       copy_failed_msg: Non se puido facer copia local de ese emoji
       create_new_category: Crear nova categoría
       created_msg: Creou o emoji con satisfactoriamente!
       delete: Eliminar
-      destroyed_msg: Emojo destruído satisfactoriamente!
-      disable: Deshabilitar
+      destroyed_msg: Emoticona eliminada de xeito correcto!
+      disable: Desactivar
       disabled: Desactivado
-      disabled_msg: Deshabilitouse correctamente ese emoji
-      emoji: Emoji
-      enable: Habilitar
+      disabled_msg: Desactivouse a emoticona de xeito correcto
+      emoji: Emoticona
+      enable: Activar
       enabled: Activado
-      enabled_msg: Habilitouse correctamente ese emoji
-      image_hint: PNG ate 50KB
-      list: A lista
+      enabled_msg: Activouse a emoticona de xeito correcto
+      image_hint: PNG de até 50KB
+      list: Listar
       listed: Listado
       new:
-        title: Engadir novo emoji persoalizado
+        title: Engadir nova emoticona personalizado
       overwrite: Sobrescribir
-      shortcode: Código corto
-      shortcode_hint: Cando menos 2 caracteres, só caracteres alfanuméricos e subliñados
-      title: Emojis persoalizados
-      uncategorized: Sen categorizar
-      unlist: Sacar da lista
-      unlisted: Non listado
-      update_failed_msg: Non se puido actualizar ese emoji
-      updated_msg: Actualizouse correctamente o emoji!
+      shortcode: Código curto
+      shortcode_hint: Polo menos 2 caracteres, só caracteres alfanuméricos e guións baixos
+      title: Emoticonas personalizadas
+      uncategorized: Sen categoría
+      unlist: Non listar
+      unlisted: Sen listar
+      update_failed_msg: Non foi posíbel actualizar a emoticona
+      updated_msg: Actualizouse a emoticona de xeito correcto!
       upload: Subir
     dashboard:
-      authorized_fetch_mode: Modo de obtención autorizado
-      backlog: traballos respaldados
+      authorized_fetch_mode: Modo seguro
+      backlog: traballos en espera
       config: Axustes
-      feature_deletions: Borrado de contas
+      feature_deletions: Eliminacións da conta
       feature_invites: Ligazóns de convite
       feature_profile_directory: Directorio do perfil
       feature_registrations: Rexistros
-      feature_relay: Repetidores de federación
+      feature_relay: Repetidor da federación
       feature_spam_check: Anti-spam
-      feature_timeline_preview: Vista previa da TL
-      features: Características
-      hidden_service: Federación con servizos ocultos
-      open_reports: informes abertos
-      pending_tags: etiquetas agardando revisión
+      feature_timeline_preview: Vista previa da cronoloxía
+      features: Funcións
+      hidden_service: Federación con servizos agochados
+      open_reports: denuncias abertas
+      pending_tags: cancelos agardando revisión
       pending_users: usuarias agardando revisión
       recent_users: Usuarias recentes
-      search: Busca de texto completo
-      single_user_mode: Modo de usuario individual
+      search: Procura por texto completo
+      single_user_mode: Modo de usuaria única
       software: Software
-      space: Uso de espazo
+      space: Uso de almacenamento
       title: Taboleiro
-      total_users: total de usuarias
+      total_users: usuarias en total
       trends: Tendencias
-      week_interactions: interaccións en esta semana
-      week_users_active: activas estas semana
+      week_interactions: interaccións desta semana
+      week_users_active: activos desta semana
       week_users_new: usuarias esta semana
-      whitelist_mode: Modo de lista branca
+      whitelist_mode: Modo de listaxe branca
     domain_allows:
-      add_new: Dominio en lista branca
+      add_new: Engadir dominio á listaxe branca
       created_msg: Engadeu o dominio a lista branca
       destroyed_msg: Quitou o dominio da lista branca
-      undo: Eliminar da lista branca
+      undo: Eliminar da listaxe branca
     domain_blocks:
       add_new: Engadir novo bloqueo de dominio
       created_msg: Estase a procesar o bloqueo do dominio
-      destroyed_msg: Desfixose a acción de bloqueo de dominio
+      destroyed_msg: Desfíxose o bloqueo de dominio
       domain: Dominio
       edit: Editar bloqueo de dominio
-      existing_domain_block_html: Xa estableceu límites estrictos para %{name}, precisa <a href="%{unblock_url}">desbloqueala</a> primeiro.
+      existing_domain_block_html: Xa impuxeches límites máis estrictos a %{name}, precisas <a href="%{unblock_url}">desbloquealo</a> primeiro.
       new:
-        create: Crear bloque
+        create: Crear bloqueo
         hint: O bloqueo do dominio non previrá a creación de entradas de contas na base de datos, pero aplicará de xeito retroactivo e automático regras específicas de moderación sobre esas contas.
         severity:
-          desc_html: "<strong>Silenciar</strong> fará invisibles as mensaxes das contas para calquera que non os siga. <strong>Suspender</strong> eliminará todo o contido das contas, ficheiros de medios, e datos de perfil. Utilice <strong>Ningún</strong> si só quere rexeitar ficheiros de medios."
+          desc_html: "<strong>Silenciar</strong> fará invisíbeis as mensaxes das contas para calquera que non os siga. <strong>Suspender</strong> eliminará todo o contido das contas, ficheiros multimedia, e datos de perfil. Emprega a opción de <strong>Ningún</strong> se só queres rexeitar ficheiros multimedia."
           noop: Ningún
           silence: Silenciar
           suspend: Suspender
         title: Novo bloqueo de dominio
       private_comment: Comentario privado
-      private_comment_hint: Comentar entre moderadores para uso interno as limitacións de este dominio.
+      private_comment_hint: Comentar sobre esta limitación de dominio para uso interno polos moderadores.
       public_comment: Comentario público
-      public_comment_hint: Comentar sobre as limitacións de este dominio para o interese público, se o aviso da lista de dominios limitados está activado.
-      reject_media: Rexeitar ficheiros de medios
-      reject_media_hint: Eliminar ficheiros de medios almacenados localmente e rexeita descargalos no futuro. Irrelevante para as suspensións
-      reject_reports: Rexeitar informes
-      reject_reports_hint: Ignorar todos os informes procedentes de este dominio. Irrelevante para as suspensións
-      rejecting_media: rexeitando ficheiros de medios
-      rejecting_reports: rexeitando informes
+      public_comment_hint: Comentar sobre esta limitación de dominio para o público xeral, se está activado o aviso da listaxe de limitacións de dominio.
+      reject_media: Rexeitar ficheiros multimedia
+      reject_media_hint: Eliminar ficheiros multimedia almacenados de xeito local e rexeita descargalos no futuro. Irrelevante para as suspensións
+      reject_reports: Rexeitar denuncias
+      reject_reports_hint: Ignorar todas as denuncias procedentes deste dominio. Irrelevante para as suspensións
+      rejecting_media: rexeitando ficheiros multimedia
+      rejecting_reports: rexeitando denuncias
       severity:
-        silence: acalado
+        silence: silenciado
         suspend: suspendido
       show:
         affected_accounts:
-          one: Afectoulle a unha conta na base de datos
-          other: Afectoulle a %{count} contas na base de datos
+          one: Unha conta na base de datos afectada
+          other: "%{count} contas na base de datos afectadas"
         retroactive:
-          silence: Non silenciar todas as contas existentes de este dominio
-          suspend: Non suspender todas as contas existentes de este dominio
+          silence: Deixar de silenciar todas as contas existentes deste dominio
+          suspend: Desbotar suspenso de todas as contas existentes deste dominio
         title: Desfacer o bloqueo de dominio para %{domain}
         undo: Desfacer
       undo: Desfacer bloqueo de dominio
-      view: Ver dominios bloqueados
+      view: Ollar dominios bloqueados
     email_domain_blocks:
       add_new: Engadir novo
-      created_msg: Engadeuse correctamente o dominio de email a lista negra
+      created_msg: Engadiuse de xeito correcto o dominio de email á listaxe negra
       delete: Eliminar
-      destroyed_msg: Eliminouse correctamente o dominio de e-mail da lista negra
+      destroyed_msg: Eliminouse de xeito correcto o dominio de email da listaxe negra
       domain: Dominio
+      empty: Actualmente non hai dominios de email na listaxe negra.
       new:
         create: Engadir dominio
-        title: Nova entrada la lista negra de e-mail
-      title: Lista negra de E-mail
-    followers:
-      back_to_account: Voltar a Conta
-      title: Seguidoras de %{acct}
+        title: Nova entrada na listaxe negra de email
+      title: Listaxe negra de email
     instances:
       by_domain: Dominio
-      delivery_available: A entrega está dispoñible
+      delivery_available: Entrega dispoñíbel
       known_accounts:
         one: "%{count} conta coñecida"
         other: "%{count} contas coñecidas"
@@ -357,98 +372,110 @@ gl:
       public_comment: Comentario público
       title: Federación
       total_blocked_by_us: Bloqueado por nós
-      total_followed_by_them: Seguidas por eles
-      total_followed_by_us: Seguidas por nós
-      total_reported: Informes sobre elas
-      total_storage: Anexos de medios
+      total_followed_by_them: Seguidos por eles
+      total_followed_by_us: Seguidos por nós
+      total_reported: Denuncias sobre eles
+      total_storage: Adxuntos multimedia
     invites:
       deactivate_all: Desactivar todo
       filter:
         all: Todo
-        available: Dispoñible
-        expired: Cadudado
+        available: Dispoñíbel
+        expired: Expirado
         title: Filtro
-      title: Convida
+      title: Convites
     pending_accounts:
       title: Contas pendentes (%{count})
+    relationships:
+      title: Relacións de %{acct}
     relays:
       add_new: Engadir un novo repetidor
       delete: Eliminar
       description_html: Un <strong>repetidor da federación</strong> é un servidor intermedio que intercambia grandes volumes de toots públicos entre servidores que se suscriban e publiquen nel. <strong>Pode axudar a servidores pequenos e medios a descubrir contido no fediverso</strong>, o que de outro xeito precisaría que as usuarias locais seguisen a outra xente en servidores remotos.
       disable: Desactivar
-      disabled: Desactivada
+      disabled: Desactivado
       enable: Activar
-      enable_hint: Unha vez activado, o seu servidor suscribirase a todos os toots públicos de este servidor, e tamén comezará a eviar a el os toots públicos do servidor.
-      enabled: Activada
+      enable_hint: Unha vez activado, o teu servidor subscribirase a todos os toots públicos deste repetidor, e tamén comezará a enviar a el os toots públicos do servidor.
+      enabled: Activado
       inbox_url: URL do repetidor
-      pending: Agardando polo permiso do repetidor
+      pending: Agardando pola aprobación do repetidor
       save_and_enable: Gardar e activar
-      setup: Configurar a conexión ao repetidor
-      signatures_not_enabled: Os repetidores non funcionarán correctamente se o modo seguro ou lista branca están activados
+      setup: Configurar unha conexión ó repetidor
+      signatures_not_enabled: Os repetidores non funcionarán de xeito correcto se o modo seguro ou listaxe branca están activados
       status: Estado
       title: Repetidores
     report_notes:
-      created_msg: Creouse correctamente a nota do informe!
-      destroyed_msg: Nota do informe eliminouse con éxito!
+      created_msg: A nota da denuncia creouse de xeito correcto!
+      destroyed_msg: A nota da denuncia borrouse de xeito correcto!
     reports:
+      account:
+        notes:
+          one: "%{count} nota"
+          other: "%{count} notas"
+        reports:
+          one: "%{count} denuncia"
+          other: "%{count} denuncias"
       action_taken_by: Acción tomada por
-      are_you_sure: Está segura?
-      assign_to_self: Asignarmo
+      are_you_sure: Estás seguro?
+      assign_to_self: Asignarme
       assigned: Moderador asignado
+      by_target_domain: Dominio da conta denunciada
       comment:
-        none: Nada
-      created_at: Reportado
+        none: Ningún
+      created_at: Denunciado
       mark_as_resolved: Marcar como resolto
       mark_as_unresolved: Marcar como non resolto
       notes:
         create: Engadir nota
-        create_and_resolve: Resolver con nota
-        create_and_unresolve: Voltar a abrir con nota
+        create_and_resolve: Resolver cunha nota
+        create_and_unresolve: Reabrir cunha nota
         delete: Eliminar
-        placeholder: Describe qué medidas foron tomadas, ou calquer outra información relacionada...
-      reopen: Voltar a abrir o informe
-      report: 'Informe #%{id}'
-      reported_account: Conta reportada
-      reported_by: Reportada por
+        placeholder: Describir que accións foron tomadas ou calquera outra novidade sobre esta denuncia...
+      reopen: Reabrir denuncia
+      report: 'Denuncia #%{id}'
+      reported_account: Conta denunciada
+      reported_by: Denunciado por
       resolved: Resolto
-      resolved_msg: Resolveuse con éxito o informe!
+      resolved_msg: Resolveuse con éxito a denuncia!
       status: Estado
-      title: Informes
+      title: Denuncias
       unassign: Non asignar
       unresolved: Non resolto
       updated_at: Actualizado
     settings:
       activity_api_enabled:
-        desc_html: Conta de estados publicados localmente, usuarias activas, e novos rexistros por semana
+        desc_html: Conta de estados publicados de xeito local, usuarias activas, e novos rexistros en períodos semanais
         title: Publicar estatísticas agregadas sobre a actividade da usuaria
       bootstrap_timeline_accounts:
-        desc_html: Separar múltiples nomes de usuaria con vírgulas. Só funcionarán as contas locais non bloqueadas. Si baldeiro, por omisión son todos os local admin.
-        title: Seguimentos por omisión para novas usuarias
+        desc_html: Separar os múltiples nomes de usuaria con vírgulas. Só funcionarán as contas locais non bloqueadas. Se fica baleiro, serán todos os administradores locais.
+        title: Seguimentos por defecto para novas contas
       contact_information:
-        email: e-mail de traballo
+        email: Email de negocios
         username: Nome de usuaria de contacto
       custom_css:
-        desc_html: Modificar o aspecto con CSS cargado en cada páxina
-        title: CSS persoalizado
+        desc_html: Modificar a aparencia con CSS cargado en cada páxina
+        title: CSS personalizado
       default_noindex:
         desc_html: Aféctalle a todas as usuarias que non cambiaron os axustes elas mesmas
         title: Por omisión exclúe as usuarias do indexado por servidores de busca
       domain_blocks:
-        all: Para todas
+        all: Para todos
         disabled: Para ninguén
-        title: Mostrar dominios bloqueados
+        title: Amosar dominios bloqueados
         users: Para usuarias locais conectadas
       domain_blocks_rationale:
-        title: Mostrar razón
+        title: Amosar motivo
+      enable_bootstrap_timeline_accounts:
+        title: Activar seguimentos por omisión para novas usuarias
       hero:
-        desc_html: Mostrado na portada. Recoméndase 600x100px como mínimo. Se non se establece, mostrará a imaxe por omisión do servidor
-        title: Imáxe Heróe
+        desc_html: Amosado na páxina principal. Polo menos 600x100px recomendados. Se non está definido, estará por defecto a miniatura do servidor
+        title: Imaxe do heroe
       mascot:
-        desc_html: Mostrado en varias páxinas. Recoméndase 293x205 como mínimo. Se non se establece publícase a mascota por omisión
+        desc_html: Amosado en varias páxinas. Polo menos 293x205px recomendados. Se non está definido, estará a mascota por defecto
         title: Imaxe da mascota
       peers_api_enabled:
         desc_html: Nomes de dominio que este servidor atopou no fediverso
-        title: Publicar lista de servidores descubertos
+        title: Publicar listaxe de servidores descobertos
       preview_sensitive_media:
         desc_html: A vista previa de ligazóns de outros sitios web mostrará unha imaxe incluso si os medios están marcados como sensibles
         title: Mostrar medios sensibles con vista previa OpenGraph
@@ -482,13 +509,13 @@ gl:
         title: Descrición do servidor
       site_description_extended:
         desc_html: Un bo lugar para o seu código de conducta, regras, guías e outras cousas que distingan ao seu servidor. Pode utilizar etiquetas HTML
-        title: Información extendida da persoalización
+        title: Información extendida da personalización
       site_short_description:
-        desc_html: Mostrado na barra lateral e nas etiquetas meta. Describe o que é Mastodon e que fai especial a este servidor nun só parágrafo. Si está baldeiro, mostrará a descrición do servidor.
+        desc_html: Mostrado na barra lateral e nas etiquetas meta. Describe o que é Mastodon e que fai especial a este servidor nun só parágrafo. Se está baldeiro, mostrará a descrición do servidor.
         title: Descrición curta do servidor
       site_terms:
         desc_html: Pode escribir a súa propia política de intimidade, termos de servizo ou aclaracións legais. Pode utilizar etiquetas HTML
-        title: Termos de servizo persoalizados
+        title: Termos de servizo personalizados
       site_title: Nome do servidor
       spam_check_enabled:
         desc_html: Mastodon pode silenciar e informar automáticamente sobre contas baseándose en medidas como detectar contas que envían mensaxes non solicitadas de xeito repetido. Podería haber falsos positivos.
@@ -554,7 +581,7 @@ gl:
       body_remote: Alguén desde %{domain} informou sobre %{target}
       subject: Novo informe sobre %{instance} (#%{id})
     new_trending_tag:
-      body: 'A etiqueta #%{name} é tendencia hoxe, pero non foi previamente revisada. Non se mostrará publicamente a menos que vostede o permita, ou garde o formulario para facer que non se lle consulte de novo.'
+      body: 'A etiqueta #%{name} é tendencia hoxe, pero non foi previamente revisada. Non se mostrará publicamente a menos que ti o permitas, ou gardes o formulario para facer que non se che consulte de novo.'
       subject: Unha nova etiqueta que revisar en %{instance} (#%{name})
   aliases:
     add_new: Crear alcume
@@ -568,6 +595,10 @@ gl:
     animations_and_accessibility: Animacións e accesibilidade
     confirmation_dialogs: Diálogos de confirmación
     discovery: Descubrir
+    localization:
+      body: Mastodon tradúceno persoas voluntarias.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Todas podemos contribuír.
     sensitive_content: Contido sensible
     toot_layout: Disposición do toot
   application_mailer:
@@ -591,7 +622,7 @@ gl:
     checkbox_agreement_html: Acepto as <a href="%{rules_path}" target="_blank">regras do servidor</a> e os <a href="%{terms_path}" target="_blank">termos do servizo</a>
     checkbox_agreement_without_rules_html: Acepto os <a href="%{terms_path}" target="_blank">termos do servizo</a>
     delete_account: Eliminar conta
-    delete_account_html: Se desexa eliminar a súa conta, pode <a href="%{path}">facelo aquí</a>. Pediráselle confirmación.
+    delete_account_html: Se queres eliminar a túa conta, podes <a href="%{path}">facelo aquí</a>. Deberás confirmar a acción.
     description:
       prefix_invited_by_user: "@%{name} convídate a que te unas a este servidor Mastodon!"
       prefix_sign_up: Rexístrate agora en Mastodon!
@@ -602,7 +633,7 @@ gl:
     login: Conectar
     logout: Desconectar
     migrate_account: Mover a unha conta diferente
-    migrate_account_html: Se desexa redirixir esta conta hacia outra diferente, pode <a href="%{path}">configuralo aquí</a>.
+    migrate_account_html: Se queres redirixir esta conta hacia outra diferente, pode <a href="%{path}">configuralo aquí</a>.
     or_log_in_with: ou conectar con
     providers:
       cas: CAS
@@ -640,6 +671,9 @@ gl:
     hint_html: "<strong>Nota:</strong> Non che pediremos o contrasinal na seguinte hora."
     invalid_password: Contrasinal incorrecto
     prompt: Confirma o contrasinal para continuar
+  date:
+    formats:
+      default: "%d %b, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}h"
@@ -669,8 +703,8 @@ gl:
       email_reconfirmation_html: Se non recibes o correo de confirmación, podes <a href="%{path}">solicitalo de novo</a>
       irreversible: Non poderás restaurar ou reactivar a conta
       more_details_html: Para máis detalles, mira a <a href="%{terms_path}">política de intimidade</a>.
-      username_available: O nome de usuario estará dispoñible novamente
-      username_unavailable: O nome de usuario non estará dispoñible
+      username_available: O nome de usuaria estará dispoñible novamente
+      username_unavailable: O nome de usuaria non estará dispoñible
   directories:
     directory: Directorio de perfil
     explanation: Descubre usuarias según o teu interese
@@ -706,7 +740,6 @@ gl:
     blocks: A bloquear
     csv: CSV
     domain_blocks: Bloqueos de dominio
-    follows: A seguir
     lists: Listas
     mutes: Acalou
     storage: Almacenamento de medios
@@ -717,6 +750,7 @@ gl:
     hint_html: "<strong>¿Qué son as etiquetas destacadas?</strong> Móstranse destacadas no seu perfil público e permítenlle a outras persoas ver os seus toots públicos nos que as utilizou. Son unha ferramenta moi útil para facer seguimento de traballos creativos e proxectos a longo prazo."
   filters:
     contexts:
+      account: Perfís
       home: Liña temporal inicial
       notifications: Avisos
       public: Liñas temporais públicas
@@ -728,6 +762,7 @@ gl:
       invalid_irreversible: O filtrado non reversible só funciona con contexto de avisos ou Inicio
     index:
       delete: Eliminar
+      empty: Non tes filtros.
       title: Filtros
     new:
       title: Engadir novo filtro
@@ -740,6 +775,8 @@ gl:
     all: Todo
     changes_saved_msg: Cambios gardados correctamente!!
     copy: Copiar
+    delete: Eliminar
+    edit: Editar
     no_batch_actions_available: Non hai accións en pila dispoñibles nesta páxina
     order_by: Ordenar por
     save_changes: Gardar cambios
@@ -758,7 +795,7 @@ gl:
         invalid_token: Os testemuños Keybase son hashes de firma e deben ter 66 caracteres hexadecimais
         verification_failed: Keybase non recoñece este testemuño como firma da usuaria de Keybase %{kb_username}. Por favor inténteo desde Keybase.
       wrong_user: Non se puido crear a proba para %{proving} mentras está conectada como %{current}. Conéctate como %{proving} e inténtao de novo.
-    explanation_html: Aquí pódese conectar criptográficamente as suas outras identidades, como a un perfil Keybase. Esto permitelle a outras persoas enviarlle mensaxes cifradas e confiar no contido que vostede lle envía.
+    explanation_html: Aquí podes conectar criptográficamente as tuas outras identidades, como a un perfil Keybase. Esto permítelle a outras persoas enviarche mensaxes cifradas e confiar no contido que ti lles envías.
     i_am_html: Eu son %{username} en %{service}.
     identity: Identidade
     inactive: Inactiva
@@ -793,7 +830,7 @@ gl:
       '86400': 1 día
     expires_in_prompt: Nunca
     generate: Xerar
-    invited_by: 'Vostede foi convidada por:'
+    invited_by: 'Convidoute:'
     max_uses:
       one: 1 uso
       other: "%{count} usos"
@@ -856,11 +893,11 @@ gl:
       title: Na súa ausencia...
     favourite:
       body: 'O seu estado foi marcado favorito por %{name}:'
-      subject: "%{name} marcou favorito o seu estado"
+      subject: "%{name} marcou favorito o teu estado"
       title: Nova favorita
     follow:
-      body: "%{name} agora está a seguila!"
-      subject: "%{name} agora está a seguila"
+      body: Agora %{name} séguete!
+      subject: Agora %{name} séguete
       title: Nova seguidora
     follow_request:
       action: Xestionar peticións de seguimento
@@ -870,12 +907,16 @@ gl:
     mention:
       action: Respostar
       body: 'Foi mencionada por %{name} en:'
-      subject: Vostede foi mencionada por %{name}
+      subject: Foches mencionada por %{name}
       title: Nova mención
     reblog:
       body: 'O seu estado foi promocionado por %{name}:'
-      subject: "%{name} promoveu o seu estado"
+      subject: "%{name} promoveu o teu estado"
       title: Nova promoción
+  notifications:
+    email_events: Eventos para os correos de notificación
+    email_events_hint: 'Escolle os eventos sobre os que queres recibir notificacións:'
+    other_settings: Outros axustes das notificacións
   number:
     human:
       decimal_units:
@@ -894,11 +935,12 @@ gl:
     truncate: "&hellip;"
   polls:
     errors:
-      already_voted: Xa votou en esta sondaxe
+      already_voted: Xa votaches nesta enquisa
       duplicate_options: contén elementos duplicados
       duration_too_long: está moi lonxe no futuro
       duration_too_short: é demasiado cedo
-      expired: A sondaxe rematou
+      expired: A enquisa rematou
+      invalid_choice: A opción de voto escollida non existe
       over_character_limit: non poden ter máis de %{max} caracteres cada unha
       too_few_options: debe ter máis de unha opción
       too_many_options: non pode haber máis de %{max} opcións
@@ -906,9 +948,15 @@ gl:
     other: Outro
     posting_defaults: Valores por omisión
     public_timelines: Liñas temporais públicas
+  reactions:
+    errors:
+      unrecognized_emoji: non é unha emoticona recoñecida
   relationships:
     activity: Actividade da conta
     dormant: En repouso
+    followers: Seguidoras
+    following: Seguindo
+    invited: Convidado
     last_active: Último activo
     most_recent: Máis recente
     moved: Movida
@@ -924,18 +972,18 @@ gl:
     missing_resource: Non se puido atopar o URL de redirecionamento requerido para a súa conta
     no_account_html: Non ten unha conta? Pode <a href='%{sign_up_path}' target='_blank'>rexistrarse aquí</a>
     proceed: Proceda para seguir
-    prompt: 'Vostede vai seguir:'
+    prompt: 'Vas seguir a:'
     reason_html: "<strong>Por que é necesario este paso?</strong><code>%{instance}</code> podería non ser o servidor onde se rexistrou, así que precisamo redirixila primeiro ao seu servidor de orixe."
   remote_interaction:
     favourite:
       proceed: Darlle a favorito
-      prompt: 'Vostede quere favorecer este toot:'
+      prompt: 'Vas marcar favorito este toot:'
     reblog:
       proceed: Darlle a promocionar
-      prompt: 'Vostede quere promocionar este toot:'
+      prompt: 'Vas promocionar este toot:'
     reply:
       proceed: Respostar
-      prompt: 'Vostede quere respostar a este toot:'
+      prompt: 'Vas responder a este toot:'
   scheduled_statuses:
     over_daily_limit: Excedeu o límite de %{limit} toots programados para ese día
     over_total_limit: Excedeu o límite de %{limit} toots programados
@@ -1056,9 +1104,9 @@ gl:
       <h3 id="collect">Qué información recollemos?</h3>
 
       <ul>
-      <li><em>Información básica da conta</em>: Si se rexistra en este servidor, pediráselle un nome de usuaria, un enderezo de correo electrónico e un contrasinal. De xeito adicional tamén poderá introducir 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 publicamente.</li>
+      <li><em>Información básica da conta</em>: Se se rexistra en este servidor, pediráselle un nome de usuaria, un enderezo de correo electrónico e un contrasinal. De xeito adicional tamén poderá introducir 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 publicamente.</li>
       <li><em>Publicacións, seguimento e outra información pública</em>: O listado das persoas que segue é un listado público, o mesmo acontece coas súas seguidoras. Cando evía unha mensaxe, a data e hora gárdanse así como o aplicativo que utilizou para enviar a mensaxe. As publicacións poderían conter ficheiros de medios anexos, como fotografías e vídeos. As publicacións públicas e as non listadas están dispoñibles de xeito público. Cando destaca unha publicación no seu perfil tamén é pública. As publicacións son enviadas as súas seguidoras, en algúns casos pode acontecer que estén en diferentes servidores e gárdanse copias neles. Cando elemina unha publicación tamén se envía as súas seguidoras. A acción de voltar 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 as súas seguidoras e as usuarias que son mencionadas en elas, e as mensaxes directas entréganse só as usuarias mencionadas en elas. En algúns casos esto implica que son entregadas a diferentes servidores e gárdanse copias alí. Facemos un esforzo sincero para limitar o acceso a esas publicacións só as persoas autorizadas, pero outros servidores poderían non ser tan escrupulosos. Polo tanto, é importante revisar os servidores onde se hospedan as súas seguidoras. Nos axustes pode activar a opción de aprovar ou rexeitar novas seguidoras de xeito manual.  <em>Teña 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 voltar a compartir as mensaxes. <em>Non comparta información comprometida en Mastodon.</em></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 as súas seguidoras e as usuarias que son mencionadas en elas, e as mensaxes directas entréganse só as usuarias mencionadas en elas. En algúns casos esto implica que son entregadas a diferentes servidores e gárdanse copias alí. Facemos un esforzo sincero para limitar o acceso a esas publicacións só as persoas autorizadas, pero outros servidores poderían non ser tan escrupulosos. Polo tanto, é importante revisar os servidores onde se hospedan as súas seguidoras. Nos axustes pode activar a opción de aprovar ou rexeitar novas seguidoras de xeito manual. <em>Teña 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 voltar a compartir as mensaxes. <em>Non comparta información comprometida en Mastodon.</em></li>
       <li><em>IPs e outros metadatos</em>: Cando se conecta, gravamos o IP desde onde se conecta, así como o nome do aplicativo desde onde o fai. 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>
 
@@ -1069,7 +1117,7 @@ gl:
       <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ó pode interactuar co contido de outra xente e publicar o seu propio contido si está conectada. Por exemplo, podería seguir outra xente e ver as súas publicacións combinadas nunha liña temporal inicial persoalizada.</li>
+      <li>Para proporcionar a funcionabiliade básica de Mastodon. Só pode interactuar co contido de outra xente e publicar o seu propio contido se está conectada. Por exemplo, podería seguir outra xente e ver as súas publicacións combinadas nunha liña temporal inicial personalizada.</li>
       <li>Para axudar a moderar a comunidade, por exemplo comparando o seu enderezo IP con outros coñecidos para evitar esquivar os rexeitamentos ou outras infraccións.</li>
       <li>O endero de correo electrónico que nos proporciona podería ser utilizado para enviarlle información, notificacións sobre outra xente que interactúa cos seus contidos ou lle envía mensaxes, e para respostar a consultas, e/ou outras cuestións ou peticións.</li>
       </ul>
@@ -1078,7 +1126,7 @@ gl:
 
       <h3 id="protect">Cómo proxetemos os seus datos?</h3>
 
-      <p>Implementamos varias medidas de seguridade para protexer os seus datos personais cando introduce, envía ou accede a súa información persoal. Entre outras medidas, a súa sesión de navegación, así como o tráfico entre os seus aplicativos e o API están aseguradas mediante SSL, e o seu contrasinal está camuflado utilizando un algoritmo potente de unha sóa vía. Pode habilitar a autenticación de doble factor para protexer o acceso a súa conta aínda máis.</p>
+      <p>Implementamos varias medidas de seguridade para protexer os seus datos persoais cando introduce, envía ou accede a súa información persoal. Entre outras medidas, a súa sesión de navegación, así como o tráfico entre os seus aplicativos e o API están aseguradas mediante SSL, e o seu contrasinal está camuflado utilizando un algoritmo potente de unha sóa vía. Pode habilitar a autenticación de doble factor para protexer o acceso a súa conta aínda máis.</p>
 
       <hr class="spacer" />
 
@@ -1099,7 +1147,7 @@ gl:
 
       <h3 id="cookies">Utilizamos testemuños?</h3>
 
-      <p>Si. Os testemuños son pequenos ficheiros que un sitio web ou o provedor de servizo transfiren ao disco duro da súa computadora a través do navegador web (si vostede o permite). Estos testemuños posibilitan ao sitio web recoñecer o seu navegador e, si ten unha conta rexistrada, asocialo con dita conta.</p>
+      <p>Si. Os testemuños son pequenos ficheiros que un sitio web ou o provedor de servizo transfiren ao disco duro da súa computadora a través do navegador web (se vostede o permite). Estos testemuños posibilitan ao sitio web recoñecer o seu navegador e, se ten unha conta rexistrada, asocialo con dita conta.</p>
 
       <p>Utilizamos testemuños para comprender e gardar as súas preferencias para futuras visitas.</p>
 
@@ -1107,7 +1155,7 @@ gl:
 
       <h3 id="disclose">Entregamos algunha información a terceiras alleas?</h3>
 
-      <p>Non vendemos, negociamos ou transferimos de algún xeito a terceiras partes alleas a súa información identificativa persoal. Esto non inclúe terceiras partes de confianza que nos axudan a operar o sitio web, a xestionar a empresa, ou darlle servizo si esas partes aceptan manter esa información baixo confidencialidade. Poderiamos liberar esa información si 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>Non vendemos, negociamos ou transferimos de algún xeito a terceiras partes alleas a súa información identificativa persoal. Esto non inclúe terceiras partes de confianza que nos axudan a operar o sitio web, a xestionar a empresa, ou darlle 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 seu contido público podería ser descargado por outros servidores na rede. As súas publicacións públicas e para só seguidoras son entregadas aos servidores onde residen as sú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>
 
@@ -1117,9 +1165,9 @@ gl:
 
       <h3 id="children">Utilización do sitio web por menores</h3>
 
-      <p>Si 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. Si ten 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 utilice esta web.</p>
+      <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 ten 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 utilice esta web.</p>
 
-      <p>Si este servidor está nos EEUU: a nosa web, productos e servizos están dirixidos a persoas de 13 ou máis anos. Si non ten 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 utilice 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 ten 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 utilice esta web.</p>
 
       <p>Os requerimentos legais poden ser diferentes si este servidor está baixo outra xurisdición.</p>
 
@@ -1127,7 +1175,7 @@ gl:
 
       <h3 id="changes">Cambios na nosa política de intimidade</h3>
 
-      <p>Si decidimos cambiar a nosa política de intimidade publicaremos os cambios en esta páxina.</p>
+      <p>Se decidimos cambiar a nosa política de intimidade publicaremos os cambios en esta páxina.</p>
 
       <p>Este documento ten licenza CC-BY-SA. Actualizouse o 7 de Marzo de 2018.</p>
 
@@ -1149,7 +1197,7 @@ gl:
     enabled: A autenticación de dobre-factor está activada
     enabled_success: Activouse con éxito a autenticación de dobre-factor
     generate_recovery_codes: Xerar códigos de recuperación
-    instructions_html: "<strong>Escanee este código QR en Google Authenticator ou aplicativo TOTP similar no seu teléfono</strong>. Desde agora, este aplicativo xerará testemuños que vostede deberá introducir ao conectarse."
+    instructions_html: "<strong>Escanea este código QR en Google Authenticator ou aplicación TOTP no teu teléfono</strong>. Desde agora, esta aplicación proporcionará testemuños que debes introducir ao conectarte."
     lost_recovery_codes: Os códigos de recuperación permítenlle recuperar o acceso a súa conta si perde o teléfono. Si perde os códigos de recuperación, pode restauralos aquí. Os seus códigos de recuperación anteriores serán invalidados.
     manual_instructions: 'Si non pode escanear o código QR e precisa introducilo manualmente, aquí está o testemuño secreto en texto plano:'
     recovery_codes: Códigos de recuperación do respaldo
@@ -1165,7 +1213,7 @@ gl:
     warning:
       explanation:
         disable: Cando a súa conta está conxelada, os datos permanecen intactos, pero non pode levar a fin accións ate que se desbloquea.
-        silence: Mentras a conta está limitada, só a xente que actualmente a segue verá os seus toots en este servidor, e vostede podería estar excluída de varias listas públicas. Porén, outras persoas poderíana seguila de xeito manual.
+        silence: Mentras a conta está limitada, só a xente que actualmente te segue verá os teus toots en este servidor, e poderías estar excluída de varias listaxes públicas. Porén, outras persoas poderíante seguir de xeito manual.
         suspend: A súa conta foi suspendida, e todos os seus toots e medios subidos foron eliminados de este servidor de xeito irreversible, e dos servidores onde tivese seguidoras.
       get_in_touch: Pode responder a este correo para contactar coa administración de %{instance}.
       review_server_policies: Revisar políticas do servidor
@@ -1182,7 +1230,7 @@ gl:
         suspend: Conta suspendida
     welcome:
       edit_profile_action: Configurar perfil
-      edit_profile_step: Vostede pode persoalizar o seu perfil subindo un avatar, cabeceira, cambiar o seu nome público e aínda máis. Si restrinxe a súa conta pode revisar a conta das personas que solicitan seguilas antes de permitirlles o acceso aos seus toots.
+      edit_profile_step: Podes personalizar o teu perfil subindo un avatar, cabeceira, cambiar o nome público e aínda máis. Se restrinxes a tua conta podes revisar a conta das persoas que solicitan seguirte antes de permitirlles o acceso aos teus toots.
       explanation: Aquí ten alunhas endereitas para ir aprendendo
       final_action: Comece a publicar
       final_step: 'Publique! Incluso sin seguidoras as súas mensaxes serán vistas por outras, por exemplo na liña temporal local e nas etiquetas. Podería presentarse no #fediverso utilizando a etiqueta #introductions.'
@@ -1191,8 +1239,8 @@ gl:
       review_preferences_action: Cambiar preferencias
       review_preferences_step: Lembre establecer as preferencias, tales como qué correos-e lle querería recibir, ou o nivel de intimidade por omisión para as súas mensaxes. Se non lle molestan as imaxes con movemento, pode escoller que os GIF se reproduzan automáticamente.
       subject: Benvida a Mastodon
-      tip_federated_timeline: A liña temporal federada é unha visión ampla da rede Mastodon. Pero so inclúe xente a que segue xente que vostede segue, así que non é completa.
-      tip_following: Por omisión segues a Admin no teu servidor. Para atopar máis xente interesante, mira nas liñas temporais local e federada.
+      tip_federated_timeline: A liña temporal federada é unha visión reducida da rede Mastodon. Inclúe xente a que segue xente que ti segues, así que non é completa.
+      tip_following: Por omisión segues a Admin(s) no teu servidor. Para atopar máis xente interesante, mira nas liñas temporais local e federada.
       tip_local_timeline: A liña temporal local é unha ollada xeral sobre a xente en %{instance}. Son as súas veciñas máis próximas!
       tip_mobile_webapp: Si o navegador móbil lle ofrece engadir Mastodon a pantalla de inicio, pode recibir notificacións push. En moitos aspectos comportarase como un aplicativo nativo!
       tips: Consellos
@@ -1205,5 +1253,5 @@ gl:
     seamless_external_login: Está conectado a través de un servizo externo, polo que os axustes de contrasinal e correo-e non están dispoñibles.
     signed_in_as: 'Rexistrada como:'
   verification:
-    explanation_html: 'Pode <strong>validarse a vostede mesma como a dona das ligazóns nos metadatos do seu perfil</strong>. Para esto, o sitio web ligado debe conter unha ligazón de retorno ao perfil de Mastodon. Esta ligazón de retorno <strong>ten que</strong> ter un atributo <code>rel="me"</code>. O texto da ligazón non importa. Aquí ten un exemplo:'
+    explanation_html: 'Podes <strong>validarte a ti mesma como a dona das ligazóns nos metadatos do teu perfil</strong>. Para esto, o sitio web ligado debe conter unha ligazón de retorno ao perfil de Mastodon. Esta ligazón de retorno <strong>ten que</strong> ter un atributo <code>rel="me"</code>. O texto da ligazón non importa. Aquí tes un exemplo:'
     verification: Validación
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 89e8a6e4f..2bdc816f3 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -216,7 +216,6 @@ he:
     '503': The page could not be served due to a temporary server failure.
   exports:
     blocks: רשימת חסימות
-    follows: רשימת נעקבים
     mutes: רשימת השתקות
     storage: אחסון מדיה
   generic:
diff --git a/config/locales/hr.yml b/config/locales/hr.yml
index 67d83525b..9dd14c1dd 100644
--- a/config/locales/hr.yml
+++ b/config/locales/hr.yml
@@ -55,7 +55,6 @@ hr:
     '503': The page could not be served due to a temporary server failure.
   exports:
     blocks: Blokirao si
-    follows: Slijediš
     storage: Pohrana media zapisa
   generic:
     changes_saved_msg: Izmjene su uspješno sačuvane!
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index b4f8a970a..d83192ad5 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -3,7 +3,7 @@ hu:
   about:
     about_hashtag_html: Ezek a <strong>#%{hashtag}</strong> hashtag-gel ellátott publikus tülkök. Reagálhatsz rájuk, ha már van felhasználói fiókod valahol a föderációban.
     about_mastodon_html: A Mastodon egy szabad webes protokollokat használó, nyílt forráskódú szociális háló. Decentralizált, akár az e-mail.
-    about_this: Rólunk
+    about_this: Névjegy
     active_count_after: aktív
     active_footnote: Havonta aktív felhasználók
     administered_by: 'Adminisztrátor:'
@@ -80,6 +80,7 @@ hu:
     roles:
       admin: Adminisztrátor
       bot: Bot
+      group: Csoport
       moderator: Moderátor
     unavailable: Nincs ilyen profil
     unfollow: Követés vége
@@ -199,11 +200,13 @@ hu:
         change_email_user: "%{name} megváltoztatta %{target} felhasználó e-mail címét"
         confirm_user: "%{name} megerősítette e-mail címét: %{target}"
         create_account_warning: "%{name} figyelmeztetést küldött %{target} felhasználónak"
+        create_announcement: "%{name} új közleményt hozott létre %{target}"
         create_custom_emoji: "%{name} új emojit töltött fel: %{target}"
         create_domain_allow: "%{name} engedélyező listára vette %{target} domaint"
         create_domain_block: "%{name} letiltotta az alábbi domaint: %{target}"
         create_email_domain_block: "%{name} feketelistára tette az alábbi e-mail domaint: %{target}"
         demote_user: "%{name} lefokozta az alábbi felhasználót: %{target}"
+        destroy_announcement: "%{name} törölte a közleményt %{target}"
         destroy_custom_emoji: "%{name} törölte az emojit: %{target}"
         destroy_domain_allow: "%{name} leszedte %{target} domaint az engedélyező listáról"
         destroy_domain_block: "%{name} engedélyezte az alábbi domaint: %{target}"
@@ -225,10 +228,22 @@ hu:
         unassigned_report: "%{name} törölte a %{target} bejelentés hozzárendelését"
         unsilence_account: "%{name} feloldotta a némítást %{target} felhasználói fiókján"
         unsuspend_account: "%{name} feloldotta %{target} felhasználói fiókjának felfüggesztését"
+        update_announcement: "%{name} frissítette a közleményt %{target}"
         update_custom_emoji: "%{name} frissítette az alábbi emojit: %{target}"
         update_status: "%{name} frissítette %{target} felhasználó tülkjét"
       deleted_status: "(törölt tülk)"
       title: Audit napló
+    announcements:
+      edit:
+        title: Közlemény szerkesztése
+      empty: Nincs közlemény.
+      live: Élő
+      new:
+        create: Közlemény létrehozása
+        title: Új közlemény
+      published: Közzétéve
+      time_range: Időintervallum
+      title: Közlemények
     custom_emojis:
       assign_category: Kategóriák
       by_domain: Domain
@@ -340,13 +355,11 @@ hu:
       delete: Törlés
       destroyed_msg: E-mail domain sikeresen eltávolítva a feketelistáról
       domain: Domain
+      empty: Nincs email domain a feketelistán.
       new:
         create: Domain hozzáadása
         title: Új e-mail feketelista bejegyzés
       title: E-mail feketelista
-    followers:
-      back_to_account: Vissza a fiókhoz
-      title: "%{acct} követői"
     instances:
       by_domain: Domain
       delivery_available: Kézbesítés elérhető
@@ -375,6 +388,8 @@ hu:
       title: Meghívások
     pending_accounts:
       title: Függőben lévő fiókok (%{count})
+    relationships:
+      title: "%{acct} kapcsolatai"
     relays:
       add_new: Új relé hozzáadása
       delete: Törlés
@@ -395,10 +410,18 @@ hu:
       created_msg: Bejelentési feljegyzés létrehozva!
       destroyed_msg: Bejelentési feljegyzés törölve!
     reports:
+      account:
+        notes:
+          one: "%{count} feljegyzés"
+          other: "%{count} feljegyzés"
+        reports:
+          one: "%{count} bejelentés"
+          other: "%{count} bejelentés"
       action_taken_by: 'Kezelte:'
       are_you_sure: Biztos vagy benne?
       assign_to_self: Magamhoz rendelés
       assigned: Hozzárendelt moderátor
+      by_target_domain: A bejelentett fiók domainje
       comment:
         none: Egyik sem
       created_at: Jelentve
@@ -444,6 +467,8 @@ hu:
         users: Bejelentkezett helyi felhasználóknak
       domain_blocks_rationale:
         title: Mutasd meg az indokolást
+      enable_bootstrap_timeline_accounts:
+        title: Alapértelmezett követés engedélyezése új felhasználóknak
       hero:
         desc_html: A kezdőoldalon látszik. Legalább 600x100px méret javasolt. Ha nincs beállítva, a szerver bélyegképet használjuk
         title: Hősi kép
@@ -572,6 +597,10 @@ hu:
     animations_and_accessibility: Animáció és akadálymentesítés
     confirmation_dialogs: Megerősítő párbeszédablakok
     discovery: Felfedezés
+    localization:
+      body: A Mastodont önkéntesek fordítják.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Bárki közreműködhet.
     sensitive_content: Szenzitív tartalom
     toot_layout: Tülkök megjelenése
   application_mailer:
@@ -644,6 +673,9 @@ hu:
     hint_html: "<strong>Hasznos:</strong> Nem fogjuk megint a jelszavadat kérdezni a következő órában."
     invalid_password: Érvénytelen jelszó
     prompt: Add meg a jelszót a folytatáshoz
+  date:
+    formats:
+      default: "%Y.%b.%d."
   datetime:
     distance_in_words:
       about_x_hours: "%{count}ó"
@@ -710,7 +742,6 @@ hu:
     blocks: Tiltólistádon
     csv: CSV
     domain_blocks: Tiltott domainjeid
-    follows: Követettjeid
     lists: Listáid
     mutes: Némításaid
     storage: Médiatároló
@@ -721,6 +752,7 @@ hu:
     hint_html: "<strong>Mik a kiemelt hashtagek?</strong> Ezek állandóan megjelennek a nyilvános profilodon és lehetővé teszik, hogy mások kifejezetten az ezekhez tartozó tülkjeidet böngésszék. Jó eszköz ez kreatív munkák vagy hosszútávú projektek nyomonkövetésére."
   filters:
     contexts:
+      account: Profil
       home: Saját idővonal
       notifications: Értesítések
       public: Nyilvános idővonalak
@@ -732,6 +764,7 @@ hu:
       invalid_irreversible: Visszafordíthatatlan szűrést csak saját idővonalon vagy értesítéseken lehet végezni
     index:
       delete: Törlés
+      empty: Nincs szűrés.
       title: Szűrők
     new:
       title: Új szűrő hozzáadása
@@ -744,6 +777,8 @@ hu:
     all: Mind
     changes_saved_msg: A változásokat elmentettük!
     copy: Másolás
+    delete: Törlés
+    edit: Szerkesztés
     no_batch_actions_available: Ezen az oldalon nem elérhetőek kötegelt műveletek
     order_by: Rendezés
     save_changes: Változások mentése
@@ -880,6 +915,10 @@ hu:
       body: 'A tülködet %{name} megtolta:'
       subject: "%{name} megtolta a tülködet"
       title: Új megtolás
+  notifications:
+    email_events: Események email értesítésekhez
+    email_events_hint: 'Válaszd ki azokat az eseményeket, melyekről értesítést szeretnél:'
+    other_settings: Értesítések egyéb beállításai
   number:
     human:
       decimal_units:
@@ -903,6 +942,7 @@ hu:
       duration_too_long: túl távoli időpont
       duration_too_short: túl közeli időpont
       expired: A szavazásnak már vége
+      invalid_choice: A kiválasztott szavazási lehetőség nem létezik
       over_character_limit: egyik sem lehet %{max} karakternél hosszabb
       too_few_options: több, mint egy opciónak kell lennie
       too_many_options: nem lehet több, mint %{max} opció
@@ -910,9 +950,15 @@ hu:
     other: Egyéb
     posting_defaults: Tülkölés alapértelmezései
     public_timelines: Nyilvános idővonalak
+  reactions:
+    errors:
+      unrecognized_emoji: nem ismert emoji
   relationships:
     activity: Fiók aktivitás
     dormant: Elhagyott
+    followers: Követők
+    following: Követve
+    invited: Meghívva
     last_active: Utoljára aktív
     most_recent: Legutóbbi
     moved: Átköltöztetve
diff --git a/config/locales/hy.yml b/config/locales/hy.yml
index 203351893..2c692235b 100644
--- a/config/locales/hy.yml
+++ b/config/locales/hy.yml
@@ -1,14 +1,29 @@
 ---
 hy:
   about:
+    about_this: Մեր մասին
     active_count_after: ակտիվ
+    api: API
+    apps: Բջջային հավելվածներ
+    contact_unavailable: Ոչինչ չկա
+    learn_more: Իմանալ ավելին
+    privacy_policy: Գաղտնիության քաղաքականություն
     see_whats_happening: Տես ինչ ա կատարվում
     status_count_after:
       one: ստատուս
       other: ստատուս
     what_is_mastodon: Ի՞նչ է Մաստոդոնը
   accounts:
+    follow: Հետևել
+    followers:
+      one: Հետևորդ
+      other: Հետևորդներ
     media: Մեդիա
+    never_active: Երբեք
+    unfollow: Չհետևել
+  admin:
+    account_moderation_notes:
+      delete: Ջնջել
   auth:
     login: Մտնել
   errors:
diff --git a/config/locales/id.yml b/config/locales/id.yml
index 982e4289a..8cdb2f1fc 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -74,6 +74,7 @@ id:
     roles:
       admin: Admin
       bot: Bot
+      group: Grup
       moderator: Moderator
     unavailable: Profil tidak tersedia
     unfollow: Berhenti mengikuti
@@ -307,6 +308,7 @@ id:
       private_comment: Komentar pribadi
       private_comment_hint: Komentar tentang pembatasan domain ini untuk penggunaan internal oleh moderator.
       public_comment: Komentar publik
+      public_comment_hint: Komentar tentang pembatasan domain ini untuk publik umum, jika mengiklankan daftar pembatasan domain diaktifkan.
       reject_media: Tolak berkas media
       reject_media_hint: Hapus file media yang tersimpan dan menolak semua unduhan nantinya. Tidak terpengaruh dengan suspen
       reject_reports: Tolak laporan
@@ -332,13 +334,11 @@ id:
       delete: Hapus
       destroyed_msg: Berhasil menghapus domain surel dari daftar hitam
       domain: Domain
+      empty: Tidak ada domain surel yang masuk daftar hitam.
       new:
         create: Tambah domain
         title: Entri daftar hitam surel baru
       title: Daftar hitam surel
-    followers:
-      back_to_account: Kembali Ke Akun
-      title: Pengikut %{acct}
     instances:
       by_domain: Domain
       delivery_available: Pengiriman tersedia
@@ -386,10 +386,16 @@ id:
       created_msg: Catatan laporan berhasil dibuat!
       destroyed_msg: Catatan laporan berhasil dihapus!
     reports:
+      account:
+        notes:
+          other: "%{count} catatan"
+        reports:
+          other: "%{count} laporan"
       action_taken_by: Aksi dilakukan oleh
       are_you_sure: Apakah Anda yakin?
       assign_to_self: Tugaskan kpd saya
       assigned: Moderator tertugas
+      by_target_domain: Domain akun yang dilaporkan
       comment:
         none: Tidak ada
       created_at: Dilaporkan
@@ -432,8 +438,14 @@ id:
         all: Kepada semua orang
         disabled: Tidak kepada siapa pun
         title: Lihat blokir domain
+        users: Ke pengguna lokal yang sudah login
+      domain_blocks_rationale:
+        title: Tampilkan alasan
+      enable_bootstrap_timeline_accounts:
+        title: Aktifkan opsi ikuti otomatis untuk pengguna baru
       hero:
         desc_html: Ditampilkan di halaman depan. Direkomendasikan minimal 600x100px. Jika tidak diatur, kembali ke server gambar kecil
+        title: Gambar pertama
       mascot:
         desc_html: Ditampilkan di banyak halaman. Direkomendasikan minimal 293x205px. Jika tidak diatur, kembali ke maskot bawaan
         title: Gambar maskot
@@ -558,7 +570,12 @@ id:
     animations_and_accessibility: Animasi dan aksesibilitas
     confirmation_dialogs: Dialog konfirmasi
     discovery: Jelajah
+    localization:
+      body: Mastodon diterjemahkan oleh sukarelawan.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Siapa saja bisa berkontribusi.
     sensitive_content: Konten sensitif
+    toot_layout: Tata letak toot
   application_mailer:
     notification_preferences: Ubah pilihan email
     salutation: "%{name},"
@@ -695,12 +712,13 @@ id:
     blocks: Anda blokir
     csv: CSV
     domain_blocks: Blokir domain
-    follows: Anda ikuti
     lists: Daftar
     mutes: Anda bisukan
     storage: Penyimpanan media
   featured_tags:
     add_new: Tambah baru
+    errors:
+      limit: Anda sudah menampilkan tagar unggulan dengan jumlah maksimum
   filters:
     contexts:
       home: Beranda
@@ -709,8 +727,11 @@ id:
       thread: Percakapan
     edit:
       title: Ubah saringan
+    errors:
+      invalid_context: Konteks tidak ada atau invalid
     index:
       delete: Hapus
+      empty: Anda tidak memiliki filter.
       title: Saringan
     new:
       title: Tambah saringan baru
@@ -813,6 +834,7 @@ id:
       cooldown: Setelah pindah akun adalah masa tenang, masa Anda tidak dapat pindah akun lagi
       followers: Tindakan ini akan memindah semua pengikut Anda dari akun sekarang ke akun baru
       other_data: Tidak akan ada data lagi yang dipindahkan secara otomatis
+      redirect: Pemberitahuan peralihan akan dimunculkan pada akun profil Anda dan akun akan dikecualikan dari pencarian
   moderation:
     title: Moderasi
   notification_mailer:
@@ -847,6 +869,8 @@ id:
       body: 'Status anda di-boost oleh %{name}:'
       subject: "%{name} mem-boost status anda"
       title: Boost baru
+  notifications:
+    other_settings: Pengaturan notifikasi lain
   number:
     human:
       decimal_units:
@@ -869,22 +893,28 @@ id:
       duplicate_options: berisi item ganda
       duration_too_short: terlalu cepat
       expired: Japat telah berakhir
+      invalid_choice: Opsi pilihan yang dipilih tidak ada
       over_character_limit: tidak boleh lebih dari %{max} karakter
       too_few_options: harus punya lebih dari satu item
       too_many_options: tidak boleh berisi lebih dari %{max} item
   preferences:
     other: Lainnya
+    posting_defaults: Kiriman bawaan
     public_timelines: Linimasa publik
   relationships:
     activity: Aktivitas akun
     dormant: Terbengkalai
+    followers: Pengikut
+    following: Mengikuti
     last_active: Terakhir aktif
     most_recent: Terkini
     moved: Dipindah
+    mutual: Mutual
     primary: Utama
     relationship: Hubungan
     remove_selected_domains: Hapus semua pengikut dari domain yang dipilih
     remove_selected_followers: Hampus pengikut yang dipilih
+    remove_selected_follows: Batal ikuti pengguna terpilih
     status: Status akun
   remote_follow:
     acct: Masukkan namapengguna@domain yang akan anda ikuti
@@ -967,6 +997,7 @@ id:
     notifications: Notifikasi
     preferences: Pilihan
     profile: Profil
+    relationships: Ikuti dan pengikut
     two_factor_authentication: Autentikasi Two-factor
   spam_check:
     spam_detected: Ini adalah laporan otomatis. Spam terdeteksi.
@@ -986,35 +1017,68 @@ id:
     over_character_limit: melebihi %{max} karakter
     pin_errors:
       limit: Anda sudah mencapai jumlah maksimum toot yang dapat disematkan
+      ownership: Toot orang lain tidak bisa disematkan
+      private: Toot privat tidak bisa disematkan
+      reblog: Boost tidak bisa disematkan
+    poll:
+      total_people:
+        other: "%{count} orang"
+      total_votes:
+        other: "%{count} memilih"
+      vote: Memilih
     show_more: Tampilkan selengkapnya
+    sign_in_to_participate: Masuk untuk mengikuti percakapan
+    title: '%{name}: "%{quote}"'
     visibilities:
       private: Khusus pengikut
       private_long: Hanya tampilkan ke pengikut
       public: Publik
       public_long: Bisa dilihat semua orang
       unlisted: Bisa dilihat semua orang, tapi tidak ditampilkan di linimasa publik
+      unlisted_long: Tidak terdaftar di linimasa publik tetapi siapapun dapat melihat
   stream_entries:
+    pinned: Toot tersemat
     reblogged: di-boost-kan
     sensitive_content: Konten sensitif
+  tags:
+    does_not_match_previous_name: tidak cocok dengan nama sebelumnya
+  terms:
+    title: "%{instance} Ketentuan Layanan dan Kebijakan Privasi"
+  themes:
+    contrast: Mastodon (Kontras tinggi)
+    default: Mastodon (Gelap)
+    mastodon-light: Mastodon (Terang)
   time:
     formats:
       default: "%d %b %Y, %H:%M"
+      month: "%b %Y"
   two_factor_authentication:
     code_hint: Masukkan kode yang dibuat oleh app autentikator sebagai konfirmasi
     description_html: Jika anda menaktifkan ototentikasi dua faktor, saat login anda harus menggunakan telepon anda  untuk membuat token supaya anda bisa masuk.
     disable: Matikan
     enable: Aktifkan
+    enabled: Otentifikasi dua faktor aktif
     enabled_success: Ototentikasi dua faktor telah diaktifkan
     generate_recovery_codes: Buat Kode Pemulihan
     instructions_html: "<strong>Pindai kode QR ini pada Otentikator Google anda atau aplikasi TOTP lainnya di telepon anda</strong>. Mulai sekarang, aplikasi tersebut akan membuat token yang bisa anda gunakan untuk login."
     lost_recovery_codes: Kode pemulihan bisa anda gunakan untuk mendapatkan kembali akses pada akun anda jika anda kehilangan handphone anda. Jika anda kehilangan kode pemulihan, anda bisa membuatnya ulang disini. Kode pemulihan anda yang lama tidak akan bisa digunakan lagi.
     manual_instructions: 'Jika anda tidak bisa memindai kode QR dan harus memasukkannya secara manual, ini dia kode yang harus dimasukkan:'
+    recovery_codes: Kode pemulihan cadangan
     recovery_codes_regenerated: Kode Pemulihan berhasil dibuat ulang
     recovery_instructions_html: Jika anda kehilangan akses pada handphone anda, anda bisa menggunakan kode pemulihan dibawah ini untuk mendapatkan kembali akses pada akun anda. Simpan kode pemulihan anda baik-baik, misalnya dengan mencetaknya atau menyimpannya bersama dokumen penting lainnya.
     setup: Persiapan
     wrong_code: Kode yang dimasukkan tidak cocok! Apa waktu server dan waktu di handphone sudah cocok?
   user_mailer:
+    backup_ready:
+      explanation: Cadangan penuh akun Mastodon Anda sudah dapat diunduh!
+      subject: Arsip Anda sudah siap diunduh
+      title: Ambil arsip
     warning:
+      explanation:
+        disable: Saat akun Anda beku, data Anda tetap utuh. Anda tidak akan dapat melakukan apa-apa sampai akun Anda tidak lagi dikunci.
+        silence: Saat akun Anda dibatasi, hanya akun yang Anda ikuti yang dapat melihat toot Anda di server ini. Akun Anda mungkin akan dikecualikan dari daftar publik. Akun lain dapat mengikuti akun Anda secara manual.
+        suspend: Akun Anda telah ditangguhkan. Semua toot dan media yang Anda unggah dihapus secara permanen dari server ini, dan server tempat Anda memiliki pengikut.
+      get_in_touch: Anda dapat membalas surel ini untuk menghubungi pengurus %{instance}.
       review_server_policies: Tinjau kebijakan server
       statuses: 'Khususnya untuk:'
       subject:
@@ -1029,6 +1093,25 @@ id:
         suspend: Akun ditangguhkan
     welcome:
       edit_profile_action: Siapkan profil
+      edit_profile_step: Anda dapat menyesuaikan profil Anda dengan mengunggah avatar, kepala, mengubah tampilan nama dan lainnya. Jika Anda ingin meninjau pengikut baru sebelum Anda terima sebagai pengikut, Anda dapat mengunci akun Anda.
+      explanation: Beberapa tips sebelum Anda memulai
+      final_action: Mulai mengirim
+      final_step: 'Mulai mengirim! Tanpa pengikut, pesan publik Anda akan tetap dapat dilihat oleh akun lain, contohnya di linimasa lokal atau di tagar. Anda mungkin ingin memperkenalkan diri dengan tagar #introductions.'
+      full_handle_hint: Ini yang dapat Anda sampaikan kepada teman agar mereka dapat mengirim pesan atau mengikuti Anda dari server lain.
+      review_preferences_action: Ubah preferensi
+      review_preferences_step: Pastikan Anda telah mengatur preferensi Anda, seperti surel untuk menerima pesan, atau tingkat privasi bawaan untuk kiriman Anda. Jika Anda tidak alergi dengan gerakan gambar, Anda dapat mengaktifkan opsi mainkan otomatis GIF.
+      subject: Selamat datang di Mastodon
+      tip_following: Anda secara otomatis mengikuti admin server. Untuk mencari akun-akun yang menarik, silakan periksa linimasa lokal dan gabungan.
+      tip_mobile_webapp: Jika peramban mobile Anda ingin menambahkan Mastodon ke layar utama, Anda dapat menerima notifikasi dorong. Ia akan berjalan seperti aplikasi asli!
+      tips: Tips
+      title: Selamat datang, %{name}!
   users:
+    follow_limit_reached: Anda tidak dapat mengikuti lebih dari %{limit} orang
     invalid_email: Alamat email tidak cocok
     invalid_otp_token: Kode dua faktor tidak cocok
+    otp_lost_help_html: Jika Anda kehilangan akses keduanya, Anda dapat menghubungi %{email}
+    seamless_external_login: Anda masuk via layanan eksternal, sehingga setelan kata sandi dan surel tidak tersedia.
+    signed_in_as: 'Masuk sebagai:'
+  verification:
+    explanation_html: 'Anda dapat <strong>memverifikasi diri Anda sebagai pemiliki tautan pada metadata profil</strong>. Situsweb yang ditautkan haruslah berisi tautan ke profil Mastodon Anda. Tautan tersebut <strong>harus</strong> memiliki atribut <code>rel="me"</code>. Isi teks tautan tidaklah penting. Ini contohnya:'
+    verification: Verifikasi
diff --git a/config/locales/io.yml b/config/locales/io.yml
index 2b3e50691..4e426e469 100644
--- a/config/locales/io.yml
+++ b/config/locales/io.yml
@@ -84,7 +84,6 @@ io:
     '503': The page could not be served due to a temporary server failure.
   exports:
     blocks: Tu blokusas
-    follows: Tu sequas
     storage: Konservado di kontenajo
   generic:
     changes_saved_msg: Chanji senprobleme konservita!
diff --git a/config/locales/is.yml b/config/locales/is.yml
new file mode 100644
index 000000000..70d6e4e75
--- /dev/null
+++ b/config/locales/is.yml
@@ -0,0 +1,1231 @@
+---
+is:
+  about:
+    about_hashtag_html: Þetta eru opinber tíst sem merkt eru með <strong>#%{hashtag}</strong>. Þú getur unnið með þau ef þú ert með skráðan aðgang einhversstaðar í skýjasambandinu.
+    about_mastodon_html: 'Samfélagsnet framtíðarinnar: Engar auglýsingar, ekkert eftirlit stórfyrirtækja, siðleg hönnun og engin miðstýring! Þú átt þín eigin gögn í Mastodon!'
+    about_this: Um hugbúnaðinn
+    active_count_after: virkt
+    active_footnote: Mánaðarlega virkir notendur (MAU)
+    administered_by: 'Stýrt af:'
+    api: API-kerfisviðmót
+    apps: Farsímaforrit
+    apps_platforms: Notaðu Mastodon frá iOS, Android og öðrum stýrikerfum
+    browse_directory: Skoða notandasniðamöppu og sía eftir áhugamálum
+    browse_local_posts: Skoðaðu kvikt streymi af opinberum færslum á þessum vefþjóni
+    browse_public_posts: Skoðaðu kvikt streymi af opinberum færslum á Mastodon
+    contact: Hafa samband
+    contact_missing: Ekki skilgreint
+    contact_unavailable: Ekki til staðar
+    discover_users: Uppgötva notendur
+    documentation: Hjálparskjöl
+    federation_hint_html: Með notandaaðgangi á %{instance} geturðu fylgst með fólki á hvaða Mastodon-þjóni sem er og reyndar víðar.
+    get_apps: Prófaðu farsímaforrit
+    hosted_on: Mastodon hýst á %{domain}
+    instance_actor_flash: |
+      Þessi aðgangur er sýndarnotandi sem er notaður til að tákna sjálfan vefþjóninn en ekki neinn einstakan notanda.
+      Tilgangur hans tengist virkni vefþjónasambandsins og ætti alls ekki að loka á hann nema að þú viljir útiloka allan viðkomandi vefþjón, en þá ætti frekar að útiloka sjálft lénið.
+    learn_more: Kanna nánar
+    privacy_policy: Persónuverndarstefna
+    see_whats_happening: Sjáðu hvað er í gangi
+    server_stats: 'Tölfræði þjóns:'
+    source_code: Grunnkóði
+    status_count_after:
+      one: stöðufærsla
+      other: stöðufærslur
+    status_count_before: Sem stóðu fyrir
+    tagline: Fylgstu með vinum og uppgötvaðu nýja
+    terms: Þjónustuskilmálar
+    unavailable_content: Ekki tiltækt efni
+    unavailable_content_description:
+      domain: Vefþjónn
+      reason: Ástæða
+      rejecting_media: 'Myndefnisskrár frá þessum vefþjónum verða hvorki birtar né geymdar og engar smámyndir frá þeim birtar, sem krefst þess að smellt sé handvirkt til að nálgast upprunalegu skrárnar:'
+      silenced: 'Færslur frá þessum vefþjónum verða faldar í opinberum tímalínum og samtölum, auk þess sem engar tilkynningar verða til þvið aðgerðir notendanna, nema ef þú fylgist með þeim:'
+      suspended: 'Engin gögn frá þessum vefþjónum verða unnin, geymd eða skipst á, sem gerir samskipti við notendur frá þessum vefþjónum ómöguleg:'
+    unavailable_content_html: Mastodon leyfir þér almennt að skoða og eiga við efni frá notendum frá hvaða vefþjóni sem er í vefþjónasambandinu. Þetta eru þær undantekningar sem hafa verið gerðar á þessum tiltekna vefþjóni.
+    user_count_after:
+      one: notanda
+      other: notendur
+    user_count_before: Hýsir
+    what_is_mastodon: Hvað er Mastodon?
+  accounts:
+    choices_html: "%{name} hefur valið:"
+    endorsements_hint: Þú getur auglýst efni frá fólki sem þú fylgir í vefviðmótinu og mun það birtast hér.
+    featured_tags_hint: Þú getur gefið sérstökum myllumerkjum aukið vægi og birtast þau þá hér.
+    follow: Fylgjast með
+    followers:
+      one: fylgjandi
+      other: fylgjendur
+    following: Fylgist með
+    joined: Gerðist þátttakandi %{date}
+    last_active: síðasta virkni
+    link_verified_on: Eignarhald á þessum tengli var athugað þann %{date}
+    media: Myndskrár
+    moved_html: "%{name} hefur verið færður í %{new_profile_link}:"
+    network_hidden: Þessar upplýsingar ekki tiltækar
+    never_active: Aldrei
+    nothing_here: Það er ekkert hér!
+    people_followed_by: Fólk sem %{name} fylgist með
+    people_who_follow: Fólk sem fylgist með %{name}
+    pin_errors:
+      following: Þú þarft að vera þegar að fylgjast með þeim sem þú ætlar að mæla með
+    posts:
+      one: Tíst
+      other: Tíst
+    posts_tab_heading: Tíst
+    posts_with_replies: Tíst og svör
+    reserved_username: Notandanafnið er frátekið
+    roles:
+      admin: Stjóri
+      bot: Róbót
+      group: Hópur
+      moderator: Umsjón
+    unavailable: Notandasnið ekki tiltækt
+    unfollow: Hætta að fylgja
+  admin:
+    account_actions:
+      action: Framkvæma aðgerð
+      title: Framkvæma umsjónaraðgerð á %{acct}
+    account_moderation_notes:
+      create: Skilja eftir minnispunkt
+      created_msg: Tókst að útbúa minnispunkt umsjónarmanns!
+      delete: Eyða
+      destroyed_msg: Tókst að eyða minnispunkti umsjónarmanns!
+    accounts:
+      approve: Samþykkja
+      approve_all: Samþykkja allt
+      are_you_sure: Ertu viss?
+      avatar: Auðkennismynd
+      by_domain: Lén
+      change_email:
+        changed_msg: Tölvupóstfangi notandaaðgangsins hefur verið breytt!
+        current_email: Núverandi tölvupóstfang
+        label: Breyta tölvupóstfangi
+        new_email: Nýr tölvupóstur
+        submit: Breyta tölvupóstfangi
+        title: Breyta tölvupóstfangi fyrir %{username}
+      confirm: Staðfesta
+      confirmed: Staðfest
+      confirming: Staðfesti
+      deleted: Eytt
+      demote: Lækka í tign
+      disable: Gera óvirkt
+      disable_two_factor_authentication: Gera tveggja-þátta auðkenningu óvirka
+      disabled: Óvirkt
+      display_name: Birtingarnafn
+      domain: Lén
+      edit: Breyta
+      email: Tölvupóstur
+      email_status: Staða tölvupósts
+      enable: Virkja
+      enabled: Virkt
+      followers: Fylgjendur
+      follows: Fylgist með
+      header: Haus
+      inbox_url: Slóð á innhólf
+      invited_by: Boðið af
+      ip: IP-vistfang
+      joined: Gerðist þátttakandi
+      location:
+        all: Allt
+        local: Staðvært
+        remote: Fjartengt
+        title: Staðsetning
+      login_status: Staða innskráningar
+      media_attachments: Myndaviðhengi
+      memorialize: Breya í minningargrein
+      moderation:
+        active: Virkur
+        all: Allt
+        pending: Í bið
+        silenced: Hulið
+        suspended: Í bið
+        title: Umsjón
+      moderation_notes: Minnispunktar umsjónarmanna
+      most_recent_activity: Allra nýjasta virkni
+      most_recent_ip: Nýjasta IP-vistfang
+      no_account_selected: Engum aðgöngum var breytt þar sem engir voru valdir
+      no_limits_imposed: Engra takmarka krafist
+      not_subscribed: Ekki í áskrift
+      pending: Bíður eftir yfirlestri
+      perform_full_suspension: Setja í bið
+      promote: Hækka í tign
+      protocol: Samskiptamáti
+      public: Opinber
+      push_subscription_expires: PuSH-áskrift rennur út
+      redownload: Endurlesa notandasnið
+      reject: Hafna
+      reject_all: Hafna öllu
+      remove_avatar: Fjarlægja auðkennismynd
+      remove_header: Fjarlægja haus
+      resend_confirmation:
+        already_confirmed: Þessi notandi hefur þegar verið staðfestur
+        send: Senda staðfestingartölvupóst aftur
+        success: Það tókst að senda staðfestingartölvupóst!
+      reset: Endurstilla
+      reset_password: Endurstilla lykilorð
+      resubscribe: Gerast áskrifandi aftur
+      role: Heimildir
+      roles:
+        admin: Stjórnandi
+        moderator: Umsjónarmaður
+        staff: Starfsmaður
+        user: Notandi
+      search: Leita
+      search_same_ip: Aðrir notendur með sama IP-vistfang
+      shared_inbox_url: Slóð á sameiginlegt innhólf
+      show:
+        created_reports: Gerðar kærur
+        targeted_reports: Kært af öðrum
+      silence: Hylja
+      silenced: Hulið
+      statuses: Stöðufærslur
+      subscribe: Gerast áskrifandi
+      suspended: Í bið
+      time_in_queue: Bíður í biðröð %{time}
+      title: Notandaaðgangar
+      unconfirmed_email: Óstaðfestur tölvupóstur
+      undo_silenced: Hætta að hylja
+      undo_suspension: Taka úr bið
+      unsubscribe: Taka úr áskrift
+      username: Notandanafn
+      warn: Aðvara
+      web: Vefur
+      whitelisted: Á lista yfir leyft
+    action_logs:
+      actions:
+        assigned_to_self_report: "%{name} úthlutaði skýrslu %{target} til sín"
+        change_email_user: "%{name} breytti tölvupóstfangi fyrir notandann %{target}"
+        confirm_user: "%{name} staðfesti tölvupóstfang fyrir notandann %{target}"
+        create_account_warning: "%{name} sendi aðvörun til %{target}"
+        create_custom_emoji: "%{name} sendi inn nýtt tjáningartákn %{target}"
+        create_domain_allow: "%{name} setti lén %{target} á lista yfir leyft"
+        create_domain_block: "%{name} útilokaði lénið %{target}"
+        create_email_domain_block: "%{name} setti póstlén %{target} á lista yfir bannað"
+        demote_user: "%{name} lækkaði notandann %{target} í tign"
+        destroy_custom_emoji: "%{name} henti út tjáningartákninu %{target}"
+        destroy_domain_allow: "%{name} fjarlægði lén %{target} af lista yfir leyft"
+        destroy_domain_block: "%{name} aflétti útilokun af léninu %{target}"
+        destroy_email_domain_block: "%{name} setti póstlén %{target} á lista yfir leyft"
+        destroy_status: "%{name} fjarlægði stöðufærslu frá %{target}"
+        disable_2fa_user: "%{name} gerði tveggja-þátta auðkenningu óvirka fyrir notandann %{target}"
+        disable_custom_emoji: "%{name} gerði tjáningartáknið %{target} óvirkt"
+        disable_user: "%{name} gerðir innskráningu óvirka fyrir notandann %{target}"
+        enable_custom_emoji: "%{name} gerði tjáningartáknið %{target} virkt"
+        enable_user: "%{name} gerðir innskráningu virka fyrir notandann %{target}"
+        memorialize_account: "%{name} breytti notandaaðgangnum %{target} í minningargreinarsíðu"
+        promote_user: "%{name} hækkaði notandann %{target} í tign"
+        remove_avatar_user: "%{name} fjarlægði auðkennismynd af %{target}"
+        reopen_report: "%{name} enduropnaði skýrslu %{target}"
+        reset_password_user: "%{name} endurstillti lykilorð fyrir notandann %{target}"
+        resolve_report: "%{name} leysti skýrslu %{target}"
+        silence_account: "%{name} gerði notandaaðganginn %{target} hulinn"
+        suspend_account: "%{name} setti notandaaðganginn %{target} í bið"
+        unassigned_report: "%{name} fjarlægði úthlutun af skýrslu %{target}"
+        unsilence_account: "%{name} hætti að hylja notandaaðganginn %{target}"
+        unsuspend_account: "%{name} tók notandaaðganginn %{target} úr bið"
+        update_custom_emoji: "%{name} uppfærði tjáningartákn %{target}"
+        update_status: "%{name} uppfærði stöðufærslu frá %{target}"
+      deleted_status: "(eydd stöðufærsla)"
+      title: Atvikaskrá
+    custom_emojis:
+      assign_category: Úthluta flokki
+      by_domain: Lén
+      copied_msg: Það tókst að búa til afrit af tjáningartákninu
+      copy: Afrita
+      copy_failed_msg: Ekki tókst að gera staðvært afrit af tjáningartákninu
+      create_new_category: Búa til nýjan flokk
+      created_msg: Tókst að búa til tjáningartákn!
+      delete: Eyða
+      destroyed_msg: Tókst að eyða tjáningartákni!
+      disable: Gera óvirkt
+      disabled: Óvirkt
+      disabled_msg: Tókst að gera þetta tjáningartákn óvirkt
+      emoji: Tjáningartákn
+      enable: Virkja
+      enabled: Virkt
+      enabled_msg: Tókst að gera þetta tjáningartákn virkt
+      image_hint: PNG allt að 50KB
+      list: Listi
+      listed: Skráð
+      new:
+        title: Bæta við nýju sérsniðnu tjáningartákni
+      overwrite: Skrifa yfir
+      shortcode: Stuttkóði
+      shortcode_hint: Að minnsta kosti 2 stafir, einungis tölu- og bókstafir ásamt undirstrikum
+      title: Sérsniðin tjáningartákn
+      uncategorized: Óflokkað
+      unlist: Afskrá
+      unlisted: Óskráð
+      update_failed_msg: Gat ekki uppfært þetta tjáningartákn
+      updated_msg: Tókst að uppfæra tjáningartákn!
+      upload: Senda inn
+    dashboard:
+      authorized_fetch_mode: Öruggur hamur
+      backlog: bakskráð verk
+      config: Stillingar
+      feature_deletions: Eyðingar notandaaðganga
+      feature_invites: Boðstenglar
+      feature_profile_directory: Notandasniðamappa
+      feature_registrations: Nýskráningar
+      feature_relay: Sambandsendurvarpi
+      feature_spam_check: Ruslpóstvarnir
+      feature_timeline_preview: Forskoðun tímalínu
+      features: Eiginleikar
+      hidden_service: Skýjasamband með faldar þjónustur
+      open_reports: opnar kærur
+      pending_tags: myllumerki bíða eftir yfirferð
+      pending_users: notendur bíða eftir yfirferð
+      recent_users: Nýlegir notendur
+      search: Leit í öllum texta
+      single_user_mode: Eins-notandahamur
+      software: Hugbúnaður
+      space: Notkun geymslurýmis
+      title: Stjórnborð
+      total_users: notendur alls
+      trends: Tilhneiging
+      week_interactions: aðgerðir í þessari viku
+      week_users_active: virkir í þessari viku
+      week_users_new: notendur þessari viku
+      whitelist_mode: Hamur til að leyfa (whitelist)
+    domain_allows:
+      add_new: Setja lén á lista yfir leyft
+      created_msg: Það tókst að setja lénið á lista yfir leyft
+      destroyed_msg: Lénið hefur verið fjarlægt af lista yfir leyft
+      undo: Fjarlægja af lista yfir leyft
+    domain_blocks:
+      add_new: Bæta við nýrri útilokun á léni
+      created_msg: Útilokun léns er núna í vinnslu
+      destroyed_msg: Útilokun léns hefur verið aflétt
+      domain: Lén
+      edit: Breyta útilokun léns
+      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
+        hint: Útilokun lénsins mun ekki koma í veg fyrir gerð aðgangsfærslna í gagnagrunninum, en mun afturvirkt og sjálfvirkt beita sérstökum umsjónaraðferðum á þessa aðganga.
+        severity:
+          desc_html: "<strong>Hylja</strong> mun gera færslur á notandaaðgangnum ósýnilegar öllum þeim sem ekki eru að fylgjast með þeim. <strong>Setja í bið</strong> mun fjarlægja allt efni á notandaaðgangnum, myndgögn og gögn á notandasniði. Notaðu <strong>Ekkert</strong> ef þú ætlar bara að hafna margmiðlunarskrám."
+          noop: Ekkert
+          silence: Hylja
+          suspend: Setja í bið
+        title: Ný útilokun á léni
+      private_comment: Einkaathugasemd
+      private_comment_hint: Athugasemd um þessa útilokun á léni til innanhússnotkunar fyrir umsjónarmenn.
+      public_comment: Opinber athugasemd
+      public_comment_hint: Athugasemd um þessa útilokun á léni til almennings, ef virkt er að auglýsa listann með lénatakmörkunum.
+      reject_media: Hafna myndskrám
+      reject_media_hint: Fjarlægir staðværar myndefnisskrár úr geymslu og neitar framvegis að sækja neinar slíkar. Skiptir ekki máli fyrir biðstöður
+      reject_reports: Hafna kærum
+      reject_reports_hint: Hunsa allar kærur frá þessu léni. Skiptir ekki máli fyrir biðstöður
+      rejecting_media: hafna myndskrám
+      rejecting_reports: hafna kærum
+      severity:
+        silence: hulið
+        suspend: í bið
+      show:
+        affected_accounts:
+          one: Einn notandaaðgangur í gagnagrunninum kemur við sögu
+          other: "%{count} notendaaðgangar í gagnagrunninum koma við sögu"
+        retroactive:
+          silence: Hætta að hylja viðkomandi notendaaðganga frá þessu léni
+          suspend: Taka úr bið viðkomandi notendaaðganga frá þessu léni
+        title: Afturkalla útilokun á léni fyrir %{domain}
+        undo: Afturkalla
+      undo: Afturkalla útilokun á léni
+      view: Skoða útilokun á léni
+    email_domain_blocks:
+      add_new: Bæta við nýju
+      created_msg: Tókst að bæta póstléni á lista yfir bannað
+      delete: Eyða
+      destroyed_msg: Tókst að eyða póstléni af lista yfir bannað
+      domain: Lén
+      empty: Engin tölvupóstlén eru á bannlista.
+      new:
+        create: Bæta við léni
+        title: Ný færsla á bannlista fyrir tölvupóstföng
+      title: Bannlisti yfir tölvupóstföng
+    instances:
+      by_domain: Lén
+      delivery_available: Afhending er til taks
+      known_accounts:
+        one: "%{count} þekktur notandaaðgangur"
+        other: "%{count} þekktir notendaaðgangar"
+      moderation:
+        all: Allt
+        limited: Takmarkað
+        title: Umsjón
+      private_comment: Einkaathugasemd
+      public_comment: Opinber athugasemd
+      title: Samband
+      total_blocked_by_us: Útilokaðir af okkur
+      total_followed_by_them: Fylgt af þeim
+      total_followed_by_us: Fylgt af okkur
+      total_reported: Kærur um þá
+      total_storage: Myndaviðhengi
+    invites:
+      deactivate_all: Gera allt óvirkt
+      filter:
+        all: Allt
+        available: Tiltækt
+        expired: Útrunnið
+        title: Sía
+      title: Boðsgestir
+    pending_accounts:
+      title: Notendaaðgangar í bið (%{count})
+    relays:
+      add_new: Bæta við nýjum endurvarpa
+      delete: Eyða
+      description_html: "<strong>Endurvarpi í skýjasambandi</strong> er milliþjónn sem skiptist á miklu magni opinberra tísta við aðra þjóna sem eru áskrifendur að honum og birta sín tíst á honum. <strong>Þetta getur hjálpað litlum og meðalstórum vefþjónum að uppgötva efni úr skýjasambandinu</strong>, sem annars myndi krefjast þess að staðværir notendur fylgist handvirkt með öðru fólki á fjartengdum vefþjónum."
+      disable: Gera óvirkt
+      disabled: Óvirkt
+      enable: Virkja
+      enable_hint: Ef þetta er einu sinni virkjað, mun vefþjónninn þinn gerast áskrifandi að öllum opinberum tístum frá þessum endurvarpa og byrja að senda sín eigin opinberu tíst til hans.
+      enabled: Virkt
+      inbox_url: Slóð endurvarpa
+      pending: Bíð eftir samþykki endurvarpa
+      save_and_enable: Vista og virkja
+      setup: Setja upp endurvarpatengingu
+      signatures_not_enabled: Endurvarpar munu ekki virka rétt þegar verið er í öryggisham eða þegar  hamur til að leyfa (whitelist mode) er virkur
+      status: Staða
+      title: Endurvarpar
+    report_notes:
+      created_msg: Tókst að útbúa minnispunkt skýrslu!
+      destroyed_msg: Tókst að eyða minnispunkti skýrslu!
+    reports:
+      account:
+        notes:
+          one: "%{count} minnispunktur"
+          other: "%{count} minnispunktar"
+        reports:
+          one: "%{count} skýrsla"
+          other: "%{count} skýrslur"
+      action_taken_by: Aðgerð framkvæmd af
+      are_you_sure: Ertu viss?
+      assign_to_self: Úthluta mér
+      assigned: Úthlutaður umsjónarmaður
+      by_target_domain: Lén kærða notandaaðgangsins
+      comment:
+        none: Ekkert
+      created_at: Tilkynnt
+      mark_as_resolved: Merkja sem leyst
+      mark_as_unresolved: Merkja sem óleyst
+      notes:
+        create: Bæta við minnispunkti
+        create_and_resolve: Leysa með minnispunkti
+        create_and_unresolve: Enduropna með minnispunkti
+        delete: Eyða
+        placeholder: Lýstu til hvaða aðgerða hefur verið gripið eða uppfærðu inn aðrar tengdar upplýsingar...
+      reopen: Enduropna kæru
+      report: 'Kæra #%{id}'
+      reported_account: Kærður notandaaðgangur
+      reported_by: Kært af
+      resolved: Leyst
+      resolved_msg: Það tókst að leysa kæruna!
+      status: Staða
+      title: Kærur
+      unassign: Aftengja úthlutun
+      unresolved: Óleyst
+      updated_at: Uppfært
+    settings:
+      activity_api_enabled:
+        desc_html: Fjöldi staðværra stöðufærslna, virkra notenda og nýskráninga í vikulegum skömmtum
+        title: Birta samantektartölfræði um virkni notanda
+      bootstrap_timeline_accounts:
+        desc_html: Aðskildu mörg notendanöfn með kommum. Einungis staðværir og ólæstir aðgangar virka. Þegar þetta er autt er sjálgefið miðað við alla staðværa stjórnendur.
+        title: Sjálfgefnar fylgnistillingar fyrir nýja notendur
+      contact_information:
+        email: Fyrirtækistölvupóstur
+        username: Notandanafn tengiliðar
+      custom_css:
+        desc_html: Breyttu útlitinu með CSS-skilgreiningum sem hlaðið er inn á hverri síðu
+        title: Sérsniðið CSS
+      default_noindex:
+        desc_html: Hefur áhrif á alla þá notendur sem ekki hafa breytt þessum stillingum sjálfir
+        title: Sjálfgefið láta notendur afþakka atriðaskráningu í leitarvélum
+      domain_blocks:
+        all: Til allra
+        disabled: Til engra
+        title: Birta útilokanir á lénum
+        users: Til innskráðra staðværra notenda
+      domain_blocks_rationale:
+        title: Birta röksemdafærslu
+      enable_bootstrap_timeline_accounts:
+        title: Virkja sjálfgefnar fylgnistillingar fyrir nýja notendur
+      hero:
+        desc_html: Birt á forsíðunni. Mælt með að hún sé a.m.k. 600×100 mynddílar. Þegar þetta er ekki stillt, er notuð smámynd netþjónsins
+        title: Aðalmynd
+      mascot:
+        desc_html: Birt á ýmsum síðum. Mælt með að hún sé a.m.k. 293×205 mynddílar. Þegar þetta er ekki stillt, er notuð smámynd netþjónsins
+        title: Mynd af lukkudýri
+      peers_api_enabled:
+        desc_html: Lénaheiti sem þessi netþjónn hefur rekist á í skýjasambandinu (samtengdum vefþjónum - fediverse)
+        title: Birta lista yfir uppgötvaða netþjóna
+      preview_sensitive_media:
+        desc_html: Forskoðun tengla á önnur vefsvæði mun birta smámynd jafnvel þótt myndefnið sé merkt sem viðkvæmt
+        title: Birta viðkvæmt myndefni í OpenGraph-forskoðun
+      profile_directory:
+        desc_html: Leyfa að hægt sé að finna notendur
+        title: Virkja notandasniðamöppu
+      registrations:
+        closed_message:
+          desc_html: Birt á forsíðu þegar lokað er fyrir nýskráningar. Þú getur notað HTML-einindi
+          title: Skilaboð vegna lokunar á nýskráningu
+        deletion:
+          desc_html: Leyfa öllum að eyða aðgangnum sínum
+          title: Opna eyðingu á notandaaðgangi
+        min_invite_role:
+          disabled: Enginn
+          title: Leyfa boð frá
+      registrations_mode:
+        modes:
+          approved: Krafist er samþykkt nýskráningar
+          none: Enginn getur nýskráð sig
+          open: Allir geta nýskráð sig
+        title: Nýskráningarhamur
+      show_known_fediverse_at_about_page:
+        desc_html: Þegar þetta er óvirkt, takmarkast opinbera tímalínan sem tengt er í af upphafssíðunni við að birta einungis staðvært efni (af sama vefþjóni)
+        title: Hafa með efni úr skýjasambandi á síðu fyrir óauðkennda opinbera tímalínu
+      show_staff_badge:
+        desc_html: Sýna starfsmannamerki á síðu notandans
+        title: Sýna starfsmannamerki
+      site_description:
+        desc_html: Kynningarmálsgrein í API. Lýstu því hvað það er sem geri þennan Mastodon-þjón sérstakan, auk annarra mikilvægra upplýsinga. Þú getur notað HTML-einindi, sér í lagi <code>&lt;a&gt;</code> og <code>&lt;em&gt;</code>.
+        title: Lýsing á vefþjóni
+      site_description_extended:
+        desc_html: Góður staður fyrir siðareglur, almennt regluverk, leiðbeiningar og annað sem gerir netþjóninni þinn sérstakann. Þú getur notað HTML-einindi
+        title: Sérsniðnar ítarlegar upplýsingar
+      site_short_description:
+        desc_html: Birt á hliðarspjaldi og í lýsigögnum. Lýstu því hvað Mastodon gerir og hvað það er sem geri þennan vefþjón sérstakan, í einni málsgrein.
+        title: Stutt lýsing á netþjóninum
+      site_terms:
+        desc_html: Þú getur skrifað þína eigin persónuverndarstefnu, þjónustuskilmála eða annað lagatæknilegt. Þú getur notað HTML-einindi
+        title: Sérsniðnir þjónustuskilmálar
+      site_title: Heiti vefþjóns
+      spam_check_enabled:
+        desc_html: Mastodon getur tilkynnt sjálfvirkt um aðganga sem senda ítrekað óumbeðin skilaboð. Mögulega geta verið rangar slíkar tilkynningar.
+        title: Sjálfvirkar ruslpóstvarnir
+      thumbnail:
+        desc_html: Notað við forskoðun í gegnum OpenGraph og API-kerfisviðmót. Mælt með 1200×630 mynddílum
+        title: Smámynd vefþjóns
+      timeline_preview:
+        desc_html: Birta tengil í opinbera tímalínu á upphafssíðu og leyfa aðgang API-kerfisviðmóts að opinberri tímalínu án auðkenningar
+        title: Leyfa óauðkenndan aðgang að opinberri tímalínu
+      title: Stillingar vefsvæðis
+      trendable_by_default:
+        desc_html: Hefur áhrif á myllumerki sem ekki hafa áður verið gerð óleyfileg
+        title: Leyfa myllumerkjum að fara í umræðuna án þess að þau séu fyrst yfirfarin
+      trends:
+        desc_html: Birta opinberlega þau áður yfirförnu myllumerki sem eru núna í umræðunni
+        title: Myllumerki í umræðunni
+    statuses:
+      back_to_account: Fara aftur á síðu notandaaðgangsins
+      batch:
+        delete: Eyða
+        nsfw_off: Merkja gögn sem ekki viðkvæm
+        nsfw_on: Merkja sem viðkvæmt
+      deleted: Eytt
+      failed_to_execute: Mistókst að keyra
+      media:
+        title: Myndefni
+      no_media: Ekkert myndefni
+      no_status_selected: Engum stöðufærslum var breytt þar sem engar voru valdar
+      title: Staða notendaaðganga
+      with_media: Með myndefni
+    tags:
+      accounts_today: Einstök afnot í dag
+      accounts_week: Einstök afnot í þessari viku
+      breakdown: Samantekt á notkun dagsins eftir uppruna
+      context: Samhengi
+      directory: Í möppunni
+      in_directory: "%{count} í möppunni"
+      last_active: Síðasta virkni
+      most_popular: Vinsælast
+      most_recent: Nýjast
+      name: Myllumerki
+      review: Yfirfara stöðufærslu
+      reviewed: Yfirfarið
+      title: Myllumerki
+      trending_right_now: Í umræðunni nákvæmlega núna
+      unique_uses_today: "%{count} færslur í dag"
+      unreviewed: Ekki yfirfarið
+      updated_msg: Það tókst að uppfæra stillingar myllumerkja
+    title: Stjórnendur
+    warning_presets:
+      add_new: Bæta við nýju
+      delete: Eyða
+      edit: Breyta
+      edit_preset: Breyta forstilltri aðvörun
+      title: Sýsla með forstilltar aðvaranir
+  admin_mailer:
+    new_pending_account:
+      body: Nákvæmari upplýsingar um nýja notandaaðganginn eru hér fyrir neðan. Þú getur samþykkt eða hafnað þessari umsókn.
+      subject: Nýr notandaaðgangur er kominn til yfirferðar á %{instance} (%{username})
+    new_report:
+      body: "%{reporter} hefur kært %{target}"
+      body_remote: Einhver frá %{domain} hefur kært %{target}
+      subject: Ný kæra vegna %{instance} (#%{id})
+    new_trending_tag:
+      body: 'Myllumerkið #%{name} er í umræðunni í dag, en hefur ekki verið yfirfarið áður. Það mun ekki verða birt opinberlega nema að þú samþykkir það, annars geturðu vistað eyðublaðið óbreytt og aldrei heyrt á þetta minnst framar.'
+      subject: Nýtt myllumerki er komið til yfirferðar á %{instance} (#%{name})
+  aliases:
+    add_new: Búa til samnefni (alias)
+    created_msg: Tókst að búa til samnefni. Þú getur núna byrjað að færa gögn af gamla aðgangnum.
+    deleted_msg: Tókst að fjarlægja samnefnið. Flutningur af þeim notandaaðgangi yfir á þennan er ekki lengur mögulegur.
+    hint_html: Ef þú vilt flytjast af öðrum notandaaðgangi yfir á þennan, þá geturðu búið hér til samnefni, sem er nauðsynlegt áður en þú getur haldið áfram við að flytja fylgjendur af gamla notandaaðgangnum yfir á þennan aðgang. Þessi aðgerð er í sjálfu sér <strong>skaðlaus og afturkræf</strong>. <strong>Yfirfærsla notandaaðgangsins er síðan ræst á gamla notandaaðgangnum</strong>.
+    remove: Aftengja samnefni
+  appearance:
+    advanced_web_interface: Ítarlegt vefviðmót
+    advanced_web_interface_hint: 'Ef þú vilt geta notað alla skjábreiddina gefur ítarlegt vefviðmót þér færi á að stilla marga mismunandi dálka svo hægt sé að sjá eins miklar upplýsingar í einu eins og þér hentar: Heim, tilkynningar, sameiginleg tímalína, ótiltekinn fjöldi lista og myllumerkja.'
+    animations_and_accessibility: Hreyfingar og algilt aðgengi
+    confirmation_dialogs: Staðfestingargluggar
+    discovery: Uppgötvun
+    localization:
+      body: Mastodon er þýtt af sjálfboðaliðum.
+      guide_link: https://crowdin.com/project/mastodon/is
+      guide_link_text: Allir geta tekið þátt.
+    sensitive_content: Viðkvæmt efni
+    toot_layout: Framsetning tísta
+  application_mailer:
+    notification_preferences: Breyta kjörstillingum tölvupósts
+    salutation: "%{name},"
+    settings: 'Breyta kjörstillingum tölvupósts: %{link}'
+    view: 'Skoða:'
+    view_profile: Skoða notandasnið
+    view_status: Skoða stöðufærslu
+  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!
+    your_token: Aðgangsteiknið þitt
+  auth:
+    apply_for_account: Beiðni um boð
+    change_password: Lykilorð
+    checkbox_agreement_html: Ég samþykki <a href="%{rules_path}" target="_blank">reglur vefþjónsins</a> og <a href="%{terms_path}" target="_blank">þjónustuskilmálana</a>
+    checkbox_agreement_without_rules_html: Ég samþykki <a href="%{terms_path}" target="_blank">þjónustuskilmálana</a>
+    delete_account: Eyða notandaaðgangi
+    delete_account_html: Ef þú vilt eyða notandaaðgangnum þínum, þá geturðu <a href="%{path}">farið í það hér</a>. Þú verður beðin/n um staðfestingu.
+    description:
+      prefix_invited_by_user: "@%{name} býður þér að taka þátt á þessum Mastodon-vefþjóni!"
+      prefix_sign_up: Skráðu þig á Mastodon strax í dag!
+      suffix: Með notandaaðgangi geturðu fylgst með fólki, sent inn stöðufærslur og skipst á skilaboðum við notendur á hvaða Mastodon-vefþjóni sem er, auk margs fleira!
+    didnt_get_confirmation: Fékkstu ekki leiðbeiningar um hvernig eigi að staðfesta aðganginn?
+    forgot_password: Gleymdirðu lykilorðinu?
+    invalid_reset_password_token: Teikn fyrir endurstillingu lykilorðs er ógilt eða útrunnið. Biddu um nýtt teikn.
+    login: Skrá inn
+    logout: Skrá út
+    migrate_account: Færa á annan notandaaðgang
+    migrate_account_html: Ef þú vilt endurbeina þessum aðgangi á einhvern annan, geturðu <a href="%{path}">stillt það hér</a>.
+    or_log_in_with: Eða skráðu inn með
+    providers:
+      cas: CAS
+      saml: SAML
+    register: Nýskrá
+    registration_closed: "%{instance} samþykkir ekki nýja meðlimi"
+    resend_confirmation: Senda leiðbeiningar vegna staðfestingar aftur
+    reset_password: Endursetja lykilorð
+    security: Öryggi
+    set_new_password: Stilla nýtt lykilorð
+    setup:
+      email_below_hint_html: Ef tölvupóstfangið hér fyrir neðan er rangt, skaltu breyta því hér og fá nýjan staðfestingarpóst.
+      email_settings_hint_html: Staðfestingarpósturinn var sendur til %{email}. Ef það tölvupóstfang er ekki rétt geturðu breytt því í stillingum notandaaðgangsins.
+      title: Uppsetning
+    status:
+      account_status: Staða notandaaðgangs
+      confirming: Bíð eftir að staðfestingu tölvupósts sé lokið.
+      functional: Notandaaðgangurinn þinn er með fulla virkni.
+      pending: Umsóknin þín bíður eftir að starfsfólkið okkar fari yfir hana. Það gæti tekið nokkurn tíma. Þú munt fá tölvupóst ef umsóknin er samþykkt.
+      redirecting_to: Notandaaðgangurinn þinn er óvirkur vegna þess að hann endurbeinist á %{acct}.
+    trouble_logging_in: Vandræði við að skrá inn?
+  authorize_follow:
+    already_following: Þú ert að þegar fylgjast með þessum aðgangi
+    error: Því miður, það kom upp villa við að fletta upp fjartengda notandaaðgangnum
+    follow: Fylgjast með
+    follow_request: 'Þú sendir beiðni um að fylgjast með til:'
+    following: 'Tókst! Þú ert núna að fylgjast með:'
+    post_follow:
+      close: Eða að þú getur lokað þessum glugga.
+      return: Birta notandasnið notandans
+      web: Fara á vefinn
+    title: Fylgjast með %{acct}
+  challenge:
+    confirm: Halda áfram
+    hint_html: "<strong>Ábending:</strong> Við munum ekki spyrja þig um lykilorðið aftur næstu klukkustundina."
+    invalid_password: Ógilt lykilorð
+    prompt: Staðfestu lykilorðið til að halda áfram
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count}kl."
+      about_x_months: "%{count}mán"
+      about_x_years: "%{count}ár"
+      almost_x_years: "%{count}ár"
+      half_a_minute: Núna
+      less_than_x_minutes: "%{count}mín"
+      less_than_x_seconds: Núna
+      over_x_years: "%{count}ár"
+      x_days: "%{count}d"
+      x_minutes: "%{count}mín"
+      x_months: "%{count}mán"
+      x_seconds: "%{count}sek"
+  deletes:
+    challenge_not_passed: Upplýsingarnar sem þú settir inn eru ekki réttar
+    confirm_password: Settu inn núverandi lykilorð þitt til að staðfesta auðkennin þín
+    confirm_username: Skrifaðu inn notandanafnið þitt til að halda áfram með ferlið
+    proceed: Eyða notandaaðgangi
+    success_msg: Það tókst að eyða notandaaðgangnum þínum
+    warning:
+      before: 'Áður en haldið er áfram, skaltu lesa þessa minnispunkta gaumgæfilega:'
+      caches: Efni sem aðrir netþjónar hafa sett í skyndiminni gæti verið til staðar áfram
+      data_removal: Færslurnar þínar og önnur gögn verða endanlega fjarlægð
+      email_change_html: Þú getur <a href="%{path}">breytt tölvupóstfanginu þínu</a> án þess að eyða aðgangnum þínum
+      email_contact_html: Ef hann berst ekki geturðu sent póst á <a href="mailto:%{email}">%{email}</a> til að fá aðstoð
+      email_reconfirmation_html: Ef staðfestingarpósturinn berst ekki geturðu <a href="%{path}">beðið um hann aftur</a>
+      irreversible: Þú munt ekki getað endurheimt eða endurvirkjað aðganginn þinn
+      more_details_html: Til að skoða þetta nánar, er gott að líta á <a href="%{terms_path}">persónuverndarstefnuna</a>.
+      username_available: Notandanafnið þitt mun verða tiltækt aftur
+      username_unavailable: Notandanafnið þitt mun verða áfram ótiltækt
+  directories:
+    directory: Notandasniðamappa
+    explanation: Leitaðu að notendum eftir áhugamálum þeirra
+    explore_mastodon: Kannaðu %{title}
+  domain_validator:
+    invalid_domain: er ekki leyfilegt nafn á léni
+  errors:
+    '400': Beiðnin sem þú sendir er ógild eða rangt uppsett.
+    '403': Þú hefur ekki heimildir til að skoða þessari síðu.
+    '404': Síðan sem þú leitar að er ekki þarna.
+    '406': Þessi síða er ekki tiltæk á umbeðna sniðinu.
+    '410': Síðan sem þú leitar að er ekki lengur til hérna.
+    '422':
+      content: Öryggisprófun mistókst. Ertu að loka á vefkökur/fótspor?
+      title: Öryggisprófun mistókst
+    '429': Í hægagangi
+    '500':
+      content: Því miður, en eitthvað fór úrskeiðis á okkar enda.
+      title: Þessi síða er ekki rétt
+    '503': Ekki var hægt að afgreiða síðuna vegna tímabundinnar bilunar á vefþjóni.
+    noscript_html: Til að nota vefútgáfu Mastodon þarftu að virkja JavaScript. Þú getur líka prófað eitt af Mastodon <a href="%{apps_path}">forritunum</a> fyrir stýrikerfið þitt.
+  existing_username_validator:
+    not_found: Fann ekki staðværan notanda með þetta notandanafn
+    not_found_multiple: tókst ekki að finna %{usernames}
+  exports:
+    archive_takeout:
+      date: Dagsetning
+      download: Náðu í safnskrána þína
+      hint_html: Þú getur beðið um safnskrá með <strong>tístunum þínum og innsendu myndefni</strong>. Útfluttu gögnin verða á ActivityPub-sniði, sem allur samhæfður hugbúnaður á að geta lesið. Þú getur beðið um safnskrá á 7 daga fresti.
+      in_progress: Set saman safnskrána þína...
+      request: Biddu um safnskrána þína
+      size: Stærð
+    blocks: Þú útilokar
+    csv: CSV
+    domain_blocks: Útilokanir á lénum
+    lists: Listar
+    mutes: Þú þaggar
+    storage: Geymsla myndefnis
+  featured_tags:
+    add_new: Bæta við nýju
+    errors:
+      limit: Þú ert þegar búin/n að gefa hámarksfjölda myllumerkja aukið vægi
+    hint_html: "<strong>Hvað eru myllumerki með aukið vægi?</strong> Þau eru birt áberandi á opinbera notandasniðinu þínu og gera fólki kleift að fletta í gegnum opinberu færslurnar þínar sérstaklega undir þessum myllumerkjum. Þau eru frábær aðferð við að halda utan um skapandi vinnu eða langtíma verkefni."
+  filters:
+    contexts:
+      home: Heimatímalína
+      notifications: Tilkynningar
+      public: Opinberar tímalínur
+      thread: Samtöl
+    edit:
+      title: Breyta síu
+    errors:
+      invalid_context: Ekkert eða ógilt samhengi var gefið
+      invalid_irreversible: Óendurkræf síun virkar bara í sambandi við heimasvæði eða tilkynningar
+    index:
+      delete: Eyða
+      empty: Þú ert ekki með neinar síur.
+      title: Síur
+    new:
+      title: Bæta við nýrri síu
+  footer:
+    developers: Forritarar
+    more: Meira…
+    resources: Tilföng
+    trending_now: Í umræðunni núna
+  generic:
+    all: Allt
+    changes_saved_msg: Það tókst að vista breytingarnar!
+    copy: Afrita
+    no_batch_actions_available: Engar magnvinnsluaðgerðir tiltækar á þessari síðu
+    order_by: Raða eftir
+    save_changes: Vista breytingar
+    validation_errors:
+      one: Ennþá er ekk alvegi allt í lagi! Skoðaðu vel villuna hér fyrir neðan
+      other: Ennþá er ekki alveg allt í lagi! Skoðaðu vel villurnar %{count} hér fyrir neðan
+  html_validator:
+    invalid_markup: 'inniheldur ógildar HTML-merkingar: %{error}'
+  identity_proofs:
+    active: Virkur
+    authorize: Já, heimila
+    authorize_connection_prompt: Auðkenna dulkóðaða tengingu?
+    errors:
+      failed: Dulrituð tenging mistókst, endilega reyndu aftur frá %{provider}.
+      keybase:
+        invalid_token: Keybase-teikn eru tætigildi undirritana og verða að vera 66 hex-stafir
+        verification_failed: Keybase skilur þetta teikn ekki sem undirritun Keybase-notandans %{kb_username}. Prófaðu aftur í Keybase.
+      wrong_user: Get ekki búið til sannvottun fyrir %{proving} á meðan skráð er inn sem %{current}. Skráðu inn sem %{proving} og prófaðu aftur.
+    explanation_html: Hér geturðu tengt dulritað önnur auðkenni þín, eins og t.d. Keybase-notandasnið. Þetta gerir öðru fólki kleift að senda þér dulrituð skilaboð og að treysta efni sem þú sendir þeim.
+    i_am_html: Ég er %{username} á %{service}.
+    identity: Auðkenni
+    inactive: Óvirkt
+    publicize_checkbox: 'Og tísti þetta:'
+    publicize_toot: 'Það er búið að sanna þetta! Ég er %{username} á %{service}: %{url}'
+    status: Staða sannvottunar
+    view_proof: Skoða sönnun
+  imports:
+    modes:
+      merge: Sameina
+      merge_long: Halda fyrirliggjandi færslum og bæta við nýjum
+      overwrite: Skrifa yfir
+      overwrite_long: Skipta út fyrirliggjandi færslum með þeim nýju
+    preface: Þú getur flutt inn gögn sem þú hefur flutt út frá öðrum vefþjóni, svo sem lista yfir fólk sem þú fylgist með eða útilokar.
+    success: Það tókst að senda inn gögnin þín og verður unnið með þau þegar færi gefst
+    types:
+      blocking: Listi yfir útilokanir
+      domain_blocking: Listi yfir útilokanir léna
+      following: Listi yfir þá sem fylgst er með
+      muting: Listi yfir þagganir
+    upload: Senda inn
+  in_memoriam_html: Minning.
+  invites:
+    delete: Gera óvirkt
+    expired: Útrunnið
+    expires_in:
+      '1800': 30 mínútur
+      '21600': 6 klukkustundir
+      '3600': 1 klukkustund
+      '43200': 12 klukkustundir
+      '604800': 1 vika
+      '86400': 1 dagur
+    expires_in_prompt: Aldrei
+    generate: Útbúa boðstengil
+    invited_by: 'Þér var boðið af:'
+    max_uses:
+      one: 1 afnot
+      other: "%{count} afnot"
+    max_uses_prompt: Engin takmörk
+    prompt: Útbúðu og deildu tenglum með öðrum til að veita aðgang að þessum vefþjóni
+    table:
+      expires_at: Rennur út
+      uses: Afnot
+    title: Bjóða fólki
+  lists:
+    errors:
+      limit: Þú hefur náð hámarksfjölda lista
+  media_attachments:
+    validations:
+      images_and_video: Ekki er hægt að hengja myndskeið við stöðufærslu sem þegar inniheldur myndir
+      too_many: Ekki er hægt að hengja við fleiri en 4 skrár
+  migrations:
+    acct: Færði í
+    cancel: Hætta við endurbeiningu
+    cancel_explanation: Sé hætt við endurbeiningu verður núverandi aðgangur þinn endurvirkjaður, en það mun ekki ná til baka þeim fylgjendum sem hafa verið fluttir á þann aðgang.
+    cancelled_msg: Tókst að hætta við endurbeiningu.
+    errors:
+      already_moved: er sami aðgangur og þú hefur þegar flutt þig á
+      missing_also_known_as: er ekki að bakvísa í þennan aðgang
+      move_to_self: getur ekki verið núverandi aðgangur
+      not_found: fannst ekki
+      on_cooldown: Þú ert í kælingu
+    followers_count: Fylgjendur þegar flutningur átti sér stað
+    incoming_migrations: Flytjast frá öðrum aðgangi
+    incoming_migrations_html: Til að flytjast af öðrum notandaaðgangi yfir á þennan, þarftu fyrst að <a href="%{path}">útbúa samnefni fyrir aðgang</a>.
+    moved_msg: Notandaaðgangurinn þinn endurbeinist núna á %{acct} og er verið að yfirfæra fylgjendurna þína.
+    not_redirecting: Notandaaðgangurinn þinn er ekki að endurbeinast á neinn annan aðgang.
+    on_cooldown: Þú hefur nýverið yfirfært aðganginn þinn. Þessi aðgerð verður tiltæk aftur eftir %{count} daga.
+    past_migrations: Fyrri yfirfærslur
+    proceed_with_move: Færa fylgjendur
+    redirecting_to: Notandaaðgangurinn þinn endurbeinist á %{acct}.
+    set_redirect: Stilla endurbeiningu
+    warning:
+      backreference_required: Það verður fyrst að stilla nýja aðganginn til að bakvísa á þennan aðgang
+      before: 'Áður en haldið er áfram, skaltu lesa þessa minnispunkta gaumgæfilega:'
+      cooldown: Eftir yfirfærslu/flutning kemur kælingartímabil á meðan þú getur ekki flutt þig aftur
+      disabled_account: Núverandi aðgangur þinn verður ekki nothæfur að fullu eftir þetta. Hinsvegar muntu geta flutt út gögn af honum og einnig endurvirkjað hann.
+      followers: Þessi aðgerð mun flytja alla fylgjendur af núverandi aðgangi yfir á nýja aðganginn
+      only_redirect_html: Einnig geturðu <a href="%{path}">einungis sett upp endurbeiningu á notandasniðið þitt</a>.
+      other_data: Engin önnur gögn munu flytjast sjálfvirkt
+      redirect: Notandasnið aðgangsins verður uppfært með athugasemd um endurbeininguna og verður undanþegið frá leitum
+  moderation:
+    title: Umsjón
+  notification_mailer:
+    digest:
+      action: Skoða allar tilkynningar
+      body: Hér er stutt yfirlit yfir þau skilaboð sem þú gætir hafa misst af síðan þú leist inn síðast %{since}
+      mention: "%{name} minntist á þig í:"
+      new_followers_summary:
+        one: Að auki, þú hefur fengið einn nýjan fylgjanda á meðan þú varst fjarverandi! Húh!
+        other: Að auki, þú hefur fengið %{count} nýja fylgjendur á meðan þú varst fjarverandi! Frábært!
+      subject:
+        one: "1 ný tilkynning síðan þú leist inn síðast \U0001F418"
+        other: "%{count} nýjar tilkynningar síðan þú leist inn síðast \U0001F418"
+      title: Á meðan þú varst fjarverandi...
+    favourite:
+      body: 'Stöðufærslan þín var sett í eftirlæti af %{name}:'
+      subject: "%{name} setti stöðufærslu þína í eftirlæti"
+      title: Nýtt eftirlæti
+    follow:
+      body: "%{name} er núna að fylgjast með þér!"
+      subject: "%{name} er núna að fylgjast með þér"
+      title: Nýr fylgjandi
+    follow_request:
+      action: Sýsla með fylgjendabeiðnir
+      body: "%{name} hefur beðið um að fylgjast með þér"
+      subject: 'Fylgjandi í bið: %{name}'
+      title: Ný beiðni um að fylgjast með
+    mention:
+      action: Svara
+      body: "%{name} minntist á þig í:"
+      subject: "%{name} minntist á þig"
+      title: Ný tilvísun
+    reblog:
+      body: "%{name} endurbirti stöðufærsluna þína:"
+      subject: "%{name} endurbirti stöðufærsluna þína"
+      title: Ný endurbirting
+  notifications:
+    email_events: Atburðir fyrir tilkynningar í tölvupósti
+    email_events_hint: 'Veldu þá atburði sem þú vilt fá tilkynningar í tölvupósti þegar þeir koma upp:'
+    other_settings: Aðrar stillingar varðandi tilkynningar
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: bi.
+          million: mi.
+          quadrillion: qi.
+          thousand: þús
+          trillion: tr.
+  pagination:
+    newer: Nýrra
+    next: Næsta
+    older: Eldra
+    prev: Fyrra
+    truncate: "&hellip;"
+  polls:
+    errors:
+      already_voted: Þú hefur þegar greitt atkvæði í þessari könnun
+      duplicate_options: innihalda tvítekin atriði
+      duration_too_long: er of langt inn í framtíðina
+      duration_too_short: er of snemma
+      expired: Könnuninni er þegar lokið
+      invalid_choice: Þessi valkostur er ekki til
+      over_character_limit: geta ekki verið lengri en %{max} stafir hvert
+      too_few_options: verður að vera með fleiri en eitt atriði
+      too_many_options: getur ekki innihaldið meira en %{max} atriði
+  preferences:
+    other: Annað
+    posting_defaults: Sjálfgefin gildi við gerð færslna
+    public_timelines: Opinberar tímalínur
+  relationships:
+    activity: Virkni aðgangs
+    dormant: Sofandi
+    followers: Fylgjendur
+    following: Fylgist með
+    last_active: Síðasta virkni
+    most_recent: Nýjast
+    moved: Fært
+    mutual: Sameiginlegir
+    primary: Aðal
+    relationship: Vensl
+    remove_selected_domains: Fjarlægja alla fylgjendur frá völdum lénum
+    remove_selected_followers: Fjarlægja valda fylgjendur
+    remove_selected_follows: Hætta að fylgjast með völdum notendum
+    status: Staða aðgangs
+  remote_follow:
+    acct: Settu inn notandanafn@lén þaðan sem þú vilt vera virk/ur
+    missing_resource: Gat ekki fundið endurbeiningarslóðina fyrir notandaaðganginn þinn
+    no_account_html: Ertu ekki með aðgang? Þú getur <a href='%{sign_up_path}' target='_blank'>nýskráð þig hér</a>
+    proceed: Halda áfram í að fylgjast með
+    prompt: 'Þú ætlar að fara að fylgjast með:'
+    reason_html: "<strong>Hvers vegna er þetta skref nauðsynlegt?</strong> <code>%{instance}</code> er ekki endilega netþjónninn þar sem þú ert skráð/ur, þannig að við verðum að endurbeina þér á heimaþjóninn þinn fyrst."
+  remote_interaction:
+    favourite:
+      proceed: Halda áfram í að setja í eftirlæti
+      prompt: 'Þú ætlar að setja þetta tíst í eftirlæti:'
+    reblog:
+      proceed: Halda áfram í endurbirtingu
+      prompt: 'Þú ætlar að endurbirta þetta tíst:'
+    reply:
+      proceed: Halda áfram í að svara
+      prompt: 'Þú ætlar að svara þessu tísti:'
+  scheduled_statuses:
+    over_daily_limit: Þú hefur farið fram úr hámarkinu með %{limit} áætluð tíst fyrir þennan dag
+    over_total_limit: Þú hefur farið fram úr hámarkinu með %{limit} áætluð tíst
+    too_soon: Áætluð dagsetning verður að vera í framtíðinni
+  sessions:
+    activity: Síðasta virkni
+    browser: Vafri
+    browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Electron
+      firefox: Firefox
+      generic: Óþekktur vafri
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Nokia S40 Ovi vafri
+      opera: Opera
+      otter: Otter
+      phantom_js: PhantomJS
+      qq: QQ vafri
+      safari: Safari
+      uc_browser: UCBrowser
+      weibo: Weibo
+    current_session: Núverandi seta
+    description: "%{browser} á %{platform}"
+    explanation: Þetta eru vafrarnir sem núna eru skráðir inn á Mastodon-aðganginn þinn.
+    ip: IP-vistfang
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
+      mac: Mac
+      other: óþekktu stýrikerfi
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
+    revoke: Afturkalla
+    revoke_success: Tókst að afturkalla setu
+    title: Setur
+  settings:
+    account: Notandaaðgangur
+    account_settings: Stillingar notandaaðgangs
+    aliases: Samheiti notandaaðgangs
+    appearance: Útlit
+    authorized_apps: Leyfð forrit
+    back: Til baka í Mastodon
+    delete: Eyðing notandaaðgangs
+    development: Þróun
+    edit_profile: Breyta notandasniði
+    export: Útflutningur gagna
+    featured_tags: Myllumerki með aukið vægi
+    identity_proofs: Sannanir á auðkenni
+    import: Flytja inn
+    import_and_export: Inn- og útflutningur
+    migrate: Yfirfærsla notandaaðgangs
+    notifications: Tilkynningar
+    preferences: Kjörstillingar
+    profile: Notandasnið
+    relationships: Fylgist með og fylgjendur
+    two_factor_authentication: Teggja-þátta auðkenning
+  spam_check:
+    spam_detected: Þetta er sjálfvirk kæra. Ruslpóstur hefur fundist.
+  statuses:
+    attached:
+      description: 'Viðhengt: %{attached}'
+      image:
+        one: "%{count} mynd"
+        other: "%{count} myndir"
+      video:
+        one: "%{count} myndskeið"
+        other: "%{count} myndskeið"
+    boosted_from_html: Endurbirt frá %{acct_link}
+    content_warning: 'Aðvörun vegna efnis (CW): %{warning}'
+    disallowed_hashtags:
+      one: 'innihélt óleyfilegt myllumerki: %{tags}'
+      other: 'innihélt óleyfilegu myllumerkin: %{tags}'
+    language_detection: Greina tungumál sjálfvirkt
+    open_in_web: Opna í vafra
+    over_character_limit: hámarksfjölda stafa (%{max}) náð
+    pin_errors:
+      limit: Þú hefur þegar fest leyfilegan hámarksfjölda tísta
+      ownership: Tíst frá einhverjum öðrum er ekki hægt að festa
+      private: Óopinber tíst er ekki hægt að festa
+      reblog: Ekki er hægt að festa endurbirtingu
+    poll:
+      total_people:
+        one: "%{count} aðili"
+        other: "%{count} aðilar"
+      total_votes:
+        one: "%{count} atkvæði"
+        other: "%{count} atkvæði"
+      vote: Greiða atkvæði
+    show_more: Sýna meira
+    sign_in_to_participate: Skráðu þig inn til að taka þátt í samtalinu
+    title: "%{name}: „%{quote}‟"
+    visibilities:
+      private: Einungis fylgjendur
+      private_long: Aðeins birt fylgjendum
+      public: Opinber
+      public_long: Allir geta séð
+      unlisted: Óskráð
+      unlisted_long: Allir geta skoðað, en er ekki talið upp á opinberum tímalínum
+  stream_entries:
+    pinned: Fest tíst
+    reblogged: endurbirt
+    sensitive_content: Viðkvæmt efni
+  tags:
+    does_not_match_previous_name: samsvarar ekki fyrra nafni
+  terms:
+    body_html: |
+      <h2>Persónuverndarstefna </h2>
+      <h3 id="collect">Hvaða upplýsingum söfnum við?</h3>
+
+      <ul>
+      <li><em>Grunnupplýsingar um notandaaðgang</em>: Ef þú skráir þig á þessum netþjóni gætirðu verið beðinn um að slá inn notandanafn, tölvupóstfang og lykilorð. Þú getur einnig sett inn viðbótarupplýsingar eins og birtingarnafn og æviágrip auk þess að hlaða inn auðkennismynd eða mynd til að birta á síðuhaus. Notandanafn, birtingarnafn, æviágrip, auðkennismynd og hausmynd eru alltaf skráð opinberlega. </li>
+      <li><em>Skilaboð, fylgnigögn og aðrar opinberar upplýsingar</em>: Listinn yfir þá sem þú fylgist með er skráður opinberlega, það sama er að segja um þá sem fylgjast með þér. Þegar þú sendir skilaboð er dagsetning og tími vistaður sem og hvaða forrit þú sendir skilaboðin frá. Skilaboð geta innihaldið viðhengi, svo sem myndir og myndskeið. Opinberar og óskráðar færslur er aðgengilegar opinberlega. Þegar þú birtir færslu á notandasniðinu þínu (forsíðu) eru það einnig opinberar upplýsingar. Færslurnar þínar eru sendar þeim sem fylgjast með þér, í sumum tilvikum þýðir það að þær eru afhentar á aðra netþjóna og afrit geymd þar. Þegar þú eyðir færslum er það sömuleiðis birt fylgjendum þínum. Aðgerðir eins og að endurbirta eða setja færslu í eftirlæti eru ávallt opinberar.</li>
+      <li><em>Beinar færslur og eingöngu til fylgjenda</em>: Öll innlegg eru geymd og unnin á netþjóninum. Færslur sem eingöngu eru til fylgjenda berast til fylgjenda þinna og þeirra notenda sem minnst er á í þeim, beinar færslur berast aðeins til notenda sem getið er um í viðkomandi færslu. Í sumum tilvikum þýðir það að færslurnar eru afhentar á aðra netþjóna og afrit geymd þar. Við leggjum mikla áherslu á að takmarka aðgang að þessum færslum einungis við aðila sem til þess hafa heimild, en aðrir utanaðkomandi netþjónar gætu mögulega ekki gert það. Þess vegna er mikilvægt að skoða vel þá netþjóna sem fylgjendur þínir tilheyra. Þú getur valið að þurfa að samþykkja og hafna nýjum fylgjendum handvirkt í stillingunum.<em>Hafðu í huga að rekstraraðilar netþjónsins og allir viðtakendamiðlarar geta skoðað slík skilaboð</em> og að viðtakendur geta tekið skjámyndir, afritað eða á annan hátt deilt þessum gögnum. <em>Ekki deila hættulegum upplýsingum í gegnum Mastodon.</em></li>
+      <li><em>IP-vistföng og önnur lýsigögn</em>: Þegar þú skráir þig inn skráum við IP-töluna sem þú skráir þig inn af, sem og heiti vafraforritsins þíns. Allar innskráðar setur verða tiltækar til skoðunar og afturköllunar í stillingunum. Síðast notaða IP-talan er geymd í allt að 12 mánuði. Við gætum líka haldið eftir atvikaskrám netþjónsins sem gæti innihaldið IP-tölur allra beiðna til netþjónsins.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">Til hvers notum við upplýsingarnar þínar?</h3>
+
+      <p>Hvað sem er af þeim upplýsingum sem við söfnum frá þér má nota á eftirfarandi vegu:</p>
+
+      <ul>
+      <li>Til að veita grunnvirkni Mastodon. Þú getur aðeins haft samskipti við efni annarra eða sent inn þitt eigið efni þegar þú ert skráð/ur inn. Til dæmis gætirðu fylgst með öðru fólki og skoðað safn færslna þeirra á þinni eigin persónulega sérsniðnu tímalínu.</li>
+      <li>Til að hjálpa til við umsjón og viðhald samfélags/hóps, til dæmis að bera saman IP-tölu þína við aðrar þekktar til að greina frávik frá bönnum eða öðrum brotum.</li>
+      <li>Tölvupóstfangið sem þú gefur upp má nota til að senda þér upplýsingar, tilkynningar um annað fólk sem átt hefur við efnið þitt eða til að senda þér skilaboð eða svara fyrirspurnum og/eða öðrum beiðnum eða spurningum.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="protect">Hvernig verndum við upplýsingarnar þínar? </h3>
+
+      <p>Við setjum upp margvíslegar öryggisráðstafanir til að viðhalda öryggi persónuupplýsinganna þinna þegar þú setur inn, sendir eða opnar persónulegar upplýsingar. Meðal annars er vafrasetan þín, svo og umferðin milli forritanna þinna og API-kerfisviðmótsins tryggð með SSL, og lykilorðið þitt er varið með tætigildi (hashed) með sterku einhliða reikniriti. Þú gætir virkjað tveggja-þátta auðkenningu til að tryggja enn frekar aðganginn að notandaaðgangnum þínum. </p>
+
+      <hr class="spacer" />
+
+      <h3 id="data-retention">Hver er stefna okkar varðandi varðveislu gagna?</h3>
+
+      <p>Við munum leggja okkur fram um að:</p>
+
+      <ul>
+      <li>Halda eftir atvikaskrám netþjóns sem innihalda IP-tölu allra beiðna til þessa netþjóns, að svo miklu leyti sem slíkar skrár eru geymdar, ekki lengur en í en 90 daga.</li>
+      <li> Halda eftir IP-tölum sem tengjast skráðum notendum ekki lengur en 12 mánuði.</li>
+      </ul>
+
+      <p>Þú getur beðið um og ná í safnskrá með öllu þínu efni, þar með taldar færslur, margmiðlunarviðhengi, auðkennismynd og mynd á síðuhaus. </p>
+
+      <p>Þú getur eytt reikningi þínum óafturkræft hvenær sem er.</p>
+
+      <hr class="spacer"/>
+
+      <h3 id="cookies">Notum við vefkökur?</h3>
+
+      <p>Já. Vefkökur eða fótspor eru litlar skrár sem vefsvæði eða þjónustuveitandi setur á harða diskinn í tölvunni þinni í gegnum vafrann þinn (ef þú leyfir það). Þessar vefkökur gera vefsvæðinu kleift að þekkja vafrann þinn og ef þú ert með skráðan notandaaðgang skaltu tengja vafrann við skráða notandaaðganginn þinn. </p>
+
+      <p>Við notum vafrakökur til að skilja og vista kjörstillingar þínar fyrir næstu heimsóknir.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="disclose">Veitum við upplýsingar til utanaðkomandi aðila?</h3>
+
+      <p>Við seljum ekki, verslum eða flytjum á annan hátt persónulegar upplýsingar þínar til utanaðkomandi aðila. Þetta nær ekki til traustra þriðja aðila sem aðstoða okkur við að reka síðuna okkar, aðstoða við starfsemi okkar eða við að þjónusta þig, svo framarlega sem þessir aðilar eru sammála um að halda þessum gögnum sem trúnaðarupplýsingum. Við gætum einnig átt það til að gefa upp upplýsingar frá þér þegar við teljum að birting þeirra sé viðeigandi til að fara eftir lögum, framfylgja stefnu okkar á vefnum eða vernda réttindi okkar, eignir eða öryggi okkar eða annarra.</p>
+
+      <p>Opinberu efni þínu getur verið hlaðið inn af öðrum netþjónum á netinu. Opinberu skilaboðin þín ásamt færslum eingöngu til fylgjenda berast þeim netþjónum þar sem fylgjendur þínir eru skráðir og bein skilaboð eru send til netþjóna viðtakendanna, að svo miklu leyti sem þeir fylgjendur eða viðtakendur eru skráðir á öðrum netþjónum en þessum.</p>
+
+      <p>Þegar þú leyfir forriti að nota aðganginn þinn, fer það eftir umfangi heimildanna sem þú gefur hvort það getur það fengið aðgang að opinberum notandasniðsupplýsingum þínum, lista yfir þá sem þú fylgist með, lista yfir þá sem fylgjast með þér, öðrum listum þínum, öllum þínum færslum og eftirlætum. Forrit geta aldrei fengið tölvupóstfangið þitt eða lykilorð.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="children">Notkun vefsvæðis fyrir börn</h3>
+
+      <p> Ef þessi netþjónn er innan ESB eða EES: Vefnum okkar, vörum og þjónustu er allri beint að fólki sem er að minnsta kosti 16 ára gamalt. Ef þú ert yngri en 16 ára, þá máttu samkvæmt kröfum GDPR (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation"> Almenn reglugerð um gagnavernd</a>) ekki nota þessa síðu.</p>
+
+      <p>Ef þessi netþjónn er í Bandaríkjunum: Vefnum okkar, vörum og þjónustu er allri beint að fólki sem er að minnsta kosti 13 ára gamalt. Ef þú ert yngri en 13 ára, þá máttu samkvæmt kröfum COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Lög um persónuvernd barna á netinu</a>) ekki nota þessa síðu. </p>
+
+      <p>Lagakröfur geta verið aðrar ef þessi netþjónn er í annarri lögsögu.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="changes">Breytingar á persónuverndarstefnu okkar</h3>
+
+      <p> Ef við ákveðum að breyta persónuverndarstefnu okkar munum við birta þær breytingar á þessari síðu. </p>
+
+      <p> Þetta skjal er með CC-BY-SA notkunarleyfi. Það var síðast uppfært 7. mars 2018.</p>
+
+      <p> Upprunalega aðlagað úr <a href="https://github.com/discourse/discourse">persónuverndarstefnu Discourse</a>.</p>
+    title: "%{instance} - Þjónustuskilmálar og persónuverndarstefna"
+  themes:
+    contrast: Mastodon (mikil birtuskil)
+    default: Mastodon (dökkt)
+    mastodon-light: Mastodon (ljóst)
+  time:
+    formats:
+      default: "%d. %b, %Y, %H:%M"
+      month: "%b %Y"
+  two_factor_authentication:
+    code_hint: Settu inn kóðann sem auðkenningarforritið útbjó til staðfestingar
+    description_html: Ef þú virkjar <strong>tvíþátta auðkenningu</strong> mun innskráning krefjast þess að þú hafir símann þinn við hendina, með honum þarf að útbúa öryggisteikn sem þú þarft að setja inn.
+    disable: Gera óvirkt
+    enable: Virkja
+    enabled: Tveggja-þátta auðkenning er virk
+    enabled_success: Það tókst að virkja tveggja-þátta auðkenningu
+    generate_recovery_codes: Útbúa endurheimtukóða
+    instructions_html: "<strong>Skannaðu þennar QR-kóða inn í Google Authenticator eða álíka TOTP-forrit á símanum þínum</strong>. Héðan í frá mun það forrit útbúa teikn sem þú verður að setja inn til að geta skráð þig inn."
+    lost_recovery_codes: Endurheimtukóðar gera þér kleift að fá aftur samband við notandaaðganginn þinn ef þú tapar símanum þínum. Ef þú aftur hefur tapað endurheimtukóðunum, geturðu endurgert þá hér. Gömlu endurheimtukóðarnir verða þá ógiltir.
+    manual_instructions: 'Ef þú getur ekki skannað QR-kóðann og verður að setja hann inn handvirkt, þá er hér leyniorðið á textaformi:'
+    recovery_codes: Kóðar fyrir endurheimtingu öryggisafrits
+    recovery_codes_regenerated: Það tókst að endurgera endurheimtukóða
+    recovery_instructions_html: Ef þú tapar símanum þínum geturðu notað einn af endurheimtukóðunum hér fyrir neðan til að fá aftur samband við notandaaðganginn þinn. <strong>Geymdu endurheimtukóðana á öruggum stað</strong>. Sem dæmi gætirðu prentað þá út og geymt með öðrum mikilvægum skjölum.
+    setup: Setja upp
+    wrong_code: Kóðinn sem þú settir inn er ógildur! Eru klukkur netþjónsins og tækisins réttar?
+  user_mailer:
+    backup_ready:
+      explanation: Þú baðst um fullt öryggisafrit af Mastodon notandaaðgangnum þínum. Það er núna tilbúið til niðurhals!
+      subject: Safnskráin þín er tilbúin til niðurhals
+      title: Taka út í safnskrá
+    warning:
+      explanation:
+        disable: Á meðan aðgangurinn þinn er frystur, eru gögn aðgangsins ósnert, en þú getur ekki framkvæmt neinar aðgerðir fyrr en honum hefur verið aflæst.
+        silence: Á meðan aðgangurinn þinn er takmarkaður, mun aðeins fólk sem þegar fylgist með þér sjá tístin þín á þessum vefþjóni, auk þess sem lokað gæti verið á þig á ýmsum opinberum listum. Aftur á móti geta aðrir gerst fylgjendur þínir handvirkt.
+        suspend: Aðgangurinn þinn hefur verið settur í biðstöðu, öll þín tíst og innsent myndefni hafa verið óafturkræft fjarlægð af þessum vefþjóni, sem og af þeim vefþjónum þar sem þú áttir þér fylgjendur.
+      get_in_touch: Þú getur svarað þessum tölvupósti til að setja þig í samband við umsjónarmenn %{instance}.
+      review_server_policies: Yfirfara reglur vefþjónsins
+      statuses: 'Sérstaklega fyrir:'
+      subject:
+        disable: Notandaaðgangurinn þinn %{acct} hefur verið frystur
+        none: Aðvörun fyrir %{acct}
+        silence: Notandaaðgangurinn þinn %{acct} hefur verið takmarkaður
+        suspend: Notandaaðgangurinn þinn %{acct} hefur verið settur í bið
+      title:
+        disable: Notandaaðgangur frystur
+        none: Aðvörun
+        silence: Notandaaðgangur takmarkaður
+        suspend: Notandaaðgangur í bið
+    welcome:
+      edit_profile_action: Setja upp notandasnið
+      edit_profile_step: Þú getur sérsniðið notandasniðið þitt með því að senda inn auðkennismynd, síðuhaus, breytt birtingarnafninu þínu og ýmislegt fleira. Ef þú vilt yfirfara nýja fylgjendur áður en þeim er leyft að fylgjast með þér geturðu læst aðgangnum þínum.
+      explanation: Hér eru nokkrar ábendingar til að koma þér í gang
+      final_action: Byrjaðu að skrifa
+      final_step: 'Byrjaðu að tjá þig! Jafnvel án fylgjenda geta aðrir séð opinberar færslur frá þér, til dæmis á staðværu tímalínunni og í myllumerkjum. Þú gætir jafnvel viljað kynna þig með myllumerkinu #introductions.'
+      full_handle: Fullt auðkenni þitt
+      full_handle_hint: Þetta er það sem þú myndir gefa upp við vini þína svo þeir geti sent þér skilaboð eða fylgst með þér af öðrum netþjóni.
+      review_preferences_action: Breyta kjörstillingum
+      review_preferences_step: Gakktu úr skugga um að kjörstillingarnar séu eins og þú vilt hafa þær, eins og t.d. hvaða tölvupóst þú vilt fá, eða hvaða stig friðhelgi þú vilt að færslurnar þínar hafi sjálfgefið. Ef þú hefur ekkert á móti sjónrænu áreiti geturðu virkjað sjálvirka spilun GIF-hreyfimynda.
+      subject: Velkomin í Mastodon
+      tip_federated_timeline: Sameiginlega tímalínan er færibandasýn á Mastodon netkerfið. En hún inniheldur bara fólk sem nágrannar þínir eru áskrifendur að, þannig að hún er ekki tæmandi.
+      tip_following: Sjálfgefið er að þú fylgist með stjórnanda eða stjórnendum vefþjónsins. Til að finna fleira áhugavert fólk ættirðu að kíkja á staðværu og sameiginlegu tímalínurnar.
+      tip_local_timeline: Staðværa tímalínan er færibandasýn á allt fólkið á %{instance}. Þetta eru þínir næstu nágrannar!
+      tip_mobile_webapp: Ef farsímavafrinn býður þér að bæta Mastodon á heimaskjáinn þinn, muntu geta tekið á móti ýti-tilkynningum. Það virkar á ýmsa vegu eins og um uppsett forrit sé að ræða!
+      tips: Ábendingar
+      title: Velkomin/n um borð, %{name}!
+  users:
+    follow_limit_reached: Þú getur ekki fylgst með fleiri en %{limit} aðilum
+    invalid_email: Tölvupóstfangið er ógilt
+    invalid_otp_token: Ógildur tveggja-þátta kóði
+    otp_lost_help_html: Ef þú hefur misst aðganginn að hvoru tveggja, geturðu sett þig í samband við %{email}
+    seamless_external_login: Innskráning þín er í gegnum utanaðkomandi þjónustu, þannig að stillingar fyrir lykilorð og tölvupóst eru ekki aðgengilegar.
+    signed_in_as: 'Skráð inn sem:'
+  verification:
+    explanation_html: 'Þú getur <strong>vottað að þú sért eigandi og ábyrgur fyrir tenglunum í lýsigögnum notandasniðsins þíns</strong>. Til að það virki, þurfa vefsvæðin sem vísað er í að innihalda tengil til baka í Mastodon-notandasniðið. Tengillinn sem vísar til baka <strong>verður</strong> að vera með <code>rel="me"</code> eigindi. Textinn í tenglinum skiptir ekki máli. Hérna er dæmi:'
+    verification: Sannprófun
diff --git a/config/locales/it.yml b/config/locales/it.yml
index aadf0f3d6..a7e811e22 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -2,7 +2,7 @@
 it:
   about:
     about_hashtag_html: Questi sono i toot pubblici etichettati con <strong>#%{hashtag}</strong>. Puoi interagire con loro se hai un account nel fediverse.
-    about_mastodon_html: Mastodon è un social network <em>gratuito e open-source</em>. Un'alternativa <em>decentralizzata</em> alle piattaforme commerciali che evita che una singola compagnia monopolizzi il tuo modo di comunicare. Scegli un server di cui ti fidi &mdash; qualunque sia la tua scelta, potrai interagire con chiunque altro. Chiunque può sviluppare un suo server Mastodon e partecipare alla vita del <em>social network</em>.
+    about_mastodon_html: 'Il social network del futuro: niente pubblicità, niente controllo da parte di qualche azienda privata, design etico e decentralizzazione! Con Mastodon il proprietario dei tuoi dati sei tu!'
     about_this: A proposito di questo server
     active_count_after: attivo
     active_footnote: Utenti Attivi Mensili (MAU)
@@ -78,6 +78,7 @@ it:
     roles:
       admin: Amministratore
       bot: Bot
+      group: Gruppo
       moderator: Moderatore
     unavailable: Profilo non disponibile
     unfollow: Non seguire più
@@ -198,10 +199,12 @@ it:
         confirm_user: "%{name} ha confermato l'indirizzo email per l'utente %{target}"
         create_account_warning: "%{name} ha mandato un avvertimento a %{target}"
         create_custom_emoji: "%{name} ha caricato un nuovo emoji %{target}"
+        create_domain_allow: "%{name} ha messo il dominio %{target} nella whitelist"
         create_domain_block: "%{name} ha bloccato il dominio %{target}"
         create_email_domain_block: "%{name} ha messo il dominio email %{target} nella blacklist"
         demote_user: "%{name} ha degradato l'utente %{target}"
         destroy_custom_emoji: "%{name} ha distrutto l'emoji %{target}"
+        destroy_domain_allow: "%{name} ha tolto il dominio %{target} dalla whitelist"
         destroy_domain_block: "%{name} ha sbloccato il dominio %{target}"
         destroy_email_domain_block: "%{name}ha messo il dominio email %{target} nella whitelist"
         destroy_status: "%{name} ha eliminato lo status di %{target}"
@@ -243,6 +246,7 @@ it:
       enabled: Abilitato
       enabled_msg: Questa emoji è stata abilitata con successo
       image_hint: PNG fino a 50 KB
+      list: Includi nell'elenco
       listed: Elencato
       new:
         title: Aggiungi nuovo emoji personalizzato
@@ -251,6 +255,7 @@ it:
       shortcode_hint: Almeno due caratteri, solo caratteri alfanumerici e trattino basso
       title: Emoji personalizzate
       uncategorized: Nessuna categoria
+      unlist: Escludi dall'elenco
       unlisted: Non elencato
       update_failed_msg: Impossibile aggiornare questa emojii
       updated_msg: Emoji aggiornata con successo!
@@ -334,13 +339,11 @@ it:
       delete: Elimina
       destroyed_msg: Dominio email cancellato con successo dalla lista nera
       domain: Dominio
+      empty: Nessun dominio di posta elettronica attualmente in blacklist.
       new:
         create: Aggiungi dominio
         title: Nuova voce della lista nera delle email
       title: Lista nera email
-    followers:
-      back_to_account: Torna all'account
-      title: Seguaci di %{acct}
     instances:
       by_domain: Dominio
       delivery_available: Distribuzione disponibile
@@ -389,10 +392,18 @@ it:
       created_msg: Nota rapporto creata!
       destroyed_msg: Nota rapporto cancellata!
     reports:
+      account:
+        notes:
+          one: "%{count} nota"
+          other: "%{count} note"
+        reports:
+          one: "%{count} rapporto"
+          other: "%{count} rapporti"
       action_taken_by: Azione intrapresa da
       are_you_sure: Sei sicuro?
       assign_to_self: Assegna a me
       assigned: Moderatore assegnato
+      by_target_domain: Dominio dell'account segnalato
       comment:
         none: Nessuno
       created_at: Segnalato
@@ -438,6 +449,8 @@ it:
         users: Agli utenti locali connessi
       domain_blocks_rationale:
         title: Mostra motivazione
+      enable_bootstrap_timeline_accounts:
+        title: Abilita seguiti predefiniti per i nuovi utenti
       hero:
         desc_html: Mostrata nella pagina iniziale. Almeno 600x100 px consigliati. Se non impostata, sarà usato il thumbnail del server
         title: Immagine dell'eroe
@@ -529,6 +542,7 @@ it:
       most_popular: Più popolari
       most_recent: Più recenti
       name: Hashtag
+      review: Esamina status
       reviewed: Controllato
       title: Hashtag
       trending_right_now: Di tendenza ora
@@ -566,6 +580,10 @@ it:
       Home, notifiche, timeline federata, qualsiasi numero di liste e etichette.
     animations_and_accessibility: Animazioni e accessibiiltà
     confirmation_dialogs: Dialoghi di conferma
+    localization:
+      body: Mastodon è tradotto da volontari.
+      guide_link: https://it.crowdin.com/project/mastodon
+      guide_link_text: Tutti possono contribuire.
     sensitive_content: Contenuto sensibile
     toot_layout: Layout dei toot
   application_mailer:
@@ -614,6 +632,7 @@ it:
     setup:
       email_below_hint_html: Se l'indirizzo e-mail sottostante non è corretto, puoi cambiarlo qui e ricevere una nuova e-mail di conferma.
       email_settings_hint_html: L'email di conferma è stata inviata a %{email}. Se l'indirizzo e-mail non è corretto, puoi modificarlo nelle impostazioni dell'account.
+      title: Configurazione
     status:
       account_status: Stato dell'account
       confirming: In attesa che la conferma e-mail sia completata.
@@ -703,7 +722,6 @@ it:
     blocks: Stai bloccando
     csv: CSV
     domain_blocks: Blocchi di dominio
-    follows: Stai seguendo
     lists: Liste
     mutes: Stai silenziando
     storage: Archiviazione media
@@ -725,6 +743,7 @@ it:
       invalid_irreversible: Il filtraggio irreversibile funziona solo nei contesti di home o notifiche
     index:
       delete: Cancella
+      empty: Non hai alcun filtro.
       title: Filtri
     new:
       title: Aggiungi filtro
@@ -819,6 +838,7 @@ it:
       not_found: non trovato
       on_cooldown: Ti trovi nel periodo di pausa tra un trasferimento e l'altro
     followers_count: Seguaci al momento dello spostamento
+    incoming_migrations: In arrivo da un altro account
     incoming_migrations_html: Per spostarti da un altro account a questo, devi prima creare <a href="%{path}">un alias</a>.
     moved_msg: Il tuo account è ora reindirizzato a %{acct} e i tuoi follower sono stati spostati.
     not_redirecting: Il tuo account attualmente non è reindirizzato ad alcun altro account.
@@ -872,6 +892,10 @@ it:
       body: 'Il tuo status è stato condiviso da %{name}:'
       subject: "%{name} ha condiviso il tuo status"
       title: Nuova condivisione
+  notifications:
+    email_events: Eventi per notifiche via email
+    email_events_hint: 'Seleziona gli eventi per i quali vuoi ricevere le notifiche:'
+    other_settings: Altre impostazioni per le notifiche
   number:
     human:
       decimal_units:
@@ -895,6 +919,7 @@ it:
       duration_too_long: è troppo lontano nel futuro
       duration_too_short: è troppo presto
       expired: Il sondaggio si è già concluso
+      invalid_choice: L'opzione di voto scelta non esiste
       over_character_limit: non possono essere più lunghi di %{max} caratteri ciascuno
       too_few_options: deve avere più di un elemento
       too_many_options: non può contenere più di %{max} elementi
@@ -905,6 +930,8 @@ it:
   relationships:
     activity: Attività dell'account
     dormant: Dormiente
+    followers: Seguaci
+    following: Seguiti
     last_active: Ultima volta attivo
     most_recent: Più recente
     moved: Trasferito
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 1f71a6e28..1add33a4a 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -74,6 +74,7 @@ ja:
     roles:
       admin: Admin
       bot: Bot
+      group: Group
       moderator: Mod
     unavailable: プロフィールは利用できません
     unfollow: フォロー解除
@@ -193,11 +194,13 @@ ja:
         change_email_user: "%{name} さんが %{target} さんのメールアドレスを変更しました"
         confirm_user: "%{name} さんが %{target} さんのメールアドレスを確認済みにしました"
         create_account_warning: "%{name} さんが %{target} さんに警告メールを送信しました"
+        create_announcement: "%{name} さんが新しいお知らせ %{target} を作成しました"
         create_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を追加しました"
         create_domain_allow: "%{name} さんがドメイン %{target} をドメイン用ホワイトリストに追加しました"
         create_domain_block: "%{name} さんがドメイン %{target} をブロックしました"
         create_email_domain_block: "%{name} さんがドメイン %{target} をメールアドレス用ブラックリストに追加しました"
         demote_user: "%{name} さんが %{target} さんを降格しました"
+        destroy_announcement: "%{name} さんがお知らせ %{target} を削除しました"
         destroy_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を削除しました"
         destroy_domain_allow: "%{name} さんがドメイン %{target} をドメイン用ホワイトリストから外しました"
         destroy_domain_block: "%{name} さんがドメイン %{target} のブロックを外しました"
@@ -219,10 +222,22 @@ ja:
         unassigned_report: "%{name} さんが通報 %{target} の担当を外しました"
         unsilence_account: "%{name} さんが %{target} さんのサイレンスを解除しました"
         unsuspend_account: "%{name} さんが %{target} さんの停止を解除しました"
+        update_announcement: "%{name} さんがお知らせ %{target} を更新しました"
         update_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を更新しました"
         update_status: "%{name} さんが %{target} さんの投稿を更新しました"
       deleted_status: "(削除済)"
       title: 操作履歴
+    announcements:
+      edit:
+        title: お知らせを編集
+      empty: お知らせはありません
+      live: 公開中
+      new:
+        create: お知らせを作成
+        title: お知らせを追加
+      published: 公開日時
+      time_range: 期間
+      title: お知らせ
     custom_emojis:
       assign_category: カテゴリーを割り当て
       by_domain: ドメイン
@@ -333,13 +348,11 @@ ja:
       delete: 消去
       destroyed_msg: ブラックリストから外しました
       domain: ドメイン
+      empty: メールブラックリストに登録されたドメインはありません
       new:
         create: ドメインを追加
         title: メールアドレス用ブラックリスト新規追加
       title: メールブラックリスト
-    followers:
-      back_to_account: 戻る
-      title: "%{acct}さんのフォロワー"
     instances:
       by_domain: ドメイン
       delivery_available: 配送可能
@@ -367,6 +380,8 @@ ja:
       title: 招待
     pending_accounts:
       title: 承認待ちアカウント (%{count})
+    relationships:
+      title: "%{acct} さんのフォロー・フォロワー"
     relays:
       add_new: リレーを追加
       delete: 削除
@@ -387,10 +402,16 @@ ja:
       created_msg: 通報メモを書き込みました!
       destroyed_msg: 通報メモを削除しました!
     reports:
+      account:
+        notes:
+          other: "%{count} 件のメモ"
+        reports:
+          other: "%{count} 件の通報"
       action_taken_by: 通報処理者
       are_you_sure: 本当に実行しますか?
       assign_to_self: 担当になる
       assigned: 担当者
+      by_target_domain: ドメイン
       comment:
         none: なし
       created_at: 通報日時
@@ -436,6 +457,8 @@ ja:
         users: ログイン済みローカルユーザーのみ許可
       domain_blocks_rationale:
         title: コメントを表示
+      enable_bootstrap_timeline_accounts:
+        title: 新規ユーザーの自動フォローを有効にする
       hero:
         desc_html: フロントページに表示されます。サイズは600x100px以上推奨です。未設定の場合、標準のサムネイルが使用されます
         title: ヒーローイメージ
@@ -564,6 +587,10 @@ ja:
     animations_and_accessibility: アニメーションとアクセシビリティー
     confirmation_dialogs: 確認ダイアログ
     discovery: 見つける
+    localization:
+      body: Mastodonは有志によって翻訳されています。
+      guide_link: https://ja.crowdin.com/project/mastodon
+      guide_link_text: 誰でも参加することができます。
     sensitive_content: 閲覧注意コンテンツ
     toot_layout: トゥートレイアウト
   application_mailer:
@@ -636,6 +663,9 @@ ja:
     hint_html: 以後 1 時間はパスワードの再入力を求めません
     invalid_password: パスワードが間違っています
     prompt: 続行するにはパスワードを入力してください
+  date:
+    formats:
+      default: "%Y年%m月%d日"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}時間"
@@ -702,7 +732,6 @@ ja:
     blocks: ブロック
     csv: CSV
     domain_blocks: 非表示にしたドメイン
-    follows: フォロー
     lists: リスト
     mutes: ミュート
     storage: メディア
@@ -713,6 +742,7 @@ ja:
     hint_html: "<strong>注目のハッシュタグとは?</strong>プロフィールページに目立つ形で表示され、そのハッシュタグのついたあなたの公開投稿だけを抽出して閲覧できるようにします。クリエイティブな仕事や長期的なプロジェクトを追うのに優れた機能です。"
   filters:
     contexts:
+      account: プロフィール
       home: ホームタイムライン
       notifications: 通知
       public: 公開タイムライン
@@ -724,6 +754,7 @@ ja:
       invalid_irreversible: この機能はホームタイムラインまたは通知と一緒に指定する場合のみ機能します
     index:
       delete: 削除
+      empty: フィルターはありません。
       title: フィルター
     new:
       title: 新規フィルターを追加
@@ -736,6 +767,8 @@ ja:
     all: すべて
     changes_saved_msg: 正常に変更されました!
     copy: コピー
+    delete: 削除
+    edit: 編集
     no_batch_actions_available: このページに一括操作はありません
     order_by: 並び順
     save_changes: 変更を保存
@@ -869,6 +902,10 @@ ja:
       body: "%{name} さんにブーストされた、あなたのトゥートがあります:"
       subject: "%{name} さんにブーストされました"
       title: 新たなブースト
+  notifications:
+    email_events: メールによる通知
+    email_events_hint: '受信する通知を選択:'
+    other_settings: その他の通知設定
   number:
     human:
       decimal_units:
@@ -892,6 +929,7 @@ ja:
       duration_too_long: が長過ぎます
       duration_too_short: が短過ぎます
       expired: アンケートは既に終了しました
+      invalid_choice: 選択された項目は存在しません
       over_character_limit: は%{max}文字より長くすることはできません
       too_few_options: は複数必要です
       too_many_options: は%{max}個までです
@@ -899,9 +937,16 @@ ja:
     other: その他
     posting_defaults: デフォルトの投稿設定
     public_timelines: 公開タイムライン
+  reactions:
+    errors:
+      limit_reached: リアクションの種類が上限に達しました
+      unrecognized_emoji: 認識できない絵文字
   relationships:
     activity: 活動
     dormant: 非アクティブ
+    followers: フォロワー
+    following: フォロー中
+    invited: 招待済み
     last_active: 最後の活動
     most_recent: 新着
     moved: 引っ越し済み
@@ -966,7 +1011,7 @@ ja:
       firefox_os: Firefox OS
       ios: iOS
       linux: Linux
-      mac: Mac
+      mac: macOS
       other: 不明なプラットフォーム
       windows: Windows
       windows_mobile: Windows Mobile
diff --git a/config/locales/ka.yml b/config/locales/ka.yml
index 125912892..3a3a33858 100644
--- a/config/locales/ka.yml
+++ b/config/locales/ka.yml
@@ -450,7 +450,6 @@ ka:
       size: ზომა
     blocks: თქვენ ბლოკავთ
     csv: ცსვ
-    follows: თქვენ მიჰყვებით
     mutes: თქვენ აჩუმებთ
     storage: მედია საცავი
   filters:
diff --git a/config/locales/kab.yml b/config/locales/kab.yml
new file mode 100644
index 000000000..5cedbd364
--- /dev/null
+++ b/config/locales/kab.yml
@@ -0,0 +1,433 @@
+---
+kab:
+  about:
+    about_hashtag_html: Tigi d tiberraḥin tizuyaz, γur-sent <strong>#%{hashtag}</strong>. Tzemreḍ ad tesdemreḍ akked yid-sent ma tesɛiḍ amiḍan deg kra n umḍiq deg fediverse.
+    about_mastodon_html: 'Azeṭṭa ametti n uzekka: Ulac deg-s asussen, ulac taɛessast n tsuddiwin fell-ak, yebna ɣef leqder d ttrebga, daɣen d akeslemmas! Akked Mastudun, isefka-inek ad qimen inek!'
+    about_this: Ɣef
+    active_count_after: yekker
+    active_footnote: Imseqdacen yekkren s wayyur (MAU)
+    administered_by: 'Yettwadbel sɣur:'
+    api: API
+    apps: Isnasen izirazen
+    apps_platforms: Seqdec Masṭudun deg iOS, Android d tɣeṛɣṛin-nniḍen
+    browse_directory: Qelleb deg tebdert n yimaɣnuten teǧǧeḍ-d gar-asen widak tebɣiḍ
+    contact: Anermis
+    contact_unavailable: Wlac
+    discover_users: Af-d imseqdacen
+    documentation: Amnir
+    federation_hint_html: S umiḍan deg %{instance} tzemreḍ ad tḍefṛeḍ imdanen deg yal aqeddac Masṭudun d wugar n waya.
+    get_apps: Ɛreḍ asnas aziraz
+    hosted_on: Masṭudun yersen deg %{domain}
+    learn_more: Issin ugar
+    privacy_policy: Tasertit tabaḍnit
+    see_whats_happening: Ẓer d acu i iḍerrun
+    server_stats: 'Tidaddanin n uqeddac:'
+    source_code: Tangalt n uɣbalu
+    status_count_after:
+      one: n tsuffeɣt
+      other: n tsuffɣ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:
+      domain: Aqeddac
+      reason: Taγzent
+      silenced: 'Tisuffɣin ara d-yekken seg yiqeddacen-agi ad ttwaffrent deg tsuddmin tizuyaz d yidiwenniten, daɣen ur ttilin ara telɣa ɣef usedmer n yimseqdacen-nsen, skud ur ten-teḍfiṛeḍ ara:'
+    unavailable_content_html: Mastudun s umata yeḍmen-ak ad teẓreḍ agbur, ad tesdemreḍ akked yimseqdacen-nniḍen seg yal aqeddac deg fedivers. Ha-tent-an ɣur-k tsuraf i yellan deg uqeddac-agi.
+    user_count_after:
+      one: amseqdac
+      other: imseqdacen
+    user_count_before: Amagger n
+    what_is_mastodon: D acu-t Masṭudun?
+  accounts:
+    follow: Ḍfeṛ
+    followers:
+      one: Ameḍfaṛ
+      other: Imeḍfaṛen
+    following: Yeṭafaṛ
+    joined: Yettwarna-d deg %{date}
+    last_active: armud aneggaru
+    moved_html: "%{name} ibeddel amiḍan ɣer %{new_profile_link}:"
+    network_hidden: Ulac isalli-agi
+    never_active: Werǧin
+    nothing_here: Ulac kra da!
+    people_followed_by: Imdanen i yeṭṭafaṛ %{name}
+    people_who_follow: Imdanen yeṭṭafaṛen %{name}
+    posts:
+      one: Taberraḥt
+      other: Tiberraḥin
+    posts_tab_heading: Tiberraḥin
+    posts_with_replies: Tibarraḥin d tririyin
+    reserved_username: Isem-agi n umseqdac yettwaṭṭef yakan
+    roles:
+      admin: Anedbal
+      bot: Aṛubut
+      group: Agraw
+    unavailable: Ur nufi ara amaɣnu-a
+    unfollow: Ur ṭṭafaṛ ara
+  admin:
+    account_moderation_notes:
+      create: Eǧǧ awennit
+      delete: Kkes
+    accounts:
+      approve: Qbel
+      approve_all: Qbel kullec
+      are_you_sure: Tetḥeqqeḍ?
+      by_domain: Taɣult
+      change_email:
+        changed_msg: Imayl n umiḍan yettwabeddel mebla ugur!
+        current_email: Imayl n tura
+        label: Beddel imayl
+        new_email: Imayl amaynut
+        submit: Beddel imayl
+        title: Beddel imayl-ik s %{username}
+      confirm: Sentem
+      confirmed: Yettwasentem
+      confirming: Asentem
+      deleted: Yettwakkes
+      disable: Gdel
+      disable_two_factor_authentication: Gdel 2FA
+      display_name: Isem ara d-yettwaskanen
+      domain: Taɣult
+      edit: Ẓreg
+      email: Imayl
+      email_status: Addad n imayl
+      enable: Rmed
+      enabled: Yermed
+      followers: Imeḍfaṛen
+      follows: Yeṭafaṛ
+      header: Ixef
+      inbox_url: URL n yinekcam
+      ip: Tansa IP
+      joined: Yettwarna-d
+      location:
+        all: Akk
+        local: Adigan
+        title: Amḍiq
+      login_status: Addad n tuqqna
+      memorialize: Err amiḍan d asebter n usmekti
+      moderation:
+        active: Yermed
+        all: Akk
+        pending: Yettraǧu
+        silenced: Yettwasgugem
+      most_recent_activity: Armud aneggaru
+      most_recent_ip: Tansa IP taneggarut
+      no_account_selected: Ula yiwen n umiḍan ur yettwabeddel acku ula yiwen ur yettwafren
+      no_limits_imposed: War tilisa
+      protocol: Aneggaf
+      public: Azayez
+      redownload: Smiren amaɣnu
+      reject: Ggami
+      reject_all: Ggami-ten akk
+      resend_confirmation:
+        already_confirmed: Amseqdac-agi yettwasentem yakan
+        send: Azen tikelt-nniḍen imayl n usentem
+        success: Imayl n usentem yettwazen mebla ugur!
+      reset: Wennez
+      reset_password: Beddel awal uffir
+      roles:
+        admin: Anedbal
+        staff: Tarbaɛt
+        user: Amseqdac
+      search: Nadi
+      search_same_ip: Imseqdacen-nniḍen s tansa IP am tinn-ik
+      silence: Sgugem
+      silenced: Yettwasgugem
+      statuses: Tisuffɣin
+      time_in_queue: Deg tebdert n uraju %{time}
+      title: Imiḍan
+      unconfirmed_email: Imayl ur yettwasentem ara
+      username: Isem n useqdac
+      web: Web
+      whitelisted: Deg tebdert tamellalt
+    action_logs:
+      actions:
+        change_email_user: "%{name} ibeddel imayl n umseqdac %{target}"
+        confirm_user: "%{name} isentem tansa imayl n umseqdac %{target}"
+        create_account_warning: "%{name} yuzen alɣu i %{target}"
+        create_custom_emoji: "%{name} yessuli-d imujiten imaynuten %{target}"
+        create_domain_allow: "%{name} yerna taɣult %{target} ɣer tebdart tamellalt"
+        create_domain_block: "%{name} yesseḥbes taɣult %{target}"
+        create_email_domain_block: "%{name} yerna taɣult n imayl %{target} ɣer tebdart taberkant"
+        destroy_custom_emoji: "%{name} ihudd imuji %{target}"
+        destroy_domain_allow: "%{name} yekkes taɣult %{target} seg tebdart tamellalt"
+        destroy_domain_block: "%{name} yekkes aseḥbes n taɣult %{target}"
+        destroy_email_domain_block: "%{name} yerna taɣult n imayl %{target} ɣer tebdart tamellalt"
+        destroy_status: "%{name} yekkes tasuffeɣt n %{target}"
+        disable_custom_emoji: "%{name} yessens imuji %{target}"
+        disable_user: "%{name} yessens tuqqna i umseqdac %{target}"
+        enable_custom_emoji: "%{name} yermed imuji %{target}"
+        enable_user: "%{name} yermed tuqqna i umseqdac %{target}"
+        memorialize_account: "%{name} yerra amiḍan n %{target} d asebter n usmekti"
+        silence_account: "%{name} yesgugem amiḍan n %{target}"
+        unsilence_account: "%{name} yekkes asgugem n umiḍan n %{target}"
+        update_custom_emoji: "%{name} yelqem imuji %{target}"
+        update_status: "%{name} yelqem tasuffeɣt n %{target}"
+      deleted_status: "(tasuffeɣt tettwakkes)"
+    custom_emojis:
+      assign_category: Efk taggayt
+      by_domain: Taγult
+      copied_msg: Takna tadigant n imuji yettwarna-d mebla ugur
+      copy: Nγel
+      create_new_category: Rnu-d taggayt tamaynut
+      created_msg: Imuji yettwarna-d mebla ugur!
+      delete: Kkes
+      destroyed_msg: Ahuddu n imuji yeḍra-d mebla ugur!
+      disable: Gdel
+      disabled: Ssens
+      emoji: Emuji
+      enable: Rmed
+      enabled: Yermed
+      enabled_msg: Imuji yermed mebla ugur
+      image_hint: PNG n ddaw n 50KT
+      list: Tabdart
+      new:
+        title: Timerna n imuji udmawan amaynut
+      title: Imujiten udmawanen
+      upload: Sali
+    dashboard:
+      feature_profile_directory: Imaɣnuten
+      features: Timahaltin
+      software: Aseγẓan
+      title: Tafelwit
+      week_users_active: yermed deg yimalas-agi
+      week_users_new: imseqdacen deg yimalas-agi
+    domain_allows:
+      add_new: Timerna n taɣult ɣer tebdart tamellalt
+      created_msg: Taɣult-a tettwarna ɣer tebdart tamellalt mebla ugur
+      destroyed_msg: Taɣult-a tettwakkes seg tebdart tamellalt
+      undo: Kkes seg tebdart tamellalt
+    domain_blocks:
+      domain: Taγult
+      new:
+        severity:
+          noop: Ula yiwen
+          silence: Sgugem
+      severity:
+        silence: yettwasgugem
+    email_domain_blocks:
+      add_new: Rnu amaynut
+      delete: Kkes
+      domain: Taγult
+      new:
+        create: Rnu taγult
+        title: Timerna n taɣult tamaynut n imayl ɣer tebdart taberkant
+      title: Tabdart taberkant n imayl
+    instances:
+      by_domain: Taγult
+      delivery_available: Yella usiweḍ
+      known_accounts:
+        one: "%{count} n umiḍan i yettwassen"
+        other: "%{count} n yimiḍanen i yettwassnen"
+      moderation:
+        all: Akk
+      total_blocked_by_us: Ttwasḥebsen sɣur-neɣ
+      total_followed_by_them: Ṭtafaṛen-t
+      total_followed_by_us: Neṭṭafaṛ-it
+    invites:
+      filter:
+        all: Akk
+        available: Yella
+        expired: Ifat
+        title: Asizdeg
+      title: Iɛaruḍen
+    relays:
+      delete: Kkes
+      disable: Gdel
+      enable: Rmed
+    reports:
+      are_you_sure: Tetḥaq-eḍ?
+      comment:
+        none: Ula yiwen
+      mark_as_resolved: Creḍ-it yefra
+      mark_as_unresolved: Creḍ-it ur yefra ara
+      notes:
+        create: Rnu tamawt
+        delete: Kkes
+      resolved: Fran
+      unresolved: Ur yefra ara
+    settings:
+      custom_css:
+        desc_html: Beddel aɣan s CSS ara d-yettwasalayen deg yal asebter
+        title: CSS udmawan
+      domain_blocks:
+        all: Ɣef medden akk
+        disabled: Ɣef yiwen ala
+        users: Ɣef yimseqdacen idiganen i yeqqnen
+      site_description:
+        title: Aglam n uqeddac
+      site_title: Isem n uqeddac
+      title: Iγewwaṛen n usmel
+    statuses:
+      batch:
+        delete: Kkes
+    warning_presets:
+      add_new: Rnu amaynut
+      delete: Kkes
+  appearance:
+    sensitive_content: Agbur amḥulfu
+  application_mailer:
+    salutation: "%{name},"
+  auth:
+    change_password: Awal uffir
+    delete_account: Kkes amiḍan
+    description:
+      prefix_sign_up: Zeddi di Masṭudun assa!
+    forgot_password: Tettud awal-ik uffir?
+    login: Qqen
+    logout: Ffeγ
+    security: Taγellist
+    trouble_logging_in: Γur-k uguren n tuqqna?
+  authorize_follow:
+    follow: Ḍfeṛ
+    post_follow:
+      web: Ddu γer Web
+    title: Ḍfeṛ %{acct}
+  challenge:
+    confirm: Kemmel
+    invalid_password: Yir awal uffir
+  datetime:
+    distance_in_words:
+      about_x_months: "%{count}ug"
+      about_x_years: "%{count}i"
+      almost_x_years: "%{count}i"
+      half_a_minute: Tura kan
+      less_than_x_seconds: Tura kan
+      over_x_years: "%{count}i"
+      x_minutes: "%{count}t"
+      x_months: "%{count}ug"
+  deletes:
+    proceed: Kkes amiḍan
+  directories:
+    explore_mastodon: Snirem %{title}
+  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': Throttled
+    '500': 
+    '503': The page could not be served due to a temporary server failure.
+  exports:
+    archive_takeout:
+      date: Azemz
+      size: Teγzi
+    csv: CSV
+    lists: Tibdarin
+  featured_tags:
+    add_new: Rnu amaynut
+  filters:
+    contexts:
+      notifications: Tilγa
+    index:
+      delete: Kkes
+  footer:
+    developers: Ineflayen
+    more: Ugar…
+  generic:
+    all: Akk
+    copy: Nγel
+    save_changes: Sekles ibeddilen
+  identity_proofs:
+    authorize: Ih, ssireg
+    i_am_html: Nekki d %{username} deg %{service}.
+  invites:
+    expires_in:
+      '1800': 30 n tisdatin
+      '21600': 6 n isragen
+      '3600': 1 asrag
+      '43200': 12 n isragen
+      '604800': 1 umalas
+      '86400': 1 wass
+    expires_in_prompt: Werǧin
+  migrations:
+    acct: Ibeddel γer
+  notification_mailer:
+    follow:
+      title: Ameḍfaṛ amaynut
+  preferences:
+    other: Wiyaḍ
+  relationships:
+    followers: Imeḍfaṛen
+    following: Yeṭafaṛ
+  sessions:
+    browser: Iminig
+    browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Electron
+      firefox: Firefox
+      opera: Opera
+      otter: Otter
+      safari: Safari
+      uc_browser: UCBrowser
+      weibo: Weibo
+    current_session: Tiγimit tamirant
+    description: "%{browser} s %{platform}"
+    ip: IP
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
+      mac: Mac
+      windows: Windows
+      windows_mobile: Windows Mobile
+  settings:
+    account: Amiḍan
+    account_settings: Iγewwaṛen n umiḍan
+    appearance: Udem
+    back: Uγal γer Masṭudun
+    development: Taneflit
+    notifications: Tilγa
+    preferences: Imenyafen
+    profile: Ameγnu
+    relationships: Imeḍfaṛen akked wid i teṭṭafaṛeḍ
+  statuses:
+    attached:
+      image:
+        one: "%{count} tugna"
+        other: "%{count} tugniwin"
+      video:
+        one: "%{count} n tbidyutt"
+        other: "%{count} n tbidyutin"
+    open_in_web: Ldi deg Web
+    show_more: Sken-ed ugar
+    title: '%{name}: "%{quote}"'
+    visibilities:
+      private: Imeḍfaṛen kan
+  stream_entries:
+    sensitive_content: Agbur amḥulfu
+  themes:
+    contrast: Masṭudun (agnil awriran)
+    default: Masṭudun (Aberkan)
+    mastodon-light: Masṭudun (Aceɛlal)
+  time:
+    formats:
+      default: "%b %d, %Y, %H:%M"
+      month: "%b %Y"
+  two_factor_authentication:
+    disable: Gdel
+    enable: Rmed
+  user_mailer:
+    warning:
+      title:
+        none: Γur-wat
+    welcome:
+      full_handle: Tansa umiḍan-ik takemmalit
+      review_preferences_action: Beddel imenyafen
+      subject: Ansuf γer Masṭudun
+      title: Ansuf yessek·em, %{name}!
+  users:
+    signed_in_as: 'Teqqneḍ amzun d:'
+  verification:
+    verification: Asenqed
diff --git a/config/locales/kk.yml b/config/locales/kk.yml
index df2a29dab..16ddab9c3 100644
--- a/config/locales/kk.yml
+++ b/config/locales/kk.yml
@@ -78,6 +78,7 @@ kk:
     roles:
       admin: Админ
       bot: Бот
+      group: Топ
       moderator: Мод
     unavailable: Профиль қолжетімді емес
     unfollow: Оқымау
@@ -338,13 +339,11 @@ kk:
       delete: Өшіру
       destroyed_msg: Successfully deletеd e-mail domain from blacklist
       domain: Домен
+      empty: Ешқандай e-mail домені қаратізімге алынбапты.
       new:
         create: Add dоmain
         title: New e-mail blаcklist entry
       title: E-mail қаратізімі
-    followers:
-      back_to_account: Back To Accоunt
-      title: "%{acct} оқырмандары"
     instances:
       by_domain: Domаin
       delivery_available: Жеткізу қол жетімді
@@ -373,6 +372,8 @@ kk:
       title: Шақырулар
     pending_accounts:
       title: Күтілген аккаунттар (%{count})
+    relationships:
+      title: "%{acct} байланыстары"
     relays:
       add_new: Жаңа арна қосу
       delete: Өшіру
@@ -397,6 +398,7 @@ kk:
       are_you_sure: Шынымен бе?
       assign_to_self: Мені тағайындау
       assigned: Модератор тағайындау
+      by_target_domain: Шағымдалған аккаунт домені
       comment:
         none: Ештеңе
       created_at: Шағым тасталды
@@ -442,6 +444,8 @@ kk:
         users: Жергілікті қолданушыларға
       domain_blocks_rationale:
         title: Дәлелді көрсету
+      enable_bootstrap_timeline_accounts:
+        title: Жаңа қолданушылар жазылатын адамдарды белгілеу
       hero:
         desc_html: Бастапқы бетінде көрсетіледі. Кем дегенде 600x100px ұсынылады. Орнатылмаған кезде, сервердің нобайына оралады
         title: Қаһарман суреті
@@ -708,7 +712,6 @@ kk:
     blocks: Бұғатталғансыз
     csv: СSV
     domain_blocks: Домен блоктары
-    follows: Оқитындарыңыз
     lists: Тізімдер
     mutes: Үнсіздер
     storage: Медиа жинақ
@@ -730,6 +733,7 @@ kk:
       invalid_irreversible: Қайтарылмайтын сүзгі тек ішкі немесе ескертпелер контекстімен жұмыс істейді
     index:
       delete: Өшіру
+      empty: Сізде ешқандай фильтр жоқ.
       title: Фильтрлер
     new:
       title: Жаңа фильтр қосу
@@ -878,6 +882,10 @@ kk:
       body: 'Жазбаңызды бөліскен %{name}:'
       subject: "%{name} жазбаңызды бөлісті"
       title: Жаңа бөлісім
+  notifications:
+    email_events: E-mail ескертпелеріне шаралар
+    email_events_hint: 'Ескертпе болып келетін шараларды таңда:'
+    other_settings: Ескертпелердің басқа баптаулары
   number:
     human:
       decimal_units:
@@ -901,6 +909,7 @@ kk:
       duration_too_long: тым ұзақ екен
       duration_too_short: тым аз екен
       expired: Сауалнама уақыты аяқталған
+      invalid_choice: Таңдалған жауап енді жоқ екен
       over_character_limit: "%{max} таңбадан артық болмайды"
       too_few_options: бір жауаптан көп болуы керек
       too_many_options: "%{max} жауаптан көп болмайды"
@@ -908,9 +917,15 @@ kk:
     other: Басқа
     posting_defaults: Пост жазу негіздері
     public_timelines: Ашық таймлайндар
+  reactions:
+    errors:
+      limit_reached: Түрлі реакциялар лимиті толды
   relationships:
     activity: Аккаунт белсенділігі
     dormant: Ұйқысыз
+    followers: Оқырмандар
+    following: Жазылғандары
+    invited: Шақырылды
     last_active: Соңғы белсенділік
     most_recent: Ең соңғы
     moved: Көшірілді
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index ee9e0e954..76f4ad4da 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -74,18 +74,19 @@ ko:
     roles:
       admin: 관리자
       bot: 봇
-      moderator: 모더레이터
+      group: 그룹
+      moderator: 중재자
     unavailable: 프로필 사용 불가
     unfollow: 팔로우 해제
   admin:
     account_actions:
       action: 조치 취하기
-      title: "%{acct} 계정에 조정 취하기"
+      title: "%{acct} 계정에 중재 취하기"
     account_moderation_notes:
-      create: 모더레이션 노트 작성하기
-      created_msg: 모더레이션 기록이 성공적으로 작성되었습니다!
+      create: 중재 기록 작성하기
+      created_msg: 중재 기록이 성공적으로 작성되었습니다!
       delete: 삭제
-      destroyed_msg: 모더레이션 기록이 성공적으로 삭제되었습니다!
+      destroyed_msg: 중재 기록이 성공적으로 삭제되었습니다!
     accounts:
       approve: 승인
       approve_all: 모두 승인
@@ -135,8 +136,8 @@ ko:
         pending: 대기중
         silenced: 침묵 중
         suspended: 정지 중
-        title: 모더레이션
-      moderation_notes: 모더레이션 기록
+        title: 중재
+      moderation_notes: 중재 기록
       most_recent_activity: 최근 활동
       most_recent_ip: 최근 IP
       no_account_selected: 아무 계정도 선택 되지 않아 아무 것도 변경 되지 않았습니다
@@ -163,7 +164,7 @@ ko:
       role: 권한
       roles:
         admin: 관리자
-        moderator: 모더레이터
+        moderator: 중재자
         staff: 스태프
         user: 사용자
       search: 검색
@@ -193,11 +194,15 @@ ko:
         change_email_user: "%{name}이 %{target}의 이메일 주소를 변경했습니다"
         confirm_user: "%{name}이 %{target}의 이메일 주소를 컨펌했습니다"
         create_account_warning: "%{name}가 %{target}에게 경고 보냄"
+        create_announcement: "%{name} 님이 새 공지 %{target}을 만들었습니다"
         create_custom_emoji: "%{name}이 새로운 에모지 %{target}를 추가했습니다"
+        create_domain_allow: "%{name} 님이 %{target} 도메인을 화이트리스트에 넣었습니다"
         create_domain_block: "%{name}이 도메인 %{target}를 차단했습니다"
         create_email_domain_block: "%{name}이 이메일 도메인 %{target}를 차단했습니다"
         demote_user: "%{name}이 %{target}을 강등했습니다"
+        destroy_announcement: "%{name} 님이 공지 %{target}을 삭제했습니다"
         destroy_custom_emoji: "%{name}이 %{target} 에모지를 삭제함"
+        destroy_domain_allow: "%{name} 님이 %{target} 도메인을 화이트리스트에서 제거하였습니다"
         destroy_domain_block: "%{name}이 도메인 %{target}의 차단을 해제했습니다"
         destroy_email_domain_block: "%{name}이 이메일 도메인 %{target}을 화이트리스트에 넣었습니다"
         destroy_status: "%{name}이 %{target}의 툿을 삭제했습니다"
@@ -217,10 +222,22 @@ ko:
         unassigned_report: "%{name}이 리포트 %{target}을 할당 해제했습니다"
         unsilence_account: "%{name}이 %{target}에 대한 침묵을 해제했습니다"
         unsuspend_account: "%{name}이 %{target}에 대한 정지를 해제했습니다"
+        update_announcement: "%{name} 님이 공지 %{target}을 갱신했습니다"
         update_custom_emoji: "%{name}이 에모지 %{target}를 업데이트 했습니다"
         update_status: "%{name}이 %{target}의 상태를 업데이트 했습니다"
       deleted_status: "(삭제됨)"
       title: 감사 기록
+    announcements:
+      edit:
+        title: 공지사항 수정
+      empty: 공지를 찾을 수 없습니다.
+      live: 진행 중
+      new:
+        create: 공지사항 생성
+        title: 새 공지사항
+      published: 발행됨
+      time_range: 시간 범위
+      title: 공지사항
     custom_emojis:
       assign_category: 분류 지정
       by_domain: 도메인
@@ -295,7 +312,7 @@ ko:
       existing_domain_block_html: 이미 %{name}에 대한 더 강력한 제한이 걸려 있습니다, <a href="%{unblock_url}">차단 해제</a>를 먼저 해야 합니다.
       new:
         create: 차단 추가
-        hint: 도메인 차단은 내부 데이터베이스에 계정이 생성되는 것까지는 막을 수 없지만, 그 도메인에서 생성된 계정에 자동적으로 특정한 모더레이션을 적용하게 할 수 있습니다.
+        hint: 도메인 차단은 내부 데이터베이스에 계정이 생성되는 것까지는 막을 수 없지만, 그 도메인에서 생성된 계정에 자동적으로 특정한 중재 규칙을 적용하게 할 수 있습니다.
         severity:
           desc_html: |-
             <strong>침묵</strong>은 계정을 팔로우 하지 않고 있는 사람들에겐 계정의 툿을 보이지 않게 합니다. <strong>정지</strong>는 계정의 컨텐츠, 미디어, 프로필 데이터를 삭제합니다.
@@ -305,7 +322,7 @@ ko:
           suspend: 정지
         title: 새로운 도메인 차단
       private_comment: 비공개 주석
-      private_comment_hint: 이 도메인 제한에 대한 주석은 모더레이터를 위해 내부적으로 사용 됩니다.
+      private_comment_hint: 이 도메인 제한에 대한 주석은 중재자를 위해 내부적으로 사용 됩니다.
       public_comment: 공개 주석
       public_comment_hint: 이 도메인 제한에 대한 공개적인 주석, 도메인 제한 공개를 활성화 한 경우 보여집니다.
       reject_media: 미디어 파일 거부하기
@@ -333,13 +350,11 @@ ko:
       delete: 삭제
       destroyed_msg: 이메일 도메인 차단 규칙을 삭제했습니다
       domain: 도메인
+      empty: 현재 블랙리스트에 등록한 이메일 도메인이 없습니다
       new:
         create: 차단 규칙 생성
         title: 새 이메일 도메인 차단
       title: Email 도메인 차단
-    followers:
-      back_to_account: 계정으로 돌아가기
-      title: "%{acct}의 팔로워"
     instances:
       by_domain: 도메인
       delivery_available: 전송 가능
@@ -348,7 +363,7 @@ ko:
       moderation:
         all: 모두
         limited: 제한됨
-        title: 모더레이션
+        title: 중재
       private_comment: 비공개 주석
       public_comment: 공개 주석
       title: 연합
@@ -367,6 +382,8 @@ ko:
       title: 초대
     pending_accounts:
       title: 대기중인 계정 (%{count})
+    relationships:
+      title: "%{acct}의 관계"
     relays:
       add_new: 릴레이 추가
       delete: 삭제
@@ -387,10 +404,16 @@ ko:
       created_msg: 리포트 노트가 성공적으로 작성되었습니다!
       destroyed_msg: 리포트 노트가 성공적으로 삭제되었습니다!
     reports:
+      account:
+        notes:
+          other: "%{count}개의 기록"
+        reports:
+          other: "%{count}개의 신고"
       action_taken_by: 신고 처리자
       are_you_sure: 정말로 실행하시겠습니까?
       assign_to_self: 나에게 할당하기
-      assigned: 할당 된 모더레이터
+      assigned: 할당 된 중재자
+      by_target_domain: 신고된 계정의 도메인
       comment:
         none: 없음
       created_at: 리포트 시각
@@ -436,6 +459,8 @@ ko:
         users: 로그인 한 유저에게
       domain_blocks_rationale:
         title: 사유 보여주기
+      enable_bootstrap_timeline_accounts:
+        title: 새 유저가 팔로우할 계정을 보여주기
       hero:
         desc_html: 프론트페이지에 표시 됩니다. 최소 600x100픽셀을 권장합니다. 만약 설정되지 않았다면, 서버의 썸네일이 사용 됩니다
         title: 히어로 이미지
@@ -564,6 +589,10 @@ ko:
     animations_and_accessibility: 애니메이션과 접근성
     confirmation_dialogs: 확인 대화상자
     discovery: 발견하기
+    localization:
+      body: 마스토돈은 자원봉사자들에 의해 번역되었습니다.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: 누구나 기여할 수 있습니다.
     sensitive_content: 민감한 내용
     toot_layout: 툿 레이아웃
   application_mailer:
@@ -636,6 +665,9 @@ ko:
     hint_html: "<strong>팁:</strong> 한 시간 동안 다시 암호를 묻지 않을 것입니다."
     invalid_password: 잘못된 암호
     prompt: 계속하려면 암호 확인
+  date:
+    formats:
+      default: "%Y-%b-%d"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}시간"
@@ -702,7 +734,6 @@ ko:
     blocks: 차단
     csv: CSV
     domain_blocks: 도메인 차단
-    follows: 팔로우
     lists: 리스트
     mutes: 뮤트
     storage: 미디어
@@ -713,6 +744,7 @@ ko:
     hint_html: "<strong>추천 해시태그가 무엇이죠?</strong> 당신의 공개 프로필 페이지에 눈에 띄게 표현 되며 사람들이 그 해시태그를 포함한 당신의 글을 찾아 볼 수 있도록 합니다. 창작활동이나 긴 기간을 가지는 프로젝트를 쭉 따라가기에 좋은 도구입니다."
   filters:
     contexts:
+      account: 프로필
       home: 홈 타임라인
       notifications: 알림
       public: 퍼블릭 타임라인
@@ -724,6 +756,7 @@ ko:
       invalid_irreversible: 되돌릴 수 없는 필터링은 홈 타임라인과 알림에서만 동작합니다
     index:
       delete: 삭제
+      empty: 필터가 없습니다.
       title: 필터
     new:
       title: 필터 추가
@@ -736,6 +769,8 @@ ko:
     all: 모두
     changes_saved_msg: 정상적으로 변경되었습니다!
     copy: 복사
+    delete: 삭제
+    edit: 수정
     no_batch_actions_available: 이 페이지에서 수행할 수 있는 일괄작업이 없습니다
     order_by: 순서
     save_changes: 변경 사항을 저장
@@ -814,7 +849,7 @@ ko:
       missing_also_known_as: 이 계정을 역으로 참조하지 않고 있습니다
       move_to_self: 현재 계정은 사용할 수 없습니다
       not_found: 찾을 수 없습니다
-      on_cooldown: 쿨다운 기간입니다
+      on_cooldown: 휴식기간입니다
     followers_count: 이주 될 팔로워들
     incoming_migrations: 다른 계정으로부터 옮기기
     incoming_migrations_html: 다른 계정을 이 계정으로 이주하고 싶은 경우, 먼저 <a href="%{path}">계정 별칭을 만들어야 합니다</a>.
@@ -828,14 +863,14 @@ ko:
     warning:
       backreference_required: 새 계정은 이 계정으로 역참조를 하도록 설정되어 있어야 합니다
       before: '진행하기 전, 주의사항을 꼼꼼히 읽어보세요:'
-      cooldown: 이주 뒤에는 새로운 이주를 하지 못하는 쿨다운 기간이 존재합니다
+      cooldown: 이주 뒤에는 새로운 이주를 하지 못하는 휴식기간이 존재합니다
       disabled_account: 이 계정은 완전한 사용이 불가능하게 됩니다. 하지만, 데이터 내보내기나 재활성화를 위해 접근할 수 있습니다.
       followers: 이 행동은 현재 계정의 모든 팔로워를 새 계정으로 이동시킵니다
       only_redirect_html: 대신, <a href="%{path}">프로필에 리디렉션만 표시</a>할 수 있습니다.
       other_data: 다른 어떤 데이터도 자동적으로 옮겨지지 않을 것입니다
       redirect: 현재 계정 프로필은 리다이렉트 알림과 함께 업데이트 되며 검색에서 제외 됩니다
   moderation:
-    title: 모더레이션
+    title: 중재
   notification_mailer:
     digest:
       action: 모든 알림 보기
@@ -868,6 +903,10 @@ ko:
       body: "%{name} 님이 내 툿을 부스트 했습니다:"
       subject: "%{name} 님이 내 툿을 부스트 했습니다"
       title: 새 부스트
+  notifications:
+    email_events: 이메일 알림에 대한 이벤트
+    email_events_hint: '알림 받을 이벤트를 선택해주세요:'
+    other_settings: 기타 알림 설정
   number:
     human:
       decimal_units:
@@ -891,6 +930,7 @@ ko:
       duration_too_long: 너무 먼 미래입니다
       duration_too_short: 너무 가깝습니다
       expired: 투표가 이미 끝났습니다
+      invalid_choice: 선택한 투표 항목이 존재하지 않습니다
       over_character_limit: 각각 %{max} 글자를 넘을 수 없습니다
       too_few_options: 한가지 이상의 항목을 포함해야 합니다
       too_many_options: 항목은 %{max}개를 넘을 수 없습니다
@@ -898,9 +938,16 @@ ko:
     other: 기타
     posting_defaults: 게시물 기본설정
     public_timelines: 공개 타임라인
+  reactions:
+    errors:
+      limit_reached: 다른 리액션 제한에 도달했습니다
+      unrecognized_emoji: 인식 되지 않은 에모지입니다
   relationships:
     activity: 계정 활동
     dormant: 휴면
+    followers: 팔로워
+    following: 팔로잉
+    invited: 초대됨
     last_active: 마지막 활동
     most_recent: 가장 최근
     moved: 이동함
@@ -1057,7 +1104,7 @@ ko:
 
       <ul>
       <li>마스토돈의 주요 기능 제공. 다른 사람의 게시물에 상호작용 하거나 자신의 게시물을 작성하기 위해서는 로그인을 해야 합니다. 예를 들어, 다른 사람의 게시물을 자신만의 홈 타임라인에서 모아 보기 위해 팔로우를 할 수 있습니다.</li>
-      <li>커뮤니티의 모더레이션을 위해, 예를 들어 당신의 IP 주소와 기타 사항을 비교하여 금지를 우회하거나 다른 규칙을 위반하는지 판단하는 데에 사용할 수 있습니다.</li>
+      <li>커뮤니티의 중재를 위해, 예를 들어 당신의 IP 주소와 기타 사항을 비교하여 금지를 우회하거나 다른 규칙을 위반하는지 판단하는 데에 사용할 수 있습니다.</li>
       <li>당신이 제공한 이메일 주소를 통해 정보, 다른 사람들의 반응이나 받은 메시지에 대한 알림, 기타 요청 등에 관한 응답 요청 등을 보내는 데에 활용됩니다.</li>
       </ul>
 
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index e9634b397..9af094c01 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -261,9 +261,6 @@ lt:
         create: Pridėto domeną
         title: Naujas el pašto juodojo sąrašo įtraukimas
       title: El pašto juodasis sąrašas
-    followers:
-      back_to_account: Atgal Į Paskyrą
-      title: "%{acct} Sekėjai"
     instances:
       by_domain: Domenas
       delivery_available: Pristatymas galimas
@@ -510,7 +507,6 @@ lt:
       size: Dydis
     blocks: Jūs blokuojate
     domain_blocks: Domeno blokai
-    follows: Jūs sekate
     lists: Sąrašai
     mutes: Jūs tildote
     storage: Medijos sandėlis
diff --git a/config/locales/ml.yml b/config/locales/ml.yml
index 45218b8be..960ab95cc 100644
--- a/config/locales/ml.yml
+++ b/config/locales/ml.yml
@@ -2,6 +2,48 @@
 ml:
   about:
     contact_missing: സജ്ജമാക്കിയിട്ടില്ല
+    contact_unavailable: ലഭ്യമല്ല
+    discover_users: ഉപയോഗ്‌താക്കളെ കണ്ടെത്തുക
+    learn_more: കൂടുതൽ പഠിക്കുക
+    privacy_policy: സ്വകാര്യതാ നയം
+    see_whats_happening: എന്തൊക്കെ സംഭവിക്കുന്നു എന്ന് കാണുക
+    status_count_before: ആരാൽ എഴുതപ്പെട്ടു
+    tagline: സുഹൃത്തുക്കളെ പിന്തുടരുകയും പുതിയവരെ കണ്ടെത്തുകയും ചെയ്യുക
+    terms: സേവന വ്യവസ്ഥകൾ
+    unavailable_content: ലഭ്യമല്ലാത്ത ഉള്ളടക്കം
+    unavailable_content_description:
+      reason: കാരണം
+    what_is_mastodon: എന്താണ് മാസ്റ്റഡോൺ?
+  accounts:
+    follow: പിന്തുടരുക
+    following: നിങ്ങൾ പിന്തുടരുന്നവർ
+    joined: "%{date} ൽ ചേർന്നു"
+    last_active: അവസാനം സജീവമായിരുന്നത്
+    link_verified_on: സന്ധിയുടെ ഉടമസ്ഥാവസ്‌കാശം %{date} ൽ പരിശോധിക്കപ്പെട്ടു
+    media: മാധ്യമങ്ങൾ
+    moved_html: "%{name}, %{new_profile_link} ലേക്ക് നീങ്ങിയിരിക്കുന്നു:"
+  admin:
+    account_moderation_notes:
+      delete: മായ്ക്കുക
+    accounts:
+      approve: അംഗീകരിക്കുക
+      by_domain: മേഖല
+      change_email:
+        changed_msg: അംഗത്തിന്റെ ഇലക്ട്രോണിക് കത്തിന്റെ മേൽവിലാസം വിജയകരമായി മാറ്റിയിരിക്കുന്നു!
+        current_email: ഇപ്പോഴത്തെ ഇലക്ട്രോണിക് കത്തിന്റെ മേൽവിലാസം
+        label: മാറിയ ഇലക്ട്രോണിക് കത്തിന്റെ മേൽവിലാസം
+        new_email: പുതിയ ഇലക്ട്രോണിക് കത്ത്
+        submit: ഇലക്ട്രോണിക് കത്ത് മേൽവിലാസം മാറ്റുക
+        title: "%{username} ന്റെ ഇലക്ട്രോണിക് കത്ത് മേൽവിലാസം മാറ്റുക"
+      confirm: നിജപ്പെടുത്തുക
+      confirmed: നിജപ്പെടുത്തി
+      deleted: മായിച്ചു
+      demote: തരം താഴ്ത്തുക
+      disable: പ്രവര്‍ത്തന രഹിതമാക്കുക
+      disable_two_factor_authentication: ദ്വിഘടക നിർണ്ണയീകരണം പ്രവർത്തന രഹിതമാക്കുക
+      disabled: പ്രവർത്തന രഹിതമാക്കപ്പെട്ടിരിക്കുന്നു
+      display_name: കാണപ്പെടുന്ന നാമം
+      domain: മേഖല
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': You don't have permission to view this page.
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 2b49708e3..092a46d57 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -78,6 +78,7 @@ nl:
     roles:
       admin: Beheerder
       bot: Bot
+      group: Groep
       moderator: Moderator
     unavailable: Profiel niet beschikbaar
     unfollow: Ontvolgen
@@ -198,10 +199,12 @@ nl:
         confirm_user: E-mailadres van gebruiker %{target} is door %{name} bevestigd
         create_account_warning: "%{name} verzond een waarschuwing naar %{target}"
         create_custom_emoji: Nieuwe emoji %{target} is door %{name} geüpload
+        create_domain_allow: "%{name} heeft het domein %{target} aan de witte lijst toegevoegd"
         create_domain_block: Domein %{target} is door %{name} geblokkeerd
         create_email_domain_block: E-maildomein %{target} is door %{name} op de zwarte lijst geplaatst
         demote_user: Gebruiker %{target} is door %{name} gedegradeerd
         destroy_custom_emoji: "%{name} verwijderde emoji %{target}"
+        destroy_domain_allow: "%{name} heeft het domein %{target} van de witte lijst verwijderd"
         destroy_domain_block: Domein %{target} is door %{name} gedeblokkeerd
         destroy_email_domain_block: E-maildomein %{target} is door %{name} op de witte lijst geplaatst
         destroy_status: Toot van %{target} is door %{name} verwijderd
@@ -340,9 +343,6 @@ nl:
         create: Blokkeren
         title: Nieuw e-maildomein blokkeren
       title: E-maildomeinen blokkeren
-    followers:
-      back_to_account: Terug naar account
-      title: Volgers van %{acct}
     instances:
       by_domain: Domein
       delivery_available: Bezorging is mogelijk
@@ -391,10 +391,18 @@ nl:
       created_msg: Opmerking bij rapportage succesvol aangemaakt!
       destroyed_msg: Opmerking bij rapportage succesvol verwijderd!
     reports:
+      account:
+        notes:
+          one: "%{count} opmerking"
+          other: "%{count} opmerkingen"
+        reports:
+          one: "%{count} rapportage"
+          other: "%{count} rapportages"
       action_taken_by: Actie uitgevoerd door
       are_you_sure: Weet je het zeker?
       assign_to_self: Aan mij toewijzen
       assigned: Toegewezen moderator
+      by_target_domain: Domein van gerapporteerde account
       comment:
         none: Geen
       created_at: Gerapporteerd op
@@ -440,6 +448,8 @@ nl:
         users: Naar ingelogde lokale gebruikers
       domain_blocks_rationale:
         title: Motivering tonen
+      enable_bootstrap_timeline_accounts:
+        title: Standaard te volgen accounts voor nieuwe gebruikers inschakelen
       hero:
         desc_html: Wordt op de voorpagina getoond. Tenminste 600x100px aanbevolen. Wanneer dit niet is ingesteld wordt de thumbnail van de Mastodonserver getoond
         title: Hero-afbeelding
@@ -706,7 +716,6 @@ nl:
     blocks: Jij blokkeert
     csv: CSV
     domain_blocks: Domeinblokkades
-    follows: Jij volgt
     lists: Lijsten
     mutes: Jij negeert
     storage: Mediaopslag
@@ -876,6 +885,10 @@ nl:
       body: 'Jouw toot werd door %{name} geboost:'
       subject: "%{name} boostte jouw toot"
       title: Nieuwe boost
+  notifications:
+    email_events: E-mailmeldingen voor gebeurtenissen
+    email_events_hint: 'Selecteer gebeurtenissen waarvoor je meldingen wilt ontvangen:'
+    other_settings: Andere meldingsinstellingen
   number:
     human:
       decimal_units:
@@ -909,6 +922,8 @@ nl:
   relationships:
     activity: Accountactiviteit
     dormant: Sluimerend
+    followers: Volgers
+    following: Volgend
     last_active: Laatst actief
     most_recent: Recentelijk gevolgd
     moved: Verhuisd
diff --git a/config/locales/nn.yml b/config/locales/nn.yml
index a1b61d6e7..875545c76 100644
--- a/config/locales/nn.yml
+++ b/config/locales/nn.yml
@@ -1,20 +1,1192 @@
 ---
 nn:
+  about:
+    about_hashtag_html: Dette er offentlege tut merkt med <strong>#%{hashtag}</strong>. Du kan nytta dei om du har ein konto kvar som helst i fødiverset.
+    about_mastodon_html: 'Framtidas sosiale nettverk: Ingen annonsar, ingen verksemder som overvaker deg, etisk design og desentralisering! Eig idéane dine med Mastodon!'
+    about_this: Om oss
+    active_count_after: aktiv
+    active_footnote: Månadlege aktive brukarar (MAB)
+    administered_by: 'Administrert av:'
+    api: API
+    apps: Mobilappar
+    apps_platforms: Bruk Mastodon på iOS, Android og andre plattformer
+    browse_directory: Bla gjennom en profilmappe og filtrer etter interesser
+    browse_local_posts: Bla i en sanntidsstrøm av offentlige innlegg fra denne tjeneren
+    browse_public_posts: Sjå ei direktesending av offentlege innlegg på Mastodon
+    contact: Kontakt
+    contact_missing: Ikkje sett
+    contact_unavailable: I/T
+    discover_users: Oppdag brukarar
+    documentation: Dokumentasjon
+    federation_hint_html: Med ein konto på %{instance} kan du fylgja folk på kva som helst slags Mastod-tenar og meir.
+    get_apps: Prøv ein mobilapp
+    hosted_on: "%{domain} er vert for Mastodon"
+    instance_actor_flash: 'Denne brukeren er en virtuell aktør brukt til å representere selve serveren og ingen individuell bruker. Det brukes til foreningsformål og bør ikke blokkeres med mindre du vil blokkere hele instansen, hvor domeneblokkering bør brukes i stedet.
+
+'
+    learn_more: Lær meir
+    privacy_policy: Personvernsreglar
+    see_whats_happening: Sjå kva som skjer
+    server_stats: 'Tenarstatistikk:'
+    source_code: Kjeldekode
+    status_count_after:
+      one: status
+      other: statusar
+    status_count_before: Som skreiv
+    tagline: Fylg vener og oppdag nye
+    terms: Brukarvilkår
+    unavailable_content: Utilgjengeleg innhald
+    unavailable_content_description:
+      domain: Sørvar
+      reason: Grunn
+      rejecting_media: 'Mediafiler fra disse tjenerne vil ikke bli behandlet eller lagret, og ingen miniatyrbilder vil bli vist, noe som vil kreve manuell klikking for å besøke den opprinnelige filen:'
+      silenced: 'Innlegg frå desse tenarane vert gøymde frå offentlege tidsliner og samtalar, og det kjem ingen varsel frå samhandlingane til brukarane deira, med mindre du fylgjer dei:'
+      suspended: 'Ingen data frå desse tenarane vert handsama, lagra eller sende til andre, som gjer det umogeleg å samhandla eller kommunisera med andre brukarar frå desse tenarane:'
+    unavailable_content_html: Mastodon gjev deg som regel lov til å sjå innhald og samhandla med brukarar frå alle andre tenarar i fødiverset. Dette er unnataka som er valde for akkurat denne tenaren.
+    user_count_after:
+      one: brukar
+      other: brukarar
+    user_count_before: Her bur
+    what_is_mastodon: Kva er Mastodon?
+  accounts:
+    choices_html: "%{name} sine val:"
+    endorsements_hint: Du kan fremja folk dy fylgjer frå grensesnittet på nettet, og då visast dei her.
+    featured_tags_hint: Du kan velja emneknaggar som skal visast her.
+    follow: Fylg
+    followers:
+      one: Fylgjar
+      other: Fylgjarar
+    following: Fylgjer
+    joined: Vart med %{date}
+    last_active: sist aktiv
+    link_verified_on: Eigarskap for denne lenkja vart sist sjekka %{date}
+    media: Media
+    moved_html: "%{name} har flytta til %{new_profile_link}:"
+    network_hidden: Denne informasjonen er ikkje tilgjengeleg
+    never_active: Aldri
+    nothing_here: Her er det ingenting!
+    people_followed_by: Folk som %{name} fylgjer
+    people_who_follow: Folk som fylgjer %{name}
+    pin_errors:
+      following: Du må allereie fylgja personen du vil fremja
+    posts:
+      one: Tut
+      other: Tut
+    posts_tab_heading: Tut
+    posts_with_replies: Tut og svar
+    reserved_username: Dette brukarnamnet er oppteke
+    roles:
+      admin: Administrator
+      bot: Robot
+      group: Gruppe
+      moderator: Moderator
+    unavailable: Profil ikkje tilgjengeleg
+    unfollow: Slutt å fylgja
+  admin:
+    account_actions:
+      action: Utfør
+      title: Utfør moderatorhandling på %{acct}
+    account_moderation_notes:
+      create: Legg igjen merknad
+      created_msg: Moderatormerknad er laga!
+      delete: Slett
+      destroyed_msg: Moderatormerknad er utsletta!
+    accounts:
+      approve: Godtak
+      approve_all: Godtak alle
+      are_you_sure: Er du sikker?
+      avatar: Bilete
+      by_domain: Domene
+      change_email:
+        changed_msg: Konto-e-posten er endra!
+        current_email: Noverande e-post
+        label: Byt e-post
+        new_email: Ny e-post
+        submit: Byt e-post
+        title: Byt e-post for %{username}
+      confirm: Stadfest
+      confirmed: Stadfesta
+      confirming: Stadfestar
+      deleted: Sletta
+      demote: Degrader
+      disable: Slå av
+      disable_two_factor_authentication: Slå av 2FA
+      disabled: Slege av
+      display_name: Synleg namn
+      domain: Domene
+      edit: Rediger
+      email: E-post
+      email_status: E-poststatus
+      enable: Slå på
+      enabled: Aktivert
+      followers: Fylgjarar
+      follows: Fylgje
+      header: Overskrift
+      inbox_url: Innbokslenkje
+      invited_by: Innboden av
+      ip: IP
+      joined: Vart med
+      location:
+        all: Alle
+        local: Lokalt
+        remote: Fjernt
+        title: Stad
+      login_status: Innlogginsstatus
+      media_attachments: Medievedlegg
+      memorialize: Gjør om til et minne
+      moderation:
+        active: Aktiv
+        all: Alle
+        pending: Ventar på svar
+        silenced: Dempa
+        suspended: Utvist
+        title: Moderasjon
+      moderation_notes: Moderasjonsmerknader
+      most_recent_activity: Nyligste aktivitet
+      most_recent_ip: Nyast IP
+      no_account_selected: Ingen kontoar vart endra sidan ingen var valde
+      no_limits_imposed: Ingen grenser sett
+      not_subscribed: Ikkje tinga
+      pending: Ventar på gjennomgang
+      perform_full_suspension: Utvis
+      promote: Frem
+      protocol: Protokoll
+      public: Offentleg
+      push_subscription_expires: PuSH-abonnent utløper
+      redownload: Last inn profil på nytt
+      reject: Avvis
+      reject_all: Avvis alle
+      remove_avatar: Fjern bilete
+      remove_header: Fjern overskrift
+      resend_confirmation:
+        already_confirmed: Denne brukaren er allereie stadfesta
+        send: Send stadfestings-e-posten på nytt
+        success: Stadfestings-e-post send!
+      reset: Attstill
+      reset_password: Attstill passord
+      resubscribe: Ting på nytt
+      role: Løyve
+      roles:
+        admin: Administrator
+        moderator: Moderator
+        staff: Personell
+        user: Brukar
+      search: Søk
+      search_same_ip: Andre brukarar med same IP
+      shared_inbox_url: Delt Innboks URL
+      show:
+        created_reports: Rapportar frå denne kontoen
+        targeted_reports: Meldt av andre
+      silence: Togn
+      silenced: Dempa
+      statuses: Statusar
+      subscribe: Ting
+      suspended: Utvist
+      time_in_queue: Ventar i kø %{time}
+      title: Kontoar
+      unconfirmed_email: E-post utan stadfesting
+      undo_silenced: Angr målbinding
+      undo_suspension: Angr utvising
+      unsubscribe: Avmeld
+      username: Brukarnamn
+      warn: Åtvar
+      web: Nett
+      whitelisted: Kvitlista
+    action_logs:
+      actions:
+        assigned_to_self_report: "%{name} tilegnet rapport %{target} til seg selv"
+        change_email_user: "%{name} endra e-postadressa til brukaren %{target}"
+        confirm_user: "%{name} stadfesta e-postadressa til brukaren %{target}"
+        create_account_warning: "%{name} sende ei åtvaring til %{target}"
+        create_announcement: "%{name} laget en ny kunngjøring %{target}"
+        create_custom_emoji: "%{name} lasta opp eit nytt kjensleteikn %{target}"
+        create_domain_allow: "%{name} kvitlista domenet %{target}"
+        create_domain_block: "%{name} blokkerte domenet %{target}"
+        create_email_domain_block: "%{name} svartelista e-postdomenet %{target}"
+        demote_user: "%{name} degraderte brukaren %{target}"
+        destroy_announcement: "%{name} slettet kunngjøring %{target}"
+        destroy_custom_emoji: "%{name} utsletta kjensleteiknet %{target}"
+        destroy_domain_allow: "%{name} fjerna domenet %{target} frå kvitliste"
+        destroy_domain_block: "%{name} slutta å blokkera domenet %{target}"
+        destroy_email_domain_block: "%{name} kvitlista e-postdomenet %{target}"
+        destroy_status: "%{name} sletta status av %{target}"
+        disable_2fa_user: "%{name} tok vekk krav om tofaktorautentisering for brukaren %{target}"
+        disable_custom_emoji: "%{name} deaktiverte emojien %{target}"
+        disable_user: "%{name} slo av innlogging for brukaren %{target}"
+        enable_custom_emoji: "%{name} aktiverte emojien %{target}"
+        enable_user: "%{name} aktiverte innlogging for brukaren %{target}"
+        memorialize_account: "%{name} endret %{target}s konto til en minneside"
+        promote_user: "%{name} fremja brukaren %{target}"
+        remove_avatar_user: "%{name} fjerna %{target} sitt profilbilete"
+        reopen_report: "%{name} opna rapporten %{target} på nytt"
+        reset_password_user: "%{name} nullstilte passordet til brukaren %{target}"
+        resolve_report: "%{name} løyste ein rapport %{target}"
+        silence_account: "%{name} målbatt %{target} sin konto"
+        suspend_account: "%{name} utviste %{target} sin konto"
+        unassigned_report: "%{name} avtilegnet rapport %{target}"
+        unsilence_account: "%{name} fjernet forstummingen av %{target}s konto"
+        unsuspend_account: "%{name} utviste %{target} sin konto"
+        update_announcement: "%{name} oppdaterte kunngjøring %{target}"
+        update_custom_emoji: "%{name} oppdaterte kjensleteiknet %{target}"
+        update_status: "%{name} oppdaterte status for %{target}"
+      deleted_status: "(sletta status)"
+      title: Revisionslogg
+    announcements:
+      edit:
+        title: Rediger kunngjøring
+      empty: Ingen kunngjøringer funnet.
+      live: Direkte
+      new:
+        create: Lag kunngjøring
+        title: Ny kunngjøring
+      published: Publisert
+      time_range: Tidsramme
+      title: Kunngjøringer
+    custom_emojis:
+      assign_category: Vel kategori
+      by_domain: Domene
+      copied_msg: Laga ein lokal kopi av kjensleteiknet
+      copy: Kopier
+      copy_failed_msg: Klarte ikkje å kopiera emojien
+      create_new_category: Lag ny kategori
+      created_msg: Laga kjensleteikn!
+      delete: Slett
+      destroyed_msg: Kjensleteikn utsletta!
+      disable: Slå av
+      disabled: Slege av
+      disabled_msg: Deaktiverte emoji
+      emoji: Emoji
+      enable: Slå på
+      enabled: Slege på
+      enabled_msg: Aktiverte kjensleteikn
+      image_hint: PNG opp til 50 kB
+      list: Oppfør
+      listed: Oppført
+      new:
+        title: Legg til eige kjensleteikn
+      overwrite: Skriv over
+      shortcode: Stuttkode
+      shortcode_hint: Minst 2 teikn, berre tal, bokstavar og understrek
+      title: Eigne kjensleteikn
+      uncategorized: Ukategorisert
+      unlist: Uoppfør
+      unlisted: Ikkje oppført
+      update_failed_msg: Klarte ikkje å oppdatera emojien
+      updated_msg: Kjensleteiknet er oppdatert!
+      upload: Last opp
+    dashboard:
+      authorized_fetch_mode: Trygg modus
+      backlog: opphopsloggede jobber
+      config: Oppsett
+      feature_deletions: Kontoslettingar
+      feature_invites: Innbydingar
+      feature_profile_directory: Profilmappe
+      feature_registrations: Registreringar
+      feature_relay: Føderasjonsoverganger
+      feature_spam_check: Søppelvern
+      feature_timeline_preview: Førehandsvisning av tidsline
+      features: Eigenskapar
+      hidden_service: Føderering med skjulte tjenester
+      open_reports: opne rapportar
+      pending_tags: emneknaggar som ventar på gjennomgang
+      pending_users: brukarar som ventar på gjennomgang
+      recent_users: Nylege brukarar
+      search: Fulltekstsøking
+      single_user_mode: Enkeltbrukarmodus
+      software: Programvare
+      space: Lagrinsplass nytta
+      title: Dashbord
+      total_users: brukarar til saman
+      trends: Populært
+      week_interactions: samhandlingar denne veka
+      week_users_active: aktive denne veka
+      week_users_new: brukarar denne veka
+      whitelist_mode: Kvitlistemodus
+    domain_allows:
+      add_new: Kvitlist domene
+      created_msg: Domene er vorte kvitlista
+      destroyed_msg: Domene er fjerna frå kvitlista
+      undo: Fjern frå kvitliste
+    domain_blocks:
+      add_new: Lag ny
+      created_msg: Domeneblokkering blir nå behandlet
+      destroyed_msg: Domeneblokkering har nå blitt angret
+      domain: Domene
+      edit: Rediger domeneblokkering
+      existing_domain_block_html: Du har allerede pålagt strengere begrensninger på %{name}, du kan være nødt til <a href="%{unblock_url}">oppheve blokkeringen av den</a> først.
+      new:
+        create: Lag blokkering
+        hint: Domeneblokkeringen vil ikke hindre opprettelse av kontooppføringer i databasen, men vil retroaktivt og automatisk benytte spesifikke moderasjonsmetoder på de kontoene.
+        severity:
+          desc_html: "<strong>Målbind</strong> gjør kontoens poster usynlige for alle som ikke følger den. <strong>Utvis</strong> fjerner alt innhold, media og profildata fra kontoen. Bruk <strong>Ingen</strong> hvis du bare vil fjerne mediafiler."
+          noop: Ingen
+          silence: Togn
+          suspend: Utvis
+        title: Ny domeneblokkering
+      private_comment: Privat kommentar
+      private_comment_hint: Kommenter angående denne domenebegrensningen for internt bruk av moderatorene.
+      public_comment: Offentleg kommentar
+      public_comment_hint: Kommenter angående denne domenebegrensningen for offentligheten, hvis publisering av domenebegrensningslisten er slått på.
+      reject_media: Avvis mediefiler
+      reject_media_hint: Fjernar mediefiler som er lagra lokalt og nektar å lasta ned andre i framtida. Har ikkje noko å seia for utvisingar
+      reject_reports: Avvis rapportar
+      reject_reports_hint: Ignorer alle rapportar frå dette domenet. Har ikkje noko å seia for utvisingar
+      rejecting_media: avviser mediefiler
+      rejecting_reports: avviser rapportar
+      severity:
+        silence: dempa
+        suspend: utvist
+      show:
+        affected_accounts:
+          one: Éin konto i databasen vert påverka
+          other: "%{count} kontoar i databasen vert påverka"
+        retroactive:
+          silence: Avmålbind alle eksisterende kontoer fre dette domenet
+          suspend: Avutvis alle eksisterende kontoer fra dette domenet
+        title: Angre domeneblokkering for %{domain}
+        undo: Angr
+      undo: Angre
+      view: Vis domeneblokkering
+    email_domain_blocks:
+      add_new: Lag ny
+      created_msg: E-postdomenet ble lagt til i blokkeringslisten uten problemer
+      delete: Slett
+      destroyed_msg: E-postdomenet har blitt fjernet fra blokkeringslisten uten problemer
+      domain: Domene
+      empty: Ingen e-mail-domener er sortelistet på dette tidspunkt.
+      new:
+        create: Legg til domene
+        title: Ny blokkeringsoppføring av e-postdomene
+      title: Blokkerte e-postadresser
+    instances:
+      by_domain: Domene
+      delivery_available: Levering er tilgjengelig
+      known_accounts:
+        one: "%{count} kjend konto"
+        other: "%{count} kjende kontoar"
+      moderation:
+        all: Alle
+        limited: Avgrensa
+        title: Moderasjon
+      private_comment: Privat kommentar
+      public_comment: Offentleg kommentar
+      title: Samling
+      total_blocked_by_us: Blokkert av oss
+      total_followed_by_them: Fylgd av dei
+      total_followed_by_us: Fylgd av oss
+      total_reported: Rapportar om dei
+      total_storage: Medievedlegg
+    invites:
+      deactivate_all: Slå av alle
+      filter:
+        all: Alle
+        available: Tilgjengeleg
+        expired: Utgått
+        title: Filter
+      title: Innbydingar
+    pending_accounts:
+      title: Kontoar som ventar (%{count})
+    relationships:
+      title: "%{acct} sitt forhold"
+    relays:
+      add_new: Legg til ny overgang
+      delete: Slett
+      description_html: En <strong>federert overgang</strong> er en mellomleddsserver som utveksler store mengder av offentlige tuter mellom servere som abonnerer og publiserer til den. <strong>Det kan hjelpe små og mellomstore servere til å oppdage innhold fra strømiverset</strong>, noe som ellers ville ha krevd at lokale brukere manuelt fulgte andre personer på fjerne servere.
+      disable: Slå av
+      disabled: Slege av
+      enable: Slå på
+      enable_hint: Når dette har blitt skrudd på, vil tjeneren din abonnere på alle offentlige tuter fra denne overgangen, og vil begynne å sende denne tjenerens offentlige tuter til den.
+      enabled: Skrudd på
+      inbox_url: Overførings-URL
+      pending: Avventer overgangens godkjenning
+      save_and_enable: Lagr og slå på
+      setup: Sett opp en overgangsforbindelse
+      signatures_not_enabled: Overganger vil ikke fungere riktig mens sikkermodus eller hvitelistingsmodus er skrudd på
+      status: Status
+      title: Vidaresendingar
+    report_notes:
+      created_msg: Rapportmerknad laga!
+      destroyed_msg: Rapportmerknad sletta!
+    reports:
+      account:
+        notes:
+          one: "%{count} notis"
+          other: "%{count} notiser"
+        reports:
+          one: "%{count} rapport"
+          other: "%{count} rapporter"
+      action_taken_by: Handling gjort av
+      are_you_sure: Er du sikker?
+      assign_to_self: Tilegn til meg
+      assigned: Tilsett moderator
+      by_target_domain: Domenet av rapportert bruker
+      comment:
+        none: Ingen
+      created_at: Rapportert
+      mark_as_resolved: Merk som løyst
+      mark_as_unresolved: Merk som uløyst
+      notes:
+        create: Sett inn merknad
+        create_and_resolve: Løys med merknad
+        create_and_unresolve: Opn på nytt med merknad
+        delete: Slett
+        placeholder: Beskriv hvilke handlinger som har blitt tatt, eller andre relaterte oppdateringer...
+      reopen: Opn rapport igjen
+      report: 'Rapporter #%{id}'
+      reported_account: Rapportert konto
+      reported_by: Rapportert av
+      resolved: Oppløyst
+      resolved_msg: Rapporten er løyst!
+      status: Status
+      title: Rapportar
+      unassign: Avset
+      unresolved: Uløyst
+      updated_at: Oppdatert
+    settings:
+      activity_api_enabled:
+        desc_html: Antall lokale statusposter, aktive brukere og nye registreringer i ukentlige oppdelinger
+        title: Publiser samlet statistikk om brukeraktiviteter
+      bootstrap_timeline_accounts:
+        desc_html: Separer flere brukernavn med komma. Kun lokale og ulåste kontoer vil kunne brukes. Dersom tomt er standarden alle lokale administratorer.
+        title: Standard fylgjer for nye brukarar
+      contact_information:
+        email: Offentleg e-postadresse
+        username: Brukarnamn for kontakt
+      custom_css:
+        desc_html: Modifiser utseendet med CSS lastet på hver side
+        title: Eigen CSS
+      default_noindex:
+        desc_html: Påverkar alle brukarar som ikkje har justert denne innstillinga sjølve
+      domain_blocks:
+        all: Til alle
+        disabled: Til ingen
+        title: Vis domeneblokkeringer
+        users: Til lokale brukarar som er logga inn
+      domain_blocks_rationale:
+        title: Vis kvifor
+      hero:
+        desc_html: Vises på forsiden. Minst 600×100px er anbefalt. Dersom dette ikke er valgt, faller det tilbake på tjenerens miniatyrbilde
+        title: Heltebilete
+      mascot:
+        desc_html: Vist på flere sider. Minst 293×205px er anbefalt. Dersom det ikke er valgt, faller det tilbake til standardmaskoten
+        title: Maskotbilete
+      peers_api_enabled:
+        desc_html: Domenenavn denne instansen har truffet på i fediverset
+        title: Publiser liste over oppdaga tenarar
+      preview_sensitive_media:
+        desc_html: Lenkeforhåndsvisninger på andre nettsteder vil vise et miniatyrbilde selv dersom mediet er merket som sensitivt
+      profile_directory:
+        desc_html: Gjer at brukarar kan oppdagast
+        title: Skru på profilmappen
+      registrations:
+        closed_message:
+          desc_html: Vises på forsiden når registreringer er lukket<br>Du kan bruke HTML-tagger
+          title: Melding for lukket registrering
+        deletion:
+          desc_html: Tillat alle å sletta kontoen sin
+          title: Åpne kontosletting
+        min_invite_role:
+          disabled: Ingen
+          title: Tillat innbydingar frå
+      registrations_mode:
+        modes:
+          none: Ingen kan melda seg inn
+          open: Kven som helst kan melda seg inn
+      show_staff_badge:
+        desc_html: Vis personalmerke på ei brukarside
+        title: Vis personalmerke
+      site_description:
+        desc_html: Vises som et avsnitt på forsiden og brukes som en meta-tagg. Du kan bruke HTML-tagger, spesielt <code>&lt;a&gt;</code> og <code>&lt;em&gt;</code>.
+        title: Tenarskilding
+      site_description_extended:
+        desc_html: Ein god stad å setja reglar for åtferdskode, reglar, rettningsliner og andre ting som skil din tenar frå andre. Du kan nytta HTML-taggar
+        title: Utvidet nettstedsinformasjon
+      site_short_description:
+        desc_html: Vist i sidelinjen og i metastempler. Beskriv hva Mastodon er og hva som gjør denne tjeneren spesiell i én enkelt paragraf.
+        title: Stutt om tenaren
+      site_terms:
+        desc_html: Du kan skrive din egen personverns-strategi, bruksviklår og andre regler. Du kan bruke HTML tagger
+        title: Eigne brukarvilkår
+      site_title: Tenarnamn
+      spam_check_enabled:
+        desc_html: Mastodon kan auto-rapportere kontoer som sender gjentatte uforespurte meldinger. Det kan oppstå falske positive treff.
+        title: Nettsøppelvern
+      thumbnail:
+        desc_html: Brukes ved forhandsvisning via OpenGraph og API. 1200x630px anbefales
+        title: Småbilete for tenaren
+      timeline_preview:
+        desc_html: Vis offentlig tidslinje på landingssiden
+        title: Tillat uautentisert tilgang til offentleg tidsline
+      title: Sideinnstillingar
+      trendable_by_default:
+        desc_html: Påverkar emneknaggar som ikkje har vore tillatne tidlegare
+        title: Tillat emneknaggar å verta populære utan gjennomgang på førehand
+      trends:
+        title: Populære emneknaggar
+    statuses:
+      back_to_account: Tilbake til kontosida
+      batch:
+        delete: Slett
+        nsfw_off: NSFW AV
+        nsfw_on: NSFW PÅ
+      deleted: Sletta
+      failed_to_execute: Lét seg ikkje gjera
+      media:
+        title: Media
+      no_media: Ingen media
+      no_status_selected: Ingen statusar vart endra sidan ingen vart valde
+      title: Kontostatusar
+      with_media: Med media
+    tags:
+      accounts_today: Ulike brukarar i dag
+      accounts_week: Unike brukstilfeller denne uken
+      breakdown: Oversyn over bruk i dag etter kjelde
+      context: Kontekst
+      directory: I mappen
+      in_directory: "%{count} i mappen"
+      last_active: Sist aktiv
+      most_popular: Mest populær
+      most_recent: Nyast
+      name: Emneknagg
+      review: Sjå gjennom status
+      reviewed: Gjennomgått
+      title: Emneknaggar
+      trending_right_now: Populært no
+      unique_uses_today: "%{count} legg ut i dag"
+      unreviewed: Ikkje gjennomgått
+      updated_msg: Emneknagginnstillingane er oppdaterte
+    title: Leiing
+    warning_presets:
+      add_new: Legg til ny
+      delete: Slett
+      edit: Rediger
+      edit_preset: Endr åtvaringsoppsett
+      title: Handsam åtvaringsoppsett
+  admin_mailer:
+    new_report:
+      body: "%{reporter} har rapportert %{target}"
+      body_remote: Nokon frå %{domain} har meldt %{target}
+      subject: Ny rapport for %{instance} (#%{id})
+    new_trending_tag:
+      body: 'Emneknaggen #%{name} trender i dag, men den har ikke blitt gjennomgått tidligere. Den vil ikke bli vist offentlig med mindre du tillater at den blir det, eller du kan bare lagre skjemaet slik det er for å aldri høre om det igjen.'
+      subject: Ny emneknagg ventar gjennomgang på %{instance} (#%{name})
+  aliases:
+    add_new: Lag psevdonym
+    created_msg: Laga eit nytt kallenamn. No kan du setja i gang med flyttinga frå den gamle kontoen.
+    deleted_msg: Fjerna kallenamnet. No vert det ikkje lenger mogeleg å flytta frå den andre kontoen til denne.
+    hint_html: Dersom du vil flytte fra en annen konto til den, kan du lage et alias her, som er påkrevd før du kan gå videre med å flytte følgere fra den gamle kontoen til den nye. Handlingen i seg selv er <strong>harmløs og reversibel</strong>. <strong>Kontoflyttingen har blitt satt i gang fra den gamle kontoen</strong>.
+    remove: Fjern aliaslenking
+  appearance:
+    advanced_web_interface: Avansert nettgrensesnitt
+    advanced_web_interface_hint: 'Hvis du ønsker å bruke hele skjermbredden din, lar det avanserte nettgrensesnittet deg sette opp mange forskjellige kolonner for å se så mye informasjon på én gang som du vil: Hjem, varslinger, fellestidslinjen, og ethvert antall lister og emneknagger.'
+    animations_and_accessibility: Animasjoner og tilgjengelighet
+    confirmation_dialogs: Bekreftelsesdialoger
+    discovery: Oppdaging
+    sensitive_content: Sensitivt innhold
+    toot_layout: Tutoppsett
+  application_mailer:
+    notification_preferences: Endr e-post-innstillingane
+    salutation: "%{name},"
+    settings: 'Endr e-post-innstillingar: %{link}'
+    view: 'Sjå:'
+    view_profile: Sjå profil
+    view_status: Sjå status
+  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!
+    your_token: Tilgangsnykelen din
+  auth:
+    apply_for_account: Bed om innbyding
+    change_password: Passord
+    checkbox_agreement_html: Eg godtek <a href="%{rules_path}" target="_blank">tenarreglane</a> og <a href="%{terms_path}" target="_blank">tenestevilkåra</a>
+    checkbox_agreement_without_rules_html: Eg godtek <a href="%{terms_path}" target="_blank">tenestevilkåra</a>
+    delete_account: Slett konto
+    delete_account_html: Om du vil sletta kontoen din, kan du <a href="%{path}">gå hit</a>. Du vert spurd etter stadfesting.
+    description:
+      prefix_invited_by_user: "@%{name} spør deg om å verta med i ein Mastodon-tenar!"
+      prefix_sign_up: Meld deg på Mastodon i dag!
+      suffix: Med ein konto kan du fylgja folk, skriva innlegg og veksla meldingar med brukarar frå kva som helst annan Mastodon-tenar og meir!
+    didnt_get_confirmation: Fekk du ikkje stadfestingsinstruksjonar?
+    forgot_password: Har du gløymt passordet ditt?
+    invalid_reset_password_token: Tilgangsnykelen er ugyldig eller utgått. Ver venleg å beda om ein ny ein.
+    login: Innlogging
+    logout: Logg ut
+    migrate_account: Flytt til ein annan konto
+    migrate_account_html: Hvis du ønsker å henvise denne kontoen til en annen, kan du <a href="%{path}">konfigurere det her</a>.
+    or_log_in_with: Eller logg inn med
+    providers:
+      cas: CAS
+      saml: SAML
+    register: Registrer deg
+    registration_closed: "%{instance} tek ikkje imot nye medlemmar"
+    resend_confirmation: Send stadfestingsinstruksjonar på nytt
+    reset_password: Attstill passord
+    security: Tryggleik
+    set_new_password: Lag nytt passord
+    setup:
+      email_below_hint_html: Om e-posten nedfor ikkje er rett, kan du endra han her og få ein ny stadfestings-e-post.
+      email_settings_hint_html: Stadfestings-e-posten vart send til %{email}. Om den e-postadressa ikkje er rett, kan du byta adresse i kontoinnstillingane.
+      title: Oppsett
+    status:
+      account_status: Kontostatus
+      confirming: Ventar på stadfesting av e-post.
+      functional: Kontoen din er oppe og går.
+      pending: Søknaden din ventar på gjennomgang frå personalet vårt. Dette kan taka litt tid. Du får ein e-post om søknaden din vert godkjend.
+    trouble_logging_in: Får du ikkje logga inn?
+  authorize_follow:
+    already_following: Du fylgjer allereie denne kontoen
+    error: Uheldigvis skjedde det en feil da vi prøvde å få tak i en bruker fra en annen instans
+    follow: Fylg
+    follow_request: 'Du har sendt ein fylgjeførespurnad til:'
+    following: 'Suksess! No fylgjer du:'
+    post_follow:
+      close: Eller så kan du berre lukka att dette vindauget.
+      return: Vis brukarprofilen
+      web: Gå til nettet
+    title: Fylg %{acct}
+  challenge:
+    confirm: Hald fram
+    hint_html: "<strong>Tips:</strong> Vi skal ikkje spørja deg om passordet ditt igjen i laupet av den neste timen."
+    invalid_password: Ugyldig passord
+    prompt: Stadfest passord for å halda fram
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count}t"
+      about_x_months: "%{count}md."
+      about_x_years: "%{count} år"
+      almost_x_years: "%{count} år"
+      half_a_minute: No nettopp
+      less_than_x_minutes: "%{count}min"
+      less_than_x_seconds: No nettopp
+      over_x_years: "%{count} år"
+      x_days: "%{count}d"
+      x_minutes: "%{count}min"
+      x_months: "%{count}md"
+      x_seconds: "%{count}s"
+  deletes:
+    challenge_not_passed: Det du skreiv var ikkje rett
+    confirm_password: Skriv det noverande passordet ditt for å stadfesta identiteten din
+    confirm_username: Skriv inn brukarnamnet ditt for å stadfesta
+    proceed: Slett konto
+    success_msg: Kontoen din er sletta
+    warning:
+      before: 'Ver venleg og les desse punkta nøye før du held fram:'
+      caches: Innhold som har blitt mellomlagret av andre tjenere kan kanskje fortsette å eksistere
+      data_removal: Innlegga dine og andre data vert fjerna for alltid
+      email_change_html: Du kan <a href="%{path}">byta e-postadressa di</a> utan å sletta kontoen din
+      email_contact_html: Dersom det fortsatt ikke kommer, kan du sende en E-post til <a href="mailto:%{email}">%{email}</a> og be om hjelp
+      email_reconfirmation_html: Dersom du ikke mottar bekreftelses-E-posten, kan du <a href="%{path}">be om den igjen</a>
+      irreversible: Du kjem ikkje til å kunna gjenoppretta eller aktivera kontoen din på nytt
+      more_details_html: For fleire detaljar, sjå <a href="%{terms_path}">personvernsvilkåra</a>.
+      username_available: Brukarnamnet ditt vert tilgjengeleg igjen
+      username_unavailable: Brukarnamnet ditt kjem til å halda seg utilgjengeleg
+  directories:
+    directory: Profilkatalog
+    explanation: Leit fram brukarar etter interessa deira
+    explore_mastodon: Utforsk %{title}
+  domain_validator:
+    invalid_domain: er ikkje eit gangbart domenenamn
   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': Throttled
-    '500': 
+    '400': Søknaden du sende var ugyldig eller sett opp feil.
+    '403': Du har ikkje løyve til å sjå denne sida.
+    '404': Sida du leitar etter finst ikkje.
+    '406': Denne sida er ikkje tilgjengeleg i dette oppsettet.
+    '410': Sida du leitar etter finst ikkje her lenger.
+    '422':
+      content: Sikkerhetsverifisering feilet. Blokkerer du informasjonskapsler?
+      title: Sikkerhetsverifisering feilet
+    '429': Overfyllt
+    '500':
+      content: Orsak. Vi har gjort noko feil.
+      title: Denne sida er ikkje rett
     '503': The page could not be served due to a temporary server failure.
+    noscript_html: For å bruke Mastodon webapplikasjon må du aktivere JavaScript. Alternativt kan du forsøke en av de mange <a href="%{apps_path}">integrerte appene</a> for Mastodon til din plattform.
+  existing_username_validator:
+    not_found: fann ingen lokalbrukar med det namnet
+    not_found_multiple: fann ikkje %{usernames}
+  exports:
+    archive_takeout:
+      date: Dato
+      download: Last ned arkivet ditt
+      hint_html: Du kan be om et arkiv med dine <strong>tuter og opplastede media</strong>. Den eksporterte dataen vil være i ActivityPub-formatet, som kan leses av programmer som støtter det. Du kan be om et arkiv opptil hver 7. dag.
+      in_progress: Samlar arkivet ditt...
+      request: Bed om arkivet ditt
+      size: Storleik
+    blocks: Du blokkerer
+    csv: CSV
+    domain_blocks: Domeneblokkeringer
+    lists: Lister
+    mutes: Du dempar
+    storage: Medielagring
+  featured_tags:
+    add_new: Legg til ny
+    errors:
+      limit: Du har allereie så mange emneknaggar som det går an å ha
+    hint_html: "<strong>Hva er utvalgte emneknagger?</strong> De vises frem tydelig på din offentlige profil, og lar folk bla i dine offentlige innlegg som spesifikt har de emneknaggene. De er et bra verktøy for å holde styr på kreative verk eller langtidsprosjekter."
+  filters:
+    contexts:
+      home: Heimeside
+      notifications: Varsel
+      public: Offentlege tidsliner
+      thread: Samtalar
+    edit:
+      title: Endr filter
+    index:
+      delete: Slett
+      title: Filter
+    new:
+      title: Legg til nytt filter
+  footer:
+    developers: Utviklarar
+    more: Meir…
+    resources: Ressursar
+    trending_now: Populært no
+  generic:
+    all: Alle
+    changes_saved_msg: Alle endringane vart lagra!
+    copy: Kopier
+    order_by: Sorter etter
+    save_changes: Lagr endringar
+    validation_errors:
+      one: Noe er ikke helt riktig ennå. Vennligst se etter en gang til
+      other: Noe er ikke helt riktig ennå. Det er ennå %{count} feil å rette på
+  identity_proofs:
+    active: Aktiv
+    authorize: Ja, stadfest
+    errors:
+      keybase:
+        verification_failed: Keybase kjenner ikke igjen denne sjetongen som en signatur for Keybase-brukeren %{kb_username}. Vennligst prøv igjen gjennom Keybase.
+      wrong_user: Kan ikke lage et bevis for %{proving} mens du er logget på som %{current}. Logg på som %{proving} og prøv igjen.
+    explanation_html: Her kan du kryptografisk koble til dine andre enheter, f.eks. en Keybase-profil. Dette lar andre folk sende deg krypterte meldinger og stole på innhold som du sender dem.
+    i_am_html: Eg er %{username} på %{service}.
+    identity: Identitet
+    inactive: Uaktiv
+    publicize_checkbox: 'Og tut dette:'
+    publicize_toot: 'Det er prova! Eg er %{username} på %{service}: %{url}'
+    status: Stadfestingsstatus
+    view_proof: Sjå prov
+  imports:
+    modes:
+      merge: Set saman
+      overwrite: Skriv over
+    preface: Du kan henta inn data som du har eksportert frå ein annan tenar, som t.d. ei liste over folka du fylgjer eller blokkerer.
+    success: Dataa dine vart lasta opp og vert no handsama så fort som mogeleg
+    types:
+      blocking: Blokkeringsliste
+      domain_blocking: Liste over blokkerte domene
+      following: Fylgjeliste
+      muting: Dempeliste
+    upload: Last opp
+  in_memoriam_html: Til minne.
   invites:
+    delete: Slå av
+    expired: Utgått
     expires_in:
-      '1800': 30 minutes
-      '21600': 6 hours
-      '3600': 1 hour
-      '43200': 12 hours
-      '604800': 1 week
-      '86400': 1 day
+      '1800': 30 minutt
+      '21600': 6 timar
+      '3600': 1 time
+      '43200': 12 timar
+      '604800': 1 veke
+      '86400': 1 dag
+    expires_in_prompt: Aldri
+    generate: Lag innbydingslenkje
+    invited_by: 'Du vart invitert av:'
+    max_uses:
+      one: 1 bruk
+      other: "%{count} bruk"
+    max_uses_prompt: Inga grense
+    prompt: Generer og del lenker med andre for å gi tilgang til denne instansen
+    table:
+      expires_at: Vert ugyldig
+      uses: Bruk
+    title: By folk inn
+  lists:
+    errors:
+      limit: Du har nådd grensa for kor mange lister du kan ha
+  media_attachments:
+    validations:
+      images_and_video: Kan ikkje leggja ved video til status som allereie inneheld bilete
+      too_many: Kan ikkje leggja til meir enn 4 filer
+  migrations:
+    acct: Flytta til
+    cancel: Avbryt omdirigeringen
+    cancel_explanation: Å avbryte omdirigeringen vil reaktivere din nåværende konto, men vil ikke bringe tilbake følgere som har blitt flyttet til den kontoen.
+    errors:
+      already_moved: er den same kontoen som du allereie har flytta til
+      move_to_self: kan ikkje vera denne kontoen
+      not_found: fann ikkje
+    followers_count: Fylgjarar då kontoen vart flytta
+    incoming_migrations: Flyttar frå ein annan konto
+    incoming_migrations_html: For å flytta frå ein annnan konto til denne må du fyrst <a href="%{path}">laga eit kallenamn til kontoen</a>.
+    past_migrations: Tidlegare vandringar
+    proceed_with_move: Flytt fylgjarar
+    set_redirect: Bestem omdirigering
+    warning:
+      before: 'Før du fortsetter, vennligst les disse notisene nøye:'
+      disabled_account: Din nåværende konto vil ikke være fullt brukbar etterpå. Men du vil ha tilgang til dataeksportering såvel som reaktivering.
+  moderation:
+    title: Moderasjon
+  notification_mailer:
+    digest:
+      action: Sjå alle varsel
+      body: Her er ei kort samanfatting av meldingane du gjekk glepp av sidan siste gong du var innom %{since}
+      mention: "%{name} nemnde deg i:"
+      new_followers_summary:
+        one: Du har forresten fått deg ein ny fylgjar mens du var borte! Hurra!
+        other: Du har forresten fått deg %{count} nye fylgjarar mens du var borte! Hurra!
+      subject:
+        one: "1 nytt varsel sidan siste gong du var innom \U0001F418"
+        other: "%{count} nye varsel sidan siste gong du var innom \U0001F418"
+      title: Mens du var borte...
+    favourite:
+      body: 'Statusen din vart merkt som favoritt av %{name}:'
+      subject: "%{name} merkte statusen din som favoritt"
+      title: Nye favorittar
+    follow:
+      body: "%{name} fylgjer deg!"
+      subject: "%{name} fylgjer deg"
+      title: Ny fylgjar
+    follow_request:
+      action: Gå gjennom førespurnader
+      body: "%{name} har bedt om å fylgja deg"
+      subject: 'Ventande fylgjar: %{name}'
+      title: Ny fylgjeførespurnad
+    mention:
+      action: Svar
+      body: 'Du vart nemnd av %{name} i:'
+      subject: Du vart nemnd av %{name}
+      title: Ny nemning
+    reblog:
+      body: 'Statusen din vart framheva av %{name}:'
+      subject: "%{name} framheva statusen din"
+      title: Ny framheving
+  notifications:
+    email_events: E-postvarslinger for hendelser
+    email_events_hint: 'Velg hendelser som du vil motta varslinger for:'
+    other_settings: Andre varslingsinnstillinger
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: Mrd
+          million: Mil
+          quadrillion: Bil
+          thousand: K
+          trillion: Bil
+  pagination:
+    newer: Nyare
+    next: Neste
+    older: Eldre
+    prev: Førre
+    truncate: "&hellip;"
+  polls:
+    errors:
+      already_voted: Du har allereie røysta i denne rundspørjinga
+      duplicate_options: inneheld like element
+      duration_too_long: er for langt fram i tid
+      duration_too_short: er for snart
+      expired: Denne rundspørjinga er allereie ferdig
+      over_character_limit: kan ikkje vera lengre enn %{max} teikn kvar
+      too_few_options: må ha meir enn eitt element
+      too_many_options: kan ikkje ha meir enn %{max} element
+  preferences:
+    other: Anna
+    posting_defaults: Innleggsstandarder
+    public_timelines: Offentlege tidsliner
+  relationships:
+    activity: Kontoaktivitet
+    dormant: I dvale
+    followers: Følgere
+    following: Følginger
+    last_active: Sist aktiv
+    most_recent: Sist
+    moved: Flytta
+    mutual: Felles
+    primary: Primært
+    relationship: Forhold
+    remove_selected_domains: Fjern alle fylgjarar frå dei valde domena
+    remove_selected_followers: Fjern valde fylgjarar
+    remove_selected_follows: Slutt å fylgja desse brukarane
+    status: Kontostatus
+  remote_follow:
+    acct: Tast inn brukernavn@domene som du vil følge fra
+    missing_resource: Kunne ikke finne URLen for din konto
+    no_account_html: Har du ikkje konto? Du kan <a href='%{sign_up_path}' target='_blank'>melda deg inn her</a>
+    proceed: Hald fram med å fylgja
+    prompt: 'Du kjem til å fylgja:'
+    reason_html: "<strong>Hvorfor dette trinnet er nødvendig?</strong><code>%{instance}</code> er kanskje ikke tjeneren som du er registrert på, så vi må omdirigere deg til hjemmetjeneren din først."
+  remote_interaction:
+    favourite:
+      proceed: Merk som favoritt
+      prompt: 'Du vil merkja dette tutet som favoritt:'
+    reblog:
+      proceed: Framhev
+      prompt: 'Du vil framheva dette tutet:'
+    reply:
+      proceed: Svar
+      prompt: 'Du vil svara på dette tutet:'
+  sessions:
+    activity: Siste aktivitet
+    browser: Nettlesar
+    browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Electron
+      firefox: Firefox
+      generic: Ukjend lesar
+      ie: Internet Explorer
+      micro_messenger: Micromessenger
+      nokia: Nokia S40 Ovi-lesar
+      opera: Opera
+      otter: Otter
+      phantom_js: PhantomJS
+      qq: QQ-lesar
+      safari: Safari
+      uc_browser: UC-lesar
+      weibo: Weibo
+    current_session: Noverande økt
+    description: "%{browser} på %{platform}"
+    explanation: Desse nettlesarane er logga inn på Mastodon-kontoen din.
+    ip: IP
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: Chrome OS
+      firefox_os: Firefox OS
+      ios: IOS
+      linux: Linux
+      mac: Mac
+      other: ukjend plattform
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
+    revoke: Tilbakekall
+    revoke_success: Økt tilbakekalt
+    title: Økter
+  settings:
+    account: Konto
+    account_settings: Kontoinnstillingar
+    aliases: Kallenamn til kontoen
+    appearance: Utsjånad
+    authorized_apps: Godkjende appar
+    back: Tilbake til Mastodon
+    delete: Kontosletting
+    development: Utvikling
+    edit_profile: Endr profil
+    export: Dataeksport
+    featured_tags: Utvalgte emneknagger
+    identity_proofs: Identitetsprov
+    import: Hent inn
+    import_and_export: Importer og eksporter
+    migrate: Kontoflytting
+    notifications: Varsel
+    preferences: Innstillingar
+    profile: Profil
+    relationships: Fylgjar og fylgjarar
+    two_factor_authentication: Tostegsautorisering
+  statuses:
+    attached:
+      description: 'Vedlagt: %{attached}'
+      image:
+        one: "%{count} bilete"
+        other: "%{count} bilete"
+      video:
+        one: "%{count} video"
+        other: "%{count} videoar"
+    boosted_from_html: Framheva av %{acct_link}
+    content_warning: 'Innhaldsåtvaring: %{warning}'
+    disallowed_hashtags:
+      one: 'inneheldt ein emneknagg som ikkje var tillaten: %{tags}'
+      other: 'inneheldt emneknaggen som ikkje var tillaten: %{tags}'
+    language_detection: Kjenn att språk automatisk
+    open_in_web: Opn på nett
+    over_character_limit: øvregrensa for teikn, %{max}, er nådd
+    pin_errors:
+      limit: Du har allereie festa så mange tut som det går an å festa
+      ownership: Du kan ikkje festa andre sine tut
+      private: Du kan ikkje festa uoffentlege tut
+      reblog: Ei framheving kan ikkje festast
+    poll:
+      total_people:
+        one: "%{count} person"
+        other: "%{count} folk"
+      total_votes:
+        one: "%{count} røyst"
+        other: "%{count} røyster"
+      vote: Røyst
+    show_more: Vis meir
+    sign_in_to_participate: Logg inn for å verta med i samtalen
+    title: "%{name}: «%{quote}»"
+    visibilities:
+      private: Berre fylgjarar
+      private_long: Vis berre til fylgjarar
+      public: Offentleg
+      public_long: Alle kan sjå
+      unlisted: Ikkje oppført
+      unlisted_long: Alle kan sjå, men ikkje oppført på offentlege tidsliner
+  stream_entries:
+    pinned: Festa tut
+    reblogged: framheva
+    sensitive_content: Følsomt innhold
+  tags:
+    does_not_match_previous_name: stemmar ikkje med det førre namnet
+  terms:
+    body_html: |
+      <h2>Privatlivsretningslinjer</h2>
+      <h3 id="collect">Hva slags informasjon samler vi inn?</h3>
+
+      <ul>
+      <li><em>Grunnleggende kontoinformasjon</em>: Dersom du registrerer deg på denne tjeneren, vil du kanskje bli spurt om å skrive inn et brukernavn, en E-postadresse, og et passord. Du kan også skrive inn ytterligere profilinformasjon som f.eks. et visningsnavn og selvbiografi, og laste opp et profilbilde og toppfeltbilde. Brukernavnet, visningsnavnet, selvbiografien, profilbildet, og toppfeltbildet blir alltid vist offentlig.</li>
+      <li><em>Innlegg, følging, og annen offentlig informasjon</em>: Listen over folk du følger blir vist offentlig, det samme gjelder for følgerne dine. Når du sender inn en melding, blir datoen og tidspunktet lagret såvel som programmet du sendte inn meldingen ifra. Meldinger kan inneholde mediavedlegg, som f.eks. bilder og videoer. Offentlige og uoppførte innlegg er offentlig tilgjengelige. Når du viser frem et innlegg på profilen din, er det også offentlig tilgjengelig informasjon. Dinne innlegg blir levert til dine følgere, og i noen tilfeller betyr det at blir levert til forskjellige tjenere og at kopier blir lagret der. Når du sletter innlegg, blir også det levert til dine følgere. Det å fremheve eller like et annet innlegg er alltid offentlig.</li>
+      <li><em>Direkteinnlegg og innlegg som kun er for følgere</em>: Alle innlegg er lagret og behandlet på tjeneren. Innlegg som kun er for følgere, blir levert til dine følgere, og direkteinnlegg leveres kun til brukere som er nevnt i dem. I noen tilfeller betyr det at de blir levert til forskjellige tjenere og at kopier blir lagret der. Vi gjør et forsøk i god sportsånd for å begrense tilgangen til disse innleggene til kun autoriserte personer, men andre tjenere kan mislykkes med sådan. Derfor er det viktig å gå i gjennom tjenerne som følgerne dine hører til i. I innstillingene kan du veksle på en innstilling for å godkjenne og avslå nye følgere manuelt. <em>Vennligst ha i tankene at operatørene til tjeneren og enhver mottakende tjener kan se slike meldinger</em>, og at mottakere kan ta skjermklipp av, kopiere, eller på annet vis dele dem videre. <em>Ikke del noe farlig informasjon over Mastodon.</em></li>
+      <li><em>IP-er og andre metadata</em>: Når du logger på, lagrer vi IP-adressen som du logget deg på fra, såvel som navnet til nettleserprogrammet ditt. Du kan gå gjennom og tilbakekalle alle påloggede økter i innstillingene. Den seneste IP-adressen du brukte, blir lagret i opptil 12 måneder. Vi vil kanskje også holde på tjenerloggføringer som inkluderer IP-adressen til alle forespørsler til tjeneren vår.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">Hva bruker vi informasjonen din til?</h3>
+
+      <p>Hva som helst av informasjonen som vi samler inn fra deg, kan bli brukt på de følgende måtene:</p>
+
+      <ul>
+      <li>Til å levere grunnfunksjonaliteten til Mastodon. Du kan bare samhandle med andre folks innhold og legge ut ditt eget innhold når du er logget på. For eksempel kan du følge andre folk for å se deres kombinerte innlegg i din egen personliggjorte hjemmetidslinje.</li>
+      <li>Til å bistå i moderasjonen av samfunnet, for eksempel å sammenligne IP-adressen din med andre andre kjente adresser for å avgjøre saker om bannlysningsunngåelse eller andre regelbrudd.</li>
+      <li>E-postadressen du oppgir kan bli brukt til å sende deg informasjon, varsler om at andre folk samhandler med innholdet ditt eller sender deg meldinger, og å svare på brukerstøttespørsmål, og/eller andre forespørsler eller spørsmål.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="protect">Hvordan beskytter vi informasjonen din?</h3>
+
+      <p>Vi implementer en rekke sikkerhetstiltak for å holde på sikkerheten til din personlige informasjon når du skriver inn, sender inn, eller besøker din personlige informasjon. Blant annet er din nettleserøkt, såvel som trafikken mellom dine apper og API-er, sikret med SSL, og passordet ditt er saltet med en kraftig énveisalgoritme. Du kan skru på 2-trinnsinnlogging for å sikre tilgangen til kontoen din ytterligere.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="data-retention">Hva er våre databeholdingsretningslinjer?</h3>
+
+      <p>Vi vil gjøre en innsats i god sportsånd for å</p>
+
+      <ul>
+      <li>Beholde tjenerloggføringer som inneholder IP-adressen til alle forespørsler til denne tjeneren, dersom det blir loggført i det hele tatt, i ikke mer enn 90 dager.</li>
+      <li>Beholde IP-adressene som er forbundet med registrerte brukere i ikke mer enn 12 måneder.</li>
+      </ul>
+
+      <p>Du kan be om og laste ned et arkiv av innholdet ditt, inkludert dine innlegg, media, mediavedlegg, profilbilde, og toppfeltbilde.</p>
+
+      <p>Du kan ugjenkallelig slette kontoen til enhver tid.</p>
+
+      <hr class="spacer"/>
+
+      <h3 id="cookies">Bruker vi infokapsler?</h3>
+
+      <p>Ja. Infokapsler er små filer som et nettsted eller dens tjenesteleverandør overfører til harddisken på datamaskinen din gjennom nettleseren din (dersom du tillater dette). Disse infokapslene lar nettstedet kjenne igjen nettleseren din og, dersom du har en registrert konto, assosiere den med din registrerte konto.</p>
+
+      <p>Vi benytter infokapsler for å forstå og lagre dinne innstillinger til fremtidige besøk.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="disclose">Forteller vi om noe informasjon til utenforstående parter?</h3>
+
+      <p>Vi hverken selger, bytter, eller på andre måter overfører din personlig identifiserbare informasjon til utenforstående parter. Dette inkluderer ikke tredjeparter som vi stoler på og som hjelper oss med å drifte nettstedet vårt, drifte våre forretninger, eller å yte tjenester til deg, så lenge disse partene sier seg enige i å holde denne informasjonen hemmelig. Vi kan også frigi informasjonen vår dersom vi mener et frigiving er passende for å møte loven, handle i tråd med vår nettstedsretningslinjer, eller å beskytte vår eller andres rettigheter, eiendom, eller trygghet.</p>
+
+      <p>Ditt offentlige innhold kan bli lastet ned av andre tjenere i nettverket. Dine offentlige innlegg og innlegg som kun er for følgere blir levert til tjenerne der følgerne dine holder til, og direktemeldinger blir levert il mottakernes tjenere, i den grad de følgerne eller mottakerne holder på en annen tjener enn denne.</p>
+
+      <p>Når du gir et program autorisasjon til å bruke kontoen din, avhengig av omfanget av tillatelser som du tillater, kan den få tilgang til din offentlige profilinformasjon, din følgingsliste, dine følgere, dine lister, alle dine innlegg, og dine likinger. Programmer kan aldri få tilgang til E-postadressen eller passordet ditt.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="children">Nettstedsbruk av barn</h3>
+
+      <p>Dersom denne tjeneren er i EU eller EØS: Vårt nettsted, produkter og tjenester er alle siktet inn mot folk som er minst 16 år gamle. Dersom du er under 16, sier GDPR (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>) at du ikke kan bruke dette nettstedet.</p>
+
+      <p>Dersom denne tjeneren er i USA: Vårt nettsted, produkter og tjenester er alle siktet inn mot folk som er minst 16 år gamle. Dersom du er under 16, sier COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) at du ikke kan bruke dette nettstedet.</p>
+
+      <p>Lovmessige krav kan være forskjellige dersom denne tjeneren befinner seg i en annen jurisdiksjon.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="changes">Endringer i våre privatlivsretningslinjer</h3>
+
+      <p>Dersom vi bestemmer oss for å endre våre privatlivsretningslinjer, vil vi legge ut endringene på denne siden.</p>
+
+      <p>Dette dokumentet er lisensiert under CC BY-SA. Den engelske originalversjonen ble sist oppdatert den 7. mars 2018. Den norske oversettelsen ble sist oppdatert den 13. desember 2019.</p>
+
+      <p>Opprinnelig modifisert utifra <a href="https://github.com/discourse/discourse">Discourse sine privatlivsretningslinjer</a>.</p>
+    title: Tenestevilkår og personvernsvilkår for %{instance}
+  themes:
+    contrast: Mastodon (Høg kontrast)
+    default: Mastodon (Mørkt)
+    mastodon-light: Mastodon (Lyst)
+  time:
+    formats:
+      default: "%d.%b %Y, %H:%M"
+      month: "%b %Y"
+  two_factor_authentication:
+    code_hint: Skriv inn koden frå autentiseringsappen for å stadfesta
+    description_html: Hvis du skrur på <strong>tofaktorautentisering</strong> må du ha din telefon for å logge inn. Denne vil generere koder som du må taste inn.
+    disable: Slå av
+    enable: Slå på
+    enabled: Tostegsinnlogging er slege på
+    enabled_success: Aktivering av tofaktorautentisering vellykket
+    generate_recovery_codes: Generér gjenopprettingskoder
+    instructions_html: "<strong>Scan denne QR-koden med Google Authenticator eller en lignende app på telefonen din</strong>. Fra nå av vil denne applikasjonen generere koder for deg som skal brukes under innlogging."
+    lost_recovery_codes: Gjenopprettingskoder lar deg gjenoppnå tilgang til din konto hvis du mister din telefon. Hvis du har mistet gjenopprettingskodene, kan du regenerere dem her. Dine gamle gjenopprettingskoder vil bli ugyldige.
+    manual_instructions: 'Hvis du ikke får scannet QR-koden må du skrive inn følgende kode manuelt:'
+    recovery_codes: Reservekoder
+    recovery_codes_regenerated: Generering av reservekoder fullført
+    recovery_instructions_html: Hvis du skulle miste tilgang til telefonen din, kan du bruke en av gjenopprettingskodene nedenfor til å gjenopprette tilgang til din konto. <strong>Oppbevar gjenopprettingskodene sikkert</strong>, for eksempel ved å skrive dem ut og gjemme dem på et lurt sted bare du vet om.
+    setup: Sett opp
+    wrong_code: Den angitte koden var ugyldig! Stemmer instansens tid overalt med enhetens tid?
+  user_mailer:
+    backup_ready:
+      subject: Arkivet ditt er klart til å lastes ned
+    warning:
+      explanation:
+        disable: Mens kontoen din er fryst, forblir dine kontodata intakt, men du kan ikke utføre noen handlinger før den har blitt tint opp.
+        silence: Mens kontoen din er begrenset, vil bare folk som allerede følger deg se dine tuter på denne tjeneren, og du kan bli ekskludert fra diverse offentlige oppføringer. Men andre kan fortsatt følge deg manuelt.
+        suspend: Kontoen din har blitt suspendert, og alle dine tuter og opplastede media har blitt ugjenkallelig fjernet fra denne tjeneren, og fra tjenere der du hadde følgere.
+      get_in_touch: Du kan svare på denne E-posten for å komme i kontakt med styret i %{instance}.
+      statuses: 'Spesifikt for å:'
+      subject:
+        disable: Kontoen din, %{acct}, har blitt fryst
+        none: Åtvaring for %{acct}
+        silence: Kontoen din, %{acct}, er vorten avgrensa
+        suspend: Kontoen din, %{acct}, er vorten utvist
+      title:
+        disable: Konto frosen
+        none: Åtvaring
+        silence: Konto avgrensa
+        suspend: Konto utvist
+    welcome:
+      edit_profile_action: Lag til profil
+      edit_profile_step: Du kan tilpasse din profil ved å laste opp en avatar, overskrift, endre ditt visningsnavn med mer. Hvis du vil godkjenne hvilke personer som får lov til å følge deg kan du låse kontoen.
+      explanation: Her er nokre tips for å koma i gang
+      final_action: Kom i gang med å leggja ut
+      final_step: 'Byrj å skriva innlegg! Sjølv utan fylgjarar kan andre sjå dei offentlege meldingane dine, til dømes på den lokale tidslina og i emneknaggar. Du har kanskje lyst til å introdusera deg med emneknaggen #introductions.'
+      full_handle: Det fulle brukarnamnet ditt
+      full_handle_hint: Dette er det du fortel venene dine for at dei skal kunna senda deg meldingar eller fylgja deg frå ein annan tenar.
+      review_preferences_action: Endr innstillingar
+      review_preferences_step: Husk å justere dine innstillinger, som hvilke e-poster du ønsker å motta, eller hvor private du ønsker at dine poster skal være som standard. Hvis du ikke har bevegelsessyke kan du skru på automatisk avspilling av GIF-animasjoner.
+      subject: Velkomen til Mastodon
+      tip_federated_timeline: Den forente tidslinjen blir konstant matet med meldinger fra Mastodon-nettverket. Men den inkluderer bare personer dine naboer abbonerer på, så den er ikke komplett.
+      tip_following: Du fylgjer automatisk tenaradministrator(ane). For å finna fleire forvitnelege folk kan du sjekka den lokale og fødererte tidslina.
+      tip_local_timeline: Den lokale tidslinjen blir kontant matet med meldinger fra personer på %{instance}. Dette er dine nærmeste naboer!
+      tip_mobile_webapp: Hvis din mobile nettleser tilbyr deg å legge Mastadon til din hjemmeskjerm kan du motta push-varslinger. Det er nesten som en integrert app på mange måter!
+      tips: Tips
+      title: Velkomen om bord, %{name}!
+  users:
+    follow_limit_reached: Du kan ikkje fylgja fleire enn %{limit} folk
+    invalid_email: E-mailadressa er ugyldig
+    invalid_otp_token: Ugyldig tostegskode
+    signed_in_as: 'Logga inn som:'
+  verification:
+    explanation_html: 'Du kan <strong>bekrefte at du selv er eieren av lenkene i din profilmetadata</strong>. For å gjøre det, må det tillenkede nettstedet inneholde en lenke som fører tilbake til Mastodon-profilen din. Lenken tilbake <strong>må</strong> ha en <code>rel="me"</code>-attributt. Tekstinnholdet til lenken er irrelevant. Her er et eksempel:'
+    verification: Stadfesting
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 2c8786066..fed806d56 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -4,39 +4,110 @@
     about_hashtag_html: Dette er offentlige toots merket med <strong>#%{hashtag}</strong>. Du kan interagere med dem om du har en konto et sted i fediverset.
     about_mastodon_html: Mastodon er et sosialt nettverk laget med <em>fri programvare</em>. Et <em>desentralisert</em> alternativ til kommersielle plattformer. Slik kan det unngå risikoene ved å ha et enkelt selskap som monopoliserer din kommunikasjon. Velg en tjener du stoler på &mdash; uansett hvilken du velger så kan du kommunisere med alle andre. Alle kan kjøre sin egen Mastodon og delta sømløst i det sosiale nettverket.
     about_this: Om denne instansen
+    active_count_after: aktive
+    active_footnote: Månedlige aktive brukere (MAU)
+    administered_by: 'Administrert av:'
+    api: API
+    apps: Mobilapper
+    apps_platforms: Bruk Mastodon gjennom iOS, Android og andre plattformer
+    browse_directory: Bla gjennom en profilmappe og filtrer etter interesser
+    browse_local_posts: Bla i en sanntidsstrøm av offentlige innlegg fra denne tjeneren
+    browse_public_posts: Bla i en sanntidsstrøm av offentlige innlegg på Mastodon
     contact: Kontakt
     contact_missing: Ikke innstilt
     contact_unavailable: Ikke tilgjengelig
+    discover_users: Oppdag brukere
+    documentation: Dokumentasjon
+    federation_hint_html: Med en konto på %{instance} vil du kunne følge folk på enhver Mastodon-tjener, og mer til.
+    get_apps: Prøv en mobilapp
     hosted_on: Mastodon driftet på %{domain}
+    instance_actor_flash: 'Denne brukeren er en virtuell aktør brukt til å representere selve serveren og ingen individuell bruker. Det brukes til foreningsformål og bør ikke blokkeres med mindre du vil blokkere hele instansen, hvor domeneblokkering bør brukes i stedet.
+
+'
     learn_more: Lær mer
+    privacy_policy: Privatlivsretningslinjer
+    see_whats_happening: Se hva som skjer
+    server_stats: 'Tjenerstatistikker:'
     source_code: Kildekode
+    status_count_after:
+      one: status
+      other: statuser
     status_count_before: Som skrev
+    tagline: Følg venner og oppdag nye
+    terms: Bruksvilkår
+    unavailable_content: Utilgjengelig innhold
+    unavailable_content_description:
+      domain: Tjener
+      reason: Årsak
+      rejecting_media: 'Mediafiler fra disse tjenerne vil ikke bli behandlet eller lagret, og ingen miniatyrbilder vil bli vist, noe som vil kreve manuell klikking for å besøke den opprinnelige filen:'
+      silenced: 'Innlegg fra disse tjenerne vil bli skjult fra offentlige tidslinjer og samtaler, og ingen varslinger vil bli generert fra disse brukernes samhandlinger, med mindre du følger dem:'
+      suspended: 'Ingen data fra disse tjenerne vil bli behandlet, lagret, eller utvekslet, noe som vil gjøre enhver samhandling eller kommunikasjon med brukere fra disse tjenerne umulig:'
+    unavailable_content_html: Mastodon lar deg vanligvis se innhold fra og samhandle med brukere fra enhver annen tjener i strømiverset. Dette er unntakene som har blitt gjort på denne spesifikke tjeneren.
+    user_count_after:
+      one: bruker
+      other: brukere
     user_count_before: Her bor
     what_is_mastodon: Hva er Mastodon?
   accounts:
+    choices_html: "%{name} sine anbefalte:"
+    endorsements_hint: Du kan fremheve personer du følger fra nettgrensesnittet som deretter vil bli vist her.
+    featured_tags_hint: Du kan fremheve spesifikke emneknagger som vil bli vist her.
     follow: Følg
+    followers:
+      one: Følger
+      other: Følgere
     following: Følger
+    joined: Ble med den %{date}
+    last_active: senest aktiv
+    link_verified_on: Eierskap av denne lenken ble sjekket %{date}
+    media: Media
     moved_html: "%{name} har flyttet til %{new_profile_link}:"
+    network_hidden: Denne informasjonen er ikke tilgjengelig
+    never_active: Aldri
     nothing_here: Det er ingenting her!
     people_followed_by: Folk som %{name} følger
     people_who_follow: Folk som følger %{name}
+    pin_errors:
+      following: Du må allerede følge personen du vil fremheve
+    posts:
+      one: Tut
+      other: Tuter
+    posts_tab_heading: Tuter
     posts_with_replies: Tuter med svar
     reserved_username: Brukernavnet er reservert
     roles:
+      admin: Administrator
+      bot: Bot
+      group: Gruppe
       moderator: Moderere
-    unfollow: Slutte følge
+    unavailable: Profilen er utilgjengelig
+    unfollow: Slutt å følge
   admin:
+    account_actions:
+      action: Utfør handling
+      title: Utfør moderatorhandling på %{acct}
     account_moderation_notes:
       create: Lag
       created_msg: Moderasjonsnotat laget uten problem!
       delete: Slett
       destroyed_msg: Moderasjonsnotat slettet uten problem!
     accounts:
+      approve: Godkjenn
+      approve_all: Godkjenn alle
       are_you_sure: Er du sikker?
+      avatar: Profilbilde
       by_domain: Domene
+      change_email:
+        changed_msg: Konto-E-postadressen ble vellykket endret!
+        current_email: Nåværende E-post
+        label: Endre e-post
+        new_email: Ny E-post
+        submit: Endre e-post
+        title: Endre E-postadressen til %{username}
       confirm: Bekreft
       confirmed: Bekreftet
       confirming: Bekrefte
+      deleted: Slettet
       demote: Degrader
       disable: Deaktiver
       disable_two_factor_authentication: Skru av 2FA
@@ -50,8 +121,11 @@
       enabled: Aktivert
       followers: Følgere
       follows: Følginger
+      header: Overskrift
       inbox_url: Innboks URL
+      invited_by: Invitert av
       ip: IP-adresse
+      joined: Ble med den
       location:
         all: Alle
         local: Lokalt
@@ -61,20 +135,29 @@
       media_attachments: Mediavedlegg
       memorialize: Gjør om til et minne
       moderation:
+        active: Aktive
         all: Alle
+        pending: Avventer
         silenced: Målbundet
         suspended: Utvist
         title: Moderasjon
       moderation_notes: Moderasjonsnotater
       most_recent_activity: Nyligste aktivitet
       most_recent_ip: Nyligste IP
+      no_account_selected: Ingen brukere ble forandret da ingen var valgt
+      no_limits_imposed: Ingen grenser er tatt i bruk
       not_subscribed: Ikke abonnért
+      pending: Avventer gjennomgang
       perform_full_suspension: Utfør full utvisning
       promote: Oppgradere
       protocol: Protokoll
       public: Offentlig
       push_subscription_expires: PuSH-abonnent utløper
       redownload: Oppdater avatar
+      reject: Avslå
+      reject_all: Avslå alle
+      remove_avatar: Fjern profilbilde
+      remove_header: Fjern overskrift
       resend_confirmation:
         already_confirmed: Denne brukeren er allerede bekreftet
         send: Send bekreftelses-epost på nytt
@@ -84,28 +167,46 @@
       resubscribe: Abonner på nytt
       role: Rettigheter
       roles:
+        admin: Administrator
+        moderator: Moderator
         staff: Personale
         user: Bruker
       search: Søk
+      search_same_ip: Andre brukere med den samme IP-en
       shared_inbox_url: Delt Innboks URL
       show:
         created_reports: Rapporter laget av denne kontoen
         targeted_reports: Rapporter laget om denne kontoen
       silence: Målbind
+      silenced: Stilnet
       statuses: Statuser
       subscribe: Abonnere
+      suspended: Suspendert
+      time_in_queue: Venter i kø %{time}
       title: Kontoer
+      unconfirmed_email: Ubekreftet E-postadresse
       undo_silenced: Angre målbinding
       undo_suspension: Angre utvisning
-      unsubscribe: Avslutte abonnementet
+      unsubscribe: Avslutt abonnementet
       username: Brukernavn
+      warn: Advar
+      web: Nett
+      whitelisted: Hvitelistet
     action_logs:
       actions:
+        assigned_to_self_report: "%{name} tilegnet rapport %{target} til seg selv"
+        change_email_user: "%{name} forandret e-postadressen for bruker %{target}"
         confirm_user: "%{name} bekreftet e-postadresse for bruker %{target}"
+        create_account_warning: "%{name} sendte en advarsel til %{target}"
+        create_announcement: "%{name} laget en ny kunngjøring %{target}"
         create_custom_emoji: "%{name} lastet opp ny emoji %{target}"
+        create_domain_allow: "%{name} hvitelistet domenet %{target}"
         create_domain_block: "%{name} blokkerte domenet %{target}"
         create_email_domain_block: "%{name} svartelistet e-postdomenet %{target}"
         demote_user: "%{name} degraderte bruker %{target}"
+        destroy_announcement: "%{name} slettet kunngjøring %{target}"
+        destroy_custom_emoji: "%{name} ødela emojien %{target}"
+        destroy_domain_allow: "%{name} fjernet domenet %{target} fra hvitelisten"
         destroy_domain_block: "%{name} fjernet blokkeringen av domenet %{target}"
         destroy_email_domain_block: "%{name} hvitelistet e-postdomenet %{target}"
         destroy_status: "%{name} fjernet status av %{target}"
@@ -116,28 +217,50 @@
         enable_user: "%{name} aktiverte innlogging for bruker %{target}"
         memorialize_account: "%{name} endret %{target}s konto til en minneside"
         promote_user: "%{name} oppgraderte bruker %{target}"
+        remove_avatar_user: "%{name} fjernet %{target} sitt profilbilde"
+        reopen_report: "%{name} gjenåpnet rapporten %{target}"
         reset_password_user: "%{name} nullstilte passordet til bruker %{target}"
         resolve_report: "%{name} avviste rapporten %{target}"
         silence_account: "%{name} forstummet %{target}s konto"
         suspend_account: "%{name} suspendert %{target}s konto"
+        unassigned_report: "%{name} avtilegnet rapport %{target}"
         unsilence_account: "%{name} fjernet forstummingen av %{target}s konto"
         unsuspend_account: "%{name} opphevde suspenderingen av %{target}s konto"
+        update_announcement: "%{name} oppdaterte kunngjøring %{target}"
         update_custom_emoji: "%{name} oppdaterte emoji %{target}"
         update_status: "%{name} oppdaterte status for %{target}"
+      deleted_status: "(statusen er slettet)"
       title: Revisionslogg
+    announcements:
+      edit:
+        title: Rediger kunngjøring
+      empty: Ingen kunngjøringer funnet.
+      live: Direkte
+      new:
+        create: Lag kunngjøring
+        title: Ny kunngjøring
+      published: Publisert
+      time_range: Tidsramme
+      title: Kunngjøringer
     custom_emojis:
+      assign_category: Tilegn kategori
       by_domain: Domene
       copied_msg: Laget en lokal kopi av emoji uten problem
       copy: Kopiere
       copy_failed_msg: Kunne ikke lage en lokal kopi av den emojien
+      create_new_category: Opprett ny kategori
       created_msg: Emoji laget uten problem!
       delete: Slett
       destroyed_msg: Emojo slettet uten problem!
       disable: Deaktivere
+      disabled: Skrudd av
       disabled_msg: Deaktiverte emoji uten problem
+      emoji: Emoji
       enable: Aktivere
+      enabled: Skrudd på
       enabled_msg: Aktiverte emojien uten problem
       image_hint: PNG opp til 50KB
+      list: Før opp
       listed: Oppførte
       new:
         title: Legg til ny egen emoji
@@ -145,15 +268,52 @@
       shortcode: Kortkode
       shortcode_hint: Minst 2 tegn, kun alfanumeriske tegn og understrek
       title: Egenoppførte emojier
+      uncategorized: Ukategorisert
+      unlist: Fjern oppføring
       unlisted: Unoterte
       update_failed_msg: Kunne ikke oppdatere emojien
       updated_msg: Emoji oppdatert uten problemer!
       upload: Last opp
+    dashboard:
+      authorized_fetch_mode: Sikkermodus
+      backlog: opphopsloggede jobber
+      config: Oppsett
+      feature_deletions: Kontoslettinger
+      feature_invites: Invitasjonslenker
+      feature_profile_directory: Profilmappe
+      feature_registrations: Registreringer
+      feature_relay: Føderasjonsoverganger
+      feature_spam_check: Anti-spam
+      feature_timeline_preview: Tidslinje-forhåndsvisning
+      features: Egenskaper
+      hidden_service: Føderering med skjulte tjenester
+      open_reports: åpne rapporter
+      pending_tags: emneknagger som venter gjennomgang
+      pending_users: brukere som venter gjennomgang
+      recent_users: Nylige brukere
+      search: Fulltekstsøk
+      single_user_mode: Enpersons-modus
+      software: Programvare
+      space: Plassbruk
+      title: Kontrollpanel
+      total_users: brukere totalt
+      trends: Trender
+      week_interactions: samhandlinger denne uken
+      week_users_active: aktiv denne uken
+      week_users_new: brukere denne uken
+      whitelist_mode: Hvitelistemodus
+    domain_allows:
+      add_new: Hvitelist domene
+      created_msg: Domenet har blitt hvitelistet
+      destroyed_msg: Domenet har blitt fjernet fra hvitelisten
+      undo: Fjern fra hvitelisten
     domain_blocks:
       add_new: Lag ny
       created_msg: Domeneblokkering blir nå behandlet
       destroyed_msg: Domeneblokkering har nå blitt angret
       domain: Domene
+      edit: Rediger domeneblokkering
+      existing_domain_block_html: Du har allerede pålagt strengere begrensninger på %{name}, du kan være nødt til <a href="%{unblock_url}">oppheve blokkeringen av den</a> først.
       new:
         create: Lag blokkering
         hint: Domeneblokkeringen vil ikke hindre opprettelse av kontooppføringer i databasen, men vil retroaktivt og automatisk benytte spesifikke moderasjonsmetoder på de kontoene.
@@ -163,8 +323,19 @@
           silence: Målbind
           suspend: Utvis
         title: Ny domeneblokkering
+      private_comment: Privat kommentar
+      private_comment_hint: Kommenter angående denne domenebegrensningen for internt bruk av moderatorene.
+      public_comment: Offentlig kommentar
+      public_comment_hint: Kommenter angående denne domenebegrensningen for offentligheten, hvis publisering av domenebegrensningslisten er slått på.
       reject_media: Avvis mediefiler
       reject_media_hint: Fjerner lokalt lagrede mediefiler og nekter å laste dem ned i fremtiden. Irrelevant for utvisninger
+      reject_reports: Avslå rapporter
+      reject_reports_hint: Ignorer alle rapporter som kommer fra dette domenet. Irrelevant for utvisninger
+      rejecting_media: avviser mediafiler
+      rejecting_reports: avslår rapporter
+      severity:
+        silence: stilnet
+        suspend: suspendert
       show:
         affected_accounts:
           one: En konto i databasen påvirket
@@ -175,36 +346,102 @@
         title: Angre domeneblokkering for %{domain}
         undo: Angre
       undo: Angre
+      view: Vis domeneblokkering
     email_domain_blocks:
       add_new: Lag ny
       created_msg: E-postdomenet ble lagt til i blokkeringslisten uten problemer
       delete: Fjern
       destroyed_msg: E-postdomenet har blitt fjernet fra blokkeringslisten uten problemer
       domain: Domene
+      empty: Ingen e-mail-domener er sortelistet på dette tidspunkt.
       new:
         create: Legg til domene
         title: Ny blokkeringsoppføring av e-postdomene
       title: Blokkering av e-postdomene
     instances:
+      by_domain: Domene
+      delivery_available: Levering er tilgjengelig
+      known_accounts:
+        one: "%{count} kjent konto"
+        other: "%{count} kjente kontoer"
+      moderation:
+        all: Alt
+        limited: Begrenset
+        title: Moderasjon
+      private_comment: Privat kommentar
+      public_comment: Offentlig kommentar
       title: Kjente instanser
+      total_blocked_by_us: Blokkert av oss
+      total_followed_by_them: Fulgt av dem
+      total_followed_by_us: Fulgt av oss
+      total_reported: Rapporter om dem
+      total_storage: Mediavedlegg
     invites:
+      deactivate_all: Deaktiver alle
       filter:
         all: Alle
         available: Tilgjengelig
         expired: Utløpt
+        title: Filtrer
       title: Invitasjoner
+    pending_accounts:
+      title: Avventende brukere (%{count})
+    relationships:
+      title: "%{acct} sitt forhold"
+    relays:
+      add_new: Legg til ny overgang
+      delete: Slett
+      description_html: En <strong>federert overgang</strong> er en mellomleddsserver som utveksler store mengder av offentlige tuter mellom servere som abonnerer og publiserer til den. <strong>Det kan hjelpe små og mellomstore servere til å oppdage innhold fra strømiverset</strong>, noe som ellers ville ha krevd at lokale brukere manuelt fulgte andre personer på fjerne servere.
+      disable: Skru av
+      disabled: Skrudd av
+      enable: Skru på
+      enable_hint: Når dette har blitt skrudd på, vil tjeneren din abonnere på alle offentlige tuter fra denne overgangen, og vil begynne å sende denne tjenerens offentlige tuter til den.
+      enabled: Skrudd på
+      inbox_url: Overførings-URL
+      pending: Avventer overgangens godkjenning
+      save_and_enable: Lagre og skru på
+      setup: Sett opp en overgangsforbindelse
+      signatures_not_enabled: Overganger vil ikke fungere riktig mens sikkermodus eller hvitelistingsmodus er skrudd på
+      status: Status
+      title: Overganger
+    report_notes:
+      created_msg: Rapportnotat opprettet!
+      destroyed_msg: Rapportnotat slettet!
     reports:
+      account:
+        notes:
+          one: "%{count} notis"
+          other: "%{count} notiser"
+        reports:
+          one: "%{count} rapport"
+          other: "%{count} rapporter"
       action_taken_by: Handling utført av
       are_you_sure: Er du sikker?
+      assign_to_self: Tilegn til meg
+      assigned: Tilegnet moderator
+      by_target_domain: Domenet av rapportert bruker
       comment:
         none: Ingen
+      created_at: Rapportert
       mark_as_resolved: Merk som løst
-      report: 'Rapportér #%{id}'
+      mark_as_unresolved: Merk som uoppklart
+      notes:
+        create: Legg til notat
+        create_and_resolve: Løst med notat
+        create_and_unresolve: Gjenåpne med notat
+        delete: Slett
+        placeholder: Beskriv hvilke handlinger som har blitt tatt, eller andre relaterte oppdateringer...
+      reopen: Gjenåpne rapporten
+      report: 'Rapporter #%{id}'
       reported_account: Rapportert konto
       reported_by: Rapportert av
       resolved: Løst
+      resolved_msg: Rapport løst!
+      status: Status
       title: Rapporter
+      unassign: Fjern tilegning
       unresolved: Uløst
+      updated_at: Oppdatert
     settings:
       activity_api_enabled:
         desc_html: Antall lokale statusposter, aktive brukere og nye registreringer i ukentlige oppdelinger
@@ -215,9 +452,28 @@
       contact_information:
         email: Skriv en offentlig e-postadresse
         username: Skriv brukernavn
+      custom_css:
+        desc_html: Modifiser utseendet med CSS lastet på hver side
+        title: Egendefinert CSS
+      domain_blocks:
+        all: Til alle
+        disabled: Til ingen
+        title: Vis domeneblokkeringer
+      domain_blocks_rationale:
+        title: Vis grunnlaget
+      hero:
+        desc_html: Vises på forsiden. Minst 600×100px er anbefalt. Dersom dette ikke er valgt, faller det tilbake på tjenerens miniatyrbilde
+        title: Heltebilde
+      mascot:
+        desc_html: Vist på flere sider. Minst 293×205px er anbefalt. Dersom det ikke er valgt, faller det tilbake til standardmaskoten
+        title: Maskotbilde
       peers_api_enabled:
         desc_html: Domenenavn denne instansen har truffet på i fediverset
         title: Publiser liste over oppdagede instanser
+      preview_sensitive_media:
+        desc_html: Lenkeforhåndsvisninger på andre nettsteder vil vise et miniatyrbilde selv dersom mediet er merket som sensitivt
+      profile_directory:
+        title: Skru på profilmappen
       registrations:
         closed_message:
           desc_html: Vises på forsiden når registreringer er lukket<br>Du kan bruke HTML-tagger
@@ -237,10 +493,16 @@
       site_description_extended:
         desc_html: Vises på side for utvidet informasjon.<br>Du kan bruke HTML-tagger
         title: Utvidet nettstedsinformasjon
+      site_short_description:
+        desc_html: Vist i sidelinjen og i metastempler. Beskriv hva Mastodon er og hva som gjør denne tjeneren spesiell i én enkelt paragraf.
+        title: Kort tjenerbeskrivelse
       site_terms:
         desc_html: Du kan skrive din egen personverns-strategi, bruksviklår og andre regler. Du kan bruke HTML tagger
         title: Skreddersydde bruksvilkår
       site_title: Nettstedstittel
+      spam_check_enabled:
+        desc_html: Mastodon kan auto-rapportere kontoer som sender gjentatte uforespurte meldinger. Det kan oppstå falske positive treff.
+        title: Anti-spam-automatisering
       thumbnail:
         desc_html: Brukes ved forhandsvisning via OpenGraph og API. 1200x630px anbefales
         title: Miniatyrbilde for instans
@@ -248,23 +510,62 @@
         desc_html: Vis offentlig tidslinje på landingssiden
         title: Forhandsvis tidslinjen
       title: Nettstedsinnstillinger
+      trends:
+        title: Trendende emneknagger
     statuses:
       back_to_account: Tilbake til kontosiden
       batch:
         delete: Slett
         nsfw_off: NSFW AV
         nsfw_on: NSFW PÅ
+      deleted: Slettet
       failed_to_execute: Utføring mislyktes
+      media:
+        title: Media
       no_media: Ingen media
       title: Kontostatuser
       with_media: Med media
+    tags:
+      accounts_week: Unike brukstilfeller denne uken
+      context: Sammenheng
+      directory: I mappen
+      in_directory: "%{count} i mappen"
+      last_active: Senest aktiv
+      most_popular: Mest populært
+      most_recent: Nyligst
+      name: Emneknagg
+      review: Gjennomgangsstatus
+      reviewed: Gjennomgått
+      title: Emneknagger
+      trending_right_now: Trender akkurat nå
+      unique_uses_today: "%{count} legger ut om det i dag"
+      unreviewed: Ikke gjennomgått
     title: Administrasjon
+    warning_presets:
+      add_new: Legg til ny
+      delete: Slett
+      edit: Rediger
   admin_mailer:
     new_report:
       body: "%{reporter} har rapportert %{target}"
       subject: Ny rapport for %{instance} (#%{id})
+    new_trending_tag:
+      body: 'Emneknaggen #%{name} trender i dag, men den har ikke blitt gjennomgått tidligere. Den vil ikke bli vist offentlig med mindre du tillater at den blir det, eller du kan bare lagre skjemaet slik det er for å aldri høre om det igjen.'
+  aliases:
+    add_new: Lag et alias
+    hint_html: Dersom du vil flytte fra en annen konto til den, kan du lage et alias her, som er påkrevd før du kan gå videre med å flytte følgere fra den gamle kontoen til den nye. Handlingen i seg selv er <strong>harmløs og reversibel</strong>. <strong>Kontoflyttingen har blitt satt i gang fra den gamle kontoen</strong>.
+    remove: Fjern aliaslenking
+  appearance:
+    advanced_web_interface: Avansert nettgrensesnitt
+    advanced_web_interface_hint: 'Hvis du ønsker å bruke hele skjermbredden din, lar det avanserte nettgrensesnittet deg sette opp mange forskjellige kolonner for å se så mye informasjon på én gang som du vil: Hjem, varslinger, fellestidslinjen, og ethvert antall lister og emneknagger.'
+    animations_and_accessibility: Animasjoner og tilgjengelighet
+    confirmation_dialogs: Bekreftelsesdialoger
+    discovery: Oppdagelse
+    sensitive_content: Sensitivt innhold
+    toot_layout: Tut-utseende
   application_mailer:
-    notification_preferences: Endre e-post innstillingene
+    notification_preferences: Endre E-postinnstillingene
+    salutation: "%{name},"
     settings: 'Endre foretrukne e-postinnstillinger: %{link}'
     view: 'Se:'
     view_profile: Vis Profil
@@ -278,20 +579,40 @@
     warning: Vær veldig forsiktig med denne data. Aldri del den med noen!
     your_token: Din tilgangsnøkkel
   auth:
+    apply_for_account: Be om en invitasjon
+    change_password: Passord
+    checkbox_agreement_html: Jeg godtar <a href="%{rules_path}" target="_blank">tjenerens regler</a> og <a href="%{terms_path}" target="_blank">bruksvilkår</a>
+    checkbox_agreement_without_rules_html: Jeg godtar <a href="%{terms_path}" target="_blank">bruksvilkårene</a>
     delete_account: Slett konto
-    delete_account_html: Hvis du ønsker å slette din konto kan du <a href="%{path}">fortsette her</a>. Du vil bli spurt om bekreftelse.
+    delete_account_html: Hvis du ønsker å slette kontoen din, kan du <a href="%{path}">gå hit</a>. Du vil bli spurt om bekreftelse.
+    description:
+      prefix_sign_up: Meld deg opp på Mastodon i dag!
+      suffix: Med en konto, vil kunne følge folk, legge ut oppdateringer, og utveksle meldinger med brukere fra enhver Mastodon-tjener, og mer til!
     didnt_get_confirmation: Mottok du ikke instruksjoner om bekreftelse?
     forgot_password: Har du glemt passordet ditt?
     invalid_reset_password_token: Tilbakestillingsnøkkelen for passord er ugyldig eller utløpt. Vennligst be om en ny.
-    login: Innlogging
+    login: Logg på
     logout: Logg ut
     migrate_account: Flytt til en annen konto
     migrate_account_html: Hvis du ønsker å henvise denne kontoen til en annen, kan du <a href="%{path}">konfigurere det her</a>.
+    or_log_in_with: Eller logg på med
+    providers:
+      cas: CAS
+      saml: SAML
     register: Bli med
     resend_confirmation: Send bekreftelsesinstruksjoner på nytt
     reset_password: Nullstill passord
     security: Sikkerhet
     set_new_password: Sett nytt passord
+    setup:
+      email_below_hint_html: Dersom E-postadressen nedenfor er feil, kan du endre det her og motta en ny bekreftelses-E-post.
+      email_settings_hint_html: Bekreftelses-E-posten ble sendt til %{email}. Dersom den E-postadressen ikke var riktig, kan du endre den i kontoinnstillingene.
+      title: Innstillinger
+    status:
+      account_status: Kontostatus
+      functional: Kontoen din er fullt operativt.
+      pending: Søknaden din avventer gjennomgang av styret vårt. Dette kan ta litt tid. Du vil motta en E-post dersom søknaden din blir godkjent.
+    trouble_logging_in: Har du problemer med å logge på?
   authorize_follow:
     error: Uheldigvis skjedde det en feil da vi prøvde å få tak i en bruker fra en annen instans
     follow: Følg
@@ -302,6 +623,10 @@
       return: Gå tilbake til brukerens profil
       web: Gå til nettsiden
     title: Følg %{acct}
+  challenge:
+    confirm: Fortsett
+    invalid_password: Ugyldig passord
+    prompt: Bekreft passordet for å fortsette
   datetime:
     distance_in_words:
       about_x_hours: "%{count} timer"
@@ -318,8 +643,26 @@
       x_seconds: "%{count} sek"
   deletes:
     confirm_password: Skriv inn ditt passord for å verifisere din identitet
+    confirm_username: Skriv inn brukernavnet ditt for å bekrefte prosedyren
     proceed: Slett konto
     success_msg: Din konto ble slettet
+    warning:
+      before: 'Før du fortsetter, vennligst les disse notisene nøye:'
+      caches: Innhold som har blitt mellomlagret av andre tjenere kan kanskje fortsette å eksistere
+      data_removal: Dine innlegg og andre data vil bli permanent fjernet
+      email_change_html: Du kan <a href="%{path}">endre E-postadressen din</a> uten å måtte slette kontoen din
+      email_contact_html: Dersom det fortsatt ikke kommer, kan du sende en E-post til <a href="mailto:%{email}">%{email}</a> og be om hjelp
+      email_reconfirmation_html: Dersom du ikke mottar bekreftelses-E-posten, kan du <a href="%{path}">be om den igjen</a>
+      irreversible: Du vil ikke kunne gjenopprette eller reaktivere kontoen din
+      more_details_html: For mere detaljer, se <a href="%{terms_path}">privatlivsretningslinjene</a>.
+      username_available: Brukernavnet ditt vil bli gjort tilgjengelig igjen
+      username_unavailable: Brukernavnet ditt vil forbli utilgjengelig
+  directories:
+    directory: Profilmappe
+    explanation: Oppdag brukere basert på deres interesser
+    explore_mastodon: Utforsk %{title}
+  domain_validator:
+    invalid_domain: er ikke et gyldig domenenavn
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': Du har ikke tillatelse til å vise denne siden.
@@ -335,22 +678,75 @@
       title: Denne siden er ikke korrekt
     '503': The page could not be served due to a temporary server failure.
     noscript_html: For å bruke Mastodon webapplikasjon må du aktivere JavaScript. Alternativt kan du forsøke en av de mange <a href="%{apps_path}">integrerte appene</a> for Mastodon til din plattform.
+  existing_username_validator:
+    not_found_multiple: klarte ikke å finne %{usernames}
   exports:
+    archive_takeout:
+      date: Dato
+      download: Last ned arkivet ditt
+      hint_html: Du kan be om et arkiv med dine <strong>tuter og opplastede media</strong>. Den eksporterte dataen vil være i ActivityPub-formatet, som kan leses av programmer som støtter det. Du kan be om et arkiv opptil hver 7. dag.
+      request: Be om ditt arkiv
+      size: Størrelse
     blocks: Du blokkerer
-    follows: Du følger
+    csv: CSV
+    domain_blocks: Domeneblokkeringer
+    lists: Lister
     mutes: Du demper
     storage: Medialagring
+  featured_tags:
+    add_new: Legg til ny
+    hint_html: "<strong>Hva er utvalgte emneknagger?</strong> De vises frem tydelig på din offentlige profil, og lar folk bla i dine offentlige innlegg som spesifikt har de emneknaggene. De er et bra verktøy for å holde styr på kreative verk eller langtidsprosjekter."
+  filters:
+    contexts:
+      home: Hjemmetidslinje
+      notifications: Varslinger
+      public: Offentlige tidslinjer
+      thread: Samtaler
+    edit:
+      title: Rediger filter
+    index:
+      delete: Slett
+      title: Filtre
+    new:
+      title: Legg til nytt filter
+  footer:
+    developers: Utviklere
+    more: Mer…
+    resources: Ressurser
+    trending_now: Trender nå
   generic:
+    all: Alle
     changes_saved_msg: Vellykket lagring av endringer!
+    copy: Kopier
+    order_by: Sorter etter
     save_changes: Lagre endringer
     validation_errors:
       one: Noe er ikke helt riktig ennå. Vennligst se etter en gang til
       other: Noe er ikke helt riktig ennå. Det er ennå %{count} feil å rette på
+  identity_proofs:
+    active: Aktive
+    authorize: Ja, autoriser
+    errors:
+      keybase:
+        verification_failed: Keybase kjenner ikke igjen denne sjetongen som en signatur for Keybase-brukeren %{kb_username}. Vennligst prøv igjen gjennom Keybase.
+      wrong_user: Kan ikke lage et bevis for %{proving} mens du er logget på som %{current}. Logg på som %{proving} og prøv igjen.
+    explanation_html: Her kan du kryptografisk koble til dine andre enheter, f.eks. en Keybase-profil. Dette lar andre folk sende deg krypterte meldinger og stole på innhold som du sender dem.
+    i_am_html: Jeg er %{username} på %{service}.
+    identity: Identitet
+    inactive: Inaktive
+    publicize_checkbox: 'Og tut ut dette:'
+    publicize_toot: 'Det er bevist! Jeg er %{username} på %{service}: %{url}'
+    status: Verifiseringsstatus
+    view_proof: Se bevis
   imports:
+    modes:
+      merge: Slå sammen
+      overwrite: Overskriv
     preface: Du kan importere data om brukere du følger eller blokkerer til kontoen din på denne instansen med eksportfiler fra andre instanser.
     success: Dine data ble mottatt og vil bli behandlet så fort som mulig
     types:
       blocking: Blokkeringsliste
+      domain_blocking: Domeneblokkeringsliste
       following: Følgeliste
       muting: Dempeliste
     upload: Opplastning
@@ -363,12 +759,13 @@
       '21600': 6 timer
       '3600': 1 time
       '43200': 12 timer
-      '604800': 1 week
+      '604800': 1 uke
       '86400': 1 dag
     expires_in_prompt: Aldri
     generate: Generer
+    invited_by: 'Du ble invitert av:'
     max_uses:
-      one: 1 uke
+      one: 1 bruk
       other: "%{count} bruk"
     max_uses_prompt: Ubegrenset
     prompt: Generer og del lenker med andre for å gi tilgang til denne instansen
@@ -385,6 +782,19 @@
       too_many: Kan ikke legge ved mer enn 4 filer
   migrations:
     acct: brukernavn@domene til den nye kontoen
+    cancel: Avbryt omdirigeringen
+    cancel_explanation: Å avbryte omdirigeringen vil reaktivere din nåværende konto, men vil ikke bringe tilbake følgere som har blitt flyttet til den kontoen.
+    errors:
+      move_to_self: kan ikke være den nåværende kontoen
+      not_found: ble ikke funnet
+    incoming_migrations: Flytte fra en annen konto
+    incoming_migrations_html: For å flytte fra en annen konto til denne, må du først <a href="%{path}">sette opp et kontoalias</a>.
+    past_migrations: Tidligere migreringer
+    proceed_with_move: Flytt følgere
+    set_redirect: Bestem omdirigering
+    warning:
+      before: 'Før du fortsetter, vennligst les disse notisene nøye:'
+      disabled_account: Din nåværende konto vil ikke være fullt brukbar etterpå. Men du vil ha tilgang til dataeksportering såvel som reaktivering.
   moderation:
     title: Moderasjon
   notification_mailer:
@@ -421,43 +831,143 @@
       body: 'Din status ble fremhevd av %{name}:'
       subject: "%{name} fremhevde din status"
       title: Ny fremheving
+  notifications:
+    email_events: E-postvarslinger for hendelser
+    email_events_hint: 'Velg hendelser som du vil motta varslinger for:'
+    other_settings: Andre varslingsinnstillinger
+  number:
+    human:
+      decimal_units:
+        format: "%n %u"
+        units:
+          billion: Mrd
+          million: Mln
+          quadrillion: Kvd
+          thousand: T
+          trillion: Trl
   pagination:
+    newer: Nyere
     next: Neste
+    older: Eldre
     prev: Forrige
+    truncate: "&hellip;"
+  polls:
+    errors:
+      already_voted: Du har allerede stemt i denne avstemningen
+      duration_too_long: er for langt frem i tid
+      duration_too_short: er for snart
+      expired: Denne avstemningen er allerede ferdig
+      too_few_options: må ha mer enn én gjenstand
+      too_many_options: kan ikke ha mer enn %{max} gjenstander
   preferences:
     other: Annet
+    posting_defaults: Innleggsstandarder
+    public_timelines: Offentlige tidslinjer
+  relationships:
+    activity: Kontoaktivitet
+    dormant: Dormende
+    followers: Følgere
+    following: Følginger
+    last_active: Senest aktiv
+    most_recent: Nyligst
+    moved: Flyttet
+    mutual: Gjensidig
+    primary: Primær
+    relationship: Forhold
+    remove_selected_domains: Fjern alle følgere fra de valgte domenene
+    remove_selected_followers: Fjern de valgte følgerne
+    remove_selected_follows: Avfølg de valgte brukerne
+    status: Kontostatus
   remote_follow:
     acct: Tast inn brukernavn@domene som du vil følge fra
     missing_resource: Kunne ikke finne URLen for din konto
+    no_account_html: Har du ikke en konto? Da kan du <a href='%{sign_up_path}' target='_blank'>lage en konto her</a>
     proceed: Fortsett med følging
     prompt: 'Du vil følge:'
+    reason_html: "<strong>Hvorfor dette trinnet er nødvendig?</strong><code>%{instance}</code> er kanskje ikke tjeneren som du er registrert på, så vi må omdirigere deg til hjemmetjeneren din først."
+  remote_interaction:
+    favourite:
+      proceed: Fortsett til likingen
+      prompt: 'Du ønsker å like denne tuten:'
+    reblog:
+      proceed: Fortsett til fremhevingen
+      prompt: 'Du ønsker å fremheve denne tuten:'
+    reply:
+      proceed: Fortsett til svaret
+      prompt: 'Du ønsker å svare på denne tuten:'
   sessions:
     activity: Siste aktivitet
     browser: Nettleser
     browsers:
+      alipay: AliPay
+      blackberry: BlackBerry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Electron
+      firefox: Firefox
       generic: Ukjent nettleser
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Nokia S40 Ovi-nettleser
+      opera: Opera
+      otter: Otter
+      phantom_js: PhantomJS
+      qq: QQ Browser
+      safari: Safari
+      uc_browser: UC Browser
+      weibo: Weibo
     current_session: Nåværende økt
     description: "%{browser} på %{platform}"
-    explanation: Dette er nettlesere innlogget på din Mastodon-konto akkurat nå.
+    explanation: Dette er nettlesere som er pålogget på din Mastodon-konto akkurat nå.
     ip: IP-adresse
     platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: BlackBerry
+      chrome_os: Chrome OS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
+      mac: macOS
       other: ukjent plattform
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
     revoke: Tilbakekall
     revoke_success: Økt tilbakekalt
     title: Økter
   settings:
+    account: Konto
+    account_settings: Kontoinnstillinger
+    aliases: Kontoaliaser
+    appearance: Utseende
     authorized_apps: Autoriserte applikasjoner
     back: Tilbake til Mastodon
     delete: Kontosletting
     development: Utvikling
     edit_profile: Endre profil
     export: Dataeksport
+    featured_tags: Utvalgte emneknagger
+    identity_proofs: Identitetsbevis
     import: Importér
+    import_and_export: Importer og eksporter
     migrate: Kontomigrering
     notifications: Varslinger
     preferences: Preferanser
+    profile: Profil
+    relationships: Følginger og følgere
     two_factor_authentication: Tofaktorautentisering
   statuses:
+    attached:
+      description: 'Vedlagt: %{attached}'
+      image:
+        one: "%{count} bilde"
+        other: "%{count} bilder"
+      video:
+        one: "%{count} video"
+        other: "%{count} videoer"
+    content_warning: 'Innholdsadvarsel: %{warning}'
+    language_detection: Oppdag språk automatisk
     open_in_web: Åpne i nettleser
     over_character_limit: grense på %{max} tegn overskredet
     pin_errors:
@@ -465,7 +975,16 @@
       ownership: Kun egne tuter kan festes
       private: Kun offentlige tuter kan festes
       reblog: En fremheving kan ikke festes
+    poll:
+      total_people:
+        one: "%{count} person"
+        other: "%{count} personer"
+      total_votes:
+        one: "%{count} stemme"
+        other: "%{count} stemmer"
+      vote: Stem
     show_more: Vis mer
+    title: "%{name}: «%{quote}»"
     visibilities:
       private: Privat
       private_long: Synlig kun for følgere
@@ -477,13 +996,99 @@
     pinned: Festet tut
     reblogged: fremhevde
     sensitive_content: Følsomt innhold
+  tags:
+    does_not_match_previous_name: samsvarer ikke med det forrige navnet
   terms:
+    body_html: |
+      <h2>Privatlivsretningslinjer</h2>
+      <h3 id="collect">Hva slags informasjon samler vi inn?</h3>
+
+      <ul>
+      <li><em>Grunnleggende kontoinformasjon</em>: Dersom du registrerer deg på denne tjeneren, vil du kanskje bli spurt om å skrive inn et brukernavn, en E-postadresse, og et passord. Du kan også skrive inn ytterligere profilinformasjon som f.eks. et visningsnavn og selvbiografi, og laste opp et profilbilde og toppfeltbilde. Brukernavnet, visningsnavnet, selvbiografien, profilbildet, og toppfeltbildet blir alltid vist offentlig.</li>
+      <li><em>Innlegg, følging, og annen offentlig informasjon</em>: Listen over folk du følger blir vist offentlig, det samme gjelder for følgerne dine. Når du sender inn en melding, blir datoen og tidspunktet lagret såvel som programmet du sendte inn meldingen ifra. Meldinger kan inneholde mediavedlegg, som f.eks. bilder og videoer. Offentlige og uoppførte innlegg er offentlig tilgjengelige. Når du viser frem et innlegg på profilen din, er det også offentlig tilgjengelig informasjon. Dinne innlegg blir levert til dine følgere, og i noen tilfeller betyr det at blir levert til forskjellige tjenere og at kopier blir lagret der. Når du sletter innlegg, blir også det levert til dine følgere. Det å fremheve eller like et annet innlegg er alltid offentlig.</li>
+      <li><em>Direkteinnlegg og innlegg som kun er for følgere</em>: Alle innlegg er lagret og behandlet på tjeneren. Innlegg som kun er for følgere, blir levert til dine følgere, og direkteinnlegg leveres kun til brukere som er nevnt i dem. I noen tilfeller betyr det at de blir levert til forskjellige tjenere og at kopier blir lagret der. Vi gjør et forsøk i god sportsånd for å begrense tilgangen til disse innleggene til kun autoriserte personer, men andre tjenere kan mislykkes med sådan. Derfor er det viktig å gå i gjennom tjenerne som følgerne dine hører til i. I innstillingene kan du veksle på en innstilling for å godkjenne og avslå nye følgere manuelt. <em>Vennligst ha i tankene at operatørene til tjeneren og enhver mottakende tjener kan se slike meldinger</em>, og at mottakere kan ta skjermklipp av, kopiere, eller på annet vis dele dem videre. <em>Ikke del noe farlig informasjon over Mastodon.</em></li>
+      <li><em>IP-er og andre metadata</em>: Når du logger på, lagrer vi IP-adressen som du logget deg på fra, såvel som navnet til nettleserprogrammet ditt. Du kan gå gjennom og tilbakekalle alle påloggede økter i innstillingene. Den seneste IP-adressen du brukte, blir lagret i opptil 12 måneder. Vi vil kanskje også holde på tjenerloggføringer som inkluderer IP-adressen til alle forespørsler til tjeneren vår.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">Hva bruker vi informasjonen din til?</h3>
+
+      <p>Hva som helst av informasjonen som vi samler inn fra deg, kan bli brukt på de følgende måtene:</p>
+
+      <ul>
+      <li>Til å levere grunnfunksjonaliteten til Mastodon. Du kan bare samhandle med andre folks innhold og legge ut ditt eget innhold når du er logget på. For eksempel kan du følge andre folk for å se deres kombinerte innlegg i din egen personliggjorte hjemmetidslinje.</li>
+      <li>Til å bistå i moderasjonen av samfunnet, for eksempel å sammenligne IP-adressen din med andre andre kjente adresser for å avgjøre saker om bannlysningsunngåelse eller andre regelbrudd.</li>
+      <li>E-postadressen du oppgir kan bli brukt til å sende deg informasjon, varsler om at andre folk samhandler med innholdet ditt eller sender deg meldinger, og å svare på brukerstøttespørsmål, og/eller andre forespørsler eller spørsmål.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="protect">Hvordan beskytter vi informasjonen din?</h3>
+
+      <p>Vi implementer en rekke sikkerhetstiltak for å holde på sikkerheten til din personlige informasjon når du skriver inn, sender inn, eller besøker din personlige informasjon. Blant annet er din nettleserøkt, såvel som trafikken mellom dine apper og API-er, sikret med SSL, og passordet ditt er saltet med en kraftig énveisalgoritme. Du kan skru på 2-trinnsinnlogging for å sikre tilgangen til kontoen din ytterligere.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="data-retention">Hva er våre databeholdingsretningslinjer?</h3>
+
+      <p>Vi vil gjøre en innsats i god sportsånd for å</p>
+
+      <ul>
+      <li>Beholde tjenerloggføringer som inneholder IP-adressen til alle forespørsler til denne tjeneren, dersom det blir loggført i det hele tatt, i ikke mer enn 90 dager.</li>
+      <li>Beholde IP-adressene som er forbundet med registrerte brukere i ikke mer enn 12 måneder.</li>
+      </ul>
+
+      <p>Du kan be om og laste ned et arkiv av innholdet ditt, inkludert dine innlegg, media, mediavedlegg, profilbilde, og toppfeltbilde.</p>
+
+      <p>Du kan ugjenkallelig slette kontoen til enhver tid.</p>
+
+      <hr class="spacer"/>
+
+      <h3 id="cookies">Bruker vi infokapsler?</h3>
+
+      <p>Ja. Infokapsler er små filer som et nettsted eller dens tjenesteleverandør overfører til harddisken på datamaskinen din gjennom nettleseren din (dersom du tillater dette). Disse infokapslene lar nettstedet kjenne igjen nettleseren din og, dersom du har en registrert konto, assosiere den med din registrerte konto.</p>
+
+      <p>Vi benytter infokapsler for å forstå og lagre dinne innstillinger til fremtidige besøk.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="disclose">Forteller vi om noe informasjon til utenforstående parter?</h3>
+
+      <p>Vi hverken selger, bytter, eller på andre måter overfører din personlig identifiserbare informasjon til utenforstående parter. Dette inkluderer ikke tredjeparter som vi stoler på og som hjelper oss med å drifte nettstedet vårt, drifte våre forretninger, eller å yte tjenester til deg, så lenge disse partene sier seg enige i å holde denne informasjonen hemmelig. Vi kan også frigi informasjonen vår dersom vi mener et frigiving er passende for å møte loven, handle i tråd med vår nettstedsretningslinjer, eller å beskytte vår eller andres rettigheter, eiendom, eller trygghet.</p>
+
+      <p>Ditt offentlige innhold kan bli lastet ned av andre tjenere i nettverket. Dine offentlige innlegg og innlegg som kun er for følgere blir levert til tjenerne der følgerne dine holder til, og direktemeldinger blir levert il mottakernes tjenere, i den grad de følgerne eller mottakerne holder på en annen tjener enn denne.</p>
+
+      <p>Når du gir et program autorisasjon til å bruke kontoen din, avhengig av omfanget av tillatelser som du tillater, kan den få tilgang til din offentlige profilinformasjon, din følgingsliste, dine følgere, dine lister, alle dine innlegg, og dine likinger. Programmer kan aldri få tilgang til E-postadressen eller passordet ditt.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="children">Nettstedsbruk av barn</h3>
+
+      <p>Dersom denne tjeneren er i EU eller EØS: Vårt nettsted, produkter og tjenester er alle siktet inn mot folk som er minst 16 år gamle. Dersom du er under 16, sier GDPR (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>) at du ikke kan bruke dette nettstedet.</p>
+
+      <p>Dersom denne tjeneren er i USA: Vårt nettsted, produkter og tjenester er alle siktet inn mot folk som er minst 16 år gamle. Dersom du er under 16, sier COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) at du ikke kan bruke dette nettstedet.</p>
+
+      <p>Lovmessige krav kan være forskjellige dersom denne tjeneren befinner seg i en annen jurisdiksjon.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="changes">Endringer i våre privatlivsretningslinjer</h3>
+
+      <p>Dersom vi bestemmer oss for å endre våre privatlivsretningslinjer, vil vi legge ut endringene på denne siden.</p>
+
+      <p>Dette dokumentet er lisensiert under CC BY-SA. Den engelske originalversjonen ble sist oppdatert den 7. mars 2018. Den norske oversettelsen ble sist oppdatert den 13. desember 2019.</p>
+
+      <p>Opprinnelig modifisert utifra <a href="https://github.com/discourse/discourse">Discourse sine privatlivsretningslinjer</a>.</p>
     title: "%{instance} Personvern og villkår for bruk av nettstedet"
   themes:
+    contrast: Mastodon (Høykontrast)
     default: Mastodon
+    mastodon-light: Mastodon (Lyst)
   time:
     formats:
       default: "%-d. %b %Y, %H:%M"
+      month: "%b %Y"
   two_factor_authentication:
     code_hint: Tast koden som ble generert av din autentiseringsapp for å bekrefte
     description_html: Hvis du skrur på <strong>tofaktorautentisering</strong> må du ha din telefon for å logge inn. Denne vil generere koder som du må taste inn.
@@ -501,6 +1106,25 @@
     setup: Sett opp
     wrong_code: Den angitte koden var ugyldig! Stemmer instansens tid overalt med enhetens tid?
   user_mailer:
+    backup_ready:
+      subject: Arkivet ditt er klart til å lastes ned
+    warning:
+      explanation:
+        disable: Mens kontoen din er fryst, forblir dine kontodata intakt, men du kan ikke utføre noen handlinger før den har blitt tint opp.
+        silence: Mens kontoen din er begrenset, vil bare folk som allerede følger deg se dine tuter på denne tjeneren, og du kan bli ekskludert fra diverse offentlige oppføringer. Men andre kan fortsatt følge deg manuelt.
+        suspend: Kontoen din har blitt suspendert, og alle dine tuter og opplastede media har blitt ugjenkallelig fjernet fra denne tjeneren, og fra tjenere der du hadde følgere.
+      get_in_touch: Du kan svare på denne E-posten for å komme i kontakt med styret i %{instance}.
+      statuses: 'Spesifikt for å:'
+      subject:
+        disable: Kontoen din, %{acct}, har blitt fryst
+        none: Advarsel for %{acct}
+        silence: Kontoen din, %{acct}, har blitt begrenset
+        suspend: Kontoen din, %{acct}, har blitt suspendert
+      title:
+        disable: Kontoen er fryst
+        none: Advarsel
+        silence: Kontoen er begrenset
+        suspend: Kontoen er suspendert
     welcome:
       edit_profile_action: Sett opp profil
       edit_profile_step: Du kan tilpasse din profil ved å laste opp en avatar, overskrift, endre ditt visningsnavn med mer. Hvis du vil godkjenne hvilke personer som får lov til å følge deg kan du låse kontoen.
@@ -516,8 +1140,12 @@
       tip_following: Du følger din tjeners administrator(er) som standard. For å finne mer interessante personer, sjekk den lokale og forente tidslinjen.
       tip_local_timeline: Den lokale tidslinjen blir kontant matet med meldinger fra personer på %{instance}. Dette er dine nærmeste naboer!
       tip_mobile_webapp: Hvis din mobile nettleser tilbyr deg å legge Mastadon til din hjemmeskjerm kan du motta push-varslinger. Det er nesten som en integrert app på mange måter!
+      tips: Tips
       title: Velkommen ombord, %{name}!
   users:
     invalid_email: E-postaddressen er ugyldig
     invalid_otp_token: Ugyldig to-faktorkode
     signed_in_as: 'Innlogget som:'
+  verification:
+    explanation_html: 'Du kan <strong>bekrefte at du selv er eieren av lenkene i din profilmetadata</strong>. For å gjøre det, må det tillenkede nettstedet inneholde en lenke som fører tilbake til Mastodon-profilen din. Lenken tilbake <strong>må</strong> ha en <code>rel="me"</code>-attributt. Tekstinnholdet til lenken er irrelevant. Her er et eksempel:'
+    verification: Bekreftelse
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index f84fe882a..ea0729f74 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -11,6 +11,7 @@ oc:
     apps: Aplicacions per mobil
     apps_platforms: Utilizatz Mastodon d‘iOS, Android o d’autras plataforma estant
     browse_directory: Navigatz per l’annuari de perfil e filtratz segon çò qu’aimatz
+    browse_local_posts: Percórrer un flux en dirècte de las publicacions publicas d’aqueste servidor
     browse_public_posts: Navigatz pel flux public a Mastodon
     contact: Contacte
     contact_missing: Pas parametrat
@@ -161,6 +162,7 @@ oc:
         staff: Personnal
         user: Uitlizaire
       search: Cercar
+      search_same_ip: Autres utilizaires amb la meteissa IP
       shared_inbox_url: URL de recepcion partejada
       show:
         created_reports: Senhalaments creats
@@ -187,10 +189,12 @@ oc:
         confirm_user: "%{name} confirmèt l’adreça a %{target}"
         create_account_warning: "%{name} mandèt un avertiment a %{target}"
         create_custom_emoji: "%{name} mandèt un nòu emoji %{target}"
+        create_domain_allow: "%{name} botèt a la lista blanca lo domeni %{target}"
         create_domain_block: "%{name} bloquèt lo domeni %{target}"
         create_email_domain_block: "%{name} botèt a la lista nègra lo domeni de corrièl %{target}"
         demote_user: "%{name} retragradèt l‘utilizaire %{target}"
         destroy_custom_emoji: "%{name} destruguèt l’emoji %{target}"
+        destroy_domain_allow: "%{name} levèt lo domeni %{target} de la lista blanca"
         destroy_domain_block: "%{name} desbloquèt lo domeni %{target}"
         destroy_email_domain_block: "%{name} botèt a la lista blanca lo domeni de corrièl %{target}"
         destroy_status: "%{name} levèt l‘estatut a %{target}"
@@ -327,9 +331,6 @@ oc:
         create: Crear un blocatge
         title: Nòu blocatge de domeni de corrièl
       title: Blocatge de domeni de corrièl
-    followers:
-      back_to_account: Tornar al compte
-      title: Seguidors de %{acct}
     instances:
       by_domain: Domeni
       delivery_available: Liurason disponibla
@@ -378,6 +379,10 @@ oc:
       created_msg: Nòta de moderacion corrèctament creada !
       destroyed_msg: Nòta de moderacion corrèctament suprimida !
     reports:
+      account:
+        notes:
+          one: "%{count} nòta"
+          other: "%{count} nòtas"
       action_taken_by: Mesura menada per
       are_you_sure: Es segur ?
       assign_to_self: Me l’assignar
@@ -666,7 +671,6 @@ oc:
     blocks: Personas que blocatz
     csv: CSV
     domain_blocks: Blocatge de domenis
-    follows: Personas que seguètz
     lists: Listas
     mutes: Personas rescondudas
     storage: Mèdias gardats
@@ -782,6 +786,7 @@ oc:
     past_migrations: Migracions passadas
     proceed_with_move: Desplaçar los seguidors
     redirecting_to: Vòstre compte manda a %{acct}.
+    set_redirect: Definir redireccion
     warning:
       before: 'Abans de contunhar, volgatz legir aquestas nòtas amb atencion :'
       other_data: Cap d’autra donada serà desplaçada automaticament
@@ -821,6 +826,10 @@ oc:
       body: "%{name} a tornat partejar vòstre estatut :"
       subject: "%{name} a tornat partejar vòstre estatut"
       title: Novèl partatge
+  notifications:
+    email_events: Eveniments per las notificacions per corrièl
+    email_events_hint: 'Seleccionatz los eveniments que volètz recebre :'
+    other_settings: Autres paramètres de notificacion
   number:
     human:
       decimal_units:
@@ -947,6 +956,8 @@ oc:
     profile: Perfil
     relationships: Abonaments e seguidors
     two_factor_authentication: Autentificacion en dos temps
+  spam_check:
+    spam_detected: Aquò es un senhalament automatic. D’spam es estat detectat.
   statuses:
     attached:
       description: 'Ajustat : %{attached}'
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index c57d168bf..774319a5a 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -178,6 +178,7 @@ pl:
         staff: Ekipa
         user: Użytkownik
       search: Szukaj
+      search_same_ip: Inni użytkownicy z tym samym IP
       shared_inbox_url: Adres udostępnianej skrzynki
       show:
         created_reports: Zgłoszenia tego użytkownika
@@ -345,9 +346,6 @@ pl:
         create: Utwórz blokadę
         title: Nowa blokada domeny e-mail
       title: Blokowanie domen e-mail
-    followers:
-      back_to_account: Wróć do konta
-      title: Śledzący %{acct}
     instances:
       by_domain: Domena
       delivery_available: Doręczanie jest dostępne
@@ -508,6 +506,7 @@ pl:
       title: Wpisy konta
       with_media: Z zawartością multimedialną
     tags:
+      name: Hasztag
       title: Hashtagi
     title: Administracja
     warning_presets:
@@ -524,6 +523,8 @@ pl:
       body: Użytkownik %{reporter} zgłosił(a) %{target}
       body_remote: Użytkownik instancji %{domain} zgłosił(a) %{target}
       subject: Nowe zgłoszenie na %{instance} (#%{id})
+  aliases:
+    add_new: Utwórz alias
   appearance:
     advanced_web_interface: Zaawansowany interfejs użytkownika
     advanced_web_interface_hint: Jeśli chcesz użyć pełną szerokość swojego ekranu, zaawansowany interfejs użytkownika pozwala Ci skonfigurować wiele różnych kolumn, by zobaczyć jak najwięcej informacji kiedy tylko chcesz. Strona główna, Powiadomienia, Globalna oś czasu, dowolna ilość list i hasztagów.
@@ -580,6 +581,8 @@ pl:
       return: Pokaż stronę użytkownika
       web: Przejdź do sieci
     title: Śledź %{acct}
+  challenge:
+    confirm: Kontynuuj
   datetime:
     distance_in_words:
       about_x_hours: "%{count}g"
@@ -631,7 +634,6 @@ pl:
     blocks: Zablokowani
     csv: CSV
     domain_blocks: Blokady domen
-    follows: Śledzeni
     lists: Listy
     mutes: Wyciszeni
     storage: Urządzenie przechowujące dane
@@ -1084,7 +1086,7 @@ pl:
         suspend: Konto zawieszone
     welcome:
       edit_profile_action: Skonfiguruj profil
-      edit_profile_step: Możesz dostować profil wysyłając awatar, obraz nagłówka, zmieniając wyświetlaną nazwę i wiele więcej. Jeżeli chcesz, możesz zablokować konto, aby kontrolować, kto może Cię śledzić.
+      edit_profile_step: Możesz dostosować profil wysyłając awatar, obraz nagłówka, zmieniając wyświetlaną nazwę i wiele więcej. Jeżeli chcesz, możesz zablokować konto, aby kontrolować, kto może Cię śledzić.
       explanation: Kilka wskazówek, które pomogą Ci rozpocząć
       final_action: Zacznij pisać
       final_step: 'Zacznij tworzyć! Nawet jeżeli nikt Cię nie śledzi, Twoje publiczne wiadomości będą widziane przez innych, na przykład na lokalnej osi czasu i w hashtagach. Możesz też utworzyć wpis wprowadzający używając hashtagu #introductions.'
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 84eff7991..fb741b0d0 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -2,80 +2,92 @@
 pt-BR:
   about:
     about_hashtag_html: Estes são toots públicos com a hashtag <strong>#%{hashtag}</strong>. Você pode interagir com eles se tiver uma conta em qualquer lugar no fediverso.
-    about_mastodon_html: Mastodon é uma rede social baseada em protocolos abertos e software gratuito e de código aberto. É descentralizada como e-mail.
+    about_mastodon_html: 'A rede social do futuro: Sem anúncios, sem vigilância corporativa, com design ético e muita descentralização! Possua seus próprios dados com o Mastodon!'
     about_this: Sobre
-    active_count_after: Ativo
-    active_footnote: Usuários ativos mensais (UAM)
+    active_count_after: ativo
+    active_footnote: Usuários Ativos Mensalmente (UAM)
     administered_by: 'Administrado por:'
     api: API
-    apps: Apps
-    apps_platforms: Use o Mastodon a partir de iOS, Android e outras plataformas
+    apps: Aplicativos
+    apps_platforms: Use o Mastodon a partir do iOS, Android e outras plataformas
     browse_directory: Navegue pelo diretório de perfis e filtre por interesses
-    browse_public_posts: Navegue pelos posts públicos sendo postados ao vivo no Mastodon
+    browse_local_posts: Navegue pelos toots públicos locais em tempo real
+    browse_public_posts: Navegue pelos toots públicos globais em tempo real
     contact: Contato
     contact_missing: Não definido
     contact_unavailable: Não disponível
     discover_users: Descubra usuários
     documentation: Documentação
-    federation_hint_html: Com uma conta em %{instance} você vai poder seguir pessoas em qualquer servidor Mastodon ou outros do fediverso.
+    federation_hint_html: Com uma conta em %{instance} você vai poder seguir e interagir com pessoas de qualquer canto do fediverso.
     get_apps: Experimente um aplicativo
-    hosted_on: Mastodon hospedado em %{domain}
+    hosted_on: Instância Mastodon em %{domain}
+    instance_actor_flash: |
+      Esta conta é um ator virtual usado para representar a própria instância.
+      É usado para fins de federação e não deve ser bloqueado a menos que você queira bloquear toda a instância, nesse caso é melhor usar um bloqueador de domínios.
     learn_more: Saiba mais
     privacy_policy: Política de Privacidade
     see_whats_happening: Veja o que está acontecendo
-    server_stats: 'Estatísticas do servidor:'
+    server_stats: 'Estatísticas da instância:'
     source_code: Código-fonte
+    status_count_after:
+      one: toot
+      other: toots
     status_count_before: Autores de
-    tagline: Siga amigos e encontre novos
+    tagline: Siga seus amigos e faça novas amizades
     terms: Termos de serviço
     unavailable_content: Conteúdo indisponível
     unavailable_content_description:
+      domain: Instância
       reason: 'Motivo:'
-      suspended: Você não será capaz de seguir ninguém deste servidor, e nenhum dado dele será processado ou armazenado, e nenhum dado trocado.
-    unavailable_content_html: Mastodon geralmente permite que você veja o conteúdo e interaja com usuários de qualquer outro servidor no fediverso. Estas são as exceções deste servidor específico.
+      rejecting_media: 'Arquivos de mídia destas instâncias não serão processados ou armazenados e nenhuma miniatura será exibida, exigindo que o usuário abra o arquivo original manualmente:'
+      silenced: 'Toots destas instâncias serão ocultos em linhas e conversas públicas, e nenhuma notificação será gerada a partir das interações dos seus usuários, a menos que esteja sendo seguido:'
+      suspended: 'Você não será capaz de seguir ninguém destas instâncias, e nenhum dado delas será processado, armazenado ou trocado:'
+    unavailable_content_html: Mastodon geralmente permite que você veja o conteúdo e interaja com usuários de qualquer outra instância no fediverso. Estas são as exceções desta instância em específico.
     user_count_after:
       one: usuário
       other: usuários
     user_count_before: Casa de
     what_is_mastodon: O que é Mastodon?
   accounts:
-    choices_html: 'Escolhas de %{name}:'
-    featured_tags_hint: Você pode destacar hashtags específicas que serão exibidas aqui.
+    choices_html: 'Sugestões de %{name}:'
+    endorsements_hint: Você pode sugerir pessoas que você segue, elas aparecerão aqui.
+    featured_tags_hint: Você pode destacar hashtags específicas, elas aparecerão aqui.
     follow: Seguir
     followers:
       one: Seguidor
       other: Seguidores
     following: Seguindo
-    joined: Participa desde %{date}
+    joined: Entrou em %{date}
     last_active: última atividade
-    link_verified_on: A posse desse link foi checada em %{date}
+    link_verified_on: O link foi verificado em %{date}
     media: Mídia
     moved_html: "%{name} se mudou para %{new_profile_link}:"
-    network_hidden: Esta informação não está disponível
+    network_hidden: Informação indisponível
     never_active: Nunca
-    nothing_here: Não há nada aqui!
+    nothing_here: Nada aqui!
     people_followed_by: Pessoas que %{name} segue
     people_who_follow: Pessoas que seguem %{name}
     pin_errors:
-      following: Você tem que estar seguindo a pessoa que você quer sugerir
+      following: Você deve estar seguindo a pessoa que você deseja sugerir
     posts:
       one: Toot
       other: Toots
     posts_tab_heading: Toots
     posts_with_replies: Toots e respostas
-    reserved_username: Este usuário está reservado
+    reserved_username: Nome de usuário reservado
     roles:
-      admin: Administrador
+      admin: Admin
       bot: Robô
-      moderator: Moderador
+      group: Grupo
+      moderator: Mod
     unavailable: Perfil indisponível
     unfollow: Deixar de seguir
   admin:
     account_actions:
-      action: Tomar uma ação
-      title: Realizar uma ação de moderação em %{acct}
+      action: Tomar uma atitude
+      title: Moderar %{acct}
     account_moderation_notes:
-      create: Criar uma advertência
+      create: Deixar nota
       created_msg: Nota de moderação criada com sucesso!
       delete: Excluir
       destroyed_msg: Nota de moderação excluída com sucesso!
@@ -83,75 +95,75 @@ pt-BR:
       approve: Aprovar
       approve_all: Aprovar tudo
       are_you_sure: Você tem certeza?
-      avatar: Imagem de Perfil
+      avatar: Imagem de perfil
       by_domain: Domínio
       change_email:
-        changed_msg: E-mail da conta modificado com sucesso!
+        changed_msg: E-mail da conta alterado com sucesso!
         current_email: E-mail atual
-        label: Mudar e-mail
+        label: Alterar e-mail
         new_email: Novo e-mail
-        submit: Mudar e-mail
-        title: Mudar e-mail para %{username}
+        submit: Alterar e-mail
+        title: Alterar e-mail para %{username}
       confirm: Confirmar
       confirmed: Confirmado
       confirming: Confirmando
       deleted: Excluído
       demote: Rebaixar
       disable: Desativar
-      disable_two_factor_authentication: Desativar 2FA
+      disable_two_factor_authentication: Desativar autenticação de dois fatores
       disabled: Desativada
       display_name: Nome de exibição
       domain: Domínio
       edit: Editar
       email: E-mail
-      email_status: Estado do e-mail
+      email_status: Status do e-mail
       enable: Ativar
-      enabled: Ativado
+      enabled: Ativada
       followers: Seguidores
-      follows: Segue
-      header: Cabeçalho
+      follows: Seguindo
+      header: Capa
       inbox_url: URL da caixa de entrada
       invited_by: Convidado por
       ip: IP
-      joined: Se cadastrou
+      joined: Entrou
       location:
         all: Todos
         local: Local
         remote: Remoto
         title: Localização
-      login_status: Situação de login
-      media_attachments: Mídia(s) anexada(s)
-      memorialize: Tornar um memorial
+      login_status: Situação da conta
+      media_attachments: Mídias anexadas
+      memorialize: Converter em memorial
       moderation:
         active: Ativo
         all: Todos
         pending: Pendente
         silenced: Silenciados
-        suspended: Suspensos
+        suspended: Banidos
         title: Moderação
       moderation_notes: Notas de moderação
       most_recent_activity: Atividade mais recente
       most_recent_ip: IP mais recente
-      no_account_selected: Nenhuma conta foi modificada, pois nenhuma conta foi selecionada
+      no_account_selected: Nenhuma conta foi alterada, pois nenhuma conta foi selecionada
       no_limits_imposed: Nenhum limite imposto
-      not_subscribed: Não está inscrito
-      pending: Esperando revisão
-      perform_full_suspension: Suspender
+      not_subscribed: Não inscrito
+      pending: Revisão pendente
+      perform_full_suspension: Banir
       promote: Promover
       protocol: Protocolo
       public: Público
       push_subscription_expires: Inscrição PuSH expira
       redownload: Atualizar perfil
-      reject: Rejeitar
-      reject_all: Rejeitar tudo
-      remove_avatar: Remover avatar
-      remove_header: Remover cabeçalho
+      reject: Vetar
+      reject_all: Vetar tudo
+      remove_avatar: Remover imagem de perfil
+      remove_header: Remover capa
       resend_confirmation:
         already_confirmed: Este usuário já está confirmado
-        send: Re-enviar o e-mail de confirmação
+        send: Reenviar o e-mail de confirmação
         success: E-mail de confirmação enviado com sucesso!
-      reset: Anular
-      reset_password: Modificar senha
+      reset: Redefinir
+      reset_password: Redefinir senha
       resubscribe: Reinscrever-se
       role: Permissões
       roles:
@@ -160,101 +172,110 @@ pt-BR:
         staff: Equipe
         user: Usuário
       search: Pesquisar
-      shared_inbox_url: URL da caixa de entrada compartilhada
+      search_same_ip: Outros usuários com o mesmo IP
+      shared_inbox_url: Link da caixa de entrada compartilhada
       show:
-        created_reports: Denúncias criadas por esta conta
-        targeted_reports: Denúncias feitas sobre esta conta
+        created_reports: Denúncias desta conta
+        targeted_reports: Denúncias sobre esta conta
       silence: Silenciar
       silenced: Silenciado
-      statuses: Postagens
+      statuses: Toots
       subscribe: Inscrever-se
-      suspended: Suspenso
+      suspended: Banido
       time_in_queue: Esperando na fila por %{time}
       title: Contas
       unconfirmed_email: E-mail não confirmado
-      undo_silenced: Retirar silenciamento
-      undo_suspension: Retirar suspensão
-      unsubscribe: Desinscrever-se
+      undo_silenced: Desfazer silêncio
+      undo_suspension: Desbanir
+      unsubscribe: Cancelar inscrição
       username: Nome de usuário
       warn: Notificar
       web: Web
+      whitelisted: Permitido
     action_logs:
       actions:
-        assigned_to_self_report: "%{name} designou a denúncia %{target} para si"
-        change_email_user: "%{name} mudou o endereço de e-mail do usuário %{target}"
+        assigned_to_self_report: "%{name} pegou a denúncia %{target}"
+        change_email_user: "%{name} alterou o endereço de e-mail do usuário %{target}"
         confirm_user: "%{name} confirmou o endereço de e-mail do usuário %{target}"
         create_account_warning: "%{name} enviou um aviso para %{target}"
-        create_custom_emoji: "%{name} enviou o emoji novo %{target}"
+        create_custom_emoji: "%{name} enviou o novo emoji %{target}"
+        create_domain_allow: "%{name} permitiu %{target}"
         create_domain_block: "%{name} bloqueou o domínio %{target}"
-        create_email_domain_block: "%{name} colocou o domínio de e-mail %{target} na lista negra"
+        create_email_domain_block: "%{name} bloqueou o domínio de e-mail %{target}"
         demote_user: "%{name} rebaixou o usuário %{target}"
-        destroy_custom_emoji: "%{name} destruiu emoji %{target}"
+        destroy_custom_emoji: "%{name} excluiu emoji %{target}"
+        destroy_domain_allow: "%{name} bloqueou %{target}"
         destroy_domain_block: "%{name} desbloqueou o domínio %{target}"
-        destroy_email_domain_block: "%{name} retirou o domínio de e-mail %{target} da lista negra"
-        destroy_status: "%{name} removeu postagem feita por %{target}"
-        disable_2fa_user: "%{name} desabilitou a exigência de autenticação em dois passos para o usuário %{target}"
-        disable_custom_emoji: "%{name} desabilitou o emoji %{target}"
-        disable_user: "%{name} desabilitou o acesso para o usuário %{target}"
-        enable_custom_emoji: "%{name} habilitou o emoji %{target}"
-        enable_user: "%{name} habilitou o acesso para o usuário %{target}"
+        destroy_email_domain_block: "%{name} permitiu domínio de e-mail %{target}"
+        destroy_status: "%{name} excluiu toot de %{target}"
+        disable_2fa_user: "%{name} desativou a exigência de autenticação de dois fatores para o usuário %{target}"
+        disable_custom_emoji: "%{name} desativou o emoji %{target}"
+        disable_user: "%{name} desativou o acesso para o usuário %{target}"
+        enable_custom_emoji: "%{name} ativou o emoji %{target}"
+        enable_user: "%{name} ativou o acesso para o usuário %{target}"
         memorialize_account: "%{name} transformou a conta de %{target} em um memorial"
         promote_user: "%{name} promoveu o usuário %{target}"
-        remove_avatar_user: "%{name} removeu o avatar de %{target}"
+        remove_avatar_user: "%{name} removeu a imagem de perfil de %{target}"
         reopen_report: "%{name} reabriu a denúncia %{target}"
         reset_password_user: "%{name} redefiniu a senha do usuário %{target}"
         resolve_report: "%{name} resolveu a denúncia %{target}"
         silence_account: "%{name} silenciou a conta de %{target}"
-        suspend_account: "%{name} suspendeu a conta de %{target}"
-        unassigned_report: "%{name} desatribuiu a denúncia %{target}"
+        suspend_account: "%{name} baniu a conta de %{target}"
+        unassigned_report: "%{name} largou a denúncia %{target}"
         unsilence_account: "%{name} desativou o silêncio de %{target}"
-        unsuspend_account: "%{name} desativou a suspensão de  %{target}"
+        unsuspend_account: "%{name} desbaniu %{target}"
         update_custom_emoji: "%{name} atualizou o emoji %{target}"
-        update_status: "%{name} atualizou o estado de %{target}"
-      deleted_status: "(status deletado)"
-      title: Auditar relatório
+        update_status: "%{name} atualizou o status de %{target}"
+      deleted_status: "(status excluído)"
+      title: Auditar histórico
     custom_emojis:
-      assign_category: Designar Categoria
+      assign_category: Atribuir categoria
       by_domain: Domínio
       copied_msg: Cópia local do emoji criada com sucesso
       copy: Copiar
-      copy_failed_msg: Não foi possível criar uma cópia local deste emoji
+      copy_failed_msg: Não foi possível criar cópia local do emoji
       create_new_category: Criar nova categoria
       created_msg: Emoji criado com sucesso!
       delete: Excluir
-      destroyed_msg: Emoji deletado com sucesso!
-      disable: Desabilitar
-      disabled_msg: Emoji desabilitado com sucesso
+      destroyed_msg: Emoji excluído com sucesso!
+      disable: Desativar
+      disabled: Desativado
+      disabled_msg: Emoji desativado com sucesso
       emoji: Emoji
-      enable: Habilitar
-      enabled_msg: Emoji habilitado com sucesso
+      enable: Ativar
+      enabled: Ativado
+      enabled_msg: Emoji ativado com sucesso
       image_hint: PNG de até 50KB
+      list: Listar
       listed: Listado
       new:
-        title: Adicionar novo emoji customizado
+        title: Adicionar novo emoji personalizado
       overwrite: Sobrescrever
       shortcode: Atalho
-      shortcode_hint: Pelo menos 2 caracteres, apenas caracteres alfanuméricos e underscores
-      title: Emojis customizados
+      shortcode_hint: Pelo menos 2 caracteres, apenas caracteres alfanuméricos e underlines ("_")
+      title: Emojis personalizados
       uncategorized: Não categorizado
-      unlisted: Não listado
+      unlist: Não listar
+      unlisted: Não-listado
       update_failed_msg: Não foi possível atualizar esse emoji
       updated_msg: Emoji atualizado com sucesso!
       upload: Enviar
     dashboard:
+      authorized_fetch_mode: Modo seguro
       backlog: tarefas na fila
       config: Configuração
-      feature_deletions: Remoção de contas
+      feature_deletions: Exclusão de contas
       feature_invites: Convites
       feature_profile_directory: Diretório de perfis
-      feature_registrations: Cadastros
+      feature_registrations: Novas contas
       feature_relay: Repetidor da federação
       feature_spam_check: Anti-spam
-      feature_timeline_preview: pré-visualização da timeline
+      feature_timeline_preview: Prévia da linha
       features: Funcionalidades
       hidden_service: Federação com serviços onion
       open_reports: Denúncias em aberto
-      pending_tags: hashtags aguardando revisão
-      pending_users: usuários aguardando revisão
+      pending_tags: hashtags pendentes
+      pending_users: usuários pendentes
       recent_users: Usuários recentes
       search: Pesquisa em texto
       single_user_mode: Modo de usuário único
@@ -262,70 +283,76 @@ pt-BR:
       space: Uso de espaço em disco
       title: Painel de controle
       total_users: usuários no total
-      trends: Tendências
+      trends: Em alta
       week_interactions: interações essa semana
       week_users_active: ativos essa semana
       week_users_new: usuários essa semana
+      whitelist_mode: Modo lista de permitidos
+    domain_allows:
+      add_new: Permitir
+      created_msg: Domínio foi permitido
+      destroyed_msg: Domínio foi bloqueado
+      undo: Bloquear
     domain_blocks:
-      add_new: Adicionar novo bloqueio de domínio
-      created_msg: Bloqueio de domínio está sendo processado
-      destroyed_msg: Bloqueio de domínio desfeito
+      add_new: Bloquear outro domínio
+      created_msg: Domínio está sendo bloqueado
+      destroyed_msg: Domínio desbloqueado
       domain: Domínio
       edit: Editar bloqueio de domínio
-      existing_domain_block_html: Você já impôs limites mais restritivos a %{name}, é necessário primeiro <a href="%{unblock_url}">desbloqueá-lo</a>.
+      existing_domain_block_html: Você já bloqueou %{name}, é necessário <a href="%{unblock_url}">desbloqueá-lo</a> primeiro.
       new:
         create: Criar bloqueio
-        hint: O bloqueio de domínio não prevenirá a criação de entradas de contas na base de dados, mas vai reatroativa e automaticamente aplicar métodos específicos de moderação nestas contas.
+        hint: O bloqueio de domínio não prevenirá a criação de entradas de contas na base de dados, mas vai retroativamente e automaticamente aplicar métodos específicos de moderação nestas contas.
         severity:
-          desc_html: O <strong>Silêncio</strong> fará com que as postagens da conta fiquem invisíveis para qualquer um que não a esteja seguindo. A <strong>Suspensão</strong> removerá todo o conteúdo da conta, mídia e dados de perfil. Use <strong>Nenhum</strong> se você apenas deseja rejeitar arquivos de mídia.
+          desc_html: "<strong>Silenciar</strong> fará com que os toots da conta fiquem invisíveis para qualquer um que não a esteja seguindo. <strong>Banir</strong> removerá todo o conteúdo da conta, mídia e dados do perfil. Use <strong>Nenhum</strong> se você apenas deseja recusar os arquivos de mídia."
           noop: Nenhum
-          silence: Silêncio
-          suspend: Suspensão
-        title: Novo bloqueio de domínio
+          silence: Silenciar
+          suspend: Banir
+        title: Bloquear domínio
       private_comment: Comentário privado
+      private_comment_hint: Comente sobre essa restrição ao domínio para uso interno dos moderadores.
       public_comment: Comentário público
-      reject_media: Rejeitar arquivos de mídia
-      reject_media_hint: Remove arquivos de mídia armazenados localmente e recusa quaisquer outros no futuro. Irrelevante para suspensões
-      reject_reports: Rejeitar denúncias
-      reject_reports_hint: Ignorar todas as denúncias vindas deste domíno. Irrelevante para suspensões
-      rejecting_media: rejeitando arquivos de mídia
-      rejecting_reports: rejeitando denúncias
+      public_comment_hint: Comente sobre essa restrição ao domínio para o público geral, caso a divulgação da lista de bloqueio esteja ativada.
+      reject_media: Recusar arquivos de mídia
+      reject_media_hint: Remove arquivos de mídia armazenados localmente e recusa quaisquer outros no futuro. Irrelevante para banimentos
+      reject_reports: Recusar denúncias
+      reject_reports_hint: Ignora todas as denúncias vindas deste domínio. Irrelevante para banimentos
+      rejecting_media: recusando arquivos de mídia
+      rejecting_reports: recusando denúncias
       severity:
         silence: silenciado
-        suspend: suspenso
+        suspend: banido
       show:
         affected_accounts:
           one: Uma conta no banco de dados foi afetada
           other: "%{count} contas no banco de dados foram afetadas"
         retroactive:
-          silence: Desativar silêncio de todas as contas existentes desse domínio
-          suspend: Retirar suspensão de todas as contas neste domínio
-        title: Retirar bloqueio de domínio de %{domain}
-        undo: Retirar
-      undo: Retirar bloqueio de domínio
+          silence: Desativar silêncio de todas as contas desse domínio
+          suspend: Desbanir todas as contas deste domínio
+        title: Desbloquear domínio %{domain}
+        undo: Desfazer
+      undo: Desbloquear domínio
       view: Ver domínios bloqueados
     email_domain_blocks:
       add_new: Adicionar novo
-      created_msg: Bloqueio de domínio de e-mail criado com sucesso
+      created_msg: Domínio de e-mail bloqueado
       delete: Excluir
-      destroyed_msg: Bloqueio de domínio de e-mail excluído com sucesso
+      destroyed_msg: Domínio de e-mail desbloqueado
       domain: Domínio
+      empty: Sem domínios de e-mail bloqueados.
       new:
         create: Adicionar domínio
-        title: Novo bloqueio de domínio de e-mail
-      title: Bloqueio de Domínio de E-mail
-    followers:
-      back_to_account: Voltar para a conta
-      title: Pessoas que seguem %{acct}
+        title: Novo domínio de e-mail bloqueado
+      title: Lista de bloqueio de domínios de e-mail
     instances:
       by_domain: Domínio
-      delivery_available: Entrega está disponível
+      delivery_available: Envio disponível
       known_accounts:
         one: "%{count} conta conhecida"
         other: "%{count} contas conhecidas"
       moderation:
-        all: Todas
-        limited: Limitado
+        all: Todos
+        limited: Limitados
         title: Moderação
       private_comment: Comentário privado
       public_comment: Comentário público
@@ -339,34 +366,46 @@ pt-BR:
       deactivate_all: Desativar todos
       filter:
         all: Todos
-        available: Disponíveis
-        expired: Expirados
+        available: Disponível
+        expired: Expirado
         title: Filtro
       title: Convites
     pending_accounts:
       title: Contas pendentes (%{count})
+    relationships:
+      title: Relações de %{acct}
     relays:
       add_new: Adicionar novo repetidor
       delete: Excluir
-      description_html: Um <strong>repetidor de federação</strong> é um servidor intermediário que troca um grande volume de toots públicos entre servidores que se inscrevem e publicam nele. <strong>O repetidor pode ser usado para ajudar servidores pequenos e médios a descobrir conteúdo do fediverso</strong>, que normalmente precisariam que usuários locais manualmente seguissem outras pessoas em servidores remotos.
+      description_html: Um <strong>repetidor de federação</strong> é um servidor intermediário que troca um grande volume de toots públicos entre instâncias que se inscrevem e publicam nele. <strong>O repetidor pode ser usado para ajudar instâncias pequenas e médias a descobrir conteúdo pelo fediverso</strong>, que normalmente precisariam que usuários locais manualmente seguissem outras pessoas em instâncias remotas.
       disable: Desativar
-      disabled: Desabilitar
-      enable: Habilitar
-      enable_hint: Uma vez habilitado, seu servidor vai se inscrever para receber todos os toots públicos desse repetidor; E vai começar a enviar todos os toots públicos desse servidor para o repetidor.
-      enabled: Habilitado
-      inbox_url: URL do repetidor
+      disabled: Desativado
+      enable: Ativar
+      enable_hint: Uma vez ativado, sua instância se inscreverá para receber todos os toots públicos desse repetidor; E vai começar a enviar todos os toots públicos desta instância para o repetidor.
+      enabled: Ativado
+      inbox_url: Link do repetidor
       pending: Esperando pela aprovação do repetidor
-      save_and_enable: Salvar e habilitar
+      save_and_enable: Salvar e ativar
       setup: Configurar uma conexão de repetidor
+      signatures_not_enabled: Repetidores não funcionarão adequadamente enquanto o modo seguro ou o modo lista de permitidos estiverem ativos
+      status: Status
       title: Repetidores
     report_notes:
       created_msg: Nota de denúncia criada com sucesso!
       destroyed_msg: Nota de denúncia excluída com sucesso!
     reports:
-      action_taken_by: Ação realizada por
+      account:
+        notes:
+          one: "%{count} nota"
+          other: "%{count} notas"
+        reports:
+          one: "%{count} denúncia"
+          other: "%{count} denúncias"
+      action_taken_by: Atitude tomada por
       are_you_sure: Você tem certeza?
-      assign_to_self: Designar para mim
-      assigned: Moderador designado
+      assign_to_self: Acatado por mim
+      assigned: Moderador responsável
+      by_target_domain: Domínio da conta denunciada
       comment:
         none: Nenhum
       created_at: Denunciado
@@ -384,13 +423,14 @@ pt-BR:
       reported_by: Denunciada por
       resolved: Resolvido
       resolved_msg: Denúncia resolvida com sucesso!
+      status: Status
       title: Denúncias
-      unassign: Desatribuir
+      unassign: Largar
       unresolved: Não resolvido
       updated_at: Atualizado
     settings:
       activity_api_enabled:
-        desc_html: Contagem de status postados localmente, usuários ativos e novos cadastros filtrados semanalmente
+        desc_html: Contagem de toots locais, usuários ativos e novos usuários semanalmente
         title: Publicar estatísticas agregadas sobre atividade de usuários
       bootstrap_timeline_accounts:
         desc_html: Separe nomes de usuário através de vírgulas. Funciona apenas com contas locais e destrancadas. O padrão quando vazio são todos os administradores locais.
@@ -399,51 +439,54 @@ pt-BR:
         email: E-mail
         username: Usuário de contato
       custom_css:
-        desc_html: Modificar o visual com CSS que é carregado em todas as páginas
-        title: CSS customizado
+        desc_html: Alterar o visual com CSS carregado em todas as páginas
+        title: CSS personalizado
       default_noindex:
-        desc_html: Afeta qualquer usuário que não tenha modificado esta configuração manualmente
+        desc_html: Afeta qualquer usuário que não tenha alterado esta configuração manualmente
+        title: Optar por excluir usuários da indexação de mecanismos de pesquisa por padrão
       domain_blocks:
-        all: Para todo mundo
+        all: Para todos
         disabled: Para ninguém
         title: Mostrar domínios bloqueados
-        users: Para usuários locais logados
+        users: Para usuários locais ativos
       domain_blocks_rationale:
-        title: Visualizar justificativa
+        title: Mostrar motivo
+      enable_bootstrap_timeline_accounts:
+        title: Ativar seguidos por padrão por novas contas
       hero:
-        desc_html: Aparece na página inicial. Ao menos 600x100px é recomendado. Se não estiver definido, o thumbnail da instância é usado no lugar
+        desc_html: Aparece na página inicial. Recomendado ao menos 600x100px. Se não estiver definido, a miniatura da instância é usada no lugar
         title: Imagem de capa
       mascot:
-        desc_html: Mostrado em diversas páginas. Ao menos 293×205px recomendado. Quando não está configurado, o mascote padrão é mostrado
+        desc_html: Mostrado em diversas páginas. Recomendado ao menos 293×205px. Quando não está definido, o mascote padrão é mostrado
         title: Imagem do mascote
       peers_api_enabled:
         desc_html: Nomes de domínio que essa instância encontrou no fediverso
         title: Publicar lista de instâncias descobertas
       preview_sensitive_media:
-        desc_html: A pré-visualização do link em outros sites vai incluir uma miniatura mesmo se a mídia estiver marcada como sensível
-        title: Mostrar mídia sensível em pré-visualizações OpenGraph
+        desc_html: A prévia do link em outros sites vai incluir uma miniatura mesmo se a mídia estiver marcada como sensível
+        title: Mostrar mídia sensível em prévias OpenGraph
       profile_directory:
         desc_html: Permitir que usuários possam ser descobertos
         title: Ativar diretório de perfis
       registrations:
         closed_message:
-          desc_html: Exibido na página inicial quando cadastros estão fechados. Você pode usar tags HTML
-          title: Mensagem de cadastros fechados
+          desc_html: Mostrado na página inicial quando a instância está fechada. Você pode usar tags HTML
+          title: Mensagem de instância fechada
         deletion:
-          desc_html: Permitir que qualquer um delete a sua conta
+          desc_html: Permitir que qualquer um exclua a própria conta
           title: Exclusão aberta de contas
         min_invite_role:
           disabled: Ninguém
           title: Permitir convites de
       registrations_mode:
         modes:
-          approved: Aprovação necessária para cadastro
-          none: Ninguém pode se cadastrar
-          open: Qualquer um pode se cadastrar
-        title: Modo de cadastro
+          approved: Aprovação necessária para criar conta
+          none: Ninguém pode criar conta
+          open: Qualquer um pode criar conta
+        title: Modo de novos usuários
       show_known_fediverse_at_about_page:
-        desc_html: Quando ligado, vai mostrar toots de todo o fediverso conhecido na prévia da timeline. Senão, mostra somente toots locais.
-        title: Mostrar fediverso conhecido na prévia da timeline
+        desc_html: Quando ativado, mostra toots globais na prévia da linha, se não, mostra somente toots locais
+        title: Mostrar toots globais na prévia da linha
       show_staff_badge:
         desc_html: Mostrar uma insígnia de Equipe na página de usuário
         title: Mostrar insígnia de equipe
@@ -452,179 +495,220 @@ pt-BR:
         title: Descrição da instância
       site_description_extended:
         desc_html: Um ótimo lugar para seu código de conduta, regras, diretrizes e outras coisas para diferenciar a sua instância. Você pode usar tags HTML
-        title: Informação estendida customizada
+        title: Informação estendida personalizada
       site_short_description:
-        desc_html: Aparece na barra lateral e nas meta tags. Descreva o que é Mastodon e o que faz esse servidor especial em um único parágrafo. Se não for preenchido, é substituído pela descrição da instância.
+        desc_html: Mostrada na barra lateral e em etiquetas de metadados. Descreve o que é o Mastodon e o que torna esta instância especial num único parágrafo. Se deixada em branco, é substituído pela descrição da instância.
         title: Descrição curta da instância
       site_terms:
-        desc_html: Você pode escrever a sua própria política de privacidade, termos de serviço, entre outras coisas. Você pode usar tags HTML
-        title: Termos de serviço customizados
+        desc_html: Você pode escrever a sua própria Política de Privacidade, Termos de Serviço, entre outras coisas. Você pode usar tags HTML
+        title: Termos de serviço personalizados
       site_title: Nome da instância
       spam_check_enabled:
+        desc_html: Mastodon pode denunciar automaticamente contas que enviem repetidamente toots não solicitados. Pode haver falsos positivos.
         title: Automação anti-spam
       thumbnail:
         desc_html: Usada para prévias via OpenGraph e API. Recomenda-se 1200x630px
         title: Miniatura da instância
       timeline_preview:
-        desc_html: Exibir a timeline pública na página inicial
-        title: Prévia da timeline
+        desc_html: Mostra a linha do tempo pública na página inicial e permite acesso da API à mesma sem autenticação
+        title: Permitir acesso não autenticado à linha pública
       title: Configurações do site
+      trendable_by_default:
+        desc_html: Afeta as hashtags que não foram reprovadas anteriormente
+        title: Permitir que hashtags fiquem em alta sem revisão prévia
       trends:
+        desc_html: Mostrar publicamente hashtags previamente revisadas que estão em alta
         title: Hashtags em alta
     statuses:
       back_to_account: Voltar para página da conta
       batch:
-        delete: Deletar
-        nsfw_off: Marcar como não-sensível
+        delete: Excluir
+        nsfw_off: Desmarcar como sensível
         nsfw_on: Marcar como sensível
       deleted: Excluídos
-      failed_to_execute: Falha em executar
+      failed_to_execute: Falha ao executar
       media:
         title: Mídia
-      no_media: Não há mídia
+      no_media: Sem mídia
       no_status_selected: Nenhum status foi modificado porque nenhum estava selecionado
-      title: Postagens da conta
+      title: Toots da conta
       with_media: Com mídia
     tags:
+      accounts_today: Usos únicos de hoje
+      accounts_week: Usos únicos desta semana
+      breakdown: Descrição do consumo atual por fonte
       context: Contexto
       directory: No diretório
+      in_directory: "%{count} no diretório"
+      last_active: Última atividade
       most_popular: Mais populares
       most_recent: Mais recentes
       name: Hashtag
+      review: Status da revisão
+      reviewed: Revisado
       title: Hashtags
       trending_right_now: Em alta no momento
+      unique_uses_today: "%{count} tootando hoje"
       unreviewed: Não revisadas
       updated_msg: Configurações de hashtag atualizadas com sucesso
     title: Administração
     warning_presets:
-      add_new: Adicionar um novo
+      add_new: Adicionar novo
       delete: Excluir
       edit: Editar
       edit_preset: Editar o aviso pré-definido
       title: Gerenciar os avisos pré-definidos
   admin_mailer:
     new_pending_account:
-      body: Os detalhes da nova conta estão abaixo. Você pode aprovar ou rejeitar essa aplicação.
+      body: Os detalhes da nova conta estão abaixo. Você pode aprovar ou vetar.
       subject: Nova conta para revisão em %{instance} (%{username})
     new_report:
       body: "%{reporter} denunciou %{target}"
       body_remote: Alguém da instância %{domain} reportou %{target}
       subject: Nova denúncia sobre %{instance} (#%{id})
+    new_trending_tag:
+      body: 'A hashtag #%{name} está em alta hoje, mas não foi previamente revisada. Ela não estará visível publicamente a menos que você aprove, ou apenas salve o formulário do jeito que está para nunca mais ouvir falar dela.'
+      subject: Nova hashtag disponível para revisão em %{instance} (#%{name})
+  aliases:
+    add_new: Criar alias
+    created_msg: Um novo alias foi criado com sucesso. Agora você pode se mudar.
+    deleted_msg: Alias excluído com sucesso. Não será mais possível se mudar para esta conta.
+    hint_html: Se você quiser migrar de uma outra conta para esta, você pode criar um alias aqui, o que é necessário antes que você possa migrar os seguidores da conta antiga para esta. Esta ação por si só é <strong>inofensiva e reversível</strong>. <strong>A migração da conta é iniciada pela conta antiga</strong>.
+    remove: Desvincular alias
   appearance:
-    advanced_web_interface: Interface web avançada
-    advanced_web_interface_hint: 'Se você deseja usar toda a sua largura de tela, a interface web avançada permite que você configure muitas colunas diferentes para ver tantas informações ao mesmo tempo quanto você deseja: Início, notificações, linha do tempo federada, qualquer número de listas e hashtags.'
+    advanced_web_interface: Interface avançada de colunas
+    advanced_web_interface_hint: 'Se você deseja usar toda a sua largura de tela, a interface avançada permite que você configure muitas colunas diferentes para ver tantas informações ao mesmo tempo quanto você deseja: Página inicial, notificações, linha local, linha global, qualquer número de listas e hashtags.'
     animations_and_accessibility: Animações e acessibilidade
-    confirmation_dialogs: Popups de confirmação
+    confirmation_dialogs: Diálogos de confirmação
     discovery: Descobrir
+    localization:
+      body: Mastodon é traduzido por voluntários.
+      guide_link: https://br.crowdin.com/project/mastodon
+      guide_link_text: Todos podem contribuir.
     sensitive_content: Conteúdo sensível
     toot_layout: Layout do Toot
   application_mailer:
-    notification_preferences: Mudar preferências de e-mail
+    notification_preferences: Alterar preferências de e-mail
     salutation: "%{name},"
-    settings: 'Mudar e-mail de preferência: %{link}'
-    view: 'Visualizar:'
+    settings: 'Alterar e-mail de preferência: %{link}'
+    view: 'Ver:'
     view_profile: Ver perfil
-    view_status: Ver status
+    view_status: Ver toot
   applications:
-    created: Aplicação criada com sucesso
-    destroyed: Aplicação excluída com sucesso
-    invalid_url: A URL provida é inválida
-    regenerate_token: Regenerar token de acesso
-    token_regenerated: Token de acesso renegerado com sucesso
+    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!
-    your_token: Seu token de acesso
+    your_token: Seu código de acesso
   auth:
-    apply_for_account: Pedir um convite
+    apply_for_account: Solicitar convite
     change_password: Senha
-    checkbox_agreement_html: Eu concordo com <a href="%{rules_path}" target="_blank">as regras do servidor</a> e com <a href="%{terms_path}" target="_blank">os termos de serviço</a>
-    checkbox_agreement_without_rules_html: Concordo com os <a href="%{terms_path}" target="_blank">termos do serviço </a>
+    checkbox_agreement_html: Concordo com <a href="%{rules_path}" target="_blank">as regras da instância</a> e com <a href="%{terms_path}" target="_blank">os termos de serviço</a>
+    checkbox_agreement_without_rules_html: Concordo com os <a href="%{terms_path}" target="_blank">termos do serviço</a>
     delete_account: Excluir conta
-    delete_account_html: Se você deseja excluir a sua conta, você pode <a href="%{path}">prosseguir para cá</a>. Uma confirmação será requisitada.
+    delete_account_html: Se você deseja excluir sua conta, você pode <a href="%{path}">fazer isso aqui</a>. Uma confirmação será solicitada.
     description:
-      prefix_invited_by_user: "@%{name} convidou você para entrar neste servidor do Mastodon!"
-      prefix_sign_up: Cadastre-se no Mastodon hoje!
-      suffix: Com uma conta, você poderá seguir pessoas, postar atualizações, trocar mensagens com usuários de qualquer servidor Mastodon e muito mais!
+      prefix_invited_by_user: "@%{name} convidou você para entrar nesta instância Mastodon!"
+      prefix_sign_up: Crie uma conta no Mastodon hoje!
+      suffix: Com uma conta, você poderá seguir pessoas, postar atualizações, trocar mensagens com usuários de qualquer instância Mastodon e muito mais!
     didnt_get_confirmation: Não recebeu instruções de confirmação?
     forgot_password: Esqueceu a sua senha?
-    invalid_reset_password_token: Token de modificação de senha é inválido ou expirou. Por favor, requisite um novo.
+    invalid_reset_password_token: Código de alteração de senha é inválido ou expirou. Por favor, solicite um novo.
     login: Entrar
     logout: Sair
-    migrate_account: Mudar para uma conta diferente
+    migrate_account: Mudar-se para outra conta
     migrate_account_html: Se você quer redirecionar essa conta para uma outra você pode <a href="%{path}">configurar isso aqui</a>.
-    or_log_in_with: Ou faça login com
+    or_log_in_with: Ou entre com
     providers:
       cas: CAS
       saml: SAML
-    register: Cadastrar-se
+    register: Criar conta
     registration_closed: "%{instance} não está aceitando novos membros"
     resend_confirmation: Reenviar instruções de confirmação
     reset_password: Redefinir senha
     security: Segurança
     set_new_password: Definir uma nova senha
     setup:
-      email_below_hint_html: Se o endereço de e-mail abaixo estiver incorreto, você pode alterá-lo aqui e receber um novo e-mail de confirmação.
+      email_below_hint_html: Se o endereço de e-mail abaixo não for seu, você pode alterá-lo aqui e receber um novo e-mail de confirmação.
       email_settings_hint_html: O e-mail de confirmação foi enviado para %{email}. Se esse endereço de e-mail não estiver correto, você pode alterá-lo nas configurações da conta.
+      title: Configurações
     status:
+      account_status: Status da conta
+      confirming: Confirmação por e-mail pendente.
+      functional: Sua conta está totalmente operacional.
+      pending: Sua solicitação está com revisão pendente por parte de nossa equipe. Você receberá um e-mail se ela for aprovada.
       redirecting_to: Sua conta está inativa porque atualmente está redirecionando para %{acct}.
-    trouble_logging_in: Problemas para se conectar?
+    trouble_logging_in: Problemas para entrar?
   authorize_follow:
-    already_following: Você já está seguindo esta conta
+    already_following: Você já segue
     error: Infelizmente, ocorreu um erro ao buscar a conta remota
     follow: Seguir
-    follow_request: 'Você mandou uma solicitação de seguidor para:'
+    follow_request: 'Você mandou uma solicitação para seguir para:'
     following: 'Sucesso! Você agora está seguindo:'
     post_follow:
       close: Ou você pode simplesmente fechar esta janela.
-      return: Exibir o perfil do usuário
-      web: Voltar para a página inicial
+      return: Mostrar o perfil do usuário
+      web: Voltar à página inicial
     title: Seguir %{acct}
   challenge:
+    confirm: Continuar
+    hint_html: "<strong>Dica:</strong> Não pediremos novamente sua senha pela próxima hora."
     invalid_password: Senha inválida
     prompt: Confirme sua senha para continuar
   datetime:
     distance_in_words:
       about_x_hours: "%{count}h"
-      about_x_months: "%{count} meses"
-      about_x_years: "%{count} anos"
-      almost_x_years: "%{count} anos"
+      about_x_months: "%{count}m"
+      about_x_years: "%{count}a"
+      almost_x_years: "%{count}a"
       half_a_minute: Agora
-      less_than_x_minutes: "%{count} meses"
+      less_than_x_minutes: "%{count}m"
       less_than_x_seconds: Agora
-      over_x_years: "%{count} anos"
-      x_days: "%{count} dias"
-      x_minutes: "%{count} minutos"
-      x_months: "%{count} meses"
-      x_seconds: "%{count} segundos"
+      over_x_years: "%{count}a"
+      x_days: "%{count}d"
+      x_minutes: "%{count}min"
+      x_months: "%{count}m"
+      x_seconds: "%{count}seg"
   deletes:
     challenge_not_passed: As informações que você inseriu não estão corretas
-    confirm_password: Insira a sua senha atual para verificar a sua identidade
+    confirm_password: Digite a sua senha atual para verificar a sua identidade
     confirm_username: Digite seu nome de usuário para confirmar o procedimento
     proceed: Excluir conta
     success_msg: A sua conta foi excluída com sucesso
     warning:
       before: 'Antes de prosseguir, por favor leia com cuidado:'
-      data_removal: Suas postagens e outros dados serão removidos permanentemente
+      caches: Conteúdo que foi armazenado em cache por outras instâncias pode continuar a existir
+      data_removal: Seus toots e outros dados serão removidos permanentemente
+      email_change_html: Você pode <a href="%{path}">alterar seu endereço de e-mail</a> sem excluir sua conta
+      email_contact_html: Se você ainda não recebeu, você pode enviar um e-mail pedindo ajuda para <a href="mailto:%{email}">%{email}</a>
+      email_reconfirmation_html: Se você não está recebendo o e-mail de confirmação, você pode <a href="%{path}">solicitá-lo novamente</a>
+      irreversible: Você não conseguirá restaurar ou reativar a sua conta
+      more_details_html: Para mais detalhes, consulte a <a href="%{terms_path}">Política de Privacidade</a>.
       username_available: Seu nome de usuário ficará disponível novamente
       username_unavailable: Seu nome de usuário permanecerá indisponível
   directories:
     directory: Diretório de perfis
     explanation: Descobrir usuários baseado em seus interesses
-    explore_mastodon: Explorar %{title}
+    explore_mastodon: Explore o %{title}
+  domain_validator:
+    invalid_domain: não é um nome de domínio válido
   errors:
-    '400': The request you submitted was invalid or malformed.
+    '400': A solicitação enviada é inválida ou incorreta.
     '403': Você não tem permissão para ver esta página.
     '404': A página pela qual você está procurando não existe.
-    '406': This page is not available in the requested format.
-    '410': A página pela qual você está procurando não existe mais.
+    '406': Esta página não está disponível no formato solicitado.
+    '410': A página que você procura não existe mais.
     '422':
-      content: A verificação de segurança falhou. Você desativou o uso de cookies?
-      title: Verificação de segurança falhou
-    '429': Muitas requisições
+      content: Falha na verificação de segurança. Você desativou o uso de cookies?
+      title: Falha na verificação de segurança
+    '429': Muitas solicitações
     '500':
-      content: Desculpe, algo deu errado.
+      content: Desculpe, algo deu errado por aqui.
       title: Esta página não está certa
-    '503': The page could not be served due to a temporary server failure.
-    noscript_html: Para usar o aplicativo web do Mastodon, por favor ative o JavaScript. Ou, se quiser, experimente um dos <a href="%{apps_path}">apps nativos</a> para o Mastodon em sua plataforma.
+    '503': A página não pôde ser carregada devido a uma falha temporária do servidor.
+    noscript_html: Para usar o aplicativo web do Mastodon, por favor ative o JavaScript. Ou, se quiser, experimente um dos <a href="%{apps_path}">aplicativos nativos</a> para o Mastodon em sua plataforma.
   existing_username_validator:
     not_found: não foi possível encontrar um usuário local com esse nome de usuário
     not_found_multiple: não foi possível encontrar %{usernames}
@@ -632,50 +716,54 @@ pt-BR:
     archive_takeout:
       date: Data
       download: Baixe o seu arquivo
-      hint_html: Você pode pedir um arquivo dos seus <strong>toots e mídia enviada</strong>. Os dados exportados estarão no formato ActivityPub, que podem ser lidos por qualquer software compatível. Você pode pedir um arquivo a cada 7 dias.
+      hint_html: Você pode pedir um arquivo dos seus <strong>toots e mídias enviadas</strong>. Os dados exportados estarão no formato ActivityPub, que podem ser lidos por qualquer software compatível. Você pode pedir um arquivo a cada 7 dias.
       in_progress: Preparando o seu arquivo...
       request: Solicitar o seu arquivo
       size: Tamanho
     blocks: Você bloqueou
     csv: CSV
     domain_blocks: Bloqueios de domínio
-    follows: Você segue
     lists: Listas
     mutes: Você silenciou
     storage: Armazenamento de mídia
   featured_tags:
-    add_new: Adicionar uma nova hashtag
+    add_new: Adicionar hashtag
     errors:
       limit: Você atingiu o limite de hashtags em destaque
+    hint_html: "<strong>O que são hashtags em destaque?</strong> Elas são mostradas no seu perfil público e permitem que as pessoas acessem seus toots públicos que contenham especificamente essas hashtags. São uma excelente ferramenta para acompanhar os trabalhos criativos ou os projetos de longo prazo."
   filters:
     contexts:
+      account: Perfis
       home: Página inicial
       notifications: Notificações
-      public: Timelines públicas
+      public: Linhas públicas
       thread: Conversas
     edit:
       title: Editar filtro
     errors:
       invalid_context: Contexto inválido ou nenhum contexto informado
-      invalid_irreversible: O filtro irreversível só funciona com contexto de página inicial ou notificações
+      invalid_irreversible: O filtro irreversível só funciona com os contextos página inicial e notificações
     index:
       delete: Remover
+      empty: Sem filtros.
       title: Filtros
     new:
-      title: Adicionar novo filtro
+      title: Adicionar filtro
   footer:
     developers: Desenvolvedores
     more: Mais…
     resources: Recursos
+    trending_now: Em alta agora
   generic:
     all: Tudo
-    changes_saved_msg: Mudanças salvas com sucesso!
+    changes_saved_msg: Alterações foram salvas com sucesso!
     copy: Copiar
+    no_batch_actions_available: Nenhuma ação em lote disponível nesta página
     order_by: Ordenar por
-    save_changes: Salvar mudanças
+    save_changes: Salvar alterações
     validation_errors:
-      one: Algo não está certo! Por favor, reveja o erro abaixo
-      other: Algo não está certo! Por favor, reveja os %{count} erros abaixo
+      one: Algo errado não está certo! Por favor, analise o erro abaixo
+      other: Algo errado não está certo! Por favor, analise os %{count} erros abaixo
   html_validator:
     invalid_markup: 'contém HTML inválido: %{error}'
   identity_proofs:
@@ -683,24 +771,24 @@ pt-BR:
     authorize: Sim, autorizar
     authorize_connection_prompt: Autorizar essa conexão criptográfica?
     errors:
-      failed: A conexão criptográfica falhou. Por favor tente novamente a partir de %{provider}.
+      failed: Falha na conexão criptográfica. Por favor, tente novamente a partir de %{provider}.
       keybase:
-        invalid_token: Tokens keybase são hashs de assinatura e devem conter 66 caracteres hexa
-        verification_failed: Keybase não reconhece esse token como uma assinatura do usuário keybase %{kb_username}. Por favor tente novamente a partir de Keybase.
-      wrong_user: Não é possível criar uma prova para %{proving} estando logado como %{current}. Faça login como %{proving} e tente novamente.
-    explanation_html: Você pode conectar criptograficamente suas outras identidades, tais quais seu perfil Keybase. Isso permite outras pessoas de lhe enviarem mensagens encriptadas e confiar no conteúdo que você as envia.
+        invalid_token: Tokens keybase são hashes de assinatura e devem conter 66 caracteres hexa
+        verification_failed: Keybase não reconhece esse token como uma assinatura do usuário keybase %{kb_username}. Por favor, tente novamente a partir do Keybase.
+      wrong_user: Não foi possível criar uma prova para %{proving} como %{current}. Entre como %{proving} e tente novamente.
+    explanation_html: Você pode conectar criptograficamente suas outras identidades, tais quais seu perfil Keybase. Isso permite outras pessoas de lhe enviarem mensagens criptografadas e confiar no conteúdo que você as envia.
     i_am_html: Eu sou %{username} em %{service}.
     identity: Identidade
     inactive: Inativo
-    publicize_checkbox: 'E publique isso:'
+    publicize_checkbox: 'E toote isso:'
     publicize_toot: 'Está provado! Eu sou %{username} no %{service}: %{url}'
     status: Status da verificação
     view_proof: Ver prova
   imports:
     modes:
       merge: Juntar
-      merge_long: Manter os registros existentes e adicionar os novos
-      overwrite: Sobreescrever
+      merge_long: Manter os registros existentes e adicionar novos
+      overwrite: Sobrescrever
       overwrite_long: Substituir os registros atuais com os novos
     preface: Você pode importar dados que você exportou de outra instância, como a lista de pessoas que você segue ou bloqueou.
     success: Os seus dados foram enviados com sucesso e serão processados em instantes
@@ -708,7 +796,7 @@ pt-BR:
       blocking: Lista de bloqueio
       domain_blocking: Lista de domínios bloqueados
       following: Pessoas que você segue
-      muting: Lista de silêncio
+      muting: Lista de silenciados
     upload: Enviar
   in_memoriam_html: Em memória.
   invites:
@@ -722,35 +810,54 @@ pt-BR:
       '604800': 1 semana
       '86400': 1 dia
     expires_in_prompt: Nunca
-    generate: Gerar
-    invited_by: 'Você recebeu um convite de:'
+    generate: Gerar convite
+    invited_by: 'Você recebeu convite de:'
     max_uses:
       one: 1 uso
       other: "%{count} usos"
     max_uses_prompt: Sem limite
-    prompt: Gerar e compartilha links com outras pessoas para permitir acesso a essa instância
+    prompt: Gere e compartilhe links para permitir acesso a essa instância
     table:
       expires_at: Expira em
       uses: Usos
     title: Convidar pessoas
   lists:
     errors:
-      limit: Você alcançou o número máximo de listas
+      limit: Você atingiu o máximo de listas
   media_attachments:
     validations:
-      images_and_video: Não é possível anexar um vídeo a uma postagem que já contém imagens
-      too_many: Não é possível anexar mais de 4 imagens
+      images_and_video: Não foi possível anexar um vídeo a um toot que já contém imagens
+      too_many: Não foi possível anexar mais de 4 imagens
   migrations:
-    acct: username@domain da nova conta
+    acct: Mudou-se para
+    cancel: Cancelar redirecionamento
+    cancel_explanation: Cancelar o redirecionamento reativará a sua conta atual, mas não trará de volta os seguidores que não foram migrados para aquela conta.
+    cancelled_msg: Redirecionamento cancelado com sucesso.
+    errors:
+      already_moved: é a mesma conta que você migrou
+      missing_also_known_as: não está referenciando esta conta
+      move_to_self: não pode ser a conta atual
+      not_found: não pôde ser encontrado
+      on_cooldown: Você está no período de espera
+    followers_count: Seguidores no momento da mudança
     incoming_migrations: Migrando de outra conta
+    incoming_migrations_html: Para mover de outra conta para esta, você precisa <a href="%{path}">criar um alias</a>.
     moved_msg: Agora sua conta está redirecionando para %{acct} e seus seguidores estão sendo movidos.
     not_redirecting: Sua conta não está redirecionando para nenhuma outra conta atualmente.
     on_cooldown: Você migrou recentemente sua conta. Esta função ficará disponível novamente em %{count} dias.
     past_migrations: Migrações passadas
     proceed_with_move: Migrar seguidores
     redirecting_to: Sua conta está redirecionando para %{acct}.
+    set_redirect: Definir redirecionamento
     warning:
+      backreference_required: A nova conta deve primeiro ser configurada para que esta seja referenciada
       before: 'Antes de prosseguir, por favor leia com cuidado:'
+      cooldown: Depois de se mudar, há um período de espera para poder efetuar uma nova mudança
+      disabled_account: Sua conta não estará totalmente funcional ao término deste processo. Entretanto, você terá acesso à exportação de dados bem como à reativação.
+      followers: Esta ação moverá todos os seguidores da conta atual para a nova conta
+      only_redirect_html: Alternativamente, você pode <a href="%{path}">apenas colocar um redirecionamento no seu perfil</a>.
+      other_data: Nenhum outro dado será movido automaticamente
+      redirect: O perfil atual da sua conta será atualizado com um aviso de redirecionamento e também será excluído das pesquisas
   moderation:
     title: Moderação
   notification_mailer:
@@ -759,55 +866,76 @@ pt-BR:
       body: Aqui está um breve resumo das mensagens que você perdeu desde o seu último acesso em %{since}
       mention: "%{name} te mencionou em:"
       new_followers_summary:
-        one: Você tem um novo seguidor! Yay!
-        other: Você tem %{count} novos seguidores! Maravilha!
+        one: Você tem um novo seguidor! Uia!
+        other: Você tem %{count} novos seguidores! AÊÊÊ!
       subject:
         one: "Uma nova notificação desde o seu último acesso \U0001F418"
         other: "%{count} novas notificações desde o seu último acesso \U0001F418"
       title: Enquanto você estava ausente...
     favourite:
-      body: 'Sua postagem foi favoritada por %{name}:'
-      subject: "%{name} favoritou a sua postagem"
+      body: "%{name} favoritou seu toot:"
+      subject: "%{name} favoritou seu toot"
       title: Novo favorito
     follow:
-      body: "%{name} está te seguindo!"
-      subject: "%{name} está te seguindo"
+      body: "%{name} te seguiu!"
+      subject: "%{name} te seguiu"
       title: Novo seguidor
     follow_request:
-      action: Gerenciar solicitações para seguir
-      body: "%{name} requisitou autorização para te seguir"
+      action: Gerenciar seguidores pendentes
+      body: "%{name} solicitou autorização para te seguir"
       subject: 'Seguidor pendente: %{name}'
-      title: Nova solicitação de seguidor
+      title: Nova solicitação para seguir
     mention:
       action: Responder
-      body: 'Você foi mencionado por %{name} em:'
-      subject: Você foi mencionado por %{name}
+      body: "%{name} te mencionou em:"
+      subject: "%{name} te mencionou"
       title: Nova menção
     reblog:
-      body: 'Sua postagem foi compartilhada por %{name}:'
-      subject: "%{name} compartilhou a sua postagem"
-      title: Novo compartilhamento
+      body: "%{name} deu boost no seu toot:"
+      subject: "%{name} deu boost no seu toot"
+      title: Novo boost
+  notifications:
+    email_events: Eventos para notificações por e-mail
+    email_events_hint: 'Selecione os eventos que deseja receber notificações:'
+    other_settings: Outras opções para notificações
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: BI
+          million: MI
+          quadrillion: QUA
+          thousand: MIL
+          trillion: TRI
   pagination:
     newer: Mais novo
     next: Próximo
     older: Mais antigo
     prev: Anterior
+    truncate: "&hellip;"
   polls:
     errors:
-      already_voted: Você já votou nessa enquete
+      already_voted: Enquete votada
       duplicate_options: contém itens duplicados
-      duration_too_long: está muito longe no futuro
+      duration_too_long: é muito longe no futuro
       duration_too_short: é curto demais
       expired: A enquete já terminou
+      invalid_choice: Opção inválida
       over_character_limit: não pode ter mais que %{max} caracteres em cada
       too_few_options: deve ter mais que um item
       too_many_options: não pode ter mais que %{max} itens
   preferences:
     other: Outro
+    posting_defaults: Padrões de publicação
+    public_timelines: Linhas públicas
   relationships:
     activity: Atividade da conta
     dormant: Inativo
-    last_active: Ativo por último em
+    followers: Seguidores
+    following: Seguindo
+    invited: Convidado
+    last_active: Última atividade
     most_recent: Mais recente
     moved: Mudou-se
     mutual: Mútuo
@@ -818,26 +946,26 @@ pt-BR:
     remove_selected_follows: Deixar de seguir usuários selecionados
     status: Status da conta
   remote_follow:
-    acct: Insira o seu usuário@domínio a partir do qual você deseja agir
-    missing_resource: Não foi possível encontrar a URL de direcionamento para a sua conta
-    no_account_html: Não tem uma conta? Você pode <a href='%{sign_up_path}' target='_blank'>cadastrar-se aqui</a>
-    proceed: Prosseguir para seguir
-    prompt: 'Você irá seguir:'
-    reason_html: "<strong>Por que esse passo é necessário?</strong> <code>%{instance}</code> pode não ser o servidor onde você se registrou, então precisamos redirecionar você para o seu servidor primeiro."
+    acct: Digite o seu usuário@domínio para continuar
+    missing_resource: Não foi possível encontrar o link de redirecionamento para sua conta
+    no_account_html: Não tem uma conta? Você pode <a href='%{sign_up_path}' target='_blank'>criar uma aqui</a>
+    proceed: Continue para seguir
+    prompt: 'Você seguirá:'
+    reason_html: "<strong>Por que esse passo é necessário?</strong> <code>%{instance}</code> pode não ser a instância onde você se hospedou, então precisamos redirecionar você para a sua instância primeiro."
   remote_interaction:
     favourite:
-      proceed: Proceder para favoritar
-      prompt: 'Você quer favoritar este toot:'
+      proceed: Continue para favoritar
+      prompt: 'Você favoritará este toot:'
     reblog:
-      proceed: Proceder para compartilhar
-      prompt: 'Você quer compartilhar esse toot:'
+      proceed: Continue para dar boost
+      prompt: 'Você dará boost neste toot:'
     reply:
-      proceed: Proceder para responder
-      prompt: 'Você quer responder à esse toot:'
+      proceed: Continue para responder
+      prompt: 'Você responderá este toot:'
   scheduled_statuses:
-    over_daily_limit: Você excedeu o limite de %{limit} toots planejados para esse dia
-    over_total_limit: Você excedeu o limite de %{limit} toots planejados
-    too_soon: A data planejada precisa ser no futuro
+    over_daily_limit: Você excedeu o limite de %{limit} toots agendados para esse dia
+    over_total_limit: Você excedeu o limite de %{limit} toots agendados
+    too_soon: A data agendada precisa ser no futuro
   sessions:
     activity: Última atividade
     browser: Navegador
@@ -861,7 +989,7 @@ pt-BR:
       weibo: Weibo
     current_session: Sessão atual
     description: "%{browser} em %{platform}"
-    explanation: Estes são os navegadores que estão conectados com a sua conta do Mastodon.
+    explanation: Estes são os navegadores que estão conectados com a sua conta Mastodon.
     ip: IP
     platforms:
       adobe_air: Adobe Air
@@ -871,19 +999,20 @@ pt-BR:
       firefox_os: Firefox OS
       ios: iOS
       linux: Linux
-      mac: Mac
+      mac: MacOS
       other: Plataforma desconhecida
       windows: Windows
       windows_mobile: Windows Mobile
       windows_phone: Windows Phone
-    revoke: Revogar
-    revoke_success: Sessão revogada com sucesso
+    revoke: Fechar
+    revoke_success: Sessão fechada com sucesso
     title: Sessões
   settings:
     account: Conta
     account_settings: Configurações da conta
+    aliases: Alias da conta
     appearance: Aparência
-    authorized_apps: Apps autorizados
+    authorized_apps: Aplicativos autorizados
     back: Voltar para o Mastodon
     delete: Exclusão de conta
     development: Desenvolvimento
@@ -898,7 +1027,9 @@ pt-BR:
     preferences: Preferências
     profile: Perfil
     relationships: Seguindo e seguidores
-    two_factor_authentication: Autenticação em dois passos
+    two_factor_authentication: Autenticação de dois fatores
+  spam_check:
+    spam_detected: Esta é uma denúncia automática. Spam foi detectado.
   statuses:
     attached:
       description: 'Anexado: %{attached}'
@@ -908,20 +1039,23 @@ pt-BR:
       video:
         one: "%{count} vídeo"
         other: "%{count} vídeos"
-    boosted_from_html: Compartilhada de %{acct_link}
-    content_warning: 'Aviso de conteúdo: %{warning}'
+    boosted_from_html: Boost de %{acct_link}
+    content_warning: 'Aviso de Conteúdo: %{warning}'
     disallowed_hashtags:
-      one: 'continha a hashtag não permitida: %{tags}'
-      other: 'continha as hashtags não permitidas: %{tags}'
+      one: 'continha hashtag não permitida: %{tags}'
+      other: 'continha hashtags não permitidas: %{tags}'
     language_detection: Detectar idioma automaticamente
-    open_in_web: Abrir na web
+    open_in_web: Abrir no navegador
     over_character_limit: limite de caracteres de %{max} excedido
     pin_errors:
-      limit: Você já fixou a quantidade máxima de toots
-      ownership: Toots de outras pessoas não podem ser fixados
-      private: Toot não-público não pode ser fixado
-      reblog: Um compartilhamento não pode ser fixado
+      limit: Quantidade máxima de toots excedida
+      ownership: Toots dos outros não podem ser fixados
+      private: Toots não-públicos não podem ser fixados
+      reblog: Boosts não podem ser fixados
     poll:
+      total_people:
+        one: "%{count} pessoa"
+        other: "%{count} pessoas"
       total_votes:
         one: "%{count} voto"
         other: "%{count} votos"
@@ -930,124 +1064,125 @@ pt-BR:
     sign_in_to_participate: Entre para participar dessa conversa
     title: '%{name}: "%{quote}"'
     visibilities:
-      private: Apenas seguidores
-      private_long: Mostrar apenas para seguidores
+      private: Privado
+      private_long: Posta apenas para seguidores
       public: Público
-      public_long: Todos podem ver
-      unlisted: Não listado
-      unlisted_long: Todos podem ver, porém não será postado nas timelines públicas
+      public_long: Posta em linhas públicas
+      unlisted: Não-listado
+      unlisted_long: Não posta em linhas públicas
   stream_entries:
     pinned: Toot fixado
-    reblogged: compartilhou
+    reblogged: levou boost
     sensitive_content: Conteúdo sensível
   tags:
     does_not_match_previous_name: não corresponde ao nome anterior
   terms:
     body_html: |
-      <h2>Política de privacidade</h2>
-      <h3 id="collect">Que informação nós coletamos?</h3>
+      <h2>Política de Privacidade</h2>
+      <h3 id="collect">Quais dados nós coletamos?</h3>
 
       <ul>
-      <li><em>Informação básica de conta</em>: Se você se registrar nesse servidor, podemos pedir que você utilize um nome de usuário, um e-mail e uma senha. Você também pode adicionar informações extras como um nome de exibição e biografia; enviar uma imagem de perfil e imagem de cabeçalho. O nome de usuário, nome de exibição, biografia, imagem de perfil e imagem de cabeçalho são sempre listadas publicamente.</li>
-      <li><em>Posts, informação de seguidores e outras informações públicas</em>: A lista de pessoas que você segue é listada publicamente, o mesmo é verdade para quem te segue. Quando você envia uma mensagem, a data e o horário são armazenados, assim como a aplicação que você usou para enviar a mensagem. Mensagens podem conter mídias anexadas, como imagens e vídeos. Posts públicos e não-listados estão disponíveis publicamente. Quando você destaca um post no seu perfil, isso também é uma informação pública. Seus posts são entregues aos seus seguidores e em alguns casos isso significa que eles são enviados para servidores diferentes e cópias são armazenadas nesses servidores. Quando você remove posts, essa informação também é entregue aos seus seguidores. O ato de compartilhar ou favoritar um outro post é sempre público.</li>
-      <li><em>Mensagens diretas e posts somente para seguidores</em>: Todos os posts são armazenados e processados no servidor. Posts somente para seguidores são entregues aos seus seguidores e usuários que são mencionados neles; mensagens diretas são entregues somente aos usuários mencionados nelas. Em alguns casos isso significa que as mensagens são entregues para servidores diferentes e cópias são armazenadas nesses servidores. Nós fazemos esforços substanciais para limitar o acesso dessas mensagens somente para as pessoas autorizadas, mas outros servidores podem não fazer o mesmo. É importante portanto revisar os servidores à qual seus seguidores pertencem. Você pode usar uma opção para aprovar ou rejeitar novos seguidores manualmente nas configurações. <em>Por favor tenha em mente que os operadores do servidor e de qualquer servidores do destinatário podem ver tais mensagens</em>, e que os destinatários podem fazer capturas de tela, copiar ou de outra maneira compartilhar as mensagens. <em>Não compartilhe informação confidencial pelo Mastodon.</em></li>
-      <li><em>IPs e outros metadados</em>: Quando você faz se autentica, nos guardamos o endereço de IP que você usou ao se autenticar e o nome do seu navegador da internet. Todas as sessões autenticadas são disponíveis para serem analisadas e revogadas nas configurações. O último endereço de IP usado é guardado por até 12 meses. Nós também podemos reter históricos do servidor que incluem o endereço de IP de todas as requisições ao nosso servidor.</li>
+      <li><em>Dados básicos de conta</em>: Se você criar conta nesta instância, um nome de usuário, um e-mail e uma senha serão exigidos. Você também pode adicionar dados extras como nome de exibição, biografia, imagem de perfil e capa. Com exceção do e-mail e da senha, os dados citados sempre são públicos.</li>
+      <li><em>Toots, seguindo e outros dados públicos</em>: A lista de pessoas que você segue e a sua lista de seguidores são públicas. Ao enviar um toot, a data, a hora e o aplicativo usado são armazenados. Toots podem conter mídias anexadas, como áudios, imagens e vídeos. Toots públicos e não-listados são visíveis publicamente. Os toots fixados no seu perfil são públicos. Seus toots são enviados aos seus seguidores, em alguns casos isso significa que os toots são enviados para instâncias diferentes e cópias são armazenadas lá. Quando você exclui toots, essa informação também é enviada aos seus seguidores. O ato de dar boost ou favoritar outro toot é sempre público.</li></li>
+      <li><em>Mensagens Diretas e toots privados</em>: Todos os toots são armazenados e processados na instância. Toots privados são enviados aos seus seguidores e aos usuários mencionados neles; Mensagens Diretas (ou toots diretos) são enviadas somente aos usuários mencionados nelas. Em alguns casos isso significa que os toots são enviados para instâncias diferentes e cópias são armazenadas lá. Nós trabalhamos constantemente para limitar o acesso a estes toots somente às pessoas autorizadas, porém outras instâncias podem não fazer o mesmo. Portanto, é importante analisar as instâncias dos seus seguidores. Você pode trancar a conta para aprovar ou vetar novos seguidores manualmente nas configurações. <em>Por favor, tenha em mente que os operadores da instância em que se está e das instâncias receptoras podem ver tais toots</em>, e que os destinatários podem fazer capturas de tela, copiar ou usar outra maneira para compartilhar os toots. <em>Não compartilhe informação confidencial pelo Mastodon.</em></li>
+      <li><em>IPs e outros metadados</em>: Ao entrar na sua conta, nós armazenamos o seu endereço de IP e o nome do navegador usado. Todas as sessões abertas estão disponíveis para serem analisadas e revogadas nas configurações. O último endereço de IP usado é armazenado por até 12 meses. Nós também podemos reter históricos da instância que incluem o endereço de IP de todas as conexões à nossa instância.</li>
       </ul>
 
       <hr class="spacer" />
 
-      <h3 id="use">Para que usamos os seus dados?</h3>
+      <h3 id="use">Como usamos os seus dados?</h3>
 
-      <p>Toda informação que coletamos de você pode ser usada das seguintes maneiras:</p>
+      <p>Todo dado que coletamos pode ser usado das seguintes maneiras:</p>
 
       <ul>
-      <li>Para prover a funcionalidade básica do Mastodon. Você só pode interagir com o conteúdo de outras pessoas e postar seu próprio conteúdo estando autenticado. Por exemplo, você pode seguir outras pessoas para ver seus posts combinados na sua linha do tempo personalizada.</li>
+      <li>Para prover a funcionalidade básica do Mastodon. Você só pode interagir com o conteúdo de outras pessoas e postar seu próprio conteúdo usando uma conta. Por exemplo, você pode seguir outras pessoas para ver seus toots na sua própria linha do tempo personalizada.</li>
       <li>Para auxiliar na moderação da comunidade, por exemplo ao comparar o seu endereço de IP com outros endereços de IP conhecidos para determinar evasão de banimento e outras violações.</li>
-      <li>O endereço de email que você prover pode ser usado para lhe enviar informação, notificação sobre outras pessoas interagindo com o seu conteúdo ou lhe enviando mensagens e para responder a questões ou outros pedidos.</li>
+      <li>O endereço de e-mail que você fornecer pode ser usado para te enviar informações, notificações sobre outras pessoas interagindo com o seu conteúdo ou contigo e para responder a questões ou outras solicitações.</li>
       </ul>
 
       <hr class="spacer" />
 
-      <h3 id="protect">Como protegemos as suas informações?</h3>
+      <h3 id="protect">Como protegemos seus dados?</h3>
 
-      <p>Nós implementamos diversas medidas de segurança para manter a segurança das suas informações pessoais quando você as acessa ou as envia. Entre outras coisas, sua sessão do navegador, bem como o tráfego entre as aplicações e a API são asseguradas usando SSL e a sua senha é guardada usando um algoritmo forte de encriptação de mão única. Você pode ativar autenticação em dois fatores como forma de aumentar a segurança no acesso à sua conta.</p>
+      <p>Nós implementamos diversas medidas de segurança para manter suas informações pessoais seguras quando você as acessa ou as envia. Entre outras coisas, sua sessão do navegador, bem como o tráfego entre os aplicativos e a API são asseguradas usando SSL e a sua senha é guardada usando um algoritmo forte de criptografia de mão única. Você pode ativar autenticação em dois fatores como forma de aumentar a segurança no acesso à sua conta.</p>
 
       <hr class="spacer" />
 
       <h3 id="data-retention">Qual é a nossa política de retenção de dados?</h3>
 
-      <p>Nós fazemos esforços substanciais para:</p>
+      <p>Nós trabalhamos constantemente para:</p>
 
       <ul>
-      <li>Reter o histórico do servidor contendo os endereços de IP de todas as requisições feitas à esse servidor, e com respeito a quanto tempo esses logs são retidos, não mais que 90 dias.</li>
-      <li>Reter o endereço de IP associado com usuários registrados não mais que 12 meses.</li>
+      <li>Reter o histórico da instância contendo os endereços de IP de todas as conexões a essa instância. O histórico é mantido por não mais que 90 dias.</li>
+      <li>Reter os endereços de IP associados à usuários da instância por não mais que 12 meses.</li>
       </ul>
 
-      <p>Você pode pedir e fazer o download de um arquivo de todo o conteúdo da sua conta, incluindo as suas mensagens, suas mídias anexadas, imagem de perfil e imagem de topo.</p>
+      <p>Você pode solicitar e baixar um arquivo de todo o conteúdo da sua conta, incluindo seus toots, suas mídias, imagem de perfil e capa.</p>
 
-      <p>Você pode remover irreversivelmente a sua conta a qualquer momento.</p>
+      <p>YVocê pode excluir a sua conta irreversivelmente a qualquer momento.</p>
 
       <hr class="spacer"/>
 
       <h3 id="cookies">Nós usamos cookies?</h3>
 
-      <p>Sim. Cookies são pequenos arquivos que um site ou serviço transfere ao seu disco rígido do seu computador através do seu navegador da web (se você permitir). Esses cookies permitem ao site conhecer seu navegador e, se você tiver uma conta registrada, associá-lo a sua conta.</p>
+      <p>Sim. Cookies são pequenos arquivos que um site ou serviço baixa através do seu navegador (se você permitir). Esses cookies permitem ao site conhecer seu navegador e, se você tiver uma conta, associá-lo a ela.</p>
 
-      <p>Nós usamos cookies para compreender e salvar suas preferências para visitas futuras.</p>
+      <p>Nós usamos cookies para salvar suas preferências para futuras visitas.</p>
 
       <hr class="spacer" />
 
-      <h3 id="disclose">Nós compartilhamos qualquer informação para terceiros?</h3>
+      <h3 id="disclose">Nós compartilhamos algum dado para terceiros?</h3>
 
-      <p>Nós não vendemos, trocamos ou transferimos de qualquer maneira informação que pode lhe identificar à terceiros. Isso não inclui terceiros que podemos nos auxiliam a operar o nosso site, realizar nossos negócios ou lhe prestar serviços, contanto que esses terceiros se comprometam a manter essa informação confidencial. Nós podemos também divulgar informação quando acreditamos que é apropriado para obedecer a lei, para fazer cumprir nossas políticas ou proteger nossos direitos, propriedade ou segurança ou o direito, propriedade e segurança de outrem.</p>
+      <p>Nós não vendemos, trocamos ou compartilhamos de qualquer maneira dados que possam te identificar à terceiros. Isso não inclui terceiros confiáveis que nos auxiliam a operar o nosso site, realizar nosso serviço ou prestar assistência, contanto que esses terceiros se comprometam a manter essa informação confidencial. Nós podemos também divulgar informação quando acreditamos que é apropriado para obedecer a lei, para fazer cumprir nossas políticas ou proteger os nossos direitos, propriedade ou segurança, ou de outrém.</p>
 
-      <p>Seu conteúdo público pode ser descarregado por outros servidores na rede. Suas mensagens públicas e somente para seus seguidores são entregues aos servidores onde seus seguidores resides e as suas mensagens diretas são entregues ao servidor dos usuários mencionados nelas, contanto que esses seguidores ou usuários residam em um servidor diferente deste.</p>
+      <p>Seu conteúdo público pode ser acessado por outras instâncias na rede. Seus toots públicos e privados são enviados às instâncias dos seus seguidores e seus toots diretos são enviados às instâncias dos usuários mencionados neles, contanto que esses seguidores ou usuários estejam em uma instância diferente desta.</p>
 
-      <p>Quando você autoriza uma aplicação a usar sua conta, dependendo do escopo de permissões que você aprovar, a aplicação pode acessar sua informação pública, a lista de usuários que você segue, seus seguidores, suas listas, suas mensagens e suas mensagens favoritas. Aplicações nunca podem acessar o seu endereço de e-mail ou senha.</p>
+      <p>Quando você autoriza um aplicativo a usar sua conta, dependendo do nível de autorização das permissões que você aprovar, o aplicativo pode acessar seus dados públicos, a lista de usuários que você segue, seus seguidores, suas listas, suas Mensagens Diretas e seus toots favoritos. Aplicativos nunca podem acessar o seu endereço de e-mail ou senha.</p>
 
       <hr class="spacer" />
 
       <h3 id="children">Uso desse site por crianças</h3>
 
-      <p>Se este servidor está na UE ou no EEE: Nosso site, produto e serviços são direcionados à pessoas que tem ao menos 16 anos de idade. Se você tem menos de 16 anos, de acordo com os requisitos da RGPD (<a href="https://pt.wikipedia.org/wiki/Regulamento_Geral_sobre_a_Prote%C3%A7%C3%A3o_de_Dados">Regulamento Geral sobre a Proteção de Dados</a>) não use este site.</p>
+      <p>Se a instância está na UE ou no EEE: Nosso site, produto e serviço são direcionados às pessoas que tem ao menos 16 anos de idade. Se você tem menos de 16 anos, de acordo com os requisitos da RGPD (<a href="https://pt.wikipedia.org/wiki/Regulamento_Geral_sobre_a_Prote%C3%A7%C3%A3o_de_Dados">Regulamento Geral sobre Proteção de Dados</a>) não use este site.</p>
 
-      <p>Se este servidor está hospedado nos EUA: Nosso site, produto e serviços são direcionados à pessoas que tem ao menos 13 anos de idade. Se você tem menos de 13 anos, de acordo com os requerimentos da COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) não use este site</p>
+      <p>Se esta instância está nos EUA: Nosso site, produto e serviço são direcionados às pessoas que tem ao menos 13 anos de idade. Se você tem menos de 13 anos, de acordo com os requerimentos da COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) não use este site</p>
 
-      <p>Os requisitos da lei podem ser diferentes se esse servidor estiver em outra jurisdição</p>
+      <p>Os requisitos da lei podem ser diferentes em outra jurisdição.</p>
 
       <hr class="spacer" />
 
-      <h3 id="changes">Mudanças à nossa política de privacidade</h3>
+      <h3 id="changes">Alterações na nossa Política de Privacidade</h3>
 
-      <p>Se decidirmos mudar nossa política de privacidade, nós iremos disponibilizar as mudanças nesta página.</p>
+      <p>Se decidirmos mudar nossa Política de Privacidade, iremos disponibilizar as alterações nesta página.</p>
 
-      <p>Este documento é CC-BY-SA. Ele foi atualizado pela última vez em 7 de março de 2018.</p>
+      <p>CC-BY-SA. Atualizado pela última vez em 7 de março de 2018.</p>
 
-      <p>Adaptado originalmente a partir da <a href="https://github.com/discourse/discourse">política de privacidade Discourse</a>.</p>
-    title: "%{instance} Termos de Serviço e Política de Privacidade"
+      <p>Adaptado originalmente de <a href="https://github.com/discourse/discourse">Política de Privacidade Discourse</a>.</p>
+    title: Termos de Serviço e Política de Privacidade de %{instance}
   themes:
     contrast: Mastodon  (Alto contraste)
-    default: Mastodon (Escuro)
-    mastodon-light: Mastodon (claro)
+    default: Mastodon (Noturno)
+    mastodon-light: Mastodon (Diurno)
   time:
     formats:
-      month: "%B de %Y"
+      default: "%H:%M em %d de %b de %Y"
+      month: "%b de %Y"
   two_factor_authentication:
-    code_hint: Insira o código gerado pelo seu aplicativo auteticador para confirmar
-    description_html: Se você ativar a <strong>autenticação em dois passos</strong>, o acesso à sua conta exigirá posse de seu celular, que irá gerar tokens para validação.
+    code_hint: Digite o código de dois fatores gerado pelo aplicativo no seu celular
+    description_html: Se você ativar a <strong>autenticação de dois fatores</strong>, o acesso à sua conta exigirá um celular, que gerará códigos para validação.
     disable: Desativar
     enable: Ativar
-    enabled: A autenticação em dois passos está ativada
-    enabled_success: Autenticação em dois passos ativada com sucesso
+    enabled: Autenticação de dois fatores ativada
+    enabled_success: Autenticação de dois fatores ativada com sucesso
     generate_recovery_codes: Gerar códigos de recuperação
-    instructions_html: "<strong>Escaneie este QR Code no Google Authenticator ou aplicativo TOTP similar com o seu celular</strong>. De agora em diante, este aplicativo irá gerar tokens que você terá que inserir quando desejar acessar a sua conta."
-    lost_recovery_codes: Códigos de recuperação permitem que você recupere acesso à sua conta caso perca o seu celular. Se você perdeu seus códigos de recuperação, você pode gerá-los novamente aqui. Seus códigos de recuperaçãp anteriores serão invalidados.
-    manual_instructions: 'Se você não pode escanear o QR code e precisa inserí-lo manualmente, aqui está o segredo em texto:'
+    instructions_html: "<strong>Escaneie este QR Code no Google Authenticator ou aplicativo TOTP similar no seu celular</strong>. De agora em diante, este aplicativo gerará códigos que você terá que inserir ao entrar na sua conta."
+    lost_recovery_codes: Códigos de recuperação permitem que você recupere o acesso à sua conta caso perca o seu celular. Se você perdeu seus códigos de recuperação, você pode gerá-los novamente aqui. Seus códigos de recuperação anteriores serão invalidados.
+    manual_instructions: 'Se você não consegue escanear o QR code, aqui está o segredo em texto:'
     recovery_codes: Códigos de recuperação de reserva
-    recovery_codes_regenerated: Códigos de recuperação regenerados com sucesso
-    recovery_instructions_html: Se você perder acesso ao seu celular, você pode usar um dos códigos de recuperação abaixo para reganhar acesso à sua conta. <strong>Mantenha os códigos de recuperação em um local seguro</strong>. Por exemplo, você pode imprimi-los e guardá-los com outros documentos importantes.
+    recovery_codes_regenerated: Códigos de recuperação gerados com sucesso
+    recovery_instructions_html: Se você perder acesso ao seu celular, você pode usar um dos códigos de recuperação abaixo para acessar a sua conta. <strong>Mantenha os códigos de recuperação em um local seguro</strong>. Por exemplo, você pode imprimi-los e guardá-los junto com outros documentos importantes.
     setup: Configurar
-    wrong_code: O código inserido é invalido! O horário do servidor e o horário do seu aparelho estão corretos?
+    wrong_code: Código de dois fatores inválido. O horário da instância e o horário do seu celular estão corretos?
   user_mailer:
     backup_ready:
       explanation: Você pediu um backup completo da sua conta no Mastodon. E agora está pronto para ser baixado!
@@ -1055,45 +1190,46 @@ pt-BR:
       title: Baixar arquivo
     warning:
       explanation:
-        disable: Enquanto sua conta está congelada, seus dados estão intactos, mas você não pode realizar nenhuma ação até que sua conta seja desbloqueada.
-        silence: Enquanto sua conta está limitada, somente pessoas que já estão seguindo você poderão ver seus toots nesse servidor, e você pode ser excluído de diversas listagens públicas. No entanto, outros ainda podem seguir você manualmente.
-        suspend: Sua conta está suspensa e todos os seus toots e mídias foram irreversivelmente removidas desse servidor e de servidores onde você tinha seguidores.
+        disable: Enquanto sua conta está bloqueada, seus dados estão intactos, mas você não pode realizar nenhuma ação até que sua conta seja desbloqueada.
+        silence: Enquanto sua conta está silenciada, somente pessoas que já estão seguindo você poderão ver seus toots nessa instância, e você pode ser excluído de várias listas públicas. No entanto, outros ainda podem te seguir manualmente.
+        suspend: Sua conta foi banida e todos os seus toots e mídias foram irreversivelmente excluídos desta instância e das instâncias dos seus seguidores.
       get_in_touch: Você pode responder a este e-mail para entrar em contato com a equipe de %{instance}.
-      review_server_policies: Revisar as políticas do servidor
+      review_server_policies: Revisar as políticas da instância
+      statuses: 'Especificamente, para:'
       subject:
-        disable: Sua conta %{acct} foi congelada
+        disable: Sua conta %{acct} foi bloqueada
         none: Aviso para %{acct}
-        silence: Sua conta %{acct} foi limitada
-        suspend: Sua conta %{acct} foi suspensa
+        silence: Sua conta %{acct} foi silenciada
+        suspend: Sua conta %{acct} foi banida
       title:
-        disable: Conta congelada
+        disable: Conta bloqueada
         none: Aviso
-        silence: Conta limitada
-        suspend: Conta suspensa
+        silence: Conta silenciada
+        suspend: Conta banida
     welcome:
       edit_profile_action: Configurar perfil
-      edit_profile_step: Você pode customizar o seu perfil enviando um avatar, uma imagem de topo, mudando seu nome de exibição, dentre outros. Se você gostaria de aprovar novos seguidores antes que eles possam seguir você, você pode trancar a sua conta.
-      explanation: Aqui estão algumas dicas para te ajudar a começar
-      final_action: Comece a postar
-      final_step: 'Comece a postar! Mesmo sem seguidores, suas mensagens públicas podem ser vistas por outros, por exemplo nas timelines locais e buscando hashtags. Você pode querer fazer uma introdução usando a hashtag #introduções, ou em inglês usando a hashtag #introductions.'
+      edit_profile_step: Você pode personalizar o seu perfil enviando uma imagem de perfil, uma capa, alterando seu nome de exibição e etc. Se você preferir aprovar seus novos seguidores antes de eles verem seus toots, você pode trancar a sua conta.
+      explanation: Aqui estão algumas dicas para você começar
+      final_action: Comece a tootar
+      final_step: 'Comece a tootar! Mesmo sem seguidores, suas mensagens públicas podem ser vistas pelos outros, por exemplo, na linha local e nas hashtags. Você pode querer fazer uma introdução usando a hashtag #introdução, ou em inglês usando a hashtag #introductions.'
       full_handle: Seu nome de usuário completo
-      full_handle_hint: Isso é o que você diz aos seus amigos para que eles possam te mandar mensagens ou te seguir a partir de outra instância.
-      review_preferences_action: Mudar as preferências
-      review_preferences_step: Não se esqueça de configurar suas preferências, como quais e-mails você gostaria de receber, que nível de privacidade você gostaria que seus posts tenham por padrão. Se você não sofre de enjôo com movimento, você pode habilitar GIFs animando automaticamente.
+      full_handle_hint: Isso é o que você compartilha com aos seus amigos para que eles possam te mandar toots ou te seguir a partir de outra instância.
+      review_preferences_action: Alterar preferências
+      review_preferences_step: Não se esqueça de configurar suas preferências, como quais e-mails você gostaria de receber, que nível de privacidade você gostaria que seus toots tenham por padrão. Se você não sofre de enjoo com movimento, você pode habilitar GIFs animado automaticamente.
       subject: Boas-vindas ao Mastodon
-      tip_federated_timeline: A timeline global é uma visão contínua da rede do Mastodon. Mas ela só inclui pessoas que outras pessoas da sua instância estão seguindo, então não é a rede completa.
-      tip_following: Você vai seguir administrador(es) da sua instância por padrão. Para encontrar mais gente interessante, confira as timelines local e global.
-      tip_local_timeline: A timeline local é uma visão contínua das pessoas que estão em %{instance}. Esses são seus vizinhos próximos!
-      tip_mobile_webapp: Se o seu navegador móvel oferecer a opção de adicionar Mastodon à tela inicial, você pode receber notificações push. Vai funcionar quase como um aplicativo nativo!
+      tip_federated_timeline: A linha global é uma visão contínua da rede do Mastodon. Mas ela só inclui pessoas de instâncias que a sua instância conhece, então não é a rede completa.
+      tip_following: Você vai seguir administrador(es) da sua instância por padrão. Para encontrar mais gente interessante, confira as linhas local e global.
+      tip_local_timeline: A linha local é uma visão contínua das pessoas em %{instance}. Estes são seus vizinhos!
+      tip_mobile_webapp: Se o seu navegador móvel oferecer a opção de adicionar Mastodon à tela inicial, você pode receber notificações push. Será como um aplicativo nativo!
       tips: Dicas
-      title: Boas-vindas a bordo, %{name}!
+      title: Boas vindas, %{name}!
   users:
-    follow_limit_reached: Você não pode seguir mais que %{limit} pessoas
-    invalid_email: O endereço de e-mail é inválido
-    invalid_otp_token: Código de autenticação inválido
+    follow_limit_reached: Você não pode seguir mais de %{limit} pessoas
+    invalid_email: Endereço de e-mail inválido
+    invalid_otp_token: Código de dois fatores inválido
     otp_lost_help_html: Se você perder o acesso à ambos, você pode entrar em contato com %{email}
-    seamless_external_login: Você está logado usando um serviço externo, então configurações de e-mail e senha não estão disponíveis.
-    signed_in_as: 'Acesso como:'
+    seamless_external_login: Você entrou usando um serviço externo, então configurações de e-mail e senha não estão disponíveis.
+    signed_in_as: 'Entrou como:'
   verification:
-    explanation_html: 'Você pode <strong>verificar-se como tendo posse dos links nos metadados do seu perfil</strong>. Para isso, o site conectado deve conter um link de volta para o seu perfil do Mastodon. O link de volta <strong>deve</strong> conter um atributo <code>rel="me"</code>. O conteúdo ou texto do link não importa. Aqui está um exemplo:'
+    explanation_html: 'Você pode <strong>verificar os links nos metadados do seu perfil</strong>. Para isso, o site citado deve conter um link de volta para o seu perfil do Mastodon. O link de volta <strong>deve</strong> conter um atributo <code>rel="me"</code>. O conteúdo ou texto do link não importa. Aqui está um exemplo:'
     verification: Verificação
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index 3c5b1ca9a..deee43287 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -39,6 +39,10 @@ pt-PT:
     unavailable_content_description:
       domain: Servidor
       reason: Motivo
+      rejecting_media: 'Arquivos de média destes servidores não serão processados ou armazenados, e nenhuma miniatura será exibida, o que requer que o utilizador clique e abra o arquivo original manualmente:'
+      silenced: 'Publicações destes servidores serão ocultas em linhas do tempo e conversas públicas, e nenhuma notificação será gerada a partir das interações dos seus utilizadores, a menos que você os esteja a seguir:'
+      suspended: 'Nenhum dado desses servidores será processado, armazenado ou trocado, tornando qualquer interação ou comunicação com os utilizadores desses servidores impossível:'
+    unavailable_content_html: Mastodon geralmente permite que você veja o conteúdo e interaja com usuários de qualquer outro servidor no fediverso. Estas são as exceções deste servidor específico.
     user_count_after:
       one: utilizador
       other: utilizadores
@@ -46,6 +50,8 @@ pt-PT:
     what_is_mastodon: O que é o Mastodon?
   accounts:
     choices_html: 'escolhas de %{name}:'
+    endorsements_hint: Você pode, através da interface web, escolher endossar pessoas que segue, e elas aparecerão aqui.
+    featured_tags_hint: Você pode destacar hashtags específicas que serão exibidas aqui.
     follow: Seguir
     followers:
       one: Seguidor
@@ -54,8 +60,10 @@ pt-PT:
     joined: Aderiu %{date}
     last_active: última vez activo
     link_verified_on: A posse deste link foi verificada em %{date}
+    media: Média
     moved_html: "%{name} mudou-se para %{new_profile_link}:"
     network_hidden: Esta informação não está disponível
+    never_active: Nunca
     nothing_here: Não há nada aqui!
     people_followed_by: Pessoas seguidas por %{name}
     people_who_follow: Pessoas que seguem %{name}
@@ -70,7 +78,9 @@ pt-PT:
     roles:
       admin: Administrador
       bot: Robô
+      group: Grupo
       moderator: Moderador
+    unavailable: Perfil indisponível
     unfollow: Deixar de seguir
   admin:
     account_actions:
@@ -82,7 +92,10 @@ pt-PT:
       delete: Eliminar
       destroyed_msg: Nota de moderação excluída com sucesso!
     accounts:
+      approve: Aprovar
+      approve_all: Aprovar todos
       are_you_sure: Tens a certeza?
+      avatar: Imagem de Perfil
       by_domain: Domínio
       change_email:
         changed_msg: E-mail da conta alterado com sucesso!
@@ -111,9 +124,11 @@ pt-PT:
       header: Cabeçalho
       inbox_url: URL da caixa de entrada
       invited_by: Convidado por
+      ip: IP
       joined: Aderiu
       location:
         all: Todos
+        local: Local
         remote: Remoto
         title: Local
       login_status: Estado de início de sessão
@@ -122,21 +137,26 @@ pt-PT:
       moderation:
         active: Activo
         all: Todos
+        pending: Pendente
         silenced: Silenciados
         suspended: Supensos
         title: Moderação
       moderation_notes: Notas de moderação
       most_recent_activity: Actividade mais recente
       most_recent_ip: IP mais recente
+      no_account_selected: Nenhuma conta foi alterada porque nenhuma foi selecionada
       no_limits_imposed: Sem limites impostos
       not_subscribed: Não inscrito
+      pending: Pendente de revisão
       perform_full_suspension: Fazer suspensão completa
       promote: Promover
       protocol: Protocolo
       public: Público
       push_subscription_expires: A Inscrição PuSH expira
-      redownload: Atualizar avatar
-      remove_avatar: Remover o avatar
+      redownload: Atualizar perfil
+      reject: Rejeitar
+      reject_all: Rejeitar todas
+      remove_avatar: Remover a imagem de perfil
       remove_header: Remover o cabeçalho
       resend_confirmation:
         already_confirmed: Este usuário já está confirmado
@@ -152,6 +172,7 @@ pt-PT:
         staff: Equipa
         user: Utilizador
       search: Pesquisar
+      search_same_ip: Outros utilizadores com o mesmo IP
       shared_inbox_url: URL da caixa de entrada compartilhada
       show:
         created_reports: Relatórios gerados por esta conta
@@ -161,6 +182,7 @@ pt-PT:
       statuses: Status
       subscribe: Inscrever-se
       suspended: Suspensa
+      time_in_queue: Aguardando na fila %{time}
       title: Contas
       unconfirmed_email: E-mail não confirmado
       undo_silenced: Desfazer silenciar
@@ -168,6 +190,8 @@ pt-PT:
       unsubscribe: Cancelar inscrição
       username: Usuário
       warn: Aviso
+      web: Web
+      whitelisted: Está na lista branca
     action_logs:
       actions:
         assigned_to_self_report: "%{name} atribuiu o relatório %{target} a si próprios"
@@ -175,12 +199,14 @@ pt-PT:
         confirm_user: "%{name} confirmou o endereço de e-mail do utilizador %{target}"
         create_account_warning: "%{name} enviou um aviso para %{target}"
         create_custom_emoji: "%{name} enviado emoji novo %{target}"
+        create_domain_allow: "%{name} colocou o domínio %{target} na lista branca"
         create_domain_block: "%{name} bloqueou o domínio %{target}"
         create_email_domain_block: "%{name} adicionou na lista negra o domínio de correio electrónico %{target}"
         demote_user: "%{name} rebaixou o utilizador %{target}"
         destroy_custom_emoji: "%{name} destruiu o emoji %{target}"
+        destroy_domain_allow: "%{name} removeu o domínio %{target} da lista branca"
         destroy_domain_block: "%{name} desbloqueou o domínio %{target}"
-        destroy_email_domain_block: "%{name} adicionou na lista branca o domínio de correio electrónico %{target}"
+        destroy_email_domain_block: "%{name} retirou o domínio de e-mail %{target} da lista negra"
         destroy_status: "%{name} removeu o publicação feita por %{target}"
         disable_2fa_user: "%{name} desactivou o requerimento de autenticação em dois passos para o utilizador %{target}"
         disable_custom_emoji: "%{name} desabilitou o emoji %{target}"
@@ -189,7 +215,7 @@ pt-PT:
         enable_user: "%{name} ativou o acesso para o utilizador %{target}"
         memorialize_account: "%{name} transformou a conta de %{target} em um memorial"
         promote_user: "%{name} promoveu o utilizador %{target}"
-        remove_avatar_user: "%{name} removeu o avatar de %{target}"
+        remove_avatar_user: "%{name} removeu a imagem de perfil de %{target}"
         reopen_report: "%{name} reabriu o relatório %{target}"
         reset_password_user: "%{name} restabeleceu a palavra-passe do utilizador %{target}"
         resolve_report: "%{name} recusou o relatório %{target}"
@@ -203,18 +229,24 @@ pt-PT:
       deleted_status: "(apagou a publicação)"
       title: Registo de auditoria
     custom_emojis:
+      assign_category: Atribuir categoria
       by_domain: Domínio
       copied_msg: Cópia local do emoji criada com sucesso
       copy: Copiar
       copy_failed_msg: Não foi possível criar uma cópia local deste emoji
+      create_new_category: Criar nova categoria
       created_msg: Emoji criado com sucesso!
       delete: Apagar
       destroyed_msg: Emoji destruído com sucesso!
       disable: Desativar
+      disabled: Desativado
       disabled_msg: Desativado com sucesso este emoji
+      emoji: Emoji
       enable: Ativar
+      enabled: Ativado
       enabled_msg: Ativado com sucesso este emoji
       image_hint: PNG de até 50KB
+      list: Lista
       listed: Listado
       new:
         title: Adicionar novo emoji customizado
@@ -222,11 +254,14 @@ pt-PT:
       shortcode: Código de atalho
       shortcode_hint: Pelo menos 2 caracteres, apenas caracteres alfanuméricos e underscores
       title: Emojis customizados
+      uncategorized: Sem categoria
+      unlist: Não listar
       unlisted: Não listado
       update_failed_msg: Não foi possível atualizar esse emoji
       updated_msg: Emoji atualizado com sucesso!
       upload: Enviar
     dashboard:
+      authorized_fetch_mode: Modo seguro
       backlog: trabalhos atrasados
       config: Configuração
       feature_deletions: Eliminações da conta
@@ -234,12 +269,17 @@ pt-PT:
       feature_profile_directory: Directório de perfil
       feature_registrations: Registos
       feature_relay: Repetidor da federação
+      feature_spam_check: Anti-spam
+      feature_timeline_preview: Pré-visualização da cronologia
       features: Componentes
       hidden_service: Federação com serviços escondidos
       open_reports: relatórios abertos
+      pending_tags: hashtags a aguardar revisão
+      pending_users: utilizadores a aguardar revisão
       recent_users: Utilizadores recentes
       search: Pesquisa com texto completo
       single_user_mode: Modo de utilizador único
+      software: Software
       space: Utilização do espaço
       title: Painel de controlo
       total_users: total de utilizadores
@@ -247,11 +287,19 @@ pt-PT:
       week_interactions: interacções desta semana
       week_users_active: activo esta semana
       week_users_new: utilizadores nesta semana
+      whitelist_mode: Modo lista branca
+    domain_allows:
+      add_new: Colocar domínio na lista branca
+      created_msg: Domínio foi adicionado à lista branca com sucesso
+      destroyed_msg: Domínio foi removido da lista branca
+      undo: Remover da lista branca
     domain_blocks:
       add_new: Adicionar novo
       created_msg: Bloqueio do domínio está a ser processado
       destroyed_msg: Bloqueio de domínio está a ser removido
       domain: Domínio
+      edit: Editar bloqueio de domínio
+      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
         hint: O bloqueio de dominio não vai previnir a criação de entradas na base de dados, mas irá retroativamente e automaticamente aplicar métodos de moderação específica nessas contas.
@@ -261,6 +309,10 @@ pt-PT:
           silence: Silenciar
           suspend: Suspender
         title: Novo bloqueio de domínio
+      private_comment: Comentário privado
+      private_comment_hint: Comentário sobre essa limitação de domínio para uso interno pelos moderadores.
+      public_comment: Comentário público
+      public_comment_hint: Comentário sobre essa limitação de domínio para o público geral, se ativada a divulgação da lista de limitações de domínio.
       reject_media: Rejeitar ficheiros de media
       reject_media_hint: Remove localmente arquivos armazenados e rejeita fazer guardar novos no futuro. Irrelevante na suspensão
       reject_reports: Rejeitar relatórios
@@ -280,19 +332,18 @@ pt-PT:
         title: Remover o bloqueio de domínio de %{domain}
         undo: Anular
       undo: Anular
+      view: Ver domínios bloqueados
     email_domain_blocks:
       add_new: Adicionar novo
       created_msg: Bloqueio de domínio de email criado com sucesso
       delete: Eliminar
       destroyed_msg: Bloqueio de domínio de email excluído com sucesso
       domain: Domínio
+      empty: Nenhum domínio de e-mail atualmente na lista negra.
       new:
         create: Adicionar domínio
         title: Novo bloqueio de domínio de email
       title: Bloqueio de Domínio de Email
-    followers:
-      back_to_account: Voltar à conta
-      title: Seguidores de %{acct}
     instances:
       by_domain: Domínio
       delivery_available: Entrega disponível
@@ -321,6 +372,8 @@ pt-PT:
       title: Convites
     pending_accounts:
       title: Contas pendentes (%{count})
+    relationships:
+      title: Relações de %{acct}
     relays:
       add_new: Adicionar novo repetidor
       delete: Apagar
@@ -334,17 +387,25 @@ pt-PT:
       pending: À espera da aprovação do repetidor
       save_and_enable: Guardar e ativar
       setup: Configurar uma ligação ao repetidor
-      signatures_not_enabled: Relays não funcionarão corretamente enquanto o modo seguro ou o modo whitelist estiver activado
+      signatures_not_enabled: Relays não funcionarão corretamente enquanto o modo seguro ou o modo lista branca estiverem ativados
       status: Estado
       title: Retransmissores
     report_notes:
       created_msg: Relatório criado com sucesso!
       destroyed_msg: Relatório apagado com sucesso!
     reports:
+      account:
+        notes:
+          one: "%{count} nota"
+          other: "%{count} notas"
+        reports:
+          one: "%{count} relatório"
+          other: "%{count} relatórios"
       action_taken_by: Ação tomada por
       are_you_sure: Tens a certeza?
       assign_to_self: Atribuí-me a mim
       assigned: Atribuído ao moderador
+      by_target_domain: Domínio da conta reportada
       comment:
         none: Nenhum
       created_at: Relatado
@@ -359,11 +420,11 @@ pt-PT:
       reopen: Reabrir relatório
       report: 'Denúncia #%{id}'
       reported_account: Conta denunciada
-      reported_by: Denúnciada por
+      reported_by: Reportado por
       resolved: Resolvido
       resolved_msg: Relatório resolvido com sucesso!
       status: Estado
-      title: Denúncias
+      title: Relatórios
       unassign: Não atribuir
       unresolved: Por resolver
       updated_at: Atualizado
@@ -390,6 +451,8 @@ pt-PT:
         users: Para utilizadores locais que se encontrem autenticados
       domain_blocks_rationale:
         title: Mostrar motivo
+      enable_bootstrap_timeline_accounts:
+        title: Habilitar seguidores predefinidos para novos utilizadores
       hero:
         desc_html: Apresentado na primeira página. Pelo menos 600x100px recomendados. Quando não é definido, é apresentado o thumbnail do servidor
         title: Imagem Hero
@@ -453,12 +516,16 @@ pt-PT:
       trendable_by_default:
         desc_html: Afecta as hashtags que ainda não tenham sido proibidas
         title: Permitir hashtags em tendência sem revisão prévia
+      trends:
+        desc_html: Exibir publicamente hashtags atualmente em destaque que já tenham sido revistas anteriormente
+        title: Hashtags em destaque
     statuses:
       back_to_account: Voltar para página da conta
       batch:
         delete: Eliminar
         nsfw_off: NSFW OFF
         nsfw_on: NSFW ON
+      deleted: Apagado
       failed_to_execute: Falhou ao executar
       media:
         title: Média
@@ -466,6 +533,24 @@ pt-PT:
       no_status_selected: Nenhum estado foi alterado porque nenhum foi selecionado
       title: Estado das contas
       with_media: Com media
+    tags:
+      accounts_today: Usos únicos hoje
+      accounts_week: Usos únicos desta semana
+      breakdown: Descrição do consumo atual por fonte
+      context: Contexto
+      directory: No diretório
+      in_directory: "%{count} no diretório"
+      last_active: Última actividade
+      most_popular: Mais popular
+      most_recent: Mais recente
+      name: Hashtag
+      review: Estado da revisão
+      reviewed: Revista
+      title: Hashtags
+      trending_right_now: Tendências agora
+      unique_uses_today: "%{count} publicando hoje"
+      unreviewed: Não revista
+      updated_msg: Definições de hashtags actualizadas com sucesso
     title: Administração
     warning_presets:
       add_new: Adicionar novo
@@ -474,12 +559,37 @@ pt-PT:
       edit_preset: Editar o aviso predefinido
       title: Gerir os avisos predefinidos
   admin_mailer:
+    new_pending_account:
+      body: Em baixo, estão os detalhes da nova conta. Pode aprovar ou rejeitar esta inscrição.
+      subject: Nova conta para revisão em %{instance} (%{username})
     new_report:
       body: "%{reporter} relatou %{target}"
       body_remote: Alguém de %{domain} relatou %{target}
       subject: Novo relatório sobre %{instance} (#%{id})
+    new_trending_tag:
+      body: 'A hashtag #%{name} está hoje a destacar-se, mas não foi anteriormente revista. Ela não será exibida publicamente a menos que você o permita, ou limite-se a salvar o formulário tal como está, para nunca mais ouvir falar dela.'
+      subject: Nova hashtag para revisão em %{instance} (#%{name})
+  aliases:
+    add_new: Criar pseudónimo
+    created_msg: Criou com sucesso um novo pseudónimo. Pode agora iniciar a migração da conta antiga.
+    deleted_msg: Removido o pseudónimo com sucesso. Migrar dessa conta para esta não será mais possível.
+    hint_html: Se quiser mudar de outra conta para esta, pode criar aqui um pseudónimo, que é necessário antes de poder prosseguir com a migração de seguidores da conta antiga para esta. Esta ação por si só é <strong>inofensiva e reversível</strong>. <strong>A migração da conta é iniciada a partir da conta antiga</strong>.
+    remove: Desvincular pseudónimo
+  appearance:
+    advanced_web_interface: Interface web avançada
+    advanced_web_interface_hint: 'Se quiser utilizar toda a largura do seu ecrã, a interface web avançada permite-lhe configurar várias colunas diferentes para ver tanta informação ao mesmo tempo quanto quiser: Página inicial, notificações, cronologia federada, qualquer número de listas e hashtags.'
+    animations_and_accessibility: Animações e acessibilidade
+    confirmation_dialogs: Caixas de confirmação
+    discovery: Descobrir
+    localization:
+      body: Mastodon é traduzido por voluntários.
+      guide_link: https://crowdin.com/project/mastodon/pt-PT
+      guide_link_text: Todos podem contribuir.
+    sensitive_content: Conteúdo sensível
+    toot_layout: Disposição do Toot
   application_mailer:
     notification_preferences: Alterar preferências de e-mail
+    salutation: "%{name},"
     settings: 'Alterar preferências de email: %{link}'
     view: 'Ver:'
     view_profile: Ver perfil
@@ -493,9 +603,16 @@ pt-PT:
     warning: Cuidado com estes dados. Não partilhar com ninguém!
     your_token: O teu token de acesso
   auth:
+    apply_for_account: Solicitar um convite
     change_password: Palavra-passe
+    checkbox_agreement_html: Concordo com as <a href="%{rules_path}" target="_blank">regras do servidor</a> e com os <a href="%{terms_path}" target="_blank">termos de serviço</a>
+    checkbox_agreement_without_rules_html: Concordo com os <a href="%{terms_path}" target="_blank">termos do serviço</a>
     delete_account: Eliminar conta
     delete_account_html: Se desejas eliminar a conta, podes <a href="%{path}">continua aqui</a>. Uma confirmação será pedida.
+    description:
+      prefix_invited_by_user: "@%{name} convidou-o a juntar-se a este servidor do Mastodon!"
+      prefix_sign_up: Inscreva-se hoje no Mastodon!
+      suffix: Com uma conta, poderá seguir pessoas, publicar atualizações e trocar mensagens com utilizadores de qualquer servidor Mastodon e muito mais!
     didnt_get_confirmation: Não recebeu o email de confirmação?
     forgot_password: Esqueceste a palavra-passe?
     invalid_reset_password_token: Token de modificação da palavra-passe é inválido ou expirou. Por favor, solicita um novo.
@@ -504,11 +621,26 @@ pt-PT:
     migrate_account: Mudar para uma conta diferente
     migrate_account_html: Se desejas redirecionar esta conta para uma outra podes<a href="%{path}">configurar isso aqui</a>.
     or_log_in_with: Ou iniciar sessão com
+    providers:
+      cas: CAS
+      saml: SAML
     register: Registar
+    registration_closed: "%{instance} não está a aceitar novos membros"
     resend_confirmation: Reenviar instruções de confirmação
     reset_password: Criar nova palavra-passe
     security: Alterar palavra-passe
     set_new_password: Editar palavra-passe
+    setup:
+      email_below_hint_html: Se o endereço de e-mail abaixo estiver incorreto, pode alterá-lo aqui e receber um novo e-mail de confirmação.
+      email_settings_hint_html: O e-mail de confirmação foi enviado para %{email}. Se esse endereço de e-mail não estiver correcto, pode alterá-lo nas definições da conta.
+      title: Configuração
+    status:
+      account_status: Estado da conta
+      confirming: A aguardar que conclua a confirmação do e-mail.
+      functional: A sua conta está totalmente operacional.
+      pending: A sua inscrição está pendente de revisão pela nossa equipa. Isso pode demorar algum tempo. Receberá um e-mail se a sua conta for aprovada.
+      redirecting_to: A sua conta está inativa porque está atualmente a ser redirecionada para %{acct}.
+    trouble_logging_in: Problemas em iniciar sessão?
   authorize_follow:
     already_following: Tu já estás a seguir esta conta
     error: Infelizmente, ocorreu um erro ao buscar a conta remota
@@ -520,8 +652,14 @@ pt-PT:
       return: Voltar ao perfil do utilizador
       web: Voltar à página inicial
     title: Seguir %{acct}
+  challenge:
+    confirm: Continuar
+    hint_html: "<strong>Dica:</strong> Não vamos pedir novamente a sua senha durante a próxima hora."
+    invalid_password: Senha inválida
+    prompt: Confirme a sua senha para continuar
   datetime:
     distance_in_words:
+      about_x_hours: "%{count}h"
       about_x_months: "%{count} meses"
       about_x_years: "%{count} anos"
       almost_x_years: "%{count} anos"
@@ -534,18 +672,33 @@ pt-PT:
       x_months: "%{count} meses"
       x_seconds: "%{count} segundos"
   deletes:
+    challenge_not_passed: A informação que introduziu não estava correta
     confirm_password: Introduz a palavra-passe atual para verificar a tua identidade
+    confirm_username: Introduza o seu nome de utilizador para confirmar o procedimento
     proceed: Eliminar conta
     success_msg: A tua conta foi eliminada com sucesso
+    warning:
+      before: 'Antes de continuar, por favor leia cuidadosamente estas notas:'
+      caches: O conteúdo que foi armazenado em cache por outros servidores pode persistir
+      data_removal: As suas publicações e outros dados serão removidos permanentemente
+      email_change_html: Pode <a href="%{path}">alterar o seu endereço de e-mail</a> sem eliminar a sua conta
+      email_contact_html: Se ainda não chegou, pode enviar um e-mail a <a href="mailto:%{email}">%{email}</a> para obter ajuda
+      email_reconfirmation_html: Se não recebeu o e-mail de confirmação, pode <a href="%{path}">pedi-lo novamente</a>
+      irreversible: Não será possível restaurar ou reativar sua conta
+      more_details_html: Para mais detalhes, leia a <a href="%{terms_path}">política de privacidade</a>.
+      username_available: O seu nome de utilizador ficará novamente disponível
+      username_unavailable: O seu nome de utilizador permanecerá indisponível
   directories:
     directory: Dirétorio de perfil
     explanation: Descobre utilizadores com base nos seus interesses
     explore_mastodon: Explorar %{title}
+  domain_validator:
+    invalid_domain: não é um nome de domínio válido
   errors:
-    '400': The request you submitted was invalid or malformed.
+    '400': O pedido que submeteu foi inválido ou mal formulado.
     '403': Não tens a permissão necessária para ver esta página.
     '404': A página que estás a procurar não existe.
-    '406': This page is not available in the requested format.
+    '406': Esta página não está disponível no formato solicitado.
     '410': A página que estás a procurar não existe mais.
     '422':
       content: "A verificação de segurança falhou. \nDesativaste o uso de cookies?"
@@ -554,8 +707,11 @@ pt-PT:
     '500':
       content: Desculpe, mas algo correu mal.
       title: Esta página não está correta
-    '503': The page could not be served due to a temporary server failure.
+    '503': A página não pôde ser apresentada devido a uma falha temporária do servidor.
     noscript_html: Para usar o aplicativo web do Mastodon, por favor ativa o JavaScript. Alternativamente, experimenta um dos <a href="%{apps_path}">apps nativos</a> para o Mastodon na sua plataforma.
+  existing_username_validator:
+    not_found: não foi possível encontrar um utilizador local com esse nome
+    not_found_multiple: não foi possível encontrar %{usernames}
   exports:
     archive_takeout:
       date: Data
@@ -565,8 +721,8 @@ pt-PT:
       request: Pede o teu arquivo
       size: Tamanho
     blocks: Bloqueaste
+    csv: CSV
     domain_blocks: Bloqueios de domínio
-    follows: Segues
     lists: Listas
     mutes: Tens em silêncio
     storage: Armazenamento de média
@@ -574,8 +730,10 @@ pt-PT:
     add_new: Adicionar nova
     errors:
       limit: Já atingiste o limite máximo de hashtags
+    hint_html: "<strong>O que são hashtags em destaque?</strong> Elas são exibidas de forma bem visível no seu perfil público e permitem que as pessoas consultem as suas publicações públicas especificamente sob essas hashtags. São uma ótima ferramenta para manter o controlo de trabalhos criativos ou projetos de longo prazo."
   filters:
     contexts:
+      account: Perfis
       home: Cronologia inicial
       notifications: Notificações
       public: Cronologias públicas
@@ -587,6 +745,7 @@ pt-PT:
       invalid_irreversible: Filtragem irreversível só funciona no contexto das notificações ou do início
     index:
       delete: Apagar
+      empty: Não tem filtros.
       title: Filtros
     new:
       title: Adicionar novo filtro
@@ -594,13 +753,37 @@ pt-PT:
     developers: Responsáveis pelo desenvolvimento
     more: Mais…
     resources: Recursos
+    trending_now: Tendências atuais
   generic:
+    all: Tudo
     changes_saved_msg: Alterações guardadas!
     copy: Copiar
+    no_batch_actions_available: Nenhuma ação em lote disponível nesta página
+    order_by: Ordenar por
     save_changes: Guardar alterações
     validation_errors:
       one: Algo não está correcto. Por favor vê o erro abaixo
       other: Algo não está correto. Por favor vê os %{count} erros abaixo
+  html_validator:
+    invalid_markup: 'contém marcação HTML inválida: %{error}'
+  identity_proofs:
+    active: Ativo
+    authorize: Sim, autorizar
+    authorize_connection_prompt: Autorizar esta conexão criptográfica?
+    errors:
+      failed: A conexão criptográfica falhou. Por favor, tente novamente a partir de %{provider}.
+      keybase:
+        invalid_token: Os tokens Keybase são hashes de assinaturas e devem conter 66 caracteres hexadecimais
+        verification_failed: O Keybase não reconhece este token como uma assinatura do utilizador do Keybase %{kb_username}. Por favor, tente novamente a partir do Keybase.
+      wrong_user: Não é possível criar uma prova para %{proving} enquanto estiver conetado como %{current}. Inicie sessão como %{proving} e tente novamente.
+    explanation_html: Aqui pode conetar criptograficamente as suas outras identidades, tais como um perfil Keybase. Isto permite que outras pessoas lhe enviem mensagens encriptadas e confiar em conteúdo que você lhes envia.
+    i_am_html: Sou %{username} em %{service}.
+    identity: Identidade
+    inactive: Inativo
+    publicize_checkbox: 'E publique isso:'
+    publicize_toot: 'Está provado! Eu sou %{username} em %{service}: %{url}'
+    status: Estado da verificação
+    view_proof: Ver prova
   imports:
     modes:
       merge: Juntar
@@ -647,6 +830,34 @@ pt-PT:
       too_many: Não é possível anexar mais de 4 arquivos
   migrations:
     acct: username@domain da nova conta
+    cancel: Cancelar redirecionamento
+    cancel_explanation: Cancelar o redirecionamento irá reativar a sua conta atual, mas não trará de volta os seguidores que foram migrados para essa conta.
+    cancelled_msg: Cancelou com sucesso o redireccionamento.
+    errors:
+      already_moved: é a mesma conta para a qual já migrou
+      missing_also_known_as: não está a referenciar esta conta
+      move_to_self: não pode ser conta atual
+      not_found: não pode ser encontrado
+      on_cooldown: Você está no período de espera
+    followers_count: Seguidores no momento da migração
+    incoming_migrations: A migrar de uma conta diferente
+    incoming_migrations_html: Para migrar de outra conta para esta, primeiro você precisa <a href="%{path}">criar um pseudónimo</a>.
+    moved_msg: A sua conta está agora a ser redireccionada para %{acct} e os seus seguidores estão a ser transferidos.
+    not_redirecting: A sua conta não está atualmente a ser redirecionada para nenhuma outra conta.
+    on_cooldown: Migrou recentemente a sua conta. Esta função ficará disponível novamente em %{count} dias.
+    past_migrations: Migrações anteriores
+    proceed_with_move: Migrar seguidores
+    redirecting_to: A sua conta está a ser redireccionada para %{acct}.
+    set_redirect: Definir redirecionamento
+    warning:
+      backreference_required: A nova conta deve primeiro ser configurada para que esta seja referenciada
+      before: 'Antes de continuar, leia cuidadosamente estas notas:'
+      cooldown: Após a migração, há um período de tempo de espera durante o qual não poderá voltar a migrar
+      disabled_account: Posteriormente, a sua conta atual não será totalmente utilizável. No entanto, continuará a ter acesso à exportação de dados, bem como à reativação.
+      followers: Esta ação irá migrar todos os seguidores da conta atual para a nova conta
+      only_redirect_html: Em alternativa, pode <a href="%{path}">apenas colocar um redireccionamento no seu perfil</a>.
+      other_data: Nenhum outro dado será migrado automaticamente
+      redirect: O perfil da sua conta atual será atualizado com um aviso de redirecionamento e será excluído das pesquisas
   moderation:
     title: Moderação
   notification_mailer:
@@ -683,11 +894,26 @@ pt-PT:
       body: 'O teu post foi partilhado por %{name}:'
       subject: "%{name} partilhou o teu post"
       title: Nova partilha
+  notifications:
+    email_events: Eventos para notificações por e-mail
+    email_events_hint: 'Selecione os eventos para os quais deseja receber notificações:'
+    other_settings: Outras opções de notificações
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: MM
+          million: M
+          quadrillion: Q
+          thousand: mil
+          trillion: T
   pagination:
     newer: Mais nova
     next: Seguinte
     older: Mais velha
     prev: Anterior
+    truncate: "&hellip;"
   polls:
     errors:
       already_voted: Tu já votaste nesta sondagem
@@ -695,11 +921,30 @@ pt-PT:
       duration_too_long: está demasiado à frente no futuro
       duration_too_short: é demasiado cedo
       expired: A sondagem já terminou
+      invalid_choice: A opção de voto escolhida não existe
       over_character_limit: não pode ter mais do que %{max} caracteres cada um
       too_few_options: tem de ter mais do que um item
       too_many_options: não pode conter mais do que %{max} itens
   preferences:
     other: Outro
+    posting_defaults: Padrões de publicação
+    public_timelines: Cronologias públicas
+  relationships:
+    activity: Atividade da conta
+    dormant: Inativo
+    followers: Seguidores
+    following: A seguir
+    invited: Convidado
+    last_active: Última atividade
+    most_recent: Mais recente
+    moved: Mudou-se
+    mutual: Mútuo
+    primary: Primário
+    relationship: Relação
+    remove_selected_domains: Remover todos os seguidores dos domínios selecionados
+    remove_selected_followers: Remover seguidores selecionados
+    remove_selected_follows: Deixar de seguir os utilizadores selecionados
+    status: Estado da conta
   remote_follow:
     acct: Entre seu usuário@domínio do qual quer seguir
     missing_resource: Não foi possível achar a URL de redirecionamento para sua conta
@@ -725,19 +970,48 @@ pt-PT:
     activity: Última atividade
     browser: Navegador
     browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Electron
+      firefox: Firefox
       generic: Navegador desconhecido
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
       nokia: Navegador Nokia S40 Ovi
+      opera: Opera
       otter: Lontra
+      phantom_js: PhantomJS
+      qq: QQ Browser
+      safari: Safari
+      uc_browser: UCBrowser
+      weibo: Weibo
     current_session: Sessão atual
     description: "%{browser} em %{platform}"
     explanation: Estes são os navegadores que estão conectados com a tua conta do Mastodon.
+    ip: IP
     platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: ChromeOS
       firefox_os: SO Firefox
+      ios: iOS
+      linux: Linux
+      mac: Mac
       other: Plataforma desconhecida
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
     revoke: Revogar
     revoke_success: Sessão revogada com sucesso
     title: Sessões
   settings:
+    account: Conta
+    account_settings: Definições da conta
+    aliases: Pseudónimos da conta
+    appearance: Aspecto
     authorized_apps: Aplicativos autorizados
     back: Voltar ao Mastodon
     delete: Eliminação da conta
@@ -745,10 +1019,14 @@ pt-PT:
     edit_profile: Editar perfil
     export: Exportar dados
     featured_tags: Hashtags destacadas
+    identity_proofs: Provas de identidade
     import: Importar
+    import_and_export: Importar e exportar
     migrate: Migração de conta
     notifications: Notificações
     preferences: Preferências
+    profile: Perfil
+    relationships: Seguindo e seguidores
     two_factor_authentication: Autenticação em dois passos
   spam_check:
     spam_detected: Este é um relatório automatizado. Foi detectado spam.
@@ -775,12 +1053,16 @@ pt-PT:
       private: Post não-público não pode ser fixado
       reblog: Não podes fixar uma partilha
     poll:
+      total_people:
+        one: "%{count} pessoa"
+        other: "%{count} pessoas"
       total_votes:
         one: "%{count} voto"
         other: "%{count} votos"
       vote: Votar
     show_more: Mostrar mais
     sign_in_to_participate: Inicie a sessão para participar na conversa
+    title: '%{name}: "%{quote}"'
     visibilities:
       private: Mostrar apenas para seguidores
       private_long: Mostrar apenas para seguidores
@@ -792,6 +1074,8 @@ pt-PT:
     pinned: Toot fixado
     reblogged: partilhado
     sensitive_content: Conteúdo sensível
+  tags:
+    does_not_match_previous_name: não coincide com o nome anterior
   terms:
     body_html: |
       <h2>Política de privacidade</h2>
@@ -879,6 +1163,10 @@ pt-PT:
     contrast: Mastodon (Elevado contraste)
     default: Mastodon
     mastodon-light: Mastodon (Leve)
+  time:
+    formats:
+      default: "%H:%M em %d de %b de %Y"
+      month: "%b de %Y"
   two_factor_authentication:
     code_hint: Entre o código gerado pelo seu aplicativo para confirmar
     description_html: Se ativar a <strong>autenticação em dois passos</strong>, quando logar será necessário o seu telefone que vai gerar os tokens para validação.
@@ -905,7 +1193,9 @@ pt-PT:
         disable: Enquanto a tua conta está congelada, os seus dados permanecem intactos, mas tu não podes executar quaisquer acções até que ela seja desbloqueada.
         silence: Enquanto a tua conta estiver limitada, só pessoas que já estiveres a seguir irão ver as tuas publicações neste servidor e poderás ser excluído de várias listagens públicas. No entanto, outros ainda te poderão seguir de forma manual.
         suspend: A tua conta foi suspensa e todas as tuas publicações e os teus ficheiros de media foram irreversivelmente removidos deste servidor e dos servidores onde tinhas seguidores.
+      get_in_touch: Pode responder a este e-mail para entrar em contacto com a equipa de %{instance}.
       review_server_policies: Revê as políticas do servidor
+      statuses: 'Especificamente, para:'
       subject:
         disable: A tua conta %{acct} foi congelada
         none: Aviso para %{acct}
@@ -918,7 +1208,7 @@ pt-PT:
         suspend: Conta suspensa
     welcome:
       edit_profile_action: Configura o perfil
-      edit_profile_step: Tu podes personalizar o teu perfil por carregar um avatar, cabeçalho, alterar o teu nickname e mais. Se tu preferires rever os novos seguidores antes deles te poderem seguir, podes bloquear a tua conta.
+      edit_profile_step: Podes personalizar o teu perfil carregando uma imagem de perfil e de cabeçalho ou alterando o nome a exibir, entre outras opções. Se preferires rever os novos seguidores antes deles te poderem seguir, podes tornar a tua conta privada.
       explanation: Aqui estão algumas dicas para começares
       final_action: Começa a publicar
       final_step: 'Começa a publicar! Mesmo sem seguidores, as tuas mensagens públicas podem ser vistas por outros, por exemplo, na cronologia local e em hashtags. Tu podes querer apresentar-te na hashtag #introductions.'
diff --git a/config/locales/ro.yml b/config/locales/ro.yml
index 7deab6021..3dc2a944d 100644
--- a/config/locales/ro.yml
+++ b/config/locales/ro.yml
@@ -73,7 +73,6 @@ ro:
       request: Cere arhiva ta
       size: Dimensiune
     blocks: Blocați
-    follows: Tu urmărești
     mutes: Opriți
     storage: Depozitare media
   filters:
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 5c68ce4d4..47bd8e92e 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -1,7 +1,7 @@
 ---
 ru:
   about:
-    about_hashtag_html: Это публичные статусы, отмеченные хэштегом <strong>#%{hashtag}</strong>. Вы можете взаимодействовать с ними при наличии у Вас учётной записи в глобальной сети Mastodon.
+    about_hashtag_html: Это публичные посты, отмеченные хэштегом <strong>#%{hashtag}</strong>. Вы можете взаимодействовать с ними при наличии у Вас учётной записи в глобальной сети Mastodon.
     about_mastodon_html: 'Социальная сеть будущего: никакой рекламы, слежки корпорациями, этичный дизайн и децентрализация! С Mastodon ваши данные под вашим контролем.'
     about_this: Об этом узле
     active_count_after: активных
@@ -10,23 +10,23 @@ ru:
     api: API
     apps: Приложения
     apps_platforms: Используйте Mastodon на iOS, Android и других платформах
-    browse_directory: Изучайте каталог профилей и ищите по интересам
-    browse_local_posts: Просматривайте в реальном времени новые статусы с этого сервера
-    browse_public_posts: Просматривайте в реальном времени новые статусы в Mastodon
+    browse_directory: Изучите каталог и найдите профили по интересам
+    browse_local_posts: Просматривайте в реальном времени новые посты с этого сервера
+    browse_public_posts: Взгляните на новые посты Mastodon в реальном времени
     contact: Связаться
     contact_missing: не указан
     contact_unavailable: неизв.
-    discover_users: Находите пользователей
+    discover_users: Найдите пользователей
     documentation: Документация
     federation_hint_html: С учётной записью на %{instance} вы сможете подписываться на людей с любого сервера Mastodon и не только.
-    get_apps: Попробуйте мобильное приложение
-    hosted_on: Mastodon размещен на %{domain}
+    get_apps: Попробуйте мобильные приложения
+    hosted_on: Вы получили это сообщение, так как зарегистрированы на %{domain}
     instance_actor_flash: |
       Эта учетная запись является виртуальным персонажем, используемым для представления самого сервера, а не какого-либо пользователя.
       Используется для целей федерации и не должен быть заблокирован, если вы не хотите заблокировать всю инстанцию, вместо этого лучше использовать доменную блокировку.
     learn_more: Узнать больше
     privacy_policy: Политика конфиденциальности
-    see_whats_happening: Узнавайте, что происходит вокруг
+    see_whats_happening: Узнайте, что происходит вокруг
     server_stats: 'Статистика сервера:'
     source_code: Исходный код
     status_count_after:
@@ -42,9 +42,9 @@ ru:
       domain: Сервер
       reason: Причина
       rejecting_media: 'Медиафайлы с этих серверов не будут обработаны или сохранены. Их миниатюры не будут отображаться и вам придётся вручную нажимать на исходный файл:'
-      silenced: 'Сообщения с этих серверов будут скрыты в публичных лентах и обсуждениях, уведомления от ихпользователй также не будут призодить никому, кроме подписанных на них:'
+      silenced: 'Посты с этих серверов будут скрыты из публичных лент и обсуждений, как и не будут рассылаться уведомления касательно действий тамошних пользователей, если, конечно, вы не подписаны на них:'
       suspended: 'Обмен, хранение и обработка данных с этих серверов будут прекращены, что сделает невозможным взаимодействие или общение с пользователями с этих серверов:'
-    unavailable_content_html: Мастодон обычно позволяет просматривать контент с любого другого сервера и взаимодействовать с ними. Это исключения, сделанные на этом сервере.
+    unavailable_content_html: 'Mastodon в основном позволяет просматривать содержимое и взаимодействовать с другими пользователями любых серверов в федерации. Вот исключения, сделанные конкретно для этого сервера:'
     user_count_after:
       few: пользователя
       many: пользователей
@@ -76,16 +76,17 @@ ru:
     pin_errors:
       following: Чтобы порекомендовать кого-то, надо сначала на них подписаться
     posts:
-      few: статуса
+      few: поста
       many: статусов
-      one: статус
+      one: Пост
       other: статусов
-    posts_tab_heading: Статусы
+    posts_tab_heading: Посты
     posts_with_replies: Посты с ответами
     reserved_username: Имя пользователя зарезервировано
     roles:
       admin: Администратор
       bot: Бот
+      group: Группа
       moderator: Модератор
     unavailable: Профиль недоступен
     unfollow: Отписаться
@@ -116,7 +117,7 @@ ru:
       confirming: Подтверждение
       deleted: Удалён
       demote: Разжаловать
-      disable: Отключить
+      disable: Заморозка
       disable_two_factor_authentication: Отключить 2FA
       disabled: Отключено
       display_name: Отображаемое имя
@@ -139,23 +140,23 @@ ru:
         remote: Удаленные
         title: Размещение
       login_status: Статус учётной записи
-      media_attachments: Мультимедийные вложения
-      memorialize: Превратить в Памятник
+      media_attachments: Файлы мультимедиа
+      memorialize: Сделать мемориалом
       moderation:
         active: Действующие
         all: Все
         pending: В ожидании
-        silenced: Заглушенные
+        silenced: Скрытые
         suspended: Заблокированные
         title: Модерация
       moderation_notes: Заметки модератора
       most_recent_activity: Последняя активность
       most_recent_ip: Последний IP
-      no_account_selected: Ничего не выбрано, никакие учётные записи не изменены
+      no_account_selected: Ничего не изменилось, так как ни одна учётная запись не была выделена
       no_limits_imposed: Без ограничений
       not_subscribed: Не подписаны
       pending: Ожидает рассмотрения
-      perform_full_suspension: Полная блокировка
+      perform_full_suspension: Блокировка
       promote: Повысить
       protocol: Протокол
       public: Публичный
@@ -164,7 +165,7 @@ ru:
       reject: Отклонить
       reject_all: Отклонить все
       remove_avatar: Удалить аватар
-      remove_header: Удалить шапку
+      remove_header: Убрать шапку
       resend_confirmation:
         already_confirmed: Этот пользователь уже подтвержден
         send: Повторно отправить подтверждение по электронной почте
@@ -184,57 +185,71 @@ ru:
       show:
         created_reports: Жалобы, отправленные с этой учётной записи
         targeted_reports: Жалобы на эту учётную запись
-      silence: Заглушить
+      silence: Скрытие
       silenced: Заглушен
-      statuses: Статусы
+      statuses: Посты
       subscribe: Подписаться
       suspended: Заморожен
       time_in_queue: Ожидание в очереди %{time}
       title: Учётные записи
       unconfirmed_email: Неподтверждённый e-mail
-      undo_silenced: Снять глушение
+      undo_silenced: Отменить скрытие
       undo_suspension: Снять блокировку
       unsubscribe: Отписаться
       username: Имя пользователя
-      warn: Предупредить
+      warn: Предупреждение
       web: Веб
       whitelisted: В белом списке
     action_logs:
       actions:
-        assigned_to_self_report: "%{name} назначил(а) жалобу %{target} на себя"
+        assigned_to_self_report: "%{name} назначил(а) себя для решения жалобы %{target}"
         change_email_user: "%{name} сменил(а) e-mail пользователя %{target}"
         confirm_user: "%{name} подтвердил(а) e-mail адрес пользователя %{target}"
-        create_account_warning: "%{name} отправил(а) предупреждение для %{target}"
+        create_account_warning: "%{name} выдал(а) предупреждение %{target}"
+        create_announcement: "%{name} содал новое объявление %{target}"
         create_custom_emoji: "%{name} загрузил(а) новый эмодзи %{target}"
-        create_domain_allow: "%{name} внёс домен %{target} в белый список"
+        create_domain_allow: "%{name} внес(ла) домен %{target} в белый список"
         create_domain_block: "%{name} заблокировал(а) домен %{target}"
         create_email_domain_block: "%{name} добавил(а) e-mail домен %{target} в чёрный список"
         demote_user: "%{name} разжаловал(а) пользователя %{target}"
-        destroy_custom_emoji: "%{name} удалил(а) эмодзи %{target}"
+        destroy_announcement: "%{name} удалил объявление %{target}"
+        destroy_custom_emoji: "%{name} измельчил(а) эмодзи %{target} в пыль"
         destroy_domain_allow: "%{name} убрал домен %{target} из белого списка"
         destroy_domain_block: "%{name} разблокировал(а) домен %{target}"
         destroy_email_domain_block: "%{name} добавил(а) e-mail домен %{target} в белый список"
-        destroy_status: "%{name} удалил(а) статус пользователя %{target}"
+        destroy_status: "%{name} удалил(а) пост пользователя %{target}"
         disable_2fa_user: "%{name} отключил(а) двухэтапную авторизацию у пользователя %{target}"
         disable_custom_emoji: "%{name} отключил(а) эмодзи %{target}"
-        disable_user: "%{name} запретил(а) вход пользователя %{target}"
+        disable_user: "%{name} заморозил(а) пользователя %{target}"
         enable_custom_emoji: "%{name} включил(а) эмодзи %{target}"
-        enable_user: "%{name} включил(а) вход пользователя %{target}"
+        enable_user: "%{name} разморозил(а) пользователя %{target}"
         memorialize_account: "%{name} перевел(а) учётную запись пользователя %{target} в режим памятника"
         promote_user: "%{name} повысил(а) пользователя %{target}"
-        remove_avatar_user: "%{name} удалил(а) аватар пользователя %{target}"
+        remove_avatar_user: "%{name} убрал(а) аватарку пользователя %{target}"
         reopen_report: "%{name} переоткрыл(а) жалобу %{target}"
         reset_password_user: "%{name} сбросил(а) пароль пользователя %{target}"
         resolve_report: "%{name} решил(а) жалобу %{target}"
-        silence_account: "%{name} заглушил(а) учётную запись %{target}"
-        suspend_account: "%{name} заморозил(а) учётную запись %{target}"
+        silence_account: "%{name} наложил(а) ограничения на видимость постов учётной записи %{target}"
+        suspend_account: "%{name} заблокировал(а) учётную запись %{target}"
         unassigned_report: "%{name} сняла назначение жалобы %{target}"
-        unsilence_account: "%{name} снял(а) глушение учётной записи %{target}"
-        unsuspend_account: "%{name} разморозил(а) учётную запись %{target}"
+        unsilence_account: "%{name} снял ограничения видимости постов пользователя %{target}"
+        unsuspend_account: "%{name} снял(а) блокировку с пользователя %{target}"
+        update_announcement: "%{name} обновил объявление %{target}"
         update_custom_emoji: "%{name} обновил(а) эмодзи %{target}"
-        update_status: "%{name} изменил(а) статус пользователя %{target}"
-      deleted_status: "(удалённый статус)"
+        update_status: "%{name} изменил(а) пост пользователя %{target}"
+      deleted_status: "(удалённый пост)"
       title: Журнал событий
+    announcements:
+      edit:
+        title: Редактировать объявление
+      empty: Объявления не найдены.
+      live: В эфире
+      new:
+        create: Создать объявление
+        title: Новое объявление
+      published: Опубликованные
+      time_range: Временной диапазон
+      title: Объявления
     custom_emojis:
       assign_category: Задать категорию
       by_domain: Домен
@@ -260,7 +275,7 @@ ru:
       overwrite: Заменить
       shortcode: Шорткод
       shortcode_hint: Как минимум 2 символа, только алфавитно-цифровые символы и подчеркивания
-      title: Особенные эмодзи
+      title: Эмодзи
       uncategorized: Вне категорий
       unlist: Убрать
       unlisted: Не в списке
@@ -311,24 +326,29 @@ ru:
         create: Создать блокировку
         hint: Блокировка домена не предотвратит создание новых учётных записей в базе данных, но ретроактивно и автоматически применит указанные методы модерации для этих учётных записей.
         severity:
-          desc_html: "<strong>Глушение</strong> сделает статусы учётной записи невидимыми для всех, кроме их подписчиков. <strong>Блокировка</strong> удалит весь контент учётной записи, включая мультимедийные вложения и данные профиля. Используйте <strong>Ничего</strong>, если хотите только запретить медиаконтент."
+          desc_html: |-
+            Используйте <strong>скрытие</strong> для того, чтобы публикуемые пользователями посты перестали быть видимыми для всех, кроме их подписчиков.<br>
+            <br>
+            <strong>Блокировка</strong> удалит весь локальный контент учётных записей с этого домена, включая мультимедийные вложения и данные профилей.<br>
+            <br>
+            <strong>Ничего</strong> же попросту скроет медиаконтент с домена.
           noop: Ничего
-          silence: Глушение
+          silence: Скрытие
           suspend: Блокировка
-        title: Новая доменная блокировка
+        title: Новая блокировка e-mail домена
       private_comment: Приватный комментарий
       private_comment_hint: Комментарий к доменной блокировке для внутреннего использования модераторами.
       public_comment: Публичный комментарий
       public_comment_hint: Комментарий к этой доменной блокировке для широкой публики, если включена публикация списка блокировок.
-      reject_media: Запретить медиаконтент
+      reject_media: Запретить загрузку медиафайлов
       reject_media_hint: Удаляет локально хранимый медиаконтент и запрещает его загрузку в будущем. Не имеет значения в случае блокировки.
       reject_reports: Отклонять жалобы
       reject_reports_hint: Игнорировать все жалобы с этого домена. Не имеет значения в случае блокировки.
       rejecting_media: отклонение медиафайлов
       rejecting_reports: отклонение жалоб
       severity:
-        silence: заглушен
-        suspend: заморожен
+        silence: скрывается
+        suspend: заблокирован
       show:
         affected_accounts:
           few: "%{count} учетных записей в базе данных затронуты"
@@ -336,7 +356,7 @@ ru:
           one: Влияет на одну учётную запись в базе данных
           other: "%{count} учетных записей в базе данных затронуты"
         retroactive:
-          silence: Снять глушение со всех существующих учётных записей этого домена
+          silence: Убрать скрытие постов учётных записей с этого узла
           suspend: Снять блокировку со всех существующих учётных записей этого домена
         title: Снять блокировку с домена %{domain}
         undo: Отменить
@@ -344,17 +364,15 @@ ru:
       view: Посмотреть доменные блокировки
     email_domain_blocks:
       add_new: Добавить новую
-      created_msg: Доменная блокировка еmail успешно создана
+      created_msg: E-mail домен внесён в список блокировки
       delete: Удалить
-      destroyed_msg: Доменная блокировка еmail успешно удалена
+      destroyed_msg: Домен убран из списка e-mail блокировки
       domain: Домен
+      empty: Никакие e-mail домены не блокируются.
       new:
         create: Создать блокировку
-        title: Новая доменная блокировка еmail
-      title: Доменная блокировка email
-    followers:
-      back_to_account: Вернуться к учётной записи
-      title: Подписчики пользователя %{acct}
+        title: Новая блокировка по домену
+      title: Блокировка e-mail доменов
     instances:
       by_domain: Домен
       delivery_available: Доставка возможна
@@ -369,7 +387,7 @@ ru:
         title: Модерация
       private_comment: Приватный комментарий
       public_comment: Публичный комментарий
-      title: Известные узлы
+      title: Федерация
       total_blocked_by_us: Заблокировано нами
       total_followed_by_them: Их подписчиков
       total_followed_by_us: Наших подписчиков
@@ -385,14 +403,16 @@ ru:
       title: Приглашения
     pending_accounts:
       title: Ожидающие учетные записи (%{count})
+    relationships:
+      title: Связи %{acct}
     relays:
       add_new: Добавить ретранслятор
       delete: Удалить
-      description_html: "<strong>Федеративный ретранслятор</strong> – это промежуточный сервер, который передаёт большие объёмы публичных статусов между серверами, которые подписываются и публикуют туда. <strong>Это может помочь небольшим и средним серверам находить записи со всей федерации</strong>, ведь в противном случае пользователям нужно будет вручную подписываться на людей с удалённых узлов."
+      description_html: "<strong>Федеративный ретранслятор</strong> – это промежуточный сервер, который передаёт большие объёмы публичных постов между серверами, которые подписываются и публикуют туда. <strong>Это может помочь небольшим и средним серверам находить записи со всей федерации</strong>, ведь в противном случае пользователям нужно будет вручную подписываться на людей с удалённых узлов."
       disable: Отключить
       disabled: Отключено
       enable: Включить
-      enable_hint: Если включено, ваш сервер будет подписан на все публичные статусы с этого ретранслятора и начнёт туда отправлять публичные статусы со своего узла.
+      enable_hint: Если включено, ваш сервер будет подписан на все публичные посты с этого ретранслятора и начнёт туда отправлять публичные посты со своего узла.
       enabled: Включено
       inbox_url: URL ретранслятора
       pending: Ожидание подтверждения ретранслятора
@@ -405,15 +425,27 @@ ru:
       created_msg: Примечание жалобы создано!
       destroyed_msg: Примечание жалобы удалено!
     reports:
+      account:
+        notes:
+          few: "%{count} заметки"
+          many: "%{count} заметок"
+          one: "%{count} заметка"
+          other: "%{count} заметки"
+        reports:
+          few: "%{count} жалобы"
+          many: "%{count} жалоб"
+          one: "%{count} жалоба"
+          other: "%{count} жалобы"
       action_taken_by: 'Действие предпринято:'
       are_you_sure: Вы уверены?
       assign_to_self: Назначить себе
       assigned: Назначенный модератор
+      by_target_domain: Домен объекта жалобы
       comment:
         none: Нет
-      created_at: Создано
-      mark_as_resolved: Отметить как разрешенную
-      mark_as_unresolved: Отметить как неразрешённую
+      created_at: Создана
+      mark_as_resolved: Отметить как решённую
+      mark_as_unresolved: Отметить как нерешённую
       notes:
         create: Добавить заметку
         create_and_resolve: Разрешить с примечанием
@@ -421,19 +453,19 @@ ru:
         delete: Удалить
         placeholder: Опишите, какие действия были приняты, или любые другие подробности…
       reopen: Переоткрыть жалобу
-      report: 'Жалоба #%{id}'
+      report: Жалоба №%{id}
       reported_account: Учётная запись нарушителя
       reported_by: Отправитель жалобы
-      resolved: Разрешенные
-      resolved_msg: Жалоба успешно обработана!
+      resolved: Решённые
+      resolved_msg: Жалоба обработана, спасибо!
       status: Статус
       title: Жалобы
       unassign: Снять назначение
-      unresolved: Неразрешенные
+      unresolved: Нерешённые
       updated_at: Обновлена
     settings:
       activity_api_enabled:
-        desc_html: Подсчёт количества локальных статусов, активных пользователей и новых регистраций на еженедельной основе
+        desc_html: Подсчёт количества локальных постов, активных пользователей и новых регистраций на еженедельной основе
         title: Публикация агрегированной статистики активности пользователей
       bootstrap_timeline_accounts:
         desc_html: Разделяйте имена пользователей запятыми. Сработает только для локальных незакрытых учётных записей. По умолчанию включены все локальные администраторы.
@@ -454,6 +486,8 @@ ru:
         users: Залогиненным локальным пользователям
       domain_blocks_rationale:
         title: Показать обоснование
+      enable_bootstrap_timeline_accounts:
+        title: Включить подписки по умолчанию для новых пользователей
       hero:
         desc_html: Отображается на главной странице. Рекомендуется разрешение не менее 600х100px. Если не установлено, используется изображение узла
         title: Баннер узла
@@ -464,8 +498,8 @@ ru:
         desc_html: Домены, которые были замечены этим узлом среди всей федерации
         title: Публикация списка обнаруженных узлов
       preview_sensitive_media:
-        desc_html: Предпросмотр ссылок с остальных веб-сайтов будет показан даже если медиаконтент отмечен как чувствительный
-        title: Показывать чувствительный медиаконтент в предпросмотре OpenGraph
+        desc_html: Предпросмотр для ссылок будет отображать миниатюры даже для содержимого, помеченного как деликатное
+        title: Показывать деликатные медиафайлы в превью OpenGraph
       profile_directory:
         desc_html: Позволять находить пользователей
         title: Включить каталог профилей
@@ -487,7 +521,7 @@ ru:
         title: Режим регистраций
       show_known_fediverse_at_about_page:
         desc_html: Если включено, показывает посты со всех известных узлов в предпросмотре ленты. В противном случае отображаются только локальные посты.
-        title: Показывать известные узлы в предпросмотре ленты
+        title: Показывать контент со всей федерации в публичной ленте неавторизованным пользователям
       show_staff_badge:
         desc_html: Показывать метку персонала на странице пользователя
         title: Показывать метку персонала
@@ -524,16 +558,16 @@ ru:
       back_to_account: Назад к учётной записи
       batch:
         delete: Удалить
-        nsfw_off: Выключить NSFW
-        nsfw_on: Включить NSFW
+        nsfw_off: Снять отметку «деликатного»
+        nsfw_on: Отметить как «деликатное»
       deleted: Удалено
       failed_to_execute: Не удалось выполнить
       media:
-        title: Медиаконтент
-      no_media: Без медиаконтента
-      no_status_selected: Не выбран ни один статус, ничего не изменено
-      title: Статусы учётной записи
-      with_media: С медиаконтентом
+        title: Файлы мультимедиа
+      no_media: Без файлов
+      no_status_selected: Ничего не изменилось, так как ни один пост не был выделен
+      title: Посты пользователя
+      with_media: С файлами
     tags:
       accounts_today: Уникальных использований за сегодня
       accounts_week: Уникальных использований за эту неделю
@@ -566,15 +600,15 @@ ru:
     new_report:
       body: "%{reporter} подал(а) жалобу на %{target}"
       body_remote: Кто-то с узла %{domain} пожаловался на %{target}
-      subject: Новая жалоба, узел %{instance} (#%{id})
+      subject: Новая жалоба, узел %{instance} (№%{id})
     new_trending_tag:
       body: 'Хэштег #%{name} актуален сегодня, но не был проверен. Он не будет отображаться публично, если вы не одобрите его, или просто сохраните эту форму как есть, чтоб никогда больше о нём не слышать.'
       subject: Новый хэштег для проверки на %{instance} (#%{name})
   aliases:
     add_new: Создать псевдоним
-    created_msg: Успешно создан новый псевдоним. Теперь вы можете начать миграцию со старой учетной записи.
+    created_msg: Новый псевдоним установлен. Теперь мы можете начать миграцию со старой учётной записи.
     deleted_msg: Псевдоним успешно удалён. Миграция старой учётной записи в текущую более невозможна.
-    hint_html: Если вы хотите мигрировать с другой учётной записи в эту, здесь вы можете создать псевдоним, который требуется, прежде чем вы можете начать перенос подписок со старой учётной записи сюда. Это действие само по себе <strong>безвредно и обратимо</strong>. <strong>Миграция учётной записи начинается со старой учётной записи</strong>.
+    hint_html: Если вы собираетесь мигрировать с другой учётной записи на эту, вы можете настроить псевдоним, что требуется для переноса подписчиков со старой учётной записи. Это действие само по себе <strong>безвредно и обратимо</strong>. <strong>Миграция учётной записи начинается со старой учётной записи</strong>.
     remove: Отвязать псевдоним
   appearance:
     advanced_web_interface: Многоколоночный интерфейс
@@ -582,15 +616,19 @@ ru:
     animations_and_accessibility: Анимации и доступность
     confirmation_dialogs: Окна подтверждений
     discovery: Обзор
-    sensitive_content: Чувствительное содержимое
+    localization:
+      body: Mastodon переводится добровольцами.
+      guide_link: https://sasha-sorokin.gitlab.io/mastodon-ru/
+      guide_link_text: Каждый может внести свой вклад.
+    sensitive_content: Деликатное содержимое
     toot_layout: Структура постов
   application_mailer:
-    notification_preferences: Изменить настройки e-mail
+    notification_preferences: Настроить уведомления можно здесь
     salutation: "%{name},"
-    settings: 'Изменить настройки e-mail: %{link}'
+    settings: 'Настроить уведомления можно здесь: %{link}'
     view: 'Просмотр:'
     view_profile: Просмотреть профиль
-    view_status: Просмотреть статус
+    view_status: Просмотреть пост
   applications:
     created: Приложение успешно создано
     destroyed: Приложение успешно удалено
@@ -605,7 +643,7 @@ ru:
     checkbox_agreement_html: Я соглашаюсь с <a href="%{rules_path}" target="_blank">правилами сервера</a> и <a href="%{terms_path}" target="_blank">Условиями использования</a>
     checkbox_agreement_without_rules_html: Я согласен с <a href="%{terms_path}" target="_blank">условиями использования</a>
     delete_account: Удалить учётную запись
-    delete_account_html: Если Вы хотите удалить свою учётную запись, вы можете <a href="%{path}">перейти сюда</a>. У Вас будет запрошено подтверждение.
+    delete_account_html: Удалить свою учётную запись <a href="%{path}">можно в два счёта здесь</a>, но прежде у вас будет спрошено подтверждение.
     description:
       prefix_invited_by_user: "@%{name} приглашает вас присоединиться к этому узлу Mastodon."
       prefix_sign_up: Зарегистрируйтесь в Mastodon уже сегодня!
@@ -615,8 +653,8 @@ ru:
     invalid_reset_password_token: Токен сброса пароля неверен или устарел. Пожалуйста, запросите новый.
     login: Войти
     logout: Выйти
-    migrate_account: Перенести учётную запись
-    migrate_account_html: Если вы хотите перенаправить подписчиков на другую учётную запись, это можно <a href="%{path}">настроить здесь</a>.
+    migrate_account: Перенос учётной записи
+    migrate_account_html: Завели новую учётную запись? Перенаправьте подписчиков на неё — <a href="%{path}">настройте перенаправление тут</a>.
     or_log_in_with: Или войти с помощью
     providers:
       cas: CAS
@@ -647,13 +685,16 @@ ru:
     post_follow:
       close: Или просто закрыть это окно.
       return: Вернуться к профилю пользователя
-      web: Перейти к WWW
+      web: Открыть в веб-версии
     title: Подписаться на %{acct}
   challenge:
     confirm: Продолжить
     hint_html: "<strong>Подсказка</strong>: мы не будем спрашивать пароль повторно в течение часа."
     invalid_password: Неверный пароль
     prompt: Введите пароль для продолжения
+  date:
+    formats:
+      default: "%d %b %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}ч"
@@ -670,21 +711,21 @@ ru:
       x_seconds: "%{count}сек"
   deletes:
     challenge_not_passed: Введённая вами информация некорректна
-    confirm_password: Введите текущий пароль для подтверждения Вашей личности
-    confirm_username: Введите свой юзернейм для подтверждения
+    confirm_password: Введите свой пароль, чтобы подтвердить, что вы — это вы, и никто другой
+    confirm_username: Введите своё имя пользователя для подтверждения
     proceed: Удалить учётную запись
     success_msg: Ваша учётная запись была успешно удалена
     warning:
       before: 'Внимательно прочитайте следующую информацию перед началом:'
-      caches: Содержимое, которое было закэшировано другими серверами, может сохраниться
-      data_removal: Ваши записи и прочие данные будут безвозвратно удалены
+      caches: Некоторые данные, обработанные другими узлами, однако, могут храниться ещё какое-то время
+      data_removal: Все ваши золотые посты, шикарный профиль и прочие данные будут безвозвратно уничтожены
       email_change_html: <a href="%{path}">Поменять свой e-mail</a> можно не удаляя учётной записи
       email_contact_html: Если письмо не приходит, обратитесь за помощю на <a href="mailto:%{email}">%{email}</a>
       email_reconfirmation_html: Если вы не получили письмо с подтверждением, его можно <a href="%{path}">запросить ещё раз</a>
-      irreversible: Вы не сможете восстановить или повторно активировать свою учётную запись
-      more_details_html: Подробнее см. в политике конфиденциальности <a href="%{terms_path}"></a>.
-      username_available: Ваш юзернейм снова станет доступным
-      username_unavailable: Ваш юзернейм останется недоступным
+      irreversible: После удаления восстановить или повторно активировать учётную запись не получится
+      more_details_html: За всеми подробностями, изучите <a href="%{terms_path}">политику конфиденциальности</a>.
+      username_available: Ваше имя пользователя снова станет доступным
+      username_unavailable: Ваше имя пользователя останется недоступным для использования
   directories:
     directory: Каталог профилей
     explanation: Находите пользователей по интересам
@@ -713,24 +754,24 @@ ru:
     archive_takeout:
       date: Дата
       download: Скачать ваш архив
-      hint_html: Вы можете запросить архив своих <strong>статусов и загруженных медиа-файлов</strong>. Экспортированные данные будут в формате ActivityPub, который можно прочесть любой соответствующей программой. Запрашивать архив можно каждые 7 дней.
-      in_progress: Собирается ваш архив...
+      hint_html: Вы можете запросить архив своих <strong>постов и загруженных медиа-файлов</strong>. Экспортированные данные будут в формате ActivityPub, который можно прочесть любой соответствующей программой. Запрашивать архив можно каждые 7 дней.
+      in_progress: Мы собираем этот архив...
       request: Запросить ваш архив
       size: Размер
     blocks: Список блокировки
     csv: CSV
     domain_blocks: Доменные блокировки
-    follows: Подписки
     lists: Списки
-    mutes: Список глушения
-    storage: Ваш медиаконтент
+    mutes: Ваши игнорируемые
+    storage: Ваши файлы
   featured_tags:
     add_new: Добавить
     errors:
       limit: Вы уже добавили максимальное число хэштегов
-    hint_html: "<strong>Что такое хэштеги?</strong> Они видны в вашем публичном профиле и позволяют людям просматривать публичные записи под этими хэштегами. Они являются отличным инструментом для отслеживания творчества или долгосрочных проектов."
+    hint_html: "<strong>Особенные хэштеги</strong> отображаются в вашем профиле и позволяют людям просматривать ваши посты, отмеченные ими. Это отличный инструмент для отслеживания долгосрочных проектов и творческих работ."
   filters:
     contexts:
+      account: Посты в профилях
       home: Домашняя лента
       notifications: Уведомления
       public: Публичные ленты
@@ -742,6 +783,7 @@ ru:
       invalid_irreversible: Необратимая фильтрация работает только с лентой уведомлений и домашней лентой
     index:
       delete: Удалить
+      empty: У вас пока нет фильтров.
       title: Фильтры
     new:
       title: Добавить фильтр
@@ -751,11 +793,13 @@ ru:
     resources: Ссылки
     trending_now: Актуально сейчас
   generic:
-    all: Все
+    all: Любой
     changes_saved_msg: Изменения успешно сохранены!
     copy: Копировать
+    delete: Удалить
+    edit: Изменить
     no_batch_actions_available: На этой странице нет запланированных действий
-    order_by: Сортировать по
+    order_by: Сортировка
     save_changes: Сохранить изменения
     validation_errors:
       few: Что-то здесь не так! Пожалуйста, прочитайте о %{count} ошибках ниже
@@ -774,14 +818,14 @@ ru:
         invalid_token: Токены Keybase — это хэши от подписей и должны быть по длине в 66 hex-символов
         verification_failed: Keybase не распознаёт этот токен как подпись пользователя %{kb_username}. Пожалуйста, повторите на Keybase.
       wrong_user: Невозможно подтвердить пользователя %{proving}, будучи залогиненным как %{current}. Выполните вход как %{proving} и попробуйте ещё раз.
-    explanation_html: Здесь вы можете криптографически связать свои остальные идентификаторы, такие как профиль Keybase. Это позволит другим дюдям отправлять вам зашифрованные сообщения и верить отправляемым вами сообщениям.
+    explanation_html: На этой странице отображаются криптографически подтверждённые идентификаторы — например, привязанный профиль Keybase. Это позволяет людям отправлять вам зашифрованные сообщения, а также доверять вашим постам.
     i_am_html: Я %{username} на %{service}.
     identity: Идентификатор
     inactive: Неактивно
     publicize_checkbox: 'И опубликуйте текст:'
     publicize_toot: 'Подтверждено! Я %{username} на %{service}: %{url}'
-    status: Статус подтверждения
-    view_proof: Посмотреть доказательство личности
+    status: Статус
+    view_proof: Посмотреть подтверждение
   imports:
     modes:
       merge: Объединить
@@ -796,7 +840,7 @@ ru:
       following: Подписки
       muting: Список глушения
     upload: Загрузить
-  in_memoriam_html: Памятник.
+  in_memoriam_html: В память о пользователе.
   invites:
     delete: Удалить
     expired: Истекло
@@ -826,7 +870,7 @@ ru:
       limit: Вы достигли максимального числа списков
   media_attachments:
     validations:
-      images_and_video: Нельзя добавить видео к статусу с изображениями
+      images_and_video: Нельзя добавить видео к посту с изображениями
       too_many: Нельзя добавить более 4 файлов
   migrations:
     acct: имя@домен новой учётной записи
@@ -841,13 +885,13 @@ ru:
       on_cooldown: Вы пока не можете переезжать
     followers_count: Подписчиков на момент переезда
     incoming_migrations: Переезд с другой учётной записи
-    incoming_migrations_html: Чтобы мигрировать с другой учётной записи на эту, сначала вам нужно <a href="%{path}">создать псевдоним учетной записи</a>.
-    moved_msg: Ваша учётная запись теперь перенаправляется на %{acct} и подписчики перемещаются туда.
-    not_redirecting: Ваша учётная запись пока что не перенаправляется на какую-либо иную.
+    incoming_migrations_html: Переезжаете с другой учётной записи? <a href="%{path}">Настройте псевдоним</a> для переноса подписчиков.
+    moved_msg: Теперь ваша учётная запись перенаправляет к %{acct}, туда же перемещаются подписчики.
+    not_redirecting: Для вашей учётной записи пока не настроено перенаправление.
     on_cooldown: Вы уже недавно переносили свою учётную запись. Эта возможность будет снова доступна через %{count} дн.
     past_migrations: Прошлые переезды
     proceed_with_move: Перенести подписчиков
-    redirecting_to: Ваша учётная запись перенаправлена на %{acct}.
+    redirecting_to: Ваша учётная запись перенаправляет к %{acct}.
     set_redirect: Настроить перенаправление
     warning:
       backreference_required: Новая учётная запись должна быть сначала настроена так, чтоб ссылаться на текущую
@@ -863,7 +907,7 @@ ru:
   notification_mailer:
     digest:
       action: Просмотреть все уведомления
-      body: Кратко о пропущенных Вами сообщениях с Вашего последнего захода %{since}
+      body: Вот краткая сводка сообщений, которые вы пропустили с последнего захода %{since}
       mention: "%{name} упомянул(а) Вас в:"
       new_followers_summary:
         few: У вас появилось %{count} новых подписчика! Отлично!
@@ -877,8 +921,8 @@ ru:
         other: "%{count} новых уведомлений с вашего последнего захода \U0001F418"
       title: В ваше отсутствие…
     favourite:
-      body: 'Ваш статус понравился %{name}:'
-      subject: "%{name} понравился ваш статус"
+      body: "%{name} добавил ваш пост в избранное:"
+      subject: "%{name} добавил ваш пост в избранное"
       title: Понравившийся статус
     follow:
       body: "%{name} теперь подписан(а) на вас!"
@@ -886,18 +930,22 @@ ru:
       title: Новый подписчик
     follow_request:
       action: Управление запросами на подписку
-      body: "%{name} запросил вас о подписке"
+      body: "%{name} отправил(а) вам запрос на подписку"
       subject: "%{name} хочет подписаться на вас"
-      title: Новый запрос о подписке
+      title: Новый запрос на подписку
     mention:
       action: Ответить
       body: 'Вас упомянул(а) %{name} в:'
       subject: Вы были упомянуты %{name}
       title: Новое упоминание
     reblog:
-      body: 'Ваш статус был продвинут %{name}:'
-      subject: "%{name} продвинул(а) ваш статус"
+      body: 'Ваш пост был продвинут %{name}:'
+      subject: "%{name} продвинул(а) ваш пост"
       title: Новое продвижение
+  notifications:
+    email_events: События для e-mail уведомлений
+    email_events_hint: 'Выберите события, для которых вы хотели бы получать уведомления:'
+    other_settings: Остальные настройки уведомлений
   number:
     human:
       decimal_units:
@@ -921,21 +969,29 @@ ru:
       duration_too_long: слишком далеко в будущем
       duration_too_short: слишком короткий срок
       expired: Опрос уже завершился
+      invalid_choice: Выбранного варианта голосования не существует
       over_character_limit: каждый не вариант не может быть длиннее %{max} символов
       too_few_options: должно быть больше 1 варианта
       too_many_options: может содержать не больше %{max} вариантов
   preferences:
-    other: Другое
+    other: Всё остальное
     posting_defaults: Настройки отправки по умолчанию
     public_timelines: Публичные ленты
+  reactions:
+    errors:
+      limit_reached: Достигнут лимит разных реакций
+      unrecognized_emoji: не является распознанным эмодзи
   relationships:
     activity: Активность учётной записи
-    dormant: Заброшенные
-    last_active: Недавно активные
-    most_recent: Новые
-    moved: Переехавший
-    mutual: Общие
-    primary: Основной
+    dormant: Заброшенная
+    followers: Подписчики
+    following: Подписки
+    invited: Приглашённые
+    last_active: По последней активности
+    most_recent: По недавности
+    moved: Мигрировавшая
+    mutual: Взаимные подписки
+    primary: Основная
     relationship: Связь
     remove_selected_domains: Удалить всех подписчиков для выбранных доменов
     remove_selected_followers: Удалить выбранных подписчиков
@@ -950,14 +1006,14 @@ ru:
     reason_html: "<strong>Почему это необходимо?</strong> Возможно, <code>%{instance}</code> не является узлом, на котором вы зарегистрированы, поэтому нам сперва нужно перенаправить вас на домашний узел."
   remote_interaction:
     favourite:
-      proceed: Отметить как "нравится"
-      prompt: 'Вы собираетесь поставить отметку "нравится" этому статусу:'
+      proceed: Добавить в избранное
+      prompt: 'Вы собираетесь поставить отметку "нравится" этому посту:'
     reblog:
-      proceed: Продвинуть статус
-      prompt: 'Вы хотите продвинуть этот статус:'
+      proceed: Продвинуть пост
+      prompt: 'Вы хотите продвинуть этот пост:'
     reply:
       proceed: Ответить
-      prompt: 'Вы собираетесь ответить на этот статус:'
+      prompt: 'Вы собираетесь ответить на этот пост:'
   scheduled_statuses:
     over_daily_limit: Вы превысили лимит в %{limit} запланированных постов на указанный день
     over_total_limit: Вы превысили лимит на %{limit} запланированных постов
@@ -985,7 +1041,7 @@ ru:
       weibo: Weibo
     current_session: Текущая сессия
     description: "%{browser} на %{platform}"
-    explanation: Это веб-браузеры, в которых на данный момент выполнен вход в Вашу учётную запись Mastodon.
+    explanation: Здесь отображаются все веб-браузеры, в которых выполнен вход в вашу учётную запись. Авторизованные приложения отображаются в другой секции.
     ip: IP
     platforms:
       adobe_air: Adobe Air
@@ -1001,21 +1057,21 @@ ru:
       windows_mobile: Windows Mobile
       windows_phone: Windows Phone
     revoke: Завершить
-    revoke_success: Сессия завершена успешно
+    revoke_success: Сессия завершена
     title: Сессии
   settings:
     account: Учётная запись
-    account_settings: Настройки учётной записи
+    account_settings: Управление учётной записью
     aliases: Псевдонимы учётной записи
     appearance: Внешний вид
-    authorized_apps: Авторизованные приложения
+    authorized_apps: Приложения
     back: Назад в Mastodon
     delete: Удаление учётной записи
     development: Разработка
     edit_profile: Изменить профиль
     export: Экспорт данных
     featured_tags: Особенные хэштеги
-    identity_proofs: Подтверждения личности
+    identity_proofs: Идентификация
     import: Импорт
     import_and_export: Импорт и экспорт
     migrate: Миграция учётной записи
@@ -1023,7 +1079,7 @@ ru:
     preferences: Настройки
     profile: Профиль
     relationships: Подписки и подписчики
-    two_factor_authentication: Двухфакторная аутентификация
+    two_factor_authentication: Подтверждение входа
   spam_check:
     spam_detected: Это автоматический отчет. Обнаружен спам.
   statuses:
@@ -1047,13 +1103,13 @@ ru:
       one: 'содержался запрещённый хэштег: %{tags}'
       other: 'содержались запрещённые хэштеги: %{tags}'
     language_detection: Определять язык автоматически
-    open_in_web: Открыть в WWW
+    open_in_web: Открыть в веб-версии
     over_character_limit: превышен лимит символов (%{max})
     pin_errors:
-      limit: Вы закрепили максимально возможное число статусов
-      ownership: Нельзя закрепить чужой статус
-      private: Нельзя закрепить непубличный статус
-      reblog: Нельзя закрепить продвинутый статус
+      limit: Вы закрепили максимально возможное число постов
+      ownership: Нельзя закрепить чужой пост
+      private: Нельзя закрепить непубличный пост
+      reblog: Нельзя закрепить продвинутый пост
     poll:
       total_people:
         few: "%{count} человек"
@@ -1066,7 +1122,7 @@ ru:
         one: "%{count} голос"
         other: "%{count} голосов"
       vote: Голосовать
-    show_more: Ещё
+    show_more: Развернуть
     sign_in_to_participate: Войдите, чтобы принять участие в дискуссии
     title: '%{name}: "%{quote}"'
     visibilities:
@@ -1077,9 +1133,9 @@ ru:
       unlisted: Скрывать из лент
       unlisted_long: Показывать всем, но не отображать в публичных лентах
   stream_entries:
-    pinned: Закреплённый статус
+    pinned: Закреплённый пост
     reblogged: продвинул(а)
-    sensitive_content: Чувствительный контент
+    sensitive_content: Деликатное содержимое
   tags:
     does_not_match_previous_name: не совпадает с предыдущим именем
   terms:
@@ -1170,30 +1226,30 @@ ru:
       default: "%d %b %Y, %H:%M"
       month: "%m.%Y"
   two_factor_authentication:
-    code_hint: Для подтверждения введите код, сгенерированный приложением аутентификатора
-    description_html: При включении <strong>двухфакторной аутентификации</strong>, вход потребует от Вас использования Вашего телефона, который сгенерирует входные токены.
+    code_hint: Для подтверждения введите код, сгенерированный приложением-аутентификатором
+    description_html: 'На этой странице можно включить <strong>двухфакторную авторизацию</strong>: с ней, чтобы войти в свою учётную запись, потребуется ввести небольшой временный код, генерируемый через приложение на своём смартфоне.'
     disable: Отключить
     enable: Включить
-    enabled: Двухфакторная аутентификация включена
-    enabled_success: Двухфакторная аутентификация успешно включена
+    enabled: Двухфакторная аутентификация настроена
+    enabled_success: Двухфакторная авторизация успешно настроена
     generate_recovery_codes: Сгенерировать коды восстановления
-    instructions_html: "<strong>Отсканируйте этот QR-код с помощью Google Authenticator или другого подобного приложения на Вашем телефоне</strong>. С этого момента приложение будет генерировать токены, которые будет необходимо ввести для входа."
-    lost_recovery_codes: Коды восстановления позволяют вернуть доступ к учётной записи в случае утери телефона. Если Вы потеряли Ваши коды восстановления, вы можете заново сгенерировать их здесь. Ваши старые коды восстановления будут аннулированы.
+    instructions_html: "<strong>Отсканируйте этот QR-код с помощью Google Authenticator, Яндекс.Ключа или любого другого подобного приложения</strong>. После сканирования и добавления, приложение начнёт генерировать коды, которые потребуется вводить для завершения входа в учётную запись."
+    lost_recovery_codes: Коды восстановления позволяются войти в учётную запись в случае утери смартфона. Если вы потеряли свои коды восстановления, вы можете создать новые здесь. Прошлые коды работать перестанут.
     manual_instructions: 'Если Вы не можете отсканировать QR-код и хотите ввести его вручную, секрет представлен здесь открытым текстом:'
     recovery_codes: Коды восстановления
     recovery_codes_regenerated: Коды восстановления успешно сгенерированы
-    recovery_instructions_html: В случае утери доступа к Вашему телефону Вы можете использовать один из кодов восстановления, указанных ниже, чтобы вернуть доступ к учётной записи. Держите коды восстановления в безопасности, например, распечатав их и храня с другими важными документами.
+    recovery_instructions_html: 'Пожалуйста, сохраните коды ниже в надёжном месте: они понадобятся, чтобы войти в учётную запись, если вы потеряете доступ к своему смартфону. Вы можете вручную переписать их, распечатать и спрятать среди важных документов или, например, в любимой книжке. <strong>Каждый код действителен один раз</strong>.'
     setup: Настроить
     wrong_code: Введенный код неверен! Правильно ли установлены серверное время и время устройства?
   user_mailer:
     backup_ready:
-      explanation: Вы запросили полный архив вашей учётной записи Mastodon. Он готов к загрузке!
+      explanation: Вы запросили архив всех данных вашей учётной записи Mastodon. Что ж, он готов к скачиванию.
       subject: Ваш архив готов к загрузке
-      title: Вынос архива
+      title: Архив ваших данных готов
     warning:
       explanation:
         disable: Пока ваша учётная запись заморожена, ваши данные остаются нетронутыми, но вы не можете производить никаких действий до разблокировки.
-        silence: Пока ваша учётная запись ограничена, ваши посты на этом сервере увидят только ваши действующие подписчики, а ваш профиль может быть исключён из различных каталогов. Впрочем, остальные могут подписаться на вас вручную.
+        silence: Пока действуют данные ограничения, публикуемые вами посты будут видеть исключительно люди, которые на вас уже подписаны на этом узле, вы также можете быть исключены из различных публичных лент. Несмотря на это, остальные пользователи по-прежнему могут подписаться на вас, чтобы читать новые посты.
         suspend: Ваша учётная запись заблокирована и все ваши посты и загруженные медиафайлы безвозвратно удалены с этого сервера и других серверов, где у вас были подписчики.
       get_in_touch: Вы можете ответить на это письмо, чтобы связаться с сотрудниками %{instance}.
       review_server_policies: Посмотреть правила сервера
@@ -1201,12 +1257,12 @@ ru:
       subject:
         disable: Ваша учётная запись %{acct} заморожена
         none: "%{acct}, вам вынесено предупреждение"
-        silence: Ваша учётная запись %{acct} была ограничена
+        silence: На вашу учётную запись, %{acct}, были наложены ограничения
         suspend: Ваша учётная запись %{acct} была заблокирована
       title:
         disable: Учётная запись заморожена
         none: Предупреждение
-        silence: Учётная запись ограничена
+        silence: На учётную запись наложены ограничения
         suspend: Учётная запись заблокирована
     welcome:
       edit_profile_action: Настроить профиль
@@ -1217,7 +1273,7 @@ ru:
       full_handle: Ваше обращение
       full_handle_hint: То, что Вы хотите сообщить своим друзьям, чтобы они могли написать Вам или подписаться с другого узла.
       review_preferences_action: Изменить настройки
-      review_preferences_step: Проверьте все настройки, например, какие письма вы хотите получать или уровень приватности статусов по умолчанию. Если вы не страдаете морской болезнью, можете включить автовоспроизведение GIF.
+      review_preferences_step: Проверьте все настройки, например, какие письма вы хотите получать или уровень приватности постов по умолчанию. Если вы не страдаете морской болезнью, можете включить автовоспроизведение GIF.
       subject: Добро пожаловать в Mastodon
       tip_federated_timeline: В глобальной ленте отображается сеть Mastodon. Но в ней показаны посты только от людей, на которых подписаны вы и ваши соседи, поэтому лента может быть неполной.
       tip_following: По умолчанию вы подписаны на администратора(-ов) вашего узла. Чтобы найти других интересных людей, проверьте локальную и глобальную ленты.
@@ -1233,5 +1289,5 @@ ru:
     seamless_external_login: Вы залогинены через сторонний сервис, поэтому настройки e-mail и пароля недоступны.
     signed_in_as: 'Выполнен вход под именем:'
   verification:
-    explanation_html: 'Вы можете <strong>подтвердить себя как владельца ссылок в вашем профиле</strong>. Для этого указанный веб-сайт должен содержать обратную ссылку на ваш профиль в Mastodon. У обратной ссылки <strong>должен</strong> быть атрибут <code>rel="me"</code>. Сам текст ссылки не имеет значения. Пример:'
+    explanation_html: 'Владение ссылками в профиле <strong>можно подтвердить</strong>. Для этого на указанном сайте должна содержаться ссылка на ваш профиль Mastodon, а у самой ссылки <strong>должен</strong> быть атрибут <code>rel="me"</code>. Что внутри ссылки — значения не имеет. Вот вам пример ссылки:'
     verification: Подтверждение
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index 65e6a8590..f7a38a92c 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -2,6 +2,10 @@
 ar:
   simple_form:
     hints:
+      account_alias:
+        acct: ادخِل عنون الحساب username@domain الذي تودّ مغادرته
+      account_migration:
+        acct: ادخِل عنون الحساب username@domain الذي تودّ الإنتقال إليه
       account_warning_preset:
         text: بإمكانك استخدام نفس القواعد التي نجدها في التبويقات كعناوين الروابط والوسوم والإشارات
       admin_account_action:
@@ -13,6 +17,8 @@ ar:
         avatar: ملف PNG أو GIF أو JPG. حجمه على أقصى تصدير %{size}. سيتم تصغيره إلى %{dimensions}px
         bot: يُعلِم أنّ هذا الحساب لا يمثل شخصًا
         context: واحد أو أكثر من السياقات التي يجب أن ينطبق عليها عامل التصفية
+        current_password: لأسباب أمنية ، يرجى إدخال الكلمة السرية الخاصة بالحساب الحالي
+        current_username: يرجى إدخال اسم المستخدم الخاص بالحساب الحالي قصد التأكيد
         digest: تُرسَل إليك بعد مُضيّ مدة مِن خمول نشاطك و فقط إذا ما تلقيت رسائل شخصية مباشِرة أثناء فترة غيابك مِن الشبكة
         discoverable: سِجل الملفات التعريفية للمستخدمين هو طريقة أخرى لبلوغ جمهور أوسع
         email: سوف تتلقى رسالة إلكترونية للتأكيد
@@ -36,7 +42,7 @@ ar:
         setting_use_pending_items: إخفاء تحديثات الخط وراء نقرة بدلًا مِن التمرير التلقائي للتدفق
         username: اسم المستخدم الخاص بك سوف يكون فريدا مِن نوعه على %{domain}
       featured_tag:
-        name: 'رُبَّما تريد·ين استخدام واحد مِن هذه:'
+        name: 'رُبَّما تريد·ين استخدام واحد مِن بين هذه:'
       form_challenge:
         current_password: إنك بصدد الدخول إلى منطقة آمنة
       imports:
@@ -99,6 +105,7 @@ ar:
         setting_aggregate_reblogs: جمع الترقيات في خيوط زمنية
         setting_auto_play_gif: تشغيل تلقائي لِوَسائط جيف المتحركة
         setting_boost_modal: إظهار مربع حوار للتأكيد قبل ترقية أي تبويق
+        setting_crop_images: قص الصور في التبويقات غير الموسعة إلى 16x9
         setting_default_language: لغة النشر
         setting_default_privacy: خصوصية المنشور
         setting_default_sensitive: اعتبر الوسائط دائما كمحتوى حساس
@@ -116,6 +123,7 @@ ar:
         setting_theme: سمة الموقع
         setting_trends: اعرض ما يُتداوَل اليوم
         setting_unfollow_modal: إظهار مربع حوار للتأكيد قبل إلغاء متابعة أي حساب
+        setting_use_blurhash: أظهر ألوانًا متدرّجة على الوسائط المَخفية
         setting_use_pending_items: الوضع البطيء
         severity: القوّة
         type: صيغة الاستيراد
diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml
index 4ec3935c9..1206aa465 100644
--- a/config/locales/simple_form.ast.yml
+++ b/config/locales/simple_form.ast.yml
@@ -5,58 +5,92 @@ ast:
       defaults:
         autofollow: La xente que se rexistre pente la invitación va siguite automáticamente
         bot: Esta cuenta fai principalmente aiciones automatizaes y podría nun supervisase
-        digest: Namái s'unvia tres un periodu llargu d'inactividá y namái si recibiesti cualesquier mensaxe personal na to ausencia
+        digest: Namái s'unvia dempués d'un periodu llargu d'inactividá y namái si recibiesti cualesquier mensaxe personal na to ausencia
+        discoverable: El direutoru de perfiles ye otru mou de facer qu'una cuenta llegué a una audiencia más amplia
         email: Vamos unviate un corréu de confirmación
-        irreversible: Los toots peñeraos van desapaecer de mou irreversible, magar que se desanicie la peñera dempués
+        irreversible: Los barritos peñeraos van desapaecer de mou irreversible, magar que se desanicie la peñera dempués
         password: Usa 8 caráuteres polo menos
         setting_hide_network: La xente que sigas y teas siguiendo nun va amosase nel perfil
+        setting_show_application: L'aplicación qu'uses pa barritar va amosase na vista detallada d'ellos
         username: El nome d'usuariu va ser únicu en %{domain}
+      featured_tag:
+        name: 'Quiciabes quieras usar unu d''estos:'
+      form_challenge:
+        current_password: Tas entrando nuna área segura
       imports:
         data: El ficheru CSV esportáu dende otra instancia de Mastodon
+      invite_request:
+        text: Esto va ayudanos a revisar la to aplicación
+      sessions:
+        otp: 'Introduz el códigu de dos pasos xeneráu pola aplicación autenticadora o usa unu de los códigos de recuperación:'
     labels:
       account:
         fields:
           name: Etiqueta
           value: Conteníu
+      admin_account_action:
+        type: Aición
+        types:
+          none: Nun facer nada
       defaults:
+        avatar: Avatar
         bot: Esta cuenta ye d'un robó
         chosen_languages: Peñera de llingües
         confirm_new_password: Confirmación de la contraseña nueva
+        confirm_password: Confirmación de la contraseña
         current_password: Contraseña actual
         data: Datos
+        discoverable: Llistar esta cuenta nel direutoriu
         display_name: Nome a amosar
         email: Direición de corréu
-        expires_in: Caduca tres
-        fields: Datos meta del perfil
+        expires_in: Caduca dempués de
+        fields: Metadatos del perfil
         header: Testera
         irreversible: Escartar en cuentes d'anubrir
         locale: Llingua de la interfaz
-        locked: Bloquiar cuenta
+        locked: Bloquiar la cuenta
         max_uses: Númberu máximu d'usos
         new_password: Contraseña nueva
-        otp_attempt: Códigu de verificación en dos pasos
+        note: Biografía
+        otp_attempt: Códigu de la verificación en dos pasos
         password: Contraseña
         phrase: Pallabra clave o fras
+        setting_advanced_layout: Activar la interfaz web avanzada
         setting_auto_play_gif: Reproducir GIFs automáticamente
-        setting_default_language: Llingua de les espublizaciones
-        setting_default_privacy: Privacidá d'espublizaciones
-        setting_delete_modal: Amosar el diálogu de confirmación enantes de desaniciar un toot
+        setting_boost_modal: Amosar el diálogu de confirmación enantes de compartir un barritu
+        setting_default_language: Llingua de los espublizamientos
+        setting_default_privacy: Privacidá de los espublizamientos
+        setting_delete_modal: Amosar el diálogu de confirmación enantes de desaniciar un barritu
+        setting_show_application: Dicir les aplicaciones que s'usen pa barritar
         setting_system_font_ui: Usar la fonte predeterminada del sistema
+        setting_theme: Estilu del sitiu
+        setting_trends: Amosar les tendencies de güei
         setting_unfollow_modal: Amosar el diálogu de confirmación enantes de dexar de siguir a daquién
+        setting_use_pending_items: Mou lentu
         severity: Severidá
         type: Triba de la importación
         username: Nome d'usuariu
         username_or_email: Nome d'usuariu o corréu
+        whole_word: La pallabra entera
+      featured_tag:
+        name: Etiqueta
       interactions:
-        must_be_follower: Bloquiar avisos de persones que nun son siguidores
-        must_be_following: Bloquiar avisos de persones que nun sigues
-        must_be_following_dm: Bloquiar mensaxes direutos de persones que nun sigues
+        must_be_follower: Bloquiar los avisos de persones que nun son siguidores
+        must_be_following: Bloquiar los avisos de persones que nun sigues
+        must_be_following_dm: Bloquiar los mensaxes direutos de persones que nun sigues
+      invite_request:
+        text: "¿Por qué quies xunite?"
       notification_emails:
-        favourite: Unviar un corréu cuando daquién conseñe como favoritu los tos estaos
-        follow: Unviar un corréu cuando daquién te siga
-        follow_request: Unviar un corréu cuando daquién solicite siguite
-        mention: Unviar un corréu cuando daquién te mente
+        favourite: Daquién marcó como favoritu un estáu de to
+        follow: Daquién te sigue
+        follow_request: Daquién solicitó siguite
+        mention: Daquién te mentó
+        reblog: Daquién compartió dalgún estáu de to
+      tag:
+        name: Etiqueta
     'no': Non
+    recommended: Aconséyase
     required:
+      mark: "*"
       text: ríquese
     'yes': Sí
diff --git a/config/locales/simple_form.ca.yml b/config/locales/simple_form.ca.yml
index 80703950b..e91b74f85 100644
--- a/config/locales/simple_form.ca.yml
+++ b/config/locales/simple_form.ca.yml
@@ -9,11 +9,17 @@ ca:
       account_warning_preset:
         text: Pots utilitzar totes les sintaxi com ara URL, etiquetes i mencions
       admin_account_action:
-        include_statuses: L'usuari veurà quin tuts ha causat l'acció de moderació o avís
+        include_statuses: L'usuari veurà quins tuts han causat l'acció de moderació o avís
         send_email_notification: L'usuari rebrà una explicació del que ha passat amb el seu compte
         text_html: Opcional. Pots utilitzar tota la sintaxi. Pots <a href="%{path}">afegir configuracions predefinides d'avís</a> per a estalviar temps
         type_html: Tria què fer amb <strong>%{acct}</strong>
         warning_preset_id: Opcional. Encara pots afegir text personalitzat al final de la configuració predefinida
+      announcement:
+        all_day: Si es marca, només es mostraran les dates de l'interval de temps
+        ends_at: Opcional. En aquest moment, l’anunci deixarà automàticament d'estar publicat
+        scheduled_at: Deixa-ho en blanc per a publicar l’anunci immediatament
+        starts_at: Opcional. En el cas que el teu anunci estigui vinculat a un interval de temps específic
+        text: Pots utilitzar sintaxi d'un tut. Tingues en compte l’espai que l’anunci ocuparà a la pantalla de l’usuari
       defaults:
         autofollow: Les persones que es registrin a través de la invitació et seguiran automàticament
         avatar: PNG, GIF o JPG. Màxim %{size}. S'escalarà a %{dimensions}px
@@ -27,20 +33,20 @@ ca:
         fields: Pots tenir fins a 4 elements que es mostren com a taula al teu perfil
         header: PNG, GIF o JPG. Màxim %{size}. S'escalarà a %{dimensions}px
         inbox_url: Copia l'URL des de la pàgina principal del relay que vols utilitzar
-        irreversible: Els nodes filtrats desapareixeran de manera irreversible, fins i tot si el filtre es retira més tard
+        irreversible: Els tuts filtrats desapareixeran de manera irreversible, fins i tot si el filtre es retira més tard
         locale: El llenguatge de l’interfície d’usuari, els correus i les notificacions push
         locked: Requereix que aprovis manualment els seguidors
         password: Utilitza com a mínim 8 caràcters
-        phrase: Es combinarà independentment del format en el text o l'avís de contingut d'un toot
-        scopes: A quines API es permetrà l'accés a l'aplicació. Si selecciones un àmbit d'alt nivell, no cal que seleccionis un d'individual.
-        setting_aggregate_reblogs: No mostra els nous impulsos dels toots que ja s'han impulsat recentment (només afecta als impulsos nous rebuts)
+        phrase: Es combinarà independentment del format en el text o l'avís de contingut del tut
+        scopes: A quines API es permetrà a l'aplicació accedir. Si selecciones un àmbit d'alt nivell, no cal que seleccionis un d'individual.
+        setting_aggregate_reblogs: No mostra els nous impulsos dels tuts que ja s'han impulsat recentment (només afecta als impulsos nous rebuts)
         setting_default_sensitive: Els mèdia sensibles estan ocults per defecte i es poden revelar amb un clic
         setting_display_media_default: Amaga els multimèdia marcats com a sensibles
-        setting_display_media_hide_all: Sempre oculta tots els multimèdia
+        setting_display_media_hide_all: Oculta sempre tot el contingut multimèdia
         setting_display_media_show_all: Mostra sempre els elements multimèdia marcats com a sensibles
         setting_hide_network: Qui tu segueixes i els que et segueixen a tu no es mostraran en el teu perfil
         setting_noindex: Afecta el teu perfil públic i les pàgines d'estat
-        setting_show_application: L'aplicació que fas servir per a publicar es mostrarà a la vista detallada dels teus toots
+        setting_show_application: L'aplicació que fas servir per a publicar es mostrarà a la vista detallada dels teus tuts
         setting_use_blurhash: Els degradats es basen en els colors de les imatges ocultes, però enfosqueixen els detalls
         setting_use_pending_items: Amaga les actualitzacions de la línia de temps després d'un clic en comptes de desplaçar-se automàticament
         username: El teu nom d'usuari serà únic a %{domain}
@@ -60,7 +66,7 @@ ca:
       tag:
         name: Només pots canviar la caixa de les lletres, per exemple, per fer-la més llegible
       user:
-        chosen_languages: Quan estigui marcat, només es mostraran els toots de les llengües seleccionades en les línies de temps públiques
+        chosen_languages: Quan estigui marcat, només es mostraran els tuts de les llengües seleccionades en les línies de temps públiques
     labels:
       account:
         fields:
@@ -83,6 +89,12 @@ ca:
           silence: Silenci
           suspend: Suspèn i elimina irreversiblement les dades del compte
         warning_preset_id: Utilitza una configuració predefinida d'avís
+      announcement:
+        all_day: Esdeveniment de tot el dia
+        ends_at: Fi del esdeveniment
+        scheduled_at: Programa la publicació
+        starts_at: Inici del esdeveniment
+        text: Anunci
       defaults:
         autofollow: Convida a seguir el teu compte
         avatar: Avatar
@@ -117,16 +129,16 @@ ca:
         setting_default_language: Llengua de les publicacions
         setting_default_privacy: Privacitat de les publicacions
         setting_default_sensitive: Marca sempre els elements multimèdia com a sensibles
-        setting_delete_modal: Mostra la finestra de confirmació abans de suprimir un toot
+        setting_delete_modal: Mostra la finestra de confirmació abans d'esborrar un tut
         setting_display_media: Visualització multimèdia
         setting_display_media_default: Per defecte
         setting_display_media_hide_all: Amaga-ho tot
         setting_display_media_show_all: Mostra-ho tot
-        setting_expand_spoilers: Sempre amplia els toots marcats amb advertències de contingut
+        setting_expand_spoilers: Sempre amplia els tuts marcats amb advertències de contingut
         setting_hide_network: Amaga la teva xarxa
         setting_noindex: Desactivació de la indexació del motor de cerca
         setting_reduce_motion: Redueix el moviment en animacions
-        setting_show_application: Desvela l'aplicació utilitzada per enviar toots
+        setting_show_application: Revela l'aplicació utilitzada per enviar tuts
         setting_system_font_ui: Utilitza el tipus de lletra predeterminat del sistema
         setting_theme: Tema del lloc
         setting_trends: Mostra les tendències d'avui
diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml
index 7ffc8fe3d..f4737069b 100644
--- a/config/locales/simple_form.co.yml
+++ b/config/locales/simple_form.co.yml
@@ -14,6 +14,12 @@ co:
         text_html: In uzzione. Pudete utilizà a sintassa di i statuti. Pudete ancu <a href="%{path}">aghjustà preselezzione d'avertimentu</a> per piglià tempu
         type_html: Sceglie chì fà cù <strong>%{acct}</strong>
         warning_preset_id: In uzzione. Pudete sempre aghjustà un testu persunalizatu à a fine di a preselezzione
+      announcement:
+        all_day: Sole e date da st'intervallu di tempu saranu mustrate
+        ends_at: In uzzione. L'annunziu sarà autumaticamente piattatu dop'à sta data
+        scheduled_at: Lasciate viotu per pubblicà l'annunziu avà
+        starts_at: In uzzione. S'e l'annunziu hè ligatu à un'intervallu di tempu specificu
+        text: Pudete utilizà a sintassa di i statuti. Pensate à a piazza chì l'annunziu hà da piglià nant'à u screnu di l'utilizatore
       defaults:
         autofollow: Quelli·e chì s'arregistranu cù l'invitazione saranu autumaticamente abbunati·e à voi
         avatar: Furmatu PNG, GIF o JPG. %{size} o menu. Sarà ridottu à %{dimensions}px
@@ -83,6 +89,12 @@ co:
           silence: Silenzà
           suspend: Suspende è sguassà i dati di u contu di manera irreversibile
         warning_preset_id: Utilizà un'avertimentu preselezziunatu
+      announcement:
+        all_day: Tutta a ghjurnata
+        ends_at: Fine di l'avvenimentu
+        scheduled_at: Pianificà publicazione
+        starts_at: Principiu di l'avvenimentu
+        text: Annunziu
       defaults:
         autofollow: Invità à siguità u vostru contu
         avatar: Ritrattu di prufile
diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml
index 7a14a78b0..532950a31 100644
--- a/config/locales/simple_form.cs.yml
+++ b/config/locales/simple_form.cs.yml
@@ -3,26 +3,26 @@ cs:
   simple_form:
     hints:
       account_alias:
-        acct: Zadejte přezdívku@doménu účtu, ze kterého se chcete přesunout
+        acct: Zadejte svůj účet, ze kterého se chcete přesunout jinam, ve formátu přezdívka@doména
       account_migration:
-        acct: Zadejte přezdívku@doménu účtu, na který se chcete přesunout
+        acct: Zadejte svůj účet, na který se chcete přesunout, ve formátu přezdívka@doména
       account_warning_preset:
         text: Můžete používat syntaxi tootů, jako například URL, hashtagy a zmínky
       admin_account_action:
         include_statuses: Uživatel uvidí, které tooty způsobily moderátorskou akci nebo varování
         send_email_notification: Uživatel obdrží vysvětlení toho, co se stalo s jeho účtem
         text_html: Volitelné. Můžete používat syntaxi tootů. Pro ušetření času si můžete <a href="%{path}">přidat předlohy pro varování</a>
-        type_html: Vyberte, co chcete udělat s účtem <strong>%{acct}</strong>
-        warning_preset_id: Volitelné. Můžete stále vložit na konec předlohy vlastní text
+        type_html: Vyberte, co chcete s účtem <strong>%{acct}</strong> udělat
+        warning_preset_id: Volitelné. Na konec předlohy můžete stále vložit vlastní text
       defaults:
-        autofollow: Lidé, kteří se zaregistrují přes pozvání, vás budou automaticky sledovat
+        autofollow: Lidé, kteří se zaregistrují na základě pozvánky, vás budou automaticky sledovat
         avatar: PNG, GIF či JPG. Maximálně %{size}. Bude zmenšen na %{dimensions} px
         bot: Tento účet provádí hlavně automatizované akce a nemusí být spravován
         context: Jeden či více kontextů, ve kterých má být filtr uplatněn
-        current_password: Z bezpečnostních důvodů prosím zadejte heslo aktuálního účtu
-        current_username: Prosím potvrďte zadáním uživatelského jména aktuálního účtu
-        digest: Odesíláno pouze po dlouhé době nečinnosti a pouze, pokud jste při své nepřítomnosti obdržel/a osobní zprávy
-        discoverable: Adresář profilů je další způsob, díky kterému se může váš účet dostat k širšímu publiku
+        current_password: Z bezpečnostních důvodů prosím zadejte heslo současného účtu
+        current_username: Potvrďte prosím tuto akci zadáním uživatelského jména aktuálního účtu
+        digest: Odesíláno pouze po dlouhé době nečinnosti a pouze, pokud jste při své nepřítomnosti obdrželi osobní zprávy
+        discoverable: Adresář profilů je další způsob, jak se může váš účet dostat k širšímu publiku
         email: Bude vám poslán potvrzovací e-mail
         fields: Na profilu můžete mít až 4 položky zobrazené jako tabulka
         header: PNG, GIF či JPG. Maximálně %{size}. Bude zmenšen na %{dimensions} px
@@ -42,8 +42,8 @@ cs:
         setting_noindex: Ovlivňuje váš veřejný profil a stránky tootů
         setting_show_application: Aplikace, kterou používáte k psaní tootů, bude zobrazena v detailním zobrazení vašich tootů
         setting_use_blurhash: Gradienty jsou založeny na barvách skryté grafiky, ale zakrývají jakékoliv detaily
-        setting_use_pending_items: Skrýt aktualizace časové osy a načíst je kliknutím namísto automatického rolování proudu
-        username: Vaše uživatelské jméno bude na %{domain} unikátní
+        setting_use_pending_items: Aktualizovat časovou osu až po kliknutím namísto automatického rolování kanálu
+        username: Vaše uživatelské jméno bude na serveru %{domain} unikátní
         whole_word: Je-li klíčové slovo či fráze pouze alfanumerická, bude aplikována pouze, pokud se shoduje s celým slovem
       domain_allow:
         domain: Tato doména bude moci stahovat data z tohoto serveru a příchozí data z ní budou zpracována a uložena
@@ -54,13 +54,13 @@ cs:
       imports:
         data: Soubor CSV exportovaný z jiného serveru Mastodon
       invite_request:
-        text: To nám pomůže posoudit váš požadavek
+        text: To nám pomůže posoudit vaši žádost
       sessions:
-        otp: 'Napište dvoufázový kód vygenerovaný vaší mobilní aplikací, nebo použijte jeden z vašich záložních kódů:'
+        otp: 'Zadejte kód pro dvoufázové ověření vygenerovaný vaší mobilní aplikací, nebo použijte jeden z vašich záložních kódů:'
       tag:
         name: Můžete měnit pouze velikost písmen, například kvůli lepší čitelnosti
       user:
-        chosen_languages: Je-li tohle zaškrtnuto, budou ve veřejných časových osách zobrazeny pouze tooty ve zvolených jazycích
+        chosen_languages: Po zaškrtnutí budou ve veřejných časových osách zobrazeny pouze tooty ve zvolených jazycích
     labels:
       account:
         fields:
@@ -78,11 +78,15 @@ cs:
         text: Vlastní varování
         type: Akce
         types:
-          disable: Deaktivovat
+          disable: Deaktivovat přihlašování
           none: Nic nedělat
-          silence: Utišit
-          suspend: Pozastavit a nenávratně smazat data účtu
+          silence: Ztišit
+          suspend: Pozastavit účet a nenávratně smazat jeho data
         warning_preset_id: Použít předlohu pro varování
+      announcement:
+        all_day: Celodenní událost
+        scheduled_at: Naplánovat zveřejnění
+        starts_at: Začátek události
       defaults:
         autofollow: Pozvat ke sledování vašeho účtu
         avatar: Avatar
@@ -106,34 +110,34 @@ cs:
         max_uses: Maximální počet použití
         new_password: Nové heslo
         note: O vás
-        otp_attempt: Dvoufázový kód
+        otp_attempt: Kód pro dvoufázové ověření
         password: Heslo
         phrase: Klíčové slovo či fráze
         setting_advanced_layout: Povolit pokročilé webové rozhraní
         setting_aggregate_reblogs: Seskupovat boosty v časových osách
         setting_auto_play_gif: Automaticky přehrávat animace GIF
-        setting_boost_modal: Zobrazovat před boostnutím potvrzovací okno
+        setting_boost_modal: Před boostnutím zobrazovat potvrzovací okno
         setting_crop_images: Ořezávat obrázky v nerozbalených tootech na velikost 16x9
         setting_default_language: Jazyk příspěvků
         setting_default_privacy: Soukromí příspěvků
         setting_default_sensitive: Vždy označovat média jako citlivá
-        setting_delete_modal: Zobrazovat před smazáním tootu potvrzovací okno
+        setting_delete_modal: Před smazáním tootu zobrazovat potvrzovací okno
         setting_display_media: Zobrazování médií
         setting_display_media_default: Výchozí
         setting_display_media_hide_all: Skrýt vše
         setting_display_media_show_all: Zobrazit vše
         setting_expand_spoilers: Vždy rozbalit tooty označené varováními o obsahu
-        setting_hide_network: Skrýt svou síť
+        setting_hide_network: Skrýt mou síť
         setting_noindex: Neindexovat svůj profil vyhledávači
-        setting_reduce_motion: Redukovat pohyb v animacích
+        setting_reduce_motion: Omezit pohyb v animacích
         setting_show_application: Zobrazit aplikaci používanou k psaní tootů
         setting_system_font_ui: Použít výchozí písmo systému
-        setting_theme: Motiv stránky
+        setting_theme: Vzhled stránky
         setting_trends: Zobrazit dnešní trendy
-        setting_unfollow_modal: Zobrazovat před zrušením sledování potvrzovací okno
+        setting_unfollow_modal: Ppřed zrušením sledování zobrazovat potvrzovací okno
         setting_use_blurhash: Zobrazit pro skrytá média barevné gradienty
         setting_use_pending_items: Pomalý režim
-        severity: Přísnost
+        severity: Vážnost
         type: Typ importu
         username: Uživatelské jméno
         username_or_email: Uživatelské jméno nebo e-mail
@@ -150,22 +154,22 @@ cs:
         text: Proč se chcete připojit?
       notification_emails:
         digest: Posílat e-maily s přehledem
-        favourite: Posílat e-maily, když si někdo oblíbí váš toot
-        follow: Posílat e-maily, když vás někdo začne sledovat
-        follow_request: Posílat e-maily, když vás někdo požádá o sledování
-        mention: Posílat e-maily, když vás někdo zmíní
-        pending_account: Posílat e-maily, když je třeba posoudit nový účet
-        reblog: Posílat e-maily, když někdo boostne váš toot
-        report: Posílat e-maily, je-li odesláno nové nahlášení
-        trending_tag: Posílat e-maily, když se neschválený hashtag stane populárním
+        favourite: Poslat e-mail, když si někdo oblíbí váš toot
+        follow: Poslat e-mail, když vás někdo začne sledovat
+        follow_request: Poslat e-mail, když vás někdo požádá o sledování
+        mention: Poslat e-mail, když vás někdo zmíní
+        pending_account: Poslat e-mail, když je třeba posoudit nový účet
+        reblog: Poslat e-mail, když někdo boostne váš toot
+        report: Poslat e-mail, je-li nahlášeno něco nového
+        trending_tag: Poslat e-mail, když se neschválený hashtag stane populárním
       tag:
-        listable: Dovolit tomuto hashtagu objevovat se v hledáních a v adresáři profilů
+        listable: Povolit tento hashtag ve výsledcích vyhledávání a v adresáři profilů
         name: Hashtag
-        trendable: Dovolit tomuto hashtagu objevovat se v trendech
-        usable: Dovolit tootům používat tento hashtag
+        trendable: Povolit tento hashtag v trendech
+        usable: Povolit používat tento hashtag v tootech
     'no': Ne
     recommended: Doporučeno
     required:
       mark: "*"
-      text: požadováno
+      text: vyžadováno
     'yes': Ano
diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml
index 738d4070b..3fadd7fb9 100644
--- a/config/locales/simple_form.da.yml
+++ b/config/locales/simple_form.da.yml
@@ -9,8 +9,8 @@ da:
         avatar: PNG, GIF eller JPG. Højest %{size}. Vil blive skaleret ned til %{dimensions}px
         bot: Denne konto udfører hovedsageligt automatiserede handlinger og bliver muligvis ikke overvåget
         context: En eller flere sammenhænge hvor filteret skal være gældende
-        digest: Sendes kun efter en lang periode med inaktivitet og kun hvis du har modtaget nogle personlige beskeder mens du er væk
-        email: Du vil få tilsendt en bekræftelsed mail
+        digest: Sendes kun efter en lang periode med inaktivitet og kun hvis du har modtaget nogle personlige beskeder i dit fravær
+        email: Du vil få tilsendt en bekræftelses e-mail
         fields: Du kan have op til 4 ting vist som en tabel på din profil
         header: PNG, GIF eller JPG. Højest %{size}. Vil blive skaleret ned til %{dimensions}px
         inbox_url: Kopiere linket fra forsiden af den relay som du ønsker at bruge
@@ -40,10 +40,16 @@ da:
           name: Etiket
           value: Indhold
       admin_account_action:
+        include_statuses: Inkluder rapporteret toot i email
+        send_email_notification: Underret brugeren per email
+        text: Tilpasset advarsel
         type: Handling
         types:
           disable: Deaktiver
           none: Gør intet
+          silence: Silence
+          suspend: Suspendér og slet kontodata uopretteligt
+        warning_preset_id: Brug en forudindstillet advarsel
       defaults:
         autofollow: Inviter til at følge din konto
         avatar: Profilbillede
@@ -54,6 +60,7 @@ da:
         context: Filtrer sammenhænge
         current_password: Nuværende adgangskode
         data: Data
+        discoverable: Vis denne konto i oversigten
         display_name: Visningsnavn
         email: E-mail adresse
         expires_in: Udløber efter
@@ -69,6 +76,7 @@ da:
         otp_attempt: To-faktor kode
         password: Adgangskode
         phrase: Nøgleord eller sætning
+        setting_advanced_layout: Aktivér avanceret webgrænseflade
         setting_auto_play_gif: Afspil automatisk animerede GIFs
         setting_boost_modal: Vis bekræftelses dialog før du fremhæver
         setting_default_language: Sprog for opslag
@@ -99,6 +107,8 @@ da:
         must_be_follower: Bloker notifikationer fra folk der ikke følger dig
         must_be_following: Bloker notifikationer fra folk du ikke følger
         must_be_following_dm: Bloker direkte beskeder fra folk du ikke følger
+      invite:
+        comment: Kommentar
       invite_request:
         text: Hvorfor ønsker du at tilmelde dig?
       notification_emails:
@@ -107,10 +117,14 @@ da:
         follow: Send e-mail når nogen følger dig
         follow_request: Send email når nogen anmoder om at følge dig
         mention: Send e-mail når nogen nævner dig
-        reblog: Send email når nogen fremhæver din status
+        pending_account: Send en email når en ny konto skal gennemgås
+        reblog: Send e-mail når nogen fremhæver din status
         report: Send email når en ny anmeldelse bliver indsendt
+        trending_tag: Send en email når et ikke-gennemset hashtag trender
       tag:
+        listable: Tillad at dette hashtag vises i søgninger og i bruger oversigten
         name: Hashtag
+        trendable: Tillad at dette hashtag vises under trends
         usable: Tillad toots at benytte dette hashtag
     'no': Nej
     recommended: Anbefalet
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index ed30b32d3..0863cc4a8 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -14,6 +14,12 @@ de:
         text_html: Optional. Du kannst Beitragssyntax nutzen. Du kannst <a href="%{path}">Warnungsvorlagen</a> benutzen um Zeit zu sparen
         type_html: Wähle aus, was du mit <strong>%{acct}</strong> machen möchtest
         warning_preset_id: Optional. Du kannst immer noch eigenen Text an das Ende der Vorlage hinzufügen
+      announcement:
+        all_day: Wenn aktiviert werden nur die Daten des Zeitraums angezeigt
+        ends_at: Optional. Die Ankündigung wird zu diesem Zeitpunkt automatisch zurückgezogen
+        scheduled_at: Leer lassen um die Ankündigung sofort zu veröffentlichen
+        starts_at: Optional. Falls deine Ankündigung an einen bestimmten Zeitraum gebunden ist
+        text: Du kannst die Toot-Syntax verwenden. Bitte beachte den Platz, den die Ankündigung auf dem Bildschirm des Benutzers einnehmen wird
       defaults:
         autofollow: Leute, die sich über deine Einladung registrieren, werden dir automatisch folgen
         avatar: PNG, GIF oder JPG. Maximal %{size}. Wird auf %{dimensions} px herunterskaliert
@@ -41,7 +47,7 @@ de:
         setting_hide_network: Wem du folgst und wer dir folgt, wird in deinem Profil nicht angezeigt
         setting_noindex: Betrifft dein öffentliches Profil und deine Beiträge
         setting_show_application: Die Anwendung die du nutzst wird in der detaillierten Ansicht deiner Beiträge angezeigt
-        setting_use_blurhash: Die Farbverläufe basieren auf den Farben der versteckten Medien, aber verstecken irgendwelche Details
+        setting_use_blurhash: Die Farbverläufe basieren auf den Farben der versteckten Medien, aber verstecken jegliche Details
         setting_use_pending_items: Neue Beiträge hinter einem Klick verstecken anstatt automatisch zu scrollen
         username: Dein Benutzername wird auf %{domain} einzigartig sein
         whole_word: Wenn das Schlagwort nur aus Buchstaben und Zahlen besteht, wird es nur angewendet, wenn es dem ganzen Wort entspricht
@@ -83,6 +89,12 @@ de:
           silence: Stummschalten
           suspend: Deaktivieren und Benutzerdaten unwiderruflich löschen
         warning_preset_id: Benutze eine Warnungsvorlage
+      announcement:
+        all_day: Ganztägiges Ereignis
+        ends_at: Ereignisende
+        scheduled_at: Veröffentlichung planen
+        starts_at: Beginn des Ereignisses
+        text: Ankündigung
       defaults:
         autofollow: Eingeladene Nutzer sollen dir automatisch folgen
         avatar: Profilbild
diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml
index 32bb1530c..231c32959 100644
--- a/config/locales/simple_form.el.yml
+++ b/config/locales/simple_form.el.yml
@@ -3,17 +3,23 @@ el:
   simple_form:
     hints:
       account_alias:
-        acct: Ορίστε το username@domain του λογαριασμού από τον οποίο θέλετε να μετακινηθείτε
+        acct: Όρισε το username@domain του λογαριασμού από τον οποίο θέλεις να μετακινηθείς
       account_migration:
-        acct: Ορίστε το username@domain του λογαριασμού στον οποίο θέλετε να μετακινηθείτε
+        acct: Όρισε το username@domain του λογαριασμού στον οποίο θέλεις να μετακινηθείς
       account_warning_preset:
-        text: Μπορεις να χρησιμοποιήσεις συντακτικό ενός τουτ όπως διευθύνσεις URL, ταμπέλες και αναφορές
+        text: Μπορείς να χρησιμοποιήσεις το ίδιο συντακτικό των τουτ όπως URL, ταμπέλες και αναφορές
       admin_account_action:
         include_statuses: Ο χρήστης θα δει ποια τουτ προκάλεσαν την προειδοποίηση ή την ενέργεια των διαχειριστών
         send_email_notification: Ο χρήστης θα λάβει μια εξήγηση του τι συνέβη με τον λογαριασμό του
         text_html: Προαιρετικό. Μπορείς να χρησιμοποιήσεις συντακτικό ενός τουτ. Μπορείς να <a href="%{path}">ορίσεις προκαθορισμένες προειδοποιήσεις</a> για να γλυτώσεις χρόνο
         type_html: Διάλεξε τι θα κανείς με τον  <strong>%{acct}</strong>
         warning_preset_id: Προαιρετικό. Μπορείς να προσθέσεις επιπλέον κείμενο μετά το προκαθορισμένο κείμενο
+      announcement:
+        all_day: Όταν είναι επιλεγμένο, θα εμφανίζονται μόνο οι ημερομηνίες εντός της χρονικής διάρκειας
+        ends_at: Προαιρετικό. Η ανακοίνωση θα αποσυρθεί αυτόματα τη δηλωμένη ώρα
+        scheduled_at: Αν μείνει κενό, η ενημέρωση θα δημοσιευτεί αμέσως
+        starts_at: Προαιρετικό, για την περίπτωση που η ανακοίνωση αφορά συγκεκριμένη χρονική διάρκεια
+        text: Δεκτό το συντακτικό των τουτ. Παρακαλούμε έχε υπόψιν σου το χώρο που θα καταλάβει η ανακοίνωση στην οθόνη του χρήστη
       defaults:
         autofollow: Όσοι εγγραφούν μέσω της πρόσκλησης θα σε ακολουθούν αυτόματα
         avatar: PNG, GIF ή JPG. Έως %{size}. Θα περιοριστεί σε διάσταση %{dimensions}px
@@ -28,7 +34,7 @@ el:
         header: PNG, GIF ή JPG. Έως %{size}. Θα περιοριστεί σε διάσταση %{dimensions}px
         inbox_url: Αντέγραψε το URL της αρχικής σελίδας του ανταποκριτή (relay) που θέλεις να χρησιμοποιήσεις
         irreversible: Τα φιλτραρισμένα τουτ θα εξαφανιστούν αμετάκλητα, ακόμα και αν το φίλτρο αργότερα αφαιρεθεί
-        locale: Η γλώσσα του περιβάλλοντος χρήσης, των email και των ειδοποιήσεων ώθησης
+        locale: Η γλώσσα χρήσης, των email και των ειδοποιήσεων ώθησης
         locked: Απαιτεί να εγκρίνεις χειροκίνητα τους ακόλουθούς σου
         password: Χρησιμοποίησε τουλάχιστον 8 χαρακτήρες
         phrase: Θα ταιριάζει ανεξαρτήτως πεζών/κεφαλαίων ή προειδοποίησης περιεχομένου του τουτ
@@ -83,6 +89,12 @@ el:
           silence: Αποσιώπηση
           suspend: Αναστολή και αμετάκλητη διαγραφή στοιχείων λογαριασμού
         warning_preset_id: Χρήση προκαθορισμένης προειδοποίησης
+      announcement:
+        all_day: Ολοήμερο γεγονός
+        ends_at: Λήξη γεγονότος
+        scheduled_at: Προγραμματισμένη δημοσίευση
+        starts_at: Έναρξη γεγονότος
+        text: Ανακοίνωση
       defaults:
         autofollow: Προσκάλεσε για να ακολουθήσουν το λογαριασμό σου
         avatar: Αβατάρ
@@ -97,7 +109,7 @@ el:
         display_name: Όνομα εμφάνισης
         email: Διεύθυνση email
         expires_in: Λήξη μετά από
-        fields: Μετεδεδομένα προφίλ
+        fields: Μεταδεδομένα προφίλ
         header: Επικεφαλίδα
         inbox_url: Το URL του inbox του ανταποκριτή (relay)
         irreversible: Απόρριψη αντί για κρύψιμο
@@ -112,12 +124,12 @@ el:
         setting_advanced_layout: Ενεργοποίηση προηγμένης λειτουργίας χρήσης
         setting_aggregate_reblogs: Ομαδοποίηση προωθήσεων στις ροές
         setting_auto_play_gif: Αυτόματη αναπαραγωγή των GIF
-        setting_boost_modal: Εμφάνιση ερώτησης επιβεβαίωσης πριν την προώθηση
+        setting_boost_modal: Επιβεβαίωση πριν την προώθηση
         setting_crop_images: Περιορισμός των εικόνων σε μη-ανεπτυγμένα τουτ σε αναλογία 16x9
         setting_default_language: Γλώσσα δημοσιεύσεων
         setting_default_privacy: Ιδιωτικότητα δημοσιεύσεων
-        setting_default_sensitive: Σημείωση των πολυμέσων πάντα ως ευαίσθητου περιεχομένου
-        setting_delete_modal: Εμφάνιση ερώτησης επιβεβαίωσης πριν διαγράψεις ένα τουτ
+        setting_default_sensitive: Σημείωση όλων των πολυμέσων ως ευαίσθητου περιεχομένου
+        setting_delete_modal: Επιβεβαίωση πριν τη διαγραφή ενός τουτ
         setting_display_media: Εμφάνιση πολυμέσων
         setting_display_media_default: Προκαθορισμένο
         setting_display_media_hide_all: Απόκρυψη όλων
@@ -127,11 +139,11 @@ el:
         setting_noindex: Επέλεξε να μην συμμετέχεις στα αποτελέσματα μηχανών αναζήτησης
         setting_reduce_motion: Μείωση κίνησης κινουμένων στοιχείων
         setting_show_application: Αποκάλυψη εφαρμογής που χρησιμοποιήθηκε για την αποστολή των τουτ
-        setting_system_font_ui: Χρησιμοποίησε την προεπιλεγμένη γραμματοσειρά του συστήματος
+        setting_system_font_ui: Χρήση της προεπιλεγμένης γραμματοσειράς του συστήματος
         setting_theme: Θέμα ιστότοπου
         setting_trends: Εμφάνιση σημερινών τάσεων
-        setting_unfollow_modal: Εμφάνιση ερώτησης επιβεβαίωσης πριν διακόψεις την παρακολούθηση κάποιου
-        setting_use_blurhash: Εμφάνιση χρωματισμών για τα κρυμμένα πολυμέσα
+        setting_unfollow_modal: Επιβεβαίωση πριν τη διακοπή παρακολούθησης κάποιου
+        setting_use_blurhash: Χρωματιστή απόκρυψη για τα κρυμμένα πολυμέσα
         setting_use_pending_items: Αργή λειτουργία
         severity: Αυστηρότητα
         type: Τύπος εισαγωγής
@@ -141,15 +153,15 @@ el:
       featured_tag:
         name: Ταμπέλα
       interactions:
-        must_be_follower: Μπλόκαρε τις ειδοποιήσεις από όσους δεν ακολουθείς
-        must_be_following: Μπλόκαρε τις ειδοποιήσεις που προέρχονται από άτομα που δεν τα ακολουθείς
+        must_be_follower: Μπλόκαρε τις ειδοποιήσεις από όσους δεν σε ακολουθούν
+        must_be_following: Μπλόκαρε τις ειδοποιήσεις από όσους δεν ακολουθείς
         must_be_following_dm: Μπλόκαρε τα προσωπικά μηνύματα από όσους δεν ακολουθείς
       invite:
         comment: Σχόλια
       invite_request:
         text: Γιατί θέλεις να συμμετάσχεις;
       notification_emails:
-        digest: Στέλνε συνοπτικά email
+        digest: Αποστολή συνοπτικών email
         favourite: Αποστολή email όταν κάποιος σημειώνει ως αγαπημένη τη δημοσίευσή σου
         follow: Αποστολή email όταν κάποιος σε ακολουθεί
         follow_request: Αποστολή email όταν κάποιος ζητάει να σε ακολουθήσει
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index b54e0ff2b..c6a301804 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -14,6 +14,12 @@ en:
         text_html: Optional. You can use toot syntax. You can <a href="%{path}">add warning presets</a> to save time
         type_html: Choose what to do with <strong>%{acct}</strong>
         warning_preset_id: Optional. You can still add custom text to end of the preset
+      announcement:
+        all_day: When checked, only the dates of the time range will be displayed
+        ends_at: Optional. Announcement will be automatically unpublished at this time
+        scheduled_at: Leave blank to publish the announcement immediately
+        starts_at: Optional. In case your announcement is bound to a specific time range
+        text: You can use toot syntax. Please be mindful of the space the announcement will take up on the user's screen
       defaults:
         autofollow: People who sign up through the invite will automatically follow you
         avatar: PNG, GIF or JPG. At most %{size}. Will be downscaled to %{dimensions}px
@@ -88,6 +94,12 @@ en:
           silence: Silence
           suspend: Suspend and irreversibly delete account data
         warning_preset_id: Use a warning preset
+      announcement:
+        all_day: All-day event
+        ends_at: End of event
+        scheduled_at: Schedule publication
+        starts_at: Start of event
+        text: Announcement
       defaults:
         autofollow: Invite to follow your account
         avatar: Avatar
diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml
index c8239b230..994cb1b84 100644
--- a/config/locales/simple_form.eo.yml
+++ b/config/locales/simple_form.eo.yml
@@ -14,6 +14,8 @@ eo:
         avatar: Formato PNG, GIF aŭ JPG. Ĝis %{size}. Estos malgrandigita al %{dimensions}px
         bot: Tiu konto ĉefe faras aŭtomatajn agojn, kaj povas esti ne kontrolata
         context: Unu ol pluraj kuntekstoj kie la filtrilo devus agi
+        current_password: Pro sekuraj kialoj, bonvolu enigi la pasvorton de la nuna konto
+        current_username: Por konfirmi, bonvolu enigi la uzantnomon de la nuna konto
         digest: Sendita nur post longa tempo de neaktiveco, kaj nur se vi ricevis personan mesaĝon en via foresto
         email: Vi ricevos konfirman retmesaĝon
         fields: Vi povas havi ĝis 4 tabelajn elementojn en via profilo
@@ -37,6 +39,8 @@ eo:
         whole_word: Kiam la vorto aŭ frazo estas nur litera aŭ cifera, ĝi estos uzata nur se ĝi kongruas kun la tuta vorto
       featured_tag:
         name: 'Vi povus uzi iun el la jenaj:'
+      form_challenge:
+        current_password: Vi eniras sekuran areon
       imports:
         data: CSV-dosiero el alia Mastodon-servilo
       invite_request:
@@ -113,6 +117,7 @@ eo:
         setting_theme: Reteja etoso
         setting_trends: Montri hodiaŭajn furoraĵojn
         setting_unfollow_modal: Montri fenestron por konfirmi antaŭ ol ĉesi sekvi iun
+        setting_use_blurhash: Montri buntajn transirojn por kaŝitaj aŭdovidaĵoj
         setting_use_pending_items: Malrapida reĝimo
         severity: Graveco
         type: Importa tipo
@@ -137,7 +142,7 @@ eo:
         mention: Sendi retmesaĝon kiam iu mencias vin
         pending_account: Sendi retmesaĝon kiam nova konto bezonas kontrolon
         reblog: Sendi retmesaĝon kiam iu diskonigas vian mesaĝon
-        report: Sendi retmesaĝon kiam nova signalo estas sendita
+        report: Nova signalo estas sendita
         trending_tag: Sendi retpoŝtmesaĝon kiam nekontrolita kradvorto furoras
       tag:
         name: Kradvorto
diff --git a/config/locales/simple_form.es-AR.yml b/config/locales/simple_form.es-AR.yml
index c62ded28b..78bb3e275 100644
--- a/config/locales/simple_form.es-AR.yml
+++ b/config/locales/simple_form.es-AR.yml
@@ -14,6 +14,12 @@ es-AR:
         text_html: Opcional. Podés usar sintaxis de toots. Podés <a href="%{path}">agregar preajustes de advertencia</a> para ahorrar tiempo.
         type_html: Elegí qué hacer con <strong>%{acct}</strong>
         warning_preset_id: Opcional. Todavía podés agregar texto personalizado al final del preajuste
+      announcement:
+        all_day: Cuando esté seleccionado, sólo se mostrarán las fechas del rango de tiempo
+        ends_at: Opcional. El anuncio desaparecerá automáticamente en este momento
+        scheduled_at: Dejar en blanco para publicar el anuncio inmediatamente
+        starts_at: Opcional. En caso de que tu anuncio esté vinculado a un rango de tiempo específico
+        text: Podés usar la sintaxis de toot. Por favor, tené en cuenta el espacio que ocupará el anuncio en la pantalla del usuario
       defaults:
         autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente
         avatar: 'PNG, GIF o JPG. Máximo: %{size}. Será subescalado a %{dimensions} píxeles.'
@@ -83,6 +89,12 @@ es-AR:
           silence: Silenciar
           suspend: Suspender y eliminar de forma irreversible los datos de la cuenta
         warning_preset_id: Usar un texto predeterminado
+      announcement:
+        all_day: Evento de todo el día
+        ends_at: Fin del evento
+        scheduled_at: Programar publicación
+        starts_at: Comienzo del evento
+        text: Anuncio
       defaults:
         autofollow: Invitar para seguir tu cuenta
         avatar: Avatar
diff --git a/config/locales/simple_form.es.yml b/config/locales/simple_form.es.yml
index 837ca8101..745de3332 100644
--- a/config/locales/simple_form.es.yml
+++ b/config/locales/simple_form.es.yml
@@ -14,6 +14,12 @@ es:
         text_html: Opcional. Puede usar sintaxis de toots. Puede añadir <a href="%{path}">configuraciones predefinidas de advertencia</a> para ahorrar tiempo
         type_html: Elige qué hacer con <strong>%{acct}</strong>
         warning_preset_id: Opcional. Aún puede añadir texto personalizado al final de la configuración predefinida
+      announcement:
+        all_day: Cuando está seleccionado solo se mostrarán las fechas del rango de tiempo
+        ends_at: Opcional. El anuncio desaparecerá automáticamente en este momento
+        scheduled_at: Dejar en blanco para publicar el anuncio inmediatamente
+        starts_at: Opcional. En caso de que su anuncio esté vinculado a un intervalo de tiempo específico
+        text: Puedes usar la sintaxis toot. Por favor ten en cuenta el espacio que ocupará el anuncio en la pantalla del usuario
       defaults:
         autofollow: Los usuarios que se registren mediante la invitación te seguirán automáticamente
         avatar: PNG, GIF o JPG. Máximo %{size}. Será escalado a %{dimensions}px
@@ -56,7 +62,7 @@ es:
       invite_request:
         text: Esto nos ayudará a revisar su aplicación
       sessions:
-        otp: 'Introduce el código de autenticación de dos factores geberado por tu aplicación de teléfono o usa uno de tus códigos de recuperación:'
+        otp: 'Introduce el código de autenticación de dos factores generado por tu aplicación de teléfono o usa uno de tus códigos de recuperación:'
       tag:
         name: Sólo se puede cambiar el cajón de las letras, por ejemplo, para que sea más legible
       user:
@@ -83,6 +89,12 @@ es:
           silence: Silenciar
           suspend: Suspender y eliminar de forma irreversible la información de la cuenta
         warning_preset_id: Usar un aviso predeterminado
+      announcement:
+        all_day: Evento de todo el día
+        ends_at: Fin del evento
+        scheduled_at: Programar publicación
+        starts_at: Comienzo del evento
+        text: Anuncio
       defaults:
         autofollow: Invitar a seguir tu cuenta
         avatar: Avatar
diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml
index 1f34adb05..b6253a197 100644
--- a/config/locales/simple_form.eu.yml
+++ b/config/locales/simple_form.eu.yml
@@ -14,6 +14,12 @@ eu:
         text_html: Aukerakoa. Toot sintaxia erabili dezakezu. <a href="%{path}">Abisu aurre-ezarpenak</a> gehitu ditzakezu denbora aurrezteko
         type_html: Erabaki zer egin <strong>%{acct}</strong> kontuarekin
         warning_preset_id: Aukerakoa. Zure testua gehitu dezakezu aurre-ezarpenaren ostean
+      announcement:
+        all_day: Markatutakoan soilik denbora barrutiko datak erakutsiko dira
+        ends_at: Aukerakoa. Iragapena une honetan automatikoki desargitaratuko da
+        scheduled_at: Laga hutsik iragarpena berehala argitaratzeko
+        starts_at: Aukerakoa. Zure iragarpena denbora-tarte batera lotuta dagoenerako
+        text: Toot-etako sintaxia erabili dezakezu. Kontuan izan iragarpenak erabiltzailearen pantailan hartuko duen neurria
       defaults:
         autofollow: Gonbidapena erabiliz izena ematen dutenek automatikoki jarraituko dizute
         avatar: PNG, GIF edo JPG. Gehienez %{size}. %{dimensions}px neurrira eskalatuko da
@@ -83,6 +89,12 @@ eu:
           silence: Isiltarazi
           suspend: Kanporatu eta behin betiko ezabatu kontuko datuak
         warning_preset_id: Erabili aurre-ezarritako abisu bat
+      announcement:
+        all_day: Egun osoko gertaera
+        ends_at: Gertaeraren amaiera
+        scheduled_at: Programatu argitaratzea
+        starts_at: Gertaeraren hasiera
+        text: Iragarpena
       defaults:
         autofollow: Gonbidatu zure kontua jarraitzera
         avatar: Abatarra
diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml
index 6beee0076..0e5332f1e 100644
--- a/config/locales/simple_form.fr.yml
+++ b/config/locales/simple_form.fr.yml
@@ -14,6 +14,12 @@ fr:
         text_html: Optionnel. Vous pouvez utilisez la syntaxe des pouets. Vous pouvez <a href="%{path}">ajouter des présélections d’attention</a> pour économiser du temps
         type_html: Choisir que faire avec <strong>%{acct}</strong>
         warning_preset_id: Optionnel. Vous pouvez toujours ajouter un texte personnalisé à la fin de la présélection
+      announcement:
+        all_day: Si coché, seules les dates de l’intervalle de temps seront affichées
+        ends_at: Optionnel. L’annonce sera automatiquement dépubliée à ce moment
+        scheduled_at: Laisser vide pour publier l’annonce immédiatement
+        starts_at: Optionnel. Si votre annonce est liée à une période spécifique
+        text: Vous pouvez utiliser la syntaxe d’un pouet. Veuillez prendre en compte l’espace que l'annonce prendra sur l’écran de l'utilisateur
       defaults:
         autofollow: Les personnes qui s’inscrivent grâce à l’invitation vous suivront automatiquement
         avatar: Au format PNG, GIF ou JPG. %{size} maximum. Sera réduit à %{dimensions}px
@@ -32,8 +38,8 @@ fr:
         locked: Vous devrez approuver chaque abonné⋅e et vos statuts ne s’afficheront qu’à vos abonné⋅es
         password: Utilisez au moins 8 caractères
         phrase: Sera trouvé sans que la case ou l’avertissement de contenu du pouet soit pris en compte
-        scopes: À quelles APIs l’application sera autorisée à accéder. Si vous sélectionnez un périmètre de haut-niveau, vous n’avez pas besoin de sélectionner les individuels.
-        setting_aggregate_reblogs: Ne pas afficher de nouveaux repartagés pour les pouets qui ont été récemment repartagés (n’affecte que les repartagés nouvellement reçus)
+        scopes: À quelles APIs l’application sera autorisée à accéder. Si vous sélectionnez une permission générale, vous n’avez pas besoin de sélectionner les permissions plus précises.
+        setting_aggregate_reblogs: Ne pas afficher de nouveaux partages pour les pouets qui ont été récemment partagés (n’affecte que les partages nouvellement reçus)
         setting_default_sensitive: Les médias sensibles sont cachés par défaut et peuvent être révélés d’un simple clic
         setting_display_media_default: Masquer les médias marqués comme sensibles
         setting_display_media_hide_all: Toujours masquer tous les médias
@@ -83,6 +89,12 @@ fr:
           silence: Masquer
           suspend: Suspendre et effacer les données du compte de manière irréversible
         warning_preset_id: Utiliser un modèle d’avertissement
+      announcement:
+        all_day: Événement de toute la journée
+        ends_at: Fin de l’événement
+        scheduled_at: Planifier la publication
+        starts_at: Début de l’événement
+        text: Annonce
       defaults:
         autofollow: Invitation à suivre votre compte
         avatar: Image de profil
@@ -110,7 +122,7 @@ fr:
         password: Mot de passe
         phrase: Mot-clé ou phrase
         setting_advanced_layout: Activer l’interface Web avancée
-        setting_aggregate_reblogs: Repartagés en groupe dans la ligne de temps
+        setting_aggregate_reblogs: Partages groupés dans les fils d’actualités
         setting_auto_play_gif: Lire automatiquement les GIFs animés
         setting_boost_modal: Afficher une fenêtre de confirmation avant de partager
         setting_crop_images: Recadrer les images dans les pouets non-expansés à 16x9
@@ -155,7 +167,7 @@ fr:
         follow_request: Envoyer un courriel lorsque quelqu’un demande à me suivre
         mention: Envoyer un courriel lorsque quelqu’un me mentionne
         pending_account: Envoyer un courriel lorsqu’un nouveau compte est en attente d’approbation
-        reblog: Envoyer un courriel lorsque quelqu’un partage mes statuts
+        reblog: Quelqu’un a partagé votre statut
         report: Envoyer un courriel lorsqu’un nouveau rapport est soumis
         trending_tag: Envoyer un e-mail quand un hashtag non contrôlé est en tendance actuelle
       tag:
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index 19c0c7002..d6768a17d 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -13,26 +13,32 @@ gl:
         send_email_notification: A usuaria recibirá unha explicación sobre o que lle aconteceu a súa conta
         text_html: Optativo. Pode utilizar formato no toot. Pode <a href="%{path}">engadir avisos preestablecidos</a> para aforrar tempo
         type_html: Escolla que facer con <strong>%{acct}</strong>
-        warning_preset_id: Optativo. Poderá engadir texto personalizado ao final do preestablecido
+        warning_preset_id: Optativo. Poderás engadir texto personalizado ao final do preestablecido
+      announcement:
+        all_day: Cando se marca, só serán amosadas as datas do intre de tempo
+        ends_at: Opcional. O anuncio non se publicará de xeito automático neste intre
+        scheduled_at: Déixao baleiro para publicar o anuncio de xeito inmediato
+        starts_at: Opcional. No caso de que o teu anuncio estea vinculado a un intre de tempo específico
+        text: Podes empregar a sintaxe do toot. Ten en conta o espazo que ocupará o anuncio na pantalla do usuario
       defaults:
-        autofollow: As persoas que se conectaron a través de un convite seguirana automáticamente a vostede
+        autofollow: As persoas que se conectaron a través dun convite seguirante automáticamente
         avatar: PNG, GIF ou JPG.  Máximo %{size}. Será reducida a %{dimensions}px
         bot: Esta conta realiza principalmente accións automatizadas e podería non estar monitorizada
         context: Un ou varios contextos onde se debería aplicar o filtro
         current_password: Por razóns de seguridade, introduce o contrasinal da conta actual
         current_username: Para confirmar, introduce o nome de usuaria da conta actual
-        digest: Enviar só tras un longo período de inactividade e só si recibeu algunha mensaxe persoal na súa ausencia
+        digest: Enviar só tras un longo período de inactividade e só se recibeu algunha mensaxe directa na súa ausencia
         discoverable: O directorio de perfil é outro xeito para que a túa conta alcance unha maior audiencia
-        email: Enviaráselle un correo-e de confirmación
+        email: Ímosche enviar un correo de confirmación
         fields: Pode ter ate 4 elementos no seu perfil mostrados como unha táboa
         header: PNG, GIF ou JPG. Máximo %{size}. Será reducida a %{dimensions}px
         inbox_url: Copiar o URL desde a páxina de inicio do repetidor que queres utilizar
         irreversible: Os toots filtrados desaparecerán de xeito irreversible, incluso si despois se elimina o filtro
         locale: O idioma da interface de usuaria, correos e notificacións
-        locked: Require que vostede acepte as seguidoras de xeito manual
+        locked: Require que ti aceptes as seguidoras de xeito manual
         password: Utilice 8 caracteres ao menos
         phrase: Concordará independentemente das maiúsculas ou avisos de contido no toot
-        scopes: A que APIs terá acceso a aplicación. Si selecciona un ámbito de alto nivel, non precisa seleccionar elementos individuais.
+        scopes: A que APIs terá acceso a aplicación. Se selecciona un ámbito de alto nivel, non precisa seleccionar elementos individuais.
         setting_aggregate_reblogs: Non mostrar novas promocións de toots que foron promocionados recentemente (só afecta a promocións recén recibidas)
         setting_default_sensitive: Medios sensibles marcados como ocultos por defecto e móstranse cun click
         setting_display_media_default: Ocultar medios marcados como sensibles
@@ -75,7 +81,7 @@ gl:
       admin_account_action:
         include_statuses: Incluír toots reportados no correo
         send_email_notification: Notificar a usuaria por correo-e
-        text: Aviso personalizado
+        text: Aviso persoalizado
         type: Acción
         types:
           disable: Desactivar
@@ -83,13 +89,19 @@ gl:
           silence: Acalar
           suspend: Suspender e eliminar irreversiblemente datos da conta
         warning_preset_id: Utilizar un aviso preestablecido
+      announcement:
+        all_day: Evento para todo o día
+        ends_at: Final do acontecemento
+        scheduled_at: Publicación programada
+        starts_at: Comezo do acontecemento
+        text: Anuncio
       defaults:
         autofollow: Convide a seguir a súa conta
         avatar: Avatar
         bot: Esta conta é de un bot
         chosen_languages: Filtrar idiomas
-        confirm_new_password: Confirme o novo contrasinal
-        confirm_password: Confirme o contrasinal
+        confirm_new_password: Confirma o novo contrasinal
+        confirm_password: Confirma o contrasinal
         context: Contextos do filtro
         current_password: Contrasinal actual
         data: Datos
@@ -105,7 +117,7 @@ gl:
         locked: Protexer conta
         max_uses: Número máximo de usos
         new_password: Novo contrasinal
-        note: Sobre vostede
+        note: Acerca de ti
         otp_attempt: Código de Dobre-Factor
         password: Contrasinal
         phrase: Palabra chave ou frase
@@ -142,8 +154,8 @@ gl:
         name: Etiqueta
       interactions:
         must_be_follower: Bloquear as notificacións de non-seguidoras
-        must_be_following: Bloquea as notificacións de personas que non segue
-        must_be_following_dm: Bloquea as mensaxes directas de personas que non segue
+        must_be_following: Bloquea as notificacións de persoas que non segue
+        must_be_following_dm: Bloquea as mensaxes directas de persoas que non segue
       invite:
         comment: Comentar
       invite_request:
diff --git a/config/locales/simple_form.hu.yml b/config/locales/simple_form.hu.yml
index 91ecd8746..cee6bdb45 100644
--- a/config/locales/simple_form.hu.yml
+++ b/config/locales/simple_form.hu.yml
@@ -14,6 +14,12 @@ hu:
         text_html: Opcionális. A tülk szintaxis használható. Egyszerűsítés végett létre is hozhatsz <a href="%{path}">figyelmeztetéseket</a>
         type_html: Megmondhatod, mi legyen vele <strong>%{acct}</strong>
         warning_preset_id: Opcionális. A figyelmeztetés végére saját szöveget is írhatsz
+      announcement:
+        all_day: Bejelölve csak a dátumok számítanak majd a megadott intervallumból
+        ends_at: Opcionális. A közleményt ekkor automatikusan levesszük
+        scheduled_at: Hagyd üresen, hogy a közleményt azonnal közzétegyük
+        starts_at: Opcionális. Akkor használd, ha a közleményed adott időintervallumra vonatkozik
+        text: Használhatod a tülkök szintaxisát. Ügyelj arra, mennyi helyet foglal el majd a közlemény a felhasználó képernyőjén
       defaults:
         autofollow: Akik meghívón keresztül regisztrálnak, automatikusan követni fognak téged
         avatar: PNG, GIF vagy JPG. Maximum %{size}. Átméretezzük %{dimensions} pixelre
@@ -83,6 +89,12 @@ hu:
           silence: Elnémítás
           suspend: Fiók felfüggesztése, adatok törlése visszaállíthatatlanul
         warning_preset_id: Figyelmeztetés használata
+      announcement:
+        all_day: Egész napos esemény
+        ends_at: Esemény vége
+        scheduled_at: Közlemény időzítése
+        starts_at: Esemény kezdete
+        text: Közlemény
       defaults:
         autofollow: Meghívás a fiókod követésére
         avatar: Profilkép
diff --git a/config/locales/simple_form.id.yml b/config/locales/simple_form.id.yml
index 54d10f21a..263b749eb 100644
--- a/config/locales/simple_form.id.yml
+++ b/config/locales/simple_form.id.yml
@@ -14,6 +14,12 @@ id:
         text_html: Opsional. Anda dapat memakai sintaks toot. Anda dapat <a href="%{path}">menambahkan preset peringatan</a> untuk hemat waktu
         type_html: Pilih apa yang perlu dilakukan dengan <strong>%{acct}</strong>
         warning_preset_id: Opsional. Anda tetap dapat menambahkan teks kustom pada akhir preset
+      announcement:
+        all_day: Saat dicentang, hanya tanggal dalam rentang waktu tertentu yang akan ditampilkan
+        ends_at: Opsional. Pengumuman akan diterbitkan secara otomatis saat ini
+        scheduled_at: Biarkan kosong jika ingin menerbitkan pengumuman secara langsung
+        starts_at: Opsional. Persiapan jika pengumuman Anda terikat pada rentang waktu tertentu
+        text: Anda dapat menggunakan sintaks toot. Mohon perhatikan ruang pengumuman yang mungkin akan memenuhi layar pengguna
       defaults:
         autofollow: Orang yang ingin mendaftar lewat undangan, otomatis mengikuti Anda
         avatar: PNG, GIF atau JPG. Maksimal %{size}. Ukuran dikecilkan menjadi %{dimensions}px
@@ -57,6 +63,8 @@ id:
         text: Ini akan membantu kami meninjau aplikasi Anda
       sessions:
         otp: Masukkan kode dua-faktor dari handphone atau gunakan kode pemulihan anda.
+      tag:
+        name: Anda hanya dapat mengubahnya ke huruf kecil/besar, misalnya, agar lebih mudah dibaca
       user:
         chosen_languages: Ketika dicentang, hanya toot dalam bahasa yang dipilih yang akan ditampilkan di linimasa publik
     labels:
@@ -111,6 +119,7 @@ id:
         setting_aggregate_reblogs: Boost grup di linimasa
         setting_auto_play_gif: Mainkan otomatis animasi GIF
         setting_boost_modal: Tampilkan dialog konfirmasi dialog sebelum boost
+        setting_crop_images: Potong gambar ke 16x9 pada toot yang tidak dibentangkan
         setting_default_language: Bahasa posting
         setting_default_privacy: Privasi postingan
         setting_default_sensitive: Selalu tandai media sebagai sensitif
diff --git a/config/locales/simple_form.is.yml b/config/locales/simple_form.is.yml
new file mode 100644
index 000000000..b7aabd5d1
--- /dev/null
+++ b/config/locales/simple_form.is.yml
@@ -0,0 +1,171 @@
+---
+is:
+  simple_form:
+    hints:
+      account_alias:
+        acct: Tilgreindu notandanafn@lén á notandaaðgangnum sem þú vilt flytjast frá
+      account_migration:
+        acct: Tilgreindu notandanafn@lén á notandaaðgangnum sem þú vilt flytjast til
+      account_warning_preset:
+        text: Þú getur notað sömu skilgreiningar og fyrir tíst, svo sem URL-slóðir, myllumerki og tilvísanir
+      admin_account_action:
+        include_statuses: Notandinn mun sjá hvaða tíst hafa valdið viðbrögðum umsjónarmanns eða aðvörun kerfisins
+        send_email_notification: Notandinn mun fá útskýringar á því hvað gerðist með notandaaðganginn hans
+        text_html: Valfrjálst. Þú getur notað sömu skilgreiningar og fyrir tíst. Þú getur <a href="%{path}">bætt inn forstilltum aðvörunum</a> til að spara tíma
+        type_html: Veldu hvað eigi að gera við <strong>%{acct}</strong>
+        warning_preset_id: Valkvætt. Þú getur ennþá bætt sérsniðnum texta við enda forstillinga
+      defaults:
+        autofollow: Fólk sem skráir sig í gegnum boðið mun sjálfkrafa fylgjast með þér
+        avatar: PNG, GIF eða JPG. Mest %{size}. Verður smækkað í %{dimensions}px
+        bot: Þessi aðgangur er aðallega til að framkvæma sjálfvirkar aðgerðir og gæti verið án þess að hann sé vaktaður reglulega
+        context: Eitt eða fleiri samhengi þar sem sían ætti að gilda
+        current_password: Í öryggisskyni skaltu setja inn lykilorðið fyrir þennan notandaaðgang
+        current_username: Til að staðfesta skaltu setja inn notandanafnið fyrir þennan notandaaðgang
+        digest: Er aðeins sent eftir lengri tímabil án virkni og þá aðeins ef þú hefur fengið persónuleg skilaboð á meðan þú hefur ekki verið á línunni
+        discoverable: Persónusniðamappan er önnur leið til að láta notandaaðganginn þinn ná til fleiri lesenda
+        email: Þú munt fá sendan staðfestingarpóst
+        fields: Þú getur birt allt að 4 atriði sem töflu á notandasniðinu þínu
+        header: PNG, GIF eða JPG. Mest %{size}. Verður smækkað í %{dimensions}px
+        inbox_url: Afritaðu slóðina af forsíðu endurvarpans sem þú vilt nota
+        irreversible: Síuð tíst munu hverfa óendurkræft, jafnvel þó sían sé seinna fjarlægð
+        locale: Tungumál notandaviðmótsins, tölvupósts og ýti-tilkynninga
+        locked: Krefst þess að þú samþykkir fylgjendur handvirkt
+        password: Notaðu minnst 8 stafi
+        phrase: Verður notað til samsvörunar burtséð frá stafstöðu texta eða viðvörunar vegna efnis í tísti
+        scopes: Að hvaða API-kerfisviðmótum forritið fær aðgang. Ef þú velur efsta-stigs svið, þarftu ekki að gefa einstakar heimildir.
+        setting_aggregate_reblogs: Ekki sýna nýjar endurbirtingar á tístum sem hafa nýlega verið endurbirt (hefur bara áhrif á ný-mótteknar endurbirtingar)
+        setting_default_sensitive: Viðkvæmt myndefni er sjálfgefið falið og er hægt að birta með smelli
+        setting_display_media_default: Fela myndefni sem merkt er viðkvæmt
+        setting_display_media_hide_all: Alltaf fela allt myndefni
+        setting_display_media_show_all: Alltaf birta myndefni sem merkt er viðkvæmt
+        setting_hide_network: Hverjum þú fylgist með og hverjir fylgjast með þér verður ekki birt á notandasniðinu þínu
+        setting_noindex: Hefur áhrif á opinbera notandasniðið þitt og stöðusíður
+        setting_show_application: Nafnið á forritinu sem þú notar til að tísta mun birtast í ítarlegri sýn á tístunum þínum
+        setting_use_blurhash: Litstiglarnir byggja á litunum í földu myndunum, en gera öll smáatriði óskýr
+        setting_use_pending_items: Fela uppfærslur tímalínu þar til smellt er, í stað þess að hún skruni streyminu sjálfvirkt
+        username: Notandanafnið þitt verður einstakt á %{domain}
+        whole_word: Þegar stikkorð eða frasi er einungis tölur og bókstafir, verður það aðeins notað ef það samsvarar heilu orði
+      domain_allow:
+        domain: Þetta lén mun geta sótt gögn af þessum vefþjóni og tekið verður á móti innsendum gögnum frá léninu til vinnslu og geymslu
+      featured_tag:
+        name: 'Þú gætir viljað nota eitt af þessum:'
+      form_challenge:
+        current_password: Þú ert að fara inn á öryggissvæði
+      imports:
+        data: CSV-skrá sem flutt hefur verið út af öðrum Mastodon-þjóni
+      invite_request:
+        text: Þetta mun hjálpa okkur við að yfirfara umsóknina þína
+      sessions:
+        otp: 'Settu inn tveggja-þátta kóðann sem farsímaforritið útbjó eða notaðu einn af endurheimtukóðunum þínum:'
+      tag:
+        name: Þú getur aðeins breytt stafstöði mill há-/lágstafa, til gæmis til að gera þetta læsilegra
+      user:
+        chosen_languages: Þegar merkt er við þetta, birtast einungis tíst á völdum tungumálum á opinberum tímalínum
+    labels:
+      account:
+        fields:
+          name: Skýring
+          value: Efni
+      account_alias:
+        acct: Auðkenni gamla aðgangsins
+      account_migration:
+        acct: Auðkenni nýja aðgangsins
+      account_warning_preset:
+        text: Forstilltur texti
+      admin_account_action:
+        include_statuses: Innifela kærð tíst í tölvupóstinum
+        send_email_notification: Láta notanda vita með tölvupósti
+        text: Sérsniðin aðvörun
+        type: Aðgerð
+        types:
+          disable: Gera innskráningu óvirka
+          none: Gera ekkert
+          silence: Hylja
+          suspend: Setja í bið og eyða endanlega gögnum notandaaðgangsins
+        warning_preset_id: Nota forstillta aðvörun
+      defaults:
+        autofollow: Bjóða að fylgjast með aðgangnum þínum
+        avatar: Auðkennismynd
+        bot: Þetta er aðgangur fyrir róbót
+        chosen_languages: Sía tungumál
+        confirm_new_password: Staðfestu nýja lykilorðið
+        confirm_password: Staðfestu lykilorðið
+        context: Samhengi síu
+        current_password: Núverandi lykilorð
+        data: Gögn
+        discoverable: Hafa þennan aðgang með í notendaskránni
+        display_name: Birtingarnafn
+        email: Tölvupóstfang
+        expires_in: Rennur út eftir
+        fields: Lýsigögn notandasniðs
+        header: Síðuhaus
+        inbox_url: URL-slóð á innhólf endurvarpa
+        irreversible: Fella niður í staðinn fyrir að fela
+        locale: Tungumál viðmóts
+        locked: Læsa aðgangi
+        max_uses: Hámarksfjöldi afnota
+        new_password: Nýtt lykilorð
+        note: Æviágrip
+        otp_attempt: Teggja-þátta kóði
+        password: Lykilorð
+        phrase: Stikkorð eða frasi
+        setting_advanced_layout: Virkja ítarlegt vefviðmót
+        setting_aggregate_reblogs: Hópa endurbirtingar í tímalínum
+        setting_auto_play_gif: Spila sjálfkrafa GIF-hreyfimyndir
+        setting_boost_modal: Sýna staðfestingarglugga fyrir endurbirtingu
+        setting_crop_images: Utansníða myndir í ekki útfelldum tístum í 16x9
+        setting_default_language: Tungumál sem skrifað er á
+        setting_default_privacy: Gagnaleynd færslna
+        setting_default_sensitive: Alltaf merkja myndefni sem viðkvæmt
+        setting_delete_modal: Birta staðfestingarglugga áður en tísti er eytt
+        setting_display_media: Birting myndefnis
+        setting_display_media_default: Sjálfgefið
+        setting_display_media_hide_all: Fela allt
+        setting_display_media_show_all: Birta allt
+        setting_expand_spoilers: Alltaf útfella tíst sem eru með aðvörun vegna efnisins
+        setting_hide_network: Fela netkerfið þitt
+        setting_noindex: Afþakka atriðaskráningu í leitarvélum
+        setting_reduce_motion: Minnka hreyfingu í hreyfimyndum
+        setting_show_application: Upplýsa um forrit sem er til að senda tíst
+        setting_system_font_ui: Nota sjálfgefið letur kerfisins
+        setting_theme: Þema vefsvæðis
+        setting_trends: Birta það sem er efst á baugi í dag
+        setting_unfollow_modal: Birta staðfestingarglugga áður en hætt er að fylgjast með einhverjum
+        setting_use_blurhash: Sýna skæra litstigla í stað falins myndefnis
+        setting_use_pending_items: Rólegur hamur
+        severity: Mikilvægi
+        type: Tegund innflutnings
+        username: Notandanafn
+        username_or_email: Notandanafn eða tölvupóstfang
+        whole_word: Heil orð
+      featured_tag:
+        name: Myllumerki
+      interactions:
+        must_be_follower: Loka á tilkynningar frá þeim sem ekki eru fylgjendur
+        must_be_following: Loka á tilkynningar frá þeim sem þú fylgist ekki með
+        must_be_following_dm: Loka á bein skilaboð frá þeim sem þú fylgist ekki með
+      invite:
+        comment: Athugasemd
+      invite_request:
+        text: Hvers vegna viltu taka þátt?
+      notification_emails:
+        digest: Senda uppsafnaðan tölvupóst
+        favourite: Einhver setti stöðufærslu þína í eftirlæti
+        follow: Einhver fylgist núna með þér
+        follow_request: Einhver hefur beðið um að fylgjast með þér
+        mention: Einhver minntist á þig
+        pending_account: Nýr notandaaðgangur þarfnast yfirferðar
+        reblog: Einhver endurbirti stöðufærslu þína
+        report: Ný kæra hefur verið send inn
+        trending_tag: Óyfirfarið myllumerki er í umræðunni
+      tag:
+        listable: Leyfa þessu myllumerki að birtast í leitum og í persónusniðamöppunni
+        name: Myllumerki
+        trendable: Leyfa þessu myllumerki að birtast undir tilhneigingum
+        usable: Leyfa tístum að nota þetta myllumerki
+    'no': Nei
+    recommended: Mælt með
+    required:
+      mark: "*"
+      text: nauðsynlegt
+    'yes': Já
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index fea6e04d7..6da1173ef 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -14,6 +14,12 @@ ja:
         text_html: オプションです。投稿に用いる構文を使うことができます。簡略化のため<a href="%{path}">プリセット警告文を追加</a>することができます
         type_html: "<strong>%{acct}</strong>さんに対し、何を行うか選択してください"
         warning_preset_id: オプションです。プリセット警告文の末尾に任意の文字列を追加することができます
+      announcement:
+        all_day: 選択すると、おしらせ対象の開始および終了日時は日付のみ表示されます
+        ends_at: オプションです。指定すると、お知らせの掲載はその日時で自動的に終了します
+        scheduled_at: お知らせを今すぐ掲載する場合は空欄にしてください
+        starts_at: オプションです。お知らせしたい事柄の期間が決まっている場合に使用します
+        text: トゥートと同じ構文を使用できます。アナウンスが占める画面のスペースに注意してください
       defaults:
         autofollow: 招待から登録した人が自動的にあなたをフォローするようになります
         avatar: "%{size}までのPNG、GIF、JPGが利用可能です。%{dimensions}pxまで縮小されます"
@@ -83,6 +89,12 @@ ja:
           silence: サイレンス
           suspend: 停止しアカウントのデータを恒久的に削除する
         warning_preset_id: プリセット警告文を使用
+      announcement:
+        all_day: 終日
+        ends_at: お知らせ対象の終了日時
+        scheduled_at: 掲載する日時
+        starts_at: おしらせ対象の開始日時
+        text: お知らせ
       defaults:
         autofollow: 招待から参加後、あなたをフォロー
         avatar: アイコン
@@ -151,14 +163,14 @@ ja:
         text: 意気込みをお聞かせください
       notification_emails:
         digest: タイムラインからピックアップしてメールで通知する
-        favourite: お気に入りに登録された時にメールで通知する
-        follow: フォローされた時にメールで通知する
-        follow_request: フォローリクエストを受けた時にメールで通知する
-        mention: 返信が来た時にメールで通知する
-        pending_account: 新しいアカウントの承認が必要な時にメールで通知する
-        reblog: トゥートがブーストされた時にメールで通知する
-        report: 通報を受けた時にメールで通知する
-        trending_tag: 未審査のハッシュタグが人気の時にメールで通知する
+        favourite: お気に入り登録された時
+        follow: フォローされた時
+        follow_request: フォローリクエストを受けた時
+        mention: 返信が来た時
+        pending_account: 新しいアカウントの承認が必要な時
+        reblog: トゥートがブーストされた時
+        report: 通報を受けた時
+        trending_tag: 未審査のハッシュタグが人気の時
       tag:
         listable: 検索とディレクトリへの使用を許可する
         name: ハッシュタグ
diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml
new file mode 100644
index 000000000..0a6417e36
--- /dev/null
+++ b/config/locales/simple_form.kab.yml
@@ -0,0 +1,62 @@
+---
+kab:
+  simple_form:
+    hints:
+      account_alias:
+        acct: Specify the username@domain of the account you want to move from
+      account_migration:
+        acct: Sekcem isem n umseqdac@taɣult n umiḍan wuɣur tebɣiḍ ad tuɣaleḍ
+      admin_account_action:
+        send_email_notification: Amseqdac ad t-id-yewweḍ usefhem ɣef wayen yeḍran akked umiḍan-is
+        type_html: Fren d acu ara txedmeḍ s <strong>%{acct}</strong>
+      defaults:
+        autofollow: Imdanen ara ijerrden s usnebgi-inek, ad k-ḍefṛen s wudem awurman
+        discoverable: Tabdert n yimaɣnuten d udem-nniḍen i umiḍan-ik akken ad yettwassen ugar
+        email: Ad n-teṭṭfeḍ imayl i usentem
+        irreversible: Tibarraḥin i tessazedgeḍ ad ttwakksent i lebda, ula ma tekkseḍ imsizdeg-nni ar zdat
+        locale: Tutlayt n ugrudem, imaylen d tilɣa
+        password: Seqdec ma drus 8 n yisekkilen
+        setting_hide_network: Wid i teṭṭafaṛeḍ d wid i k-yeṭṭafaṛen ur d-ttwaseknen ara deg umaɣnu-inek
+        username: Isem-ik n umseqdac ad yili d ayiwen, ulac am netta deg %{domain}
+      featured_tag:
+        name: 'Ahat ad tebɣuḍ ad tesqedceḍ yiwen gar-asen:'
+      imports:
+        data: Afaylu CSV yekka-d seg uqeddac-nniḍen Mastudun
+    labels:
+      account:
+        fields:
+          value: Agbur
+      admin_account_action:
+        types:
+          silence: Sgugem
+      defaults:
+        bot: Wagi d amiḍan aṛubut
+        chosen_languages: Sizdeg tutlayin
+        confirm_new_password: Sentem awal uffir amaynut
+        confirm_password: Sentem awal uffir
+        current_password: Awal uffir n tura
+        data: Isefka
+        display_name: Isem ara d-yettwaskanen
+        email: Tansa imayl
+        header: Ixef
+        locale: Tutlayt n ugrudem
+        new_password: Awal uffir amaynut
+        password: Awal uffir
+        setting_display_media_default: Akk-a kan
+        setting_display_media_hide_all: Ffer kullec
+        setting_display_media_show_all: Sken kullec
+        setting_hide_network: Ffer azetta-k·m
+        username: Isem n useqdac
+        username_or_email: Isem n useqdac neγ imal
+        whole_word: Awal akk
+      featured_tag:
+        name: Ahacṭag
+      invite:
+        comment: Awennit
+      invite_request:
+        text: Acimi tebɣiḍ ad ternuḍ iman-ik?
+    'no': Ala
+    required:
+      mark: "*"
+      text: ilaq
+    'yes': Ih
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index aadec0cac..5f2cccf4a 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -14,6 +14,12 @@ ko:
         text_html: 선택사항. 툿 문법을 사용할 수 있습니다. <a href="%{path}">경고 틀을 추가</a>하여 시간을 절약할 수 있습니다
         type_html: "<strong>%{acct}</strong>에 대해 취할 행동 선택"
         warning_preset_id: 선택사항. 틀의 마지막에 임의의 텍스트를 추가 할 수 있습니다
+      announcement:
+        all_day: 체크 되었을 경우, 그 시간에 속한 날짜들에만 표시됩니다
+        ends_at: 옵션입니다. 공지사항이 이 시간에 자동으로 발행 중지 됩니다
+        scheduled_at: 공백으로 두면 공지사항이 곧바로 발행 됩니다
+        starts_at: 공지사항이 특정한 시간에 종속 될 때를 위한 옵션입니다
+        text: 툿 문법을 사용할 수 있습니다. 공지사항은 사용자의 화면 상단 공간을 차지한다는 것을 명심하세요
       defaults:
         autofollow: 이 초대를 통해 가입하는 사람은 당신을 자동으로 팔로우 하게 됩니다
         avatar: PNG, GIF 혹은 JPG. 최대 %{size}. %{dimensions}px로 축소 됨
@@ -83,6 +89,12 @@ ko:
           silence: 침묵
           suspend: 정지하고 되돌릴 수 없는 데이터 삭제
         warning_preset_id: 경고 틀 사용하기
+      announcement:
+        all_day: 종일 일정
+        ends_at: 이벤트 종료
+        scheduled_at: 발행 일정
+        starts_at: 이벤트 시작
+        text: 공지사항
       defaults:
         autofollow: 초대를 통한 팔로우
         avatar: 아바타
diff --git a/config/locales/simple_form.ml.yml b/config/locales/simple_form.ml.yml
index 0439b2053..df04a15e8 100644
--- a/config/locales/simple_form.ml.yml
+++ b/config/locales/simple_form.ml.yml
@@ -6,3 +6,11 @@ ml:
         type_html: "<strong>%{acct}</strong> നെ എന്ത് ചെയ്യണമെന്ന് തീരുമാനിക്കുക"
       defaults:
         password: 8 അക്ഷരങ്ങൾ എങ്കിലും ഉപയോഗിക്കുക
+    labels:
+      account:
+        fields:
+          value: ഉള്ളടക്കം
+      account_alias:
+        acct: പഴയ അംഗത്വത്തിലേക്കുള്ള പിടി
+      account_migration:
+        acct: പുതിയ അംഗത്വത്തിലേക്കുള്ള പിടി
diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml
index 5c417c84e..2fe515f55 100644
--- a/config/locales/simple_form.nl.yml
+++ b/config/locales/simple_form.nl.yml
@@ -150,14 +150,14 @@ nl:
         text: Waarom wil jij je aanmelden?
       notification_emails:
         digest: Periodiek e-mails met een samenvatting versturen
-        favourite: Een e-mail versturen wanneer iemand jouw toot aan hun favorieten heeft toegevoegd
-        follow: Een e-mail versturen wanneer iemand jou volgt
-        follow_request: Een e-mail versturen wanneer iemand jou wil volgen
-        mention: Een e-mail versturen wanneer iemand jou vermeld
-        pending_account: Een e-mail verzenden wanneer een nieuw account moet worden beoordeeld
-        reblog: Een e-mail versturen wanneer iemand jouw toot heeft geboost
-        report: Verstuur een e-mail wanneer een nieuw rapportage is ingediend
-        trending_tag: Een e-mail versturen wanneer een nog niet beoordeelde hashtag trending is
+        favourite: Wanneer iemand jouw toot aan hun favorieten heeft toegevoegd
+        follow: Wanneer iemand jou is gaan volgen
+        follow_request: Wanneer iemand jou wil volgen
+        mention: Wanneer iemand jou heeft vermeld
+        pending_account: Wanneer een nieuw account moet worden beoordeeld
+        reblog: Wanneer iemand jouw toot heeft geboost
+        report: Bij het indienen van een nieuwe rapportage
+        trending_tag: Wanneer een nog niet beoordeelde hashtag trending is
       tag:
         listable: Toestaan dat deze hashtag in zoekopdrachten en in de gebruikersgids te zien valt
         name: Hashtag
diff --git a/config/locales/simple_form.nn.yml b/config/locales/simple_form.nn.yml
index 777f4e600..5fb0e8fce 100644
--- a/config/locales/simple_form.nn.yml
+++ b/config/locales/simple_form.nn.yml
@@ -1 +1,183 @@
+---
 nn:
+  simple_form:
+    hints:
+      account_alias:
+        acct: Spesifiser brukernavn@domene til brukeren du vil flytte fra
+      account_migration:
+        acct: Spesifiser brukernavn@domene til brukeren du vil flytte til
+      account_warning_preset:
+        text: Du kan bruke tut syntaks, f.eks. URLer, emneknagger og nevnelser
+      admin_account_action:
+        include_statuses: Brukeren vil se hvilke tuter som forårsaket moderator-handlingen eller -advarselen
+        send_email_notification: Brukeren vil motta en forklaring på hva som har skjedd med deres bruker
+        text_html: Valgfritt. Du kan bruke tut syntaks. Du kan <a href="%{path}">legge til advarsels-forhåndsinnstillinger</a> for å spare tid
+        type_html: Velg hva du vil gjøre med <strong>%{acct}</strong>
+        warning_preset_id: Valfritt. Du kan leggja inn eigen tekst på enden av føreoppsettet
+      announcement:
+        all_day: Hvis noen av dem er valgt, vil kun datoene av tidsrammen bli vist
+        ends_at: Valgfritt. Kunngjøring vil bli automatisk avpublisert på dette tidspunktet
+        scheduled_at: La stå tomt for å publisere kunngjøringen umiddelbart
+        starts_at: Valgfritt. I tilfellet din kunngjøring er bundet til en spesifikk tidsramme
+        text: Du kan bruke tut syntaks. Vennligst vær oppmerksom på plassen som kunngjøringen vil ta opp på brukeren sin skjerm
+      defaults:
+        autofollow: Folk som lager en konto gjennom invitasjonen, vil automatisk følge deg
+        avatar: PNG, GIF eller JPG. Maksimalt %{size}. Vil bli nedskalert til %{dimensions}px
+        bot: Denne kontoen utfører i hovedsak automatiserte handlinger og blir kanskje ikke holdt øye med
+        context: En eller flere sammenhenger der filteret skal gjelde
+        current_password: For sikkerhetsgrunner, vennligst oppgi passordet til den nåværende bruker
+        current_username: Skriv inn brukarnamnet til den noverande kontoen for å stadfesta
+        digest: Kun sendt etter en lang periode med inaktivitet og bare dersom du har mottatt noen personlige meldinger mens du var borte
+        discoverable: Profilmappen er en annen måte for kontoen din å nå et bredere publikum på
+        email: Du får snart ein stadfestings-e-post
+        fields: Du kan ha opptil 4 gjenstander vist som en tabell på profilsiden din
+        header: PNG, GIF eller JPG. Maksimalt %{size}. Vil bli nedskalert til %{dimensions}px
+        inbox_url: Kopier URLen fra forsiden til overgangen du vil bruke
+        irreversible: Filtrerte tuter vil ugjenkallelig forsvinne, selv om filteret senere blir fjernet
+        locale: Språket til brukergrensesnittet, e-mailer og push-varsler
+        locked: Krever at du manuelt godkjenner følgere
+        password: Nytt minst 8 teikn
+        phrase: Vil bli samsvart med, uansett bruk av store/små bokstaver eller innholdsadvarselen til en tut
+        scopes: Hvilke API-er programmet vil bli gitt tilgang til. Dersom du velger et toppnivåomfang, trenger du ikke å velge individuelle API-er.
+        setting_aggregate_reblogs: Ikke vis nye fremhevinger for tuter som nylig har blitt fremhever (Påvirker kun nylige fremhevinger)
+        setting_default_sensitive: Sensitivt media blir skjult som standard og kan bli vist med et klikk
+        setting_display_media_default: Skjul media som er merket som sensitivt
+        setting_display_media_hide_all: Alltid skjul alt media
+        setting_display_media_show_all: Alltid vis media som er merket som sensitivt
+        setting_hide_network: Kven du fylgjer og kven som fylgjer deg vert ikkje vist på profilen din
+        setting_noindex: Påvirker din offentlige profil og statussider
+        setting_show_application: Appen du brukte til å tute vil bli vist i den detaljerte visningen til tutene dine
+        setting_use_blurhash: Gradientene er basert på fargene til de skjulte visualitetene, men gjør alle detaljer uklare
+        setting_use_pending_items: Skjul tidslinjeoppdateringer bak et klikk, i stedet for å automatisk la strømmen skrolle
+        username: Brukarnamnet ditt vert unikt på %{domain}
+        whole_word: Når søkeordet eller setningen bare er alfanumerisk, aktiveres det bare hvis det samsvarer med hele ordet
+      domain_allow:
+        domain: Dette domenet vil være i stand til å hente data fra denne serveren og dets innkommende data vil bli prosessert og lagret
+      featured_tag:
+        name: 'Kanskje du vil nytta ein av desse:'
+      form_challenge:
+        current_password: Du går inn i et sikkert område
+      imports:
+        data: CSV-fil eksportert frå ein annan Mastodon-tenar
+      invite_request:
+        text: Dette kjem til å hjelpa oss med å gå gjennom søknaden din
+      sessions:
+        otp: Angi tofaktorkoden fra din telefon eller bruk en av dine gjenopprettingskoder.
+      tag:
+        name: Du kan bare forandre bruken av store/små bokstaver, f.eks. for å gjøre det mer lesbart
+      user:
+        chosen_languages: Hvis noen av dem er valgt, vil kun tuter i de valgte språkene bli vist i de offentlige tidslinjene
+    labels:
+      account:
+        fields:
+          name: Merkelapp
+          value: Innhald
+      account_alias:
+        acct: Brukernavnet til den gamle brukeren
+      account_migration:
+        acct: Brukernavnet til den nye brukeren
+      account_warning_preset:
+        text: Føreåtstekst
+      admin_account_action:
+        include_statuses: Inkluder rapporterte tuter i e-mailen
+        send_email_notification: Varsl brukaren med e-post
+        text: Eigen åtvaring
+        type: Handling
+        types:
+          disable: Slå av innlogging
+          none: Gjer inkje
+          silence: Togn
+          suspend: Utvis og slett kontodata for godt
+        warning_preset_id: Bruk åtvaringsoppsett
+      announcement:
+        all_day: Heldagshendelse
+        ends_at: Slutten av hendelsen
+        scheduled_at: Planlegg publisering
+        starts_at: Begynnelse av hendelsen
+        text: Kunngjøring
+      defaults:
+        autofollow: Bed om å fylgja kontoen din
+        avatar: Bilete
+        bot: Dette er ein bot-konto
+        chosen_languages: Filtermål
+        confirm_new_password: Stadfest nytt passord
+        confirm_password: Stadfest passord
+        context: Filtrer kontekstar
+        current_password: Noverande passord
+        data: Data
+        discoverable: Før opp denne kontoen i mappen
+        display_name: Synleg namn
+        email: E-post-adresse
+        expires_in: Vert ugyldig etter
+        fields: Profilmetadata
+        header: Overskrift
+        inbox_url: URL til overgangsinnboksen
+        irreversible: Forkast i stedet for å skjule
+        locale: Språk
+        locked: Lås konto
+        max_uses: Grense på brukartal
+        new_password: Nytt passord
+        note: Om meg
+        otp_attempt: Tostegskode
+        password: Passord
+        phrase: Nykelord eller frase
+        setting_advanced_layout: Skru på det avanserte nettgrensesnittet
+        setting_aggregate_reblogs: Gruppefremhevinger i tidslinjer
+        setting_auto_play_gif: Spel av animerte GIF-ar automatisk
+        setting_boost_modal: Vis bekreftelse før fremheving
+        setting_crop_images: Klipp bilder i ikke-utvidede tuter til 16:9
+        setting_default_language: Språk på innlegg
+        setting_default_privacy: Privatliv
+        setting_default_sensitive: Marker alltid media som sensitivt
+        setting_delete_modal: Vis bekreftelse før du sletter en tut
+        setting_display_media: Medievisning
+        setting_display_media_default: Standard
+        setting_display_media_hide_all: Gøym alle
+        setting_display_media_show_all: Vis alle
+        setting_expand_spoilers: Utvid alltid tuter som er merket med innholdsadvarsler
+        setting_hide_network: Skjul nettverket ditt
+        setting_noindex: Avmeld fra søkemotorindeksering
+        setting_reduce_motion: Reduser bevegelser i animasjoner
+        setting_show_application: Skryt av appen som ble brukt til å sende tuter
+        setting_system_font_ui: Bruk standardskrifttypen på systemet
+        setting_theme: Sidetema
+        setting_trends: Vis kva som er populært i dag
+        setting_unfollow_modal: Vis bekreftelse før du slutter å følge noen
+        setting_use_blurhash: Vis fargerike gradienter for skjulte media
+        setting_use_pending_items: Saktemodus
+        severity: Alvorsgrad
+        type: Importtype
+        username: Brukarnamn
+        username_or_email: Brukarnman eller E-post
+        whole_word: Heilt ord
+      featured_tag:
+        name: Emneknagg
+      interactions:
+        must_be_follower: Blokker varslinger fra ikke-følgere
+        must_be_following: Blokker varslinger fra personer du ikke følger
+        must_be_following_dm: Blokker direkte meldinger fra personer du ikke følger
+      invite:
+        comment: Kommentar
+      invite_request:
+        text: Kvifor vil du verta med?
+      notification_emails:
+        digest: Send samandrag på e-post
+        favourite: Send e-post når nokon merkjer statusen din som favoritt
+        follow: Send e-post når nokon fylgjer deg
+        follow_request: Send e-post når nokon spør om å fylgja deg
+        mention: Send e-post når nokon nemner deg
+        pending_account: Send e-post når ein ny konto treng gjennomgang
+        reblog: Send e-post når nokon framhevar statusen din
+        report: Send e-post når nokon rapporterer noko
+        trending_tag: En ugjennomgått emneknagg trender
+      tag:
+        listable: Tillat denne emneknaggen å vises i søk og på profilmappen
+        name: Emneknagg
+        trendable: Tillat denne emneknaggen til å vises under trender
+        usable: Gje tut lov til å nytta denne emneknaggen
+    'no': Nei
+    recommended: Tilrådt
+    required:
+      mark: "*"
+      text: obligatorisk
+    'yes': Ja
diff --git a/config/locales/simple_form.no.yml b/config/locales/simple_form.no.yml
index 9393e37d1..426247676 100644
--- a/config/locales/simple_form.no.yml
+++ b/config/locales/simple_form.no.yml
@@ -2,25 +2,117 @@
 'no':
   simple_form:
     hints:
+      account_alias:
+        acct: Spesifiser brukernavn@domene til brukeren du vil flytte fra
+      account_migration:
+        acct: Spesifiser brukernavn@domene til brukeren du vil flytte til
+      account_warning_preset:
+        text: Du kan bruke tut syntaks, f.eks. URLer, emneknagger og nevnelser
+      admin_account_action:
+        include_statuses: Brukeren vil se hvilke tuter som forårsaket moderator-handlingen eller -advarselen
+        send_email_notification: Brukeren vil motta en forklaring på hva som har skjedd med deres bruker
+        text_html: Valgfritt. Du kan bruke tut syntaks. Du kan <a href="%{path}">legge til advarsels-forhåndsinnstillinger</a> for å spare tid
+        type_html: Velg hva du vil gjøre med <strong>%{acct}</strong>
+        warning_preset_id: Valgfritt. Du kan fortsatt legge til tilpasset tekst til slutten av forhåndsinnstillingen
+      announcement:
+        all_day: Hvis noen av dem er valgt, vil kun datoene av tidsrammen bli vist
+        ends_at: Valgfritt. Kunngjøring vil bli automatisk avpublisert på dette tidspunktet
+        scheduled_at: La stå tomt for å publisere kunngjøringen umiddelbart
+        starts_at: Valgfritt. I tilfellet din kunngjøring er bundet til en spesifikk tidsramme
+        text: Du kan bruke tut syntaks. Vennligst vær oppmerksom på plassen som kunngjøringen vil ta opp på brukeren sin skjerm
       defaults:
+        autofollow: Folk som lager en konto gjennom invitasjonen, vil automatisk følge deg
         avatar: PNG, GIF eller JPG. Maksimalt %{size}. Vil bli nedskalert til %{dimensions}px
+        bot: Denne kontoen utfører i hovedsak automatiserte handlinger og blir kanskje ikke holdt øye med
+        context: En eller flere sammenhenger der filteret skal gjelde
+        current_password: For sikkerhetsgrunner, vennligst oppgi passordet til den nåværende bruker
+        current_username: For å bekrefte, vennligst skriv inn brukernavnet til den nåværende kontoen
         digest: Kun sendt etter en lang periode med inaktivitet og bare dersom du har mottatt noen personlige meldinger mens du var borte
+        discoverable: Profilmappen er en annen måte for kontoen din å nå et bredere publikum på
+        email: Du vil bli tilsendt en bekreftelses-E-post
+        fields: Du kan ha opptil 4 gjenstander vist som en tabell på profilsiden din
         header: PNG, GIF eller JPG. Maksimalt %{size}. Vil bli nedskalert til %{dimensions}px
+        inbox_url: Kopier URLen fra forsiden til overgangen du vil bruke
+        irreversible: Filtrerte tuter vil ugjenkallelig forsvinne, selv om filteret senere blir fjernet
+        locale: Språket til brukergrensesnittet, e-mailer og push-varsler
         locked: Krever at du manuelt godkjenner følgere
+        password: Bruk minst 8 tegn
+        phrase: Vil bli samsvart med, uansett bruk av store/små bokstaver eller innholdsadvarselen til en tut
+        scopes: Hvilke API-er programmet vil bli gitt tilgang til. Dersom du velger et toppnivåomfang, trenger du ikke å velge individuelle API-er.
+        setting_aggregate_reblogs: Ikke vis nye fremhevinger for tuter som nylig har blitt fremhever (Påvirker kun nylige fremhevinger)
+        setting_default_sensitive: Sensitivt media blir skjult som standard og kan bli vist med et klikk
+        setting_display_media_default: Skjul media som er merket som sensitivt
+        setting_display_media_hide_all: Skjul alltid all media
+        setting_display_media_show_all: Alltid vis media som er merket som sensitivt
+        setting_hide_network: De som du følger, og de som følger deg, vil ikke bli vist på profilen din
         setting_noindex: Påvirker din offentlige profil og statussider
+        setting_show_application: Appen du brukte til å tute vil bli vist i den detaljerte visningen til tutene dine
+        setting_use_blurhash: Gradientene er basert på fargene til de skjulte visualitetene, men gjør alle detaljer uklare
+        setting_use_pending_items: Skjul tidslinjeoppdateringer bak et klikk, i stedet for å automatisk la strømmen skrolle
+        username: Brukernavnet ditt vil være unikt på %{domain}
+        whole_word: Når søkeordet eller setningen bare er alfanumerisk, aktiveres det bare hvis det samsvarer med hele ordet
+      domain_allow:
+        domain: Dette domenet vil være i stand til å hente data fra denne serveren og dets innkommende data vil bli prosessert og lagret
+      featured_tag:
+        name: 'Du vil kanskje ønske å bruke en av disse:'
+      form_challenge:
+        current_password: Du går inn i et sikkert område
       imports:
         data: CSV-fil eksportert fra en annen Mastodon-instans
+      invite_request:
+        text: Dette vil hjelpe oss med å gjennomgå din søknad
       sessions:
         otp: Angi tofaktorkoden fra din telefon eller bruk en av dine gjenopprettingskoder.
+      tag:
+        name: Du kan bare forandre bruken av store/små bokstaver, f.eks. for å gjøre det mer lesbart
+      user:
+        chosen_languages: Hvis noen av dem er valgt, vil kun tuter i de valgte språkene bli vist i de offentlige tidslinjene
     labels:
+      account:
+        fields:
+          name: Etikett
+          value: Innhold
+      account_alias:
+        acct: Brukernavnet til den gamle brukeren
+      account_migration:
+        acct: Brukernavnet til den nye brukeren
+      account_warning_preset:
+        text: Forhåndsvalgt tekst
+      admin_account_action:
+        include_statuses: Inkluder rapporterte tuter i e-mailen
+        send_email_notification: Si ifra til brukeren over E-post
+        text: Tilpasset advarsel
+        type: Handling
+        types:
+          disable: Deaktiver pålogging
+          none: Ikke gjør noe
+          silence: Stilne
+          suspend: Suspender og ugjenkallelig slett brukerdata
+        warning_preset_id: Bruk en advarsels-forhåndsinnstilling
+      announcement:
+        all_day: Heldagshendelse
+        ends_at: Slutten av hendelsen
+        scheduled_at: Planlegg publisering
+        starts_at: Begynnelse av hendelsen
+        text: Kunngjøring
       defaults:
+        autofollow: Inviter til å følge kontoen din
+        avatar: Profilbilde
+        bot: Dette er en botkonto
+        chosen_languages: Filtrer språk
         confirm_new_password: Bekreft nytt passord
         confirm_password: Bekreft passord
+        context: Filtersammenhenger
         current_password: Nåværende passord
+        data: Data
+        discoverable: Før opp denne kontoen i mappen
         display_name: Visningsnavn
         email: E-postadresse
         expires_in: Utløper etter
+        fields: Profilmetadata
         header: Overskrift
+        inbox_url: URL til overgangsinnboksen
+        irreversible: Forkast i stedet for å skjule
         locale: Språk
         locked: Lås konto
         max_uses: Maksimalt antall bruk
@@ -28,31 +120,64 @@
         note: Om meg
         otp_attempt: Tofaktorkode
         password: Passord
+        phrase: Nøkkelord eller frase
+        setting_advanced_layout: Skru på det avanserte nettgrensesnittet
+        setting_aggregate_reblogs: Gruppefremhevinger i tidslinjer
         setting_auto_play_gif: Autoavspill animert GIF-filer
         setting_boost_modal: Vis bekreftelse før fremheving
+        setting_crop_images: Klipp bilder i ikke-utvidede tuter til 16:9
+        setting_default_language: Innleggsspråk
         setting_default_privacy: Postintegritet
         setting_default_sensitive: Marker alltid media som sensitivt
         setting_delete_modal: Vis bekreftelse før du sletter en tut
-        setting_noindex: Ikke delta i søkemotorsindeksering
+        setting_display_media: Mediavisning
+        setting_display_media_default: Standard
+        setting_display_media_hide_all: Skjul alle
+        setting_display_media_show_all: Vis alle
+        setting_expand_spoilers: Utvid alltid tuter som er merket med innholdsadvarsler
+        setting_hide_network: Skjul nettverket ditt
+        setting_noindex: Avmeld fra søkemotorindeksering
         setting_reduce_motion: Reduser bevegelser i animasjoner
+        setting_show_application: Skryt av appen som ble brukt til å sende tuter
         setting_system_font_ui: Bruk systemets standardfont
         setting_theme: Sidens tema
+        setting_trends: Vis dagens trender
         setting_unfollow_modal: Vis bekreftelse før du slutter å følge noen
+        setting_use_blurhash: Vis fargerike gradienter for skjulte media
+        setting_use_pending_items: Saktemodus
         severity: Alvorlighetsgrad
         type: Importeringstype
         username: Brukernavn
+        username_or_email: Brukernavn eller E-post
+        whole_word: Hele ord
+      featured_tag:
+        name: Emneknagg
       interactions:
         must_be_follower: Blokker varslinger fra ikke-følgere
         must_be_following: Blokker varslinger fra personer du ikke følger
         must_be_following_dm: Blokker direkte meldinger fra personer du ikke følger
+      invite:
+        comment: Kommentar
+      invite_request:
+        text: Hvorfor vil du bli med?
       notification_emails:
         digest: Send sammendrag på e-post
         favourite: Send e-post når noen setter din status som favoritt
         follow: Send e-post når noen følger deg
         follow_request: Send e-post når noen ber om å få følge deg
         mention: Send e-post når noen nevner deg
+        pending_account: Ny bruker avventer gjennomgang
         reblog: Send e-post når noen fremhever din status
+        report: Ny rapport er sendt inn
+        trending_tag: En ugjennomgått emneknagg trender
+      tag:
+        listable: Tillat denne emneknaggen å vises i søk og på profilmappen
+        name: Emneknagg
+        trendable: Tillat denne emneknaggen til å vises under trender
+        usable: Tillat tuter å bruke denne emneknaggen
     'no': Nei
+    recommended: Anbefalt
     required:
+      mark: "*"
       text: obligatorisk
     'yes': Ja
diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml
index 9b96e1b94..9e557383c 100644
--- a/config/locales/simple_form.pt-BR.yml
+++ b/config/locales/simple_form.pt-BR.yml
@@ -3,131 +3,135 @@ pt-BR:
   simple_form:
     hints:
       account_alias:
-        acct: Especifique o usuário@domínio da conta da qual você deseja mover
+        acct: Especifique o usuário@domínio da conta da qual você deseja se mudar
       account_migration:
-        acct: Especifique o usuário@domínio da conta para o qual você deseja mover
+        acct: Especifique o usuário@domínio da conta para a qual você deseja se mudar
       account_warning_preset:
-        text: Você pode usar a sintaxe de um toot, como URLs, hashtags e menções
+        text: Você pode usar a sintaxe do toot, como links, hashtags e menções
       admin_account_action:
         include_statuses: O usuário verá quais toots causaram o aviso ou ação da moderação
-        send_email_notification: O usuário vai receber uma explicação do que aconteceu com a sua conta
-        text_html: Opcional. Você pode usar a sintaxe de toots. Você pode <a href="%{path}">adicionar avisos pré-definidos</a> para ganhar tempo
-        type_html: Escolha o que fazer com <strong>%{acct}</strong>
-        warning_preset_id: Opcional. Você ainda pode adicionar texto customizado no fim do texto pré-definido
+        send_email_notification: O usuário receberá uma explicação do que aconteceu com a própria conta
+        text_html: Opcional. Você pode usar a sintaxe do toot e também pode <a href="%{path}">adicionar avisos pré-definidos</a> para poupar tempo
+        type_html: Decida o que fazer com <strong>%{acct}</strong>
+        warning_preset_id: Opcional. Você ainda pode adicionar texto personalizado no final do aviso pré-definido
       defaults:
-        autofollow: Pessoas que se cadastrarem através de seu convite te seguirão automaticamente
-        avatar: PNG, GIF or JPG. Arquivos de até %{size}. Eles serão diminuídos para %{dimensions}px
+        autofollow: Pessoas que criarem conta através de seu convite te seguirão automaticamente
+        avatar: PNG, GIF or JPG. Arquivos de até %{size}. Serão redimensionados para %{dimensions}px
         bot: Essa conta executa principalmente ações automatizadas e pode não ser monitorada
-        context: Um ou mais contextos onde o filtro deve ser aplicado
-        current_password: Para fins de segurança digite a senha da conta atual
-        current_username: Para confirmar, por favor, digite o usuário da conta atual
-        digest: Enviado após um longo período de inatividade com um resumo das menções que você recebeu em sua ausência
-        discoverable: O diretório de perfis é outra maneira de sua conta alcançar um público mais vasto
-        email: Você receberá um email de confirmação
-        fields: Você pode ter até 4 itens exibidos em forma de tabela no seu perfil
-        header: PNG, GIF or JPG. Arquivos de até %{size}. Eles serão diminuídos para %{dimensions}px
-        inbox_url: Copie a URL da página inicial do repetidor que você quer usar
-        irreversible: Os toots filtrados vão desaparecer irreversivelmente, mesmo se o filtro for removido depois
-        locale: O idioma das telas de usuário, e-mails e notificações push
+        context: Um ou mais contextos onde o filtro deve atuar
+        current_password: Para fins de segurança, por favor, digite a senha da conta atual
+        current_username: Para confirmar, por favor, digite o nome de usuário da conta atual
+        digest: Enviado apenas após um longo período de inatividade com um resumo das menções recebidas durante ausência
+        discoverable: O diretório de perfis é outra maneira de sua conta alcançar um público maior
+        email: Você receberá um e-mail de confirmação
+        fields: Você pode ter até 4 itens mostrados em forma de tabela no seu perfil
+        header: PNG, GIF or JPG. Arquivos de até %{size}. Serão redimensionados para %{dimensions}px
+        inbox_url: Copie o link da página inicial do repetidor que você deseja usar
+        irreversible: Toots filtrados desaparecerão irreversivelmente, mesmo se o filtro for removido depois
+        locale: O idioma da interface do usuário, e-mails e notificações
         locked: Requer aprovação manual de seguidores
         password: Use pelo menos 8 caracteres
-        phrase: Vai coincidir, independente de maiúsculas ou minúsculas, no texto ou no aviso de conteúdo de um toot
-        scopes: Quais APIs a aplicação vai ter permissão de acessar. Se você selecionar um escopo de alto nível, você não precisa selecionar individualmente os outros.
-        setting_aggregate_reblogs: Não mostrar novos compartilhamentos para toots que foram compartilhados recentemente (afeta somente novos compartilhamentos recebidos)
+        phrase: Corresponderá independente de maiúsculas ou minúsculas, no texto ou no aviso de conteúdo de um toot
+        scopes: Quais APIs o aplicativo vai ter permissão de acessar. Se você selecionar uma autorização de alto nível, você não precisa selecionar individualmente os outros.
+        setting_aggregate_reblogs: Não mostra novos boosts para toots que receberam boost recentemente (afeta somente os boosts mais recentes)
         setting_default_sensitive: Mídia sensível está oculta por padrão e pode ser revelada com um clique
-        setting_display_media_default: Esconder mídia marcada como sensível
-        setting_display_media_hide_all: Sempre esconder todas as mídias
-        setting_display_media_show_all: Sempre mostrar mídia marcada como sensível
-        setting_hide_network: Quem você segue e quem segue você não serão exibidos no seu perfil
-        setting_noindex: Afeta seu perfil público e as páginas de suas postagens
-        setting_show_application: A aplicação que você usar para enviar seus toots vai aparecer na visão detalhada dos seus toots
-        setting_use_blurhash: Os gradientes são baseados nas cores das imagens escondidas, mas ofuscam quaisquer detalhes
-        setting_use_pending_items: Ocultar atualizações de linha de tempo atrás de um clique ao invés de rolar automaticamente o feed
+        setting_display_media_default: Sempre ocultar mídia sensível
+        setting_display_media_hide_all: Sempre ocultar todas as mídias
+        setting_display_media_show_all: Sempre mostrar mídia sensível
+        setting_hide_network: Quem você segue e seus seguidores não serão mostrados no seu perfil
+        setting_noindex: Afeta seu perfil público e as páginas dos seus toots
+        setting_show_application: O aplicativo que você usar para tootar será mostrado na visão detalhada dos seus toots
+        setting_use_blurhash: O blur é baseado nas cores da imagem oculta, ofusca a maioria dos detalhes
+        setting_use_pending_items: Ocultar atualizações da linha do tempo atrás de um clique ao invés de rolar automaticamente
         username: Seu nome de usuário será único em %{domain}
-        whole_word: Quando a palavra ou frase é inteiramente alfanumérica, ela será aplicada somente se corresponder a palavra inteira
+        whole_word: Quando a palavra-chave ou frase é inteiramente alfanumérica, ela será aplicada somente se corresponder a palavra inteira
       domain_allow:
-        domain: Este domínio será capaz de obter dados deste servidor e os dados recebidos dele serão processados e armazenados
+        domain: Este domínio poderá obter dados deste servidor e os dados recebidos dele serão processados e armazenados
       featured_tag:
         name: 'Você pode querer usar um destes:'
       form_challenge:
         current_password: Você está entrando em uma área segura
       imports:
-        data: Arquivo CSV exportado de outra instância do Mastodon
+        data: Arquivo CSV exportado de outra instância Mastodon
       invite_request:
-        text: Isso vai nos ajudar a revisar sua aplicação
+        text: Isso nos ajudará a revisar seu aplicativo
       sessions:
-        otp: 'Insira o código de autenticação gerado pelo app no seu celular ou use um dos códigos de recuperação:'
+        otp: 'Digite o código de dois fatores gerado pelo aplicativo no seu celular ou use um dos códigos de recuperação:'
       tag:
         name: Você pode mudar a capitalização das letras, por exemplo, para torná-la mais legível
       user:
-        chosen_languages: Ao marcar, apenas toots dos idiomas selecionados serão exibidos nas timelines públicas
+        chosen_languages: Apenas toots dos idiomas selecionados serão mostrados nas linhas públicas
     labels:
       account:
         fields:
           name: Rótulo
           value: Conteúdo
+      account_alias:
+        acct: Nome de usuário da conta antiga
+      account_migration:
+        acct: Nome de usuário da nova conta
       account_warning_preset:
-        text: Texto pré-definido
+        text: Aviso pré-definido
       admin_account_action:
-        include_statuses: Incluir toots reportados no e-mail
+        include_statuses: Incluir toots denunciados no e-mail
         send_email_notification: Notificar o usuário por e-mail
-        text: Aviso customizado
+        text: Aviso personalizado
         type: Ação
         types:
-          disable: Desabilitar
+          disable: Bloquear conta
           none: Não fazer nada
           silence: Silenciar
-          suspend: Suspender e excluir irreversivelmente dados da conta
+          suspend: Banir e excluir irreversivelmente dados da conta
         warning_preset_id: Usar um aviso pré-definido
       defaults:
         autofollow: Convite para seguir a sua conta
-        avatar: Imagem de Perfil
+        avatar: Imagem de perfil
         bot: Esta é uma conta-robô
-        chosen_languages: Filtros de idioma
+        chosen_languages: Filtro de idiomas
         confirm_new_password: Confirmar nova senha
         confirm_password: Confirmar senha
-        context: Contextos de filtro
+        context: Contextos do filtro
         current_password: Senha atual
         data: Dados
-        discoverable: Listar essa conta no diretório
+        discoverable: Mostrar conta no diretório de perfis
         display_name: Nome de exibição
         email: Endereço de e-mail
         expires_in: Expira em
         fields: Metadados do perfil
         header: Cabeçalho
-        inbox_url: URL da caixa de entrada do repetidor
-        irreversible: Ignorar ao invés de esconder
-        locale: Idioma das telas
+        inbox_url: Link da caixa de entrada do repetidor
+        irreversible: Ignorar ao invés de ocultar
+        locale: Idioma da interface
         locked: Trancar conta
         max_uses: Número máximo de usos
         new_password: Nova senha
         note: Biografia
-        otp_attempt: Código de autenticação em dois passos
+        otp_attempt: Código de autenticação de dois fatores
         password: Senha
         phrase: Palavra-chave ou frase
         setting_advanced_layout: Ativar interface web avançada
-        setting_aggregate_reblogs: Agrupar compartilhamentos nas timelines
+        setting_aggregate_reblogs: Agrupar boosts nas linhas
         setting_auto_play_gif: Reproduzir GIFs automaticamente
-        setting_boost_modal: Mostrar diálogo de confirmação antes de compartilhar postagem
+        setting_boost_modal: Solicitar confirmação antes de dar boost
         setting_crop_images: Cortar imagens no formato 16x9 em toots não expandidos
-        setting_default_language: Idioma das postagens
-        setting_default_privacy: Privacidade das postagens
+        setting_default_language: Idioma dos toots
+        setting_default_privacy: Privacidade dos toots
         setting_default_sensitive: Sempre marcar mídia como sensível
-        setting_delete_modal: Mostrar diálogo de confirmação antes de deletar uma postagem
+        setting_delete_modal: Solicitar confirmação antes de excluir toot
         setting_display_media: Exibição das mídias
         setting_display_media_default: Padrão
-        setting_display_media_hide_all: Esconder tudo
+        setting_display_media_hide_all: Ocultar tudo
         setting_display_media_show_all: Mostrar tudo
-        setting_expand_spoilers: Sempre expandir toots marcados com aviso de conteúdo
-        setting_hide_network: Esconder as suas redes
-        setting_noindex: Não quero ser indexado por mecanismos de busca
-        setting_reduce_motion: Reduz movimento em animações
-        setting_show_application: Mostrar o nome da aplicação utilizada para enviar os toots
-        setting_system_font_ui: Usar a fonte padrão de seu sistema
+        setting_expand_spoilers: Sempre expandir toots com Aviso de Conteúdo
+        setting_hide_network: Ocultar suas relações
+        setting_noindex: Não quero ser indexado por mecanismos de pesquisa
+        setting_reduce_motion: Reduzir animações
+        setting_show_application: Mostrar o aplicativo usado para enviar os toots
+        setting_system_font_ui: Usar fonte padrão do sistema
         setting_theme: Tema do site
-        setting_trends: Mostrar tendências de hoje
-        setting_unfollow_modal: Mostrar diálogo de confirmação antes de deixar de seguir alguém
-        setting_use_blurhash: Mostrar gradientes coloridos para mídias ocultas
+        setting_trends: Mostrar em alta hoje
+        setting_unfollow_modal: Solicitar confirmação antes de deixar de seguir alguém
+        setting_use_blurhash: Mostrar blur em mídias ocultas
         setting_use_pending_items: Modo lento
         severity: Gravidade
         type: Tipo de importação
@@ -143,22 +147,22 @@ pt-BR:
       invite:
         comment: Comentário
       invite_request:
-        text: Por que você quer se cadastrar?
+        text: Por que você deseja criar uma conta aqui?
       notification_emails:
-        digest: Mandar e-mails com relatórios
-        favourite: Mandar um e-mail quando alguém favoritar suas postagens
-        follow: Mandar um e-mail quando alguém te seguir
-        follow_request: Mandar um e-maill quando alguém solicitar ser seu seguidor
-        mention: Mandar um e-mail quando alguém te mencionar
-        pending_account: Mandar um -mail quando uma nova conta precisar ser revisada
-        reblog: Mandar um e-mail quando alguém compartilhar suas postagens
-        report: Mandar um e-mail quando uma nova denúncia é submetida
+        digest: Enviar e-mails de resumo
+        favourite: Enviar e-mail quando alguém favoritar seus toots
+        follow: Enviar e-mail quando alguém te seguir
+        follow_request: Enviar e-mail quando alguém solicitar ser seu seguidor
+        mention: Enviar e-mail quando alguém te mencionar
+        pending_account: Enviar e-mail quando uma nova conta precisar ser revisada
+        reblog: Enviar e-mail quando alguém der boost nos seus toots
+        report: Enviar e-mail quando uma nova denúncia for enviada
         trending_tag: Enviar e-mail quando uma hashtag não revisada estiver em alta
       tag:
         listable: Permitir que esta hashtag apareça em pesquisas e no diretório de perfis
         name: Hashtag
         trendable: Permitir que esta hashtag apareça em alta
-        usable: Permitir que toots usem esta hastag
+        usable: Permitir que toots usem esta hashtag
     'no': Não
     recommended: Recomendado
     required:
diff --git a/config/locales/simple_form.pt-PT.yml b/config/locales/simple_form.pt-PT.yml
index 57acde4d9..4a4437e76 100644
--- a/config/locales/simple_form.pt-PT.yml
+++ b/config/locales/simple_form.pt-PT.yml
@@ -20,7 +20,9 @@ pt-PT:
         bot: Esta conta executa essencialmente acções automáticas e pode não poder ser monitorizada
         context: Um ou múltiplos contextos nos quais o filtro deve ser aplicado
         current_password: Para fins de segurança, por favor, digite a senha da conta atual
+        current_username: Para confirmar, por favor, introduza o nome de utilizador da conta atual
         digest: Enviado após um longo período de inatividade e apenas se foste mencionado na tua ausência
+        discoverable: O diretório de perfis é outra maneira da sua conta alcançar um público mais vasto
         email: Será enviado um e-mail de confirmação
         fields: Podes ter até 4 itens expostos, em forma de tabela, no teu perfil
         header: PNG, GIF or JPG. Arquivos até %{size}. Vão ser reduzidos para %{dimensions}px
@@ -32,20 +34,31 @@ pt-PT:
         phrase: Será correspondido independentemente da capitalização ou do aviso de conteúdo duma publicação
         scopes: Quais as APIs a que será concedido acesso. Se escolheres uma abrangência de nível superior, não precisarás de as seleccionar individualmente.
         setting_aggregate_reblogs: Não mostrar novas partilhas que foram partilhadas recentemente (só afecta as novas partilhas)
+        setting_default_sensitive: Média sensível está oculta por padrão e pode ser revelada com um clique
         setting_display_media_default: Esconder media marcada como sensível
         setting_display_media_hide_all: Esconder sempre toda a media
         setting_display_media_show_all: Mostrar sempre a media marcada como sensível
         setting_hide_network: Quem tu segues e quem te segue não será mostrado no teu perfil
         setting_noindex: Afecta o teu perfil público e as páginas das tuas publicações
         setting_show_application: A aplicação que tu usas para publicar será mostrada na vista detalhada das tuas publicações
+        setting_use_blurhash: Os gradientes são baseados nas cores das imagens escondidas, mas ofuscam quaisquer detalhes
+        setting_use_pending_items: Ocultar atualizações da cronologia atrás de um clique ao invés de rolar automaticamente o feed
         username: O teu nome de utilizador será único em %{domain}
         whole_word: Quando a palavra-chave ou expressão-chave é somente alfanumérica, ela só será aplicada se corresponder à palavra completa
+      domain_allow:
+        domain: Este domínio será capaz de obter dados deste servidor e os dados dele recebidos serão processados e armazenados
       featured_tag:
         name: 'Poderás querer usar um destes:'
+      form_challenge:
+        current_password: Está a entrar numa área restrita
       imports:
         data: Arquivo CSV exportado de outro servidor do Mastodon
+      invite_request:
+        text: Isto vai ajudar-nos a rever o seu pedido
       sessions:
         otp: 'Insere o código de autenticação em dois passos gerado pelo teu telemóvel ou usa um dos teus códigos de recuperação:'
+      tag:
+        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
     labels:
@@ -53,9 +66,14 @@ pt-PT:
         fields:
           name: Rótulo
           value: Conteúdo
+      account_alias:
+        acct: Nome de utilizador da conta antiga
+      account_migration:
+        acct: Nome de utilizador da nova conta
       account_warning_preset:
         text: Texto pré-definido
       admin_account_action:
+        include_statuses: Incluir no e-mail os toots reportados
         send_email_notification: Notificar o utilizador por e-mail
         text: Aviso personalizado
         type: Acção
@@ -91,9 +109,11 @@ pt-PT:
         otp_attempt: Código de autenticação em dois passos
         password: Palavra-passe
         phrase: Palavra ou expressão-chave
+        setting_advanced_layout: Ativar interface web avançada
         setting_aggregate_reblogs: Agrupar partilhas em cronologias
         setting_auto_play_gif: Reproduzir GIFs automaticamente
         setting_boost_modal: Solicitar confirmação antes de partilhar uma publicação
+        setting_crop_images: Cortar imagens em toots não expandidos para o formato 16x9
         setting_default_language: Língua de publicação
         setting_default_privacy: Privacidade da publicação
         setting_default_sensitive: Sempre marcar media como sensível
@@ -109,25 +129,43 @@ pt-PT:
         setting_show_application: Revelar sempre qual a aplicação usada para enviar as publicações
         setting_system_font_ui: Usar a fonte padrão do teu sistema
         setting_theme: Tema do site
+        setting_trends: Mostrar as tendências de hoje
         setting_unfollow_modal: Solicitar confirmação antes de deixar de seguir alguém
+        setting_use_blurhash: Mostrar gradientes coloridos para médias ocultas
+        setting_use_pending_items: Modo lento
         severity: Gravidade
         type: Tipo de importação
         username: Nome de utilizador
         username_or_email: Nome de utilizador ou e-mail
         whole_word: Palavra completa
+      featured_tag:
+        name: Hashtag
       interactions:
         must_be_follower: Bloquear notificações de não-seguidores
         must_be_following: Bloquear notificações de pessoas que não segues
         must_be_following_dm: Bloquear mensagens directas de pessoas que tu não segues
+      invite:
+        comment: Comentário
+      invite_request:
+        text: Porque se quer juntar a nós?
       notification_emails:
         digest: Enviar e-mails de resumo
         favourite: Enviar e-mail quando alguém adiciona uma publicação tua aos favoritos
         follow: Enviar e-mail quando alguém te segue
         follow_request: Enviar e-mail quando alguém solicita ser teu seguidor
         mention: Enviar e-mail quando alguém te menciona
+        pending_account: Enviar e-mail quando uma nova conta aguarda aprovação
         reblog: Enviar e-mail quando alguém partilha uma publicação tua
         report: Enviar um e-mail quando um novo relatório é submetido
+        trending_tag: Enviar e-mail quando uma hashtag não aprovada anteriormente estiver em destaque
+      tag:
+        listable: Permitir que esta hashtag apareça em pesquisas e no diretório de perfis
+        name: Hashtag
+        trendable: Permitir que esta hashtag apareça em destaque
+        usable: Permitir que toots utilizem esta hashtag
     'no': Não
+    recommended: Recomendado
     required:
+      mark: "*"
       text: obrigatório
     'yes': Sim
diff --git a/config/locales/simple_form.ru.yml b/config/locales/simple_form.ru.yml
index b4951dc74..0ec9d0d6b 100644
--- a/config/locales/simple_form.ru.yml
+++ b/config/locales/simple_form.ru.yml
@@ -3,52 +3,58 @@ ru:
   simple_form:
     hints:
       account_alias:
-        acct: Укажите имя пользователя@домен учетной записи, с которой вы хотите мигрировать
+        acct: Укажите имя_пользователя@домен учётной записи, с которой вы собираетесь мигрировать
       account_migration:
-        acct: Укажите имя пользователя@домен учетной записи, на которую вы хотите мигрировать
+        acct: Укажите имя_пользователя@домен учётной записи, на которую вы собираетесь мигрировать
       account_warning_preset:
         text: Вы можете использовать всё, что в обычных постах — ссылки, хэштеги, упоминания и т.д.
       admin_account_action:
         include_statuses: Пользователь будет видеть к каким постами применялись модераторские действия и выносились предупреждения
-        send_email_notification: Пользователь получит сообщение о том, что случилось с его/её аккаунтом
-        text_html: (Необязательно) Можно использовать обычный синтаксис. Для экономии времени <a href="%{path}">добавьте шаблоны предупреждений</a>
-        type_html: Выберите, что делать с аккаунтом <strong>%{acct}</strong>
+        send_email_notification: Пользователь получит сообщение о том, что случилось с его/её учётной записью
+        text_html: Необязательно. Вы можете использовать синтаксис постов. Для экономии времени, <a href="%{path}">добавьте шаблоны предупреждений</a>
+        type_html: Выберите применяемое к <strong>%{acct}</strong> действие
         warning_preset_id: Необязательно. Вы можете добавить собственный текст в конце шаблона
+      announcement:
+        all_day: Если выбрано, часы начала и завершения будут скрыты
+        ends_at: Необязательно. Объявление будет автоматически отменено в это время
+        scheduled_at: Оставьте поля незаполненными, чтобы опубликовать объявление сразу
+        starts_at: Необязательно. На случай, если ваше объявление привязано к какому-то временному интервалу
+        text: Вы можете использовать тот же синтаксис, что и в постах. Будьте предусмотрительны насчёт места, которое займёт объявление на экране пользователей
       defaults:
         autofollow: Люди, пришедшие по этому приглашению, автоматически будут подписаны на вас
         avatar: Поддерживается PNG, GIF и JPG. Максимальный размер — %{size}. Будет уменьшен до %{dimensions}px
-        bot: Этот аккаунт обычно выполяет автоматизированные действия и может не просматриваться владельцем
+        bot: Эта учётная запись обычно выполяет автоматизированные действия и может не просматриваться владельцем
         context: Один или несколько контекстов, к которым должны быть применены фильтры
         current_password: В целях безопасности введите пароль текущей учётной записи
-        current_username: Для подтверждения, пожалуйста, введите имя пользователя текущей учетной записи
-        digest: Отсылается лишь после длительной неактивности, если вы в это время получали личные сообщения
-        discoverable: Каталог профилей является другим способом, с помощью которого ваша учетная запись может стать доступной более широкой аудитории
+        current_username: Для подтверждения, пожалуйста, введите имя пользователя текущей учётной записи
+        digest: Если вы долго не заглядывали, отправим вам дайджест событий, которые происходили в период вашего отсутствия.
+        discoverable: Каталог профилей это один из способов получить охват вашего профиля более обширной аудиторией
         email: Вам будет отправлено электронное письмо с подтверждением
-        fields: В профиле можно отобразить до 4 пунктов как таблицу
+        fields: В профиле можно отобразить до 4 пунктов в виде таблицы
         header: Поддерживается PNG, GIF и JPG. Максимальный размер — %{size}. Будет уменьшена до %{dimensions}px
         inbox_url: Копировать URL с главной страницы ретранслятора, который вы хотите использовать
-        irreversible: Отфильтрованные статусы будут утеряны навсегда, даже если в будущем фильтр будет убран
+        irreversible: Отфильтрованные посты будут утеряны навсегда, даже если в будущем фильтр будет убран
         locale: Язык интерфейса, e-mail писем и push-уведомлений
         locked: Подписчиков нужно будет подтверждать самостоятельно
         password: Укажите не менее 8 символов
-        phrase: Будет сопоставлено независимо от присутствия в тексте или предупреждения о содержании статуса
+        phrase: Будет сопоставлено независимо от присутствия в тексте или предупреждения о содержании поста
         scopes: Какие API приложению будет позволено использовать. Если вы выберете самый верхний, нижестоящие будут выбраны автоматически.
-        setting_aggregate_reblogs: Не показывать новые продвижения статусов, которые уже были недавно продвинуты (относится только к новым продвижениям)
-        setting_default_sensitive: Чувствительные медиафайлы скрыты по умолчанию и могут быть показаны по нажатию на них
-        setting_display_media_default: Скрывать чувствительные медиафайлы
+        setting_aggregate_reblogs: Не показывать новые продвижения постов, которые уже были недавно продвинуты (относится только к новым продвижениям)
+        setting_default_sensitive: Деликатные медиафайлы скрыты по умолчанию и могут быть показаны по нажатию на них
+        setting_display_media_default: Скрывать деликатные медиафайлы
         setting_display_media_hide_all: Всегда скрывать любые медиафайлы
-        setting_display_media_show_all: Всегда показывать чувствительные медиафайлы
-        setting_hide_network: Те, на кого вы подписаны и кто подписан на Вас, не будут отображены в вашем профиле
-        setting_noindex: Относится к вашему публичному профилю и страницам статусов
-        setting_show_application: В окне просмотра вашего статуса будет видно, с какого приложения он был отправлен
+        setting_display_media_show_all: Всегда показывать деликатные медиафайлы
+        setting_hide_network: Другие не смогут видеть ни ваши подписки, ни ваших подписчиков
+        setting_noindex: Относится к вашему публичному профилю и страницам постов
+        setting_show_application: При просмотре поста будет видно из какого приложения он отправлен
         setting_use_blurhash: Градиенты основаны на цветах скрытых медиа, но скрывают любые детали
         setting_use_pending_items: Показывать обновления в ленте только после клика вместо автоматической прокрутки
-        username: Ваш юзернейм будет уникальным на %{domain}
+        username: Ваше имя пользователя будет уникальным на %{domain}
         whole_word: Если слово или фраза состоит только из букв и цифр, сопоставление произойдёт только по полному совпадению
       domain_allow:
         domain: Этот домен сможет получать данные с этого сервера и его входящие данные будут обрабатываться и сохранены
       featured_tag:
-        name: 'Возможно, вы захотите выбрать из них:'
+        name: 'Возможно, вы захотите добавить что-то из этого:'
       form_challenge:
         current_password: Вы входите в зону безопасности
       imports:
@@ -67,42 +73,48 @@ ru:
           name: Пункт
           value: Значение
       account_alias:
-        acct: Обработчик старой учётной записи
+        acct: Имя старой учётной записи
       account_migration:
-        acct: Обработчик новой учётной записи
+        acct: Имя новой учётной записи
       account_warning_preset:
         text: Текст шаблона
       admin_account_action:
         include_statuses: Включать в письмо жалобы на посты
-        send_email_notification: Уведомить юзера по e-mail
-        text: Свой текст предупреждения
+        send_email_notification: Уведомить пользователя по e-mail
+        text: Текст предупреждения
         type: Действие
         types:
           disable: Заморозить
           none: Ничего не делать
-          silence: Заглушить
-          suspend: Заблокировать и безвозвратно удалить все данные аккаунта
+          silence: Скрыть
+          suspend: Заблокировать и безвозвратно удалить все данные учётной записи
         warning_preset_id: Использовать шаблон
+      announcement:
+        all_day: Весь день
+        ends_at: Время завершения
+        scheduled_at: Отложенная публикация
+        starts_at: Время начала
+        text: Объявление
       defaults:
-        autofollow: С подпиской на ваш аккаунт
+        autofollow: С подпиской на вашу учётную запись
         avatar: Аватар
-        bot: Это аккаунт бота
+        bot: Это учётная запись бота
         chosen_languages: Фильтр языков
         confirm_new_password: Повторите новый пароль
         confirm_password: Повторите пароль
         context: Контекст фильтра
         current_password: Текущий пароль
         data: Данные
-        discoverable: Показывать этот аккаунт в каталоге
+        discoverable: Показывать эту учётную запись в каталоге
         display_name: Отображаемое имя
         email: Адрес e-mail
         expires_in: Истекает через
         fields: Метаданные профиля
-        header: Заголовок
+        header: Шапка
         inbox_url: URL для входящих от ретрансляторов
         irreversible: Удалять, а не скрывать
         locale: Язык интерфейса
-        locked: Сделать аккаунт закрытым
+        locked: Сделать учётную запись закрытой
         max_uses: Максимальное число использований
         new_password: Новый пароль
         note: О себе
@@ -114,26 +126,26 @@ ru:
         setting_auto_play_gif: Автоматически проигрывать анимированные GIF
         setting_boost_modal: Всегда спрашивать перед продвижением
         setting_crop_images: Кадрировать изображения в нераскрытых постах до 16:9
-        setting_default_language: Язык отправляемых статусов
+        setting_default_language: Язык отправляемых постов
         setting_default_privacy: Видимость постов
-        setting_default_sensitive: Всегда отмечать медиаконтент как чувствительный
+        setting_default_sensitive: Всегда отмечать медиафайлы как деликатные
         setting_delete_modal: Всегда спрашивать перед удалении поста
         setting_display_media: Отображение медиафайлов
         setting_display_media_default: По умолчанию
         setting_display_media_hide_all: Скрывать все
         setting_display_media_show_all: Показывать все
-        setting_expand_spoilers: Всегда раскрывать статусы, имеющие предупреждение о содержании
+        setting_expand_spoilers: Всегда раскрывать посты, имеющие предупреждение о содержании
         setting_hide_network: Скрыть свои связи
         setting_noindex: Отказаться от индексации в поисковых машинах
         setting_reduce_motion: Уменьшить движение в анимации
-        setting_show_application: Раскрывать приложение, с которого отправляются статусы
+        setting_show_application: Указывать приложение, с которого отправлен пост
         setting_system_font_ui: Использовать шрифт системы по умолчанию
         setting_theme: Тема сайта
         setting_trends: Показывать сегодняшние тренды
-        setting_unfollow_modal: Всегда спрашивать перед отпиской от аккаунта
+        setting_unfollow_modal: Всегда спрашивать перед отпиской от учётной записи
         setting_use_blurhash: Показать цветные градиенты для скрытых медиа
         setting_use_pending_items: Медленный режим
-        severity: Строгость
+        severity: Накладываемые ограничения
         type: Тип импорта
         username: Имя пользователя
         username_or_email: Имя пользователя или e-mail
@@ -141,30 +153,30 @@ ru:
       featured_tag:
         name: Хэштег
       interactions:
-        must_be_follower: Заблокировать уведомления не от подписчиков
-        must_be_following: Заблокировать уведомления от людей, на которых вы не подписаны
-        must_be_following_dm: Заблокировать личные сообщения от людей, на которых вы не подписаны
+        must_be_follower: Присылать уведомления только от подписчиков
+        must_be_following: Присылать уведомления только от людей на которых вы подписаны
+        must_be_following_dm: Разрешить присылать личные сообщения только людям, на которых вы подписаны
       invite:
         comment: Комментарий
       invite_request:
         text: Почему вы хотите присоединиться к нам?
       notification_emails:
         digest: Присылать дайджест по e-mail
-        favourite: Уведомлять по e-mail, когда кому-то нравится ваш статус
-        follow: Уведомлять по e-mail, когда кто-то подписался на вас
-        follow_request: Уведомлять по e-mail, когда кто-то запрашивает разрешение на подписку
-        mention: Уведомлять по e-mail, когда кто-то упомянул вас
-        pending_account: Отправлять e-mail при наличии новых заявок на присоединение
-        reblog: Уведомлять по e-mail, когда кто-то продвинул ваш статус
-        report: Уведомлять по e-mail при создании жалобы
-        trending_tag: Отправлять e-mail при непроверенных хэштегах в трендах
+        favourite: Ваш пост добавили в избранное
+        follow: Новый подписчик
+        follow_request: Новый запрос на подписку
+        mention: Новое упоминание
+        pending_account: Новая заявка на создание аккаунта
+        reblog: Ваш пост продвинули
+        report: Поступила новая жалоба
+        trending_tag: Актуальный хэштег требует проверки
       tag:
         listable: Разрешить показ хэштега в поиске или в каталоге профилей
         name: Хэштег
         trendable: Разрешить показ хэштега в трендах
         usable: Разрешить использовать этот хэштег в постах
     'no': Нет
-    recommended: Рекомендуется
+    recommended: Рекомендуем
     required:
       mark: "*"
       text: обязательно
diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml
index 3d5402b88..c10df08d0 100644
--- a/config/locales/simple_form.sk.yml
+++ b/config/locales/simple_form.sk.yml
@@ -22,6 +22,7 @@ sk:
         current_password: Z bezpečtnostných dôvodov prosím zadaj heslo súčasného účtu
         current_username: Pre potvrdenie prosím zadaj prezývku súčasného účtu
         digest: Odoslané iba v prípade dlhodobej neprítomnosti, a len ak si obdržal/a nejaké osobné správy kým si bol/a preč
+        discoverable: Zoznam profilov predstavuje ďalšiu cestu akou tvoj účet môže dosiahnúť väčšie publikum
         email: Bude ti odoslaný potvrdzujúci email
         fields: Až štyri položky môžeš mať na svojom profile zobrazené vo forme tabuľky
         header: PNG, GIF, alebo JPG. Maximálne %{size}. Bude zmenšený na %{dimensions}px
@@ -56,6 +57,8 @@ sk:
         text: Toto pomôže s vyhodnocovaním tvojej žiadosti
       sessions:
         otp: 'Napíš sem dvoj-faktorový kód z telefónu, alebo použi jeden z tvojích obnovovacích kódov:'
+      tag:
+        name: Zmeniť môžeš iba veľkosť písmen, napríklad aby boli ľahšie čítateľné
       user:
         chosen_languages: Keď je zaškrtnuté, vo verejnej osi budú zobrazené iba príspevky vo vybraných jazykoch
     labels:
diff --git a/config/locales/simple_form.sv.yml b/config/locales/simple_form.sv.yml
index d310bab34..de0a14bd7 100644
--- a/config/locales/simple_form.sv.yml
+++ b/config/locales/simple_form.sv.yml
@@ -19,11 +19,11 @@ sv:
         avatar: PNG, GIF eller JPG. Högst %{size}. Kommer att skalas ner till %{dimensions}px
         bot: Detta konto utför huvudsakligen automatiserade åtgärder och kanske inte övervakas
         digest: Skickas endast efter en lång period av inaktivitet och endast om du har fått några personliga meddelanden i din frånvaro
-        email: Ett konfirmationsmeddelande kommer att skickas till dig via epost
+        email: Du kommer att få ett bekräftelsemeddelande via e-post
         fields: Du kan ha upp till 4 objekt visade som en tabell på din profil
         header: PNG, GIF eller JPG. Högst %{size}. Kommer att skalas ner till %{dimensions}px
         irreversible: Filtrerade inlägg kommer att försvinna oåterkalleligt, även om filter tas bort senare
-        locale: Användargränssnittets språk, e-post och push-aviseringar
+        locale: Språket för användargränssnittet, e-postmeddelanden och push-aviseringar
         locked: Kräver att du manuellt godkänner följare
         password: Använd minst 8 tecken
         setting_display_media_default: Dölj media markerad som känslig
@@ -45,6 +45,9 @@ sv:
         fields:
           name: Etikett
           value: Innehåll
+      admin_account_action:
+        types:
+          none: Gör ingenting
       defaults:
         autofollow: Bjud in till att följa ditt konto
         bot: Detta är ett botkonto
@@ -62,10 +65,11 @@ sv:
         max_uses: Högst antal  användningar
         new_password: Nytt lösenord
         note: Biografi
-        otp_attempt: Tvåstegslösenord
+        otp_attempt: Tvåfaktorskod
         password: Lösenord
         phrase: Nyckelord eller fras
-        setting_auto_play_gif: Auto-play animerade GIF-filer
+        setting_advanced_layout: Aktivera avancerat webbgränssnitt
+        setting_auto_play_gif: Spela upp animerade GIF-bilder automatiskt
         setting_boost_modal: Visa bekräftelsedialog innan du knuffar
         setting_default_language: Språk
         setting_default_privacy: Postintegritet
@@ -86,8 +90,8 @@ sv:
         username: Användarnamn
         username_or_email: Användarnamn eller e-mail
       interactions:
-        must_be_follower: Blockera meddelanden från icke-följare
-        must_be_following: Blockera meddelanden från personer du inte följer
+        must_be_follower: Blockera aviseringar från icke-följare
+        must_be_following: Blockera aviseringar från personer du inte följer
         must_be_following_dm: Blockera direktmeddelanden från personer du inte följer
       invite:
         comment: Kommentar
diff --git a/config/locales/simple_form.th.yml b/config/locales/simple_form.th.yml
index ba353c713..074a3ad41 100644
--- a/config/locales/simple_form.th.yml
+++ b/config/locales/simple_form.th.yml
@@ -2,19 +2,27 @@
 th:
   simple_form:
     hints:
+      account_alias:
+        acct: ระบุ username@domain ของบัญชีที่คุณต้องการย้ายจาก
+      account_migration:
+        acct: ระบุ username@domain ของบัญชีที่คุณต้องการย้ายไป
       account_warning_preset:
         text: คุณสามารถใช้ไวยากรณ์โพสต์ เช่น URL, แฮชแท็ก และการกล่าวถึง
       admin_account_action:
+        include_statuses: ผู้ใช้จะเห็นว่าโพสต์ใดก่อให้เกิดการกระทำการควบคุมหรือคำเตือน
         send_email_notification: ผู้ใช้จะได้รับคำอธิบายว่าเกิดอะไรขึ้นกับบัญชีของเขา
         text_html: ตัวเลือกเพิ่มเติม คุณสามารถใช้ไวยากรณ์โพสต์ คุณสามารถ <a href="%{path}">เพิ่มคำเตือนที่ตั้งไว้ล่วงหน้า</a> เพื่อประหยัดเวลา
         type_html: เลือกสิ่งที่จะทำกับ <strong>%{acct}</strong>
-        warning_preset_id: ตัวเลือกเพิ่มเติม คุณยังคงสามารถเพิ่มข้อความที่กำหนดเองที่จุดสิ้นสุดของค่าที่ตั้งไว้ล่วงหน้า
+        warning_preset_id: ตัวเลือกเพิ่มเติม คุณยังสามารถเพิ่มข้อความที่กำหนดเองที่จุดสิ้นสุดของค่าที่ตั้งไว้ล่วงหน้า
       defaults:
         autofollow: ผู้คนที่ลงทะเบียนผ่านคำเชิญจะติดตามคุณโดยอัตโนมัติ
         avatar: PNG, GIF หรือ JPG สูงสุด %{size} จะถูกย่อขนาดเป็น %{dimensions}px
         bot: บัญชีนี้ทำการกระทำอัตโนมัติเป็นหลักและอาจไม่ได้รับการสังเกตการณ์
         context: บริบทจำนวนหนึ่งหรือมากกว่าที่ตัวกรองควรใช้
+        current_password: เพื่อวัตถุประสงค์ด้านความปลอดภัย โปรดป้อนรหัสผ่านของบัญชีปัจจุบัน
+        current_username: เพื่อยืนยัน โปรดป้อนชื่อผู้ใช้ของบัญชีปัจจุบัน
         digest: ส่งเฉพาะหลังจากไม่มีการใช้งานเป็นเวลานานและในกรณีที่คุณได้รับข้อความส่วนบุคคลใด ๆ เมื่อคุณไม่อยู่เท่านั้น
+        discoverable: ไดเรกทอรีโปรไฟล์เป็นอีกวิธีหนึ่งที่ทำให้บัญชีของคุณสามารถเข้าถึงผู้ชมได้กว้างขึ้น
         email: คุณจะได้รับอีเมลยืนยัน
         fields: คุณสามารถมีได้มากถึง 4 รายการแสดงเป็นตารางในโปรไฟล์ของคุณ
         header: PNG, GIF หรือ JPG สูงสุด %{size} จะถูกย่อขนาดเป็น %{dimensions}px
@@ -23,7 +31,7 @@ th:
         locale: ภาษาของส่วนติดต่อผู้ใช้, อีเมล และการแจ้งเตือนแบบผลัก
         locked: คุณต้องอนุมัติผู้ติดตามด้วยตนเอง
         password: ใช้อย่างน้อย 8 ตัวอักษร
-        phrase: จะถูกจับคู่โดยไม่คำนึงถึงตัวอักษรใหญ่เล็กในข้อความหรือคำเตือนเนื้อหาของโพสต์
+        phrase: จะถูกจับคู่โดยไม่คำนึงถึงตัวพิมพ์ใหญ่เล็กในข้อความหรือคำเตือนเนื้อหาของโพสต์
         scopes: API ใดที่แอปพลิเคชันจะได้รับอนุญาตให้เข้าถึง หากคุณเลือกขอบเขตระดับบนสุด คุณไม่จำเป็นต้องเลือกแต่ละขอบเขต
         setting_aggregate_reblogs: ไม่แสดงการดันใหม่สำหรับโพสต์ที่เพิ่งดัน (มีผลต่อการดันที่ได้รับใหม่เท่านั้น)
         setting_default_sensitive: ซ่อนสื่อที่ละเอียดอ่อนโดยค่าเริ่มต้นและสามารถเปิดเผยได้ด้วยการคลิก
@@ -36,7 +44,9 @@ th:
         setting_use_blurhash: การไล่ระดับสีอิงตามสีของภาพที่ซ่อนอยู่แต่ทำให้รายละเอียดใด ๆ คลุมเครือ
         setting_use_pending_items: ซ่อนการอัปเดตเส้นเวลาไว้หลังการคลิกแทนที่จะเลื่อนฟีดโดยอัตโนมัติ
         username: ชื่อผู้ใช้ของคุณจะไม่ซ้ำกันใน %{domain}
-        whole_word: เมื่อคำสำคัญหรือวลีมีแค่ตัวอักษรและตัวเลข จะถูกใช้หากตรงกันทั้งคำเท่านั้น
+        whole_word: เมื่อคำสำคัญหรือวลีเป็นตัวอักษรและตัวเลขเท่านั้น จะนำไปใช้กับคำสำคัญหรือวลีหากตรงกันทั้งคำเท่านั้น
+      domain_allow:
+        domain: โดเมนนี้จะสามารถดึงข้อมูลจากเซิร์ฟเวอร์นี้และข้อมูลขาเข้าจากโดเมนจะได้รับการประมวลผลและจัดเก็บ
       featured_tag:
         name: 'คุณอาจต้องการใช้หนึ่งในนี้:'
       form_challenge:
@@ -47,6 +57,8 @@ th:
         text: นี่จะช่วยให้เราตรวจทานใบสมัครของคุณ
       sessions:
         otp: 'ป้อนรหัสสองปัจจัยที่สร้างโดยแอปในโทรศัพท์ของคุณหรือใช้หนึ่งในรหัสกู้คืนของคุณ:'
+      tag:
+        name: คุณสามารถเปลี่ยนได้เฉพาะตัวพิมพ์ใหญ่เล็กของตัวอักษรเท่านั้น ตัวอย่างเช่น เพื่อทำให้ตัวอักษรอ่านได้ง่ายขึ้น
       user:
         chosen_languages: เมื่อกาเครื่องหมาย จะแสดงเฉพาะโพสต์ในภาษาที่เลือกในเส้นเวลาสาธารณะ
     labels:
@@ -54,18 +66,25 @@ th:
         fields:
           name: ป้ายชื่อ
           value: เนื้อหา
+      account_alias:
+        acct: การจัดการบัญชีเก่า
+      account_migration:
+        acct: การจัดการบัญชีใหม่
       account_warning_preset:
         text: ข้อความที่ตั้งไว้ล่วงหน้า
       admin_account_action:
+        include_statuses: รวมโพสต์ที่รายงานไว้ในอีเมล
         send_email_notification: แจ้งเตือนผู้ใช้ทางอีเมล
         text: คำเตือนที่กำหนดเอง
         type: การกระทำ
         types:
-          disable: ปิดใช้งาน
+          disable: ปิดใช้งานการเข้าสู่ระบบ
           none: ไม่ทำสิ่งใด
           silence: เงียบ
           suspend: ระงับและลบข้อมูลบัญชีอย่างถาวร
         warning_preset_id: ใช้คำเตือนที่ตั้งไว้ล่วงหน้า
+      announcement:
+        text: ประกาศ
       defaults:
         autofollow: เชิญให้ติดตามบัญชีของคุณ
         avatar: ภาพประจำตัว
@@ -96,6 +115,7 @@ th:
         setting_aggregate_reblogs: จัดกลุ่มการดันในเส้นเวลา
         setting_auto_play_gif: เล่น GIF แบบเคลื่อนไหวโดยอัตโนมัติ
         setting_boost_modal: แสดงกล่องโต้ตอบการยืนยันก่อนดัน
+        setting_crop_images: ครอบตัดภาพในโพสต์ที่ไม่ได้ขยายเป็น 16x9
         setting_default_language: ภาษาที่โพสต์
         setting_default_privacy: ความเป็นส่วนตัวของโพสต์
         setting_default_sensitive: ทำเครื่องหมายสื่อว่าละเอียดอ่อนเสมอ
@@ -123,7 +143,7 @@ th:
       featured_tag:
         name: แฮชแท็ก
       interactions:
-        must_be_follower: ปิดกั้นการแจ้งเตือนจากที่ไม่ใช่ผู้ติดตาม
+        must_be_follower: ปิดกั้นการแจ้งเตือนจากผู้ที่ไม่ใช่ผู้ติดตาม
         must_be_following: ปิดกั้นการแจ้งเตือนจากผู้คนที่คุณไม่ได้ติดตาม
         must_be_following_dm: ปิดกั้นข้อความโดยตรงจากผู้คนที่คุณไม่ได้ติดตาม
       invite:
@@ -132,15 +152,18 @@ th:
         text: ทำไมคุณจึงต้องการเข้าร่วม?
       notification_emails:
         digest: ส่งอีเมลสรุป
-        favourite: ส่งอีเมลเมื่อใครสักคนชื่นชอบสถานะของคุณ
-        follow: ส่งอีเมลเมื่อใครสักคนติดตามคุณ
-        follow_request: ส่งอีเมลเมื่อใครสักคนขอติดตามคุณ
-        mention: ส่งอีเมลเมื่อใครสักคนกล่าวถึงคุณ
+        favourite: ใครสักคนได้ชื่นชอบสถานะของคุณ
+        follow: ใครสักคนได้ติดตามคุณ
+        follow_request: ใครสักคนได้ขอติดตามคุณ
+        mention: ใครสักคนได้กล่าวถึงคุณ
         pending_account: ส่งอีเมลเมื่อบัญชีใหม่ต้องการการตรวจทาน
-        reblog: ส่งอีเมลเมื่อใครสักคนดันสถานะของคุณ
+        reblog: ใครสักคนได้ดันสถานะของคุณ
         report: ส่งอีเมลเมื่อมีการส่งรายงานใหม่
+        trending_tag: ส่งอีเมลเมื่อแฮชแท็กที่ยังไม่ได้ตรวจทานกำลังนิยม
       tag:
+        listable: อนุญาตให้แฮชแท็กนี้ปรากฏในการค้นหาและในไดเรกทอรีโปรไฟล์
         name: แฮชแท็ก
+        trendable: อนุญาตให้แฮชแท็กนี้ปรากฏภายใต้แนวโน้ม
         usable: อนุญาตให้โพสต์ใช้แฮชแท็กนี้
     'no': ไม่
     recommended: แนะนำ
diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml
index 4d022368a..69ee19f1b 100644
--- a/config/locales/simple_form.tr.yml
+++ b/config/locales/simple_form.tr.yml
@@ -14,6 +14,12 @@ tr:
         text_html: İsteğe bağlı. Toot sözdizimleri kullanabilirsiniz. Zamandan kazanmak için <a href="%{path}">uyarı ön-ayarları ekleyebilirsiniz</a>
         type_html: "<strong>%{acct}</strong> ile ne yapılacağını seçin"
         warning_preset_id: İsteğe bağlı. Hazır ayarın sonuna hala özel metin ekleyebilirsiniz
+      announcement:
+        all_day: İşaretlendiğinde, yalnızca zaman aralığındaki tarihler görüntülenir
+        ends_at: İsteğe bağlı. Duyuru, bu tarihte otomatik olarak yayından kaldırılacak
+        scheduled_at: Duyuruyu hemen yayınlamak için boş bırakın
+        starts_at: İsteğe bağlı. Duyurunuzun belirli bir zaman aralığına bağlı olması durumunda
+        text: Toot söz dizimini kullanabilirsiniz. Lütfen duyurunun kullanıcının ekranında yer alacağı alanı göz önünde bulundurun
       defaults:
         autofollow: Davetiyeyle kaydolan kişiler sizi otomatik olarak takip eder
         avatar: En fazla %{size} olacak şekilde PNG, GIF veya JPG formatında yükleyiniz. %{dimensions}px büyüklüğüne indirgenecektir
@@ -83,6 +89,12 @@ tr:
           silence: Sessiz
           suspend: Hesap verilerini askıya alın ve geri alınamaz şekilde silin
         warning_preset_id: Bir uyarı ön-ayarı kullan
+      announcement:
+        all_day: Tüm gün etkinliği
+        ends_at: Etkinlik sonu
+        scheduled_at: Yayınlamayı zamanla
+        starts_at: Etkinlik başlangıcı
+        text: Duyuru
       defaults:
         autofollow: Hesabınızı takip etmeye davet edin
         avatar: Profil resmi
diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml
index 272d2fe43..2fe0461cf 100644
--- a/config/locales/simple_form.uk.yml
+++ b/config/locales/simple_form.uk.yml
@@ -14,6 +14,12 @@ uk:
         text_html: Необов'язково. Ви можете використовувати синтакс дмухів. Ви можете <a href="%{path}">додати шаблони попереджень</a>, щоб заощадити час
         type_html: Оберіть, що робити з <strong>%{acct}</strong>
         warning_preset_id: Необов'язково. Ви можете ще додати будь-який текст до кінця шаблону
+      announcement:
+        all_day: Якщо вибрано, відображаються лише дати діапазону часу
+        ends_at: Необов'язково. Оголошення буде автоматично знято з публікації
+        scheduled_at: Залиште поля незаповненими, щоб опублікувати оголошення відразу
+        starts_at: Необов'язково. У разі якщо оголошення прив'язується до певного періоду часу
+        text: Ви можете використовувати той же синтаксис, що і в постах. Будьте завбачливі щодо місця, яке займе оголошення на екрані користувачів
       defaults:
         autofollow: Люди, що зареєструвалися за вашим запрошенням, автоматично підпишуться на вас
         avatar: PNG, GIF, або JPG. Максимум - %{size}. Буде зменшено до %{dimensions}px
@@ -83,6 +89,12 @@ uk:
           silence: Глушення
           suspend: Призупинити та незворотньо видалити дані облікового запису
         warning_preset_id: Використати шаблон попередження
+      announcement:
+        all_day: Увесь день
+        ends_at: Завершення події
+        scheduled_at: Відкладена публікація
+        starts_at: Час початку
+        text: Оголошення
       defaults:
         autofollow: Запросити слідкувати за вашим обліковим записом
         avatar: Аватар
diff --git a/config/locales/simple_form.vi.yml b/config/locales/simple_form.vi.yml
new file mode 100644
index 000000000..25af1a085
--- /dev/null
+++ b/config/locales/simple_form.vi.yml
@@ -0,0 +1,171 @@
+---
+vi:
+  simple_form:
+    hints:
+      account_alias:
+        acct: Chỉ định tên_người_dùng@tênmiền của tài khoản bạn muốn chuyển từ
+      account_migration:
+        acct: Chỉ định tênngườidùng@tênmiền của tài khoản bạn muốn chuyển đến
+      account_warning_preset:
+        text: Bạn có thể sử dụng cú pháp mã thông báo, chẳng hạn như URL, hashtag và đề cập
+      admin_account_action:
+        include_statuses: Người dùng sẽ thấy các toots nào đã gây ra hành động kiểm duyệt hoặc cảnh báo
+        send_email_notification: Người dùng sẽ nhận được lời giải thích về những gì đã xảy ra với tài khoản của họ
+        text_html: Không bắt buộc. Bạn có thể sử dụng cú pháp thổi còi. Bạn có thể <a href="%{path}">thêm các cài đặt trước cảnh báo</a> để tiết kiệm thời gian
+        type_html: Chọn làm gì với <strong>%{acct}</strong>
+        warning_preset_id: Không bắt buộc. Bạn vẫn có thể thêm văn bản tùy chỉnh vào cuối cài đặt trước
+      defaults:
+        autofollow: Những người đăng ký thông qua lời mời sẽ tự động theo dõi bạn
+        avatar: PNG, GIF hoặc JPG. Nhiều nhất là %{size}. Sẽ bị hạ thấp xuống %{dimensions}px
+        bot: Tài khoản này chủ yếu thực hiện các hành động tự động và có thể không được theo dõi
+        context: Một hoặc nhiều bối cảnh nơi bộ lọc nên áp dụng
+        current_password: Vì mục đích bảo mật, vui lòng nhập mật khẩu của tài khoản hiện tại
+        current_username: Để xác nhận, vui lòng nhập tên người dùng của tài khoản hiện tại
+        digest: Chỉ được gửi sau một thời gian dài không hoạt động và chỉ khi bạn đã nhận được bất kỳ tin nhắn cá nhân nào khi bạn vắng mặt
+        discoverable: Thư mục hồ sơ là một cách khác để tài khoản của bạn có thể tiếp cận đối tượng rộng hơn
+        email: Bạn sẽ được gửi một email xác nhận
+        fields: Bạn có thể có tối đa 4 mục được hiển thị dưới dạng bảng trên hồ sơ của bạn
+        header: PNG, GIF hoặc JPG. Nhiều nhất là %{size}. Sẽ bị hạ thấp xuống %{dimensions}px
+        inbox_url: Sao chép URL từ frontpage của rơle bạn muốn sử dụng
+        irreversible: Các toots được lọc sẽ biến mất không thể đảo ngược, ngay cả khi bộ lọc sau đó bị xóa
+        locale: Ngôn ngữ của giao diện người dùng, e-mail và thông báo đẩy
+        locked: Yêu cầu bạn chấp thuận thủ công người theo dõi
+        password: Sử dụng ít nhất 8 ký tự
+        phrase: Sẽ được kết hợp bất kể vỏ bọc trong văn bản hoặc cảnh báo nội dung của một toot
+        scopes: API nào ứng dụng sẽ được phép truy cập. Nếu bạn chọn phạm vi cấp cao nhất, bạn không cần chọn từng phạm vi.
+        setting_aggregate_reblogs: Không hiển thị các mức tăng mới cho các mã thông báo đã được tăng gần đây (chỉ ảnh hưởng đến các lần tăng mới nhận được)
+        setting_default_sensitive: Phương tiện nhạy cảm được ẩn theo mặc định và có thể được tiết lộ bằng một cú nhấp chuột
+        setting_display_media_default: Ẩn phương tiện được đánh dấu là nhạy cảm
+        setting_display_media_hide_all: Luôn ẩn tất cả các phương tiện truyền thông
+        setting_display_media_show_all: Luôn hiển thị phương tiện được đánh dấu là nhạy cảm
+        setting_hide_network: Ai bạn theo dõi và ai theo dõi bạn sẽ không được hiển thị trên hồ sơ của bạn
+        setting_noindex: Ảnh hưởng đến hồ sơ công khai và trang trạng thái của bạn
+        setting_show_application: Ứng dụng bạn sử dụng để mã thông báo sẽ được hiển thị trong chế độ xem chi tiết các mã thông báo của bạn
+        setting_use_blurhash: Các lớp được dựa trên màu sắc của hình ảnh ẩn nhưng che giấu bất kỳ chi tiết nào
+        setting_use_pending_items: Ẩn các cập nhật dòng thời gian đằng sau một nhấp chuột thay vì tự động cuộn nguồn cấp dữ liệu
+        username: Tên người dùng của bạn sẽ là duy nhất trên %{domain}
+        whole_word: Khi từ khóa hoặc cụm từ chỉ là chữ và số, nó sẽ chỉ được áp dụng nếu nó phù hợp với toàn bộ từ
+      domain_allow:
+        domain: Tên miền này sẽ có thể tìm nạp dữ liệu từ máy chủ này và dữ liệu đến từ nó sẽ được xử lý và lưu trữ
+      featured_tag:
+        name: 'Bạn có thể muốn sử dụng một trong những điều sau đây:'
+      form_challenge:
+        current_password: Bạn đang vào một khu vực an toàn
+      imports:
+        data: Tệp CSV được xuất từ máy chủ Mastodon khác
+      invite_request:
+        text: Điều này sẽ giúp chúng tôi xem xét ứng dụng của bạn
+      sessions:
+        otp: 'Nhập mã hai yếu tố được tạo bởi ứng dụng điện thoại của bạn hoặc sử dụng một trong các mã khôi phục của bạn:'
+      tag:
+        name: Bạn chỉ có thể thay đổi vỏ của các chữ cái, ví dụ, để dễ đọc hơn
+      user:
+        chosen_languages: Khi được chọn, chỉ các toots trong các ngôn ngữ được chọn sẽ được hiển thị theo các mốc thời gian công khai
+    labels:
+      account:
+        fields:
+          name: Nhãn
+          value: Nội dung
+      account_alias:
+        acct: Xử lý tài khoản cũ
+      account_migration:
+        acct: Xử lý tài khoản mới
+      account_warning_preset:
+        text: Văn bản cài sẵn
+      admin_account_action:
+        include_statuses: Bao gồm các mã thông báo được báo cáo trong e-mail
+        send_email_notification: Thông báo cho người dùng mỗi email
+        text: Cảnh báo tùy chỉnh
+        type: Hoạt động
+        types:
+          disable: Vô hiệu hóa
+          none: Không làm gì cả
+          silence: khoảng lặng
+          suspend: Đình chỉ và xóa dữ liệu tài khoản
+        warning_preset_id: Sử dụng cài đặt trước cảnh báo
+      defaults:
+        autofollow: Mời theo dõi tài khoản của bạn
+        avatar: hình đại diện
+        bot: Đây là tài khoản bot
+        chosen_languages: Ngôn ngữ bộ lọc
+        confirm_new_password: Xác nhận mật khẩu mới
+        confirm_password: Xác nhận mật khẩu
+        context: Bối cảnh bộ lọc
+        current_password: Mật khẩu hiện tại
+        data: Dữ liệu
+        discoverable: Liệt kê tài khoản này trên thư mục
+        display_name: Tên hiển thị
+        email: Địa chỉ email
+        expires_in: Hết hạn sau
+        fields: Hồ sơ siêu dữ liệu
+        header: Tiêu đề
+        inbox_url: URL của hộp thư đến chuyển tiếp
+        irreversible: Thả thay vì trốn
+        locale: Ngôn ngữ giao diện
+        locked: Khóa tài khoản
+        max_uses: Số lần sử dụng tối đa
+        new_password: Mật khẩu mới
+        note: Sinh học
+        otp_attempt: Mã hai yếu tố
+        password: Mật khẩu
+        phrase: Từ khóa hoặc cụm từ
+        setting_advanced_layout: Kích hoạt giao diện web nâng cao
+        setting_aggregate_reblogs: Nhóm tăng thời gian
+        setting_auto_play_gif: Tự động phát GIF động
+        setting_boost_modal: Hiển thị hộp thoại xác nhận trước khi tăng
+        setting_crop_images: Cắt bớt ảnh trong những tút không thể mở rộng về 16x9
+        setting_default_language: Ngôn ngữ đăng
+        setting_default_privacy: Đăng quyền riêng tư
+        setting_default_sensitive: Luôn đánh dấu phương tiện là nhạy cảm
+        setting_delete_modal: Hiển thị hộp thoại xác nhận trước khi xóa mã thông báo
+        setting_display_media: Hiển thị đa phương tiện
+        setting_display_media_default: Mặc định
+        setting_display_media_hide_all: Giấu tất cả
+        setting_display_media_show_all: Hiển thị tất cả
+        setting_expand_spoilers: Luôn mở rộng các thẻ được đánh dấu bằng cảnh báo nội dung
+        setting_hide_network: Ẩn mạng của bạn
+        setting_noindex: Từ chối lập chỉ mục công cụ tìm kiếm
+        setting_reduce_motion: Giảm chuyển động trong hình ảnh động
+        setting_show_application: Tiết lộ ứng dụng được sử dụng để gửi toots
+        setting_system_font_ui: Sử dụng phông chữ mặc định của hệ thống
+        setting_theme: Chủ đề trang web
+        setting_trends: Hiển thị xu hướng ngày nay
+        setting_unfollow_modal: Hiển thị hộp thoại xác nhận trước khi hủy theo dõi ai đó
+        setting_use_blurhash: Hiển thị độ dốc đầy màu sắc cho phương tiện ẩn
+        setting_use_pending_items: Chế độ chậm
+        severity: Mức độ nghiêm trọng
+        type: Nhập khẩu
+        username: tên tài khoản
+        username_or_email: Tên người dùng hoặc email
+        whole_word: Cả từ
+      featured_tag:
+        name: Dấu thăng
+      interactions:
+        must_be_follower: Chặn thông báo từ những người không theo dõi
+        must_be_following: Chặn thông báo từ những người bạn không theo dõi
+        must_be_following_dm: Chặn tin nhắn trực tiếp từ những người bạn không theo dõi
+      invite:
+        comment: Bình luận
+      invite_request:
+        text: Tại sao bạn muốn tham gia?
+      notification_emails:
+        digest: Gửi e-mail tiêu hóa
+        favourite: Gửi e-mail khi ai đó yêu thích trạng thái của bạn
+        follow: Gửi e-mail khi ai đó theo dõi bạn
+        follow_request: Gửi e-mail khi ai đó yêu cầu theo dõi bạn
+        mention: Gửi e-mail khi ai đó nhắc đến bạn
+        pending_account: Gửi e-mail khi một tài khoản mới cần xem xét
+        reblog: Gửi e-mail khi ai đó tăng trạng thái của bạn
+        report: Gửi e-mail khi một báo cáo mới được gửi
+        trending_tag: Gửi e-mail khi một hashtag chưa được xem xét đang là xu hướng
+      tag:
+        listable: Cho phép hashtag này xuất hiện trong các tìm kiếm và trên thư mục hồ sơ
+        name: Dấu thăng
+        trendable: Cho phép hashtag này xuất hiện theo xu hướng
+        usable: Cho phép các toots sử dụng hashtag này
+    'no': Không
+    recommended: Đề xuất
+    required:
+      mark: "*"
+      text: cần thiết
+    'yes': Đúng
diff --git a/config/locales/simple_form.zh-CN.yml b/config/locales/simple_form.zh-CN.yml
index ec5486257..62bc6b2f7 100644
--- a/config/locales/simple_form.zh-CN.yml
+++ b/config/locales/simple_form.zh-CN.yml
@@ -2,10 +2,15 @@
 zh-CN:
   simple_form:
     hints:
+      account_alias:
+        acct: 指定您想要迁移过来的帐号的 用户名@站点域名
+      account_migration:
+        acct: 指定你想迁移过去的帐号的 用户名@站点域名
       account_warning_preset:
         text: 你可以使用嘟文格式,在嘟文中加入 URL、话题标签和提及“@”
       admin_account_action:
-        send_email_notification: 用户将收到对其帐号上发生的事的解释
+        include_statuses: 用户将会看到哪些嘟文导致了审核行为或警告
+        send_email_notification: 用户将收到对其账号上发生的事的解释
         text_html: 可选。你可以使用嘟文格式。你可以<a href="%{path}">预置警告</a>以节省时间
         type_html: 用<strong>%{acct}</strong>选择做什么
         warning_preset_id: 可选。你可以在预置文本末尾添加自定义文本
@@ -14,7 +19,10 @@ zh-CN:
         avatar: 文件大小限制 %{size},只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 %{dimensions}px
         bot: 来自这个帐户的绝大多数操作都是自动进行的,并且可能无人监控
         context: 过滤器的应用场景
+        current_password: 为了安全起见,请输入当前账号的密码
+        current_username: 请输入当前账号的用户名以确认
         digest: 仅在你长时间未登录,且收到了私信时发送
+        discoverable: 用户目录能够让您的帐号广为人知
         email: 我们会向你发送一封确认邮件
         fields: 这将会在个人资料页上以表格的形式展示,最多 4 个项目
         header: 文件大小限制 %{size},只支持 PNG、GIF 或 JPG 格式。图片分辨率将会压缩至 %{dimensions}px
@@ -34,16 +42,23 @@ zh-CN:
         setting_noindex: 此设置会影响到你的公开个人资料以及嘟文页面
         setting_show_application: 你用来发表嘟文的应用程序将会在你嘟文的详细内容中显示
         setting_use_blurhash: 渐变是基于模糊后的隐藏内容生成的
+        setting_use_pending_items: 关闭自动滚动更新,时间轴会在点击后更新
         username: 你的用户名在 %{domain} 上是独特的
         whole_word: 如果关键词只包含字母和数字,就只会在整个词被匹配时才会套用
+      domain_allow:
+        domain: 该站点将能够从该服务器上拉取数据,并且从那里发过来的数据也会被处理和存储。
       featured_tag:
         name: 你可能想要使用以下之一:
+      form_challenge:
+        current_password: 您正在进入安全区域
       imports:
         data: 从其他 Mastodon 服务器导出的 CSV 文件
       invite_request:
         text: 这会有助于我们处理你的申请
       sessions:
         otp: 输入你手机应用上生成的双重认证码,或者任意一个恢复代码:
+      tag:
+        name: 您只能改变字母的大小写,让它更易读
       user:
         chosen_languages: 仅选中语言的嘟文会出现在公共时间轴上(全不选则显示所有语言的嘟文)
     labels:
@@ -51,9 +66,14 @@ zh-CN:
         fields:
           name: 标签
           value: 内容
+      account_alias:
+        acct: 处理旧帐号
+      account_migration:
+        acct: 处理新账号
       account_warning_preset:
         text: 预置文本
       admin_account_action:
+        include_statuses: 在电子邮件中包括已举报的嘟文
         send_email_notification: 通过邮件提醒此用户
         text: 内容警告
         type: 动作
@@ -61,7 +81,7 @@ zh-CN:
           disable: 禁用
           none: 忽略
           silence: 静音
-          suspend: 停用并永久删除账户数据
+          suspend: 停用并永久删除账号数据
         warning_preset_id: 使用预置警告
       defaults:
         autofollow: 让被邀请人关注你的帐户
@@ -73,7 +93,7 @@ zh-CN:
         context: 过滤器场景
         current_password: 当前密码
         data: 数据文件
-        discoverable: 在本站用户目录中收录此账户
+        discoverable: 在本站用户目录中收录此账号
         display_name: 昵称
         email: 电子邮件地址
         expires_in: 失效时间
@@ -93,7 +113,7 @@ zh-CN:
         setting_aggregate_reblogs: 在时间轴中合并转嘟
         setting_auto_play_gif: 自动播放 GIF 动画
         setting_boost_modal: 在转嘟前询问我
-        setting_crop_images: 裁剪未展开嘟文的图片到 16x9
+        setting_crop_images: 把未展开嘟文中的图片裁剪到 16x9
         setting_default_language: 发布语言
         setting_default_privacy: 嘟文默认可见范围
         setting_default_sensitive: 总是将我发送的媒体文件标记为敏感内容
@@ -112,6 +132,7 @@ zh-CN:
         setting_trends: 显示今日热门
         setting_unfollow_modal: 在取消关注前询问我
         setting_use_blurhash: 将隐藏媒体显示为彩色渐变
+        setting_use_pending_items: 慢速模式
         severity: 级别
         type: 导入数据类型
         username: 用户名
@@ -133,17 +154,18 @@ zh-CN:
         follow: 当有用户关注我时,发送电子邮件提醒我
         follow_request: 当有用户向我发送关注请求时,发送电子邮件提醒我
         mention: 当有用户在嘟文中提及我时,发送电子邮件提醒我
-        pending_account: 在有账户需要审核时,发送电子邮件提醒我
+        pending_account: 在有帐号需要审核时,发送电子邮件提醒我
         reblog: 当有用户转嘟了我的嘟文时,发送电子邮件提醒我
         report: 在提交新举报时,发送电子邮件提醒我
-        trending_tag: 当未经审核的话题当前热门时邮件提醒
+        trending_tag: 当未经审核的话题成为当前热门时发邮件提醒
       tag:
         listable: 允许这个话题标签在用户目录中显示
         name: 话题标签
         trendable: 允许在热门下显示此话题
-        usable: 允许嘟文使用此话题
+        usable: 允许嘟文使用此话题标签
     'no': 否
     recommended: 推荐
     required:
+      mark: "*"
       text: 必填
     'yes': 是
diff --git a/config/locales/simple_form.zh-HK.yml b/config/locales/simple_form.zh-HK.yml
index 2cb2d75b2..235d9c764 100644
--- a/config/locales/simple_form.zh-HK.yml
+++ b/config/locales/simple_form.zh-HK.yml
@@ -2,17 +2,44 @@
 zh-HK:
   simple_form:
     hints:
+      account_alias:
+        acct: 指定欲移動之帳戶的 使用者名稱@站台
+      account_migration:
+        acct: 指定欲移動至之帳戶的 使用者名稱@站台
+      account_warning_preset:
+        text: 您可使用嘟文語法,例如網址、「#」標籤和提及功能
+      admin_account_action:
+        send_email_notification: 使用者將收到帳戶發生之事情的解釋
+        text_html: 選用。您能使用嘟文語法。您可 <a href="%{path}">新增警告預設</a> 來節省時間
+        type_html: 設定要使用 <strong>%{acct}</strong> 做的事
+        warning_preset_id: 選用。您仍可在預設的結尾新增自訂文字
       defaults:
         autofollow: 通過邀請網址註冊的用戶將會自動關注你
         avatar: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px
         bot: 提醒用戶本帳號是機械人
+        context: 應該套用過濾器的一項或多項內容
         digest: 僅在你長時間未登錄,且收到了私信時發送
+        email: 您將收到一封確認電子郵件
         fields: 個人資料頁可顯示多至 4 個項目
         header: 支援 PNG, GIF 或 JPG 圖片,檔案最大為 %{size},會縮裁成 %{dimensions}px
+        inbox_url: 從您想要使用的中繼首頁複製網址
+        irreversible: 已過濾的嘟文將會不可逆的消失,即便過濾器移除之後也一樣
         locale: 使用者介面、電郵和通知的語言
         locked: 你必須人手核准每個用戶對你的關注請求,而你的文章私隱會被預設為「只有關注你的人能看」
+        password: 使用至少 8 個字元
+        phrase: 無論是嘟文的本文或是內容警告都會被過濾
+        scopes: 允許讓應用程式存取的 API。 若您選擇最高階範圍,則無須選擇個別項目。
+        setting_aggregate_reblogs: 請勿顯示最近已被轉嘟之嘟文的最新轉嘟(只影響最新收到的嘟文)
+        setting_display_media_default: 隱藏標為敏感的媒體
+        setting_display_media_hide_all: 總是隱藏所有媒體
+        setting_display_media_show_all: 總是顯示標為敏感的媒體
         setting_hide_network: 你關注的人和關注你的人將不會在你的個人資料頁上顯示
         setting_noindex: 此設定會影響到你的公開個人資料以及文章頁面
+        setting_show_application: 您用來發嘟文的應用程式將會在您嘟文的詳細檢視顯示
+        username: 您的使用者名稱將在 %{domain} 是獨一無二的
+        whole_word: 如果關鍵字或詞組僅有字母與數字,則其將只在符合整個單字的時候才會套用
+      featured_tag:
+        name: 您可能想使用其中一個:
       imports:
         data: 自其他服務站匯出的 CSV 檔案
       sessions:
@@ -24,6 +51,18 @@ zh-HK:
         fields:
           name: 標籤
           value: 內容
+      account_warning_preset:
+        text: 預設文字
+      admin_account_action:
+        send_email_notification: 透過電子信件通知使用者
+        text: 自訂警告
+        type: 動作
+        types:
+          disable: 停用
+          none: 什麼也不做
+          silence: 安靜
+          suspend: 停權並不可逆的刪除帳戶資料
+        warning_preset_id: 使用警告預設
       defaults:
         autofollow: 邀請別人關注你的賬號
         avatar: 個人頭像
@@ -31,13 +70,17 @@ zh-HK:
         chosen_languages: 語言過濾
         confirm_new_password: 確認新密碼
         confirm_password: 確認密碼
+        context: 過濾情境
         current_password: 目前密碼
         data: 資料
+        discoverable: 在目錄列出此帳戶
         display_name: 顯示名稱
         email: 電郵地址
         expires_in: 失效時間
         fields: 資料
         header: 個人頁面頂部
+        inbox_url: 中繼收件匣的 URL
+        irreversible: 放棄而非隱藏
         locale: 介面語言
         locked: 將用戶轉為「私人」
         max_uses: 最大使用次數
@@ -45,15 +88,23 @@ zh-HK:
         note: 簡介
         otp_attempt: 雙重認證碼
         password: 密碼
+        phrase: 關鍵字或片語
+        setting_aggregate_reblogs: 時間軸中的群組轉嘟
         setting_auto_play_gif: 自動播放 GIF
         setting_boost_modal: 在轉推前詢問我
         setting_default_language: 文章語言
         setting_default_privacy: 文章預設為
         setting_default_sensitive: 預設我的內容為敏感內容
         setting_delete_modal: 刪推前詢問我
+        setting_display_media: 媒體顯示
+        setting_display_media_default: 預設
+        setting_display_media_hide_all: 全部隱藏
+        setting_display_media_show_all: 全部顯示
+        setting_expand_spoilers: 永遠展開標有內容警告的嘟文
         setting_hide_network: 隱藏你的社交網絡
         setting_noindex: 阻止搜尋引擎檢索
         setting_reduce_motion: 減低動畫效果
+        setting_show_application: 顯示用來傳送嘟文的應用程式
         setting_system_font_ui: 使用系統預設字型
         setting_theme: 網站主題
         setting_unfollow_modal: 取消關注前跳出詢問我
@@ -61,6 +112,9 @@ zh-HK:
         type: 匯入資料類型
         username: 用戶名稱
         username_or_email: 用戶名稱或電郵
+        whole_word: 整個詞彙
+      featured_tag:
+        name: "「#」標籤"
       interactions:
         must_be_follower: 隱藏沒有關注你的用戶的通知
         must_be_following: 隱藏你不關注的用戶的通知
@@ -72,7 +126,9 @@ zh-HK:
         follow_request: 當有用戶要求關注你時,發電郵通知
         mention: 當有用戶在文章提及你時,發電郵通知
         reblog: 當有用戶轉推你的文章時,發電郵通知
+        report: 當提交新檢舉時傳送電子郵件
     'no': 否
     required:
+      mark: "*"
       text: 必須填寫
     'yes': 是
diff --git a/config/locales/simple_form.zh-TW.yml b/config/locales/simple_form.zh-TW.yml
index fbbbff6ca..7de349ee3 100644
--- a/config/locales/simple_form.zh-TW.yml
+++ b/config/locales/simple_form.zh-TW.yml
@@ -129,5 +129,6 @@ zh-TW:
         report: 當提交新檢舉時傳送電子郵件
     'no': 否
     required:
+      mark: "*"
       text: 必須填寫
     'yes': 是
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 8339309b3..cd3ef0390 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -41,6 +41,8 @@ sk:
     unavailable_content_description:
       domain: Server
       reason: 'Dôvod:'
+      rejecting_media: 'Mediálne súbory z týchto serverov nebudú spracované, alebo ukladané, a nebudú z nich zobrazované žiadne náhľady, vyžadujúc ručné prekliknutie priamo až k pôvodnému súboru:'
+      silenced: 'Príspevky z týchto serverov budú skryté z verejných osí a z konverzácií, a nebudú vytvorené žiadné oboznámena ohľadom aktivity ich užívateľov, pokiaľ ich nenásleduješ:'
     user_count_after:
       few: užívateľov
       many: užívatelia
@@ -82,6 +84,7 @@ sk:
     roles:
       admin: Správca
       bot: Bot
+      group: Skupina
       moderator: Moderátor
     unavailable: Profil nieje dostupný
     unfollow: Prestaň sledovať
@@ -202,10 +205,12 @@ sk:
         confirm_user: "%{name} potvrdil emailovú adresu používateľa %{target}"
         create_account_warning: "%{name} poslal/a varovanie užívateľovi %{target}"
         create_custom_emoji: "%{name} nahral nový emoji %{target}"
+        create_domain_allow: "%{name} pridal/a doménu %{target} na zoznam povolených"
         create_domain_block: "%{name} zablokoval doménu %{target}"
         create_email_domain_block: "%{name} pridal e-mailovú doménu %{target} na zoznam zakázaných"
         demote_user: "%{name} degradoval používateľa %{target}"
         destroy_custom_emoji: "%{name} zničil/a %{target} emoji"
+        destroy_domain_allow: "%{name} odstránil/a doménu %{target} zo zoznamu povolených"
         destroy_domain_block: "%{name} povolil doménu %{target}"
         destroy_email_domain_block: "%{name} pridal e-mailovú doménu %{target} na zoznam povolených"
         destroy_status: "%{name} zmazal status %{target}"
@@ -215,7 +220,7 @@ sk:
         enable_custom_emoji: "%{name} povolil emoji %{target}"
         enable_user: "%{name} povolil prihlásenie pre používateľa %{target}"
         memorialize_account: "%{name} zmenil účet %{target} na pamätnú stránku"
-        promote_user: "%{name} povýšil/a používateľa %{target}"
+        promote_user: "%{name} vyzdvihli užívateľa %{target}"
         remove_avatar_user: "%{name} odstránil/a %{target}ov avatár"
         reopen_report: "%{name} znovu otvoril/a hlásenie užívateľa %{target}"
         reset_password_user: "%{name} resetoval/a heslo pre používateľa %{target}"
@@ -229,6 +234,14 @@ sk:
         update_status: "%{name} aktualizoval/a status pre %{target}"
       deleted_status: "(zmazaný príspevok)"
       title: Kontrólny záznam
+    announcements:
+      live: Naživo
+      new:
+        create: Vytvor oznam
+        title: Nové oznámenie
+      published: Zverejnený
+      time_range: Časový rozsah
+      title: Oboznámenia
     custom_emojis:
       assign_category: Priraď kategóriu
       by_domain: Doména
@@ -237,7 +250,7 @@ sk:
       copy_failed_msg: Nebolo možné vytvoriť miestnu kópiu tohto emoji
       create_new_category: Vytvor novú kategóriu
       created_msg: Emoji úspešne vytvorené!
-      delete: Zmaž
+      delete: Vymaž
       destroyed_msg: Emoji úspešne zničené!
       disable: Zakáž
       disabled: Vypnuté
@@ -305,7 +318,7 @@ sk:
         create: Vytvor blokovanie domény
         hint: Blokovanie domény stále dovolí vytvárať nové účty v databázi, ale tieto budú spätne automaticky moderované.
         severity:
-          desc_html: "<strong>Stíšenie</strong> urobí všetky príspevky daného účtu neviditeľné pre všetkých ktorí nenásledujú tento účet. <strong>Suspendácia</strong> zmaže všetky príspevky, médiá a profilové informácie. Použi <strong>Žiadne</strong>, ak chceš iba neprijímať súbory médií."
+          desc_html: "<strong>Stíšenie</strong> urobí všetky príspevky daného účtu neviditeľné pre všetkých ktorí nenásledujú tento účet. <strong>Vylúčenie</strong> zmaže všetky príspevky, médiá a profilové informácie. Použi <strong>Žiadne</strong>, ak chceš iba neprijímať súbory médií."
           noop: Nič
           silence: Stíš
           suspend: Vylúč
@@ -345,9 +358,6 @@ sk:
         create: Pridaj doménu
         title: Nový email na zablokovanie
       title: Blokované emailové adresy
-    followers:
-      back_to_account: Späť na účet
-      title: Sledovatielia užívateľa %{acct}
     instances:
       by_domain: Doména
       delivery_available: Je v dosahu doručovania
@@ -398,10 +408,17 @@ sk:
       created_msg: Poznámka o nahlásení úspešne vytvorená!
       destroyed_msg: Poznámka o nahlásení úspešne vymazaná!
     reports:
+      account:
+        reports:
+          few: "%{count} hlásení"
+          many: "%{count} hlásenia"
+          one: "%{count} hlásenie"
+          other: "%{count} hlásení"
       action_taken_by: Zákrok vykonal/a
       are_you_sure: Si si istý/á?
       assign_to_self: Priraď sebe
       assigned: Priradený moderátor
+      by_target_domain: Doména nahláseného účtu
       comment:
         none: Žiadne
       created_at: Nahlásené
@@ -467,7 +484,7 @@ sk:
           desc_html: Toto sa zobrazí na hlavnej stránke v prípade, že sú registrácie uzavreté. Možno tu použiť aj HTML kód
           title: Správa o uzavretých registráciách
         deletion:
-          desc_html: Dovoľ každému aby si mohli zmazať svok účet
+          desc_html: Dovoľ každému, aby si mohli vymazať svok účet
           title: Sprístupni možnosť vymazať si účet
         min_invite_role:
           disabled: Nikto
@@ -573,6 +590,8 @@ sk:
     animations_and_accessibility: Animácie a prístupnosť
     confirmation_dialogs: Potvrdzovacie dialógy
     discovery: Nájdenie
+    localization:
+      guide_link_text: Prispievať môže každý.
     sensitive_content: Chúlostivý obsah
     toot_layout: Rozloženie príspevkov
   application_mailer:
@@ -586,7 +605,7 @@ sk:
     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 vygenerovať prístupový token
+    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!
     your_token: Tvoj prístupový token
@@ -708,7 +727,6 @@ sk:
     blocks: Blokujete
     csv: CSV
     domain_blocks: Blokované domény
-    follows: Následujete
     lists: Zoznamy
     mutes: Stíšil/a si
     storage: Úložisko médií
@@ -729,6 +747,7 @@ sk:
       invalid_irreversible: Nezvratné filtrovanie funguje iba so súvislostiami domovskej osi a oboznámení
     index:
       delete: Vymaž
+      empty: Nemáš žiadné filtrovanie.
       title: Triedenia
     new:
       title: Pridaj nové triedenie
@@ -841,6 +860,7 @@ sk:
     warning:
       backreference_required: Nový účet musí byť najskôr nastavený tak, aby spätne odkazoval na tento
       before: 'Než budeš pokračovať, prosím pozorne si prečítaj tieto poznámky:'
+      cooldown: Po presunutí je tu istá zahrievacia doba, počas ktorej sa nebudeš môcť znova presunúť
       disabled_account: Tvoj súčasný účet už po tomto nebude plne použiteľný. Stále ale budeš mať prístup ku stiahnutiu dát a možnosti znovu-aktivácie.
       followers: Tento úkon presunie všetkých následovateľov zo súčasného účtu na nový účet
       only_redirect_html: Ako alternatívu, môžeš <a href="%{path}">iba nastaviť presmerovanie na tvoj profil</a>.
@@ -886,6 +906,10 @@ sk:
       body: 'Tvoj príspevok bol vyzdvihnutý užívateľom %{name}:'
       subject: "%{name} vyzdvihli tvoj príspevok"
       title: Novo vyzdvyhnuté
+  notifications:
+    email_events: Udalosti oznamované emailom
+    email_events_hint: 'Vyber si udalosti, pre ktoré chceš dostávať oboznámenia:'
+    other_settings: Ostatné oboznamovacie nastavenia
   pagination:
     newer: Novšie
     next: Ďalšie
@@ -898,6 +922,7 @@ sk:
       duration_too_long: je príliš ďaleko do budúcnosti
       duration_too_short: je príliš skoro
       expired: Anketa už skončila
+      invalid_choice: Zvolená hlasovacia možnosť neexistuje
       over_character_limit: každá nemôže byť dlhšia ako %{max} znakov
       too_few_options: musí mať viac ako jednu položku
       too_many_options: nemôže zahŕňať viac ako %{max} položiek
@@ -908,6 +933,8 @@ sk:
   relationships:
     activity: Aktivita účtu
     dormant: Spiace
+    followers: Následovatelia
+    following: Následovaní
     last_active: Naposledy aktívny
     most_recent: Najnovšie
     moved: Presunuli sa
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 2faaa149a..afb928f11 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -320,9 +320,6 @@ sl:
         create: Dodaj domeno
         title: Nov vnos e-pošte na črni seznam
       title: Črni seznam e-pošt
-    followers:
-      back_to_account: Nazaj na račun
-      title: Sledilci od %{acct}
     instances:
       by_domain: Domena
       delivery_available: Na voljo je dostava
@@ -615,7 +612,6 @@ sl:
     blocks: Blokirate
     csv: CSV
     domain_blocks: Bloki domene
-    follows: Sledite
     lists: Seznami
     mutes: Utišate
     storage: Shranjeni mediji
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index e5378082e..6a7a945c4 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -266,9 +266,6 @@ sq:
         create: Shtoni përkatësi
         title: Zë i ri email në listë bllokimesh
       title: Listë bllokimesh email-esh
-    followers:
-      back_to_account: Mbrapsht Te Llogaria
-      title: Ndjekës të %{acct}
     instances:
       delivery_available: Ka shpërndarje të mundshme
       known_accounts:
@@ -511,7 +508,6 @@ sq:
       size: Madhësi
     blocks: Bllokoni
     domain_blocks: Bllokime përkatësish
-    follows: Ndiqni
     lists: Lista
     mutes: Heshtoni
     storage: Depozitim për media
diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml
index 1f3d69e21..61cea8c21 100644
--- a/config/locales/sr-Latn.yml
+++ b/config/locales/sr-Latn.yml
@@ -323,7 +323,6 @@ sr-Latn:
     noscript_html: Da biste koristili Mastodont veb aplikaciju, omogućite JavaScript. U suprotnom, probajte neku od <a href="%{apps_path}">originalnih aplikacija</a> za Mastodont za Vašu platformu.
   exports:
     blocks: Blokirali ste
-    follows: Pratite
     mutes: Ućutkali ste
     storage: Multimedijalno skladište
   generic:
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index d06bb214e..c68681215 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -280,9 +280,6 @@ sr:
         create: Додај домен
         title: Нова ставка е-поштe у црној листи
       title: Црна листа E-поште
-    followers:
-      back_to_account: Назад на налог
-      title: "%{acct} Пратиоци"
     instances:
       delivery_available: Достава је доступна
       known_accounts:
@@ -530,7 +527,6 @@ sr:
       size: Величина
     blocks: Блокирали сте
     domain_blocks: Блокови домена
-    follows: Пратите
     lists: Листе
     mutes: Ућуткали сте
     storage: Мултимедијално складиште
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index 911698620..0094ff06b 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -20,7 +20,7 @@ sv:
     documentation: Dokumentation
     federation_hint_html: Med ett konto på %{instance} kommer du att kunna följa personer på alla Mastodon-servers och mer än så.
     get_apps: Prova en mobilapp
-    hosted_on: Mastodon värd på %{domain}
+    hosted_on: Mastodon-värd på %{domain}
     instance_actor_flash: 'Detta konto är en virtuell agent som används för att representera servern själv och inte någon individuell användare. Det används av sammanslutningsskäl och ska inte blockeras såvitt du inte vill blockera hela instansen, och för detta fall ska domänblockering användas.
 
 '
@@ -47,6 +47,9 @@ sv:
     endorsements_hint: Från webbgränssnittet kan du rekommendera följare, som sedan visas här.
     featured_tags_hint: Du kan använda fyrkanter som visas här.
     follow: Följa
+    followers:
+      one: Följare
+      other: Följare
     following: Följer
     joined: Gick med %{date}
     last_active: senast aktiv
@@ -66,6 +69,7 @@ sv:
     roles:
       admin: Administratör
       bot: Robot
+      group: Grupp
       moderator: Moderator
     unavailable: Profilen är inte tillgänglig
     unfollow: Sluta följa
@@ -195,7 +199,7 @@ sv:
         destroy_domain_block: "%{name} avblockerade domän %{target}"
         destroy_email_domain_block: "%{name} vitlistade e-postdomän %{target}"
         destroy_status: "%{name} tog bort status av %{target}"
-        disable_2fa_user: "%{name} inaktiverade tvåstegsautentiseringskrav för användare %{target}"
+        disable_2fa_user: "%{name} inaktiverade tvåfaktorsautentiseringskrav för användare %{target}"
         disable_custom_emoji: "%{name} inaktiverade emoji %{target}"
         disable_user: "%{name} inaktiverade inloggning för användare %{target}"
         enable_custom_emoji: "%{name} aktiverade emoji %{target}"
@@ -264,11 +268,29 @@ sv:
       pending_tags: hashtags som inväntar granskning
       pending_users: användare som inväntar granskning
       recent_users: Senaste användare
+      search: Fulltextsökning
+      single_user_mode: Enanvändarläge
+      software: Programvara
+      space: Utrymmesutnyttjande / Utrymmesanvändning
+      title: Kontrollpanel
+      total_users: totalt antal användare
+      trends: Trender
+      week_interactions: kommunikation denna vecka / interaktioner denna vecka
+      week_users_active: aktiv(a) denna vecka
+      week_users_new: användare denna vecka
+      whitelist_mode: Vitlisteläge
+    domain_allows:
+      add_new: Vitlistedomän
+      created_msg: Domänen har vitlistats
+      destroyed_msg: Domänen har tagits bort från vitlistan
+      undo: Tag bort från vitlistan
     domain_blocks:
       add_new: Lägg till ny
       created_msg: Domänblocket behandlas nu
       destroyed_msg: Domänblockering har återtagits
       domain: Domän
+      edit: Ändra domänblock
+      existing_domain_block_html: Du har redan satt begränsningar för %{name} så <a href="%{unblock_url}">avblockera användaren</a> först.
       new:
         create: Skapa block
         hint: Domänblocket hindrar inte skapandet av kontoposter i databasen, men kommer retroaktivt, automatiskt att tillämpa specifika modereringsmetoder på dessa konton.
@@ -278,8 +300,13 @@ sv:
           silence: Tysta ner
           suspend: Suspendera
         title: Nytt domänblock
+      private_comment: Privat kommentar
+      private_comment_hint: Kommentar för moderatorer om denna domänbegränsning.
+      public_comment: Offentlig kommentar
       reject_media: Avvisa mediafiler
       reject_media_hint: Raderar lokalt lagrade mediefiler och förhindrar möjligheten att ladda ner något i framtiden. Irrelevant för suspensioner
+      severity:
+        suspend: avstängd
       show:
         affected_accounts:
           one: Ett konto i databasen drabbades
@@ -296,11 +323,17 @@ sv:
       delete: Radera
       destroyed_msg: E-postdomän har tagits bort från domänblockslistan utan problem
       domain: Domän
+      empty: För tillfället inga svartlistade mejl.
       new:
         create: Skapa domän
         title: Ny E-postdomänblocklistningsinmatning
       title: E-postdomänblock
     instances:
+      by_domain: Domän
+      moderation:
+        all: Alla
+        limited: Begränsad
+      private_comment: Privat kommentar
       title: Kända instanser
     invites:
       filter:
@@ -309,6 +342,13 @@ sv:
         expired: Utgångna
         title: Filtrera
       title: Inbjudningar
+    relays:
+      delete: Radera
+      disable: Inaktivera
+      enable: Aktivera
+      enabled: Aktivera
+      save_and_enable: Spara och aktivera
+      status: Status
     report_notes:
       created_msg: Anmälningsanteckning har skapats!
       destroyed_msg: Anmälningsanteckning har raderats!
@@ -334,6 +374,7 @@ sv:
       reported_by: Anmäld av
       resolved: Löst
       resolved_msg: Anmälan har lösts framgångsrikt!
+      status: Status
       title: Anmälningar
       unassign: Otilldela
       unresolved: Olösta
@@ -348,6 +389,8 @@ sv:
       contact_information:
         email: Företag E-post
         username: Användarnamn för kontakt
+      custom_css:
+        title: Anpassad CSS
       hero:
         desc_html: Visas på framsidan. Minst 600x100px rekommenderas. Om inte angiven faller den tillbaka på instansens miniatyrbild
         title: Hjältebild
@@ -393,15 +436,35 @@ sv:
         delete: Radera
         nsfw_off: Markera som ej känslig
         nsfw_on: Markera som känslig
+      deleted: Raderad
       failed_to_execute: Misslyckades att utföra
       no_media: Ingen media
       title: Kontostatus
       with_media: med media
+    tags:
+      accounts_today: Unika användare idag
+      accounts_week: Unika användare den här veckan
+      last_active: Senast aktiv
+    warning_presets:
+      add_new: Lägg till ny
+      delete: Radera
+      edit: Redigera
   admin_mailer:
     new_report:
       body: "%{reporter} har rapporterat %{target}"
       body_remote: Någon från %{domain} har rapporterat %{target}
       subject: Ny rapport för %{instance} (#%{id})
+  aliases:
+    add_new: Skapa alias
+    remove: Avlänka alias
+  appearance:
+    advanced_web_interface: Avancerat webbgränssnitt
+    animations_and_accessibility: Animationer och tillgänglighet
+    discovery: Upptäck
+    localization:
+      body: Mastodon översätts av volontärer.
+      guide_link_text: Alla kan bidra.
+    sensitive_content: Känsligt innehåll
   application_mailer:
     notification_preferences: Ändra e-postinställningar
     settings: 'Ändra e-postinställningar: %{link}'
@@ -420,7 +483,7 @@ sv:
     change_password: Lösenord
     delete_account: Ta bort konto
     delete_account_html: Om du vill radera ditt konto kan du <a href="%{path}">fortsätta här</a>. Du kommer att bli ombedd att bekräfta.
-    didnt_get_confirmation: Fick inte instruktioner om bekräftelse?
+    didnt_get_confirmation: Fick du inte instruktioner om bekräftelse?
     forgot_password: Glömt ditt lösenord?
     invalid_reset_password_token: Lösenordsåterställningstoken är ogiltig eller utgått. Vänligen be om en ny.
     login: Logga in
@@ -436,6 +499,10 @@ sv:
     reset_password: Återställ lösenord
     security: Säkerhet
     set_new_password: Skriv in nytt lösenord
+    setup:
+      email_settings_hint_html: Bekräftelsemeddelandet skickades till %{email}. Om den e-postadressen inte stämmer så kan du ändra den i kontoinställningarna.
+    status:
+      account_status: Kontostatus
   authorize_follow:
     already_following: Du följer redan detta konto
     error: Tyvärr inträffade ett fel när vi kontrollerade fjärrkontot
@@ -447,6 +514,10 @@ sv:
       return: Visa användarens profil
       web: Gå till webb
     title: Följ %{acct}
+  challenge:
+    confirm: Fortsätt
+    invalid_password: Ogiltigt lösenord
+    prompt: Bekräfta lösenord för att fortsätta
   datetime:
     distance_in_words:
       about_x_hours: "%{count}tim"
@@ -463,7 +534,9 @@ sv:
   deletes:
     confirm_password: Ange ditt lösenord för att verifiera din identitet
     proceed: Ta bort konto
-    success_msg: Ditt konto har tagits bort
+    success_msg: Ditt konto har raderats
+  domain_validator:
+    invalid_domain: är inte ett giltigt domännamn
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': Du har inte behörighet att visa den här sidan.
@@ -489,10 +562,28 @@ sv:
       size: Storlek
     blocks: Du blockerar
     csv: CSV
-    follows: Du följer
+    lists: Listor
     mutes: Du tystar
     storage: Medialagring
+  featured_tags:
+    add_new: Lägg till ny
+  filters:
+    contexts:
+      notifications: Aviseringar
+      thread: Konversationer
+    edit:
+      title: Redigera filter
+    index:
+      delete: Radera
+      empty: Du har inga filter.
+      title: Filter
+    new:
+      title: Lägg till nytt filter
+  footer:
+    developers: Utvecklare
+    more: Mer…
   generic:
+    all: Alla
     changes_saved_msg: Ändringar sparades framgångsrikt!
     save_changes: Spara ändringar
     validation_errors:
@@ -538,11 +629,12 @@ sv:
       too_many: Det går inte att bifoga mer än 4 filer
   migrations:
     acct: användarnamn@domän av det nya kontot
+    incoming_migrations: Flyttar från ett annat konto
   moderation:
     title: Moderera
   notification_mailer:
     digest:
-      action: Visa alla notifieringar
+      action: Visa alla aviseringar
       body: Här är en kort sammanfattning av de meddelanden du missade sedan ditt senaste besök på %{since}
       mention: "%{name} nämnde dig i:"
       new_followers_summary:
@@ -574,13 +666,23 @@ sv:
       body: 'Din status knuffades av %{name}:'
       subject: "%{name} knuffade din status"
       title: Ny knuff
+  notifications:
+    other_settings: Andra aviseringsinställningar
   pagination:
     newer: Nyare
     next: Nästa
     older: Äldre
     prev: Tidigare
+  polls:
+    errors:
+      invalid_choice: Det valda röstalternativet finns inte
   preferences:
     other: Annat
+  relationships:
+    activity: Kontoaktivitet
+    followers: Följare
+    following: Följer
+    status: Kontostatus
   remote_follow:
     acct: Ange ditt användarnamn@domän du vill följa från
     missing_resource: Det gick inte att hitta den begärda omdirigeringsadressen för ditt konto
@@ -619,16 +721,23 @@ sv:
     revoke_success: Sessionen återkallas framgångsrikt
     title: Sessioner
   settings:
+    account: Konto
+    account_settings: Kontoinställningar
+    aliases: Kontoalias
+    appearance: Utseende
     authorized_apps: Godkända appar
     back: Tillbaka till Mastodon
     delete: Konto radering
     development: Utveckling
     edit_profile: Redigera profil
     export: Exportera data
+    import_and_export: Import och export
     migrate: Kontoflytt
-    notifications: Meddelanden
+    notifications: Aviseringar
     preferences: Inställningar
-    two_factor_authentication: Tvåstegsautentisering
+    profile: Profil
+    relationships: Följer och följare
+    two_factor_authentication: Tvåfaktorsautentisering
   spam_check:
     spam_detected: Det här är en automatisk rapport. Spam har upptäckts.
   statuses:
@@ -751,17 +860,17 @@ sv:
     mastodon-light: Mastodon (ljust)
   two_factor_authentication:
     code_hint: Ange koden som genererats av din autentiseringsapp för att bekräfta
-    description_html: Om du aktiverar <strong>tvåstegsautentisering</strong> kommer inloggningen kräva att du har din telefon tillgänglig, vilket kommer att generera tokens för dig att uppge.
-    disable: Avaktivera
+    description_html: Om du aktiverar <strong>tvåfaktorsautentisering</strong> kommer inloggningen kräva att du har din telefon tillgänglig, vilket kommer att generera tokens för dig att ange.
+    disable: Inaktivera
     enable: Aktivera
     enabled: Tvåfaktorsautentisering är aktiverad
-    enabled_success: Tvåfaktors autentisering aktiverad
+    enabled_success: Tvåfaktorsautentisering aktiverad
     generate_recovery_codes: Generera återställningskoder
     instructions_html: "<strong>Skanna den här QR-koden i Google Authenticator eller en liknande TOTP-app på din telefon </strong>. Från och med nu genererar den appen tokens som du måste ange när du loggar in."
     lost_recovery_codes: Återställningskoder tillåter dig att få tillgång till ditt konto om du förlorar din telefon. Om du har förlorat dina återställningskoder kan du regenerera dem här. Dina gamla återställningskoder kommer att ogiltigförklaras.
-    manual_instructions: 'Om du inte kan skanna QR-koden och behöver skriva in den manuellt, här är den enkla texten:'
+    manual_instructions: 'Om du inte kan skanna QR-koden och behöver skriva in den manuellt, här är den hemliga nyckeln i ren text:'
     recovery_codes: Backup återställningskod
-    recovery_codes_regenerated: Återställningskoder regenererades framgångsrikt
+    recovery_codes_regenerated: Återställningskoder genererades på nytt
     recovery_instructions_html: Om du någonsin tappar åtkomst till din telefon kan du använda någon av återställningskoderna nedan för att återställa åtkomst till ditt konto. <strong> Håll återställningskoderna säkra </strong>. Du kan till exempel skriva ut dem och lagra dem med andra viktiga dokument.
     setup: Ställ in
     wrong_code: Den angivna koden var ogiltig! Är servertid och enhetstid korrekt?
@@ -784,11 +893,11 @@ sv:
       tip_federated_timeline: Den förenade tidslinjen är en störtflodsvy av Mastodon-nätverket. Men det inkluderar bara människor som dina grannar följer, så det är inte komplett.
       tip_following: Du följer din servers administratör(er) som standard. För att hitta fler intressanta personer, kolla de lokala och förenade tidslinjerna.
       tip_local_timeline: Den lokala tidslinjen är en störtflodsvy av personer på %{instance}. Det här är dina närmaste grannar!
-      tip_mobile_webapp: Om din mobila webbläsare erbjuder dig att lägga till Mastodon till ditt hemskärm kan du få push-meddelanden. Det fungerar som en inbyggd app på många sätt!
+      tip_mobile_webapp: Om din mobila webbläsare erbjuder dig att lägga till Mastodon på din hemskärm kan du få push-aviseringar. Det fungerar som en inbyggd app på många sätt!
       title: Välkommen ombord, %{name}!
   users:
     invalid_email: E-postadressen är ogiltig
-    invalid_otp_token: Ogiltig tvåfaktorkod
+    invalid_otp_token: Ogiltig tvåfaktorskod
     otp_lost_help_html: Om du förlorat åtkomst till båda kan du komma i kontakt med %{email}
     seamless_external_login: Du är inloggad via en extern tjänst, så lösenord och e-postinställningar är inte tillgängliga.
     signed_in_as: 'Inloggad som:'
diff --git a/config/locales/ta.yml b/config/locales/ta.yml
index 48252a5bb..71bf225d8 100644
--- a/config/locales/ta.yml
+++ b/config/locales/ta.yml
@@ -1,12 +1,24 @@
 ---
 ta:
   about:
+    about_mastodon_html: 'எதிர்காலத்தின் சமூகப் பிணையம்: விளம்பரம் இல்லை, பொதுநிறுவனக் கண்காணிப்பு இல்லை, நெறிக்குட்பட்ட வரைவுத்திட்டம், மற்றும் பகிர்ந்தாளுதல்! மஸ்டோடோனுடன் உங்கள் தரவுகள் உங்களுக்கே சொந்தம்!'
     about_this: தகவல்
+    active_count_after: செயலில்
+    active_footnote: செயலிலுள்ள மாதாந்திர பயனர்கள் (செமாப)
     administered_by: 'நிர்வாகம்:'
     api: செயலிக்கான மென்பொருள் இடைமுகம் API
     apps: கைப்பேசி செயலிகள்
+    apps_platforms: மஸ்டோடோனை ஐஓஎஸ், ஆன்டிராய்டு, மற்றும் பிற இயங்குதளங்களில் பயன்படுத்துக
+    browse_directory: தன்விவரக் கோப்புகளைப் பார்த்து உங்கள் விருப்பங்களுக்கேற்பத் தேர்வு செய்க
+    browse_local_posts: நேரலையில் பொதுப் பதிவுகளை இந்த வழங்கியிலிருந்து காண்க
+    browse_public_posts: நேரலையில் பொதுப் பதிவுகளை மஸ்டோடோனிலிருந்து காண்க
     contact: தொடர்புக்கு
+    contact_missing: நிறுவப்படவில்லை
+    contact_unavailable: பொ/இ
+    discover_users: பயனர்களை அறிக
+    documentation: ஆவணச்சான்று
     get_apps: கைப்பேசி செயலியை முயற்சி செய்யவும்
+    hosted_on: மாஸ்டோடாண் %{domain} இனையத்தில் இயங்குகிறது
     learn_more: மேலும் அறிய
     privacy_policy: தனியுரிமை கொள்கை
     see_whats_happening: என்ன நடக்கிறது என்று பார்க்க
@@ -29,6 +41,7 @@ ta:
     what_is_mastodon: மச்டொடன் என்றால் என்ன?
   accounts:
     choices_html: "%{name}-இன் தேர்வுகள்:"
+    featured_tags_hint: குறிப்பிட்ட சிட்டைகளை இங்கு நீங்கள் காட்சிப்படுத்தலாம்.
     follow: பின்தொடர்
     followers:
       one: பின்தொடர்பவர்
@@ -37,8 +50,161 @@ ta:
     joined: "%{date} அன்று இனைந்தார்"
     last_active: கடைசியாக பார்த்தது
     media: படங்கள்
+    moved_html: "%{name} %{new_profile_link}க்கு மாறியுள்ளது:"
+    network_hidden: இத்தகவல் கிடைக்கவில்லை
     never_active: எப்போதுமில்லை
     nothing_here: இங்கு எதுவும் இல்லை!
+    people_followed_by: "%{name} பின்தொடரும் நபர்கள்"
+    people_who_follow: "%{name}ஐ பின்தொடரும் நபர்கள்"
+    pin_errors:
+      following: தாங்கள் அங்கீகரிக்க விரும்பும் நபரை தாங்கள் ஏற்கனவே பின்தொடரந்து கொண்டு இருக்க வேண்டும்
+    posts_tab_heading: பிளிறல்கள்
+    posts_with_replies: பிளிறல்கள் மற்றும் மறுமொழிகள்
+    reserved_username: பயனர்பெயர் முன்பதிவு செய்யப்பட்டுள்ளது
+    roles:
+      admin: நிர்வாகி
+      bot: பொறி
+      group: குழு
+      moderator: மட்டுறுத்துநர்
+    unavailable: சுயவிவரம் கிடைக்கவில்லை
+    unfollow: பின்தொடராதே
+  admin:
+    account_actions:
+      action: நடவடிக்கை எடு
+      title: "%{acct}ஐ நடுநிலைப்படுத்தவும்"
+    account_moderation_notes:
+      create: குறிப்பு எழுதவும்
+      created_msg: நடுநிலை குறிப்பு வெற்றிகரமாக பதிவு செய்யப்பட்டது!
+      delete: அகற்று
+      destroyed_msg: நடுநிலை குறிப்பு வெற்றிகரமாக அகற்றப்பட்டது!
+    accounts:
+      approve: அங்கீகரி
+      approve_all: அனைத்தும் அங்கீகரி
+      are_you_sure: நிச்சயமா?
+      avatar: அவதாரம்
+      by_domain: தளம்
+      change_email:
+        changed_msg: உறிமை மின் அஞ்சல் வெற்றிகரமாக மாற்ற்ப்பட்டது!
+        current_email: தற்கால மின் அஞ்சல்
+        label: மின் அஞ்சலை மற்றுக
+        new_email: புதிய மின் அஞ்சல்
+        submit: மின் அஞ்சல் மாற்றுக
+        title: "%{username} உடைய மின் அஞ்சலை மாற்றுக"
+      confirm: உறுதிசெய்
+      confirmed: உறுதி செய்யப்பட்டது
+      confirming: உறுதி செய்யப்படுகிறது
+      deleted: நீக்கு
+      demote: பதவியிறக்கு
+      disable: முடக்கப்பட்டது
+      disable_two_factor_authentication: இரண்டு கட்ட உளைவுச்சொல்லை நீக்குக
+      disabled: முடக்கப்பட்டது
+      display_name: புனைப்பெயர்
+      domain: இனையதளப் பெயர்
+      edit: திருத்து
+      email: மின்னஞ்சல்
+      email_status: மின்னஞ்சல் நிலவரம்
+      enable: இயக்கு
+      enabled: செயலில்பாட்டில் உள்ளது
+      followers: வாசகர்கள்
+      follows: வாசிக்கிறார்
+      header: தலைப்பு
+      inbox_url: மின்னஞ்சல் பெட்டி முகவரி
+      invited_by: அழைத்தவர்
+      ip: இணைய முகவரி ஏன்
+      joined: சேர்ந்தார்
+      location:
+        all: அனைத்தும்
+        local: அருகாமை
+        remote: தொலைவு
+        title: இடம்
+      login_status: நுழைவு நிலை
+      media_attachments: சேர்க்கைகள்
+      moderation:
+        active: அனுமதிக்கப்பட்டுள்ளது
+        all: அனைத்தும்
+        pending: நிலுவையில் உள்ளது
+        silenced: தடுக்கப்பட்டுள்ளது
+        suspended: இடைநீக்கப்பட்டது
+        title: மிதமானர்
+      moderation_notes: நடுவர் கருத்து
+      most_recent_activity: மிக அண்மை நடவடிக்கை
+      most_recent_ip: மிக அண்மை ஐபி
+      no_limits_imposed: அளவுக்கட்டுப்பாடு திணிக்கப்படவில்லை
+      pending: திறனாய்வு நிலுவையில் உள்ளது
+      perform_full_suspension: தற்காலீகமாக நீக்குக
+      promote: பரிந்துறை
+      protocol: நெறிமுறை
+      public: பொது
+      reject: விலக்கு
+      reject_all: அனைத்தையும் மறு
+      remove_avatar: அவதாரத்தை நீக்குக
+      resend_confirmation:
+        already_confirmed: இப்பயனர் ஏற்கனவே  உறுதி  படுத்திவிட்டார்
+      reset: மீட்டமைக்கவும்
+      reset_password: கடவுச்சொல்லை மீளமைத்திடுக
+      role: அனுமதி
+      roles:
+        admin: நிர்வாகி
+        moderator: நடுவர்
+        staff: பணியாளர்
+        user: பயனர்
+      search: தேடு
+      shared_inbox_url: குழு மின்னஞ்சல் முகவரி
+      show:
+        created_reports: உறுவாக்கிய அறிக்கைகள்
+        targeted_reports: மற்றவர்களால் அறிவிக்கப்பட்டது
+      silence: அணை
+      silenced: அணைக்கப்பட்டது
+      statuses: பதிவுகள்
+      suspended: இடைநீக்கப்பட்டது
+      time_in_queue: வரிசையில் காத்திருக்கிறது %{time}
+      title: கணக்குகள்
+      username: பயனர் பெயர்
+      warn: எச்சரி
+      whitelisted: அனுமதிப்பட்டியல்
+    custom_emojis:
+      uncategorized: வகைப்படுத்தப்படாதவை
+      unlist: பட்டியலில் இருந்து அகற்றுக
+      unlisted: பட்டியலிடப்படாத
+      upload: பதிவேற்றம்
+    dashboard:
+      feature_registrations: பதிவுகள்
+      features: அம்சங்கள்
+      recent_users: அண்மை பயனாளர்கள்
+      total_users: மொத்த பயனாளர் தொகை
+      trends: போக்குகள்
+    domain_blocks:
+      new:
+        severity:
+          noop: எதுவுமில்லை
+          suspend: தற்காலீகமாக நீக்குக
+    email_domain_blocks:
+      empty: மின்னஞ்சற் களங்கள் எதுவும் தடுக்கப்படவில்லை.
+    invites:
+      filter:
+        all: அனைத்தும்
+        expired: காலாவதியானது
+        title: வடிகட்டி
+      title: அழைப்பிதழ்கள்
+    relays:
+      delete: அகற்று
+      disable: முடக்கு
+      disabled: முடக்கப்பட்டது
+      enabled: செயலில்பாட்டில் உள்ளது
+    reports:
+      account:
+        notes:
+          one: "%{count} குறிப்பு"
+          other: "%{count} குறிப்புகள்"
+        reports:
+          one: "%{count} புகார்"
+          other: "%{count} புகார்கள்"
+      comment:
+        none: எதுவுமில்லை
+  appearance:
+    localization:
+      body: மாஸ்டோடான் தன்னார்வலர்களால் மொழிபெயர்க்கப்படுகிறது.
+      guide_link_text: அனைவரும் பங்களிக்கலாம்.
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': You don't have permission to view this page.
@@ -49,6 +215,9 @@ ta:
     '429': Throttled
     '500': 
     '503': The page could not be served due to a temporary server failure.
+  filters:
+    index:
+      empty: தடுப்புகள் ஏதும் இல்லை.
   invites:
     expires_in:
       '1800': 30 minutes
@@ -57,3 +226,10 @@ ta:
       '43200': 12 hours
       '604800': 1 week
       '86400': 1 day
+  notifications:
+    email_events: மின்னஞ்சல் அறிவிப்புகளுக்கான நிகழ்வுகள்
+    email_events_hint: 'எந்த நிகழ்வுகளுக்கு அறிவிப்புகளைப் பெற வேண்டும் என்று தேர்வு செய்க:'
+    other_settings: அறிவிப்புகள் குறித்த பிற அமைப்புகள்
+  polls:
+    errors:
+      invalid_choice: நீங்கள் தேர்வு செய்த விருப்பம் கிடைக்கவில்லை
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 214a93acf..39664aec9 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -4,13 +4,14 @@ th:
     about_hashtag_html: มีการแท็กโพสต์สาธารณะเหล่านี้ด้วย <strong>#%{hashtag}</strong> คุณสามารถโต้ตอบกับโพสต์หากคุณมีบัญชีที่ใดก็ตามในเฟดิเวิร์ส
     about_mastodon_html: 'เครือข่ายสังคมแห่งอนาคต: ไม่มีโฆษณา, ไม่มีการสอดแนมโดยองค์กร, การออกแบบตามหลักจริยธรรม และการกระจายศูนย์! เป็นเจ้าของข้อมูลของคุณด้วย Mastodon!'
     about_this: เกี่ยวกับ
-    active_count_after: ที่ใช้งาน
+    active_count_after: ใช้งานอยู่
     active_footnote: ผู้ใช้งานรายเดือน (MAU)
     administered_by: 'ดูแลโดย:'
     api: API
     apps: แอปมือถือ
     apps_platforms: ใช้ Mastodon จาก iOS, Android และแพลตฟอร์มอื่น ๆ
     browse_directory: เรียกดูไดเรกทอรีโปรไฟล์และกรองตามความสนใจ
+    browse_local_posts: เรียกดูสตรีมสดของโพสต์สาธารณะจากเซิร์ฟเวอร์นี้
     browse_public_posts: เรียกดูสตรีมสดของโพสต์สาธารณะใน Mastodon
     contact: ติดต่อ
     contact_missing: ไม่ได้ตั้ง
@@ -30,9 +31,11 @@ th:
     status_count_before: ผู้สร้าง
     tagline: ติดตามเพื่อน ๆ และค้นพบเพื่อนใหม่ ๆ
     terms: เงื่อนไขการให้บริการ
+    unavailable_content: เนื้อหาไม่พร้อมใช้งาน
     unavailable_content_description:
       domain: เซิร์ฟเวอร์
       reason: 'เหตุผล:'
+      rejecting_media: 'ไฟล์สื่อจากเซิร์ฟเวอร์เหล่านี้จะไม่ได้รับการประมวลผลหรือจัดเก็บ และจะไม่แสดงภาพขนาดย่อ ต้องมีการคลิกไปยังไฟล์ต้นฉบับด้วยตนเอง:'
     user_count_after:
       other: ผู้ใช้
     user_count_before: บ้านของ
@@ -45,6 +48,7 @@ th:
     following: กำลังติดตาม
     joined: เข้าร่วมเมื่อ %{date}
     last_active: ใช้งานล่าสุด
+    link_verified_on: ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ %{date}
     media: สื่อ
     moved_html: "%{name} ได้ย้ายไปยัง %{new_profile_link}:"
     network_hidden: ไม่มีข้อมูลนี้
@@ -56,16 +60,19 @@ th:
       other: โพสต์
     posts_tab_heading: โพสต์
     posts_with_replies: โพสต์และการตอบกลับ
-    reserved_username: ชื่อผู้ใช้นี้ถูกสงวนไว้
+    reserved_username: ชื่อผู้ใช้ถูกสงวนไว้
     roles:
       admin: ผู้ดูแล
       bot: บอต
+      group: กลุ่ม
       moderator: ผู้ควบคุม
     unavailable: ไม่มีโปรไฟล์
     unfollow: เลิกติดตาม
   admin:
+    account_actions:
+      action: ทำการกระทำ
     account_moderation_notes:
-      create: เขียนข้อความอธิบาย
+      create: เขียนหมายเหตุ
       created_msg: สร้างหมายเหตุการควบคุมสำเร็จ!
       delete: ลบ
       destroyed_msg: ทำลายหมายเหตุการควบคุมสำเร็จ!
@@ -86,7 +93,7 @@ th:
       confirmed: ยืนยันแล้ว
       confirming: กำลังยืนยัน
       deleted: ลบแล้ว
-      demote: ลดระดับ
+      demote: ลดขั้น
       disable: ปิดใช้งาน
       disable_two_factor_authentication: ปิดใช้งาน 2FA
       disabled: ปิดใช้งานอยู่
@@ -111,10 +118,11 @@ th:
         title: ตำแหน่งที่ตั้ง
       login_status: สถานะการเข้าสู่ระบบ
       media_attachments: ไฟล์แนบสื่อ
+      memorialize: เปลี่ยนเป็นระลึกถึง
       moderation:
         active: ใช้งานอยู่
         all: ทั้งหมด
-        pending: รอการยืนยัน
+        pending: รอดำเนินการ
         silenced: เงียบอยู่
         suspended: ระงับอยู่
         title: การควบคุม
@@ -122,8 +130,9 @@ th:
       most_recent_activity: กิจกรรมล่าสุด
       most_recent_ip: IP ล่าสุด
       not_subscribed: ไม่ได้บอกรับ
+      pending: การตรวจทานที่รอดำเนินการ
       perform_full_suspension: ระงับ
-      promote: เลื่อนตำแหน่ง
+      promote: เลื่อนขั้น
       protocol: โปรโตคอล
       public: สาธารณะ
       push_subscription_expires: การบอกรับ PuSH หมดอายุเมื่อ
@@ -145,6 +154,8 @@ th:
         staff: พนักงาน
         user: ผู้ใช้
       search: ค้นหา
+      search_same_ip: ผู้ใช้อื่น ๆ ที่มี IP เดียวกัน
+      shared_inbox_url: URL กล่องขาเข้าที่แบ่งปัน
       show:
         created_reports: รายงานที่สร้าง
         targeted_reports: รายงานโดยผู้อื่น
@@ -153,35 +164,61 @@ th:
       statuses: สถานะ
       subscribe: บอกรับ
       suspended: ระงับอยู่
+      time_in_queue: กำลังรออยู่ในคิว %{time}
       title: บัญชี
-      unconfirmed_email: ยังไม่ได้ยืนยันอีเมล
+      unconfirmed_email: อีเมลที่ยังไม่ได้ยืนยัน
       undo_silenced: เลิกทำการเงียบ
       undo_suspension: เลิกทำการระงับ
       unsubscribe: เลิกบอกรับ
       username: ชื่อผู้ใช้
       warn: เตือน
       web: เว็บ
+      whitelisted: ขึ้นบัญชีขาวแล้ว
     action_logs:
       actions:
         change_email_user: "%{name} ได้เปลี่ยนที่อยู่อีเมลของผู้ใช้ %{target}"
         confirm_user: "%{name} ได้ยืนยันที่อยู่อีเมลของผู้ใช้ %{target}"
         create_account_warning: "%{name} ได้ส่งคำเตือนไปยัง %{target}"
+        create_announcement: "%{name} ได้สร้างประกาศใหม่ %{target}"
+        create_custom_emoji: "%{name} ได้อัปโหลดอีโมจิใหม่ %{target}"
+        create_domain_allow: "%{name} ได้ขึ้นบัญชีขาวโดเมน %{target}"
         create_domain_block: "%{name} ได้ปิดกั้นโดเมน %{target}"
+        create_email_domain_block: "%{name} ได้ขึ้นบัญชีดำโดเมนอีเมล %{target}"
+        demote_user: "%{name} ได้ลดขั้นผู้ใช้ %{target}"
+        destroy_announcement: "%{name} ได้ลบประกาศ %{target}"
         destroy_custom_emoji: "%{name} ได้ทำลายอีโมจิ %{target}"
+        destroy_domain_allow: "%{name} ได้เอาโดเมน %{target} ออกจากบัญชีขาว"
         destroy_domain_block: "%{name} ได้เลิกปิดกั้นโดเมน %{target}"
+        destroy_email_domain_block: "%{name} ได้ขึ้นบัญชีขาวโดเมนอีเมล %{target}"
         destroy_status: "%{name} ได้เอาสถานะโดย %{target} ออก"
+        disable_2fa_user: "%{name} ได้ปิดใช้งานความต้องการสองปัจจัยสำหรับผู้ใช้ %{target}"
         disable_custom_emoji: "%{name} ได้ปิดใช้งานอีโมจิ %{target}"
         disable_user: "%{name} ได้ปิดใช้งานการเข้าสู่ระบบสำหรับผู้ใช้ %{target}"
         enable_custom_emoji: "%{name} ได้เปิดใช้งานอีโมจิ %{target}"
         enable_user: "%{name} ได้เปิดใช้งานการเข้าสู่ระบบสำหรับผู้ใช้ %{target}"
+        promote_user: "%{name} ได้เลื่อนขั้นผู้ใช้ %{target}"
         remove_avatar_user: "%{name} ได้เอาภาพประจำตัวของ %{target} ออก"
         reopen_report: "%{name} ได้เปิดรายงาน %{target} ใหม่"
+        resolve_report: "%{name} ได้แก้ปัญหารายงาน %{target}"
         suspend_account: "%{name} ได้ระงับบัญชีของ %{target}"
+        unassigned_report: "%{name} ได้เลิกมอบหมายรายงาน %{target}"
         unsuspend_account: "%{name} ได้เลิกระงับบัญชีของ %{target}"
+        update_announcement: "%{name} ได้อัปเดตประกาศ %{target}"
         update_custom_emoji: "%{name} ได้อัปเดตอีโมจิ %{target}"
         update_status: "%{name} ได้อัปเดตสถานะโดย %{target}"
       deleted_status: "(สถานะที่ลบแล้ว)"
       title: รายการบันทึกการตรวจสอบ
+    announcements:
+      edit:
+        title: แก้ไขประกาศ
+      empty: ไม่พบประกาศ
+      live: สด
+      new:
+        create: สร้างประกาศ
+        title: ประกาศใหม่
+      published: เผยแพร่เมื่อ
+      time_range: ช่วงเวลา
+      title: ประกาศ
     custom_emojis:
       assign_category: กำหนดหมวดหมู่
       by_domain: โดเมน
@@ -212,6 +249,7 @@ th:
       upload: อัปโหลด
     dashboard:
       authorized_fetch_mode: โหมดปลอดภัย
+      backlog: งานคงค้าง
       config: การกำหนดค่า
       feature_deletions: การลบบัญชี
       feature_invites: ลิงก์เชิญ
@@ -221,6 +259,8 @@ th:
       feature_timeline_preview: ตัวอย่างเส้นเวลา
       features: คุณลักษณะ
       open_reports: รายงานที่เปิด
+      pending_tags: แฮชแท็กที่กำลังรอการตรวจทาน
+      pending_users: ผู้ใช้ที่กำลังรอการตรวจทาน
       recent_users: ผู้ใช้ล่าสุด
       search: การค้นหาข้อความแบบเต็ม
       single_user_mode: โหมดผู้ใช้เดี่ยว
@@ -230,8 +270,14 @@ th:
       total_users: ผู้ใช้ทั้งหมด
       trends: แนวโน้ม
       week_interactions: การโต้ตอบในสัปดาห์นี้
-      week_users_active: ที่ใช้งานในสัปดาห์นี้
+      week_users_active: ใช้งานอยู่ในสัปดาห์นี้
       week_users_new: ผู้ใช้ในสัปดาห์นี้
+      whitelist_mode: โหมดบัญชีขาว
+    domain_allows:
+      add_new: ขึ้นบัญชีขาวโดเมน
+      created_msg: ขึ้นบัญชีขาวโดเมนสำเร็จ
+      destroyed_msg: เอาโดเมนออกจากบัญชีขาวแล้ว
+      undo: เอาออกจากบัญชีขาว
     domain_blocks:
       add_new: เพิ่มการปิดกั้นโดเมนใหม่
       created_msg: กำลังประมวลผลการปิดกั้นโดเมน
@@ -267,13 +313,15 @@ th:
       view: ดูการปิดกั้นโดเมน
     email_domain_blocks:
       add_new: เพิ่มใหม่
+      created_msg: เพิ่มโดเมนอีเมลเป็นบัญชีดำสำเร็จ
       delete: ลบ
+      destroyed_msg: ลบโดเมนอีเมลออกจากบัญชีดำสำเร็จ
       domain: โดเมน
+      empty: ไม่มีโดเมนอีเมลที่ขึ้นบัญชีดำอยู่
       new:
         create: เพิ่มโดเมน
-    followers:
-      back_to_account: กลับไปที่บัญชี
-      title: ผู้ติดตามของ %{acct}
+        title: รายการบัญชีดำอีเมลใหม่
+      title: บัญชีดำอีเมล
     instances:
       by_domain: โดเมน
       known_accounts:
@@ -288,9 +336,16 @@ th:
       total_storage: ไฟล์แนบสื่อ
     invites:
       deactivate_all: ปิดใช้งานทั้งหมด
+      filter:
+        all: ทั้งหมด
+        available: พร้อมใช้งาน
+        expired: หมดอายุแล้ว
+        title: ตัวกรอง
       title: คำเชิญ
     pending_accounts:
       title: บัญชีที่รอดำเนินการ (%{count})
+    relationships:
+      title: ความสัมพันธ์ของ %{acct}
     relays:
       add_new: เพิ่มรีเลย์ใหม่
       delete: ลบ
@@ -299,6 +354,7 @@ th:
       enable: เปิดใช้งาน
       enabled: เปิดใช้งานอยู่
       inbox_url: URL รีเลย์
+      pending: กำลังรอการอนุมัติของรีเลย์
       save_and_enable: บันทึกแล้วเปิดใช้งาน
       status: สถานะ
       title: รีเลย์
@@ -306,9 +362,15 @@ th:
       created_msg: สร้างหมายเหตุรายงานสำเร็จ!
       destroyed_msg: ลบหมายเหตุรายงานสำเร็จ!
     reports:
+      account:
+        notes:
+          other: "%{count} หมายเหตุ"
+        reports:
+          other: "%{count} รายงาน"
       are_you_sure: คุณแน่ใจหรือไม่?
       assign_to_self: มอบหมายให้ฉัน
       assigned: ผู้ควบคุมที่ได้รับมอบหมาย
+      by_target_domain: โดเมนของบัญชีที่ได้รับการรายงาน
       comment:
         none: ไม่มี
       created_at: รายงานเมื่อ
@@ -339,7 +401,20 @@ th:
       custom_css:
         title: CSS ที่กำหนดเอง
       domain_blocks:
+        all: ให้กับทุกคน
+        disabled: ให้กับไม่มีใคร
         title: แสดงการปิดกั้นโดเมน
+        users: ให้กับผู้ใช้ในเว็บที่เข้าสู่ระบบ
+      domain_blocks_rationale:
+        title: แสดงคำชี้แจงเหตุผล
+      enable_bootstrap_timeline_accounts:
+        title: เปิดใช้งานการติดตามเริ่มต้นสำหรับผู้ใช้ใหม่
+      hero:
+        title: ภาพแบนเนอร์หลัก
+      mascot:
+        title: ภาพมาสคอต
+      peers_api_enabled:
+        title: เผยแพร่รายการเซิร์ฟเวอร์ที่ค้นพบ
       profile_directory:
         desc_html: อนุญาตให้ผู้ใช้สามารถค้นพบได้
         title: เปิดใช้งานไดเรกทอรีโปรไฟล์
@@ -355,6 +430,7 @@ th:
           title: อนุญาตคำเชิญโดย
       registrations_mode:
         modes:
+          approved: ต้องมีการอนุมัติสำหรับการลงทะเบียน
           none: ไม่มีใครสามารถลงทะเบียน
           open: ใครก็ตามสามารถลงทะเบียน
         title: โหมดการลงทะเบียน
@@ -370,11 +446,12 @@ th:
       site_short_description:
         title: คำอธิบายเซิร์ฟเวอร์แบบสั้น
       site_terms:
+        desc_html: คุณสามารถเขียนนโยบายความเป็นส่วนตัว, เงื่อนไขการให้บริการ หรือภาษากฎหมายอื่น ๆ ของคุณเอง คุณสามารถใช้แท็ก HTML
         title: เงื่อนไขการให้บริการที่กำหนดเอง
       site_title: ชื่อเซิร์ฟเวอร์
       timeline_preview:
-        desc_html: แสดงเส้นเวลาสาธารณะในหน้าเริ่มต้น
-        title: ตัวอย่างเส้นเวลา
+        desc_html: แสดงลิงก์ไปยังเส้นเวลาสาธารณะในหน้าเริ่มต้นและอนุญาตการเข้าถึง API ไปยังเส้นเวลาสาธารณะโดยไม่มีการรับรองความถูกต้อง
+        title: อนุญาตการเข้าถึงเส้นเวลาสาธารณะที่ไม่ได้รับรองความถูกต้อง
       title: การตั้งค่าไซต์
       trends:
         title: แฮชแท็กที่กำลังนิยม
@@ -397,8 +474,12 @@ th:
       most_popular: ยอดนิยม
       most_recent: ล่าสุด
       name: แฮชแท็ก
+      review: สถานะการตรวจทาน
+      reviewed: ตรวจทานแล้ว
       title: แฮชแท็ก
       trending_right_now: กำลังนิยม
+      unique_uses_today: "%{count} การโพสต์วันนี้"
+      unreviewed: ยังไม่ได้ตรวจทาน
     title: การดูแล
     warning_presets:
       add_new: เพิ่มใหม่
@@ -406,6 +487,11 @@ th:
       edit: แก้ไข
       edit_preset: แก้ไขคำเตือนที่ตั้งไว้ล่วงหน้า
       title: จัดการคำเตือนที่ตั้งไว้ล่วงหน้า
+  admin_mailer:
+    new_report:
+      body: "%{reporter} ได้รายงาน %{target}"
+      body_remote: ใครสักคนจาก %{domain} ได้รายงาน %{target}
+      subject: รายงานใหม่สำหรับ %{instance} (#%{id})
   aliases:
     add_new: สร้างนามแฝง
     remove: เลิกเชื่อมโยงนามแฝง
@@ -414,6 +500,10 @@ th:
     animations_and_accessibility: ภาพเคลื่อนไหวและการช่วยการเข้าถึง
     confirmation_dialogs: กล่องโต้ตอบการยืนยัน
     discovery: ค้นพบ
+    localization:
+      body: Mastodon ได้รับการแปลโดยอาสาสมัคร
+      guide_link: https://crowdin.com/project/mastodon/th
+      guide_link_text: ทุกคนสามารถมีส่วนร่วม
     sensitive_content: เนื้อหาที่ละเอียดอ่อน
     toot_layout: เค้าโครงโพสต์
   application_mailer:
@@ -433,6 +523,8 @@ th:
     checkbox_agreement_html: ฉันยอมรับ <a href="%{rules_path}" target="_blank">กฎของเซิร์ฟเวอร์</a> และ <a href="%{terms_path}" target="_blank">เงื่อนไขการให้บริการ</a>
     checkbox_agreement_without_rules_html: ฉันยอมรับ <a href="%{terms_path}" target="_blank">เงื่อนไขการให้บริการ</a>
     delete_account: ลบบัญชี
+    description:
+      prefix_sign_up: ลงทะเบียนใน Mastodon วันนี้!
     didnt_get_confirmation: ไม่ได้รับคำแนะนำการยืนยัน?
     forgot_password: ลืมรหัสผ่านของคุณ?
     login: เข้าสู่ระบบ
@@ -449,6 +541,8 @@ th:
     set_new_password: ตั้งรหัสผ่านใหม่
     status:
       account_status: สถานะบัญชี
+      confirming: กำลังรอการยืนยันอีเมลให้เสร็จสมบูรณ์
+      functional: บัญชีของคุณทำงานได้อย่างเต็มที่
     trouble_logging_in: มีปัญหาในการเข้าสู่ระบบ?
   authorize_follow:
     already_following: คุณกำลังติดตามบัญชีนี้อยู่แล้ว
@@ -463,6 +557,9 @@ th:
     confirm: ดำเนินการต่อ
     invalid_password: รหัสผ่านไม่ถูกต้อง
     prompt: ยืนยันรหัสผ่านเพื่อดำเนินการต่อ
+  date:
+    formats:
+      default: "%d %b %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count} ชั่วโมง"
@@ -478,12 +575,21 @@ th:
       x_months: "%{count} เดือน"
       x_seconds: "%{count} วินาที"
   deletes:
+    challenge_not_passed: ข้อมูลที่คุณป้อนไม่ถูกต้อง
+    confirm_username: ป้อนชื่อผู้ใช้ของคุณเพื่อยืนยันกระบวนงาน
     proceed: ลบบัญชี
     success_msg: ลบบัญชีของคุณสำเร็จ
+    warning:
+      data_removal: จะเอาโพสต์และข้อมูลอื่น ๆ ของคุณออกโดยถาวร
+      email_change_html: คุณสามารถ <a href="%{path}">เปลี่ยนที่อยู่อีเมลของคุณ</a> โดยไม่ต้องลบบัญชีของคุณ
+      email_reconfirmation_html: หากคุณไม่ได้รับอีเมลยืนยัน คุณสามารถ <a href="%{path}">ขออีเมลอีกครั้ง</a>
+      more_details_html: สำหรับรายละเอียดเพิ่มเติม ดู <a href="%{terms_path}">นโยบายความเป็นส่วนตัว</a>
   directories:
     directory: ไดเรกทอรีโปรไฟล์
     explanation: ค้นพบผู้ใช้ตามความสนใจของเขา
     explore_mastodon: สำรวจ %{title}
+  domain_validator:
+    invalid_domain: ไม่ใช่ชื่อโดเมนที่ถูกต้อง
   errors:
     '400': The request you submitted was invalid or malformed.
     '403': คุณไม่มีสิทธิอนุญาตเพื่อดูหน้านี้
@@ -508,7 +614,6 @@ th:
     blocks: คุณปิดกั้น
     csv: CSV
     domain_blocks: การปิดกั้นโดเมน
-    follows: คุณติดตาม
     lists: รายการ
     mutes: คุณปิดเสียง
     storage: ที่เก็บข้อมูลสื่อ
@@ -516,6 +621,7 @@ th:
     add_new: เพิ่มใหม่
   filters:
     contexts:
+      account: โปรไฟล์
       home: เส้นเวลาหน้าแรก
       notifications: การแจ้งเตือน
       public: เส้นเวลาสาธารณะ
@@ -524,6 +630,7 @@ th:
       title: แก้ไขตัวกรอง
     index:
       delete: ลบ
+      empty: คุณไม่มีตัวกรอง
       title: ตัวกรอง
     new:
       title: เพิ่มตัวกรองใหม่
@@ -536,21 +643,28 @@ th:
     all: ทั้งหมด
     changes_saved_msg: บันทึกการเปลี่ยนแปลงสำเร็จ!
     copy: คัดลอก
+    delete: ลบ
+    edit: แก้ไข
     order_by: เรียงลำดับตาม
     save_changes: บันทึกการเปลี่ยนแปลง
+  html_validator:
+    invalid_markup: 'มีมาร์กอัป HTML ที่ไม่ถูกต้อง: %{error}'
   identity_proofs:
+    active: ใช้งานอยู่
     authorize: ใช่ อนุญาต
+    inactive: ไม่ได้ใช้งาน
+    status: สถานะการตรวจสอบ
   imports:
     modes:
       merge: ผสาน
       overwrite: เขียนทับ
-    preface: You can import certain data like all the people you are following or blocking into your account on this instance, from files created by an export on another instance.
     types:
       blocking: รายการปิดกั้น
       domain_blocking: รายการปิดกั้นโดเมน
       following: รายการติดตาม
       muting: รายการปิดเสียง
     upload: อัปโหลด
+  in_memoriam_html: เพื่อระลึกถึง
   invites:
     delete: ปิดใช้งาน
     expires_in:
@@ -561,7 +675,8 @@ th:
       '604800': 1 สัปดาห์
       '86400': 1 วัน
     expires_in_prompt: ไม่เลย
-    generate: สร้าง
+    generate: สร้างลิงก์เชิญ
+    invited_by: 'คุณได้รับเชิญโดย:'
     max_uses:
       other: "%{count} การใช้"
     max_uses_prompt: ไม่มีขีดจำกัด
@@ -574,11 +689,12 @@ th:
       images_and_video: ไม่สามารถแนบวิดีโอกับสถานะที่มีภาพอยู่แล้ว
       too_many: ไม่สามารถแนบมากกว่า 4 ไฟล์
   migrations:
-    acct: username@domain ของบัญชีใหม่
+    acct: ย้ายไปยัง
     cancel: ยกเลิกการเปลี่ยนเส้นทาง
     errors:
       move_to_self: ไม่สามารถเป็นบัญชีปัจจุบัน
       not_found: ไม่พบ
+    incoming_migrations: การย้ายจากบัญชีอื่น
     proceed_with_move: ย้ายผู้ติดตาม
     redirecting_to: บัญชีของคุณกำลังเปลี่ยนเส้นทางไปยัง %{acct}
     set_redirect: ตั้งการเปลี่ยนเส้นทาง
@@ -588,8 +704,6 @@ th:
     digest:
       action: ดูการแจ้งเตือนทั้งหมด
       mention: "%{name} ได้กล่าวถึงคุณใน:"
-      new_followers_summary:
-        other: You have gotten %{count} new followers! Amazing!
       title: เมื่อคุณไม่อยู่...
     favourite:
       body: 'สถานะของคุณได้รับการชื่นชอบโดย %{name}:'
@@ -613,6 +727,9 @@ th:
       body: 'สถานะของคุณได้รับการดันโดย %{name}:'
       subject: "%{name} ได้ดันสถานะของคุณ"
       title: การดันใหม่
+  notifications:
+    email_events: เหตุการณ์สำหรับการแจ้งเตือนอีเมล
+    other_settings: การตั้งค่าการแจ้งเตือนอื่น ๆ
   pagination:
     newer: ใหม่กว่า
     next: ถัดไป
@@ -621,14 +738,22 @@ th:
     truncate: "&hellip;"
   polls:
     errors:
-      already_voted: คุณได้ลงคะแนนในโพลนี้อยู่แล้ว
+      already_voted: คุณได้ลงคะแนนในการสำรวจความคิดเห็นนี้อยู่แล้ว
       duplicate_options: มีรายการที่ซ้ำกัน
+      too_few_options: ต้องมีมากกว่าหนึ่งรายการ
+      too_many_options: ไม่สามารถมีมากกว่า %{max} รายการ
   preferences:
     other: อื่น ๆ
     posting_defaults: ค่าเริ่มต้นการโพสต์
     public_timelines: เส้นเวลาสาธารณะ
+  reactions:
+    errors:
+      unrecognized_emoji: ไม่ใช่อีโมจิที่รู้จัก
   relationships:
     activity: กิจกรรมบัญชี
+    followers: ผู้ติดตาม
+    following: กำลังติดตาม
+    invited: เชิญแล้ว
     last_active: ใช้งานล่าสุด
     most_recent: ล่าสุด
     moved: ย้ายแล้ว
@@ -714,15 +839,20 @@ th:
     two_factor_authentication: การรับรองความถูกต้องด้วยสองปัจจัย
   statuses:
     attached:
-      description: 'แนบ: %{attached}'
+      description: 'แนบอยู่: %{attached}'
       image:
         other: "%{count} ภาพ"
       video:
         other: "%{count} วิดีโอ"
+    boosted_from_html: ดันจาก %{acct_link}
     content_warning: 'คำเตือนเนื้อหา: %{warning}'
+    disallowed_hashtags:
+      other: 'มีแฮชแท็กที่ไม่อนุญาต: %{tags}'
     language_detection: ตรวจหาภาษาโดยอัตโนมัติ
     open_in_web: เปิดในเว็บ
     pin_errors:
+      ownership: ไม่สามารถปักหมุดโพสต์ของคนอื่น
+      private: ไม่สามารถปักหมุดโพสต์ที่ไม่เป็นสาธารณะ
       reblog: ไม่สามารถปักหมุดการดัน
     poll:
       total_people:
@@ -739,9 +869,14 @@ th:
       public: สาธารณะ
       public_long: ทุกคนสามารถเห็น
       unlisted: ไม่อยู่ในรายการ
+      unlisted_long: ทุกคนสามารถเห็น แต่ไม่แสดงรายการในเส้นเวลาสาธารณะ
   stream_entries:
     pinned: โพสต์ที่ปักหมุด
     sensitive_content: เนื้อหาที่ละเอียดอ่อน
+  tags:
+    does_not_match_previous_name: ไม่ตรงกับชื่อก่อนหน้า
+  terms:
+    title: เงื่อนไขการให้บริการและนโยบายความเป็นส่วนตัวของ %{instance}
   themes:
     contrast: Mastodon (ความคมชัดสูง)
     default: Mastodon (มืด)
@@ -749,17 +884,21 @@ th:
   time:
     formats:
       default: "%d %b %Y, %H:%M"
+      month: "%b %Y"
   two_factor_authentication:
     disable: ปิดใช้งาน
     enable: เปิดใช้งาน
     enabled: เปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยแล้ว
     enabled_success: เปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยสำเร็จ
     generate_recovery_codes: สร้างรหัสกู้คืน
-    recovery_instructions_html: If you ever lose access to your phone, you can use one of the recovery codes below to regain access to your account. Keep the recovery codes safe, for example by printing them and storing them with other important documents.
+    recovery_codes: รหัสกู้คืนข้อมูลสำรอง
     setup: ตั้งค่า
     wrong_code: รหัสที่ป้อนไม่ถูกต้อง! เวลาเซิร์ฟเวอร์และเวลาอุปกรณ์ถูกต้องหรือไม่?
   user_mailer:
     warning:
+      review_server_policies: ตรวจทานนโยบายของเซิร์ฟเวอร์
+      subject:
+        none: คำเตือนสำหรับ %{acct}
       title:
         none: คำเตือน
         silence: จำกัดบัญชีอยู่
@@ -769,6 +908,7 @@ th:
       subject: ยินดีต้อนรับสู่ Mastodon
       tips: เคล็ดลับ
   users:
+    follow_limit_reached: คุณไม่สามารถติดตามมากกว่า %{limit} คน
     invalid_email: ที่อยู่อีเมลไม่ถูกต้อง
     invalid_otp_token: รหัสสองปัจจัยไม่ถูกต้อง
     signed_in_as: 'ลงชื่อเข้าเป็น:'
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index f3a2817ec..773117369 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -6,7 +6,7 @@ tr:
     about_this: Bu sunucu hakkında
     active_count_after: etkin
     active_footnote: Aylık Aktif Kullanıcılar (AAK)
-    administered_by: 'Tarafından yönetildi:'
+    administered_by: 'Yöneten:'
     api: API
     apps: Mobil uygulamalar
     apps_platforms: İos, Android ve diğer platformlardaki Mastodon'u kullanın
@@ -56,7 +56,7 @@ tr:
     followers:
       one: Takipçi
       other: Takipçi
-    following: Takip ediliyor
+    following: Takip ettikleri
     joined: "%{date} tarihinde katıldı"
     last_active: son aktivite
     link_verified_on: Bu bağlantının mülkiyeti %{date} tarihinde kontrol edildi
@@ -78,6 +78,7 @@ tr:
     roles:
       admin: Yönetici
       bot: Bot
+      group: Grup
       moderator: Denetleyici
     unavailable: Profil kullanılamıyor
     unfollow: Takibi bırak
@@ -197,11 +198,13 @@ tr:
         change_email_user: "%{name}, %{target} kullanıcısının e-posta adresini değiştirdi"
         confirm_user: "%{name} %{target} kullanıcısının e-posta adresini onayladı"
         create_account_warning: "%{name} %{target} 'a bir uyarı gönderdi"
+        create_announcement: "%{name}, yeni %{target} duyurusunu oluşturdu"
         create_custom_emoji: "%{name} yeni ifade yükledi %{target}"
         create_domain_allow: "%{target} alan adı, %{name} tarafından beyaz listeye alındı"
         create_domain_block: "%{target} alanı, %{name} tarafından engellendi"
         create_email_domain_block: "%{target} e-posta alanı, %{name} tarafından kara listeye alınmış"
         demote_user: "%{name} %{target} kullanıcısını düşürdü"
+        destroy_announcement: "%{name}, %{target} duyurusunu sildi"
         destroy_custom_emoji: "%{target} emoji, %{name} tarafından kaldırıldı"
         destroy_domain_allow: "%{target} alan adı, %{name} tarafından beyaz listeden çıkartıldı"
         destroy_domain_block: "%{target} alan adının engeli %{name} tarafından kaldırıldı"
@@ -223,10 +226,22 @@ tr:
         unassigned_report: "%{name} %{target} şikayetinin atamasını geri aldı"
         unsilence_account: "%{name} %{target}'in hesabının susturmasını kaldırdı"
         unsuspend_account: "%{name} %{target}'in hesabının uzaklaştırmasını kaldırdı"
+        update_announcement: "%{name}, %{target} duyurusunu güncelledi"
         update_custom_emoji: "%{name} %{target} emojiyi güncelledi"
         update_status: "%{name}, %{target} kullanıcısının durumunu güncelledi"
       deleted_status: "(silinmiş durum)"
       title: Denetim günlüğü
+    announcements:
+      edit:
+        title: Duyuruyu düzenle
+      empty: Duyuru bulunamadı.
+      live: Canlı
+      new:
+        create: Duyuru oluştur
+        title: Yeni duyuru
+      published: Yayınlanan
+      time_range: Zaman aralığı
+      title: Duyurular
     custom_emojis:
       assign_category: Kategori ata
       by_domain: Alan adı
@@ -338,13 +353,11 @@ tr:
       delete: Sil
       destroyed_msg: E-posta alan adı kara listeden başarıyla silindi
       domain: Alan adı
+      empty: Şu anda hiçbir e-posta alan adı kara listeye alınmadı.
       new:
         create: Alan adı ekle
         title: Yeni e-posta kara liste girişi
       title: E-posta kara listesi
-    followers:
-      back_to_account: Hesaba Geri Dön
-      title: "%{acct} Takipçileri"
     instances:
       by_domain: Alan adı
       delivery_available: Teslimat mevcut
@@ -373,6 +386,8 @@ tr:
       title: Davetler
     pending_accounts:
       title: Bekleyen hesaplar (%{count})
+    relationships:
+      title: "%{acct} kişisinin ilişkileri"
     relays:
       add_new: Yeni aktarıcı ekle
       delete: Sil
@@ -393,10 +408,18 @@ tr:
       created_msg: Şikayet notu başarıyla oluşturuldu!
       destroyed_msg: Şikayet notu başarıyla silindi!
     reports:
+      account:
+        notes:
+          one: "%{count} not"
+          other: "%{count} not"
+        reports:
+          one: "%{count} şikayet"
+          other: "%{count} şikayet"
       action_taken_by: tarafından gerçekleştirilen eylem
       are_you_sure: Emin misiniz?
       assign_to_self: Bana ata
       assigned: Denetleyici atandı
+      by_target_domain: Şikayet edilen hesabın alan adı
       comment:
         none: Yok
       created_at: Şikayet edildi
@@ -442,6 +465,8 @@ tr:
         users: Oturum açan yerel kullanıcılara
       domain_blocks_rationale:
         title: Gerekçeyi göster
+      enable_bootstrap_timeline_accounts:
+        title: Yeni kullanıcılar için varsayılan takipleri etkinleştir
       hero:
         desc_html: Önsayfada görüntülenir. En az 600x100px önerilir. Ayarlanmadığında, sunucu küçük resmi kullanılır
         title: Kahraman görseli
@@ -529,7 +554,7 @@ tr:
       context: İçerik
       directory: Dizinde
       in_directory: Dizinde %{count}
-      last_active: Son aktiflik
+      last_active: Son aktivite
       most_popular: En popüler
       most_recent: En yeni
       name: Etiket
@@ -570,6 +595,10 @@ tr:
     animations_and_accessibility: Animasyonlar ve erişilebilirlik
     confirmation_dialogs: Onay iletişim kutuları
     discovery: Keşfet
+    localization:
+      body: Mastodon, gönüllüler tarafından çevrilmektedir.
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: Herkes katkıda bulunabilir.
     sensitive_content: Hassas içerik
     toot_layout: Toot yerleşimi
   application_mailer:
@@ -642,6 +671,9 @@ tr:
     hint_html: "<strong>İpucu:</strong> Önümüzdeki saat boyunca sana parolanı sormayacağız."
     invalid_password: Geçersiz parola
     prompt: Devam etmek parolayı doğrulayın
+  date:
+    formats:
+      default: "%b %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}sa"
@@ -676,7 +708,7 @@ tr:
   directories:
     directory: Profil dizini
     explanation: Kullanıcıları ilgi alanlarına göre keşfedin
-    explore_mastodon: "%{title} keşfet"
+    explore_mastodon: "%{title} sunucusunu keşfet"
   domain_validator:
     invalid_domain: geçerli bir alan adı değil
   errors:
@@ -705,10 +737,9 @@ tr:
       in_progress: Arşivinizi derliyoruz...
       request: Arşiv isteği
       size: Boyut
-    blocks: Blokladıklarınız
+    blocks: Engelledikleriniz
     csv: CSV
     domain_blocks: Alan adı blokları
-    follows: Takip ettikleriniz
     lists: Listeler
     mutes: Susturduklarınız
     storage: Ortam deposu
@@ -719,6 +750,7 @@ tr:
     hint_html: "<strong>Öne çıkan etiketler nelerdir?</strong> Genel profilinizde belirgin bir şekilde görüntülenirler ve kişilerin genel yayınlarınıza özellikle bu etiketler altında göz atmalarına izin verir. Yaratıcı çalışmaları veya uzun vadeli projeleri takip etmek için harika bir araçtır."
   filters:
     contexts:
+      account: Profiller
       home: Ana zaman çizelgesi
       notifications: Bildirimler
       public: Genel zaman çizelgesi
@@ -730,6 +762,7 @@ tr:
       invalid_irreversible: Geri dönüşümsüz filtreleme sadece anasayfa ya da bildirim bağlamında çalışır
     index:
       delete: Sil
+      empty: Hiç filtreniz yok.
       title: Filtreler
     new:
       title: Yeni filtre ekle
@@ -742,6 +775,8 @@ tr:
     all: Tümü
     changes_saved_msg: Değişiklikler başarıyla kaydedildi!
     copy: Kopyala
+    delete: Sil
+    edit: Düzenle
     no_batch_actions_available: Bu sayfada toplu işlem yok
     order_by: Sıralama ölçütü
     save_changes: Değişiklikleri kaydet
@@ -878,6 +913,10 @@ tr:
       body: "%{name} durumunuzu boost etti:"
       subject: "%{name} durumunuzu boost etti"
       title: Yeni gönderi
+  notifications:
+    email_events: E-posta bildirimi gönderilecek etkinlikler
+    email_events_hint: 'Bildirim almak istediğiniz olayları seçin:'
+    other_settings: Diğer bildirim ayarları
   number:
     human:
       decimal_units:
@@ -901,6 +940,7 @@ tr:
       duration_too_long: ileriye doğru çok geç
       duration_too_short: çok erken
       expired: Anket çoktan sona erdi
+      invalid_choice: Seçilen oylama seçeneği mevcut değil
       over_character_limit: her biri %{max} karakterden daha uzun olamaz
       too_few_options: birden fazla öğeye sahip olmalı
       too_many_options: "%{max} öğeden fazla öğe içeremez"
@@ -908,9 +948,16 @@ tr:
     other: Diğer
     posting_defaults: Gönderi varsayılanları
     public_timelines: Genel zaman çizelgeleri
+  reactions:
+    errors:
+      limit_reached: Farklı reaksiyonların sınırına ulaşıldı
+      unrecognized_emoji: tanınan bir emoji değil
   relationships:
     activity: Hesap etkinliği
     dormant: Atıl
+    followers: Takipçiler
+    following: Takip edilenler
+    invited: Davet edildi
     last_active: Son aktivite
     most_recent: En son
     moved: Taşındı
@@ -1192,7 +1239,7 @@ tr:
       full_handle_hint: Arkadaşlarınıza, size başka bir sunucudan mesaj atabilmeleri veya sizi takip edebilmeleri için söyleyeceğiniz şey budur.
       review_preferences_action: Tercihleri değiştirin
       review_preferences_step: Hangi e-postaları almak veya gönderilerinizin varsayılan olarak hangi gizlilik seviyesinde olmasını istediğiniz gibi tercihlerinizi ayarladığınızdan emin olun. Hareket hastalığınız yoksa, GIF otomatik oynatmayı etkinleştirmeyi seçebilirsiniz.
-      subject: Mastodon'a hoşgeldiniz
+      subject: Mastodon'a hoş geldiniz
       tip_federated_timeline: Federe zaman tüneli, Mastodon ağının genel bir görüntüsüdür. Ancak yalnızca komşularınızın abone olduğu kişileri içerir, bu yüzden tamamı değildir.
       tip_following: Sunucu yönetici(ler)ini varsayılan olarak takip edersiniz. Daha ilginç insanlar bulmak için yerel ve federe zaman çizelgelerini kontrol edin.
       tip_local_timeline: Yerel zaman çizelgesi, %{instance} üzerindeki kişilerin genel bir görüntüsüdür. Bunlar senin en yakın komşularındır!
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index edcc289da..34bf41a15 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -41,6 +41,10 @@ uk:
     unavailable_content_description:
       domain: Сервер
       reason: Причина
+      rejecting_media: 'Медіа файли з цих серверів не будуть оброблятися або зберігатись, а мініатюри відображатись. Щоб побачити оригінальний файл, треба буде натиснути на посилання:'
+      silenced: 'Повідомлення з цих серверів будуть приховані в публічних стрічках та розмовах, також ви не отримуватимете сповіщень щодо взаємодій з їх користувачами, якщо ви їх не відстежуєте:'
+      suspended: 'Жодна інформація з цих серверів не буде оброблена, збережена чи передана, що робить спілкування з користувачами цих серверів неможливим:'
+    unavailable_content_html: Mastodon зазвичай дозволяє вам взаємодіяти з користувачами будь-яких серверів в Федіверсі та переглядати їх контент. Ось винятки, які було зроблено на цьому конкретному сервері.
     user_count_after:
       few: користувача
       many: користувачів
@@ -50,6 +54,8 @@ uk:
     what_is_mastodon: Що таке Mastodon?
   accounts:
     choices_html: 'Вподобання %{name}:'
+    endorsements_hint: У веб-інтерфейсі ви можете рекомендувати людей, на яких підписані, і вони з'являться тут.
+    featured_tags_hint: Ви можете вказати хештеги, які будуть відображатись тут.
     follow: Підписатися
     followers:
       few: Підписника
@@ -80,6 +86,7 @@ uk:
     roles:
       admin: Адміністратор
       bot: Бот
+      group: Група
       moderator: Мод
     unavailable: Профіль недоступний
     unfollow: Відписатися
@@ -173,6 +180,7 @@ uk:
         staff: Персонал
         user: Користувач
       search: Пошук
+      search_same_ip: Інші користувачі з тим самим IP
       shared_inbox_url: URL спільного вхідного кошика
       show:
         created_reports: Скарги, створені цим аккаунтом
@@ -198,11 +206,15 @@ uk:
         change_email_user: "%{name} змінив(-ла) поштову адресу користувача %{target}"
         confirm_user: "%{name} підтвердив(-ла) статус поштової адреси користувача %{target}"
         create_account_warning: "%{name} надіслав попередження до %{target}"
+        create_announcement: "%{name} створив нове оголошення %{target}"
         create_custom_emoji: "%{name} вивантажив(-ла) нове емодзі %{target}"
+        create_domain_allow: "%{name} додав(-ла) домен %{target} до білого списку"
         create_domain_block: "%{name} заблокував(-ла) домен %{target}"
         create_email_domain_block: "%{name} додав(-ла) поштовий домен %{target} до чорного списку"
         demote_user: "%{name} понизив(-ла) %{target}"
+        destroy_announcement: "%{name} видалив оголошення %{target}"
         destroy_custom_emoji: "%{name} знищив(-ла) емодзі %{target}"
+        destroy_domain_allow: "%{name} видалив(-ла) домен %{target} з білого списку"
         destroy_domain_block: "%{name} розблокував(-ла) домен %{target}"
         destroy_email_domain_block: "%{name} додав(-ла) поштовий домен %{target} до білого списку"
         destroy_status: "%{name} видалив(-ла) статус користувача %{target}"
@@ -222,10 +234,22 @@ uk:
         unassigned_report: "%{name} зняв(-ла) призначення скарги %{target}"
         unsilence_account: "%{name} розглушив(-ла) обліковий запис %{target}"
         unsuspend_account: "%{name} розморозив обліковий запис користувача %{target}"
+        update_announcement: "%{name} оновив оголошення %{target}"
         update_custom_emoji: "%{name} оновив(-ла) емодзі %{target}"
         update_status: "%{name} змінив(-ла) статус користуача %{target}"
       deleted_status: "(видалений статус)"
       title: Журнал подій
+    announcements:
+      edit:
+        title: Редагувати оголошення
+      empty: Оголошення не знайдені.
+      live: Наживо
+      new:
+        create: Створити оголошення
+        title: Нове оголошення
+      published: Опубліковане
+      time_range: Діапазон часу
+      title: Оголошення
     custom_emojis:
       assign_category: Призначити категорію
       by_domain: Домен
@@ -253,6 +277,7 @@ uk:
       shortcode_hint: Мінімум два символи, тільки цифрові й латинські символи або підкреслення
       title: Особливі емодзі
       uncategorized: Без категорії
+      unlist: Прибрати
       unlisted: Не у списку
       update_failed_msg: Не вийшло оновити емозді
       updated_msg: Емодзі успішно оновлене!
@@ -338,13 +363,11 @@ uk:
       delete: Видалити
       destroyed_msg: Успішно видалено поштовий домен з чорного списку
       domain: Домен
+      empty: Ніякі e-mail домени не блокуються.
       new:
         create: Додати домен
         title: Нове блокування поштового домену
       title: Чорний список поштових доменів
-    followers:
-      back_to_account: Повернутися до Облікового запису
-      title: Підписники %{acct}
     instances:
       by_domain: Домен
       delivery_available: Доставлення доступне
@@ -375,6 +398,8 @@ uk:
       title: Запрошення
     pending_accounts:
       title: Облікові записи у черзі (%{count})
+    relationships:
+      title: "%{acct} відносини"
     relays:
       add_new: Додати новий ретранслятор
       delete: Видалити
@@ -395,10 +420,22 @@ uk:
       created_msg: Скарга успішно створена!
       destroyed_msg: Скарга успішно видалена!
     reports:
+      account:
+        notes:
+          few: "%{count} приміток"
+          many: "%{count} приміток"
+          one: "%{count} примітка"
+          other: "%{count} приміток"
+        reports:
+          few: "%{count} скарги"
+          many: "%{count} скарг"
+          one: "%{count} скарга"
+          other: "%{count} скарг"
       action_taken_by: Дія виконана
       are_you_sure: Ви впевнені?
       assign_to_self: Призначити мені
       assigned: Призначений модератор
+      by_target_domain: Домен облікового запису, на який скаржаться
       comment:
         none: Немає
       created_at: Створено
@@ -436,12 +473,16 @@ uk:
         title: Користувацький CSS
       default_noindex:
         desc_html: Впливає на усіх користувачів, які не змінили це настроювання самостійно
+        title: Виключити користувачів з індексації пошуковими системами за замовчуванням
       domain_blocks:
         all: Всi
         disabled: Нікого
         title: Показати, які домени заблоковані
+        users: Для авторизованих локальних користувачів
       domain_blocks_rationale:
         title: Обґрунтування
+      enable_bootstrap_timeline_accounts:
+        title: Увімкнути підписки за замовчуванням для нових користувачів
       hero:
         desc_html: Відображається на головній сторінці. Рекомендовано як мінімум 600x100 пікселів. Якщо не вказано, буде використано передпоказ інстанції
         title: Банер інстанції
@@ -472,6 +513,7 @@ uk:
           approved: Для входу потрібне схвалення
           none: Ніхто не може увійти
           open: Будь-хто може увійти
+        title: Режим реєстрації
       show_known_fediverse_at_about_page:
         desc_html: Коли увімкнено, будуть показані пости з усього відомого федисвіту у передпоказі. Інакше будуть показані лише локальні дмухи.
         title: Показувати доступний федисвіт у передпоказі стрічки
@@ -485,6 +527,7 @@ uk:
         desc_html: Відображається на сторінці додаткової информації<br>Можна використовувати HTML-теги
         title: Розширений опис сайту
       site_short_description:
+        desc_html: Відображається в бічній панелі та мета-тегах. Опишіть, що таке Mastodon і що робить цей сервер особливим, в одному абзаці.
         title: Короткий опис сервера
       site_terms:
         desc_html: |-
@@ -502,6 +545,9 @@ uk:
         desc_html: Показувати публічну стрічку на головній сторінці
         title: Передпоказ фіду
       title: Налаштування сайту
+      trendable_by_default:
+        desc_html: Впливає на хештеги, які не були заборонені раніше
+        title: Дозволити хештегам потрапляти в тренди без попереднього перегляду
       trends:
         desc_html: Відображати розглянуті хештеґи, які популярні зараз
         title: Популярні хештеги
@@ -553,18 +599,26 @@ uk:
       body_remote: Хтось з домену %{domain} поскаржився(-лася) на %{target}
       subject: Нова скарга до %{instance} (#%{id})
     new_trending_tag:
+      body: 'Хештег #%{name} сьогодні є в тренді, але раніше не переглядався. Він не відображатиметься публічно, якщо ви не дозволите це чи просто збережете форму, щоб ніколи більше про нього не чути.'
       subject: Новий хештеґ надіслано на розгляд до %{instance} (#%{name})
   aliases:
     add_new: Створити псевдонім
     created_msg: Новий псевдонім успішно створено. Тепер ви можете починати переміщення зі старого облікового запису.
     deleted_msg: Псевдонім успішно видалено. Переміщення з того облікового запису до цього більше не можливе.
+    hint_html: Якщо ви збираєтеся мігрувати з іншого облікового запису на цей, ви можете налаштувати псевдонім, що потрібно для перенесення передплатників зі старою облікового запису. Ця дія саме по собі <strong>нешкідливо і оборотно</strong>. <strong>Міграція облікового запису починається з старого облікового запису</strong>.
+    remove: Від'єднати псевдонім
   appearance:
     advanced_web_interface: Розширений web-інтерфейс
     advanced_web_interface_hint: 'Розширений веб-інтерфейс дає змогу бачити багато стовпчиків одночасно: основна сторінка, сповіщення, глобальна стрічка, будь-які списки та хештеґи. Потребує широкого екрана.'
     animations_and_accessibility: Анімація та доступність
     confirmation_dialogs: Діалоги підтвердження
     discovery: Виявлення
+    localization:
+      body: Mastodon перекладено волонтерами.
+      guide_link: https://uk.crowdin.com/project/mastodon
+      guide_link_text: Кожен може взяти участь.
     sensitive_content: Дражливий вміст
+    toot_layout: Зовнішній вигляд дмухів
   application_mailer:
     notification_preferences: Змінити налаштування e-mail
     salutation: "%{name},"
@@ -635,6 +689,9 @@ uk:
     hint_html: "<strong>Підказка:</strong> ми не будемо запитувати ваш пароль впродовж наступної години."
     invalid_password: Невірний пароль
     prompt: Підтвердіть пароль для продовження
+  date:
+    formats:
+      default: "%b %d, %Y"
   datetime:
     distance_in_words:
       about_x_hours: "%{count}г"
@@ -701,7 +758,6 @@ uk:
     blocks: Список блокувань
     csv: CSV
     domain_blocks: Блокування доменів
-    follows: Підписки
     lists: Списки
     mutes: Список глушення
     storage: Ваш медіаконтент
@@ -712,6 +768,7 @@ uk:
     hint_html: "<strong>Що таке виділені хештеґи?</strong> Це ті, що відображаються ни видному місці у вашому публічному профілі. Вони дають змогу людям фільтрувати ваші публічні пости за цими хештеґами. Це дуже корисно для відстеження мистецьких творів та довготривалих проектів."
   filters:
     contexts:
+      account: Профілі
       home: Ваша стрічка
       notifications: Сповіщення
       public: Глобальні стрічки
@@ -723,6 +780,7 @@ uk:
       invalid_irreversible: Незворотне фільтрування працює тільки в контексті свого фіду або сповіщень
     index:
       delete: Видалити
+      empty: У вас немає фільтрів.
       title: Фільтри
     new:
       title: Додати фільтр
@@ -735,6 +793,9 @@ uk:
     all: Усі
     changes_saved_msg: Зміни успішно збережені!
     copy: Копіювати
+    delete: Видалити
+    edit: Змінити
+    no_batch_actions_available: На цій сторінці немає запланованих дій
     order_by: Сортувати за
     save_changes: Зберегти зміни
     validation_errors:
@@ -750,6 +811,11 @@ uk:
     authorize_connection_prompt: Авторизувати це зашифроване з'єднання?
     errors:
       failed: Не вдалося встановити це зашифроване з'єднання. Спробуйте ще раз за допомогою %{provider}.
+      keybase:
+        invalid_token: Токени Keybase - це хеші від підписів і повинні бути по довжині в 66 hex-символів
+        verification_failed: Keybase не розпізнає цей токен як підпис користувача Keybase %{kb_username}. Будь-ласка, спробуйте з Keybase.
+      wrong_user: Неможливо підтвердити користувача%{proving}, під час входу в систему як %{current}. Виконайте вхід як %{proving} і спробуйте ще раз.
+    explanation_html: На цій сторінці відображаються криптографічні підтверджені ідентифікатори - наприклад, прив'язаний профіль Keybase. Це дозволяє людям відправляти вам зашифровані повідомлення, а також довіряти вашим постам.
     i_am_html: Я %{username} з %{service}.
     identity: Ідентичність
     inactive: Неактивний
@@ -806,12 +872,21 @@ uk:
   migrations:
     acct: username@domain нового облікового запису
     cancel: Скасувати перенаправлення
+    cancel_explanation: Скасування перенаправлення реактивує ваш поточний обліковий запис, але не поверне підписників, які були переміщені в інший обліковий запис.
+    cancelled_msg: Перенаправлення успішно скасовано.
     errors:
+      already_moved: той самий обліковий запис, до якого ви вже переміщені
+      missing_also_known_as: не є зворотнім посиланням на цей обліковий запис
+      move_to_self: неможливо перемістити обліковий запис до самого себе
       not_found: не знайдено
+      on_cooldown: Ви у витверезнику
     followers_count: Підписників на час міграції
     incoming_migrations: Переїзд з іншого облікового запису
     incoming_migrations_html: Щоб переїхати з іншого облікового запису на цей, ви маєте <a href="%{path}">створити псевдонім облікового запису</a>.
+    moved_msg: Ваш обліковий запис зараз перенаправляється до %{acct}. Ваші підписники також будуть переміщені.
     not_redirecting: Наразі ваш обліковий запис не перенаправлений до іншого облікового запису.
+    on_cooldown: Нещодавно ви вже перенесли ваш обліковий запис. Функція переносу стане доступною знову через %{count} днів.
+    past_migrations: Попередні міграції
     proceed_with_move: Перемістити підписників
     redirecting_to: Ваш обліковий запис перенаправляється до %{acct}.
     set_redirect: Встановити перенаправлення
@@ -819,6 +894,11 @@ uk:
       backreference_required: Спочатку має бути налаштовано зворотне посилання поточного облікового запису на новий обліковий запис
       before: 'Перш ніж продовжити, уважно прочитайте ці нотатки:'
       cooldown: Після переїзду ви деякий час не можете переїжджати знову
+      disabled_account: Поточний обліковий запис не буде повністю придатний до використання. Проте ви матимете доступ до експорту даних та повторної активації.
+      followers: Ця дія призведе до переміщення всіх підписників з поточного облікового запису до нового облікового запису
+      only_redirect_html: Або ж ви можете <a href="%{path}"> просто налаштувати перенаправлення у ваш профіль</a>.
+      other_data: Ніякі інші дані не будуть переміщені автоматично
+      redirect: Профіль цього облікового запису буде оновлено з заміткою про перенаправлення, а також виключений з пошуку
   moderation:
     title: Модерація
   notification_mailer:
@@ -859,6 +939,10 @@ uk:
       body: 'Ваш статус було передмухнуто %{name}:'
       subject: "%{name} передмухнув(-ла) ваш статус"
       title: Нове передмухування
+  notifications:
+    email_events: Події, про які сповіщати електронною поштою
+    email_events_hint: 'Оберіть події, про які ви хочете отримувати сповіщення:'
+    other_settings: Інші налаштування сповіщень
   number:
     human:
       decimal_units:
@@ -882,6 +966,7 @@ uk:
       duration_too_long: надто далеко у майбутньому
       duration_too_short: надто мала тривалість
       expired: Це опитування вже завершено
+      invalid_choice: Обраного варіанту голосування не існує
       over_character_limit: не може бути довше ніж %{max} символів кожен
       too_few_options: має містити більше ніж один варіант
       too_many_options: не може мати більше ніж %{max} варіантів
@@ -889,9 +974,15 @@ uk:
     other: Інше
     posting_defaults: Промовчання для постів
     public_timelines: Глобальні стрічки
+  reactions:
+    errors:
+      unrecognized_emoji: не є розпізнаним емоджі
   relationships:
     activity: Діяльність облікового запису
     dormant: Неактивні
+    followers: Підписники
+    following: Підписник(-ця)
+    invited: Запрошені
     last_active: Крайня активність
     most_recent: За часом створення
     moved: Переміщено
@@ -1082,6 +1173,7 @@ uk:
         suspend: Ваш обліковий запис було призупинено, а всі ваші дмухи і вивантажені медіафайли - безповоротно видалено з цього сервера та серверів, де ви мали послідовників.
       get_in_touch: Ви можете відповісти на цей електронний лист, щоб зконтактувати з працівниками %{instance}.
       review_server_policies: Переглянути політики сервера
+      statuses: 'Зокрема, для:'
       subject:
         disable: Ваш обліковий запис %{acct} було заморожено
         none: Попередження для %{acct}
@@ -1117,4 +1209,5 @@ uk:
     seamless_external_login: Ви увійшли за допомогою зовнішнього сервісу, тому налаштування паролю та електронної пошти недоступні.
     signed_in_as: 'Ви увійшли як:'
   verification:
+    explanation_html: 'Володіння посиланнями у профілі <strong>можна підтвердити</strong>. Для цього на зазначеному сайті повинна міститися посилання на ваш профіль Mastodon, а у самому посиланні <strong>повинен</strong> бути атрибут <code>rel="me"</code>. Що всередині посилання - значення не має. Ось вам приклад посилання:'
     verification: Підтвердження
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
new file mode 100644
index 000000000..ec8e853fe
--- /dev/null
+++ b/config/locales/vi.yml
@@ -0,0 +1,1112 @@
+---
+vi:
+  about:
+    about_hashtag_html: Đây là các tút công khai được gắn thẻ <strong># %{hashtag}</strong> . Bạn có thể tương tác với họ nếu bạn có tài khoản ở bất cứ đâu trong fediverse.
+    about_mastodon_html: 'Mạng xã hội của tương lai: Không quảng cáo, không giám sát doanh nghiệp, thiết kế đạo đức và phân cấp! Sở hữu dữ liệu của bạn với Mastodon!'
+    about_this: Trong khoảng
+    active_count_after: Hoạt động
+    active_footnote: Người dùng hoạt động hàng tháng (MAU)
+    administered_by: 'Điều hành bởi:'
+    api: API
+    apps: Ứng dụng di động
+    apps_platforms: Sử dụng Mastodon từ iOS, Android và các nền tảng khác
+    browse_directory: Duyệt một thư mục hồ sơ và lọc theo sở thích
+    browse_local_posts: Duyệt một luồng trực tiếp các bài đăng công khai trên trang
+    browse_public_posts: Duyệt một luồng trực tiếp các bài đăng công khai trên Mastodon
+    contact: Tiếp xúc
+    contact_missing: Không được thiết lập
+    contact_unavailable: Không có
+    discover_users: Khám phá người dùng
+    documentation: Tài liệu
+    federation_hint_html: Với tài khoản trên %{instance}, bạn sẽ có thể theo dõi mọi người trên bất kỳ máy chủ Mastodon nào và hơn thế nữa.
+    get_apps: Dùng thử ứng dụng di động
+    hosted_on: " %{domain} được vận hành trên Mastodon"
+    instance_actor_flash: "Tài khoản này là một tác nhân ảo được sử dụng để đại diện cho chính máy chủ chứ không phải bất kỳ người dùng cá nhân nào. Nó được sử dụng cho mục đích liên kết và không nên bị chặn trừ khi bạn muốn chặn toàn bộ phiên bản, trong trường hợp đó bạn nên sử dụng một khối miền. \n"
+    learn_more: Tìm hiểu thêm
+    privacy_policy: Chính sách bảo mật
+    see_whats_happening: Xem những gì đang xảy ra
+    server_stats: 'Số liệu thống kê máy chủ:'
+    source_code: Mã nguồn
+    status_count_after:
+      other: trạng thái
+    status_count_before: Ai là tác giả
+    tagline: Theo dõi bạn bè và khám phá những cái mới
+    terms: Điều khoản dịch vụ
+    unavailable_content: Nội dung không khả dụng
+    unavailable_content_description:
+      domain: Người phục vụ
+      reason: Lý do
+      rejecting_media: 'Các tệp phương tiện từ các máy chủ này sẽ không được xử lý hoặc lưu trữ và không có hình thu nhỏ nào được hiển thị, yêu cầu nhấp thủ công vào tệp gốc:'
+      silenced: 'Các bài đăng từ các máy chủ này sẽ bị ẩn trong các dòng thời gian và cuộc trò chuyện công khai và không có thông báo nào được tạo từ các tương tác của người dùng của họ, trừ khi bạn đang theo dõi họ:'
+      suspended: 'Không có dữ liệu từ các máy chủ này sẽ được xử lý, lưu trữ hoặc trao đổi, khiến cho bất kỳ tương tác hoặc giao tiếp với người dùng từ các máy chủ này đều không thể:'
+    unavailable_content_html: Mastodon thường cho phép bạn xem nội dung từ và tương tác với người dùng từ bất kỳ máy chủ nào khác trong fediverse. Đây là những ngoại lệ đã được thực hiện trên máy chủ cụ thể này.
+    user_count_after:
+      other: người dùng
+    user_count_before: Nhà
+    what_is_mastodon: Mastodon là gì?
+  accounts:
+    choices_html: 'lựa chọn của %{name}:'
+    endorsements_hint: Bạn có thể xác nhận những người bạn theo dõi từ giao diện web và họ sẽ hiển thị ở đây.
+    featured_tags_hint: Bạn có thể làm nổi bật các hashtag cụ thể sẽ được hiển thị ở đây.
+    follow: Theo
+    followers:
+      other: Người theo dõi
+    following: Tiếp theo
+    joined: Đã tham gia %{date}
+    last_active: hoạt động cuối cùng
+    link_verified_on: Quyền sở hữu của liên kết này đã được kiểm tra trên %{date}
+    media: Phương tiện truyền thông
+    moved_html: "%{name} đã chuyển sang %{new_profile_link}:"
+    network_hidden: Thông tin này không có sẵn
+    never_active: Không bao giờ
+    nothing_here: Không có cái gì ở đây cả!
+    people_followed_by: Những người mà %{name} theo dõi
+    people_who_follow: Những người theo dõi %{name}
+    pin_errors:
+      following: Bạn phải theo dõi người bạn muốn chứng thực
+    posts:
+      other: Tút
+    posts_tab_heading: Tút
+    posts_with_replies: Tút và trả lời
+    reserved_username: Tên người dùng được bảo lưu
+    roles:
+      admin: quản trị viên
+      bot: Người máy
+      group: Nhóm
+      moderator: Phép chia lấy phần dư
+    unavailable: Hồ sơ không có sẵn
+    unfollow: Hủy theo dõi
+  admin:
+    account_actions:
+      action: Diễn
+      title: Thực hiện hành động kiểm duyệt trên %{acct}
+    account_moderation_notes:
+      create: Để lại ghi chú
+      created_msg: Lưu ý kiểm duyệt được tạo thành công!
+      delete: Xóa bỏ
+      destroyed_msg: Lưu ý kiểm duyệt thành công!
+    accounts:
+      approve: Phê duyệt
+      approve_all: Phê duyệt tất cả
+      are_you_sure: Bạn có chắc không?
+      avatar: hình đại diện
+      by_domain: Miền
+      change_email:
+        changed_msg: Email tài khoản đã thay đổi thành công!
+        current_email: Email hiện tại
+        label: Thay đổi e-mail
+        new_email: Email mới
+        submit: Thay đổi e-mail
+        title: Thay đổi email cho %{username}
+      confirm: Xác nhận
+      confirmed: Đã xác nhận
+      confirming: Khẳng định
+      deleted: Đã xóa
+      demote: Hạ cấp
+      disable: Vô hiệu hóa
+      disable_two_factor_authentication: Vô hiệu hóa 2FA
+      disabled: Tàn tật
+      display_name: Tên hiển thị
+      domain: Miền
+      edit: Biên tập
+      email: E-mail
+      email_status: Trạng thái email
+      enable: Kích hoạt
+      enabled: Đã bật
+      followers: Người theo dõi
+      follows: Theo sau
+      header: Tiêu đề
+      inbox_url: URL hộp thư đến
+      invited_by: Được mời bởi
+      ip: IP
+      joined: Đã tham gia
+      location:
+        all: Tất cả
+        local: Địa phương
+        remote: Xa
+        title: Vị trí
+      login_status: Trạng thái đăng nhập
+      media_attachments: Tệp đính kèm phương tiện
+      memorialize: Biến thành bản ghi nhớ
+      moderation:
+        active: Hoạt động
+        all: Tất cả
+        pending: Đang chờ xử lý
+        silenced: Im lặng
+        suspended: Đình chỉ
+        title: Điều độ
+      moderation_notes: Ghi chú kiểm duyệt
+      most_recent_activity: Hoạt động gần đây nhất
+      most_recent_ip: IP gần đây nhất
+      no_account_selected: Không có tài khoản nào được thay đổi vì không có tài khoản nào được chọn
+      no_limits_imposed: Không giới hạn áp đặt
+      not_subscribed: Chưa đăng ký
+      pending: Đang chờ xem xét
+      perform_full_suspension: Đình chỉ
+      promote: Khuyến khích
+      protocol: Giao thức
+      public: Công cộng
+      push_subscription_expires: Đăng ký PuSH hết hạn
+      redownload: Làm mới hồ sơ
+      reject: Từ chối
+      reject_all: Từ chối tất cả
+      remove_avatar: Xóa hình đại diện
+      remove_header: Xóa tiêu đề
+      resend_confirmation:
+        already_confirmed: Người dùng này đã được xác nhận
+        send: Gửi lại email xác nhận
+        success: Email xác nhận đã được gửi thành công!
+      reset: Cài lại
+      reset_password: Đặt lại mật khẩu
+      resubscribe: Đăng ký lại
+      role: Quyền
+      roles:
+        admin: Người quản lý
+        moderator: Người điều hành
+        staff: Nhân viên
+        user: Người dùng
+      search: Tìm kiếm
+      search_same_ip: Thành viên khác cùng IP
+      shared_inbox_url: URL hộp thư đến được chia sẻ
+      show:
+        created_reports: Làm báo cáo
+        targeted_reports: Báo cáo bởi người khác
+      silence: khoảng lặng
+      silenced: Im lặng
+      statuses: Trạng thái
+      subscribe: Đăng ký
+      suspended: Đình chỉ
+      time_in_queue: Chờ đợi trong hàng đợi %{time}
+      title: Tài khoản
+      unconfirmed_email: Email chưa được xác nhận
+      undo_silenced: Hoàn tác im lặng
+      undo_suspension: Hoàn tác hệ thống treo
+      unsubscribe: Hủy đăng ký
+      username: tên tài khoản
+      warn: Cảnh báo
+      web: Web
+      whitelisted: Danh sách trắng
+    action_logs:
+      actions:
+        assigned_to_self_report: "%{name} được chỉ định báo cáo %{target} cho chính họ"
+        change_email_user: "%{name} đã thay đổi địa chỉ email của người dùng %{target}"
+        confirm_user: "%{name} xác nhận địa chỉ email của người dùng %{target}"
+        create_account_warning: "%{name} đã gửi cảnh báo tới %{target}"
+        create_custom_emoji: "%{name} đã tải lên biểu tượng cảm xúc mới %{target}"
+        create_domain_allow: "%{name} tên miền trong danh sách trắng %{target}"
+        create_domain_block: "%{name} tên miền bị chặn %{target}"
+        create_email_domain_block: "%{name} tên miền e-mail trong danh sách đen %{target}"
+        demote_user: "%{name} hạ cấp người dùng %{target}"
+        destroy_custom_emoji: "%{name} biểu tượng cảm xúc bị phá hủy %{target}"
+        destroy_domain_allow: "%{name} đã xóa tên miền %{target} khỏi danh sách trắng"
+        destroy_domain_block: "%{name} tên miền không bị chặn %{target}"
+        destroy_email_domain_block: "%{name} tên miền e-mail được liệt kê trắng %{target}"
+        destroy_status: "%{name} đã xóa trạng thái bởi %{target}"
+        disable_2fa_user: "%{name} đã vô hiệu hóa yêu cầu hai yếu tố cho người dùng %{target}"
+        disable_custom_emoji: "%{name} biểu tượng cảm xúc bị vô hiệu hóa %{target}"
+        disable_user: "%{name} đăng nhập bị vô hiệu hóa cho người dùng %{target}"
+        enable_custom_emoji: "%{name} kích hoạt biểu tượng cảm xúc %{target}"
+        enable_user: "%{name} kích hoạt đăng nhập cho người dùng %{target}"
+        memorialize_account: "%{name} đã biến tài khoản của %{target} thành một trang ghi nhớ"
+        promote_user: "%{name} người dùng được quảng cáo %{target}"
+        remove_avatar_user: "%{name} đã xóa hình đại diện của %{target}"
+        reopen_report: "%{name} mở lại báo cáo %{target}"
+        reset_password_user: "%{name} đặt lại mật khẩu của người dùng %{target}"
+        resolve_report: "%{name} đã giải quyết báo cáo %{target}"
+        silence_account: "%{name} im lặng tài khoản của %{target}"
+        suspend_account: "%{name} bị treo tài khoản của %{target}"
+        unassigned_report: "%{name} báo cáo chưa được chỉ định %{target}"
+        unsilence_account: "%{name} chưa được phân loại tài khoản của %{target}"
+        unsuspend_account: "%{name} không có tài khoản %{target} của tài khoản"
+        update_custom_emoji: "%{name} đã cập nhật biểu tượng cảm xúc %{target}"
+        update_status: "%{name} trạng thái được cập nhật bởi %{target}"
+      deleted_status: "(trạng thái đã xóa)"
+      title: Sổ ghi chép đánh giá
+    custom_emojis:
+      assign_category: Chỉ định danh mục
+      by_domain: Miền
+      copied_msg: Tạo thành công bản sao biểu tượng cảm xúc cục bộ
+      copy: Sao chép
+      copy_failed_msg: Không thể tạo một bản sao cục bộ của biểu tượng cảm xúc đó
+      create_new_category: Tạo danh mục mới
+      created_msg: Biểu tượng cảm xúc được tạo thành công!
+      delete: Xóa bỏ
+      destroyed_msg: Emojo phá hủy thành công!
+      disable: Vô hiệu hóa
+      disabled: Tàn tật
+      disabled_msg: Vô hiệu hóa thành công biểu tượng cảm xúc đó
+      emoji: Biểu tượng cảm xúc
+      enable: Kích hoạt
+      enabled: Đã bật
+      enabled_msg: Kích hoạt thành công biểu tượng cảm xúc đó
+      image_hint: PNG lên tới 50KB
+      list: Danh sách
+      listed: Liệt kê
+      new:
+        title: Thêm biểu tượng cảm xúc tùy chỉnh mới
+      overwrite: Ghi đè
+      shortcode: Mã ngắn
+      shortcode_hint: Ít nhất 2 ký tự, chỉ các ký tự chữ và số và dấu gạch dưới
+      title: Biểu tượng cảm xúc tùy chỉnh
+      uncategorized: Chưa phân loại
+      unlist: Bỏ danh sách
+      unlisted: Chưa niêm yết
+      update_failed_msg: Không thể cập nhật biểu tượng cảm xúc đó
+      updated_msg: Biểu tượng cảm xúc được cập nhật thành công!
+      upload: Tải lên
+    dashboard:
+      authorized_fetch_mode: Chế độ bảo mật
+      backlog: công việc tồn đọng
+      config: Cấu hình
+      feature_deletions: Xóa tài khoản
+      feature_invites: Mời liên kết
+      feature_profile_directory: Thư mục hồ sơ
+      feature_registrations: Đăng ký
+      feature_relay: Liên đoàn tiếp sức
+      feature_spam_check: Chống thư rác
+      feature_timeline_preview: Xem trước dòng thời gian
+      features: Đặc trưng
+      hidden_service: Liên kết với các dịch vụ ẩn
+      open_reports: mở báo cáo
+      pending_tags: hashtag đang chờ xem xét
+      pending_users: người dùng đang chờ xem xét
+      recent_users: Người dùng gần đây
+      search: Tìm kiếm toàn văn
+      single_user_mode: Chế độ người dùng đơn
+      software: Phần mềm
+      space: Sử dụng không gian
+      title: bảng điều khiển
+      total_users: tổng số người dùng
+      trends: Xu hướng
+      week_interactions: tương tác trong tuần này
+      week_users_active: hoạt động trong tuần này
+      week_users_new: người dùng trong tuần này
+      whitelist_mode: Chế độ danh sách trắng
+    domain_allows:
+      add_new: Tên miền trắng
+      created_msg: Tên miền đã được đưa vào danh sách trắng thành công
+      destroyed_msg: Tên miền đã bị xóa khỏi danh sách trắng
+      undo: Xóa khỏi danh sách trắng
+    domain_blocks:
+      add_new: Thêm khối miền mới
+      created_msg: Khối tên miền hiện đang được xử lý
+      destroyed_msg: Khối tên miền đã được hoàn tác
+      domain: Miền
+      edit: Chỉnh sửa khối miền
+      existing_domain_block_html: Bạn đã áp đặt các giới hạn chặt chẽ hơn trên %{name}, trước tiên bạn cần <a href="%{unblock_url}">bỏ chặn nó</a> .
+      new:
+        create: Tạo khối
+        hint: Khối miền sẽ không ngăn việc tạo các mục nhập tài khoản trong cơ sở dữ liệu, nhưng sẽ hồi tố và tự động áp dụng các phương pháp kiểm duyệt cụ thể trên các tài khoản đó.
+        severity:
+          desc_html: "<strong>Im lặng</strong> sẽ làm cho bài đăng của tài khoản trở nên vô hình đối với bất kỳ ai không theo dõi họ. <strong>Đình chỉ</strong> sẽ xóa tất cả nội dung, phương tiện và dữ liệu hồ sơ của tài khoản. Sử dụng <strong>Không</strong> nếu bạn chỉ muốn từ chối các tập tin phương tiện truyền thông."
+          noop: không ai
+          silence: khoảng lặng
+          suspend: Đình chỉ
+        title: Khối miền mới
+      private_comment: Bình luận riêng
+      private_comment_hint: Nhận xét về giới hạn miền này để sử dụng nội bộ của người điều hành.
+      public_comment: Nhận xét công khai
+      public_comment_hint: Nhận xét về giới hạn tên miền này cho công chúng, nếu quảng cáo danh sách các giới hạn tên miền được bật.
+      reject_media: Từ chối các tập tin phương tiện truyền thông
+      reject_media_hint: Xóa các tệp phương tiện được lưu trữ cục bộ và từ chối tải xuống bất kỳ trong tương lai. Không liên quan cho đình chỉ
+      reject_reports: Từ chối báo cáo
+      reject_reports_hint: Bỏ qua tất cả các báo cáo đến từ tên miền này. Không liên quan cho đình chỉ
+      rejecting_media: từ chối các tập tin phương tiện truyền thông
+      rejecting_reports: từ chối báo cáo
+      severity:
+        silence: im lặng
+        suspend: bị đình chỉ
+      show:
+        affected_accounts:
+          other: "%{count} tài khoản trong cơ sở dữ liệu bị ảnh hưởng"
+        retroactive:
+          silence: Tài khoản bị ảnh hưởng hiện có từ miền này
+          suspend: Hủy bỏ các tài khoản bị ảnh hưởng hiện có từ miền này
+        title: Hoàn tác khối miền cho %{domain}
+        undo: Hủy bỏ
+      undo: Hoàn tác khối tên miền
+      view: Xem khối tên miền
+    email_domain_blocks:
+      add_new: Thêm mới
+      created_msg: Đã thêm thành công tên miền e-mail vào danh sách đen
+      delete: Xóa bỏ
+      destroyed_msg: Đã xóa thành công tên miền e-mail khỏi danh sách đen
+      domain: Miền
+      new:
+        create: Thêm tên miền
+        title: Mục nhập danh sách đen e-mail mới
+      title: Danh sách đen e-mail
+    instances:
+      by_domain: Miền
+      delivery_available: Giao hàng tận nơi
+      known_accounts:
+        other: "%{count} tài khoản đã biết"
+      moderation:
+        all: Tất cả
+        limited: Hạn chế
+        title: Điều độ
+      private_comment: Bình luận riêng
+      public_comment: Nhận xét công khai
+      title: Liên đoàn
+      total_blocked_by_us: Bị chặn bởi chúng tôi
+      total_followed_by_them: Theo sau họ
+      total_followed_by_us: Theo dõi chúng tôi
+      total_reported: Báo cáo về họ
+      total_storage: Tệp đính kèm phương tiện
+    invites:
+      deactivate_all: Vô hiệu hóa tất cả
+      filter:
+        all: Tất cả
+        available: Có sẵn
+        expired: Đã hết hạn
+        title: Bộ lọc
+      title: Mời
+    pending_accounts:
+      title: Tài khoản đang chờ xử lý (%{count})
+    relays:
+      add_new: Thêm rơle mới
+      delete: Xóa bỏ
+      description_html: "<strong>Rơle liên kết</strong> là một máy chủ trung gian trao đổi khối lượng lớn các tút công khai giữa các máy chủ đăng ký và xuất bản lên nó. <strong>Nó có thể giúp các máy chủ vừa và nhỏ khám phá nội dung từ fediverse</strong> , nếu không sẽ yêu cầu người dùng cục bộ theo dõi thủ công người khác trên các máy chủ từ xa."
+      disable: Vô hiệu hóa
+      disabled: Tàn tật
+      enable: Kích hoạt
+      enable_hint: Sau khi được bật, máy chủ của bạn sẽ đăng ký tất cả các tút công khai từ rơle này và sẽ bắt đầu gửi các tút công khai của máy chủ này tới nó.
+      enabled: Đã bật
+      inbox_url: Chuyển tiếp URL
+      pending: Chờ phê duyệt của rơle
+      save_and_enable: Lưu và kích hoạt
+      setup: Thiết lập kết nối chuyển tiếp
+      signatures_not_enabled: Rơle sẽ không hoạt động chính xác trong khi chế độ bảo mật hoặc chế độ danh sách trắng được bật
+      status: Trạng thái
+      title: Rơle
+    report_notes:
+      created_msg: Báo cáo ghi chú được tạo thành công!
+      destroyed_msg: Báo cáo đã xóa thành công!
+    reports:
+      action_taken_by: Hành động được thực hiện bởi
+      are_you_sure: Bạn có chắc không?
+      assign_to_self: Giao cho tôi
+      assigned: Người điều hành được phân công
+      comment:
+        none: không ai
+      created_at: Báo cáo
+      mark_as_resolved: Đánh dấu là đã giải quyết
+      mark_as_unresolved: Đánh dấu là chưa giải quyết
+      notes:
+        create: Thêm ghi chú
+        create_and_resolve: Giải quyết với ghi chú
+        create_and_unresolve: Mở lại với ghi chú
+        delete: Xóa bỏ
+        placeholder: Mô tả những hành động đã được thực hiện, hoặc bất kỳ cập nhật liên quan khác ...
+      reopen: Mở lại báo cáo
+      report: 'Báo cáo # %{id}'
+      reported_account: Tài khoản báo cáo
+      reported_by: Báo cáo bởi
+      resolved: Đã giải quyết
+      resolved_msg: Báo cáo giải quyết thành công!
+      status: Trạng thái
+      title: Báo cáo
+      unassign: Bỏ qua
+      unresolved: Chưa giải quyết
+      updated_at: Đã cập nhật
+    settings:
+      activity_api_enabled:
+        desc_html: Số lượng trạng thái được đăng tại địa phương, người dùng hoạt động và đăng ký mới trong nhóm hàng tuần
+        title: Xuất bản số liệu thống kê tổng hợp về hoạt động của người dùng
+      bootstrap_timeline_accounts:
+        desc_html: Phân tách nhiều tên người dùng bằng dấu phẩy. Chỉ các tài khoản địa phương và mở khóa sẽ hoạt động. Mặc định khi trống là tất cả quản trị viên địa phương.
+        title: Theo mặc định cho người dùng mới
+      contact_information:
+        email: Email kinh doanh
+        username: Liên hệ tên người dùng
+      custom_css:
+        desc_html: Sửa đổi giao diện với CSS được tải trên mỗi trang
+        title: CSS tùy chỉnh
+      default_noindex:
+        desc_html: Ảnh hưởng đến tất cả người dùng không tự thay đổi cài đặt này
+        title: Chọn người dùng không tham gia lập chỉ mục công cụ tìm kiếm theo mặc định
+      domain_blocks:
+        all: Tới mọi người
+        disabled: Không ai
+        title: Hiển thị khối miền
+        users: Để đăng nhập người dùng cục bộ
+      domain_blocks_rationale:
+        title: Hiển thị lý do
+      hero:
+        desc_html: Hiển thị trên frontpage. Khuyến nghị ít nhất 600x100px. Khi không được đặt, quay lại hình thu nhỏ của máy chủ
+        title: Hình ảnh anh hùng
+      mascot:
+        desc_html: Hiển thị trên nhiều trang. Khuyến nghị ít nhất 293 × 205px. Khi không được đặt, rơi trở lại linh vật mặc định
+        title: Hình ảnh linh vật
+      peers_api_enabled:
+        desc_html: Tên miền mà máy chủ này đã gặp phải trong fediverse
+        title: Xuất bản danh sách các máy chủ được phát hiện
+      preview_sensitive_media:
+        desc_html: Liên kết xem trước trên các trang web khác sẽ hiển thị hình thu nhỏ ngay cả khi phương tiện được đánh dấu là nhạy cảm
+        title: Hiển thị phương tiện nhạy cảm trong bản xem trước OpenGraph
+      profile_directory:
+        desc_html: Cho phép người dùng có thể khám phá
+        title: Cho phép thư mục hồ sơ
+      registrations:
+        closed_message:
+          desc_html: Hiển thị trên frontpage khi đăng ký được đóng lại. Bạn có thể sử dụng thẻ HTML
+          title: Tin nhắn đăng ký đã đóng
+        deletion:
+          desc_html: Cho phép mọi người xóa tài khoản của họ
+          title: Xóa tài khoản
+        min_invite_role:
+          disabled: Không một ai
+          title: Cho phép lời mời bằng cách
+      registrations_mode:
+        modes:
+          approved: Yêu cầu phê duyệt để đăng ký
+          none: Không ai có thể đăng ký
+          open: Bất cứ ai cũng có thể đăng ký
+        title: Chế độ đăng ký
+      show_known_fediverse_at_about_page:
+        desc_html: Khi bị tắt, hãy giới hạn dòng thời gian công khai được liên kết từ trang đích để chỉ hiển thị nội dung cùng miền
+        title: Bao gồm nội dung được liên kết trên trang dòng thời gian công cộng không được xác thực
+      show_staff_badge:
+        desc_html: Hiển thị huy hiệu nhân viên trên trang người dùng
+        title: Hiển thị huy hiệu nhân viên
+      site_description:
+        desc_html: Đoạn giới thiệu về API. Mô tả những gì làm cho máy chủ Mastodon này đặc biệt và bất cứ điều gì quan trọng khác. Bạn có thể sử dụng các thẻ HTML, đặc biệt là <code>&lt;a&gt;</code> và <code>&lt;em&gt;</code> .
+        title: Mô tả máy chủ
+      site_description_extended:
+        desc_html: Một nơi tốt cho quy tắc ứng xử, quy tắc, hướng dẫn và những thứ khác khiến máy chủ của bạn khác biệt. Bạn có thể sử dụng thẻ HTML
+        title: Thông tin mở rộng tùy chỉnh
+      site_short_description:
+        desc_html: Hiển thị trong thanh bên và thẻ meta. Mô tả Mastodon là gì và điều gì làm cho máy chủ này trở nên đặc biệt trong một đoạn văn duy nhất.
+        title: Mô tả máy chủ ngắn
+      site_terms:
+        desc_html: Bạn có thể viết chính sách bảo mật của riêng bạn, điều khoản dịch vụ hoặc pháp lý khác. Bạn có thể sử dụng thẻ HTML
+        title: Điều khoản dịch vụ tùy chỉnh
+      site_title: Tên máy chủ
+      spam_check_enabled:
+        desc_html: Mastodon có thể tự động báo cáo các tài khoản gửi tin nhắn không mong muốn lặp đi lặp lại. Có thể có dương tính giả.
+        title: Tự động chống thư rác
+      thumbnail:
+        desc_html: Được sử dụng để xem trước thông qua OpenGraph và API. Khuyến nghị 1200x630px
+        title: Hình thu nhỏ của máy chủ
+      timeline_preview:
+        desc_html: Hiển thị liên kết đến dòng thời gian công khai trên trang đích và cho phép API truy cập vào dòng thời gian công khai mà không cần xác thực
+        title: Cho phép truy cập không xác thực vào dòng thời gian công cộng
+      title: Cài đặt Trang web
+      trendable_by_default:
+        desc_html: Ảnh hưởng đến các hashtag chưa được cho phép trước đây
+        title: Cho phép hashtags theo xu hướng mà không cần xem xét trước
+      trends:
+        desc_html: Hiển thị công khai các hashtag được xem xét trước đây hiện đang là xu hướng
+        title: Xu hướng hashtags
+    statuses:
+      back_to_account: Quay lại trang tài khoản
+      batch:
+        delete: Xóa bỏ
+        nsfw_off: Đánh dấu là không nhạy cảm
+        nsfw_on: Đánh dấu là nhạy cảm
+      deleted: Đã xóa
+      failed_to_execute: Không thể thực thi
+      media:
+        title: Phương tiện truyền thông
+      no_media: Không có phương tiện truyền thông
+      no_status_selected: Không có trạng thái nào được thay đổi vì không có trạng thái nào được chọn
+      title: Trạng thái tài khoản
+      with_media: Với phương tiện truyền thông
+    tags:
+      accounts_today: Sử dụng độc đáo ngày nay
+      accounts_week: Sử dụng độc đáo trong tuần này
+      breakdown: Phân tích sử dụng ngày nay theo nguồn
+      context: Bối cảnh
+      directory: Trong thư mục
+      in_directory: "%{count} trong thư mục"
+      last_active: Hoạt động lần cuối
+      most_popular: Phổ biến nhất
+      most_recent: Gần đây nhất
+      name: Dấu thăng
+      review: Xem lại tình trạng
+      reviewed: Đã đánh giá
+      title: Hashtags
+      trending_right_now: Xu hướng ngay bây giờ
+      unique_uses_today: "%{count} đăng ngày hôm nay"
+      unreviewed: Chưa được xem xét
+      updated_msg: Cài đặt hashtag được cập nhật thành công
+    title: Quản trị
+    warning_presets:
+      add_new: Thêm mới
+      delete: Xóa bỏ
+      edit: Biên tập
+      edit_preset: Chỉnh sửa cảnh báo đặt trước
+      title: Quản lý cài đặt trước cảnh báo
+  admin_mailer:
+    new_pending_account:
+      body: Các chi tiết của tài khoản mới dưới đây. Bạn có thể phê duyệt hoặc từ chối ứng dụng này.
+      subject: Tài khoản mới được xem xét trên %{instance} (%{username})
+    new_report:
+      body: "%{reporter} đã báo cáo %{target}"
+      body_remote: Ai đó từ %{domain} đã báo cáo %{target}
+      subject: Báo cáo mới cho %{instance} (# %{id})
+    new_trending_tag:
+      body: 'Hashtag # %{name} đang là xu hướng ngày nay, nhưng chưa được xem xét trước đây. Nó sẽ không được hiển thị công khai trừ khi bạn cho phép hoặc chỉ lưu biểu mẫu vì nó sẽ không bao giờ nghe về nó nữa.'
+      subject: Hashtag mới được xem xét trên %{instance} (# %{name})
+  aliases:
+    add_new: Tạo bí danh
+    created_msg: Tạo thành công một bí danh mới. Bây giờ bạn có thể bắt đầu di chuyển từ tài khoản cũ.
+    deleted_msg: Xóa thành công bí danh. Chuyển từ tài khoản này sang tài khoản này sẽ không còn có thể.
+    hint_html: Nếu bạn muốn chuyển từ tài khoản khác sang tài khoản này, tại đây bạn có thể tạo bí danh, điều này là bắt buộc trước khi bạn có thể tiến hành chuyển người theo dõi từ tài khoản cũ sang tài khoản này. Hành động này của chính nó là <strong>vô hại và có thể đảo ngược</strong> . <strong>Việc di chuyển tài khoản được bắt đầu từ tài khoản cũ</strong> .
+    remove: Bỏ liên kết bí danh
+  appearance:
+    advanced_web_interface: Giao diện web nâng cao
+    advanced_web_interface_hint: 'Nếu bạn muốn sử dụng toàn bộ chiều rộng màn hình của mình, giao diện web nâng cao cho phép bạn định cấu hình nhiều cột khác nhau để xem nhiều thông tin cùng lúc như bạn muốn: Trang chủ, thông báo, dòng thời gian được liên kết, bất kỳ số lượng danh sách và hashtag nào.'
+    animations_and_accessibility: Ảnh động và khả năng tiếp cận
+    confirmation_dialogs: Hộp thoại xác nhận
+    discovery: Khám phá
+    sensitive_content: Nội dung nhạy cảm
+    toot_layout: Bố cục Tút
+  application_mailer:
+    notification_preferences: Thay đổi tùy chọn email
+    salutation: "%{name},"
+    settings: 'Thay đổi tùy chọn email: %{link}'
+    view: 'Lượt xem:'
+    view_profile: Xem lí lịch
+    view_status: Trạng thái xem
+  applications:
+    created: Ứng dụng được tạo thành công
+    destroyed: Ứng dụng đã xóa thành công
+    invalid_url: URL được cung cấp không hợp lệ
+    regenerate_token: Tạo lại mã thông báo truy cập
+    token_regenerated: Mã thông báo 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!
+    your_token: Mã thông báo truy cập của bạn
+  auth:
+    apply_for_account: Yêu cầu một lời mời
+    change_password: Mật khẩu
+    checkbox_agreement_html: Tôi đồng ý với các <a href="%{rules_path}" target="_blank">quy tắc</a> và <a href="%{terms_path}" target="_blank">điều khoản dịch vụ của</a> <a href="%{rules_path}" target="_blank">máy chủ</a>
+    checkbox_agreement_without_rules_html: Tôi đồng ý với các <a href="%{terms_path}" target="_blank">điều khoản dịch vụ</a>
+    delete_account: Xóa tài khoản
+    delete_account_html: Nếu bạn muốn xóa tài khoản của mình, bạn có thể <a href="%{path}">tiến hành tại đây</a> . Bạn sẽ được yêu cầu xác nhận.
+    description:
+      prefix_invited_by_user: "@ %{name} mời bạn tham gia máy chủ này của Mastodon!"
+      prefix_sign_up: Đăng ký trên Mastodon ngay hôm nay!
+      suffix: Với một tài khoản, bạn sẽ có thể theo dõi mọi người, đăng cập nhật và trao đổi tin nhắn với người dùng từ bất kỳ máy chủ Mastodon nào và hơn thế nữa!
+    didnt_get_confirmation: Không nhận được hướng dẫn xác nhận?
+    forgot_password: Quên mật khẩu?
+    invalid_reset_password_token: Mã thông báo đặt lại mật khẩu không hợp lệ hoặc hết hạn. Vui lòng yêu cầu một cái mới.
+    login: Đăng nhập
+    logout: Đăng xuất
+    migrate_account: Chuyển đến một tài khoản khác
+    migrate_account_html: Nếu bạn muốn chuyển hướng tài khoản này sang một tài khoản khác, bạn có thể <a href="%{path}">định cấu hình nó ở đây</a> .
+    or_log_in_with: Hoặc đăng nhập bằng
+    providers:
+      cas: CAS
+      saml: SAML
+    register: Đăng ký
+    registration_closed: "%{instance} không chấp nhận thành viên mới"
+    resend_confirmation: Gửi lại hướng dẫn xác nhận
+    reset_password: Đặt lại mật khẩu
+    security: Bảo vệ
+    set_new_password: Đặt mật khẩu mới
+    setup:
+      email_below_hint_html: Nếu địa chỉ email dưới đây không chính xác, bạn có thể thay đổi địa chỉ tại đây và nhận email xác nhận mới.
+      email_settings_hint_html: Email xác nhận đã được gửi tới %{email}. Nếu địa chỉ email đó không chính xác, bạn có thể thay đổi nó trong cài đặt tài khoản.
+      title: Thiết lập
+    status:
+      account_status: Tình trạng tài khoản
+      confirming: Chờ xác nhận e-mail được hoàn thành.
+      functional: Tài khoản của bạn đã hoạt động đầy đủ.
+      pending: Ứng dụng của bạn đang chờ xem xét bởi nhân viên của chúng tôi. Điều này có thể mất một thời gian. Bạn sẽ nhận được e-mail nếu đơn đăng ký của bạn được chấp thuận.
+      redirecting_to: Tài khoản của bạn không hoạt động vì hiện đang chuyển hướng đến %{acct}.
+    trouble_logging_in: Gặp sự cố khi đăng nhập?
+  authorize_follow:
+    already_following: Bạn đã theo dõi tài khoản này
+    error: Thật không may, đã xảy ra lỗi khi tra cứu tài khoản từ xa
+    follow: Theo
+    follow_request: 'Bạn đã gửi yêu cầu theo dõi tới:'
+    following: 'Sự thành công! Bạn đang theo dõi:'
+    post_follow:
+      close: Hoặc, bạn chỉ có thể đóng cửa sổ này.
+      return: Hiển thị hồ sơ của người dùng
+      web: Truy cập web
+    title: Thực hiện theo %{acct}
+  challenge:
+    confirm: Tiếp tục
+    hint_html: "<strong>Mẹo:</strong> Chúng tôi sẽ không hỏi lại mật khẩu của bạn trong giờ tiếp theo."
+    invalid_password: Mật khẩu không hợp lệ
+    prompt: Xác nhận mật khẩu để tiếp tục
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count}g"
+      about_x_months: "%{count}th"
+      about_x_years: "%{count}n"
+      almost_x_years: "%{count}n"
+      half_a_minute: Vừa nãy
+      less_than_x_minutes: "%{count}p"
+      less_than_x_seconds: Vừa nãy
+      over_x_years: "%{count}n"
+      x_days: "%{count}n"
+      x_minutes: "%{count}p"
+      x_months: "%{count}th"
+      x_seconds: "%{count}g"
+  deletes:
+    challenge_not_passed: Thông tin bạn nhập không chính xác
+    confirm_password: Nhập mật khẩu hiện tại của bạn để xác minh danh tính của bạn
+    confirm_username: Nhập tên người dùng của bạn để xác nhận thủ tục
+    proceed: Xóa tài khoản
+    success_msg: Tài khoản của bạn đã được xóa thành công
+    warning:
+      before: 'Trước khi tiếp tục, xin vui lòng đọc các ghi chú cẩn thận:'
+      caches: Nội dung đã được lưu trữ bởi các máy chủ khác có thể tồn tại
+      data_removal: Bài viết của bạn và dữ liệu khác sẽ bị xóa vĩnh viễn
+      email_change_html: Bạn có thể <a href="%{path}">thay đổi địa chỉ email</a> mà không cần xóa tài khoản của bạn
+      email_contact_html: Nếu nó vẫn không đến, bạn có thể gửi e-mail <a href="mailto:%{email}">%{email}</a> để được giúp đỡ
+      email_reconfirmation_html: Nếu bạn không nhận được email xác nhận, bạn có thể <a href="%{path}">yêu cầu lại</a>
+      irreversible: Bạn sẽ không thể khôi phục hoặc kích hoạt lại tài khoản của mình
+      more_details_html: Để biết thêm chi tiết, xem <a href="%{terms_path}">chính sách bảo mật</a> .
+      username_available: Tên người dùng của bạn sẽ có sẵn một lần nữa
+      username_unavailable: Tên người dùng của bạn sẽ không có sẵn
+  directories:
+    directory: Thư mục hồ sơ
+    explanation: Khám phá người dùng dựa trên sở thích của họ
+    explore_mastodon: Khám phá %{title}
+  domain_validator:
+    invalid_domain: không phải là một tên miền hợp lệ
+  errors:
+    '400': Yêu cầu bạn gửi không hợp lệ hoặc không đúng.
+    '403': Bạn không có quyền xem trang này.
+    '404': Trang bạn đang tìm kiếm không có ở đây.
+    '406': Trang này không có sẵn ở định dạng được yêu cầu.
+    '410': Trang bạn đang tìm kiếm không còn tồn tại ở đây nữa.
+    '422':
+      content: Xác minh bảo mật thất bại. Bạn đang chặn cookie?
+      title: Xác minh bảo mật không thành công
+    '429': Điều chỉnh
+    '500':
+      content: Chúng tôi xin lỗi, nhưng đã xảy ra sự cố.
+      title: Trang này không đúng
+    '503': Trang không thể được phục vụ do lỗi máy chủ tạm thời.
+    noscript_html: Để sử dụng ứng dụng web Mastodon, vui lòng bật JavaScript. Ngoài ra, hãy thử một trong những <a href="%{apps_path}">ứng dụng gốc</a> cho Mastodon cho nền tảng của bạn.
+  existing_username_validator:
+    not_found: không thể tìm thấy người dùng cục bộ với tên người dùng đó
+    not_found_multiple: không thể tìm thấy %{usernames}
+  exports:
+    archive_takeout:
+      date: Ngày
+      download: Tải về kho lưu trữ của bạn
+      hint_html: Bạn có thể yêu cầu một kho lưu trữ các <strong>tút và phương tiện được tải lên</strong> . Dữ liệu đã xuất sẽ ở định dạng ActivityPub, có thể đọc được bởi bất kỳ phần mềm tuân thủ nào. Bạn có thể yêu cầu một kho lưu trữ cứ sau 7 ngày.
+      in_progress: Biên dịch kho lưu trữ của bạn ...
+      request: Yêu cầu kho lưu trữ của bạn
+      size: Kích thước
+    blocks: Bạn chặn
+    csv: CSV
+    domain_blocks: Khối miền
+    lists: Danh sách
+    mutes: Bạn câm
+    storage: Phương tiện lưu trữ
+  featured_tags:
+    add_new: Thêm mới
+    errors:
+      limit: Bạn đã làm nổi bật số lượng hashtag tối đa
+    hint_html: "<strong>Hashtags đặc trưng là gì?</strong> Chúng được hiển thị nổi bật trên hồ sơ công khai của bạn và cho phép mọi người duyệt các bài đăng công khai của bạn cụ thể theo các hashtag đó. Chúng là một công cụ tuyệt vời để theo dõi các công trình sáng tạo hoặc các dự án dài hạn."
+  filters:
+    contexts:
+      home: Dòng thời gian
+      notifications: Thông báo
+      public: Mốc thời gian công cộng
+      thread: Cuộc trò chuyện
+    edit:
+      title: Chỉnh sửa bộ lọc
+    errors:
+      invalid_context: Không có hoặc bối cảnh không hợp lệ được cung cấp
+      invalid_irreversible: Lọc không thể đảo ngược chỉ hoạt động với bối cảnh nhà hoặc thông báo
+    index:
+      delete: Xóa bỏ
+      title: Bộ lọc
+    new:
+      title: Thêm bộ lọc mới
+  footer:
+    developers: Nhà phát triển
+    more: Hơn…
+    resources: Tài nguyên
+    trending_now: Đang là xu hướng
+  generic:
+    all: Tất cả
+    changes_saved_msg: Thay đổi được lưu thành công!
+    copy: Sao chép
+    no_batch_actions_available: Không có hành động hàng loạt có sẵn trên trang này
+    order_by: Đặt bởi
+    save_changes: Lưu thay đổi
+    validation_errors:
+      other: Một cái gì đó không hoàn toàn đúng! Vui lòng xem lại lỗi %{count} bên dưới
+  html_validator:
+    invalid_markup: 'chứa đánh dấu HTML không hợp lệ: %{error}'
+  identity_proofs:
+    active: Hoạt động
+    authorize: Vâng, ủy quyền
+    authorize_connection_prompt: Cho phép kết nối mật mã này?
+    errors:
+      failed: Kết nối mật mã không thành công. Vui lòng thử lại từ %{provider}.
+      keybase:
+        invalid_token: Mã thông báo cơ sở chính là băm chữ ký và phải là 66 ký tự hex
+        verification_failed: Keybase không nhận ra mã thông báo này là chữ ký của người dùng Keybase %{kb_username}. Vui lòng thử lại từ Keybase.
+      wrong_user: Không thể tạo bằng chứng cho %{proving} trong khi đăng nhập là %{current}. Đăng nhập bằng %{proving} và thử lại.
+    explanation_html: Tại đây, bạn có thể kết nối mật mã các danh tính khác của mình, chẳng hạn như hồ sơ Keybase. Điều này cho phép người khác gửi cho bạn tin nhắn được mã hóa và tin tưởng nội dung bạn gửi cho họ.
+    i_am_html: Tôi là %{username} trên %{service}.
+    identity: Danh tính
+    inactive: Không hoạt động
+    publicize_checkbox: 'Và tút này:'
+    publicize_toot: 'Nó đã được chứng minh! Tôi là %{username} trên %{service}: %{url}'
+    status: Tình trạng xác minh
+    view_proof: Xem bằng chứng
+  imports:
+    modes:
+      merge: Hợp nhất
+      merge_long: Giữ hồ sơ hiện có và thêm những cái mới
+      overwrite: Ghi đè
+      overwrite_long: Thay thế các bản ghi hiện tại bằng những cái mới
+    preface: Bạn có thể nhập dữ liệu mà bạn đã xuất từ một máy chủ khác, chẳng hạn như danh sách những người bạn đang theo dõi hoặc chặn.
+    success: Dữ liệu của bạn đã được tải lên thành công và bây giờ sẽ được xử lý trong thời gian tới hạn
+    types:
+      blocking: Danh sách chặn
+      domain_blocking: Danh sách chặn tên miền
+      following: Theo danh sach
+      muting: Danh sách tắt tiếng
+    upload: Tải lên
+  in_memoriam_html: Trong bản ghi nhớ.
+  invites:
+    delete: Vô hiệu hóa
+    expired: Đã hết hạn
+    expires_in:
+      '1800': 30 phút
+      '21600': 6 tiếng
+      '3600': 1 giờ
+      '43200': 12 giờ
+      '604800': 1 tuần
+      '86400': 1 ngày
+    expires_in_prompt: Không bao giờ
+    generate: Tạo liên kết mời
+    invited_by: 'Bạn đã được mời bởi:'
+    max_uses:
+      other: "%{count} sử dụng"
+    max_uses_prompt: Không giới hạn
+    prompt: Tạo và chia sẻ liên kết với những người khác để cấp quyền truy cập vào máy chủ này
+    table:
+      expires_at: Hết hạn
+      uses: Công dụng
+    title: Mời mọi người
+  lists:
+    errors:
+      limit: Bạn đã đạt đến số lượng danh sách tối đa
+  media_attachments:
+    validations:
+      images_and_video: Không thể đính kèm video vào trạng thái đã chứa hình ảnh
+      too_many: Không thể đính kèm hơn 4 tệp
+  migrations:
+    acct: Chuyển đến
+    cancel: Hủy chuyển hướng
+    cancel_explanation: Hủy chuyển hướng sẽ kích hoạt lại tài khoản hiện tại của bạn, nhưng sẽ không mang lại những người theo dõi đã được chuyển đến tài khoản đó.
+    cancelled_msg: Đã hủy thành công chuyển hướng.
+    errors:
+      already_moved: là cùng một tài khoản bạn đã chuyển đến
+      missing_also_known_as: không tham chiếu lại tài khoản này
+      move_to_self: không thể là tài khoản hiện tại
+      not_found: không thể được tìm thấy
+      on_cooldown: Bạn đang trong thời gian hồi chiêu
+    followers_count: Người theo dõi tại thời điểm di chuyển
+    incoming_migrations: Chuyển từ một tài khoản khác
+    incoming_migrations_html: Để chuyển từ tài khoản khác sang tài khoản này, trước tiên bạn cần <a href="%{path}">tạo bí danh tài khoản</a> .
+    moved_msg: Tài khoản của bạn hiện đang chuyển hướng đến %{acct} và những người theo dõi của bạn đang được chuyển đi.
+    not_redirecting: Tài khoản của bạn hiện không chuyển hướng đến bất kỳ tài khoản nào khác.
+    on_cooldown: Gần đây bạn đã di chuyển tài khoản của bạn. Chức năng này sẽ trở nên khả dụng một lần nữa sau %{count} ngày.
+    past_migrations: Di cư trong quá khứ
+    proceed_with_move: Di chuyển người theo dõi
+    redirecting_to: Tài khoản của bạn đang chuyển hướng đến %{acct}.
+    set_redirect: Đặt chuyển hướng
+    warning:
+      backreference_required: Tài khoản mới trước tiên phải được cấu hình để tham chiếu lại tài khoản này
+      before: 'Trước khi tiếp tục, xin vui lòng đọc các ghi chú cẩn thận:'
+      cooldown: Sau khi di chuyển, có thời gian hồi chiêu, trong đó bạn sẽ không thể di chuyển nữa
+      disabled_account: Tài khoản hiện tại của bạn sẽ không thể sử dụng đầy đủ sau đó. Tuy nhiên, bạn sẽ có quyền truy cập để xuất dữ liệu cũng như kích hoạt lại.
+      followers: Hành động này sẽ chuyển tất cả người theo dõi từ tài khoản hiện tại sang tài khoản mới
+      only_redirect_html: Ngoài ra, bạn <a href="%{path}">chỉ</a> có thể <a href="%{path}">đưa ra một chuyển hướng trên hồ sơ của bạn</a> .
+      other_data: Không có dữ liệu khác sẽ được di chuyển tự động
+      redirect: Hồ sơ tài khoản hiện tại của bạn sẽ được cập nhật với thông báo chuyển hướng và bị loại khỏi các tìm kiếm
+  moderation:
+    title: Điều độ
+  notification_mailer:
+    digest:
+      action: Xem tất cả các thông báo
+      body: Dưới đây là một bản tóm tắt ngắn gọn về các tin nhắn bạn đã bỏ lỡ kể từ lần truy cập trước vào %{since}
+      mention: "%{name} đã đề cập đến bạn trong:"
+      new_followers_summary:
+        other: Ngoài ra, bạn đã có được %{count} người theo dõi mới trong khi đi xa! Kinh ngạc!
+      subject:
+        other: "%{count} thông báo mới kể từ lần truy cập trước của bạn"
+      title: Khi bạn vắng mặt ...
+    favourite:
+      body: 'Trạng thái của bạn đã được yêu thích bởi %{name}:'
+      subject: "%{name} yêu thích trạng thái của bạn"
+      title: Yêu thích mới
+    follow:
+      body: "%{name} hiện đang theo dõi bạn!"
+      subject: "%{name} hiện đang theo dõi bạn"
+      title: Người theo dõi mới
+    follow_request:
+      action: Quản lý theo yêu cầu
+      body: "%{name} đã yêu cầu theo dõi bạn"
+      subject: 'Người theo dõi đang chờ xử lý: %{name}'
+      title: Yêu cầu theo dõi mới
+    mention:
+      action: Đáp lại
+      body: 'Bạn đã được đề cập bởi %{name} trong:'
+      subject: Bạn đã được đề cập bởi %{name}
+      title: Đề cập mới
+    reblog:
+      body: 'Trạng thái của bạn đã được loan tin bởi %{name}:'
+      subject: "%{name} đã loan tin trạng thái của bạn"
+      title: Tăng mới
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: B
+          million: M
+          quadrillion: Q
+          thousand: K
+          trillion: T
+  pagination:
+    newer: Mới hơn
+    next: Kế tiếp
+    older: Lớn hơn
+    prev: Trước đó
+    truncate: Giáo dục
+  polls:
+    errors:
+      already_voted: Bạn đã bình chọn trong cuộc bình chọn này
+      duplicate_options: chứa các mục trùng lặp
+      duration_too_long: quá xa trong tương lai
+      duration_too_short: quá sớm
+      expired: Cuộc thăm dò đã kết thúc
+      invalid_choice: Lựa chọn không tồn tại
+      over_character_limit: không thể dài hơn %{max} ký tự mỗi ký tự
+      too_few_options: phải có nhiều hơn một mục
+      too_many_options: không thể chứa nhiều hơn %{max}
+  preferences:
+    other: Khác
+    posting_defaults: Đăng mặc định
+    public_timelines: Mốc thời gian công cộng
+  relationships:
+    activity: Hoạt động tài khoản
+    dormant: Không hoạt động
+    last_active: Hoạt động lần cuối
+    most_recent: Gần đây nhất
+    moved: Đã chuyển
+    mutual: Tương thân
+    primary: Sơ cấp
+    relationship: Mối quan hệ
+    remove_selected_domains: Xóa tất cả người theo dõi khỏi các miền đã chọn
+    remove_selected_followers: Xóa những người theo dõi đã chọn
+    remove_selected_follows: Hủy theo dõi người dùng đã chọn
+    status: Tình trạng tài khoản
+  remote_follow:
+    acct: Nhập tên người dùng @ tên miền bạn muốn hành động từ
+    missing_resource: Không thể tìm thấy URL chuyển hướng cần thiết cho tài khoản của bạn
+    no_account_html: Không có tài khoản? Bạn có thể <a href='%{sign_up_path}' target='_blank'>đăng ký tại đây</a>
+    proceed: Tiến hành theo
+    prompt: 'Bạn sẽ làm theo:'
+    reason_html: "<strong>Tại sao bước này là cần thiết?</strong> <code>%{instance}</code> có thể không phải là máy chủ nơi bạn đã đăng ký, vì vậy chúng tôi cần chuyển hướng bạn đến máy chủ nhà của bạn trước."
+  remote_interaction:
+    favourite:
+      proceed: Tiếp tục yêu thích
+      prompt: 'Bạn muốn yêu thích tút này:'
+    reblog:
+      proceed: Tiến hành để loan tin
+      prompt: 'Bạn muốn loan tin hoạt động này:'
+    reply:
+      proceed: Tiến hành trả lời
+      prompt: 'Bạn muốn trả lời tút này:'
+  scheduled_statuses:
+    over_daily_limit: Bạn đã vượt quá giới hạn của các tút được lên lịch %{limit} cho ngày hôm đó
+    over_total_limit: Bạn đã vượt quá giới hạn của các tút theo lịch trình %{limit}
+    too_soon: Ngày dự kiến phải trong tương lai
+  sessions:
+    activity: Hoạt động cuối
+    browser: Trình duyệt
+    browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Điện tử
+      firefox: Firefox
+      generic: Trình duyệt không xác định
+      ie: trình duyệt web IE
+      micro_messenger: MicroMes hành khách
+      nokia: Trình duyệt Nokia S40 Ovi
+      opera: Opera
+      otter: Rái cá
+      phantom_js: PhantomJS
+      qq: Trình duyệt QQ
+      safari: cuộc đi săn, cuộc hành trình
+      uc_browser: Trình duyệt UC
+      weibo: Weibo
+    current_session: Phiên hiện tại
+    description: "%{browser} trên %{platform}"
+    explanation: Đây là các trình duyệt web hiện đang đăng nhập vào tài khoản Mastodon của bạn.
+    ip: IP
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: ChromeOS
+      firefox_os: Hệ điều hành Firefox
+      ios: iOS
+      linux: Linux
+      mac: Mac
+      other: chưa rõ nền tảng
+      windows: các cửa sổ
+      windows_mobile: Windows di động
+      windows_phone: Điện thoại Windows
+    revoke: Thu hồi
+    revoke_success: Phiên thu hồi thành công
+    title: Phiên
+  settings:
+    account: Tài khoản
+    account_settings: Cài đặt tài khoản
+    aliases: Bí danh tài khoản
+    appearance: Xuất hiện
+    authorized_apps: Ứng dụng được ủy quyền
+    back: Quay lại Mastodon
+    delete: Xóa tài khoản
+    development: Phát triển
+    edit_profile: Chỉnh sửa hồ sơ
+    export: Xuất dữ liệu
+    featured_tags: Hashtags nổi bật
+    identity_proofs: Bằng chứng nhận dạng
+    import: Nhập khẩu
+    import_and_export: Nhập khẩu và xuất khẩu
+    migrate: Di chuyển tài khoản
+    notifications: Thông báo
+    preferences: Sở thích
+    profile: Hồ sơ
+    relationships: Theo dõi và theo dõi
+    two_factor_authentication: Xác thực hai yếu tố
+  spam_check:
+    spam_detected: Đây là một báo cáo tự động. Thư rác đã được phát hiện.
+  statuses:
+    attached:
+      description: 'Đã đính kèm: %{attached}'
+      image:
+        other: hình ảnh %{count}
+      video:
+        other: video %{count}
+    boosted_from_html: Được loan tin từ %{acct_link}
+    content_warning: 'Cảnh báo nội dung: %{warning}'
+    disallowed_hashtags:
+      other: 'chứa các hashtag không được phép: %{tags}'
+    language_detection: Tự động phát hiện ngôn ngữ
+    open_in_web: Mở trên web
+    over_character_limit: vượt quá giới hạn ký tự của %{max}
+    pin_errors:
+      limit: Bạn đã ghim số lượng tút tối đa
+      ownership: Tút của người khác không thể được ghim
+      private: tút không công khai không thể được ghim
+      reblog: Không thể được ghim Loan in
+    poll:
+      total_people:
+        other: "%{count} người"
+      total_votes:
+        other: "%{count} phiếu bầu"
+      vote: Bỏ phiếu
+    show_more: Cho xem nhiều hơn
+    sign_in_to_participate: Đăng nhập để tham gia vào cuộc trò chuyện
+    title: "%{name}: &quot;%{quote}&quot;"
+    visibilities:
+      private: Chỉ theo dõi
+      private_long: Chỉ hiển thị cho người theo dõi
+      public: Công cộng
+      public_long: Mọi người có thể thấy
+      unlisted: Chưa niêm yết
+      unlisted_long: Mọi người đều có thể xem, nhưng không được liệt kê trên các mốc thời gian công khai
+  stream_entries:
+    pinned: Tút đã ghim
+    reblogged: loan tin
+    sensitive_content: Nội dung nhạy cảm
+  tags:
+    does_not_match_previous_name: không khớp với tên trước
+  terms:
+    body_html: "<h2> Chính sách bảo mật </h2><h3 id=\"collect\"> Chúng ta đã thu thập được thông tin gì rồi? </h3><ul><li> <em>Thông tin tài khoản cơ bản</em> : Nếu bạn đăng ký trên máy chủ này, bạn có thể được yêu cầu nhập tên người dùng, địa chỉ email và mật khẩu. Bạn cũng có thể nhập thông tin hồ sơ bổ sung như tên hiển thị và tiểu sử và tải lên hình ảnh hồ sơ và hình ảnh tiêu đề. Tên người dùng, tên hiển thị, tiểu sử, ảnh hồ sơ và hình ảnh tiêu đề luôn được liệt kê công khai. </li><li> <em>Bài đăng, theo dõi và thông tin công khai khác</em> : Danh sách những người bạn theo dõi được liệt kê công khai, điều này cũng đúng với những người theo dõi bạn. Khi bạn gửi tin nhắn, ngày và giờ được lưu trữ cũng như ứng dụng bạn đã gửi tin nhắn từ đó. Tin nhắn có thể chứa tệp đính kèm phương tiện, chẳng hạn như hình ảnh và video. Bài viết công khai và chưa niêm yết có sẵn công khai. Khi bạn có một bài đăng trên hồ sơ của bạn, đó cũng là thông tin có sẵn công khai. Bài đăng của bạn được gửi đến những người theo dõi của bạn, trong một số trường hợp, điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và các bản sao được lưu trữ ở đó. Khi bạn xóa bài viết, điều này cũng được gửi đến những người theo dõi của bạn. Hành động đăng ký lại hoặc yêu thích một bài đăng khác luôn được công khai. </li><li> <em>Bài đăng trực tiếp và chỉ dành cho người theo dõi</em> : Tất cả các bài đăng được lưu trữ và xử lý trên máy chủ. Các bài đăng chỉ dành cho người theo dõi được gửi đến những người theo dõi và người dùng của bạn được đề cập trong đó và các bài đăng trực tiếp chỉ được gửi cho người dùng được đề cập trong đó. Trong một số trường hợp, điều đó có nghĩa là chúng được gửi đến các máy chủ khác nhau và các bản sao được lưu trữ ở đó. Chúng tôi thực hiện một nỗ lực thiện chí để giới hạn quyền truy cập vào các bài đăng đó chỉ cho những người được ủy quyền, nhưng các máy chủ khác có thể không làm như vậy. Do đó, điều quan trọng là phải xem xét các máy chủ mà người theo dõi của bạn thuộc về. Bạn có thể chuyển đổi tùy chọn để phê duyệt và từ chối người theo dõi mới theo cách thủ công trong cài đặt. <em>Xin lưu ý rằng các nhà khai thác của máy chủ và bất kỳ máy chủ nhận nào cũng có thể xem các tin nhắn</em> đó và người nhận có thể chụp màn hình, sao chép hoặc chia sẻ lại chúng. <em>Không chia sẻ bất kỳ thông tin nguy hiểm nào trên Mastodon.</em> </li><li> <em>IP và siêu dữ liệu khác</em> : Khi bạn đăng nhập, chúng tôi ghi lại địa chỉ IP bạn đăng nhập, cũng như tên của ứng dụng trình duyệt của bạn. Tất cả các phiên đăng nhập có sẵn để bạn xem xét và hủy bỏ trong cài đặt. Địa chỉ IP mới nhất được sử dụng được lưu trữ tối đa 12 tháng. Chúng tôi cũng có thể giữ lại nhật ký máy chủ bao gồm địa chỉ IP của mọi yêu cầu đến máy chủ của chúng tôi. </li></ul><hr class=\"spacer\" /><h3 id=\"use\"> Chúng tôi sử dụng thông tin của bạn để làm gì? </h3><p> Bất kỳ thông tin nào chúng tôi thu thập từ bạn có thể được sử dụng theo các cách sau: </p><ul><li> Để cung cấp các chức năng cốt lõi của Mastodon. Bạn chỉ có thể tương tác với nội dung của người khác và đăng nội dung của riêng bạn khi bạn đăng nhập. Ví dụ: bạn có thể theo dõi người khác để xem các bài đăng kết hợp của họ trong dòng thời gian tại nhà được cá nhân hóa của bạn. </li><li> Để hỗ trợ kiểm duyệt cộng đồng, ví dụ so sánh địa chỉ IP của bạn với các địa chỉ đã biết khác để xác định trốn tránh hoặc vi phạm khác. </li><li> Địa chỉ email bạn cung cấp có thể được sử dụng để gửi cho bạn thông tin, thông báo về những người khác tương tác với nội dung của bạn hoặc gửi tin nhắn cho bạn và để trả lời các câu hỏi cũng như / hoặc các yêu cầu hoặc câu hỏi khác. </li></ul><hr class=\"spacer\" /><h3 id=\"protect\"> Làm thế nào để chúng tôi bảo vệ thông tin của bạn? </h3><p> Chúng tôi thực hiện nhiều biện pháp bảo mật để duy trì sự an toàn của thông tin cá nhân của bạn khi bạn nhập, gửi hoặc truy cập thông tin cá nhân của bạn. Trong số những thứ khác, phiên trình duyệt của bạn, cũng như lưu lượng giữa các ứng dụng và API của bạn, được bảo mật bằng SSL và mật khẩu của bạn được băm bằng thuật toán một chiều mạnh mẽ. Bạn có thể kích hoạt xác thực hai yếu tố để tiếp tục truy cập an toàn vào tài khoản của mình. </p><hr class=\"spacer\" /><h3 id=\"data-retention\"> Chính sách lưu giữ dữ liệu của chúng tôi là gì? </h3><p> Chúng tôi sẽ thực hiện một nỗ lực đức tin tốt để: </p><ul><li> Giữ lại nhật ký máy chủ chứa địa chỉ IP của tất cả các yêu cầu đến máy chủ này, cho đến khi các nhật ký đó được lưu giữ, không quá 90 ngày. </li><li> Giữ lại các địa chỉ IP được liên kết với người dùng đã đăng ký không quá 12 tháng. </li></ul><p> Bạn có thể yêu cầu và tải xuống một kho lưu trữ nội dung của bạn, bao gồm các bài đăng, tệp đính kèm phương tiện, ảnh hồ sơ và hình ảnh tiêu đề. </p><p> Bạn có thể xóa tài khoản của mình bất cứ lúc nào. </p><hr class=\"spacer\"/><h3 id=\"cookies\"> Chúng ta có sử dụng cookie không? </h3><p> Đúng. Cookies là các tệp nhỏ mà một trang web hoặc nhà cung cấp dịch vụ của nó chuyển vào ổ cứng máy tính của bạn thông qua trình duyệt Web (nếu bạn cho phép). Những cookie này cho phép trang web nhận ra trình duyệt của bạn và, nếu bạn có tài khoản đã đăng ký, hãy liên kết nó với tài khoản đã đăng ký của bạn. </p><p> Chúng tôi sử dụng cookie để hiểu và lưu các tùy chọn của bạn cho các lần truy cập trong tương lai. </p><hr class=\"spacer\" /><h3 id=\"disclose\"> Chúng tôi có được công bố bất cứ thông tin nào ra bên ngoài không? </h3><p> Chúng tôi không bán, trao đổi hoặc chuyển nhượng cho các bên ngoài thông tin nhận dạng cá nhân của bạn. Điều này không bao gồm các bên thứ ba đáng tin cậy hỗ trợ chúng tôi điều hành trang web của chúng tôi, tiến hành kinh doanh hoặc phục vụ bạn, miễn là các bên đó đồng ý giữ bí mật thông tin này. Chúng tôi cũng có thể tiết lộ thông tin của bạn khi chúng tôi tin rằng việc phát hành là phù hợp để tuân thủ luật pháp, thực thi chính sách trang web của chúng tôi hoặc bảo vệ quyền, tài sản hoặc an toàn của chúng tôi hoặc của người khác. </p><p> Nội dung công khai của bạn có thể được tải xuống bởi các máy chủ khác trong mạng. Các bài đăng công khai và chỉ dành cho người theo dõi của bạn được gửi đến các máy chủ nơi người theo dõi của bạn cư trú và tin nhắn trực tiếp được gửi đến máy chủ của người nhận, cho đến khi những người theo dõi hoặc người nhận đó cư trú trên một máy chủ khác với máy chủ này. </p><p> Khi bạn cho phép ứng dụng sử dụng tài khoản của mình, tùy thuộc vào phạm vi quyền bạn phê duyệt, ứng dụng có thể truy cập thông tin hồ sơ công khai, danh sách sau đây, người theo dõi, danh sách của bạn, tất cả bài đăng và mục yêu thích của bạn. Các ứng dụng không bao giờ có thể truy cập địa chỉ e-mail hoặc mật khẩu của bạn. </p><hr class=\"spacer\" /><h3 id=\"children\"> Sử dụng trang web của trẻ em </h3><p> Nếu máy chủ này ở EU hoặc EEA: Trang web của chúng tôi, các sản phẩm và dịch vụ đều hướng đến những người ít nhất 16 tuổi. Nếu bạn dưới 16 tuổi, theo các yêu cầu của GDPR ( <a href=\"https://en.wikipedia.org/wiki/General_Data_Protection_Regulation\">Quy định bảo vệ dữ liệu chung</a> ) không sử dụng trang web này. </p><p> Nếu máy chủ này ở Hoa Kỳ: Trang web của chúng tôi, các sản phẩm và dịch vụ đều hướng đến những người ít nhất 13 tuổi. Nếu bạn dưới 13 tuổi, theo các yêu cầu của COPPA ( <a href=\"https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act\">Đạo luật bảo vệ quyền riêng tư trực tuyến của trẻ em</a> ) không sử dụng trang web này. </p><p> Yêu cầu pháp luật có thể khác nhau nếu máy chủ này ở khu vực tài phán khác. </p><hr class=\"spacer\" /><h3 id=\"changes\"> Thay đổi chính sách bảo mật của chúng tôi </h3><p> Nếu chúng tôi quyết định thay đổi chính sách bảo mật của mình, chúng tôi sẽ đăng những thay đổi đó trên trang này. </p><p> Tài liệu này là CC-BY-SA. Nó được cập nhật lần cuối vào ngày 7 tháng 3 năm 2018. </p><p> Ban đầu được điều chỉnh từ <a href=\"https://github.com/discourse/discourse\">chính sách quyền riêng tư của Nghị luận</a> . </p> \n"
+    title: "%{instance} Điều khoản dịch vụ và chính sách bảo mật"
+  themes:
+    contrast: Mastodon (Độ tương phản cao)
+    default: Mastodon (Tối)
+    mastodon-light: Mastodon (Ánh sáng)
+  time:
+    formats:
+      default: "% b %d,% Y,% H:% M"
+      month: "% b% Y"
+  two_factor_authentication:
+    code_hint: Nhập mã được tạo bởi ứng dụng xác thực của bạn để xác nhận
+    description_html: Nếu bạn kích hoạt <strong>xác thực hai yếu tố</strong> , đăng nhập sẽ yêu cầu bạn phải sở hữu điện thoại của mình, điều này sẽ tạo ra các mã thông báo để bạn nhập.
+    disable: Vô hiệu hóa
+    enable: Kích hoạt
+    enabled: Xác thực hai yếu tố được kích hoạt
+    enabled_success: Xác thực hai yếu tố được kích hoạt thành công
+    generate_recovery_codes: Tạo mã khôi phục
+    instructions_html: "<strong>Quét mã QR này vào Google Authenticator hoặc ứng dụng TOTP tương tự trên điện thoại của bạn</strong> . Từ giờ trở đi, ứng dụng đó sẽ tạo mã thông báo mà bạn sẽ phải nhập khi đăng nhập."
+    lost_recovery_codes: Mã khôi phục cho phép bạn lấy lại quyền truy cập vào tài khoản của mình nếu bạn mất điện thoại. Nếu bạn bị mất mã khôi phục, bạn có thể tạo lại chúng ở đây. Mã khôi phục cũ của bạn sẽ bị vô hiệu.
+    manual_instructions: 'Nếu bạn không thể quét mã QR và cần nhập thủ công, đây là bí mật văn bản đơn giản:'
+    recovery_codes: Mã phục hồi dự phòng
+    recovery_codes_regenerated: Mã khôi phục được phục hồi thành công
+    recovery_instructions_html: Nếu bạn mất quyền truy cập vào điện thoại, bạn có thể sử dụng một trong các mã khôi phục bên dưới để lấy lại quyền truy cập vào tài khoản của mình. <strong>Giữ mã khôi phục an toàn</strong> . Ví dụ, bạn có thể in chúng và lưu trữ chúng với các tài liệu quan trọng khác.
+    setup: Thiết lập
+    wrong_code: Mã đã nhập không hợp lệ! Thời gian máy chủ và thời gian thiết bị có đúng không?
+  user_mailer:
+    backup_ready:
+      explanation: Bạn đã yêu cầu sao lưu toàn bộ tài khoản Mastodon của mình. Bây giờ đã sẵn sàng để tải về!
+      subject: Kho lưu trữ của bạn đã sẵn sàng để tải về
+      title: Lưu trữ mang đi
+    warning:
+      explanation:
+        disable: Trong khi tài khoản của bạn bị đóng băng, dữ liệu tài khoản của bạn vẫn còn nguyên, nhưng bạn không thể thực hiện bất kỳ hành động nào cho đến khi được mở khóa.
+        silence: Mặc dù tài khoản của bạn bị hạn chế, nhưng chỉ những người đã theo dõi bạn mới thấy tút của bạn trên máy chủ này và bạn có thể bị loại khỏi các danh sách công khai khác nhau. Tuy nhiên, những người khác vẫn có thể tự theo dõi bạn.
+        suspend: Tài khoản của bạn đã bị treo và tất cả các tút và tệp phương tiện đã tải lên của bạn đã bị xóa khỏi máy chủ này và các máy chủ nơi bạn có người theo dõi.
+      get_in_touch: Bạn có thể trả lời e-mail này để liên lạc với nhân viên của %{instance}.
+      review_server_policies: Xem lại chính sách máy chủ
+      statuses: 'Cụ thể, cho:'
+      subject:
+        disable: Tài khoản của bạn %{acct} đã bị đóng băng
+        none: Cảnh báo cho %{acct}
+        silence: Tài khoản của bạn %{acct} đã bị giới hạn
+        suspend: Tài khoản của bạn %{acct} đã bị treo
+      title:
+        disable: Tài khoản bị đóng băng
+        none: Cảnh báo
+        silence: Tài khoản bị giới hạn
+        suspend: Toàn khoản bị đình chỉ
+    welcome:
+      edit_profile_action: Cài đặt hồ sơ
+      edit_profile_step: Bạn có thể tùy chỉnh hồ sơ của mình bằng cách tải lên hình đại diện, tiêu đề, thay đổi tên hiển thị và hơn thế nữa. Nếu bạn muốn xem lại những người theo dõi mới trước khi họ được phép theo dõi bạn, bạn có thể khóa tài khoản của mình.
+      explanation: Dưới đây là một số lời khuyên để giúp bạn bắt đầu
+      final_action: Bắt đầu đăng bài
+      final_step: 'Bắt đầu đăng bài! Ngay cả khi không có người theo dõi, tin nhắn công khai của bạn có thể bị người khác nhìn thấy, ví dụ như trên dòng thời gian cùng miền và trong hashtag. Bạn có thể muốn giới thiệu bản thân về hashtag #intributiontions.'
+      full_handle: Xử lý đầy đủ của bạn
+      full_handle_hint: Đây là những gì bạn sẽ nói với bạn bè của mình để họ có thể nhắn tin hoặc theo dõi bạn từ một máy chủ khác.
+      review_preferences_action: Thay đổi sở thích
+      review_preferences_step: Đảm bảo đặt tùy chọn của bạn, chẳng hạn như email nào bạn muốn nhận hoặc mức độ riêng tư mà bạn muốn bài đăng của mình được mặc định. Nếu bạn không bị say tàu xe, bạn có thể chọn bật tự động phát GIF.
+      subject: Chào mừng đến với Mastodon
+      tip_federated_timeline: Dòng thời gian được liên kết là một khung nhìn rực lửa của mạng Mastodon. Nhưng nó chỉ bao gồm những người mà hàng xóm của bạn đã đăng ký, vì vậy nó không hoàn thành.
+      tip_following: Bạn theo dõi (các) quản trị viên máy chủ của bạn theo mặc định. Để tìm những người thú vị hơn, hãy kiểm tra các mốc thời gian cùng miền và liên kết.
+      tip_local_timeline: Dòng thời gian cùng miền là chế độ xem lửa của mọi người trên %{instance}. Đây là những người hàng xóm trực tiếp của bạn!
+      tip_mobile_webapp: Nếu trình duyệt trên điện thoại di động của bạn cung cấp cho bạn thêm Mastodon vào màn hình chính, bạn có thể nhận được thông báo đẩy. Nó hoạt động như một ứng dụng bản địa theo nhiều cách!
+      tips: Lời khuyên
+      title: Chào mừng bạn, %{name}!
+  users:
+    follow_limit_reached: Bạn không thể theo dõi nhiều hơn %{limit} người
+    invalid_email: Địa chỉ email không hợp lệ
+    invalid_otp_token: Mã hai yếu tố không hợp lệ
+    otp_lost_help_html: Nếu bạn mất quyền truy cập vào cả hai, bạn có thể liên lạc với %{email}
+    seamless_external_login: Bạn đã đăng nhập thông qua một dịch vụ bên ngoài, vì vậy cài đặt mật khẩu và e-mail không khả dụng.
+    signed_in_as: 'Đăng ký với tư cách là:'
+  verification:
+    explanation_html: 'Bạn có thể <strong>xác minh mình là chủ sở hữu của các liên kết trong siêu dữ liệu hồ sơ của bạn</strong> . Vì vậy, trang web được liên kết phải chứa một liên kết trở lại hồ sơ Mastodon của bạn. Liên kết trở lại <strong>phải</strong> có thuộc tính <code>rel=&quot;me&quot;</code> . Nội dung văn bản của liên kết không quan trọng. Đây là một ví dụ:'
+    verification: xác minh
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 49dd31bac..21b0ecf78 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -18,9 +18,12 @@ zh-CN:
     contact_unavailable: 未公开
     discover_users: 发现用户
     documentation: 文档
-    federation_hint_html: 在%{instance} 上拥有账户后,你可以关注任何 Mastodon 服务器或其他服务器上的人。
+    federation_hint_html: 在%{instance} 上拥有账号后,你可以关注任何 Mastodon 服务器或其他服务器上的人。
     get_apps: 尝试移动应用
     hosted_on: 一个在 %{domain} 上运行的 Mastodon 实例
+    instance_actor_flash: '这个账号是个虚拟帐号,不代表任何用户,只用来代表服务器本身。它用于和其它服务器互通,所以不应该被封禁,除非你想封禁整个实例。但是想封禁整个实例的时候,你应该用域名封禁。
+
+'
     learn_more: 了解详情
     privacy_policy: 隐私政策
     see_whats_happening: 看一看现在在发生什么
@@ -36,12 +39,16 @@ zh-CN:
       domain: 服务器
       reason: 原因
       rejecting_media: 来自这些服务器的媒体文件将不会被处理或存储,缩略图也不会显示,需要手动点击打开原始文件。
+      silenced: 来自这些服务器上的帖子将不会出现在公共时间线和会话中;此外,除非你关注了这些服务器上的用户,否则他们的互动不会产生通知。
+      suspended: 这些服务器的数据将不会被处理、存储或者交换,本站也将无法和来自这些服务器的用户互动或者交流。
+    unavailable_content_html: 通常来说,在Mastodon上,你可以浏览联邦宇宙中任何一台服务器上的内容,并且和上面的用户互动。但是这台服务器上会有一些挟制。
     user_count_after:
       other: 位用户
     user_count_before: 这里共注册有
     what_is_mastodon: Mastodon 是什么?
   accounts:
     choices_html: "%{name} 的推荐:"
+    endorsements_hint: 您可以以在web界面上推荐你关注的人,他们会出现在这里。
     featured_tags_hint: 您可以精选一些话题标签展示在这里。
     follow: 关注
     followers:
@@ -54,7 +61,7 @@ zh-CN:
     moved_html: "%{name} 已经迁移到 %{new_profile_link}:"
     network_hidden: 此信息不可用
     never_active: 从未活跃
-    nothing_here: 这里神马都没有!
+    nothing_here: 这里什么都没有!
     people_followed_by: "%{name} 关注的人"
     people_who_follow: 关注 %{name} 的人
     pin_errors:
@@ -67,6 +74,7 @@ zh-CN:
     roles:
       admin: 管理员
       bot: 机器人
+      group: 群组
       moderator: 监察员
     unavailable: 个人资料不可用
     unfollow: 取消关注
@@ -132,7 +140,7 @@ zh-CN:
       moderation_notes: 管理备忘
       most_recent_activity: 最后一次活跃的时间
       most_recent_ip: 最后一次活跃的 IP 地址
-      no_account_selected: 因为没有账户被选择,所以没有更改
+      no_account_selected: 因为没有帐号被选择,所以没有更改
       no_limits_imposed: 无限制
       not_subscribed: 未订阅
       pending: 待审核
@@ -298,8 +306,9 @@ zh-CN:
           suspend: 自动封禁
         title: 添加域名屏蔽
       private_comment: 私密评论
-      private_comment_hint: 版主只允许内部用户评论此域名
+      private_comment_hint: 给这一域名限制添加备注,供监察员内部使用
       public_comment: 公开评论
+      public_comment_hint: 给这一域名限制添加公开的评论,如果你推广你的域名限制列表的话,这些评论就会显示出来。
       reject_media: 拒绝接收媒体文件
       reject_media_hint: 删除本地已缓存的媒体文件,并且不再接收来自该域名的任何媒体文件。此选项不影响封禁
       reject_reports: 拒绝接收举报
@@ -329,9 +338,6 @@ zh-CN:
         create: 添加域名
         title: 添加电子邮件域名屏蔽
       title: 电子邮件域名屏蔽
-    followers:
-      back_to_account: 返回帐户
-      title: "%{acct} 的关注者"
     instances:
       by_domain: 域名
       delivery_available: 无法投递
@@ -372,17 +378,23 @@ zh-CN:
       pending: 等待中继确认
       save_and_enable: 保存并启用
       setup: 设置中继连接
-      signatures_not_enabled: 安全模式或白名单模式启用时中继将不会正常工作
+      signatures_not_enabled: 安全模式或白名单模式启用时,中继将不会正常工作
       status: 状态
       title: 中继
     report_notes:
       created_msg: 举报记录建立成功!
       destroyed_msg: 举报记录删除成功!
     reports:
+      account:
+        notes:
+          other: "%{count} 条笔记"
+        reports:
+          other: "%{count} 个报告"
       action_taken_by: 操作执行者
       are_you_sure: 你确定吗?
       assign_to_self: 接管
       assigned: 已接管的监察员
+      by_target_domain: 被举报账户的域名
       comment:
         none: 没有
       created_at: 举报时间
@@ -420,14 +432,16 @@ zh-CN:
         title: 自定义 CSS
       default_noindex:
         desc_html: 影响所有尚未更改此设置的用户
-        title: 默认将不会对用户建立索引
+        title: 默认不让用户被搜索引擎索引
       domain_blocks:
         all: 对所有人
         disabled: 不对任何人
         title: 查看域名屏蔽
-        users: 本地已登录用户
+        users: 对本地已登录用户
       domain_blocks_rationale:
-        title: 显示原理
+        title: 显示理由
+      enable_bootstrap_timeline_accounts:
+        title: 开启新用户默认关注功能
       hero:
         desc_html: 用于在首页展示。推荐分辨率 600×100px 以上。未指定的情况下将默认使用本站缩略图
         title: 主题图片
@@ -479,7 +493,7 @@ zh-CN:
         title: 自定义使用条款
       site_title: 本站名称
       spam_check_enabled:
-        desc_html: Mastodon可以自动隐藏和举报重复发送垃圾消息的账户。但是本功能有可能误伤无辜。
+        desc_html: Mastodon可以自动隐藏和举报重复发送垃圾消息的帐号。但是本功能有可能误伤无辜。
         title: 自动反垃圾
       thumbnail:
         desc_html: 用于在 OpenGraph 和 API 中显示预览图。推荐分辨率 1200×630px
@@ -492,7 +506,7 @@ zh-CN:
         desc_html: 影响以前未禁止的话题标签
         title: 允许在未审查的情况下将话题置为热门
       trends:
-        desc_html: 公开显示先前已审查的但当前热门的话题
+        desc_html: 公开显示先前已通过审核的当前热门话题
         title: 热门标签
     statuses:
       back_to_account: 返回帐户信息页
@@ -512,6 +526,7 @@ zh-CN:
       accounts_today: 今日活跃用户
       accounts_week: 本周活跃用户
       breakdown: 按来源分类今天的使用情况
+      context: 上下文
       directory: 在目录中
       in_directory: 目录中 %{count} 条
       last_active: 最近活动
@@ -522,9 +537,9 @@ zh-CN:
       reviewed: 已审核
       title: 话题标签
       trending_right_now: 当前热门
-      unique_uses_today: 今天发布 %{count} 条
+      unique_uses_today: 今天发布了 %{count} 条
       unreviewed: 未审核
-      updated_msg: 话题设置更新成功
+      updated_msg: 话题标签设置更新成功
     title: 管理
     warning_presets:
       add_new: 添加新条目
@@ -535,16 +550,19 @@ zh-CN:
   admin_mailer:
     new_pending_account:
       body: 新帐户的详细信息如下。您可以批准或拒绝此申请。
-      subject: 在 %{instance} 上有新账户 ( %{username}) 需要审核
+      subject: 在 %{instance} 上有新帐号 ( %{username}) 需要审核
     new_report:
       body: "%{reporter} 举报了用户 %{target}"
       body_remote: 来自 %{domain} 的用户举报了用户 %{target}
       subject: 来自 %{instance} 的用户举报(#%{id})
     new_trending_tag:
-      body: '今日的热门话题 #%{name} 之前未审核。直到你允许之前这个话题将不会公开显示,或保持原样让它石沉大海。'
-      subject: 在 %{instance} 有话题 (#%{name}) 待审核
+      body: '今日的热门话题 #%{name} 之前未经审核。直到你允许之前这个话题将不会公开显示,活着就保持原样让它石沉大海。'
+      subject: 在 %{instance} 有新话题 (#%{name}) 待审核
   aliases:
     add_new: 创建别名
+    created_msg: 成功创建了一个新别名。您现在可以从旧账户开始迁移了。
+    deleted_msg: 成功移除别名。已经无法从该帐户移动到此帐户了。
+    hint_html: 如果你想把另一个帐号迁移到这里,你可以先在这里创建一个别名。如果你想把关注者迁移过来,这一步是必须的。设置别名的操作时<strong>无害而且可以恢复的</strong>。<strong>帐号迁移的操作会从旧帐号开始</strong>。
     remove: 取消关联别名
   appearance:
     advanced_web_interface: 高级 web 界面
@@ -552,6 +570,10 @@ zh-CN:
     animations_and_accessibility: 动画和访问选项
     confirmation_dialogs: 确认对话框
     discovery: 发现
+    localization:
+      body: Mastdown 由志愿者翻译。
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: 每个人都可以参与翻译。
     sensitive_content: 敏感内容
     toot_layout: 嘟文布局
   application_mailer:
@@ -579,6 +601,7 @@ zh-CN:
     description:
       prefix_invited_by_user: "@%{name} 邀请您加入这个Mastodon服务器!"
       prefix_sign_up: 现在就注册 Mastodon!
+      suffix: 注册一个帐号,你就可以关注别人、发布嘟文、并和其它任何Mastodon服务器上的用户交流,而且还有其它更多功能!
     didnt_get_confirmation: 没有收到确认邮件?
     forgot_password: 忘记密码?
     invalid_reset_password_token: 密码重置令牌无效或已过期。请重新发起重置密码请求。
@@ -597,10 +620,15 @@ zh-CN:
     security: 帐户安全
     set_new_password: 设置新密码
     setup:
+      email_below_hint_html: 如果下面的电子邮箱地址是错误的,你可以在这里修改并重新发送新的确认邮件。
+      email_settings_hint_html: 确认邮件已经发送到%{email}。如果该邮箱地址不对,你可以在帐号设置里面修改。
       title: 初始设置
     status:
       account_status: 帐户状态
       confirming: 等待电子邮件确认完成。
+      functional: 您的帐号可以正常使用了。
+      pending: 工作人员正在审核您的申请。这需要花点时间。在申请被批准后,您将收到一封电子邮件。
+      redirecting_to: 您的帐户无效,因为它已被设置为跳转到 %{acct}
     trouble_logging_in: 登录有问题?
   authorize_follow:
     already_following: 你已经在关注此用户了
@@ -614,6 +642,8 @@ zh-CN:
       web: 返回本站
     title: 关注 %{acct}
   challenge:
+    confirm: 继续
+    hint_html: "<strong>注意:</strong>接下来一小时内我们不会再次要求您输入密码。"
     invalid_password: 无效密码
     prompt: 确认密码以继续
   datetime:
@@ -631,11 +661,20 @@ zh-CN:
       x_months: "%{count}个月"
       x_seconds: "%{count}秒"
   deletes:
+    challenge_not_passed: 您输入的信息不正确
     confirm_password: 输入你当前的密码来验证身份
+    confirm_username: 输入您的用户名以继续
     proceed: 删除帐户
     success_msg: 你的帐户已经成功删除
     warning:
+      before: 在删除前,请仔细阅读下列说明:
+      caches: 已被其他服务器缓存的内容可能还会保留
+      data_removal: 您的嘟文和其他数据将被永久删除
+      email_change_html: 您可以 <a href="%{path}">更换邮箱地址</a> 无需删除账号
+      email_contact_html: 如果它还没送到,你可以发邮件给 <a href="mailto:%{email}">%{email}</a> 寻求帮助。
+      email_reconfirmation_html: 如果您没有收到确认邮件,请点击 <a href="%{path}">重新发送</a> 。
       irreversible: 您将无法恢复或重新激活您的帐户
+      more_details_html: 更多细节,请查看 <a href="%{terms_path}">隐私政策</a> 。
       username_available: 您的用户名现在又可以使用了
       username_unavailable: 您的用户名仍将无法使用
   directories:
@@ -648,7 +687,7 @@ zh-CN:
     '400': 您提交的请求无效或格式不正确。
     '403': 你没有访问这个页面的权限。
     '404': 无法找到你所要访问的页面。
-    '406': This page is not available in the requested format.
+    '406': 页面无法处理请求。
     '410': 你所要访问的页面此处已不存在。
     '422':
       content: 无法确认登录信息。你是不是屏蔽了 Cookie?
@@ -657,7 +696,7 @@ zh-CN:
     '500':
       content: 抱歉,我们的后台出错了。
       title: 这个页面有问题
-    '503': The page could not be served due to a temporary server failure.
+    '503': 服务暂时不可用,无法请求该页面。
     noscript_html: 使用 Mastodon 网页版应用需要启用 JavaScript。你也可以选择适用于你的平台的 <a href="%{apps_path}">Mastodon 应用</a>。
   existing_username_validator:
     not_found: 在本站找不到此用户
@@ -673,7 +712,6 @@ zh-CN:
     blocks: 屏蔽的用户
     csv: CSV
     domain_blocks: 域名屏蔽
-    follows: 关注的用户
     lists: 列表
     mutes: 隐藏的用户
     storage: 媒体文件存储
@@ -707,6 +745,7 @@ zh-CN:
     all: 全部
     changes_saved_msg: 更改保存成功!
     copy: 复制
+    no_batch_actions_available: 本页面无可用批量操作
     order_by: 排序方式
     save_changes: 保存更改
     validation_errors:
@@ -777,21 +816,33 @@ zh-CN:
   migrations:
     acct: 新帐户的 用户名@域名
     cancel: 取消跳转
+    cancel_explanation: 取消跳转将会重新激活您当前的帐号,但是已经迁移到新账号的关注者不会回来。
     cancelled_msg: 成功取消跳转
     errors:
+      already_moved: 和您已经迁移过的帐号相同
+      missing_also_known_as: 没有引用此帐号
       move_to_self: 不能是当前帐户
       not_found: 找不到
       on_cooldown: 您正处于冷却状态
+    followers_count: 迁移时的关注者
+    incoming_migrations: 从其他帐号迁移
+    incoming_migrations_html: 要把另一个帐号移动到本帐号,首先您需要 <a href="%{path}">创建一个帐号别名</a> 。
+    moved_msg: 您的帐号现在会跳转到%{acct} ,同时关注者也会迁移过去 。
+    not_redirecting: 您的帐号当前未跳转到其他帐户。
+    on_cooldown: 您最近已经迁移过您的帐号。此功能将在%{count} 天后再次可用。
     past_migrations: 迁移记录
     proceed_with_move: 移动关注者
     redirecting_to: 您的帐户被跳转到了 %{acct}。
     set_redirect: 设置跳转
     warning:
-      backreference_required: 新账号必须先引用现在这个账号
+      backreference_required: 新账号必须先引用现在这个帐号
       before: 在继续前,请仔细阅读下列说明:
       cooldown: 移动后会有一个冷却期,在此期间您将无法再次移动
       disabled_account: 此后,您的当前帐户将无法使用。但是,您仍然有权导出数据或者重新激活。
       followers: 这步操作将把所有关注者从当前账户移动到新账户
+      only_redirect_html: 或者,你可以<a href="%{path}">只在你的帐号资料上设置一个跳转</a>。
+      other_data: 不会自动移动其他数据
+      redirect: 在收到一个跳转通知后,您当前的帐号资料将会更新,并被排除在搜索范围外
   moderation:
     title: 运营
   notification_mailer:
@@ -826,6 +877,10 @@ zh-CN:
       body: 你的嘟文被 %{name} 转嘟了:
       subject: "%{name} 转嘟了你的嘟文"
       title: 新的转嘟
+  notifications:
+    email_events: 电子邮件通知事件
+    email_events_hint: 选择你想要收到通知的事件:
+    other_settings: 其它通知设置
   number:
     human:
       decimal_units:
@@ -857,8 +912,10 @@ zh-CN:
     posting_defaults: 发布默认值
     public_timelines: 公共时间轴
   relationships:
-    activity: 账户活动
+    activity: 帐号活动
     dormant: 休眠
+    followers: 关注者
+    following: 正在关注
     last_active: 最近活动
     most_recent: 最近的
     moved: 已迁移
@@ -875,7 +932,7 @@ zh-CN:
     no_account_html: 还没有帐号?你可以<a href='%{sign_up_path}' target='_blank'>注册一个</a>
     proceed: 确认关注
     prompt: 你正准备关注:
-    reason_html: "<strong>为什么需要这个步骤?</strong> <code>%{instance}</code> 可能不是您所注册的服务器,所以我们需要先重定向到您所在的服务器。"
+    reason_html: "<strong>为什么需要这个步骤?</strong> <code>%{instance}</code> 可能不是您所注册的服务器,所以我们需要先跳转到您所在的服务器。"
   remote_interaction:
     favourite:
       proceed: 确认标记为喜欢
@@ -932,9 +989,9 @@ zh-CN:
     revoke_success: 会话注销成功
     title: 会话
   settings:
-    account: 账户
+    account: 帐号
     account_settings: 帐户设置
-    aliases: 账户别名
+    aliases: 帐号别名
     appearance: 外观
     authorized_apps: 已授权的应用
     back: 返回 Mastodon
@@ -974,6 +1031,8 @@ zh-CN:
       private: 不能置顶非公开的嘟文
       reblog: 不能置顶转嘟
     poll:
+      total_people:
+        other: "%{count} 人"
       total_votes:
         other: "%{count} 票"
       vote: 投票
@@ -1110,17 +1169,19 @@ zh-CN:
         disable: 虽然您的帐户被冻结,您的帐户数据仍然完整;但是您无法在解锁前执行任何操作。
         silence: 当您的帐户受限时,只有已经关注过你的人才会这台服务器上看到你的嘟文,并且您会被排除在各种公共列表之外。但是,其他人仍然可以手动关注你。
         suspend: 您的帐户已被封禁,所有的嘟文和您上传的媒体文件都已经从该服务器和您的关注者的服务器上删除并且不可恢复。
+      get_in_touch: 您可回复该邮件以联系 %{instance} 的工作人员。
       review_server_policies: 查看服务器政策
+      statuses: 具体来说,适用于:
       subject:
         disable: 您的帐户 %{acct} 已被冻结
         none: 对 %{acct} 的警告
         silence: 您的帐户 %{acct} 已经受限
         suspend: 您的帐户 %{acct} 已被封禁。
       title:
-        disable: 账户已冻结
+        disable: 账号已冻结
         none: 警示
         silence: 帐户受限
-        suspend: 账户被封禁
+        suspend: 账号被封禁
     welcome:
       edit_profile_action: 设置个人资料
       edit_profile_step: 你可以自定义你的个人资料,包括上传头像、横幅图片、更改昵称等等。如果你想在新的关注者关注你之前对他们进行审核,你也可以选择为你的帐户开启保护。
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index 4b7ca52e1..ffd5ba5e9 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -4,28 +4,57 @@ zh-HK:
     about_hashtag_html: 這些是包含「<strong>#%{hashtag}</strong>」標籤的公開文章。只要你有任何 Mastodon 服務站、或者聯盟網站的用戶,便可以與他們互動。
     about_mastodon_html: Mastodon(萬象)是<em>自由、開源</em>的社交網絡。服務站<em>各自獨立而互連</em>,避免單一商業機構壟斷。找你所信任的服務站,建立帳號,你即可與任何服務站上的用戶溝通,享受無縫的<em>網絡交流</em>。
     about_this: 關於本服務站
+    active_count_after: 活躍
+    active_footnote: 每月活躍使用者 (MAU)
     administered_by: 管理者:
+    api: API
+    apps: 行動應用程式
+    apps_platforms: 在 iOS、Android 和其他平台使用 Mastodon
+    browse_directory: 依興趣瀏覽個人資料目錄和過濾器
+    browse_public_posts: 在 Mastodon 瀏覽公開嘟文的即時串流
     contact: 聯絡
     contact_missing: 未設定
     contact_unavailable: 未公開
+    discover_users: 探索使用者
+    documentation: 文件
+    get_apps: 嘗試行動應用程式
     hosted_on: 在 %{domain} 運作的 Mastodon 服務站
     learn_more: 了解更多
+    privacy_policy: 隱私權政策
+    see_whats_happening: 看看發生什麼事
+    server_stats: 伺服器統計:
     source_code: 源代碼
+    status_count_after:
+      other: 條嘟文
     status_count_before: 他們共發佈了
     tagline: 關注朋友並探索新朋友
+    terms: 使用條款
+    unavailable_content_description:
+      domain: 伺服器
+      reason: 原因
+    user_count_after:
+      other: 位使用者
     user_count_before: 這裏共註冊有
     what_is_mastodon: Mastodon 是甚麼?
   accounts:
+    choices_html: "%{name} 的選擇:"
     follow: 關注
     followers:
       other: 關注者
     following: 正在關注
+    joined: 加入於 %{date}
+    last_active: 上次活躍時間
+    link_verified_on: 此連結的所有權已在 %{date} 檢查過
     media: 媒體
     moved_html: "%{name} 已經轉移到 %{new_profile_link}:"
     network_hidden: 此信息不可用
+    never_active: 永不
     nothing_here: 暫時未有內容可以顯示。
     people_followed_by: "%{name} 關注的人"
     people_who_follow: 關注 %{name} 的人
+    posts:
+      other: 嘟文
+    posts_tab_heading: 嘟文
     posts_with_replies: 文章和回覆
     reserved_username: 此用戶名已被保留
     roles:
@@ -34,12 +63,17 @@ zh-HK:
       moderator: 監察員
     unfollow: 取消關注
   admin:
+    account_actions:
+      action: 執行動作
+      title: 在 %{acct} 執行管理員動作
     account_moderation_notes:
       create: 記錄
       created_msg: 管理記錄已新增
       delete: 刪除
       destroyed_msg: 管理記錄已被刪除
     accounts:
+      approve: 核准
+      approve_all: 全部批准
       are_you_sure: 你確定嗎?
       avatar: 頭像
       by_domain: 域名
@@ -53,6 +87,7 @@ zh-HK:
       confirm: 確定
       confirmed: 已確定
       confirming: 確定
+      deleted: 已刪除
       demote: 降任
       disable: 停用
       disable_two_factor_authentication: 停用雙重認證
@@ -66,8 +101,11 @@ zh-HK:
       enabled: 已啟用
       followers: 關注者
       follows: 正在關注
+      header: 開頭
       inbox_url: 收件箱(Inbox)URL
+      invited_by: 邀請者
       ip: IP 位域
+      joined: 已加入
       location:
         all: 全部
         local: 本地
@@ -77,21 +115,28 @@ zh-HK:
       media_attachments: 媒體檔案
       memorialize: 設定為追悼帳戶
       moderation:
+        active: 活躍
         all: 全部
+        pending: 等待中
         silenced: 被靜音的
         suspended: 被停權的
         title: 管理操作
       moderation_notes: 管理記錄
       most_recent_activity: 最新活動
       most_recent_ip: 最新 IP 位域
+      no_limits_imposed: 未受限制
       not_subscribed: 未訂閱
+      pending: 等待審核中
       perform_full_suspension: 完全停權
       promote: 升任
       protocol: 協議
       public: 公共
       push_subscription_expires: PuSH 訂閱過期
       redownload: 更新頭像
+      reject: 拒絕
+      reject_all: 全部拒絕
       remove_avatar: 取消頭像
+      remove_header: 移除開頭
       resend_confirmation:
         already_confirmed: 该用户已被确认
         send: 重发确认邮件
@@ -111,24 +156,29 @@ zh-HK:
         created_reports: 此用戶所提舉報的紀錄
         targeted_reports: 此用戶被舉報的紀錄
       silence: 靜音
+      silenced: 已靜音
       statuses: 文章
       subscribe: 訂閱
+      suspended: 已停權
       title: 用戶
       unconfirmed_email: 未確認的電郵
       undo_silenced: 解除靜音
       undo_suspension: 解除停權
       unsubscribe: 取消訂閱
       username: 用戶名稱
+      warn: 警告
       web: 用戶頁面
     action_logs:
       actions:
         assigned_to_self_report: "%{name} 指派了 %{target} 的舉報給自己"
         change_email_user: "%{name} 改變了用戶 %{target} 的電郵地址"
         confirm_user: "%{name} 確認了用戶 %{target} 的電郵地址"
+        create_account_warning: "%{name} 已對 %{target} 送出警告"
         create_custom_emoji: "%{name} 加入自訂表情符號 %{target}"
         create_domain_block: "%{name} 阻隔了網域 %{target}"
         create_email_domain_block: "%{name} 阻隔了電郵網域 %{target}"
         demote_user: "%{name} 把用戶 %{target} 降任"
+        destroy_custom_emoji: "%{name} 破壞了 %{target} 表情符號"
         destroy_domain_block: "%{name} 取消了對網域 %{target} 的阻隔"
         destroy_email_domain_block: "%{name} 取消了對電郵網域 %{target} 的阻隔"
         destroy_status: "%{name} 刪除了 %{target} 的文章"
@@ -150,6 +200,7 @@ zh-HK:
         unsuspend_account: "%{name} 取消了用戶 %{target} 的停權狀態"
         update_custom_emoji: "%{name} 更新了自訂表情符號 %{target}"
         update_status: "%{name} 刷新了 %{target} 的文章"
+      deleted_status: "(已刪除嘟文)"
       title: 營運日誌
     custom_emojis:
       by_domain: 網域
@@ -160,11 +211,14 @@ zh-HK:
       delete: 刪除
       destroyed_msg: 已刪除表情符號
       disable: 停用
+      disabled: 已停用
       disabled_msg: 已停用表情符號
       emoji: emoji
       enable: 啟用
+      enabled: 已啟用
       enabled_msg: 已啟用表情符號
       image_hint: PNG 格式,最大 50KB
+      list: 列表
       listed: 已顯示
       new:
         title: 加入新的自訂表情符號
@@ -176,6 +230,28 @@ zh-HK:
       update_failed_msg: 無法更新表情符號
       updated_msg: 已更新表情符號
       upload: 上傳新的表情符號
+    dashboard:
+      backlog: 未處理工作數
+      config: 設定
+      feature_deletions: 帳戶刪除
+      feature_invites: 邀請連結
+      feature_profile_directory: 個人資料目錄
+      feature_registrations: 註冊
+      feature_relay: 聯邦中繼站
+      features: 功能
+      hidden_service: 與隱密服務互連
+      open_reports: 待處理檢舉數
+      recent_users: 最近加入的使用者
+      search: 全文搜尋
+      single_user_mode: 單一使用者模式
+      software: 軟體
+      space: 儲存空間用量
+      title: 儀表板
+      total_users: 總使用者數
+      trends: 趨勢
+      week_interactions: 本週互動次數
+      week_users_active: 本週活躍使用者數
+      week_users_new: 本週新使用者數
     domain_blocks:
       add_new: 新增
       created_msg: 正處理域名阻隔
@@ -192,7 +268,16 @@ zh-HK:
         title: 新增域名阻隔
       reject_media: 拒絕媒體檔案
       reject_media_hint: 刪除本地緩存的媒體檔案,再也不在未來下載這個站點的檔案。和自動刪除無關
+      reject_reports: 拒絕檢舉
+      reject_reports_hint: 忽略所有來自此站點的檢舉。與停權無關
+      rejecting_media: 拒絕媒體檔案
+      rejecting_reports: 拒絕檢舉中
+      severity:
+        silence: 已靜音
+        suspend: 已停權
       show:
+        affected_accounts:
+          other: 將影響到資料庫中的 %{count} 個帳戶
         retroactive:
           silence: 對此域名的所有用戶取消靜音
           suspend: 對此域名的所有用戶取消除名
@@ -209,10 +294,11 @@ zh-HK:
         create: 新增網域
         title: 新增電郵網域阻隔
       title: 電郵網域阻隔
-    followers:
-      back_to_account: 返回帳戶
-      title: "%{acct} 的關注者"
     instances:
+      moderation:
+        all: 全部
+        limited: 限制
+        title: 版主
       title: 已知服務站
       total_followed_by_us: 開始關注你
     invites:
@@ -224,6 +310,8 @@ zh-HK:
       title: 邀請用戶
     relays:
       description_html: "<strong>聯邦中繼站</strong> 是種中繼伺服器,會在訂閱並推送至此中繼站的伺服器之間交換大量的公開嘟文。<strong>中繼站也能協助小型或中型伺服器從聯邦中探索內容</strong>,而無須本地使用者手動關注遠端伺服器的其他使用者。"
+      disabled: 停用
+      enable: 啟用
     report_notes:
       created_msg: 舉報筆記已建立。
       destroyed_msg: 舉報筆記已刪除。
@@ -315,12 +403,23 @@ zh-HK:
       no_media: 不含媒體檔案
       title: 帳戶文章
       with_media: 含有媒體檔案
+    tags:
+      name: Hashtag
     title: 管理
+    warning_presets:
+      add_new: 新增
+      delete: 刪除
+      edit: 編輯
   admin_mailer:
     new_report:
       body: "%{reporter} 舉報了用戶 %{target}"
       body_remote: 來自 %{domain} 的用戶舉報了用戶 %{target}
       subject: 來自 %{instance} 的用戶舉報(#%{id})
+  appearance:
+    localization:
+      body: Mastodon 是由志願者翻譯的。
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: 每個人都能貢獻。
   application_mailer:
     notification_preferences: 更改電郵首選項
     salutation: "%{name}:"
@@ -348,6 +447,8 @@ zh-HK:
     migrate_account: 轉移到另一個帳號
     migrate_account_html: 想要將這個帳號指向另一個帳號可<a href="%{path}">到這裡設定</a>。
     or_log_in_with: 或登入於
+    providers:
+      saml: SAML
     register: 登記
     resend_confirmation: 重發確認指示電郵
     reset_password: 重設密碼
@@ -406,11 +507,19 @@ zh-HK:
       request: 下載檔案
       size: 檔案大小
     blocks: 被你封鎖的用戶
-    follows: 你所關注的用戶
+    csv: CSV
+    lists: 列表
     mutes: 你所靜音的用戶
     storage: 媒體容量大小
+  filters:
+    index:
+      empty: 您沒有過濾器。
+  footer:
+    more: 更多......
   generic:
+    all: 全部
     changes_saved_msg: 已成功儲存修改。
+    copy: 複製
     save_changes: 儲存修改
     validation_errors:
       other: 提交的資料有 %{count} 項問題
@@ -487,6 +596,16 @@ zh-HK:
       body: 您的文章被 %{name} 轉推:
       subject: "%{name} 轉推了你的文章"
       title: 新的轉推
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: B
+          million: M
+          quadrillion: Q
+          thousand: K
+          trillion: T
   pagination:
     newer: 較新
     next: 下一頁
@@ -505,6 +624,7 @@ zh-HK:
     browser: 瀏覽器
     browsers:
       alipay: 支付寶
+      blackberry: 黑莓機
       chrome: Chrome 瀏覽器
       edge: Microsoft Edge 瀏覽器
       electron: Electron 瀏覽器
@@ -513,14 +633,20 @@ zh-HK:
       ie: Internet Explorer 瀏覽器
       micro_messenger: 微信
       nokia: Nokia S40 Ovi 瀏覽器
+      opera: Opera 瀏覽器
       otter: Otter 瀏覽器
+      phantom_js: PhantomJS 瀏覽器
       qq: QQ瀏覽器
+      safari: Safari 瀏覽器
       uc_browser: UC瀏覽器
       weibo: 新浪微博
     current_session: 目前的作業階段
     description: "%{platform} 上的 %{browser}"
     explanation: 這些是現在正登入於你的 Mastodon 帳號的瀏覽器。
     ip: IP 位址
+    platforms:
+      ios: iOS
+      mac: Mac
     revoke: 取消
     revoke_success: 作業階段成功取消
     title: 作業階段
@@ -555,6 +681,8 @@ zh-HK:
       ownership: 不能置頂他人的文章
       private: 不能置頂非公開的文章
       reblog: 不能置頂轉推
+    poll:
+      vote: 投票
     show_more: 顯示更多
     title: "%{name}:「%{quote}」"
     visibilities:
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 7a5627c30..5b25688ed 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -294,9 +294,6 @@ zh-TW:
         create: 新增站點
         title: 新增電子信箱黑名單項目
       title: 電子信箱黑名單
-    followers:
-      back_to_account: 返回帳戶
-      title: "%{acct} 的關注者"
     instances:
       moderation:
         all: 全部
@@ -417,6 +414,11 @@ zh-TW:
       body: "%{reporter} 檢舉了使用者 %{target}"
       body_remote: 來自 %{domain} 的使用者檢舉了使用者 %{target}
       subject: 來自 %{instance} 的使用者檢舉(#%{id})
+  appearance:
+    localization:
+      body: Mastodon 是由志願者翻譯的。
+      guide_link: https://crowdin.com/project/mastodon
+      guide_link_text: 每個人都能貢獻。
   application_mailer:
     notification_preferences: 變更電子信件設定
     salutation: "%{name}、"
@@ -444,6 +446,8 @@ zh-TW:
     migrate_account: 轉移到另一個帳戶
     migrate_account_html: 如果你希望引導他人關注另一個帳戶,請<a href="%{path}">到這裡設定</a>。
     or_log_in_with: 或透過其他方式登入
+    providers:
+      saml: SAML
     register: 註冊
     resend_confirmation: 重新寄送確認指引
     reset_password: 重設密碼
@@ -502,11 +506,19 @@ zh-TW:
       request: 下載存檔
       size: 大小
     blocks: 您封鎖的使用者
-    follows: 您關注的使用者
+    csv: CSV
+    lists: 列表
     mutes: 您靜音的使用者
     storage: 儲存空間大小
+  filters:
+    index:
+      empty: 您沒有過濾器。
+  footer:
+    more: 更多......
   generic:
+    all: 全部
     changes_saved_msg: 已成功儲存修改!
+    copy: 複製
     save_changes: 儲存修改
   imports:
     preface: 您可以在此匯入您在其他伺服器所匯出的資料檔,包括關注的使用者、封鎖的使用者名單。
@@ -575,6 +587,16 @@ zh-TW:
       body: '你的嘟文被 %{name} 轉嘟:'
       subject: "%{name} 轉嘟了你的嘟文"
       title: 新的轉嘟
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: B
+          million: M
+          quadrillion: Q
+          thousand: K
+          trillion: T
   pagination:
     newer: 較新
     next: 下一頁
@@ -610,6 +632,9 @@ zh-TW:
     description: "%{platform} 上的 %{browser}"
     explanation: 這些是現在正登入於你的 Mastodon 帳戶的瀏覽器。
     ip: IP 位址
+    platforms:
+      ios: iOS
+      mac: Mac
     revoke: 取消
     revoke_success: Session 取消成功
     title: 作業階段
@@ -638,6 +663,8 @@ zh-TW:
       ownership: 不能置頂他人的嘟文
       private: 不能置頂非公開的嘟文
       reblog: 不能置頂轉嘟
+    poll:
+      vote: 投票
     show_more: 顯示更多
     visibilities:
       private: 僅關注者
diff --git a/config/navigation.rb b/config/navigation.rb
index ab4262182..bd172f25f 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -52,6 +52,7 @@ SimpleNavigation::Configuration.run do |navigation|
     n.item :admin, safe_join([fa_icon('cogs fw'), t('admin.title')]), admin_dashboard_url, if: proc { current_user.staff? } do |s|
       s.item :dashboard, safe_join([fa_icon('tachometer fw'), t('admin.dashboard.title')]), admin_dashboard_url
       s.item :settings, safe_join([fa_icon('cogs fw'), t('admin.settings.title')]), edit_admin_settings_url, if: -> { current_user.admin? }, highlights_on: %r{/admin/settings}
+      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 :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? }
diff --git a/config/routes.rb b/config/routes.rb
index 49edb4602..b56f7fd87 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -175,9 +175,18 @@ Rails.application.routes.draw do
         get :edit
       end
     end
+
     resources :email_domain_blocks, only: [:index, :new, :create, :destroy]
     resources :action_logs, only: [:index]
     resources :warning_presets, except: [:new]
+
+    resources :announcements, except: [:show] do
+      member do
+        post :publish
+        post :unpublish
+      end
+    end
+
     resource :settings, only: [:edit, :update]
 
     resources :invites, only: [:index, :create, :destroy] do
@@ -225,7 +234,7 @@ Rails.application.routes.draw do
       resource :reset, only: [:create]
       resource :action, only: [:new, :create], controller: 'account_actions'
       resources :statuses, only: [:index, :show, :create, :update, :destroy]
-      resources :followers, only: [:index]
+      resources :relationships, only: [:index]
 
       resource :confirmation, only: [:create] do
         collection do
@@ -233,7 +242,7 @@ Rails.application.routes.draw do
         end
       end
 
-      resource :role do
+      resource :role, only: [] do
         member do
           post :promote
           post :demote
@@ -320,6 +329,16 @@ Rails.application.routes.draw do
       resources :scheduled_statuses, only: [:index, :show, :update, :destroy]
       resources :preferences, only: [:index]
 
+      resources :announcements, only: [:index] do
+        scope module: :announcements do
+          resources :reactions, only: [:update, :destroy]
+        end
+
+        member do
+          post :dismiss
+        end
+      end
+
       resources :conversations, only: [:index, :destroy] do
         member do
           post :read
diff --git a/db/migrate/20170711225116_fix_null_booleans.rb b/db/migrate/20170711225116_fix_null_booleans.rb
index 5b319471d..aabb81f21 100644
--- a/db/migrate/20170711225116_fix_null_booleans.rb
+++ b/db/migrate/20170711225116_fix_null_booleans.rb
@@ -1,17 +1,19 @@
 class FixNullBooleans < ActiveRecord::Migration[5.1]
   def change
-    change_column_default :domain_blocks, :reject_media, false
-    change_column_null :domain_blocks, :reject_media, false, false
+    safety_assured do
+      change_column_default :domain_blocks, :reject_media, false
+      change_column_null :domain_blocks, :reject_media, false, false
 
-    change_column_default :imports, :approved, false
-    change_column_null :imports, :approved, false, false
+      change_column_default :imports, :approved, false
+      change_column_null :imports, :approved, false, false
 
-    change_column_null :statuses, :sensitive, false, false
-    change_column_null :statuses, :reply, false, false
+      change_column_null :statuses, :sensitive, false, false
+      change_column_null :statuses, :reply, false, false
 
-    change_column_null :users, :admin, false, false
+      change_column_null :users, :admin, false, false
 
-    change_column_default :users, :otp_required_for_login, false
-    change_column_null :users, :otp_required_for_login, false, false
+      change_column_default :users, :otp_required_for_login, false
+      change_column_null :users, :otp_required_for_login, false, false
+    end
   end
 end
diff --git a/db/migrate/20170918125918_ids_to_bigints.rb b/db/migrate/20170918125918_ids_to_bigints.rb
index 8e19468db..bcb2e9eca 100644
--- a/db/migrate/20170918125918_ids_to_bigints.rb
+++ b/db/migrate/20170918125918_ids_to_bigints.rb
@@ -70,20 +70,22 @@ class IdsToBigints < ActiveRecord::Migration[5.1]
     included_columns << [:deprecated_preview_cards, :id] if table_exists?(:deprecated_preview_cards)
 
     # Print out a warning that this will probably take a while.
-    say ''
-    say 'WARNING: This migration may take a *long* time for large instances'
-    say 'It will *not* lock tables for any significant time, but it may run'
-    say 'for a very long time. We will pause for 10 seconds to allow you to'
-    say 'interrupt this migration if you are not ready.'
-    say ''
-    say 'This migration has some sections that can be safely interrupted'
-    say 'and restarted later, and will tell you when those are occurring.'
-    say ''
-    say 'For more information, see https://github.com/tootsuite/mastodon/pull/5088'
+    if $stdout.isatty
+      say ''
+      say 'WARNING: This migration may take a *long* time for large instances'
+      say 'It will *not* lock tables for any significant time, but it may run'
+      say 'for a very long time. We will pause for 10 seconds to allow you to'
+      say 'interrupt this migration if you are not ready.'
+      say ''
+      say 'This migration has some sections that can be safely interrupted'
+      say 'and restarted later, and will tell you when those are occurring.'
+      say ''
+      say 'For more information, see https://github.com/tootsuite/mastodon/pull/5088'
 
-    10.downto(1) do |i|
-      say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
-      sleep 1
+      10.downto(1) do |i|
+        say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
+        sleep 1
+      end
     end
 
     tables = included_columns.map(&:first).uniq
diff --git a/db/migrate/20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb b/db/migrate/20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb
index 747e5a826..1d7a0086c 100644
--- a/db/migrate/20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb
+++ b/db/migrate/20171010025614_change_accounts_nonnullable_in_account_moderation_notes.rb
@@ -1,6 +1,8 @@
 class ChangeAccountsNonnullableInAccountModerationNotes < ActiveRecord::Migration[5.1]
   def change
-    change_column_null :account_moderation_notes, :account_id, false
-    change_column_null :account_moderation_notes, :target_account_id, false
+    safety_assured do
+      change_column_null :account_moderation_notes, :account_id, false
+      change_column_null :account_moderation_notes, :target_account_id, false
+    end
   end
 end
diff --git a/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb b/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb
index 3369e3b9e..ac86c9e77 100644
--- a/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb
+++ b/db/migrate/20171201000000_change_account_id_nonnullable_in_lists.rb
@@ -1,5 +1,7 @@
 class ChangeAccountIdNonnullableInLists < ActiveRecord::Migration[5.1]
   def change
-    change_column_null :lists, :account_id, false
+    safety_assured do
+      change_column_null :lists, :account_id, false
+    end
   end
 end
diff --git a/db/migrate/20180206000000_change_user_id_nonnullable.rb b/db/migrate/20180206000000_change_user_id_nonnullable.rb
index 4eecb6154..2d2cf20d3 100644
--- a/db/migrate/20180206000000_change_user_id_nonnullable.rb
+++ b/db/migrate/20180206000000_change_user_id_nonnullable.rb
@@ -1,6 +1,8 @@
 class ChangeUserIdNonnullable < ActiveRecord::Migration[5.1]
   def change
-    change_column_null :invites, :user_id, false
-    change_column_null :web_settings, :user_id, false
+    safety_assured do
+      change_column_null :invites, :user_id, false
+      change_column_null :web_settings, :user_id, false
+    end
   end
 end
diff --git a/db/migrate/20180310000000_change_columns_in_notifications_nonnullable.rb b/db/migrate/20180310000000_change_columns_in_notifications_nonnullable.rb
index 05ffd0501..dba789207 100644
--- a/db/migrate/20180310000000_change_columns_in_notifications_nonnullable.rb
+++ b/db/migrate/20180310000000_change_columns_in_notifications_nonnullable.rb
@@ -1,8 +1,10 @@
 class ChangeColumnsInNotificationsNonnullable < ActiveRecord::Migration[5.1]
   def change
-    change_column_null :notifications, :activity_id, false
-    change_column_null :notifications, :activity_type, false
-    change_column_null :notifications, :account_id, false
-    change_column_null :notifications, :from_account_id, false
+    safety_assured do
+      change_column_null :notifications, :activity_id, false
+      change_column_null :notifications, :activity_type, false
+      change_column_null :notifications, :account_id, false
+      change_column_null :notifications, :from_account_id, false
+    end
   end
 end
diff --git a/db/migrate/20180528141303_fix_accounts_unique_index.rb b/db/migrate/20180528141303_fix_accounts_unique_index.rb
index bbbf28d81..5d7b3c463 100644
--- a/db/migrate/20180528141303_fix_accounts_unique_index.rb
+++ b/db/migrate/20180528141303_fix_accounts_unique_index.rb
@@ -20,19 +20,21 @@ class FixAccountsUniqueIndex < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
   def up
-    say ''
-    say 'WARNING: This migration may take a *long* time for large instances'
-    say 'It will *not* lock tables for any significant time, but it may run'
-    say 'for a very long time. We will pause for 10 seconds to allow you to'
-    say 'interrupt this migration if you are not ready.'
-    say ''
-    say 'This migration will irreversibly delete user accounts with duplicate'
-    say 'usernames. You may use the `rake mastodon:maintenance:find_duplicate_usernames`'
-    say 'task to manually deal with such accounts before running this migration.'
-
-    10.downto(1) do |i|
-      say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
-      sleep 1
+    if $stdout.isatty
+      say ''
+      say 'WARNING: This migration may take a *long* time for large instances'
+      say 'It will *not* lock tables for any significant time, but it may run'
+      say 'for a very long time. We will pause for 10 seconds to allow you to'
+      say 'interrupt this migration if you are not ready.'
+      say ''
+      say 'This migration will irreversibly delete user accounts with duplicate'
+      say 'usernames. You may use the `rake mastodon:maintenance:find_duplicate_usernames`'
+      say 'task to manually deal with such accounts before running this migration.'
+
+      10.downto(1) do |i|
+        say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
+        sleep 1
+      end
     end
 
     duplicates = Account.connection.select_all('SELECT string_agg(id::text, \',\') AS ids FROM accounts GROUP BY lower(username), lower(domain) HAVING count(*) > 1').to_hash
diff --git a/db/migrate/20181024224956_migrate_account_conversations.rb b/db/migrate/20181024224956_migrate_account_conversations.rb
index 9f6c94fd1..12e0a70fa 100644
--- a/db/migrate/20181024224956_migrate_account_conversations.rb
+++ b/db/migrate/20181024224956_migrate_account_conversations.rb
@@ -62,16 +62,18 @@ class MigrateAccountConversations < ActiveRecord::Migration[5.2]
   end
 
   def up
-    say ''
-    say 'WARNING: This migration may take a *long* time for large instances'
-    say 'It will *not* lock tables for any significant time, but it may run'
-    say 'for a very long time. We will pause for 10 seconds to allow you to'
-    say 'interrupt this migration if you are not ready.'
-    say ''
-
-    10.downto(1) do |i|
-      say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
-      sleep 1
+    if $stdout.isatty
+      say ''
+      say 'WARNING: This migration may take a *long* time for large instances'
+      say 'It will *not* lock tables for any significant time, but it may run'
+      say 'for a very long time. We will pause for 10 seconds to allow you to'
+      say 'interrupt this migration if you are not ready.'
+      say ''
+
+      10.downto(1) do |i|
+        say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
+        sleep 1
+      end
     end
 
     migrated  = 0
diff --git a/db/migrate/20191031163205_change_list_account_follow_nullable.rb b/db/migrate/20191031163205_change_list_account_follow_nullable.rb
index ff8911546..65ff93365 100644
--- a/db/migrate/20191031163205_change_list_account_follow_nullable.rb
+++ b/db/migrate/20191031163205_change_list_account_follow_nullable.rb
@@ -1,5 +1,7 @@
 class ChangeListAccountFollowNullable < ActiveRecord::Migration[5.1]
   def change
-    change_column_null :list_accounts, :follow_id, true
+    safety_assured do
+      change_column_null :list_accounts, :follow_id, true
+    end
   end
 end
diff --git a/db/migrate/20191218153258_create_announcements.rb b/db/migrate/20191218153258_create_announcements.rb
new file mode 100644
index 000000000..58e143c92
--- /dev/null
+++ b/db/migrate/20191218153258_create_announcements.rb
@@ -0,0 +1,16 @@
+class CreateAnnouncements < ActiveRecord::Migration[5.2]
+  def change
+    create_table :announcements do |t|
+      t.text :text, null: false, default: ''
+
+      t.boolean :published, null: false, default: false
+      t.boolean :all_day, null: false, default: false
+
+      t.datetime :scheduled_at
+      t.datetime :starts_at
+      t.datetime :ends_at
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/migrate/20200113125135_create_announcement_mutes.rb b/db/migrate/20200113125135_create_announcement_mutes.rb
new file mode 100644
index 000000000..c588e7fcd
--- /dev/null
+++ b/db/migrate/20200113125135_create_announcement_mutes.rb
@@ -0,0 +1,12 @@
+class CreateAnnouncementMutes < ActiveRecord::Migration[5.2]
+  def change
+    create_table :announcement_mutes do |t|
+      t.belongs_to :account, foreign_key: { on_delete: :cascade, index: false }
+      t.belongs_to :announcement, foreign_key: { on_delete: :cascade }
+
+      t.timestamps
+    end
+
+    add_index :announcement_mutes, [:account_id, :announcement_id], unique: true
+  end
+end
diff --git a/db/migrate/20200114113335_create_announcement_reactions.rb b/db/migrate/20200114113335_create_announcement_reactions.rb
new file mode 100644
index 000000000..226c81a18
--- /dev/null
+++ b/db/migrate/20200114113335_create_announcement_reactions.rb
@@ -0,0 +1,15 @@
+class CreateAnnouncementReactions < ActiveRecord::Migration[5.2]
+  def change
+    create_table :announcement_reactions do |t|
+      t.belongs_to :account, foreign_key: { on_delete: :cascade, index: false }
+      t.belongs_to :announcement, foreign_key: { on_delete: :cascade }
+
+      t.string :name, null: false, default: ''
+      t.belongs_to :custom_emoji, foreign_key: { on_delete: :cascade }
+
+      t.timestamps
+    end
+
+    add_index :announcement_reactions, [:account_id, :announcement_id, :name], unique: true, name: :index_announcement_reactions_on_account_id_and_announcement_id
+  end
+end
diff --git a/db/migrate/20200119112504_add_public_index_to_statuses.rb b/db/migrate/20200119112504_add_public_index_to_statuses.rb
new file mode 100644
index 000000000..db007848e
--- /dev/null
+++ b/db/migrate/20200119112504_add_public_index_to_statuses.rb
@@ -0,0 +1,11 @@
+class AddPublicIndexToStatuses < ActiveRecord::Migration[5.2]
+  disable_ddl_transaction!
+
+  def up
+    add_index :statuses, [:id, :account_id], name: :index_statuses_public_20200119, algorithm: :concurrently, order: { id: :desc }, where: 'deleted_at IS NULL AND visibility = 0 AND reblog_of_id IS NULL AND ((NOT reply) OR (in_reply_to_account_id = account_id))'
+  end
+
+  def down
+    remove_index :statuses, name: :index_statuses_public_20200119
+  end
+end
diff --git a/db/migrate/20200126203551_add_published_at_to_announcements.rb b/db/migrate/20200126203551_add_published_at_to_announcements.rb
new file mode 100644
index 000000000..d99f95694
--- /dev/null
+++ b/db/migrate/20200126203551_add_published_at_to_announcements.rb
@@ -0,0 +1,5 @@
+class AddPublishedAtToAnnouncements < ActiveRecord::Migration[5.2]
+  def change
+    add_column :announcements, :published_at, :datetime
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index b7ab74033..73ac78b80 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: 2019_12_12_003415) do
+ActiveRecord::Schema.define(version: 2020_01_26_203551) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -196,15 +196,50 @@ ActiveRecord::Schema.define(version: 2019_12_12_003415) do
     t.index ["target_type", "target_id"], name: "index_admin_action_logs_on_target_type_and_target_id"
   end
 
+  create_table "announcement_mutes", force: :cascade do |t|
+    t.bigint "account_id"
+    t.bigint "announcement_id"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["account_id", "announcement_id"], name: "index_announcement_mutes_on_account_id_and_announcement_id", unique: true
+    t.index ["account_id"], name: "index_announcement_mutes_on_account_id"
+    t.index ["announcement_id"], name: "index_announcement_mutes_on_announcement_id"
+  end
+
+  create_table "announcement_reactions", force: :cascade do |t|
+    t.bigint "account_id"
+    t.bigint "announcement_id"
+    t.string "name", default: "", null: false
+    t.bigint "custom_emoji_id"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["account_id", "announcement_id", "name"], name: "index_announcement_reactions_on_account_id_and_announcement_id", unique: true
+    t.index ["account_id"], name: "index_announcement_reactions_on_account_id"
+    t.index ["announcement_id"], name: "index_announcement_reactions_on_announcement_id"
+    t.index ["custom_emoji_id"], name: "index_announcement_reactions_on_custom_emoji_id"
+  end
+
+  create_table "announcements", force: :cascade do |t|
+    t.text "text", default: "", null: false
+    t.boolean "published", default: false, null: false
+    t.boolean "all_day", default: false, null: false
+    t.datetime "scheduled_at"
+    t.datetime "starts_at"
+    t.datetime "ends_at"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.datetime "published_at"
+  end
+
   create_table "backups", force: :cascade do |t|
     t.bigint "user_id"
     t.string "dump_file_name"
     t.string "dump_content_type"
-    t.bigint "dump_file_size"
     t.datetime "dump_updated_at"
     t.boolean "processed", default: false, null: false
     t.datetime "created_at", null: false
     t.datetime "updated_at", null: false
+    t.bigint "dump_file_size"
   end
 
   create_table "blocks", force: :cascade do |t|
@@ -693,6 +728,7 @@ ActiveRecord::Schema.define(version: 2019_12_12_003415) do
     t.datetime "deleted_at"
     t.index ["account_id", "id", "visibility", "updated_at"], name: "index_statuses_20190820", order: { id: :desc }, where: "(deleted_at IS NULL)"
     t.index ["id", "account_id"], name: "index_statuses_local_20190824", order: { id: :desc }, where: "((local OR (uri IS NULL)) AND (deleted_at IS NULL) AND (visibility = 0) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))"
+    t.index ["id", "account_id"], name: "index_statuses_public_20200119", order: { id: :desc }, where: "((deleted_at IS NULL) AND (visibility = 0) AND (reblog_of_id IS NULL) AND ((NOT reply) OR (in_reply_to_account_id = account_id)))"
     t.index ["in_reply_to_account_id"], name: "index_statuses_on_in_reply_to_account_id"
     t.index ["in_reply_to_id"], name: "index_statuses_on_in_reply_to_id"
     t.index ["reblog_of_id", "account_id"], name: "index_statuses_on_reblog_of_id_and_account_id"
@@ -820,6 +856,11 @@ ActiveRecord::Schema.define(version: 2019_12_12_003415) do
   add_foreign_key "account_warnings", "accounts", on_delete: :nullify
   add_foreign_key "accounts", "accounts", column: "moved_to_account_id", on_delete: :nullify
   add_foreign_key "admin_action_logs", "accounts", on_delete: :cascade
+  add_foreign_key "announcement_mutes", "accounts", on_delete: :cascade
+  add_foreign_key "announcement_mutes", "announcements", on_delete: :cascade
+  add_foreign_key "announcement_reactions", "accounts", on_delete: :cascade
+  add_foreign_key "announcement_reactions", "announcements", on_delete: :cascade
+  add_foreign_key "announcement_reactions", "custom_emojis", on_delete: :cascade
   add_foreign_key "backups", "users", on_delete: :nullify
   add_foreign_key "blocks", "accounts", column: "target_account_id", name: "fk_9571bfabc1", on_delete: :cascade
   add_foreign_key "blocks", "accounts", name: "fk_4269e03e65", on_delete: :cascade
diff --git a/lib/cli.rb b/lib/cli.rb
index fbdf49fc3..19cc5d6b5 100644
--- a/lib/cli.rb
+++ b/lib/cli.rb
@@ -96,6 +96,8 @@ module Mastodon
 
       prompt.warn('Do NOT interrupt this process...')
 
+      Setting.registrations_mode = 'none'
+
       Account.local.without_suspended.find_each do |account|
         payload = ActiveModelSerializers::SerializableResource.new(
           account,
diff --git a/lib/mastodon/emoji_cli.rb b/lib/mastodon/emoji_cli.rb
index beac1b1fd..dbaf12018 100644
--- a/lib/mastodon/emoji_cli.rb
+++ b/lib/mastodon/emoji_cli.rb
@@ -72,9 +72,16 @@ module Mastodon
       say("Imported #{imported}, skipped #{skipped}, failed to import #{failed}", color(imported, skipped, failed))
     end
 
+    option :remote_only, type: :boolean
     desc 'purge', 'Remove all custom emoji'
+    long_desc <<-LONG_DESC
+      Removes all custom emoji.
+
+      With the --remote-only option, only remote emoji will be deleted.
+    LONG_DESC
     def purge
-      CustomEmoji.in_batches.destroy_all
+      scope = options[:remote_only] ? CustomEmoji.remote : CustomEmoji
+      scope.in_batches.destroy_all
       say('OK', :green)
     end
 
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index a8e5f0b79..4a56470d0 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -9,15 +9,15 @@ module Mastodon
     end
 
     def minor
-      0
+      1
     end
 
     def patch
-      1
+      0
     end
 
     def flags
-      ''
+      'rc2'
     end
 
     def suffix
diff --git a/lib/paperclip/blurhash_transcoder.rb b/lib/paperclip/blurhash_transcoder.rb
index 08925a6dd..5c33c98b0 100644
--- a/lib/paperclip/blurhash_transcoder.rb
+++ b/lib/paperclip/blurhash_transcoder.rb
@@ -8,7 +8,7 @@ module Paperclip
       pixels   = convert(':source RGB:-', source: File.expand_path(@file.path)).unpack('C*')
       geometry = options.fetch(:file_geometry_parser).from_file(@file)
 
-      attachment.instance.blurhash = Blurhash.encode(geometry.width, geometry.height, pixels, options[:blurhash] || {})
+      attachment.instance.blurhash = Blurhash.encode(geometry.width, geometry.height, pixels, **(options[:blurhash] || {}))
 
       @file
     end
diff --git a/lib/tasks/auto_annotate_models.rake b/lib/tasks/auto_annotate_models.rake
index fb9c89aa4..a374e33ad 100644
--- a/lib/tasks/auto_annotate_models.rake
+++ b/lib/tasks/auto_annotate_models.rake
@@ -4,6 +4,7 @@ if Rails.env.development?
   task :set_annotation_options do
     Annotate.set_defaults(
       'routes'                  => 'false',
+      'models'                  => 'true',
       'position_in_routes'      => 'before',
       'position_in_class'       => 'before',
       'position_in_test'        => 'before',
diff --git a/package.json b/package.json
index 9e0c44550..df2c40175 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
   "name": "@tootsuite/mastodon",
   "license": "AGPL-3.0-or-later",
   "engines": {
-    "node": ">=8.12 <13"
+    "node": ">=10.13 <13"
   },
   "scripts": {
     "postversion": "git push --tags",
@@ -60,21 +60,21 @@
   },
   "private": true,
   "dependencies": {
-    "@babel/core": "^7.7.5",
-    "@babel/plugin-proposal-class-properties": "^7.7.4",
-    "@babel/plugin-proposal-decorators": "^7.7.4",
-    "@babel/plugin-transform-react-inline-elements": "^7.7.4",
+    "@babel/core": "^7.8.3",
+    "@babel/plugin-proposal-class-properties": "^7.8.3",
+    "@babel/plugin-proposal-decorators": "^7.8.3",
+    "@babel/plugin-transform-react-inline-elements": "^7.8.0",
     "@babel/plugin-transform-runtime": "^7.7.6",
-    "@babel/preset-env": "^7.7.7",
-    "@babel/preset-react": "^7.7.4",
-    "@babel/runtime": "^7.7.7",
+    "@babel/preset-env": "^7.8.3",
+    "@babel/preset-react": "^7.8.3",
+    "@babel/runtime": "^7.8.3",
     "@gamestdio/websocket": "^0.3.2",
-    "@clusterws/cws": "^0.16.0",
+    "@clusterws/cws": "^0.17.3",
     "array-includes": "^3.1.1",
     "atrament": "^0.2.3",
     "arrow-key-navigation": "^1.1.0",
-    "autoprefixer": "^9.7.3",
-    "axios": "^0.19.0",
+    "autoprefixer": "^9.7.4",
+    "axios": "^0.19.1",
     "babel-loader": "^8.0.6",
     "babel-plugin-lodash": "^3.3.4",
     "babel-plugin-preval": "^4.0.0",
@@ -83,10 +83,10 @@
     "babel-runtime": "^6.26.0",
     "blurhash": "^1.1.3",
     "classnames": "^2.2.5",
-    "compression-webpack-plugin": "^3.0.1",
+    "compression-webpack-plugin": "^3.1.0",
     "copy-webpack-plugin": "^5.1.1",
     "cross-env": "^6.0.3",
-    "css-loader": "^3.4.0",
+    "css-loader": "^3.4.2",
     "cssnano": "^4.1.10",
     "detect-passive-events": "^1.0.2",
     "dotenv": "^8.2.0",
@@ -95,7 +95,7 @@
     "escape-html": "^1.0.3",
     "exif-js": "^2.3.0",
     "express": "^4.17.1",
-    "file-loader": "^4.2.0",
+    "file-loader": "^5.0.2",
     "favico.js": "^0.3.10",
     "font-awesome": "^4.7.0",
     "glob": "^7.1.6",
@@ -107,7 +107,7 @@
     "intl": "^1.2.5",
     "intl-messageformat": "^2.2.0",
     "intl-relativeformat": "^6.4.3",
-    "is-nan": "^1.2.1",
+    "is-nan": "^1.3.0",
     "js-yaml": "^3.13.1",
     "lodash": "^4.17.14",
     "mark-loader": "^0.1.6",
@@ -142,28 +142,28 @@
     "react-router-scroll-4": "^1.0.0-beta.1",
     "react-select": "^3.0.8",
     "react-sparklines": "^1.7.0",
-    "react-swipeable-views": "^0.13.3",
+    "react-swipeable-views": "^0.13.4",
     "react-textarea-autosize": "^7.1.2",
     "react-toggle": "^4.1.1",
     "redis": "^2.7.1",
-    "redux": "^4.0.4",
+    "redux": "^4.0.5",
     "redux-immutable": "^4.0.0",
     "redux-thunk": "^2.2.0",
     "rellax": "^1.10.0",
     "requestidlecallback": "^0.3.0",
     "reselect": "^4.0.0",
     "rimraf": "^3.0.0",
-    "sass": "^1.24.0",
-    "sass-loader": "^8.0.0",
+    "sass": "^1.24.2",
+    "sass-loader": "^8.0.2",
     "stringz": "^2.0.0",
     "substring-trie": "^1.0.2",
-    "terser-webpack-plugin": "^2.2.2",
+    "terser-webpack-plugin": "^2.3.2",
     "tesseract.js": "^2.0.0-alpha.16",
     "throng": "^4.0.0",
     "tiny-queue": "^0.2.1",
     "uuid": "^3.3.3",
-    "wavesurfer.js": "^3.2.0",
-    "webpack": "^4.41.2",
+    "wavesurfer.js": "^3.3.1",
+    "webpack": "^4.41.5",
     "webpack-assets-manifest": "^3.1.1",
     "webpack-bundle-analyzer": "^3.6.0",
     "webpack-cli": "^3.3.10",
@@ -174,18 +174,18 @@
     "babel-eslint": "^10.0.3",
     "babel-jest": "^24.9.0",
     "enzyme": "^3.11.0",
-    "enzyme-adapter-react-16": "^1.15.1",
-    "eslint": "^6.7.2",
-    "eslint-plugin-import": "~2.19.1",
+    "enzyme-adapter-react-16": "^1.15.2",
+    "eslint": "^6.8.0",
+    "eslint-plugin-import": "~2.20.0",
     "eslint-plugin-jsx-a11y": "~6.2.3",
     "eslint-plugin-promise": "~4.2.1",
     "eslint-plugin-react": "~7.17.0",
     "jest": "^24.9.0",
     "raf": "^3.4.1",
     "react-intl-translations-manager": "^5.0.3",
-    "react-test-renderer": "^16.11.0",
+    "react-test-renderer": "^16.12.0",
     "sass-lint": "^1.13.1",
-    "webpack-dev-server": "^3.9.0",
-    "yargs": "^15.0.2"
+    "webpack-dev-server": "^3.10.1",
+    "yargs": "^15.1.0"
   }
 }
diff --git a/spec/controllers/api/proofs_controller_spec.rb b/spec/controllers/api/proofs_controller_spec.rb
index dbde4927f..2fe615005 100644
--- a/spec/controllers/api/proofs_controller_spec.rb
+++ b/spec/controllers/api/proofs_controller_spec.rb
@@ -85,10 +85,7 @@ describe Api::ProofsController do
         end
 
         it 'has the correct avatar url' do
-          first_part = 'https://cb6e6126.ngrok.io/system/accounts/avatars/'
-          last_part  = 'original/avatar.gif'
-
-          expect(body_as_json[:avatar]).to match /#{Regexp.quote(first_part)}(?:\d{3,5}\/){3}#{Regexp.quote(last_part)}/
+          expect(body_as_json[:avatar]).to match "https://cb6e6126.ngrok.io#{alice.avatar.url}"
         end
       end
     end
diff --git a/spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb b/spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb
index 75e0570e9..54587187f 100644
--- a/spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts/follower_accounts_controller_spec.rb
@@ -3,19 +3,38 @@ require 'rails_helper'
 describe Api::V1::Accounts::FollowerAccountsController do
   render_views
 
-  let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
-  let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') }
+  let(:user)    { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
+  let(:token)   { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') }
+  let(:account) { Fabricate(:account) }
+  let(:alice)   { Fabricate(:account) }
+  let(:bob)     { Fabricate(:account) }
 
   before do
-    Fabricate(:follow, target_account: user.account)
+    alice.follow!(account)
+    bob.follow!(account)
     allow(controller).to receive(:doorkeeper_token) { token }
   end
 
   describe 'GET #index' do
     it 'returns http success' do
-      get :index, params: { account_id: user.account.id, limit: 1 }
+      get :index, params: { account_id: account.id, limit: 2 }
 
       expect(response).to have_http_status(200)
     end
+
+    it 'returns accounts following the given account' do
+      get :index, params: { account_id: account.id, limit: 2 }
+
+      expect(body_as_json.size).to eq 2
+      expect([body_as_json[0][:id], body_as_json[1][:id]]).to match_array([alice.id.to_s, bob.id.to_s])
+    end
+
+    it 'does not return blocked users' do
+      user.account.block!(bob)
+      get :index, params: { account_id: account.id, limit: 2 }
+
+      expect(body_as_json.size).to eq 1
+      expect(body_as_json[0][:id]).to eq alice.id.to_s
+    end
   end
 end
diff --git a/spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb b/spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb
index 7f7105ad3..a580a7368 100644
--- a/spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts/following_accounts_controller_spec.rb
@@ -3,19 +3,38 @@ require 'rails_helper'
 describe Api::V1::Accounts::FollowingAccountsController do
   render_views
 
-  let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
-  let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') }
+  let(:user)    { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
+  let(:token)   { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'read:accounts') }
+  let(:account) { Fabricate(:account) }
+  let(:alice)   { Fabricate(:account) }
+  let(:bob)     { Fabricate(:account) }
 
   before do
-    Fabricate(:follow, account: user.account)
+    account.follow!(alice)
+    account.follow!(bob)
     allow(controller).to receive(:doorkeeper_token) { token }
   end
 
   describe 'GET #index' do
     it 'returns http success' do
-      get :index, params: { account_id: user.account.id, limit: 1 }
+      get :index, params: { account_id: account.id, limit: 2 }
 
       expect(response).to have_http_status(200)
     end
+
+    it 'returns accounts followed by the given account' do
+      get :index, params: { account_id: account.id, limit: 2 }
+
+      expect(body_as_json.size).to eq 2
+      expect([body_as_json[0][:id], body_as_json[1][:id]]).to match_array([alice.id.to_s, bob.id.to_s])
+    end
+
+    it 'does not return blocked users' do
+      user.account.block!(bob)
+      get :index, params: { account_id: account.id, limit: 2 }
+
+      expect(body_as_json.size).to eq 1
+      expect(body_as_json[0][:id]).to eq alice.id.to_s
+    end
   end
 end
diff --git a/spec/controllers/api/v1/announcements/reactions_controller_spec.rb b/spec/controllers/api/v1/announcements/reactions_controller_spec.rb
new file mode 100644
index 000000000..72620e242
--- /dev/null
+++ b/spec/controllers/api/v1/announcements/reactions_controller_spec.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe Api::V1::Announcements::ReactionsController, type: :controller do
+  render_views
+
+  let(:user)   { Fabricate(:user) }
+  let(:scopes) { 'write:favourites' }
+  let(:token)  { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
+
+  let!(:announcement) { Fabricate(:announcement) }
+
+  describe 'PUT #update' do
+    context 'without token' do
+      it 'returns http unauthorized' do
+        put :update, params: { announcement_id: announcement.id, id: '😂' }
+        expect(response).to have_http_status :unauthorized
+      end
+    end
+
+    context 'with token' do
+      before do
+        allow(controller).to receive(:doorkeeper_token) { token }
+        put :update, params: { announcement_id: announcement.id, id: '😂' }
+      end
+
+      it 'returns http success' do
+        expect(response).to have_http_status(200)
+      end
+
+      it 'creates reaction' do
+        expect(announcement.announcement_reactions.find_by(name: '😂', account: user.account)).to_not be_nil
+      end
+    end
+  end
+
+  describe 'DELETE #destroy' do
+    before do
+      announcement.announcement_reactions.create!(account: user.account, name: '😂')
+    end
+
+    context 'without token' do
+      it 'returns http unauthorized' do
+        delete :destroy, params: { announcement_id: announcement.id, id: '😂' }
+        expect(response).to have_http_status :unauthorized
+      end
+    end
+
+    context 'with token' do
+      before do
+        allow(controller).to receive(:doorkeeper_token) { token }
+        delete :destroy, params: { announcement_id: announcement.id, id: '😂' }
+      end
+
+      it 'returns http success' do
+        expect(response).to have_http_status(200)
+      end
+
+      it 'creates reaction' do
+        expect(announcement.announcement_reactions.find_by(name: '😂', account: user.account)).to be_nil
+      end
+    end
+  end
+end
diff --git a/spec/controllers/api/v1/announcements_controller_spec.rb b/spec/controllers/api/v1/announcements_controller_spec.rb
new file mode 100644
index 000000000..6ee46b60e
--- /dev/null
+++ b/spec/controllers/api/v1/announcements_controller_spec.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe Api::V1::AnnouncementsController, type: :controller do
+  render_views
+
+  let(:user)   { Fabricate(:user) }
+  let(:scopes) { 'read' }
+  let(:token)  { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
+
+  let!(:announcement) { Fabricate(:announcement) }
+
+  describe 'GET #index' do
+    context 'without token' do
+      it 'returns http unprocessable entity' do
+        get :index
+        expect(response).to have_http_status :unprocessable_entity
+      end
+    end
+
+    context 'with token' do
+      before do
+        allow(controller).to receive(:doorkeeper_token) { token }
+        get :index
+      end
+
+      it 'returns http success' do
+        expect(response).to have_http_status(200)
+      end
+    end
+  end
+
+  describe 'POST #dismiss' do
+    context 'without token' do
+      it 'returns http unauthorized' do
+        post :dismiss, params: { id: announcement.id }
+        expect(response).to have_http_status :unauthorized
+      end
+    end
+
+    context 'with token' do
+      let(:scopes) { 'write:accounts' }
+
+      before do
+        allow(controller).to receive(:doorkeeper_token) { token }
+        post :dismiss, params: { id: announcement.id }
+      end
+
+      it 'returns http success' do
+        expect(response).to have_http_status(200)
+      end
+
+      it 'dismisses announcement' do
+        expect(announcement.announcement_mutes.find_by(account: user.account)).to_not be_nil
+      end
+    end
+  end
+end
diff --git a/spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb b/spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb
index 40f75c700..f053ae573 100644
--- a/spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb
+++ b/spec/controllers/api/v1/statuses/favourited_by_accounts_controller_spec.rb
@@ -6,6 +6,8 @@ RSpec.describe Api::V1::Statuses::FavouritedByAccountsController, type: :control
   let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
   let(:app)   { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
   let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: 'read:accounts') }
+  let(:alice) { Fabricate(:account) }
+  let(:bob)   { Fabricate(:account) }
 
   context 'with an oauth token' do
     before do
@@ -16,14 +18,28 @@ RSpec.describe Api::V1::Statuses::FavouritedByAccountsController, type: :control
       let(:status) { Fabricate(:status, account: user.account) }
 
       before do
-        Fabricate(:favourite, status: status)
+        Favourite.create!(account: alice, status: status)
+        Favourite.create!(account: bob, status: status)
       end
 
       it 'returns http success' do
-        get :index, params: { status_id: status.id, limit: 1 }
+        get :index, params: { status_id: status.id, limit: 2 }
         expect(response).to have_http_status(200)
         expect(response.headers['Link'].links.size).to eq(2)
       end
+
+      it 'returns accounts who favorited the status' do
+        get :index, params: { status_id: status.id, limit: 2 }
+        expect(body_as_json.size).to eq 2
+      expect([body_as_json[0][:id], body_as_json[1][:id]]).to match_array([alice.id.to_s, bob.id.to_s])
+      end
+
+      it 'does not return blocked users' do
+        user.account.block!(bob)
+        get :index, params: { status_id: status.id, limit: 2 }
+        expect(body_as_json.size).to eq 1
+        expect(body_as_json[0][:id]).to eq alice.id.to_s
+      end
     end
   end
 
diff --git a/spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb b/spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb
index d758786dc..60908b7b3 100644
--- a/spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb
+++ b/spec/controllers/api/v1/statuses/reblogged_by_accounts_controller_spec.rb
@@ -6,6 +6,8 @@ RSpec.describe Api::V1::Statuses::RebloggedByAccountsController, type: :controll
   let(:user)  { Fabricate(:user, account: Fabricate(:account, username: 'alice')) }
   let(:app)   { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
   let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: 'read:accounts') }
+  let(:alice) { Fabricate(:account) }
+  let(:bob)   { Fabricate(:account) }
 
   context 'with an oauth token' do
     before do
@@ -16,14 +18,28 @@ RSpec.describe Api::V1::Statuses::RebloggedByAccountsController, type: :controll
       let(:status) { Fabricate(:status, account: user.account) }
 
       before do
-        Fabricate(:status, reblog_of_id: status.id)
+        Fabricate(:status, account: alice, reblog_of_id: status.id)
+        Fabricate(:status, account: bob, reblog_of_id: status.id)
       end
 
       it 'returns http success' do
-        get :index, params: { status_id: status.id, limit: 1 }
+        get :index, params: { status_id: status.id, limit: 2 }
         expect(response).to have_http_status(200)
         expect(response.headers['Link'].links.size).to eq(2)
       end
+
+      it 'returns accounts who reblogged the status' do
+        get :index, params: { status_id: status.id, limit: 2 }
+        expect(body_as_json.size).to eq 2
+      expect([body_as_json[0][:id], body_as_json[1][:id]]).to match_array([alice.id.to_s, bob.id.to_s])
+      end
+
+      it 'does not return blocked users' do
+        user.account.block!(bob)
+        get :index, params: { status_id: status.id, limit: 2 }
+        expect(body_as_json.size).to eq 1
+        expect(body_as_json[0][:id]).to eq alice.id.to_s
+      end
     end
   end
 
diff --git a/spec/controllers/api/v1/trends_controller_spec.rb b/spec/controllers/api/v1/trends_controller_spec.rb
new file mode 100644
index 000000000..91e0d18fe
--- /dev/null
+++ b/spec/controllers/api/v1/trends_controller_spec.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe Api::V1::TrendsController, type: :controller do
+  render_views
+
+  describe 'GET #index' do
+    before do
+      allow(TrendingTags).to receive(:get).and_return(Fabricate.times(10, :tag))
+      get :index
+    end
+
+    it 'returns http success' do
+      expect(response).to have_http_status(200)
+    end
+  end
+end
diff --git a/spec/controllers/concerns/obfuscate_filename_spec.rb b/spec/controllers/concerns/obfuscate_filename_spec.rb
deleted file mode 100644
index e06d53c03..000000000
--- a/spec/controllers/concerns/obfuscate_filename_spec.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-describe ApplicationController, type: :controller do
-  controller do
-    include ObfuscateFilename
-
-    obfuscate_filename :file
-
-    def file
-      render plain: params[:file]&.original_filename
-    end
-  end
-
-  before do
-    routes.draw { get 'file' => 'anonymous#file' }
-  end
-
-  it 'obfusticates filename if the given parameter is specified' do
-    file = fixture_file_upload('files/imports.txt', 'text/plain')
-    post 'file', params: { file: file }
-    expect(response.body).to end_with '.txt'
-    expect(response.body).not_to include 'imports'
-  end
-
-  it 'does nothing if the given parameter is not specified' do
-    post 'file'
-  end
-end
diff --git a/spec/controllers/follower_accounts_controller_spec.rb b/spec/controllers/follower_accounts_controller_spec.rb
index 83032ab64..34a0cf3f4 100644
--- a/spec/controllers/follower_accounts_controller_spec.rb
+++ b/spec/controllers/follower_accounts_controller_spec.rb
@@ -22,6 +22,18 @@ describe FollowerAccountsController do
         expect(assigned[0]).to eq follow1
         expect(assigned[1]).to eq follow0
       end
+
+      it 'does not assign blocked users' do
+        user = Fabricate(:user)
+        user.account.block!(follower0)
+        sign_in(user)
+
+        expect(response).to have_http_status(200)
+
+        assigned = assigns(:follows).to_a
+        expect(assigned.size).to eq 1
+        expect(assigned[0]).to eq follow1
+      end
     end
 
     context 'when format is json' do
diff --git a/spec/controllers/following_accounts_controller_spec.rb b/spec/controllers/following_accounts_controller_spec.rb
index d5e4ee587..e9a1f597d 100644
--- a/spec/controllers/following_accounts_controller_spec.rb
+++ b/spec/controllers/following_accounts_controller_spec.rb
@@ -22,6 +22,18 @@ describe FollowingAccountsController do
         expect(assigned[0]).to eq follow1
         expect(assigned[1]).to eq follow0
       end
+
+      it 'does not assign blocked users' do
+        user = Fabricate(:user)
+        user.account.block!(followee0)
+        sign_in(user)
+
+        expect(response).to have_http_status(200)
+
+        assigned = assigns(:follows).to_a
+        expect(assigned.size).to eq 1
+        expect(assigned[0]).to eq follow1
+      end
     end
 
     context 'when format is json' do
diff --git a/spec/fabricators/announcement_fabricator.rb b/spec/fabricators/announcement_fabricator.rb
new file mode 100644
index 000000000..5a3871d90
--- /dev/null
+++ b/spec/fabricators/announcement_fabricator.rb
@@ -0,0 +1,6 @@
+Fabricator(:announcement) do
+  text      { Faker::Lorem.paragraph(sentence_count: 2) }
+  published true
+  starts_at nil
+  ends_at   nil
+end
diff --git a/spec/fabricators/announcement_mute_fabricator.rb b/spec/fabricators/announcement_mute_fabricator.rb
new file mode 100644
index 000000000..c4eafe8f4
--- /dev/null
+++ b/spec/fabricators/announcement_mute_fabricator.rb
@@ -0,0 +1,4 @@
+Fabricator(:announcement_mute) do
+  account
+  announcement
+end
diff --git a/spec/fabricators/announcement_reaction_fabricator.rb b/spec/fabricators/announcement_reaction_fabricator.rb
new file mode 100644
index 000000000..f923c59c6
--- /dev/null
+++ b/spec/fabricators/announcement_reaction_fabricator.rb
@@ -0,0 +1,5 @@
+Fabricator(:announcement_reaction) do
+  account
+  announcement
+  name '🌿'
+end
diff --git a/spec/fabricators/media_attachment_fabricator.rb b/spec/fabricators/media_attachment_fabricator.rb
index bb938e36d..651927c2d 100644
--- a/spec/fabricators/media_attachment_fabricator.rb
+++ b/spec/fabricators/media_attachment_fabricator.rb
@@ -1,16 +1,12 @@
 Fabricator(:media_attachment) do
   account
+
   file do |attrs|
-    [
-      case attrs[:type]
-      when :gifv
-        attachment_fixture ['attachment.gif', 'attachment.webm'].sample
-      when :image
-        attachment_fixture 'attachment.jpg'
-      when nil
-        attachment_fixture ['attachment.gif', 'attachment.jpg', 'attachment.webm'].sample
-      end,
-      nil
-    ].sample
+    case attrs[:type]
+    when :gifv, :video
+      attachment_fixture('attachment.webm')
+    else
+      attachment_fixture('attachment.jpg')
+    end
   end
 end
diff --git a/spec/features/log_in_spec.rb b/spec/features/log_in_spec.rb
index b874c255b..de1a6de03 100644
--- a/spec/features/log_in_spec.rb
+++ b/spec/features/log_in_spec.rb
@@ -1,47 +1,51 @@
-require "rails_helper"
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+feature 'Log in' do
+  include ProfileStories
 
-feature "Log in" do
   given(:email)        { "test@example.com" }
   given(:password)     { "password" }
   given(:confirmed_at) { Time.zone.now }
 
   background do
-    Fabricate(:user, email: email, password: password, confirmed_at: confirmed_at)
+    as_a_registered_user
     visit new_user_session_path
   end
 
   subject { page }
 
-  scenario "A valid email and password user is able to log in" do
-    fill_in "user_email", with: email
-    fill_in "user_password", with: password
+  scenario 'A valid email and password user is able to log in' do
+    fill_in 'user_email', with: email
+    fill_in 'user_password', with: password
     click_on I18n.t('auth.login')
 
-    is_expected.to have_css("div.app-holder")
+    is_expected.to have_css('div.app-holder')
   end
 
-  scenario "A invalid email and password user is not able to log in" do
-    fill_in "user_email", with: "invalid_email"
-    fill_in "user_password", with: "invalid_password"
+  scenario 'A invalid email and password user is not able to log in' do
+    fill_in 'user_email', with: 'invalid_email'
+    fill_in 'user_password', with: 'invalid_password'
     click_on I18n.t('auth.login')
 
-    is_expected.to have_css(".flash-message", text: failure_message("invalid"))
+    is_expected.to have_css('.flash-message', text: failure_message('invalid'))
   end
 
   context do
     given(:confirmed_at) { nil }
 
-    scenario "A unconfirmed user is able to log in" do
-      fill_in "user_email", with: email
-      fill_in "user_password", with: password
+    scenario 'A unconfirmed user is able to log in' do
+      fill_in 'user_email', with: email
+      fill_in 'user_password', with: password
       click_on I18n.t('auth.login')
 
-      is_expected.to have_css("div.admin-wrapper")
+      is_expected.to have_css('div.admin-wrapper')
     end
   end
 
   def failure_message(message)
     keys = User.authentication_keys.map { |key| User.human_attribute_name(key) }
-    I18n.t("devise.failure.#{message}", authentication_keys: keys.join("support.array.words_connector"))
+    I18n.t("devise.failure.#{message}", authentication_keys: keys.join('support.array.words_connector'))
   end
 end
diff --git a/spec/features/profile_spec.rb b/spec/features/profile_spec.rb
new file mode 100644
index 000000000..3202167ca
--- /dev/null
+++ b/spec/features/profile_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+feature 'Profile' do
+  include ProfileStories
+
+  given(:local_domain) { ENV['LOCAL_DOMAIN'] }
+
+  background do
+    as_a_logged_in_user
+    with_alice_as_local_user
+  end
+
+  subject { page }
+
+  scenario 'I can view Annes public account' do
+    visit account_path('alice')
+
+    is_expected.to have_title("alice (@alice@#{local_domain})")
+
+    within('.public-account-header h1') do
+      is_expected.to have_content("alice @alice@#{local_domain}")
+    end
+
+    bio_elem = first('.public-account-bio')
+    expect(bio_elem).to have_content(alice_bio)
+    # The bio has hashtags made clickable
+    expect(bio_elem).to have_link('cryptology')
+    expect(bio_elem).to have_link('science')
+    # Nicknames are make clickable
+    expect(bio_elem).to have_link('@alice')
+    expect(bio_elem).to have_link('@bob')
+    # Nicknames not on server are not clickable
+    expect(bio_elem).not_to have_link('@pepe')
+  end
+
+  scenario 'I can change my account' do
+    visit settings_profile_path
+    fill_in 'Display name', with: 'Bob'
+    fill_in 'Bio', with: 'Bob is silent'
+    click_on 'Save changes'
+    is_expected.to have_content 'Changes successfully saved!'
+
+    # View my own public profile and see the changes
+    click_link "Bob @bob@#{local_domain}"
+
+    within('.public-account-header h1') do
+      is_expected.to have_content("Bob @bob@#{local_domain}")
+    end
+    expect(first('.public-account-bio')).to have_content('Bob is silent')
+  end
+end
diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb
index b8108a247..633d59c2a 100644
--- a/spec/lib/formatter_spec.rb
+++ b/spec/lib/formatter_spec.rb
@@ -242,6 +242,30 @@ RSpec.describe Formatter do
         is_expected.to include '/tags/hashtag%E3%82%BF%E3%82%B0" class="mention hashtag" rel="tag">#<span>hashtagタグ</span></a>'
       end
     end
+
+    context 'given a stand-alone xmpp: URI' do
+      let(:text) { 'xmpp:user@instance.com' }
+
+      it 'matches the full URI' do
+        is_expected.to include 'href="xmpp:user@instance.com"'
+      end
+    end
+
+    context 'given a an xmpp: URI with a query-string' do
+      let(:text) { 'please join xmpp:muc@instance.com?join right now' }
+
+      it 'matches the full URI' do
+        is_expected.to include 'href="xmpp:muc@instance.com?join"'
+      end
+    end
+
+    context 'given text containing a magnet: URI' do
+      let(:text) { 'wikipedia gives this example of a magnet uri: magnet:?xt=urn:btih:c12fe1c06bba254a9dc9f519b335aa7c1367a88a' }
+
+      it 'matches the full URI' do
+        is_expected.to include 'href="magnet:?xt=urn:btih:c12fe1c06bba254a9dc9f519b335aa7c1367a88a"'
+      end
+    end
   end
 
   describe '#format_spoiler' do
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index b2f6234cb..98d29e6f3 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -215,13 +215,6 @@ RSpec.describe Account, type: :model do
     end
   end
 
-  describe '#subscription' do
-    it 'returns an OStatus subscription' do
-      account = Fabricate(:account)
-      expect(account.subscription('')).to be_instance_of OStatus2::Subscription
-    end
-  end
-
   describe '#object_type' do
     it 'is always a person' do
       account = Fabricate(:account)
@@ -626,18 +619,18 @@ RSpec.describe Account, type: :model do
     end
 
     context 'when is remote' do
-      it 'is invalid if the username is not unique in case-sensitive comparison among accounts in the same normalized domain' do
+      it 'is invalid if the username is same among accounts in the same normalized domain' do
         Fabricate(:account, domain: 'にゃん', username: 'username')
         account = Fabricate.build(:account, domain: 'xn--r9j5b5b', username: 'username')
         account.valid?
         expect(account).to model_have_error_on_field(:username)
       end
 
-      it 'is valid even if the username is unique only in case-sensitive comparison among accounts in the same normalized domain' do
+      it 'is invalid if the username is not unique in case-insensitive comparison among accounts in the same normalized domain' do
         Fabricate(:account, domain: 'にゃん', username: 'username')
         account = Fabricate.build(:account, domain: 'xn--r9j5b5b', username: 'Username')
         account.valid?
-        expect(account).not_to model_have_error_on_field(:username)
+        expect(account).to model_have_error_on_field(:username)
       end
 
       it 'is valid even if the username contains hyphens' do
@@ -823,4 +816,5 @@ RSpec.describe Account, type: :model do
   end
 
   include_examples 'AccountAvatar', :account
+  include_examples 'AccountHeader', :account
 end
diff --git a/spec/models/announcement_mute_spec.rb b/spec/models/announcement_mute_spec.rb
new file mode 100644
index 000000000..9d0e4c903
--- /dev/null
+++ b/spec/models/announcement_mute_spec.rb
@@ -0,0 +1,4 @@
+require 'rails_helper'
+
+RSpec.describe AnnouncementMute, type: :model do
+end
diff --git a/spec/models/announcement_reaction_spec.rb b/spec/models/announcement_reaction_spec.rb
new file mode 100644
index 000000000..f6e151584
--- /dev/null
+++ b/spec/models/announcement_reaction_spec.rb
@@ -0,0 +1,4 @@
+require 'rails_helper'
+
+RSpec.describe AnnouncementReaction, type: :model do
+end
diff --git a/spec/models/announcement_spec.rb b/spec/models/announcement_spec.rb
new file mode 100644
index 000000000..7f7b647a9
--- /dev/null
+++ b/spec/models/announcement_spec.rb
@@ -0,0 +1,4 @@
+require 'rails_helper'
+
+RSpec.describe Announcement, type: :model do
+end
diff --git a/spec/models/domain_block_spec.rb b/spec/models/domain_block_spec.rb
index d98c5e118..28647dc89 100644
--- a/spec/models/domain_block_spec.rb
+++ b/spec/models/domain_block_spec.rb
@@ -52,6 +52,16 @@ RSpec.describe DomainBlock, type: :model do
       block = Fabricate(:domain_block, domain: 'sub.example.com')
       expect(DomainBlock.rule_for('sub.example.com')).to eq block
     end
+
+    it 'returns a rule matching a blocked TLD' do
+      block = Fabricate(:domain_block, domain: 'google')
+      expect(DomainBlock.rule_for('google')).to eq block
+    end
+
+    it 'returns a rule matching a subdomain of a blocked TLD' do
+      block = Fabricate(:domain_block, domain: 'google')
+      expect(DomainBlock.rule_for('maps.google')).to eq block
+    end
   end
 
   describe '#stricter_than?' do
diff --git a/spec/models/media_attachment_spec.rb b/spec/models/media_attachment_spec.rb
index 7ddfba7ed..456bc4216 100644
--- a/spec/models/media_attachment_spec.rb
+++ b/spec/models/media_attachment_spec.rb
@@ -31,14 +31,6 @@ RSpec.describe MediaAttachment, type: :model do
     context 'file is blank' do
       let(:file) { nil }
 
-      context 'remote_url is blank' do
-        let(:remote_url) { '' }
-
-        it 'returns false' do
-          is_expected.to be false
-        end
-      end
-
       context 'remote_url is present' do
         let(:remote_url) { 'remote_url' }
 
@@ -133,6 +125,29 @@ RSpec.describe MediaAttachment, type: :model do
       expect(media.file.meta["small"]["height"]).to eq 327
       expect(media.file.meta["small"]["aspect"]).to eq 490.0 / 327
     end
+
+    it 'gives the file a random name' do
+      expect(media.file_file_name).to_not eq 'attachment.jpg'
+    end
+  end
+
+  describe 'base64-encoded jpeg' do
+    let(:base64_attachment) { "data:image/jpeg;base64,#{Base64.encode64(attachment_fixture('attachment.jpg').read)}" }
+    let(:media) { MediaAttachment.create(account: Fabricate(:account), file: base64_attachment) }
+
+    it 'saves media attachment' do
+      expect(media.persisted?).to be true
+      expect(media.file).to_not be_nil
+    end
+
+    it 'gives the file a file name' do
+      expect(media.file_file_name).to_not be_blank
+    end
+  end
+
+  it 'is invalid without file' do
+    media = MediaAttachment.new(account: Fabricate(:account))
+    expect(media.valid?).to be false
   end
 
   describe 'descriptions for remote attachments' do
diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb
index 02f533287..38537da44 100644
--- a/spec/models/status_spec.rb
+++ b/spec/models/status_spec.rb
@@ -96,16 +96,20 @@ RSpec.describe Status, type: :model do
 
     context 'unless destroyed?' do
       context 'if reblog?' do
-        it 'returns "#{account.acct} shared a status by #{reblog.account.acct}"' do
+        it 'returns "#{account.acct} shared #{reblog.account.acct}\'s: #{preview}"' do
           reblog = subject.reblog = other
-          expect(subject.title).to eq "#{account.acct} shared a status by #{reblog.account.acct}"
+          preview = subject.text.slice(0, 10).split("\n")[0]
+          expect(subject.title).to(
+            eq "#{account.acct} shared #{reblog.account.acct}'s: #{preview}"
+          )
         end
       end
 
       context 'unless reblog?' do
-        it 'returns "New status by #{account.acct}"' do
+        it 'returns "#{account.acct}: #{preview}"' do
           subject.reblog = nil
-          expect(subject.title).to eq "New status by #{account.acct}"
+          preview = subject.text.slice(0, 20).split("\n")[0]
+          expect(subject.title).to eq "#{account.acct}: #{preview}"
         end
       end
     end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index d7c0b5359..5686ec909 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -322,20 +322,7 @@ RSpec.describe User, type: :model do
     end
 
     it 'disables user' do
-      expect(user).to have_attributes(disabled: true, current_sign_in_at: nil, last_sign_in_at: current_sign_in_at)
-    end
-  end
-
-  describe '#disable!' do
-    subject(:user) { Fabricate(:user, disabled: false, current_sign_in_at: current_sign_in_at, last_sign_in_at: nil) }
-    let(:current_sign_in_at) { Time.zone.now }
-
-    before do
-      user.disable!
-    end
-
-    it 'disables user' do
-      expect(user).to have_attributes(disabled: true, current_sign_in_at: nil, last_sign_in_at: current_sign_in_at)
+      expect(user).to have_attributes(disabled: true)
     end
   end
 
diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb
index bf06f50e9..025a3da40 100644
--- a/spec/services/post_status_service_spec.rb
+++ b/spec/services/post_status_service_spec.rb
@@ -212,14 +212,18 @@ RSpec.describe PostStatusService, type: :service do
 
   it 'does not allow attaching both videos and images' do
     account = Fabricate(:account)
+    video   = Fabricate(:media_attachment, type: :video, account: account)
+    image   = Fabricate(:media_attachment, type: :image, account: account)
+
+    video.update(type: :video)
 
     expect do
       subject.call(
         account,
         text: "test status update",
         media_ids: [
-          Fabricate(:media_attachment, type: :video, account: account),
-          Fabricate(:media_attachment, type: :image, account: account),
+          video,
+          image,
         ].map(&:id),
       )
     end.to raise_error(
diff --git a/spec/services/process_mentions_service_spec.rb b/spec/services/process_mentions_service_spec.rb
index b1abd79b0..c30de8eeb 100644
--- a/spec/services/process_mentions_service_spec.rb
+++ b/spec/services/process_mentions_service_spec.rb
@@ -5,11 +5,11 @@ RSpec.describe ProcessMentionsService, type: :service do
   let(:visibility) { :public }
   let(:status)     { Fabricate(:status, account: account, text: "Hello @#{remote_user.acct}", visibility: visibility) }
 
+  subject { ProcessMentionsService.new }
+
   context 'OStatus with public toot' do
     let(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :ostatus, domain: 'example.com', salmon_url: 'http://salmon.example.com') }
 
-    subject { ProcessMentionsService.new }
-
     before do
       stub_request(:post, remote_user.salmon_url)
       subject.call(status)
@@ -24,8 +24,6 @@ RSpec.describe ProcessMentionsService, type: :service do
     let(:visibility)  { :private }
     let(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :ostatus, domain: 'example.com', salmon_url: 'http://salmon.example.com') }
 
-    subject { ProcessMentionsService.new }
-
     before do
       stub_request(:post, remote_user.salmon_url)
       subject.call(status)
@@ -41,29 +39,45 @@ RSpec.describe ProcessMentionsService, type: :service do
   end
 
   context 'ActivityPub' do
-    let(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') }
+    context do
+      let(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') }
 
-    subject { ProcessMentionsService.new }
+      before do
+        stub_request(:post, remote_user.inbox_url)
+        subject.call(status)
+      end
 
-    before do
-      stub_request(:post, remote_user.inbox_url)
-      subject.call(status)
-    end
+      it 'creates a mention' do
+        expect(remote_user.mentions.where(status: status).count).to eq 1
+      end
 
-    it 'creates a mention' do
-      expect(remote_user.mentions.where(status: status).count).to eq 1
+      it 'sends activity to the inbox' do
+        expect(a_request(:post, remote_user.inbox_url)).to have_been_made.once
+      end
     end
 
-    it 'sends activity to the inbox' do
-      expect(a_request(:post, remote_user.inbox_url)).to have_been_made.once
+    context 'with an IDN domain' do
+      let(:remote_user) { Fabricate(:account, username: 'sneak', protocol: :activitypub, domain: 'xn--hresiar-mxa.ch', inbox_url: 'http://example.com/inbox') }
+      let(:status) { Fabricate(:status, account: account, text: "Hello @sneak@hæresiar.ch") }
+
+      before do
+        stub_request(:post, remote_user.inbox_url)
+        subject.call(status)
+      end
+
+      it 'creates a mention' do
+        expect(remote_user.mentions.where(status: status).count).to eq 1
+      end
+
+      it 'sends activity to the inbox' do
+        expect(a_request(:post, remote_user.inbox_url)).to have_been_made.once
+      end
     end
   end
 
   context 'Temporarily-unreachable ActivityPub user' do
     let(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox', last_webfingered_at: nil) }
 
-    subject { ProcessMentionsService.new }
-
     before do
       stub_request(:get, "https://example.com/.well-known/host-meta").to_return(status: 404)
       stub_request(:get, "https://example.com/.well-known/webfinger?resource=acct:remote_user@example.com").to_return(status: 500)
diff --git a/spec/support/examples/models/concerns/account_avatar.rb b/spec/support/examples/models/concerns/account_avatar.rb
index f2a8a2459..2180f5273 100644
--- a/spec/support/examples/models/concerns/account_avatar.rb
+++ b/spec/support/examples/models/concerns/account_avatar.rb
@@ -16,4 +16,24 @@ shared_examples 'AccountAvatar' do |fabricator|
       end
     end
   end
+
+  describe 'base64-encoded files' do
+    let(:base64_attachment) { "data:image/jpeg;base64,#{Base64.encode64(attachment_fixture('attachment.jpg').read)}" }
+    let(:account) { Fabricate(fabricator, avatar: base64_attachment) }
+
+    it 'saves avatar' do
+      expect(account.persisted?).to be true
+      expect(account.avatar).to_not be_nil
+    end
+
+    it 'gives the avatar a file name' do
+      expect(account.avatar_file_name).to_not be_blank
+    end
+
+    it 'saves a new avatar under a different file name' do
+      previous_file_name = account.avatar_file_name
+      account.update(avatar: base64_attachment)
+      expect(account.avatar_file_name).to_not eq previous_file_name
+    end
+  end
 end
diff --git a/spec/support/examples/models/concerns/account_header.rb b/spec/support/examples/models/concerns/account_header.rb
new file mode 100644
index 000000000..77ee0e629
--- /dev/null
+++ b/spec/support/examples/models/concerns/account_header.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+shared_examples 'AccountHeader' do |fabricator|
+  describe 'base64-encoded files' do
+    let(:base64_attachment) { "data:image/jpeg;base64,#{Base64.encode64(attachment_fixture('attachment.jpg').read)}" }
+    let(:account) { Fabricate(fabricator, header: base64_attachment) }
+
+    it 'saves header' do
+      expect(account.persisted?).to be true
+      expect(account.header).to_not be_nil
+    end
+
+    it 'gives the header a file name' do
+      expect(account.header_file_name).to_not be_blank
+    end
+
+    it 'saves a new header under a different file name' do
+      previous_file_name = account.header_file_name
+      account.update(header: base64_attachment)
+      expect(account.header_file_name).to_not eq previous_file_name
+    end
+  end
+end
diff --git a/spec/support/stories/profile_stories.rb b/spec/support/stories/profile_stories.rb
new file mode 100644
index 000000000..75b413330
--- /dev/null
+++ b/spec/support/stories/profile_stories.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module ProfileStories
+  attr_reader :bob, :alice, :alice_bio
+
+  def as_a_registered_user
+    @bob = Fabricate(
+      :user,
+      email: email, password: password, confirmed_at: confirmed_at,
+      account: Fabricate(:account, username: 'bob')
+    )
+  end
+
+  def as_a_logged_in_user
+    as_a_registered_user
+    visit new_user_session_path
+    fill_in 'user_email', with: email
+    fill_in 'user_password', with: password
+    click_on I18n.t('auth.login')
+  end
+
+  def with_alice_as_local_user
+    @alice_bio = '@alice and @bob are fictional characters commonly used as'\
+                 'placeholder names in #cryptology, as well as #science and'\
+                 'engineering 📖 literature. Not affilated with @pepe.'
+
+    @alice = Fabricate(
+      :user,
+      email: 'alice@example.com', password: password, confirmed_at: confirmed_at,
+      account: Fabricate(:account, username: 'alice', note: @alice_bio)
+    )
+  end
+
+  def confirmed_at
+    @confirmed_at ||= Time.zone.now
+  end
+
+  def email
+    @email ||= 'test@example.com'
+  end
+
+  def password
+    @password ||= 'password'
+  end
+end
diff --git a/spec/validators/reaction_validator_spec.rb b/spec/validators/reaction_validator_spec.rb
new file mode 100644
index 000000000..d73104cb6
--- /dev/null
+++ b/spec/validators/reaction_validator_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe ReactionValidator do
+  let(:announcement) { Fabricate(:announcement) }
+
+  describe '#validate' do
+    it 'adds error when not a valid unicode emoji' do
+      reaction = announcement.announcement_reactions.build(name: 'F')
+      subject.validate(reaction)
+      expect(reaction.errors).to_not be_empty
+    end
+
+    it 'does not add error when non-unicode emoji is a custom emoji' do
+      custom_emoji = Fabricate(:custom_emoji)
+      reaction = announcement.announcement_reactions.build(name: custom_emoji.shortcode, custom_emoji_id: custom_emoji.id)
+      subject.validate(reaction)
+      expect(reaction.errors).to be_empty
+    end
+
+    it 'adds error when 8 reactions already exist' do
+      %w(🐘 ❤️ 🙉 😍 😋 😂 😞 👍).each do |name|
+        announcement.announcement_reactions.create!(name: name, account: Fabricate(:account))
+      end
+
+      reaction = announcement.announcement_reactions.build(name: '😘')
+      subject.validate(reaction)
+      expect(reaction.errors).to_not be_empty
+    end
+
+    it 'does not add error when new reaction is part of the existing ones' do
+      %w(🐘 ❤️ 🙉 😍 😋 😂 😞 👍).each do |name|
+        announcement.announcement_reactions.create!(name: name, account: Fabricate(:account))
+      end
+
+      reaction = announcement.announcement_reactions.build(name: '😋')
+      subject.validate(reaction)
+      expect(reaction.errors).to be_empty
+    end
+  end
+end
diff --git a/spec/validators/unique_username_validator_spec.rb b/spec/validators/unique_username_validator_spec.rb
index c2e2eedf4..6867cbc6c 100644
--- a/spec/validators/unique_username_validator_spec.rb
+++ b/spec/validators/unique_username_validator_spec.rb
@@ -4,22 +4,65 @@ require 'rails_helper'
 
 describe UniqueUsernameValidator do
   describe '#validate' do
+    context 'when local account' do
+      it 'does not add errors if username is nil' do
+        account = double(username: nil, domain: nil, persisted?: false, errors: double(add: nil))
+        subject.validate(account)
+        expect(account.errors).to_not have_received(:add)
+      end
+
+      it 'does not add errors when existing one is subject itself' do
+        account = Fabricate(:account, username: 'abcdef')
+        expect(account).to be_valid
+      end
+
+      it 'adds an error when the username is already used with ignoring cases' do
+        Fabricate(:account, username: 'ABCdef')
+        account = double(username: 'abcDEF', domain: nil, persisted?: false, errors: double(add: nil))
+        subject.validate(account)
+        expect(account.errors).to have_received(:add)
+      end
+
+      it 'does not add errors when same username remote account exists' do
+        Fabricate(:account, username: 'abcdef', domain: 'example.com')
+        account = double(username: 'abcdef', domain: nil, persisted?: false, errors: double(add: nil))
+        subject.validate(account)
+        expect(account.errors).to_not have_received(:add)
+      end
+    end
+  end
+
+  context 'when remote account' do
     it 'does not add errors if username is nil' do
-      account = double(username: nil, persisted?: false, errors: double(add: nil))
+      account = double(username: nil, domain: 'example.com', persisted?: false, errors: double(add: nil))
       subject.validate(account)
       expect(account.errors).to_not have_received(:add)
     end
 
     it 'does not add errors when existing one is subject itself' do
-      account = Fabricate(:account, username: 'abcdef')
+      account = Fabricate(:account, username: 'abcdef', domain: 'example.com')
       expect(account).to be_valid
     end
 
     it 'adds an error when the username is already used with ignoring cases' do
-      Fabricate(:account, username: 'ABCdef')
-      account = double(username: 'abcDEF', persisted?: false, errors: double(add: nil))
+      Fabricate(:account, username: 'ABCdef', domain: 'example.com')
+      account = double(username: 'abcDEF', domain: 'example.com', persisted?: false, errors: double(add: nil))
+      subject.validate(account)
+      expect(account.errors).to have_received(:add)
+    end
+
+    it 'adds an error when the domain is already used with ignoring cases' do
+      Fabricate(:account, username: 'ABCdef', domain: 'example.com')
+      account = double(username: 'ABCdef', domain: 'EXAMPLE.COM', persisted?: false, errors: double(add: nil))
       subject.validate(account)
       expect(account.errors).to have_received(:add)
     end
+
+    it 'does not add errors when account with the same username and another domain exists' do
+      Fabricate(:account, username: 'abcdef', domain: 'example.com')
+      account = double(username: 'abcdef', domain: 'example2.com', persisted?: false, errors: double(add: nil))
+      subject.validate(account)
+      expect(account.errors).to_not have_received(:add)
+    end
   end
 end
diff --git a/spec/workers/refollow_worker_spec.rb b/spec/workers/refollow_worker_spec.rb
new file mode 100644
index 000000000..29771aa59
--- /dev/null
+++ b/spec/workers/refollow_worker_spec.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe RefollowWorker do
+  subject { described_class.new }
+  let(:account) { Fabricate(:account, domain: 'example.org', protocol: :activitypub) }
+  let(:alice)   { Fabricate(:account, domain: nil, username: 'alice') }
+  let(:bob)     { Fabricate(:account, domain: nil, username: 'bob') }
+
+  describe 'perform' do
+    let(:service) { double }
+
+    before do
+      allow(FollowService).to receive(:new).and_return(service)
+      allow(service).to receive(:call)
+
+      alice.follow!(account, reblogs: true)
+      bob.follow!(account, reblogs: false)
+    end
+
+    it 'calls FollowService for local followers' do
+      result = subject.perform(account.id)
+
+      expect(result).to be_nil
+      expect(service).to have_received(:call).with(alice, account, reblogs: true)
+      expect(service).to have_received(:call).with(bob, account, reblogs: false)
+    end
+  end
+end
diff --git a/streaming/index.js b/streaming/index.js
index 64e71f353..1f95a4626 100644
--- a/streaming/index.js
+++ b/streaming/index.js
@@ -442,8 +442,11 @@ const startWorker = (workerId) => {
     const accountId = req.accountId || req.remoteAddress;
 
     res.setHeader('Content-Type', 'text/event-stream');
+    res.setHeader('Cache-Control', 'no-store');
     res.setHeader('Transfer-Encoding', 'chunked');
 
+    res.write(':)\n');
+
     const heartbeat = setInterval(() => res.write(':thump\n'), 15000);
 
     req.on('close', () => {
diff --git a/yarn.lock b/yarn.lock
index f7834e469..586423de5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,621 +2,669 @@
 # yarn lockfile v1
 
 
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5":
-  version "7.5.5"
-  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d"
-  integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==
-  dependencies:
-    "@babel/highlight" "^7.0.0"
-
-"@babel/core@^7.1.0", "@babel/core@^7.4.5", "@babel/core@^7.7.5":
-  version "7.7.5"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.5.tgz#ae1323cd035b5160293307f50647e83f8ba62f7e"
-  integrity sha512-M42+ScN4+1S9iB6f+TL7QBpoQETxbclx+KNoKJABghnKYE+fMzSGqst0BZJc8CpI625bwPwYgUyRvxZ+0mZzpw==
-  dependencies:
-    "@babel/code-frame" "^7.5.5"
-    "@babel/generator" "^7.7.4"
-    "@babel/helpers" "^7.7.4"
-    "@babel/parser" "^7.7.5"
-    "@babel/template" "^7.7.4"
-    "@babel/traverse" "^7.7.4"
-    "@babel/types" "^7.7.4"
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
+  integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==
+  dependencies:
+    "@babel/highlight" "^7.8.3"
+
+"@babel/compat-data@^7.8.0", "@babel/compat-data@^7.8.1":
+  version "7.8.1"
+  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.1.tgz#fc0bbbb7991e4fb2b47e168e60f2cc2c41680be9"
+  integrity sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw==
+  dependencies:
+    browserslist "^4.8.2"
+    invariant "^2.2.4"
+    semver "^5.5.0"
+
+"@babel/core@^7.1.0", "@babel/core@^7.4.5", "@babel/core@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.3.tgz#30b0ebb4dd1585de6923a0b4d179e0b9f5d82941"
+  integrity sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==
+  dependencies:
+    "@babel/code-frame" "^7.8.3"
+    "@babel/generator" "^7.8.3"
+    "@babel/helpers" "^7.8.3"
+    "@babel/parser" "^7.8.3"
+    "@babel/template" "^7.8.3"
+    "@babel/traverse" "^7.8.3"
+    "@babel/types" "^7.8.3"
     convert-source-map "^1.7.0"
     debug "^4.1.0"
+    gensync "^1.0.0-beta.1"
     json5 "^2.1.0"
     lodash "^4.17.13"
     resolve "^1.3.2"
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/generator@^7.0.0", "@babel/generator@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.4.tgz#db651e2840ca9aa66f327dcec1dc5f5fa9611369"
-  integrity sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==
+"@babel/generator@^7.0.0", "@babel/generator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.3.tgz#0e22c005b0a94c1c74eafe19ef78ce53a4d45c03"
+  integrity sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==
   dependencies:
-    "@babel/types" "^7.7.4"
+    "@babel/types" "^7.8.3"
     jsesc "^2.5.1"
     lodash "^4.17.13"
     source-map "^0.5.0"
 
-"@babel/helper-annotate-as-pure@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz#bb3faf1e74b74bd547e867e48f551fa6b098b6ce"
-  integrity sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og==
+"@babel/helper-annotate-as-pure@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee"
+  integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==
   dependencies:
-    "@babel/types" "^7.7.4"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz#5f73f2b28580e224b5b9bd03146a4015d6217f5f"
-  integrity sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ==
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503"
+  integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==
   dependencies:
-    "@babel/helper-explode-assignable-expression" "^7.7.4"
-    "@babel/types" "^7.7.4"
+    "@babel/helper-explode-assignable-expression" "^7.8.3"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-builder-react-jsx@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.4.tgz#da188d247508b65375b2c30cf59de187be6b0c66"
-  integrity sha512-kvbfHJNN9dg4rkEM4xn1s8d1/h6TYNvajy9L1wx4qLn9HFg0IkTsQi4rfBe92nxrPUFcMsHoMV+8rU7MJb3fCA==
+"@babel/helper-builder-react-jsx@^7.8.0":
+  version "7.8.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.0.tgz#4b9111eb862f5fd8840c37d200610fa95ab0aad8"
+  integrity sha512-Zg7VLtZzcAHoQ13S0pEIGKo8OAG3s5kjsk/4keGmUeNuc810T9fVp6izIaL8ZVeAErRFWJdvqFItY3QMTHMsSg==
   dependencies:
-    "@babel/types" "^7.7.4"
+    "@babel/types" "^7.8.0"
     esutils "^2.0.0"
 
-"@babel/helper-call-delegate@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz#621b83e596722b50c0066f9dc37d3232e461b801"
-  integrity sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA==
+"@babel/helper-builder-react-jsx@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6"
+  integrity sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==
   dependencies:
-    "@babel/helper-hoist-variables" "^7.7.4"
-    "@babel/traverse" "^7.7.4"
-    "@babel/types" "^7.7.4"
+    "@babel/types" "^7.8.3"
+    esutils "^2.0.0"
 
-"@babel/helper-create-class-features-plugin@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz#fce60939fd50618610942320a8d951b3b639da2d"
-  integrity sha512-l+OnKACG4uiDHQ/aJT8dwpR+LhCJALxL0mJ6nzjB25e5IPwqV1VOsY7ah6UB1DG+VOXAIMtuC54rFJGiHkxjgA==
+"@babel/helper-call-delegate@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz#de82619898aa605d409c42be6ffb8d7204579692"
+  integrity sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==
   dependencies:
-    "@babel/helper-function-name" "^7.7.4"
-    "@babel/helper-member-expression-to-functions" "^7.7.4"
-    "@babel/helper-optimise-call-expression" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-replace-supers" "^7.7.4"
-    "@babel/helper-split-export-declaration" "^7.7.4"
+    "@babel/helper-hoist-variables" "^7.8.3"
+    "@babel/traverse" "^7.8.3"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-create-regexp-features-plugin@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz#6d5762359fd34f4da1500e4cff9955b5299aaf59"
-  integrity sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A==
+"@babel/helper-compilation-targets@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.3.tgz#2deedc816fd41dca7355ef39fd40c9ea69f0719a"
+  integrity sha512-JLylPCsFjhLN+6uBSSh3iYdxKdeO9MNmoY96PE/99d8kyBFaXLORtAVhqN6iHa+wtPeqxKLghDOZry0+Aiw9Tw==
   dependencies:
-    "@babel/helper-regex" "^7.4.4"
-    regexpu-core "^4.6.0"
+    "@babel/compat-data" "^7.8.1"
+    browserslist "^4.8.2"
+    invariant "^2.2.4"
+    levenary "^1.1.0"
+    semver "^5.5.0"
 
-"@babel/helper-define-map@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz#2841bf92eb8bd9c906851546fe6b9d45e162f176"
-  integrity sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg==
+"@babel/helper-create-class-features-plugin@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz#5b94be88c255f140fd2c10dd151e7f98f4bff397"
+  integrity sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==
   dependencies:
-    "@babel/helper-function-name" "^7.7.4"
-    "@babel/types" "^7.7.4"
-    lodash "^4.17.13"
+    "@babel/helper-function-name" "^7.8.3"
+    "@babel/helper-member-expression-to-functions" "^7.8.3"
+    "@babel/helper-optimise-call-expression" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-replace-supers" "^7.8.3"
+    "@babel/helper-split-export-declaration" "^7.8.3"
 
-"@babel/helper-explode-assignable-expression@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz#fa700878e008d85dc51ba43e9fb835cddfe05c84"
-  integrity sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg==
+"@babel/helper-create-regexp-features-plugin@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79"
+  integrity sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==
   dependencies:
-    "@babel/traverse" "^7.7.4"
-    "@babel/types" "^7.7.4"
+    "@babel/helper-regex" "^7.8.3"
+    regexpu-core "^4.6.0"
 
-"@babel/helper-function-name@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e"
-  integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==
+"@babel/helper-define-map@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15"
+  integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==
   dependencies:
-    "@babel/helper-get-function-arity" "^7.7.4"
-    "@babel/template" "^7.7.4"
-    "@babel/types" "^7.7.4"
+    "@babel/helper-function-name" "^7.8.3"
+    "@babel/types" "^7.8.3"
+    lodash "^4.17.13"
 
-"@babel/helper-get-function-arity@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0"
-  integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==
+"@babel/helper-explode-assignable-expression@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982"
+  integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==
   dependencies:
-    "@babel/types" "^7.7.4"
+    "@babel/traverse" "^7.8.3"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-hoist-variables@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz#612384e3d823fdfaaf9fce31550fe5d4db0f3d12"
-  integrity sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ==
+"@babel/helper-function-name@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca"
+  integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==
   dependencies:
-    "@babel/types" "^7.7.4"
+    "@babel/helper-get-function-arity" "^7.8.3"
+    "@babel/template" "^7.8.3"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-member-expression-to-functions@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74"
-  integrity sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==
+"@babel/helper-get-function-arity@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5"
+  integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==
   dependencies:
-    "@babel/types" "^7.7.4"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91"
-  integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==
+"@babel/helper-hoist-variables@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134"
+  integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==
   dependencies:
-    "@babel/types" "^7.7.4"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-module-transforms@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.4.tgz#8d7cdb1e1f8ea3d8c38b067345924ac4f8e0879a"
-  integrity sha512-ehGBu4mXrhs0FxAqN8tWkzF8GSIGAiEumu4ONZ/hD9M88uHcD+Yu2ttKfOCgwzoesJOJrtQh7trI5YPbRtMmnA==
+"@babel/helper-member-expression-to-functions@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c"
+  integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==
   dependencies:
-    "@babel/helper-module-imports" "^7.7.4"
-    "@babel/helper-simple-access" "^7.7.4"
-    "@babel/helper-split-export-declaration" "^7.7.4"
-    "@babel/template" "^7.7.4"
-    "@babel/types" "^7.7.4"
-    lodash "^4.17.13"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-module-transforms@^7.7.5":
-  version "7.7.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz#d044da7ffd91ec967db25cd6748f704b6b244835"
-  integrity sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw==
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.7.4", "@babel/helper-module-imports@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498"
+  integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==
   dependencies:
-    "@babel/helper-module-imports" "^7.7.4"
-    "@babel/helper-simple-access" "^7.7.4"
-    "@babel/helper-split-export-declaration" "^7.7.4"
-    "@babel/template" "^7.7.4"
-    "@babel/types" "^7.7.4"
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-module-transforms@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590"
+  integrity sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==
+  dependencies:
+    "@babel/helper-module-imports" "^7.8.3"
+    "@babel/helper-simple-access" "^7.8.3"
+    "@babel/helper-split-export-declaration" "^7.8.3"
+    "@babel/template" "^7.8.3"
+    "@babel/types" "^7.8.3"
     lodash "^4.17.13"
 
-"@babel/helper-optimise-call-expression@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2"
-  integrity sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==
+"@babel/helper-optimise-call-expression@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9"
+  integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==
   dependencies:
-    "@babel/types" "^7.7.4"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-plugin-utils@^7.0.0":
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250"
-  integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670"
+  integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==
 
-"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2"
-  integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==
+"@babel/helper-regex@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965"
+  integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==
   dependencies:
-    lodash "^4.17.11"
+    lodash "^4.17.13"
 
-"@babel/helper-remap-async-to-generator@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz#c68c2407350d9af0e061ed6726afb4fff16d0234"
-  integrity sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.7.4"
-    "@babel/helper-wrap-function" "^7.7.4"
-    "@babel/template" "^7.7.4"
-    "@babel/traverse" "^7.7.4"
-    "@babel/types" "^7.7.4"
-
-"@babel/helper-replace-supers@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2"
-  integrity sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==
-  dependencies:
-    "@babel/helper-member-expression-to-functions" "^7.7.4"
-    "@babel/helper-optimise-call-expression" "^7.7.4"
-    "@babel/traverse" "^7.7.4"
-    "@babel/types" "^7.7.4"
-
-"@babel/helper-simple-access@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz#a169a0adb1b5f418cfc19f22586b2ebf58a9a294"
-  integrity sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A==
-  dependencies:
-    "@babel/template" "^7.7.4"
-    "@babel/types" "^7.7.4"
-
-"@babel/helper-split-export-declaration@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8"
-  integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==
-  dependencies:
-    "@babel/types" "^7.7.4"
-
-"@babel/helper-wrap-function@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz#37ab7fed5150e22d9d7266e830072c0cdd8baace"
-  integrity sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg==
-  dependencies:
-    "@babel/helper-function-name" "^7.7.4"
-    "@babel/template" "^7.7.4"
-    "@babel/traverse" "^7.7.4"
-    "@babel/types" "^7.7.4"
-
-"@babel/helpers@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302"
-  integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==
-  dependencies:
-    "@babel/template" "^7.7.4"
-    "@babel/traverse" "^7.7.4"
-    "@babel/types" "^7.7.4"
-
-"@babel/highlight@^7.0.0":
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4"
-  integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==
+"@babel/helper-remap-async-to-generator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86"
+  integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.8.3"
+    "@babel/helper-wrap-function" "^7.8.3"
+    "@babel/template" "^7.8.3"
+    "@babel/traverse" "^7.8.3"
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-replace-supers@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc"
+  integrity sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==
+  dependencies:
+    "@babel/helper-member-expression-to-functions" "^7.8.3"
+    "@babel/helper-optimise-call-expression" "^7.8.3"
+    "@babel/traverse" "^7.8.3"
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-simple-access@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae"
+  integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==
+  dependencies:
+    "@babel/template" "^7.8.3"
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-split-export-declaration@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9"
+  integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==
+  dependencies:
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-wrap-function@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610"
+  integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==
+  dependencies:
+    "@babel/helper-function-name" "^7.8.3"
+    "@babel/template" "^7.8.3"
+    "@babel/traverse" "^7.8.3"
+    "@babel/types" "^7.8.3"
+
+"@babel/helpers@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.3.tgz#382fbb0382ce7c4ce905945ab9641d688336ce85"
+  integrity sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==
+  dependencies:
+    "@babel/template" "^7.8.3"
+    "@babel/traverse" "^7.8.3"
+    "@babel/types" "^7.8.3"
+
+"@babel/highlight@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797"
+  integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==
   dependencies:
     chalk "^2.0.0"
     esutils "^2.0.2"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.7.4", "@babel/parser@^7.7.5":
-  version "7.7.5"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.5.tgz#cbf45321619ac12d83363fcf9c94bb67fa646d71"
-  integrity sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig==
+"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081"
+  integrity sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==
 
-"@babel/plugin-proposal-async-generator-functions@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz#0351c5ac0a9e927845fffd5b82af476947b7ce6d"
-  integrity sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw==
+"@babel/plugin-proposal-async-generator-functions@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f"
+  integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-remap-async-to-generator" "^7.7.4"
-    "@babel/plugin-syntax-async-generators" "^7.7.4"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-remap-async-to-generator" "^7.8.3"
+    "@babel/plugin-syntax-async-generators" "^7.8.0"
 
-"@babel/plugin-proposal-class-properties@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz#2f964f0cb18b948450362742e33e15211e77c2ba"
-  integrity sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==
+"@babel/plugin-proposal-class-properties@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e"
+  integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-create-class-features-plugin" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-proposal-decorators@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.7.4.tgz#58c1e21d21ea12f9f5f0a757e46e687b94a7ab2b"
-  integrity sha512-GftcVDcLCwVdzKmwOBDjATd548+IE+mBo7ttgatqNDR7VG7GqIuZPtRWlMLHbhTXhcnFZiGER8iIYl1n/imtsg==
+"@babel/plugin-proposal-decorators@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e"
+  integrity sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-decorators" "^7.7.4"
+    "@babel/helper-create-class-features-plugin" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-decorators" "^7.8.3"
 
-"@babel/plugin-proposal-dynamic-import@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz#dde64a7f127691758cbfed6cf70de0fa5879d52d"
-  integrity sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ==
+"@babel/plugin-proposal-dynamic-import@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054"
+  integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-dynamic-import" "^7.7.4"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-dynamic-import" "^7.8.0"
 
-"@babel/plugin-proposal-json-strings@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz#7700a6bfda771d8dc81973249eac416c6b4c697d"
-  integrity sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw==
+"@babel/plugin-proposal-json-strings@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b"
+  integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-json-strings" "^7.7.4"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-json-strings" "^7.8.0"
 
-"@babel/plugin-proposal-object-rest-spread@^7.7.7":
-  version "7.7.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.7.tgz#9f27075004ab99be08c5c1bd653a2985813cb370"
-  integrity sha512-3qp9I8lelgzNedI3hrhkvhaEYree6+WHnyA/q4Dza9z7iEIs1eyhWyJnetk3jJ69RT0AT4G0UhEGwyGFJ7GUuQ==
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2"
+  integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-object-rest-spread" "^7.7.4"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
 
-"@babel/plugin-proposal-optional-catch-binding@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz#ec21e8aeb09ec6711bc0a39ca49520abee1de379"
-  integrity sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w==
+"@babel/plugin-proposal-object-rest-spread@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb"
+  integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-optional-catch-binding" "^7.7.4"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
 
-"@babel/plugin-proposal-unicode-property-regex@^7.7.7":
-  version "7.7.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.7.tgz#433fa9dac64f953c12578b29633f456b68831c4e"
-  integrity sha512-80PbkKyORBUVm1fbTLrHpYdJxMThzM1UqFGh0ALEhO9TYbG86Ah9zQYAB/84axz2vcxefDLdZwWwZNlYARlu9w==
+"@babel/plugin-proposal-optional-catch-binding@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9"
+  integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
 
-"@babel/plugin-syntax-async-generators@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz#331aaf310a10c80c44a66b238b6e49132bd3c889"
-  integrity sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g==
+"@babel/plugin-proposal-optional-chaining@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543"
+  integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.0"
 
-"@babel/plugin-syntax-decorators@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.7.4.tgz#3c91cfee2a111663ff3ac21b851140f5a52a4e0b"
-  integrity sha512-0oNLWNH4k5ZbBVfAwiTU53rKFWIeTh6ZlaWOXWJc4ywxs0tjz5fc3uZ6jKAnZSxN98eXVgg7bJIuzjX+3SXY+A==
+"@babel/plugin-proposal-unicode-property-regex@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f"
+  integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-create-regexp-features-plugin" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-syntax-dynamic-import@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec"
-  integrity sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==
+"@babel/plugin-syntax-async-generators@^7.8.0":
+  version "7.8.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+  integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-json-strings@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz#86e63f7d2e22f9e27129ac4e83ea989a382e86cc"
-  integrity sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg==
+"@babel/plugin-syntax-decorators@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda"
+  integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-syntax-jsx@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz#dab2b56a36fb6c3c222a1fbc71f7bf97f327a9ec"
-  integrity sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg==
+"@babel/plugin-syntax-dynamic-import@^7.8.0":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
+  integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46"
-  integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==
+"@babel/plugin-syntax-json-strings@^7.8.0":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+  integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-optional-catch-binding@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz#a3e38f59f4b6233867b4a92dcb0ee05b2c334aa6"
-  integrity sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ==
+"@babel/plugin-syntax-jsx@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94"
+  integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-syntax-top-level-await@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz#bd7d8fa7b9fee793a36e4027fd6dd1aa32f946da"
-  integrity sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg==
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+  integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-transform-arrow-functions@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz#76309bd578addd8aee3b379d809c802305a98a12"
-  integrity sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA==
+"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+  integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-transform-async-to-generator@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz#694cbeae6d613a34ef0292713fa42fb45c4470ba"
-  integrity sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg==
+"@babel/plugin-syntax-optional-catch-binding@^7.8.0":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+  integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
   dependencies:
-    "@babel/helper-module-imports" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-remap-async-to-generator" "^7.7.4"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-transform-block-scoped-functions@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz#d0d9d5c269c78eaea76227ace214b8d01e4d837b"
-  integrity sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ==
+"@babel/plugin-syntax-optional-chaining@^7.8.0":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+  integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-transform-block-scoping@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224"
-  integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg==
+"@babel/plugin-syntax-top-level-await@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391"
+  integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    lodash "^4.17.13"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-classes@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz#c92c14be0a1399e15df72667067a8f510c9400ec"
-  integrity sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg==
+"@babel/plugin-transform-arrow-functions@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6"
+  integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.7.4"
-    "@babel/helper-define-map" "^7.7.4"
-    "@babel/helper-function-name" "^7.7.4"
-    "@babel/helper-optimise-call-expression" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-replace-supers" "^7.7.4"
-    "@babel/helper-split-export-declaration" "^7.7.4"
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-transform-async-to-generator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086"
+  integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==
+  dependencies:
+    "@babel/helper-module-imports" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-remap-async-to-generator" "^7.8.3"
+
+"@babel/plugin-transform-block-scoped-functions@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3"
+  integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-transform-block-scoping@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a"
+  integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+    lodash "^4.17.13"
+
+"@babel/plugin-transform-classes@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz#46fd7a9d2bb9ea89ce88720477979fe0d71b21b8"
+  integrity sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.8.3"
+    "@babel/helper-define-map" "^7.8.3"
+    "@babel/helper-function-name" "^7.8.3"
+    "@babel/helper-optimise-call-expression" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-replace-supers" "^7.8.3"
+    "@babel/helper-split-export-declaration" "^7.8.3"
     globals "^11.1.0"
 
-"@babel/plugin-transform-computed-properties@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz#e856c1628d3238ffe12d668eb42559f79a81910d"
-  integrity sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ==
+"@babel/plugin-transform-computed-properties@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b"
+  integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-destructuring@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz#2b713729e5054a1135097b6a67da1b6fe8789267"
-  integrity sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==
+"@babel/plugin-transform-destructuring@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b"
+  integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-dotall-regex@^7.7.7":
-  version "7.7.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.7.tgz#3e9713f1b69f339e87fa796b097d73ded16b937b"
-  integrity sha512-b4in+YlTeE/QmTgrllnb3bHA0HntYvjz8O3Mcbx75UBPJA2xhb5A8nle498VhxSXJHQefjtQxpnLPehDJ4TRlg==
+"@babel/plugin-transform-dotall-regex@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e"
+  integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-create-regexp-features-plugin" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-duplicate-keys@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz#3d21731a42e3f598a73835299dd0169c3b90ac91"
-  integrity sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA==
+"@babel/plugin-transform-duplicate-keys@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1"
+  integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-exponentiation-operator@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz#dd30c0191e3a1ba19bcc7e389bdfddc0729d5db9"
-  integrity sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ==
+"@babel/plugin-transform-exponentiation-operator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7"
+  integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==
   dependencies:
-    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-for-of@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz#248800e3a5e507b1f103d8b4ca998e77c63932bc"
-  integrity sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA==
+"@babel/plugin-transform-for-of@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.3.tgz#15f17bce2fc95c7d59a24b299e83e81cedc22e18"
+  integrity sha512-ZjXznLNTxhpf4Q5q3x1NsngzGA38t9naWH8Gt+0qYZEJAcvPI9waSStSh56u19Ofjr7QmD0wUsQ8hw8s/p1VnA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-function-name@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz#75a6d3303d50db638ff8b5385d12451c865025b1"
-  integrity sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g==
+"@babel/plugin-transform-function-name@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b"
+  integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==
   dependencies:
-    "@babel/helper-function-name" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-function-name" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-literals@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz#27fe87d2b5017a2a5a34d1c41a6b9f6a6262643e"
-  integrity sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw==
+"@babel/plugin-transform-literals@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1"
+  integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-member-expression-literals@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz#aee127f2f3339fc34ce5e3055d7ffbf7aa26f19a"
-  integrity sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA==
+"@babel/plugin-transform-member-expression-literals@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410"
+  integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-modules-amd@^7.7.5":
-  version "7.7.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz#39e0fb717224b59475b306402bb8eedab01e729c"
-  integrity sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ==
+"@babel/plugin-transform-modules-amd@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5"
+  integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==
   dependencies:
-    "@babel/helper-module-transforms" "^7.7.5"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-module-transforms" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
     babel-plugin-dynamic-import-node "^2.3.0"
 
-"@babel/plugin-transform-modules-commonjs@^7.7.5":
-  version "7.7.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz#1d27f5eb0bcf7543e774950e5b2fa782e637b345"
-  integrity sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q==
+"@babel/plugin-transform-modules-commonjs@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5"
+  integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==
   dependencies:
-    "@babel/helper-module-transforms" "^7.7.5"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-simple-access" "^7.7.4"
+    "@babel/helper-module-transforms" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-simple-access" "^7.8.3"
     babel-plugin-dynamic-import-node "^2.3.0"
 
-"@babel/plugin-transform-modules-systemjs@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz#cd98152339d3e763dfe838b7d4273edaf520bb30"
-  integrity sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw==
+"@babel/plugin-transform-modules-systemjs@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420"
+  integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==
   dependencies:
-    "@babel/helper-hoist-variables" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-hoist-variables" "^7.8.3"
+    "@babel/helper-module-transforms" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
     babel-plugin-dynamic-import-node "^2.3.0"
 
-"@babel/plugin-transform-modules-umd@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz#1027c355a118de0aae9fee00ad7813c584d9061f"
-  integrity sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw==
+"@babel/plugin-transform-modules-umd@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a"
+  integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==
   dependencies:
-    "@babel/helper-module-transforms" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-module-transforms" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-named-capturing-groups-regex@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz#fb3bcc4ee4198e7385805007373d6b6f42c98220"
-  integrity sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c"
+  integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.7.4"
+    "@babel/helper-create-regexp-features-plugin" "^7.8.3"
 
-"@babel/plugin-transform-new-target@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz#4a0753d2d60639437be07b592a9e58ee00720167"
-  integrity sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg==
+"@babel/plugin-transform-new-target@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43"
+  integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-object-super@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz#48488937a2d586c0148451bf51af9d7dda567262"
-  integrity sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg==
+"@babel/plugin-transform-object-super@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725"
+  integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-replace-supers" "^7.7.4"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-replace-supers" "^7.8.3"
 
-"@babel/plugin-transform-parameters@^7.7.7":
-  version "7.7.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.7.tgz#7a884b2460164dc5f194f668332736584c760007"
-  integrity sha512-OhGSrf9ZBrr1fw84oFXj5hgi8Nmg+E2w5L7NhnG0lPvpDtqd7dbyilM2/vR8CKbJ907RyxPh2kj6sBCSSfI9Ew==
+"@babel/plugin-transform-parameters@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.3.tgz#7890576a13b17325d8b7d44cb37f21dc3bbdda59"
+  integrity sha512-/pqngtGb54JwMBZ6S/D3XYylQDFtGjWrnoCF4gXZOUpFV/ujbxnoNGNvDGu6doFWRPBveE72qTx/RRU44j5I/Q==
   dependencies:
-    "@babel/helper-call-delegate" "^7.7.4"
-    "@babel/helper-get-function-arity" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-call-delegate" "^7.8.3"
+    "@babel/helper-get-function-arity" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-property-literals@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz#2388d6505ef89b266103f450f9167e6bd73f98c2"
-  integrity sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ==
+"@babel/plugin-transform-property-literals@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263"
+  integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-react-display-name@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.7.4.tgz#9f2b80b14ebc97eef4a9b29b612c58ed9c0d10dd"
-  integrity sha512-sBbIvqYkthai0X0vkD2xsAwluBp+LtNHH+/V4a5ydifmTtb8KOVOlrMIk/MYmIc4uTYDnjZUHQildYNo36SRJw==
+"@babel/plugin-transform-react-display-name@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5"
+  integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-react-inline-elements@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.7.4.tgz#356c48c44b22bb9db7ed205800c04d65976f59cd"
-  integrity sha512-x6Gao9Ef3TCItoh1MsotH25mBAz/CjS3uECoprrgJX5poXTqKsH3Od3M8DlRotSNTp48nuniztkE8thWY/MKIA==
+"@babel/plugin-transform-react-inline-elements@^7.8.0":
+  version "7.8.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.8.0.tgz#851799e0f66708563b9ada01b175affa1085f0d5"
+  integrity sha512-LZCsQfeoF8qqc6IaxJfAe4iSgWlbsdKeEkdxDtb8uzvcDbtXxUYjgUcSsqWgbpC88PIEv65SNzlQZo9/mymgQw==
   dependencies:
-    "@babel/helper-builder-react-jsx" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-builder-react-jsx" "^7.8.0"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-transform-react-jsx-self@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.7.4.tgz#81b8fbfd14b2215e8f1c2c3adfba266127b0231c"
-  integrity sha512-PWYjSfqrO273mc1pKCRTIJXyqfc9vWYBax88yIhQb+bpw3XChVC7VWS4VwRVs63wFHKxizvGSd00XEr+YB9Q2A==
+"@babel/plugin-transform-react-jsx-self@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz#c4f178b2aa588ecfa8d077ea80d4194ee77ed702"
+  integrity sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-jsx" "^7.7.4"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-jsx" "^7.8.3"
 
-"@babel/plugin-transform-react-jsx-source@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.7.4.tgz#8994b1bf6014b133f5a46d3b7d1ee5f5e3e72c10"
-  integrity sha512-5ZU9FnPhqtHsOXxutRtXZAzoEJwDaP32QcobbMP1/qt7NYcsCNK8XgzJcJfoEr/ZnzVvUNInNjIW22Z6I8p9mg==
+"@babel/plugin-transform-react-jsx-source@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz#951e75a8af47f9f120db731be095d2b2c34920e0"
+  integrity sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-jsx" "^7.7.4"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-jsx" "^7.8.3"
 
-"@babel/plugin-transform-react-jsx@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.4.tgz#d91205717fae4e2f84d020cd3057ec02a10f11da"
-  integrity sha512-LixU4BS95ZTEAZdPaIuyg/k8FiiqN9laQ0dMHB4MlpydHY53uQdWCUrwjLr5o6ilS6fAgZey4Q14XBjl5tL6xw==
+"@babel/plugin-transform-react-jsx@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz#4220349c0390fdefa505365f68c103562ab2fc4a"
+  integrity sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==
   dependencies:
-    "@babel/helper-builder-react-jsx" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-jsx" "^7.7.4"
+    "@babel/helper-builder-react-jsx" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-jsx" "^7.8.3"
 
-"@babel/plugin-transform-regenerator@^7.7.5":
-  version "7.7.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz#3a8757ee1a2780f390e89f246065ecf59c26fce9"
-  integrity sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw==
+"@babel/plugin-transform-regenerator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8"
+  integrity sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==
   dependencies:
     regenerator-transform "^0.14.0"
 
-"@babel/plugin-transform-reserved-words@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz#6a7cf123ad175bb5c69aec8f6f0770387ed3f1eb"
-  integrity sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ==
+"@babel/plugin-transform-reserved-words@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5"
+  integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
 "@babel/plugin-transform-runtime@^7.7.6":
   version "7.7.6"
@@ -628,118 +676,124 @@
     resolve "^1.8.1"
     semver "^5.5.1"
 
-"@babel/plugin-transform-shorthand-properties@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz#74a0a9b2f6d67a684c6fbfd5f0458eb7ba99891e"
-  integrity sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-spread@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz#aa673b356fe6b7e70d69b6e33a17fef641008578"
-  integrity sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-sticky-regex@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz#ffb68c05090c30732076b1285dc1401b404a123c"
-  integrity sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-regex" "^7.0.0"
-
-"@babel/plugin-transform-template-literals@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz#1eb6411736dd3fe87dbd20cc6668e5121c17d604"
-  integrity sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-typeof-symbol@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz#3174626214f2d6de322882e498a38e8371b2140e"
-  integrity sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-transform-unicode-regex@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae"
-  integrity sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw==
-  dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/preset-env@^7.7.7":
-  version "7.7.7"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.7.tgz#c294167b91e53e7e36d820e943ece8d0c7fe46ac"
-  integrity sha512-pCu0hrSSDVI7kCVUOdcMNQEbOPJ52E+LrQ14sN8uL2ALfSqePZQlKrOy+tM4uhEdYlCHi4imr8Zz2cZe9oSdIg==
-  dependencies:
-    "@babel/helper-module-imports" "^7.7.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-proposal-async-generator-functions" "^7.7.4"
-    "@babel/plugin-proposal-dynamic-import" "^7.7.4"
-    "@babel/plugin-proposal-json-strings" "^7.7.4"
-    "@babel/plugin-proposal-object-rest-spread" "^7.7.7"
-    "@babel/plugin-proposal-optional-catch-binding" "^7.7.4"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.7.7"
-    "@babel/plugin-syntax-async-generators" "^7.7.4"
-    "@babel/plugin-syntax-dynamic-import" "^7.7.4"
-    "@babel/plugin-syntax-json-strings" "^7.7.4"
-    "@babel/plugin-syntax-object-rest-spread" "^7.7.4"
-    "@babel/plugin-syntax-optional-catch-binding" "^7.7.4"
-    "@babel/plugin-syntax-top-level-await" "^7.7.4"
-    "@babel/plugin-transform-arrow-functions" "^7.7.4"
-    "@babel/plugin-transform-async-to-generator" "^7.7.4"
-    "@babel/plugin-transform-block-scoped-functions" "^7.7.4"
-    "@babel/plugin-transform-block-scoping" "^7.7.4"
-    "@babel/plugin-transform-classes" "^7.7.4"
-    "@babel/plugin-transform-computed-properties" "^7.7.4"
-    "@babel/plugin-transform-destructuring" "^7.7.4"
-    "@babel/plugin-transform-dotall-regex" "^7.7.7"
-    "@babel/plugin-transform-duplicate-keys" "^7.7.4"
-    "@babel/plugin-transform-exponentiation-operator" "^7.7.4"
-    "@babel/plugin-transform-for-of" "^7.7.4"
-    "@babel/plugin-transform-function-name" "^7.7.4"
-    "@babel/plugin-transform-literals" "^7.7.4"
-    "@babel/plugin-transform-member-expression-literals" "^7.7.4"
-    "@babel/plugin-transform-modules-amd" "^7.7.5"
-    "@babel/plugin-transform-modules-commonjs" "^7.7.5"
-    "@babel/plugin-transform-modules-systemjs" "^7.7.4"
-    "@babel/plugin-transform-modules-umd" "^7.7.4"
-    "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.4"
-    "@babel/plugin-transform-new-target" "^7.7.4"
-    "@babel/plugin-transform-object-super" "^7.7.4"
-    "@babel/plugin-transform-parameters" "^7.7.7"
-    "@babel/plugin-transform-property-literals" "^7.7.4"
-    "@babel/plugin-transform-regenerator" "^7.7.5"
-    "@babel/plugin-transform-reserved-words" "^7.7.4"
-    "@babel/plugin-transform-shorthand-properties" "^7.7.4"
-    "@babel/plugin-transform-spread" "^7.7.4"
-    "@babel/plugin-transform-sticky-regex" "^7.7.4"
-    "@babel/plugin-transform-template-literals" "^7.7.4"
-    "@babel/plugin-transform-typeof-symbol" "^7.7.4"
-    "@babel/plugin-transform-unicode-regex" "^7.7.4"
-    "@babel/types" "^7.7.4"
-    browserslist "^4.6.0"
-    core-js-compat "^3.6.0"
+"@babel/plugin-transform-shorthand-properties@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8"
+  integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-transform-spread@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8"
+  integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-transform-sticky-regex@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100"
+  integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-regex" "^7.8.3"
+
+"@babel/plugin-transform-template-literals@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80"
+  integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-transform-typeof-symbol@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.3.tgz#5cffb216fb25c8c64ba6bf5f76ce49d3ab079f4d"
+  integrity sha512-3TrkKd4LPqm4jHs6nPtSDI/SV9Cm5PRJkHLUgTcqRQQTMAZ44ZaAdDZJtvWFSaRcvT0a1rTmJ5ZA5tDKjleF3g==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-transform-unicode-regex@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad"
+  integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/preset-env@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.3.tgz#dc0fb2938f52bbddd79b3c861a4b3427dd3a6c54"
+  integrity sha512-Rs4RPL2KjSLSE2mWAx5/iCH+GC1ikKdxPrhnRS6PfFVaiZeom22VFKN4X8ZthyN61kAaR05tfXTbCvatl9WIQg==
+  dependencies:
+    "@babel/compat-data" "^7.8.0"
+    "@babel/helper-compilation-targets" "^7.8.3"
+    "@babel/helper-module-imports" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-proposal-async-generator-functions" "^7.8.3"
+    "@babel/plugin-proposal-dynamic-import" "^7.8.3"
+    "@babel/plugin-proposal-json-strings" "^7.8.3"
+    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3"
+    "@babel/plugin-proposal-object-rest-spread" "^7.8.3"
+    "@babel/plugin-proposal-optional-catch-binding" "^7.8.3"
+    "@babel/plugin-proposal-optional-chaining" "^7.8.3"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.8.3"
+    "@babel/plugin-syntax-async-generators" "^7.8.0"
+    "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+    "@babel/plugin-syntax-json-strings" "^7.8.0"
+    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.0"
+    "@babel/plugin-syntax-top-level-await" "^7.8.3"
+    "@babel/plugin-transform-arrow-functions" "^7.8.3"
+    "@babel/plugin-transform-async-to-generator" "^7.8.3"
+    "@babel/plugin-transform-block-scoped-functions" "^7.8.3"
+    "@babel/plugin-transform-block-scoping" "^7.8.3"
+    "@babel/plugin-transform-classes" "^7.8.3"
+    "@babel/plugin-transform-computed-properties" "^7.8.3"
+    "@babel/plugin-transform-destructuring" "^7.8.3"
+    "@babel/plugin-transform-dotall-regex" "^7.8.3"
+    "@babel/plugin-transform-duplicate-keys" "^7.8.3"
+    "@babel/plugin-transform-exponentiation-operator" "^7.8.3"
+    "@babel/plugin-transform-for-of" "^7.8.3"
+    "@babel/plugin-transform-function-name" "^7.8.3"
+    "@babel/plugin-transform-literals" "^7.8.3"
+    "@babel/plugin-transform-member-expression-literals" "^7.8.3"
+    "@babel/plugin-transform-modules-amd" "^7.8.3"
+    "@babel/plugin-transform-modules-commonjs" "^7.8.3"
+    "@babel/plugin-transform-modules-systemjs" "^7.8.3"
+    "@babel/plugin-transform-modules-umd" "^7.8.3"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3"
+    "@babel/plugin-transform-new-target" "^7.8.3"
+    "@babel/plugin-transform-object-super" "^7.8.3"
+    "@babel/plugin-transform-parameters" "^7.8.3"
+    "@babel/plugin-transform-property-literals" "^7.8.3"
+    "@babel/plugin-transform-regenerator" "^7.8.3"
+    "@babel/plugin-transform-reserved-words" "^7.8.3"
+    "@babel/plugin-transform-shorthand-properties" "^7.8.3"
+    "@babel/plugin-transform-spread" "^7.8.3"
+    "@babel/plugin-transform-sticky-regex" "^7.8.3"
+    "@babel/plugin-transform-template-literals" "^7.8.3"
+    "@babel/plugin-transform-typeof-symbol" "^7.8.3"
+    "@babel/plugin-transform-unicode-regex" "^7.8.3"
+    "@babel/types" "^7.8.3"
+    browserslist "^4.8.2"
+    core-js-compat "^3.6.2"
     invariant "^2.2.2"
-    js-levenshtein "^1.1.3"
+    levenary "^1.1.0"
     semver "^5.5.0"
 
-"@babel/preset-react@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.7.4.tgz#3fe2ea698d8fb536d8e7881a592c3c1ee8bf5707"
-  integrity sha512-j+vZtg0/8pQr1H8wKoaJyGL2IEk3rG/GIvua7Sec7meXVIvGycihlGMx5xcU00kqCJbwzHs18xTu3YfREOqQ+g==
+"@babel/preset-react@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.8.3.tgz#23dc63f1b5b0751283e04252e78cf1d6589273d2"
+  integrity sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-transform-react-display-name" "^7.7.4"
-    "@babel/plugin-transform-react-jsx" "^7.7.4"
-    "@babel/plugin-transform-react-jsx-self" "^7.7.4"
-    "@babel/plugin-transform-react-jsx-source" "^7.7.4"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-transform-react-display-name" "^7.8.3"
+    "@babel/plugin-transform-react-jsx" "^7.8.3"
+    "@babel/plugin-transform-react-jsx-self" "^7.8.3"
+    "@babel/plugin-transform-react-jsx-source" "^7.8.3"
 
 "@babel/runtime@7.0.0":
   version "7.0.0"
@@ -755,50 +809,50 @@
   dependencies:
     regenerator-runtime "^0.12.0"
 
-"@babel/runtime@^7.1.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.7":
-  version "7.7.7"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.7.tgz#194769ca8d6d7790ec23605af9ee3e42a0aa79cf"
-  integrity sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==
+"@babel/runtime@^7.1.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1"
+  integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==
   dependencies:
     regenerator-runtime "^0.13.2"
 
-"@babel/template@^7.0.0", "@babel/template@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b"
-  integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==
-  dependencies:
-    "@babel/code-frame" "^7.0.0"
-    "@babel/parser" "^7.7.4"
-    "@babel/types" "^7.7.4"
-
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558"
-  integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==
-  dependencies:
-    "@babel/code-frame" "^7.5.5"
-    "@babel/generator" "^7.7.4"
-    "@babel/helper-function-name" "^7.7.4"
-    "@babel/helper-split-export-declaration" "^7.7.4"
-    "@babel/parser" "^7.7.4"
-    "@babel/types" "^7.7.4"
+"@babel/template@^7.0.0", "@babel/template@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8"
+  integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==
+  dependencies:
+    "@babel/code-frame" "^7.8.3"
+    "@babel/parser" "^7.8.3"
+    "@babel/types" "^7.8.3"
+
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.3.tgz#a826215b011c9b4f73f3a893afbc05151358bf9a"
+  integrity sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==
+  dependencies:
+    "@babel/code-frame" "^7.8.3"
+    "@babel/generator" "^7.8.3"
+    "@babel/helper-function-name" "^7.8.3"
+    "@babel/helper-split-export-declaration" "^7.8.3"
+    "@babel/parser" "^7.8.3"
+    "@babel/types" "^7.8.3"
     debug "^4.1.0"
     globals "^11.1.0"
     lodash "^4.17.13"
 
-"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.3.0", "@babel/types@^7.7.4":
-  version "7.7.4"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193"
-  integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==
+"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.3.0", "@babel/types@^7.8.0", "@babel/types@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c"
+  integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==
   dependencies:
     esutils "^2.0.2"
     lodash "^4.17.13"
     to-fast-properties "^2.0.0"
 
-"@clusterws/cws@^0.16.0":
-  version "0.16.0"
-  resolved "https://registry.yarnpkg.com/@clusterws/cws/-/cws-0.16.0.tgz#f6116cbf3a8b7ad0657916616ce5f8248746b797"
-  integrity sha512-YeGpAPIdkBsOnAkmFKVMWEjCKDH900U2if0B+nc1imfv+64AIb2JX2xiTA6BLDLppEgWV5c6bpWESjbHCNblHw==
+"@clusterws/cws@^0.17.3":
+  version "0.17.3"
+  resolved "https://registry.yarnpkg.com/@clusterws/cws/-/cws-0.17.3.tgz#64ce6a34b2bd357c29bdc0675f27b37279e8661f"
+  integrity sha512-5WSpxwD8yIIWPTyMspS/IDBp1d4yHnK4A0pjIzYGS1EmJHKylc4jgMiG66qbirjxZ9/IlzuvmYCgaXA+TQbe+A==
 
 "@cnakazawa/watch@^1.0.3":
   version "1.0.3"
@@ -1736,17 +1790,17 @@ atrament@^0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/atrament/-/atrament-0.2.3.tgz#6ccbc0daa6d3f25e5aeaeb31befeb78e86980348"
 
-autoprefixer@^9.7.3:
-  version "9.7.3"
-  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.3.tgz#fd42ed03f53de9beb4ca0d61fb4f7268a9bb50b4"
-  integrity sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q==
+autoprefixer@^9.7.4:
+  version "9.7.4"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378"
+  integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==
   dependencies:
-    browserslist "^4.8.0"
-    caniuse-lite "^1.0.30001012"
+    browserslist "^4.8.3"
+    caniuse-lite "^1.0.30001020"
     chalk "^2.4.2"
     normalize-range "^0.1.2"
     num2fraction "^1.2.2"
-    postcss "^7.0.23"
+    postcss "^7.0.26"
     postcss-value-parser "^4.0.2"
 
 aws-sign2@~0.7.0:
@@ -1767,13 +1821,12 @@ axios@^0.18.0:
     follow-redirects "1.5.10"
     is-buffer "^2.0.2"
 
-axios@^0.19.0:
-  version "0.19.0"
-  resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8"
-  integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==
+axios@^0.19.1:
+  version "0.19.1"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.1.tgz#8a6a04eed23dfe72747e1dd43c604b8f1677b5aa"
+  integrity sha512-Yl+7nfreYKaLRvAvjNPkvfjnQHJM1yLBY3zhqAwcJSwR/6ETkanUgylgtIvkvz0xJ+p/vZuNw8X7Hnb7Whsbpw==
   dependencies:
     follow-redirects "1.5.10"
-    is-buffer "^2.0.2"
 
 axobject-query@^2.0.2:
   version "2.0.2"
@@ -2154,14 +2207,14 @@ browserify-zlib@^0.2.0:
   dependencies:
     pako "~1.0.5"
 
-browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.8.0, browserslist@^4.8.2:
-  version "4.8.2"
-  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.2.tgz#b45720ad5fbc8713b7253c20766f701c9a694289"
-  integrity sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==
+browserslist@^4.0.0, browserslist@^4.8.2, browserslist@^4.8.3:
+  version "4.8.3"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44"
+  integrity sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==
   dependencies:
-    caniuse-lite "^1.0.30001015"
+    caniuse-lite "^1.0.30001017"
     electron-to-chromium "^1.3.322"
-    node-releases "^1.1.42"
+    node-releases "^1.1.44"
 
 bser@^2.0.0:
   version "2.0.0"
@@ -2330,15 +2383,10 @@ caniuse-api@^3.0.0:
     lodash.memoize "^4.1.2"
     lodash.uniq "^4.5.0"
 
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001012:
-  version "1.0.30001013"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001013.tgz#da2440d4d266a17d40eb79bd19c0c8cc1d029c72"
-  integrity sha512-hOAXaWKuq/UVFgYawxIOdPdyMQdYcwOCDOjnZcKn7wCgFUrhP7smuNZjGLuJlPSgE6aRA4cRJ+bGSrhtEt7ZAg==
-
-caniuse-lite@^1.0.30001015:
-  version "1.0.30001016"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz#16ea48d7d6e8caf3cad3295c2d746fe38c4e7f66"
-  integrity sha512-yYQ2QfotceRiH4U+h1Us86WJXtVHDmy3nEKIdYPsZCYnOV5/tMgGbmoIlrMzmh2VXlproqYtVaKeGDBkMZifFA==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001017, caniuse-lite@^1.0.30001020:
+  version "1.0.30001021"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001021.tgz#e75ed1ef6dbadd580ac7e7720bb16f07b083f254"
+  integrity sha512-wuMhT7/hwkgd8gldgp2jcrUjOU9RXJ4XxGumQeOsUr91l3WwmM68Cpa/ymCnWEDqakwFXhuDQbaKNHXBPgeE9g==
 
 capture-exit@^1.2.0:
   version "1.2.0"
@@ -2644,10 +2692,10 @@ compressible@~2.0.16:
   dependencies:
     mime-db ">= 1.40.0 < 2"
 
-compression-webpack-plugin@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-3.0.1.tgz#be7a343e6dfbccbd64a77c5fbe29627d140fc321"
-  integrity sha512-FOwoBVzDiwSdJDnZTKXDpAjJU90k8SbChgxnoiYwTo15xjIDJkSC8wFKuc13DymXjgasPEqzS5+2RUgSKXdKKA==
+compression-webpack-plugin@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-3.1.0.tgz#9f510172a7b5fae5aad3b670652e8bd7997aeeca"
+  integrity sha512-iqTHj3rADN4yHwXMBrQa/xrncex/uEQy8QHlaTKxGchT/hC0SdlJlmL/5eRqffmWq2ep0/Romw6Ld39JjTR/ug==
   dependencies:
     cacache "^13.0.1"
     find-cache-dir "^3.0.0"
@@ -2775,12 +2823,12 @@ copy-webpack-plugin@^5.1.1:
     serialize-javascript "^2.1.2"
     webpack-log "^2.0.0"
 
-core-js-compat@^3.6.0:
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.0.tgz#4eb6cb69d03d99159ed7c860cd5fcf7d23a62ea9"
-  integrity sha512-Z3eCNjGgoYluH89Jt4wVkfYsc/VdLrA2/woX5lm0isO/pCT+P+Y+o65bOuEnjDJLthdwTBxbCVzptTXtc18fJg==
+core-js-compat@^3.6.2:
+  version "3.6.4"
+  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17"
+  integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==
   dependencies:
-    browserslist "^4.8.2"
+    browserslist "^4.8.3"
     semver "7.0.0"
 
 core-js@^1.0.0:
@@ -2949,10 +2997,10 @@ css-list-helpers@^1.0.1:
   dependencies:
     tcomb "^2.5.0"
 
-css-loader@^3.4.0:
-  version "3.4.0"
-  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.0.tgz#9fb263436783117a41d014e45e8eaeba54dd6670"
-  integrity sha512-JornYo4RAXl1Mzt0lOSVPmArzAMV3rGY2VuwtaDc732WTWjdwTaeS19nCGWMcSCf305Q396lhhDAJEWWM0SgPQ==
+css-loader@^3.4.2:
+  version "3.4.2"
+  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202"
+  integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==
   dependencies:
     camelcase "^5.3.1"
     cssesc "^3.0.0"
@@ -3135,6 +3183,11 @@ csstype@^2.5.7:
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.6.tgz#c34f8226a94bbb10c32cc0d714afdf942291fc41"
   integrity sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==
 
+csstype@^2.6.7:
+  version "2.6.8"
+  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431"
+  integrity sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==
+
 cyclist@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
@@ -3247,7 +3300,7 @@ default-gateway@^4.2.0:
     execa "^1.0.0"
     ip-regex "^2.1.0"
 
-define-properties@^1.1.1, define-properties@^1.1.2, define-properties@^1.1.3:
+define-properties@^1.1.2, define-properties@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
   integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
@@ -3417,6 +3470,14 @@ dom-helpers@^3.2.1, dom-helpers@^3.3.1:
   dependencies:
     "@babel/runtime" "^7.1.2"
 
+dom-helpers@^5.1.3:
+  version "5.1.3"
+  resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.3.tgz#7233248eb3a2d1f74aafca31e52c5299cc8ce821"
+  integrity sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw==
+  dependencies:
+    "@babel/runtime" "^7.6.3"
+    csstype "^2.6.7"
+
 dom-serializer@0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
@@ -3598,34 +3659,34 @@ entities@^1.1.1, entities@~1.1.1:
   resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
   integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
 
-enzyme-adapter-react-16@^1.15.1:
-  version "1.15.1"
-  resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.1.tgz#8ad55332be7091dc53a25d7d38b3485fc2ba50d5"
-  integrity sha512-yMPxrP3vjJP+4wL/qqfkT6JAIctcwKF+zXO6utlGPgUJT2l4tzrdjMDWGd/Pp1BjHBcljhN24OzNEGRteibJhA==
+enzyme-adapter-react-16@^1.15.2:
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.2.tgz#b16db2f0ea424d58a808f9df86ab6212895a4501"
+  integrity sha512-SkvDrb8xU3lSxID8Qic9rB8pvevDbLybxPK6D/vW7PrT0s2Cl/zJYuXvsd1EBTz0q4o3iqG3FJhpYz3nUNpM2Q==
   dependencies:
-    enzyme-adapter-utils "^1.12.1"
-    enzyme-shallow-equal "^1.0.0"
+    enzyme-adapter-utils "^1.13.0"
+    enzyme-shallow-equal "^1.0.1"
     has "^1.0.3"
     object.assign "^4.1.0"
-    object.values "^1.1.0"
+    object.values "^1.1.1"
     prop-types "^15.7.2"
-    react-is "^16.10.2"
+    react-is "^16.12.0"
     react-test-renderer "^16.0.0-0"
     semver "^5.7.0"
 
-enzyme-adapter-utils@^1.12.1:
-  version "1.12.1"
-  resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.1.tgz#e828e0d038e2b1efa4b9619ce896226f85c9dd88"
-  integrity sha512-KWiHzSjZaLEoDCOxY8Z1RAbUResbqKN5bZvenPbfKtWorJFVETUw754ebkuCQ3JKm0adx1kF8JaiR+PHPiP47g==
+enzyme-adapter-utils@^1.13.0:
+  version "1.13.0"
+  resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.0.tgz#01c885dde2114b4690bf741f8dc94cee3060eb78"
+  integrity sha512-YuEtfQp76Lj5TG1NvtP2eGJnFKogk/zT70fyYHXK2j3v6CtuHqc8YmgH/vaiBfL8K1SgVVbQXtTcgQZFwzTVyQ==
   dependencies:
     airbnb-prop-types "^2.15.0"
-    function.prototype.name "^1.1.1"
+    function.prototype.name "^1.1.2"
     object.assign "^4.1.0"
-    object.fromentries "^2.0.1"
+    object.fromentries "^2.0.2"
     prop-types "^15.7.2"
-    semver "^5.7.0"
+    semver "^5.7.1"
 
-enzyme-shallow-equal@^1.0.0, enzyme-shallow-equal@^1.0.1:
+enzyme-shallow-equal@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.1.tgz#7afe03db3801c9b76de8440694096412a8d9d49e"
   integrity sha512-hGA3i1so8OrYOZSM9whlkNmVHOicJpsjgTzC+wn2JMJXhq1oO4kA4bJ5MsfzSIcC71aLDKzJ6gZpIxrqt3QTAQ==
@@ -3821,10 +3882,10 @@ eslint-plugin-eslint-plugin@^2.1.0:
   resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-2.1.0.tgz#a7a00f15a886957d855feacaafee264f039e62d5"
   integrity sha512-kT3A/ZJftt28gbl/Cv04qezb/NQ1dwYIbi8lyf806XMxkus7DvOVCLIfTXMrorp322Pnoez7+zabXH29tADIDg==
 
-eslint-plugin-import@~2.19.1:
-  version "2.19.1"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz#5654e10b7839d064dd0d46cd1b88ec2133a11448"
-  integrity sha512-x68131aKoCZlCae7rDXKSAQmbT5DQuManyXo2sK6fJJ0aK5CWAkv6A6HJZGgqC8IhjQxYPgo6/IY4Oz8AFsbBw==
+eslint-plugin-import@~2.20.0:
+  version "2.20.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.0.tgz#d749a7263fb6c29980def8e960d380a6aa6aecaa"
+  integrity sha512-NK42oA0mUc8Ngn4kONOPsPB1XhbUvNHqF+g307dPV28aknPoiNnKLFd9em4nkswwepdF5ouieqv5Th/63U7YJQ==
   dependencies:
     array-includes "^3.0.3"
     array.prototype.flat "^1.2.1"
@@ -3942,10 +4003,10 @@ eslint@^2.7.0:
     text-table "~0.2.0"
     user-home "^2.0.0"
 
-eslint@^6.7.2:
-  version "6.7.2"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.7.2.tgz#c17707ca4ad7b2d8af986a33feba71e18a9fecd1"
-  integrity sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==
+eslint@^6.8.0:
+  version "6.8.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb"
+  integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==
   dependencies:
     "@babel/code-frame" "^7.0.0"
     ajv "^6.10.0"
@@ -4031,12 +4092,7 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
   integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
 
-esutils@^2.0.0:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
-  integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=
-
-esutils@^2.0.2:
+esutils@^2.0.0, esutils@^2.0.2:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
   integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
@@ -4328,13 +4384,13 @@ file-entry-cache@^5.0.1:
   dependencies:
     flat-cache "^2.0.1"
 
-file-loader@^4.2.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.2.0.tgz#5fb124d2369d7075d70a9a5abecd12e60a95215e"
-  integrity sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==
+file-loader@^5.0.2:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-5.0.2.tgz#7f3d8b4ac85a5e8df61338cfec95d7405f971caa"
+  integrity sha512-QMiQ+WBkGLejKe81HU8SZ9PovsU/5uaLo0JdTCEXOYv7i7jfAjHZi1tcwp9tSASJPOmmHZtbdCervFmXMH/Dcg==
   dependencies:
     loader-utils "^1.2.3"
-    schema-utils "^2.0.0"
+    schema-utils "^2.5.0"
 
 file-type@^10.5.0:
   version "10.11.0"
@@ -4385,10 +4441,10 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0:
     make-dir "^2.0.0"
     pkg-dir "^3.0.0"
 
-find-cache-dir@^3.0.0, find-cache-dir@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.1.0.tgz#9935894999debef4cf9f677fdf646d002c4cdecb"
-  integrity sha512-zw+EFiNBNPgI2NTrKkDd1xd7q0cs6wr/iWnr/oUkI0yF9K9GqQ+riIt4aiyFaaqpaWbxPrJXHI+QvmNUQbX+0Q==
+find-cache-dir@^3.0.0, find-cache-dir@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.2.0.tgz#e7fe44c1abc1299f516146e563108fd1006c1874"
+  integrity sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==
   dependencies:
     commondir "^1.0.1"
     make-dir "^3.0.0"
@@ -4650,6 +4706,11 @@ generic-pool@2.4.3:
   resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.3.tgz#780c36f69dfad05a5a045dd37be7adca11a4f6ff"
   integrity sha1-eAw29p360FpaBF3Te+etyhGk9v8=
 
+gensync@^1.0.0-beta.1:
+  version "1.0.0-beta.1"
+  resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
+  integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
+
 get-caller-file@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
@@ -5620,12 +5681,12 @@ is-my-json-valid@^2.10.0:
     jsonpointer "^4.0.0"
     xtend "^4.0.0"
 
-is-nan@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.2.1.tgz#9faf65b6fb6db24b7f5c0628475ea71f988401e2"
-  integrity sha1-n69ltvttskt/XAYoR16nH5iEAeI=
+is-nan@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.0.tgz#85d1f5482f7051c2019f5673ccebdb06f3b0db03"
+  integrity sha512-z7bbREymOqt2CCaZVly8aC4ML3Xhfi0ekuOnjO2L8vKdl+CttdVoGZQhd4adMFAsxQ5VeRVwORs4tU8RH+HFtQ==
   dependencies:
-    define-properties "^1.1.1"
+    define-properties "^1.1.3"
 
 is-number-object@^1.0.4:
   version "1.0.4"
@@ -6205,11 +6266,6 @@ js-base64@^2.1.9:
   resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.0.tgz#42255ba183ab67ce59a0dee640afdc00ab5ae93e"
   integrity sha512-wlEBIZ5LP8usDylWbDNhKPEFVFdI5hCHpnVoT/Ysvoi/PRhJENm/Rlh9TvjYB38HFfKZN7OzEbRjmjvLkFw11g==
 
-js-levenshtein@^1.1.3:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d"
-  integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==
-
 js-string-escape@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef"
@@ -6439,6 +6495,13 @@ leven@^3.1.0:
   resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
   integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
 
+levenary@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.0.tgz#fc146fe75f32dc483a0a2c64aef720f602cd6210"
+  integrity sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ==
+  dependencies:
+    leven "^3.1.0"
+
 levn@^0.3.0, levn@~0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
@@ -6589,10 +6652,10 @@ lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11,
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
   integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
 
-loglevel@^1.6.4:
-  version "1.6.4"
-  resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.4.tgz#f408f4f006db8354d0577dcf6d33485b3cb90d56"
-  integrity sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==
+loglevel@^1.6.6:
+  version "1.6.6"
+  resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.6.tgz#0ee6300cc058db6b3551fa1c4bf73b83bb771312"
+  integrity sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==
 
 loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
   version "1.4.0"
@@ -7130,10 +7193,10 @@ node-pre-gyp@^0.12.0:
     semver "^5.3.0"
     tar "^4"
 
-node-releases@^1.1.42:
-  version "1.1.42"
-  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.42.tgz#a999f6a62f8746981f6da90627a8d2fc090bbad7"
-  integrity sha512-OQ/ESmUqGawI2PRX+XIRao44qWYBBfN54ImQYdWVTQqUckuejOg76ysSqDBK8NG3zwySRVnX36JwDQ6x+9GxzA==
+node-releases@^1.1.44:
+  version "1.1.45"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.45.tgz#4cf7e9175d71b1317f15ffd68ce63bce1d53e9f2"
+  integrity sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg==
   dependencies:
     semver "^6.3.0"
 
@@ -7320,6 +7383,16 @@ object.fromentries@^2.0.1:
     function-bind "^1.1.1"
     has "^1.0.3"
 
+object.fromentries@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9"
+  integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0-next.1"
+    function-bind "^1.1.1"
+    has "^1.0.3"
+
 object.getownpropertydescriptors@^2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
@@ -8255,10 +8328,10 @@ postcss@^5.0.16:
     source-map "^0.5.6"
     supports-color "^3.2.3"
 
-postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.23, postcss@^7.0.5, postcss@^7.0.6:
-  version "7.0.23"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.23.tgz#9f9759fad661b15964f3cfc3140f66f1e05eadc1"
-  integrity sha512-hOlMf3ouRIFXD+j2VJecwssTwbvsPGJVMzupptg+85WA+i7MwyrydmQAgY3R+m0Bc0exunhbJmijy8u8+vufuQ==
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.5, postcss@^7.0.6:
+  version "7.0.26"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587"
+  integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==
   dependencies:
     chalk "^2.4.2"
     source-map "^0.6.1"
@@ -8632,7 +8705,7 @@ react-intl@^2.9.0:
     intl-relativeformat "^2.1.0"
     invariant "^2.1.1"
 
-react-is@^16.10.2, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0:
+react-is@^16.12.0, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0:
   version "16.12.0"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c"
   integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==
@@ -8761,10 +8834,10 @@ react-swipeable-views-core@^0.13.1:
     "@babel/runtime" "7.0.0"
     warning "^4.0.1"
 
-react-swipeable-views-utils@^0.13.3:
-  version "0.13.3"
-  resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.3.tgz#c234d8d836bb085803631a9fef0adb2f9597221f"
-  integrity sha512-CZkJwiNQPISkyTsPMUPiJgwJBrUVd7NC3WSUvx30uwvPb0Sy2w2+tpU51qeYc6YwIhex0s5Eu5YPjK3PDBh+gA==
+react-swipeable-views-utils@^0.13.4:
+  version "0.13.4"
+  resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.4.tgz#809fe408e55ed80f84eea508074387c23febf0ab"
+  integrity sha512-C6Ppq7Z5JIn4l8gKuRzzoGcm5Yiu57HBribjZ0T8DIeLisvIvk8A+Wysb1JhP0hsnJ9hIozlEZ8oJi4eBUTRXg==
   dependencies:
     "@babel/runtime" "7.0.0"
     fbjs "^0.8.4"
@@ -8773,27 +8846,27 @@ react-swipeable-views-utils@^0.13.3:
     react-event-listener "^0.6.0"
     react-swipeable-views-core "^0.13.1"
 
-react-swipeable-views@^0.13.3:
-  version "0.13.3"
-  resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.13.3.tgz#2ad886767c6b2de88000606a14bedde12156e6d0"
-  integrity sha512-LBHRA5ZouipmoLLwi0cqB8qc7NHLskbXmT1I+ZztC9JfmgKrfichw5R+7q4igQ+5VbaP6jL1vn8BtHW96WYNFQ==
+react-swipeable-views@^0.13.4:
+  version "0.13.4"
+  resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.13.4.tgz#ebbe50a8592b185dbedf9e0060eaee09cf6b2c67"
+  integrity sha512-Qwmaj8LASEgxp3i4FBEgs1LM/Yqk7mFRp0fRgXH515NIEePUcjrrkuwvvmvwNQLDbN6PNv4QAuosEaTRyjEOUA==
   dependencies:
     "@babel/runtime" "7.0.0"
-    dom-helpers "^3.2.1"
+    dom-helpers "^5.1.3"
     prop-types "^15.5.4"
     react-swipeable-views-core "^0.13.1"
-    react-swipeable-views-utils "^0.13.3"
+    react-swipeable-views-utils "^0.13.4"
     warning "^4.0.1"
 
-react-test-renderer@^16.0.0-0, react-test-renderer@^16.11.0:
-  version "16.11.0"
-  resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.11.0.tgz#72574566496462c808ac449b0287a4c0a1a7d8f8"
-  integrity sha512-nh9gDl8R4ut+ZNNb2EeKO5VMvTKxwzurbSMuGBoKtjpjbg8JK/u3eVPVNi1h1Ue+eYK9oSzJjb+K3lzLxyA4ag==
+react-test-renderer@^16.0.0-0, react-test-renderer@^16.12.0:
+  version "16.12.0"
+  resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.12.0.tgz#11417ffda579306d4e841a794d32140f3da1b43f"
+  integrity sha512-Vj/teSqt2oayaWxkbhQ6gKis+t5JrknXfPVo+aIJ8QwYAqMPH77uptOdrlphyxl8eQI/rtkOYg86i/UWkpFu0w==
   dependencies:
     object-assign "^4.1.1"
     prop-types "^15.6.2"
     react-is "^16.8.6"
-    scheduler "^0.17.0"
+    scheduler "^0.18.0"
 
 react-textarea-autosize@^7.1.2:
   version "7.1.2"
@@ -8946,10 +9019,10 @@ redux-thunk@^2.2.0:
   resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
   integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==
 
-redux@^4.0.4:
-  version "4.0.4"
-  resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.4.tgz#4ee1aeb164b63d6a1bcc57ae4aa0b6e6fa7a3796"
-  integrity sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==
+redux@^4.0.5:
+  version "4.0.5"
+  resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f"
+  integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==
   dependencies:
     loose-envify "^1.4.0"
     symbol-observable "^1.2.0"
@@ -9372,21 +9445,21 @@ sass-lint@^1.13.1:
     path-is-absolute "^1.0.0"
     util "^0.10.3"
 
-sass-loader@^8.0.0:
-  version "8.0.0"
-  resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.0.tgz#e7b07a3e357f965e6b03dd45b016b0a9746af797"
-  integrity sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w==
+sass-loader@^8.0.2:
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d"
+  integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==
   dependencies:
     clone-deep "^4.0.1"
     loader-utils "^1.2.3"
     neo-async "^2.6.1"
-    schema-utils "^2.1.0"
+    schema-utils "^2.6.1"
     semver "^6.3.0"
 
-sass@^1.24.0:
-  version "1.24.0"
-  resolved "https://registry.yarnpkg.com/sass/-/sass-1.24.0.tgz#e8b9931bc5d18a37d271749311ef2edc83102a77"
-  integrity sha512-1TsPyMhLTx+9DLlmwg02iBW2p4poGA7LlkWJLpUY/XticFKNhPcx+l4FsIJLKl6oSUfXmAKpVljHEez1hwjqiw==
+sass@^1.24.2:
+  version "1.24.2"
+  resolved "https://registry.yarnpkg.com/sass/-/sass-1.24.2.tgz#0a0e0f00368be6808b2e94470172266ac45498fe"
+  integrity sha512-0JxdMMRd0fOmGFQFRI91vh4n0Ed766ib9JwPUa+1C37zn3VaqlHxbknUn/6LqP/MSfvNPxRYoCrYf5g8vu4OHw==
   dependencies:
     chokidar ">=2.0.0 <4.0.0"
 
@@ -9395,14 +9468,6 @@ sax@^1.2.4, sax@~1.2.4:
   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
   integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 
-scheduler@^0.17.0:
-  version "0.17.0"
-  resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.17.0.tgz#7c9c673e4ec781fac853927916d1c426b6f3ddfe"
-  integrity sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA==
-  dependencies:
-    loose-envify "^1.1.0"
-    object-assign "^4.1.1"
-
 scheduler@^0.18.0:
   version "0.18.0"
   resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4"
@@ -9420,7 +9485,7 @@ schema-utils@^1.0.0:
     ajv-errors "^1.0.0"
     ajv-keywords "^3.1.0"
 
-schema-utils@^2.0.0, schema-utils@^2.1.0, schema-utils@^2.6.0, schema-utils@^2.6.1:
+schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1:
   version "2.6.1"
   resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.1.tgz#eb78f0b945c7bcfa2082b3565e8db3548011dc4f"
   integrity sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==
@@ -9448,7 +9513,7 @@ selfsigned@^1.10.7:
   dependencies:
     node-forge "0.9.0"
 
-"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0:
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1:
   version "5.7.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
   integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -9487,12 +9552,7 @@ send@0.17.1:
     range-parser "~1.2.1"
     statuses "~1.5.0"
 
-serialize-javascript@^1.7.0:
-  version "1.9.1"
-  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb"
-  integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==
-
-serialize-javascript@^2.1.1, serialize-javascript@^2.1.2:
+serialize-javascript@^2.1.2:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61"
   integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==
@@ -10164,39 +10224,39 @@ tcomb@^2.5.0:
   resolved "https://registry.yarnpkg.com/tcomb/-/tcomb-2.7.0.tgz#10d62958041669a5d53567b9a4ee8cde22b1c2b0"
   integrity sha1-ENYpWAQWaaXVNWe5pO6M3iKxwrA=
 
-terser-webpack-plugin@^1.4.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4"
-  integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==
+terser-webpack-plugin@^1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c"
+  integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==
   dependencies:
     cacache "^12.0.2"
     find-cache-dir "^2.1.0"
     is-wsl "^1.1.0"
     schema-utils "^1.0.0"
-    serialize-javascript "^1.7.0"
+    serialize-javascript "^2.1.2"
     source-map "^0.6.1"
     terser "^4.1.2"
     webpack-sources "^1.4.0"
     worker-farm "^1.7.0"
 
-terser-webpack-plugin@^2.2.2:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.2.2.tgz#2a6e00237125564a455ad69b22e08ee59420473a"
-  integrity sha512-/CHMNswPMAwuD2kd++qys8UmBRmsshPSzHw4BlDwurPtK9YjeK93OV89YWkJulHk972cs07K/7Z92V6PNjWF8A==
+terser-webpack-plugin@^2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.2.tgz#6d3d1b0590c8f729bfbaeb7fb2528b8b62db4c74"
+  integrity sha512-SmvB/6gtEPv+CJ88MH5zDOsZdKXPS/Uzv2//e90+wM1IHFUhsguPKEILgzqrM1nQ4acRXN/SV4Obr55SXC+0oA==
   dependencies:
     cacache "^13.0.1"
-    find-cache-dir "^3.1.0"
+    find-cache-dir "^3.2.0"
     jest-worker "^24.9.0"
     schema-utils "^2.6.1"
-    serialize-javascript "^2.1.1"
+    serialize-javascript "^2.1.2"
     source-map "^0.6.1"
-    terser "^4.4.2"
+    terser "^4.4.3"
     webpack-sources "^1.4.3"
 
-terser@^4.1.2, terser@^4.4.2:
-  version "4.4.2"
-  resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.2.tgz#448fffad0245f4c8a277ce89788b458bfd7706e8"
-  integrity sha512-Uufrsvhj9O1ikwgITGsZ5EZS6qPokUOkCegS7fYOdGTv+OA90vndUbU6PEjr5ePqHfNUbGyMO7xyIZv2MhsALQ==
+terser@^4.1.2, terser@^4.4.3:
+  version "4.4.3"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.3.tgz#401abc52b88869cf904412503b1eb7da093ae2f0"
+  integrity sha512-0ikKraVtRDKGzHrzkCv5rUNDzqlhmhowOBqC0XqUHFpW+vJ45+20/IFBcebwKfiS2Z9fJin6Eo+F1zLZsxi8RA==
   dependencies:
     commander "^2.20.0"
     source-map "~0.6.1"
@@ -10719,10 +10779,10 @@ watchpack@^1.6.0:
     graceful-fs "^4.1.2"
     neo-async "^2.5.0"
 
-wavesurfer.js@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/wavesurfer.js/-/wavesurfer.js-3.2.0.tgz#c316f3bd1b9f0f4d26188c6865a57e29a13efedc"
-  integrity sha512-P75SSpYTpzpCKFKjxmHkdp2jGpcm4neaGncBGV/jzfI5FPSIfl5mXTTZlZFpJhs7To+NI34Dj5y661JI43HEzA==
+wavesurfer.js@^3.3.1:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/wavesurfer.js/-/wavesurfer.js-3.3.1.tgz#af6e4fb260c7d4fe1b14e7eb51df2dea802ad5c6"
+  integrity sha512-5w+Daa4EIoFcErXX4hZSkNdfdnCSTiaoTJMF5r7O7O6Kiv+oCrIlLwA73Ms9ULs+IZqOM9XhC33sfINgYdC4rw==
 
 wbuf@^1.1.0, wbuf@^1.7.3:
   version "1.7.3"
@@ -10796,10 +10856,10 @@ webpack-dev-middleware@^3.7.2:
     range-parser "^1.2.1"
     webpack-log "^2.0.0"
 
-webpack-dev-server@^3.9.0:
-  version "3.9.0"
-  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz#27c3b5d0f6b6677c4304465ac817623c8b27b89c"
-  integrity sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==
+webpack-dev-server@^3.10.1:
+  version "3.10.1"
+  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.1.tgz#1ff3e5cccf8e0897aa3f5909c654e623f69b1c0e"
+  integrity sha512-AGG4+XrrXn4rbZUueyNrQgO4KGnol+0wm3MPdqGLmmA+NofZl3blZQKxZ9BND6RDNuvAK9OMYClhjOSnxpWRoA==
   dependencies:
     ansi-html "0.0.7"
     bonjour "^3.5.0"
@@ -10816,7 +10876,7 @@ webpack-dev-server@^3.9.0:
     ip "^1.1.5"
     is-absolute-url "^3.0.3"
     killable "^1.0.1"
-    loglevel "^1.6.4"
+    loglevel "^1.6.6"
     opn "^5.5.0"
     p-retry "^3.0.1"
     portfinder "^1.0.25"
@@ -10858,10 +10918,10 @@ webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-
     source-list-map "^2.0.0"
     source-map "~0.6.1"
 
-webpack@^4.41.2:
-  version "4.41.2"
-  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.2.tgz#c34ec76daa3a8468c9b61a50336d8e3303dce74e"
-  integrity sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==
+webpack@^4.41.5:
+  version "4.41.5"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.5.tgz#3210f1886bce5310e62bb97204d18c263341b77c"
+  integrity sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==
   dependencies:
     "@webassemblyjs/ast" "1.8.5"
     "@webassemblyjs/helper-module-context" "1.8.5"
@@ -10883,7 +10943,7 @@ webpack@^4.41.2:
     node-libs-browser "^2.2.1"
     schema-utils "^1.0.0"
     tapable "^1.1.3"
-    terser-webpack-plugin "^1.4.1"
+    terser-webpack-plugin "^1.4.3"
     watchpack "^1.6.0"
     webpack-sources "^1.4.1"
 
@@ -11159,10 +11219,10 @@ yargs@^13.3.0:
     y18n "^4.0.0"
     yargs-parser "^13.1.1"
 
-yargs@^15.0.2:
-  version "15.0.2"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.0.2.tgz#4248bf218ef050385c4f7e14ebdf425653d13bd3"
-  integrity sha512-GH/X/hYt+x5hOat4LMnCqMd8r5Cv78heOMIJn1hr7QPPBqfeC6p89Y78+WB9yGDvfpCvgasfmWLzNzEioOUD9Q==
+yargs@^15.1.0:
+  version "15.1.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.1.0.tgz#e111381f5830e863a89550bd4b136bb6a5f37219"
+  integrity sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==
   dependencies:
     cliui "^6.0.0"
     decamelize "^1.2.0"