about summary refs log tree commit diff
path: root/app
diff options
context:
space:
mode:
authorStarfall <us@starfall.systems>2020-11-19 10:02:56 -0600
committerStarfall <us@starfall.systems>2020-11-19 10:02:56 -0600
commit383bb3804bdbd6caa442283cc96ef0cdbfdb4575 (patch)
tree54ecc09c325567ab1cfc4af9ba13ad134d9c3c72 /app
parent259470ec37dfc5c3d34ed5456adcd3ab1a622a18 (diff)
parentdb01f8b942b72eaa2eacbb144261b002f8079c9c (diff)
Merge branch 'glitch' into main
Diffstat (limited to 'app')
-rw-r--r--app/controllers/accounts_controller.rb4
-rw-r--r--app/controllers/activitypub/base_controller.rb4
-rw-r--r--app/controllers/activitypub/inboxes_controller.rb4
-rw-r--r--app/controllers/activitypub/replies_controller.rb2
-rw-r--r--app/controllers/admin/accounts_controller.rb7
-rw-r--r--app/controllers/admin/announcements_controller.rb2
-rw-r--r--app/controllers/api/base_controller.rb2
-rw-r--r--app/controllers/api/v1/admin/accounts_controller.rb8
-rw-r--r--app/controllers/api/v1/timelines/public_controller.rb4
-rw-r--r--app/controllers/auth/sessions_controller.rb22
-rw-r--r--app/controllers/concerns/account_owned_concern.rb20
-rw-r--r--app/controllers/concerns/sign_in_token_authentication_concern.rb18
-rw-r--r--app/controllers/concerns/signature_verification.rb16
-rw-r--r--app/controllers/concerns/two_factor_authentication_concern.rb35
-rw-r--r--app/controllers/concerns/user_tracking_concern.rb7
-rw-r--r--app/controllers/filters_controller.rb2
-rw-r--r--app/controllers/follower_accounts_controller.rb12
-rw-r--r--app/controllers/following_accounts_controller.rb12
-rw-r--r--app/controllers/relationships_controller.rb9
-rw-r--r--app/controllers/settings/deletes_controller.rb2
-rw-r--r--app/controllers/well_known/webfinger_controller.rb2
-rw-r--r--app/helpers/application_helper.rb10
-rw-r--r--app/helpers/settings_helper.rb4
-rw-r--r--app/helpers/statuses_helper.rb16
-rw-r--r--app/javascript/flavours/glitch/actions/notifications.js9
-rw-r--r--app/javascript/flavours/glitch/components/column.js6
-rw-r--r--app/javascript/flavours/glitch/components/dropdown_menu.js4
-rw-r--r--app/javascript/flavours/glitch/components/media_gallery.js1
-rw-r--r--app/javascript/flavours/glitch/containers/status_container.js2
-rw-r--r--app/javascript/flavours/glitch/features/account_gallery/components/media_item.js2
-rw-r--r--app/javascript/flavours/glitch/features/audio/index.js14
-rw-r--r--app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js22
-rw-r--r--app/javascript/flavours/glitch/features/emoji_picker/index.js4
-rw-r--r--app/javascript/flavours/glitch/features/notifications/components/notifications_permission_banner.js23
-rw-r--r--app/javascript/flavours/glitch/features/picture_in_picture/components/header.js11
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/boost_modal.js5
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/columns_area.js6
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/favourite_modal.js30
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/image_loader.js4
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/media_modal.js24
-rw-r--r--app/javascript/flavours/glitch/features/ui/components/zoomable_image.js340
-rw-r--r--app/javascript/flavours/glitch/features/video/index.js44
-rw-r--r--app/javascript/flavours/glitch/locales/ku.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sa.js7
-rw-r--r--app/javascript/flavours/glitch/locales/sc.js7
-rw-r--r--app/javascript/flavours/glitch/locales/zgh.js7
-rw-r--r--app/javascript/flavours/glitch/reducers/notifications.js3
-rw-r--r--app/javascript/flavours/glitch/styles/components/columns.scss7
-rw-r--r--app/javascript/flavours/glitch/styles/components/index.scss14
-rw-r--r--app/javascript/flavours/glitch/styles/components/media.scss30
-rw-r--r--app/javascript/flavours/glitch/styles/components/modal.scss19
-rw-r--r--app/javascript/flavours/glitch/styles/components/status.scss1
-rw-r--r--app/javascript/flavours/glitch/styles/statuses.scss7
-rw-r--r--app/javascript/flavours/glitch/styles/variables.scss2
-rw-r--r--app/javascript/flavours/glitch/styles/widgets.scss20
-rw-r--r--app/javascript/flavours/glitch/util/dom_helpers.js4
-rw-r--r--app/javascript/flavours/glitch/util/is_mobile.js4
-rw-r--r--app/javascript/mastodon/actions/compose.js4
-rw-r--r--app/javascript/mastodon/actions/notifications.js9
-rw-r--r--app/javascript/mastodon/components/column.js6
-rw-r--r--app/javascript/mastodon/components/dropdown_menu.js4
-rw-r--r--app/javascript/mastodon/components/status.js6
-rw-r--r--app/javascript/mastodon/features/account_gallery/components/media_item.js2
-rw-r--r--app/javascript/mastodon/features/audio/index.js14
-rw-r--r--app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js4
-rw-r--r--app/javascript/mastodon/features/compose/components/privacy_dropdown.js4
-rw-r--r--app/javascript/mastodon/features/compose/containers/sensitive_button_container.js22
-rw-r--r--app/javascript/mastodon/features/getting_started/components/announcements.js2
-rw-r--r--app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js23
-rw-r--r--app/javascript/mastodon/features/picture_in_picture/components/header.js11
-rw-r--r--app/javascript/mastodon/features/ui/components/boost_modal.js5
-rw-r--r--app/javascript/mastodon/features/ui/components/columns_area.js6
-rw-r--r--app/javascript/mastodon/features/ui/components/image_loader.js4
-rw-r--r--app/javascript/mastodon/features/ui/components/media_modal.js24
-rw-r--r--app/javascript/mastodon/features/ui/components/zoomable_image.js340
-rw-r--r--app/javascript/mastodon/features/video/index.js16
-rw-r--r--app/javascript/mastodon/is_mobile.js4
-rw-r--r--app/javascript/mastodon/locales/ar.json25
-rw-r--r--app/javascript/mastodon/locales/ast.json29
-rw-r--r--app/javascript/mastodon/locales/bg.json29
-rw-r--r--app/javascript/mastodon/locales/bn.json99
-rw-r--r--app/javascript/mastodon/locales/br.json27
-rw-r--r--app/javascript/mastodon/locales/ca.json29
-rw-r--r--app/javascript/mastodon/locales/co.json39
-rw-r--r--app/javascript/mastodon/locales/cs.json25
-rw-r--r--app/javascript/mastodon/locales/cy.json59
-rw-r--r--app/javascript/mastodon/locales/da.json67
-rw-r--r--app/javascript/mastodon/locales/de.json47
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json19
-rw-r--r--app/javascript/mastodon/locales/el.json27
-rw-r--r--app/javascript/mastodon/locales/en.json8
-rw-r--r--app/javascript/mastodon/locales/eo.json47
-rw-r--r--app/javascript/mastodon/locales/es-AR.json151
-rw-r--r--app/javascript/mastodon/locales/es.json39
-rw-r--r--app/javascript/mastodon/locales/et.json23
-rw-r--r--app/javascript/mastodon/locales/eu.json23
-rw-r--r--app/javascript/mastodon/locales/fa.json41
-rw-r--r--app/javascript/mastodon/locales/fi.json23
-rw-r--r--app/javascript/mastodon/locales/fr.json29
-rw-r--r--app/javascript/mastodon/locales/ga.json29
-rw-r--r--app/javascript/mastodon/locales/gl.json67
-rw-r--r--app/javascript/mastodon/locales/he.json29
-rw-r--r--app/javascript/mastodon/locales/hi.json117
-rw-r--r--app/javascript/mastodon/locales/hr.json697
-rw-r--r--app/javascript/mastodon/locales/hu.json31
-rw-r--r--app/javascript/mastodon/locales/hy.json45
-rw-r--r--app/javascript/mastodon/locales/id.json73
-rw-r--r--app/javascript/mastodon/locales/io.json29
-rw-r--r--app/javascript/mastodon/locales/is.json39
-rw-r--r--app/javascript/mastodon/locales/it.json57
-rw-r--r--app/javascript/mastodon/locales/ja.json29
-rw-r--r--app/javascript/mastodon/locales/ka.json25
-rw-r--r--app/javascript/mastodon/locales/kab.json37
-rw-r--r--app/javascript/mastodon/locales/kk.json65
-rw-r--r--app/javascript/mastodon/locales/kn.json37
-rw-r--r--app/javascript/mastodon/locales/ko.json37
-rw-r--r--app/javascript/mastodon/locales/ku.json935
-rw-r--r--app/javascript/mastodon/locales/lt.json29
-rw-r--r--app/javascript/mastodon/locales/lv.json25
-rw-r--r--app/javascript/mastodon/locales/mk.json23
-rw-r--r--app/javascript/mastodon/locales/ml.json77
-rw-r--r--app/javascript/mastodon/locales/mr.json29
-rw-r--r--app/javascript/mastodon/locales/ms.json29
-rw-r--r--app/javascript/mastodon/locales/nl.json29
-rw-r--r--app/javascript/mastodon/locales/nn.json63
-rw-r--r--app/javascript/mastodon/locales/no.json55
-rw-r--r--app/javascript/mastodon/locales/oc.json45
-rw-r--r--app/javascript/mastodon/locales/pl.json49
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json29
-rw-r--r--app/javascript/mastodon/locales/pt-PT.json55
-rw-r--r--app/javascript/mastodon/locales/ro.json23
-rw-r--r--app/javascript/mastodon/locales/ru.json25
-rw-r--r--app/javascript/mastodon/locales/sa.json484
-rw-r--r--app/javascript/mastodon/locales/sc.json39
-rw-r--r--app/javascript/mastodon/locales/sk.json35
-rw-r--r--app/javascript/mastodon/locales/sl.json25
-rw-r--r--app/javascript/mastodon/locales/sq.json25
-rw-r--r--app/javascript/mastodon/locales/sr-Latn.json29
-rw-r--r--app/javascript/mastodon/locales/sr.json23
-rw-r--r--app/javascript/mastodon/locales/sv.json59
-rw-r--r--app/javascript/mastodon/locales/szl.json29
-rw-r--r--app/javascript/mastodon/locales/ta.json189
-rw-r--r--app/javascript/mastodon/locales/tai.json29
-rw-r--r--app/javascript/mastodon/locales/te.json25
-rw-r--r--app/javascript/mastodon/locales/th.json25
-rw-r--r--app/javascript/mastodon/locales/tr.json327
-rw-r--r--app/javascript/mastodon/locales/ug.json29
-rw-r--r--app/javascript/mastodon/locales/uk.json45
-rw-r--r--app/javascript/mastodon/locales/ur.json25
-rw-r--r--app/javascript/mastodon/locales/vi.json163
-rw-r--r--app/javascript/mastodon/locales/whitelist_sa.json2
-rw-r--r--app/javascript/mastodon/locales/whitelist_zgh.json2
-rw-r--r--app/javascript/mastodon/locales/zgh.json484
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json35
-rw-r--r--app/javascript/mastodon/locales/zh-HK.json57
-rw-r--r--app/javascript/mastodon/locales/zh-TW.json51
-rw-r--r--app/javascript/mastodon/reducers/notifications.js3
-rw-r--r--app/javascript/styles/mastodon/components.scss75
-rw-r--r--app/javascript/styles/mastodon/variables.scss2
-rw-r--r--app/javascript/styles/mastodon/widgets.scss24
-rw-r--r--app/lib/access_token_extension.rb17
-rw-r--r--app/lib/activitypub/activity/create.rb2
-rw-r--r--app/lib/activitypub/activity/move.rb3
-rw-r--r--app/lib/activitypub/adapter.rb1
-rw-r--r--app/lib/webfinger.rb4
-rw-r--r--app/models/account.rb30
-rw-r--r--app/models/account_stat.rb25
-rw-r--r--app/models/account_warning.rb2
-rw-r--r--app/models/admin/account_action.rb11
-rw-r--r--app/models/admin/action_log_filter.rb2
-rw-r--r--app/models/announcement.rb1
-rw-r--r--app/models/form/account_batch.rb8
-rw-r--r--app/models/session_activation.rb16
-rw-r--r--app/models/tag.rb2
-rw-r--r--app/models/user.rb25
-rw-r--r--app/policies/account_policy.rb10
-rw-r--r--app/serializers/activitypub/actor_serializer.rb33
-rw-r--r--app/serializers/activitypub/note_serializer.rb8
-rw-r--r--app/serializers/rest/status_serializer.rb8
-rw-r--r--app/services/activitypub/process_account_service.rb55
-rw-r--r--app/services/activitypub/process_collection_service.rb10
-rw-r--r--app/services/block_domain_service.rb5
-rw-r--r--app/services/delete_account_service.rb40
-rw-r--r--app/services/resolve_account_service.rb27
-rw-r--r--app/services/resolve_url_service.rb12
-rw-r--r--app/services/suspend_account_service.rb39
-rw-r--r--app/services/unblock_domain_service.rb2
-rw-r--r--app/services/unsuspend_account_service.rb30
-rw-r--r--app/views/accounts/show.html.haml4
-rw-r--r--app/views/admin/accounts/show.html.haml7
-rw-r--r--app/views/home/index.html.haml8
-rw-r--r--app/views/layouts/_theme.html.haml6
-rwxr-xr-xapp/views/layouts/application.html.haml6
-rw-r--r--app/views/layouts/embedded.html.haml6
-rw-r--r--app/views/layouts/error.html.haml2
-rw-r--r--app/views/media/player.html.haml6
-rw-r--r--app/views/relationships/_account.html.haml2
-rw-r--r--app/views/relationships/show.html.haml2
-rw-r--r--app/views/statuses/_detailed_status.html.haml6
-rw-r--r--app/views/statuses/_simple_status.html.haml10
-rw-r--r--app/views/statuses/_status.html.haml8
-rw-r--r--app/workers/account_deletion_worker.rb5
-rw-r--r--app/workers/poll_expiration_notify_worker.rb2
203 files changed, 6045 insertions, 2095 deletions
diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb
index 356542767..052394ab4 100644
--- a/app/controllers/accounts_controller.rb
+++ b/app/controllers/accounts_controller.rb
@@ -103,6 +103,10 @@ class AccountsController < ApplicationController
     params[:username]
   end
 
+  def skip_temporary_suspension_response?
+    request.format == :json
+  end
+
   def rss_url
     if tag_requested?
       short_account_tag_url(@account, params[:tag], format: 'rss')
diff --git a/app/controllers/activitypub/base_controller.rb b/app/controllers/activitypub/base_controller.rb
index 0c2591e97..4cbc3ab8f 100644
--- a/app/controllers/activitypub/base_controller.rb
+++ b/app/controllers/activitypub/base_controller.rb
@@ -8,4 +8,8 @@ class ActivityPub::BaseController < Api::BaseController
   def set_cache_headers
     response.headers['Vary'] = 'Signature' if authorized_fetch_mode?
   end
+
+  def skip_temporary_suspension_response?
+    false
+  end
 end
diff --git a/app/controllers/activitypub/inboxes_controller.rb b/app/controllers/activitypub/inboxes_controller.rb
index fdb60d590..d3044f180 100644
--- a/app/controllers/activitypub/inboxes_controller.rb
+++ b/app/controllers/activitypub/inboxes_controller.rb
@@ -33,6 +33,10 @@ class ActivityPub::InboxesController < ActivityPub::BaseController
     params[:account_username].present?
   end
 
+  def skip_temporary_suspension_response?
+    true
+  end
+
   def body
     return @body if defined?(@body)
 
diff --git a/app/controllers/activitypub/replies_controller.rb b/app/controllers/activitypub/replies_controller.rb
index 43bf4e657..fde6c861f 100644
--- a/app/controllers/activitypub/replies_controller.rb
+++ b/app/controllers/activitypub/replies_controller.rb
@@ -31,7 +31,7 @@ class ActivityPub::RepliesController < ActivityPub::BaseController
   end
 
   def set_replies
-    @replies = only_other_accounts? ? Status.where.not(account_id: @account.id) : @account.statuses
+    @replies = only_other_accounts? ? Status.where.not(account_id: @account.id).joins(:account).merge(Account.without_suspended) : @account.statuses
     @replies = @replies.where(in_reply_to_id: @status.id, visibility: [:public, :unlisted])
     @replies = @replies.paginate_by_min_id(DESCENDANTS_LIMIT, params[:min_id])
   end
diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb
index b9b75727d..1dd7430e0 100644
--- a/app/controllers/admin/accounts_controller.rb
+++ b/app/controllers/admin/accounts_controller.rb
@@ -53,6 +53,13 @@ module Admin
       redirect_to admin_account_path(@account.id), notice: I18n.t('admin.accounts.destroyed_msg', username: @account.acct)
     end
 
+    def unsensitive
+      authorize @account, :unsensitive?
+      @account.unsensitize!
+      log_action :unsensitive, @account
+      redirect_to admin_account_path(@account.id)
+    end
+
     def unsilence
       authorize @account, :unsilence?
       @account.unsilence!
diff --git a/app/controllers/admin/announcements_controller.rb b/app/controllers/admin/announcements_controller.rb
index 494fd13d0..351b9a991 100644
--- a/app/controllers/admin/announcements_controller.rb
+++ b/app/controllers/admin/announcements_controller.rb
@@ -71,7 +71,7 @@ class Admin::AnnouncementsController < Admin::BaseController
   private
 
   def set_announcements
-    @announcements = AnnouncementFilter.new(filter_params).results.page(params[:page])
+    @announcements = AnnouncementFilter.new(filter_params).results.reverse_chronological.page(params[:page])
   end
 
   def set_announcement
diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb
index e962c4e97..fe199e689 100644
--- a/app/controllers/api/base_controller.rb
+++ b/app/controllers/api/base_controller.rb
@@ -103,7 +103,7 @@ class Api::BaseController < ApplicationController
     elsif !current_user.functional?
       render json: { error: 'Your login is currently disabled' }, status: 403
     else
-      set_user_activity
+      update_user_sign_in
     end
   end
 
diff --git a/app/controllers/api/v1/admin/accounts_controller.rb b/app/controllers/api/v1/admin/accounts_controller.rb
index 3af572f25..63cc521ed 100644
--- a/app/controllers/api/v1/admin/accounts_controller.rb
+++ b/app/controllers/api/v1/admin/accounts_controller.rb
@@ -22,6 +22,7 @@ class Api::V1::Admin::AccountsController < Api::BaseController
     active
     pending
     disabled
+    sensitized
     silenced
     suspended
     username
@@ -68,6 +69,13 @@ class Api::V1::Admin::AccountsController < Api::BaseController
     render json: @account, serializer: REST::Admin::AccountSerializer
   end
 
+  def unsensitive
+    authorize @account, :unsensitive?
+    @account.unsensitize!
+    log_action :unsensitive, @account
+    render json: @account, serializer: REST::Admin::AccountSerializer
+  end
+
   def unsilence
     authorize @account, :unsilence?
     @account.unsilence!
diff --git a/app/controllers/api/v1/timelines/public_controller.rb b/app/controllers/api/v1/timelines/public_controller.rb
index fbd99667c..493fe4776 100644
--- a/app/controllers/api/v1/timelines/public_controller.rb
+++ b/app/controllers/api/v1/timelines/public_controller.rb
@@ -38,7 +38,9 @@ class Api::V1::Timelines::PublicController < Api::BaseController
       local: truthy_param?(:local),
       remote: truthy_param?(:remote),
       only_media: truthy_param?(:only_media),
-      allow_local_only: truthy_param?(:allow_local_only)
+      allow_local_only: truthy_param?(:allow_local_only),
+      with_replies: Setting.show_replies_in_public_timelines,
+      with_reblogs: Setting.show_reblogs_in_public_timelines,
     )
   end
 
diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb
index 1cf6a0a59..548832b21 100644
--- a/app/controllers/auth/sessions_controller.rb
+++ b/app/controllers/auth/sessions_controller.rb
@@ -7,6 +7,7 @@ class Auth::SessionsController < Devise::SessionsController
 
   skip_before_action :require_no_authentication, only: [:create]
   skip_before_action :require_functional!
+  skip_before_action :update_user_sign_in
 
   prepend_before_action :set_pack
 
@@ -26,6 +27,7 @@ class Auth::SessionsController < Devise::SessionsController
 
   def create
     super do |resource|
+      resource.update_sign_in!(request, new_sign_in: true)
       remember_me(resource)
       flash.delete(:notice)
     end
@@ -59,7 +61,7 @@ class Auth::SessionsController < Devise::SessionsController
 
   def find_user
     if session[:attempt_user_id]
-      User.find(session[:attempt_user_id])
+      User.find_by(id: session[:attempt_user_id])
     else
       user   = User.authenticate_with_ldap(user_params) if Devise.ldap_authentication
       user ||= User.authenticate_with_pam(user_params) if Devise.pam_authentication
@@ -92,6 +94,7 @@ class Auth::SessionsController < Devise::SessionsController
 
   def require_no_authentication
     super
+
     # Delete flash message that isn't entirely useful and may be confusing in
     # most cases because /web doesn't display/clear flash messages.
     flash.delete(:alert) if flash[:alert] == I18n.t('devise.failure.already_authenticated')
@@ -113,13 +116,30 @@ class Auth::SessionsController < Devise::SessionsController
 
   def home_paths(resource)
     paths = [about_path]
+
     if single_user_mode? && resource.is_a?(User)
       paths << short_account_path(username: resource.account)
     end
+
     paths
   end
 
   def continue_after?
     truthy_param?(:continue)
   end
+
+  def restart_session
+    clear_attempt_from_session
+    redirect_to new_user_session_path, alert: I18n.t('devise.failure.timeout')
+  end
+
+  def set_attempt_session(user)
+    session[:attempt_user_id]         = user.id
+    session[:attempt_user_updated_at] = user.updated_at.to_s
+  end
+
+  def clear_attempt_from_session
+    session.delete(:attempt_user_id)
+    session.delete(:attempt_user_updated_at)
+  end
 end
diff --git a/app/controllers/concerns/account_owned_concern.rb b/app/controllers/concerns/account_owned_concern.rb
index 460f71f65..62e379846 100644
--- a/app/controllers/concerns/account_owned_concern.rb
+++ b/app/controllers/concerns/account_owned_concern.rb
@@ -29,6 +29,24 @@ module AccountOwnedConcern
   end
 
   def check_account_suspension
-    expires_in(3.minutes, public: true) && gone if @account.suspended?
+    if @account.suspended_permanently?
+      permanent_suspension_response
+    elsif @account.suspended? && !skip_temporary_suspension_response?
+      temporary_suspension_response
+    end
+  end
+
+  def skip_temporary_suspension_response?
+    false
+  end
+
+  def permanent_suspension_response
+    expires_in(3.minutes, public: true)
+    gone
+  end
+
+  def temporary_suspension_response
+    expires_in(3.minutes, public: true)
+    forbidden
   end
 end
diff --git a/app/controllers/concerns/sign_in_token_authentication_concern.rb b/app/controllers/concerns/sign_in_token_authentication_concern.rb
index f5178930b..51ebcb115 100644
--- a/app/controllers/concerns/sign_in_token_authentication_concern.rb
+++ b/app/controllers/concerns/sign_in_token_authentication_concern.rb
@@ -18,7 +18,9 @@ module SignInTokenAuthenticationConcern
   def authenticate_with_sign_in_token
     user = self.resource = find_user
 
-    if user_params[:sign_in_token_attempt].present? && session[:attempt_user_id]
+    if user.present? && session[:attempt_user_id].present? && session[:attempt_user_updated_at] != user.updated_at.to_s
+      restart_session
+    elsif user_params.key?(:sign_in_token_attempt) && session[:attempt_user_id]
       authenticate_with_sign_in_token_attempt(user)
     elsif user.present? && user.external_or_valid_password?(user_params[:password])
       prompt_for_sign_in_token(user)
@@ -27,7 +29,7 @@ module SignInTokenAuthenticationConcern
 
   def authenticate_with_sign_in_token_attempt(user)
     if valid_sign_in_token_attempt?(user)
-      session.delete(:attempt_user_id)
+      clear_attempt_from_session
       remember_me(user)
       sign_in(user)
     else
@@ -42,11 +44,11 @@ module SignInTokenAuthenticationConcern
       UserMailer.sign_in_token(user, request.remote_ip, request.user_agent, Time.now.utc.to_s).deliver_later!
     end
 
-    set_locale do
-      session[:attempt_user_id] = user.id
-      use_pack 'auth'
-      @body_classes = 'lighter'
-      render :sign_in_token
-    end
+    set_attempt_session(user)
+    use_pack 'auth'
+
+    @body_classes = 'lighter'
+
+    set_locale { render :sign_in_token }
   end
 end
diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb
index f69c62ec2..fc3978fbb 100644
--- a/app/controllers/concerns/signature_verification.rb
+++ b/app/controllers/concerns/signature_verification.rb
@@ -76,6 +76,7 @@ module SignatureVerification
     raise SignatureVerificationError, 'Signed request date outside acceptable time window' unless matches_time_window?
 
     verify_signature_strength!
+    verify_body_digest!
 
     account = account_from_key_id(signature_params['keyId'])
 
@@ -126,10 +127,19 @@ module SignatureVerification
   def verify_signature_strength!
     raise SignatureVerificationError, 'Mastodon requires the Date header or (created) pseudo-header to be signed' unless signed_headers.include?('date') || signed_headers.include?('(created)')
     raise SignatureVerificationError, 'Mastodon requires the Digest header or (request-target) pseudo-header to be signed' unless signed_headers.include?(Request::REQUEST_TARGET) || signed_headers.include?('digest')
-    raise SignatureVerificationError, 'Mastodon requires the Host header to be signed' unless signed_headers.include?('host')
+    raise SignatureVerificationError, 'Mastodon requires the Host header to be signed when doing a GET request' if request.get? && !signed_headers.include?('host')
     raise SignatureVerificationError, 'Mastodon requires the Digest header to be signed when doing a POST request' if request.post? && !signed_headers.include?('digest')
   end
 
+  def verify_body_digest!
+    return unless signed_headers.include?('digest')
+
+    digests = request.headers['Digest'].split(',').map { |digest| digest.split('=', 2) }.map { |key, value| [key.downcase, value] }
+    sha256  = digests.assoc('sha-256')
+    raise SignatureVerificationError, "Mastodon only supports SHA-256 in Digest header. Offered algorithms: #{digests.map(&:first).join(', ')}" if sha256.nil?
+    raise SignatureVerificationError, "Invalid Digest value. Computed SHA-256 digest: #{body_digest}; given: #{sha256[1]}" if body_digest != sha256[1]
+  end
+
   def verify_signature(account, signature, compare_signed_string)
     if account.keypair.public_key.verify(OpenSSL::Digest.new('SHA256'), signature, compare_signed_string)
       @signed_request_account = account
@@ -153,8 +163,6 @@ module SignatureVerification
         raise SignatureVerificationError, 'Pseudo-header (expires) used but corresponding argument missing' if signature_params['expires'].blank?
 
         "(expires): #{signature_params['expires']}"
-      elsif signed_header == 'digest'
-        "digest: #{body_digest}"
       else
         "#{signed_header}: #{request.headers[to_header_name(signed_header)]}"
       end
@@ -187,7 +195,7 @@ module SignatureVerification
   end
 
   def body_digest
-    "SHA-256=#{Digest::SHA256.base64digest(request_body)}"
+    @body_digest ||= Digest::SHA256.base64digest(request_body)
   end
 
   def to_header_name(name)
diff --git a/app/controllers/concerns/two_factor_authentication_concern.rb b/app/controllers/concerns/two_factor_authentication_concern.rb
index 6b043a804..4800db348 100644
--- a/app/controllers/concerns/two_factor_authentication_concern.rb
+++ b/app/controllers/concerns/two_factor_authentication_concern.rb
@@ -37,9 +37,11 @@ module TwoFactorAuthenticationConcern
   def authenticate_with_two_factor
     user = self.resource = find_user
 
-    if user.webauthn_enabled? && user_params[:credential].present? && session[:attempt_user_id]
+    if user.present? && session[:attempt_user_id].present? && session[:attempt_user_updated_at] != user.updated_at.to_s
+      restart_session
+    elsif user.webauthn_enabled? && user_params.key?(:credential) && session[:attempt_user_id]
       authenticate_with_two_factor_via_webauthn(user)
-    elsif user_params[:otp_attempt].present? && session[:attempt_user_id]
+    elsif user_params.key?(:otp_attempt) && session[:attempt_user_id]
       authenticate_with_two_factor_via_otp(user)
     elsif user.present? && user.external_or_valid_password?(user_params[:password])
       prompt_for_two_factor(user)
@@ -50,7 +52,7 @@ module TwoFactorAuthenticationConcern
     webauthn_credential = WebAuthn::Credential.from_get(user_params[:credential])
 
     if valid_webauthn_credential?(user, webauthn_credential)
-      session.delete(:attempt_user_id)
+      clear_attempt_from_session
       remember_me(user)
       sign_in(user)
       render json: { redirect_path: root_path }, status: :ok
@@ -61,7 +63,7 @@ module TwoFactorAuthenticationConcern
 
   def authenticate_with_two_factor_via_otp(user)
     if valid_otp_attempt?(user)
-      session.delete(:attempt_user_id)
+      clear_attempt_from_session
       remember_me(user)
       sign_in(user)
     else
@@ -71,17 +73,20 @@ module TwoFactorAuthenticationConcern
   end
 
   def prompt_for_two_factor(user)
-    set_locale do
-      session[:attempt_user_id] = user.id
-      use_pack 'auth'
-      @body_classes = 'lighter'
-      @webauthn_enabled = user.webauthn_enabled?
-      @scheme_type = if user.webauthn_enabled? && user_params[:otp_attempt].blank?
-                       'webauthn'
-                     else
-                       'totp'
-                     end
-      render :two_factor
+    set_attempt_session(user)
+
+    use_pack 'auth'
+
+    @body_classes     = 'lighter'
+    @webauthn_enabled = user.webauthn_enabled?
+    @scheme_type      = begin
+      if user.webauthn_enabled? && user_params[:otp_attempt].blank?
+        'webauthn'
+      else
+        'totp'
+      end
     end
+
+    set_locale { render :two_factor }
   end
 end
diff --git a/app/controllers/concerns/user_tracking_concern.rb b/app/controllers/concerns/user_tracking_concern.rb
index be10705fc..efda37fae 100644
--- a/app/controllers/concerns/user_tracking_concern.rb
+++ b/app/controllers/concerns/user_tracking_concern.rb
@@ -6,14 +6,13 @@ module UserTrackingConcern
   UPDATE_SIGN_IN_HOURS = 24
 
   included do
-    before_action :set_user_activity
+    before_action :update_user_sign_in
   end
 
   private
 
-  def set_user_activity
-    return unless user_needs_sign_in_update?
-    current_user.update_tracked_fields!(request)
+  def update_user_sign_in
+    current_user.update_sign_in!(request) if user_needs_sign_in_update?
   end
 
   def user_needs_sign_in_update?
diff --git a/app/controllers/filters_controller.rb b/app/controllers/filters_controller.rb
index 76be03e53..0d4c1b97c 100644
--- a/app/controllers/filters_controller.rb
+++ b/app/controllers/filters_controller.rb
@@ -10,7 +10,7 @@ class FiltersController < ApplicationController
   before_action :set_body_classes
 
   def index
-    @filters = current_account.custom_filters
+    @filters = current_account.custom_filters.order(:phrase)
   end
 
   def new
diff --git a/app/controllers/follower_accounts_controller.rb b/app/controllers/follower_accounts_controller.rb
index 5ffbdae79..18b281325 100644
--- a/app/controllers/follower_accounts_controller.rb
+++ b/app/controllers/follower_accounts_controller.rb
@@ -53,6 +53,14 @@ class FollowerAccountsController < ApplicationController
     account_followers_url(@account, page: page) unless page.nil?
   end
 
+  def next_page_url
+    page_url(follows.next_page) if follows.respond_to?(:next_page)
+  end
+
+  def prev_page_url
+    page_url(follows.prev_page) if follows.respond_to?(:prev_page)
+  end
+
   def collection_presenter
     options = { type: :ordered }
     options[:size] = @account.followers_count unless Setting.hide_followers_count || @account.user&.setting_hide_followers_count
@@ -61,8 +69,8 @@ class FollowerAccountsController < ApplicationController
         id: account_followers_url(@account, page: params.fetch(:page, 1)),
         items: follows.map { |f| ActivityPub::TagManager.instance.uri_for(f.account) },
         part_of: account_followers_url(@account),
-        next: page_url(follows.next_page),
-        prev: page_url(follows.prev_page),
+        next: next_page_url,
+        prev: prev_page_url,
         **options
       )
     else
diff --git a/app/controllers/following_accounts_controller.rb b/app/controllers/following_accounts_controller.rb
index 69820ebb7..eba44d34b 100644
--- a/app/controllers/following_accounts_controller.rb
+++ b/app/controllers/following_accounts_controller.rb
@@ -53,6 +53,14 @@ class FollowingAccountsController < ApplicationController
     account_following_index_url(@account, page: page) unless page.nil?
   end
 
+  def next_page_url
+    page_url(follows.next_page) if follows.respond_to?(:next_page)
+  end
+
+  def prev_page_url
+    page_url(follows.prev_page) if follows.respond_to?(:prev_page)
+  end
+
   def collection_presenter
     if page_requested?
       ActivityPub::CollectionPresenter.new(
@@ -61,8 +69,8 @@ class FollowingAccountsController < ApplicationController
         size: @account.following_count,
         items: follows.map { |f| ActivityPub::TagManager.instance.uri_for(f.target_account) },
         part_of: account_following_index_url(@account),
-        next: page_url(follows.next_page),
-        prev: page_url(follows.prev_page)
+        next: next_page_url,
+        prev: prev_page_url
       )
     else
       ActivityPub::CollectionPresenter.new(
diff --git a/app/controllers/relationships_controller.rb b/app/controllers/relationships_controller.rb
index f1ab980c8..d40770726 100644
--- a/app/controllers/relationships_controller.rb
+++ b/app/controllers/relationships_controller.rb
@@ -6,6 +6,7 @@ class RelationshipsController < ApplicationController
   before_action :authenticate_user!
   before_action :set_accounts, only: :show
   before_action :set_pack
+  before_action :set_relationships, only: :show
   before_action :set_body_classes
 
   helper_method :following_relationship?, :followed_by_relationship?, :mutual_relationship?
@@ -29,6 +30,10 @@ class RelationshipsController < ApplicationController
     @accounts = RelationshipFilter.new(current_account, filter_params).results.page(params[:page]).per(40)
   end
 
+  def set_relationships
+    @relationships = AccountRelationshipsPresenter.new(@accounts.pluck(:id), current_user.account_id)
+  end
+
   def form_account_batch_params
     params.require(:form_account_batch).permit(:action, account_ids: [])
   end
@@ -50,7 +55,9 @@ class RelationshipsController < ApplicationController
   end
 
   def action_from_button
-    if params[:unfollow]
+    if params[:follow]
+      'follow'
+    elsif params[:unfollow]
       'unfollow'
     elsif params[:remove_from_followers]
       'remove_from_followers'
diff --git a/app/controllers/settings/deletes_controller.rb b/app/controllers/settings/deletes_controller.rb
index f96c83b80..7b8f8d207 100644
--- a/app/controllers/settings/deletes_controller.rb
+++ b/app/controllers/settings/deletes_controller.rb
@@ -42,7 +42,7 @@ class Settings::DeletesController < Settings::BaseController
   end
 
   def destroy_account!
-    current_account.suspend!
+    current_account.suspend!(origin: :local)
     AccountDeletionWorker.perform_async(current_user.account_id)
     sign_out
   end
diff --git a/app/controllers/well_known/webfinger_controller.rb b/app/controllers/well_known/webfinger_controller.rb
index 9de9db6ba..0227f722a 100644
--- a/app/controllers/well_known/webfinger_controller.rb
+++ b/app/controllers/well_known/webfinger_controller.rb
@@ -35,7 +35,7 @@ module WellKnown
     end
 
     def check_account_suspension
-      expires_in(3.minutes, public: true) && gone if @account.suspended?
+      expires_in(3.minutes, public: true) && gone if @account.suspended_permanently?
     end
 
     def bad_request
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 321283178..2936545a0 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -89,6 +89,16 @@ module ApplicationHelper
     end
   end
 
+  def interrelationships_icon(relationships, account_id)
+    if relationships.following[account_id] && relationships.followed_by[account_id]
+      fa_icon('exchange', title: I18n.t('relationships.mutual'), class: 'fa-fw active passive')
+    elsif relationships.following[account_id]
+      fa_icon(locale_direction == 'ltr' ? 'arrow-right' : 'arrow-left', title: I18n.t('relationships.following'), class: 'fa-fw active')
+    elsif relationships.followed_by[account_id]
+      fa_icon(locale_direction == 'ltr' ? 'arrow-left' : 'arrow-right', title: I18n.t('relationships.followers'), class: 'fa-fw passive')
+    end
+  end
+
   def custom_emoji_tag(custom_emoji, animate = true)
     if animate
       image_tag(custom_emoji.image.url, class: 'emojione', alt: ":#{custom_emoji.shortcode}:")
diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb
index 745778bcd..ae9a69826 100644
--- a/app/helpers/settings_helper.rb
+++ b/app/helpers/settings_helper.rb
@@ -41,6 +41,7 @@ module SettingsHelper
     kk: 'Қазақша',
     kn: 'ಕನ್ನಡ',
     ko: '한국어',
+    ku: 'سۆرانی',
     lt: 'Lietuvių',
     lv: 'Latviešu',
     mk: 'Македонски',
@@ -57,6 +58,8 @@ module SettingsHelper
     pt: 'Português',
     ro: 'Română',
     ru: 'Русский',
+    sa: 'संस्कृतम्',
+    sc: 'Sardu',
     sk: 'Slovenčina',
     sl: 'Slovenščina',
     sq: 'Shqip',
@@ -70,6 +73,7 @@ module SettingsHelper
     uk: 'Українська',
     ur: 'اُردُو',
     vi: 'Tiếng Việt',
+    zgh: 'ⵜⴰⵎⴰⵣⵉⵖⵜ',
     'zh-CN': '简体中文',
     'zh-HK': '繁體中文(香港)',
     'zh-TW': '繁體中文(臺灣)',
diff --git a/app/helpers/statuses_helper.rb b/app/helpers/statuses_helper.rb
index a51597cf3..daed9048f 100644
--- a/app/helpers/statuses_helper.rb
+++ b/app/helpers/statuses_helper.rb
@@ -4,8 +4,12 @@ module StatusesHelper
   EMBEDDED_CONTROLLER = 'statuses'
   EMBEDDED_ACTION = 'embed'
 
-  def link_to_more(url)
-    link_to t('statuses.show_more'), url, class: 'load-more load-gap'
+  def link_to_newer(url)
+    link_to t('statuses.show_newer'), url, class: 'load-more load-gap'
+  end
+
+  def link_to_older(url)
+    link_to t('statuses.show_older'), url, class: 'load-more load-gap'
   end
 
   def nothing_here(extra_classes = '')
@@ -117,6 +121,14 @@ module StatusesHelper
     end
   end
 
+  def sensitized?(status, account)
+    if !account.nil? && account.id == status.account_id
+      status.sensitive
+    else
+      status.account.sensitized? || status.sensitive
+    end
+  end
+
   private
 
   def simplified_text(text)
diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js
index eb7087027..7273191b2 100644
--- a/app/javascript/flavours/glitch/actions/notifications.js
+++ b/app/javascript/flavours/glitch/actions/notifications.js
@@ -50,8 +50,9 @@ export const NOTIFICATIONS_SET_VISIBILITY = 'NOTIFICATIONS_SET_VISIBILITY';
 
 export const NOTIFICATIONS_MARK_AS_READ = 'NOTIFICATIONS_MARK_AS_READ';
 
-export const NOTIFICATIONS_SET_BROWSER_SUPPORT    = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
-export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION';
+export const NOTIFICATIONS_SET_BROWSER_SUPPORT        = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
+export const NOTIFICATIONS_SET_BROWSER_PERMISSION     = 'NOTIFICATIONS_SET_BROWSER_PERMISSION';
+export const NOTIFICATIONS_DISMISS_BROWSER_PERMISSION = 'NOTIFICATIONS_DISMISS_BROWSER_PERMISSION';
 
 defineMessages({
   mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' },
@@ -371,3 +372,7 @@ export function setBrowserPermission (value) {
     value,
   };
 }
+
+export const dismissBrowserPermission = () => ({
+  type: NOTIFICATIONS_DISMISS_BROWSER_PERMISSION,
+});
diff --git a/app/javascript/flavours/glitch/components/column.js b/app/javascript/flavours/glitch/components/column.js
index 5819d5362..c9da7d329 100644
--- a/app/javascript/flavours/glitch/components/column.js
+++ b/app/javascript/flavours/glitch/components/column.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import detectPassiveEvents from 'detect-passive-events';
+import { supportsPassiveEvents } from 'detect-passive-events';
 import { scrollTop } from 'flavours/glitch/util/scroll';
 
 export default class Column extends React.PureComponent {
@@ -37,9 +37,9 @@ export default class Column extends React.PureComponent {
 
   componentDidMount () {
     if (this.props.bindToDocument) {
-      document.addEventListener('wheel', this.handleWheel,  detectPassiveEvents.hasSupport ? { passive: true } : false);
+      document.addEventListener('wheel', this.handleWheel, supportsPassiveEvents ? { passive: true } : false);
     } else {
-      this.node.addEventListener('wheel', this.handleWheel,  detectPassiveEvents.hasSupport ? { passive: true } : false);
+      this.node.addEventListener('wheel', this.handleWheel, supportsPassiveEvents ? { passive: true } : false);
     }
   }
 
diff --git a/app/javascript/flavours/glitch/components/dropdown_menu.js b/app/javascript/flavours/glitch/components/dropdown_menu.js
index e627ea51f..d1aba691c 100644
--- a/app/javascript/flavours/glitch/components/dropdown_menu.js
+++ b/app/javascript/flavours/glitch/components/dropdown_menu.js
@@ -5,9 +5,9 @@ import IconButton from './icon_button';
 import Overlay from 'react-overlays/lib/Overlay';
 import Motion from 'flavours/glitch/util/optional_motion';
 import spring from 'react-motion/lib/spring';
-import detectPassiveEvents from 'detect-passive-events';
+import { supportsPassiveEvents } from 'detect-passive-events';
 
-const listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;
+const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
 let id = 0;
 
 class DropdownMenu extends React.PureComponent {
diff --git a/app/javascript/flavours/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js
index 96042f07a..890a422d3 100644
--- a/app/javascript/flavours/glitch/components/media_gallery.js
+++ b/app/javascript/flavours/glitch/components/media_gallery.js
@@ -297,6 +297,7 @@ class MediaGallery extends React.PureComponent {
       this._setDimensions();
     }
   }, 250, {
+    leading: true,
     trailing: true,
   });
 
diff --git a/app/javascript/flavours/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js
index ac423c58d..7782246a6 100644
--- a/app/javascript/flavours/glitch/containers/status_container.js
+++ b/app/javascript/flavours/glitch/containers/status_container.js
@@ -55,7 +55,7 @@ const makeMapStateToProps = () => {
     let account = undefined;
     let prepend = undefined;
 
-    if (props.featured) {
+    if (props.featured && status) {
       account = status.get('account');
       prepend = 'featured';
     } else if (reblogStatus !== null && typeof reblogStatus === 'object') {
diff --git a/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js b/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js
index 781bd4e03..7457980d2 100644
--- a/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js
+++ b/app/javascript/flavours/glitch/features/account_gallery/components/media_item.js
@@ -122,7 +122,7 @@ export default class MediaItem extends ImmutablePureComponent {
         <div className='media-gallery__gifv'>
           {content}
 
-          <span className='media-gallery__gifv__label'>{label}</span>
+          {label && <span className='media-gallery__gifv__label'>{label}</span>}
         </div>
       );
     }
diff --git a/app/javascript/flavours/glitch/features/audio/index.js b/app/javascript/flavours/glitch/features/audio/index.js
index 6d09ac8d2..c050a63a9 100644
--- a/app/javascript/flavours/glitch/features/audio/index.js
+++ b/app/javascript/flavours/glitch/features/audio/index.js
@@ -252,7 +252,7 @@ class Audio extends React.PureComponent {
   handleTimeUpdate = () => {
     this.setState({
       currentTime: this.audio.currentTime,
-      duration: Math.floor(this.audio.duration),
+      duration: this.audio.duration,
     });
   }
 
@@ -444,14 +444,14 @@ class Audio extends React.PureComponent {
         <div className='video-player__controls active'>
           <div className='video-player__buttons-bar'>
             <div className='video-player__buttons left'>
-              <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} onClick={this.togglePlay}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
-              <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
+              <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} className='player-button' onClick={this.togglePlay}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
+              <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
 
               <div className={classNames('video-player__volume', { active: this.state.hovered })} ref={this.setVolumeRef} onMouseDown={this.handleVolumeMouseDown}>
                 <div className='video-player__volume__current' style={{ width: `${volume * 100}%`, backgroundColor: this._getAccentColor() }} />
 
                 <span
-                  className={classNames('video-player__volume__handle')}
+                  className='video-player__volume__handle'
                   tabIndex='0'
                   style={{ left: `${volume * 100}%`, backgroundColor: this._getAccentColor() }}
                 />
@@ -460,12 +460,14 @@ class Audio extends React.PureComponent {
               <span className='video-player__time'>
                 <span className='video-player__time-current'>{formatTime(Math.floor(currentTime))}</span>
                 <span className='video-player__time-sep'>/</span>
-                <span className='video-player__time-total'>{formatTime(this.state.duration || Math.floor(this.props.duration))}</span>
+                <span className='video-player__time-total'>{formatTime(Math.floor(this.state.duration || this.props.duration))}</span>
               </span>
             </div>
 
             <div className='video-player__buttons right'>
-              <button type='button' title={intl.formatMessage(messages.download)} aria-label={intl.formatMessage(messages.download)} onClick={this.handleDownload}><Icon id='download' fixedWidth /></button>
+              <a title={intl.formatMessage(messages.download)} aria-label={intl.formatMessage(messages.download)} className='video-player__download__icon player-button' href={this.props.src} download>
+                <Icon id={'download'} fixedWidth />
+              </a>
             </div>
           </div>
         </div>
diff --git a/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js b/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js
index fa1ae8821..9c23d3f47 100644
--- a/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/sensitive_button_container.js
@@ -6,8 +6,14 @@ import { changeComposeSensitivity } from 'flavours/glitch/actions/compose';
 import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';
 
 const messages = defineMessages({
-  marked: { id: 'compose_form.sensitive.marked', defaultMessage: 'Media is marked as sensitive' },
-  unmarked: { id: 'compose_form.sensitive.unmarked', defaultMessage: 'Media is not marked as sensitive' },
+  marked: {
+    id: 'compose_form.sensitive.marked',
+    defaultMessage: '{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}',
+  },
+  unmarked: {
+    id: 'compose_form.sensitive.unmarked',
+    defaultMessage: '{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}',
+  },
 });
 
 const mapStateToProps = state => {
@@ -16,6 +22,7 @@ const mapStateToProps = state => {
   return {
     active: state.getIn(['compose', 'sensitive']) || (spoilersAlwaysOn && spoilerText && spoilerText.length > 0),
     disabled: state.getIn(['compose', 'spoiler']),
+    mediaCount: state.getIn(['compose', 'media_attachments']).size,
   };
 };
 
@@ -32,16 +39,17 @@ class SensitiveButton extends React.PureComponent {
   static propTypes = {
     active: PropTypes.bool,
     disabled: PropTypes.bool,
+    mediaCount: PropTypes.number,
     onClick: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
   };
 
   render () {
-    const { active, disabled, onClick, intl } = this.props;
+    const { active, disabled, mediaCount, onClick, intl } = this.props;
 
     return (
       <div className='compose-form__sensitive-button'>
-        <label className={classNames('icon-button', { active })} title={intl.formatMessage(active ? messages.marked : messages.unmarked)}>
+        <label className={classNames('icon-button', { active })} title={intl.formatMessage(active ? messages.marked : messages.unmarked, { count: mediaCount })}>
           <input
             name='mark-sensitive'
             type='checkbox'
@@ -52,7 +60,11 @@ class SensitiveButton extends React.PureComponent {
 
           <span className={classNames('checkbox', { active })} />
 
-          <FormattedMessage id='compose_form.sensitive.hide' defaultMessage='Mark media as sensitive' />
+          <FormattedMessage
+            id='compose_form.sensitive.hide'
+            defaultMessage='{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}'
+            values={{ count: mediaCount }}
+          />
         </label>
       </div>
     );
diff --git a/app/javascript/flavours/glitch/features/emoji_picker/index.js b/app/javascript/flavours/glitch/features/emoji_picker/index.js
index 89219d739..5fd904593 100644
--- a/app/javascript/flavours/glitch/features/emoji_picker/index.js
+++ b/app/javascript/flavours/glitch/features/emoji_picker/index.js
@@ -10,7 +10,7 @@ import { EmojiPicker as EmojiPickerAsync } from 'flavours/glitch/util/async-comp
 import Overlay from 'react-overlays/lib/Overlay';
 import classNames from 'classnames';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import detectPassiveEvents from 'detect-passive-events';
+import { supportsPassiveEvents } from 'detect-passive-events';
 import { buildCustomEmojis, categoriesFromEmojis } from 'flavours/glitch/util/emoji';
 import { useSystemEmojiFont } from 'flavours/glitch/util/initial_state';
 import { assetHost } from 'flavours/glitch/util/config';
@@ -109,7 +109,7 @@ const mapDispatchToProps = (dispatch, { onPickEmoji }) => ({
 let EmojiPicker, Emoji; // load asynchronously
 
 const backgroundImageFn = () => `${assetHost}/emoji/sheet_10.png`;
-const listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;
+const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
 
 class ModifierPickerMenu extends React.PureComponent {
 
diff --git a/app/javascript/flavours/glitch/features/notifications/components/notifications_permission_banner.js b/app/javascript/flavours/glitch/features/notifications/components/notifications_permission_banner.js
index 8e77f5a03..73fc05dea 100644
--- a/app/javascript/flavours/glitch/features/notifications/components/notifications_permission_banner.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/notifications_permission_banner.js
@@ -1,25 +1,42 @@
 import React from 'react';
 import Icon from 'flavours/glitch/components/icon';
 import Button from 'flavours/glitch/components/button';
-import { requestBrowserPermission } from 'flavours/glitch/actions/notifications';
+import IconButton from 'flavours/glitch/components/icon_button';
+import { requestBrowserPermission, dismissBrowserPermission } from 'flavours/glitch/actions/notifications';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
-import { FormattedMessage } from 'react-intl';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 
-export default @connect(() => {})
+const messages = defineMessages({
+  close: { id: 'lightbox.close', defaultMessage: 'Close' },
+});
+
+export default @connect()
+@injectIntl
 class NotificationsPermissionBanner extends React.PureComponent {
 
   static propTypes = {
     dispatch: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
   };
 
   handleClick = () => {
     this.props.dispatch(requestBrowserPermission());
   }
 
+  handleClose = () => {
+    this.props.dispatch(dismissBrowserPermission());
+  }
+
   render () {
+    const { intl } = this.props;
+
     return (
       <div className='notifications-permission-banner'>
+        <div className='notifications-permission-banner__close'>
+          <IconButton icon='times' onClick={this.handleClose} title={intl.formatMessage(messages.close)} />
+        </div>
+
         <h2><FormattedMessage id='notifications_permission_banner.title' defaultMessage='Never miss a thing' /></h2>
         <p><FormattedMessage id='notifications_permission_banner.how_to_control' defaultMessage="To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled." values={{ icon: <Icon id='sliders' /> }} /></p>
         <Button onClick={this.handleClick}><FormattedMessage id='notifications_permission_banner.enable' defaultMessage='Enable desktop notifications' /></Button>
diff --git a/app/javascript/flavours/glitch/features/picture_in_picture/components/header.js b/app/javascript/flavours/glitch/features/picture_in_picture/components/header.js
index 24adcde25..28526ca88 100644
--- a/app/javascript/flavours/glitch/features/picture_in_picture/components/header.js
+++ b/app/javascript/flavours/glitch/features/picture_in_picture/components/header.js
@@ -7,12 +7,18 @@ import IconButton from 'flavours/glitch/components/icon_button';
 import { Link } from 'react-router-dom';
 import Avatar from 'flavours/glitch/components/avatar';
 import DisplayName from 'flavours/glitch/components/display_name';
+import { defineMessages, injectIntl } from 'react-intl';
+
+const messages = defineMessages({
+  close: { id: 'lightbox.close', defaultMessage: 'Close' },
+});
 
 const mapStateToProps = (state, { accountId }) => ({
   account: state.getIn(['accounts', accountId]),
 });
 
 export default @connect(mapStateToProps)
+@injectIntl
 class Header extends ImmutablePureComponent {
 
   static propTypes = {
@@ -20,10 +26,11 @@ class Header extends ImmutablePureComponent {
     statusId: PropTypes.string.isRequired,
     account: ImmutablePropTypes.map.isRequired,
     onClose: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
   };
 
   render () {
-    const { account, statusId, onClose } = this.props;
+    const { account, statusId, onClose, intl } = this.props;
 
     return (
       <div className='picture-in-picture__header'>
@@ -32,7 +39,7 @@ class Header extends ImmutablePureComponent {
           <DisplayName account={account} />
         </Link>
 
-        <IconButton icon='times' onClick={onClose} title='Close' />
+        <IconButton icon='times' onClick={onClose} title={intl.formatMessage(messages.close)} />
       </div>
     );
   }
diff --git a/app/javascript/flavours/glitch/features/ui/components/boost_modal.js b/app/javascript/flavours/glitch/features/ui/components/boost_modal.js
index 8092e862f..12ad426c8 100644
--- a/app/javascript/flavours/glitch/features/ui/components/boost_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/boost_modal.js
@@ -78,9 +78,10 @@ class BoostModal extends ImmutablePureComponent {
           <div className={classNames('status', `status-${status.get('visibility')}`, 'light')}>
             <div className='boost-modal__status-header'>
               <div className='boost-modal__status-time'>
-                <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'><RelativeTimestamp timestamp={status.get('created_at')} /></a>
+                <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
+                  <span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
+                  <RelativeTimestamp timestamp={status.get('created_at')} /></a>
               </div>
-              <span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
 
               <a onClick={this.handleAccountClick} href={status.getIn(['account', 'url'])} className='status__display-name'>
                 <div className='status__avatar'>
diff --git a/app/javascript/flavours/glitch/features/ui/components/columns_area.js b/app/javascript/flavours/glitch/features/ui/components/columns_area.js
index 2de24bea5..729ade212 100644
--- a/app/javascript/flavours/glitch/features/ui/components/columns_area.js
+++ b/app/javascript/flavours/glitch/features/ui/components/columns_area.js
@@ -29,7 +29,7 @@ import Icon from 'flavours/glitch/components/icon';
 import ComposePanel from './compose_panel';
 import NavigationPanel from './navigation_panel';
 
-import detectPassiveEvents from 'detect-passive-events';
+import { supportsPassiveEvents } from 'detect-passive-events';
 import { scrollRight } from 'flavours/glitch/util/scroll';
 
 const componentMap = {
@@ -80,7 +80,7 @@ class ColumnsArea extends ImmutablePureComponent {
 
   componentDidMount() {
     if (!this.props.singleColumn) {
-      this.node.addEventListener('wheel', this.handleWheel,  detectPassiveEvents.hasSupport ? { passive: true } : false);
+      this.node.addEventListener('wheel', this.handleWheel, supportsPassiveEvents ? { passive: true } : false);
     }
 
     this.lastIndex   = getIndex(this.context.router.history.location.pathname);
@@ -97,7 +97,7 @@ class ColumnsArea extends ImmutablePureComponent {
 
   componentDidUpdate(prevProps) {
     if (this.props.singleColumn !== prevProps.singleColumn && !this.props.singleColumn) {
-      this.node.addEventListener('wheel', this.handleWheel,  detectPassiveEvents.hasSupport ? { passive: true } : false);
+      this.node.addEventListener('wheel', this.handleWheel, supportsPassiveEvents ? { passive: true } : false);
     }
     this.lastIndex = getIndex(this.context.router.history.location.pathname);
     this.setState({ shouldAnimate: true });
diff --git a/app/javascript/flavours/glitch/features/ui/components/favourite_modal.js b/app/javascript/flavours/glitch/features/ui/components/favourite_modal.js
index 176e7c487..ea1d7876e 100644
--- a/app/javascript/flavours/glitch/features/ui/components/favourite_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/favourite_modal.js
@@ -7,11 +7,17 @@ import StatusContent from 'flavours/glitch/components/status_content';
 import Avatar from 'flavours/glitch/components/avatar';
 import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';
 import DisplayName from 'flavours/glitch/components/display_name';
+import AttachmentList from 'flavours/glitch/components/attachment_list';
 import Icon from 'flavours/glitch/components/icon';
 import ImmutablePureComponent from 'react-immutable-pure-component';
+import classNames from 'classnames';
 
 const messages = defineMessages({
   favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },
+  public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },
+  unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Unlisted' },
+  private_short: { id: 'privacy.private.short', defaultMessage: 'Followers-only' },
+  direct_short: { id: 'privacy.direct.short', defaultMessage: 'Direct' },
 });
 
 export default @injectIntl
@@ -54,13 +60,25 @@ class FavouriteModal extends ImmutablePureComponent {
   render () {
     const { status, intl } = this.props;
 
+    const visibilityIconInfo = {
+      'public': { icon: 'globe', text: intl.formatMessage(messages.public_short) },
+      'unlisted': { icon: 'unlock', text: intl.formatMessage(messages.unlisted_short) },
+      'private': { icon: 'lock', text: intl.formatMessage(messages.private_short) },
+      'direct': { icon: 'envelope', text: intl.formatMessage(messages.direct_short) },
+    };
+
+    const visibilityIcon = visibilityIconInfo[status.get('visibility')];
+
     return (
       <div className='modal-root__modal favourite-modal'>
         <div className='favourite-modal__container'>
-          <div className='status light'>
+          <div className={classNames('status', `status-${status.get('visibility')}`, 'light')}>
             <div className='favourite-modal__status-header'>
               <div className='favourite-modal__status-time'>
-                <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener'><RelativeTimestamp timestamp={status.get('created_at')} /></a>
+                <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
+                  <span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
+                  <RelativeTimestamp timestamp={status.get('created_at')} />
+                </a>
               </div>
 
               <a onClick={this.handleAccountClick} href={status.getIn(['account', 'url'])} className='status__display-name'>
@@ -69,10 +87,18 @@ class FavouriteModal extends ImmutablePureComponent {
                 </div>
 
                 <DisplayName account={status.get('account')} />
+
               </a>
             </div>
 
             <StatusContent status={status} />
+
+            {status.get('media_attachments').size > 0 && (
+              <AttachmentList
+                compact
+                media={status.get('media_attachments')}
+              />
+            )}
           </div>
         </div>
 
diff --git a/app/javascript/flavours/glitch/features/ui/components/image_loader.js b/app/javascript/flavours/glitch/features/ui/components/image_loader.js
index 5e1cf75af..c6f16a792 100644
--- a/app/javascript/flavours/glitch/features/ui/components/image_loader.js
+++ b/app/javascript/flavours/glitch/features/ui/components/image_loader.js
@@ -13,6 +13,7 @@ export default class ImageLoader extends React.PureComponent {
     width: PropTypes.number,
     height: PropTypes.number,
     onClick: PropTypes.func,
+    zoomButtonHidden: PropTypes.bool,
   }
 
   static defaultProps = {
@@ -151,6 +152,9 @@ export default class ImageLoader extends React.PureComponent {
             alt={alt}
             src={src}
             onClick={onClick}
+            width={width}
+            height={height}
+            zoomButtonHidden={this.props.zoomButtonHidden}
           />
         )}
       </div>
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 aa6554107..e37df7208 100644
--- a/app/javascript/flavours/glitch/features/ui/components/media_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/media_modal.js
@@ -35,23 +35,39 @@ class MediaModal extends ImmutablePureComponent {
   state = {
     index: null,
     navigationHidden: false,
+    zoomButtonHidden: false,
   };
 
   handleSwipe = (index) => {
     this.setState({ index: index % this.props.media.size });
   }
 
+  handleTransitionEnd = () => {
+    this.setState({
+      zoomButtonHidden: false,
+    });
+  }
+
   handleNextClick = () => {
-    this.setState({ index: (this.getIndex() + 1) % this.props.media.size });
+    this.setState({
+      index: (this.getIndex() + 1) % this.props.media.size,
+      zoomButtonHidden: true,
+    });
   }
 
   handlePrevClick = () => {
-    this.setState({ index: (this.props.media.size + this.getIndex() - 1) % this.props.media.size });
+    this.setState({
+      index: (this.props.media.size + this.getIndex() - 1) % this.props.media.size,
+      zoomButtonHidden: true,
+    });
   }
 
   handleChangeIndex = (e) => {
     const index = Number(e.currentTarget.getAttribute('data-index'));
-    this.setState({ index: index % this.props.media.size });
+    this.setState({
+      index: index % this.props.media.size,
+      zoomButtonHidden: true,
+    });
   }
 
   handleKeyDown = (e) => {
@@ -128,6 +144,7 @@ class MediaModal extends ImmutablePureComponent {
             alt={image.get('description')}
             key={image.get('url')}
             onClick={this.toggleNavigation}
+            zoomButtonHidden={this.state.zoomButtonHidden}
           />
         );
       } else if (image.get('type') === 'video') {
@@ -191,6 +208,7 @@ class MediaModal extends ImmutablePureComponent {
             style={swipeableViewsStyle}
             containerStyle={containerStyle}
             onChangeIndex={this.handleSwipe}
+            onTransitionEnd={this.handleTransitionEnd}
             index={index}
           >
             {content}
diff --git a/app/javascript/flavours/glitch/features/ui/components/zoomable_image.js b/app/javascript/flavours/glitch/features/ui/components/zoomable_image.js
index 3f6562bc9..caeeced64 100644
--- a/app/javascript/flavours/glitch/features/ui/components/zoomable_image.js
+++ b/app/javascript/flavours/glitch/features/ui/components/zoomable_image.js
@@ -1,8 +1,16 @@
 import React from 'react';
 import PropTypes from 'prop-types';
+import IconButton from 'flavours/glitch/components/icon_button';
+import { defineMessages, injectIntl } from 'react-intl';
+
+const messages = defineMessages({
+  compress: { id: 'lightbox.compress', defaultMessage: 'Compress image view box' },
+  expand: { id: 'lightbox.expand', defaultMessage: 'Expand image view box' },
+});
 
 const MIN_SCALE = 1;
 const MAX_SCALE = 4;
+const NAV_BAR_HEIGHT = 66;
 
 const getMidpoint = (p1, p2) => ({
   x: (p1.clientX + p2.clientX) / 2,
@@ -14,7 +22,77 @@ const getDistance = (p1, p2) =>
 
 const clamp = (min, max, value) => Math.min(max, Math.max(min, value));
 
-export default class ZoomableImage extends React.PureComponent {
+// Normalizing mousewheel speed across browsers
+// copy from: https://github.com/facebookarchive/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js
+const normalizeWheel = event => {
+  // Reasonable defaults
+  const PIXEL_STEP = 10;
+  const LINE_HEIGHT = 40;
+  const PAGE_HEIGHT = 800;
+
+  let sX = 0,
+    sY = 0, // spinX, spinY
+    pX = 0,
+    pY = 0; // pixelX, pixelY
+
+  // Legacy
+  if ('detail' in event) {
+    sY = event.detail;
+  }
+  if ('wheelDelta' in event) {
+    sY = -event.wheelDelta / 120;
+  }
+  if ('wheelDeltaY' in event) {
+    sY = -event.wheelDeltaY / 120;
+  }
+  if ('wheelDeltaX' in event) {
+    sX = -event.wheelDeltaX / 120;
+  }
+
+  // side scrolling on FF with DOMMouseScroll
+  if ('axis' in event && event.axis === event.HORIZONTAL_AXIS) {
+    sX = sY;
+    sY = 0;
+  }
+
+  pX = sX * PIXEL_STEP;
+  pY = sY * PIXEL_STEP;
+
+  if ('deltaY' in event) {
+    pY = event.deltaY;
+  }
+  if ('deltaX' in event) {
+    pX = event.deltaX;
+  }
+
+  if ((pX || pY) && event.deltaMode) {
+    if (event.deltaMode === 1) { // delta in LINE units
+      pX *= LINE_HEIGHT;
+      pY *= LINE_HEIGHT;
+    } else { // delta in PAGE units
+      pX *= PAGE_HEIGHT;
+      pY *= PAGE_HEIGHT;
+    }
+  }
+
+  // Fall-back if spin cannot be determined
+  if (pX && !sX) {
+    sX = (pX < 1) ? -1 : 1;
+  }
+  if (pY && !sY) {
+    sY = (pY < 1) ? -1 : 1;
+  }
+
+  return {
+    spinX: sX,
+    spinY: sY,
+    pixelX: pX,
+    pixelY: pY,
+  };
+};
+
+export default @injectIntl
+class ZoomableImage extends React.PureComponent {
 
   static propTypes = {
     alt: PropTypes.string,
@@ -22,6 +100,8 @@ export default class ZoomableImage extends React.PureComponent {
     width: PropTypes.number,
     height: PropTypes.number,
     onClick: PropTypes.func,
+    zoomButtonHidden: PropTypes.bool,
+    intl: PropTypes.object.isRequired,
   }
 
   static defaultProps = {
@@ -32,6 +112,26 @@ export default class ZoomableImage extends React.PureComponent {
 
   state = {
     scale: MIN_SCALE,
+    zoomMatrix: {
+      type: null, // 'width' 'height'
+      fullScreen: null, // bool
+      rate: null, // full screen scale rate
+      clientWidth: null,
+      clientHeight: null,
+      offsetWidth: null,
+      offsetHeight: null,
+      clientHeightFixed: null,
+      scrollTop: null,
+      scrollLeft: null,
+      translateX: null,
+      translateY: null,
+    },
+    zoomState: 'expand', // 'expand' 'compress'
+    navigationHidden: false,
+    dragPosition: { top: 0, left: 0, x: 0, y: 0 },
+    dragged: false,
+    lockScroll: { x: 0, y: 0 },
+    lockTranslate: { x: 0, y: 0 },
   }
 
   removers = [];
@@ -49,17 +149,105 @@ export default class ZoomableImage extends React.PureComponent {
     // https://www.chromestatus.com/features/5093566007214080
     this.container.addEventListener('touchmove', handler, { passive: false });
     this.removers.push(() => this.container.removeEventListener('touchend', handler));
+
+    handler = this.mouseDownHandler;
+    this.container.addEventListener('mousedown', handler);
+    this.removers.push(() => this.container.removeEventListener('mousedown', handler));
+
+    handler = this.mouseWheelHandler;
+    this.container.addEventListener('wheel', handler);
+    this.removers.push(() => this.container.removeEventListener('wheel', handler));
+    // Old Chrome
+    this.container.addEventListener('mousewheel', handler);
+    this.removers.push(() => this.container.removeEventListener('mousewheel', handler));
+    // Old Firefox
+    this.container.addEventListener('DOMMouseScroll', handler);
+    this.removers.push(() => this.container.removeEventListener('DOMMouseScroll', handler));
+
+    this.initZoomMatrix();
   }
 
   componentWillUnmount () {
     this.removeEventListeners();
   }
 
+  componentDidUpdate () {
+    this.setState({ zoomState: this.state.scale >= this.state.zoomMatrix.rate ? 'compress' : 'expand' });
+
+    if (this.state.scale === MIN_SCALE) {
+      this.container.style.removeProperty('cursor');
+    }
+  }
+
+  UNSAFE_componentWillReceiveProps () {
+    // reset when slide to next image
+    if (this.props.zoomButtonHidden) {
+      this.setState({
+        scale: MIN_SCALE,
+        lockTranslate: { x: 0, y: 0 },
+      }, () => {
+        this.container.scrollLeft = 0;
+        this.container.scrollTop = 0;
+      });
+    }
+  }
+
   removeEventListeners () {
     this.removers.forEach(listeners => listeners());
     this.removers = [];
   }
 
+  mouseWheelHandler = e => {
+    e.preventDefault();
+
+    const event = normalizeWheel(e);
+
+    if (this.state.zoomMatrix.type === 'width') {
+      // full width, scroll vertical
+      this.container.scrollTop = Math.max(this.container.scrollTop + event.pixelY, this.state.lockScroll.y);
+    } else {
+      // full height, scroll horizontal
+      this.container.scrollLeft = Math.max(this.container.scrollLeft + event.pixelY, this.state.lockScroll.x);
+    }
+
+    // lock horizontal scroll
+    this.container.scrollLeft = Math.max(this.container.scrollLeft + event.pixelX, this.state.lockScroll.x);
+  }
+
+  mouseDownHandler = e => {
+    this.container.style.cursor = 'grabbing';
+    this.container.style.userSelect = 'none';
+
+    this.setState({ dragPosition: {
+      left: this.container.scrollLeft,
+      top: this.container.scrollTop,
+      // Get the current mouse position
+      x: e.clientX,
+      y: e.clientY,
+    } });
+
+    this.image.addEventListener('mousemove', this.mouseMoveHandler);
+    this.image.addEventListener('mouseup', this.mouseUpHandler);
+  }
+
+  mouseMoveHandler = e => {
+    const dx = e.clientX - this.state.dragPosition.x;
+    const dy = e.clientY - this.state.dragPosition.y;
+
+    this.container.scrollLeft = Math.max(this.state.dragPosition.left - dx, this.state.lockScroll.x);
+    this.container.scrollTop = Math.max(this.state.dragPosition.top - dy, this.state.lockScroll.y);
+
+    this.setState({ dragged: true });
+  }
+
+  mouseUpHandler = () => {
+    this.container.style.cursor = 'grab';
+    this.container.style.removeProperty('user-select');
+
+    this.image.removeEventListener('mousemove', this.mouseMoveHandler);
+    this.image.removeEventListener('mouseup', this.mouseUpHandler);
+  }
+
   handleTouchStart = e => {
     if (e.touches.length !== 2) return;
 
@@ -80,7 +268,8 @@ export default class ZoomableImage extends React.PureComponent {
 
     const distance = getDistance(...e.touches);
     const midpoint = getMidpoint(...e.touches);
-    const scale = clamp(MIN_SCALE, MAX_SCALE, this.state.scale * distance / this.lastDistance);
+    const _MAX_SCALE = Math.max(MAX_SCALE, this.state.zoomMatrix.rate);
+    const scale = clamp(MIN_SCALE, _MAX_SCALE, this.state.scale * distance / this.lastDistance);
 
     this.zoom(scale, midpoint);
 
@@ -89,7 +278,7 @@ export default class ZoomableImage extends React.PureComponent {
   }
 
   zoom(nextScale, midpoint) {
-    const { scale } = this.state;
+    const { scale, zoomMatrix } = this.state;
     const { scrollLeft, scrollTop } = this.container;
 
     // math memo:
@@ -104,14 +293,105 @@ export default class ZoomableImage extends React.PureComponent {
     this.setState({ scale: nextScale }, () => {
       this.container.scrollLeft = nextScrollLeft;
       this.container.scrollTop = nextScrollTop;
+      // reset the translateX/Y constantly
+      if (nextScale < zoomMatrix.rate) {
+        this.setState({
+          lockTranslate: {
+            x: zoomMatrix.fullScreen ? 0 : zoomMatrix.translateX * ((nextScale - MIN_SCALE) / (zoomMatrix.rate - MIN_SCALE)),
+            y: zoomMatrix.fullScreen ? 0 : zoomMatrix.translateY * ((nextScale - MIN_SCALE) / (zoomMatrix.rate - MIN_SCALE)),
+          },
+        });
+      }
     });
   }
 
   handleClick = e => {
     // don't propagate event to MediaModal
     e.stopPropagation();
+    const dragged = this.state.dragged;
+    this.setState({ dragged: false });
+    if (dragged) return;
     const handler = this.props.onClick;
     if (handler) handler();
+    this.setState({ navigationHidden: !this.state.navigationHidden });
+  }
+
+  handleMouseDown = e => {
+    e.preventDefault();
+  }
+
+  initZoomMatrix = () => {
+    const { width, height } = this.props;
+    const { clientWidth, clientHeight } = this.container;
+    const { offsetWidth, offsetHeight } = this.image;
+    const clientHeightFixed = clientHeight - NAV_BAR_HEIGHT;
+
+    const type = width / height < clientWidth / clientHeightFixed ? 'width' : 'height';
+    const fullScreen = type === 'width' ?  width > clientWidth : height > clientHeightFixed;
+    const rate = type === 'width' ? Math.min(clientWidth, width) / offsetWidth : Math.min(clientHeightFixed, height) / offsetHeight;
+    const scrollTop = type === 'width' ?  (clientHeight - offsetHeight) / 2 - NAV_BAR_HEIGHT : (clientHeightFixed - offsetHeight) / 2;
+    const scrollLeft = (clientWidth - offsetWidth) / 2;
+    const translateX = type === 'width' ? (width - offsetWidth) / (2 * rate) : 0;
+    const translateY = type === 'height' ? (height - offsetHeight) / (2 * rate) : 0;
+
+    this.setState({
+      zoomMatrix: {
+        type: type,
+        fullScreen: fullScreen,
+        rate: rate,
+        clientWidth: clientWidth,
+        clientHeight: clientHeight,
+        offsetWidth: offsetWidth,
+        offsetHeight: offsetHeight,
+        clientHeightFixed: clientHeightFixed,
+        scrollTop: scrollTop,
+        scrollLeft: scrollLeft,
+        translateX: translateX,
+        translateY: translateY,
+      },
+    });
+  }
+
+  handleZoomClick = e => {
+    e.preventDefault();
+    e.stopPropagation();
+
+    const { scale, zoomMatrix } = this.state;
+
+    if ( scale >= zoomMatrix.rate ) {
+      this.setState({
+        scale: MIN_SCALE,
+        lockScroll: {
+          x: 0,
+          y: 0,
+        },
+        lockTranslate: {
+          x: 0,
+          y: 0,
+        },
+      }, () => {
+        this.container.scrollLeft = 0;
+        this.container.scrollTop = 0;
+      });
+    } else {
+      this.setState({
+        scale: zoomMatrix.rate,
+        lockScroll: {
+          x: zoomMatrix.scrollLeft,
+          y: zoomMatrix.scrollTop,
+        },
+        lockTranslate: {
+          x: zoomMatrix.fullScreen ? 0 : zoomMatrix.translateX,
+          y: zoomMatrix.fullScreen ? 0 : zoomMatrix.translateY,
+        },
+      }, () => {
+        this.container.scrollLeft = zoomMatrix.scrollLeft;
+        this.container.scrollTop = zoomMatrix.scrollTop;
+      });
+    }
+
+    this.container.style.cursor = 'grab';
+    this.container.style.removeProperty('user-select');
   }
 
   setContainerRef = c => {
@@ -123,29 +403,47 @@ export default class ZoomableImage extends React.PureComponent {
   }
 
   render () {
-    const { alt, src } = this.props;
-    const { scale } = this.state;
-    const overflow = scale === 1 ? 'hidden' : 'scroll';
+    const { alt, src, width, height, intl } = this.props;
+    const { scale, lockTranslate } = this.state;
+    const overflow = scale === MIN_SCALE ? 'hidden' : 'scroll';
+    const zoomButtonShouldHide = this.state.navigationHidden || this.props.zoomButtonHidden || this.state.zoomMatrix.rate <= MIN_SCALE ? 'media-modal__zoom-button--hidden' : '';
+    const zoomButtonTitle = this.state.zoomState === 'compress' ? intl.formatMessage(messages.compress) : intl.formatMessage(messages.expand);
 
     return (
-      <div
-        className='zoomable-image'
-        ref={this.setContainerRef}
-        style={{ overflow }}
-      >
-        <img
-          role='presentation'
-          ref={this.setImageRef}
-          alt={alt}
-          title={alt}
-          src={src}
+      <React.Fragment>
+        <IconButton
+          className={`media-modal__zoom-button ${zoomButtonShouldHide}`}
+          title={zoomButtonTitle}
+          icon={this.state.zoomState}
+          onClick={this.handleZoomClick}
+          size={40}
           style={{
-            transform: `scale(${scale})`,
-            transformOrigin: '0 0',
+            fontSize: '30px', /* Fontawesome's fa-compress fa-expand is larger than fa-close */
           }}
-          onClick={this.handleClick}
         />
-      </div>
+        <div
+          className='zoomable-image'
+          ref={this.setContainerRef}
+          style={{ overflow }}
+        >
+          <img
+            role='presentation'
+            ref={this.setImageRef}
+            alt={alt}
+            title={alt}
+            src={src}
+            width={width}
+            height={height}
+            style={{
+              transform: `scale(${scale}) translate(-${lockTranslate.x}px, -${lockTranslate.y}px)`,
+              transformOrigin: '0 0',
+            }}
+            draggable={false}
+            onClick={this.handleClick}
+            onMouseDown={this.handleMouseDown}
+          />
+        </div>
+      </React.Fragment>
     );
   }
 
diff --git a/app/javascript/flavours/glitch/features/video/index.js b/app/javascript/flavours/glitch/features/video/index.js
index 95bee1331..870812856 100644
--- a/app/javascript/flavours/glitch/features/video/index.js
+++ b/app/javascript/flavours/glitch/features/video/index.js
@@ -211,7 +211,7 @@ class Video extends React.PureComponent {
   handleTimeUpdate = () => {
     this.setState({
       currentTime: this.video.currentTime,
-      duration: Math.floor(this.video.duration),
+      duration:this.video.duration,
     });
   }
 
@@ -281,9 +281,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());
     }
   }
 
@@ -381,13 +381,16 @@ 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 = () => {
     if (this.state.revealed) {
-      this.video.pause();
+      this.setState({ paused: true });
     }
 
     if (this.props.onToggleVisibility) {
@@ -475,13 +478,6 @@ class Video extends React.PureComponent {
       return (<div className={computedClass} ref={this.setPlayerRef} tabindex={0}></div>);
     }
 
-    let warning;
-    if (sensitive) {
-      warning = <FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' />;
-    } else {
-      warning = <FormattedMessage id='status.media_hidden' defaultMessage='Media hidden' />;
-    }
-
     let preload;
 
     if (this.props.currentTime || fullscreen || dragging) {
@@ -492,6 +488,14 @@ class Video extends React.PureComponent {
       preload = 'none';
     }
 
+    let warning;
+
+    if (sensitive) {
+      warning = <FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' />;
+    } else {
+      warning = <FormattedMessage id='status.media_hidden' defaultMessage='Media hidden' />;
+    }
+
     return (
       <div
         className={computedClass}
@@ -551,8 +555,8 @@ class Video extends React.PureComponent {
 
           <div className='video-player__buttons-bar'>
             <div className='video-player__buttons left'>
-              <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} onClick={this.togglePlay} autoFocus={detailed}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
-              <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
+              <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} className='player-button' onClick={this.togglePlay} autoFocus={detailed}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
+              <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
 
               <div className={classNames('video-player__volume', { active: this.state.hovered })} onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}>
                 <div className='video-player__volume__current' style={{ width: `${volume * 100}%` }} />
@@ -568,7 +572,7 @@ class Video extends React.PureComponent {
                 <span className='video-player__time'>
                   <span className='video-player__time-current'>{formatTime(Math.floor(currentTime))}</span>
                   <span className='video-player__time-sep'>/</span>
-                  <span className='video-player__time-total'>{formatTime(duration)}</span>
+                  <span className='video-player__time-total'>{formatTime(Math.floor(duration))}</span>
                 </span>
               )}
 
@@ -576,10 +580,10 @@ class Video extends React.PureComponent {
             </div>
 
             <div className='video-player__buttons right'>
-              {(!onCloseVideo && !editable && !fullscreen && !this.props.alwaysVisible) && <button type='button' title={intl.formatMessage(messages.hide)} aria-label={intl.formatMessage(messages.hide)} onClick={this.toggleReveal}><Icon id='eye-slash' fixedWidth /></button>}
-              {(!fullscreen && onOpenVideo) && <button type='button' title={intl.formatMessage(messages.expand)} aria-label={intl.formatMessage(messages.expand)} onClick={this.handleOpenVideo}><Icon id='expand' fixedWidth /></button>}
-              {onCloseVideo && <button type='button' title={intl.formatMessage(messages.close)} aria-label={intl.formatMessage(messages.close)} onClick={this.handleCloseVideo}><Icon id='compress' fixedWidth /></button>}
-              <button type='button' title={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} aria-label={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} onClick={this.toggleFullscreen}><Icon id={fullscreen ? 'compress' : 'arrows-alt'} fixedWidth /></button>
+              {(!onCloseVideo && !editable && !fullscreen && !this.props.alwaysVisible) && <button type='button' title={intl.formatMessage(messages.hide)} aria-label={intl.formatMessage(messages.hide)} className='player-button' onClick={this.toggleReveal}><Icon id='eye-slash' fixedWidth /></button>}
+              {(!fullscreen && onOpenVideo) && <button type='button' title={intl.formatMessage(messages.expand)} aria-label={intl.formatMessage(messages.expand)} className='player-button' onClick={this.handleOpenVideo}><Icon id='expand' fixedWidth /></button>}
+              {onCloseVideo && <button type='button' title={intl.formatMessage(messages.close)} aria-label={intl.formatMessage(messages.close)} className='player-button' onClick={this.handleCloseVideo}><Icon id='compress' fixedWidth /></button>}
+              <button type='button' title={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} aria-label={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} className='player-button' onClick={this.toggleFullscreen}><Icon id={fullscreen ? 'compress' : 'arrows-alt'} fixedWidth /></button>
             </div>
           </div>
         </div>
diff --git a/app/javascript/flavours/glitch/locales/ku.js b/app/javascript/flavours/glitch/locales/ku.js
new file mode 100644
index 000000000..19e0e95aa
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/ku.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/ku.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sa.js b/app/javascript/flavours/glitch/locales/sa.js
new file mode 100644
index 000000000..4cade0a07
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sa.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/sa.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/sc.js b/app/javascript/flavours/glitch/locales/sc.js
new file mode 100644
index 000000000..88a83aa53
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/sc.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/sc.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/locales/zgh.js b/app/javascript/flavours/glitch/locales/zgh.js
new file mode 100644
index 000000000..f2f15b1a4
--- /dev/null
+++ b/app/javascript/flavours/glitch/locales/zgh.js
@@ -0,0 +1,7 @@
+import inherited from 'mastodon/locales/zgh.json';
+
+const messages = {
+  //  No translations available.
+};
+
+export default Object.assign({}, inherited, messages);
diff --git a/app/javascript/flavours/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js
index b4c5ef71a..c630cc7e3 100644
--- a/app/javascript/flavours/glitch/reducers/notifications.js
+++ b/app/javascript/flavours/glitch/reducers/notifications.js
@@ -19,6 +19,7 @@ import {
   NOTIFICATIONS_MARK_AS_READ,
   NOTIFICATIONS_SET_BROWSER_SUPPORT,
   NOTIFICATIONS_SET_BROWSER_PERMISSION,
+  NOTIFICATIONS_DISMISS_BROWSER_PERMISSION,
 } from 'flavours/glitch/actions/notifications';
 import {
   ACCOUNT_BLOCK_SUCCESS,
@@ -283,6 +284,8 @@ export default function notifications(state = initialState, action) {
     return state.set('browserSupport', action.value);
   case NOTIFICATIONS_SET_BROWSER_PERMISSION:
     return state.set('browserPermission', action.value);
+  case NOTIFICATIONS_DISMISS_BROWSER_PERMISSION:
+    return state.set('browserPermission', 'denied');
 
   case NOTIFICATION_MARK_FOR_DELETE:
     return markForDelete(state, action.id, action.yes);
diff --git a/app/javascript/flavours/glitch/styles/components/columns.scss b/app/javascript/flavours/glitch/styles/components/columns.scss
index be32ae52e..2550f50f4 100644
--- a/app/javascript/flavours/glitch/styles/components/columns.scss
+++ b/app/javascript/flavours/glitch/styles/components/columns.scss
@@ -702,6 +702,13 @@
   flex-direction: column;
   align-items: center;
   justify-content: center;
+  position: relative;
+
+  &__close {
+    position: absolute;
+    top: 10px;
+    right: 10px;
+  }
 
   h2 {
     font-size: 16px;
diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss
index 0614278e2..3e67754c5 100644
--- a/app/javascript/flavours/glitch/styles/components/index.scss
+++ b/app/javascript/flavours/glitch/styles/components/index.scss
@@ -425,6 +425,20 @@
   align-items: center;
   justify-content: center;
   flex-direction: column;
+  scrollbar-width: none; /* Firefox */
+  -ms-overflow-style: none;  /* IE 10+ */
+
+  * {
+    scrollbar-width: none; /* Firefox */
+    -ms-overflow-style: none;  /* IE 10+ */
+  }
+
+  &::-webkit-scrollbar,
+  *::-webkit-scrollbar {
+    width: 0;
+    height: 0;
+    background: transparent; /* Chrome/Safari/Webkit */
+  }
 
   .image-loader__preview-canvas {
     max-width: $media-modal-media-max-width;
diff --git a/app/javascript/flavours/glitch/styles/components/media.scss b/app/javascript/flavours/glitch/styles/components/media.scss
index 58bdb642f..f504fa91e 100644
--- a/app/javascript/flavours/glitch/styles/components/media.scss
+++ b/app/javascript/flavours/glitch/styles/components/media.scss
@@ -385,7 +385,6 @@
   }
 
   .video-player__controls {
-    padding: 0 15px;
     padding-top: 10px;
     background: transparent;
   }
@@ -512,7 +511,8 @@
   &__buttons-bar {
     display: flex;
     justify-content: space-between;
-    padding-bottom: 10px;
+    padding-bottom: 8px;
+    margin: 0 -5px;
 
     .video-player__download__icon {
       color: inherit;
@@ -536,22 +536,13 @@
     overflow: hidden;
     text-overflow: ellipsis;
 
-    &.left {
-      button {
-        padding-left: 0;
-      }
-    }
-
-    &.right {
-      button {
-        padding-right: 0;
-      }
-    }
+    .player-button {
+      display: inline-block;
+      outline: 0;
 
-    button {
       flex: 0 0 auto;
       background: transparent;
-      padding: 2px 10px;
+      padding: 5px;
       font-size: 16px;
       border: 0;
       color: rgba($white, 0.75);
@@ -569,6 +560,7 @@
     flex: 0 1 auto;
     overflow: hidden;
     text-overflow: ellipsis;
+    margin: 0 5px;
   }
 
   &__time-sep,
@@ -688,7 +680,7 @@
       display: block;
       position: absolute;
       height: 4px;
-      top: 10px;
+      top: 14px;
     }
 
     &__progress,
@@ -697,7 +689,7 @@
       position: absolute;
       height: 4px;
       border-radius: 4px;
-      top: 10px;
+      top: 14px;
       background: lighten($ui-highlight-color, 8%);
     }
 
@@ -712,7 +704,7 @@
       border-radius: 50%;
       width: 12px;
       height: 12px;
-      top: 6px;
+      top: 10px;
       margin-left: -6px;
       background: lighten($ui-highlight-color, 8%);
       box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
@@ -736,7 +728,7 @@
   &.detailed,
   &.fullscreen {
     .video-player__buttons {
-      button {
+      .player-button {
         padding-top: 10px;
         padding-bottom: 10px;
       }
diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss
index 85f216887..bc0965864 100644
--- a/app/javascript/flavours/glitch/styles/components/modal.scss
+++ b/app/javascript/flavours/glitch/styles/components/modal.scss
@@ -40,6 +40,21 @@
   z-index: 9999;
 }
 
+.media-modal__zoom-button {
+  position: absolute;
+  right: 64px;
+  top: 8px;
+  z-index: 100;
+  pointer-events: auto;
+  transition: opacity 0.3s linear;
+  will-change: opacity;
+}
+
+.media-modal__zoom-button--hidden {
+  pointer-events: none;
+  opacity: 0;
+}
+
 .onboarding-modal,
 .error-modal,
 .embed-modal {
@@ -427,10 +442,8 @@
 
   .status__visibility-icon {
     color: $dark-text-color;
-    float: right;
     font-size: 14px;
-    margin-left: 4px;
-    margin-right: 4px;
+    padding: 0 4px;
   }
 
   .status__display-name {
diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index 03acd72d8..7ca1ae423 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -55,6 +55,7 @@
   font-weight: 400;
   overflow: visible;
   padding-top: 5px;
+  clear: both;
 
   &:focus {
     outline: 0;
diff --git a/app/javascript/flavours/glitch/styles/statuses.scss b/app/javascript/flavours/glitch/styles/statuses.scss
index 982a1ab9a..58f74f954 100644
--- a/app/javascript/flavours/glitch/styles/statuses.scss
+++ b/app/javascript/flavours/glitch/styles/statuses.scss
@@ -201,19 +201,18 @@
       display: initial;
     }
 
-    .status__relative-time,
-    .status__visibility-icon {
+    .status__relative-time {
       color: $dark-text-color;
       float: right;
       font-size: 14px;
       width: auto;
       margin: initial;
       padding: initial;
+      padding-bottom: 1px;
     }
 
     .status__visibility-icon {
-      margin-left: 4px;
-      margin-right: 4px;
+      padding: 0 4px;
     }
 
     .status__info .status__display-name {
diff --git a/app/javascript/flavours/glitch/styles/variables.scss b/app/javascript/flavours/glitch/styles/variables.scss
index 1ed1a5778..6e242281b 100644
--- a/app/javascript/flavours/glitch/styles/variables.scss
+++ b/app/javascript/flavours/glitch/styles/variables.scss
@@ -36,6 +36,8 @@ $dark-text-color: $ui-base-lighter-color !default;
 $secondary-text-color: $ui-secondary-color !default;
 $highlight-text-color: $ui-highlight-color !default;
 $action-button-color: $ui-base-lighter-color !default;
+$passive-text-color: $gold-star !default;
+$active-passive-text-color: $success-green !default;
 // For texts on inverted backgrounds
 $inverted-text-color: $ui-base-color !default;
 $lighter-text-color: $ui-base-lighter-color !default;
diff --git a/app/javascript/flavours/glitch/styles/widgets.scss b/app/javascript/flavours/glitch/styles/widgets.scss
index 531425573..b397844a2 100644
--- a/app/javascript/flavours/glitch/styles/widgets.scss
+++ b/app/javascript/flavours/glitch/styles/widgets.scss
@@ -437,6 +437,26 @@
     vertical-align: initial !important;
   }
 
+  &__interrelationships {
+    width: 21px;
+  }
+
+  .fa {
+    font-size: 16px;
+
+    &.active {
+      color: $highlight-text-color;
+    }
+
+    &.passive {
+      color: $passive-text-color;
+    }
+
+    &.active.passive {
+      color: $active-passive-text-color;
+    }
+  }
+
   @media screen and (max-width: $no-gap-breakpoint) {
     tbody td.optional {
       display: none;
diff --git a/app/javascript/flavours/glitch/util/dom_helpers.js b/app/javascript/flavours/glitch/util/dom_helpers.js
index 3e1f4a26d..d94aeb9d4 100644
--- a/app/javascript/flavours/glitch/util/dom_helpers.js
+++ b/app/javascript/flavours/glitch/util/dom_helpers.js
@@ -1,9 +1,9 @@
 //  Package imports.
-import detectPassiveEvents from 'detect-passive-events';
+import { supportsPassiveEvents } from 'detect-passive-events';
 
 //  This will either be a passive lister options object (if passive
 //  events are supported), or `false`.
-export const withPassive = detectPassiveEvents.hasSupport ? { passive: true } : false;
+export const withPassive = supportsPassiveEvents ? { passive: true } : false;
 
 //  Focuses the root element.
 export function focusRoot () {
diff --git a/app/javascript/flavours/glitch/util/is_mobile.js b/app/javascript/flavours/glitch/util/is_mobile.js
index db3c8bd80..7e584e8fa 100644
--- a/app/javascript/flavours/glitch/util/is_mobile.js
+++ b/app/javascript/flavours/glitch/util/is_mobile.js
@@ -1,4 +1,4 @@
-import detectPassiveEvents from 'detect-passive-events';
+import { supportsPassiveEvents } from 'detect-passive-events';
 import { forceSingleColumn } from 'flavours/glitch/util/initial_state';
 
 const LAYOUT_BREAKPOINT = 630;
@@ -17,7 +17,7 @@ export function isMobile(width, columns) {
 const iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
 
 let userTouching = false;
-let listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;
+let listenerOptions = supportsPassiveEvents ? { passive: true } : false;
 
 function touchListener() {
   userTouching = true;
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index 6ef12f7b9..a60373fd5 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -152,9 +152,7 @@ export function submitCompose(routerHistory) {
         'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']),
       },
     }).then(function (response) {
-      if (response.data.visibility === 'direct' && getState().getIn(['conversations', 'mounted']) <= 0 && routerHistory) {
-        routerHistory.push('/timelines/direct');
-      } else if (routerHistory && routerHistory.location.pathname === '/statuses/new' && window.history.state) {
+      if (routerHistory && routerHistory.location.pathname === '/statuses/new' && window.history.state) {
         routerHistory.goBack();
       }
 
diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js
index c4fa66428..d40b65745 100644
--- a/app/javascript/mastodon/actions/notifications.js
+++ b/app/javascript/mastodon/actions/notifications.js
@@ -37,8 +37,9 @@ export const NOTIFICATIONS_UNMOUNT = 'NOTIFICATIONS_UNMOUNT';
 
 export const NOTIFICATIONS_MARK_AS_READ = 'NOTIFICATIONS_MARK_AS_READ';
 
-export const NOTIFICATIONS_SET_BROWSER_SUPPORT    = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
-export const NOTIFICATIONS_SET_BROWSER_PERMISSION = 'NOTIFICATIONS_SET_BROWSER_PERMISSION';
+export const NOTIFICATIONS_SET_BROWSER_SUPPORT        = 'NOTIFICATIONS_SET_BROWSER_SUPPORT';
+export const NOTIFICATIONS_SET_BROWSER_PERMISSION     = 'NOTIFICATIONS_SET_BROWSER_PERMISSION';
+export const NOTIFICATIONS_DISMISS_BROWSER_PERMISSION = 'NOTIFICATIONS_DISMISS_BROWSER_PERMISSION';
 
 defineMessages({
   mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' },
@@ -283,3 +284,7 @@ export function setBrowserPermission (value) {
     value,
   };
 }
+
+export const dismissBrowserPermission = () => ({
+  type: NOTIFICATIONS_DISMISS_BROWSER_PERMISSION,
+});
diff --git a/app/javascript/mastodon/components/column.js b/app/javascript/mastodon/components/column.js
index 55e3bfd5e..239824a4f 100644
--- a/app/javascript/mastodon/components/column.js
+++ b/app/javascript/mastodon/components/column.js
@@ -1,6 +1,6 @@
 import React from 'react';
 import PropTypes from 'prop-types';
-import detectPassiveEvents from 'detect-passive-events';
+import { supportsPassiveEvents } from 'detect-passive-events';
 import { scrollTop } from '../scroll';
 
 export default class Column extends React.PureComponent {
@@ -35,9 +35,9 @@ export default class Column extends React.PureComponent {
 
   componentDidMount () {
     if (this.props.bindToDocument) {
-      document.addEventListener('wheel', this.handleWheel,  detectPassiveEvents.hasSupport ? { passive: true } : false);
+      document.addEventListener('wheel', this.handleWheel, supportsPassiveEvents ? { passive: true } : false);
     } else {
-      this.node.addEventListener('wheel', this.handleWheel,  detectPassiveEvents.hasSupport ? { passive: true } : false);
+      this.node.addEventListener('wheel', this.handleWheel, supportsPassiveEvents ? { passive: true } : false);
     }
   }
 
diff --git a/app/javascript/mastodon/components/dropdown_menu.js b/app/javascript/mastodon/components/dropdown_menu.js
index 09e3c9df8..c6b4b1187 100644
--- a/app/javascript/mastodon/components/dropdown_menu.js
+++ b/app/javascript/mastodon/components/dropdown_menu.js
@@ -5,9 +5,9 @@ import IconButton from './icon_button';
 import Overlay from 'react-overlays/lib/Overlay';
 import Motion from '../features/ui/util/optional_motion';
 import spring from 'react-motion/lib/spring';
-import detectPassiveEvents from 'detect-passive-events';
+import { supportsPassiveEvents } from 'detect-passive-events';
 
-const listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;
+const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
 let id = 0;
 
 class DropdownMenu extends React.PureComponent {
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js
index c1e1cd172..be4f0bcca 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/mastodon/components/status.js
@@ -460,8 +460,10 @@ class Status extends ImmutablePureComponent {
           <div className={classNames('status', `status-${status.get('visibility')}`, { 'status-reply': !!status.get('in_reply_to_id'), muted: this.props.muted })} data-id={status.get('id')}>
             <div className='status__expand' onClick={this.handleExpandClick} role='presentation' />
             <div className='status__info'>
-              <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'><RelativeTimestamp timestamp={status.get('created_at')} /></a>
-              <span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
+              <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
+                <span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
+                <RelativeTimestamp timestamp={status.get('created_at')} />
+              </a>
 
               <a onClick={this.handleAccountClick} data-id={status.getIn(['account', 'id'])} href={status.getIn(['account', 'url'])} title={status.getIn(['account', 'acct'])} className='status__display-name' target='_blank' rel='noopener noreferrer'>
                 <div className='status__avatar'>
diff --git a/app/javascript/mastodon/features/account_gallery/components/media_item.js b/app/javascript/mastodon/features/account_gallery/components/media_item.js
index c9a7af7f7..ba7ec46a3 100644
--- a/app/javascript/mastodon/features/account_gallery/components/media_item.js
+++ b/app/javascript/mastodon/features/account_gallery/components/media_item.js
@@ -122,7 +122,7 @@ export default class MediaItem extends ImmutablePureComponent {
         <div className='media-gallery__gifv'>
           {content}
 
-          <span className='media-gallery__gifv__label'>{label}</span>
+          {label && <span className='media-gallery__gifv__label'>{label}</span>}
         </div>
       );
     }
diff --git a/app/javascript/mastodon/features/audio/index.js b/app/javascript/mastodon/features/audio/index.js
index 6954d2a4c..434148e8e 100644
--- a/app/javascript/mastodon/features/audio/index.js
+++ b/app/javascript/mastodon/features/audio/index.js
@@ -246,7 +246,7 @@ class Audio extends React.PureComponent {
   handleTimeUpdate = () => {
     this.setState({
       currentTime: this.audio.currentTime,
-      duration: Math.floor(this.audio.duration),
+      duration: this.audio.duration,
     });
   }
 
@@ -438,14 +438,14 @@ class Audio extends React.PureComponent {
         <div className='video-player__controls active'>
           <div className='video-player__buttons-bar'>
             <div className='video-player__buttons left'>
-              <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} onClick={this.togglePlay}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
-              <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
+              <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} className='player-button' onClick={this.togglePlay}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
+              <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
 
               <div className={classNames('video-player__volume', { active: this.state.hovered })} ref={this.setVolumeRef} onMouseDown={this.handleVolumeMouseDown}>
                 <div className='video-player__volume__current' style={{ width: `${volume * 100}%`, backgroundColor: this._getAccentColor() }} />
 
                 <span
-                  className={classNames('video-player__volume__handle')}
+                  className='video-player__volume__handle'
                   tabIndex='0'
                   style={{ left: `${volume * 100}%`, backgroundColor: this._getAccentColor() }}
                 />
@@ -454,12 +454,14 @@ class Audio extends React.PureComponent {
               <span className='video-player__time'>
                 <span className='video-player__time-current'>{formatTime(Math.floor(currentTime))}</span>
                 <span className='video-player__time-sep'>/</span>
-                <span className='video-player__time-total'>{formatTime(this.state.duration || Math.floor(this.props.duration))}</span>
+                <span className='video-player__time-total'>{formatTime(Math.floor(this.state.duration || this.props.duration))}</span>
               </span>
             </div>
 
             <div className='video-player__buttons right'>
-              <button type='button' title={intl.formatMessage(messages.download)} aria-label={intl.formatMessage(messages.download)} onClick={this.handleDownload}><Icon id='download' fixedWidth /></button>
+              <a title={intl.formatMessage(messages.download)} aria-label={intl.formatMessage(messages.download)} className='video-player__download__icon player-button' href={this.props.src} download>
+                <Icon id={'download'} fixedWidth />
+              </a>
             </div>
           </div>
         </div>
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 bac136e5e..dc4f48060 100644
--- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
@@ -5,7 +5,7 @@ import { EmojiPicker as EmojiPickerAsync } from '../../ui/util/async-components'
 import Overlay from 'react-overlays/lib/Overlay';
 import classNames from 'classnames';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import detectPassiveEvents from 'detect-passive-events';
+import { supportsPassiveEvents } from 'detect-passive-events';
 import { buildCustomEmojis, categoriesFromEmojis } from '../../emoji/emoji';
 import { assetHost } from 'mastodon/utils/config';
 
@@ -29,7 +29,7 @@ const messages = defineMessages({
 let EmojiPicker, Emoji; // load asynchronously
 
 const backgroundImageFn = () => `${assetHost}/emoji/sheet_10.png`;
-const listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;
+const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
 
 class ModifierPickerMenu extends React.PureComponent {
 
diff --git a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
index 5223025fb..309f46290 100644
--- a/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/privacy_dropdown.js
@@ -5,7 +5,7 @@ import IconButton from '../../../components/icon_button';
 import Overlay from 'react-overlays/lib/Overlay';
 import Motion from '../../ui/util/optional_motion';
 import spring from 'react-motion/lib/spring';
-import detectPassiveEvents from 'detect-passive-events';
+import { supportsPassiveEvents } from 'detect-passive-events';
 import classNames from 'classnames';
 import Icon from 'mastodon/components/icon';
 
@@ -21,7 +21,7 @@ const messages = defineMessages({
   change_privacy: { id: 'privacy.change', defaultMessage: 'Adjust status privacy' },
 });
 
-const listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;
+const listenerOptions = supportsPassiveEvents ? { passive: true } : false;
 
 class PrivacyDropdownMenu extends React.PureComponent {
 
diff --git a/app/javascript/mastodon/features/compose/containers/sensitive_button_container.js b/app/javascript/mastodon/features/compose/containers/sensitive_button_container.js
index 7073f76c2..1bcce5731 100644
--- a/app/javascript/mastodon/features/compose/containers/sensitive_button_container.js
+++ b/app/javascript/mastodon/features/compose/containers/sensitive_button_container.js
@@ -6,13 +6,20 @@ import { changeComposeSensitivity } from 'mastodon/actions/compose';
 import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';
 
 const messages = defineMessages({
-  marked: { id: 'compose_form.sensitive.marked', defaultMessage: 'Media is marked as sensitive' },
-  unmarked: { id: 'compose_form.sensitive.unmarked', defaultMessage: 'Media is not marked as sensitive' },
+  marked: {
+    id: 'compose_form.sensitive.marked',
+    defaultMessage: '{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}',
+  },
+  unmarked: {
+    id: 'compose_form.sensitive.unmarked',
+    defaultMessage: '{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}',
+  },
 });
 
 const mapStateToProps = state => ({
   active: state.getIn(['compose', 'sensitive']),
   disabled: state.getIn(['compose', 'spoiler']),
+  mediaCount: state.getIn(['compose', 'media_attachments']).size,
 });
 
 const mapDispatchToProps = dispatch => ({
@@ -28,16 +35,17 @@ class SensitiveButton extends React.PureComponent {
   static propTypes = {
     active: PropTypes.bool,
     disabled: PropTypes.bool,
+    mediaCount: PropTypes.number,
     onClick: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
   };
 
   render () {
-    const { active, disabled, onClick, intl } = this.props;
+    const { active, disabled, mediaCount, onClick, intl } = this.props;
 
     return (
       <div className='compose-form__sensitive-button'>
-        <label className={classNames('icon-button', { active })} title={intl.formatMessage(active ? messages.marked : messages.unmarked)}>
+        <label className={classNames('icon-button', { active })} title={intl.formatMessage(active ? messages.marked : messages.unmarked, { count: mediaCount })}>
           <input
             name='mark-sensitive'
             type='checkbox'
@@ -48,7 +56,11 @@ class SensitiveButton extends React.PureComponent {
 
           <span className={classNames('checkbox', { active })} />
 
-          <FormattedMessage id='compose_form.sensitive.hide' defaultMessage='Mark media as sensitive' />
+          <FormattedMessage
+            id='compose_form.sensitive.hide'
+            defaultMessage='{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}'
+            values={{ count: mediaCount }}
+          />
         </label>
       </div>
     );
diff --git a/app/javascript/mastodon/features/getting_started/components/announcements.js b/app/javascript/mastodon/features/getting_started/components/announcements.js
index 4853c3935..d53bd8055 100644
--- a/app/javascript/mastodon/features/getting_started/components/announcements.js
+++ b/app/javascript/mastodon/features/getting_started/components/announcements.js
@@ -437,7 +437,7 @@ class Announcements extends ImmutablePureComponent {
                 selected={index === idx}
                 disabled={disableSwiping}
               />
-            ))}
+            )).reverse()}
           </ReactSwipeableViews>
 
           {announcements.size > 1 && (
diff --git a/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js b/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js
index 766c9bb5b..6daf75814 100644
--- a/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js
+++ b/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.js
@@ -1,25 +1,42 @@
 import React from 'react';
 import Icon from 'mastodon/components/icon';
 import Button from 'mastodon/components/button';
-import { requestBrowserPermission } from 'mastodon/actions/notifications';
+import IconButton from 'mastodon/components/icon_button';
+import { requestBrowserPermission, dismissBrowserPermission } from 'mastodon/actions/notifications';
 import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
-import { FormattedMessage } from 'react-intl';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 
-export default @connect(() => {})
+const messages = defineMessages({
+  close: { id: 'lightbox.close', defaultMessage: 'Close' },
+});
+
+export default @connect()
+@injectIntl
 class NotificationsPermissionBanner extends React.PureComponent {
 
   static propTypes = {
     dispatch: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
   };
 
   handleClick = () => {
     this.props.dispatch(requestBrowserPermission());
   }
 
+  handleClose = () => {
+    this.props.dispatch(dismissBrowserPermission());
+  }
+
   render () {
+    const { intl } = this.props;
+
     return (
       <div className='notifications-permission-banner'>
+        <div className='notifications-permission-banner__close'>
+          <IconButton icon='times' onClick={this.handleClose} title={intl.formatMessage(messages.close)} />
+        </div>
+
         <h2><FormattedMessage id='notifications_permission_banner.title' defaultMessage='Never miss a thing' /></h2>
         <p><FormattedMessage id='notifications_permission_banner.how_to_control' defaultMessage="To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled." values={{ icon: <Icon id='sliders' /> }} /></p>
         <Button onClick={this.handleClick}><FormattedMessage id='notifications_permission_banner.enable' defaultMessage='Enable desktop notifications' /></Button>
diff --git a/app/javascript/mastodon/features/picture_in_picture/components/header.js b/app/javascript/mastodon/features/picture_in_picture/components/header.js
index 4cb6de1a4..7dd199b75 100644
--- a/app/javascript/mastodon/features/picture_in_picture/components/header.js
+++ b/app/javascript/mastodon/features/picture_in_picture/components/header.js
@@ -7,12 +7,18 @@ import IconButton from 'mastodon/components/icon_button';
 import { Link } from 'react-router-dom';
 import Avatar from 'mastodon/components/avatar';
 import DisplayName from 'mastodon/components/display_name';
+import { defineMessages, injectIntl } from 'react-intl';
+
+const messages = defineMessages({
+  close: { id: 'lightbox.close', defaultMessage: 'Close' },
+});
 
 const mapStateToProps = (state, { accountId }) => ({
   account: state.getIn(['accounts', accountId]),
 });
 
 export default @connect(mapStateToProps)
+@injectIntl
 class Header extends ImmutablePureComponent {
 
   static propTypes = {
@@ -20,10 +26,11 @@ class Header extends ImmutablePureComponent {
     statusId: PropTypes.string.isRequired,
     account: ImmutablePropTypes.map.isRequired,
     onClose: PropTypes.func.isRequired,
+    intl: PropTypes.object.isRequired,
   };
 
   render () {
-    const { account, statusId, onClose } = this.props;
+    const { account, statusId, onClose, intl } = this.props;
 
     return (
       <div className='picture-in-picture__header'>
@@ -32,7 +39,7 @@ class Header extends ImmutablePureComponent {
           <DisplayName account={account} />
         </Link>
 
-        <IconButton icon='times' onClick={onClose} title='Close' />
+        <IconButton icon='times' onClick={onClose} title={intl.formatMessage(messages.close)} />
       </div>
     );
   }
diff --git a/app/javascript/mastodon/features/ui/components/boost_modal.js b/app/javascript/mastodon/features/ui/components/boost_modal.js
index 00c0481f3..963bb5dc4 100644
--- a/app/javascript/mastodon/features/ui/components/boost_modal.js
+++ b/app/javascript/mastodon/features/ui/components/boost_modal.js
@@ -75,9 +75,10 @@ class BoostModal extends ImmutablePureComponent {
           <div className={classNames('status', `status-${status.get('visibility')}`, 'light')}>
             <div className='boost-modal__status-header'>
               <div className='boost-modal__status-time'>
-                <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'><RelativeTimestamp timestamp={status.get('created_at')} /></a>
+                <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener noreferrer'>
+                  <span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
+                  <RelativeTimestamp timestamp={status.get('created_at')} /></a>
               </div>
-              <span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span>
 
               <a onClick={this.handleAccountClick} href={status.getIn(['account', 'url'])} className='status__display-name'>
                 <div className='status__avatar'>
diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js
index ecc0b8f0b..36a84fcbf 100644
--- a/app/javascript/mastodon/features/ui/components/columns_area.js
+++ b/app/javascript/mastodon/features/ui/components/columns_area.js
@@ -31,7 +31,7 @@ import Icon from 'mastodon/components/icon';
 import ComposePanel from './compose_panel';
 import NavigationPanel from './navigation_panel';
 
-import detectPassiveEvents from 'detect-passive-events';
+import { supportsPassiveEvents } from 'detect-passive-events';
 import { scrollRight } from '../../../scroll';
 
 const componentMap = {
@@ -80,7 +80,7 @@ class ColumnsArea extends ImmutablePureComponent {
 
   componentDidMount() {
     if (!this.props.singleColumn) {
-      this.node.addEventListener('wheel', this.handleWheel,  detectPassiveEvents.hasSupport ? { passive: true } : false);
+      this.node.addEventListener('wheel', this.handleWheel, supportsPassiveEvents ? { passive: true } : false);
     }
 
     this.lastIndex   = getIndex(this.context.router.history.location.pathname);
@@ -97,7 +97,7 @@ class ColumnsArea extends ImmutablePureComponent {
 
   componentDidUpdate(prevProps) {
     if (this.props.singleColumn !== prevProps.singleColumn && !this.props.singleColumn) {
-      this.node.addEventListener('wheel', this.handleWheel,  detectPassiveEvents.hasSupport ? { passive: true } : false);
+      this.node.addEventListener('wheel', this.handleWheel, supportsPassiveEvents ? { passive: true } : false);
     }
     this.lastIndex = getIndex(this.context.router.history.location.pathname);
     this.setState({ shouldAnimate: true });
diff --git a/app/javascript/mastodon/features/ui/components/image_loader.js b/app/javascript/mastodon/features/ui/components/image_loader.js
index 5e1cf75af..c6f16a792 100644
--- a/app/javascript/mastodon/features/ui/components/image_loader.js
+++ b/app/javascript/mastodon/features/ui/components/image_loader.js
@@ -13,6 +13,7 @@ export default class ImageLoader extends React.PureComponent {
     width: PropTypes.number,
     height: PropTypes.number,
     onClick: PropTypes.func,
+    zoomButtonHidden: PropTypes.bool,
   }
 
   static defaultProps = {
@@ -151,6 +152,9 @@ export default class ImageLoader extends React.PureComponent {
             alt={alt}
             src={src}
             onClick={onClick}
+            width={width}
+            height={height}
+            zoomButtonHidden={this.props.zoomButtonHidden}
           />
         )}
       </div>
diff --git a/app/javascript/mastodon/features/ui/components/media_modal.js b/app/javascript/mastodon/features/ui/components/media_modal.js
index 54ec51fcf..d18f26b4e 100644
--- a/app/javascript/mastodon/features/ui/components/media_modal.js
+++ b/app/javascript/mastodon/features/ui/components/media_modal.js
@@ -38,23 +38,39 @@ class MediaModal extends ImmutablePureComponent {
   state = {
     index: null,
     navigationHidden: false,
+    zoomButtonHidden: false,
   };
 
   handleSwipe = (index) => {
     this.setState({ index: index % this.props.media.size });
   }
 
+  handleTransitionEnd = () => {
+    this.setState({
+      zoomButtonHidden: false,
+    });
+  }
+
   handleNextClick = () => {
-    this.setState({ index: (this.getIndex() + 1) % this.props.media.size });
+    this.setState({
+      index: (this.getIndex() + 1) % this.props.media.size,
+      zoomButtonHidden: true,
+    });
   }
 
   handlePrevClick = () => {
-    this.setState({ index: (this.props.media.size + this.getIndex() - 1) % this.props.media.size });
+    this.setState({
+      index: (this.props.media.size + this.getIndex() - 1) % this.props.media.size,
+      zoomButtonHidden: true,
+    });
   }
 
   handleChangeIndex = (e) => {
     const index = Number(e.currentTarget.getAttribute('data-index'));
-    this.setState({ index: index % this.props.media.size });
+    this.setState({
+      index: index % this.props.media.size,
+      zoomButtonHidden: true,
+    });
   }
 
   handleKeyDown = (e) => {
@@ -149,6 +165,7 @@ class MediaModal extends ImmutablePureComponent {
             alt={image.get('description')}
             key={image.get('url')}
             onClick={this.toggleNavigation}
+            zoomButtonHidden={this.state.zoomButtonHidden}
           />
         );
       } else if (image.get('type') === 'video') {
@@ -212,6 +229,7 @@ class MediaModal extends ImmutablePureComponent {
             style={swipeableViewsStyle}
             containerStyle={containerStyle}
             onChangeIndex={this.handleSwipe}
+            onTransitionEnd={this.handleTransitionEnd}
             index={index}
             disabled={disableSwiping}
           >
diff --git a/app/javascript/mastodon/features/ui/components/zoomable_image.js b/app/javascript/mastodon/features/ui/components/zoomable_image.js
index 3f6562bc9..1cf263cb9 100644
--- a/app/javascript/mastodon/features/ui/components/zoomable_image.js
+++ b/app/javascript/mastodon/features/ui/components/zoomable_image.js
@@ -1,8 +1,16 @@
 import React from 'react';
 import PropTypes from 'prop-types';
+import IconButton from 'mastodon/components/icon_button';
+import { defineMessages, injectIntl } from 'react-intl';
+
+const messages = defineMessages({
+  compress: { id: 'lightbox.compress', defaultMessage: 'Compress image view box' },
+  expand: { id: 'lightbox.expand', defaultMessage: 'Expand image view box' },
+});
 
 const MIN_SCALE = 1;
 const MAX_SCALE = 4;
+const NAV_BAR_HEIGHT = 66;
 
 const getMidpoint = (p1, p2) => ({
   x: (p1.clientX + p2.clientX) / 2,
@@ -14,7 +22,77 @@ const getDistance = (p1, p2) =>
 
 const clamp = (min, max, value) => Math.min(max, Math.max(min, value));
 
-export default class ZoomableImage extends React.PureComponent {
+// Normalizing mousewheel speed across browsers
+// copy from: https://github.com/facebookarchive/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js
+const normalizeWheel = event => {
+  // Reasonable defaults
+  const PIXEL_STEP = 10;
+  const LINE_HEIGHT = 40;
+  const PAGE_HEIGHT = 800;
+
+  let sX = 0,
+    sY = 0, // spinX, spinY
+    pX = 0,
+    pY = 0; // pixelX, pixelY
+
+  // Legacy
+  if ('detail' in event) {
+    sY = event.detail;
+  }
+  if ('wheelDelta' in event) {
+    sY = -event.wheelDelta / 120;
+  }
+  if ('wheelDeltaY' in event) {
+    sY = -event.wheelDeltaY / 120;
+  }
+  if ('wheelDeltaX' in event) {
+    sX = -event.wheelDeltaX / 120;
+  }
+
+  // side scrolling on FF with DOMMouseScroll
+  if ('axis' in event && event.axis === event.HORIZONTAL_AXIS) {
+    sX = sY;
+    sY = 0;
+  }
+
+  pX = sX * PIXEL_STEP;
+  pY = sY * PIXEL_STEP;
+
+  if ('deltaY' in event) {
+    pY = event.deltaY;
+  }
+  if ('deltaX' in event) {
+    pX = event.deltaX;
+  }
+
+  if ((pX || pY) && event.deltaMode) {
+    if (event.deltaMode === 1) { // delta in LINE units
+      pX *= LINE_HEIGHT;
+      pY *= LINE_HEIGHT;
+    } else { // delta in PAGE units
+      pX *= PAGE_HEIGHT;
+      pY *= PAGE_HEIGHT;
+    }
+  }
+
+  // Fall-back if spin cannot be determined
+  if (pX && !sX) {
+    sX = (pX < 1) ? -1 : 1;
+  }
+  if (pY && !sY) {
+    sY = (pY < 1) ? -1 : 1;
+  }
+
+  return {
+    spinX: sX,
+    spinY: sY,
+    pixelX: pX,
+    pixelY: pY,
+  };
+};
+
+export default @injectIntl
+class ZoomableImage extends React.PureComponent {
 
   static propTypes = {
     alt: PropTypes.string,
@@ -22,6 +100,8 @@ export default class ZoomableImage extends React.PureComponent {
     width: PropTypes.number,
     height: PropTypes.number,
     onClick: PropTypes.func,
+    zoomButtonHidden: PropTypes.bool,
+    intl: PropTypes.object.isRequired,
   }
 
   static defaultProps = {
@@ -32,6 +112,26 @@ export default class ZoomableImage extends React.PureComponent {
 
   state = {
     scale: MIN_SCALE,
+    zoomMatrix: {
+      type: null, // 'width' 'height'
+      fullScreen: null, // bool
+      rate: null, // full screen scale rate
+      clientWidth: null,
+      clientHeight: null,
+      offsetWidth: null,
+      offsetHeight: null,
+      clientHeightFixed: null,
+      scrollTop: null,
+      scrollLeft: null,
+      translateX: null,
+      translateY: null,
+    },
+    zoomState: 'expand', // 'expand' 'compress'
+    navigationHidden: false,
+    dragPosition: { top: 0, left: 0, x: 0, y: 0 },
+    dragged: false,
+    lockScroll: { x: 0, y: 0 },
+    lockTranslate: { x: 0, y: 0 },
   }
 
   removers = [];
@@ -49,17 +149,105 @@ export default class ZoomableImage extends React.PureComponent {
     // https://www.chromestatus.com/features/5093566007214080
     this.container.addEventListener('touchmove', handler, { passive: false });
     this.removers.push(() => this.container.removeEventListener('touchend', handler));
+
+    handler = this.mouseDownHandler;
+    this.container.addEventListener('mousedown', handler);
+    this.removers.push(() => this.container.removeEventListener('mousedown', handler));
+
+    handler = this.mouseWheelHandler;
+    this.container.addEventListener('wheel', handler);
+    this.removers.push(() => this.container.removeEventListener('wheel', handler));
+    // Old Chrome
+    this.container.addEventListener('mousewheel', handler);
+    this.removers.push(() => this.container.removeEventListener('mousewheel', handler));
+    // Old Firefox
+    this.container.addEventListener('DOMMouseScroll', handler);
+    this.removers.push(() => this.container.removeEventListener('DOMMouseScroll', handler));
+
+    this.initZoomMatrix();
   }
 
   componentWillUnmount () {
     this.removeEventListeners();
   }
 
+  componentDidUpdate () {
+    this.setState({ zoomState: this.state.scale >= this.state.zoomMatrix.rate ? 'compress' : 'expand' });
+
+    if (this.state.scale === MIN_SCALE) {
+      this.container.style.removeProperty('cursor');
+    }
+  }
+
+  UNSAFE_componentWillReceiveProps () {
+    // reset when slide to next image
+    if (this.props.zoomButtonHidden) {
+      this.setState({
+        scale: MIN_SCALE,
+        lockTranslate: { x: 0, y: 0 },
+      }, () => {
+        this.container.scrollLeft = 0;
+        this.container.scrollTop = 0;
+      });
+    }
+  }
+
   removeEventListeners () {
     this.removers.forEach(listeners => listeners());
     this.removers = [];
   }
 
+  mouseWheelHandler = e => {
+    e.preventDefault();
+
+    const event = normalizeWheel(e);
+
+    if (this.state.zoomMatrix.type === 'width') {
+      // full width, scroll vertical
+      this.container.scrollTop = Math.max(this.container.scrollTop + event.pixelY, this.state.lockScroll.y);
+    } else {
+      // full height, scroll horizontal
+      this.container.scrollLeft = Math.max(this.container.scrollLeft + event.pixelY, this.state.lockScroll.x);
+    }
+
+    // lock horizontal scroll
+    this.container.scrollLeft = Math.max(this.container.scrollLeft + event.pixelX, this.state.lockScroll.x);
+  }
+
+  mouseDownHandler = e => {
+    this.container.style.cursor = 'grabbing';
+    this.container.style.userSelect = 'none';
+
+    this.setState({ dragPosition: {
+      left: this.container.scrollLeft,
+      top: this.container.scrollTop,
+      // Get the current mouse position
+      x: e.clientX,
+      y: e.clientY,
+    } });
+
+    this.image.addEventListener('mousemove', this.mouseMoveHandler);
+    this.image.addEventListener('mouseup', this.mouseUpHandler);
+  }
+
+  mouseMoveHandler = e => {
+    const dx = e.clientX - this.state.dragPosition.x;
+    const dy = e.clientY - this.state.dragPosition.y;
+
+    this.container.scrollLeft = Math.max(this.state.dragPosition.left - dx, this.state.lockScroll.x);
+    this.container.scrollTop = Math.max(this.state.dragPosition.top - dy, this.state.lockScroll.y);
+
+    this.setState({ dragged: true });
+  }
+
+  mouseUpHandler = () => {
+    this.container.style.cursor = 'grab';
+    this.container.style.removeProperty('user-select');
+
+    this.image.removeEventListener('mousemove', this.mouseMoveHandler);
+    this.image.removeEventListener('mouseup', this.mouseUpHandler);
+  }
+
   handleTouchStart = e => {
     if (e.touches.length !== 2) return;
 
@@ -80,7 +268,8 @@ export default class ZoomableImage extends React.PureComponent {
 
     const distance = getDistance(...e.touches);
     const midpoint = getMidpoint(...e.touches);
-    const scale = clamp(MIN_SCALE, MAX_SCALE, this.state.scale * distance / this.lastDistance);
+    const _MAX_SCALE = Math.max(MAX_SCALE, this.state.zoomMatrix.rate);
+    const scale = clamp(MIN_SCALE, _MAX_SCALE, this.state.scale * distance / this.lastDistance);
 
     this.zoom(scale, midpoint);
 
@@ -89,7 +278,7 @@ export default class ZoomableImage extends React.PureComponent {
   }
 
   zoom(nextScale, midpoint) {
-    const { scale } = this.state;
+    const { scale, zoomMatrix } = this.state;
     const { scrollLeft, scrollTop } = this.container;
 
     // math memo:
@@ -104,14 +293,105 @@ export default class ZoomableImage extends React.PureComponent {
     this.setState({ scale: nextScale }, () => {
       this.container.scrollLeft = nextScrollLeft;
       this.container.scrollTop = nextScrollTop;
+      // reset the translateX/Y constantly
+      if (nextScale < zoomMatrix.rate) {
+        this.setState({
+          lockTranslate: {
+            x: zoomMatrix.fullScreen ? 0 : zoomMatrix.translateX * ((nextScale - MIN_SCALE) / (zoomMatrix.rate - MIN_SCALE)),
+            y: zoomMatrix.fullScreen ? 0 : zoomMatrix.translateY * ((nextScale - MIN_SCALE) / (zoomMatrix.rate - MIN_SCALE)),
+          },
+        });
+      }
     });
   }
 
   handleClick = e => {
     // don't propagate event to MediaModal
     e.stopPropagation();
+    const dragged = this.state.dragged;
+    this.setState({ dragged: false });
+    if (dragged) return;
     const handler = this.props.onClick;
     if (handler) handler();
+    this.setState({ navigationHidden: !this.state.navigationHidden });
+  }
+
+  handleMouseDown = e => {
+    e.preventDefault();
+  }
+
+  initZoomMatrix = () => {
+    const { width, height } = this.props;
+    const { clientWidth, clientHeight } = this.container;
+    const { offsetWidth, offsetHeight } = this.image;
+    const clientHeightFixed = clientHeight - NAV_BAR_HEIGHT;
+
+    const type = width / height < clientWidth / clientHeightFixed ? 'width' : 'height';
+    const fullScreen = type === 'width' ?  width > clientWidth : height > clientHeightFixed;
+    const rate = type === 'width' ? Math.min(clientWidth, width) / offsetWidth : Math.min(clientHeightFixed, height) / offsetHeight;
+    const scrollTop = type === 'width' ?  (clientHeight - offsetHeight) / 2 - NAV_BAR_HEIGHT : (clientHeightFixed - offsetHeight) / 2;
+    const scrollLeft = (clientWidth - offsetWidth) / 2;
+    const translateX = type === 'width' ? (width - offsetWidth) / (2 * rate) : 0;
+    const translateY = type === 'height' ? (height - offsetHeight) / (2 * rate) : 0;
+
+    this.setState({
+      zoomMatrix: {
+        type: type,
+        fullScreen: fullScreen,
+        rate: rate,
+        clientWidth: clientWidth,
+        clientHeight: clientHeight,
+        offsetWidth: offsetWidth,
+        offsetHeight: offsetHeight,
+        clientHeightFixed: clientHeightFixed,
+        scrollTop: scrollTop,
+        scrollLeft: scrollLeft,
+        translateX: translateX,
+        translateY: translateY,
+      },
+    });
+  }
+
+  handleZoomClick = e => {
+    e.preventDefault();
+    e.stopPropagation();
+
+    const { scale, zoomMatrix } = this.state;
+
+    if ( scale >= zoomMatrix.rate ) {
+      this.setState({
+        scale: MIN_SCALE,
+        lockScroll: {
+          x: 0,
+          y: 0,
+        },
+        lockTranslate: {
+          x: 0,
+          y: 0,
+        },
+      }, () => {
+        this.container.scrollLeft = 0;
+        this.container.scrollTop = 0;
+      });
+    } else {
+      this.setState({
+        scale: zoomMatrix.rate,
+        lockScroll: {
+          x: zoomMatrix.scrollLeft,
+          y: zoomMatrix.scrollTop,
+        },
+        lockTranslate: {
+          x: zoomMatrix.fullScreen ? 0 : zoomMatrix.translateX,
+          y: zoomMatrix.fullScreen ? 0 : zoomMatrix.translateY,
+        },
+      }, () => {
+        this.container.scrollLeft = zoomMatrix.scrollLeft;
+        this.container.scrollTop = zoomMatrix.scrollTop;
+      });
+    }
+
+    this.container.style.cursor = 'grab';
+    this.container.style.removeProperty('user-select');
   }
 
   setContainerRef = c => {
@@ -123,29 +403,47 @@ export default class ZoomableImage extends React.PureComponent {
   }
 
   render () {
-    const { alt, src } = this.props;
-    const { scale } = this.state;
-    const overflow = scale === 1 ? 'hidden' : 'scroll';
+    const { alt, src, width, height, intl } = this.props;
+    const { scale, lockTranslate } = this.state;
+    const overflow = scale === MIN_SCALE ? 'hidden' : 'scroll';
+    const zoomButtonShouldHide = this.state.navigationHidden || this.props.zoomButtonHidden || this.state.zoomMatrix.rate <= MIN_SCALE ? 'media-modal__zoom-button--hidden' : '';
+    const zoomButtonTitle = this.state.zoomState === 'compress' ? intl.formatMessage(messages.compress) : intl.formatMessage(messages.expand);
 
     return (
-      <div
-        className='zoomable-image'
-        ref={this.setContainerRef}
-        style={{ overflow }}
-      >
-        <img
-          role='presentation'
-          ref={this.setImageRef}
-          alt={alt}
-          title={alt}
-          src={src}
+      <React.Fragment>
+        <IconButton
+          className={`media-modal__zoom-button ${zoomButtonShouldHide}`}
+          title={zoomButtonTitle}
+          icon={this.state.zoomState}
+          onClick={this.handleZoomClick}
+          size={40}
           style={{
-            transform: `scale(${scale})`,
-            transformOrigin: '0 0',
+            fontSize: '30px', /* Fontawesome's fa-compress fa-expand is larger than fa-close */
           }}
-          onClick={this.handleClick}
         />
-      </div>
+        <div
+          className='zoomable-image'
+          ref={this.setContainerRef}
+          style={{ overflow }}
+        >
+          <img
+            role='presentation'
+            ref={this.setImageRef}
+            alt={alt}
+            title={alt}
+            src={src}
+            width={width}
+            height={height}
+            style={{
+              transform: `scale(${scale}) translate(-${lockTranslate.x}px, -${lockTranslate.y}px)`,
+              transformOrigin: '0 0',
+            }}
+            draggable={false}
+            onClick={this.handleClick}
+            onMouseDown={this.handleMouseDown}
+          />
+        </div>
+      </React.Fragment>
     );
   }
 
diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js
index 54c3baf76..229a92140 100644
--- a/app/javascript/mastodon/features/video/index.js
+++ b/app/javascript/mastodon/features/video/index.js
@@ -198,7 +198,7 @@ class Video extends React.PureComponent {
   handleTimeUpdate = () => {
     this.setState({
       currentTime: this.video.currentTime,
-      duration: Math.floor(this.video.duration),
+      duration:this.video.duration,
     });
   }
 
@@ -534,8 +534,8 @@ class Video extends React.PureComponent {
 
           <div className='video-player__buttons-bar'>
             <div className='video-player__buttons left'>
-              <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} onClick={this.togglePlay} autoFocus={detailed}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
-              <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
+              <button type='button' title={intl.formatMessage(paused ? messages.play : messages.pause)} aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} className='player-button' onClick={this.togglePlay} autoFocus={detailed}><Icon id={paused ? 'play' : 'pause'} fixedWidth /></button>
+              <button type='button' title={intl.formatMessage(muted ? messages.unmute : messages.mute)} aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} className='player-button' onClick={this.toggleMute}><Icon id={muted ? 'volume-off' : 'volume-up'} fixedWidth /></button>
 
               <div className={classNames('video-player__volume', { active: this.state.hovered })} onMouseDown={this.handleVolumeMouseDown} ref={this.setVolumeRef}>
                 <div className='video-player__volume__current' style={{ width: `${volume * 100}%` }} />
@@ -551,7 +551,7 @@ class Video extends React.PureComponent {
                 <span className='video-player__time'>
                   <span className='video-player__time-current'>{formatTime(Math.floor(currentTime))}</span>
                   <span className='video-player__time-sep'>/</span>
-                  <span className='video-player__time-total'>{formatTime(duration)}</span>
+                  <span className='video-player__time-total'>{formatTime(Math.floor(duration))}</span>
                 </span>
               )}
 
@@ -559,10 +559,10 @@ class Video extends React.PureComponent {
             </div>
 
             <div className='video-player__buttons right'>
-              {(!onCloseVideo && !editable && !fullscreen && !this.props.alwaysVisible) && <button type='button' title={intl.formatMessage(messages.hide)} aria-label={intl.formatMessage(messages.hide)} onClick={this.toggleReveal}><Icon id='eye-slash' fixedWidth /></button>}
-              {(!fullscreen && onOpenVideo) && <button type='button' title={intl.formatMessage(messages.expand)} aria-label={intl.formatMessage(messages.expand)} onClick={this.handleOpenVideo}><Icon id='expand' fixedWidth /></button>}
-              {onCloseVideo && <button type='button' title={intl.formatMessage(messages.close)} aria-label={intl.formatMessage(messages.close)} onClick={this.handleCloseVideo}><Icon id='compress' fixedWidth /></button>}
-              <button type='button' title={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} aria-label={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} onClick={this.toggleFullscreen}><Icon id={fullscreen ? 'compress' : 'arrows-alt'} fixedWidth /></button>
+              {(!onCloseVideo && !editable && !fullscreen && !this.props.alwaysVisible) && <button type='button' title={intl.formatMessage(messages.hide)} aria-label={intl.formatMessage(messages.hide)} className='player-button' onClick={this.toggleReveal}><Icon id='eye-slash' fixedWidth /></button>}
+              {(!fullscreen && onOpenVideo) && <button type='button' title={intl.formatMessage(messages.expand)} aria-label={intl.formatMessage(messages.expand)} className='player-button' onClick={this.handleOpenVideo}><Icon id='expand' fixedWidth /></button>}
+              {onCloseVideo && <button type='button' title={intl.formatMessage(messages.close)} aria-label={intl.formatMessage(messages.close)} className='player-button' onClick={this.handleCloseVideo}><Icon id='compress' fixedWidth /></button>}
+              <button type='button' title={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} aria-label={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} className='player-button' onClick={this.toggleFullscreen}><Icon id={fullscreen ? 'compress' : 'arrows-alt'} fixedWidth /></button>
             </div>
           </div>
         </div>
diff --git a/app/javascript/mastodon/is_mobile.js b/app/javascript/mastodon/is_mobile.js
index f96df1ebb..5a8c3db08 100644
--- a/app/javascript/mastodon/is_mobile.js
+++ b/app/javascript/mastodon/is_mobile.js
@@ -1,4 +1,4 @@
-import detectPassiveEvents from 'detect-passive-events';
+import { supportsPassiveEvents } from 'detect-passive-events';
 
 const LAYOUT_BREAKPOINT = 630;
 
@@ -9,7 +9,7 @@ export function isMobile(width) {
 const iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
 
 let userTouching = false;
-let listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;
+let listenerOptions = supportsPassiveEvents ? { passive: true } : false;
 
 function touchListener() {
   userTouching = true;
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 548471edf..8f0e04561 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "تصفح المزيد على الملف التعريفي الأصلي",
   "account.cancel_follow_request": "إلغاء طلب المتابَعة",
   "account.direct": "رسالة خاصة إلى @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "النطاق مخفي",
   "account.edit_profile": "تعديل الملف الشخصي",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "أوصِ به على صفحتك",
   "account.follow": "تابِع",
   "account.followers": "مُتابِعون",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "لم تتلق أي إشعار بعدُ. تفاعل مع المستخدمين الآخرين لإنشاء محادثة.",
   "empty_column.public": "لا يوجد أي شيء هنا! قم بنشر شيء ما للعامة، أو اتبع المستخدمين الآخرين المتواجدين على الخوادم الأخرى لملء خيط المحادثات",
   "error.unexpected_crash.explanation": "نظرا لوجود خطأ في التعليمات البرمجية أو مشكلة توافق مع المتصفّح، تعذر عرض هذه الصفحة بشكل صحيح.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "حاول إعادة إنعاش الصفحة. إن لم تُحلّ المشكلة ، يمكنك دائمًا استخدام ماستدون عبر متصفّح آخر أو تطبيق أصلي.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "انسخ تتبع الارتباطات إلى الحافظة",
   "errors.unexpected_crash.report_issue": "الإبلاغ عن خلل",
   "follow_request.authorize": "ترخيص",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "لإلغاء التركيز على حقل النص أو نافذة البحث",
   "keyboard_shortcuts.up": "للانتقال إلى أعلى القائمة",
   "lightbox.close": "إغلاق",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "التالي",
   "lightbox.previous": "العودة",
   "lightbox.view_context": "اعرض السياق",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "تعديل العنوان",
   "lists.new.create": "إنشاء قائمة",
   "lists.new.title_placeholder": "عنوان القائمة الجديدة",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "إبحث في قائمة الحسابات التي تُتابِعها",
   "lists.subheading": "قوائمك",
   "load_pending": "{count, plural, one {# عنصر جديد} other {# عناصر جديدة}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "عرض / إخفاء",
   "missing_indicator.label": "غير موجود",
   "missing_indicator.sublabel": "تعذر العثور على هذا المورد",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "هل تود إخفاء الإخطارات القادمة من هذا المستخدم ؟",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "تطبيقات الأجهزة المحمولة",
   "navigation_bar.blocks": "الحسابات المحجوبة",
   "navigation_bar.bookmarks": "الفواصل المرجعية",
@@ -298,6 +310,7 @@
   "notification.own_poll": "انتهى استطلاعك للرأي",
   "notification.poll": "لقد إنتها تصويت شاركت فيه",
   "notification.reblog": "{name} قام بترقية تبويقك",
+  "notification.status": "{name} just posted",
   "notifications.clear": "امسح الإخطارات",
   "notifications.clear_confirmation": "أمتأكد من أنك تود مسح جل الإخطارات الخاصة بك و المتلقاة إلى حد الآن ؟",
   "notifications.column_settings.alert": "إشعارات سطح المكتب",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "الترقيّات:",
   "notifications.column_settings.show": "اعرِضها في عمود",
   "notifications.column_settings.sound": "أصدر صوتا",
+  "notifications.column_settings.status": "تبويقات جديدة:",
   "notifications.filter.all": "الكل",
   "notifications.filter.boosts": "الترقيات",
   "notifications.filter.favourites": "المفضلة",
   "notifications.filter.follows": "يتابِع",
   "notifications.filter.mentions": "الإشارات",
   "notifications.filter.polls": "نتائج استطلاع الرأي",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} إشعارات",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "انتهى",
   "poll.refresh": "تحديث",
   "poll.total_people": "{count, plural, one {# شخص} two {# شخصين} few {# أشخاص} many {# أشخاص} other {# أشخاص}}",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}  مليون",
   "units.short.thousand": "{count}  ألف",
   "upload_area.title": "اسحب ثم أفلت للرفع",
-  "upload_button.label": "إضافة وسائط ({formats})",
+  "upload_button.label": "إضافة وسائط",
   "upload_error.limit": "لقد تم بلوغ الحد الأقصى المسموح به لإرسال الملفات.",
   "upload_error.poll": "لا يمكن إدراج ملفات في استطلاعات الرأي.",
   "upload_form.audio_description": "وصف للأشخاص ذي قِصر السمع",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "اكتشف النص مِن الصورة",
   "upload_modal.edit_media": "تعديل الوسائط",
   "upload_modal.hint": "اضغط أو اسحب الدائرة على خانة المعاينة لاختيار نقطة التركيز التي ستُعرَض دائمًا على كل المصغرات.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "معاينة ({ratio})",
   "upload_progress.label": "يرفع...",
   "video.close": "إغلاق الفيديو",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 6c6232262..e0b67d6bb 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Encaboxar la solicitú de siguimientu",
   "account.direct": "Unviar un mensaxe direutu a @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Dominiu anubríu",
   "account.edit_profile": "Editar el perfil",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Destacar nel perfil",
   "account.follow": "Siguir",
   "account.followers": "Siguidores",
@@ -96,9 +98,9 @@
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
   "compose_form.publish": "Barritar",
   "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.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "El testu nun va anubrise darrera d'una alvertencia",
   "compose_form.spoiler.unmarked": "El testu nun va anubrise",
   "compose_form.spoiler_placeholder": "Escribi equí l'alvertencia",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Entá nun tienes nunengú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.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Autorizar",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "pa desenfocar l'área de composición/gueta",
   "keyboard_shortcuts.up": "pa xubir na llista",
   "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Siguiente",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "Títulu nuevu de la llista",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Guetar ente la xente que sigues",
   "lists.subheading": "Les tos llistes",
   "load_pending": "{count, plural, one {# elementu nuevu} other {# elementos nuevos}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Alternar la visibilidá",
   "missing_indicator.label": "Nun s'alcontró",
   "missing_indicator.sublabel": "Esti recursu nun pudo alcontrase",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "¿Anubrir los avisos d'esti usuariu?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Aplicaciones pa móviles",
   "navigation_bar.blocks": "Usuarios bloquiaos",
   "navigation_bar.bookmarks": "Marcadores",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "Finó una encuesta na que votesti",
   "notification.reblog": "{name} compartió'l to estáu",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Llimpiar avisos",
   "notifications.clear_confirmation": "¿De xuru que quies llimpiar dafechu tolos avisos?",
   "notifications.column_settings.alert": "Avisos d'escritoriu",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Barritos compartíos:",
   "notifications.column_settings.show": "Amosar en columna",
   "notifications.column_settings.sound": "Reproducir un soníu",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Too",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Menciones",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} avisos",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Acabó",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# persona} other {# persones}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Deteutar el testu de la semeya",
   "upload_modal.edit_media": "Edición",
   "upload_modal.hint": "Calca o arrastra'l círculu de la previsualización pa escoyer el puntu d'enfoque que va amosase siempres en toles miniatures.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Previsualización ({ratio})",
   "upload_progress.label": "Xubiendo…",
   "video.close": "Zarrar el videu",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index 42c8997b7..3ffa07a71 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Откажи искането за следване",
   "account.direct": "Direct Message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Скрит домейн",
   "account.edit_profile": "Редактирай профила си",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Характеристика на профила",
   "account.follow": "Последвай",
   "account.followers": "Последователи",
@@ -96,9 +98,9 @@
   "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.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Content warning",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
   "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Authorize",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Затвори",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} сподели твоята публикация",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Десктоп известия",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Споделяния:",
   "notifications.column_settings.show": "Покажи в колона",
   "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploading…",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index 7de1a1022..056a3d424 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -1,22 +1,24 @@
 {
-  "account.account_note_header": "Note",
+  "account.account_note_header": "নোট",
   "account.add_or_remove_from_list": "তালিকাতে যুক্ত বা অপসারণ করুন",
   "account.badges.bot": "বট",
-  "account.badges.group": "Group",
+  "account.badges.group": "গ্রুপ",
   "account.block": "@{name} কে ব্লক করুন",
   "account.block_domain": "{domain} থেকে সব আড়াল করুন",
   "account.blocked": "অবরুদ্ধ",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "মূল প্রোফাইলটিতে আরও ব্রাউজ করুন",
   "account.cancel_follow_request": "অনুসরণ অনুরোধ বাতিল করুন",
   "account.direct": "@{name} কে সরাসরি বার্তা",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "ডোমেন গোপন করুন",
   "account.edit_profile": "প্রোফাইল পরিবর্তন করুন",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "নিজের পাতায় দেখান",
   "account.follow": "অনুসরণ করুন",
   "account.followers": "অনুসরণকারী",
   "account.followers.empty": "এই সদস্যকে এখনো কেউ অনুসরণ করে না।.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural,one {{counter} জন অনুসরণকারী } other {{counter} জন অনুসরণকারী}}",
+  "account.following_counter": "{count, plural,one {{counter} জনকে অনুসরণ} other {{counter} জনকে অনুসরণ}}",
   "account.follows.empty": "এই সদস্য কাওকে এখনো অনুসরণ করেন না.",
   "account.follows_you": "আপনাকে অনুসরণ করে",
   "account.hide_reblogs": "@{name}'র সমর্থনগুলি লুকিয়ে ফেলুন",
@@ -36,19 +38,19 @@
   "account.requested": "অনুমতির অপেক্ষা। অনুসরণ করার অনুরোধ বাতিল করতে এখানে ক্লিক করুন",
   "account.share": "@{name} র প্রোফাইল অন্যদের দেখান",
   "account.show_reblogs": "@{name} র সমর্থনগুলো দেখান",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural,one {{counter} টুট} other {{counter} টুট}}",
   "account.unblock": "@{name} র কার্যকলাপ দেখুন",
   "account.unblock_domain": "{domain} কে আবার দেখুন",
   "account.unendorse": "আপনার নিজের পাতায় এটা দেখবেন না",
   "account.unfollow": "অনুসরণ না করতে",
   "account.unmute": "@{name} র কার্যকলাপ আবার দেখুন",
   "account.unmute_notifications": "@{name} র প্রজ্ঞাপন দেখুন",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "নোট যোগ করতে ক্লিক করুন",
   "alert.rate_limited.message": "{retry_time, time, medium} -এর পরে আবার প্রচেষ্টা করুন।",
   "alert.rate_limited.title": "হার সীমিত",
   "alert.unexpected.message": "সমস্যা অপ্রত্যাশিত.",
   "alert.unexpected.title": "ওহো!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "ঘোষণা",
   "autosuggest_hashtag.per_week": "প্রতি সপ্তাহে {count}",
   "boost_modal.combo": "পরেরবার আপনি {combo} টিপলে এটি আর আসবে না",
   "bundle_column_error.body": "এই অংশটি দেখতে যেয়ে কোনো সমস্যা হয়েছে।.",
@@ -58,7 +60,7 @@
   "bundle_modal_error.message": "এই অংশটি দেখাতে যেয়ে কোনো সমস্যা হয়েছে।.",
   "bundle_modal_error.retry": "আবার চেষ্টা করুন",
   "column.blocks": "যাদের ব্লক করা হয়েছে",
-  "column.bookmarks": "Bookmarks",
+  "column.bookmarks": "বুকমার্ক",
   "column.community": "স্থানীয় সময়সারি",
   "column.direct": "সরাসরি লেখা",
   "column.directory": "প্রোফাইল ব্রাউজ করুন",
@@ -79,9 +81,9 @@
   "column_header.show_settings": "সেটিং দেখান",
   "column_header.unpin": "পিন খুলুন",
   "column_subheading.settings": "সেটিং",
-  "community.column_settings.local_only": "Local only",
+  "community.column_settings.local_only": "শুধুমাত্র স্থানীয়",
   "community.column_settings.media_only": "শুধুমাত্র ছবি বা ভিডিও",
-  "community.column_settings.remote_only": "Remote only",
+  "community.column_settings.remote_only": "শুধুমাত্র দূরবর্তী",
   "compose_form.direct_message_warning": "শুধুমাত্র যাদেরকে উল্লেখ করা হয়েছে তাদেরকেই এই টুটটি পাঠানো হবে ।",
   "compose_form.direct_message_warning_learn_more": "আরো জানুন",
   "compose_form.hashtag_warning": "কোনো হ্যাশট্যাগের ভেতরে এই টুটটি থাকবেনা কারণ এটি তালিকাবহির্ভূত। শুধুমাত্র প্রকাশ্য ঠোটগুলো হ্যাশট্যাগের ভেতরে খুঁজে পাওয়া যাবে।",
@@ -92,8 +94,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.poll.switch_to_multiple": "একাধিক পছন্দ অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
+  "compose_form.poll.switch_to_single": "একটি একক পছন্দের অনুমতি দেওয়ার জন্য পোল পরিবর্তন করুন",
   "compose_form.publish": "টুট",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "এই ছবি বা ভিডিওটি সংবেদনশীল হিসেবে চিহ্নিত করতে",
@@ -150,7 +152,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.bookmarked_statuses": "আপনার কাছে এখনও কোনও বুকমার্কড টুট নেই। আপনি যখন একটি বুকমার্ক করেন, এটি এখানে প্রদর্শিত হবে।",
   "empty_column.community": "স্থানীয় সময়রেখাতে কিছু নেই। প্রকাশ্যভাবে কিছু লিখে লেখালেখির উদ্বোধন করে ফেলুন!",
   "empty_column.direct": "আপনার কাছে সরাসরি পাঠানো কোনো লেখা নেই। যদি কেও পাঠায়, সেটা এখানে দেখা যাবে।",
   "empty_column.domain_blocks": "এখনও কোনও লুকানো ডোমেন নেই।",
@@ -166,13 +168,15 @@
   "empty_column.notifications": "আপনার এখনো কোনো প্রজ্ঞাপন নেই। কথোপকথন শুরু করতে,  অন্যদের সাথে মেলামেশা করতে পারেন।",
   "empty_column.public": "এখানে এখনো কিছু নেই! প্রকাশ্য ভাবে কিছু লিখুন বা অন্য সার্ভার থেকে কাওকে অনুসরণ করে এই জায়গা ভরে ফেলুন",
   "error.unexpected_crash.explanation": "আমাদের কোড বা ব্রাউজারের সামঞ্জস্য ইস্যুতে একটি বাগের কারণে এই পৃষ্ঠাটি সঠিকভাবে প্রদর্শিত করা যায় নি।",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "পাতাটি রিফ্রেশ করে চেষ্টা করুন। তবুও যদি না হয়, তবে আপনি অন্য একটি ব্রাউজার অথবা আপনার ডিভাইসের জন্যে এপের মাধ্যমে মাস্টডন ব্যাবহার করতে পারবেন।.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "স্টেকট্রেস ক্লিপবোর্ডে কপি করুন",
   "errors.unexpected_crash.report_issue": "সমস্যার প্রতিবেদন করুন",
   "follow_request.authorize": "অনুমতি দিন",
   "follow_request.reject": "প্রত্যাখ্যান করুন",
-  "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
-  "generic.saved": "Saved",
+  "follow_requests.unlocked_explanation": "আপনার অ্যাকাউন্টটি লক না থাকলেও, {domain} কর্মীরা ভেবেছিলেন যে আপনি এই অ্যাকাউন্টগুলি থেকে ম্যানুয়ালি অনুসরণের অনুরোধগুলি পর্যালোচনা করতে চাইতে পারেন।",
+  "generic.saved": "সংরক্ষণ হয়েছে",
   "getting_started.developers": "তৈরিকারকদের জন্য",
   "getting_started.directory": "নিজস্ব-পাতাগুলির তালিকা",
   "getting_started.documentation": "নথিপত্র",
@@ -193,8 +197,8 @@
   "home.column_settings.basic": "সাধারণ",
   "home.column_settings.show_reblogs": "সমর্থনগুলো দেখান",
   "home.column_settings.show_replies": "মতামত দেখান",
-  "home.hide_announcements": "Hide announcements",
-  "home.show_announcements": "Show announcements",
+  "home.hide_announcements": "ঘোষণা লুকান",
+  "home.show_announcements": "ঘোষণা দেখান",
   "intervals.full.days": "{number, plural, one {# day} other {# days}}",
   "intervals.full.hours": "{number, plural, one {# ঘটা} other {# ঘটা}}",
   "intervals.full.minutes": "{number, plural, one {# মিনিট} other {# মিনিট}}",
@@ -236,13 +240,13 @@
   "keyboard_shortcuts.muted": "বন্ধ করা ব্যবহারকারীদের তালিকা খুলতে",
   "keyboard_shortcuts.my_profile": "আপনার নিজের পাতা দেখতে",
   "keyboard_shortcuts.notifications": "প্রজ্ঞাপনের কলাম খুলতে",
-  "keyboard_shortcuts.open_media": "to open media",
+  "keyboard_shortcuts.open_media": "মিডিয়া খলার জন্য",
   "keyboard_shortcuts.pinned": "পিন দেওয়া টুটের তালিকা খুলতে",
   "keyboard_shortcuts.profile": "লেখকের পাতা দেখতে",
   "keyboard_shortcuts.reply": "মতামত দিতে",
   "keyboard_shortcuts.requests": "অনুসরণ অনুরোধের তালিকা দেখতে",
   "keyboard_shortcuts.search": "খোঁজার অংশে ফোকাস করতে",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.spoilers": "CW ক্ষেত্র দেখাবার/লুকবার জন্য",
   "keyboard_shortcuts.start": "\"প্রথম শুরুর\" কলাম বের করতে",
   "keyboard_shortcuts.toggle_hidden": "CW লেখা দেখতে বা লুকাতে",
   "keyboard_shortcuts.toggle_sensitivity": "ভিডিও/ছবি দেখতে বা বন্ধ করতে",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "লেখা বা খোঁজার জায়গায় ফোকাস না করতে",
   "keyboard_shortcuts.up": "তালিকার উপরের দিকে যেতে",
   "lightbox.close": "বন্ধ",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "পরবর্তী",
   "lightbox.previous": "পূর্ববর্তী",
   "lightbox.view_context": "প্রসঙ্গটি দেখতে",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "শিরোনাম সম্পাদনা করতে",
   "lists.new.create": "তালিকাতে যুক্ত করতে",
   "lists.new.title_placeholder": "তালিকার নতুন শিরোনাম দিতে",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "যাদের অনুসরণ করেন তাদের ভেতরে খুঁজুন",
   "lists.subheading": "আপনার তালিকা",
   "load_pending": "{count, plural, one {# নতুন জিনিস} other {# নতুন জিনিস}}",
@@ -267,10 +277,12 @@
   "media_gallery.toggle_visible": "দৃশ্যতার অবস্থা বদলান",
   "missing_indicator.label": "খুঁজে পাওয়া যায়নি",
   "missing_indicator.sublabel": "জিনিসটা খুঁজে পাওয়া যায়নি",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "এই ব্যবহারকারীর প্রজ্ঞাপন বন্ধ করবেন ?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "মোবাইলের আপ্প",
   "navigation_bar.blocks": "বন্ধ করা ব্যবহারকারী",
-  "navigation_bar.bookmarks": "Bookmarks",
+  "navigation_bar.bookmarks": "বুকমার্ক",
   "navigation_bar.community_timeline": "স্থানীয় সময়রেখা",
   "navigation_bar.compose": "নতুন টুট লিখুন",
   "navigation_bar.direct": "সরাসরি লেখাগুলি",
@@ -293,11 +305,12 @@
   "navigation_bar.security": "নিরাপত্তা",
   "notification.favourite": "{name} আপনার কার্যক্রম পছন্দ করেছেন",
   "notification.follow": "{name} আপনাকে অনুসরণ করেছেন",
-  "notification.follow_request": "{name} has requested to follow you",
+  "notification.follow_request": "{name} আপনাকে অনুসরণ করার জন্য অনুরধ করেছে",
   "notification.mention": "{name} আপনাকে উল্লেখ করেছেন",
   "notification.own_poll": "আপনার পোল শেষ হয়েছে",
   "notification.poll": "আপনি ভোট দিয়েছিলেন এমন এক  নির্বাচনের ভোটের সময় শেষ হয়েছে",
   "notification.reblog": "{name} আপনার কার্যক্রমে সমর্থন দেখিয়েছেন",
+  "notification.status": "{name} just posted",
   "notifications.clear": "প্রজ্ঞাপনগুলো মুছে ফেলতে",
   "notifications.clear_confirmation": "আপনি কি নির্চিত প্রজ্ঞাপনগুলো মুছে ফেলতে চান ?",
   "notifications.column_settings.alert": "কম্পিউটারে প্রজ্ঞাপনগুলি",
@@ -306,20 +319,29 @@
   "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.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.column_settings.status": "New toots:",
   "notifications.filter.all": "সব",
   "notifications.filter.boosts": "সমর্থনগুলো",
   "notifications.filter.favourites": "পছন্দের গুলো",
   "notifications.filter.follows": "অনুসরণের",
   "notifications.filter.mentions": "উল্লেখিত",
   "notifications.filter.polls": "নির্বাচনের ফলাফল",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} প্রজ্ঞাপন",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "বন্ধ",
   "poll.refresh": "বদলেছে কিনা দেখতে",
   "poll.total_people": "{count, plural, one {# ব্যক্তি} other {# ব্যক্তি}}",
@@ -345,7 +367,7 @@
   "relative_time.just_now": "এখন",
   "relative_time.minutes": "{number}মিঃ",
   "relative_time.seconds": "{number} সেকেন্ড",
-  "relative_time.today": "today",
+  "relative_time.today": "আজ",
   "reply_indicator.cancel": "বাতিল করতে",
   "report.forward": "এটা আরো পাঠান {target} তে",
   "report.forward_hint": "এই নিবন্ধনটি অন্য একটি সার্ভারে। অপ্রকাশিতনামাভাবে রিপোর্টের কপি সেখানেও কি পাঠাতে চান ?",
@@ -368,7 +390,7 @@
   "status.admin_account": "@{name} র জন্য পরিচালনার ইন্টারফেসে ঢুকুন",
   "status.admin_status": "যায় লেখাটি পরিচালনার ইন্টারফেসে খুলুন",
   "status.block": "@{name} কে ব্লক করুন",
-  "status.bookmark": "Bookmark",
+  "status.bookmark": "বুকমার্ক",
   "status.cancel_reblog_private": "সমর্থন বাতিল করতে",
   "status.cannot_reblog": "এটিতে সমর্থন দেওয়া যাবেনা",
   "status.copy": "লেখাটির লিংক কপি করতে",
@@ -393,7 +415,7 @@
   "status.reblogged_by": "{name} সমর্থন দিয়েছে",
   "status.reblogs.empty": "এখনো কেও এটাতে সমর্থন দেয়নি। যখন কেও দেয়, সেটা তখন এখানে দেখা যাবে।",
   "status.redraft": "মুছে আবার নতুন করে লিখতে",
-  "status.remove_bookmark": "Remove bookmark",
+  "status.remove_bookmark": "বুকমার্ক সরান",
   "status.reply": "মতামত জানাতে",
   "status.replyAll": "লেখাযুক্ত সবার কাছে মতামত জানাতে",
   "status.report": "@{name} কে রিপোর্ট করতে",
@@ -419,33 +441,34 @@
   "time_remaining.minutes": "{number, plural, one {# মিনিট} other {# মিনিট}} বাকি আছে",
   "time_remaining.moments": "সময় বাকি আছে",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} বাকি আছে",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "timeline_hint.remote_resource_not_displayed": "অন্য সার্ভারগুলি থেকে {resource} দেখাচ্ছে না। ",
+  "timeline_hint.resources.followers": "অনুসরকারীরা",
+  "timeline_hint.resources.follows": "অনুসরণ করে",
+  "timeline_hint.resources.statuses": "পুরনো টুটগুলি",
+  "trends.counter_by_accounts": "{count, plural,one {{counter} জন ব্যক্তি} other {{counter} জন লোক}} কথা বলছে",
   "trends.trending_now": "বর্তমানে জনপ্রিয়",
   "ui.beforeunload": "যে পর্যন্ত এটা লেখা হয়েছে, মাস্টাডন থেকে চলে গেলে এটা মুছে যাবে।",
-  "units.short.billion": "{count}B",
-  "units.short.million": "{count}M",
-  "units.short.thousand": "{count}K",
+  "units.short.billion": "{count}বিলিয়ন",
+  "units.short.million": "{count}মিলিওন",
+  "units.short.thousand": "{count}হাজার",
   "upload_area.title": "টেনে এখানে ছেড়ে দিলে এখানে যুক্ত করা যাবে",
   "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.audio_description": "শ্রবণশক্তি লোকদের জন্য বর্ণনা করুন",
   "upload_form.description": "যারা দেখতে পায়না তাদের জন্য এটা বর্ণনা করতে",
   "upload_form.edit": "সম্পাদন",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "থাম্বনেল পরিবর্তন করুন",
   "upload_form.undo": "মুছে ফেলতে",
-  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
+  "upload_form.video_description": "শ্রবণশক্তি হ্রাস বা চাক্ষুষ প্রতিবন্ধী ব্যক্তিদের জন্য বর্ণনা করুন",
   "upload_modal.analyzing_picture": "চিত্র বিশ্লেষণ করা হচ্ছে…",
   "upload_modal.apply": "প্রয়োগ করুন",
-  "upload_modal.choose_image": "Choose image",
+  "upload_modal.choose_image": "ছবি নির্বাচন করুন",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
   "upload_modal.detect_text": "ছবি থেকে পাঠ্য সনাক্ত করুন",
   "upload_modal.edit_media": "মিডিয়া সম্পাদনা করুন",
   "upload_modal.hint": "একটি দৃশ্যমান পয়েন্ট নির্বাচন করুন ক্লিক অথবা টানার মাধ্যমে যেটি সবময় সব থাম্বনেলে দেখা যাবে।",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "পূর্বরূপ({ratio})",
   "upload_progress.label": "যুক্ত করতে পাঠানো হচ্ছে...",
   "video.close": "ভিডিওটি বন্ধ করতে",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index 72a6d0a0a..ce7260477 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Nullañ ar bedadenn heuliañ",
   "account.direct": "Kas ur gemennadenn da @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domani berzet",
   "account.edit_profile": "Aozañ ar profil",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Lakaat war-wel war ar profil",
   "account.follow": "Heuliañ",
   "account.followers": "Heulier·ezed·ien",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "N'ho peus kemenn ebet c'hoazh. Grit gant implijer·ezed·ien all evit loc'hañ ar gomz.",
   "empty_column.public": "N'eus netra amañ! Skrivit un dra bennak foran pe heuilhit implijer·ien·ezed eus dafariadoù all evit leuniañ",
   "error.unexpected_crash.explanation": "Abalamour d'ur beug en hor c'hod pe d'ur gudenn geverlec'hded n'hallomp ket skrammañ ar bajenn-mañ en un doare dereat.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Klaskit azbevaat ar bajenn. Ma n'a ket en-dro e c'hallit klask ober gant Mastodon dre ur merdeer disheñvel pe dre an arload genidik.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Eilañ ar roudoù diveugañ er golver",
   "errors.unexpected_crash.report_issue": "Danevellañ ur fazi",
   "follow_request.authorize": "Aotren",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Serriñ",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Da-heul",
   "lightbox.previous": "A-raok",
   "lightbox.view_context": "Diskouez ar c'hemperzh",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Cheñch an titl",
   "lists.new.create": "Ouzhpennañ ul listenn",
   "lists.new.title_placeholder": "Titl nevez al listenn",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Ho listennoù",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Toggle visibility",
   "missing_indicator.label": "Digavet",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Arloadoù pellgomz",
   "navigation_bar.blocks": "Implijer·ezed·ien berzet",
   "navigation_bar.bookmarks": "Sinedoù",
@@ -292,12 +304,13 @@
   "navigation_bar.public_timeline": "Red-amzer kevreet",
   "navigation_bar.security": "Diogelroez",
   "notification.favourite": "{name} favourited your status",
-  "notification.follow": "{name} followed you",
+  "notification.follow": "heuliañ a ra {name} ac'hanoc'h",
   "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Skarzhañ ar c'hemennoù",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Kemennoù war ar burev",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Skignadennoù:",
   "notifications.column_settings.show": "Diskouez er bann",
   "notifications.column_settings.sound": "Seniñ",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Pep tra",
   "notifications.filter.boosts": "Skignadennoù",
   "notifications.filter.favourites": "Muiañ-karet",
   "notifications.filter.follows": "Heuliañ",
   "notifications.filter.mentions": "Menegoù",
   "notifications.filter.polls": "Disoc'hoù ar sontadegoù",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} a gemennoù",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Serret",
   "poll.refresh": "Azbevaat",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Drag & drop to upload",
-  "upload_button.label": "Ouzhpennañ ur media ({formats})",
+  "upload_button.label": "Ouzhpennañ ur 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",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Dinoiñ testenn diouzh ar skeudenn",
   "upload_modal.edit_media": "Embann ar media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Rakwel ({ratio})",
   "upload_progress.label": "O pellgargañ...",
   "video.close": "Serriñ ar video",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 7c149787f..93bcffeaa 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -1,5 +1,5 @@
 {
-  "account.account_note_header": "La teva nota per a @{name}",
+  "account.account_note_header": "Nota",
   "account.add_or_remove_from_list": "Afegir o Treure de les llistes",
   "account.badges.bot": "Bot",
   "account.badges.group": "Grup",
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Navega més en el perfil original",
   "account.cancel_follow_request": "Anul·la la sol·licitud de seguiment",
   "account.direct": "Missatge directe @{name}",
+  "account.disable_notifications": "Deixa de notificar-me els tuts de @{name}",
   "account.domain_blocked": "Domini ocult",
   "account.edit_profile": "Edita el perfil",
+  "account.enable_notifications": "Notifica’m els tuts de @{name}",
   "account.endorse": "Recomana en el teu perfil",
   "account.follow": "Segueix",
   "account.followers": "Seguidors",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Encara no tens notificacions. Interactua amb altres per iniciar la conversa.",
   "empty_column.public": "No hi ha res aquí! Escriu públicament alguna cosa o manualment segueix usuaris d'altres servidors per omplir-ho",
   "error.unexpected_crash.explanation": "A causa d'un bug en el nostre codi o un problema de compatibilitat del navegador, aquesta pàgina podria no ser mostrada correctament.",
-  "error.unexpected_crash.next_steps": "Prova recarregant la pàgina. Si això no ajuda, encara podries ser capaç d'utilitzar Mastodon a través d'un navegador diferent o amb una app nativa.",
+  "error.unexpected_crash.explanation_addons": "Aquesta pàgina podria no mostrar-se correctament. Aquest error és possiblement causat per una extensió del navegador o per eienes automàtiques de traducció.",
+  "error.unexpected_crash.next_steps": "Prova recarregant la pàgina. Si això no ajuda, encara podries ser capaç d'utilitzar Mastodon a través d'un navegador diferent o amb una aplicació nativa.",
+  "error.unexpected_crash.next_steps_addons": "Prova de desactivar-les i refrescant la pàgina. Si això no ajuda, encara pots ser capaç d’utilitzar Mastodon amb un altre navegador o aplicació nativa.",
   "errors.unexpected_crash.copy_stacktrace": "Còpia stacktrace al porta-retalls",
   "errors.unexpected_crash.report_issue": "Informa d'un problema",
   "follow_request.authorize": "Autoritzar",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "descentrar l'àrea de composició de text/cerca",
   "keyboard_shortcuts.up": "moure amunt en la llista",
   "lightbox.close": "Tancar",
+  "lightbox.compress": "Quadre de visualització d’imatge comprimida",
+  "lightbox.expand": "Amplia el quadre de visualització de l’imatge",
   "lightbox.next": "Següent",
   "lightbox.previous": "Anterior",
   "lightbox.view_context": "Veure el context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Canvi de títol",
   "lists.new.create": "Afegir llista",
   "lists.new.title_placeholder": "Nova llista",
+  "lists.replies_policy.all_replies": "Qualsevol usuari seguit",
+  "lists.replies_policy.list_replies": "Membres de la llista",
+  "lists.replies_policy.no_replies": "Ningú",
+  "lists.replies_policy.title": "Mostra respostes a:",
   "lists.search": "Cercar entre les persones que segueixes",
   "lists.subheading": "Les teves llistes",
   "load_pending": "{count, plural, one {# element nou} other {# elements nous}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Alternar visibilitat",
   "missing_indicator.label": "No trobat",
   "missing_indicator.sublabel": "Aquest recurs no pot ser trobat",
+  "mute_modal.duration": "Durada",
   "mute_modal.hide_notifications": "Amagar notificacions d'aquest usuari?",
+  "mute_modal.indefinite": "Indefinit",
   "navigation_bar.apps": "Apps mòbils",
   "navigation_bar.blocks": "Usuaris bloquejats",
   "navigation_bar.bookmarks": "Marcadors",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "ha publicat {name}",
   "notifications.clear": "Netejar notificacions",
   "notifications.clear_confirmation": "Estàs segur que vols esborrar permanentment totes les teves notificacions?",
   "notifications.column_settings.alert": "Notificacions d'escriptori",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Impulsos:",
   "notifications.column_settings.show": "Mostra en la columna",
   "notifications.column_settings.sound": "Reproduir so",
+  "notifications.column_settings.status": "Nous tuts:",
   "notifications.filter.all": "Tots",
   "notifications.filter.boosts": "Impulsos",
   "notifications.filter.favourites": "Favorits",
   "notifications.filter.follows": "Seguiments",
   "notifications.filter.mentions": "Mencions",
   "notifications.filter.polls": "Resultats de l'enquesta",
+  "notifications.filter.statuses": "Actualitzacions de gent que segueixes",
   "notifications.group": "{count} notificacions",
+  "notifications.mark_as_read": "Marca cada notificació com a llegida",
+  "notifications.permission_denied": "No s’ha pogut activar les notificacions d’escriptori perquè s’ha denegat el permís.",
+  "notifications.permission_denied_alert": "No es poden activar les notificacions del escriptori perquè el permís del navegador ha estat denegat abans",
+  "notifications_permission_banner.enable": "Activar les notificacions d’escriptori",
+  "notifications_permission_banner.how_to_control": "Per a rebre notificacions quan Mastodon no està obert cal activar les notificacions d’escriptori. Pots controlar amb precisió quins tipus d’interaccions generen notificacions d’escriptori després d’activar el botó {icon} de dalt.",
+  "notifications_permission_banner.title": "Mai et perdis res",
+  "picture_in_picture.restore": "Retorna’l",
   "poll.closed": "Finalitzada",
   "poll.refresh": "Actualitza",
   "poll.total_people": "{count, plural, one {# persona} other {# persones}}",
@@ -442,10 +464,11 @@
   "upload_modal.analyzing_picture": "Analitzant imatge…",
   "upload_modal.apply": "Aplica",
   "upload_modal.choose_image": "Tria imatge",
-  "upload_modal.description_placeholder": "Uns salts ràpids de guineu marró sobre el gos gandul",
+  "upload_modal.description_placeholder": "Jove xef, porti whisky amb quinze glaçons d’hidrogen, coi!",
   "upload_modal.detect_text": "Detecta el text de l'imatge",
   "upload_modal.edit_media": "Editar multimèdia",
   "upload_modal.hint": "Fes clic o arrossega el cercle en la previsualització per escollir el punt focal que sempre serà visible de totes les miniatures.",
+  "upload_modal.preparing_ocr": "Preparant OCR…",
   "upload_modal.preview_label": "Previsualitza ({ratio})",
   "upload_progress.label": "Pujant...",
   "video.close": "Tancar el vídeo",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 1bd9cda0b..10d5f9008 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -1,5 +1,5 @@
 {
-  "account.account_note_header": "A vostra nota per @{name}",
+  "account.account_note_header": "Nota",
   "account.add_or_remove_from_list": "Aghjunghje o toglie da e liste",
   "account.badges.bot": "Bot",
   "account.badges.group": "Gruppu",
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Vede di più nant'à u prufile uriginale",
   "account.cancel_follow_request": "Annullà a dumanda d'abbunamentu",
   "account.direct": "Missaghju direttu @{name}",
+  "account.disable_notifications": "Ùn mi nutificate più quandu @{name} pubblica qualcosa",
   "account.domain_blocked": "Duminiu piattatu",
   "account.edit_profile": "Mudificà u prufile",
+  "account.enable_notifications": "Nutificate mi quandu @{name} pubblica qualcosa",
   "account.endorse": "Fà figurà nant'à u prufilu",
   "account.follow": "Siguità",
   "account.followers": "Abbunati",
@@ -96,9 +98,9 @@
   "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",
-  "compose_form.sensitive.marked": "Media indicatu cum'è sensibile",
-  "compose_form.sensitive.unmarked": "Media micca indicatu cum'è sensibile",
+  "compose_form.sensitive.hide": "{count, plural, one {Indicà u media cum'è sensibile} other {Indicà i media cum'è sensibili}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media indicatu cum'è sensibile} other {Media indicati cum'è sensibili}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media micca indicatu cum'è sensibile} other {Media micca indicati cum'è sensibili}}",
   "compose_form.spoiler.marked": "Testu piattatu daret'à un'avertimentu",
   "compose_form.spoiler.unmarked": "Testu micca piattatu",
   "compose_form.spoiler_placeholder": "Scrive u vostr'avertimentu quì",
@@ -132,7 +134,7 @@
   "directory.new_arrivals": "Ultimi arrivi",
   "directory.recently_active": "Attività ricente",
   "embed.instructions": "Integrà stu statutu à u vostru situ cù u codice quì sottu.",
-  "embed.preview": "Assumiglierà à qualcosa cusì:",
+  "embed.preview": "Hà da parè à quessa:",
   "emoji_button.activity": "Attività",
   "emoji_button.custom": "Persunalizati",
   "emoji_button.flags": "Bandere",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Ùn avete ancu nisuna nutificazione. Interact with others to start the conversation.",
   "empty_column.public": "Ùn c'hè nunda quì! Scrivete qualcosa in pubblicu o seguitate utilizatori d'altri servori per empie a linea pubblica",
   "error.unexpected_crash.explanation": "In ragione d'un bug indè u nostru codice o un prublemu di cumpatibilità cù quessu navigatore, sta pagina ùn hè micca pussuta esse affissata currettamente.",
+  "error.unexpected_crash.explanation_addons": "Sta pagina ùn hè micca pussuta esse affissata currettamente, prubabilmente per via d'un'estenzione di navigatore o d'un lugiziale di traduzione.",
   "error.unexpected_crash.next_steps": "Pruvate d'attualizà sta pagina. S'ellu persiste u prublemu, pudete forse sempre accede à Mastodon dapoi un'alltru navigatore o applicazione.",
+  "error.unexpected_crash.next_steps_addons": "Pruvate di disattivà quelli è poi attualizà sta pagina. S'ellu persiste u prublemu, pudete forse sempre accede à Mastodon dapoi un'alltru navigatore o applicazione.",
   "errors.unexpected_crash.copy_stacktrace": "Cupià stacktrace nant'à u fermacarta",
   "errors.unexpected_crash.report_issue": "Palisà prublemu",
   "follow_request.authorize": "Auturizà",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "ùn fucalizà più l'area di testu",
   "keyboard_shortcuts.up": "cullà indè a lista",
   "lightbox.close": "Chjudà",
+  "lightbox.compress": "Cumprime a finestra d'affissera di i ritratti",
+  "lightbox.expand": "Ingrandà a finestra d'affissera di i ritratti",
   "lightbox.next": "Siguente",
   "lightbox.previous": "Pricidente",
   "lightbox.view_context": "Vede u cuntestu",
@@ -260,14 +266,20 @@
   "lists.edit.submit": "Cambià u titulu",
   "lists.new.create": "Aghjunghje",
   "lists.new.title_placeholder": "Titulu di a lista",
+  "lists.replies_policy.all_replies": "Tutti i vostri abbunamenti",
+  "lists.replies_policy.list_replies": "Membri di a lista",
+  "lists.replies_policy.no_replies": "Nisunu",
+  "lists.replies_policy.title": "Vede e risposte à:",
   "lists.search": "Circà indè i vostr'abbunamenti",
   "lists.subheading": "E vo liste",
   "load_pending": "{count, plural, one {# entrata nova} other {# entrate nove}}",
   "loading_indicator.label": "Caricamentu...",
-  "media_gallery.toggle_visible": "Cambià a visibilità",
+  "media_gallery.toggle_visible": "Piattà {number, plural, one {ritrattu} other {ritratti}}",
   "missing_indicator.label": "Micca trovu",
   "missing_indicator.sublabel": "Ùn era micca pussivule di truvà sta risorsa",
+  "mute_modal.duration": "Durata",
   "mute_modal.hide_notifications": "Piattà nutificazione da st'utilizatore?",
+  "mute_modal.indefinite": "Indifinita",
   "navigation_bar.apps": "Applicazione per u telefuninu",
   "navigation_bar.blocks": "Utilizatori bluccati",
   "navigation_bar.bookmarks": "Segnalibri",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} hà appena pubblicatu",
   "notifications.clear": "Purgà e nutificazione",
   "notifications.clear_confirmation": "Site sicuru·a che vulete toglie tutte ste nutificazione?",
   "notifications.column_settings.alert": "Nutificazione nant'à l'urdinatore",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Spartere:",
   "notifications.column_settings.show": "Mustrà indè a colonna",
   "notifications.column_settings.sound": "Sunà",
+  "notifications.column_settings.status": "Statuti novi:",
   "notifications.filter.all": "Tuttu",
   "notifications.filter.boosts": "Spartere",
   "notifications.filter.favourites": "Favuriti",
   "notifications.filter.follows": "Abbunamenti",
   "notifications.filter.mentions": "Minzione",
   "notifications.filter.polls": "Risultati di u scandagliu",
+  "notifications.filter.statuses": "Messe à ghjornu di e persone chì siguitate",
   "notifications.group": "{count} nutificazione",
+  "notifications.mark_as_read": "Marcà tutte e nutificazione cum'è lette",
+  "notifications.permission_denied": "Ùn si po micca attivà e nutificazione desktop perchè a dumanda d'auturizazione hè stata ricusata",
+  "notifications.permission_denied_alert": "Ùn pudete micca attivà e nutificazione nant'à l'urdinatore, perchè avete digià ricusatu a dumanda d'auturizazione di u navigatore",
+  "notifications_permission_banner.enable": "Attivà e nutificazione nant'à l'urdinatore",
+  "notifications_permission_banner.how_to_control": "Per riceve nutificazione quandu Mastodon ùn hè micca aperta, attivate e nutificazione nant'à l'urdinatore. Pudete decide quali tippi d'interazione anu da mandà ste nutificazione cù u buttone {icon} quì sopra quandu saranu attivate.",
+  "notifications_permission_banner.title": "Ùn mancate mai nunda",
+  "picture_in_picture.restore": "Rimette in piazza",
   "poll.closed": "Chjosu",
   "poll.refresh": "Attualizà",
   "poll.total_people": "{count, plural, one {# persona} other {# persone}}",
@@ -352,7 +374,7 @@
   "report.hint": "U signalamentu sarà mandatu à i muderatori di u servore. Pudete spiegà perchè avete palisatu stu contu quì sottu:",
   "report.placeholder": "Altri cummenti",
   "report.submit": "Mandà",
-  "report.target": "Signalamentu",
+  "report.target": "Signalamentu di {target}",
   "search.placeholder": "Circà",
   "search_popout.search_format": "Ricerca avanzata",
   "search_popout.tips.full_text": "I testi simplici rimandanu i statuti ch'avete scritti, aghjunti à i vostri favuriti, spartuti o induve quelli site mintuvatu·a, è ancu i cugnomi, nomi pubblichi è hashtag chì currispondenu.",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Drag & drop per caricà un fugliale",
-  "upload_button.label": "Aghjunghje un media ({formats})",
+  "upload_button.label": "Aghjunghje un media",
   "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",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Ditettà testu da u ritrattu",
   "upload_modal.edit_media": "Cambià media",
   "upload_modal.hint": "Cliccate o sguillate u chjerchju nant'à a vista per sceglie u puntu fucale chì sarà sempre in vista indè tutte e miniature.",
+  "upload_modal.preparing_ocr": "Priparazione di l'OCR…",
   "upload_modal.preview_label": "Vista ({ratio})",
   "upload_progress.label": "Caricamentu...",
   "video.close": "Chjudà a video",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 0ddd18de8..ad47b064c 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Více na původním profilu",
   "account.cancel_follow_request": "Zrušit žádost o sledování",
   "account.direct": "Poslat uživateli @{name} přímou zprávu",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Doména skryta",
   "account.edit_profile": "Upravit profil",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Zvýraznit na profilu",
   "account.follow": "Sledovat",
   "account.followers": "Sledující",
@@ -166,7 +168,9 @@
   "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.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Zkuste stránku načíst znovu. Pokud to nepomůže, zkuste Mastodon používat pomocí jiného prohlížeče nebo nativní aplikace.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Zkopírovat stacktrace do schránky",
   "errors.unexpected_crash.report_issue": "Nahlásit problém",
   "follow_request.authorize": "Autorizovat",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "zrušení zaměření na psací prostor/hledání",
   "keyboard_shortcuts.up": "posunutí nahoru v seznamu",
   "lightbox.close": "Zavřít",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Další",
   "lightbox.previous": "Předchozí",
   "lightbox.view_context": "Zobrazit kontext",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Změnit název",
   "lists.new.create": "Přidat seznam",
   "lists.new.title_placeholder": "Název nového seznamu",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "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}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Přepnout viditelnost",
   "missing_indicator.label": "Nenalezeno",
   "missing_indicator.sublabel": "Tento zdroj se nepodařilo najít",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Skrýt oznámení od tohoto uživatele?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobilní aplikace",
   "navigation_bar.blocks": "Blokovaní uživatelé",
   "navigation_bar.bookmarks": "Záložky",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} just posted",
   "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",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosty:",
   "notifications.column_settings.show": "Zobrazit ve sloupci",
   "notifications.column_settings.sound": "Přehrát zvuk",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Vše",
   "notifications.filter.boosts": "Boosty",
   "notifications.filter.favourites": "Oblíbení",
   "notifications.filter.follows": "Sledování",
   "notifications.filter.mentions": "Zmínky",
   "notifications.filter.polls": "Výsledky anket",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} oznámení",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Uzavřeno",
   "poll.refresh": "Obnovit",
   "poll.total_people": "{count, plural, one {# člověk} few {# lidé} many {# lidí} other {# lidí}}",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Nahrajte přetažením",
-  "upload_button.label": "Přidat média ({formats})",
+  "upload_button.label": "Přidat média",
   "upload_error.limit": "Byl překročen limit nahraných souborů.",
   "upload_error.poll": "U anket není nahrávání souborů povoleno.",
   "upload_form.audio_description": "Popis pro sluchově postižené",
@@ -446,6 +468,7 @@
   "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 oblast, která bude na všech náhledech vždy zobrazen.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Náhled ({ratio})",
   "upload_progress.label": "Nahrávání…",
   "video.close": "Zavřít video",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index 312a0f97a..e5f2e69b0 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -1,22 +1,24 @@
 {
-  "account.account_note_header": "Note",
+  "account.account_note_header": "Nodyn",
   "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",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "Pori mwy ar y proffil gwreiddiol",
   "account.cancel_follow_request": "Canslo cais dilyn",
   "account.direct": "Neges breifat @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Parth wedi ei guddio",
   "account.edit_profile": "Golygu proffil",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Arddangos ar fy mhroffil",
   "account.follow": "Dilyn",
   "account.followers": "Dilynwyr",
   "account.followers.empty": "Nid oes neb yn dilyn y defnyddiwr hwn eto.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, one {{counter} Ddilynwr} other {{counter} o Ddilynwyr}}",
+  "account.following_counter": "{count, plural, one {{counter} yn Dilyn} other {{counter} yn Dilyn}}",
   "account.follows.empty": "Nid yw'r defnyddiwr hwn yn dilyn unrhyw un eto.",
   "account.follows_you": "Yn eich dilyn chi",
   "account.hide_reblogs": "Cuddio bwstiau o @{name}",
@@ -36,14 +38,14 @@
   "account.requested": "Aros am gymeradwyaeth. Cliciwch er mwyn canslo cais dilyn",
   "account.share": "Rhannwch broffil @{name}",
   "account.show_reblogs": "Dangos bwstiau o @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} Dŵt} other {{counter} o Dŵtiau}}",
   "account.unblock": "Dadflocio @{name}",
   "account.unblock_domain": "Dadguddio {domain}",
   "account.unendorse": "Peidio a'i arddangos ar fy mhroffil",
   "account.unfollow": "Dad-ddilyn",
   "account.unmute": "Dad-dawelu @{name}",
   "account.unmute_notifications": "Dad-dawelu hysbysiadau o @{name}",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "Clicio i ychwanegu nodyn",
   "alert.rate_limited.message": "Ceisiwch eto ar ôl {retry_time, time, medium}.",
   "alert.rate_limited.title": "Cyfradd gyfyngedig",
   "alert.unexpected.message": "Digwyddodd gwall annisgwyl.",
@@ -166,13 +168,15 @@
   "empty_column.notifications": "Nid oes gennych unrhyw hysbysiadau eto. Rhyngweithiwch ac eraill i ddechrau'r sgwrs.",
   "empty_column.public": "Does dim byd yma! Ysgrifennwch rhywbeth yn gyhoeddus, neu dilynwch ddefnyddwyr o achosion eraill i'w lenwi",
   "error.unexpected_crash.explanation": "Oherwydd gwall yn ein cod neu oherwydd problem cysondeb porwr, nid oedd y dudalen hon gallu cael ei dangos yn gywir.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Ceisiwch ail-lwytho y dudalen. Os nad yw hyn yn eich helpu, efallai gallech defnyddio Mastodon trwy borwr neu ap brodorol gwahanol.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copïo'r olrhain stac i'r clipfwrdd",
   "errors.unexpected_crash.report_issue": "Rhoi gwybod am broblem",
   "follow_request.authorize": "Caniatau",
   "follow_request.reject": "Gwrthod",
   "follow_requests.unlocked_explanation": "Er nid yw eich cyfrif wedi'i gloi, oedd y staff {domain} yn meddwl efallai hoffech adolygu ceisiadau dilyn o'r cyfrifau rhain wrth law.",
-  "generic.saved": "Saved",
+  "generic.saved": "Wedi'i Gadw",
   "getting_started.developers": "Datblygwyr",
   "getting_started.directory": "Cyfeiriadur proffil",
   "getting_started.documentation": "Dogfennaeth",
@@ -242,7 +246,7 @@
   "keyboard_shortcuts.reply": "i ateb",
   "keyboard_shortcuts.requests": "i agor rhestr ceisiadau dilyn",
   "keyboard_shortcuts.search": "i ffocysu chwilio",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.spoilers": "i ddangos/cuddio'r maes CW",
   "keyboard_shortcuts.start": "i agor colofn \"dechrau arni\"",
   "keyboard_shortcuts.toggle_hidden": "i ddangos/cuddio testun tu ôl i CW",
   "keyboard_shortcuts.toggle_sensitivity": "i ddangos/gyddio cyfryngau",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "i ddad-ffocysu ardal cyfansoddi testun/chwilio",
   "keyboard_shortcuts.up": "i symud yn uwch yn y rhestr",
   "lightbox.close": "Cau",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Nesaf",
   "lightbox.previous": "Blaenorol",
   "lightbox.view_context": "Gweld cyd-destyn",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Newid teitl",
   "lists.new.create": "Ychwanegu rhestr",
   "lists.new.title_placeholder": "Teitl rhestr newydd",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Chwilio ymysg pobl yr ydych yn ei ddilyn",
   "lists.subheading": "Eich rhestrau",
   "load_pending": "{count, plural, one {# eitem newydd} other {# eitemau newydd}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Toglo gwelededd",
   "missing_indicator.label": "Heb ei ganfod",
   "missing_indicator.sublabel": "Ni ellid canfod yr adnodd hwn",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Cuddio hysbysiadau rhag y defnyddiwr hwn?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Apiau symudol",
   "navigation_bar.blocks": "Defnyddwyr wedi eu blocio",
   "navigation_bar.bookmarks": "Tudalnodau",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clirio hysbysiadau",
   "notifications.clear_confirmation": "Ydych chi'n sicr eich bod am glirio'ch holl hysbysiadau am byth?",
   "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Hybiadau:",
   "notifications.column_settings.show": "Dangos yn y golofn",
   "notifications.column_settings.sound": "Chwarae sain",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Pob",
   "notifications.filter.boosts": "Hybiadau",
   "notifications.filter.favourites": "Ffefrynnau",
   "notifications.filter.follows": "Yn dilyn",
   "notifications.filter.mentions": "Crybwylliadau",
   "notifications.filter.polls": "Canlyniadau pleidlais",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} o hysbysiadau",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Ar gau",
   "poll.refresh": "Adnewyddu",
   "poll.total_people": "{count, plural, one {# berson} other {# o bobl}}",
@@ -419,16 +441,16 @@
   "time_remaining.minutes": "{number, plural, one {# funud} other {# o funudau}} ar ôl",
   "time_remaining.moments": "Munudau ar ôl",
   "time_remaining.seconds": "{number, plural, one {# eiliad} other {# o eiliadau}} ar ôl",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "timeline_hint.remote_resource_not_displayed": "ni chaiff {resource} o gweinyddion eraill ei ddangos.",
+  "timeline_hint.resources.followers": "Dilynwyr",
+  "timeline_hint.resources.follows": "Yn dilyn",
+  "timeline_hint.resources.statuses": "Tŵtiau henach",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} berson} other {{counter} o bobl}}",
   "trends.trending_now": "Yn tueddu nawr",
   "ui.beforeunload": "Mi fyddwch yn colli eich drafft os gadewch Mastodon.",
-  "units.short.billion": "{count}B",
-  "units.short.million": "{count}M",
-  "units.short.thousand": "{count}K",
+  "units.short.billion": "{count}biliwn",
+  "units.short.million": "{count}miliwn",
+  "units.short.thousand": "{count}mil",
   "upload_area.title": "Llusgwch & gollwing i uwchlwytho",
   "upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Wedi mynd heibio'r uchafswm terfyn uwchlwytho.",
@@ -436,16 +458,17 @@
   "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.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "Newid mân-lun",
   "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.choose_image": "Choose image",
+  "upload_modal.choose_image": "Dewis delwedd",
   "upload_modal.description_placeholder": "Mae ei phen bach llawn jocs, 'run peth a fy nghot golff, rhai dyddiau",
   "upload_modal.detect_text": "Canfod testun o'r llun",
   "upload_modal.edit_media": "Golygu cyfryngau",
   "upload_modal.hint": "Cliciwch neu llusgwch y cylch ar y rhagolwg i ddewis y canolbwynt a fydd bob amser i'w weld ar bob mân-lunau.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Rhagolwg ({ratio})",
   "upload_progress.label": "Uwchlwytho...",
   "video.close": "Cau fideo",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index a0fb354e6..4b312a8f4 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -6,16 +6,18 @@
   "account.block": "Bloker @{name}",
   "account.block_domain": "Skjul alt fra {domain}",
   "account.blocked": "Blokeret",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "Gennemse mere på den oprindelige profil",
   "account.cancel_follow_request": "Annullér følgeranmodning",
   "account.direct": "Send en direkte besked til @{name}",
+  "account.disable_notifications": "Stop med at give mig besked når @{name} lægger noget op",
   "account.domain_blocked": "Domænet er blevet skjult",
   "account.edit_profile": "Rediger profil",
+  "account.enable_notifications": "Giv mig besked når @{name} lægger noget op",
   "account.endorse": "Fremhæv på profil",
   "account.follow": "Følg",
   "account.followers": "Følgere",
   "account.followers.empty": "Der er endnu ingen der følger denne bruger.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+  "account.followers_counter": "{count, plural, one {{counter} Følger} other {{counter} Følgere}}",
   "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
   "account.follows.empty": "Denne bruger følger endnu ikke nogen.",
   "account.follows_you": "Følger dig",
@@ -48,7 +50,7 @@
   "alert.rate_limited.title": "Gradsbegrænset",
   "alert.unexpected.message": "Der opstod en uventet fejl.",
   "alert.unexpected.title": "Ups!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Bekendtgørelse",
   "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.",
@@ -79,9 +81,9 @@
   "column_header.show_settings": "Vis indstillinger",
   "column_header.unpin": "Fastgør ikke længere",
   "column_subheading.settings": "Indstillinger",
-  "community.column_settings.local_only": "Local only",
+  "community.column_settings.local_only": "Kun lokalt",
   "community.column_settings.media_only": "Kun medie",
-  "community.column_settings.remote_only": "Remote only",
+  "community.column_settings.remote_only": "Kun fjernt",
   "compose_form.direct_message_warning": "Dette trut vil kun blive sendt til de nævnte brugere.",
   "compose_form.direct_message_warning_learn_more": "Lær mere",
   "compose_form.hashtag_warning": "Dette trut vil ikke blive vist under noget hashtag da det ikke er listet. Kun offentlige trut kan blive vist under søgninger med hashtags.",
@@ -92,8 +94,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.poll.switch_to_multiple": "Ændre afstemning for at tillade flere valg",
+  "compose_form.poll.switch_to_single": "Ændre afstemning for at tillade et enkelt valg",
   "compose_form.publish": "Trut",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Markér medie som følsomt",
@@ -166,13 +168,15 @@
   "empty_column.notifications": "Du har endnu ingen notifikationer. Tag ud og bland dig med folkemængden for at starte samtalen.",
   "empty_column.public": "Der er ikke noget at se her! Skriv noget offentligt eller start ud med manuelt at følge brugere fra andre server for at udfylde tomrummet",
   "error.unexpected_crash.explanation": "På grund af en fejl i vores kode, eller en browser kompatibilitetsfejl, så kunne siden ikke vises korrekt.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Prøv at genindlæs siden. Hvis dette ikke hjælper, så forsøg venligst, at tilgå Mastodon via en anden browser eller app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Kopiér stack trace til udklipsholderen",
   "errors.unexpected_crash.report_issue": "Rapportér problem",
   "follow_request.authorize": "Godkend",
   "follow_request.reject": "Afvis",
-  "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
-  "generic.saved": "Saved",
+  "follow_requests.unlocked_explanation": "Selvom din konto ikke er låst, troede {domain} -personalet, at du måske vil gennemgå dine anmodninger manuelt.",
+  "generic.saved": "Gemt",
   "getting_started.developers": "Udviklere",
   "getting_started.directory": "Profilliste",
   "getting_started.documentation": "Dokumentation",
@@ -193,8 +197,8 @@
   "home.column_settings.basic": "Grundlæggende",
   "home.column_settings.show_reblogs": "Vis fremhævelser",
   "home.column_settings.show_replies": "Vis svar",
-  "home.hide_announcements": "Hide announcements",
-  "home.show_announcements": "Show announcements",
+  "home.hide_announcements": "Skjul bekendtgørelser",
+  "home.show_announcements": "Vis bekendtgørelser",
   "intervals.full.days": "{number, plural, one {# dag} other {# dage}}",
   "intervals.full.hours": "{number, plural, one {# time} other {# timer}}",
   "intervals.full.minutes": "{number, plural, one {# minut} other {# minutter}}",
@@ -236,13 +240,13 @@
   "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.open_media": "for at åbne medier",
   "keyboard_shortcuts.pinned": "for at åbne listen over fastgjorte trut",
   "keyboard_shortcuts.profile": "til profil af åben forfatter",
   "keyboard_shortcuts.reply": "for at svare",
   "keyboard_shortcuts.requests": "for at åbne listen over følgeranmodninger",
   "keyboard_shortcuts.search": "for at fokusere søgningen",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.spoilers": "for at vise/skjule CW-felt",
   "keyboard_shortcuts.start": "for at åbne \"kom igen\" kolonnen",
   "keyboard_shortcuts.toggle_hidden": "for at vise/skjule tekst bag CW",
   "keyboard_shortcuts.toggle_sensitivity": "for at vise/skjule medier",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "for at fjerne fokus fra skriveområde/søgning",
   "keyboard_shortcuts.up": "for at bevæge dig op ad listen",
   "lightbox.close": "Luk",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Næste",
   "lightbox.previous": "Forrige",
   "lightbox.view_context": "Vis kontekst",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Skift titel",
   "lists.new.create": "Tilføj liste",
   "lists.new.title_placeholder": "Ny liste titel",
+  "lists.replies_policy.all_replies": "Enhver fulgt bruger",
+  "lists.replies_policy.list_replies": "Medlemmer af listen",
+  "lists.replies_policy.no_replies": "Ingen",
+  "lists.replies_policy.title": "Vis svar til:",
   "lists.search": "Søg iblandt folk du følger",
   "lists.subheading": "Dine lister",
   "load_pending": "{count, plural, one {# nyt punkt} other {# nye punkter}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Ændre synlighed",
   "missing_indicator.label": "Ikke fundet",
   "missing_indicator.sublabel": "Denne ressource kunne ikke blive fundet",
+  "mute_modal.duration": "Varighed",
   "mute_modal.hide_notifications": "Skjul notifikationer fra denne bruger?",
+  "mute_modal.indefinite": "Uendeligt",
   "navigation_bar.apps": "Mobil apps",
   "navigation_bar.blocks": "Blokerede brugere",
   "navigation_bar.bookmarks": "Bogmærker",
@@ -293,11 +305,12 @@
   "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.follow_request": "{name} har anmodet om at følge dig",
   "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",
+  "notification.status": "{name} har lige lagt noget op",
   "notifications.clear": "Ryd notifikationer",
   "notifications.clear_confirmation": "Er du sikker på, du vil rydde alle dine notifikationer permanent?",
   "notifications.column_settings.alert": "Skrivebordsnotifikationer",
@@ -306,20 +319,29 @@
   "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.follow_request": "Nye følgeranmodninger:",
   "notifications.column_settings.mention": "Statusser der nævner dig:",
   "notifications.column_settings.poll": "Afstemningsresultat:",
   "notifications.column_settings.push": "Pushnotifikationer",
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Vis i kolonne",
   "notifications.column_settings.sound": "Afspil lyd",
+  "notifications.column_settings.status": "Nye toots:",
   "notifications.filter.all": "Alle",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favoritter",
   "notifications.filter.follows": "Følger",
   "notifications.filter.mentions": "Statusser der nævner dig",
   "notifications.filter.polls": "Afstemningsresultat",
+  "notifications.filter.statuses": "Opdateringer fra personer, du følger",
   "notifications.group": "{count} notifikationer",
+  "notifications.mark_as_read": "Markér alle notifikationer som læst",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Aktivér skrivebordsmeddelelser",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Gå aldrig glip af noget",
+  "picture_in_picture.restore": "Sæt den tilbage",
   "poll.closed": "Lukket",
   "poll.refresh": "Opdatér",
   "poll.total_people": "{count, plural, one {# person} other {# personer}}",
@@ -419,10 +441,10 @@
   "time_remaining.minutes": "{number, plural, one {# minut} other {# minutter}} tilbage",
   "time_remaining.moments": "Få øjeblikke tilbage",
   "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekunder}} tilbage",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
+  "timeline_hint.remote_resource_not_displayed": "{resource} fra andre servere vises ikke.",
+  "timeline_hint.resources.followers": "Følgere",
+  "timeline_hint.resources.follows": "Følger",
+  "timeline_hint.resources.statuses": "Ældre toots",
   "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
   "trends.trending_now": "Hot lige nu",
   "ui.beforeunload": "Din kladde vil gå tabt hvis du forlader Mastodon.",
@@ -433,19 +455,20 @@
   "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.audio_description": "Beskriv for personer med høretab",
   "upload_form.description": "Beskriv for svagtseende",
   "upload_form.edit": "Redigér",
   "upload_form.thumbnail": "Change thumbnail",
   "upload_form.undo": "Slet",
-  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
+  "upload_form.video_description": "Beskriv for personer med høretab eller nedsat syn",
   "upload_modal.analyzing_picture": "Analyserer billede…",
   "upload_modal.apply": "Anvend",
-  "upload_modal.choose_image": "Choose image",
+  "upload_modal.choose_image": "Vælg billede",
   "upload_modal.description_placeholder": "En hurtig brun ræv hopper over den dovne hund",
   "upload_modal.detect_text": "Find tekst i billede på automatisk vis",
   "upload_modal.edit_media": "Redigér medie",
   "upload_modal.hint": "Klik eller træk cirklen på billedet for at vælge et fokuspunkt.",
+  "upload_modal.preparing_ocr": "Forbereder OCR…",
   "upload_modal.preview_label": "Forhåndsvisning ({ratio})",
   "upload_progress.label": "Uploader...",
   "video.close": "Luk video",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 61d7bd58a..3c877308d 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -1,16 +1,18 @@
 {
-  "account.account_note_header": "Deine Notiz für @{name}",
+  "account.account_note_header": "Notiz",
   "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} blockieren",
+  "account.block_domain": "Alles von {domain} verstecken",
   "account.blocked": "Blockiert",
   "account.browse_more_on_origin_server": "Mehr auf dem Originalprofil durchsuchen",
   "account.cancel_follow_request": "Folgeanfrage abbrechen",
   "account.direct": "Direktnachricht an @{name}",
+  "account.disable_notifications": "Höre auf mich zu benachrichtigen wenn @{name} etwas postet",
   "account.domain_blocked": "Domain versteckt",
   "account.edit_profile": "Profil bearbeiten",
+  "account.enable_notifications": "Benachrichtige mich wenn @{name} etwas postet",
   "account.endorse": "Auf Profil hervorheben",
   "account.follow": "Folgen",
   "account.followers": "Folgende",
@@ -38,12 +40,12 @@
   "account.show_reblogs": "Von @{name} geteilte Beiträge anzeigen",
   "account.statuses_counter": "{count, plural, one {{counter} Beitrag} other {{counter} Beiträge}}",
   "account.unblock": "@{name} entblocken",
-  "account.unblock_domain": "Blockieren von {domain} beenden",
+  "account.unblock_domain": "{domain} wieder anzeigen",
   "account.unendorse": "Nicht auf Profil hervorheben",
   "account.unfollow": "Entfolgen",
   "account.unmute": "@{name} nicht mehr stummschalten",
   "account.unmute_notifications": "Benachrichtigungen von @{name} einschalten",
-  "account_note.placeholder": "Kein Kommentar angegeben",
+  "account_note.placeholder": "Notiz durch Klicken hinzufügen",
   "alert.rate_limited.message": "Bitte versuche es nach {retry_time, time, medium}.",
   "alert.rate_limited.title": "Anfragelimit überschritten",
   "alert.unexpected.message": "Ein unerwarteter Fehler ist aufgetreten.",
@@ -62,7 +64,7 @@
   "column.community": "Lokale Zeitleiste",
   "column.direct": "Direktnachrichten",
   "column.directory": "Profile durchsuchen",
-  "column.domain_blocks": "Versteckte Domains",
+  "column.domain_blocks": "Blockierte Domains",
   "column.favourites": "Favoriten",
   "column.follow_requests": "Folgeanfragen",
   "column.home": "Startseite",
@@ -94,11 +96,11 @@
   "compose_form.poll.remove_option": "Wahl entfernen",
   "compose_form.poll.switch_to_multiple": "Umfrage ändern, um mehrere Optionen zu erlauben",
   "compose_form.poll.switch_to_single": "Umfrage ändern, um eine einzige Wahl zu erlauben",
-  "compose_form.publish": "Beitrag",
+  "compose_form.publish": "Tröt",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Medien als heikel markieren",
-  "compose_form.sensitive.marked": "Medien sind als heikel markiert",
-  "compose_form.sensitive.unmarked": "Medien sind nicht als heikel markiert",
+  "compose_form.sensitive.hide": "Medien als NSFW markieren",
+  "compose_form.sensitive.marked": "Medien sind als NSFW markiert",
+  "compose_form.sensitive.unmarked": "Medien sind nicht als NSFW markiert",
   "compose_form.spoiler.marked": "Text ist hinter einer Warnung versteckt",
   "compose_form.spoiler.unmarked": "Text ist nicht versteckt",
   "compose_form.spoiler_placeholder": "Inhaltswarnung",
@@ -165,8 +167,10 @@
   "empty_column.mutes": "Du hast keine Profile stummgeschaltet.",
   "empty_column.notifications": "Du hast noch keine Mitteilungen. Interagiere mit anderen, um ins Gespräch zu kommen.",
   "empty_column.public": "Hier ist nichts zu sehen! Schreibe etwas öffentlich oder folge Profilen von anderen Servern, um die Zeitleiste aufzufüllen",
-  "error.unexpected_crash.explanation": "Aufgrund eines Fehlers in unserem Code oder einer Browser-Inkompatibilität konnte diese Seite nicht korrekt angezeigt werden.",
+  "error.unexpected_crash.explanation": "Aufgrund eines Fehlers in unserem Code oder einer Browsereinkompatibilität konnte diese Seite nicht korrekt angezeigt werden.",
+  "error.unexpected_crash.explanation_addons": "Diese Seite konnte nicht korrekt angezeigt werden. Dieser Fehler wird wahrscheinlich durch ein Browser-Add-on oder automatische Übersetzungswerkzeuge verursacht.",
   "error.unexpected_crash.next_steps": "Versuche die Seite zu aktualisieren. Wenn das nicht hilft, kannst du Mastodon über einen anderen Browser oder eine native App verwenden.",
+  "error.unexpected_crash.next_steps_addons": "Versuche sie zu deaktivieren und lade dann die Seite neu. Wenn das Problem weiterhin besteht, solltest du Mastodon über einen anderen Browser oder eine native App nutzen.",
   "errors.unexpected_crash.copy_stacktrace": "Fehlerlog in die Zwischenablage kopieren",
   "errors.unexpected_crash.report_issue": "Problem melden",
   "follow_request.authorize": "Erlauben",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "Textfeld/die Suche nicht mehr fokussieren",
   "keyboard_shortcuts.up": "sich in der Liste hinauf bewegen",
   "lightbox.close": "Schließen",
+  "lightbox.compress": "Bildansicht komprimieren",
+  "lightbox.expand": "Bildansicht erweitern",
   "lightbox.next": "Weiter",
   "lightbox.previous": "Zurück",
   "lightbox.view_context": "Beitrag sehen",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Titel ändern",
   "lists.new.create": "Liste hinzufügen",
   "lists.new.title_placeholder": "Neuer Titel der Liste",
+  "lists.replies_policy.all_replies": "Jeder gefolgte Benutzer",
+  "lists.replies_policy.list_replies": "Mitglieder der Liste",
+  "lists.replies_policy.no_replies": "Niemand",
+  "lists.replies_policy.title": "Antworten anzeigen für:",
   "lists.search": "Suche nach Leuten denen du folgst",
   "lists.subheading": "Deine Listen",
   "load_pending": "{count, plural, one {# neuer Beitrag} other {# neue Beiträge}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Sichtbarkeit umschalten",
   "missing_indicator.label": "Nicht gefunden",
   "missing_indicator.sublabel": "Die Ressource konnte nicht gefunden werden",
+  "mute_modal.duration": "Dauer",
   "mute_modal.hide_notifications": "Benachrichtigungen von diesem Account verbergen?",
+  "mute_modal.indefinite": "Unbestimmt",
   "navigation_bar.apps": "Mobile Apps",
   "navigation_bar.blocks": "Blockierte Profile",
   "navigation_bar.bookmarks": "Lesezeichen",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} hat gerade etwas gepostet",
   "notifications.clear": "Mitteilungen löschen",
   "notifications.clear_confirmation": "Bist du dir sicher, dass du alle Mitteilungen löschen möchtest?",
   "notifications.column_settings.alert": "Desktop-Benachrichtigungen",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Geteilte Beiträge:",
   "notifications.column_settings.show": "In der Spalte anzeigen",
   "notifications.column_settings.sound": "Ton abspielen",
+  "notifications.column_settings.status": "Neue Beiträge:",
   "notifications.filter.all": "Alle",
   "notifications.filter.boosts": "Geteilte Beiträge",
   "notifications.filter.favourites": "Favorisierungen",
   "notifications.filter.follows": "Folgt",
   "notifications.filter.mentions": "Erwähnungen",
   "notifications.filter.polls": "Ergebnisse der Umfrage",
+  "notifications.filter.statuses": "Updates von Personen, denen du folgst",
   "notifications.group": "{count} Benachrichtigungen",
+  "notifications.mark_as_read": "Alle Benachrichtigungen als gelesen markieren",
+  "notifications.permission_denied": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Berechtigung verweigert wurde.",
+  "notifications.permission_denied_alert": "Desktop-Benachrichtigungen können nicht aktiviert werden, da die Browser-Berechtigung zuvor verweigert wurde",
+  "notifications_permission_banner.enable": "Aktiviere Desktop-Benachrichtigungen",
+  "notifications_permission_banner.how_to_control": "Um Benachrichtigungen zu erhalten, wenn Mastodon nicht geöffnet ist, aktiviere die Desktop-Benachrichtigungen. Du kannst genau bestimmen, welche Arten von Interaktionen Desktop-Benachrichtigungen über die {icon} -Taste erzeugen, sobald diese aktiviert sind.",
+  "notifications_permission_banner.title": "Verpasse nie etwas",
+  "picture_in_picture.restore": "Zurücksetzen",
   "poll.closed": "Geschlossen",
   "poll.refresh": "Aktualisieren",
   "poll.total_people": "{count, plural, one {# Person} other {# Personen}}",
@@ -397,7 +419,7 @@
   "status.reply": "Antworten",
   "status.replyAll": "Allen antworten",
   "status.report": "@{name} melden",
-  "status.sensitive_warning": "Heikle Inhalte",
+  "status.sensitive_warning": "NSFW",
   "status.share": "Teilen",
   "status.show_less": "Weniger anzeigen",
   "status.show_less_all": "Alle Inhaltswarnungen zuklappen",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Zum Hochladen hereinziehen",
-  "upload_button.label": "Mediendatei hinzufügen ({formats})",
+  "upload_button.label": "Mediendatei hinzufügen",
   "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",
@@ -446,6 +468,7 @@
   "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.preparing_ocr": "Vorbereitung von OCR…",
   "upload_modal.preview_label": "Vorschau ({ratio})",
   "upload_progress.label": "Wird hochgeladen …",
   "video.close": "Video schließen",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index d8c04854e..51a29d527 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -1339,15 +1339,15 @@
   {
     "descriptors": [
       {
-        "defaultMessage": "Media is marked as sensitive",
+        "defaultMessage": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
         "id": "compose_form.sensitive.marked"
       },
       {
-        "defaultMessage": "Media is not marked as sensitive",
+        "defaultMessage": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
         "id": "compose_form.sensitive.unmarked"
       },
       {
-        "defaultMessage": "Mark media as sensitive",
+        "defaultMessage": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
         "id": "compose_form.sensitive.hide"
       }
     ],
@@ -3217,6 +3217,19 @@
   {
     "descriptors": [
       {
+        "defaultMessage": "Compress image view box",
+        "id": "lightbox.compress"
+      },
+      {
+        "defaultMessage": "Expand image view box",
+        "id": "lightbox.expand"
+      }
+    ],
+    "path": "app/javascript/mastodon/features/ui/components/zoomable_image.json"
+  },
+  {
+    "descriptors": [
+      {
         "defaultMessage": "Your draft will be lost if you leave Mastodon.",
         "id": "ui.beforeunload"
       }
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 2108c4ab6..bd9f2e7ff 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Δες περισσότερα στο αρχικό προφίλ",
   "account.cancel_follow_request": "Ακύρωση αιτήματος παρακολούθησης",
   "account.direct": "Προσωπικό μήνυμα προς @{name}",
+  "account.disable_notifications": "Διακοπή ειδοποιήσεων για τις δημοσιεύσεις του/της @{name}",
   "account.domain_blocked": "Κρυμμένος τομέας",
   "account.edit_profile": "Επεξεργασία προφίλ",
+  "account.enable_notifications": "Έναρξη ειδοποιήσεων για τις δημοσιεύσεις του/της @{name}",
   "account.endorse": "Προβολή στο προφίλ",
   "account.follow": "Ακολούθησε",
   "account.followers": "Ακόλουθοι",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Δεν έχεις ειδοποιήσεις ακόμα. Αλληλεπίδρασε με άλλους χρήστες για να ξεκινήσεις την κουβέντα.",
   "empty_column.public": "Δεν υπάρχει τίποτα εδώ! Γράψε κάτι δημόσιο, ή ακολούθησε χειροκίνητα χρήστες από άλλους κόμβους για να τη γεμίσεις",
   "error.unexpected_crash.explanation": "Είτε λόγω λάθους στον κώδικά μας ή λόγω ασυμβατότητας με τον browser, η σελίδα δε μπόρεσε να εμφανιστεί σωστά.",
+  "error.unexpected_crash.explanation_addons": "Η σελίδα δεν μπόρεσε να εμφανιστεί σωστά. Το πρόβλημα οφείλεται πιθανόν σε κάποια επέκταση του φυλλομετρητή (browser extension) ή σε κάποιο αυτόματο εργαλείο μετάφρασης.",
   "error.unexpected_crash.next_steps": "Δοκίμασε να ανανεώσεις τη σελίδα. Αν αυτό δε βοηθήσει, ίσως να μπορέσεις να χρησιμοποιήσεις το Mastodon μέσω διαφορετικού browser ή κάποιας εφαρμογής.",
+  "error.unexpected_crash.next_steps_addons": "Δοκίμασε να τα απενεργοποιήσεις και ανανέωσε τη σελίδα. Αν αυτό δεν βοηθήσει, ίσως να μπορέσεις να χρησιμοποιήσεις το Mastodon μέσω διαφορετικού φυλλομετρητή ή κάποιας εφαρμογής.",
   "errors.unexpected_crash.copy_stacktrace": "Αντιγραφή μηνυμάτων κώδικα στο πρόχειρο",
   "errors.unexpected_crash.report_issue": "Αναφορά προβλήματος",
   "follow_request.authorize": "Ενέκρινε",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "απο-εστίαση του πεδίου σύνθεσης/αναζήτησης",
   "keyboard_shortcuts.up": "κίνηση προς την κορυφή της λίστας",
   "lightbox.close": "Κλείσιμο",
+  "lightbox.compress": "Συμπίεση πλαισίου εμφάνισης εικόνας",
+  "lightbox.expand": "Ανάπτυξη πλαισίου εμφάνισης εικόνας",
   "lightbox.next": "Επόμενο",
   "lightbox.previous": "Προηγούμενο",
   "lightbox.view_context": "Εμφάνιση πλαισίου",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Αλλαγή τίτλου",
   "lists.new.create": "Προσθήκη λίστας",
   "lists.new.title_placeholder": "Τίτλος νέας λίστα",
+  "lists.replies_policy.all_replies": "Οποιοσδήποτε χρήστης που ακολουθείς",
+  "lists.replies_policy.list_replies": "Μέλη της λίστας",
+  "lists.replies_policy.no_replies": "Κανείς",
+  "lists.replies_policy.title": "Εμφάνιση απαντήσεων σε:",
   "lists.search": "Αναζήτησε μεταξύ των ανθρώπων που ακουλουθείς",
   "lists.subheading": "Οι λίστες σου",
   "load_pending": "{count, plural, one {# νέο} other {# νέα}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Εναλλαγή ορατότητας",
   "missing_indicator.label": "Δε βρέθηκε",
   "missing_indicator.sublabel": "Αδύνατη η εύρεση αυτού του πόρου",
+  "mute_modal.duration": "Διάρκεια",
   "mute_modal.hide_notifications": "Απόκρυψη ειδοποιήσεων αυτού του χρήστη;",
+  "mute_modal.indefinite": "Αόριστη",
   "navigation_bar.apps": "Εφαρμογές φορητών συσκευών",
   "navigation_bar.blocks": "Αποκλεισμένοι χρήστες",
   "navigation_bar.bookmarks": "Σελιδοδείκτες",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Η ψηφοφορία σου έληξε",
   "notification.poll": "Τελείωσε μια από τις ψηφοφορίες που συμμετείχες",
   "notification.reblog": "Ο/Η {name} προώθησε την κατάστασή σου",
+  "notification.status": "Ο/Η {name} μόλις έγραψε κάτι",
   "notifications.clear": "Καθαρισμός ειδοποιήσεων",
   "notifications.clear_confirmation": "Σίγουρα θέλεις να καθαρίσεις όλες τις ειδοποιήσεις σου;",
   "notifications.column_settings.alert": "Ειδοποιήσεις επιφάνειας εργασίας",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Προωθήσεις:",
   "notifications.column_settings.show": "Εμφάνισε σε στήλη",
   "notifications.column_settings.sound": "Ηχητική ειδοποίηση",
+  "notifications.column_settings.status": "Νέα τουτ:",
   "notifications.filter.all": "Όλες",
   "notifications.filter.boosts": "Προωθήσεις",
   "notifications.filter.favourites": "Αγαπημένα",
   "notifications.filter.follows": "Ακόλουθοι",
   "notifications.filter.mentions": "Αναφορές",
   "notifications.filter.polls": "Αποτελέσματα ψηφοφορίας",
+  "notifications.filter.statuses": "Ενημερώσεις από όσους ακολουθείς",
   "notifications.group": "{count} ειδοποιήσεις",
+  "notifications.mark_as_read": "Σημείωσε όλες τις ειδοποιήσεις ως αναγνωσμένες",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Ενεργοποίηση ειδοποιήσεων επιφάνειας εργασίας",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Μη χάσετε τίποτα",
+  "picture_in_picture.restore": "Επαναφορά",
   "poll.closed": "Κλειστή",
   "poll.refresh": "Ανανέωση",
   "poll.total_people": "{count, plural, one {# άτομο} other {# άτομα}}",
@@ -388,7 +410,7 @@
   "status.pin": "Καρφίτσωσε στο προφίλ",
   "status.pinned": "Καρφιτσωμένο τουτ",
   "status.read_more": "Περισσότερα",
-  "status.reblog": "Προώθησε",
+  "status.reblog": "Προώθηση",
   "status.reblog_private": "Προώθησε στους αρχικούς παραλήπτες",
   "status.reblogged_by": "{name} προώθησε",
   "status.reblogs.empty": "Κανείς δεν προώθησε αυτό το τουτ ακόμα. Μόλις το κάνει κάποια, θα εμφανιστούν εδώ.",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}Ε",
   "units.short.thousand": "{count}Χ",
   "upload_area.title": "Drag & drop για να ανεβάσεις",
-  "upload_button.label": "Πρόσθεσε πολυμέσα ({formats})",
+  "upload_button.label": "Πρόσθεσε πολυμέσα",
   "upload_error.limit": "Υπέρβαση ορίου μεγέθους ανεβασμένων αρχείων.",
   "upload_error.poll": "Στις δημοσκοπήσεις δεν επιτρέπεται η μεταφόρτωση αρχείου.",
   "upload_form.audio_description": "Περιγραφή για άτομα με προβλήματα ακοής",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Αναγνώριση κειμένου από την εικόνα",
   "upload_modal.edit_media": "Επεξεργασία Πολυμέσων",
   "upload_modal.hint": "Κάνε κλικ ή σείρε τον κύκλο στην προεπισκόπηση για να επιλέξεις το σημείο εστίασης που θα είναι πάντα εμφανές σε όλες τις μικρογραφίες.",
+  "upload_modal.preparing_ocr": "Προετοιμασία αναγνώρισης κειμένου…",
   "upload_modal.preview_label": "Προεπισκόπηση ({ratio})",
   "upload_progress.label": "Ανεβαίνει...",
   "video.close": "Κλείσε το βίντεο",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 5b7fbaffd..6d3224e3d 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -102,9 +102,9 @@
   "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.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Write your warning here",
@@ -258,6 +258,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 886083392..b401e5bbe 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -4,19 +4,21 @@
   "account.badges.bot": "Roboto",
   "account.badges.group": "Grupo",
   "account.block": "Bloki @{name}",
-  "account.block_domain": "Kaŝi ĉion de {domain}",
+  "account.block_domain": "Bloki {domain}",
   "account.blocked": "Blokita",
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Nuligi peton de sekvado",
   "account.direct": "Rekte mesaĝi @{name}",
-  "account.domain_blocked": "Domajno kaŝita",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
+  "account.domain_blocked": "Domajno blokita",
   "account.edit_profile": "Redakti profilon",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Montri en profilo",
   "account.follow": "Sekvi",
   "account.followers": "Sekvantoj",
   "account.followers.empty": "Ankoraŭ neniu sekvas tiun uzanton.",
   "account.followers_counter": "{count, plural, one{{counter} Sekvanto} other {{counter} Sekvantoj}}",
-  "account.following_counter": "{count, plural, other{{counter} Sekvi}}",
+  "account.following_counter": "{count, plural, one {{counter} Sekvato} other {{counter} Sekvatoj}}",
   "account.follows.empty": "Tiu uzanto ankoraŭ ne sekvas iun.",
   "account.follows_you": "Sekvas vin",
   "account.hide_reblogs": "Kaŝi diskonigojn de @{name}",
@@ -36,14 +38,14 @@
   "account.requested": "Atendo de aprobo. Alklaku por nuligi peton de sekvado",
   "account.share": "Diskonigi la profilon de @{name}",
   "account.show_reblogs": "Montri diskonigojn de @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Tooto} other {{counter} Tootoj}}",
+  "account.statuses_counter": "{count, plural, one {{counter} Mesaĝo} other {{counter} Mesaĝoj}}",
   "account.unblock": "Malbloki @{name}",
-  "account.unblock_domain": "Malkaŝi {domain}",
+  "account.unblock_domain": "Malbloki {domain}",
   "account.unendorse": "Ne montri en profilo",
   "account.unfollow": "Ne plu sekvi",
   "account.unmute": "Malsilentigi @{name}",
   "account.unmute_notifications": "Malsilentigi sciigojn de @{name}",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "Alklaku por aldoni noton",
   "alert.rate_limited.message": "Bonvolu reprovi post {retry_time, time, medium}.",
   "alert.rate_limited.title": "Mesaĝkvante limigita",
   "alert.unexpected.message": "Neatendita eraro okazis.",
@@ -62,7 +64,7 @@
   "column.community": "Loka tempolinio",
   "column.direct": "Rektaj mesaĝoj",
   "column.directory": "Trarigardi profilojn",
-  "column.domain_blocks": "Kaŝitaj domajnoj",
+  "column.domain_blocks": "Blokitaj domajnoj",
   "column.favourites": "Stelumoj",
   "column.follow_requests": "Petoj de sekvado",
   "column.home": "Hejmo",
@@ -110,7 +112,7 @@
   "confirmations.delete.message": "Ĉu vi certas, ke vi volas forigi ĉi tiun mesaĝon?",
   "confirmations.delete_list.confirm": "Forigi",
   "confirmations.delete_list.message": "Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston?",
-  "confirmations.domain_block.confirm": "Kaŝi la tutan domajnon",
+  "confirmations.domain_block.confirm": "Bloki la tutan domajnon",
   "confirmations.domain_block.message": "Ĉu vi vere, vere certas, ke vi volas tute bloki {domain}? Plej ofte, trafa blokado kaj silentigado sufiĉas kaj preferindas. Vi ne vidos enhavon de tiu domajno en publika tempolinio aŭ en viaj sciigoj. Viaj sekvantoj de tiu domajno estos forigitaj.",
   "confirmations.logout.confirm": "Elsaluti",
   "confirmations.logout.message": "Ĉu vi certas ke vi volas elsaluti?",
@@ -166,12 +168,14 @@
   "empty_column.notifications": "Vi ankoraŭ ne havas sciigojn. Interagu kun aliaj por komenci konversacion.",
   "empty_column.public": "Estas nenio ĉi tie! Publike skribu ion, aŭ mane sekvu uzantojn de aliaj serviloj por plenigi la publikan tempolinion",
   "error.unexpected_crash.explanation": "Pro eraro en nia kodo, aŭ problemo de kongruo en via retumilo, ĉi tiu paĝo ne povis esti montrata ĝuste.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Provu refreŝigi la paĝon. Se tio ne helpas, vi ankoraŭ povus uzi Mastodon per malsama retumilo aŭ operaciuma aplikajo.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Kopii stakspuron en tondujo",
   "errors.unexpected_crash.report_issue": "Raporti problemon",
   "follow_request.authorize": "Rajtigi",
   "follow_request.reject": "Rifuzi",
-  "follow_requests.unlocked_explanation": "137/5000\nKvankam via konto ne estas ŝlosita, la dungitaro de {domain} opiniis, ke vi eble volus revizii petojn de sekvadon el ĉi tiuj kontoj permane.",
+  "follow_requests.unlocked_explanation": "Kvankam via konto ne estas ŝlosita, la dungitaro de {domain} opiniis, ke vi eble volus revizii petojn de sekvadon el ĉi tiuj kontoj permane.",
   "generic.saved": "Konservita",
   "getting_started.developers": "Programistoj",
   "getting_started.directory": "Profilujo",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "malenfokusigi la tekstujon aŭ la serĉilon",
   "keyboard_shortcuts.up": "iri supren en la listo",
   "lightbox.close": "Fermi",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Sekva",
   "lightbox.previous": "Antaŭa",
   "lightbox.view_context": "Vidi kuntekston",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Ŝanĝi titolon",
   "lists.new.create": "Aldoni liston",
   "lists.new.title_placeholder": "Titolo de la nova listo",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Serĉi inter la homoj, kiujn vi sekvas",
   "lists.subheading": "Viaj listoj",
   "load_pending": "{count,plural, one {# nova elemento} other {# novaj elementoj}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Baskuligi videblecon",
   "missing_indicator.label": "Ne trovita",
   "missing_indicator.sublabel": "Ĉi tiu elemento ne estis trovita",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Ĉu vi volas kaŝi la sciigojn de ĉi tiu uzanto?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Telefonaj aplikaĵoj",
   "navigation_bar.blocks": "Blokitaj uzantoj",
   "navigation_bar.bookmarks": "Legosignoj",
@@ -275,7 +287,7 @@
   "navigation_bar.compose": "Skribi novan mesaĝon",
   "navigation_bar.direct": "Rektaj mesaĝoj",
   "navigation_bar.discover": "Esplori",
-  "navigation_bar.domain_blocks": "Kaŝitaj domajnoj",
+  "navigation_bar.domain_blocks": "Blokitaj domajnoj",
   "navigation_bar.edit_profile": "Redakti profilon",
   "navigation_bar.favourites": "Stelumoj",
   "navigation_bar.filters": "Silentigitaj vortoj",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Via balotenketo finiĝitis",
   "notification.poll": "Partoprenita balotenketo finiĝis",
   "notification.reblog": "{name} diskonigis vian mesaĝon",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Forviŝi sciigojn",
   "notifications.clear_confirmation": "Ĉu vi certas, ke vi volas porĉiame forviŝi ĉiujn viajn sciigojn?",
   "notifications.column_settings.alert": "Retumilaj sciigoj",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Diskonigoj:",
   "notifications.column_settings.show": "Montri en kolumno",
   "notifications.column_settings.sound": "Eligi sonon",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Ĉiuj",
   "notifications.filter.boosts": "Diskonigoj",
   "notifications.filter.favourites": "Stelumoj",
   "notifications.filter.follows": "Sekvoj",
   "notifications.filter.mentions": "Mencioj",
   "notifications.filter.polls": "Balotenketaj rezultoj",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} sciigoj",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Finita",
   "poll.refresh": "Aktualigi",
   "poll.total_people": "{count, plural, one {# homo} other {# homoj}}",
@@ -422,7 +444,7 @@
   "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
   "timeline_hint.resources.followers": "Sekvantoj",
   "timeline_hint.resources.follows": "Sekvatoj",
-  "timeline_hint.resources.statuses": "Pli malnovaj tootoj",
+  "timeline_hint.resources.statuses": "Pli malnovaj mesaĝoj",
   "trends.counter_by_accounts": "{count, plural, one {{counter} persono} other {{counter} personoj}} parolante",
   "trends.trending_now": "Nunaj furoraĵoj",
   "ui.beforeunload": "Via malneto perdiĝos se vi eliras de Mastodon.",
@@ -441,11 +463,12 @@
   "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.choose_image": "Choose image",
+  "upload_modal.choose_image": "Elekti bildon",
   "upload_modal.description_placeholder": "Laŭ Ludoviko Zamenhof bongustas freŝa ĉeĥa manĝaĵo kun spicoj",
   "upload_modal.detect_text": "Detekti tekston de la bildo",
   "upload_modal.edit_media": "Redakti aŭdovidaĵon",
   "upload_modal.hint": "Klaku aŭ trenu la cirklon en la antaŭvidilo por elekti la fokuspunkton kiu ĉiam videblos en ĉiuj etigitaj bildoj.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Antaŭvido ({ratio})",
   "upload_progress.label": "Alŝutado…",
   "video.close": "Fermi la videon",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index fda386455..57115404b 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -1,16 +1,18 @@
 {
-  "account.account_note_header": "Tu nota para @{name}",
+  "account.account_note_header": "Nota",
   "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.block_domain": "Bloquear dominio {domain}",
   "account.blocked": "Bloqueado",
   "account.browse_more_on_origin_server": "Explorar más en el perfil original",
   "account.cancel_follow_request": "Cancelar la solicitud de seguimiento",
   "account.direct": "Mensaje directo a @{name}",
-  "account.domain_blocked": "Dominio oculto",
+  "account.disable_notifications": "Dejar de notificarme cuando @{name} tootee",
+  "account.domain_blocked": "Dominio bloqueado",
   "account.edit_profile": "Editar perfil",
+  "account.enable_notifications": "Notificarme cuando @{name} tootee",
   "account.endorse": "Destacar en el perfil",
   "account.follow": "Seguir",
   "account.followers": "Seguidores",
@@ -25,27 +27,27 @@
   "account.locked_info": "El estado de privacidad de esta cuenta está establecido como bloqueado. El propietario manualmente revisa quién puede seguirle.",
   "account.media": "Medios",
   "account.mention": "Mencionar a @{name}",
-  "account.moved_to": "{name} se ha muó a:",
+  "account.moved_to": "{name} se ha mudó a:",
   "account.mute": "Silenciar a @{name}",
   "account.mute_notifications": "Silenciar notificaciones de @{name}",
   "account.muted": "Silenciado",
   "account.never_active": "Nunca",
   "account.posts": "Toots",
-  "account.posts_with_replies": "Toots con respuestas",
+  "account.posts_with_replies": "Toots y respuestas",
   "account.report": "Denunciar a @{name}",
-  "account.requested": "Esperando aprobación. Hacé clic para cancelar la solicitud de seguimiento.",
+  "account.requested": "Esperando aprobación. Hacé clic para cancelar la solicitud de seguimiento",
   "account.share": "Compartir el perfil de @{name}",
   "account.show_reblogs": "Mostrar retoots de @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
   "account.unblock": "Desbloquear a @{name}",
-  "account.unblock_domain": "Mostrar {domain}",
+  "account.unblock_domain": "Desbloquear dominio {domain}",
   "account.unendorse": "No destacar en el perfil",
   "account.unfollow": "Dejar de seguir",
   "account.unmute": "Dejar de silenciar a @{name}",
   "account.unmute_notifications": "Dejar de silenciar las notificaciones de @{name}",
-  "account_note.placeholder": "No se ofreció ningún comentario",
+  "account_note.placeholder": "Hacé clic par agregar una nota",
   "alert.rate_limited.message": "Por favor, reintentá después de las {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Tarifa limitada",
+  "alert.rate_limited.title": "Acción limitada",
   "alert.unexpected.message": "Ocurrió un error.",
   "alert.unexpected.title": "¡Epa!",
   "announcement.announcement": "Anuncio",
@@ -62,7 +64,7 @@
   "column.community": "Línea temporal local",
   "column.direct": "Mensajes directos",
   "column.directory": "Explorar perfiles",
-  "column.domain_blocks": "Dominios ocultos",
+  "column.domain_blocks": "Dominios bloqueados",
   "column.favourites": "Favoritos",
   "column.follow_requests": "Solicitudes de seguimiento",
   "column.home": "Principal",
@@ -85,19 +87,19 @@
   "compose_form.direct_message_warning": "Este toot sólo será enviado a los usuarios mencionados.",
   "compose_form.direct_message_warning_learn_more": "Aprendé más",
   "compose_form.hashtag_warning": "Este toot no se mostrará bajo hashtags porque no es público. Sólo los toots públicos se pueden buscar por hashtag.",
-  "compose_form.lock_disclaimer": "Tu cuenta no está {locked}. Todos pueden seguirte para ver tus toots marcados como \"sólo para seguidores\".",
+  "compose_form.lock_disclaimer": "Tu cuenta no está {locked}. Todos pueden seguirte para ver tus toots marcados como \"Sólo para seguidores\".",
   "compose_form.lock_disclaimer.lock": "bloqueada",
   "compose_form.placeholder": "¿Qué onda?",
   "compose_form.poll.add_option": "Agregá una opción",
   "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.remove_option": "Quitar esta opción",
   "compose_form.poll.switch_to_multiple": "Cambiar encuesta para permitir opciones múltiples",
   "compose_form.poll.switch_to_single": "Cambiar encuesta para permitir una sola opción",
   "compose_form.publish": "Tootear",
   "compose_form.publish_loud": "¡{publish}!",
   "compose_form.sensitive.hide": "Marcar medio como sensible",
-  "compose_form.sensitive.marked": "El medio se marcó como sensible",
+  "compose_form.sensitive.marked": "{count, plural, one {El medio está marcado como sensible} other {Los medios están marcados como sensibles}}",
   "compose_form.sensitive.unmarked": "El medio no está marcado como sensible",
   "compose_form.spoiler.marked": "El texto está oculto detrás de la advertencia",
   "compose_form.spoiler.unmarked": "El texto no está oculto",
@@ -107,10 +109,10 @@
   "confirmations.block.confirm": "Bloquear",
   "confirmations.block.message": "¿Estás seguro que querés bloquear a {name}?",
   "confirmations.delete.confirm": "Eliminar",
-  "confirmations.delete.message": "¿Estás seguro que querés eliminar este estado?",
+  "confirmations.delete.message": "¿Estás seguro que querés eliminar este toot?",
   "confirmations.delete_list.confirm": "Eliminar",
   "confirmations.delete_list.message": "¿Estás seguro que querés eliminar permanentemente esta lista?",
-  "confirmations.domain_block.confirm": "Ocultar dominio entero",
+  "confirmations.domain_block.confirm": "Bloquear dominio entero",
   "confirmations.domain_block.message": "¿Estás completamente seguro que querés bloquear el {domain} entero? En la mayoría de los casos, unos cuantos bloqueos y silenciados puntuales son suficientes y preferibles. No vas a ver contenido de ese dominio en ninguna de tus líneas temporales o en tus notificaciones. Tus seguidores de ese dominio serán quitados.",
   "confirmations.logout.confirm": "Cerrar sesión",
   "confirmations.logout.message": "¿Estás seguro que querés cerrar la sesión?",
@@ -118,19 +120,19 @@
   "confirmations.mute.explanation": "Se ocultarán los mensajes de esta cuenta y los mensajes de otras cuentas que mencionen a ésta, pero todavía esta cuenta podrá ver tus mensajes o seguirte.",
   "confirmations.mute.message": "¿Estás seguro que querés silenciar a {name}?",
   "confirmations.redraft.confirm": "Eliminar toot original y editarlo",
-  "confirmations.redraft.message": "¿Estás seguro que querés eliminar este estado y volver a editarlo? Se perderán las veces marcadas como favoritos y los retoots, y las respuestas a la publicación original quedarán huérfanas.",
+  "confirmations.redraft.message": "¿Estás seguro que querés eliminar este toot y volver a editarlo? Se perderán las veces marcadas como favoritos y los retoots, y las respuestas a la publicación original quedarán huérfanas.",
   "confirmations.reply.confirm": "Responder",
   "confirmations.reply.message": "Responder ahora sobreescribirá el mensaje que estás redactando actualmente. ¿Estás seguro que querés seguir?",
   "confirmations.unfollow.confirm": "Dejar de seguir",
   "confirmations.unfollow.message": "¿Estás seguro que querés dejar de seguir a {name}?",
   "conversation.delete": "Eliminar conversación",
-  "conversation.mark_as_read": "Marcar como leído",
+  "conversation.mark_as_read": "Marcar como leída",
   "conversation.open": "Ver conversación",
   "conversation.with": "Con {names}",
   "directory.federated": "Desde fediverso conocido",
   "directory.local": "Sólo de {domain}",
   "directory.new_arrivals": "Recién llegados",
-  "directory.recently_active": "Recientemente activo",
+  "directory.recently_active": "Recientemente activos",
   "embed.instructions": "Insertá este toot a tu sitio web copiando el código de abajo.",
   "embed.preview": "Así es cómo se verá:",
   "emoji_button.activity": "Actividad",
@@ -143,17 +145,17 @@
   "emoji_button.objects": "Objetos",
   "emoji_button.people": "Gente",
   "emoji_button.recent": "Usados frecuentemente",
-  "emoji_button.search": "Buscar…",
+  "emoji_button.search": "Buscar...",
   "emoji_button.search_results": "Resultados de búsqueda",
   "emoji_button.symbols": "Símbolos",
   "emoji_button.travel": "Viajes y lugares",
-  "empty_column.account_timeline": "¡No hay toots aquí!",
+  "empty_column.account_timeline": "¡No hay toots acá!",
   "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.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.",
+  "empty_column.domain_blocks": "Todavía no hay dominios bloqueados.",
   "empty_column.favourited_statuses": "Todavía no tenés toots favoritos. Cuando marqués uno como favorito, se mostrará acá.",
   "empty_column.favourites": "Todavía nadie marcó este toot como favorito. Cuando alguien lo haga, se mostrará acá.",
   "empty_column.follow_requests": "Todavía no tenés ninguna solicitud de seguimiento. Cuando recibás una, se mostrará acá.",
@@ -161,12 +163,14 @@
   "empty_column.home": "¡Tu línea temporal principal está vacía! Visitá {public} o usá la búsqueda para comenzar y encontrar a otros usuarios.",
   "empty_column.home.public_timeline": "la línea temporal pública",
   "empty_column.list": "Todavía no hay nada en esta lista. Cuando miembros de esta lista envíen nuevos toots, se mostrarán acá.",
-  "empty_column.lists": "Todavía no tienes ninguna lista. Cuando creés una, se mostrará acá.",
+  "empty_column.lists": "Todavía no tenés ninguna lista. Cuando creés una, se mostrará acá.",
   "empty_column.mutes": "Todavía no silenciaste a ningún usuario.",
   "empty_column.notifications": "Todavía no tenés ninguna notificación. Interactuá con otros para iniciar la conversación.",
-  "empty_column.public": "¡Naranja! Escribí algo públicamente, o seguí usuarios manualmente de otros servidores para ir llenando esta línea temporal.",
+  "empty_column.public": "¡Naranja! Escribí algo públicamente, o seguí usuarios manualmente de otros servidores para ir llenando esta línea temporal",
   "error.unexpected_crash.explanation": "Debido a un error en nuestro código o a un problema de compatibilidad con el navegador web, esta página no se pudo mostrar correctamente.",
+  "error.unexpected_crash.explanation_addons": "No se pudo mostrar correctamente esta página. Este error probablemente es causado por un complemento del navegador web o por herramientas de traducción automática.",
   "error.unexpected_crash.next_steps": "Intentá recargar la página. Si eso no ayuda, podés usar Mastodon a través de un navegador web diferente o aplicación nativa.",
+  "error.unexpected_crash.next_steps_addons": "Intentá deshabilitarlos y recargá la página. Si eso no ayuda, podés usar Mastodon a través de un navegador web diferente o aplicación nativa.",
   "errors.unexpected_crash.copy_stacktrace": "Copiar stacktrace al portapapeles",
   "errors.unexpected_crash.report_issue": "Informar problema",
   "follow_request.authorize": "Autorizar",
@@ -177,9 +181,9 @@
   "getting_started.directory": "Directorio de perfiles",
   "getting_started.documentation": "Documentación",
   "getting_started.heading": "Introducción",
-  "getting_started.invite": "Invitar usuarios",
+  "getting_started.invite": "Invitar gente",
   "getting_started.open_source_notice": "Mastodon es software libre. Podés contribuir o informar errores en {github}.",
-  "getting_started.security": "Seguridad",
+  "getting_started.security": "Configuración de la cuenta",
   "getting_started.terms": "Términos del servicio",
   "hashtag.column_header.tag_mode.all": "y {additional}",
   "hashtag.column_header.tag_mode.any": "o {additional}",
@@ -199,31 +203,31 @@
   "intervals.full.hours": "{number, plural, one {# hora} other {# horas}}",
   "intervals.full.minutes": "{number, plural, one {# minuto} other {# minutos}}",
   "introduction.federation.action": "Siguiente",
-  "introduction.federation.federated.headline": "Federado",
+  "introduction.federation.federated.headline": "Federada",
   "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ís aparecerán en tu línea temporal principal. ¡Podés seguir a cualquiera en cualquier servidor!",
+  "introduction.federation.home.text": "Los toots de las cuentas 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.federation.local.text": "Los toots públicos de las cuentas en el mismo servidor aparecerán en la línea temporal local.",
   "introduction.interactions.action": "¡Terminar tutorial!",
-  "introduction.interactions.favourite.headline": "Favorito",
+  "introduction.interactions.favourite.headline": "Favoritos",
   "introduction.interactions.favourite.text": "Podés guardar un toot para más tarde, y hacerle saber al autor que te gustó, marcándolo como favorito.",
   "introduction.interactions.reblog.headline": "Retootear",
-  "introduction.interactions.reblog.text": "Podés compartir los toots de otras personas con tus seguidores retooteando los mismos.",
+  "introduction.interactions.reblog.text": "Podés compartir los toots de otras cuentas con tus seguidores retooteando los mismos.",
   "introduction.interactions.reply.headline": "Responder",
-  "introduction.interactions.reply.text": "Podés responder a tus propios toots y los de otras personas, que se encadenarán juntos en una conversación.",
+  "introduction.interactions.reply.text": "Podés responder a tus propios toots y los de otras cuentas, que se encadenarán juntos en una conversación.",
   "introduction.welcome.action": "¡Dale!",
   "introduction.welcome.headline": "Primeros pasos",
   "introduction.welcome.text": "¡Bienvenido al fediverso! En unos pocos minutos, vas a poder transmitir mensajes y hablar con tus amigos a través de una amplia variedad de servidores. Pero este servidor, {domain}, es especial: aloja tu perfil, así que acordate de su nombre.",
   "keyboard_shortcuts.back": "para volver",
   "keyboard_shortcuts.blocked": "para abrir la lista de usuarios bloqueados",
   "keyboard_shortcuts.boost": "para retootear",
-  "keyboard_shortcuts.column": "para enfocar un estado en una de las columnas",
+  "keyboard_shortcuts.column": "para enfocar un toot en una de las columnas",
   "keyboard_shortcuts.compose": "para enfocar el área de texto de redacción",
   "keyboard_shortcuts.description": "Descripción",
   "keyboard_shortcuts.direct": "para abrir columna de mensajes directos",
   "keyboard_shortcuts.down": "para bajar en la lista",
-  "keyboard_shortcuts.enter": "para abrir el estado",
+  "keyboard_shortcuts.enter": "para abrir el toot",
   "keyboard_shortcuts.favourite": "para marcar como favorito",
   "keyboard_shortcuts.favourites": "para abrir la lista de favoritos",
   "keyboard_shortcuts.federated": "para abrir la línea temporal federada",
@@ -233,11 +237,11 @@
   "keyboard_shortcuts.legend": "para mostrar este texto",
   "keyboard_shortcuts.local": "para abrir la línea temporal local",
   "keyboard_shortcuts.mention": "para mencionar al autor",
-  "keyboard_shortcuts.muted": "abrir la lista de usuarios silenciados",
+  "keyboard_shortcuts.muted": "para 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.open_media": "para abrir los archivos de medios",
+  "keyboard_shortcuts.pinned": "para abrir la lista de toots fijados",
   "keyboard_shortcuts.profile": "para abrir el perfil del autor",
   "keyboard_shortcuts.reply": "para responder",
   "keyboard_shortcuts.requests": "para abrir la lista de solicitudes de seguimiento",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "para quitar el enfoque del área de texto de redacción o de búsqueda",
   "keyboard_shortcuts.up": "para subir en la lista",
   "lightbox.close": "Cerrar",
+  "lightbox.compress": "Comprimir cuadro de vista de imagen",
+  "lightbox.expand": "Expandir cuadro de vista de imagen",
   "lightbox.next": "Siguiente",
   "lightbox.previous": "Anterior",
   "lightbox.view_context": "Ver contexto",
@@ -260,14 +266,20 @@
   "lists.edit.submit": "Cambiar título",
   "lists.new.create": "Agregar lista",
   "lists.new.title_placeholder": "Nuevo título de lista",
+  "lists.replies_policy.all_replies": "Cualquier cuenta seguida",
+  "lists.replies_policy.list_replies": "Miembros de la lista",
+  "lists.replies_policy.no_replies": "Nadie",
+  "lists.replies_policy.title": "Mostrar respuestas a:",
   "lists.search": "Buscar entre la gente que seguís",
   "lists.subheading": "Tus listas",
   "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}",
-  "loading_indicator.label": "Cargando…",
-  "media_gallery.toggle_visible": "Cambiar visibilidad",
+  "loading_indicator.label": "Cargando...",
+  "media_gallery.toggle_visible": "Ocultar {number, plural, one {imagen} other {imágenes}}",
   "missing_indicator.label": "No se encontró",
   "missing_indicator.sublabel": "No se encontró este recurso",
+  "mute_modal.duration": "Duración",
   "mute_modal.hide_notifications": "¿Querés ocultar las notificaciones de este usuario?",
+  "mute_modal.indefinite": "Indefinida",
   "navigation_bar.apps": "Aplicaciones móviles",
   "navigation_bar.blocks": "Usuarios bloqueados",
   "navigation_bar.bookmarks": "Marcadores",
@@ -275,12 +287,12 @@
   "navigation_bar.compose": "Redactar un nuevo toot",
   "navigation_bar.direct": "Mensajes directos",
   "navigation_bar.discover": "Descubrir",
-  "navigation_bar.domain_blocks": "Dominios ocultos",
+  "navigation_bar.domain_blocks": "Dominios bloqueados",
   "navigation_bar.edit_profile": "Editar perfil",
   "navigation_bar.favourites": "Favoritos",
   "navigation_bar.filters": "Palabras silenciadas",
   "navigation_bar.follow_requests": "Solicitudes de seguimiento",
-  "navigation_bar.follows_and_followers": "Personas seguidas y seguidores",
+  "navigation_bar.follows_and_followers": "Cuentas seguidas y seguidores",
   "navigation_bar.info": "Acerca de este servidor",
   "navigation_bar.keyboard_shortcuts": "Atajos",
   "navigation_bar.lists": "Listas",
@@ -291,13 +303,14 @@
   "navigation_bar.preferences": "Configuración",
   "navigation_bar.public_timeline": "Línea temporal federada",
   "navigation_bar.security": "Seguridad",
-  "notification.favourite": "{name} marcó tu estado como favorito",
+  "notification.favourite": "{name} marcó tu toot 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",
+  "notification.status": "{name} acaba de tootear",
   "notifications.clear": "Limpiar notificaciones",
   "notifications.clear_confirmation": "¿Estás seguro que querés limpiar todas tus notificaciones permanentemente?",
   "notifications.column_settings.alert": "Notificaciones de escritorio",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Retoots:",
   "notifications.column_settings.show": "Mostrar en columna",
   "notifications.column_settings.sound": "Reproducir sonido",
+  "notifications.column_settings.status": "Nuevos toots:",
   "notifications.filter.all": "Todas",
   "notifications.filter.boosts": "Retoots",
   "notifications.filter.favourites": "Favoritos",
   "notifications.filter.follows": "Seguidores",
   "notifications.filter.mentions": "Menciones",
-  "notifications.filter.polls": "Resultados de la encuesta",
+  "notifications.filter.polls": "Resultados de encuesta",
+  "notifications.filter.statuses": "Actualizaciones de cuentas que seguís",
   "notifications.group": "{count} notificaciones",
+  "notifications.mark_as_read": "Marcar cada notificación como leída",
+  "notifications.permission_denied": "Las notificaciones de escritorio no están disponibles, debido a una solicitud de permiso del navegador web previamente denegada",
+  "notifications.permission_denied_alert": "No se pueden habilitar las notificaciones de escritorio, ya que el permiso del navegador fue denegado antes",
+  "notifications_permission_banner.enable": "Habilitar notificaciones de escritorio",
+  "notifications_permission_banner.how_to_control": "Para recibir notificaciones cuando Mastodon no está abierto, habilitá las notificaciones de escritorio. Podés controlar con precisión qué tipos de interacciones generan notificaciones de escritorio a través del botón {icon} de arriba, una vez que estén habilitadas.",
+  "notifications_permission_banner.title": "No te pierdas nada",
+  "picture_in_picture.restore": "Restaurar",
   "poll.closed": "Cerrada",
   "poll.refresh": "Refrescar",
   "poll.total_people": "{count, plural, one {# persona} other {# personas}}",
@@ -328,14 +350,14 @@
   "poll.voted": "Votaste esta opción",
   "poll_button.add_poll": "Agregar una encuesta",
   "poll_button.remove_poll": "Quitar encuesta",
-  "privacy.change": "Configurar privacidad de estado",
-  "privacy.direct.long": "Enviar toot sólo a los usuarios mencionados",
+  "privacy.change": "Configurar privacidad de toot",
+  "privacy.direct.long": "Visible sólo a los usuarios mencionados",
   "privacy.direct.short": "Directo",
-  "privacy.private.long": "Enviar toot sólo a los seguidores",
+  "privacy.private.long": "Visible sólo a los seguidores",
   "privacy.private.short": "Sólo a seguidores",
-  "privacy.public.long": "Enviar toot a las líneas temporales públicas",
+  "privacy.public.long": "Visible para todos, mostrado en las líneas temporales públicas",
   "privacy.public.short": "Público",
-  "privacy.unlisted.long": "No enviar toot a las líneas temporales públicas",
+  "privacy.unlisted.long": "Visible para todos, pero no en las líneas temporales públicas",
   "privacy.unlisted.short": "No listado",
   "refresh": "Refrescar",
   "regeneration_indicator.label": "Cargando…",
@@ -355,28 +377,28 @@
   "report.target": "Denunciando a {target}",
   "search.placeholder": "Buscar",
   "search_popout.search_format": "Formato de búsqueda avanzada",
-  "search_popout.tips.full_text": "Las búsquedas de texto simple devuelven los estados que escribiste, los marcados como favoritos, los retooteados o en los que te mencionaron, así como nombres usuarios, nombres mostrados y etiquetas.",
+  "search_popout.tips.full_text": "Las búsquedas de texto simple devuelven los toots que escribiste, los marcados como favoritos, los retooteados o en los que te mencionaron, así como nombres de usuarios, nombres mostrados y etiquetas.",
   "search_popout.tips.hashtag": "etiqueta",
-  "search_popout.tips.status": "estado",
+  "search_popout.tips.status": "toot",
   "search_popout.tips.text": "Las búsquedas de texto simple devuelven nombres de usuarios, nombres mostrados y etiquetas que coincidan",
   "search_popout.tips.user": "usuario",
   "search_results.accounts": "Gente",
   "search_results.hashtags": "Etiquetas",
   "search_results.statuses": "Toots",
-  "search_results.statuses_fts_disabled": "No se puede buscar toots por contenido en este servidor de Mastodon.",
+  "search_results.statuses_fts_disabled": "No se pueden buscar toots por contenido en este servidor de 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 en la interface de moderación",
+  "status.admin_status": "Abrir este toot en la interface de moderación",
   "status.block": "Bloquear a @{name}",
-  "status.bookmark": "Marcador",
+  "status.bookmark": "Marcar",
   "status.cancel_reblog_private": "Quitar retoot",
   "status.cannot_reblog": "No se puede retootear este toot",
-  "status.copy": "Copiar enlace al estado",
+  "status.copy": "Copiar enlace al toot",
   "status.delete": "Eliminar",
   "status.detailed_status": "Vista de conversación detallada",
   "status.direct": "Mensaje directo a @{name}",
   "status.embed": "Insertar",
-  "status.favourite": "Favorito",
+  "status.favourite": "Marcar como favorito",
   "status.filtered": "Filtrado",
   "status.load_more": "Cargar más",
   "status.media_hidden": "Medios ocultos",
@@ -384,10 +406,10 @@
   "status.more": "Más",
   "status.mute": "Silenciar a @{name}",
   "status.mute_conversation": "Silenciar conversación",
-  "status.open": "Expandir este estado",
+  "status.open": "Expandir este toot",
   "status.pin": "Fijar en el perfil",
   "status.pinned": "Toot fijado",
-  "status.read_more": "Leer más",
+  "status.read_more": "Leé más",
   "status.reblog": "Retootear",
   "status.reblog_private": "Retootear a la audiencia original",
   "status.reblogged_by": "{name} retooteó",
@@ -409,7 +431,7 @@
   "status.unpin": "Dejar de fijar",
   "suggestions.dismiss": "Descartar sugerencia",
   "suggestions.header": "Es posible que te interese…",
-  "tabs_bar.federated_timeline": "Federado",
+  "tabs_bar.federated_timeline": "Federada",
   "tabs_bar.home": "Principal",
   "tabs_bar.local_timeline": "Local",
   "tabs_bar.notifications": "Notificaciones",
@@ -430,15 +452,15 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}mil",
   "upload_area.title": "Para subir, arrastrá y soltá",
-  "upload_button.label": "Agregar medios ({formats})",
+  "upload_button.label": "Agregá imágenes o un archivo de audio o video",
   "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.audio_description": "Agregá una descripción para personas con dificultades auditivas",
+  "upload_form.description": "Agregá una descripción para personas con dificultades visuales",
   "upload_form.edit": "Editar",
   "upload_form.thumbnail": "Cambiar miniatura",
   "upload_form.undo": "Eliminar",
-  "upload_form.video_description": "Describir para personas con problemas auditivos o visuales",
+  "upload_form.video_description": "Agregá una descripción para personas con dificultades auditivas o visuales",
   "upload_modal.analyzing_picture": "Analizando imagen…",
   "upload_modal.apply": "Aplicar",
   "upload_modal.choose_image": "Elegir imagen",
@@ -446,12 +468,13 @@
   "upload_modal.detect_text": "Detectar texto de la imagen",
   "upload_modal.edit_media": "Editar medio",
   "upload_modal.hint": "Hacé clic o arrastrá el círculo en la previsualización para elegir el punto focal que siempre estará a la vista en todas las miniaturas.",
+  "upload_modal.preparing_ocr": "Preparando OCR…",
   "upload_modal.preview_label": "Previsualización ({ratio})",
-  "upload_progress.label": "Subiendo…",
+  "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.expand": "Expandir video",
   "video.fullscreen": "Pantalla completa",
   "video.hide": "Ocultar video",
   "video.mute": "Silenciar sonido",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 4949c0a75..43c717281 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Ver más en el perfil original",
   "account.cancel_follow_request": "Cancelar la solicitud de seguimiento",
   "account.direct": "Mensaje directo a @{name}",
+  "account.disable_notifications": "Dejar de notificarme cuando @{name} publique algo",
   "account.domain_blocked": "Dominio oculto",
   "account.edit_profile": "Editar perfil",
+  "account.enable_notifications": "Notificarme cuando @{name} publique algo",
   "account.endorse": "Mostrar en perfil",
   "account.follow": "Seguir",
   "account.followers": "Seguidores",
@@ -118,7 +120,7 @@
   "confirmations.mute.explanation": "Esto esconderá las publicaciones de ellos y en las que los has mencionado, pero les permitirá ver tus mensajes y seguirte.",
   "confirmations.mute.message": "¿Estás seguro de que quieres silenciar a {name}?",
   "confirmations.redraft.confirm": "Borrar y volver a borrador",
-  "confirmations.redraft.message": "Estás seguro de que quieres borrar este estado y volverlo a borrador? Perderás todas las respuestas, impulsos y favoritos asociados a él, y las respuestas a la publicación original quedarán huérfanos.",
+  "confirmations.redraft.message": "¿Estás seguro de que quieres eliminar este toot y convertirlo en borrador? Perderás todas las respuestas, retoots y favoritos asociados a él, y las respuestas a la publicación original quedarán huérfanas.",
   "confirmations.reply.confirm": "Responder",
   "confirmations.reply.message": "Responder sobrescribirá el mensaje que estás escribiendo. ¿Estás seguro de que deseas continuar?",
   "confirmations.unfollow.confirm": "Dejar de seguir",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "No tienes ninguna notificación aún. Interactúa con otros para empezar una conversación.",
   "empty_column.public": "¡No hay nada aquí! Escribe algo públicamente, o sigue usuarios de otras instancias manualmente para llenarlo",
   "error.unexpected_crash.explanation": "Debido a un error en nuestro código o a un problema de compatibilidad con el navegador, esta página no se ha podido mostrar correctamente.",
+  "error.unexpected_crash.explanation_addons": "No se pudo mostrar correctamente esta página. Este error probablemente fue causado por un complemento del navegador web o por herramientas de traducción automática.",
   "error.unexpected_crash.next_steps": "Intenta actualizar la página. Si eso no ayuda, es posible que puedas usar Mastodon a través de otro navegador o aplicación nativa.",
+  "error.unexpected_crash.next_steps_addons": "Intenta deshabilitarlos y recarga la página. Si eso no ayuda, podrías usar Mastodon a través de un navegador web diferente o aplicación nativa.",
   "errors.unexpected_crash.copy_stacktrace": "Copiar el seguimiento de pila en el portapapeles",
   "errors.unexpected_crash.report_issue": "Informar de un problema/error",
   "follow_request.authorize": "Autorizar",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "para retirar el foco de la caja de redacción/búsqueda",
   "keyboard_shortcuts.up": "para ir hacia arriba en la lista",
   "lightbox.close": "Cerrar",
+  "lightbox.compress": "Comprimir cuadro de visualización de imagen",
+  "lightbox.expand": "Expandir cuadro de visualización de imagen",
   "lightbox.next": "Siguiente",
   "lightbox.previous": "Anterior",
   "lightbox.view_context": "Ver contexto",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Cambiar título",
   "lists.new.create": "Añadir lista",
   "lists.new.title_placeholder": "Título de la nueva lista",
+  "lists.replies_policy.all_replies": "Cualquier usuario al que sigas",
+  "lists.replies_policy.list_replies": "Miembros de la lista",
+  "lists.replies_policy.no_replies": "Nadie",
+  "lists.replies_policy.title": "Mostrar respuestas a:",
   "lists.search": "Buscar entre la gente a la que sigues",
   "lists.subheading": "Tus listas",
   "load_pending": "{count, plural, one {# nuevo elemento} other {# nuevos elementos}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Cambiar visibilidad",
   "missing_indicator.label": "No encontrado",
   "missing_indicator.sublabel": "No se encontró este recurso",
+  "mute_modal.duration": "Duración",
   "mute_modal.hide_notifications": "Ocultar notificaciones de este usuario?",
+  "mute_modal.indefinite": "Indefinida",
   "navigation_bar.apps": "Aplicaciones móviles",
   "navigation_bar.blocks": "Usuarios bloqueados",
   "navigation_bar.bookmarks": "Marcadores",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} acaba de publicar",
   "notifications.clear": "Limpiar notificaciones",
   "notifications.clear_confirmation": "¿Seguro que quieres limpiar permanentemente todas tus notificaciones?",
   "notifications.column_settings.alert": "Notificaciones de escritorio",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Retoots:",
   "notifications.column_settings.show": "Mostrar en columna",
   "notifications.column_settings.sound": "Reproducir sonido",
+  "notifications.column_settings.status": "Nuevos toots:",
   "notifications.filter.all": "Todos",
   "notifications.filter.boosts": "Retoots",
   "notifications.filter.favourites": "Favoritos",
   "notifications.filter.follows": "Seguidores",
   "notifications.filter.mentions": "Menciones",
   "notifications.filter.polls": "Resultados de la votación",
+  "notifications.filter.statuses": "Actualizaciones de gente a la que sigues",
   "notifications.group": "{count} notificaciones",
+  "notifications.mark_as_read": "Marcar todas las notificaciones como leídas",
+  "notifications.permission_denied": "No se pueden habilitar las notificaciones de escritorio ya que se denegó el permiso.",
+  "notifications.permission_denied_alert": "No se pueden habilitar las notificaciones de escritorio, ya que el permiso del navegador fue denegado anteriormente",
+  "notifications_permission_banner.enable": "Habilitar notificaciones de escritorio",
+  "notifications_permission_banner.how_to_control": "Para recibir notificaciones cuando Mastodon no esté abierto, habilite las notificaciones de escritorio. Puedes controlar con precisión qué tipos de interacciones generan notificaciones de escritorio a través del botón {icon} de arriba una vez que estén habilitadas.",
+  "notifications_permission_banner.title": "Nunca te pierdas nada",
+  "picture_in_picture.restore": "Restaurar",
   "poll.closed": "Cerrada",
   "poll.refresh": "Actualizar",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -357,7 +379,7 @@
   "search_popout.search_format": "Formato de búsqueda avanzada",
   "search_popout.tips.full_text": "Búsquedas de texto recuperan posts que has escrito, marcado como favoritos, retooteado o en los que has sido mencionado, así como usuarios, nombres y hashtags.",
   "search_popout.tips.hashtag": "etiqueta",
-  "search_popout.tips.status": "estado",
+  "search_popout.tips.status": "toot",
   "search_popout.tips.text": "El texto simple devuelve correspondencias de nombre, usuario y hashtag",
   "search_popout.tips.user": "usuario",
   "search_results.accounts": "Gente",
@@ -369,7 +391,7 @@
   "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.cancel_reblog_private": "Eliminar retoot",
   "status.cannot_reblog": "Este toot no puede retootearse",
   "status.copy": "Copiar enlace al estado",
   "status.delete": "Borrar",
@@ -391,11 +413,11 @@
   "status.reblog": "Retootear",
   "status.reblog_private": "Implusar a la audiencia original",
   "status.reblogged_by": "Retooteado por {name}",
-  "status.reblogs.empty": "Nadie impulsó este toot todavía. Cuando alguien lo haga, aparecerá aqui.",
+  "status.reblogs.empty": "Nadie retooteó este toot todavía. Cuando alguien lo haga, aparecerá aquí.",
   "status.redraft": "Borrar y volver a borrador",
   "status.remove_bookmark": "Eliminar marcador",
   "status.reply": "Responder",
-  "status.replyAll": "Responder al hilván",
+  "status.replyAll": "Responder al hilo",
   "status.report": "Reportar",
   "status.sensitive_warning": "Contenido sensible",
   "status.share": "Compartir",
@@ -403,7 +425,7 @@
   "status.show_less_all": "Mostrar menos para todo",
   "status.show_more": "Mostrar más",
   "status.show_more_all": "Mostrar más para todo",
-  "status.show_thread": "Mostrar hilván",
+  "status.show_thread": "Mostrar hilo",
   "status.uncached_media_warning": "No disponible",
   "status.unmute_conversation": "Dejar de silenciar conversación",
   "status.unpin": "Dejar de fijar",
@@ -426,9 +448,9 @@
   "trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} personas}} hablando",
   "trends.trending_now": "Tendencia ahora",
   "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.",
-  "units.short.billion": "{count}MM",
+  "units.short.billion": "{count}B",
   "units.short.million": "{count}M",
-  "units.short.thousand": "{count}mil",
+  "units.short.thousand": "{count}K",
   "upload_area.title": "Arrastra y suelta para subir",
   "upload_button.label": "Subir multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Límite de subida de archivos excedido.",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detectar texto de la imagen",
   "upload_modal.edit_media": "Editar multimedia",
   "upload_modal.hint": "Haga clic o arrastre el círculo en la vista previa para elegir el punto focal que siempre estará a la vista en todas las miniaturas.",
+  "upload_modal.preparing_ocr": "Preparando OCR…",
   "upload_modal.preview_label": "Vista previa ({ratio})",
   "upload_progress.label": "Subiendo…",
   "video.close": "Cerrar video",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index 558fe38de..4e42fb999 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Tühista jälgimistaotlus",
   "account.direct": "Otsesõnum @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domeen peidetud",
   "account.edit_profile": "Muuda profiili",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Too profiilil esile",
   "account.follow": "Jälgi",
   "account.followers": "Jälgijad",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Teil ei ole veel teateid. Suhelge teistega alustamaks vestlust.",
   "empty_column.public": "Siin pole midagi! Kirjuta midagi avalikut või jälgi ise kasutajaid täitmaks seda ruumi",
   "error.unexpected_crash.explanation": "Meie poolse probleemi või veebilehitseja ühilduvus probleemi tõttu ei suutnud me Teile seda lehekülge korrektselt näidata.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Proovige lehekülge uuesti avada. Kui see ei aita, võite proovida kasutada Mastodoni mõne muu veebilehitseja või äppi kaudu.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Kopeeri stacktrace lõikelauale",
   "errors.unexpected_crash.report_issue": "Teavita veast",
   "follow_request.authorize": "Autoriseeri",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "tekstiala/otsingu koostamise mittefokuseerimiseks",
   "keyboard_shortcuts.up": "liikumaks nimistus üles",
   "lightbox.close": "Sulge",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Järgmine",
   "lightbox.previous": "Eelmine",
   "lightbox.view_context": "Vaata konteksti",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Muuda pealkiri",
   "lists.new.create": "Lisa nimistu",
   "lists.new.title_placeholder": "Uus nimistu pealkiri",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Otsi Teie poolt jälgitavate inimese hulgast",
   "lists.subheading": "Teie nimistud",
   "load_pending": "{count, plural, one {# uus kirje} other {# uut kirjet}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Lülita nähtavus",
   "missing_indicator.label": "Ei leitud",
   "missing_indicator.sublabel": "Seda ressurssi ei leitud",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Kas peita teated sellelt kasutajalt?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobiilrakendused",
   "navigation_bar.blocks": "Blokeeritud kasutajad",
   "navigation_bar.bookmarks": "Järjehoidjad",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Teie küsitlus on lõppenud",
   "notification.poll": "Küsitlus, milles osalesite, on lõppenud",
   "notification.reblog": "{name} upitas Teie staatust",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Puhasta teated",
   "notifications.clear_confirmation": "Olete kindel, et soovite püsivalt kõik oma teated eemaldada?",
   "notifications.column_settings.alert": "Töölauateated",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Upitused:",
   "notifications.column_settings.show": "Kuva tulbas",
   "notifications.column_settings.sound": "Mängi heli",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Kõik",
   "notifications.filter.boosts": "Upitused",
   "notifications.filter.favourites": "Lemmikud",
   "notifications.filter.follows": "Jälgib",
   "notifications.filter.mentions": "Mainimised",
   "notifications.filter.polls": "Küsitluse tulemused",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} teated",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Suletud",
   "poll.refresh": "Värskenda",
   "poll.total_people": "{count, plural,one {# inimene} other {# inimest}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Tuvasta teksti pildilt",
   "upload_modal.edit_media": "Muuda meediat",
   "upload_modal.hint": "Vajuta või tõmba ringi eelvaatel, et valida fookuspunkti, mis on alati nähtaval kõikidel eelvaadetel.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Eelvaade ({ratio})",
   "upload_progress.label": "Laeb üles....",
   "video.close": "Sulge video",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 09471ff2a..5139d83aa 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Ezeztatu jarraitzeko eskaria",
   "account.direct": "Mezu zuzena @{name}(r)i",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Ezkutatutako domeinua",
   "account.edit_profile": "Aldatu profila",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Nabarmendu profilean",
   "account.follow": "Jarraitu",
   "account.followers": "Jarraitzaileak",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Ez duzu jakinarazpenik oraindik. Jarri besteekin harremanetan elkarrizketa abiatzeko.",
   "empty_column.public": "Ez dago ezer hemen! Idatzi zerbait publikoki edo jarraitu eskuz beste zerbitzari batzuetako erabiltzaileak hau betetzen joateko",
   "error.unexpected_crash.explanation": "Gure kodean arazoren bat dela eta, edo nabigatzailearekin bateragarritasun arazoren bat dela eta, orri hau ezin izan da ongi bistaratu.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Saiatu orria berritzen. Horrek ez badu laguntzen, agian Mastodon erabiltzeko aukera duzu oraindik ere beste nabigatzaile bat edo aplikazio natibo bat erabilita.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Kopiatu irteera arbelera",
   "errors.unexpected_crash.report_issue": "Eman arazoaren berri",
   "follow_request.authorize": "Baimendu",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "testua konposatzeko area / bilaketatik fokua kentzea",
   "keyboard_shortcuts.up": "zerrendan gora mugitzea",
   "lightbox.close": "Itxi",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Hurrengoa",
   "lightbox.previous": "Aurrekoa",
   "lightbox.view_context": "Ikusi testuingurua",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Aldatu izenburua",
   "lists.new.create": "Gehitu zerrenda",
   "lists.new.title_placeholder": "Zerrenda berriaren izena",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Bilatu jarraitzen dituzun pertsonen artean",
   "lists.subheading": "Zure zerrendak",
   "load_pending": "{count, plural, one {eleentuberri #} other {# elementu berri}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Txandakatu ikusgaitasuna",
   "missing_indicator.label": "Ez aurkitua",
   "missing_indicator.sublabel": "Baliabide hau ezin izan da aurkitu",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Ezkutatu erabiltzaile honen jakinarazpenak?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mugikorrerako aplikazioak",
   "navigation_bar.blocks": "Blokeatutako erabiltzaileak",
   "navigation_bar.bookmarks": "Laster-markak",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Garbitu jakinarazpenak",
   "notifications.clear_confirmation": "Ziur zure jakinarazpen guztiak behin betirako garbitu nahi dituzula?",
   "notifications.column_settings.alert": "Mahaigaineko jakinarazpenak",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Bultzadak:",
   "notifications.column_settings.show": "Erakutsi zutabean",
   "notifications.column_settings.sound": "Jo soinua",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Denak",
   "notifications.filter.boosts": "Bultzadak",
   "notifications.filter.favourites": "Gogokoak",
   "notifications.filter.follows": "Jarraipenak",
   "notifications.filter.mentions": "Aipamenak",
   "notifications.filter.polls": "Inkestaren emaitza",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} jakinarazpen",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Itxita",
   "poll.refresh": "Berritu",
   "poll.total_people": "{count, plural, one {pertsona #} other {# pertsona}}",
@@ -446,6 +468,7 @@
   "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.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Aurreikusi ({ratio})",
   "upload_progress.label": "Igotzen...",
   "video.close": "Itxi bideoa",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 6685b2ccb..a38d21e1c 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -4,13 +4,15 @@
   "account.badges.bot": "ربات",
   "account.badges.group": "گروه",
   "account.block": "مسدودسازی @{name}",
-  "account.block_domain": "نهفتن همه چیز از {domain}",
+  "account.block_domain": "بستن دامنه {domain}",
   "account.blocked": "مسدود",
   "account.browse_more_on_origin_server": "مرور بیش‌تر روی نمایهٔ اصلی",
   "account.cancel_follow_request": "لغو درخواست پیگیری",
   "account.direct": "پیام خصوصی به @{name}",
-  "account.domain_blocked": "دامنهٔ نهفته",
+  "account.disable_notifications": "آگاهی به من هنگام فرستادن‌های @{name} پایان یابد",
+  "account.domain_blocked": "دامنه بسته شد",
   "account.edit_profile": "ویرایش نمایه",
+  "account.enable_notifications": "آگاهی هنگام ارسال‌های @{name}",
   "account.endorse": "معرّفی در نمایه",
   "account.follow": "پی بگیرید",
   "account.followers": "پی‌گیران",
@@ -38,7 +40,7 @@
   "account.show_reblogs": "نمایش بازبوق‌های @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} بوق} other {{counter} بوق}}",
   "account.unblock": "رفع انسداد @{name}",
-  "account.unblock_domain": "رفع نهفتن {domain}",
+  "account.unblock_domain": "گشودن دامنه {domain}",
   "account.unendorse": "معرّفی نکردن در نمایه",
   "account.unfollow": "پایان پیگیری",
   "account.unmute": "رفع خموشی @{name}",
@@ -62,7 +64,7 @@
   "column.community": "نوشته‌های محلی",
   "column.direct": "پیام‌های خصوصی",
   "column.directory": "مرور نمایه‌ها",
-  "column.domain_blocks": "دامنه‌های نهفته",
+  "column.domain_blocks": "دامنه‌های بسته",
   "column.favourites": "پسندیده‌ها",
   "column.follow_requests": "درخواست‌های پیگیری",
   "column.home": "خانه",
@@ -96,7 +98,7 @@
   "compose_form.poll.switch_to_single": "تبدیل به نظرسنجی تک‌گزینه‌ای",
   "compose_form.publish": "بوق",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "علامت‌گذاری به عنوان حساس",
+  "compose_form.sensitive.hide": "علامت‌گذاری رسانه به عنوان حساس",
   "compose_form.sensitive.marked": "رسانه به عنوان حساس علامت‌گذاری شده",
   "compose_form.sensitive.unmarked": "رسانه به عنوان حساس علامت‌گذاری نشده",
   "compose_form.spoiler.marked": "نوشته پشت هشدار پنهان است",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "هنوز هیچ اعلانی ندارید. به دیگران واکنش نشان دهید تا گفتگو آغاز شود.",
   "empty_column.public": "این‌جا هنوز چیزی نیست! خودتان چیزی بنویسید یا کاربران کارسازهای دیگر را پی بگیرید تا این‌جا پر شود",
   "error.unexpected_crash.explanation": "به خاطر اشکالی در کدهای ما یا ناسازگاری با مرورگر شما، این صفحه به درستی نمایش نیافت.",
+  "error.unexpected_crash.explanation_addons": "این صفحه نمی‌تواند درست نشان داده شود. احتمالاً این خطا ناشی از یک افزونهٔ مرورگر یا ابزار ترجمهٔ خودکار است.",
   "error.unexpected_crash.next_steps": "لطفاً صفحه را دوباره باز کنید. اگر کمکی نکرد، شاید همچنان بتوانید با ماستودون از راه یک مرورگر دیگر یا با یکی از اپ‌های آن کار کنید.",
+  "error.unexpected_crash.next_steps_addons": "لطفاً از کارشان انداخته و صفحه را نوسازی کنید. اگر کمکی نکرد، شاید همچنان بتوانید با مرورگری دیگر یا با کاره‌ای بومی از ماستودون استفاده کنید.",
   "errors.unexpected_crash.copy_stacktrace": "رونوشت از جزئیات اشکال",
   "errors.unexpected_crash.report_issue": "گزارش مشکل",
   "follow_request.authorize": "اجازه دهید",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "برای برداشتن تمرکز از نوشتن/جستجو",
   "keyboard_shortcuts.up": "برای بالا رفتن در فهرست",
   "lightbox.close": "بستن",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "بعدی",
   "lightbox.previous": "قبلی",
   "lightbox.view_context": "نمایش گفتگو",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "تغییر عنوان",
   "lists.new.create": "افزودن فهرست",
   "lists.new.title_placeholder": "عنوان فهرست تازه",
+  "lists.replies_policy.all_replies": "هر کاربر پی‌گیری‌شده",
+  "lists.replies_policy.list_replies": "اعضای فهرست",
+  "lists.replies_policy.no_replies": "هیچ‌کس",
+  "lists.replies_policy.title": "نمایش پاسخ‌ها به:",
   "lists.search": "بین کسانی که پی می‌گیرید بگردید",
   "lists.subheading": "فهرست‌های شما",
   "load_pending": "{count, plural, one {# مورد تازه} other {# مورد تازه}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "تغییر وضعیت نمایانی",
   "missing_indicator.label": "پیدا نشد",
   "missing_indicator.sublabel": "این منبع پیدا نشد",
+  "mute_modal.duration": "مدت زمان",
   "mute_modal.hide_notifications": "اعلان‌های این کاربر پنهان شود؟",
+  "mute_modal.indefinite": "نامعلوم",
   "navigation_bar.apps": "اپ‌های موبایل",
   "navigation_bar.blocks": "کاربران مسدودشده",
   "navigation_bar.bookmarks": "نشانک‌ها",
@@ -275,7 +287,7 @@
   "navigation_bar.compose": "نوشتن بوق تازه",
   "navigation_bar.direct": "پیام‌های مستقیم",
   "navigation_bar.discover": "گشت و گذار",
-  "navigation_bar.domain_blocks": "دامنه‌های نهفته",
+  "navigation_bar.domain_blocks": "دامنه‌های بسته",
   "navigation_bar.edit_profile": "ویرایش نمایه",
   "navigation_bar.favourites": "پسندیده‌ها",
   "navigation_bar.filters": "واژگان خموش",
@@ -298,6 +310,7 @@
   "notification.own_poll": "نظرسنجی شما به پایان رسید",
   "notification.poll": "نظرسنجی‌ای که در آن رأی دادید به پایان رسیده است",
   "notification.reblog": "‫{name}‬ وضعیتتان را تقویت کرد",
+  "notification.status": "{name} چیزی فرستاد",
   "notifications.clear": "پاک‌کردن اعلان‌ها",
   "notifications.clear_confirmation": "مطمئنید می‌خواهید همهٔ اعلان‌هایتان را برای همیشه پاک کنید؟",
   "notifications.column_settings.alert": "اعلان‌های میزکار",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "بازبوق‌ها:",
   "notifications.column_settings.show": "نمایش در ستون",
   "notifications.column_settings.sound": "پخش صدا",
+  "notifications.column_settings.status": "بوق‌های جدید:",
   "notifications.filter.all": "همه",
   "notifications.filter.boosts": "بازبوق‌ها",
   "notifications.filter.favourites": "پسندها",
   "notifications.filter.follows": "پیگیری‌ها",
   "notifications.filter.mentions": "نام‌بردن‌ها",
   "notifications.filter.polls": "نتایج نظرسنجی",
+  "notifications.filter.statuses": "به‌روز رسانی‌ها از کسانی که پی‌گیرشانید",
   "notifications.group": "{count} اعلان",
+  "notifications.mark_as_read": "نشانه‌گذاری همهٔ آگاهی‌ها به عنوان خوانده‌شده",
+  "notifications.permission_denied": "آگاهی‌های میزکار به دلیل رد کردن درخواست اجازهٔ پیشین مرورگر، در دسترس نیستند",
+  "notifications.permission_denied_alert": "از آن‌جا که پیش از این اجازهٔ مرورگر رد شده است، آگاهی‌های میزکار نمی‌توانند به کار بیفتند",
+  "notifications_permission_banner.enable": "به کار انداختن آگاهی‌های میزکار",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "هرگز چیزی را از دست ندهید",
+  "picture_in_picture.restore": "برگرداندن",
   "poll.closed": "پایان‌یافته",
   "poll.refresh": "به‌روزرسانی",
   "poll.total_people": "{count, plural, one {# نفر} other {# نفر}}",
@@ -389,7 +411,7 @@
   "status.pinned": "بوق ثابت",
   "status.read_more": "بیشتر بخوانید",
   "status.reblog": "بازبوقیدن",
-  "status.reblog_private": "بازبوق به مخاطبان اولیه",
+  "status.reblog_private": "تقویت برای مخاطبان نخستین",
   "status.reblogged_by": "‫{name}‬ بازبوقید",
   "status.reblogs.empty": "هنوز هیچ کسی این بوق را بازنبوقیده است. وقتی کسی چنین کاری کند، این‌جا نمایش خواهد یافت.",
   "status.redraft": "پاک‌کردن و بازنویسی",
@@ -398,7 +420,7 @@
   "status.replyAll": "پاسخ به رشته",
   "status.report": "گزارش @{name}",
   "status.sensitive_warning": "محتوای حساس",
-  "status.share": "هم‌رسانی",
+  "status.share": "همرسانی",
   "status.show_less": "نمایش کمتر",
   "status.show_less_all": "نمایش کمتر همه",
   "status.show_more": "نمایش بیشتر",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}میلیون",
   "units.short.thousand": "{count}هزار",
   "upload_area.title": "برای بارگذاری به این‌جا بکشید",
-  "upload_button.label": "افزودن رسانه ({formats})",
+  "upload_button.label": "افزودن رسانه",
   "upload_error.limit": "از حد مجاز باگذاری پرونده فراتر رفتید.",
   "upload_error.poll": "بارگذاری پرونده در نظرسنجی‌ها مجاز نیست.",
   "upload_form.audio_description": "برای ناشنوایان توصیفش کنید",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "تشخیص متن درون عکس",
   "upload_modal.edit_media": "ویرایش رسانه",
   "upload_modal.hint": "حتی اگر تصویر بریده یا کوچک شود، نقطهٔ کانونی آن همیشه دیده خواهد شد. نقطهٔ کانونی را با کلیک یا جابه‌جا کردن آن تنظیم کنید.",
+  "upload_modal.preparing_ocr": "در حال آماده سازی OCR…",
   "upload_modal.preview_label": "پیش‌نمایش ({ratio})",
   "upload_progress.label": "در حال بارگذاری…",
   "video.close": "بستن ویدیو",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index a6987fb40..21e0290b7 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Selaile lisää alkuperäisellä palvelimella",
   "account.cancel_follow_request": "Peruuta seurauspyyntö",
   "account.direct": "Viesti käyttäjälle @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Verkko-osoite piilotettu",
   "account.edit_profile": "Muokkaa profiilia",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Suosittele profiilissasi",
   "account.follow": "Seuraa",
   "account.followers": "Seuraajaa",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Sinulle ei ole vielä ilmoituksia. Aloita keskustelu juttelemalla muille.",
   "empty_column.public": "Täällä ei ole mitään! Saat sisältöä, kun kirjoitat jotain julkisesti tai käyt seuraamassa muiden instanssien käyttäjiä",
   "error.unexpected_crash.explanation": "Sivua ei voi näyttää oikein, johtuen bugista tai ongelmasta selaimen yhteensopivuudessa.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Kokeile päivittää sivu. Jos tämä ei auta, saatat yhä pystyä käyttämään Mastodonia toisen selaimen tai sovelluksen kautta.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Kopioi stacktrace leikepöydälle",
   "errors.unexpected_crash.report_issue": "Ilmoita ongelmasta",
   "follow_request.authorize": "Valtuuta",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "siirry pois tekstikentästä tai hakukentästä",
   "keyboard_shortcuts.up": "siirry listassa ylöspäin",
   "lightbox.close": "Sulje",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Seuraava",
   "lightbox.previous": "Edellinen",
   "lightbox.view_context": "Näytä kontekstissa",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Vaihda otsikko",
   "lists.new.create": "Lisää lista",
   "lists.new.title_placeholder": "Uuden listan nimi",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Etsi seuraamistasi henkilöistä",
   "lists.subheading": "Omat listat",
   "load_pending": "{count, plural, one {# uusi kappale} other {# uutta kappaletta}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Säädä näkyvyyttä",
   "missing_indicator.label": "Ei löytynyt",
   "missing_indicator.sublabel": "Tätä resurssia ei löytynyt",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Piilota tältä käyttäjältä tulevat ilmoitukset?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobiilisovellukset",
   "navigation_bar.blocks": "Estetyt käyttäjät",
   "navigation_bar.bookmarks": "Kirjanmerkit",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Kyselysi on päättynyt",
   "notification.poll": "Kysely, johon osallistuit, on päättynyt",
   "notification.reblog": "{name} buustasi tilaasi",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Tyhjennä ilmoitukset",
   "notifications.clear_confirmation": "Haluatko varmasti poistaa kaikki ilmoitukset pysyvästi?",
   "notifications.column_settings.alert": "Työpöytäilmoitukset",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Buustit:",
   "notifications.column_settings.show": "Näytä sarakkeessa",
   "notifications.column_settings.sound": "Äänimerkki",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Kaikki",
   "notifications.filter.boosts": "Buustit",
   "notifications.filter.favourites": "Suosikit",
   "notifications.filter.follows": "Seuraa",
   "notifications.filter.mentions": "Maininnat",
   "notifications.filter.polls": "Kyselyn tulokset",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} ilmoitusta",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Suljettu",
   "poll.refresh": "Päivitä",
   "poll.total_people": "{count, plural, one {# henkilö} other {# henkilöä}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Tunnista teksti kuvasta",
   "upload_modal.edit_media": "Muokkaa mediaa",
   "upload_modal.hint": "Klikkaa tai vedä ympyrä esikatselussa valitaksesi keskipiste, joka näkyy aina pienoiskuvissa.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Esikatselu ({ratio})",
   "upload_progress.label": "Ladataan...",
   "video.close": "Sulje video",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index b37852e4d..56a497eb5 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Parcourir davantage sur le profil original",
   "account.cancel_follow_request": "Annuler la demande de suivi",
   "account.direct": "Envoyer un message direct à @{name}",
+  "account.disable_notifications": "Arrêter de me notifier quand @{name} publie",
   "account.domain_blocked": "Domaine bloqué",
   "account.edit_profile": "Modifier le profil",
+  "account.enable_notifications": "Me notifier quand @{name} publie",
   "account.endorse": "Recommander sur le profil",
   "account.follow": "Suivre",
   "account.followers": "Abonné·e·s",
@@ -153,7 +155,7 @@
   "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.",
+  "empty_column.domain_blocks": "Il n’y a aucun domaine bloqué pour le moment.",
   "empty_column.favourited_statuses": "Vous n’avez aucun pouet favoris pour le moment. Lorsque vous en mettrez un en favori, il apparaîtra ici.",
   "empty_column.favourites": "Personne n’a encore mis ce pouet en favori. Lorsque quelqu’un le fera, il apparaîtra ici.",
   "empty_column.follow_requests": "Vous n’avez pas encore de demande de suivi. Lorsque vous en recevrez une, elle apparaîtra ici.",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres personnes pour débuter la conversation.",
   "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres serveurs pour remplir le fil public",
   "error.unexpected_crash.explanation": "En raison d’un bug dans notre code ou d’un problème de compatibilité avec votre navigateur, cette page n’a pas pu être affichée correctement.",
+  "error.unexpected_crash.explanation_addons": "Cette page n’a pas pu être affichée correctement. Cette erreur est probablement causée par une extension de navigateur ou des outils de traduction automatique.",
   "error.unexpected_crash.next_steps": "Essayez de rafraîchir la page. Si cela n’aide pas, vous pouvez toujours utiliser Mastodon via un autre navigateur ou une application native.",
+  "error.unexpected_crash.next_steps_addons": "Essayez de les désactiver et de rafraîchir la page. Si cela ne vous aide pas, vous pouvez toujours utiliser Mastodon via un autre navigateur ou une application native.",
   "errors.unexpected_crash.copy_stacktrace": "Copier la trace d'appels dans le presse-papier",
   "errors.unexpected_crash.report_issue": "Signaler le problème",
   "follow_request.authorize": "Accepter",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "quitter la zone de rédaction/recherche",
   "keyboard_shortcuts.up": "remonter dans la liste",
   "lightbox.close": "Fermer",
+  "lightbox.compress": "Compresser la fenêtre de visualisation des images",
+  "lightbox.expand": "Agrandir la fenêtre de visualisation des images",
   "lightbox.next": "Suivant",
   "lightbox.previous": "Précédent",
   "lightbox.view_context": "Voir le contexte",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Modifier le titre",
   "lists.new.create": "Ajouter une liste",
   "lists.new.title_placeholder": "Titre de la nouvelle liste",
+  "lists.replies_policy.all_replies": "N’importe quel·le utilisateur·rice suivi·e",
+  "lists.replies_policy.list_replies": "Membres de la liste",
+  "lists.replies_policy.no_replies": "Personne",
+  "lists.replies_policy.title": "Afficher les réponses à :",
   "lists.search": "Rechercher parmi les gens que vous suivez",
   "lists.subheading": "Vos listes",
   "load_pending": "{count, plural, one {# nouvel élément} other {# nouveaux éléments}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Intervertir la visibilité",
   "missing_indicator.label": "Non trouvé",
   "missing_indicator.sublabel": "Ressource introuvable",
+  "mute_modal.duration": "Durée",
   "mute_modal.hide_notifications": "Masquer les notifications de cette personne ?",
+  "mute_modal.indefinite": "Indéfinie",
   "navigation_bar.apps": "Applications mobiles",
   "navigation_bar.blocks": "Comptes bloqués",
   "navigation_bar.bookmarks": "Marque-pages",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} vient de publier",
   "notifications.clear": "Effacer les notifications",
   "notifications.clear_confirmation": "Voulez-vous vraiment effacer toutes vos notifications ?",
   "notifications.column_settings.alert": "Notifications du navigateur",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Partages :",
   "notifications.column_settings.show": "Afficher dans la colonne",
   "notifications.column_settings.sound": "Émettre un son",
+  "notifications.column_settings.status": "Nouveaux pouets :",
   "notifications.filter.all": "Tout",
   "notifications.filter.boosts": "Partages",
   "notifications.filter.favourites": "Favoris",
   "notifications.filter.follows": "Abonnés",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Résultats des sondages",
+  "notifications.filter.statuses": "Mises à jour des personnes que vous suivez",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Marquer toutes les notifications comme lues",
+  "notifications.permission_denied": "Impossible d’activer les notifications de bureau car l’autorisation a été refusée.",
+  "notifications.permission_denied_alert": "Les notifications de bureau ne peuvent pas être activées, car l’autorisation du navigateur a été refusée avant",
+  "notifications_permission_banner.enable": "Activer les notifications de bureau",
+  "notifications_permission_banner.how_to_control": "Pour recevoir des notifications lorsque Mastodon n’est pas ouvert, activez les notifications du bureau. Vous pouvez contrôler précisément quels types d’interactions génèrent des notifications de bureau via le bouton {icon} ci-dessus une fois qu’elles sont activées.",
+  "notifications_permission_banner.title": "Toujours au courant",
+  "picture_in_picture.restore": "Remettre en place",
   "poll.closed": "Fermé",
   "poll.refresh": "Actualiser",
   "poll.total_people": "{count, plural, one {# personne} other {# personnes}}",
@@ -415,7 +437,7 @@
   "tabs_bar.notifications": "Notifications",
   "tabs_bar.search": "Chercher",
   "time_remaining.days": "{number, plural, one {# day} other {# days}} restants",
-  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} restantes",
+  "time_remaining.hours": "{number, plural, one {# heure} other {# heures}} restantes",
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} restantes",
   "time_remaining.moments": "Encore quelques instants",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} restantes",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Glissez et déposez pour envoyer",
-  "upload_button.label": "Joindre un média ({formats})",
+  "upload_button.label": "Ajouter des images, une vidéo ou un fichier audio",
   "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",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Détecter le texte de l’image",
   "upload_modal.edit_media": "Modifier le média",
   "upload_modal.hint": "Cliquez ou faites glisser le cercle sur l’aperçu pour choisir le point focal qui sera toujours visible sur toutes les miniatures.",
+  "upload_modal.preparing_ocr": "Préparation de OCR…",
   "upload_modal.preview_label": "Aperçu ({ratio})",
   "upload_progress.label": "Envoi en cours…",
   "video.close": "Fermer la vidéo",
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index 2b1546a57..22230ab73 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Edit profile",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Feature on profile",
   "account.follow": "Follow",
   "account.followers": "Followers",
@@ -96,9 +98,9 @@
   "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.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Write your warning here",
@@ -166,7 +168,9 @@
   "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",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Authorize",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Hide media",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Show in column",
   "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploading...",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 44d8b4662..591d1c13a 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -1,5 +1,5 @@
 {
-  "account.account_note_header": "A túa nota para @{name}",
+  "account.account_note_header": "Nota",
   "account.add_or_remove_from_list": "Engadir ou eliminar das listaxes",
   "account.badges.bot": "Bot",
   "account.badges.group": "Grupo",
@@ -9,14 +9,16 @@
   "account.browse_more_on_origin_server": "Busca máis no perfil orixinal",
   "account.cancel_follow_request": "Desbotar solicitude de seguimento",
   "account.direct": "Mensaxe directa @{name}",
+  "account.disable_notifications": "Deixar de notificarme cando @{name} publica",
   "account.domain_blocked": "Dominio agochado",
   "account.edit_profile": "Editar perfil",
+  "account.enable_notifications": "Noficarme cando @{name} publique",
   "account.endorse": "Amosar no perfil",
   "account.follow": "Seguir",
   "account.followers": "Seguidoras",
   "account.followers.empty": "Aínda ninguén segue esta usuaria.",
   "account.followers_counter": "{count, plural, one {{counter} Seguidora} other {{counter} Seguidoras}}",
-  "account.following_counter": "{count, plural, other {{counter} Seguindo}}",
+  "account.following_counter": "{count, plural, one {{counter} Seguindo} other {{counter} Seguindo}}",
   "account.follows.empty": "Esta usuaria aínda non segue a ninguén.",
   "account.follows_you": "Séguete",
   "account.hide_reblogs": "Agochar repeticións de @{name}",
@@ -43,10 +45,10 @@
   "account.unfollow": "Deixar de seguir",
   "account.unmute": "Deixar de silenciar a @{name}",
   "account.unmute_notifications": "Deixar de silenciar as notificacións de @{name}",
-  "account_note.placeholder": "Sen comentarios",
+  "account_note.placeholder": "Preme para engadir nota",
   "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.message": "Aconteceu un fallo non agardado.",
   "alert.unexpected.title": "Vaites!",
   "announcement.announcement": "Anuncio",
   "autosuggest_hashtag.per_week": "{count} por semana",
@@ -96,9 +98,9 @@
   "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 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.sensitive.hide": "{count, plural, one {Marca multimedia como sensible} other {Marca multimedia como sensibles}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Multimedia marcado como sensible} other {Multimedia marcados como sensibles}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "O texto está agochado tras un aviso",
   "compose_form.spoiler.unmarked": "O texto non está agochado",
   "compose_form.spoiler_placeholder": "Escribe o teu aviso aquí",
@@ -107,7 +109,7 @@
   "confirmations.block.confirm": "Bloquear",
   "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.message": "Tes a certeza de querer eliminar este toot?",
   "confirmations.delete_list.confirm": "Eliminar",
   "confirmations.delete_list.message": "Tes a certeza de querer eliminar de xeito permanente esta listaxe?",
   "confirmations.domain_block.confirm": "Agochar dominio enteiro",
@@ -118,7 +120,7 @@
   "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": "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.redraft.message": "Tes a certeza de querer eliminar este toot 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",
@@ -131,7 +133,7 @@
   "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.instructions": "Engade este toot ó teu sitio web copiando o seguinte código.",
   "embed.preview": "Así será mostrado:",
   "emoji_button.activity": "Actividade",
   "emoji_button.custom": "Personalizado",
@@ -160,13 +162,15 @@
   "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 nesta listaxe. Cando os usuarios incluídas na listaxe publiquen mensaxes, amosaranse aquí.",
+  "empty_column.list": "Aínda non hai nada nesta listaxe. Cando as usuarias incluídas na listaxe publiquen mensaxes, amosaranse aquí.",
   "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 outras 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.explanation_addons": "Non se puido mostrar correctamente a páxina. Habitualmente este erro está causado por algún engadido do navegador ou ferramentas de tradución automática.",
   "error.unexpected_crash.next_steps": "Tenta actualizar a páxina. Se esto non axuda podes tamén empregar Mastodon noutro navegador ou aplicación nativa.",
+  "error.unexpected_crash.next_steps_addons": "Intenta desactivalas e actualiza a páxina. Se isto non funciona, podes seguir usando Mastodon nun navegador diferente ou aplicación nativa.",
   "errors.unexpected_crash.copy_stacktrace": "Copiar trazas (stacktrace) ó portapapeis",
   "errors.unexpected_crash.report_issue": "Informar sobre un problema",
   "follow_request.authorize": "Autorizar",
@@ -218,12 +222,12 @@
   "keyboard_shortcuts.back": "para voltar atrás",
   "keyboard_shortcuts.blocked": "abrir lista de usuarias bloqueadas",
   "keyboard_shortcuts.boost": "promover",
-  "keyboard_shortcuts.column": "para destacar un estado nunha das columnas",
+  "keyboard_shortcuts.column": "para destacar un toot nunha das columnas",
   "keyboard_shortcuts.compose": "para destacar a área de escritura",
   "keyboard_shortcuts.description": "Descrición",
   "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.enter": "para abrir toot",
   "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",
@@ -250,6 +254,8 @@
   "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.compress": "Comprimir a caixa de vista da imaxe",
+  "lightbox.expand": "Expandir a caixa de vista da imaxe",
   "lightbox.next": "Seguinte",
   "lightbox.previous": "Anterior",
   "lightbox.view_context": "Ollar contexto",
@@ -260,14 +266,20 @@
   "lists.edit.submit": "Mudar o título",
   "lists.new.create": "Engadir listaxe",
   "lists.new.title_placeholder": "Título da nova listaxe",
+  "lists.replies_policy.all_replies": "Calquera usuaria á que segues",
+  "lists.replies_policy.list_replies": "Membros da lista",
+  "lists.replies_policy.no_replies": "Ninguén",
+  "lists.replies_policy.title": "Mostrar respostas a:",
   "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": "Estase a cargar...",
-  "media_gallery.toggle_visible": "Trocar visibilidade",
+  "media_gallery.toggle_visible": "Agochar {number, plural, one {imaxe} other {imaxes}}",
   "missing_indicator.label": "Non atopado",
   "missing_indicator.sublabel": "Este recurso non foi atopado",
+  "mute_modal.duration": "Duración",
   "mute_modal.hide_notifications": "Agochar notificacións desta usuaria?",
+  "mute_modal.indefinite": "Indefinida",
   "navigation_bar.apps": "Aplicacións móbiles",
   "navigation_bar.blocks": "Usuarias bloqueadas",
   "navigation_bar.bookmarks": "Marcadores",
@@ -291,13 +303,14 @@
   "navigation_bar.preferences": "Preferencias",
   "navigation_bar.public_timeline": "Cronoloxía federada",
   "navigation_bar.security": "Seguranza",
-  "notification.favourite": "{name} marcou o teu estado coma favorito",
+  "notification.favourite": "{name} marcou o teu toot coma favorito",
   "notification.follow": "{name} comezou a seguirte",
   "notification.follow_request": "{name} solicitou seguirte",
   "notification.mention": "{name} mencionoute",
   "notification.own_poll": "A túa enquisa rematou",
   "notification.poll": "Unha enquisa na que votaches rematou",
-  "notification.reblog": "{name} compartiu o teu estado",
+  "notification.reblog": "{name} compartiu o teu toot",
+  "notification.status": "{name} publicou",
   "notifications.clear": "Limpar notificacións",
   "notifications.clear_confirmation": "Tes a certeza de querer limpar de xeito permanente todas as túas notificacións?",
   "notifications.column_settings.alert": "Notificacións de escritorio",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Promocións:",
   "notifications.column_settings.show": "Amosar en columna",
   "notifications.column_settings.sound": "Reproducir son",
+  "notifications.column_settings.status": "Novos toots:",
   "notifications.filter.all": "Todo",
   "notifications.filter.boosts": "Compartidos",
   "notifications.filter.favourites": "Favoritos",
   "notifications.filter.follows": "Seguimentos",
   "notifications.filter.mentions": "Mencións",
   "notifications.filter.polls": "Resultados da enquisa",
+  "notifications.filter.statuses": "Actualizacións de xente á que segues",
   "notifications.group": "{count} notificacións",
+  "notifications.mark_as_read": "Marcar todas as notificacións como lidas",
+  "notifications.permission_denied": "Non se activaron as notificacións de escritorio porque se denegou o permiso.",
+  "notifications.permission_denied_alert": "Non se poden activar as notificacións de escritorio, xa que o permiso para o navegador foi denegado previamente",
+  "notifications_permission_banner.enable": "Activar notificacións de escritorio",
+  "notifications_permission_banner.how_to_control": "Activa as notificacións de escritorio para recibir notificacións mentras Mastodon non está aberto. Podes controlar de xeito preciso o tipo de interaccións crean as notificacións de escritorio a través da {icon} superior unha vez activadas.",
+  "notifications_permission_banner.title": "Non perder nada",
+  "picture_in_picture.restore": "Devolver",
   "poll.closed": "Pechado",
   "poll.refresh": "Actualizar",
   "poll.total_people": "{count, plural,one {# persoa} other {# persoas}}",
@@ -355,9 +377,9 @@
   "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 cancelos.",
+  "search_popout.tips.full_text": "Texto simple devolve toots que ti escribiches, promoviches, marcaches favoritos, ou foches mencionada, así como nomes de usuaria coincidentes, nomes públicos e cancelos.",
   "search_popout.tips.hashtag": "cancelo",
-  "search_popout.tips.status": "estado",
+  "search_popout.tips.status": "toot",
   "search_popout.tips.text": "Texto simple devolve coincidencias con nomes públicos, nomes de usuaria e cancelos",
   "search_popout.tips.user": "usuaria",
   "search_results.accounts": "Persoas",
@@ -366,12 +388,12 @@
   "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.admin_status": "Abrir este toot na interface de moderación",
   "status.block": "Bloquear a @{name}",
   "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.copy": "Copiar ligazón ó toot",
   "status.delete": "Eliminar",
   "status.detailed_status": "Vista detallada da conversa",
   "status.direct": "Mensaxe directa a @{name}",
@@ -384,7 +406,7 @@
   "status.more": "Máis",
   "status.mute": "Silenciar @{name}",
   "status.mute_conversation": "Silenciar conversa",
-  "status.open": "Expandir este estado",
+  "status.open": "Expandir este toot",
   "status.pin": "Fixar no perfil",
   "status.pinned": "Toot fixado",
   "status.read_more": "Ler máis",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Arrastra e solta para subir",
-  "upload_button.label": "Engadir multimedia ({formats})",
+  "upload_button.label": "Engadir imaxes, un vídeo ou ficheiro de audio",
   "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",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detectar texto na imaxe",
   "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.preparing_ocr": "Preparando OCR…",
   "upload_modal.preview_label": "Vista previa ({ratio})",
   "upload_progress.label": "Estase a subir...",
   "video.close": "Pechar vídeo",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index bec0c7636..cce1f29e7 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "המשך לגלוש בפרופיל המקורי",
   "account.cancel_follow_request": "בטל בקשת מעקב",
   "account.direct": "Direct Message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "הדומיין חסוי",
   "account.edit_profile": "עריכת פרופיל",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "הצג בפרופיל",
   "account.follow": "מעקב",
   "account.followers": "עוקבים",
@@ -96,9 +98,9 @@
   "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.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "אזהרת תוכן",
@@ -166,7 +168,9 @@
   "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.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "קבלה",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "לצאת מתיבת חיבור/חיפוש",
   "keyboard_shortcuts.up": "לנוע במעלה הרשימה",
   "lightbox.close": "סגירה",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "הלאה",
   "lightbox.previous": "הקודם",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "נראה\\בלתי נראה",
   "missing_indicator.label": "לא נמצא",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "להסתיר הודעות מחשבון זה?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "חסימות",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "חצרוצך הודהד על ידי {name}",
+  "notification.status": "{name} just posted",
   "notifications.clear": "הסרת התראות",
   "notifications.clear_confirmation": "להסיר את כל ההתראות? בטוח?",
   "notifications.column_settings.alert": "התראות לשולחן העבודה",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "הדהודים:",
   "notifications.column_settings.show": "הצגה בטור",
   "notifications.column_settings.sound": "שמע מופעל",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "עולה...",
   "video.close": "סגירת וידאו",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index cec0c689f..275cc3eb9 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -1,22 +1,24 @@
 {
-  "account.account_note_header": "Note",
+  "account.account_note_header": "टिप्पणियाँ",
   "account.add_or_remove_from_list": "सूची में जोड़ें या हटाए",
   "account.badges.bot": "बॉट",
-  "account.badges.group": "Group",
+  "account.badges.group": "समूह",
   "account.block": "@{name} को ब्लॉक करें",
   "account.block_domain": "{domain} के सारी चीज़े छुपाएं",
   "account.blocked": "ब्लॉक",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "मूल प्रोफ़ाइल पर अधिक ब्राउज़ करें",
   "account.cancel_follow_request": "फ़ॉलो रिक्वेस्ट रद्द करें",
   "account.direct": "प्रत्यक्ष संदेश @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "छिपा हुआ डोमेन",
   "account.edit_profile": "प्रोफ़ाइल संपादित करें",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "प्रोफ़ाइल पर दिखाए",
   "account.follow": "फॉलो करें",
   "account.followers": "फॉलोवर",
   "account.followers.empty": "कोई भी इस यूज़र् को फ़ॉलो नहीं करता है",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, one {{counter} अनुगामी} other {{counter} समर्थक}}",
+  "account.following_counter": "{count, plural, one {{counter} निम्नलिखित} other {{counter} निम्नलिखित}}",
   "account.follows.empty": "यह यूज़र् अभी तक किसी को फॉलो नहीं करता है।",
   "account.follows_you": "आपको फॉलो करता है",
   "account.hide_reblogs": "@{name} के बूस्ट छुपाएं",
@@ -36,19 +38,19 @@
   "account.requested": "मंजूरी का इंतजार। फॉलो रिक्वेस्ट को रद्द करने के लिए क्लिक करें",
   "account.share": "@{name} की प्रोफाइल शेयर करे",
   "account.show_reblogs": "@{name} के बूस्ट दिखाए",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} भोंपू} other {{counter} भोंपू}}",
   "account.unblock": "@{name} को अनब्लॉक करें",
   "account.unblock_domain": "{domain} दिखाए",
   "account.unendorse": "प्रोफ़ाइल पर न दिखाए",
   "account.unfollow": "अनफॉलो करें",
   "account.unmute": "अनम्यूट @{name}",
   "account.unmute_notifications": "@{name} के नोटिफिकेशन अनम्यूट करे",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "नोट्स जोड़ने के लिए क्लिक करें",
   "alert.rate_limited.message": "कृप्या {retry_time, time, medium} के बाद दुबारा कोशिश करें",
   "alert.rate_limited.title": "सीमित दर",
   "alert.unexpected.message": "एक अप्रत्याशित त्रुटि हुई है!",
   "alert.unexpected.title": "उफ़!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "घोषणा",
   "autosuggest_hashtag.per_week": "{count} हर सप्ताह",
   "boost_modal.combo": "अगली बार स्किप करने के लिए आप {combo} दबा सकते है",
   "bundle_column_error.body": "इस कॉम्पोनेन्ट को लोड करते वक्त कुछ गलत हो गया",
@@ -58,7 +60,7 @@
   "bundle_modal_error.message": "इस कॉम्पोनेन्ट को लोड करते वक्त कुछ गलत हो गया",
   "bundle_modal_error.retry": "दुबारा कोशिश करें",
   "column.blocks": "ब्लॉक्ड यूज़र्स",
-  "column.bookmarks": "Bookmarks",
+  "column.bookmarks": "पुस्तकचिह्न:",
   "column.community": "लोकल टाइम्लाइन",
   "column.direct": "सीधा संदेश",
   "column.directory": "प्रोफाइल्स खोजें",
@@ -79,9 +81,9 @@
   "column_header.show_settings": "सेटिंग्स दिखाएँ",
   "column_header.unpin": "अनपिन",
   "column_subheading.settings": "सेटिंग्स",
-  "community.column_settings.local_only": "Local only",
+  "community.column_settings.local_only": "स्थानीय ही",
   "community.column_settings.media_only": "सिर्फ़ मीडिया",
-  "community.column_settings.remote_only": "Remote only",
+  "community.column_settings.remote_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": "यह टूट् किसी भी हैशटैग के तहत सूचीबद्ध नहीं होगा क्योंकि यह अनलिस्टेड है। हैशटैग द्वारा केवल सार्वजनिक टूट्स खोजे जा सकते हैं।",
@@ -92,8 +94,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.poll.switch_to_multiple": "कई विकल्पों की अनुमति देने के लिए पोल बदलें",
+  "compose_form.poll.switch_to_single": "एक ही विकल्प के लिए अनुमति देने के लिए पोल बदलें",
   "compose_form.publish": "टूट्",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "मीडिया को संवेदनशील के रूप में चिह्नित करें",
@@ -150,7 +152,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.bookmarked_statuses": "आपके पास अभी तक कोई बुकमार्क नहीं है। जब आप एक बुकमार्क करते हैं, तो यह यहां दिखाई देगा।",
   "empty_column.community": "लोकल टाइम्लाइन खाली है, कुछ देखने के लिये सार्वजनिक रूप से कुछ लिखें!",
   "empty_column.direct": "आपके पास कोई सीधा सन्देश नहीं है, जब आप कोई भेजेंगे प्राप्त करेंगे तो यहाँ दिखेगा।",
   "empty_column.domain_blocks": "अभी तक कोई छुपा हुआ डोमेन नहीं है।",
@@ -161,17 +163,19 @@
   "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.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",
-  "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.lists": "आपके पास अभी तक कोई सूची नहीं है। जब आप एक बनाते हैं, तो यह यहां दिखाई देगा।",
+  "empty_column.mutes": "आपने अभी तक किसी भी उपयोगकर्ता को म्यूट नहीं किया है।",
+  "empty_column.notifications": "आपके पास अभी तक कोई सूचना नहीं है। बातचीत शुरू करने के लिए दूसरों के साथ बातचीत करें।",
+  "empty_column.public": "यहां कुछ नहीं है! सार्वजनिक रूप से कुछ लिखें, या इसे भरने के लिए अन्य सर्वर से उपयोगकर्ताओं का मैन्युअल रूप से अनुसरण करें",
+  "error.unexpected_crash.explanation": "हमारे कोड या ब्राउज़र संगतता समस्या में बग के कारण, यह पृष्ठ सही ढंग से प्रदर्शित नहीं हो सका।",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "errors.unexpected_crash.copy_stacktrace": "स्टैकट्रेस को क्लिपबोर्ड पर कॉपी करें",
   "errors.unexpected_crash.report_issue": "समस्या सूचित करें",
   "follow_request.authorize": "अधिकार दें",
   "follow_request.reject": "अस्वीकार करें",
-  "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
+  "follow_requests.unlocked_explanation": "हालाँकि आपका खाता लॉक नहीं है, फिर भी {domain} डोमेन स्टाफ ने सोचा कि आप इन खातों के मैन्युअल अनुरोधों की समीक्षा करना चाहते हैं।",
   "generic.saved": "Saved",
   "getting_started.developers": "डेवॅलपर्स",
   "getting_started.directory": "प्रोफ़ाइल निर्देशिका",
@@ -193,31 +197,31 @@
   "home.column_settings.basic": "बुनियादी",
   "home.column_settings.show_reblogs": "बूस्ट दिखाए",
   "home.column_settings.show_replies": "जवाबों को दिखाए",
-  "home.hide_announcements": "Hide announcements",
-  "home.show_announcements": "Show announcements",
+  "home.hide_announcements": "घोषणाएँ छिपाएँ",
+  "home.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}}",
   "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.federated.text": "महासंघ के अन्य सर्वरों से सार्वजनिक पद संघटित समय-सीमा में दिखाई देंगे।",
   "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.home.text": "आपके द्वारा अनुसरण किए जाने वाले लोगों के पोस्ट आपके होम फीड में दिखाई देंगे। आप किसी भी सर्वर पर किसी को भी फॉलो कर सकते हैं!",
   "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": "पसंदीदा",
-  "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.favourite.text": "आप बाद में इसके लिए एक टोट को बचा सकते हैं, और लेखक को यह बता दें कि आपको यह पसंद आया, इसे फेवर करके।",
   "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": "जवाब",
   "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": "आइए शुरू करते हैं!",
   "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.blocked": "to open blocked users list",
-  "keyboard_shortcuts.boost": "to boost",
+  "introduction.welcome.text": "फेडवर्स में आपका स्वागत है! कुछ ही क्षणों में, आप संदेशों को प्रसारित करने और अपने दोस्तों से विस्तृत सर्वर पर बात करने में सक्षम होंगे। लेकिन यह सर्वर, {domain}, विशेष है - यह आपकी प्रोफ़ाइल को होस्ट करता है, इसलिए इसका नाम याद रखें।",
+  "keyboard_shortcuts.back": "वापस जाने के लिए",
+  "keyboard_shortcuts.blocked": "अवरुद्ध उपयोगकर्ताओं की सूची खोलने के लिए",
+  "keyboard_shortcuts.boost": "बढ़ावा देने के लिए",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "कंपोज़ टेक्स्ट-एरिया पर ध्यान केंद्रित करने के लिए",
   "keyboard_shortcuts.description": "विवरण",
@@ -249,42 +253,50 @@
   "keyboard_shortcuts.toot": "to start a brand new toot",
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
-  "lightbox.close": "Close",
-  "lightbox.next": "Next",
-  "lightbox.previous": "Previous",
+  "lightbox.close": "बंद करें",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
+  "lightbox.next": "अगला",
+  "lightbox.previous": "पिछला",
   "lightbox.view_context": "View context",
   "lists.account.add": "Add to list",
-  "lists.account.remove": "Remove from list",
-  "lists.delete": "Delete list",
-  "lists.edit": "Edit list",
+  "lists.account.remove": "सूची से निकालें",
+  "lists.delete": "सूची हटाएँ",
+  "lists.edit": "सूची संपादित करें",
   "lists.edit.submit": "Change title",
-  "lists.new.create": "Add list",
-  "lists.new.title_placeholder": "New list title",
+  "lists.new.create": "सूची जोड़ें",
+  "lists.new.title_placeholder": "नये सूची का शीर्षक",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
-  "lists.subheading": "Your lists",
+  "lists.subheading": "आपकी सूचियाँ",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
   "loading_indicator.label": "लोड हो रहा है...",
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
   "missing_indicator.label": "नहीं मिला",
   "missing_indicator.sublabel": "यह संसाधन नहीं मिल सका।",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "मोबाइल एप्लिकेशंस",
   "navigation_bar.blocks": "ब्लॉक्ड यूज़र्स",
-  "navigation_bar.bookmarks": "Bookmarks",
+  "navigation_bar.bookmarks": "पुस्तकचिह्न:",
   "navigation_bar.community_timeline": "लोकल टाइम्लाइन",
   "navigation_bar.compose": "नया टूट् लिखें",
-  "navigation_bar.direct": "Direct messages",
-  "navigation_bar.discover": "Discover",
+  "navigation_bar.direct": "सीधा संदेश",
+  "navigation_bar.discover": "खोजें",
   "navigation_bar.domain_blocks": "Hidden domains",
-  "navigation_bar.edit_profile": "Edit profile",
+  "navigation_bar.edit_profile": "प्रोफ़ाइल संपादित करें",
   "navigation_bar.favourites": "Favourites",
   "navigation_bar.filters": "Muted words",
-  "navigation_bar.follow_requests": "Follow requests",
+  "navigation_bar.follow_requests": "अनुसरण करने के अनुरोध",
   "navigation_bar.follows_and_followers": "Follows and followers",
-  "navigation_bar.info": "About this server",
+  "navigation_bar.info": "इस सर्वर के बारे में",
   "navigation_bar.keyboard_shortcuts": "Hotkeys",
-  "navigation_bar.lists": "Lists",
-  "navigation_bar.logout": "Logout",
+  "navigation_bar.lists": "सूचियाँ",
+  "navigation_bar.logout": "बाहर जाए",
   "navigation_bar.mutes": "Muted users",
   "navigation_bar.personal": "Personal",
   "navigation_bar.pins": "Pinned toots",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "बूस्ट:",
   "notifications.column_settings.show": "कॉलम में दिखाएँ",
   "notifications.column_settings.sound": "ध्वनि चलाएँ",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "सभी",
   "notifications.filter.boosts": "बूस्ट",
   "notifications.filter.favourites": "पसंदीदा",
   "notifications.filter.follows": "फॉलो",
   "notifications.filter.mentions": "उल्लेख",
   "notifications.filter.polls": "चुनाव परिणाम",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} सूचनाएँ",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "बंद कर दिया",
   "poll.refresh": "रीफ्रेश करें",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "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.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "अपलोडिंग...",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index f20a384b9..d59e10a89 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -1,365 +1,387 @@
 {
-  "account.account_note_header": "Note",
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.account_note_header": "Bilješka",
+  "account.add_or_remove_from_list": "Dodaj ili ukloni s liste",
   "account.badges.bot": "Bot",
-  "account.badges.group": "Group",
+  "account.badges.group": "Grupa",
   "account.block": "Blokiraj @{name}",
-  "account.block_domain": "Sakrij sve sa {domain}",
-  "account.blocked": "Blocked",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
-  "account.cancel_follow_request": "Cancel follow request",
-  "account.direct": "Direct Message @{name}",
-  "account.domain_blocked": "Domain hidden",
+  "account.block_domain": "Blokiraj domenu {domain}",
+  "account.blocked": "Blokirano",
+  "account.browse_more_on_origin_server": "Pogledajte više na izvornom profilu",
+  "account.cancel_follow_request": "Otkaži zahtjev za praćenje",
+  "account.direct": "Pošalji poruku @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
+  "account.domain_blocked": "Domena je blokirana",
   "account.edit_profile": "Uredi profil",
-  "account.endorse": "Feature on profile",
-  "account.follow": "Slijedi",
-  "account.followers": "Sljedbenici",
-  "account.followers.empty": "No one follows this user yet.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
-  "account.follows.empty": "This user doesn't follow anyone yet.",
-  "account.follows_you": "te slijedi",
-  "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.enable_notifications": "Notify me when @{name} posts",
+  "account.endorse": "Istakni na profilu",
+  "account.follow": "Prati",
+  "account.followers": "Pratitelji",
+  "account.followers.empty": "Nitko još ne prati korisnika/cu.",
+  "account.followers_counter": "{count, plural, one {{counter} pratitelj} other {{counter} pratitelja}}",
+  "account.following_counter": "{count, plural, one {{counter} praćeni} few{{counter} praćena} other {{counter} praćenih}}",
+  "account.follows.empty": "Korisnik/ca još ne prati nikoga.",
+  "account.follows_you": "Prati te",
+  "account.hide_reblogs": "Sakrij boostove od @{name}",
+  "account.last_status": "Posljednja aktivnost",
+  "account.link_verified_on": "Vlasništvo ove poveznice provjereno je {date}",
+  "account.locked_info": "Status privatnosti ovog računa postavljen je na zaključano. Vlasnik ručno pregledava tko ih može pratiti.",
+  "account.media": "Medijski sadržaj",
   "account.mention": "Spomeni @{name}",
-  "account.moved_to": "{name} has moved to:",
+  "account.moved_to": "Račun {name} je premješten na:",
   "account.mute": "Utišaj @{name}",
-  "account.mute_notifications": "Mute notifications from @{name}",
-  "account.muted": "Muted",
-  "account.never_active": "Never",
-  "account.posts": "Postovi",
-  "account.posts_with_replies": "Toots with replies",
+  "account.mute_notifications": "Utišaj obavijesti od @{name}",
+  "account.muted": "Utišano",
+  "account.never_active": "Nikad",
+  "account.posts": "Tootovi",
+  "account.posts_with_replies": "Tootovi i odgovori",
   "account.report": "Prijavi @{name}",
-  "account.requested": "Čeka pristanak",
-  "account.share": "Share @{name}'s profile",
-  "account.show_reblogs": "Show boosts from @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.requested": "Čekanje na potvrdu. Kliknite za otkazivanje zahtjeva za praćenje",
+  "account.share": "Podijeli profil @{name}",
+  "account.show_reblogs": "Prikaži boostove od @{name}",
+  "account.statuses_counter": "{count, plural, one {{counter} toot} other {{counter} toota}}",
   "account.unblock": "Deblokiraj @{name}",
-  "account.unblock_domain": "Poništi sakrivanje {domain}",
-  "account.unendorse": "Don't feature on profile",
-  "account.unfollow": "Prestani slijediti",
+  "account.unblock_domain": "Deblokiraj domenu {domain}",
+  "account.unendorse": "Ne ističi na profilu",
+  "account.unfollow": "Prestani pratiti",
   "account.unmute": "Poništi utišavanje @{name}",
-  "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account_note.placeholder": "Click to add a note",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
-  "alert.unexpected.message": "An unexpected error occurred.",
-  "alert.unexpected.title": "Oops!",
-  "announcement.announcement": "Announcement",
-  "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.",
-  "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",
+  "account.unmute_notifications": "Ne utišavaj obavijesti od @{name}",
+  "account_note.placeholder": "Kliknite za dodavanje bilješke",
+  "alert.rate_limited.message": "Molimo pokušajte nakon {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Ograničenje učestalosti",
+  "alert.unexpected.message": "Dogodila se neočekivana greška.",
+  "alert.unexpected.title": "Ups!",
+  "announcement.announcement": "Najava",
+  "autosuggest_hashtag.per_week": "{count} tjedno",
+  "boost_modal.combo": "Možete pritisnuti {combo} kako biste preskočili ovo sljedeći put",
+  "bundle_column_error.body": "Nešto je pošlo po zlu tijekom učitavanja ove komponente.",
+  "bundle_column_error.retry": "Pokušajte ponovno",
+  "bundle_column_error.title": "Greška mreže",
+  "bundle_modal_error.close": "Zatvori",
+  "bundle_modal_error.message": "Nešto je pošlo po zlu tijekom učitavanja ove komponente.",
+  "bundle_modal_error.retry": "Pokušajte ponovno",
   "column.blocks": "Blokirani korisnici",
-  "column.bookmarks": "Bookmarks",
-  "column.community": "Lokalni timeline",
-  "column.direct": "Direct messages",
-  "column.directory": "Browse profiles",
-  "column.domain_blocks": "Hidden domains",
+  "column.bookmarks": "Knjižne oznake",
+  "column.community": "Lokalna vremenska crta",
+  "column.direct": "Izravne poruke",
+  "column.directory": "Pregledavanje profila",
+  "column.domain_blocks": "Blokirane domene",
   "column.favourites": "Favoriti",
-  "column.follow_requests": "Zahtjevi za slijeđenje",
-  "column.home": "Dom",
-  "column.lists": "Lists",
+  "column.follow_requests": "Zahtjevi za praćenje",
+  "column.home": "Početna",
+  "column.lists": "Liste",
   "column.mutes": "Utišani korisnici",
-  "column.notifications": "Notifikacije",
-  "column.pins": "Pinned toot",
-  "column.public": "Federalni timeline",
+  "column.notifications": "Obavijesti",
+  "column.pins": "Prikvačeni tootovi",
+  "column.public": "Federalna vremenska crta",
   "column_back_button.label": "Natrag",
-  "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_header.hide_settings": "Sakrij postavke",
+  "column_header.moveLeft_settings": "Pomakni stupac ulijevo",
+  "column_header.moveRight_settings": "Pomakni stupac udesno",
+  "column_header.pin": "Prikvači",
+  "column_header.show_settings": "Prikaži postavke",
+  "column_header.unpin": "Otkvači",
   "column_subheading.settings": "Postavke",
-  "community.column_settings.local_only": "Local only",
-  "community.column_settings.media_only": "Media only",
-  "community.column_settings.remote_only": "Remote only",
-  "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
-  "compose_form.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": "Tvoj račun nije {locked}. Svatko te može slijediti kako bi vidio postove namijenjene samo tvojim sljedbenicima.",
+  "community.column_settings.local_only": "Samo lokalno",
+  "community.column_settings.media_only": "Samo medijski sadržaj",
+  "community.column_settings.remote_only": "Samo udaljeno",
+  "compose_form.direct_message_warning": "Ovaj toot bit će poslan samo spomenutim korisnicima.",
+  "compose_form.direct_message_warning_learn_more": "Saznajte više",
+  "compose_form.hashtag_warning": "Ovaj toot neće biti prikazan ni pod jednim hashtagom jer je postavljen kao neprikazan. Samo javni tootovi mogu biti pretraživani pomoći hashtagova.",
+  "compose_form.lock_disclaimer": "Vaš račun nije {locked}. Svatko Vas može pratiti kako bi vidjeli objave namijenjene Vašim pratiteljima.",
   "compose_form.lock_disclaimer.lock": "zaključan",
   "compose_form.placeholder": "Što ti je na umu?",
-  "compose_form.poll.add_option": "Add a choice",
-  "compose_form.poll.duration": "Poll duration",
-  "compose_form.poll.option_placeholder": "Choice {number}",
-  "compose_form.poll.remove_option": "Remove this choice",
-  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
-  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
-  "compose_form.publish": "Toot",
+  "compose_form.poll.add_option": "Dodaj opciju",
+  "compose_form.poll.duration": "Trajanje ankete",
+  "compose_form.poll.option_placeholder": "Opcija {number}",
+  "compose_form.poll.remove_option": "Ukloni ovu opciju",
+  "compose_form.poll.switch_to_multiple": "Omogući višestruki odabir opcija ankete",
+  "compose_form.poll.switch_to_single": "Omogući odabir samo jedne opcije ankete",
+  "compose_form.publish": "Tootni",
   "compose_form.publish_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": "Upozorenje o sadržaju",
+  "compose_form.sensitive.hide": "Označi medijski sadržaj kao osjetljiv",
+  "compose_form.sensitive.marked": "Medijski sadržaj označen je kao osjetljiv",
+  "compose_form.sensitive.unmarked": "Medijski sadržaj nije označen kao osjetljiv",
+  "compose_form.spoiler.marked": "Tekst je skriven iza upozorenja",
+  "compose_form.spoiler.unmarked": "Tekst nije skriven",
+  "compose_form.spoiler_placeholder": "Ovdje upišite upozorenje",
   "confirmation_modal.cancel": "Otkaži",
-  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.block_and_report": "Blokiraj i prijavi",
   "confirmations.block.confirm": "Blokiraj",
-  "confirmations.block.message": "Želiš li sigurno blokirati {name}?",
+  "confirmations.block.message": "Sigurno želite blokirati {name}?",
   "confirmations.delete.confirm": "Obriši",
-  "confirmations.delete.message": "Želiš li stvarno obrisati ovaj status?",
-  "confirmations.delete_list.confirm": "Delete",
-  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
-  "confirmations.domain_block.confirm": "Sakrij cijelu domenu",
-  "confirmations.domain_block.message": "Jesi li zaista, zaista siguran da želiš potpuno blokirati {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",
-  "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
+  "confirmations.delete.message": "Stvarno želite obrisati ovaj toot?",
+  "confirmations.delete_list.confirm": "Obriši",
+  "confirmations.delete_list.message": "Jeste li sigurni da želite trajno obrisati ovu listu?",
+  "confirmations.domain_block.confirm": "Blokiraj cijelu domenu",
+  "confirmations.domain_block.message": "Jeste li zaista, zaista sigurni da želite blokirati cijelu domenu {domain}? U većini slučajeva dovoljno je i preferirano nekoliko ciljanih blokiranja ili utišavanja. Nećete vidjeti sadržaj s te domene ni u kojim javnim vremenskim crtama ili Vašim obavijestima. Vaši pratitelji s te domene bit će uklonjeni.",
+  "confirmations.logout.confirm": "Odjavi se",
+  "confirmations.logout.message": "Jeste li sigurni da se želite odjaviti?",
   "confirmations.mute.confirm": "Utišaj",
-  "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": "Jesi li siguran da želiš utišati {name}?",
-  "confirmations.redraft.confirm": "Delete & redraft",
-  "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.mute.explanation": "Ovo će sakriti njihove objave i objave koje ih spominju, ali i dalje će im dopuštati da vide Vaše objave i da Vas prate.",
+  "confirmations.mute.message": "Jeste li sigurni da želite utišati {name}?",
+  "confirmations.redraft.confirm": "Izbriši i ponovno uredi",
+  "confirmations.redraft.message": "Jeste li sigurni da želite izbrisati ovaj toot i ponovno ga urediti? Favoriti i boostovi bit će izgubljeni, a odgovori na izvornu objavu bit će odvojeni.",
+  "confirmations.reply.confirm": "Odgovori",
   "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": "Prestani pratiti",
   "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}",
+  "conversation.delete": "Izbriši razgovor",
+  "conversation.mark_as_read": "Označi kao pročitano",
+  "conversation.open": "Prikaži razgovor",
+  "conversation.with": "S {names}",
   "directory.federated": "From known fediverse",
-  "directory.local": "From {domain} only",
+  "directory.local": "Samo iz {domain}",
   "directory.new_arrivals": "New arrivals",
-  "directory.recently_active": "Recently active",
+  "directory.recently_active": "Nedavno aktivni",
   "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": "Aktivnost",
-  "emoji_button.custom": "Custom",
+  "emoji_button.custom": "Prilagođeno",
   "emoji_button.flags": "Zastave",
-  "emoji_button.food": "Hrana & Piće",
-  "emoji_button.label": "Umetni smajlije",
+  "emoji_button.food": "Hrana i piće",
+  "emoji_button.label": "Umetni emotikone",
   "emoji_button.nature": "Priroda",
-  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
-  "emoji_button.objects": "Objekti",
+  "emoji_button.not_found": "Nema emotikona!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Predmeti",
   "emoji_button.people": "Ljudi",
-  "emoji_button.recent": "Frequently used",
+  "emoji_button.recent": "Često korišteno",
   "emoji_button.search": "Traži...",
-  "emoji_button.search_results": "Search results",
+  "emoji_button.search_results": "Rezultati pretraživanja",
   "emoji_button.symbols": "Simboli",
-  "emoji_button.travel": "Putovanja & Mjesta",
-  "empty_column.account_timeline": "No toots here!",
-  "empty_column.account_unavailable": "Profile unavailable",
-  "empty_column.blocks": "You haven't blocked any users yet.",
+  "emoji_button.travel": "Putovanje i mjesta",
+  "empty_column.account_timeline": "Ovdje nema tootova!",
+  "empty_column.account_unavailable": "Profil nije dostupan",
+  "empty_column.blocks": "Još niste blokirali nikoga.",
   "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.community": "Lokalna vremenska crta je prazna. Napišite nešto javno da biste pokrenuli 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.",
+  "empty_column.domain_blocks": "Još nema blokiranih domena.",
   "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": "Još ne postoji ništa s ovim hashtagom.",
-  "empty_column.home": "Još ne slijediš nikoga. Posjeti {public} ili koristi tražilicu kako bi počeo i upoznao druge korisnike.",
-  "empty_column.home.public_timeline": "javni timeline",
-  "empty_column.list": "There is nothing in this list yet.",
+  "empty_column.home": "Vaša početna vremenska crta je prazna! Posjetite {public} ili koristite tražilicu kako biste započeli i upoznali druge korisnike.",
+  "empty_column.home.public_timeline": "javnu vremensku crtu",
+  "empty_column.list": "Na ovoj listi još nema ničega. Kada članovi ove liste objave nove tootove, oni će se pojaviti ovdje.",
   "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": "Još nemaš notifikacija. Komuniciraj sa drugima kako bi započeo razgovor.",
-  "empty_column.public": "Ovdje nema ništa! Napiši nešto javno, ili ručno slijedi korisnike sa drugih instanci kako bi popunio",
+  "empty_column.notifications": "Još nemate obavijesti. Komunicirajte s drugima kako biste započeli razgovor.",
+  "empty_column.public": "Ovdje nema ništa! Napišite nešto javno ili ručno pratite korisnike s drugi poslužitelja da biste ovo popunili",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
-  "errors.unexpected_crash.report_issue": "Report issue",
+  "errors.unexpected_crash.report_issue": "Prijavi problem",
   "follow_request.authorize": "Autoriziraj",
   "follow_request.reject": "Odbij",
   "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
-  "generic.saved": "Saved",
-  "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
-  "getting_started.documentation": "Documentation",
+  "generic.saved": "Spremljeno",
+  "getting_started.developers": "Razvijatelji",
+  "getting_started.directory": "Direktorij profila",
+  "getting_started.documentation": "Dokumentacija",
   "getting_started.heading": "Počnimo",
-  "getting_started.invite": "Invite people",
-  "getting_started.open_source_notice": "Mastodon je softver otvorenog koda. Možeš pridonijeti ili prijaviti probleme na GitHubu  {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",
+  "getting_started.invite": "Pozovi ljude",
+  "getting_started.open_source_notice": "Mastodon je softver otvorenog kôda. Možete pridonijeti ili prijaviti probleme na GitHubu na {github}.",
+  "getting_started.security": "Postavke računa",
+  "getting_started.terms": "Uvjeti pružanja usluga",
+  "hashtag.column_header.tag_mode.all": "i {additional}",
+  "hashtag.column_header.tag_mode.any": "ili {additional}",
+  "hashtag.column_header.tag_mode.none": "bez {additional}",
+  "hashtag.column_settings.select.no_options_message": "Nisu pronađeni prijedlozi",
+  "hashtag.column_settings.select.placeholder": "Unesite hashtagove…",
+  "hashtag.column_settings.tag_mode.all": "Sve navedeno",
+  "hashtag.column_settings.tag_mode.any": "Bilo koji navedeni",
+  "hashtag.column_settings.tag_mode.none": "Nijedan navedeni",
+  "hashtag.column_settings.tag_toggle": "Uključi dodatne oznake za ovaj stupac",
   "home.column_settings.basic": "Osnovno",
   "home.column_settings.show_reblogs": "Pokaži boostove",
   "home.column_settings.show_replies": "Pokaži odgovore",
-  "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}}",
-  "introduction.federation.action": "Next",
-  "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
-  "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
-  "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish toot-orial!",
-  "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
-  "keyboard_shortcuts.back": "to navigate back",
-  "keyboard_shortcuts.blocked": "to open blocked users list",
-  "keyboard_shortcuts.boost": "to boost",
-  "keyboard_shortcuts.column": "to focus a status in one of the columns",
-  "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.description": "Description",
-  "keyboard_shortcuts.direct": "to open direct messages column",
-  "keyboard_shortcuts.down": "to move down in the list",
-  "keyboard_shortcuts.enter": "to open status",
-  "keyboard_shortcuts.favourite": "to favourite",
-  "keyboard_shortcuts.favourites": "to open favourites list",
-  "keyboard_shortcuts.federated": "to open federated timeline",
-  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
-  "keyboard_shortcuts.home": "to open home timeline",
-  "keyboard_shortcuts.hotkey": "Hotkey",
-  "keyboard_shortcuts.legend": "to display this legend",
-  "keyboard_shortcuts.local": "to open local timeline",
-  "keyboard_shortcuts.mention": "to mention author",
-  "keyboard_shortcuts.muted": "to open muted users list",
-  "keyboard_shortcuts.my_profile": "to open your profile",
-  "keyboard_shortcuts.notifications": "to open notifications column",
-  "keyboard_shortcuts.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",
-  "keyboard_shortcuts.requests": "to open follow requests list",
-  "keyboard_shortcuts.search": "to focus search",
+  "home.hide_announcements": "Sakrij najave",
+  "home.show_announcements": "Prikaži najave",
+  "intervals.full.days": "{number, plural, one {# dan} other {# dana}}",
+  "intervals.full.hours": "{number, plural, one {# sat} few {# sata} other {# sati}}",
+  "intervals.full.minutes": "{number, plural, one {# minuta} few {# minute} other {# minuta}}",
+  "introduction.federation.action": "Sljedeće",
+  "introduction.federation.federated.headline": "Federalno",
+  "introduction.federation.federated.text": "Javne objave s drugih poslužitelja fediverzuma prikazat će se u federalnoj vremenskoj crti.",
+  "introduction.federation.home.headline": "Početna",
+  "introduction.federation.home.text": "Objave ljudi koje pratite prikazat će se na Vašoj početnoj stranici. Možete pratiti bilo koga na bilo kojem poslužitelju!",
+  "introduction.federation.local.headline": "Lokalno",
+  "introduction.federation.local.text": "Javne objave ljudi na istom poslužitelju prikazat će se u lokalnoj vremenskoj crti.",
+  "introduction.interactions.action": "Dovrši tutorijal!",
+  "introduction.interactions.favourite.headline": "Favoriti",
+  "introduction.interactions.favourite.text": "Toot možete spremiti za kasnije i javiti njegovom autoru da Vam se sviđa tako što ga označite kao favorit.",
+  "introduction.interactions.reblog.headline": "Boostanje",
+  "introduction.interactions.reblog.text": "Tuđe tootove možete dijeliti sa svojim pratiteljima tako što ih boostate.",
+  "introduction.interactions.reply.headline": "Odgovaranje",
+  "introduction.interactions.reply.text": "Možete odgovoriti na tuđe i svoje tootove, čime će se oni povezati u razgovor.",
+  "introduction.welcome.action": "Krenimo!",
+  "introduction.welcome.headline": "Prvi koraci",
+  "introduction.welcome.text": "Dobro došli na fediverzum! Za nekoliko trenutaka moći ćete dijeliti poruke i razgovara sa svojim prijateljima kroz široki raspon poslužitelja. Ali ovaj poslužitelj, {domain}, je poseban — on sadrži Vaš profil, pa zapamtite njegovo ime.",
+  "keyboard_shortcuts.back": "za vraćanje natrag",
+  "keyboard_shortcuts.blocked": "za otvaranje liste blokiranih korisnika",
+  "keyboard_shortcuts.boost": "za boostanje",
+  "keyboard_shortcuts.column": "za fokusiranje na toot u jednom od stupaca",
+  "keyboard_shortcuts.compose": "za fokusiranje na tekstualni okvir za stvaranje",
+  "keyboard_shortcuts.description": "Opis",
+  "keyboard_shortcuts.direct": "za otvaranje stupca s izravnim porukama",
+  "keyboard_shortcuts.down": "za pomak dolje na listi",
+  "keyboard_shortcuts.enter": "za otvaranje toota",
+  "keyboard_shortcuts.favourite": "za označavanje favoritom",
+  "keyboard_shortcuts.favourites": "za otvaranje liste favorita",
+  "keyboard_shortcuts.federated": "za otvaranje federalne vremenske crte",
+  "keyboard_shortcuts.heading": "Tipkovnički prečaci",
+  "keyboard_shortcuts.home": "za otvaranje početne vremenske crte",
+  "keyboard_shortcuts.hotkey": "Tipkovnički prečac",
+  "keyboard_shortcuts.legend": "za prikaz ove legende",
+  "keyboard_shortcuts.local": "za otvaranje lokalne vremenske crte",
+  "keyboard_shortcuts.mention": "za spominjanje autora",
+  "keyboard_shortcuts.muted": "za otvaranje liste utišanih korisnika",
+  "keyboard_shortcuts.my_profile": "za otvaranje Vašeg profila",
+  "keyboard_shortcuts.notifications": "za otvaranje stupca s obavijestima",
+  "keyboard_shortcuts.open_media": "za otvaranje medijskog sadržaja",
+  "keyboard_shortcuts.pinned": "za otvaranje liste prikvačenih tootova",
+  "keyboard_shortcuts.profile": "za otvaranje autorovog profila",
+  "keyboard_shortcuts.reply": "za odgovaranje",
+  "keyboard_shortcuts.requests": "za otvaranje liste zahtjeva za praćenje",
+  "keyboard_shortcuts.search": "za fokusiranje na tražilicu",
   "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
-  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
-  "keyboard_shortcuts.toot": "to start a brand new toot",
+  "keyboard_shortcuts.toggle_sensitivity": "za prikaz/sakrivanje medijskog sadržaja",
+  "keyboard_shortcuts.toot": "za započinjanje novog toota",
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Zatvori",
-  "lightbox.next": "Next",
-  "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
-  "lists.account.add": "Add to list",
-  "lists.account.remove": "Remove from list",
-  "lists.delete": "Delete list",
-  "lists.edit": "Edit list",
-  "lists.edit.submit": "Change title",
-  "lists.new.create": "Add list",
-  "lists.new.title_placeholder": "New list title",
-  "lists.search": "Search among people you follow",
-  "lists.subheading": "Your lists",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
+  "lightbox.next": "Sljedeće",
+  "lightbox.previous": "Prethodno",
+  "lightbox.view_context": "Prikaži kontekst",
+  "lists.account.add": "Dodaj na listu",
+  "lists.account.remove": "Ukloni s liste",
+  "lists.delete": "Izbriši listu",
+  "lists.edit": "Uredi listu",
+  "lists.edit.submit": "Promijeni naslov",
+  "lists.new.create": "Dodaj listu",
+  "lists.new.title_placeholder": "Naziv nove liste",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
+  "lists.search": "Traži među praćenim ljudima",
+  "lists.subheading": "Vaše liste",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
-  "loading_indicator.label": "Učitavam...",
-  "media_gallery.toggle_visible": "Preklopi vidljivost",
-  "missing_indicator.label": "Nije nađen",
+  "loading_indicator.label": "Učitavanje...",
+  "media_gallery.toggle_visible": "Sakrij {number, plural, one {sliku} other {slike}}",
+  "missing_indicator.label": "Nije pronađeno",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokirani korisnici",
   "navigation_bar.bookmarks": "Bookmarks",
-  "navigation_bar.community_timeline": "Lokalni timeline",
+  "navigation_bar.community_timeline": "Lokalna vremenska crta",
   "navigation_bar.compose": "Compose new toot",
-  "navigation_bar.direct": "Direct messages",
-  "navigation_bar.discover": "Discover",
-  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.direct": "Izravne poruke",
+  "navigation_bar.discover": "Istraživanje",
+  "navigation_bar.domain_blocks": "Blokirane domene",
   "navigation_bar.edit_profile": "Uredi profil",
   "navigation_bar.favourites": "Favoriti",
-  "navigation_bar.filters": "Muted words",
-  "navigation_bar.follow_requests": "Zahtjevi za slijeđenje",
-  "navigation_bar.follows_and_followers": "Follows and followers",
-  "navigation_bar.info": "Više informacija",
-  "navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
-  "navigation_bar.lists": "Lists",
+  "navigation_bar.filters": "Utišane riječi",
+  "navigation_bar.follow_requests": "Zahtjevi za praćenje",
+  "navigation_bar.follows_and_followers": "Praćeni i pratitelji",
+  "navigation_bar.info": "O ovom poslužitelju",
+  "navigation_bar.keyboard_shortcuts": "Tipkovnički prečaci",
+  "navigation_bar.lists": "Liste",
   "navigation_bar.logout": "Odjavi se",
   "navigation_bar.mutes": "Utišani korisnici",
-  "navigation_bar.personal": "Personal",
-  "navigation_bar.pins": "Pinned toots",
+  "navigation_bar.personal": "Osobno",
+  "navigation_bar.pins": "Prikvačeni tootovi",
   "navigation_bar.preferences": "Postavke",
-  "navigation_bar.public_timeline": "Federalni timeline",
-  "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",
-  "notifications.clear_confirmation": "Želiš li zaista obrisati sve svoje notifikacije?",
-  "notifications.column_settings.alert": "Desktop notifikacije",
+  "navigation_bar.public_timeline": "Federalna vremenska crta",
+  "navigation_bar.security": "Sigurnost",
+  "notification.favourite": "{name} je favorizirao/la Vaš toot",
+  "notification.follow": "{name} Vas je počeo/la pratiti",
+  "notification.follow_request": "{name} zatražio/la je da Vas prati",
+  "notification.mention": "{name} Vas je spomenuo",
+  "notification.own_poll": "Vaša anketa je završila",
+  "notification.poll": "Anketa u kojoj ste glasali je završila",
+  "notification.reblog": "{name} je boostao/la Vaš status",
+  "notification.status": "{name} just posted",
+  "notifications.clear": "Očisti obavijesti",
+  "notifications.clear_confirmation": "Želite li zaista trajno očistiti sve Vaše obavijesti?",
+  "notifications.column_settings.alert": "Obavijesti radne površine",
   "notifications.column_settings.favourite": "Favoriti:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
-  "notifications.column_settings.follow": "Novi sljedbenici:",
-  "notifications.column_settings.follow_request": "New follow requests:",
+  "notifications.column_settings.filter_bar.advanced": "Prikaži sve kategorije",
+  "notifications.column_settings.filter_bar.category": "Brza traka filtera",
+  "notifications.column_settings.filter_bar.show": "Prikaži",
+  "notifications.column_settings.follow": "Novi pratitelji:",
+  "notifications.column_settings.follow_request": "Novi zahtjevi za praćenje:",
   "notifications.column_settings.mention": "Spominjanja:",
-  "notifications.column_settings.poll": "Poll results:",
-  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.poll": "Rezultati anketa:",
+  "notifications.column_settings.push": "Push obavijesti",
   "notifications.column_settings.reblog": "Boostovi:",
   "notifications.column_settings.show": "Prikaži u stupcu",
   "notifications.column_settings.sound": "Sviraj zvuk",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
-  "notifications.filter.polls": "Poll results",
-  "notifications.group": "{count} notifications",
-  "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
-  "poll.total_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",
-  "privacy.change": "Podesi status privatnosti",
-  "privacy.direct.long": "Prikaži samo spomenutim korisnicima",
-  "privacy.direct.short": "Direktno",
-  "privacy.private.long": "Prikaži samo sljedbenicima",
-  "privacy.private.short": "Privatno",
-  "privacy.public.long": "Postaj na javne timeline",
+  "notifications.column_settings.status": "New toots:",
+  "notifications.filter.all": "Sve",
+  "notifications.filter.boosts": "Boostovi",
+  "notifications.filter.favourites": "Favoriti",
+  "notifications.filter.follows": "Praćenja",
+  "notifications.filter.mentions": "Spominjanja",
+  "notifications.filter.polls": "Rezultati anketa",
+  "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.group": "{count} obavijesti",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
+  "poll.closed": "Završeno",
+  "poll.refresh": "Osvježi",
+  "poll.total_people": "{count, plural, one {# osoba} few {# osobe} other {# osoba}}",
+  "poll.total_votes": "{count, plural, one {# glas} few {# glasa} other {# glasova}}",
+  "poll.vote": "Glasaj",
+  "poll.voted": "Vi ste glasali za ovaj odgovor",
+  "poll_button.add_poll": "Dodaj anketu",
+  "poll_button.remove_poll": "Ukloni anketu",
+  "privacy.change": "Podesi privatnost toota",
+  "privacy.direct.long": "Vidljivo samo spomenutim korisnicima",
+  "privacy.direct.short": "Izravno",
+  "privacy.private.long": "Vidljivo samo pratiteljima",
+  "privacy.private.short": "Samo pratitelji",
+  "privacy.public.long": "Vidljivo svima, prikazano u javim vremenskim crtama",
   "privacy.public.short": "Javno",
-  "privacy.unlisted.long": "Ne prikazuj u javnim timelineovima",
-  "privacy.unlisted.short": "Unlisted",
-  "refresh": "Refresh",
-  "regeneration_indicator.label": "Loading…",
-  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "privacy.unlisted.long": "Vidljivo svima, ali se ne prikazuje u javnim vremenskim crtama",
+  "privacy.unlisted.short": "Neprikazano",
+  "refresh": "Osvježi",
+  "regeneration_indicator.label": "Učitavanje…",
+  "regeneration_indicator.sublabel": "Priprema se Vaša početna stranica!",
   "relative_time.days": "{number}d",
   "relative_time.hours": "{number}h",
-  "relative_time.just_now": "now",
+  "relative_time.just_now": "sada",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
-  "relative_time.today": "today",
+  "relative_time.today": "danas",
   "reply_indicator.cancel": "Otkaži",
-  "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.forward": "Proslijedi {target}",
+  "report.forward_hint": "Račun je s drugog poslužitelja. Poslati anonimiziranu kopiju prijave i tamo?",
+  "report.hint": "Prijava bit će poslana moderatorima poslužitelja. Ispod možete dati objašnjenje zašto prijavljujete ovaj račun:",
   "report.placeholder": "Dodatni komentari",
   "report.submit": "Pošalji",
-  "report.target": "Prijavljivanje",
+  "report.target": "Prijavljivanje korisnika {target}",
   "search.placeholder": "Traži",
-  "search_popout.search_format": "Advanced search format",
+  "search_popout.search_format": "Format naprednog pretraživanja",
   "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
   "search_popout.tips.hashtag": "hashtag",
-  "search_popout.tips.status": "status",
+  "search_popout.tips.status": "toot",
   "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
-  "search_popout.tips.user": "user",
+  "search_popout.tips.user": "korisnik",
   "search_results.accounts": "People",
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Toots",
@@ -370,92 +392,93 @@
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
   "status.cancel_reblog_private": "Unboost",
-  "status.cannot_reblog": "Ovaj post ne može biti boostan",
+  "status.cannot_reblog": "Ova objava ne može biti boostana",
   "status.copy": "Copy link to status",
   "status.delete": "Obriši",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
   "status.embed": "Embed",
-  "status.favourite": "Označi omiljenim",
+  "status.favourite": "Označi favoritom",
   "status.filtered": "Filtered",
   "status.load_more": "Učitaj više",
-  "status.media_hidden": "Sakriven media sadržaj",
+  "status.media_hidden": "Sakriven medijski sadržaj",
   "status.mention": "Spomeni @{name}",
   "status.more": "More",
   "status.mute": "Mute @{name}",
   "status.mute_conversation": "Utišaj razgovor",
-  "status.open": "Proširi ovaj status",
+  "status.open": "Proširi ovaj toot",
   "status.pin": "Pin on profile",
   "status.pinned": "Pinned toot",
-  "status.read_more": "Read more",
-  "status.reblog": "Podigni",
-  "status.reblog_private": "Boost with original visibility",
-  "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.read_more": "Pročitajte više",
+  "status.reblog": "Boostaj",
+  "status.reblog_private": "Boostaj s izvornom vidljivošću",
+  "status.reblogged_by": "{name} je boostao/la",
+  "status.reblogs.empty": "Nitko još nije boostao ovaj toot. Kada netko to učini, ovdje će biti prikazani.",
+  "status.redraft": "Izbriši i ponovno uredi",
+  "status.remove_bookmark": "Ukloni knjižnu oznaku",
   "status.reply": "Odgovori",
-  "status.replyAll": "Odgovori na temu",
+  "status.replyAll": "Odgovori na niz",
   "status.report": "Prijavi @{name}",
   "status.sensitive_warning": "Osjetljiv sadržaj",
-  "status.share": "Share",
+  "status.share": "Podijeli",
   "status.show_less": "Pokaži manje",
   "status.show_less_all": "Show less for all",
   "status.show_more": "Pokaži više",
   "status.show_more_all": "Show more for all",
-  "status.show_thread": "Show thread",
-  "status.uncached_media_warning": "Not available",
+  "status.show_thread": "Prikaži nit",
+  "status.uncached_media_warning": "Nije dostupno",
   "status.unmute_conversation": "Poništi utišavanje razgovora",
-  "status.unpin": "Unpin from profile",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
-  "tabs_bar.federated_timeline": "Federalni",
-  "tabs_bar.home": "Dom",
+  "status.unpin": "Otkvači s profila",
+  "suggestions.dismiss": "Odbaci prijedlog",
+  "suggestions.header": "Možda Vas zanima…",
+  "tabs_bar.federated_timeline": "Federalno",
+  "tabs_bar.home": "Početna",
   "tabs_bar.local_timeline": "Lokalno",
-  "tabs_bar.notifications": "Notifikacije",
-  "tabs_bar.search": "Search",
-  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
-  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
-  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
+  "tabs_bar.notifications": "Obavijesti",
+  "tabs_bar.search": "Traži",
+  "time_remaining.days": "{number, plural, one {preostao # dan} other {preostalo # dana}}",
+  "time_remaining.hours": "{number, plural, one {preostao # sat} few {preostalo # sata} other {preostalo # sati}}",
+  "time_remaining.minutes": "{number, plural, one {preostala # minuta} few {preostale # minute} other {preostalo # minuta}}",
   "time_remaining.moments": "Moments remaining",
-  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
+  "time_remaining.seconds": "{number, plural, one {preostala # sekunda} few {preostale # sekunde} other {preostalo # sekundi}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} s drugih poslužitelja nisu prikazani.",
+  "timeline_hint.resources.followers": "Pratitelji",
+  "timeline_hint.resources.follows": "Praćenja",
+  "timeline_hint.resources.statuses": "Stariji tootovi",
   "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
-  "trends.trending_now": "Trending now",
-  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
-  "units.short.billion": "{count}B",
-  "units.short.million": "{count}M",
-  "units.short.thousand": "{count}K",
-  "upload_area.title": "Povuci i spusti kako bi uploadao",
-  "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.thumbnail": "Change thumbnail",
-  "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.choose_image": "Choose image",
+  "trends.trending_now": "Popularno",
+  "ui.beforeunload": "Vaša skica bit će izgubljena ako napustite Mastodon.",
+  "units.short.billion": "{count} mlrd.",
+  "units.short.million": "{count} mil.",
+  "units.short.thousand": "{count} tis.",
+  "upload_area.title": "Povucite i ispustite za prijenos",
+  "upload_button.label": "Dodajte slike, video ili audio datoteku",
+  "upload_error.limit": "Ograničenje prijenosa datoteka je prekoračeno.",
+  "upload_error.poll": "Prijenos datoteka nije dopušten kod anketa.",
+  "upload_form.audio_description": "Opišite za ljude sa slabim sluhom",
+  "upload_form.description": "Opišite za ljude sa slabim vidom",
+  "upload_form.edit": "Uredi",
+  "upload_form.thumbnail": "Promijeni pretpregled",
+  "upload_form.undo": "Obriši",
+  "upload_form.video_description": "Opišite za ljude sa slabim sluhom ili vidom",
+  "upload_modal.analyzing_picture": "Analiza slike…",
+  "upload_modal.apply": "Primijeni",
+  "upload_modal.choose_image": "Odaberite sliku",
   "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.detect_text": "Detektiraj tekst sa slike",
+  "upload_modal.edit_media": "Uređivanje medija",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
-  "upload_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",
-  "video.hide": "Hide video",
-  "video.mute": "Mute sound",
-  "video.pause": "Pause",
-  "video.play": "Play",
-  "video.unmute": "Unmute sound"
+  "upload_progress.label": "Prenošenje...",
+  "video.close": "Zatvori video",
+  "video.download": "Preuzmi datoteku",
+  "video.exit_fullscreen": "Izađi iz cijelog zaslona",
+  "video.expand": "Proširi video",
+  "video.fullscreen": "Cijeli zaslon",
+  "video.hide": "Sakrij video",
+  "video.mute": "Utišaj zvuk",
+  "video.pause": "Pauziraj",
+  "video.play": "Reproduciraj",
+  "video.unmute": "Uključi zvuk"
 }
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 9afadd7d6..1c8c06284 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -1,5 +1,5 @@
 {
-  "account.account_note_header": "Megjegyzés @{name} fiókhoz",
+  "account.account_note_header": "Feljegyzés",
   "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",
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "További böngészés az eredeti profilon",
   "account.cancel_follow_request": "Követési kérelem törlése",
   "account.direct": "Közvetlen üzenet @{name} számára",
+  "account.disable_notifications": "Ne figyelmeztess, ha @{name} tülköl",
   "account.domain_blocked": "Rejtett domain",
   "account.edit_profile": "Profil szerkesztése",
+  "account.enable_notifications": "Figyelmeztess, ha @{name} tülköl",
   "account.endorse": "Kiemelés a profilodon",
   "account.follow": "Követés",
   "account.followers": "Követő",
@@ -43,7 +45,7 @@
   "account.unfollow": "Követés vége",
   "account.unmute": "@{name} némítás feloldása",
   "account.unmute_notifications": "@{name} némított értesítéseinek feloldása",
-  "account_note.placeholder": "Nincs megjegyzés",
+  "account_note.placeholder": "Klikk a feljegyzéshez",
   "alert.rate_limited.message": "Próbáld újra {retry_time, time, medium} után.",
   "alert.rate_limited.title": "Forgalomkorlátozás",
   "alert.unexpected.message": "Váratlan hiba történt.",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Jelenleg nincsenek értesítéseid. Lépj kapcsolatba másokkal, hogy elindítsd a beszélgetést.",
   "empty_column.public": "Jelenleg itt nincs semmi! Írj valamit nyilvánosan vagy kövess más szervereken levő felhasználókat, hogy megtöltsd",
   "error.unexpected_crash.explanation": "Egy hiba vagy böngésző inkompatibilitás miatt ez az oldal nem jeleníthető meg rendesen.",
+  "error.unexpected_crash.explanation_addons": "Ezt az oldalt nem lehet helyesen megjeleníteni. Ezt a hibát valószínűleg egy böngésző beépülő vagy egy automatikus fordító okozza.",
   "error.unexpected_crash.next_steps": "Próbáld frissíteni az oldalt. Ha ez nem segít, egy másik böngészőn vagy appon keresztül még mindig használhatod a Mastodont.",
+  "error.unexpected_crash.next_steps_addons": "Próbáld letiltani őket és frissíteni az oldalt. Ha ez nem segít, egy másik böngészőn vagy appon keresztül még mindig használhatod a Mastodont.",
   "errors.unexpected_crash.copy_stacktrace": "Veremkiíratás vágólapra másolása",
   "errors.unexpected_crash.report_issue": "Probléma jelentése",
   "follow_request.authorize": "Engedélyezés",
@@ -250,9 +254,11 @@
   "keyboard_shortcuts.unfocus": "tülk szerkesztés/keresés fókuszpontból való kivétele",
   "keyboard_shortcuts.up": "felfelé mozdítás a listában",
   "lightbox.close": "Bezárás",
+  "lightbox.compress": "Képnézet összecsukása",
+  "lightbox.expand": "Képnézet kinagyítása",
   "lightbox.next": "Következő",
   "lightbox.previous": "Előző",
-  "lightbox.view_context": "Kontextus megtekintése",
+  "lightbox.view_context": "Környezet megtekintése",
   "lists.account.add": "Hozzáadás a listához",
   "lists.account.remove": "Eltávolítás a listából",
   "lists.delete": "Lista törlése",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Cím megváltoztatása",
   "lists.new.create": "Lista hozzáadása",
   "lists.new.title_placeholder": "Új lista címe",
+  "lists.replies_policy.all_replies": "Bármely követett felhasználó",
+  "lists.replies_policy.list_replies": "A lista tagjai",
+  "lists.replies_policy.no_replies": "Senki",
+  "lists.replies_policy.title": "Nekik mutassuk a válaszokat:",
   "lists.search": "Keresés a követett személyek között",
   "lists.subheading": "Listáid",
   "load_pending": "{count, plural, one {# új elem} other {# új elem}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Láthatóság állítása",
   "missing_indicator.label": "Nincs találat",
   "missing_indicator.sublabel": "Ez az erőforrás nem található",
+  "mute_modal.duration": "Időtartam",
   "mute_modal.hide_notifications": "Rejtsük el a felhasználótól származó értesítéseket?",
+  "mute_modal.indefinite": "Határozatlan",
   "navigation_bar.apps": "Mobil appok",
   "navigation_bar.blocks": "Letiltott felhasználók",
   "navigation_bar.bookmarks": "Könyvjelzők",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} tülkölt egyet",
   "notifications.clear": "Értesítések törlése",
   "notifications.clear_confirmation": "Biztos, hogy véglegesen törölni akarod az összes értesítésed?",
   "notifications.column_settings.alert": "Asztali értesítések",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Megtolások:",
   "notifications.column_settings.show": "Oszlopban mutatás",
   "notifications.column_settings.sound": "Hang lejátszása",
+  "notifications.column_settings.status": "Új tülkök:",
   "notifications.filter.all": "Mind",
   "notifications.filter.boosts": "Megtolások",
   "notifications.filter.favourites": "Kedvencnek jelölések",
   "notifications.filter.follows": "Követések",
   "notifications.filter.mentions": "Megemlítések",
   "notifications.filter.polls": "Szavazások eredményei",
+  "notifications.filter.statuses": "Frissítések azoktól, akiket követsz",
   "notifications.group": "{count} értesítés",
+  "notifications.mark_as_read": "Minden értesítés olvasottnak jelölése",
+  "notifications.permission_denied": "Nem tudjuk engedélyezni az asztali értesítéseket, mert az engedélyt megtagadták.",
+  "notifications.permission_denied_alert": "Az asztali értesítések nem engedélyezhetőek, mert az engedélyt megtagadták a böngészőben",
+  "notifications_permission_banner.enable": "Asztali értesítések engedélyezése",
+  "notifications_permission_banner.how_to_control": "Ahhoz, hogy értesítéseket kapj akkor, amikor a Mastodon nincs megnyitva, engedélyezd az asztali értesítéseket. Pontosan be tudod állítani, hogy milyen interakciókról értesülj a fenti {icon} gombon keresztül, ha egyszer már engedélyezted őket.",
+  "notifications_permission_banner.title": "Soha ne mulassz el semmit",
+  "picture_in_picture.restore": "Visszarakás",
   "poll.closed": "Lezárva",
   "poll.refresh": "Frissítés",
   "poll.total_people": "{count, plural, one {# személy} other {# személy}}",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Húzd ide a feltöltéshez",
-  "upload_button.label": "Média hozzáadása ({formats})",
+  "upload_button.label": "Média hozzáadása",
   "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",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Szöveg felismerése a képről",
   "upload_modal.edit_media": "Média szerkesztése",
   "upload_modal.hint": "Kattints vagy húzd a kört az előnézetben arra a fókuszpontra, mely minden megjelenített bélyegképen látható kell, legyen.",
+  "upload_modal.preparing_ocr": "OCR előkészítése…",
   "upload_modal.preview_label": "Előnézet ({ratio})",
   "upload_progress.label": "Feltöltés...",
   "video.close": "Videó bezárása",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 8c6cb1de2..5033b8ca2 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -6,11 +6,13 @@
   "account.block": "Արգելափակել @{name}֊ին",
   "account.block_domain": "Թաքցնել ամէնը հետեւեալ տիրոյթից՝ {domain}",
   "account.blocked": "Արգելափակուած է",
-  "account.browse_more_on_origin_server": "Դիտել ավելին իրական պրոֆիլում",
+  "account.browse_more_on_origin_server": "Դիտել աւելին իրական պրոֆիլում",
   "account.cancel_follow_request": "չեղարկել հետեւելու հայցը",
   "account.direct": "Նամակ գրել @{name} -ին",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Տիրոյթը արգելափակուած է",
   "account.edit_profile": "Խմբագրել անձնական էջը",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Ցուցադրել անձնական էջում",
   "account.follow": "Հետեւել",
   "account.followers": "Հետեւողներ",
@@ -83,7 +85,7 @@
   "community.column_settings.media_only": "Media only",
   "community.column_settings.remote_only": "Միայն հեռակա",
   "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "Իմանալ ավելին",
+  "compose_form.direct_message_warning_learn_more": "Իմանալ աւելին",
   "compose_form.hashtag_warning": "Այս թութը չի հաշվառվի որեւէ պիտակի տակ, քանզի այն ծածուկ է։ Միայն հրապարակային թթերը հնարավոր է որոնել պիտակներով։",
   "compose_form.lock_disclaimer": "Քո հաշիւը {locked} չէ։ Իւրաքանչիւրութիւն ոք կարող է հետեւել քեզ եւ տեսնել միայն հետեւողների համար նախատեսուած գրառումները։",
   "compose_form.lock_disclaimer.lock": "փակ",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Ոչ մի ծանուցում դեռ չունես։ Բզիր միւսներին՝ խօսակցութիւնը սկսելու համար։",
   "empty_column.public": "Այստեղ բան չկա՛յ։ Հրապարակային մի բան գրիր կամ հետեւիր այլ հանգոյցներից էակների՝ այն լցնելու համար։",
   "error.unexpected_crash.explanation": "Մեր ծրագրակազմում վրիպակի կամ դիտարկչի անհամատեղելիութեան պատճառով այս էջը չի կարող լիարժէք պատկերուել։",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Փորձիր թարմացնել էջը։ Եթե դա չօգնի ապա կարող ես օգտվել Մաստադոնից ուրիշ դիտարկիչով կամ հավելվածով։",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Պատճենել սթաքթրեյսը սեղմատախտակին",
   "errors.unexpected_crash.report_issue": "Զեկուցել խնդրի մասին",
   "follow_request.authorize": "Վավերացնել",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "տեքստի/որոնման տիրույթից ապասեւեռվելու համար",
   "keyboard_shortcuts.up": "ցանկով վերեւ շարժվելու համար",
   "lightbox.close": "Փակել",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Հաջորդ",
   "lightbox.previous": "Նախորդ",
   "lightbox.view_context": "Տեսնել ենթատեքստը",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Փոխել վերնագիրը",
   "lists.new.create": "Ավելացնել ցանկ",
   "lists.new.title_placeholder": "Նոր ցանկի վերնագիր",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Փնտրել քո հետեւած մարդկանց մեջ",
   "lists.subheading": "Քո ցանկերը",
   "load_pending": "{count, plural, one {# նոր նիւթ} other {# նոր նիւթ}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Ցուցադրել/թաքցնել",
   "missing_indicator.label": "Չգտնվեց",
   "missing_indicator.sublabel": "Պաշարը չի գտնւում",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Թաքցնե՞լ ցանուցումներն այս օգտատիրոջից։",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Դիւրակիր յաւելուածներ",
   "navigation_bar.blocks": "Արգելափակված օգտատերեր",
   "navigation_bar.bookmarks": "Էջանիշեր",
@@ -298,9 +310,10 @@
   "notification.own_poll": "Հարցումդ աւարտուեց",
   "notification.poll": "Հարցումը, ուր դու քուէարկել ես, աւարտուեց։",
   "notification.reblog": "{name} տարածեց թութդ",
+  "notification.status": "{name} just posted",
   "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": "Արագ զտման վահանակ",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Տարածածներից՝",
   "notifications.column_settings.show": "Ցուցադրել սիւնում",
   "notifications.column_settings.sound": "Ձայն հանել",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Բոլորը",
   "notifications.filter.boosts": "Տարածածները",
   "notifications.filter.favourites": "Հաւանածները",
   "notifications.filter.follows": "Հետեւածները",
   "notifications.filter.mentions": "Նշումները",
   "notifications.filter.polls": "Հարցման արդիւնքները",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} ծանուցում",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Փակ",
   "poll.refresh": "Թարմացնել",
   "poll.total_people": "{count, plural, one {# հոգի} other {# հոգի}}",
@@ -349,7 +371,7 @@
   "reply_indicator.cancel": "Չեղարկել",
   "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.hint": "Այս զեկոյցը կուղարկուի հանգոյցի մոդերատորներին։ Ներքեւում կարող ես տրամադրել բացատրութիւն, թէ ինչու ես զեկուցում այս հաշուի մասին․",
   "report.placeholder": "Լրացուցիչ մեկնաբանութիւններ",
   "report.submit": "Ուղարկել",
   "report.target": "Բողոքել {target}֊ի մասին",
@@ -378,16 +400,16 @@
   "status.embed": "Ներդնել",
   "status.favourite": "Հավանել",
   "status.filtered": "Զտված",
-  "status.load_more": "Բեռնել ավելին",
+  "status.load_more": "Բեռնել աւելին",
   "status.media_hidden": "մեդիաբովանդակութիւնը թաքցուած է",
   "status.mention": "Նշել @{name}֊ին",
-  "status.more": "Ավելին",
+  "status.more": "Աւելին",
   "status.mute": "Լռեցնել @{name}֊ին",
   "status.mute_conversation": "Լռեցնել խօսակցութիւնը",
   "status.open": "Ընդարձակել այս թութը",
   "status.pin": "Ամրացնել անձնական էջում",
   "status.pinned": "Ամրացված թութ",
-  "status.read_more": "Կարդալ ավելին",
+  "status.read_more": "Կարդալ աւելին",
   "status.reblog": "Տարածել",
   "status.reblog_private": "Տարածել սեփական լսարանին",
   "status.reblogged_by": "{name} տարածել է",
@@ -401,7 +423,7 @@
   "status.share": "Կիսվել",
   "status.show_less": "Պակաս",
   "status.show_less_all": "Թաքցնել բոլոր նախազգուշացնումները",
-  "status.show_more": "Ավելին",
+  "status.show_more": "Աւելին",
   "status.show_more_all": "Ցուցադրել բոլոր նախազգուշացնումները",
   "status.show_thread": "Բացել շղթան",
   "status.uncached_media_warning": "Անհասանելի",
@@ -423,7 +445,7 @@
   "timeline_hint.resources.followers": "Հետևորդներ",
   "timeline_hint.resources.follows": "Հետևել",
   "timeline_hint.resources.statuses": "Հին թութեր",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} մարդ} other {{counter} մարդիկ}} խոսում են",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} մարդ} other {{counter} մարդիկ}} խօսում են",
   "trends.trending_now": "Այժմ արդիական",
   "ui.beforeunload": "Քո սեւագիրը կկորի, եթե լքես Մաստոդոնը։",
   "units.short.billion": "{count}մլրդ",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Հայտնբերել տեքստը նկարից",
   "upload_modal.edit_media": "Խմբագրել մեդիան",
   "upload_modal.hint": "Սեղմէք եւ տեղաշարժէք նախադիտման շրջանակը՝ որ ընտրէք մանրապատկերում միշտ տեսանելի կէտը։",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Նախադիտում ({ratio})",
   "upload_progress.label": "Վերբեռնվում է…",
   "video.close": "Փակել  տեսագրութիւնը",
@@ -456,6 +479,6 @@
   "video.hide": "Թաքցնել տեսագրութիւնը",
   "video.mute": "Լռեցնել ձայնը",
   "video.pause": "Դադար տալ",
-  "video.play": "Նվագել",
+  "video.play": "Նուագել",
   "video.unmute": "Միացնել ձայնը"
 }
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 91ad76e03..562d9d038 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -1,22 +1,24 @@
 {
-  "account.account_note_header": "Note",
+  "account.account_note_header": "Catatan",
   "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",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "Lihat lebih lanjut diprofil asli",
   "account.cancel_follow_request": "Batalkan permintaan ikuti",
   "account.direct": "Direct Message @{name}",
+  "account.disable_notifications": "Berhenti memberitahu saya ketika @{name} memposting",
   "account.domain_blocked": "Domain disembunyikan",
   "account.edit_profile": "Ubah profil",
+  "account.enable_notifications": "Beritahu saya saat @{name} memposting",
   "account.endorse": "Tampilkan di profil",
   "account.follow": "Ikuti",
   "account.followers": "Pengikut",
   "account.followers.empty": "Tidak ada satupun yang mengkuti pengguna ini saat ini.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, other {{counter} Pengikut}}",
+  "account.following_counter": "{count, plural, other {{counter} Mengikuti}}",
   "account.follows.empty": "Pengguna ini belum mengikuti siapapun.",
   "account.follows_you": "Mengikuti anda",
   "account.hide_reblogs": "Sembunyikan boosts dari @{name}",
@@ -36,14 +38,14 @@
   "account.requested": "Menunggu persetujuan. Klik untuk membatalkan permintaan",
   "account.share": "Bagikan profil @{name}",
   "account.show_reblogs": "Tampilkan boost dari @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, other {{counter} Toot}}",
   "account.unblock": "Hapus blokir @{name}",
-  "account.unblock_domain": "Tampilkan {domain}",
+  "account.unblock_domain": "Buka blokir domain {domain}",
   "account.unendorse": "Jangan tampilkan di profil",
   "account.unfollow": "Berhenti mengikuti",
   "account.unmute": "Berhenti membisukan @{name}",
   "account.unmute_notifications": "Munculkan notifikasi dari @{name}",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "Klik untuk menambah catatan",
   "alert.rate_limited.message": "Tolong ulangi setelah {retry_time, time, medium}.",
   "alert.rate_limited.title": "Batasan tingkat",
   "alert.unexpected.message": "Terjadi kesalahan yang tidak terduga.",
@@ -79,9 +81,9 @@
   "column_header.show_settings": "Tampilkan pengaturan",
   "column_header.unpin": "Lepaskan",
   "column_subheading.settings": "Pengaturan",
-  "community.column_settings.local_only": "Local only",
+  "community.column_settings.local_only": "Hanya lokal",
   "community.column_settings.media_only": "Hanya media",
-  "community.column_settings.remote_only": "Remote only",
+  "community.column_settings.remote_only": "Hanya jarak jauh",
   "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
   "compose_form.direct_message_warning_learn_more": "Pelajari selengkapnya",
   "compose_form.hashtag_warning": "Toot ini tidak akan ada dalam daftar tagar manapun karena telah di set sebagai tidak terdaftar. Hanya postingan publik yang bisa dicari dengan tagar.",
@@ -96,9 +98,9 @@
   "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",
-  "compose_form.sensitive.marked": "Sumber ini telah ditandai sebagai sumber sensitif.",
-  "compose_form.sensitive.unmarked": "Sumber ini tidak ditandai sebagai sumber sensitif",
+  "compose_form.sensitive.hide": "{count, plural, other {Tandai media sebagai sensitif}}",
+  "compose_form.sensitive.marked": "{count, plural, other {Media ini ditandai sebagai sensitif}}",
+  "compose_form.sensitive.unmarked": "{count, plural, other {Media ini tidak ditandai sebagai sensitif}}",
   "compose_form.spoiler.marked": "Teks disembunyikan dibalik peringatan",
   "compose_form.spoiler.unmarked": "Teks tidak tersembunyi",
   "compose_form.spoiler_placeholder": "Peringatan konten",
@@ -166,13 +168,15 @@
   "empty_column.notifications": "Anda tidak memiliki notifikasi apapun. Berinteraksi dengan orang lain untuk memulai percakapan.",
   "empty_column.public": "Tidak ada apapun disini! Tulis sesuatu, atau ikuti pengguna lain dari server lain untuk mengisi ini",
   "error.unexpected_crash.explanation": "Karena kutu pada kode kami atau isu kompatibilitas peramban, halaman tak dapat ditampilkan dengan benar.",
+  "error.unexpected_crash.explanation_addons": "Halaman ini tidak dapat ditampilkan dengan benar. Kesalahan ini mungkin disebabkan pengaya peramban atau alat terjemahan otomatis.",
   "error.unexpected_crash.next_steps": "Coba segarkan halaman. Jika tak membantu, Anda masih bisa memakai Mastodon dengan peramban berbeda atau aplikasi native.",
+  "error.unexpected_crash.next_steps_addons": "Coba nonaktifkan mereka lalu segarkan halaman. Jika tak membantu, Anda masih bisa memakai Mastodon dengan peramban berbeda atau aplikasi murni.",
   "errors.unexpected_crash.copy_stacktrace": "Salin stacktrace ke papan klip",
   "errors.unexpected_crash.report_issue": "Laporkan masalah",
   "follow_request.authorize": "Izinkan",
   "follow_request.reject": "Tolak",
   "follow_requests.unlocked_explanation": "Meskipun akun Anda tidak dikunci, staf {domain} menyarankan Anda untuk meninjau permintaan mengikuti dari akun-akun ini secara manual.",
-  "generic.saved": "Saved",
+  "generic.saved": "Disimpan",
   "getting_started.developers": "Pengembang",
   "getting_started.directory": "Direktori profil",
   "getting_started.documentation": "Dokumentasi",
@@ -242,7 +246,7 @@
   "keyboard_shortcuts.reply": "balas",
   "keyboard_shortcuts.requests": "buka daftar permintaan ikuti",
   "keyboard_shortcuts.search": "untuk fokus mencari",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.spoilers": "untuk menampilkan/menyembunyikan bidang CW",
   "keyboard_shortcuts.start": "buka kolom \"memulai\"",
   "keyboard_shortcuts.toggle_hidden": "tampilkan/sembunyikan teks di belakang CW",
   "keyboard_shortcuts.toggle_sensitivity": "tampilkan/sembunyikan media",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "untuk tidak fokus pada area teks/pencarian",
   "keyboard_shortcuts.up": "untuk memindah ke atas pada daftar",
   "lightbox.close": "Tutup",
+  "lightbox.compress": "Kompres kotak tampilan gambar",
+  "lightbox.expand": "Besarkan kotak tampilan gambar",
   "lightbox.next": "Selanjutnya",
   "lightbox.previous": "Sebelumnya",
   "lightbox.view_context": "Lihat konteks",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Ubah judul",
   "lists.new.create": "Tambah daftar",
   "lists.new.title_placeholder": "Judul daftar baru",
+  "lists.replies_policy.all_replies": "Siapapun pengguna yang diikuti",
+  "lists.replies_policy.list_replies": "Anggota di daftar tersebut",
+  "lists.replies_policy.no_replies": "Tidak ada satu pun",
+  "lists.replies_policy.title": "Tampilkan balasan ke:",
   "lists.search": "Cari di antara orang yang Anda ikuti",
   "lists.subheading": "Daftar Anda",
   "load_pending": "{count, plural, other {# item baru}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Tampil/Sembunyikan",
   "missing_indicator.label": "Tidak ditemukan",
   "missing_indicator.sublabel": "Sumber daya tak bisa ditemukan",
+  "mute_modal.duration": "Durasi",
   "mute_modal.hide_notifications": "Sembunyikan notifikasi dari pengguna ini?",
+  "mute_modal.indefinite": "Tak terbatas",
   "navigation_bar.apps": "Aplikasi mobile",
   "navigation_bar.blocks": "Pengguna diblokir",
   "navigation_bar.bookmarks": "Markah",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Japat Anda telah berakhir",
   "notification.poll": "Japat yang Anda ikuti telah berakhir",
   "notification.reblog": "{name} mem-boost status anda",
+  "notification.status": "{name} baru saja memposting",
   "notifications.clear": "Hapus notifikasi",
   "notifications.clear_confirmation": "Apa anda yakin hendak menghapus semua notifikasi anda?",
   "notifications.column_settings.alert": "Notifikasi desktop",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boost:",
   "notifications.column_settings.show": "Tampilkan dalam kolom",
   "notifications.column_settings.sound": "Mainkan suara",
+  "notifications.column_settings.status": "Toot baru:",
   "notifications.filter.all": "Semua",
   "notifications.filter.boosts": "Boost",
   "notifications.filter.favourites": "Favorit",
   "notifications.filter.follows": "Diikuti",
   "notifications.filter.mentions": "Sebutan",
   "notifications.filter.polls": "Hasil japat",
+  "notifications.filter.statuses": "Pembaruan dari orang yang Anda ikuti",
   "notifications.group": "{count} notifikasi",
+  "notifications.mark_as_read": "Tandai setiap notifikasi sebagai sudah dibaca",
+  "notifications.permission_denied": "Tidak dapat mengaktifkan notifikasi desktop karena izin ditolak.",
+  "notifications.permission_denied_alert": "Notifikasi desktop tidak dapat diaktifkan karena izin peramban telah ditolak sebelumnya",
+  "notifications_permission_banner.enable": "Aktifkan notifikasi desktop",
+  "notifications_permission_banner.how_to_control": "Untuk menerima notifikasi saat Mastodon terbuka, aktifkan notifikasi desktop. Anda dapat mengendalikan tipe interaksi mana yang ditampilkan notifikasi desktop melalui tombol {icon} di atas saat sudah aktif.",
+  "notifications_permission_banner.title": "Jangan lewatkan apapun",
+  "picture_in_picture.restore": "Taruh kembali",
   "poll.closed": "Ditutup",
   "poll.refresh": "Segarkan",
   "poll.total_people": "{count, plural, other {# orang}}",
@@ -343,7 +365,7 @@
   "relative_time.days": "{number}h",
   "relative_time.hours": "{number}j",
   "relative_time.just_now": "sekarang",
-  "relative_time.minutes": "{number}b",
+  "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}d",
   "relative_time.today": "hari ini",
   "reply_indicator.cancel": "Batal",
@@ -419,16 +441,16 @@
   "time_remaining.minutes": "{number, plural, other {# menit}} tersisa",
   "time_remaining.moments": "Momen tersisa",
   "time_remaining.seconds": "{number, plural, other {# detik}} tersisa",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "timeline_hint.remote_resource_not_displayed": "{resource} dari server lain tidak ditampilkan.",
+  "timeline_hint.resources.followers": "Pengikut",
+  "timeline_hint.resources.follows": "Ikuti",
+  "timeline_hint.resources.statuses": "Toot lama",
+  "trends.counter_by_accounts": "{count, plural, other {{counter} orang}} berbicara",
   "trends.trending_now": "Sedang tren sekarang",
   "ui.beforeunload": "Naskah anda akan hilang jika anda keluar dari Mastodon.",
-  "units.short.billion": "{count}B",
-  "units.short.million": "{count}M",
-  "units.short.thousand": "{count}K",
+  "units.short.billion": "{count}M",
+  "units.short.million": "{count}Jt",
+  "units.short.thousand": "{count}Rb",
   "upload_area.title": "Seret & lepaskan untuk mengunggah",
   "upload_button.label": "Tambahkan media",
   "upload_error.limit": "Batas unggah berkas terlampaui.",
@@ -436,16 +458,17 @@
   "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.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "Ubah gambar kecil",
   "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.choose_image": "Choose image",
+  "upload_modal.choose_image": "Pilih gambar",
   "upload_modal.description_placeholder": "Muharjo seorang xenofobia universal yang takut pada warga jazirah, contohnya Qatar",
   "upload_modal.detect_text": "Deteksi teks pada gambar",
   "upload_modal.edit_media": "Sunting media",
   "upload_modal.hint": "Klik atau seret lingkaran pada pratinjau untuk memilih titik fokus yang akan ditampilkan pada semua gambar kecil.",
+  "upload_modal.preparing_ocr": "Menyiapkan OCR…",
   "upload_modal.preview_label": "Pratinjau ({ratio})",
   "upload_progress.label": "Mengunggah...",
   "video.close": "Tutup video",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index e12bf697a..1528dec69 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct Message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Modifikar profilo",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Feature on profile",
   "account.follow": "Sequar",
   "account.followers": "Sequanti",
@@ -96,9 +98,9 @@
   "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",
-  "compose_form.sensitive.marked": "Media is marked as sensitive",
-  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
+  "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Averto di kontenajo",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Tu havas ankore nula savigo. Komunikez kun altri por debutar la konverso.",
   "empty_column.public": "Esas nulo hike! Skribez ulo publike, o manuale sequez uzeri de altra instaluri por plenigar ol.",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Yurizar",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Klozar",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Chanjar videbleso",
   "missing_indicator.label": "Ne trovita",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokusita uzeri",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} repetis tua mesajo",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Efacar savigi",
   "notifications.clear_confirmation": "Ka tu esas certa, ke tu volas efacar omna tua savigi?",
   "notifications.column_settings.alert": "Surtabla savigi",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Repeti:",
   "notifications.column_settings.show": "Montrar en kolumno",
   "notifications.column_settings.sound": "Plear sono",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Kargante...",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index 72d8fefaf..43004bebb 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -9,14 +9,16 @@
   "account.browse_more_on_origin_server": "Skoða nánari upplýsingar á notandasniðinu",
   "account.cancel_follow_request": "Hætta við beiðni um að fylgjast með",
   "account.direct": "Bein skilaboð til @{name}",
+  "account.disable_notifications": "Hætta að láta mig vita þegar @{name} sendir inn",
   "account.domain_blocked": "Lén falið",
   "account.edit_profile": "Breyta notandasniði",
+  "account.enable_notifications": "Láta mig vita þegar @{name} sendir inn",
   "account.endorse": "Birta á notandasniði",
   "account.follow": "Fylgjast með",
   "account.followers": "Fylgjendur",
   "account.followers.empty": "Ennþá fylgist enginn með þessum notanda.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, one {{counter} fylgjandi} other {{counter} fylgjendur}}",
+  "account.following_counter": "{count, plural, one {{counter} fylgist með} other {{counter} fylgjast með}}",
   "account.follows.empty": "Þessi notandi fylgist ennþá ekki með neinum.",
   "account.follows_you": "Fylgir þér",
   "account.hide_reblogs": "Fela endurbirtingar fyrir @{name}",
@@ -36,7 +38,7 @@
   "account.requested": "Bíður eftir samþykki. Smelltu til að hætta við beiðni um að fylgjast með",
   "account.share": "Deila notandasniði fyrir @{name}",
   "account.show_reblogs": "Sýna endurbirtingar frá @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} tíst} other {{counter} tíst}}",
   "account.unblock": "Aflétta útilokun af @{name}",
   "account.unblock_domain": "Hætta að fela {domain}",
   "account.unendorse": "Ekki birta á notandasniði",
@@ -166,13 +168,15 @@
   "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.explanation_addons": "Ekki er hægt að birta þessa síðu rétt. Þetta er líklega af völdum forritsviðbótar í vafranum eða sjálfvirkra þýðainaverkfæra.",
   "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.",
+  "error.unexpected_crash.next_steps_addons": "Prófaðu að gera þau óvirk og svo 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",
   "follow_requests.unlocked_explanation": "Jafnvel þótt aðgangurinn þinn sé ekki læstur, hafa umsjónarmenn {domain} ímyndað sér að þú gætir viljað yfirfara handvirkt fylgjendabeiðnir frá þessum notendum.",
-  "generic.saved": "Saved",
+  "generic.saved": "Vistað",
   "getting_started.developers": "Forritarar",
   "getting_started.directory": "Notandasniðamappa",
   "getting_started.documentation": "Hjálparskjöl",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "að taka virkni úr textainnsetningarreit eða leit",
   "keyboard_shortcuts.up": "að fara ofar í listanum",
   "lightbox.close": "Loka",
+  "lightbox.compress": "Þjappa myndskoðunarreit",
+  "lightbox.expand": "Fletta út myndskoðunarreit",
   "lightbox.next": "Næsta",
   "lightbox.previous": "Fyrra",
   "lightbox.view_context": "Skoða samhengi",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Breyta titli",
   "lists.new.create": "Bæta við lista",
   "lists.new.title_placeholder": "Titill á nýjum lista",
+  "lists.replies_policy.all_replies": "Allra notenda sem fylgst er með",
+  "lists.replies_policy.list_replies": "Meðlima listans",
+  "lists.replies_policy.no_replies": "Engra",
+  "lists.replies_policy.title": "Sýna svör til:",
   "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}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Víxla sýnileika",
   "missing_indicator.label": "Fannst ekki",
   "missing_indicator.sublabel": "Tilfangið fannst ekki",
+  "mute_modal.duration": "Lengd",
   "mute_modal.hide_notifications": "Fela tilkynningar frá þessum notanda?",
+  "mute_modal.indefinite": "Óendanlegt",
   "navigation_bar.apps": "Farsímaforrit",
   "navigation_bar.blocks": "Útilokaðir notendur",
   "navigation_bar.bookmarks": "Bókamerki",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Könnuninni þinni er lokið",
   "notification.poll": "Könnun sem þú tókst þátt í er lokið",
   "notification.reblog": "{name} endurbirti stöðufærsluna þína",
+  "notification.status": "{name} sendi inn rétt í þessu",
   "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",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Endurbirtingar:",
   "notifications.column_settings.show": "Sýna í dálki",
   "notifications.column_settings.sound": "Spila hljóð",
+  "notifications.column_settings.status": "Ný tíst:",
   "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.filter.statuses": "Uppfærslur frá fólki sem þú fylgist með",
   "notifications.group": "{count} tilkynningar",
+  "notifications.mark_as_read": "Merkja allar tilkynningar sem lesnar",
+  "notifications.permission_denied": "Tilkynningar á skjáborði eru ekki aðgengilegar megna áður hafnaðra beiðna fyrir vafra",
+  "notifications.permission_denied_alert": "Ekki var hægt að virkja tilkynningar á skjáborði, þar sem heimildum fyrir vafra var áður hafnað",
+  "notifications_permission_banner.enable": "Virkja tilkynningar á skjáborði",
+  "notifications_permission_banner.how_to_control": "Til að taka á móti tilkynningum þegar Mastodon er ekki opið, skaltu virkja tilkynningar á skjáborði. Þegar þær eru orðnar virkar geturðu stýrt nákvæmlega hverskonar atvik framleiða tilkynningar með því að nota {icon}-hnappinn hér fyrir ofan.",
+  "notifications_permission_banner.title": "Aldrei missa af neinu",
+  "picture_in_picture.restore": "Setja til baka",
   "poll.closed": "Lokað",
   "poll.refresh": "Endurlesa",
   "poll.total_people": "{count, plural, one {# aðili} other {# aðilar}}",
@@ -423,29 +445,30 @@
   "timeline_hint.resources.followers": "Fylgjendur",
   "timeline_hint.resources.follows": "Fylgist með",
   "timeline_hint.resources.statuses": "Eldri tíst",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} aðili} other {{counter} aðilar}} tala",
   "trends.trending_now": "Í umræðunni núna",
   "ui.beforeunload": "Drögin tapast ef þú ferð út úr Mastodon.",
   "units.short.billion": "{count}B",
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Dragðu-og-slepptu hér til að senda inn",
-  "upload_button.label": "Bæta við ({formats}) myndskrá",
+  "upload_button.label": "Bæta við myndum, myndskeiði eða hljóðskrá",
   "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.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "Skipta um smámynd",
   "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.choose_image": "Choose image",
+  "upload_modal.choose_image": "Veldu mynd",
   "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.preparing_ocr": "Undirbý OCR-ljóslestur…",
   "upload_modal.preview_label": "Forskoðun ({ratio})",
   "upload_progress.label": "Er að senda inn...",
   "video.close": "Loka myndskeiði",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 077f61e48..c472e098f 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -1,16 +1,18 @@
 {
-  "account.account_note_header": "La tua nota per @{name}",
-  "account.add_or_remove_from_list": "Aggiungi o Rimuovi dagli elenchi",
+  "account.account_note_header": "Le tue note sull'utente",
+  "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": "Blocca dominio {domain}",
-  "account.blocked": "Bloccato",
-  "account.browse_more_on_origin_server": "Naviga di più sul profilo originale",
+  "account.blocked": "Bloccat*",
+  "account.browse_more_on_origin_server": "Sfoglia ulteriormente sul profilo originale",
   "account.cancel_follow_request": "Annulla richiesta di seguirti",
   "account.direct": "Messaggio diretto a @{name}",
+  "account.disable_notifications": "Smetti di avvisarmi quando @{name} pubblica un post",
   "account.domain_blocked": "Dominio bloccato",
   "account.edit_profile": "Modifica profilo",
+  "account.enable_notifications": "Avvisami quando @{name} pubblica un post",
   "account.endorse": "Mostra sul profilo",
   "account.follow": "Segui",
   "account.followers": "Seguaci",
@@ -19,7 +21,7 @@
   "account.following_counter": "{count, plural, other {{counter} Seguiti}}",
   "account.follows.empty": "Questo utente non segue ancora nessuno.",
   "account.follows_you": "Ti segue",
-  "account.hide_reblogs": "Nascondi incrementi da @{name}",
+  "account.hide_reblogs": "Nascondi condivisioni da @{name}",
   "account.last_status": "Ultima attività",
   "account.link_verified_on": "La proprietà di questo link è stata controllata il {date}",
   "account.locked_info": "Lo stato di privacy del profilo è impostato a bloccato. Il proprietario revisiona manualmente chi lo può seguire.",
@@ -28,14 +30,14 @@
   "account.moved_to": "{name} si è trasferito su:",
   "account.mute": "Silenzia @{name}",
   "account.mute_notifications": "Silenzia notifiche da @{name}",
-  "account.muted": "Silenziato",
+  "account.muted": "Silenziat*",
   "account.never_active": "Mai",
   "account.posts": "Toot",
   "account.posts_with_replies": "Toot e risposte",
   "account.report": "Segnala @{name}",
   "account.requested": "In attesa di approvazione. Clicca per annullare la richiesta di seguire",
   "account.share": "Condividi il profilo di @{name}",
-  "account.show_reblogs": "Mostra incrementi da @{name}",
+  "account.show_reblogs": "Mostra condivisioni da @{name}",
   "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toot}}",
   "account.unblock": "Sblocca @{name}",
   "account.unblock_domain": "Sblocca il dominio {domain}",
@@ -43,9 +45,9 @@
   "account.unfollow": "Smetti di seguire",
   "account.unmute": "Non silenziare @{name}",
   "account.unmute_notifications": "Non silenziare le notifiche da @{name}",
-  "account_note.placeholder": "Nessun commento fornito",
+  "account_note.placeholder": "Clicca per aggiungere una nota",
   "alert.rate_limited.message": "Sei pregato di riprovare tra {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Intervallo limitato",
+  "alert.rate_limited.title": "Limitazione per eccesso di richieste",
   "alert.unexpected.message": "Si è verificato un errore inatteso.",
   "alert.unexpected.title": "Oops!",
   "announcement.announcement": "Annuncio",
@@ -59,9 +61,9 @@
   "bundle_modal_error.retry": "Riprova",
   "column.blocks": "Utenti bloccati",
   "column.bookmarks": "Segnalibri",
-  "column.community": "Fuso orario locale",
+  "column.community": "Timeline locale",
   "column.direct": "Messaggi diretti",
-  "column.directory": "Naviga profili",
+  "column.directory": "Sfoglia profili",
   "column.domain_blocks": "Domini bloccati",
   "column.favourites": "Preferiti",
   "column.follow_requests": "Richieste di seguirti",
@@ -70,7 +72,7 @@
   "column.mutes": "Utenti silenziati",
   "column.notifications": "Notifiche",
   "column.pins": "Toot in evidenza",
-  "column.public": "Fuso orario federato",
+  "column.public": "Timeline federata",
   "column_back_button.label": "Indietro",
   "column_header.hide_settings": "Nascondi impostazioni",
   "column_header.moveLeft_settings": "Sposta colonna a sinistra",
@@ -111,13 +113,13 @@
   "confirmations.delete_list.confirm": "Cancella",
   "confirmations.delete_list.message": "Sei sicuro di voler cancellare definitivamente questa lista?",
   "confirmations.domain_block.confirm": "Blocca l'intero dominio",
-  "confirmations.domain_block.message": "Sei davvero, davvero sicuro di voler bloccare l'intero {domain}? In molti casi pochi blocchi di destinazione o muti sono sufficienti e preferibili. Non vedrai il contenuto da quel dominio in alcuna linea temporale pubblica o nelle tue notifiche. i tuoi seguaci saranno rimossi da quel dominio.",
+  "confirmations.domain_block.message": "Sei davvero, davvero sicuro di voler bloccare l'intero {domain}? In molti casi pochi blocchi di destinazione o muti sono sufficienti e preferibili. Non vedrai il contenuto da quel dominio in alcuna timeline pubblica o nelle tue notifiche. i tuoi seguaci saranno rimossi da quel dominio.",
   "confirmations.logout.confirm": "Disconnettiti",
   "confirmations.logout.message": "Sei sicuro di volerti disconnettere?",
   "confirmations.mute.confirm": "Silenzia",
   "confirmations.mute.explanation": "Questo nasconderà i post da loro ed i post che li menzionano, ma consentirà ancora loro di vedere i tuoi post e di seguirti.",
   "confirmations.mute.message": "Sei sicuro di voler silenziare {name}?",
-  "confirmations.redraft.confirm": "Cancella e rivali",
+  "confirmations.redraft.confirm": "Cancella e riscrivi",
   "confirmations.redraft.message": "Sei sicuro di voler eliminare questo toot e riscriverlo? I preferiti e gli incrementi saranno persi e le risposte al post originale saranno perse.",
   "confirmations.reply.confirm": "Rispondi",
   "confirmations.reply.message": "Rispondere ora sovrascriverà il messaggio che stai correntemente componendo. Sei sicuro di voler procedere?",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Non hai ancora nessuna notifica. Interagisci con altri per iniziare conversazioni.",
   "empty_column.public": "Qui non c'è nulla! Scrivi qualcosa pubblicamente, o aggiungi utenti da altri server per riempire questo spazio",
   "error.unexpected_crash.explanation": "A causa di un bug nel nostro codice o di un problema di compatibilità del browser, questa pagina non può essere visualizzata correttamente.",
+  "error.unexpected_crash.explanation_addons": "Questa pagina non può essere visualizzata correttamente. Questo errore è probabilmente causato da un componente aggiuntivo del browser o da strumenti di traduzione automatica.",
   "error.unexpected_crash.next_steps": "Prova ad aggiornare la pagina. Se non funziona, potresti ancora essere in grado di utilizzare Mastodon attraverso un browser diverso o un'app nativa.",
+  "error.unexpected_crash.next_steps_addons": "Prova a disabilitarli e ad aggiornare la pagina. Se questo non funziona, potresti ancora essere in grado di utilizzare Mastodon attraverso un browser o un'app diversi.",
   "errors.unexpected_crash.copy_stacktrace": "Copia stacktrace negli appunti",
   "errors.unexpected_crash.report_issue": "Segnala il problema",
   "follow_request.authorize": "Autorizza",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "per uscire dall'area di composizione o dalla ricerca",
   "keyboard_shortcuts.up": "per spostarsi in alto nella lista",
   "lightbox.close": "Chiudi",
+  "lightbox.compress": "Comprimi casella di visualizzazione immagine",
+  "lightbox.expand": "Espandi casella di visualizzazione immagine",
   "lightbox.next": "Successivo",
   "lightbox.previous": "Precedente",
   "lightbox.view_context": "Mostra contesto",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Cambia titolo",
   "lists.new.create": "Aggiungi lista",
   "lists.new.title_placeholder": "Titolo della nuova lista",
+  "lists.replies_policy.all_replies": "Qualsiasi utente seguito",
+  "lists.replies_policy.list_replies": "Iscritti alla lista",
+  "lists.replies_policy.no_replies": "Nessuno",
+  "lists.replies_policy.title": "Mostra risposte a:",
   "lists.search": "Cerca tra le persone che segui",
   "lists.subheading": "Le tue liste",
   "load_pending": "{count, plural, one {# nuovo oggetto} other {# nuovi oggetti}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Imposta visibilità",
   "missing_indicator.label": "Non trovato",
   "missing_indicator.sublabel": "Risorsa non trovata",
+  "mute_modal.duration": "Durata",
   "mute_modal.hide_notifications": "Nascondere le notifiche da quest'utente?",
+  "mute_modal.indefinite": "Per sempre",
   "navigation_bar.apps": "App per dispositivi mobili",
   "navigation_bar.blocks": "Utenti bloccati",
   "navigation_bar.bookmarks": "Segnalibri",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Il tuo sondaggio è terminato",
   "notification.poll": "Un sondaggio in cui hai votato è terminato",
   "notification.reblog": "{name} ha condiviso il tuo post",
+  "notification.status": "{name} ha appena pubblicato un post",
   "notifications.clear": "Cancella notifiche",
   "notifications.clear_confirmation": "Vuoi davvero cancellare tutte le notifiche?",
   "notifications.column_settings.alert": "Notifiche desktop",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Post condivisi:",
   "notifications.column_settings.show": "Mostra in colonna",
   "notifications.column_settings.sound": "Riproduci suono",
+  "notifications.column_settings.status": "Nuovi toot:",
   "notifications.filter.all": "Tutti",
   "notifications.filter.boosts": "Condivisioni",
   "notifications.filter.favourites": "Apprezzati",
   "notifications.filter.follows": "Seguaci",
   "notifications.filter.mentions": "Menzioni",
   "notifications.filter.polls": "Risultati del sondaggio",
+  "notifications.filter.statuses": "Aggiornamenti dalle persone che segui",
   "notifications.group": "{count} notifiche",
+  "notifications.mark_as_read": "Segna tutte le notifiche come lette",
+  "notifications.permission_denied": "Impossibile abilitare le notifiche sul desktop perché il permesso è stato negato.",
+  "notifications.permission_denied_alert": "Le notifiche sul desktop non possono essere abilitate, poiché il permesso nel browser è stato negato in precedenza",
+  "notifications_permission_banner.enable": "Abilita le notifiche sul desktop",
+  "notifications_permission_banner.how_to_control": "Per ricevere notifiche quando Mastodon non è aperto, abilita le notifiche desktop. Puoi controllare con precisione quali tipi di interazioni generano notifiche desktop tramite il pulsante {icon} qui sopra, dopo averle abilitate.",
+  "notifications_permission_banner.title": "Non perderti mai nulla",
+  "picture_in_picture.restore": "Riportalo indietro",
   "poll.closed": "Chiuso",
   "poll.refresh": "Aggiorna",
   "poll.total_people": "{count, plural, one {# persona} other {# persone}}",
@@ -426,7 +448,7 @@
   "trends.counter_by_accounts": "{count, plural, one {{counter} persona} other {{counter} persone}} ne parla·no",
   "trends.trending_now": "Di tendenza ora",
   "ui.beforeunload": "La bozza andrà persa se esci da Mastodon.",
-  "units.short.billion": "{count}B",
+  "units.short.billion": "{count}G",
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Trascina per caricare",
@@ -446,8 +468,9 @@
   "upload_modal.detect_text": "Rileva testo dall'immagine",
   "upload_modal.edit_media": "Modifica media",
   "upload_modal.hint": "Clicca o trascina il cerchio sull'anteprima per scegliere il punto focale che sarà sempre visualizzato su tutte le miniature.",
+  "upload_modal.preparing_ocr": "Preparazione OCR…",
   "upload_modal.preview_label": "Anteprima ({ratio})",
-  "upload_progress.label": "Sto caricando...",
+  "upload_progress.label": "Invio in corso...",
   "video.close": "Chiudi video",
   "video.download": "Scarica file",
   "video.exit_fullscreen": "Esci da modalità a schermo intero",
@@ -456,6 +479,6 @@
   "video.hide": "Nascondi video",
   "video.mute": "Silenzia suono",
   "video.pause": "Pausa",
-  "video.play": "Avvia",
+  "video.play": "Riproduci",
   "video.unmute": "Riattiva suono"
 }
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 6ee1c0819..4828114f0 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "リモートで表示",
   "account.cancel_follow_request": "フォローリクエストを取り消す",
   "account.direct": "@{name}さんにダイレクトメッセージ",
+  "account.disable_notifications": "@{name} の投稿時の通知を停止",
   "account.domain_blocked": "ドメインブロック中",
   "account.edit_profile": "プロフィール編集",
+  "account.enable_notifications": "@{name} の投稿時に通知",
   "account.endorse": "プロフィールで紹介する",
   "account.follow": "フォロー",
   "account.followers": "フォロワー",
@@ -103,8 +105,8 @@
   "compose_form.sensitive.hide": "メディアを閲覧注意にする",
   "compose_form.sensitive.marked": "メディアに閲覧注意が設定されています",
   "compose_form.sensitive.unmarked": "メディアに閲覧注意が設定されていません",
-  "compose_form.spoiler.marked": "閲覧注意が設定されています",
-  "compose_form.spoiler.unmarked": "閲覧注意が設定されていません",
+  "compose_form.spoiler.marked": "本文は警告の後ろに隠されます",
+  "compose_form.spoiler.unmarked": "本文は隠されていません",
   "compose_form.spoiler_placeholder": "ここに警告を書いてください",
   "confirmation_modal.cancel": "キャンセル",
   "confirmations.block.block_and_report": "ブロックし通報",
@@ -170,7 +172,9 @@
   "empty_column.notifications": "まだ通知がありません。他の人とふれ合って会話を始めましょう。",
   "empty_column.public": "ここにはまだ何もありません! 公開で何かを投稿したり、他のサーバーのユーザーをフォローしたりしていっぱいにしましょう",
   "error.unexpected_crash.explanation": "不具合かブラウザの互換性問題のため、このページを正しく表示できませんでした。",
+  "error.unexpected_crash.explanation_addons": "このページは正しく表示できませんでした。このエラーはブラウザのアドオンや自動翻訳ツールによって引き起こされることがあります。",
   "error.unexpected_crash.next_steps": "ページの再読み込みをお試しください。それでも解決しない場合、別のブラウザかアプリを使えば使用できることがあります。",
+  "error.unexpected_crash.next_steps_addons": "それらを無効化してからリロードをお試しください。それでも解決しない場合、他のブラウザやアプリで Mastodon をお試しください。",
   "errors.unexpected_crash.copy_stacktrace": "スタックトレースをクリップボードにコピー",
   "errors.unexpected_crash.report_issue": "問題を報告",
   "follow_request.authorize": "許可",
@@ -254,6 +258,8 @@
   "keyboard_shortcuts.unfocus": "トゥート入力欄・検索欄から離れる",
   "keyboard_shortcuts.up": "カラム内一つ上に移動",
   "lightbox.close": "閉じる",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "次",
   "lightbox.previous": "前",
   "lightbox.view_context": "トゥートを表示",
@@ -264,6 +270,10 @@
   "lists.edit.submit": "タイトルを変更",
   "lists.new.create": "リストを作成",
   "lists.new.title_placeholder": "新規リスト名",
+  "lists.replies_policy.all_replies": "フォロー中のユーザー全員",
+  "lists.replies_policy.list_replies": "リストのメンバー",
+  "lists.replies_policy.no_replies": "表示しない",
+  "lists.replies_policy.title": "リプライを表示:",
   "lists.search": "フォローしている人の中から検索",
   "lists.subheading": "あなたのリスト",
   "load_pending": "{count} 件の新着",
@@ -271,8 +281,8 @@
   "media_gallery.toggle_visible": "メディアを隠す",
   "missing_indicator.label": "見つかりません",
   "missing_indicator.sublabel": "見つかりませんでした",
-  "mute_modal.hide_notifications": "このユーザーからの通知を隠しますか?",
   "mute_modal.duration": "ミュートする期間",
+  "mute_modal.hide_notifications": "このユーザーからの通知を隠しますか?",
   "mute_modal.indefinite": "無期限",
   "navigation_bar.apps": "アプリ",
   "navigation_bar.blocks": "ブロックしたユーザー",
@@ -305,6 +315,7 @@
   "notification.own_poll": "アンケートが終了しました",
   "notification.poll": "アンケートが終了しました",
   "notification.reblog": "{name}さんがあなたのトゥートをブーストしました",
+  "notification.status": "{name}さんがトゥートしました",
   "notifications.clear": "通知を消去",
   "notifications.clear_confirmation": "本当に通知を消去しますか?",
   "notifications.column_settings.alert": "デスクトップ通知",
@@ -320,13 +331,22 @@
   "notifications.column_settings.reblog": "ブースト:",
   "notifications.column_settings.show": "カラムに表示",
   "notifications.column_settings.sound": "通知音を再生",
+  "notifications.column_settings.status": "新しいトゥート:",
   "notifications.filter.all": "すべて",
   "notifications.filter.boosts": "ブースト",
   "notifications.filter.favourites": "お気に入り",
   "notifications.filter.follows": "フォロー",
   "notifications.filter.mentions": "返信",
   "notifications.filter.polls": "アンケート結果",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} 件の通知",
+  "notifications.mark_as_read": "すべて既読にする",
+  "notifications.permission_denied": "ブラウザの通知が拒否されているためデスクトップ通知は利用できません",
+  "notifications.permission_denied_alert": "ブラウザの通知が拒否されているためデスクトップ通知を有効にできません",
+  "notifications_permission_banner.enable": "デスクトップ通知を有効にする",
+  "notifications_permission_banner.how_to_control": "Mastodon を閉じている間でも通知を受信するにはデスクトップ通知を有効にしてください。有効にすると上の {icon} ボタンから通知の内容を細かくカスタマイズできます。",
+  "notifications_permission_banner.title": "お見逃しなく",
+  "picture_in_picture.restore": "元に戻す",
   "poll.closed": "終了",
   "poll.refresh": "更新",
   "poll.total_people": "{count}人",
@@ -342,7 +362,7 @@
   "privacy.private.short": "フォロワー限定",
   "privacy.public.long": "誰でも閲覧可、公開TLに表示",
   "privacy.public.short": "公開",
-  "privacy.unlisted.long": "誰でも閲覧可、公開TLに非表示",
+  "privacy.unlisted.long": "誰でも閲覧可、公開タイムラインに非表示",
   "privacy.unlisted.short": "未収載",
   "refresh": "更新",
   "regeneration_indicator.label": "読み込み中…",
@@ -453,6 +473,7 @@
   "upload_modal.detect_text": "画像からテキストを検出",
   "upload_modal.edit_media": "メディアを編集",
   "upload_modal.hint": "サムネイルの焦点にしたい場所をクリックするか円形の枠をその場所にドラッグしてください。",
+  "upload_modal.preparing_ocr": "OCR の準備中…",
   "upload_modal.preview_label": "プレビュー ({ratio})",
   "upload_progress.label": "アップロード中...",
   "video.close": "動画を閉じる",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 0051fee1f..6a0b47fdc 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "პირდაპირი წერილი @{name}-ს",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "დომენი დამალულია",
   "account.edit_profile": "პროფილის ცვლილება",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "გამორჩევა პროფილზე",
   "account.follow": "გაყოლა",
   "account.followers": "მიმდევრები",
@@ -96,7 +98,7 @@
   "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": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
   "compose_form.sensitive.marked": "მედია მონიშნულია მგრძნობიარედ",
   "compose_form.sensitive.unmarked": "მედია არაა მონიშნული მგრძნობიარედ",
   "compose_form.spoiler.marked": "გაფრთხილების უკან ტექსტი დამალულია",
@@ -166,7 +168,9 @@
   "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.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "ავტორიზაცია",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "შედგენის ტექსტ-არეაზე ფოკუსის მოსაშორებლად",
   "keyboard_shortcuts.up": "სიაში ზემოთ გადასაადგილებლად",
   "lightbox.close": "დახურვა",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "შემდეგი",
   "lightbox.previous": "წინა",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "სიის დამატება",
   "lists.new.title_placeholder": "ახალი სიის სათაური",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "ძებნა ადამიანებს შორის რომელთაც მიჰყვებით",
   "lists.subheading": "თქვენი სიები",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "ხილვადობის ჩართვა",
   "missing_indicator.label": "არაა ნაპოვნი",
   "missing_indicator.sublabel": "ამ რესურსის პოვნა ვერ მოხერხდა",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "დავმალოთ შეტყობინებები ამ მომხმარებლისგან?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "დაბლოკილი მომხმარებლები",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name}-მა დაბუსტა თქვენი სტატუსი",
+  "notification.status": "{name} just posted",
   "notifications.clear": "შეტყობინებების გასუფთავება",
   "notifications.clear_confirmation": "დარწმუნებული ხართ, გსურთ სამუდამოდ წაშალოთ ყველა თქვენი შეტყობინება?",
   "notifications.column_settings.alert": "დესკტოპ შეტყობინებები",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "ბუსტები:",
   "notifications.column_settings.show": "გამოჩნდეს სვეტში",
   "notifications.column_settings.sound": "ხმის დაკვრა",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} შეტყობინება",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "იტვირთება...",
   "video.close": "ვიდეოს დახურვა",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index fde037504..261d003aa 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -9,14 +9,16 @@
   "account.browse_more_on_origin_server": "Snirem ugar deg umeɣnu aneẓli",
   "account.cancel_follow_request": "Sefsex asuter n uḍfar",
   "account.direct": "Izen usrid i @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Taɣult yeffren",
   "account.edit_profile": "Ẓreg amaɣnu",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Welleh fell-as deg umaɣnu-inek",
   "account.follow": "Ḍfer",
   "account.followers": "Imeḍfaren",
   "account.followers.empty": "Ar tura, ulac yiwen i yeṭṭafaṛen amseqdac-agi.",
   "account.followers_counter": "{count, plural, one {{count} n umeḍfar} other {{count} n imeḍfaren}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.following_counter": "{count, plural, one {{counter} yeṭṭafaren} aḍfar {{counter} wayeḍ}}",
   "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}",
@@ -36,7 +38,7 @@
   "account.requested": "Di laɛḍil ad yettwaqbel. Ssit i wakken ad yefsex usuter n uḍfar",
   "account.share": "Bḍu amaɣnu n @{name}",
   "account.show_reblogs": "Ssken-d inebḍa n @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} ajewwaq} other {{counter} ijewwaqen}}",
   "account.unblock": "Serreḥ i @{name}",
   "account.unblock_domain": "Ssken-d {domain}",
   "account.unendorse": "Ur ttwellih ara fell-as deg umaɣnu-inek",
@@ -166,8 +168,10 @@
   "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.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Smiren asebter-a, ma ur yekkis ara wugur, ẓer d akken tzemreḍ ad tesqedceḍ Maṣṭudun deg yiminig-nniḍen neɣ deg usnas anaṣli.",
-  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "errors.unexpected_crash.copy_stacktrace": "Nɣel stacktrace ɣef wafus",
   "errors.unexpected_crash.report_issue": "Mmel ugur",
   "follow_request.authorize": "Ssireg",
   "follow_request.reject": "Agi",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "i tulin ɣer d asawen n tebdart",
   "lightbox.close": "Mdel",
+  "lightbox.compress": "Ḥemmeẓ tamnaḍt n uskan n tugna",
+  "lightbox.expand": "Simeɣer tamnaḍt n uskan n tugna",
   "lightbox.next": "Γer zdat",
   "lightbox.previous": "Γer deffir",
   "lightbox.view_context": "Ẓer amnaḍ",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Beddel azwel",
   "lists.new.create": "Rnu tabdart",
   "lists.new.title_placeholder": "Azwel amaynut n tebdart",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "Ula yiwen",
+  "lists.replies_policy.title": "Ssken-d tiririyin i:",
   "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}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Ffer {number, plural, one {tugna} other {tugniwin}}",
   "missing_indicator.label": "Ulac-it",
   "missing_indicator.sublabel": "Ur nufi ara aɣbalu-a",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Tebɣiḍ ad teffreḍ talɣutin n umseqdac-a?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Isnasen izirazen",
   "navigation_bar.blocks": "Imseqdacen yettusḥebsen",
   "navigation_bar.bookmarks": "Ticraḍ",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Tafrant-ik·im tfuk",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} yebḍa tajewwiqt-ik i tikelt-nniḍen",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Sfeḍ tilɣa",
   "notifications.clear_confirmation": "Tebɣiḍ s tidet ad tekkseḍ akk tilɣa-inek·em i lebda?",
   "notifications.column_settings.alert": "Tilɣa n tnarit",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Seǧhed:",
   "notifications.column_settings.show": "Ssken-d tilɣa deg ujgu",
   "notifications.column_settings.sound": "Rmed imesli",
+  "notifications.column_settings.status": "Tiẓenẓunin timaynutin:",
   "notifications.filter.all": "Akk",
   "notifications.filter.boosts": "Seǧhed",
   "notifications.filter.favourites": "Ismenyifen",
   "notifications.filter.follows": "Yeṭafaṛ",
   "notifications.filter.mentions": "Abdar",
   "notifications.filter.polls": "Igemmaḍ n usenqed",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} n tilɣa",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "D awezɣi ad yili wermad n yilɣa n tnarit axateṛ turagt tettwagdel.",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Ifukk",
   "poll.refresh": "Smiren",
   "poll.total_people": "{count, plural, one {# n wemdan} other {# n yemdanen}}",
@@ -328,7 +350,7 @@
   "poll.voted": "Tdeɣṛeḍ ɣef tririt-ayi",
   "poll_button.add_poll": "Rnu asenqed",
   "poll_button.remove_poll": "Kkes asenqed",
-  "privacy.change": "Adjust status privacy",
+  "privacy.change": "Seggem tabaḍnit n yizen",
   "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",
@@ -417,20 +439,20 @@
   "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.moments": "Akuden i d-yeqqimen",
   "time_remaining.seconds": "Mazal {number, plural, one {# n tasint} other {# n tsinin}} id yugran",
   "timeline_hint.remote_resource_not_displayed": "{resource} seg yiqeddacen-nniḍen ur d-ttwaskanent ara.",
   "timeline_hint.resources.followers": "Imeḍfaṛen",
   "timeline_hint.resources.follows": "T·Yeṭafaṛ",
   "timeline_hint.resources.statuses": "Tijewwaqin tiqdimin",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} amdan} imdanen {{counter} wiyaḍ}} yettmeslayen",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Arewway-ik·im ad iruḥ ma yella tefeɣ-d deg Maṣṭudun.",
   "units.short.billion": "{count}B",
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Zuḥeb rnu sers i tasalyt",
-  "upload_button.label": "Rnu taɣwalt ({formats})",
+  "upload_button.label": "Rnu taɣwalt",
   "upload_error.limit": "Asali n ufaylu iεedda talast.",
   "upload_error.poll": "Ur ittusireg ara usali n ufaylu s tefranin.",
   "upload_form.audio_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Sefru-d aḍris seg tugna",
   "upload_modal.edit_media": "Ẓreg taɣwalt",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Taskant ({ratio})",
   "upload_progress.label": "Asali iteddu...",
   "video.close": "Mdel tabidyutt",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index 322c15fff..a2c0856e5 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -1,22 +1,24 @@
 {
-  "account.account_note_header": "Note",
+  "account.account_note_header": "Жазба",
   "account.add_or_remove_from_list": "Тізімге қосу немесе жою",
   "account.badges.bot": "Бот",
-  "account.badges.group": "Group",
+  "account.badges.group": "Топ",
   "account.block": "Бұғаттау @{name}",
   "account.block_domain": "Домендегі барлығын бұғатта {domain}",
   "account.blocked": "Бұғатталды",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "Толығырақ оригинал профилінде қара",
   "account.cancel_follow_request": "Жазылуға сұранымды қайтару",
   "account.direct": "Жеке хат @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Домен жабық",
   "account.edit_profile": "Профильді өңдеу",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Профильде рекомендеу",
   "account.follow": "Жазылу",
   "account.followers": "Оқырмандар",
   "account.followers.empty": "Әлі ешкім жазылмаған.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, one {{counter} Оқырман} other {{counter} Оқырман}}",
+  "account.following_counter": "{count, plural, one {{counter} Жазылым} other {{counter} Жазылым}}",
   "account.follows.empty": "Ешкімге жазылмапты.",
   "account.follows_you": "Сізге жазылыпты",
   "account.hide_reblogs": "@{name} атты қолданушының әрекеттерін жасыру",
@@ -36,19 +38,19 @@
   "account.requested": "Растауын күтіңіз. Жазылудан бас тарту үшін басыңыз",
   "account.share": "@{name} профилін бөлісу\"",
   "account.show_reblogs": "@{name} бөліскендерін көрсету",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} Пост} other {{counter} Пост}}",
   "account.unblock": "Бұғаттан шығару @{name}",
   "account.unblock_domain": "Бұғаттан шығару {domain}",
   "account.unendorse": "Профильде рекомендемеу",
   "account.unfollow": "Оқымау",
   "account.unmute": "@{name} ескертпелерін қосу",
   "account.unmute_notifications": "@{name} ескертпелерін көрсету",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "Жазба қалдыру үшін бас",
   "alert.rate_limited.message": "Қайтадан көріңіз  {retry_time, time, medium} кейін.",
   "alert.rate_limited.title": "Бағалау шектеулі",
   "alert.unexpected.message": "Бір нәрсе дұрыс болмады.",
   "alert.unexpected.title": "Өй!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Хабарландыру",
   "autosuggest_hashtag.per_week": "{count} аптасына",
   "boost_modal.combo": "Келесіде өткізіп жіберу үшін басыңыз {combo}",
   "bundle_column_error.body": "Бұл компонентті жүктеген кезде бір қате пайда болды.",
@@ -79,9 +81,9 @@
   "column_header.show_settings": "Баптауларды көрсет",
   "column_header.unpin": "Алып тастау",
   "column_subheading.settings": "Баптаулар",
-  "community.column_settings.local_only": "Local only",
+  "community.column_settings.local_only": "Тек жергілікті",
   "community.column_settings.media_only": "Тек медиа",
-  "community.column_settings.remote_only": "Remote only",
+  "community.column_settings.remote_only": "Тек сыртқы",
   "compose_form.direct_message_warning": "Тек аталған қолданушыларға.",
   "compose_form.direct_message_warning_learn_more": "Көбірек білу",
   "compose_form.hashtag_warning": "Бұл пост іздеуде хэштегпен шықпайды, өйткені ол бәріне ашық емес. Тек ашық жазбаларды ғана хэштег арқылы іздеп табуға болады.",
@@ -92,8 +94,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.poll.switch_to_multiple": "Бірнеше жауап таңдайтындай қылу",
+  "compose_form.poll.switch_to_single": "Тек бір жауап таңдайтындай қылу",
   "compose_form.publish": "Түрт",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Сезімтал ретінде белгіле",
@@ -166,13 +168,15 @@
   "empty_column.notifications": "Әзірше ешқандай ескертпе жоқ. Басқалармен араласуды бастаңыз және пікірталастарға қатысыңыз.",
   "empty_column.public": "Ештеңе жоқ бұл жерде! Өзіңіз бастап жазып көріңіз немесе басқаларға жазылыңыз",
   "error.unexpected_crash.explanation": "Кодтағы баг немесе браузердегі қатеден, бұл бет дұрыс ашылмай тұр.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Бетті жаңартып көріңіз. Егер бұл көмектеспесе, Mastodon желісін басқа браузерден немесе мобиль қосымшадан ашып көріңіз.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Жиынтықты көшіріп ал клипбордқа",
   "errors.unexpected_crash.report_issue": "Мәселені хабарла",
   "follow_request.authorize": "Авторизация",
   "follow_request.reject": "Қабылдамау",
   "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
-  "generic.saved": "Saved",
+  "generic.saved": "Сақталды",
   "getting_started.developers": "Жасаушылар тобы",
   "getting_started.directory": "Профильдер каталогы",
   "getting_started.documentation": "Құжаттама",
@@ -242,7 +246,7 @@
   "keyboard_shortcuts.reply": "жауап жазу",
   "keyboard_shortcuts.requests": "жазылу сұранымдарын қарау",
   "keyboard_shortcuts.search": "іздеу",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.spoilers": "CW көрсету/жабу",
   "keyboard_shortcuts.start": "бастапқы бағанға бару",
   "keyboard_shortcuts.toggle_hidden": "жабық мәтінді CW ашу/жабу",
   "keyboard_shortcuts.toggle_sensitivity": "көрсет/жап",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "жазба қалдыру алаңынан шығу",
   "keyboard_shortcuts.up": "тізімде жоғары шығу",
   "lightbox.close": "Жабу",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Келесі",
   "lightbox.previous": "Алдыңғы",
   "lightbox.view_context": "Контексті көрсет",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Тақырыбын өзгерту",
   "lists.new.create": "Тізім құру",
   "lists.new.title_placeholder": "Жаңа тізім аты",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Сіз іздеген адамдар арасында іздеу",
   "lists.subheading": "Тізімдеріңіз",
   "load_pending": "{count, plural, one {# жаңа нәрсе} other {# жаңа нәрсе}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Көрінуді қосу",
   "missing_indicator.label": "Табылмады",
   "missing_indicator.sublabel": "Бұл ресурс табылмады",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Бұл қолданушы ескертпелерін жасырамыз ба?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Мобиль қосымшалар",
   "navigation_bar.blocks": "Бұғатталғандар",
   "navigation_bar.bookmarks": "Бетбелгілер",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Сауалнама аяқталды",
   "notification.poll": "Бұл сауалнаманың мерзімі аяқталыпты",
   "notification.reblog": "{name} жазбаңызды бөлісті",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Ескертпелерді тазарт",
   "notifications.clear_confirmation": "Шынымен барлық ескертпелерді өшіресіз бе?",
   "notifications.column_settings.alert": "Үстел ескертпелері",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Бөлісулер:",
   "notifications.column_settings.show": "Бағанда көрсет",
   "notifications.column_settings.sound": "Дыбысын қос",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Барлығы",
   "notifications.filter.boosts": "Бөлісулер",
   "notifications.filter.favourites": "Таңдаулылар",
   "notifications.filter.follows": "Жазылулар",
   "notifications.filter.mentions": "Аталымдар",
   "notifications.filter.polls": "Сауалнама нәтижелері",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} ескертпе",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Жабық",
   "poll.refresh": "Жаңарту",
   "poll.total_people": "{count, plural, one {# адам} other {# адам}}",
@@ -419,11 +441,11 @@
   "time_remaining.minutes": "{number, plural, one {# минут} other {# минут}}",
   "time_remaining.moments": "Қалған уақыт",
   "time_remaining.seconds": "{number, plural, one {# секунд} other {# секунд}}",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "timeline_hint.remote_resource_not_displayed": "{resource} басқа серверлерде көрсетілмейді.",
+  "timeline_hint.resources.followers": "Оқырман",
+  "timeline_hint.resources.follows": "Жазылым",
+  "timeline_hint.resources.statuses": "Ескі посттары",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} адам} other {{counter} адам}} айтып жатыр",
   "trends.trending_now": "Тренд тақырыптар",
   "ui.beforeunload": "Mastodon желісінен шықсаңыз, нобайыңыз сақталмайды.",
   "units.short.billion": "{count}B",
@@ -436,16 +458,17 @@
   "upload_form.audio_description": "Есту қабілеті нашар адамдарға сипаттама беріңіз",
   "upload_form.description": "Көру қабілеті нашар адамдар үшін сипаттаңыз",
   "upload_form.edit": "Түзету",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "Суретті өзгерту",
   "upload_form.undo": "Өшіру",
   "upload_form.video_description": "Есту немесе көру қабілеті нашар адамдарға сипаттама беріңіз",
   "upload_modal.analyzing_picture": "Суретті анализ жасау…",
   "upload_modal.apply": "Қолдану",
-  "upload_modal.choose_image": "Choose image",
+  "upload_modal.choose_image": "Сурет таңдау",
   "upload_modal.description_placeholder": "Щучинск съезіндегі өрт пе? Вагон-үй, аэромобиль һәм ұшақ фюзеляжы цехінен ғой",
   "upload_modal.detect_text": "Суреттен мәтін анықтау",
   "upload_modal.edit_media": "Медиафайлды өңдеу",
   "upload_modal.hint": "Алдын-ала қарау шеңберін басыңыз немесе сүйреңіз, барлық нобайларда көрінетін фокусты таңдау үшін.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Превью ({ratio})",
   "upload_progress.label": "Жүктеп жатыр...",
   "video.close": "Видеоны жабу",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index 8a0014e91..1ac564a70 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -1,16 +1,18 @@
 {
-  "account.account_note_header": "Note",
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.account_note_header": "ಟಿಪ್ಪಣಿ",
+  "account.add_or_remove_from_list": "ಪಟ್ಟಿಗೆ ಸೇರಿಸು ಅಥವ ಪಟ್ಟಿಯಿಂದ ತೆಗೆದುಹಾಕು",
   "account.badges.bot": "Bot",
-  "account.badges.group": "Group",
+  "account.badges.group": "ಗುಂಪು",
   "account.block": "Block @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Edit profile",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Feature on profile",
   "account.follow": "Follow",
   "account.followers": "Followers",
@@ -47,7 +49,7 @@
   "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
   "alert.rate_limited.title": "Rate limited",
   "alert.unexpected.message": "An unexpected error occurred.",
-  "alert.unexpected.title": "Oops!",
+  "alert.unexpected.title": "ಅಯ್ಯೋ!",
   "announcement.announcement": "Announcement",
   "autosuggest_hashtag.per_week": "{count} per week",
   "boost_modal.combo": "You can press {combo} to skip this next time",
@@ -96,9 +98,9 @@
   "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.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Write your warning here",
@@ -166,7 +168,9 @@
   "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",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Authorize",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Show in column",
   "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploading…",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index f13b364b0..24539248a 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "원본 프로필에서 더 탐색하기",
   "account.cancel_follow_request": "팔로우 요청 취소",
   "account.direct": "@{name}의 다이렉트 메시지",
+  "account.disable_notifications": "@{name} 의 게시물 알림 끄기",
   "account.domain_blocked": "도메인 숨겨짐",
   "account.edit_profile": "프로필 편집",
+  "account.enable_notifications": "@{name} 의 게시물 알림 켜기",
   "account.endorse": "프로필에 보이기",
   "account.follow": "팔로우",
   "account.followers": "팔로워",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "아직 알림이 없습니다. 다른 사람과 대화를 시작해 보세요.",
   "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 서버의 유저를 팔로우 해서 채워보세요",
   "error.unexpected_crash.explanation": "버그 혹은 브라우저 호환성 문제로 이 페이지를 올바르게 표시할 수 없습니다.",
+  "error.unexpected_crash.explanation_addons": "이 페이지는 올바르게 보여질 수 없습니다. 브라우저 애드온이나 자동 번역 도구 등으로 인해 발생된 에러일 수 있습니다.",
   "error.unexpected_crash.next_steps": "페이지를 새로고침 해보세요. 그래도 해결되지 않는 경우, 다른 브라우저나 네이티브 앱으로도 마스토돈을 이용하실 수 있습니다.",
+  "error.unexpected_crash.next_steps_addons": "그것들을 끄고 페이지를 새로고침 해보세요. 그래도 해결되지 않는 경우, 다른 브라우저나 네이티브 앱으로도 마스토돈을 이용하실 수 있습니다.",
   "errors.unexpected_crash.copy_stacktrace": "에러 내용을 클립보드에 복사",
   "errors.unexpected_crash.report_issue": "문제 신고",
   "follow_request.authorize": "허가",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "작성창에서 포커스 해제",
   "keyboard_shortcuts.up": "리스트에서 위로 이동",
   "lightbox.close": "닫기",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "다음",
   "lightbox.previous": "이전",
   "lightbox.view_context": "게시물 보기",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "제목 수정",
   "lists.new.create": "리스트 추가",
   "lists.new.title_placeholder": "새 리스트의 이름",
+  "lists.replies_policy.all_replies": "팔로우 한 사용자 누구나",
+  "lists.replies_policy.list_replies": "목록의 멤버들",
+  "lists.replies_policy.no_replies": "아무도 없음",
+  "lists.replies_policy.title": "답글 표시:",
   "lists.search": "팔로우 중인 사람들 중에서 찾기",
   "lists.subheading": "당신의 리스트",
   "load_pending": "{count}개의 새 항목",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "표시 전환",
   "missing_indicator.label": "찾을 수 없습니다",
   "missing_indicator.sublabel": "이 리소스를 찾을 수 없었습니다",
+  "mute_modal.duration": "기간",
   "mute_modal.hide_notifications": "이 사용자로부터의 알림을 숨기시겠습니까?",
+  "mute_modal.indefinite": "무기한",
   "navigation_bar.apps": "모바일 앱",
   "navigation_bar.blocks": "차단한 사용자",
   "navigation_bar.bookmarks": "보관함",
@@ -291,13 +303,14 @@
   "navigation_bar.preferences": "사용자 설정",
   "navigation_bar.public_timeline": "연합 타임라인",
   "navigation_bar.security": "보안",
-  "notification.favourite": "{name}님이 즐겨찾기 했습니다",
-  "notification.follow": "{name}님이 나를 팔로우 했습니다",
-  "notification.follow_request": "{name}님이 팔로우 요청을 보냈습니다",
-  "notification.mention": "{name}님이 답글을 보냈습니다",
+  "notification.favourite": "{name} 님이 즐겨찾기 했습니다",
+  "notification.follow": "{name} 님이 나를 팔로우 했습니다",
+  "notification.follow_request": "{name} 님이 팔로우 요청을 보냈습니다",
+  "notification.mention": "{name} 님이 답글을 보냈습니다",
   "notification.own_poll": "내 투표가 끝났습니다",
   "notification.poll": "당신이 참여 한 투표가 종료되었습니다",
-  "notification.reblog": "{name}님이 부스트 했습니다",
+  "notification.reblog": "{name} 님이 부스트 했습니다",
+  "notification.status": "{name} 님이 방금 게시물을 올렸습니다",
   "notifications.clear": "알림 지우기",
   "notifications.clear_confirmation": "정말로 알림을 삭제하시겠습니까?",
   "notifications.column_settings.alert": "데스크탑 알림",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "부스트:",
   "notifications.column_settings.show": "컬럼에 표시",
   "notifications.column_settings.sound": "효과음 재생",
+  "notifications.column_settings.status": "새 툿:",
   "notifications.filter.all": "모두",
   "notifications.filter.boosts": "부스트",
   "notifications.filter.favourites": "즐겨찾기",
   "notifications.filter.follows": "팔로우",
   "notifications.filter.mentions": "멘션",
   "notifications.filter.polls": "투표 결과",
+  "notifications.filter.statuses": "팔로우 하는 사람들의 최신 게시물",
   "notifications.group": "{count} 개의 알림",
+  "notifications.mark_as_read": "모든 알림을 읽은 상태로 표시",
+  "notifications.permission_denied": "권한이 거부되었기 때문에 데스크탑 알림을 활성화할 수 없음",
+  "notifications.permission_denied_alert": "이전에 브라우저 권한이 거부되었기 때문에, 데스크탑 알림이 활성화 될 수 없습니다.",
+  "notifications_permission_banner.enable": "데스크탑 알림 활성화",
+  "notifications_permission_banner.how_to_control": "마스토돈이 열려 있지 않을 때에도 알림을 받으려면, 데스크탑 알림을 활성화 하세요. 당신은 어떤 종류의 반응이 데스크탑 알림을 발생할 지를 {icon} 버튼을 통해 세세하게 설정할 수 있습니다.",
+  "notifications_permission_banner.title": "아무것도 놓치지 마세요",
+  "picture_in_picture.restore": "다시 넣기",
   "poll.closed": "마감됨",
   "poll.refresh": "새로고침",
   "poll.total_people": "{count}명",
@@ -390,7 +412,7 @@
   "status.read_more": "더 보기",
   "status.reblog": "부스트",
   "status.reblog_private": "원래의 수신자들에게 부스트",
-  "status.reblogged_by": "{name}님이 부스트 했습니다",
+  "status.reblogged_by": "{name} 님이 부스트 했습니다",
   "status.reblogs.empty": "아직 아무도 이 툿을 부스트하지 않았습니다. 부스트 한 사람들이 여기에 표시 됩니다.",
   "status.redraft": "지우고 다시 쓰기",
   "status.remove_bookmark": "보관한 툿 삭제",
@@ -419,7 +441,7 @@
   "time_remaining.minutes": "{number} 분 남음",
   "time_remaining.moments": "남은 시간",
   "time_remaining.seconds": "{number} 초 남음",
-  "timeline_hint.remote_resource_not_displayed": "다른 서버의 {resource}는 보여지지 않습니다.",
+  "timeline_hint.remote_resource_not_displayed": "다른 서버의 {resource} 표시는 할 수 없습니다.",
   "timeline_hint.resources.followers": "팔로워",
   "timeline_hint.resources.follows": "팔로우",
   "timeline_hint.resources.statuses": "이전 툿",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "이미지에서 텍스트 추출",
   "upload_modal.edit_media": "미디어 편집",
   "upload_modal.hint": "미리보기를 클릭하거나 드래그 해서 포컬 포인트를 맞추세요. 이 점은 썸네일에 항상 보여질 부분을 나타냅니다.",
+  "upload_modal.preparing_ocr": "OCR 준비 중…",
   "upload_modal.preview_label": "미리보기 ({ratio})",
   "upload_progress.label": "업로드 중...",
   "video.close": "동영상 닫기",
diff --git a/app/javascript/mastodon/locales/ku.json b/app/javascript/mastodon/locales/ku.json
index b3822ff08..b40a15669 100644
--- a/app/javascript/mastodon/locales/ku.json
+++ b/app/javascript/mastodon/locales/ku.json
@@ -1,461 +1,484 @@
 {
-  "account.account_note_header": "Note",
-  "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": "Block domain {domain}",
-  "account.blocked": "Blocked",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
-  "account.cancel_follow_request": "Cancel follow request",
-  "account.direct": "Direct message @{name}",
-  "account.domain_blocked": "Domain blocked",
-  "account.edit_profile": "Edit profile",
-  "account.endorse": "Feature on profile",
-  "account.follow": "Follow",
-  "account.followers": "Followers",
-  "account.followers.empty": "No one follows this user yet.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+  "account.account_note_header": "تێبینیتێبینی",
+  "account.add_or_remove_from_list": "زیادکردن یان سڕینەوە لە پێرستەکان",
+  "account.badges.bot": "بوت",
+  "account.badges.group": "گرووپ",
+  "account.block": "بلۆکی @{name}",
+  "account.block_domain": "بلۆکی هەموو شتێک لە {domain}",
+  "account.blocked": "بلۆککرا",
+  "account.browse_more_on_origin_server": "گەڕانی فرەتر لە سەر پرۆفایلی سەرەکی",
+  "account.cancel_follow_request": "بەتاڵکردنی داوای شوێنکەوتن",
+  "account.direct": "پەیامی تایبەت بە @{name}",
+  "account.disable_notifications": "ئاگانامە مەنێرە بۆم کاتێک @{name} پۆست دەکرێت",
+  "account.domain_blocked": "دۆمەین قەپاتکرا",
+  "account.edit_profile": "دەستکاری پرۆفایل",
+  "account.enable_notifications": "ئاگادارم بکەوە کاتێک @{name} بابەتەکان",
+  "account.endorse": "ناساندن لە پرۆفایل",
+  "account.follow": "شوێنکەوتن",
+  "account.followers": "شوێنکەوتووان",
+  "account.followers.empty": "کەسێک شوێن ئەم بەکارهێنەرە نەکەوتووە",
+  "account.followers_counter": "{count, plural, one {{counter} شوێنکەوتوو} other {{counter} شوێنکەوتوو}}",
   "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
-  "account.follows.empty": "This user doesn't follow anyone yet.",
-  "account.follows_you": "Follows you",
-  "account.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.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
-  "account.unblock": "Unblock @{name}",
-  "account.unblock_domain": "Unblock domain {domain}",
-  "account.unendorse": "Don't feature on profile",
-  "account.unfollow": "Unfollow",
-  "account.unmute": "Unmute @{name}",
-  "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account_note.placeholder": "Click to add a note",
-  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
-  "alert.rate_limited.title": "Rate limited",
-  "alert.unexpected.message": "An unexpected error occurred.",
-  "alert.unexpected.title": "Oops!",
-  "announcement.announcement": "Announcement",
-  "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.bookmarks": "Bookmarks",
-  "column.community": "Local timeline",
-  "column.direct": "Direct messages",
-  "column.directory": "Browse profiles",
-  "column.domain_blocks": "Blocked 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.local_only": "Local only",
-  "community.column_settings.media_only": "Media only",
-  "community.column_settings.remote_only": "Remote 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.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",
+  "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.statuses_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.unblock": "@{name} لاببە",
+  "account.unblock_domain": "کردنەوەی دۆمەینی {domain}",
+  "account.unendorse": "تایبەتمەندی لەسەر پرۆفایلەکە نیە",
+  "account.unfollow": "بەدوادانەچو",
+  "account.unmute": "بێدەنگکردنی @{name}",
+  "account.unmute_notifications": "بێدەنگکردنی هۆشیارییەکان لە @{name}",
+  "account_note.placeholder": "کرتەبکە بۆ زیادکردنی تێبینی",
+  "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} بۆ بازدان لە جاری داهاتوو",
+  "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": "نیشانەکان",
+  "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.local_only": "تەنها خۆماڵی",
+  "community.column_settings.media_only": "تەنها میدیا",
+  "community.column_settings.remote_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.poll.add_option": "زیادکردنی هەڵبژاردەیەک",
+  "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": "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",
-  "confirmations.block.block_and_report": "Block & Report",
-  "confirmations.block.confirm": "Block",
-  "confirmations.block.message": "Are you sure you want to block {name}?",
-  "confirmations.delete.confirm": "Delete",
-  "confirmations.delete.message": "Are you sure you want to delete this status?",
-  "confirmations.delete_list.confirm": "Delete",
-  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
-  "confirmations.domain_block.confirm": "Hide entire domain",
-  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
-  "confirmations.logout.confirm": "Log out",
-  "confirmations.logout.message": "Are you sure you want to log out?",
-  "confirmations.mute.confirm": "Mute",
-  "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",
-  "embed.instructions": "Embed this status on your website by copying the code below.",
-  "embed.preview": "Here is what it will look like:",
-  "emoji_button.activity": "Activity",
-  "emoji_button.custom": "Custom",
-  "emoji_button.flags": "Flags",
-  "emoji_button.food": "Food & Drink",
-  "emoji_button.label": "Insert emoji",
-  "emoji_button.nature": "Nature",
-  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
-  "emoji_button.objects": "Objects",
-  "emoji_button.people": "People",
-  "emoji_button.recent": "Frequently used",
-  "emoji_button.search": "Search...",
-  "emoji_button.search_results": "Search results",
-  "emoji_button.symbols": "Symbols",
-  "emoji_button.travel": "Travel & Places",
-  "empty_column.account_timeline": "No toots here!",
-  "empty_column.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 blocked 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",
-  "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",
-  "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
-  "generic.saved": "Saved",
-  "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
-  "getting_started.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",
-  "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}}",
-  "introduction.federation.action": "Next",
-  "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
-  "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
-  "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish toot-orial!",
-  "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
-  "keyboard_shortcuts.back": "to navigate back",
-  "keyboard_shortcuts.blocked": "to open blocked users list",
-  "keyboard_shortcuts.boost": "to boost",
-  "keyboard_shortcuts.column": "to focus a status in one of the columns",
-  "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.description": "Description",
-  "keyboard_shortcuts.direct": "to open direct messages column",
-  "keyboard_shortcuts.down": "to move down in the list",
-  "keyboard_shortcuts.enter": "to open status",
-  "keyboard_shortcuts.favourite": "to favourite",
-  "keyboard_shortcuts.favourites": "to open favourites list",
-  "keyboard_shortcuts.federated": "to open federated timeline",
-  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
-  "keyboard_shortcuts.home": "to open home timeline",
-  "keyboard_shortcuts.hotkey": "Hotkey",
-  "keyboard_shortcuts.legend": "to display this legend",
-  "keyboard_shortcuts.local": "to open local timeline",
-  "keyboard_shortcuts.mention": "to mention author",
-  "keyboard_shortcuts.muted": "to open muted users list",
-  "keyboard_shortcuts.my_profile": "to open your profile",
-  "keyboard_shortcuts.notifications": "to open notifications column",
-  "keyboard_shortcuts.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",
-  "keyboard_shortcuts.requests": "to open follow requests list",
-  "keyboard_shortcuts.search": "to focus search",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
-  "keyboard_shortcuts.start": "to open \"get started\" column",
-  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
-  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
-  "keyboard_shortcuts.toot": "to start a brand new toot",
-  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
-  "keyboard_shortcuts.up": "to move up in the list",
-  "lightbox.close": "Close",
-  "lightbox.next": "Next",
-  "lightbox.previous": "Previous",
-  "lightbox.view_context": "View context",
-  "lists.account.add": "Add to list",
-  "lists.account.remove": "Remove from list",
-  "lists.delete": "Delete list",
-  "lists.edit": "Edit list",
-  "lists.edit.submit": "Change title",
-  "lists.new.create": "Add list",
-  "lists.new.title_placeholder": "New list title",
-  "lists.search": "Search among people you follow",
-  "lists.subheading": "Your lists",
+  "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": "بلۆک & گوزارشت",
+  "confirmations.block.confirm": "بلۆک",
+  "confirmations.block.message": "ئایا دڵنیایت لەوەی دەتەوێت {name} بلۆک بکەیت?",
+  "confirmations.delete.confirm": "سڕینەوە",
+  "confirmations.delete.message": "ئایا دڵنیایت لەوەی دەتەوێت ئەم توتە بسڕیتەوە?",
+  "confirmations.delete_list.confirm": "سڕینەوە",
+  "confirmations.delete_list.message": "ئایا دڵنیایت لەوەی دەتەوێت بە هەمیشەیی ئەم لیستە بسڕیتەوە?",
+  "confirmations.domain_block.confirm": "بلۆککردنی هەموو دۆمەینەکە",
+  "confirmations.domain_block.message": "ئایا بەڕاستی، بەڕاستی تۆ دەتەوێت هەموو {domain} بلۆک بکەیت؟ لە زۆربەی حاڵەتەکاندا چەند بلۆکێکی ئامانجدار یان بێدەنگەکان پێویست و پەسەندن. تۆ ناوەڕۆک ێک نابینیت لە دۆمەینەکە لە هیچ هێڵی کاتی گشتی یان ئاگانامەکانت. شوێنکەوتوانی تۆ لەو دۆمەینەوە لادەبرێن.",
+  "confirmations.logout.confirm": "چوونە دەرەوە",
+  "confirmations.logout.message": "ئایا دڵنیایت لەوەی دەتەوێت بچیتە دەرەوە?",
+  "confirmations.mute.confirm": "بێدەنگ",
+  "confirmations.mute.explanation": "ئەمەش دەبێتە هۆی شاردنەوەی پۆستەکان یان ئەو بابەتانەی کە ئاماژەیان پێ دەکات ، بەڵام هێشتا ڕێگەیان پێ دەدات کە پۆستەکانتان ببینن و شوێنتان بکەون.",
+  "confirmations.mute.message": "ئایا دڵنیایت لەوەی دەتەوێت بیلێیت {name}?",
+  "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.preview": "ئەمە ئەو شتەیە کە لە شێوەی خۆی دەچێت:",
+  "emoji_button.activity": "چالاکی",
+  "emoji_button.custom": "ئاسایی",
+  "emoji_button.flags": "ئاڵاکان",
+  "emoji_button.food": "خواردن& خواردنەوە",
+  "emoji_button.label": "ئیمۆجی بکەنێو",
+  "emoji_button.nature": "سروشت",
+  "emoji_button.not_found": "بێ ئیمۆجی! (╯°□°)╯( ┻━┻",
+  "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": "تۆ هێشتا هیچ توتێکی دیاریکراوت نیە کاتێک نیشانەیەک نیشان دەکەیت، لێرە دەرئەکەویت.",
+  "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": "بەهۆی بوونی کێشە لە کۆدەکەمان یان کێشەی گونجانی وێبگەڕەکە، ئەم لاپەڕەیە بە دروستی پیشان نادرێت.",
+  "error.unexpected_crash.explanation_addons": "ئەم لاپەڕەیە ناتوانرێت بە دروستی پیشان بدرێت. ئەم هەڵەیە لەوانەیە بەهۆی ئامێری وەرگێڕانی خۆکار یان زیادکراوی وێبگەڕەوە بێت.",
+  "error.unexpected_crash.next_steps": "هەوڵدە لاپەڕەکە تازە بکەوە. ئەگەر ئەمە یارمەتیدەر نەبوو، لەوانەیە هێشتا بتوانیت ماستۆدۆن بەکاربێنیت لە ڕێگەی وێبگەڕەکەیان کاربەرنامەی ڕەسەن.",
+  "error.unexpected_crash.next_steps_addons": "هەوڵدە لەکاریان بخەیت و لاپەڕەکە تازە بکەوە. ئەگەر ئەمە یارمەتیدەر نەبوو، لەوانەیە هێشتا بتوانیت ماستۆدۆن بەکاربێنیت لە ڕێگەی وێبگەڕەکانی دیکە یان نەرمەکالاکانی ئەسڵی.",
+  "errors.unexpected_crash.copy_stacktrace": "کۆپیکردنی ستێکتراسی بۆ کلیپ بۆرد",
+  "errors.unexpected_crash.report_issue": "کێشەی گوزارشت",
+  "follow_request.authorize": "ده‌سه‌ڵاتپێدراو",
+  "follow_request.reject": "ڕەتکردنەوە",
+  "follow_requests.unlocked_explanation": "هەرچەندە هەژمارەکەت داخراو نییە، ستافی {domain} وا بیریان کردەوە کە لەوانەیە بتانەوێت پێداچوونەوە بە داواکاریەکانی ئەم هەژمارەدا بکەن بە دەستی.",
+  "generic.saved": "پاشکەوتکرا",
+  "getting_started.developers": "پەرەپێدەران",
+  "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": "وەڵامدانەوەکان پیشان بدە",
+  "home.hide_announcements": "شاردنەوەی راگەیەنراوەکان",
+  "home.show_announcements": "پیشاندانی راگەیەنراوەکان",
+  "intervals.full.days": "{number, plural, one {# ڕۆژ} other {# ڕۆژەک}}",
+  "intervals.full.hours": "{number, plural, one {# کات} other {# کات}}",
+  "intervals.full.minutes": "{number, plural, one {# خولەک} other {# خولەک}}",
+  "introduction.federation.action": "داهاتوو",
+  "introduction.federation.federated.headline": "گشتی",
+  "introduction.federation.federated.text": "نووسراوە گشتیەکان لە خزمەتگوزاریەکانی تری جیهانی دەرئەکەون لە هێڵی گشتی.",
+  "introduction.federation.home.headline": "سەرەتا",
+  "introduction.federation.home.text": "ئەو بابەتانەی کە بەشوێنیان دەکەویت لە پەڕەی ژوورەکەت دەردەکەوێت. دەتوانیت شوێن هەموو کەسێک بکەویت لەسەر هەر ڕاژەیەک!",
+  "introduction.federation.local.headline": "ناوخۆیی",
+  "introduction.federation.local.text": "نووسراوە گشتیەکان لە خەڵک لەسەر هەمان ڕاژە وەک تۆ دەردەکەون لە هێڵی کاتی ناوخۆیی.",
+  "introduction.interactions.action": "خوێندنی تەواوبکە!",
+  "introduction.interactions.favourite.headline": "دڵخواز",
+  "introduction.interactions.favourite.text": "دەتوانیت پاشترتوتێک پاشەکەوت بکەیت، با نووسەر بزانێت کە تۆ حەزت لێ بوو، بە ئارەزووی خۆت.",
+  "introduction.interactions.reblog.headline": "بەهێزکردن",
+  "introduction.interactions.reblog.text": "دەتوانیت دەنگی کەسانی تر هاوبەش بکەیت لەگەڵ شوێنکەوتوانی خۆت بە بەهێزکردنیان.",
+  "introduction.interactions.reply.headline": "وەڵام",
+  "introduction.interactions.reply.text": "دەتوانیت وەڵامی کەسانی تر و توتەکانی خۆت بدەوە، کە لە گفتوگۆیەکدا بە یەکەوە زنجیریان دەکات.",
+  "introduction.welcome.action": "با بڕۆین!",
+  "introduction.welcome.headline": "هەنگاوی یەکەم",
+  "introduction.welcome.text": "بەخێربێیت بۆتۆڕەکۆمەڵەییەکانی چربووە! لە چەند ساتێکی کەمدا دەتوانیت پەیامەکان پەخش بکەیت و لەگەڵ هاوڕێکانت لە ناو چەندین جۆر لە ڕاژەکان قسە بکەیت.. بەڵام ئەم ڕاژانە، {domain}، جیاوزە لەگەڵ ئەوانی دیکە بۆ ئەوە کە میوانداری پرۆفایلەکەت دەکان، بۆیە ناوەکەیت لەبیربێت.",
+  "keyboard_shortcuts.back": "بۆ گەڕانەوە",
+  "keyboard_shortcuts.blocked": "بۆ کردنەوەی لیستی بەکارهێنەرە بلۆککراوەکان",
+  "keyboard_shortcuts.boost": "بۆ بەهێزکردن",
+  "keyboard_shortcuts.column": "بۆ ئەوەی تیشک بخاتە سەر توتێک لە یەکێک لە ستوونەکان",
+  "keyboard_shortcuts.compose": "بۆ سەرنجدان بە نووسینی ناوچەی دەق",
+  "keyboard_shortcuts.description": "وه‌سف",
+  "keyboard_shortcuts.direct": "بۆ کردنەوەی ستوونی نامە ڕاستەوخۆکان",
+  "keyboard_shortcuts.down": "بۆ چوونە خوارەوە لە لیستەکەدا",
+  "keyboard_shortcuts.enter": "بۆ کردنەوەی توت",
+  "keyboard_shortcuts.favourite": "بۆ دڵخواز",
+  "keyboard_shortcuts.favourites": "بۆ کردنەوەی لیستی دڵخوازەکان",
+  "keyboard_shortcuts.federated": "بۆ کردنەوەی نووسراوەکانی هەمووشوێن",
+  "keyboard_shortcuts.heading": "قه‌دبڕەکانی تەختەکلیل",
+  "keyboard_shortcuts.home": "بۆ کردنەوەی هێڵی کاتی ماڵەوە",
+  "keyboard_shortcuts.hotkey": "هۆتکەی",
+  "keyboard_shortcuts.legend": "بۆ نیشاندانی ئەم نیشانە",
+  "keyboard_shortcuts.local": "بۆ کردنەوەی نووسراوەکانی خۆماڵی",
+  "keyboard_shortcuts.mention": "نۆ ناوبردن لە نووسەر",
+  "keyboard_shortcuts.muted": "بۆ کردنەوەی پێرستی بەکارهێنەرانی بێدەنگ",
+  "keyboard_shortcuts.my_profile": "بۆ کردنەوەی پرۆفایڵ",
+  "keyboard_shortcuts.notifications": "بۆ کردنەوەی ستوونی ئاگانامەکان",
+  "keyboard_shortcuts.open_media": "بۆ کردنەوەی میدیا",
+  "keyboard_shortcuts.pinned": "بۆ کردنەوەی لیستی توتەکانی چەسپێنراو",
+  "keyboard_shortcuts.profile": "بۆ کردنەوەی پرۆفایڵی نووسەر",
+  "keyboard_shortcuts.reply": "بۆ وەڵامدانەوە",
+  "keyboard_shortcuts.requests": "بۆ کردنەوەی لیستی داواکاریەکانی بەدوادا",
+  "keyboard_shortcuts.search": "بۆ جەختکردن لەسەر گەڕان",
+  "keyboard_shortcuts.spoilers": "بۆ پیشاندان/شاردنەوەی خانەی CW",
+  "keyboard_shortcuts.start": "بۆ کردنەوەی ستوونی \"دەست پێبکە\"",
+  "keyboard_shortcuts.toggle_hidden": "بۆ پیشاندان/شاردنەوەی دەق لە پشت CW",
+  "keyboard_shortcuts.toggle_sensitivity": "بۆ پیشاندان/شاردنەوەی میدیا",
+  "keyboard_shortcuts.toot": "بۆ دەست کردن بە براندێکی تازە",
+  "keyboard_shortcuts.unfocus": "بۆ دروستکردنی ناوچەی دەق/گەڕان",
+  "keyboard_shortcuts.up": "بۆ ئەوەی لە لیستەکەدا بڕۆیت",
+  "lightbox.close": "دابخە",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
+  "lightbox.next": "داهاتوو",
+  "lightbox.previous": "پێشوو",
+  "lightbox.view_context": "پێشاندانی دەق",
+  "lists.account.add": "زیادکردن بۆ لیست",
+  "lists.account.remove": "لابردن لە لیست",
+  "lists.delete": "سڕینەوەی لیست",
+  "lists.edit": "دەستکاری لیست",
+  "lists.edit.submit": "گۆڕینی ناونیشان",
+  "lists.new.create": "زیادکردنی لیست",
+  "lists.new.title_placeholder": "ناونیشانی لیستی نوێ",
+  "lists.replies_policy.all_replies": "هەربەکارهێنەرێکی شوێنکەوتوو",
+  "lists.replies_policy.list_replies": "ئەندامانی لیستەکە",
+  "lists.replies_policy.no_replies": "هیچکەس",
+  "lists.replies_policy.title": "پیشاندانی وەڵامەکان بۆ:",
+  "lists.search": "بگەڕێ لەناو ئەو کەسانەی کە شوێنیان کەوتویت",
+  "lists.subheading": "لیستەکانت",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
-  "loading_indicator.label": "Loading...",
-  "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
-  "missing_indicator.label": "Not found",
-  "missing_indicator.sublabel": "This resource could not be found",
-  "mute_modal.hide_notifications": "Hide notifications from this user?",
-  "navigation_bar.apps": "Mobile apps",
-  "navigation_bar.blocks": "Blocked users",
-  "navigation_bar.bookmarks": "Bookmarks",
-  "navigation_bar.community_timeline": "Local timeline",
-  "navigation_bar.compose": "Compose new toot",
-  "navigation_bar.direct": "Direct messages",
-  "navigation_bar.discover": "Discover",
-  "navigation_bar.domain_blocks": "Hidden domains",
-  "navigation_bar.edit_profile": "Edit profile",
-  "navigation_bar.favourites": "Favourites",
-  "navigation_bar.filters": "Muted words",
-  "navigation_bar.follow_requests": "Follow requests",
-  "navigation_bar.follows_and_followers": "Follows and followers",
-  "navigation_bar.info": "About this server",
-  "navigation_bar.keyboard_shortcuts": "Hotkeys",
-  "navigation_bar.lists": "Lists",
-  "navigation_bar.logout": "Logout",
-  "navigation_bar.mutes": "Muted users",
-  "navigation_bar.personal": "Personal",
-  "navigation_bar.pins": "Pinned toots",
-  "navigation_bar.preferences": "Preferences",
-  "navigation_bar.public_timeline": "Federated timeline",
-  "navigation_bar.security": "Security",
-  "notification.favourite": "{name} favourited your status",
-  "notification.follow": "{name} followed you",
-  "notification.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",
-  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
-  "notifications.column_settings.alert": "Desktop notifications",
-  "notifications.column_settings.favourite": "Favourites:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
-  "notifications.column_settings.follow": "New followers:",
-  "notifications.column_settings.follow_request": "New follow requests:",
-  "notifications.column_settings.mention": "Mentions:",
-  "notifications.column_settings.poll": "Poll results:",
-  "notifications.column_settings.push": "Push notifications",
-  "notifications.column_settings.reblog": "Boosts:",
-  "notifications.column_settings.show": "Show in column",
-  "notifications.column_settings.sound": "Play sound",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
-  "notifications.filter.polls": "Poll results",
-  "notifications.group": "{count} notifications",
-  "poll.closed": "Closed",
-  "poll.refresh": "Refresh",
-  "poll.total_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",
-  "privacy.change": "Adjust status privacy",
-  "privacy.direct.long": "Visible for mentioned users only",
-  "privacy.direct.short": "Direct",
-  "privacy.private.long": "Visible for followers only",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Visible for all, shown in public timelines",
-  "privacy.public.short": "Public",
-  "privacy.unlisted.long": "Visible for all, but not in public timelines",
-  "privacy.unlisted.short": "Unlisted",
-  "refresh": "Refresh",
-  "regeneration_indicator.label": "Loading…",
-  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
-  "relative_time.days": "{number}d",
-  "relative_time.hours": "{number}h",
-  "relative_time.just_now": "now",
-  "relative_time.minutes": "{number}m",
-  "relative_time.seconds": "{number}s",
-  "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?",
-  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
-  "report.placeholder": "Additional comments",
-  "report.submit": "Submit",
-  "report.target": "Report {target}",
-  "search.placeholder": "Search",
-  "search_popout.search_format": "Advanced search format",
-  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
-  "search_popout.tips.hashtag": "hashtag",
-  "search_popout.tips.status": "status",
-  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
-  "search_popout.tips.user": "user",
-  "search_results.accounts": "People",
-  "search_results.hashtags": "Hashtags",
-  "search_results.statuses": "Toots",
-  "search_results.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.bookmark": "Bookmark",
-  "status.cancel_reblog_private": "Unboost",
-  "status.cannot_reblog": "This post cannot be boosted",
-  "status.copy": "Copy link to status",
-  "status.delete": "Delete",
-  "status.detailed_status": "Detailed conversation view",
-  "status.direct": "Direct message @{name}",
-  "status.embed": "Embed",
-  "status.favourite": "Favourite",
-  "status.filtered": "Filtered",
-  "status.load_more": "Load more",
-  "status.media_hidden": "Media hidden",
-  "status.mention": "Mention @{name}",
-  "status.more": "More",
-  "status.mute": "Mute @{name}",
-  "status.mute_conversation": "Mute conversation",
-  "status.open": "Expand this status",
-  "status.pin": "Pin on profile",
-  "status.pinned": "Pinned toot",
-  "status.read_more": "Read more",
-  "status.reblog": "Boost",
-  "status.reblog_private": "Boost with original visibility",
-  "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}",
-  "status.sensitive_warning": "Sensitive content",
-  "status.share": "Share",
-  "status.show_less": "Show less",
-  "status.show_less_all": "Show less for all",
-  "status.show_more": "Show more",
-  "status.show_more_all": "Show more for all",
-  "status.show_thread": "Show thread",
-  "status.uncached_media_warning": "Not available",
-  "status.unmute_conversation": "Unmute conversation",
-  "status.unpin": "Unpin from profile",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
-  "tabs_bar.federated_timeline": "Federated",
-  "tabs_bar.home": "Home",
-  "tabs_bar.local_timeline": "Local",
-  "tabs_bar.notifications": "Notifications",
-  "tabs_bar.search": "Search",
-  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
-  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
-  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
-  "time_remaining.moments": "Moments remaining",
-  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
-  "trends.trending_now": "Trending now",
-  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
-  "units.short.billion": "{count}B",
-  "units.short.million": "{count}M",
-  "units.short.thousand": "{count}K",
-  "upload_area.title": "Drag & drop to upload",
-  "upload_button.label": "Add images, a video or an audio file",
-  "upload_error.limit": "File upload limit exceeded.",
-  "upload_error.poll": "File upload not allowed with polls.",
-  "upload_form.audio_description": "Describe for people with hearing loss",
-  "upload_form.description": "Describe for the visually impaired",
-  "upload_form.edit": "Edit",
-  "upload_form.thumbnail": "Change thumbnail",
-  "upload_form.undo": "Delete",
-  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
-  "upload_modal.analyzing_picture": "Analyzing picture…",
-  "upload_modal.apply": "Apply",
-  "upload_modal.choose_image": "Choose image",
-  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Detect text from picture",
-  "upload_modal.edit_media": "Edit media",
-  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
-  "upload_modal.preview_label": "Preview ({ratio})",
-  "upload_progress.label": "Uploading…",
-  "video.close": "Close video",
-  "video.download": "Download file",
-  "video.exit_fullscreen": "Exit full screen",
-  "video.expand": "Expand video",
-  "video.fullscreen": "Full screen",
-  "video.hide": "Hide video",
-  "video.mute": "Mute sound",
-  "video.pause": "Pause",
-  "video.play": "Play",
-  "video.unmute": "Unmute sound"
+  "loading_indicator.label": "بارکردن...",
+  "media_gallery.toggle_visible": "شاردنەوەی {number, plural, one {image} other {images}}",
+  "missing_indicator.label": "نەدۆزرایەوە",
+  "missing_indicator.sublabel": "ئەو سەرچاوەیە نادۆزرێتەوە",
+  "mute_modal.duration": "ماوە",
+  "mute_modal.hide_notifications": "شاردنەوەی ئاگانامەکان لەم بەکارهێنەرە؟ ",
+  "mute_modal.indefinite": "نادیار",
+  "navigation_bar.apps": "بەرنامەی مۆبایل",
+  "navigation_bar.blocks": "بەکارهێنەرە بلۆککراوەکان",
+  "navigation_bar.bookmarks": "نیشانکراوەکان",
+  "navigation_bar.community_timeline": "دەمنامەی ناوخۆیی",
+  "navigation_bar.compose": "نووسینی توتی نوێ",
+  "navigation_bar.direct": "نامە ڕاستەوخۆکان",
+  "navigation_bar.discover": "دۆزینەوە",
+  "navigation_bar.domain_blocks": "دۆمەینە بلۆک کراوەکان",
+  "navigation_bar.edit_profile": "دەستکاری پرۆفایل بکە",
+  "navigation_bar.favourites": "دڵخوازەکان",
+  "navigation_bar.filters": "وشە کپەکان",
+  "navigation_bar.follow_requests": "بەدواداچوی داواکاریەکان بکە",
+  "navigation_bar.follows_and_followers": "شوێنکەوتوو و شوێنکەوتوان",
+  "navigation_bar.info": "دەربارەی ئەم ڕاژە",
+  "navigation_bar.keyboard_shortcuts": "هۆتکەی",
+  "navigation_bar.lists": "لیستەکان",
+  "navigation_bar.logout": "دەرچوون",
+  "navigation_bar.mutes": "کپکردنی بەکارهێنەران",
+  "navigation_bar.personal": "کەسی",
+  "navigation_bar.pins": "توتی چەسپاو",
+  "navigation_bar.preferences": "پەسەندەکان",
+  "navigation_bar.public_timeline": "نووسراوەکانی هەمووشوێنێک",
+  "navigation_bar.security": "ئاسایش",
+  "notification.favourite": "{name} نووسراوەکەتی پەسەند کرد",
+  "notification.follow": "{name} دوای تۆ کەوت",
+  "notification.follow_request": "{name} داوای کردووە کە شوێنت بکەوێت",
+  "notification.mention": "{name} باسی ئێوەی کرد",
+  "notification.own_poll": "ڕاپرسیەکەت کۆتایی هات",
+  "notification.poll": "ڕاپرسییەک کە دەنگی پێداویت کۆتایی هات",
+  "notification.reblog": "{name} نووسراوەکەتی دووبارە توتاند",
+  "notification.status": "{name} تازە بڵاوکرایەوە",
+  "notifications.clear": "ئاگانامەکان بسڕیەوە",
+  "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.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.column_settings.status": "توتەکانی نوێ:",
+  "notifications.filter.all": "هەموو",
+  "notifications.filter.boosts": "دووبارەتوتەکان",
+  "notifications.filter.favourites": "دڵخوازەکان",
+  "notifications.filter.follows": "شوێنکەوتن",
+  "notifications.filter.mentions": "ئاماژەکان",
+  "notifications.filter.polls": "ئەنجامەکانی ڕاپرسی",
+  "notifications.filter.statuses": "نوێکردنەوەکان ئەو کەسانەی کە پەیڕەوی دەکەیت",
+  "notifications.group": "{count} ئاگانامە",
+  "notifications.mark_as_read": "هەموو ئاگانامەکان وەک خوێندراوەتەوە نیشان بکە",
+  "notifications.permission_denied": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت وەک ڕێپێدان ڕەتکرایەوە.",
+  "notifications.permission_denied_alert": "ناتوانرێت ئاگانامەکانی دێسکتۆپ چالاک بکرێت، چونکە پێشتر مۆڵەتی وێبگەڕ ڕەتکرایەوە",
+  "notifications_permission_banner.enable": "چالاککردنی ئاگانامەکانی دێسکتۆپ",
+  "notifications_permission_banner.how_to_control": "بۆ وەرگرتنی ئاگانامەکان کاتێک ماستۆدۆن نەکراوەیە، ئاگانامەکانی دێسکتۆپ چالاک بکە. دەتوانیت بە وردی کۆنترۆڵی جۆری کارلێکەکان بکەیت کە ئاگانامەکانی دێسکتۆپ دروست دەکەن لە ڕێگەی دوگمەی {icon} لەسەرەوە کاتێک چالاک دەکرێن.",
+  "notifications_permission_banner.title": "هەرگیز شتێک لە دەست مەدە",
+  "picture_in_picture.restore": "بیگەڕێنەوە",
+  "poll.closed": "دابخە",
+  "poll.refresh": "نوێکردنەوە",
+  "poll.total_people": "{count, plural, one {# خەڵک} other {# خەڵک}}",
+  "poll.total_votes": "{count, plural, one {# دەنگ} other {# دەنگ}}\n",
+  "poll.vote": "دەنگ",
+  "poll.voted": "تۆ دەنگت بەو وەڵامە دا",
+  "poll_button.add_poll": "ڕاپرسییەک زیاد بکە",
+  "poll_button.remove_poll": "ده‌نگدان بسڕه‌وه‌‌",
+  "privacy.change": "ڕێکخستنی تایبەتمەندی توت",
+  "privacy.direct.long": "تەنیا بۆ بەکارهێنەرانی ناوبراو",
+  "privacy.direct.short": "ڕاستەوخۆ",
+  "privacy.private.long": "بینراو تەنها بۆ شوێنکەوتوان",
+  "privacy.private.short": "تەنها بۆ شوێنکەوتوان",
+  "privacy.public.long": "بۆ هەمووان دیاربێت، لە هێڵی کاتی گشتی دا نیشان دەدرێت",
+  "privacy.public.short": "گشتی",
+  "privacy.unlisted.long": "بۆ هەمووان دیارە، بەڵام لە هێڵی کاتی گشتیدا نا",
+  "privacy.unlisted.short": "لە لیست نەکراو",
+  "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}کات",
+  "relative_time.today": "ئیمڕۆ",
+  "reply_indicator.cancel": "هەڵوەشاندنەوه",
+  "report.forward": "ناردن بۆ {target}",
+  "report.forward_hint": "هەژمارەکە لە ڕاژەیەکی ترە. ڕونووسێکی نەناسراو بنێرە بۆ گوزارشت لەوێ?",
+  "report.hint": "گوزارشتەکە دەنێردرێت بۆ بەرپرسانی ڕاژەکەت. دەتوانیت ڕوونکردنەوەیەک پێشکەش بکەیت کە بۆچی ئەم هەژمارە لە خوارەوە گوزارش دەکەیت:",
+  "report.placeholder": "سەرنجەکانی زیاتر",
+  "report.submit": "ناردن",
+  "report.target": "گوزارشتکردنی{target}",
+  "search.placeholder": "گەڕان",
+  "search_popout.search_format": "شێوەی گەڕانی پێشکەوتوو",
+  "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": "هەشتاگ",
+  "search_results.statuses": "توتەکان",
+  "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.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.more": "زیاتر",
+  "status.mute": "بێدەنگکردن @{name}",
+  "status.mute_conversation": "گفتوگۆی بێدەنگ",
+  "status.open": "ئەم توتە فراوان بکە",
+  "status.pin": "لکاندن لەسەر پرۆفایل",
+  "status.pinned": "توتی چەسپکراو",
+  "status.read_more": "زیاتر بخوێنەوە",
+  "status.reblog": "بەهێزکردن",
+  "status.reblog_private": "بەهێزکردن بۆ بینەرانی سەرەتایی",
+  "status.reblogged_by": "{name} توتی کردەوە",
+  "status.reblogs.empty": "کەس ئەم توتەی دووبارە نەتوتاندوە ،کاتێک کەسێک وا بکات، لێرە دەرئەکەون.",
+  "status.redraft": "سڕینەوەی و دووبارە ڕەشنووس",
+  "status.remove_bookmark": "لابردنی نیشانه",
+  "status.reply": "وەڵام",
+  "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.uncached_media_warning": "بەردەست نیە",
+  "status.unmute_conversation": "گفتوگۆی بێدەنگ",
+  "status.unpin": "لابردن لە پرۆفایل",
+  "suggestions.dismiss": "ڕەتکردنەوەی پێشنیار",
+  "suggestions.header": "لەوانەیە حەزت لەمەش بێت…",
+  "tabs_bar.federated_timeline": "گشتی",
+  "tabs_bar.home": "سەرەتا",
+  "tabs_bar.local_timeline": "ناوخۆیی",
+  "tabs_bar.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.seconds": "{number, plural, one {# چرکە} other {# چرکە}} ماوە",
+  "timeline_hint.remote_resource_not_displayed": "{resource} لە ڕاژەکانی ترەوە پیشان نادرێت.",
+  "timeline_hint.resources.followers": "شوێنکەوتووان",
+  "timeline_hint.resources.follows": "شوێنکەوتن",
+  "timeline_hint.resources.statuses": "توتی کۆن",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} کەس} other {{counter} کەس}} گفتوگۆ دەکا",
+  "trends.trending_now": "گۆگران",
+  "ui.beforeunload": "ڕەشنووسەکەت لە دەست دەچێت ئەگەر لە ماستۆدۆن بڕۆیت.",
+  "units.short.billion": "{count}ملیار",
+  "units.short.million": "{count}ملیۆن",
+  "units.short.thousand": "{count}هەزار",
+  "upload_area.title": "ڕاکێشان & دانان بۆ بارکردن",
+  "upload_button.label": "زیادکردنی وێنەکان، ڤیدیۆیەک یان فایلێکی دەنگی",
+  "upload_error.limit": "سنووری بارکردنی فایل تێپەڕیوە.",
+  "upload_error.poll": "پەڕگەکە ڕێی پێنەدراوە بە ڕاپرسی باربکرێت.",
+  "upload_form.audio_description": "بۆ ئەو کەسانەی کە گوێ بیستیان هەیە وەسف دەکات",
+  "upload_form.description": "وەسف بکە بۆ کەمبینایان",
+  "upload_form.edit": "دەستکاری",
+  "upload_form.thumbnail": "گۆڕانی وینۆچکە",
+  "upload_form.undo": "سڕینەوە",
+  "upload_form.video_description": "بۆ کەم بینایان و کەم بیستان وەسفی بکە",
+  "upload_modal.analyzing_picture": "شیکردنەوەی وێنە…",
+  "upload_modal.apply": "جێبەجێ کردن",
+  "upload_modal.choose_image": "وێنە هەڵبژێرە",
+  "upload_modal.description_placeholder": "بە دڵ کەین با بە نەشئەی مەی غوباری میحنەتی دونیا",
+  "upload_modal.detect_text": "دەقی وێنەکە بدۆزیەوە",
+  "upload_modal.edit_media": "دەستکاریکردنی میدیا",
+  "upload_modal.hint": "گەر وێنە چکۆلە یان بڕاوەبێت، خاڵی ناوەندی دیار دەکەوێت. خاڵی ناوەندی وێنە بە کرتە یان جێبەجیکردنی رێکبخەن.",
+  "upload_modal.preparing_ocr": "ئامادەکردنی OCR…",
+  "upload_modal.preview_label": "پێشبینی ({ratio})",
+  "upload_progress.label": "بارکردن...",
+  "video.close": "داخستنی ڤیدیۆ",
+  "video.download": "داگرتنی فایل",
+  "video.exit_fullscreen": "دەرچوون لە پڕ شاشە",
+  "video.expand": "ڤیدیۆفراوان بکە",
+  "video.fullscreen": "پڕپیشانگەر",
+  "video.hide": "شاردنەوەی ڤیدیۆ",
+  "video.mute": "دەنگی کپ",
+  "video.pause": "وەستان",
+  "video.play": "پەخشکردن",
+  "video.unmute": "دەنگ لابدە"
 }
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index 8a0014e91..6141f321e 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Edit profile",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Feature on profile",
   "account.follow": "Follow",
   "account.followers": "Followers",
@@ -96,9 +98,9 @@
   "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.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Write your warning here",
@@ -166,7 +168,9 @@
   "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",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Authorize",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Show in column",
   "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploading…",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 41d983f48..061ab2a83 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Pārlūkot vairāk sākotnējā profilā",
   "account.cancel_follow_request": "Atcelt pieprasījumu",
   "account.direct": "Privātā ziņa @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domēns ir paslēpts",
   "account.edit_profile": "Labot profilu",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Izcelts profilā",
   "account.follow": "Sekot",
   "account.followers": "Sekotāji",
@@ -96,7 +98,7 @@
   "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",
+  "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
   "compose_form.sensitive.marked": "Mēdijs ir atzīmēts kā sensitīvs",
   "compose_form.sensitive.unmarked": "Mēdijs nav atzīmēts kā sensitīvs",
   "compose_form.spoiler.marked": "Teksts ir paslēpts aiz brīdinājuma",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Tev nav paziņojumu. Iesaisties sarunās ar citiem.",
   "empty_column.public": "Šeit nekā nav, tukšums! Ieraksti kaut ko publiski, vai uzmeklē un seko kādam no citas instances",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Autorizēt",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Show in column",
   "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploading…",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index aeaf7355c..b640b8c66 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Одкажи барање за следење",
   "account.direct": "Директна порана @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Скриен домен",
   "account.edit_profile": "Измени профил",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Карактеристики на профилот",
   "account.follow": "Следи",
   "account.followers": "Следбеници",
@@ -166,7 +168,9 @@
   "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",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Пријавете проблем",
   "follow_request.authorize": "Одобри",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Бустови:",
   "notifications.column_settings.show": "Прикажи во колона",
   "notifications.column_settings.sound": "Свири звуци",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Сите",
   "notifications.filter.boosts": "Бустови",
   "notifications.filter.favourites": "Омилени",
   "notifications.filter.follows": "Следења",
   "notifications.filter.mentions": "Спомнувања",
   "notifications.filter.polls": "Резултати од анкета",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} нотификации",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Затворени",
   "poll.refresh": "Освежи",
   "poll.total_people": "{count, plural, one {# човек} other {# луѓе}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploading…",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index 0c5a84204..08c3cacd0 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -6,11 +6,13 @@
   "account.block": "@{name} നെ ബ്ലോക്ക് ചെയ്യുക",
   "account.block_domain": "{domain} ൽ നിന്നുള്ള എല്ലാം മറയ്കുക",
   "account.blocked": "തടഞ്ഞു",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "യഥാർത്ഥ പ്രൊഫൈലിലേക്ക് പോവുക",
   "account.cancel_follow_request": "പിന്തുടരാനുള്ള അപേക്ഷ നിരസിക്കുക",
   "account.direct": "@{name} ന് നേരിട്ട് മെസേജ് അയക്കുക",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "മേഖല മറയ്ക്കപ്പെട്ടിരിക്കുന്നു",
   "account.edit_profile": "പ്രൊഫൈൽ തിരുത്തുക",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "പ്രൊഫൈലിൽ പ്രകടമാക്കുക",
   "account.follow": "പിന്തുടരുക",
   "account.followers": "പിന്തുടരുന്നവർ",
@@ -92,13 +94,13 @@
   "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.poll.switch_to_multiple": "വോട്ടെടുപ്പിൽ ഒന്നിലധികം ചോയ്‌സുകൾ ഉൾപ്പെടുതുക",
+  "compose_form.poll.switch_to_single": "വോട്ടെടുപ്പിൽ ഒരൊറ്റ ചോയ്‌സ്‌ മാത്രം ആക്കുക",
   "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.publish_loud": "{പ്രസിദ്ധീകരിക്കുക}!",
+  "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "എഴുത്ത് മുന്നറിയിപ്പിനാൽ മറച്ചിരിക്കുന്നു",
   "compose_form.spoiler.unmarked": "എഴുത്ത് മറയ്ക്കപ്പെട്ടിട്ടില്ല",
   "compose_form.spoiler_placeholder": "നിങ്ങളുടെ മുന്നറിയിപ്പ് ഇവിടെ എഴുതുക",
@@ -139,7 +141,7 @@
   "emoji_button.food": "ഭക്ഷണവും പാനീയവും",
   "emoji_button.label": "ഇമോജി ചേർക്കുക",
   "emoji_button.nature": "പ്രകൃതി",
-  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "എമോജി പാടില്ല (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "വസ്തുക്കൾ",
   "emoji_button.people": "ആളുകൾ",
   "emoji_button.recent": "അടിക്കടി ഉപയോഗിക്കുന്നവ",
@@ -150,7 +152,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.bookmarked_statuses": "നിങ്ങൾക് ഇതുവരെ അടയാളപ്പെടുത്തിയ ടൂട്ടുകൾ ഇല്ല. അടയാളപ്പെടുത്തിയാൽ അത് ഇവിടെ വരും.",
   "empty_column.community": "പ്രാദേശികമായ സമയരേഖ ശൂന്യമാണ്. എന്തെങ്കിലും പരസ്യമായി എഴുതി തുടക്കം കുറിക്കു!",
   "empty_column.direct": "നിങ്ങൾക്ക് ഇതുവരെ നേരിട്ടുള്ള സന്ദേശങ്ങൾ ഒന്നുമില്ല. നിങ്ങൾ അങ്ങനെ ഒന്ന് അയക്കുകയോ, നിങ്ങൾക്ക് ലഭിക്കുകയോ ചെയ്യുന്നപക്ഷം അതിവിടെ കാണപ്പെടുന്നതാണ്.",
   "empty_column.domain_blocks": "മറയ്ക്കപ്പെട്ടിരിക്കുന്ന മേഖലകൾ ഇതുവരെ ഇല്ല.",
@@ -159,14 +161,16 @@
   "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
   "empty_column.hashtag": "There is nothing in this hashtag yet.",
   "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
-  "empty_column.home.public_timeline": "the public timeline",
+  "empty_column.home.public_timeline": "പൊതു സമയരേഖ",
   "empty_column.list": "There is nothing in this list yet. 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": "നിങ്ങൾക്ക് ഇതുവരെ ഒരു അറിയിപ്പുകളും ഇല്ല. മറ്റുള്ളവരുമായി ഇടപെട്ട് സംഭാഷണത്തിന് തുടക്കം കുറിക്കു.",
   "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.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "പ്രശ്നം അറിയിക്കുക",
   "follow_request.authorize": "ചുമതലപ്പെടുത്തുക",
@@ -217,13 +221,13 @@
   "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.boost": "to boost",
+  "keyboard_shortcuts.boost": "ബൂസ്റ്റ് ചെയ്യുക",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
   "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.enter": "ടൂട്ട് എടുക്കാൻ",
   "keyboard_shortcuts.favourite": "to favourite",
   "keyboard_shortcuts.favourites": "to open favourites list",
   "keyboard_shortcuts.federated": "to open federated timeline",
@@ -239,7 +243,7 @@
   "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",
+  "keyboard_shortcuts.reply": "മറുപടി അയക്കാൻ",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
   "keyboard_shortcuts.spoilers": "to show/hide CW field",
@@ -249,30 +253,38 @@
   "keyboard_shortcuts.toot": "to start a brand new toot",
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
-  "lightbox.close": "Close",
-  "lightbox.next": "Next",
-  "lightbox.previous": "Previous",
+  "lightbox.close": "അടയ്ക്കുക",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
+  "lightbox.next": "അടുത്തത്",
+  "lightbox.previous": "പുറകോട്ട്",
   "lightbox.view_context": "View context",
-  "lists.account.add": "Add to list",
-  "lists.account.remove": "Remove from list",
-  "lists.delete": "Delete list",
-  "lists.edit": "Edit list",
-  "lists.edit.submit": "Change title",
-  "lists.new.create": "Add list",
+  "lists.account.add": "പട്ടികയിലേക്ക് ചേർക്കുക",
+  "lists.account.remove": "പട്ടികയിൽ നിന്ന് ഒഴിവാക്കുക",
+  "lists.delete": "പട്ടിക ഒഴിവാക്കുക",
+  "lists.edit": "പട്ടിക തിരുത്തുക",
+  "lists.edit.submit": "തലക്കെട്ട് മാറ്റുക",
+  "lists.new.create": "പുതിയ പട്ടിക ചേർക്കുക",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
-  "lists.subheading": "Your lists",
+  "lists.subheading": "എന്റെ പട്ടികകൾ",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
-  "loading_indicator.label": "Loading...",
+  "loading_indicator.label": "ലോഡിംഗ്...",
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
-  "missing_indicator.label": "Not found",
+  "missing_indicator.label": "കാണാനില്ല",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
-  "navigation_bar.bookmarks": "Bookmarks",
+  "navigation_bar.bookmarks": "അടയാളങ്ങൾ",
   "navigation_bar.community_timeline": "Local timeline",
-  "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.compose": "പുതിയ ടൂട്ട് എഴുതുക",
   "navigation_bar.direct": "Direct messages",
   "navigation_bar.discover": "Discover",
   "navigation_bar.domain_blocks": "Hidden domains",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Show in column",
   "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploading…",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index e07baddff..33f8cfd84 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "अनुयायी होण्याची विनंती रद्द करा",
   "account.direct": "थेट संदेश @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "प्रोफाइल एडिट करा",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Feature on profile",
   "account.follow": "अनुयायी व्हा",
   "account.followers": "अनुयायी",
@@ -96,9 +98,9 @@
   "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.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Write your warning here",
@@ -166,7 +168,9 @@
   "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",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Authorize",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Show in column",
   "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploading…",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index ffac61ed0..a4006a745 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Edit profile",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Feature on profile",
   "account.follow": "Follow",
   "account.followers": "Followers",
@@ -96,9 +98,9 @@
   "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.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Write your warning here",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
   "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Authorize",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Show in column",
   "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploading…",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index c5d64aa3d..acab31394 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Meer op het originele profiel bekijken",
   "account.cancel_follow_request": "Volgverzoek annuleren",
   "account.direct": "@{name} een direct bericht sturen",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Server verborgen",
   "account.edit_profile": "Profiel bewerken",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Op profiel weergeven",
   "account.follow": "Volgen",
   "account.followers": "Volgers",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Je hebt nog geen meldingen. Begin met iemand een gesprek.",
   "empty_column.public": "Er is hier helemaal niks! Toot iets in het openbaar of volg mensen van andere servers om het te vullen",
   "error.unexpected_crash.explanation": "Als gevolg van een bug in onze broncode of als gevolg van een compatibiliteitsprobleem met jouw webbrowser, kan deze pagina niet goed worden weergegeven.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Probeer deze pagina te vernieuwen. Wanneer dit niet helpt is het nog steeds mogelijk om Mastodon in een andere webbrowser of mobiele app te gebruiken.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Stacktrace naar klembord kopiëren",
   "errors.unexpected_crash.report_issue": "Technisch probleem melden",
   "follow_request.authorize": "Goedkeuren",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "om het tekst- en zoekvak te ontfocussen",
   "keyboard_shortcuts.up": "om omhoog te bewegen in de lijst",
   "lightbox.close": "Sluiten",
+  "lightbox.compress": "Afbeelding passend weergeven",
+  "lightbox.expand": "Afbeelding groot weergeven",
   "lightbox.next": "Volgende",
   "lightbox.previous": "Vorige",
   "lightbox.view_context": "Context tonen",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Titel veranderen",
   "lists.new.create": "Lijst toevoegen",
   "lists.new.title_placeholder": "Naam nieuwe lijst",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Zoek naar mensen die je volgt",
   "lists.subheading": "Jouw lijsten",
   "load_pending": "{count, plural, one {# nieuw item} other {# nieuwe items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Media verbergen",
   "missing_indicator.label": "Niet gevonden",
   "missing_indicator.sublabel": "Deze hulpbron kan niet gevonden worden",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Verberg meldingen van deze persoon?",
+  "mute_modal.indefinite": "Voor onbepaalde tijd",
   "navigation_bar.apps": "Mobiele apps",
   "navigation_bar.blocks": "Geblokkeerde gebruikers",
   "navigation_bar.bookmarks": "Bladwijzers",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Meldingen verwijderen",
   "notifications.clear_confirmation": "Weet je het zeker dat je al jouw meldingen wilt verwijderen?",
   "notifications.column_settings.alert": "Desktopmeldingen",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "In kolom tonen",
   "notifications.column_settings.sound": "Geluid afspelen",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Alles",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favorieten",
   "notifications.filter.follows": "Die jij volgt",
   "notifications.filter.mentions": "Vermeldingen",
   "notifications.filter.polls": "Pollresultaten",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} meldingen",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Notificatie meldingen inschakelen",
+  "notifications_permission_banner.how_to_control": "Gebruikt notificaties om ook meldingen te ontvangen wanneer Mastodon niet open is. U kunt precies bepalen welke soort meldingen wel of geen notificaties afgeven via de bovenstaande knop {icon}.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Gesloten",
   "poll.refresh": "Vernieuwen",
   "poll.total_people": "{count, plural, one {# persoon} other {# mensen}}",
@@ -426,9 +448,9 @@
   "trends.counter_by_accounts": "{count, plural, one {{counter} persoon} other {{counter} personen}} zijn aan het praten",
   "trends.trending_now": "Trends",
   "ui.beforeunload": "Je concept zal verloren gaan als je Mastodon verlaat.",
-  "units.short.billion": "{count}B",
-  "units.short.million": "{count}M",
-  "units.short.thousand": "{count}K",
+  "units.short.billion": "{count} miljard",
+  "units.short.million": "{count} miljoen",
+  "units.short.thousand": "{count} duizend",
   "upload_area.title": "Hiernaar toe slepen om te uploaden",
   "upload_button.label": "Afbeeldingen, een video- of een geluidsbestand toevoegen",
   "upload_error.limit": "Uploadlimiet van bestand overschreden.",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Tekst in een afbeelding detecteren",
   "upload_modal.edit_media": "Media bewerken",
   "upload_modal.hint": "Klik of sleep de cirkel in de voorvertoning naar een centraal punt dat op elke thumbnail zichtbaar moet blijven.",
+  "upload_modal.preparing_ocr": "OCR voorbereiden…",
   "upload_modal.preview_label": "Voorvertoning ({ratio})",
   "upload_progress.label": "Uploaden...",
   "video.close": "Video sluiten",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index b567a3533..f6518afab 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -1,22 +1,24 @@
 {
-  "account.account_note_header": "Note",
+  "account.account_note_header": "Merknad",
   "account.add_or_remove_from_list": "Legg til eller tak vekk frå listene",
   "account.badges.bot": "Robot",
   "account.badges.group": "Gruppe",
   "account.block": "Blokker @{name}",
   "account.block_domain": "Skjul alt frå {domain}",
   "account.blocked": "Blokkert",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "Sjå gjennom meir på den opphavlege profilen",
   "account.cancel_follow_request": "Fjern fylgjeførespurnad",
   "account.direct": "Send melding til @{name}",
+  "account.disable_notifications": "Slutt å varsle meg når @{name} legger ut innlegg",
   "account.domain_blocked": "Domenet er gøymt",
   "account.edit_profile": "Rediger profil",
+  "account.enable_notifications": "Varsle meg når @{name} legger ut innlegg",
   "account.endorse": "Framhev på profil",
   "account.follow": "Fylg",
   "account.followers": "Fylgjarar",
   "account.followers.empty": "Ingen fylgjer denne brukaren enno.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, one {{counter} fylgjar} other {{counter} fylgjarar}}",
+  "account.following_counter": "{count, plural, one {{counter} fylgjar} other {{counter} fylgjar}}",
   "account.follows.empty": "Denne brukaren fylgjer ikkje nokon enno.",
   "account.follows_you": "Fylgjer deg",
   "account.hide_reblogs": "Gøym fremhevingar frå @{name}",
@@ -36,14 +38,14 @@
   "account.requested": "Ventar på samtykke. Klikk for å avbryta fylgjeførespurnaden",
   "account.share": "Del @{name} sin profil",
   "account.show_reblogs": "Vis framhevingar frå @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} tut} other {{counter} tut}}",
   "account.unblock": "Slutt å blokera @{name}",
   "account.unblock_domain": "Vis {domain}",
   "account.unendorse": "Ikkje framhev på profil",
   "account.unfollow": "Slutt å fylgja",
   "account.unmute": "Av-demp @{name}",
   "account.unmute_notifications": "Vis varsel frå @{name}",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "Klikk for å leggja til merknad",
   "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.",
@@ -54,7 +56,7 @@
   "bundle_column_error.body": "Noko gjekk gale mens denne komponenten vart lasta ned.",
   "bundle_column_error.retry": "Prøv igjen",
   "bundle_column_error.title": "Nettverksfeil",
-  "bundle_modal_error.close": "Lukk",
+  "bundle_modal_error.close": "Lat att",
   "bundle_modal_error.message": "Noko gjekk gale under lastinga av denne komponenten.",
   "bundle_modal_error.retry": "Prøv igjen",
   "column.blocks": "Blokkerte brukarar",
@@ -79,9 +81,9 @@
   "column_header.show_settings": "Vis innstillingar",
   "column_header.unpin": "Løys",
   "column_subheading.settings": "Innstillingar",
-  "community.column_settings.local_only": "Kun lokalt",
+  "community.column_settings.local_only": "Berre lokalt",
   "community.column_settings.media_only": "Berre media",
-  "community.column_settings.remote_only": "Kun eksternt",
+  "community.column_settings.remote_only": "Berre eksternt",
   "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": "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.",
@@ -166,13 +168,15 @@
   "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.explanation_addons": "Denne siden kunne ikke vises riktig. Denne feilen er sannsynligvis forårsaket av en nettleserutvidelse eller automatiske oversettelsesverktøy.",
   "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.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Kopier stacktrace til utklippstavla",
   "errors.unexpected_crash.report_issue": "Rapporter problem",
   "follow_request.authorize": "Autoriser",
   "follow_request.reject": "Avvis",
-  "follow_requests.unlocked_explanation": "Selv om kontoen din ikke er låst, tror {domain} ansatte at du kanskje vil gjennomgå forespørsler fra disse kontoene manuelt.",
-  "generic.saved": "Saved",
+  "follow_requests.unlocked_explanation": "Sjølv om kontoen din ikkje er låst tenkte {domain} tilsette at du ville gå gjennom førespurnadar frå desse kontoane manuelt.",
+  "generic.saved": "Lagra",
   "getting_started.developers": "Utviklarar",
   "getting_started.directory": "Profilkatalog",
   "getting_started.documentation": "Dokumentasjon",
@@ -242,7 +246,7 @@
   "keyboard_shortcuts.reply": "for å svara",
   "keyboard_shortcuts.requests": "for å opna lista med fylgjeførespurnader",
   "keyboard_shortcuts.search": "for å fokusera søket",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.spoilers": "for å visa/gøyma CW-felt",
   "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",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "for å fokusere vekk skrive-/søkefeltet",
   "keyboard_shortcuts.up": "for å flytta seg opp på lista",
   "lightbox.close": "Lukk att",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Neste",
   "lightbox.previous": "Førre",
   "lightbox.view_context": "Sjå kontekst",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Endre tittel",
   "lists.new.create": "Legg til liste",
   "lists.new.title_placeholder": "Ny listetittel",
+  "lists.replies_policy.all_replies": "Enhver fulgt bruker",
+  "lists.replies_policy.list_replies": "Medlemmer i listen",
+  "lists.replies_policy.no_replies": "Ingen",
+  "lists.replies_policy.title": "Vis svar på:",
   "lists.search": "Søk gjennom folk du følgjer",
   "lists.subheading": "Dine lister",
   "load_pending": "{count, plural, one {# nytt element} other {# nye element}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Gjer synleg/usynleg",
   "missing_indicator.label": "Ikkje funne",
   "missing_indicator.sublabel": "Fann ikkje ressursen",
+  "mute_modal.duration": "Varighet",
   "mute_modal.hide_notifications": "Gøyme varsel frå denne brukaren?",
+  "mute_modal.indefinite": "På ubestemt tid",
   "navigation_bar.apps": "Mobilappar",
   "navigation_bar.blocks": "Blokkerte brukarar",
   "navigation_bar.bookmarks": "Bokmerke",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} la nettopp ut",
   "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",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Framhevingar:",
   "notifications.column_settings.show": "Vis i kolonne",
   "notifications.column_settings.sound": "Spel av lyd",
+  "notifications.column_settings.status": "Nye tuter:",
   "notifications.filter.all": "Alle",
   "notifications.filter.boosts": "Framhevingar",
   "notifications.filter.favourites": "Favorittar",
   "notifications.filter.follows": "Fylgjer",
   "notifications.filter.mentions": "Nemningar",
   "notifications.filter.polls": "Røysteresultat",
+  "notifications.filter.statuses": "Oppdateringer fra folk du følger",
   "notifications.group": "{count} varsel",
+  "notifications.mark_as_read": "Merk alle varsler som lest",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Skru på skrivebordsvarsler",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Aldri gå glipp av noe",
+  "picture_in_picture.restore": "Legg den tilbake",
   "poll.closed": "Lukka",
   "poll.refresh": "Oppdater",
   "poll.total_people": "{count, plural, one {# person} other {# folk}}",
@@ -419,33 +441,34 @@
   "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",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "timeline_hint.remote_resource_not_displayed": "{resource} frå andre tenarar synest ikkje.",
+  "timeline_hint.resources.followers": "Fylgjarar",
+  "timeline_hint.resources.follows": "Fylgjer",
+  "timeline_hint.resources.statuses": "Eldre tut",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} folk}} pratar",
   "trends.trending_now": "Populært no",
   "ui.beforeunload": "Kladden din forsvinn om du forlèt Mastodon no.",
   "units.short.billion": "{count}B",
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Drag & slepp for å lasta opp",
-  "upload_button.label": "Legg til medium ({formats})",
+  "upload_button.label": "Legg til medium",
   "upload_error.limit": "Du har gått over opplastingsgrensa.",
   "upload_error.poll": "Filopplasting ikkje tillate med meiningsmålingar.",
   "upload_form.audio_description": "Grei ut for folk med nedsett høyrsel",
   "upload_form.description": "Skildr for synshemja",
   "upload_form.edit": "Rediger",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "Bytt miniatyrbilete",
   "upload_form.undo": "Slett",
   "upload_form.video_description": "Greit ut for folk med nedsett høyrsel eller syn",
   "upload_modal.analyzing_picture": "Analyserer bilete…",
   "upload_modal.apply": "Bruk",
-  "upload_modal.choose_image": "Choose image",
+  "upload_modal.choose_image": "Vel bilete",
   "upload_modal.description_placeholder": "Ein rask brun rev hoppar over den late hunden",
   "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.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Førehandsvis ({ratio})",
   "upload_progress.label": "Lastar opp...",
   "video.close": "Lukk video",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index a15e96fdc..46cf7c407 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -1,22 +1,24 @@
 {
-  "account.account_note_header": "Note",
+  "account.account_note_header": "Notis",
   "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",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "Bla mer på den opprinnelige profilen",
   "account.cancel_follow_request": "Avbryt følge forespørsel",
   "account.direct": "Direct Message @{name}",
+  "account.disable_notifications": "Slutt å varsle meg når @{name} legger ut innlegg",
   "account.domain_blocked": "Domenet skjult",
   "account.edit_profile": "Rediger profil",
+  "account.enable_notifications": "Varsle meg når @{name} legger ut innlegg",
   "account.endorse": "Vis frem på profilen",
   "account.follow": "Følg",
   "account.followers": "Følgere",
   "account.followers.empty": "Ingen følger denne brukeren ennå.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, one {{counter} følger} other {{counter} følgere}}",
+  "account.following_counter": "{count, plural, one {{counter} som følges} other {{counter} som følges}}",
   "account.follows.empty": "Denne brukeren følger ikke noen enda.",
   "account.follows_you": "Følger deg",
   "account.hide_reblogs": "Skjul fremhevinger fra @{name}",
@@ -36,14 +38,14 @@
   "account.requested": "Venter på godkjennelse",
   "account.share": "Del @{name}s profil",
   "account.show_reblogs": "Vis boosts fra @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} tut} other {{counter} tuter}}",
   "account.unblock": "Avblokker @{name}",
   "account.unblock_domain": "Vis {domain}",
   "account.unendorse": "Ikke vis frem på profilen",
   "account.unfollow": "Avfølg",
   "account.unmute": "Avdemp @{name}",
   "account.unmute_notifications": "Vis varsler fra @{name}",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "Klikk for å legge til et notat",
   "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.",
@@ -166,13 +168,15 @@
   "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": "På grunn av en bug i koden vår eller et nettleserkompatibilitetsproblem, kunne denne siden ikke vises riktig.",
+  "error.unexpected_crash.explanation_addons": "Denne siden kunne ikke vises riktig. Denne feilen er sannsynligvis forårsaket av en nettleserutvidelse eller automatiske oversettelsesverktøy.",
   "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.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Kopier stacktrace-en til utklippstavlen",
   "errors.unexpected_crash.report_issue": "Rapporter en feil",
   "follow_request.authorize": "Autorisér",
   "follow_request.reject": "Avvis",
   "follow_requests.unlocked_explanation": "Selv om kontoen din ikke er låst, tror {domain} ansatte at du kanskje vil gjennomgå forespørsler fra disse kontoene manuelt.",
-  "generic.saved": "Saved",
+  "generic.saved": "Lagret",
   "getting_started.developers": "Utviklere",
   "getting_started.directory": "Profilmappe",
   "getting_started.documentation": "Dokumentasjon",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "å ufokusere komponerings-/søkefeltet",
   "keyboard_shortcuts.up": "å flytte opp i listen",
   "lightbox.close": "Lukk",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Neste",
   "lightbox.previous": "Forrige",
   "lightbox.view_context": "Vis sammenheng",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Endre tittel",
   "lists.new.create": "Ligg til liste",
   "lists.new.title_placeholder": "Ny listetittel",
+  "lists.replies_policy.all_replies": "Enhver fulgt bruker",
+  "lists.replies_policy.list_replies": "Medlemmer i listen",
+  "lists.replies_policy.no_replies": "Ingen",
+  "lists.replies_policy.title": "Vis svar på:",
   "lists.search": "Søk blant personer du følger",
   "lists.subheading": "Dine lister",
   "load_pending": "{count, plural,one {# ny gjenstand} other {# nye gjenstander}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Veksle synlighet",
   "missing_indicator.label": "Ikke funnet",
   "missing_indicator.sublabel": "Denne ressursen ble ikke funnet",
+  "mute_modal.duration": "Varighet",
   "mute_modal.hide_notifications": "Skjul varslinger fra denne brukeren?",
+  "mute_modal.indefinite": "På ubestemt tid",
   "navigation_bar.apps": "Mobilapper",
   "navigation_bar.blocks": "Blokkerte brukere",
   "navigation_bar.bookmarks": "Bokmerker",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Avstemningen din er ferdig",
   "notification.poll": "En avstemning du har stemt på har avsluttet",
   "notification.reblog": "{name} fremhevde din status",
+  "notification.status": "{name} la nettopp ut",
   "notifications.clear": "Fjern varsler",
   "notifications.clear_confirmation": "Er du sikker på at du vil fjerne alle dine varsler permanent?",
   "notifications.column_settings.alert": "Skrivebordsvarslinger",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Fremhevet:",
   "notifications.column_settings.show": "Vis i kolonne",
   "notifications.column_settings.sound": "Spill lyd",
+  "notifications.column_settings.status": "Nye tuter:",
   "notifications.filter.all": "Alle",
   "notifications.filter.boosts": "Fremhevinger",
   "notifications.filter.favourites": "Favoritter",
   "notifications.filter.follows": "Følginger",
   "notifications.filter.mentions": "Nevnelser",
   "notifications.filter.polls": "Avstemningsresultater",
+  "notifications.filter.statuses": "Oppdateringer fra folk du følger",
   "notifications.group": "{count} varslinger",
+  "notifications.mark_as_read": "Merk alle varsler som lest",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Skru på skrivebordsvarsler",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Aldri gå glipp av noe",
+  "picture_in_picture.restore": "Legg den tilbake",
   "poll.closed": "Lukket",
   "poll.refresh": "Oppdater",
   "poll.total_people": "{count, plural, one {# person} other {# personer}}",
@@ -420,15 +442,15 @@
   "time_remaining.moments": "Gjenværende øyeblikk",
   "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekunder}} igjen",
   "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "timeline_hint.resources.followers": "Følgere",
+  "timeline_hint.resources.follows": "Følger",
+  "timeline_hint.resources.statuses": "Eldre tuter",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} personer}} snakker",
   "trends.trending_now": "Trender nå",
   "ui.beforeunload": "Din kladd vil bli forkastet om du forlater Mastodon.",
-  "units.short.billion": "{count}B",
-  "units.short.million": "{count}M",
-  "units.short.thousand": "{count}K",
+  "units.short.billion": "{count}m.ard",
+  "units.short.million": "{count}mill",
+  "units.short.thousand": "{count}T",
   "upload_area.title": "Dra og slipp for å laste opp",
   "upload_button.label": "Legg til media",
   "upload_error.limit": "Filopplastingsgrensen er oversteget.",
@@ -436,16 +458,17 @@
   "upload_form.audio_description": "Beskriv det for folk med hørselstap",
   "upload_form.description": "Beskriv for synshemmede",
   "upload_form.edit": "Rediger",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "Endre miniatyrbilde",
   "upload_form.undo": "Angre",
   "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.choose_image": "Choose image",
+  "upload_modal.choose_image": "Velg et bilde",
   "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.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Forhåndsvisning ({ratio})",
   "upload_progress.label": "Laster opp...",
   "video.close": "Lukk video",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 1aa0193a5..f166f95e2 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -9,14 +9,16 @@
   "account.browse_more_on_origin_server": "Navigar sul perfil original",
   "account.cancel_follow_request": "Anullar la demanda de seguiment",
   "account.direct": "Escriure un MP a @{name}",
+  "account.disable_notifications": "Quitar de m’avisar quand @{name} publica quicòm",
   "account.domain_blocked": "Domeni amagat",
   "account.edit_profile": "Modificar lo perfil",
+  "account.enable_notifications": "M’avisar quand @{name} publica quicòm",
   "account.endorse": "Mostrar pel perfil",
   "account.follow": "Sègre",
   "account.followers": "Seguidors",
   "account.followers.empty": "Degun sèc pas aqueste utilizaire pel moment.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidors}}",
+  "account.following_counter": "{count, plural, one {{counter} Abonaments} other {{counter} Abonaments}}",
   "account.follows.empty": "Aqueste utilizaire sèc pas degun pel moment.",
   "account.follows_you": "Vos sèc",
   "account.hide_reblogs": "Rescondre los partatges de @{name}",
@@ -36,7 +38,7 @@
   "account.requested": "Invitacion mandada. Clicatz per anullar",
   "account.share": "Partejar lo perfil a @{name}",
   "account.show_reblogs": "Mostrar los partatges de @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} Tut} other {{counter} Tuts}}",
   "account.unblock": "Desblocar @{name}",
   "account.unblock_domain": "Desblocar {domain}",
   "account.unendorse": "Mostrar pas pel perfil",
@@ -85,7 +87,7 @@
   "compose_form.direct_message_warning": "Sols los mencionats poiràn veire aqueste tut.",
   "compose_form.direct_message_warning_learn_more": "Ne saber mai",
   "compose_form.hashtag_warning": "Aqueste tut serà pas ligat a cap d’etiqueta estant qu’es pas listat. Òm pòt pas cercar que los tuts publics per etiqueta.",
-  "compose_form.lock_disclaimer": "Vòstre compte es pas {locked}. Tot lo monde pòt vos sègre e veire los estatuts reservats als seguidors.",
+  "compose_form.lock_disclaimer": "Vòstre compte es pas {locked}. Tot lo mond pòt vos sègre e veire los estatuts reservats als seguidors.",
   "compose_form.lock_disclaimer.lock": "clavat",
   "compose_form.placeholder": "A de qué pensatz ?",
   "compose_form.poll.add_option": "Ajustar una causida",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Avètz pas encara de notificacions. Respondètz a qualqu’un per començar una conversacion.",
   "empty_column.public": "I a pas res aquí ! Escrivètz quicòm de public, o seguètz de personas d’autres servidors per garnir lo flux public",
   "error.unexpected_crash.explanation": "A causa d’una avaria dins nòstre còdi o d’un problèma de compatibilitat de navegador, aquesta pagina se pòt pas afichar corrèctament.",
+  "error.unexpected_crash.explanation_addons": "Aquesta pagina podiá pas s’afichar corrèctament. Aquesta error arriba sovent a causa d’un modul complementari de navigador o una aisina de traduccion automatica.",
   "error.unexpected_crash.next_steps": "Ensajatz d’actualizar la pagina. S’aquò càmbia pas res, podètz provar d’utilizar Mastodon via un navegador diferent o d’una aplicacion nativa estant.",
+  "error.unexpected_crash.next_steps_addons": "Ensajatz de los desactivar o actualizatz la pagina. Se aquò ajuda pas, podètz ensajar d’utilizar Mastodon via un autre navigador o una aplicacion nativa.",
   "errors.unexpected_crash.copy_stacktrace": "Copiar las traças al quichapapièrs",
   "errors.unexpected_crash.report_issue": "Senhalar un problèma",
   "follow_request.authorize": "Acceptar",
@@ -177,7 +181,7 @@
   "getting_started.directory": "Annuari de perfils",
   "getting_started.documentation": "Documentacion",
   "getting_started.heading": "Per començar",
-  "getting_started.invite": "Convidar de monde",
+  "getting_started.invite": "Convidar de mond",
   "getting_started.open_source_notice": "Mastodon es un logicial liure. Podètz contribuir e mandar vòstres comentaris e rapòrt de bug via {github} sus GitHub.",
   "getting_started.security": "Seguretat",
   "getting_started.terms": "Condicions d’utilizacion",
@@ -202,9 +206,9 @@
   "introduction.federation.federated.headline": "Federat",
   "introduction.federation.federated.text": "Los tuts publics d’autres servidors del fediverse apareisseràn dins lo flux d’actualitats.",
   "introduction.federation.home.headline": "Acuèlh",
-  "introduction.federation.home.text": "Los tuts del monde que seguètz apareisseràn dins vòstre flux d’acuèlh. Podètz sègre de monde ont que siasquen !",
+  "introduction.federation.home.text": "Los tuts del mond que seguètz apareisseràn dins vòstre flux d’acuèlh. Podètz sègre de mond ont que siasquen !",
   "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Los tuts publics del monde del meteis servidor que vosautres apareisseràn dins lo flux local.",
+  "introduction.federation.local.text": "Los tuts publics del mond del meteis servidor que vosautres apareisseràn dins lo flux local.",
   "introduction.interactions.action": "Acabar la leiçon !",
   "introduction.interactions.favourite.headline": "Favorit",
   "introduction.interactions.favourite.text": "Podètz enregistrar un tut per mai tard, e avisar l’autor que l’avètz aimat, en l’ajustant als favorits.",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "quitar lo camp tèxte/de recèrca",
   "keyboard_shortcuts.up": "far montar dins la lista",
   "lightbox.close": "Tampar",
+  "lightbox.compress": "Fenèstra de visualizacion dels imatges compressats",
+  "lightbox.expand": "Espandir la fenèstra de visualizacion d’imatge",
   "lightbox.next": "Seguent",
   "lightbox.previous": "Precedent",
   "lightbox.view_context": "Veire lo contèxt",
@@ -260,14 +266,20 @@
   "lists.edit.submit": "Cambiar lo títol",
   "lists.new.create": "Ajustar una lista",
   "lists.new.title_placeholder": "Títol de la nòva lista",
-  "lists.search": "Cercar demest lo monde que seguètz",
+  "lists.replies_policy.all_replies": "Los que sègui",
+  "lists.replies_policy.list_replies": "Membres d’aquesta lista",
+  "lists.replies_policy.no_replies": "Degun",
+  "lists.replies_policy.title": "Mostrar las responsas a :",
+  "lists.search": "Cercar demest lo mond que seguètz",
   "lists.subheading": "Vòstras listas",
   "load_pending": "{count, plural, one {# nòu element} other {# nòu elements}}",
   "loading_indicator.label": "Cargament…",
   "media_gallery.toggle_visible": "Modificar la visibilitat",
   "missing_indicator.label": "Pas trobat",
   "missing_indicator.sublabel": "Aquesta ressorsa es pas estada trobada",
+  "mute_modal.duration": "Durada",
   "mute_modal.hide_notifications": "Rescondre las notificacions d’aquesta persona ?",
+  "mute_modal.indefinite": "Cap de data de fin",
   "navigation_bar.apps": "Aplicacions mobil",
   "navigation_bar.blocks": "Personas blocadas",
   "navigation_bar.bookmarks": "Marcadors",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} ven de publicar",
   "notifications.clear": "Escafar",
   "notifications.clear_confirmation": "Volètz vertadièrament escafar totas vòstras las notificacions ?",
   "notifications.column_settings.alert": "Notificacions localas",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Partatges :",
   "notifications.column_settings.show": "Mostrar dins la colomna",
   "notifications.column_settings.sound": "Emetre un son",
+  "notifications.column_settings.status": "Tuts novèls :",
   "notifications.filter.all": "Totas",
   "notifications.filter.boosts": "Partages",
   "notifications.filter.favourites": "Favorits",
   "notifications.filter.follows": "Seguiments",
   "notifications.filter.mentions": "Mencions",
   "notifications.filter.polls": "Resultats del sondatge",
+  "notifications.filter.statuses": "Mesas a jorn del monde que seguissètz",
   "notifications.group": "{count} notificacions",
+  "notifications.mark_as_read": "Marcar totas las notificacions coma legidas",
+  "notifications.permission_denied": "Las notificacion burèu son pas disponiblas a causa del refús de las demandas d’autorizacion navigador",
+  "notifications.permission_denied_alert": "Las notificacions burèu son pas activada, per çò que las autorizacions son estadas refusada abans",
+  "notifications_permission_banner.enable": "Activar las notificacions burèu",
+  "notifications_permission_banner.how_to_control": "Per recebre las notificacions de Mastodon quand es pas dobèrt, activatz las notificacions de burèu. Podètz precisar quin tipe de notificacion generarà una notificacion de burèu via lo boton {icon} dessús un còp activadas.",
+  "notifications_permission_banner.title": "Manquetz pas jamai res",
+  "picture_in_picture.restore": "Lo tornar",
   "poll.closed": "Tampat",
   "poll.refresh": "Actualizar",
   "poll.total_people": "{count, plural, one {# persona} other {# personas}}",
@@ -423,7 +445,7 @@
   "timeline_hint.resources.followers": "Seguidors",
   "timeline_hint.resources.follows": "Abonaments",
   "timeline_hint.resources.statuses": "Tuts mai ancians",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} persona ne parla} other {{counter} personas ne parlan}}",
   "trends.trending_now": "Tendéncia del moment",
   "ui.beforeunload": "Vòstre brolhon serà perdut se quitatz Mastodon.",
   "units.short.billion": "{count}B",
@@ -436,16 +458,17 @@
   "upload_form.audio_description": "Descriure per las personas amb pèrdas auditivas",
   "upload_form.description": "Descripcion pels mal vesents",
   "upload_form.edit": "Modificar",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "Cambiar la vinheta",
   "upload_form.undo": "Suprimir",
   "upload_form.video_description": "Descriure per las personas amb pèrdas auditivas o mal vesent",
   "upload_modal.analyzing_picture": "Analisi de l’imatge…",
   "upload_modal.apply": "Aplicar",
-  "upload_modal.choose_image": "Choose image",
+  "upload_modal.choose_image": "Causir un imatge",
   "upload_modal.description_placeholder": "Lo dròlle bilingüe manja un yaourt de ròcs exagonals e kiwis verds farà un an mai",
   "upload_modal.detect_text": "Detectar lo tèxt de l’imatge",
   "upload_modal.edit_media": "Modificar lo mèdia",
   "upload_modal.hint": "Clicatz o lisatz lo cercle de l’apercebut per causir lo ponch que serà totjorn visible dins las vinhetas.",
+  "upload_modal.preparing_ocr": "Preparacion de la ROC…",
   "upload_modal.preview_label": "Apercebut ({ratio})",
   "upload_progress.label": "Mandadís…",
   "video.close": "Tampar la vidèo",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index cb5a81e63..d87eddade 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -1,5 +1,5 @@
 {
-  "account.account_note_header": "Note",
+  "account.account_note_header": "Notatka",
   "account.add_or_remove_from_list": "Dodaj lub usuń z list",
   "account.badges.bot": "Bot",
   "account.badges.group": "Grupa",
@@ -9,14 +9,16 @@
   "account.browse_more_on_origin_server": "Zobacz więcej na oryginalnym profilu",
   "account.cancel_follow_request": "Zrezygnuj z prośby o możliwość śledzenia",
   "account.direct": "Wyślij wiadomość bezpośrednią do @{name}",
+  "account.disable_notifications": "Przestań powiadamiać mnie o wpisach @{name}",
   "account.domain_blocked": "Ukryto domenę",
   "account.edit_profile": "Edytuj profil",
+  "account.enable_notifications": "Powiadamiaj mnie o wpisach @{name}",
   "account.endorse": "Polecaj na profilu",
   "account.follow": "Śledź",
   "account.followers": "Śledzący",
   "account.followers.empty": "Nikt jeszcze nie śledzi tego użytkownika.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, one {{counter} śledzący} few {{counter} śledzących} many {{counter} śledzących} other {{counter} śledzących}}",
+  "account.following_counter": "{count, plural, one {{counter} śledzony} few {{counter} śledzonych} many {{counter} śledzonych} other {{counter} śledzonych}}",
   "account.follows.empty": "Ten użytkownik nie śledzi jeszcze nikogo.",
   "account.follows_you": "Śledzi Cię",
   "account.hide_reblogs": "Ukryj podbicia od @{name}",
@@ -36,14 +38,14 @@
   "account.requested": "Oczekująca prośba, kliknij aby anulować",
   "account.share": "Udostępnij profil @{name}",
   "account.show_reblogs": "Pokazuj podbicia od @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} wpis} few {{counter} wpisy} many {{counter} wpisów} other {{counter} wpisów}}",
   "account.unblock": "Odblokuj @{name}",
   "account.unblock_domain": "Odblokuj domenę {domain}",
   "account.unendorse": "Przestań polecać",
   "account.unfollow": "Przestań śledzić",
   "account.unmute": "Cofnij wyciszenie @{name}",
   "account.unmute_notifications": "Cofnij wyciszenie powiadomień od @{name}",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "Naciśnij aby dodać notatkę",
   "alert.rate_limited.message": "Spróbuj ponownie po {retry_time, time, medium}.",
   "alert.rate_limited.title": "Ograniczony czasowo",
   "alert.unexpected.message": "Wystąpił nieoczekiwany błąd.",
@@ -170,13 +172,15 @@
   "empty_column.notifications": "Nie masz żadnych powiadomień. Rozpocznij interakcje z innymi użytkownikami.",
   "empty_column.public": "Tu nic nie ma! Napisz coś publicznie, lub dodaj ludzi z innych serwerów, aby to wyświetlić",
   "error.unexpected_crash.explanation": "W związku z błędem w naszym kodzie lub braku kompatybilności przeglądarki, ta strona nie może być poprawnie wyświetlona.",
+  "error.unexpected_crash.explanation_addons": "Ta strona nie mogła zostać poprawnie wyświetlona. Może to być spowodowane dodatkiem do przeglądarki lub narzędziem do automatycznego tłumaczenia.",
   "error.unexpected_crash.next_steps": "Spróbuj odświeżyć stronę. Jeśli to nie pomoże, wciąż jesteś w stanie używać Mastodona przez inną przeglądarkę lub natywną aplikację.",
+  "error.unexpected_crash.next_steps_addons": "Spróbuj je wyłączyć lub odświeżyć stronę. Jeśli to nie pomoże, możesz wciąż korzystać z Mastodona w innej przeglądarce lub natywnej aplikacji.",
   "errors.unexpected_crash.copy_stacktrace": "Skopiuj ślad stosu do schowka",
   "errors.unexpected_crash.report_issue": "Zgłoś problem",
   "follow_request.authorize": "Autoryzuj",
   "follow_request.reject": "Odrzuć",
   "follow_requests.unlocked_explanation": "Mimo że Twoje konto nie jest zablokowane, zespół {domain} uznał że możesz chcieć ręcznie przejrzeć prośby o możliwość śledzenia.",
-  "generic.saved": "Saved",
+  "generic.saved": "Zapisano",
   "getting_started.developers": "Dla programistów",
   "getting_started.directory": "Katalog profilów",
   "getting_started.documentation": "Dokumentacja",
@@ -254,6 +258,8 @@
   "keyboard_shortcuts.unfocus": "aby opuścić pole wyszukiwania/pisania",
   "keyboard_shortcuts.up": "aby przejść na górę listy",
   "lightbox.close": "Zamknij",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Następne",
   "lightbox.previous": "Poprzednie",
   "lightbox.view_context": "Pokaż kontekst",
@@ -264,6 +270,10 @@
   "lists.edit.submit": "Zmień tytuł",
   "lists.new.create": "Utwórz listę",
   "lists.new.title_placeholder": "Wprowadź tytuł listy",
+  "lists.replies_policy.all_replies": "Dowolnego obserwowanego użytkownika",
+  "lists.replies_policy.list_replies": "Członków listy",
+  "lists.replies_policy.no_replies": "Nikogo",
+  "lists.replies_policy.title": "Pokazuj odpowiedzi dla:",
   "lists.search": "Szukaj wśród osób które śledzisz",
   "lists.subheading": "Twoje listy",
   "load_pending": "{count, plural, one {# nowy przedmiot} other {nowe przedmioty}}",
@@ -271,7 +281,9 @@
   "media_gallery.toggle_visible": "Przełącz widoczność",
   "missing_indicator.label": "Nie znaleziono",
   "missing_indicator.sublabel": "Nie można odnaleźć tego zasobu",
+  "mute_modal.duration": "Czas",
   "mute_modal.hide_notifications": "Chcesz ukryć powiadomienia od tego użytkownika?",
+  "mute_modal.indefinite": "Nieokreślony",
   "navigation_bar.apps": "Aplikacje mobilne",
   "navigation_bar.blocks": "Zablokowani użytkownicy",
   "navigation_bar.bookmarks": "Zakładki",
@@ -303,6 +315,7 @@
   "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",
+  "notification.status": "{name} właśnie utworzył(a) wpis",
   "notifications.clear": "Wyczyść powiadomienia",
   "notifications.clear_confirmation": "Czy na pewno chcesz bezpowrotnie usunąć wszystkie powiadomienia?",
   "notifications.column_settings.alert": "Powiadomienia na pulpicie",
@@ -318,13 +331,22 @@
   "notifications.column_settings.reblog": "Podbicia:",
   "notifications.column_settings.show": "Pokaż w kolumnie",
   "notifications.column_settings.sound": "Odtwarzaj dźwięk",
+  "notifications.column_settings.status": "Nowe wpisy:",
   "notifications.filter.all": "Wszystkie",
   "notifications.filter.boosts": "Podbicia",
   "notifications.filter.favourites": "Ulubione",
   "notifications.filter.follows": "Śledzenia",
   "notifications.filter.mentions": "Wspomienia",
   "notifications.filter.polls": "Wyniki głosowania",
+  "notifications.filter.statuses": "Aktualizacje od osób które obserwujesz",
   "notifications.group": "{count, number} {count, plural, one {powiadomienie} few {powiadomienia} many {powiadomień} more {powiadomień}}",
+  "notifications.mark_as_read": "Oznacz wszystkie powiadomienia jako przeczytane",
+  "notifications.permission_denied": "Powiadomienia na pulpicie nie są dostępne, ponieważ wcześniej nie udzielono uprawnień w przeglądarce",
+  "notifications.permission_denied_alert": "Powiadomienia na pulpicie nie mogą zostać włączone, ponieważ wcześniej odmówiono uprawnień",
+  "notifications_permission_banner.enable": "Włącz powiadomienia na pulpicie",
+  "notifications_permission_banner.how_to_control": "Aby otrzymywać powiadomienia, gdy Mastodon nie jest otwarty, włącz powiadomienia pulpitu. Możesz dokładnie kontrolować, októrych działaniach będziesz powiadomienia na pulpicie za pomocą przycisku {icon} powyżej, jeżeli tylko zostaną włączone.",
+  "notifications_permission_banner.title": "Nie przegap niczego",
+  "picture_in_picture.restore": "Odłóż",
   "poll.closed": "Zamknięte",
   "poll.refresh": "Odśwież",
   "poll.total_people": "{count, plural, one {# osoba} few {# osoby} many {# osób} other {# osób}}",
@@ -428,12 +450,12 @@
   "timeline_hint.resources.followers": "Śledzący",
   "timeline_hint.resources.follows": "Śledzeni",
   "timeline_hint.resources.statuses": "Starsze wpisy",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "trends.counter_by_accounts": "rozmawiają: {count, plural, one {{counter} osoba} few {{counter} osoby} many {{counter} osób} other {{counter} osoby}}",
   "trends.trending_now": "Popularne teraz",
   "ui.beforeunload": "Utracisz tworzony wpis, jeżeli opuścisz Mastodona.",
-  "units.short.billion": "{count}B",
-  "units.short.million": "{count}M",
-  "units.short.thousand": "{count}K",
+  "units.short.billion": "{count} mld",
+  "units.short.million": "{count} mln",
+  "units.short.thousand": "{count} tys.",
   "upload_area.title": "Przeciągnij i upuść aby wysłać",
   "upload_button.label": "Dodaj zawartość multimedialną (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Przekroczono limit plików do wysłania.",
@@ -441,16 +463,17 @@
   "upload_form.audio_description": "Opisz dla osób niesłyszących i niedosłyszących",
   "upload_form.description": "Wprowadź opis dla niewidomych i niedowidzących",
   "upload_form.edit": "Opisz",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "Zmień miniaturę",
   "upload_form.undo": "Usuń",
   "upload_form.video_description": "Opisz dla osób niesłyszących, niedosłyszących, niewidomych i niedowidzących",
   "upload_modal.analyzing_picture": "Analizowanie obrazu…",
   "upload_modal.apply": "Zastosuj",
-  "upload_modal.choose_image": "Choose image",
+  "upload_modal.choose_image": "Wybierz obraz",
   "upload_modal.description_placeholder": "Pchnąć w tę łódź jeża lub ośm skrzyń fig",
-  "upload_modal.detect_text": "Wykryj tekst ze obrazu",
+  "upload_modal.detect_text": "Wykryj tekst z obrazu",
   "upload_modal.edit_media": "Edytuj multimedia",
   "upload_modal.hint": "Kliknij lub przeciągnij kółko na podglądzie by wybrać centralny punkt, który zawsze będzie na widoku na miniaturce.",
+  "upload_modal.preparing_ocr": "Przygotowywanie OCR…",
   "upload_modal.preview_label": "Podgląd ({ratio})",
   "upload_progress.label": "Wysyłanie…",
   "video.close": "Zamknij film",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 07d91703a..abbaced58 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Encontre mais no perfil original",
   "account.cancel_follow_request": "Cancelar solicitação para seguir",
   "account.direct": "Enviar toot direto para @{name}",
+  "account.disable_notifications": "Parar de me notificar quando @{name} fizer publicações",
   "account.domain_blocked": "Domínio bloqueado",
   "account.edit_profile": "Editar perfil",
+  "account.enable_notifications": "Notificar-me quando @{name} fizer publicações",
   "account.endorse": "Destacar no perfil",
   "account.follow": "Seguir",
   "account.followers": "Seguidores",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Nada aqui. 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 outros servidores para enchê-la",
   "error.unexpected_crash.explanation": "Devido a um bug em nosso código ou um problema de compatibilidade de navegador, esta página não pôde ser exibida corretamente.",
+  "error.unexpected_crash.explanation_addons": "Esta página não pôde ser exibida corretamente. Este erro provavelmente é causado por um complemento do navegador ou ferramentas de tradução automática.",
   "error.unexpected_crash.next_steps": "Tente atualizar a página. Se não resolver, você ainda pode conseguir usar o Mastodon por meio de um navegador ou app nativo diferente.",
+  "error.unexpected_crash.next_steps_addons": "Tente desabilitá-los e atualizar a página. Se isso não ajudar, você ainda poderá usar o Mastodon por meio de um navegador diferente ou de um aplicativo nativo.",
   "errors.unexpected_crash.copy_stacktrace": "Copiar stacktrace para área de transferência",
   "errors.unexpected_crash.report_issue": "Denunciar problema",
   "follow_request.authorize": "Aprovar",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "para desfocar de área de texto de composição/pesquisa",
   "keyboard_shortcuts.up": "para mover para cima na lista",
   "lightbox.close": "Fechar",
+  "lightbox.compress": "Compactar caixa de visualização de imagem",
+  "lightbox.expand": "Expandir caixa de visualização de imagem",
   "lightbox.next": "Próximo",
   "lightbox.previous": "Anterior",
   "lightbox.view_context": "Ver contexto",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Renomear",
   "lists.new.create": "Criar lista",
   "lists.new.title_placeholder": "Nome da lista",
+  "lists.replies_policy.all_replies": "Qualquer usuário seguido",
+  "lists.replies_policy.list_replies": "Membros da lista",
+  "lists.replies_policy.no_replies": "Ninguém",
+  "lists.replies_policy.title": "Mostrar respostas para:",
   "lists.search": "Procurar entre as pessoas que você segue",
   "lists.subheading": "Suas listas",
   "load_pending": "{count, plural, one {# novo item} other {# novos items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Esconder mídia",
   "missing_indicator.label": "Não encontrado",
   "missing_indicator.sublabel": "Esse recurso não pôde ser encontrado",
+  "mute_modal.duration": "Duração",
   "mute_modal.hide_notifications": "Ocultar notificações deste usuário?",
+  "mute_modal.indefinite": "Indefinida",
   "navigation_bar.apps": "Aplicativos",
   "navigation_bar.blocks": "Usuários bloqueados",
   "navigation_bar.bookmarks": "Salvos",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Sua enquete terminou",
   "notification.poll": "Uma enquete que você votou terminou",
   "notification.reblog": "{name} boostou seu status",
+  "notification.status": "{name} acabou de postar",
   "notifications.clear": "Limpar notificações",
   "notifications.clear_confirmation": "Você tem certeza de que deseja limpar todas as suas notificações?",
   "notifications.column_settings.alert": "Notificações no computador",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Mostrar nas colunas",
   "notifications.column_settings.sound": "Tocar som",
+  "notifications.column_settings.status": "Novos toots:",
   "notifications.filter.all": "Tudo",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favoritos",
   "notifications.filter.follows": "Seguindo",
   "notifications.filter.mentions": "Menções",
   "notifications.filter.polls": "Resultados de enquete",
+  "notifications.filter.statuses": "Atualizações de pessoas que você segue",
   "notifications.group": "{count} notificações",
+  "notifications.mark_as_read": "Marcar todas as notificações como lidas",
+  "notifications.permission_denied": "Não é possível habilitar as notificações da área de trabalho pois a permissão foi negada.",
+  "notifications.permission_denied_alert": "As notificações da área de trabalho não podem ser habilitdas pois a permissão do navegador foi negada antes",
+  "notifications_permission_banner.enable": "Habilitar notificações da área de trabalho",
+  "notifications_permission_banner.how_to_control": "Para receber notificações quando o Mastodon não estiver aberto, habilite as notificações da área de trabalho. Você pode controlar precisamente quais tipos de interações geram notificações da área de trabalho através do botão {icon} acima uma vez habilitadas.",
+  "notifications_permission_banner.title": "Nunca perca nada",
+  "picture_in_picture.restore": "Colocar de volta",
   "poll.closed": "Fechou",
   "poll.refresh": "Atualizar",
   "poll.total_people": "{count, plural, one {# pessoa} other {# pessoas}}",
@@ -430,22 +452,23 @@
   "units.short.million": "{count} mi",
   "units.short.thousand": "{count} mil",
   "upload_area.title": "Arraste & solte para fazer upload",
-  "upload_button.label": "Adicionar mídia ({formats})",
+  "upload_button.label": "Adicionar mídia",
   "upload_error.limit": "Limite de upload de arquivos excedido.",
   "upload_error.poll": "Não é possível fazer upload de arquivos com enquetes.",
   "upload_form.audio_description": "Descrever para pessoas com deficiência auditiva",
   "upload_form.description": "Descreva para deficientes visuais",
   "upload_form.edit": "Descreva",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "Alterar miniatura",
   "upload_form.undo": "Excluir",
   "upload_form.video_description": "Descreva para pessoas com deficiência auditiva ou visual",
   "upload_modal.analyzing_picture": "Analisando imagem…",
   "upload_modal.apply": "Aplicar",
-  "upload_modal.choose_image": "Choose image",
+  "upload_modal.choose_image": "Escolher imagem",
   "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 prévia para escolher o ponto focal que vai estar sempre visível em todas as thumbnails.",
+  "upload_modal.preparing_ocr": "Preparando OCR…",
   "upload_modal.preview_label": "Prévia ({ratio})",
   "upload_progress.label": "Fazendo upload...",
   "video.close": "Fechar vídeo",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index 49fb95885..065a6bf57 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -1,36 +1,38 @@
 {
-  "account.account_note_header": "A sua nota para @{name}",
+  "account.account_note_header": "A tua nota para @{name}",
   "account.add_or_remove_from_list": "Adicionar ou remover das listas",
-  "account.badges.bot": "Robô",
+  "account.badges.bot": "Bot",
   "account.badges.group": "Grupo",
   "account.block": "Bloquear @{name}",
   "account.block_domain": "Esconder tudo do domínio {domain}",
-  "account.blocked": "Bloqueado",
-  "account.browse_more_on_origin_server": "Encontre mais no perfil original",
-  "account.cancel_follow_request": "Cancelar pedido de seguidor",
-  "account.direct": "Mensagem directa @{name}",
-  "account.domain_blocked": "Domínio escondido",
+  "account.blocked": "Bloqueado(a)",
+  "account.browse_more_on_origin_server": "Encontrar mais no perfil original",
+  "account.cancel_follow_request": "Cancelar pedido para seguir",
+  "account.direct": "Enviar mensagem directa para @{name}",
+  "account.disable_notifications": "Parar de me notificar das publicações de @{name}",
+  "account.domain_blocked": "Domínio bloqueado",
   "account.edit_profile": "Editar perfil",
-  "account.endorse": "Atributo no perfil",
+  "account.enable_notifications": "Notificar-me das publicações de @{name}",
+  "account.endorse": "Destacar no perfil",
   "account.follow": "Seguir",
   "account.followers": "Seguidores",
   "account.followers.empty": "Ainda ninguém segue este utilizador.",
   "account.followers_counter": "{count, plural, one {{counter} Seguidor} other {{counter} Seguidores}}",
   "account.following_counter": "{count, plural, other {A seguir {counter}}}",
-  "account.follows.empty": "Este utilizador ainda não segue alguém.",
+  "account.follows.empty": "Este utilizador ainda não segue ninguém.",
   "account.follows_you": "Segue-te",
   "account.hide_reblogs": "Esconder partilhas de @{name}",
   "account.last_status": "Última atividade",
   "account.link_verified_on": "A posse deste link foi verificada em {date}",
   "account.locked_info": "O estatuto de privacidade desta conta é fechado. O dono revê manualmente quem a pode seguir.",
-  "account.media": "Media",
+  "account.media": "Média",
   "account.mention": "Mencionar @{name}",
   "account.moved_to": "{name} mudou a sua conta para:",
   "account.mute": "Silenciar @{name}",
   "account.mute_notifications": "Silenciar notificações de @{name}",
   "account.muted": "Silenciada",
   "account.never_active": "Nunca",
-  "account.posts": "Publicações",
+  "account.posts": "Toots",
   "account.posts_with_replies": "Publicações e respostas",
   "account.report": "Denunciar @{name}",
   "account.requested": "A aguardar aprovação. Clique para cancelar o pedido de seguidor",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Não tens notificações. Interage com outros utilizadores para iniciar uma conversa.",
   "empty_column.public": "Não há nada aqui! Escreve algo publicamente ou segue outros utilizadores para veres aqui os conteúdos públicos",
   "error.unexpected_crash.explanation": "Devido a um erro no nosso código ou a uma compatilidade com o seu navegador, esta página não pôde ser apresentada correctamente.",
+  "error.unexpected_crash.explanation_addons": "Esta página não pôde ser exibida corretamente. Este erro provavelmente é causado por um complemento do navegador ou ferramentas de tradução automática.",
   "error.unexpected_crash.next_steps": "Tente atualizar a página. Se isso não ajudar, pode usar o Mastodon através de um navegador diferente ou uma aplicação nativa.",
+  "error.unexpected_crash.next_steps_addons": "Tente desabilitá-los e atualizar a página. Se isso não ajudar, você ainda poderá usar o Mastodon por meio de um navegador diferente ou de um aplicativo nativo.",
   "errors.unexpected_crash.copy_stacktrace": "Copiar a stacktrace para o clipboard",
   "errors.unexpected_crash.report_issue": "Reportar problema",
   "follow_request.authorize": "Autorizar",
@@ -202,9 +206,9 @@
   "introduction.federation.federated.headline": "Federada",
   "introduction.federation.federated.text": "Publicações públicas de outras instâncias do fediverso aparecerão na cronologia federada.",
   "introduction.federation.home.headline": "Início",
-  "introduction.federation.home.text": "As publicações das pessoas que você segue aparecerão na sua coluna de início. Você pode seguir qualquer pessoa em qualquer instância!",
+  "introduction.federation.home.text": "As publicações das pessoas que segues aparecerão na tua coluna de início. Podes seguir qualquer pessoa em qualquer instância!",
   "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Publicações públicas de pessoas na mesma instância que você aparecerão na coluna local.",
+  "introduction.federation.local.text": "Publicações públicas de pessoas na mesma instância que tu aparecerão na coluna local.",
   "introduction.interactions.action": "Terminar o tutorial!",
   "introduction.interactions.favourite.headline": "Favorito",
   "introduction.interactions.favourite.text": "Podes guardar um toot para depois e deixar o autor saber que gostaste dele, marcando-o como favorito.",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "para remover o foco da área de texto/pesquisa",
   "keyboard_shortcuts.up": "para mover para cima na lista",
   "lightbox.close": "Fechar",
+  "lightbox.compress": "Compactar caixa de visualização de imagem",
+  "lightbox.expand": "Expandir caixa de visualização de imagem",
   "lightbox.next": "Próximo",
   "lightbox.previous": "Anterior",
   "lightbox.view_context": "Ver contexto",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Mudar o título",
   "lists.new.create": "Adicionar lista",
   "lists.new.title_placeholder": "Título da nova lista",
+  "lists.replies_policy.all_replies": "Qualquer utilizador seguido",
+  "lists.replies_policy.list_replies": "Membros da lista",
+  "lists.replies_policy.no_replies": "Ninguém",
+  "lists.replies_policy.title": "Mostrar respostas para:",
   "lists.search": "Pesquisa entre as pessoas que segues",
   "lists.subheading": "As tuas listas",
   "load_pending": "{count, plural, one {# novo item} other {# novos itens}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Alternar visibilidade",
   "missing_indicator.label": "Não encontrado",
   "missing_indicator.sublabel": "Este recurso não foi encontrado",
+  "mute_modal.duration": "Duração",
   "mute_modal.hide_notifications": "Esconder notificações deste utilizador?",
+  "mute_modal.indefinite": "Indefinidamente",
   "navigation_bar.apps": "Aplicações móveis",
   "navigation_bar.blocks": "Utilizadores bloqueados",
   "navigation_bar.bookmarks": "Itens salvos",
@@ -298,9 +310,10 @@
   "notification.own_poll": "A sua votação terminou",
   "notification.poll": "Uma votação em que participaste chegou ao fim",
   "notification.reblog": "{name} partilhou a tua publicação",
+  "notification.status": "{name} acabou de publicar",
   "notifications.clear": "Limpar notificações",
   "notifications.clear_confirmation": "Queres mesmo limpar todas as notificações?",
-  "notifications.column_settings.alert": "Notificações no computador",
+  "notifications.column_settings.alert": "Notificações no ambiente de trabalho",
   "notifications.column_settings.favourite": "Favoritos:",
   "notifications.column_settings.filter_bar.advanced": "Mostrar todas as categorias",
   "notifications.column_settings.filter_bar.category": "Barra de filtros rápidos",
@@ -313,19 +326,28 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Mostrar na coluna",
   "notifications.column_settings.sound": "Reproduzir som",
+  "notifications.column_settings.status": "Novos toots:",
   "notifications.filter.all": "Todas",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favoritos",
   "notifications.filter.follows": "Seguidores",
   "notifications.filter.mentions": "Menções",
   "notifications.filter.polls": "Votações",
+  "notifications.filter.statuses": "Atualizações de pessoas que você segue",
   "notifications.group": "{count} notificações",
+  "notifications.mark_as_read": "Marcar todas as notificações como lidas",
+  "notifications.permission_denied": "Notificações no ambiente de trabalho não estão disponíveis porque a permissão, solicitada pelo navegador, foi recusada anteriormente",
+  "notifications.permission_denied_alert": "Notificações no ambinente de trabalho não podem ser ativadas, pois a permissão do navegador foi recusada anteriormente",
+  "notifications_permission_banner.enable": "Ativar notificações no ambiente de trabalho",
+  "notifications_permission_banner.how_to_control": "Para receber notificações quando o Mastodon não estiver aberto, ative as notificações no ambiente de trabalho. Depois da sua ativação, pode controlar precisamente quais tipos de interações geram notificações, através do botão {icon} acima.",
+  "notifications_permission_banner.title": "Nunca perca nada",
+  "picture_in_picture.restore": "Colocá-lo de volta",
   "poll.closed": "Fechado",
   "poll.refresh": "Recarregar",
   "poll.total_people": "{count, plural, one {# pessoa} other {# pessoas}}",
   "poll.total_votes": "{contar, plural, um {# vote} outro {# votes}}",
   "poll.vote": "Votar",
-  "poll.voted": "Você votou nesta resposta",
+  "poll.voted": "Votaste nesta resposta",
   "poll_button.add_poll": "Adicionar votação",
   "poll_button.remove_poll": "Remover votação",
   "privacy.change": "Ajustar a privacidade da publicação",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}m",
   "upload_area.title": "Arraste e solte para enviar",
-  "upload_button.label": "Adicionar media ({formats})",
+  "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",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detectar texto na imagem",
   "upload_modal.edit_media": "Editar media",
   "upload_modal.hint": "Clique ou arraste o círculo na pré-visualização para escolher o ponto focal que será sempre visível em todas as miniaturas.",
+  "upload_modal.preparing_ocr": "A preparar OCR…",
   "upload_modal.preview_label": "Pré-visualizar ({ratio})",
   "upload_progress.label": "A enviar...",
   "video.close": "Fechar vídeo",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index 544d68102..dc1be7bc1 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Caută mai multe în profilul original",
   "account.cancel_follow_request": "Anulați cererea de urmărire",
   "account.direct": "Mesaj direct @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domeniu blocat",
   "account.edit_profile": "Editați profilul",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Promovați pe profil",
   "account.follow": "Urmărește",
   "account.followers": "Urmăritori",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Nu ai nici o notificare încă. Interacționează cu alții pentru a începe o conversație.",
   "empty_column.public": "Nu este nimic aici! Scrie ceva public, sau urmărește alți utilizatori din alte instanțe pentru a porni fluxul",
   "error.unexpected_crash.explanation": "Din cauza unei erori în codul nostru sau a unei probleme de compatibilitate cu navigatorul, această pagină nu a putut fi afișată corect.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Încercați să reîmprospătați pagina. Dacă acest lucru nu ajută, este posibil să mai puteți folosi site-ul printr-un navigator diferit sau o aplicație nativă.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copiați stiva în clipboard",
   "errors.unexpected_crash.report_issue": "Raportați o problemă",
   "follow_request.authorize": "Autorizează",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "să dezactiveze zona de compunere/căutare",
   "keyboard_shortcuts.up": "să mute mai sus în listă",
   "lightbox.close": "Închide",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Următorul",
   "lightbox.previous": "Precedentul",
   "lightbox.view_context": "Vizualizați contextul",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Schimbă titlul",
   "lists.new.create": "Adaugă listă",
   "lists.new.title_placeholder": "Titlu pentru noua listă",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Caută printre persoanele pe care le urmărești",
   "lists.subheading": "Listele tale",
   "load_pending": "{count, plural, one {# element nou} other {# elemente noi}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Ascunde media",
   "missing_indicator.label": "Nu a fost găsit",
   "missing_indicator.sublabel": "Această resursă nu a putut fi găsită",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Ascunzi notificările de la acest utilizator?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Aplicații mobile",
   "navigation_bar.blocks": "Utilizatori blocați",
   "navigation_bar.bookmarks": "Marcaje",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Sondajul tău s-a sfârșit",
   "notification.poll": "Un sondaj la care ai votat s-a sfârșit",
   "notification.reblog": "{name} a impulsionat postarea ta",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Șterge notificările",
   "notifications.clear_confirmation": "Ești sigur că vrei să ștergi permanent toate notificările?",
   "notifications.column_settings.alert": "Notificări pe desktop",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Impulsuri:",
   "notifications.column_settings.show": "Arată în coloană",
   "notifications.column_settings.sound": "Redă sunet",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Toate",
   "notifications.filter.boosts": "Impulsuri",
   "notifications.filter.favourites": "Favorite",
   "notifications.filter.follows": "Urmărește",
   "notifications.filter.mentions": "Menționări",
   "notifications.filter.polls": "Rezultate sondaj",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notificări",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Închis",
   "poll.refresh": "Reîmprospătează",
   "poll.total_people": "{count, plural, one {# persoană} other {# persoane}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detectare text din imagine",
   "upload_modal.edit_media": "Editați media",
   "upload_modal.hint": "Faceţi clic sau trageţi cercul pe previzualizare pentru a alege punctul focal care va fi întotdeauna vizualizat pe toate miniaturile.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Previzualizare ({ratio})",
   "upload_progress.label": "Se Încarcă...",
   "video.close": "Închide video",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 8cdc1253c..e56be6108 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Посмотреть их можно в оригинальном профиле",
   "account.cancel_follow_request": "Отменить запрос",
   "account.direct": "Написать @{name}",
+  "account.disable_notifications": "Отключить уведомления от @{name}",
   "account.domain_blocked": "Домен скрыт",
   "account.edit_profile": "Изменить профиль",
+  "account.enable_notifications": "Включить уведомления для @{name}",
   "account.endorse": "Рекомендовать в профиле",
   "account.follow": "Подписаться",
   "account.followers": "Подписаны",
@@ -96,7 +98,7 @@
   "compose_form.poll.switch_to_single": "Переключить в режим выбора одного ответа",
   "compose_form.publish": "Запостить",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Отметить медиафайл как деликатный",
+  "compose_form.sensitive.hide": "Пометить медиафайл как чувствительный",
   "compose_form.sensitive.marked": "Медиафайл отмечен как деликатный",
   "compose_form.sensitive.unmarked": "Медиафайл не отмечен как деликатный",
   "compose_form.spoiler.marked": "Текст скрыт за предупреждением",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "У вас пока нет уведомлений. Взаимодействуйте с другими, чтобы завести разговор.",
   "empty_column.public": "Здесь ничего нет! Опубликуйте что-нибудь или подпишитесь на пользователей с других узлов, чтобы заполнить ленту",
   "error.unexpected_crash.explanation": "Из-за несовместимого браузера или ошибки в нашем коде, эта страница не может быть корректно отображена.",
+  "error.unexpected_crash.explanation_addons": "Эта страница не может быть корректно отображена. Скорее всего, эта ошибка вызвана расширением браузера или инструментом автоматического перевода.",
   "error.unexpected_crash.next_steps": "Попробуйте обновить страницу. Если проблема не исчезает, используйте Mastodon из-под другого браузера или приложения.",
+  "error.unexpected_crash.next_steps_addons": "Попробуйте их отключить и перезагрузить страницу. Если это не поможет, вы по-прежнему сможете войти в Mastodon через другой браузер или приложение.",
   "errors.unexpected_crash.copy_stacktrace": "Скопировать диагностическую информацию",
   "errors.unexpected_crash.report_issue": "Сообщить о проблеме",
   "follow_request.authorize": "Авторизовать",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "убрать фокус с поля ввода/поиска",
   "keyboard_shortcuts.up": "вверх по списку",
   "lightbox.close": "Закрыть",
+  "lightbox.compress": "Сжать окно просмотра изображений",
+  "lightbox.expand": "Развернуть окно просмотра изображений",
   "lightbox.next": "Далее",
   "lightbox.previous": "Назад",
   "lightbox.view_context": "Контекст",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Изменить название",
   "lists.new.create": "Создать список",
   "lists.new.title_placeholder": "Название для нового списка",
+  "lists.replies_policy.all_replies": "Пользователям, на которых вы подписаны",
+  "lists.replies_policy.list_replies": "Пользователям в списке",
+  "lists.replies_policy.no_replies": "Никому",
+  "lists.replies_policy.title": "Показать ответы только:",
   "lists.search": "Искать среди подписок",
   "lists.subheading": "Ваши списки",
   "load_pending": "{count, plural, one {# новый элемент} few {# новых элемента} other {# новых элементов}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Показать/скрыть",
   "missing_indicator.label": "Не найдено",
   "missing_indicator.sublabel": "Запрашиваемый ресурс не найден",
+  "mute_modal.duration": "Продолжительность",
   "mute_modal.hide_notifications": "Скрыть уведомления от этого пользователя?",
+  "mute_modal.indefinite": "Не определена",
   "navigation_bar.apps": "Мобильные приложения",
   "navigation_bar.blocks": "Список блокировки",
   "navigation_bar.bookmarks": "Закладки",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Ваш опрос закончился",
   "notification.poll": "Опрос, в котором вы приняли участие, завершился",
   "notification.reblog": "{name} продвинул(а) ваш пост",
+  "notification.status": "{name} только что запостил",
   "notifications.clear": "Очистить уведомления",
   "notifications.clear_confirmation": "Вы уверены, что хотите очистить все уведомления?",
   "notifications.column_settings.alert": "Уведомления в фоне",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Ваш пост продвинули:",
   "notifications.column_settings.show": "Отображать в списке",
   "notifications.column_settings.sound": "Проигрывать звук",
+  "notifications.column_settings.status": "Новые посты:",
   "notifications.filter.all": "Все",
   "notifications.filter.boosts": "Продвижения",
   "notifications.filter.favourites": "Отметки «избранного»",
   "notifications.filter.follows": "Подписки",
   "notifications.filter.mentions": "Упоминания",
   "notifications.filter.polls": "Результаты опросов",
+  "notifications.filter.statuses": "Обновления от людей, на которых вы подписаны",
   "notifications.group": "{count} уведомл.",
+  "notifications.mark_as_read": "Отмечать все уведомления прочитанными",
+  "notifications.permission_denied": "Уведомления на рабочем столе недоступны из-за ранее отклонённого запроса разрешений браузера",
+  "notifications.permission_denied_alert": "Уведомления на рабочем столе не могут быть включены, так как раньше было отказано в разрешении браузера",
+  "notifications_permission_banner.enable": "Включить уведомления на рабочем столе",
+  "notifications_permission_banner.how_to_control": "Чтобы получать уведомления, когда Мастодон не открыт, включите уведомления рабочего стола. Вы можете точно управлять, какие типы взаимодействия генерируют уведомления рабочего стола с помощью кнопки {icon} выше, когда они включены.",
+  "notifications_permission_banner.title": "Ничего не пропустите",
+  "picture_in_picture.restore": "Вернуть обратно",
   "poll.closed": "Завершён",
   "poll.refresh": "Обновить",
   "poll.total_people": "{count, plural, one {# человек} few {# человека} many {# человек} other {# человек}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Найти текст на картинке",
   "upload_modal.edit_media": "Изменить файл",
   "upload_modal.hint": "Нажмите и перетащите круг в предпросмотре в точку фокуса, которая всегда будет видна на эскизах.",
+  "upload_modal.preparing_ocr": "Подготовка распознования…",
   "upload_modal.preview_label": "Предпросмотр ({ratio})",
   "upload_progress.label": "Загрузка...",
   "video.close": "Закрыть видео",
diff --git a/app/javascript/mastodon/locales/sa.json b/app/javascript/mastodon/locales/sa.json
new file mode 100644
index 000000000..a8f5171c9
--- /dev/null
+++ b/app/javascript/mastodon/locales/sa.json
@@ -0,0 +1,484 @@
+{
+  "account.account_note_header": "टीका",
+  "account.add_or_remove_from_list": "युज्यतां / नश्यतां सूच्याः",
+  "account.badges.bot": "यन्त्रम्",
+  "account.badges.group": "समूहः",
+  "account.block": "अवरुध्यताम् @{name}",
+  "account.block_domain": "अवरुध्यतां प्रदेशः {domain}",
+  "account.blocked": "अवरुद्धम्",
+  "account.browse_more_on_origin_server": "अधिकं मूलव्यक्तिगतविवरणे दृश्यताम्",
+  "account.cancel_follow_request": "अनुसरणानुरोधो नश्यताम्",
+  "account.direct": "प्रत्यक्षसन्देशः @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
+  "account.domain_blocked": "प्रदेशो निषिद्धः",
+  "account.edit_profile": "सम्पाद्यताम्",
+  "account.enable_notifications": "Notify me when @{name} posts",
+  "account.endorse": "व्यक्तिगतविवरणे वैशिष्ट्यम्",
+  "account.follow": "अनुस्रियताम्",
+  "account.followers": "अनुसर्तारः",
+  "account.followers.empty": "नाऽनुसर्तारो वर्तन्ते",
+  "account.followers_counter": "{count, plural, one {{counter} अनुसर्ता} two {{counter} अनुसर्तारौ} other {{counter} अनुसर्तारः}}",
+  "account.following_counter": "{count, plural, one {{counter} अनुसृतः} two {{counter} अनुसृतौ} other {{counter} अनुसृताः}}",
+  "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.statuses_counter": "{count, plural, one {{counter} दौत्यम्} two {{counter} दौत्ये} other {{counter} दौत्यानि}}",
+  "account.unblock": "निषेधता नश्यताम् @{name}",
+  "account.unblock_domain": "प्रदेशनिषेधता नश्यताम् {domain}",
+  "account.unendorse": "व्यक्तिगतविवरणे मा प्रकाश्यताम्",
+  "account.unfollow": "नश्यतामनुसरणम्",
+  "account.unmute": "सशब्दम् @{name}",
+  "account.unmute_notifications": "@{name} सूचनाः सक्रियन्ताम्",
+  "account_note.placeholder": "टीकायोजनार्थं नुद्यताम्",
+  "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} अत्र स्प्रष्टुं शक्यते, त्यक्तुमेतमन्यस्मिन् समये",
+  "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": "पुटचिह्नानि",
+  "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.local_only": "केवलं स्थानीयम्",
+  "community.column_settings.media_only": "सामग्री केवलम्",
+  "community.column_settings.remote_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.poll.add_option": "मतमपरं युज्यताम्",
+  "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": "संवेदनशीलसामग्रीत्यङ्यताम्",
+  "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": "अवरुध्य आविद्यताम्",
+  "confirmations.block.confirm": "निषेधः",
+  "confirmations.block.message": "निश्चयेनाऽवरोधो विधेयः {name}?",
+  "confirmations.delete.confirm": "नश्यताम्",
+  "confirmations.delete.message": "निश्चयेन दौत्यमिदं नश्यताम्?",
+  "confirmations.delete_list.confirm": "नश्यताम्",
+  "confirmations.delete_list.message": "सूचिरियं निश्चयेन स्थायित्वेन च नश्यताम् वा?",
+  "confirmations.domain_block.confirm": "निषिद्धः प्रदेशः क्रियताम्",
+  "confirmations.domain_block.message": "नूनं निश्चयेनैव विनष्टुमिच्छति पूर्णप्रदेशमेव {domain} ? अधिकांशसन्दर्भेऽस्थायित्वेन निषेधता निःशब्दत्वञ्च पर्याप्तं चयनीयञ्च । न तस्मात् प्रदेशात्सर्वे विषया द्रष्टुमशक्याः किस्यांश्चिदपि सर्वजनिकसमयतालिकायां वा स्वीयसूचनापटले । सर्वेऽनुसर्तारस्ते प्रदेशात् ये सन्ति ते नश्यन्ते ।",
+  "confirmations.logout.confirm": "बहिर्गम्यताम्",
+  "confirmations.logout.message": "निश्चयेनैव बहिर्गमनं वाञ्छितम्?",
+  "confirmations.mute.confirm": "निःशब्दम्",
+  "confirmations.mute.explanation": "एतेन तेषां प्रकटनानि तथा च यत्र ते उल्लिखिताः तानि छाद्यन्ते, किन्त्वेवं सत्यपि ते त्वामनुसर्तुं ततश्च प्रकटनानि द्रष्टुं शक्नुवन्ति ।",
+  "confirmations.mute.message": "किं निश्चयेन निःशब्दं भवेत् {name} मित्रमेतत् ?",
+  "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": "सुपरिचितं Fediverse इति स्थानात्",
+  "directory.local": "{domain} प्रदेशात्केवलम्",
+  "directory.new_arrivals": "नवामगमाः",
+  "directory.recently_active": "नातिपूर्वं सक्रियः",
+  "embed.instructions": "दौत्यमेतत् स्वीयजालस्थाने स्थापयितुमधो लिखितो विध्यादेशो युज्यताम्",
+  "embed.preview": "अत्रैवं दृश्यते तत्:",
+  "emoji_button.activity": "आचरणम्",
+  "emoji_button.custom": "स्वीयानुकूलम्",
+  "emoji_button.flags": "ध्वजाः",
+  "emoji_button.food": "भोजनं पेयञ्च",
+  "emoji_button.label": "भावचिह्नं युज्यताम्",
+  "emoji_button.nature": "प्रकृतिः",
+  "emoji_button.not_found": "न भावचिह्नानि (╯°□°)╯︵ ┻━┻",
+  "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": "नैकमपि पुटचिह्नयुक्तदौत्यानि सन्ति । यदा भविष्यति तदत्र दृश्यते ।",
+  "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": "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",
+  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
+  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "errors.unexpected_crash.report_issue": "Report issue",
+  "follow_request.authorize": "Authorize",
+  "follow_request.reject": "Reject",
+  "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
+  "generic.saved": "Saved",
+  "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",
+  "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}}",
+  "introduction.federation.action": "Next",
+  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
+  "introduction.interactions.action": "Finish toot-orial!",
+  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
+  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
+  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
+  "introduction.welcome.action": "Let's go!",
+  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.boost": "to boost",
+  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.down": "to move down in the list",
+  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourites": "to open favourites list",
+  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.legend": "to display this legend",
+  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.mention": "to mention author",
+  "keyboard_shortcuts.muted": "to open muted users list",
+  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.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",
+  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.start": "to open \"get started\" column",
+  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+  "keyboard_shortcuts.toot": "to start a brand new toot",
+  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.up": "to move up in the list",
+  "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
+  "lightbox.next": "Next",
+  "lightbox.previous": "Previous",
+  "lightbox.view_context": "View context",
+  "lists.account.add": "Add to list",
+  "lists.account.remove": "Remove from list",
+  "lists.delete": "Delete list",
+  "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
+  "lists.new.create": "Add list",
+  "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
+  "lists.search": "Search among people you follow",
+  "lists.subheading": "Your lists",
+  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "loading_indicator.label": "Loading...",
+  "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
+  "missing_indicator.label": "Not found",
+  "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
+  "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
+  "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",
+  "navigation_bar.discover": "Discover",
+  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.edit_profile": "Edit profile",
+  "navigation_bar.favourites": "Favourites",
+  "navigation_bar.filters": "Muted words",
+  "navigation_bar.follow_requests": "Follow requests",
+  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.info": "About this server",
+  "navigation_bar.keyboard_shortcuts": "Hotkeys",
+  "navigation_bar.lists": "Lists",
+  "navigation_bar.logout": "Logout",
+  "navigation_bar.mutes": "Muted users",
+  "navigation_bar.personal": "Personal",
+  "navigation_bar.pins": "Pinned toots",
+  "navigation_bar.preferences": "Preferences",
+  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.security": "Security",
+  "notification.favourite": "{name} favourited your status",
+  "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
+  "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
+  "notification.poll": "A poll you have voted in has ended",
+  "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
+  "notifications.clear": "Clear notifications",
+  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "notifications.column_settings.alert": "Desktop notifications",
+  "notifications.column_settings.favourite": "Favourites:",
+  "notifications.column_settings.filter_bar.advanced": "Display all categories",
+  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
+  "notifications.column_settings.mention": "Mentions:",
+  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.show": "Show in column",
+  "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
+  "notifications.filter.all": "All",
+  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.follows": "Follows",
+  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
+  "poll.closed": "Closed",
+  "poll.refresh": "Refresh",
+  "poll.total_people": "{count, plural, one {# 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",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Visible for mentioned users only",
+  "privacy.direct.short": "Direct",
+  "privacy.private.long": "Visible for followers only",
+  "privacy.private.short": "Followers-only",
+  "privacy.public.long": "Visible for all, shown in public timelines",
+  "privacy.public.short": "Public",
+  "privacy.unlisted.long": "Visible for all, but not in public timelines",
+  "privacy.unlisted.short": "Unlisted",
+  "refresh": "Refresh",
+  "regeneration_indicator.label": "Loading…",
+  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "relative_time.days": "{number}d",
+  "relative_time.hours": "{number}h",
+  "relative_time.just_now": "now",
+  "relative_time.minutes": "{number}m",
+  "relative_time.seconds": "{number}s",
+  "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?",
+  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.placeholder": "Additional comments",
+  "report.submit": "Submit",
+  "report.target": "Report {target}",
+  "search.placeholder": "Search",
+  "search_popout.search_format": "Advanced search format",
+  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.status": "status",
+  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.user": "user",
+  "search_results.accounts": "People",
+  "search_results.hashtags": "Hashtags",
+  "search_results.statuses": "Toots",
+  "search_results.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.bookmark": "Bookmark",
+  "status.cancel_reblog_private": "Unboost",
+  "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
+  "status.delete": "Delete",
+  "status.detailed_status": "Detailed conversation view",
+  "status.direct": "Direct message @{name}",
+  "status.embed": "Embed",
+  "status.favourite": "Favourite",
+  "status.filtered": "Filtered",
+  "status.load_more": "Load more",
+  "status.media_hidden": "Media hidden",
+  "status.mention": "Mention @{name}",
+  "status.more": "More",
+  "status.mute": "Mute @{name}",
+  "status.mute_conversation": "Mute conversation",
+  "status.open": "Expand this status",
+  "status.pin": "Pin on profile",
+  "status.pinned": "Pinned toot",
+  "status.read_more": "Read more",
+  "status.reblog": "Boost",
+  "status.reblog_private": "Boost with original visibility",
+  "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}",
+  "status.sensitive_warning": "Sensitive content",
+  "status.share": "Share",
+  "status.show_less": "Show less",
+  "status.show_less_all": "Show less for all",
+  "status.show_more": "Show more",
+  "status.show_more_all": "Show more for all",
+  "status.show_thread": "Show thread",
+  "status.uncached_media_warning": "Not available",
+  "status.unmute_conversation": "Unmute conversation",
+  "status.unpin": "Unpin from profile",
+  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.header": "You might be interested in…",
+  "tabs_bar.federated_timeline": "Federated",
+  "tabs_bar.home": "Home",
+  "tabs_bar.local_timeline": "Local",
+  "tabs_bar.notifications": "Notifications",
+  "tabs_bar.search": "Search",
+  "time_remaining.days": "{number, plural, one {# day} other {# days}} left",
+  "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left",
+  "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
+  "time_remaining.moments": "Moments remaining",
+  "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "trends.trending_now": "Trending now",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "units.short.billion": "{count}B",
+  "units.short.million": "{count}M",
+  "units.short.thousand": "{count}K",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add images, a video or an audio file",
+  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
+  "upload_form.description": "Describe for the visually impaired",
+  "upload_form.edit": "Edit",
+  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.undo": "Delete",
+  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
+  "upload_modal.analyzing_picture": "Analyzing picture…",
+  "upload_modal.apply": "Apply",
+  "upload_modal.choose_image": "Choose image",
+  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+  "upload_modal.detect_text": "Detect text from picture",
+  "upload_modal.edit_media": "Edit media",
+  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
+  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_progress.label": "Uploading…",
+  "video.close": "Close video",
+  "video.download": "Download file",
+  "video.exit_fullscreen": "Exit full screen",
+  "video.expand": "Expand video",
+  "video.fullscreen": "Full screen",
+  "video.hide": "Hide video",
+  "video.mute": "Mute sound",
+  "video.pause": "Pause",
+  "video.play": "Play",
+  "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json
index 30a3e3374..055a52cab 100644
--- a/app/javascript/mastodon/locales/sc.json
+++ b/app/javascript/mastodon/locales/sc.json
@@ -1,5 +1,5 @@
 {
-  "account.account_note_header": "Note",
+  "account.account_note_header": "Nota",
   "account.add_or_remove_from_list": "Agiunghe o boga dae is listas",
   "account.badges.bot": "Bot",
   "account.badges.group": "Grupu",
@@ -9,14 +9,16 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Annulla rechesta de sighidura",
   "account.direct": "Messàgiu deretu a @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domìniu blocadu",
   "account.edit_profile": "Modìfica profilu",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Cussìgia in su profilu tuo",
   "account.follow": "Sighi",
   "account.followers": "Sighiduras",
   "account.followers.empty": "Nemos sighit ancora custa persone.",
   "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.following_counter": "{count, plural, one {{counter} Sighidu} other {{counter} Sighidos}}",
   "account.follows.empty": "Custa persone non sighit ancora a nemos.",
   "account.follows_you": "Ti sighit",
   "account.hide_reblogs": "Cua is cumpartziduras de @{name}",
@@ -58,7 +60,7 @@
   "bundle_modal_error.message": "Faddina in su carrigamentu de custu cumponente.",
   "bundle_modal_error.retry": "Torra·bi a proare",
   "column.blocks": "Persones blocadas",
-  "column.bookmarks": "Marcadores",
+  "column.bookmarks": "Sinnalibros",
   "column.community": "Lìnia de tempus locale",
   "column.direct": "Messàgios diretos",
   "column.directory": "Nàviga in is profilos",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Non tenes ancora peruna notìfica. Chistiona cun una persone pro cumintzare un'arresonada.",
   "empty_column.public": "Nudda inoghe. Iscrie calicuna cosa pùblica, o sighi àteras persones de àteros serbidores pro prenare custu ispàtziu",
   "error.unexpected_crash.explanation": "A càusa de una faddina in su còdighe nostru o unu problema de cumpatibilidade de su navigadore, custa pàgina diat pòdere no èssere ammustrada in manera curreta.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Proa de atualizare sa pàgina. Si custu non acontza su problema, podes chircare de impreare Mastodon in unu navigadore diferente o in un'aplicatzione nativa.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Còpia stacktrace in punta de billete",
   "errors.unexpected_crash.report_issue": "Signala unu problema",
   "follow_request.authorize": "Autoriza",
@@ -244,12 +248,14 @@
   "keyboard_shortcuts.search": "pro atzentrare sa chirca",
   "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "pro abèrrere sa colunna \"Cumintza\"",
-  "keyboard_shortcuts.toggle_hidden": "pro ammustrare o cuare testu de is CW",
+  "keyboard_shortcuts.toggle_hidden": "pro ammustrare o cuare testu de is AC",
   "keyboard_shortcuts.toggle_sensitivity": "pro ammustrare o cuare mèdias",
   "keyboard_shortcuts.toot": "pro cumintzare a iscrìere unu tut nou",
   "keyboard_shortcuts.unfocus": "pro essire de s'àrea de cumpositzione de testu o de chirca",
   "keyboard_shortcuts.up": "pro mòere in susu in sa lista",
   "lightbox.close": "Serra",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Sighi",
   "lightbox.previous": "Pretzedente",
   "lightbox.view_context": "Bide su cuntestu",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Muda su tìtulu",
   "lists.new.create": "Agiunghe lista",
   "lists.new.title_placeholder": "Lista noa",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Chircare intre sa gente chi ses sighende",
   "lists.subheading": "Is listas tuas",
   "load_pending": "{count, plural, one {# elementu nou} other {# elementos noos}}",
@@ -267,10 +277,12 @@
   "media_gallery.toggle_visible": "Cua mèdia",
   "missing_indicator.label": "Perunu resurtadu",
   "missing_indicator.sublabel": "Resursa no agatada",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Boles cuare is notìficas de custa persone?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Aplicatziones mòbiles",
   "navigation_bar.blocks": "Persones blocadas",
-  "navigation_bar.bookmarks": "Marcadores",
+  "navigation_bar.bookmarks": "Sinnalibros",
   "navigation_bar.community_timeline": "Lìnia de tempus locale",
   "navigation_bar.compose": "Cumpone unu tut nou",
   "navigation_bar.direct": "Messàgios diretos",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Sondàgiu acabbadu",
   "notification.poll": "Unu sondàgiu in su chi as votadu est acabbadu",
   "notification.reblog": "{name} at cumpartzidu s'istadu tuo",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Lìmpia notìficas",
   "notifications.clear_confirmation": "Seguru chi boles isboidare in manera permanente totu is notìficas tuas?",
   "notifications.column_settings.alert": "Notìficas de iscrivania",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Cumpartziduras:",
   "notifications.column_settings.show": "Ammustra in sa colunna",
   "notifications.column_settings.sound": "Reprodue unu sonu",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Totus",
   "notifications.filter.boosts": "Cumpartziduras",
   "notifications.filter.favourites": "Preferidos",
   "notifications.filter.follows": "Sighende",
   "notifications.filter.mentions": "Mentovos",
   "notifications.filter.polls": "Resurtados dae su sondàgiu",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notìficas",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Serradu",
   "poll.refresh": "Atualiza",
   "poll.total_people": "{count, plurale, one {# persone} other {# persones}}",
@@ -341,7 +363,7 @@
   "regeneration_indicator.label": "Carrighende…",
   "regeneration_indicator.sublabel": "Preparende sa lìnia de tempus printzipale tua.",
   "relative_time.days": "{number}d",
-  "relative_time.hours": "{number}h",
+  "relative_time.hours": "{number}o",
   "relative_time.just_now": "immoe",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
@@ -391,7 +413,7 @@
   "status.reblog": "Cumpartzi",
   "status.reblog_private": "Cumpartzi cun is utentes originales",
   "status.reblogged_by": "{name} at cumpartzidu",
-  "status.reblogs.empty": "No one has boosted this toot yet. Cando calicunu dd'at a fàghere, at a èssere ammustradu inoghe.",
+  "status.reblogs.empty": "Nemos at ancora cumpartzidu custu tut. Cando calicunu dd'at a fàghere, at a èssere ammustradu inoghe.",
   "status.redraft": "Cantzella e torra a iscrìere",
   "status.remove_bookmark": "Boga su marcadore",
   "status.reply": "Risponde",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Traga pro carrigare",
-  "upload_button.label": "Agiunghe mèdias ({formats})",
+  "upload_button.label": "Agiunghe mèdias",
   "upload_error.limit": "Lìmite de càrriga de archìvios barigadu.",
   "upload_error.poll": "Non si permitit s'imbiu de archìvios in is sondàgios.",
   "upload_form.audio_description": "Descritzione pro persones cun pèrdida auditiva",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Rileva testu de s'immàgine",
   "upload_modal.edit_media": "Modìfica su mèdia",
   "upload_modal.hint": "Incarca o traga su tzìrculu in sa previsualizatzione pro seberare su puntu focale chi at a èssere semper visìbile in totu is miniaturas.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Previsualiza ({ratio})",
   "upload_progress.label": "Carrighende...",
   "video.close": "Serra su vìdeu",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 38bb7542f..de64a9e52 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Zruš žiadosť o sledovanie",
   "account.direct": "Priama správa pre @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Doména ukrytá",
   "account.edit_profile": "Uprav profil",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Zobrazuj na profile",
   "account.follow": "Nasleduj",
   "account.followers": "Sledujúci",
@@ -43,7 +45,7 @@
   "account.unfollow": "Prestaň následovať",
   "account.unmute": "Prestaň ignorovať @{name}",
   "account.unmute_notifications": "Zruš stĺmenie oboznámení od @{name}",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "Klikni pre vloženie poznámky",
   "alert.rate_limited.message": "Prosím, skús to znova za {retry_time, time, medium}.",
   "alert.rate_limited.title": "Tempo obmedzené",
   "alert.unexpected.message": "Vyskytla sa nečakaná chyba.",
@@ -79,7 +81,7 @@
   "column_header.show_settings": "Ukáž nastavenia",
   "column_header.unpin": "Odopni",
   "column_subheading.settings": "Nastavenia",
-  "community.column_settings.local_only": "Local only",
+  "community.column_settings.local_only": "Iba miestna",
   "community.column_settings.media_only": "Iba médiá",
   "community.column_settings.remote_only": "Remote only",
   "compose_form.direct_message_warning": "Tento príspevok bude boslaný iba spomenutým užívateľom.",
@@ -166,13 +168,15 @@
   "empty_column.notifications": "Ešte nemáš žiadne oznámenia. Začni komunikovať s ostatnými, aby diskusia mohla začať.",
   "empty_column.public": "Ešte tu nič nie je. Napíš niečo verejne, alebo začni sledovať užívateľov z iných serverov, aby tu niečo pribudlo",
   "error.unexpected_crash.explanation": "Kvôli chybe v našom kóde, alebo problému s kompatibilitou prehliadača, túto stránku nebolo možné zobraziť správne.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Skús obnoviť stránku. Ak to nepomôže, pravdepodobne budeš stále môcť používať Mastodon cez iný prehliadač, alebo natívnu aplikáciu.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Skopíruj stacktrace do schránky",
   "errors.unexpected_crash.report_issue": "Nahlás problém",
   "follow_request.authorize": "Povoľ prístup",
   "follow_request.reject": "Odmietni",
   "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
-  "generic.saved": "Saved",
+  "generic.saved": "Uložené",
   "getting_started.developers": "Vývojári",
   "getting_started.directory": "Zoznam profilov",
   "getting_started.documentation": "Dokumentácia",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "nesústreď sa na písaciu plochu, alebo hľadanie",
   "keyboard_shortcuts.up": "posuň sa vyššie v zozname",
   "lightbox.close": "Zatvor",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Ďalšie",
   "lightbox.previous": "Predchádzajúci",
   "lightbox.view_context": "Ukáž kontext",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Zmeň názov",
   "lists.new.create": "Pridaj zoznam",
   "lists.new.title_placeholder": "Názov nového zoznamu",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Vyhľadávaj medzi užívateľmi, ktorých sleduješ",
   "lists.subheading": "Tvoje zoznamy",
   "load_pending": "{count, plural, one {# nová položka} other {# nových položiek}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Zapni/Vypni viditeľnosť",
   "missing_indicator.label": "Nenájdené",
   "missing_indicator.sublabel": "Tento zdroj sa ešte nepodarilo nájsť",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Skry oznámenia od tohto používateľa?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Aplikácie",
   "navigation_bar.blocks": "Blokovaní užívatelia",
   "navigation_bar.bookmarks": "Záložky",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Vyčisti oboznámenia",
   "notifications.clear_confirmation": "Naozaj chceš nenávratne prečistiť všetky tvoje oboznámenia?",
   "notifications.column_settings.alert": "Oboznámenia na ploche",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Vyzdvihnutia:",
   "notifications.column_settings.show": "Ukáž v stĺpci",
   "notifications.column_settings.sound": "Prehraj zvuk",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Všetky",
   "notifications.filter.boosts": "Vyzdvihnutia",
   "notifications.filter.favourites": "Obľúbené",
   "notifications.filter.follows": "Sledovania",
   "notifications.filter.mentions": "Iba spomenutia",
   "notifications.filter.polls": "Výsledky ankiet",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} oboznámení",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Uzatvorená",
   "poll.refresh": "Občerstvi",
   "poll.total_people": "{count, plural, one {# človek} few {# ľudia} other {# ľudí}}",
@@ -420,9 +442,9 @@
   "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}}",
   "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
+  "timeline_hint.resources.followers": "Sledujúci",
+  "timeline_hint.resources.follows": "Následuje",
+  "timeline_hint.resources.statuses": "Staršie príspevky",
   "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
   "trends.trending_now": "Teraz populárne",
   "ui.beforeunload": "Čo máš rozpísané sa stratí, ak opustíš Mastodon.",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Rozpoznaj text z obrázka",
   "upload_modal.edit_media": "Uprav médiá",
   "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.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Náhľad ({ratio})",
   "upload_progress.label": "Nahráva sa...",
   "video.close": "Zavri video",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 71ba0d1b6..dd25cbc03 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Neposredno sporočilo @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Skrita domena",
   "account.edit_profile": "Uredi profil",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Zmožnost profila",
   "account.follow": "Sledi",
   "account.followers": "Sledilci",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Nimate še nobenih obvestil. Povežite se z drugimi, da začnete pogovor.",
   "empty_column.public": "Tukaj ni ničesar! Da ga napolnite, napišite nekaj javnega ali pa ročno sledite uporabnikom iz drugih strežnikov",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Overi",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "odfokusiraj območje za sestavljanje besedila/iskanje",
   "keyboard_shortcuts.up": "premakni se navzgor po seznamu",
   "lightbox.close": "Zapri",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Naslednji",
   "lightbox.previous": "Prejšnji",
   "lightbox.view_context": "Poglej kontekst",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Spremeni naslov",
   "lists.new.create": "Dodaj seznam",
   "lists.new.title_placeholder": "Nov naslov seznama",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Išči med ljudmi, katerim sledite",
   "lists.subheading": "Vaši seznami",
   "load_pending": "{count, plural, one {# nov element} other {# novih elementov}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Preklopi vidljivost",
   "missing_indicator.label": "Ni najdeno",
   "missing_indicator.sublabel": "Tega vira ni bilo mogoče najti",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Skrij obvestila tega uporabnika?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobilne aplikacije",
   "navigation_bar.blocks": "Blokirani uporabniki",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Počisti obvestila",
   "notifications.clear_confirmation": "Ali ste prepričani, da želite trajno izbrisati vsa vaša obvestila?",
   "notifications.column_settings.alert": "Namizna obvestila",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Spodbude:",
   "notifications.column_settings.show": "Prikaži v stolpcu",
   "notifications.column_settings.sound": "Predvajaj zvok",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Vse",
   "notifications.filter.boosts": "Spodbude",
   "notifications.filter.favourites": "Priljubljeni",
   "notifications.filter.follows": "Sledi",
   "notifications.filter.mentions": "Omembe",
   "notifications.filter.polls": "Rezultati glasovanj",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} obvestil",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Zaprto",
   "poll.refresh": "Osveži",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Za pošiljanje povlecite in spustite",
-  "upload_button.label": "Dodaj medije ({formats})",
+  "upload_button.label": "Dodaj medije",
   "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",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Pošiljanje...",
   "video.close": "Zapri video",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 6b33b17b6..63feac7ff 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Shfletoni më tepër rreth profilit origjinal",
   "account.cancel_follow_request": "Anulo kërkesën e ndjekjes",
   "account.direct": "Mesazh i drejtpërdrejtë për @{name}",
+  "account.disable_notifications": "Resht së njoftuari mua, kur poston @{name}",
   "account.domain_blocked": "Përkatësia u bllokua",
   "account.edit_profile": "Përpunoni profilin",
+  "account.enable_notifications": "Njoftomë, kur poston @{name}",
   "account.endorse": "Pasqyrojeni në profil",
   "account.follow": "Ndiqeni",
   "account.followers": "Ndjekës",
@@ -48,7 +50,7 @@
   "alert.rate_limited.title": "Shpejtësi e kufizuar",
   "alert.unexpected.message": "Ndodhi një gabim të papritur.",
   "alert.unexpected.title": "Hëm!",
-  "announcement.announcement": "Njoftime",
+  "announcement.announcement": "Njoftim",
   "autosuggest_hashtag.per_week": "{count} për javë",
   "boost_modal.combo": "Mund të shtypni {combo}, që kjo të anashkalohet herës tjetër",
   "bundle_column_error.body": "Diç shkoi ters teksa ngarkohej ky përbërës.",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Ende s’keni ndonjë njoftim. Ndërveproni me të tjerët që të nisë biseda.",
   "empty_column.public": "S’ka gjë këtu! Shkruani diçka publikisht, ose ndiqni dorazi përdorues prej instancash të tjera, që ta mbushni këtë zonë",
   "error.unexpected_crash.explanation": "Për shkak të një të mete në kodin tonë ose të një problemi përputhshmërie të shfletuesit, kjo faqe s’mund të shfaqet saktë.",
+  "error.unexpected_crash.explanation_addons": "Kjo faqe s’u shfaq dot saktë. Ky gabim ka gjasa të jetë shkaktuar nga një shtesë shfletuesi ose një mjet përkthimi të automatizuar.",
   "error.unexpected_crash.next_steps": "Provoni të freskoni faqen. Nëse kjo s’bën punë, mundeni ende të jeni në gjendje të përdorni Mastodon-in që nga një shfletues tjetër ose nga ndonjë aplikacion origjinal prej projektit.",
+  "error.unexpected_crash.next_steps_addons": "Provoni t’i çaktivizoni dhe të rifreskoni faqen. Nëse kjo s’bën punë, mundeni prapë të jeni në gjendje të përdorni Mastodon-in përmes një shfletuesi tjetër, apo një aplikacioni prej Mastodon-it.",
   "errors.unexpected_crash.copy_stacktrace": "Kopjo stacktrace-in në të papastër",
   "errors.unexpected_crash.report_issue": "Raportoni problemin",
   "follow_request.authorize": "Autorizoje",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "për heqjen e fokusit nga fusha e hartimit të mesazheve apo kërkimeve",
   "keyboard_shortcuts.up": "për ngjitje sipër nëpër listë",
   "lightbox.close": "Mbylle",
+  "lightbox.compress": "Ngjeshe kuadratin e parjes së figurave",
+  "lightbox.expand": "Zgjeroje kuadratin e parjes së figurave",
   "lightbox.next": "Pasuesja",
   "lightbox.previous": "E mëparshmja",
   "lightbox.view_context": "Shihni kontekstin",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Ndryshoni titullin",
   "lists.new.create": "Shtoni listë",
   "lists.new.title_placeholder": "Titull liste të re",
+  "lists.replies_policy.all_replies": "Cilido përdorues i ndjekur",
+  "lists.replies_policy.list_replies": "Anëtarë të listës",
+  "lists.replies_policy.no_replies": "Askush",
+  "lists.replies_policy.title": "Shfaq përgjigje për:",
   "lists.search": "Kërkoni mes personash që ndiqni",
   "lists.subheading": "Listat tuaja",
   "load_pending": "{count, plural,one {# objekt i ri }other {# objekte të rinj }}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Fshihni {number, plural, one {figurë} other {figura}}",
   "missing_indicator.label": "S’u gjet",
   "missing_indicator.sublabel": "Ky burim s’u gjet dot",
+  "mute_modal.duration": "Kohëzgjatje",
   "mute_modal.hide_notifications": "Të kalohen të fshehura njoftimet prej këtij përdoruesi?",
+  "mute_modal.indefinite": "E pacaktuar",
   "navigation_bar.apps": "Aplikacione për celular",
   "navigation_bar.blocks": "Përdorues të bllokuar",
   "navigation_bar.bookmarks": "Faqerojtës",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Pyetësori juaj ka përfunduar",
   "notification.poll": "Ka përfunduar një pyetësor ku keni votuar",
   "notification.reblog": "{name} përforcoi mesazhin tuaj",
+  "notification.status": "{name} sapo postoi",
   "notifications.clear": "Spastroji njoftimet",
   "notifications.clear_confirmation": "Jeni i sigurt se doni të spastrohen përgjithmonë krejt njoftimet tuaja?",
   "notifications.column_settings.alert": "Njoftime desktopi",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Përforcime:",
   "notifications.column_settings.show": "Shfaq në shtylla",
   "notifications.column_settings.sound": "Luaj një tingull",
+  "notifications.column_settings.status": "Mesazhe të rinj:",
   "notifications.filter.all": "Krejt",
   "notifications.filter.boosts": "Përforcime",
   "notifications.filter.favourites": "Të parapëlqyer",
   "notifications.filter.follows": "Ndjekje",
   "notifications.filter.mentions": "Përmendje",
   "notifications.filter.polls": "Përfundime pyetësori",
+  "notifications.filter.statuses": "Përditësime prej personash që ndiqni",
   "notifications.group": "{count}s njoftime",
+  "notifications.mark_as_read": "Vëri shenjë çdo njoftimi si të lexuar",
+  "notifications.permission_denied": "S’mund të aktivizohen njoftime në desktop, ngaqë janë mohuar lejet për këtë.",
+  "notifications.permission_denied_alert": "S’mund të aktivizohen njoftimet në desktop, ngaqë lejet e shfletuesit për këtë janë mohuar më herët",
+  "notifications_permission_banner.enable": "Aktivizo njoftime në desktop",
+  "notifications_permission_banner.how_to_control": "Për të marrë njoftime, kur Mastodon-i s’është i hapur, aktivizoni njoftime në desktop. Përmes butoni {icon} më sipër, mund të kontrolloni me përpikëri cilat lloje ndërveprimesh prodhojnë njoftime në dekstop, pasi të jenë aktivizuar.",
+  "notifications_permission_banner.title": "Mos t’ju shpëtojë gjë",
+  "picture_in_picture.restore": "Ktheje ku qe",
   "poll.closed": "I mbyllur",
   "poll.refresh": "Rifreskoje",
   "poll.total_people": "{count, plural,one {# person }other {# vetë }}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Pikase tekstin prej fotoje",
   "upload_modal.edit_media": "Përpunoni media",
   "upload_modal.hint": "Që të zgjidhni pikën vatrore e cila do të jetë përherë e dukshme në krejt miniaturat, klikojeni ose tërhiqeni rrethin te paraparja.",
+  "upload_modal.preparing_ocr": "Po përgatitet OCR-ja…",
   "upload_modal.preview_label": "Paraparje ({ratio})",
   "upload_progress.label": "Po ngarkohet…",
   "video.close": "Mbylle videon",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index a140fa36e..38fc9cdce 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct Message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domain hidden",
   "account.edit_profile": "Izmeni profil",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Feature on profile",
   "account.follow": "Zaprati",
   "account.followers": "Pratioca",
@@ -96,9 +98,9 @@
   "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",
-  "compose_form.sensitive.marked": "Media is marked as sensitive",
-  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
+  "compose_form.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Ovde upišite upozorenje",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Trenutno nemate obaveštenja. Družite se malo da započnete razgovore.",
   "empty_column.public": "Ovde nema ničega! Napišite nešto javno, ili nađite korisnike sa drugih instanci koje ćete zapratiti da popunite ovu prazninu",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Odobri",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "da ne budete više na pretrazi/pravljenju novog tuta",
   "keyboard_shortcuts.up": "da se pomerite na gore u listi",
   "lightbox.close": "Zatvori",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Sledeći",
   "lightbox.previous": "Prethodni",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Dodaj listu",
   "lists.new.title_placeholder": "Naslov nove liste",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Pretraži među ljudima koje pratite",
   "lists.subheading": "Vaše liste",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Uključi/isključi vidljivost",
   "missing_indicator.label": "Nije pronađeno",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Sakrij obaveštenja od ovog korisnika?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokirani korisnici",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Očisti obaveštenja",
   "notifications.clear_confirmation": "Da li ste sigurno da trajno želite da očistite Vaša obaveštenja?",
   "notifications.column_settings.alert": "Obaveštenja na radnoj površini",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Podrški:",
   "notifications.column_settings.show": "Prikaži u koloni",
   "notifications.column_settings.sound": "Puštaj zvuk",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Otpremam...",
   "video.close": "Zatvori video",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index 7c42f0e8a..8df81fae6 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Поништи захтеве за праћење",
   "account.direct": "Директна порука @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Домен сакривен",
   "account.edit_profile": "Измени профил",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Приказати на профилу",
   "account.follow": "Запрати",
   "account.followers": "Пратиоци",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "Тренутно немате обавештења. Дружите се мало да започнете разговор.",
   "empty_column.public": "Овде нема ничега! Напишите нешто јавно, или нађите кориснике са других инстанци које ћете запратити да попуните ову празнину",
   "error.unexpected_crash.explanation": "Због грешке у нашем коду или проблема са компатибилношћу прегледача, ова страница се није могла правилно приказати.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Покушајте да освежите страницу. Ако то не помогне, можда ћете и даље моћи да користите Мастодон путем другог прегледача или матичне апликације.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Копирај \"stacktrace\" у клипборд",
   "errors.unexpected_crash.report_issue": "Пријави проблем",
   "follow_request.authorize": "Одобри",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "да одфокусирате/не будете више на претрази/прављењу нове трубе",
   "keyboard_shortcuts.up": "да се померите на горе у листи",
   "lightbox.close": "Затвори",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Следећи",
   "lightbox.previous": "Претходни",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Додај листу",
   "lists.new.title_placeholder": "Наслов нове листе",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Претражи међу људима које пратите",
   "lists.subheading": "Ваше листе",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Укључи/искључи видљивост",
   "missing_indicator.label": "Није пронађено",
   "missing_indicator.sublabel": "Овај ресурс није пронађен",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Сакриј обавештења од овог корисника?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Мобилне апликације",
   "navigation_bar.blocks": "Блокирани корисници",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} је подржао/ла Ваш статус",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Очисти обавештења",
   "notifications.clear_confirmation": "Да ли сте сигурно да трајно желите да очистите Ваша обавештења?",
   "notifications.column_settings.alert": "Обавештења на радној површини",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Подршки:",
   "notifications.column_settings.show": "Прикажи у колони",
   "notifications.column_settings.sound": "Пуштај звук",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} обавештења",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Отпремам...",
   "video.close": "Затвори видео",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 0389e222d..86f4738c7 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -1,22 +1,24 @@
 {
-  "account.account_note_header": "Note",
+  "account.account_note_header": "Anteckning",
   "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",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "Läs mer på original profilen",
   "account.cancel_follow_request": "Avbryt följarförfrågan",
   "account.direct": "Skicka ett direktmeddelande till @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domän dold",
   "account.edit_profile": "Redigera profil",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Visa på profil",
   "account.follow": "Följ",
   "account.followers": "Följare",
   "account.followers.empty": "Ingen följer denna användare än.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, one {{counter} Följare} other {{counter} Följare}}",
+  "account.following_counter": "{count, plural, one {{counter} Följer} other {{counter} Följer}}",
   "account.follows.empty": "Denna användare följer inte någon än.",
   "account.follows_you": "Följer dig",
   "account.hide_reblogs": "Dölj knuffar från @{name}",
@@ -43,12 +45,12 @@
   "account.unfollow": "Sluta följ",
   "account.unmute": "Sluta tysta @{name}",
   "account.unmute_notifications": "Återaktivera aviseringar från @{name}",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "Klicka för att lägga till anteckning",
   "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",
+  "announcement.announcement": "Meddelande",
   "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.",
@@ -166,13 +168,15 @@
   "empty_column.notifications": "Du har inga meddelanden än. Interagera med andra för att starta konversationen.",
   "empty_column.public": "Det finns inget här! Skriv något offentligt, eller följ manuellt användarna från andra instanser för att fylla på det",
   "error.unexpected_crash.explanation": "På grund av en bugg i vår kod eller kompatiblitetsproblem i webbläsaren kan den här sidan inte visas korrekt.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Prova att ladda om sidan. Om det inte hjälper kan du försöka använda Mastodon med en annan webbläsare eller app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Kopiera stacktrace till urklipp",
   "errors.unexpected_crash.report_issue": "Rapportera problem",
   "follow_request.authorize": "Godkänn",
   "follow_request.reject": "Avvisa",
   "follow_requests.unlocked_explanation": "Även om ditt konto inte är låst tror {domain} personalen att du kanske vill granska dessa följares förfrågningar manuellt.",
-  "generic.saved": "Saved",
+  "generic.saved": "Sparad",
   "getting_started.developers": "Utvecklare",
   "getting_started.directory": "Profilkatalog",
   "getting_started.documentation": "Dokumentation",
@@ -236,13 +240,13 @@
   "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.open_media": "öppna 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",
   "keyboard_shortcuts.requests": "för att öppna Följförfrågningar",
   "keyboard_shortcuts.search": "för att fokusera sökfältet",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.spoilers": "visa/dölja CW-fält",
   "keyboard_shortcuts.start": "för att öppna \"Kom igång\"-kolumnen",
   "keyboard_shortcuts.toggle_hidden": "för att visa/gömma text bakom CW",
   "keyboard_shortcuts.toggle_sensitivity": "för att visa/gömma media",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "för att avfokusera skrivfält/sökfält",
   "keyboard_shortcuts.up": "för att flytta uppåt i listan",
   "lightbox.close": "Stäng",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Nästa",
   "lightbox.previous": "Tidigare",
   "lightbox.view_context": "Visa kontext",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Ändra titel",
   "lists.new.create": "Lägg till lista",
   "lists.new.title_placeholder": "Ny listrubrik",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Sök bland personer du följer",
   "lists.subheading": "Dina listor",
   "load_pending": "{count, plural, other {# objekt}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Växla synlighet",
   "missing_indicator.label": "Hittades inte",
   "missing_indicator.sublabel": "Den här resursen kunde inte hittas",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Dölj aviseringar från denna användare?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobilappar",
   "navigation_bar.blocks": "Blockerade användare",
   "navigation_bar.bookmarks": "Bokmärken",
@@ -298,6 +310,7 @@
   "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",
+  "notification.status": "{name} just posted",
   "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",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Knuffar:",
   "notifications.column_settings.show": "Visa i kolumnen",
   "notifications.column_settings.sound": "Spela upp ljud",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Alla",
   "notifications.filter.boosts": "Knuffar",
   "notifications.filter.favourites": "Favoriter",
   "notifications.filter.follows": "Följer",
   "notifications.filter.mentions": "Omnämningar",
   "notifications.filter.polls": "Omröstningsresultat",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} aviseringar",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Stängd",
   "poll.refresh": "Ladda om",
   "poll.total_people": "{persons, plural, one {# person} other {# personer}}",
@@ -419,11 +441,11 @@
   "time_remaining.minutes": "{minutes, plural, one {1 minut} other {# minuter}} kvar",
   "time_remaining.moments": "Återstående tillfällen",
   "time_remaining.seconds": "{hours, plural, one {# sekund} other {# sekunder}} kvar",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "timeline_hint.remote_resource_not_displayed": "{resource} från andra servrar visas inte.",
+  "timeline_hint.resources.followers": "Följare",
+  "timeline_hint.resources.follows": "Följer",
+  "timeline_hint.resources.statuses": "Äldre tutningar",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} personer}} pratar",
   "trends.trending_now": "Trendar nu",
   "ui.beforeunload": "Ditt utkast kommer att förloras om du lämnar Mastodon.",
   "units.short.billion": "{count}B",
@@ -433,19 +455,20 @@
   "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": "Beskriv för hörselskadade",
+  "upload_form.audio_description": "Beskriv för personer med hörselnedsättning",
   "upload_form.description": "Beskriv för synskadade",
   "upload_form.edit": "Beskriv",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "Ändra miniatyr",
   "upload_form.undo": "Ta bort",
-  "upload_form.video_description": "Beskriv för hörselskadade eller synskadade",
+  "upload_form.video_description": "Beskriv för personer med hörsel- eller synnedsättning",
   "upload_modal.analyzing_picture": "Analyserar bild…",
   "upload_modal.apply": "Verkställ",
-  "upload_modal.choose_image": "Choose image",
+  "upload_modal.choose_image": "Välj bild",
   "upload_modal.description_placeholder": "En snabb brun räv hoppar över den lata hunden",
   "upload_modal.detect_text": "Upptäck bildens text",
   "upload_modal.edit_media": "Redigera meida",
   "upload_modal.hint": "Klicka eller dra cirkeln på förhandstitten för att välja den fokusering som alltid kommer synas på alla miniatyrer.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Förhandstitt ({ratio})",
   "upload_progress.label": "Laddar upp...",
   "video.close": "Stäng video",
diff --git a/app/javascript/mastodon/locales/szl.json b/app/javascript/mastodon/locales/szl.json
index b3822ff08..17ffe5519 100644
--- a/app/javascript/mastodon/locales/szl.json
+++ b/app/javascript/mastodon/locales/szl.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domain blocked",
   "account.edit_profile": "Edit profile",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Feature on profile",
   "account.follow": "Follow",
   "account.followers": "Followers",
@@ -96,9 +98,9 @@
   "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.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Write your warning here",
@@ -166,7 +168,9 @@
   "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",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Authorize",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Show in column",
   "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploading…",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 28f03f781..d509b619a 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -1,22 +1,24 @@
 {
-  "account.account_note_header": "Note",
+  "account.account_note_header": "குறிப்பு",
   "account.add_or_remove_from_list": "பட்டியல்களில் சேர்/நீக்கு",
   "account.badges.bot": "பாட்",
   "account.badges.group": "குழு",
   "account.block": "@{name} -ஐத் தடு",
   "account.block_domain": "{domain} யில் இருந்து வரும் எல்லாவற்றையும் மறை",
   "account.blocked": "முடக்கப்பட்டது",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "மேலும் உலாவ சுயவிவரத்திற்குச் செல்க",
   "account.cancel_follow_request": "பின்தொடரும் கோரிக்கையை நிராகரி",
   "account.direct": "நேரடி செய்தி @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "மறைக்கப்பட்டத் தளங்கள்",
   "account.edit_profile": "சுயவிவரத்தை மாற்று",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "சுயவிவரத்தில் வெளிப்படுத்து",
   "account.follow": "பின்தொடர்",
   "account.followers": "பின்தொடர்பவர்கள்",
   "account.followers.empty": "இதுவரை யாரும் இந்த பயனரைப் பின்தொடரவில்லை.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, one {{counter} வாசகர்} other {{counter} வாசகர்கள்}}",
+  "account.following_counter": "{count, plural,one {{counter} சந்தா} other {{counter} சந்தாக்கள்}}",
   "account.follows.empty": "இந்த பயனர் இதுவரை யாரையும் பின்தொடரவில்லை.",
   "account.follows_you": "உங்களைப் பின்தொடர்கிறார்",
   "account.hide_reblogs": "இருந்து ஊக்கியாக மறை @{name}",
@@ -36,14 +38,14 @@
   "account.requested": "ஒப்புதலுக்காகக் காத்திருக்கிறது. பின்தொடரும் கோரிக்கையை நீக்க அழுத்தவும்",
   "account.share": "@{name} உடைய விவரத்தை பகிர்",
   "account.show_reblogs": "காட்டு boosts இருந்து @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} டூட்} other {{counter} டூட்டுகள்}}",
   "account.unblock": "@{name} மீது தடை நீக்குக",
   "account.unblock_domain": "{domain} ஐ காண்பி",
   "account.unendorse": "சுயவிவரத்தில் இடம்பெற வேண்டாம்",
   "account.unfollow": "பின்தொடர்வதை நிறுத்துக",
   "account.unmute": "@{name} இன் மீது மௌனத் தடையை நீக்குக",
   "account.unmute_notifications": "@{name} இலிருந்து அறிவிப்புகளின் மீது மௌனத் தடையை நீக்குக",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "குறிப்பு ஒன்றை சேர்க்க சொடுக்கவும்",
   "alert.rate_limited.message": "{retry_time, time, medium} க்கு பிறகு மீண்டும் முயற்சிக்கவும்.",
   "alert.rate_limited.title": "பயன்பாடு கட்டுப்படுத்தப்பட்டுள்ளது",
   "alert.unexpected.message": "எதிர்பாராத பிழை ஏற்பட்டுவிட்டது.",
@@ -79,9 +81,9 @@
   "column_header.show_settings": "அமைப்புகளைக் காட்டு",
   "column_header.unpin": "கழட்டு",
   "column_subheading.settings": "அமைப்புகள்",
-  "community.column_settings.local_only": "Local only",
+  "community.column_settings.local_only": "அருகிலிருந்து மட்டுமே",
   "community.column_settings.media_only": "படங்கள் மட்டுமே",
-  "community.column_settings.remote_only": "Remote only",
+  "community.column_settings.remote_only": "தொலைவிலிருந்து மட்டுமே",
   "compose_form.direct_message_warning": "இந்த டூட் இதில் குறிப்பிடப்பட்டுள்ள பயனர்களுக்கு மட்டுமே அனுப்பப்படும்.",
   "compose_form.direct_message_warning_learn_more": "மேலும் அறிய",
   "compose_form.hashtag_warning": "இது ஒரு பட்டியலிடப்படாத டூட் என்பதால் எந்த ஹேஷ்டேகின் கீழும் வராது. ஹேஷ்டேகின் மூலம் பொதுவில் உள்ள டூட்டுகளை மட்டுமே தேட முடியும்.",
@@ -127,7 +129,7 @@
   "conversation.mark_as_read": "படிக்கபட்டதாகக் குறி",
   "conversation.open": "உரையாடலைக் காட்டு",
   "conversation.with": "{names} உடன்",
-  "directory.federated": "ஆலமரத்தின் அறியப்பட்டப் பகுதியிலிருந்து",
+  "directory.federated": "அறியப்பட்ட ஃபெடிவெர்சிலிருந்து",
   "directory.local": "{domain} களத்திலிருந்து மட்டும்",
   "directory.new_arrivals": "புதிய வரவு",
   "directory.recently_active": "சற்றுமுன் செயல்பாட்டில் இருந்தவர்கள்",
@@ -139,7 +141,7 @@
   "emoji_button.food": "உணவு மற்றும் பானம்",
   "emoji_button.label": "எமோஜியை உள்ளிடு",
   "emoji_button.nature": "இயற்கை",
-  "emoji_button.not_found": "வேண்டாம் எமோஜோஸ்! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "எமோஜிக்கள் இல்லை! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "பொருட்கள்",
   "emoji_button.people": "மக்கள்",
   "emoji_button.recent": "அடிக்கடி பயன்படுத்தப்படுபவை",
@@ -147,88 +149,90 @@
   "emoji_button.search_results": "தேடல் முடிவுகள்",
   "emoji_button.symbols": "குறியீடுகள்",
   "emoji_button.travel": "சுற்றுலா மற்றும் இடங்கள்",
-  "empty_column.account_timeline": "இல்லை toots இங்கே!",
+  "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.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": "மென்பொருள் பழுதுனாலோ அல்லது உங்கள் இணை உலாவியின் பொருந்தாதன்மையினாலோ இந்தப் பக்கத்தை சரியாகக் காண்பிக்க முடியவில்லை.",
-  "error.unexpected_crash.next_steps": "பக்கத்தை புதுப்பித்துப் பார்க்கவும். வேலை செய்யவில்லையெனில், வேறு ஒரு உலாவியில் இருந்தோ அல்லது உங்கள் கருவிக்கு பொருத்தமான வேறு செயலியில் இருந்தோ மச்டோடனைப் பயன்படுத்தவும்.",
-  "errors.unexpected_crash.copy_stacktrace": "பழுசெய்தியை பிடிப்புப் பலகைக்கு நகல் எடு",
+  "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": "இந்தப் பக்கத்தை சரியாகக் காண்பிக்க இயலவில்லை. மென்பொருளில் உள்ள பிழையோ அல்லது பொருந்தாத உலாவியோ காரணமாக இருக்கலாம்.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
+  "error.unexpected_crash.next_steps": "பக்கத்தைப் புதுப்பித்துப் பார்க்கவும். அப்படியும் வேலை செய்யவில்லை எனில், மாஸ்டடானை வேறு ஒரு உலாவியின் மூலமோ, அல்லது பொருத்தமான செயலியின் மூலமோ பயன்படுத்திப் பார்க்கவும்.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "errors.unexpected_crash.copy_stacktrace": "Stacktrace-ஐ clipboard-ல் நகலெடு",
   "errors.unexpected_crash.report_issue": "புகாரளி",
-  "follow_request.authorize": "அதிகாரமளி",
-  "follow_request.reject": "விலக்கு",
+  "follow_request.authorize": "அனுமதியளி",
+  "follow_request.reject": "நிராகரி",
   "follow_requests.unlocked_explanation": "உங்கள் கணக்கு பூட்டப்படவில்லை என்றாலும், இந்தக் கணக்குகளிலிருந்து உங்களைப் பின்தொடர விரும்பும் கோரிக்கைகளை நீங்கள் பரீசீலிப்பது நலம் என்று {domain} ஊழியர் எண்ணுகிறார்.",
-  "generic.saved": "Saved",
+  "generic.saved": "சேமிக்கப்பட்டது",
   "getting_started.developers": "உருவாக்குநர்கள்",
-  "getting_started.directory": "சுயவிவர அடைவு",
+  "getting_started.directory": "பயனர்கள்",
   "getting_started.documentation": "ஆவணங்கள்",
-  "getting_started.heading": "தொடங்குதல்",
-  "getting_started.invite": "நபர்களை அழைக்கவும்",
-  "getting_started.open_source_notice": "Mastodon திறந்த மூல மென்பொருள். GitHub இல் நீங்கள் பங்களிக்கவோ அல்லது புகார் அளிக்கவோ முடியும் {github}.",
-  "getting_started.security": "பத்திரம்",
+  "getting_started.heading": "முதன்மைப் பக்கம்",
+  "getting_started.invite": "நண்பர்களை அழைக்க",
+  "getting_started.open_source_notice": "மாஸ்டடான் ஒரு open source மென்பொருள் ஆகும். {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_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.any": "இவற்றில் எவையேனும்",
   "hashtag.column_settings.tag_mode.none": "இவற்றில் ஏதுமில்லை",
-  "hashtag.column_settings.tag_toggle": "இந்த நெடுவரிசையில் கூடுதல் குறிச்சொற்களை சேர்க்கவும்",
-  "home.column_settings.basic": "அடிப்படையான",
-  "home.column_settings.show_reblogs": "காட்டு boosts",
-  "home.column_settings.show_replies": "பதில்களைக் காண்பி",
+  "hashtag.column_settings.tag_toggle": "இந்த நெடுவரிசையில் கூடுதல் சிட்டைகளைச் சேர்க்கவும்",
+  "home.column_settings.basic": "அடிப்படையானவை",
+  "home.column_settings.show_reblogs": "பகிர்வுகளைக் காண்பி",
+  "home.column_settings.show_replies": "மறுமொழிகளைக் காண்பி",
   "home.hide_announcements": "அறிவிப்புகளை மறை",
   "home.show_announcements": "அறிவிப்புகளைக் காட்டு",
-  "intervals.full.days": "{number, plural, one {# day} மற்ற {# days}}",
-  "intervals.full.hours": "{number, plural, one {# hour} மற்ற {# hours}}",
-  "intervals.full.minutes": "{number, plural, one {# minute} மற்ற {# minutes}}",
-  "introduction.federation.action": "அடுத்த",
+  "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.text": "ஃபெடிவெர்சின் மற்ற சர்வர்களிலிருந்து இடப்படும் பொதுப் பதிவுகள் இந்த மாஸ்டடான் ஆலமரத்தில் தோன்றும்.",
   "introduction.federation.home.headline": "முகப்பு",
-  "introduction.federation.home.text": "நீங்கள் பின்பற்றும் நபர்களின் இடுகைகள் உங்கள் வீட்டு ஊட்டத்தில் தோன்றும். நீங்கள் எந்த சர்வரில் யாரையும் பின்பற்ற முடியும்!",
+  "introduction.federation.home.text": "நீங்கள் பின்தொடரும் நபர்களின் இடுகைகள் உங்கள் மாஸ்டடான் வீட்டில் தோன்றும். உங்களால் எந்த சர்வரில் உள்ள எவரையும் பின்பற்ற முடியும்!",
   "introduction.federation.local.headline": "அருகாமை",
-  "introduction.federation.local.text": "உள்ளூர் சேவையகத்தில் தோன்றும் அதே சர்வரில் உள்ளவர்களின் பொது இடுகைகள்.",
-  "introduction.interactions.action": "பயிற்சி முடிக்க!",
-  "introduction.interactions.favourite.headline": "விருப்பத்துக்குகந்த",
-  "introduction.interactions.favourite.text": "நீங்கள் ஒரு காப்பாற்ற முடியும் toot பின்னர், மற்றும் ஆசிரியர் அதை நீங்கள் பிடித்திருக்கிறது என்று, அதை பிடித்திருக்கிறது என்று தெரியப்படுத்துங்கள்.",
-  "introduction.interactions.reblog.headline": "மதிப்பை உயர்த்து",
-  "introduction.interactions.reblog.text": "மற்றவர்களின் பகிர்ந்து கொள்ளலாம் toots உங்கள் ஆதரவாளர்களுடன் அவர்களை அதிகரிக்கும்.",
-  "introduction.interactions.reply.headline": "மறுமொழி கூறு",
-  "introduction.interactions.reply.text": "நீங்கள் மற்றவர்களுக்கும் உங்கள் சொந்த டோட்ட்களிற்கும் பதிலளிப்பீர்கள், இது ஒரு உரையாடலில் சங்கிலி ஒன்றாகச் சேரும்.",
-  "introduction.welcome.action": "போகலாம்!",
-  "introduction.welcome.headline": "முதல் படிகள்",
-  "introduction.welcome.text": "கூட்டாளிக்கு வருக! ஒரு சில நிமிடங்களில், பலவிதமான சேவையகங்களில் செய்திகளை உரையாட மற்றும் உங்கள் நண்பர்களிடம் பேச முடியும். ஆனால் இந்த சர்வர், {domain}, சிறப்பு - இது உங்கள் சுயவிவரத்தை வழங்குகிறது, எனவே அதன் பெயரை நினைவில் கொள்ளுங்கள்.",
-  "keyboard_shortcuts.back": "பின் செல்வதற்கு",
-  "keyboard_shortcuts.blocked": "தடுக்கப்பட்ட பயனர்களின் பட்டியலைத் திறக்க",
-  "keyboard_shortcuts.boost": "அதிகரிக்கும்",
-  "keyboard_shortcuts.column": "நெடுவரிசைகளில் ஒன்றில் நிலைக்கு கவனம் செலுத்த வேண்டும்",
-  "keyboard_shortcuts.compose": "தொகு உரைப்பகுதியை கவனத்தில் கொள்ளவும்",
+  "introduction.federation.local.text": "உங்கள் சர்வரில் இருக்கும் மற்ற நபர்களின் பொதுப் பதிவுகள் இந்த மாஸ்டடான் முச்சந்தியில் தோன்றும்.",
+  "introduction.interactions.action": "பயிற்சியை நிறைவு செய்!",
+  "introduction.interactions.favourite.headline": "விருப்பம்",
+  "introduction.interactions.favourite.text": "ஒரு டூட்டில் விருப்பக்குறி இடுவதன் மூலம் உங்கள் விருப்பத்தை அதை எழுதியவருக்குத் தெரியப்படுத்த முடியும், மேலும் அந்த டூட்டை மறுவாசிப்பிற்காக சேமிக்கமுடியும்.",
+  "introduction.interactions.reblog.headline": "பகிர்",
+  "introduction.interactions.reblog.text": "மற்றவர்களின் டூட்டுகளைப் பகிர்வதன் மூலம் அவற்றை உங்கள் வாசகர்களுக்குக் காண்பிக்க முடியும்.",
+  "introduction.interactions.reply.headline": "மறுமொழி",
+  "introduction.interactions.reply.text": "உங்களால் மற்றவர்களின் டூட்டுகளிலும் உங்கள் டூட்டுகளிலும் மறுமொழி இட முடியும். அவை ஒன்றோடு ஒன்றாக சங்கிலிபோல் பின்னப்பட்டு உரையாடலாக மாறும்.",
+  "introduction.welcome.action": "வாருங்கள் துவங்கலாம்!",
+  "introduction.welcome.headline": "முதற்படிகள்",
+  "introduction.welcome.text": "ஃபெடிவெர்ஸ் உங்களை அன்புடன் வரவேற்கிறது! இன்னும் சில நிமிடங்களில் உங்களால் செய்திகளை உலகிற்குச் சொல்லமுடியும். பல்வேறு சர்வர்களில் இருக்கும் உங்கள் நண்பர்களோடு பேச முடியும். ஆனால், இந்த சர்வர் {domain} மிகவும் தனித்துவமானது, ஏனெனில் உங்கள் பக்கத்தை இதுதான் வழங்குகிறது, எனவே இதன் பெயரை நினைவில் கொள்ளுங்கள்.",
+  "keyboard_shortcuts.back": "பின் செல்ல",
+  "keyboard_shortcuts.blocked": "தடுக்கப்பட்ட பயனர்கள் பட்டியலைத் திறக்க",
+  "keyboard_shortcuts.boost": "பகிர",
+  "keyboard_shortcuts.column": "ஏதேனும் ஒரு நெடுவரிசையில் உள்ள டூட்டுல் கவனம் செலுத்த",
+  "keyboard_shortcuts.compose": "பதிவு எழுதும் பெட்டியில் கவனம் செலுத்த",
   "keyboard_shortcuts.description": "விவரம்",
-  "keyboard_shortcuts.direct": "நேரடி செய்திகள் பத்தி திறக்க",
-  "keyboard_shortcuts.down": "பட்டியலில் கீழே நகர்த்த",
-  "keyboard_shortcuts.enter": "பதிவைத்திறக்க",
-  "keyboard_shortcuts.favourite": "பிடித்தது",
-  "keyboard_shortcuts.favourites": "பிடித்தவை பட்டியலை திறக்க",
-  "keyboard_shortcuts.federated": "ஒருங்கிணைந்த நேரத்தை திறக்க",
-  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
-  "keyboard_shortcuts.home": "வீட்டு நேரத்தை திறக்க",
+  "keyboard_shortcuts.direct": "தனிப்பெட்டியைத் திறக்க",
+  "keyboard_shortcuts.down": "பட்டியலின் கீழே செல்ல",
+  "keyboard_shortcuts.enter": "டூட்டைத் திறக்க",
+  "keyboard_shortcuts.favourite": "விருப்பக்குறி இட",
+  "keyboard_shortcuts.favourites": "விருப்பப் பட்டியலைத் திறக்க",
+  "keyboard_shortcuts.federated": "மாஸ்டடான் ஆலமரத்தைத் திறக்க",
+  "keyboard_shortcuts.heading": "விசைப்பலகை குறுக்குவழிகள்",
+  "keyboard_shortcuts.home": "மாஸ்டடான் வீட்டைத் திறக்க",
   "keyboard_shortcuts.hotkey": "ஹாட் கீ",
   "keyboard_shortcuts.legend": "இந்த புராணத்தை காட்சிப்படுத்த",
   "keyboard_shortcuts.local": "உள்ளூர் காலவரிசை திறக்க",
@@ -242,7 +246,7 @@
   "keyboard_shortcuts.reply": "பதிலளிக்க",
   "keyboard_shortcuts.requests": "கோரிக்கைகள் பட்டியலைத் திறக்க",
   "keyboard_shortcuts.search": "தேடல் கவனம் செலுத்த",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.spoilers": "உள்ளடக்க எச்சரிக்கை செய்தியைக் காட்ட/மறைக்க",
   "keyboard_shortcuts.start": "'தொடங்குவதற்கு' நெடுவரிசை திறக்க",
   "keyboard_shortcuts.toggle_hidden": "CW க்கு பின்னால் உரையை மறைக்க / மறைக்க",
   "keyboard_shortcuts.toggle_sensitivity": "படிமங்களைக் காட்ட/மறைக்க",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "உரை பகுதியை / தேடலை கவனம் செலுத்த வேண்டும்",
   "keyboard_shortcuts.up": "பட்டியலில் மேலே செல்ல",
   "lightbox.close": "நெருக்கமாக",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "அடுத்த",
   "lightbox.previous": "சென்ற",
   "lightbox.view_context": "சூழலைக் பார்",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "தலைப்பு மாற்றவும்",
   "lists.new.create": "பட்டியலில் சேர்",
   "lists.new.title_placeholder": "புதிய பட்டியல் தலைப்பு",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "நீங்கள் பின்தொடரும் நபர்கள் மத்தியில் தேடுதல்",
   "lists.subheading": "உங்கள் பட்டியல்கள்",
   "load_pending": "{count, plural,one {# புதியது}other {# புதியவை}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "நிலைமாற்று தெரியும்",
   "missing_indicator.label": "கிடைக்கவில்லை",
   "missing_indicator.sublabel": "இந்த ஆதாரத்தை காண முடியவில்லை",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "இந்த பயனரின் அறிவிப்புகளை மறைக்கவா?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "மொபைல் பயன்பாடுகள்",
   "navigation_bar.blocks": "தடுக்கப்பட்ட பயனர்கள்",
   "navigation_bar.bookmarks": "அடையாளக்குறிகள்",
@@ -298,6 +310,7 @@
   "notification.own_poll": "கருத்துக்கணிப்பு நிறைவடைந்தது",
   "notification.poll": "நீங்கள் வாக்களித்த வாக்கெடுப்பு முடிவடைந்தது",
   "notification.reblog": "{name} உங்கள் நிலை அதிகரித்தது",
+  "notification.status": "{name} just posted",
   "notifications.clear": "அறிவிப்புகளை அழிக்கவும்",
   "notifications.clear_confirmation": "உங்கள் எல்லா அறிவிப்புகளையும் நிரந்தரமாக அழிக்க விரும்புகிறீர்களா?",
   "notifications.column_settings.alert": "டெஸ்க்டாப் அறிவிப்புகள்",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "மதிப்பை உயர்த்து:",
   "notifications.column_settings.show": "பத்தியில் காண்பி",
   "notifications.column_settings.sound": "ஒலி விளையாட",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "எல்லா",
   "notifications.filter.boosts": "மதிப்பை உயர்த்து",
   "notifications.filter.favourites": "விருப்பத்துக்குகந்த",
   "notifications.filter.follows": "பின்பற்று",
   "notifications.filter.mentions": "குறிப்பிடுகிறார்",
   "notifications.filter.polls": "கருத்துக்கணிப்பு முடிவுகள்",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} அறிவிப்புகள்",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "மூடிய",
   "poll.refresh": "பத்துயிர்ப்ப?ட்டு",
   "poll.total_people": "{count, plural, one {# நபர்} other {# நபர்கள்}}",
@@ -419,11 +441,11 @@
   "time_remaining.minutes": "{number, plural, one {# minute} மற்ற {# minutes}} left",
   "time_remaining.moments": "தருணங்கள் மீதமுள்ளன",
   "time_remaining.seconds": "{number, plural, one {# second} மற்ற {# seconds}} left",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "timeline_hint.remote_resource_not_displayed": "பிற சர்வர்களிலிருந்து வரும் {resource} காட்டப்படவில்லை.",
+  "timeline_hint.resources.followers": "வாசகர்கள்",
+  "timeline_hint.resources.follows": "வாசிக்கிறார்",
+  "timeline_hint.resources.statuses": "பழைய டூட்டுகள்",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} நபர்} other {{counter} நபர்கள்}} உரையாடலில்",
   "trends.trending_now": "இப்போது செல்திசையில் இருப்பவை",
   "ui.beforeunload": "நீங்கள் வெளியே சென்றால் உங்கள் வரைவு இழக்கப்படும் மஸ்தோடோன்.",
   "units.short.billion": "{count}B",
@@ -436,16 +458,17 @@
   "upload_form.audio_description": "செவித்திறன் குறைபாடு உள்ளவர்களுக்காக விளக்குக‌",
   "upload_form.description": "பார்வையற்ற விவரிக்கவும்",
   "upload_form.edit": "தொகு",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "சிறுபடத்தை மாற்ற",
   "upload_form.undo": "நீக்கு",
   "upload_form.video_description": "செவித்திறன் மற்றும் பார்வைக் குறைபாடு உள்ளவர்களுக்காக விளக்குக‌",
   "upload_modal.analyzing_picture": "படம் ஆராயப்படுகிறது…",
   "upload_modal.apply": "உபயோகி",
-  "upload_modal.choose_image": "Choose image",
+  "upload_modal.choose_image": "படத்தைத் தேர்வுசெய்ய",
   "upload_modal.description_placeholder": "பொருள் விளக்கம்",
   "upload_modal.detect_text": "படத்தில் இருக்கும் எழுத்தை கண்டறி",
   "upload_modal.edit_media": "படத்தைத் தொகு",
   "upload_modal.hint": "எல்லா வில்லைப்பட்த்திலும் தெரியவேண்டிய, படத்தின் முக்கிய குவியப்புள்ளிக்கு, வட்டத்தை சொடுக்கி இழுத்துச்செல்லவும்.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "முன்னோட்டம் ({ratio})",
   "upload_progress.label": "ஏற்றுகிறது ...",
   "video.close": "வீடியோவை மூடு",
diff --git a/app/javascript/mastodon/locales/tai.json b/app/javascript/mastodon/locales/tai.json
index b3822ff08..17ffe5519 100644
--- a/app/javascript/mastodon/locales/tai.json
+++ b/app/javascript/mastodon/locales/tai.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domain blocked",
   "account.edit_profile": "Edit profile",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Feature on profile",
   "account.follow": "Follow",
   "account.followers": "Followers",
@@ -96,9 +98,9 @@
   "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.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Write your warning here",
@@ -166,7 +168,9 @@
   "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",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Authorize",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Show in column",
   "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploading…",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 4763dcbd3..84e73f7e5 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "@{name}కు నేరుగా సందేశం పంపు",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "డొమైన్ దాచిపెట్టబడినది",
   "account.edit_profile": "ప్రొఫైల్ని సవరించండి",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "ప్రొఫైల్లో చూపించు",
   "account.follow": "అనుసరించు",
   "account.followers": "అనుచరులు",
@@ -96,7 +98,7 @@
   "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": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
   "compose_form.sensitive.marked": "మీడియా సున్నితమైనదిగా గుర్తించబడింది",
   "compose_form.sensitive.unmarked": "మీడియా సున్నితమైనదిగా గుర్తించబడలేదు",
   "compose_form.spoiler.marked": "హెచ్చరిక వెనుక పాఠ్యం దాచబడింది",
@@ -166,7 +168,9 @@
   "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.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "అనుమతించు",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "పాఠ్యం వ్రాసే ఏరియా/శోధన పట్టిక నుండి బయటకు రావడానికి",
   "keyboard_shortcuts.up": "జాబితాలో పైకి తరలించడానికి",
   "lightbox.close": "మూసివేయు",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "తరువాత",
   "lightbox.previous": "మునుపటి",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "శీర్షిక మార్చు",
   "lists.new.create": "జాబితాను జోడించు",
   "lists.new.title_placeholder": "కొత్త జాబితా శీర్షిక",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "మీరు అనుసరించే వ్యక్తులలో శోధించండి",
   "lists.subheading": "మీ జాబితాలు",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "దృశ్యమానతను టోగుల్ చేయండి",
   "missing_indicator.label": "దొరకలేదు",
   "missing_indicator.sublabel": "ఈ వనరు కనుగొనబడలేదు",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "ఈ వినియోగదారు నుండి నోటిఫికేషన్లను దాచాలా?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "మొబైల్ ఆప్ లు",
   "navigation_bar.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "మీరు పాల్గొనిన ఎన్సిక ముగిసినది",
   "notification.reblog": "{name} మీ స్టేటస్ ను బూస్ట్ చేసారు",
+  "notification.status": "{name} just posted",
   "notifications.clear": "ప్రకటనలను తుడిచివేయు",
   "notifications.clear_confirmation": "మీరు మీ అన్ని నోటిఫికేషన్లను శాశ్వతంగా తొలగించాలనుకుంటున్నారా?",
   "notifications.column_settings.alert": "డెస్క్టాప్ నోటిఫికేషన్లు",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "బూస్ట్ లు:",
   "notifications.column_settings.show": "నిలువు వరుసలో చూపు",
   "notifications.column_settings.sound": "ధ్వనిని ప్లే చేయి",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "అన్నీ",
   "notifications.filter.boosts": "బూస్ట్లు",
   "notifications.filter.favourites": "ఇష్టాలు",
   "notifications.filter.follows": "అనుసరిస్తున్నవి",
   "notifications.filter.mentions": "పేర్కొన్నవి",
   "notifications.filter.polls": "ఎన్నిక ఫలితాలు",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} ప్రకటనలు",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "మూసివేయబడినవి",
   "poll.refresh": "నవీకరించు",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "అప్లోడ్ అవుతోంది...",
   "video.close": "వీడియోని మూసివేయి",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 596473394..a2add6715 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "เรียกดูเพิ่มเติมในโปรไฟล์ดั้งเดิม",
   "account.cancel_follow_request": "ยกเลิกคำขอติดตาม",
   "account.direct": "ส่งข้อความโดยตรงถึง @{name}",
+  "account.disable_notifications": "หยุดแจ้งเตือนฉันเมื่อ @{name} โพสต์",
   "account.domain_blocked": "ปิดกั้นโดเมนอยู่",
   "account.edit_profile": "แก้ไขโปรไฟล์",
+  "account.enable_notifications": "แจ้งเตือนฉันเมื่อ @{name} โพสต์",
   "account.endorse": "แสดงให้เห็นในโปรไฟล์",
   "account.follow": "ติดตาม",
   "account.followers": "ผู้ติดตาม",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "คุณยังไม่มีการแจ้งเตือนใด ๆ โต้ตอบกับผู้อื่นเพื่อเริ่มการสนทนา",
   "empty_column.public": "ไม่มีสิ่งใดที่นี่! เขียนบางอย่างเป็นสาธารณะ หรือติดตามผู้ใช้จากเซิร์ฟเวอร์อื่น ๆ ด้วยตนเองเพื่อเติมให้เต็ม",
   "error.unexpected_crash.explanation": "เนื่องจากข้อบกพร่องในโค้ดของเราหรือปัญหาความเข้ากันได้ของเบราว์เซอร์ จึงไม่สามารถแสดงหน้านี้ได้อย่างถูกต้อง",
+  "error.unexpected_crash.explanation_addons": "ไม่สามารถแสดงหน้านี้ได้อย่างถูกต้อง ข้อผิดพลาดนี้เป็นไปได้ว่าเกิดจากส่วนเสริมของเบราว์เซอร์หรือเครื่องมือการแปลอัตโนมัติ",
   "error.unexpected_crash.next_steps": "ลองรีเฟรชหน้า หากนั่นไม่ช่วย คุณอาจยังสามารถใช้ Mastodon ผ่านเบราว์เซอร์อื่นหรือแอป",
+  "error.unexpected_crash.next_steps_addons": "ลองปิดใช้งานส่วนเสริมหรือเครื่องมือแล้วรีเฟรชหน้า หากนั่นไม่ช่วย คุณอาจยังสามารถใช้ Mastodon ผ่านเบราว์เซอร์อื่นหรือแอป",
   "errors.unexpected_crash.copy_stacktrace": "คัดลอกการติดตามสแตกไปยังคลิปบอร์ด",
   "errors.unexpected_crash.report_issue": "รายงานปัญหา",
   "follow_request.authorize": "อนุญาต",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "เพื่อเลิกโฟกัสพื้นที่เขียนข้อความ/การค้นหา",
   "keyboard_shortcuts.up": "เพื่อย้ายขึ้นในรายการ",
   "lightbox.close": "ปิด",
+  "lightbox.compress": "บีบอัดกล่องดูภาพ",
+  "lightbox.expand": "ขยายกล่องดูภาพ",
   "lightbox.next": "ถัดไป",
   "lightbox.previous": "ก่อนหน้า",
   "lightbox.view_context": "ดูบริบท",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "เปลี่ยนชื่อเรื่อง",
   "lists.new.create": "เพิ่มรายการ",
   "lists.new.title_placeholder": "ชื่อเรื่องรายการใหม่",
+  "lists.replies_policy.all_replies": "ผู้ใช้ใด ๆ ที่ติดตาม",
+  "lists.replies_policy.list_replies": "สมาชิกของรายการ",
+  "lists.replies_policy.no_replies": "ไม่มีใคร",
+  "lists.replies_policy.title": "แสดงการตอบกลับแก่:",
   "lists.search": "ค้นหาในหมู่ผู้คนที่คุณติดตาม",
   "lists.subheading": "รายการของคุณ",
   "load_pending": "{count, plural, other {# รายการใหม่}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "ซ่อน{number, plural, other {ภาพ}}",
   "missing_indicator.label": "ไม่พบ",
   "missing_indicator.sublabel": "ไม่พบทรัพยากรนี้",
+  "mute_modal.duration": "ระยะเวลา",
   "mute_modal.hide_notifications": "ซ่อนการแจ้งเตือนจากผู้ใช้นี้?",
+  "mute_modal.indefinite": "ไม่มีกำหนด",
   "navigation_bar.apps": "แอปมือถือ",
   "navigation_bar.blocks": "ผู้ใช้ที่ปิดกั้นอยู่",
   "navigation_bar.bookmarks": "ที่คั่นหน้า",
@@ -298,6 +310,7 @@
   "notification.own_poll": "การสำรวจความคิดเห็นของคุณได้สิ้นสุดแล้ว",
   "notification.poll": "การสำรวจความคิดเห็นที่คุณได้ลงคะแนนได้สิ้นสุดแล้ว",
   "notification.reblog": "{name} ได้ดันโพสต์ของคุณ",
+  "notification.status": "{name} เพิ่งโพสต์",
   "notifications.clear": "ล้างการแจ้งเตือน",
   "notifications.clear_confirmation": "คุณแน่ใจหรือไม่ว่าต้องการล้างการแจ้งเตือนทั้งหมดของคุณอย่างถาวร?",
   "notifications.column_settings.alert": "การแจ้งเตือนบนเดสก์ท็อป",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "การดัน:",
   "notifications.column_settings.show": "แสดงในคอลัมน์",
   "notifications.column_settings.sound": "เล่นเสียง",
+  "notifications.column_settings.status": "โพสต์ใหม่:",
   "notifications.filter.all": "ทั้งหมด",
   "notifications.filter.boosts": "การดัน",
   "notifications.filter.favourites": "รายการโปรด",
   "notifications.filter.follows": "การติดตาม",
   "notifications.filter.mentions": "การกล่าวถึง",
   "notifications.filter.polls": "ผลลัพธ์การสำรวจความคิดเห็น",
+  "notifications.filter.statuses": "การอัปเดตจากผู้คนที่คุณติดตาม",
   "notifications.group": "{count} การแจ้งเตือน",
+  "notifications.mark_as_read": "ทำเครื่องหมายทุกการแจ้งเตือนว่าอ่านแล้ว",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "เปิดใช้งานการแจ้งเตือนบนเดสก์ท็อป",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "ไม่พลาดสิ่งต่าง ๆ",
+  "picture_in_picture.restore": "นำกลับมา",
   "poll.closed": "ปิดแล้ว",
   "poll.refresh": "รีเฟรช",
   "poll.total_people": "{count, plural, other {# คน}}",
@@ -389,7 +411,7 @@
   "status.pinned": "โพสต์ที่ปักหมุด",
   "status.read_more": "อ่านเพิ่มเติม",
   "status.reblog": "ดัน",
-  "status.reblog_private": "ดันไปยังผู้ชมดั้งเดิม",
+  "status.reblog_private": "ดันด้วยการมองเห็นดั้งเดิม",
   "status.reblogged_by": "{name} ได้ดัน",
   "status.reblogs.empty": "ยังไม่มีใครดันโพสต์นี้ เมื่อใครสักคนดัน เขาจะปรากฏที่นี่",
   "status.redraft": "ลบแล้วร่างใหม่",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "ตรวจหาข้อความจากรูปภาพ",
   "upload_modal.edit_media": "แก้ไขสื่อ",
   "upload_modal.hint": "คลิกหรือลากวงกลมในตัวอย่างเพื่อเลือกจุดโฟกัส ซึ่งจะอยู่ในมุมมองของภาพขนาดย่อทั้งหมดเสมอ",
+  "upload_modal.preparing_ocr": "กำลังเตรียม OCR…",
   "upload_modal.preview_label": "ตัวอย่าง ({ratio})",
   "upload_progress.label": "กำลังอัปโหลด...",
   "video.close": "ปิดวิดีโอ",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 351e80f81..650fbe806 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -1,30 +1,32 @@
 {
-  "account.account_note_header": "@{name} için notunuz",
+  "account.account_note_header": "Not",
   "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.block_domain": "{domain} alan adını engelle",
+  "account.blocked": "Engellendi",
   "account.browse_more_on_origin_server": "Orijinal profilde daha fazlasına göz atın",
   "account.cancel_follow_request": "Takip isteğini iptal et",
-  "account.direct": "Mesaj gönder @{name}",
-  "account.domain_blocked": "Alan adı gizlendi",
+  "account.direct": "@{name} adlı kişiye mesaj gönder",
+  "account.disable_notifications": "@{name} gönderi yaptığında bana bildirmeyi durdur",
+  "account.domain_blocked": "Alan adı engellendi",
   "account.edit_profile": "Profili düzenle",
+  "account.enable_notifications": "@{name} gönderi yaptığında bana bildir",
   "account.endorse": "Profildeki özellik",
   "account.follow": "Takip et",
   "account.followers": "Takipçi",
   "account.followers.empty": "Henüz kimse bu kullanıcıyı takip etmiyor.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, one {{counter} Takipçi} other {{counter} Takipçi}}",
+  "account.following_counter": "{count, plural, one {{counter} Takip Edilen} other {{counter} Takip Edilen}}",
   "account.follows.empty": "Bu kullanıcı henüz kimseyi takip etmiyor.",
   "account.follows_you": "Seni takip ediyor",
-  "account.hide_reblogs": "@{name} kişisinin yinelemelerini gizle",
-  "account.last_status": "Son aktivite",
+  "account.hide_reblogs": "@{name} kişisinin boostlarını gizle",
+  "account.last_status": "Son etkinlik",
   "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",
+  "account.mention": "@{name} kişisinden bahset",
   "account.moved_to": "{name} şuraya taşındı:",
   "account.mute": "@{name} adlı kişiyi sessize al",
   "account.mute_notifications": "@{name} adlı kişinin bildirimlerini kapat",
@@ -33,18 +35,18 @@
   "account.posts": "Toot",
   "account.posts_with_replies": "Tootlar ve cevaplar",
   "account.report": "@{name} adlı kişiyi bildir",
-  "account.requested": "Onay Bekleniyor. Takip isteğini iptal etmek için tıklayın",
-  "account.share": "@{name} kullanıcısının profilini paylaş",
-  "account.show_reblogs": "@{name} kullanıcısının yinelemelerini göster",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.requested": "Onay bekleniyor. Takip isteğini iptal etmek için tıklayın",
+  "account.share": "@{name} adlı kişinin profilini paylaş",
+  "account.show_reblogs": "@{name} kişisinin boostlarını göster",
+  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toot}}",
   "account.unblock": "@{name} adlı kişinin engelini kaldır",
-  "account.unblock_domain": "{domain} göster",
-  "account.unendorse": "Profilde özellik yok",
+  "account.unblock_domain": "{domain} alan adının engelini kaldır",
+  "account.unendorse": "Profilde gösterme",
   "account.unfollow": "Takibi bırak",
   "account.unmute": "@{name} adlı kişinin sesini aç",
   "account.unmute_notifications": "@{name} adlı kişinin bildirimlerini aç",
-  "account_note.placeholder": "Yorum yapılmamış",
-  "alert.rate_limited.message": "Lütfen sonra tekrar deneyin {retry_time, time, medium}.",
+  "account_note.placeholder": "Not eklemek için tıklayın",
+  "alert.rate_limited.message": "Lütfen {retry_time, time, medium} süresinden sonra tekrar deneyin.",
   "alert.rate_limited.title": "Oran sınırlıdır",
   "alert.unexpected.message": "Beklenmedik bir hata oluştu.",
   "alert.unexpected.title": "Hay aksi!",
@@ -58,16 +60,16 @@
   "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.bookmarks": "Yer İmleri",
   "column.community": "Yerel zaman tüneli",
-  "column.direct": "Doğrudan mesajlar",
+  "column.direct": "Direkt Mesajlar",
   "column.directory": "Profillere göz at",
-  "column.domain_blocks": "Gizli alan adları",
+  "column.domain_blocks": "Engellenen alan adları",
   "column.favourites": "Favoriler",
   "column.follow_requests": "Takip istekleri",
-  "column.home": "Anasayfa",
+  "column.home": "Ana Sayfa",
   "column.lists": "Listeler",
-  "column.mutes": "Susturulmuş kullanıcılar",
+  "column.mutes": "Sessize alınmış kullanıcılar",
   "column.notifications": "Bildirimler",
   "column.pins": "Sabitlenmiş tootlar",
   "column.public": "Federe zaman tüneli",
@@ -87,45 +89,45 @@
   "compose_form.hashtag_warning": "Bu toot liste dışı olduğu için hiç bir etikette yer almayacak. Sadece herkese açık tootlar etiketlerde bulunabilir.",
   "compose_form.lock_disclaimer": "Hesabınız {locked} değil. Sadece takipçilerle paylaştığınız gönderileri görebilmek için sizi herhangi bir kullanıcı takip edebilir.",
   "compose_form.lock_disclaimer.lock": "kilitli",
-  "compose_form.placeholder": "Aklınızdan ne geçiyor?",
+  "compose_form.placeholder": "Aklında ne var?",
   "compose_form.poll.add_option": "Bir seçenek ekleyin",
   "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.option_placeholder": "{number}.seçenek",
+  "compose_form.poll.remove_option": "Bu seçeneği kaldır",
   "compose_form.poll.switch_to_multiple": "Birden çok seçeneğe izin vermek için anketi değiştir",
   "compose_form.poll.switch_to_single": "Tek bir seçeneğe izin vermek için anketi değiştir",
   "compose_form.publish": "Tootla",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.hide": "Medyayı hassas olarak işaretle",
-  "compose_form.sensitive.marked": "Medya hassas olarak işaretlendi",
-  "compose_form.sensitive.unmarked": "Medya hassas olarak işaretlenmemiş",
+  "compose_form.sensitive.hide": "{count, plural, one {Medyayı hassas olarak işaretle} other {Medyayı hassas olarak işaretle}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Medya hassas olarak işaretlendi} other {Medya hassas olarak işaretlendi}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Medya hassas olarak işaretlenmemiş} other {Medya hassas olarak işaretlenmemiş}}",
   "compose_form.spoiler.marked": "Metin uyarının arkasına gizlenir",
   "compose_form.spoiler.unmarked": "Metin gizli değil",
-  "compose_form.spoiler_placeholder": "İçerik uyarısı",
+  "compose_form.spoiler_placeholder": "Uyarınızı buraya yazın",
   "confirmation_modal.cancel": "İptal",
-  "confirmations.block.block_and_report": "Engelle & Bildir",
+  "confirmations.block.block_and_report": "Engelle ve Bildir",
   "confirmations.block.confirm": "Engelle",
-  "confirmations.block.message": "{name} kullanıcısını engellemek istiyor musunuz?",
+  "confirmations.block.message": "{name} adlı kullanıcıyı engellemek istediğinizden emin misiniz?",
   "confirmations.delete.confirm": "Sil",
-  "confirmations.delete.message": "Bu gönderiyi silmek istiyor musunuz?",
+  "confirmations.delete.message": "Bu tootu silmek istediğinizden emin misiniz?",
   "confirmations.delete_list.confirm": "Sil",
   "confirmations.delete_list.message": "Bu listeyi kalıcı olarak silmek istediğinize emin misiniz?",
-  "confirmations.domain_block.confirm": "Alan adının tamamını gizle",
+  "confirmations.domain_block.confirm": "Alanın tamamını engelle",
   "confirmations.domain_block.message": "tüm {domain} alan adını engellemek istediğinizden emin misiniz? Genellikle birkaç hedefli engel ve susturma işi görür ve tercih edilir.",
-  "confirmations.logout.confirm": "Çıkış Yap",
-  "confirmations.logout.message": "Çıkış yapmak istediğinize emin misiniz?",
+  "confirmations.logout.confirm": "Oturumu kapat",
+  "confirmations.logout.message": "Oturumu kapatmak istediğinizden emin misiniz?",
   "confirmations.mute.confirm": "Sessize al",
   "confirmations.mute.explanation": "Bu onlardan gelen ve onlardan bahseden gönderileri gizleyecek, fakat yine de onların gönderilerinizi görmelerine ve sizi takip etmelerine izin verecektir.",
-  "confirmations.mute.message": "{name} kullanıcısını sessize almak istiyor musunuz?",
-  "confirmations.redraft.confirm": "Sil ve yeniden tasarla",
-  "confirmations.redraft.message": "Bu durumu silip tekrar taslaklaştırmak istediğinizden emin misiniz? Tüm cevapları, boostları ve favorileri kaybedeceksiniz.",
+  "confirmations.mute.message": "{name} kullanıcısını sessize almak istediğinizden emin misiniz?",
+  "confirmations.redraft.confirm": "Sil ve yeniden taslak yap",
+  "confirmations.redraft.message": "Bu toot'u silmek ve yeniden taslak yapmak istediğinizden emin misiniz? Favoriler, boostlar kaybolacak ve orijinal gönderiye verilen yanıtlar sahipsiz kalacak.",
   "confirmations.reply.confirm": "Yanıtla",
   "confirmations.reply.message": "Şimdi yanıtlarken o an oluşturduğunuz mesajın üzerine yazılır. Devam etmek istediğinize emin misiniz?",
-  "confirmations.unfollow.confirm": "Takibi kaldır",
-  "confirmations.unfollow.message": "{name}'yi takipten çıkarmak istediğinizden emin misiniz?",
-  "conversation.delete": "Konuşmayı sil",
-  "conversation.mark_as_read": "Okunmuş olarak işaretle",
-  "conversation.open": "Konuşmayı görüntüle",
+  "confirmations.unfollow.confirm": "Takibi bırak",
+  "confirmations.unfollow.message": "{name} adlı kullanıcıyı takibi bırakmak istediğinizden emin misiniz?",
+  "conversation.delete": "Sohbeti sil",
+  "conversation.mark_as_read": "Okundu olarak işaretle",
+  "conversation.open": "Sohbeti görüntüle",
   "conversation.with": "{names} ile",
   "directory.federated": "Bilinen fediverse'lerden",
   "directory.local": "Yalnızca {domain} adresinden",
@@ -137,7 +139,7 @@
   "emoji_button.custom": "Özel",
   "emoji_button.flags": "Bayraklar",
   "emoji_button.food": "Yiyecek ve İçecek",
-  "emoji_button.label": "Emoji ekle",
+  "emoji_button.label": "İfade ekle",
   "emoji_button.nature": "Doğa",
   "emoji_button.not_found": "İfade yok!! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "Nesneler",
@@ -150,49 +152,51 @@
   "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.bookmarked_statuses": "Henüz yer imine eklediğiniz toot yok. Yer imine eklendiğinde 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.",
-  "empty_column.favourited_statuses": "Hiç favori tootunuz yok. Bir tane olduğunda burada görünecek.",
+  "empty_column.favourited_statuses": "Hiç favori tootunuz yok. Favori olduğunda burada görünecek.",
   "empty_column.favourites": "Kimse bu tootu favorilerine eklememiş. Biri eklediğinde burada görünecek.",
   "empty_column.follow_requests": "Hiç takip isteğiniz yok. Bir tane aldığınızda burada görünecek.",
   "empty_column.hashtag": "Henüz bu hashtag’e sahip hiçbir gönderi yok.",
   "empty_column.home": "Henüz kimseyi takip etmiyorsunuz. {public} ziyaret edebilir veya arama kısmını kullanarak diğer kullanıcılarla iletişime geçebilirsiniz.",
   "empty_column.home.public_timeline": "herkese açık zaman tüneli",
   "empty_column.list": "Bu listede henüz hiçbir şey yok.",
-  "empty_column.lists": "Henüz hiç listeniz yok. Bir tane oluşturduğunuzda burada görünecek.",
-  "empty_column.mutes": "Henüz hiçbir kullanıcıyı sessize almadınız.",
-  "empty_column.notifications": "Henüz hiçbir bildiriminiz yok. Diğer insanlarla sobhet edebilmek için etkileşime geçebilirsiniz.",
+  "empty_column.lists": "Henüz listeniz yok. Liste oluşturduğunuzda burada görünecek.",
+  "empty_column.mutes": "Henüz bir kullanıcıyı sessize almadınız.",
+  "empty_column.notifications": "Henüz bildiriminiz yok. Sohbete başlamak için başkalarıyla etkileşim kurun.",
   "empty_column.public": "Burada hiçbir şey yok! Herkese açık bir şeyler yazın veya burayı doldurmak için diğer sunuculardaki kullanıcıları takip edin",
   "error.unexpected_crash.explanation": "Bizim kodumuzdaki bir hatadan ya da tarayıcı uyumluluk sorunundan dolayı, bu sayfa düzgün görüntülenemedi.",
+  "error.unexpected_crash.explanation_addons": "Bu sayfa doğru görüntülenemedi. Bu hata büyük olasılıkla bir tarayıcı eklentisinden veya otomatik çeviri araçlarından kaynaklanır.",
   "error.unexpected_crash.next_steps": "Sayfayı yenilemeyi deneyin. Eğer bu yardımcı olmazsa, Mastodon'u farklı bir tarayıcı ya da yerel uygulama üzerinden kullanabilirsiniz.",
+  "error.unexpected_crash.next_steps_addons": "Bunları devre dışı bırakmayı ve sayfayı yenilemeyi deneyin. Bu yardımcı olmazsa, Mastodon'u başka bir tarayıcı veya yerel uygulama aracılığıyla kullanabilirsiniz.",
   "errors.unexpected_crash.copy_stacktrace": "Yığın izlemeyi (stacktrace) panoya kopyala",
   "errors.unexpected_crash.report_issue": "Sorun bildir",
-  "follow_request.authorize": "Yetkilendir",
+  "follow_request.authorize": "İzin Ver",
   "follow_request.reject": "Reddet",
-  "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
-  "generic.saved": "Saved",
+  "follow_requests.unlocked_explanation": "Hesabınız kilitli olmasa bile, {domain} personeli bu hesaplardan gelen takip isteklerini gözden geçirmek isteyebileceğinizi düşündü.",
+  "generic.saved": "Kaydedildi",
   "getting_started.developers": "Geliştiriciler",
-  "getting_started.directory": "Profil dizini",
+  "getting_started.directory": "Profil Dizini",
   "getting_started.documentation": "Belgeler",
-  "getting_started.heading": "Başlangıç",
-  "getting_started.invite": "İnsanları davet edin",
-  "getting_started.open_source_notice": "Mastodon açık kaynaklı bir yazılımdır. Github {github}. {apps} üzerinden katkıda bulunabilir, hata raporlayabilirsiniz.",
-  "getting_started.security": "Güvenlik",
-  "getting_started.terms": "Hizmet koşulları",
+  "getting_started.heading": "Başlarken",
+  "getting_started.invite": "İnsanları davet et",
+  "getting_started.open_source_notice": "Mastodon açık kaynaklı bir yazılımdır. GitHub'taki {github} üzerinden katkıda bulunabilir veya sorunları bildirebilirsiniz.",
+  "getting_started.security": "Hesap ayarları",
+  "getting_started.terms": "Kullanım şartları",
   "hashtag.column_header.tag_mode.all": "ve {additional}",
   "hashtag.column_header.tag_mode.any": "ya da {additional}",
   "hashtag.column_header.tag_mode.none": "{additional} olmadan",
-  "hashtag.column_settings.select.no_options_message": "Hiç öneri bulunamadı",
-  "hashtag.column_settings.select.placeholder": "Hashtagler girin…",
+  "hashtag.column_settings.select.no_options_message": "Öneri bulunamadı",
+  "hashtag.column_settings.select.placeholder": "Etiketler girin…",
   "hashtag.column_settings.tag_mode.all": "Bunların hepsi",
-  "hashtag.column_settings.tag_mode.any": "Bunların hiçbiri",
+  "hashtag.column_settings.tag_mode.any": "Herhangi biri",
   "hashtag.column_settings.tag_mode.none": "Bunların hiçbiri",
   "hashtag.column_settings.tag_toggle": "Bu sütundaki ek etiketleri içer",
   "home.column_settings.basic": "Temel",
-  "home.column_settings.show_reblogs": "Boost edilenleri göster",
-  "home.column_settings.show_replies": "Cevapları göster",
+  "home.column_settings.show_reblogs": "Boostları göster",
+  "home.column_settings.show_replies": "Yanıtları göster",
   "home.hide_announcements": "Duyuruları gizle",
   "home.show_announcements": "Duyuruları göster",
   "intervals.full.days": "{number, plural, one {# gün} other {# gün}}",
@@ -201,22 +205,22 @@
   "introduction.federation.action": "İleri",
   "introduction.federation.federated.headline": "Birleşik",
   "introduction.federation.federated.text": "Diğer dosya sunucularından gelen genel gönderiler, birleşik zaman çizelgesinde görünecektir.",
-  "introduction.federation.home.headline": "Ana sayfa",
+  "introduction.federation.home.headline": "Ana Sayfa",
   "introduction.federation.home.text": "Takip ettiğiniz kişilerin yayınları ana sayfada gösterilecek. Herhangi bir sunucudaki herkesi takip edebilirsiniz!",
   "introduction.federation.local.headline": "Yerel",
   "introduction.federation.local.text": "Aynı sunucudaki kişilerin gönderileri yerel zaman tünelinde gözükecektir.",
-  "introduction.interactions.action": "Öğreticiyi bitirin!",
-  "introduction.interactions.favourite.headline": "Favori",
+  "introduction.interactions.action": "Öğreticiyi bitir!",
+  "introduction.interactions.favourite.headline": "Beğeni",
   "introduction.interactions.favourite.text": "Bir tootu favorilerinize alarak sonrası için saklayabilirsiniz ve yazara tootu beğendiğinizi söyleyebilirsiniz.",
-  "introduction.interactions.reblog.headline": "Yinele",
-  "introduction.interactions.reblog.text": "Başkalarının tootlarını yineleyerek onları kendi takipçilerinizle paylaşabillirsiniz.",
+  "introduction.interactions.reblog.headline": "Boostla",
+  "introduction.interactions.reblog.text": "Başkalarının tootlarını boostlayarak onları kendi takipçilerinizle paylaşabillirsiniz.",
   "introduction.interactions.reply.headline": "Yanıt",
   "introduction.interactions.reply.text": "Başkalarının ve kendinizin tootlarına cevap verebilirsiniz. Bu, onları bir konuşmada zincirli bir şekilde gösterecektir.",
-  "introduction.welcome.action": "Hadi gidelim!",
+  "introduction.welcome.action": "Hadi başlayalım!",
   "introduction.welcome.headline": "İlk adımlar",
   "introduction.welcome.text": "Krallığa hoş geldiniz! Az sonra, geniş bir sunucu yelpazesinde mesaj gönderip arkadaşlarınızla konuşabileceksiniz. Ama bu sunucu, {domain}, özel (profilinizi barındırır, bu yüzden adresini hatırlayın).",
   "keyboard_shortcuts.back": "geriye gitmek için",
-  "keyboard_shortcuts.blocked": "engelli kullanıcılar listesini açmak için",
+  "keyboard_shortcuts.blocked": "engellenen kullanıcılar listesini açmak için",
   "keyboard_shortcuts.boost": "boostlamak için",
   "keyboard_shortcuts.column": "sütunlardan birindeki duruma odaklanmak için",
   "keyboard_shortcuts.compose": "yazma alanına odaklanmak için",
@@ -224,102 +228,120 @@
   "keyboard_shortcuts.direct": "direkt mesajlar sütununu açmak için",
   "keyboard_shortcuts.down": "listede aşağıya inmek için",
   "keyboard_shortcuts.enter": "durumu açmak için",
-  "keyboard_shortcuts.favourite": "favorilere eklemek için",
+  "keyboard_shortcuts.favourite": "beğenmek için",
   "keyboard_shortcuts.favourites": "favoriler listesini açmak için",
   "keyboard_shortcuts.federated": "federe edilmiş zaman tünelini açmak için",
   "keyboard_shortcuts.heading": "Klavye kısayolları",
-  "keyboard_shortcuts.home": "ana sayfa zaman çizelgesini açmak için",
-  "keyboard_shortcuts.hotkey": "Kısatuş",
+  "keyboard_shortcuts.home": "anasayfa zaman çizelgesini açmak için",
+  "keyboard_shortcuts.hotkey": "Kısayol tuşu",
   "keyboard_shortcuts.legend": "bu efsaneyi görüntülemek için",
   "keyboard_shortcuts.local": "yerel zaman tünelini açmak için",
   "keyboard_shortcuts.mention": "yazardan bahsetmek için",
-  "keyboard_shortcuts.muted": "susturulmuş kullanıcı listesini açmak için",
+  "keyboard_shortcuts.muted": "sessize alınmış 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",
+  "keyboard_shortcuts.reply": "yanıtlamak için",
   "keyboard_shortcuts.requests": "takip istekleri listesini açmak için",
   "keyboard_shortcuts.search": "aramaya odaklanmak için",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
-  "keyboard_shortcuts.start": "\"başlayın\" sütununu açmak için",
+  "keyboard_shortcuts.spoilers": "CW alanını göstermek/gizlemek için",
+  "keyboard_shortcuts.start": "\"başlarken\" sütununu açmak için",
   "keyboard_shortcuts.toggle_hidden": "CW'den önceki yazıyı göstermek/gizlemek için",
   "keyboard_shortcuts.toggle_sensitivity": "medyayı göstermek/gizlemek için",
-  "keyboard_shortcuts.toot": "yeni bir toot başlatmak için",
+  "keyboard_shortcuts.toot": "yepyeni bir toot başlatmak için",
   "keyboard_shortcuts.unfocus": "aramada bir gönderiye odaklanmamak için",
   "keyboard_shortcuts.up": "listede yukarıya çıkmak için",
   "lightbox.close": "Kapat",
+  "lightbox.compress": "Resim görüntüleme kutusunu sıkıştır",
+  "lightbox.expand": "Resim görüntüleme kutusunu genişlet",
   "lightbox.next": "Sonraki",
-  "lightbox.previous": "Önceli",
-  "lightbox.view_context": "İçeriği göster",
+  "lightbox.previous": "Önceki",
+  "lightbox.view_context": "İçeriği görüntüle",
   "lists.account.add": "Listeye ekle",
   "lists.account.remove": "Listeden kaldır",
   "lists.delete": "Listeyi sil",
-  "lists.edit": "listeyi düzenle",
+  "lists.edit": "Listeleri düzenle",
   "lists.edit.submit": "Başlığı değiştir",
   "lists.new.create": "Liste ekle",
   "lists.new.title_placeholder": "Yeni liste başlığı",
+  "lists.replies_policy.all_replies": "Takip edilen herhangi bir kullanıcı",
+  "lists.replies_policy.list_replies": "Listenin üyeleri",
+  "lists.replies_policy.no_replies": "Hiç kimse",
+  "lists.replies_policy.title": "Yanıtları göster:",
   "lists.search": "Takip ettiğiniz kişiler arasından arayın",
   "lists.subheading": "Listeleriniz",
   "load_pending": "{count, plural, one {# yeni öğe} other {# yeni öğe}}",
   "loading_indicator.label": "Yükleniyor...",
-  "media_gallery.toggle_visible": "Görünürlüğü değiştir",
+  "media_gallery.toggle_visible": "{number, plural, one {Resmi} other {Resimleri}} gizle",
   "missing_indicator.label": "Bulunamadı",
   "missing_indicator.sublabel": "Bu kaynak bulunamadı",
+  "mute_modal.duration": "Süre",
   "mute_modal.hide_notifications": "Bu kullanıcıdan bildirimler gizlensin mı?",
+  "mute_modal.indefinite": "Belirsiz",
   "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.bookmarks": "Yer İmleri",
+  "navigation_bar.community_timeline": "Yerel Zaman Tüneli",
   "navigation_bar.compose": "Yeni toot oluştur",
   "navigation_bar.direct": "Direkt Mesajlar",
   "navigation_bar.discover": "Keşfet",
-  "navigation_bar.domain_blocks": "Gizli alan adları",
+  "navigation_bar.domain_blocks": "Engellenen alan adları",
   "navigation_bar.edit_profile": "Profili düzenle",
   "navigation_bar.favourites": "Favoriler",
-  "navigation_bar.filters": "Susturulmuş kelimeler",
+  "navigation_bar.filters": "Sessize alınmış kelimeler",
   "navigation_bar.follow_requests": "Takip istekleri",
   "navigation_bar.follows_and_followers": "Takip edilenler ve takipçiler",
-  "navigation_bar.info": "Genişletilmiş bilgi",
+  "navigation_bar.info": "Bu sunucu hakkında",
   "navigation_bar.keyboard_shortcuts": "Klavye kısayolları",
   "navigation_bar.lists": "Listeler",
-  "navigation_bar.logout": "Çıkış",
+  "navigation_bar.logout": "Oturumu kapat",
   "navigation_bar.mutes": "Sessize alınmış kullanıcılar",
   "navigation_bar.personal": "Kişisel",
   "navigation_bar.pins": "Sabitlenmiş tootlar",
   "navigation_bar.preferences": "Tercihler",
   "navigation_bar.public_timeline": "Federe zaman tüneli",
   "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.favourite": "{name} tootunu beğendi",
+  "notification.follow": "{name} seni takip etti",
+  "notification.follow_request": "{name} size takip 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",
+  "notification.poll": "Oy verdiğiniz bir anket sona erdi",
+  "notification.reblog": "{name} tootunu boostladı",
+  "notification.status": "{name} az önce gönderdi",
   "notifications.clear": "Bildirimleri temizle",
   "notifications.clear_confirmation": "Tüm bildirimlerinizi kalıcı olarak temizlemek ister misiniz?",
   "notifications.column_settings.alert": "Masaüstü bildirimleri",
-  "notifications.column_settings.favourite": "Favoriler:",
-  "notifications.column_settings.filter_bar.advanced": "Tüm kategorileri göster",
+  "notifications.column_settings.favourite": "Beğeniler:",
+  "notifications.column_settings.filter_bar.advanced": "Tüm kategorileri görüntüle",
   "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.mention": "Bahsetmeler:",
   "notifications.column_settings.poll": "Anket sonuçları:",
-  "notifications.column_settings.push": "Push bildirimleri",
+  "notifications.column_settings.push": "Anlık bildirimler",
   "notifications.column_settings.reblog": "Boostlar:",
-  "notifications.column_settings.show": "Bildirimlerde göster",
+  "notifications.column_settings.show": "Sütunda göster",
   "notifications.column_settings.sound": "Ses çal",
+  "notifications.column_settings.status": "Yeni tootlar:",
   "notifications.filter.all": "Tümü",
   "notifications.filter.boosts": "Boostlar",
-  "notifications.filter.favourites": "Favoriler",
+  "notifications.filter.favourites": "Beğeniler",
   "notifications.filter.follows": "Takip edilenler",
   "notifications.filter.mentions": "Bahsetmeler",
   "notifications.filter.polls": "Anket sonuçları",
+  "notifications.filter.statuses": "Takip ettiğiniz kişilerden gelen güncellemeler",
   "notifications.group": "{count} bildirim",
+  "notifications.mark_as_read": "Her bildirimi okundu olarak işaretle",
+  "notifications.permission_denied": "Daha önce reddedilen tarayıcı izinleri isteği nedeniyle masaüstü bildirimleri kullanılamıyor",
+  "notifications.permission_denied_alert": "Tarayıcı izni daha önce reddedildiğinden, masaüstü bildirimleri etkinleştirilemez",
+  "notifications_permission_banner.enable": "Masaüstü bildirimlerini etkinleştir",
+  "notifications_permission_banner.how_to_control": "Mastodon açık olmadığında bildirim almak için masaüstü bildirimlerini etkinleştirin. Etkinleştirildikten sonra yukarıdaki {icon} düğmesini kullanarak hangi etkileşim türlerinin masaüstü bildirimleri oluşturduğunu tam olarak kontrol edebilirsiniz.",
+  "notifications_permission_banner.title": "Hiçbir şeyi kaçırmayın",
+  "picture_in_picture.restore": "Onu geri koy",
   "poll.closed": "Kapandı",
   "poll.refresh": "Yenile",
   "poll.total_people": "{count, plural, one {# kişi} other {# kişi}}",
@@ -327,90 +349,90 @@
   "poll.vote": "Oy ver",
   "poll.voted": "Bu cevap için oy kullandınız",
   "poll_button.add_poll": "Bir anket ekleyin",
-  "poll_button.remove_poll": "Anket kaldır",
-  "privacy.change": "Gönderi gizliliğini ayarla",
-  "privacy.direct.long": "Sadece bahsedilen kişilere gönder",
+  "poll_button.remove_poll": "Anketi kaldır",
+  "privacy.change": "Toot gizliliğini ayarlayın",
+  "privacy.direct.long": "Sadece bahsedilen kullanıcılar için görünür",
   "privacy.direct.short": "Direkt",
-  "privacy.private.long": "Sadece takipçilerime gönder",
+  "privacy.private.long": "Sadece takipçiler için görünür",
   "privacy.private.short": "Sadece takipçiler",
-  "privacy.public.long": "Herkese açık zaman tüneline gönder",
+  "privacy.public.long": "Herkese görünür, herkese açık zaman çizelgelerinde gösterilir",
   "privacy.public.short": "Herkese açık",
-  "privacy.unlisted.long": "Herkese açık zaman tüneline gönderme",
+  "privacy.unlisted.long": "Herkese görünür, ancak genel zaman çizelgelerinde gösterilmez",
   "privacy.unlisted.short": "Listelenmemiş",
   "refresh": "Yenile",
   "regeneration_indicator.label": "Yükleniyor…",
-  "regeneration_indicator.sublabel": "Ev akışınız hazırlanıyor!",
+  "regeneration_indicator.sublabel": "Ana akışınız hazırlanıyor!",
   "relative_time.days": "{number}g",
-  "relative_time.hours": "{number}s",
+  "relative_time.hours": "{number}sa",
   "relative_time.just_now": "şimdi",
   "relative_time.minutes": "{number}dk",
   "relative_time.seconds": "{number}sn",
   "relative_time.today": "bugün",
   "reply_indicator.cancel": "İptal",
-  "report.forward": "Şu kişiye ilet : {target}",
-  "report.forward_hint": "Bu hesap başka bir sunucudan. Anonimleştirilmiş bir rapor oraya da gönderilsin mi?",
+  "report.forward": "{target} ilet",
+  "report.forward_hint": "Hesap başka bir sunucudan. Raporun anonim bir kopyası da oraya gönderilsin mi?",
   "report.hint": "Bu rapor sunucu moderatörlerine gönderilecek. Bu hesabı neden bildirdiğiniz hakkında bilgi verebirsiniz:",
   "report.placeholder": "Ek yorumlar",
   "report.submit": "Gönder",
-  "report.target": "Raporlama",
+  "report.target": "{target} Bildiriliyor",
   "search.placeholder": "Ara",
-  "search_popout.search_format": "Gelişmiş arama formatı",
-  "search_popout.tips.full_text": "Basit metin yazdığınız, tercih ettiğiniz, yinelediğiniz veya bunlardan bahsettiğiniz durumların yanı sıra kullanıcı adlarını, görünen adları ve hashtag'leri eşleştiren durumları döndürür.",
-  "search_popout.tips.hashtag": "etiketler",
-  "search_popout.tips.status": "durum",
+  "search_popout.search_format": "Gelişmiş arama biçimi",
+  "search_popout.tips.full_text": "Basit metin yazdığınız, tercih ettiğiniz, boostladığınız veya bunlardan bahsettiğiniz tootların yanı sıra kullanıcı adlarını, görünen adları ve hashtag'leri eşleştiren tootları döndürür.",
+  "search_popout.tips.hashtag": "etiket",
+  "search_popout.tips.status": "toot",
   "search_popout.tips.text": "Basit metin, eşleşen görünen adları, kullanıcı adlarını ve hashtag'leri döndürür",
   "search_popout.tips.user": "kullanıcı",
   "search_results.accounts": "İnsanlar",
-  "search_results.hashtags": "Hashtagler",
+  "search_results.hashtags": "Etiketler",
   "search_results.statuses": "Tootlar",
   "search_results.statuses_fts_disabled": "Bu Mastodon sunucusunda toot içeriğine göre arama etkin değil.",
-  "search_results.total": "{count, number} {count, plural, one {sonuç} other {sonuçlar}}",
+  "search_results.total": "{count, number} {count, plural, one {sonuç} other {sonuç}}",
   "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.block": "@{name} adlı kişiyi engelle",
   "status.bookmark": "Yer imlerine ekle",
-  "status.cancel_reblog_private": "Boost'u geri al",
+  "status.cancel_reblog_private": "Boostu geri al",
   "status.cannot_reblog": "Bu gönderi boost edilemez",
   "status.copy": "Bağlantı durumunu kopyala",
   "status.delete": "Sil",
-  "status.detailed_status": "Detaylı yazışma dökümü",
-  "status.direct": "@{name}'e gönder",
+  "status.detailed_status": "Ayrıntılı sohbet görünümü",
+  "status.direct": "@{name} adlı kişiye direkt mesaj",
   "status.embed": "Gömülü",
-  "status.favourite": "Favorilere ekle",
+  "status.favourite": "Beğen",
   "status.filtered": "Filtrelenmiş",
-  "status.load_more": "Daha fazla",
+  "status.load_more": "Daha fazlasını yükle",
   "status.media_hidden": "Gizli görsel",
-  "status.mention": "Bahset : @{name}",
+  "status.mention": "@{name} kişisinden bahset",
   "status.more": "Daha fazla",
-  "status.mute": "Sustur : @{name}",
-  "status.mute_conversation": "Yazışmayı sustur",
-  "status.open": "Bu gönderiyi genişlet",
+  "status.mute": "@{name} kişisini sessize al",
+  "status.mute_conversation": "Sohbeti sessize al",
+  "status.open": "Bu tootu genişlet",
   "status.pin": "Profile sabitle",
   "status.pinned": "Sabitlenmiş toot",
-  "status.read_more": "Daha dazla oku",
+  "status.read_more": "Devamını okuyun",
   "status.reblog": "Boostla",
-  "status.reblog_private": "Orjinal kitleye yinele",
-  "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.reblog_private": "Orijinal görünürlük ile boostla",
+  "status.reblogged_by": "{name} boostladı",
+  "status.reblogs.empty": "Henüz kimse bu tootu boostlamadı. Biri yaptığında burada görünecek.",
+  "status.redraft": "Sil ve yeniden taslak yap",
   "status.remove_bookmark": "Yer imini kaldır",
-  "status.reply": "Cevapla",
-  "status.replyAll": "Mesaj dizisini cevapla",
-  "status.report": "@{name}'i raporla",
+  "status.reply": "Yanıtla",
+  "status.replyAll": "Konuyu yanıtla",
+  "status.report": "@{name} adlı kişiyi bildir",
   "status.sensitive_warning": "Hassas içerik",
   "status.share": "Paylaş",
   "status.show_less": "Daha az göster",
   "status.show_less_all": "Hepsi için daha az göster",
-  "status.show_more": "Daha fazla göster",
+  "status.show_more": "Daha fazlasını göster",
   "status.show_more_all": "Hepsi için daha fazla göster",
-  "status.show_thread": "Mesaj dizisini göster",
+  "status.show_thread": "Konuyu göster",
   "status.uncached_media_warning": "Mevcut değil",
-  "status.unmute_conversation": "Sohbeti aç",
+  "status.unmute_conversation": "Sohbet sesini aç",
   "status.unpin": "Profilden sabitlemeyi kaldır",
   "suggestions.dismiss": "Öneriyi görmezden gel",
   "suggestions.header": "Şuna ilgi duyuyor olabilirsiniz…",
   "tabs_bar.federated_timeline": "Federe",
-  "tabs_bar.home": "Ana sayfa",
+  "tabs_bar.home": "Ana Sayfa",
   "tabs_bar.local_timeline": "Yerel",
   "tabs_bar.notifications": "Bildirimler",
   "tabs_bar.search": "Ara",
@@ -419,33 +441,34 @@
   "time_remaining.minutes": "{number, plural, one {# dakika} other {# dakika}} kaldı",
   "time_remaining.moments": "Sadece birkaç dakika kaldı",
   "time_remaining.seconds": "{number, plural, one {# saniye} other {# saniye}} kaldı",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.remote_resource_not_displayed": "diğer sunucudaki {resource} gösterilemiyor.",
   "timeline_hint.resources.followers": "Takipçiler",
   "timeline_hint.resources.follows": "Takip Edilenler",
   "timeline_hint.resources.statuses": "Eski tootlar",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
-  "trends.trending_now": "Şu an popüler",
-  "ui.beforeunload": "Mastodon'dan ayrılırsanız taslağınız kaybolacak.",
-  "units.short.billion": "{count}B",
-  "units.short.million": "{count}M",
-  "units.short.thousand": "{count}K",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} kişi} other {{counter} kişi}} konuşuyor",
+  "trends.trending_now": "Şu an gündemde",
+  "ui.beforeunload": "Mastodon'u terk ederseniz taslağınız kaybolacak.",
+  "units.short.billion": "{count}Mr",
+  "units.short.million": "{count}Mn",
+  "units.short.thousand": "{count}Mn",
   "upload_area.title": "Karşıya yükleme için sürükle bırak yapınız",
-  "upload_button.label": "Görsel ekle",
+  "upload_button.label": "Resim, video veya ses dosyası ekleyin",
   "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.thumbnail": "Change thumbnail",
-  "upload_form.undo": "Geri al",
+  "upload_form.thumbnail": "Küçük resmi değiştir",
+  "upload_form.undo": "Sil",
   "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.analyzing_picture": "Resim analiz ediliyor…",
   "upload_modal.apply": "Uygula",
-  "upload_modal.choose_image": "Choose image",
+  "upload_modal.choose_image": "Resim seç",
   "upload_modal.description_placeholder": "Pijamalı hasta yağız şoföre çabucak güvendi",
   "upload_modal.detect_text": "Resimdeki metni algıla",
   "upload_modal.edit_media": "Medyayı düzenle",
   "upload_modal.hint": "Her zaman tüm küçük resimlerde görüntülenecek odak noktasını seçmek için ön izlemedeki daireyi tıklayın veya sürükleyin.",
+  "upload_modal.preparing_ocr": "OCR hazırlanıyor…",
   "upload_modal.preview_label": "Ön izleme ({ratio})",
   "upload_progress.label": "Yükleniyor...",
   "video.close": "Videoyu kapat",
@@ -454,7 +477,7 @@
   "video.expand": "Videoyu genişlet",
   "video.fullscreen": "Tam ekran",
   "video.hide": "Videoyu gizle",
-  "video.mute": "Sesi kıs",
+  "video.mute": "Sesi sustur",
   "video.pause": "Duraklat",
   "video.play": "Oynat",
   "video.unmute": "Sesi aç"
diff --git a/app/javascript/mastodon/locales/ug.json b/app/javascript/mastodon/locales/ug.json
index b3822ff08..17ffe5519 100644
--- a/app/javascript/mastodon/locales/ug.json
+++ b/app/javascript/mastodon/locales/ug.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Domain blocked",
   "account.edit_profile": "Edit profile",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Feature on profile",
   "account.follow": "Follow",
   "account.followers": "Followers",
@@ -96,9 +98,9 @@
   "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.sensitive.hide": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Write your warning here",
@@ -166,7 +168,9 @@
   "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",
   "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "Report issue",
   "follow_request.authorize": "Authorize",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Show in column",
   "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploading…",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 244f04a9e..dab23f448 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -9,14 +9,16 @@
   "account.browse_more_on_origin_server": "Переглянути більше в оригіналі",
   "account.cancel_follow_request": "Скасувати запит на підписку",
   "account.direct": "Пряме повідомлення @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "Домен приховано",
   "account.edit_profile": "Редагувати профіль",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "Публікувати у профілі",
   "account.follow": "Підписатися",
   "account.followers": "Підписники",
   "account.followers.empty": "Ніхто ще не підписався на цього користувача.",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "{count, plural, one {{counter} Підписник} few {{counter} Підписники} many {{counter} Підписників} other {{counter} Підписники}}",
+  "account.following_counter": "{count, plural, one {{counter} Підписка} few {{counter} Підписки} many {{counter} Підписок} other {{counter} Підписки}}",
   "account.follows.empty": "Цей користувач ще ні на кого не підписався.",
   "account.follows_you": "Підписаний(-а) на вас",
   "account.hide_reblogs": "Сховати передмухи від @{name}",
@@ -36,7 +38,7 @@
   "account.requested": "Очікує підтвердження. Натисніть щоб відмінити запит",
   "account.share": "Поділитися профілем @{name}",
   "account.show_reblogs": "Показати передмухи від @{name}",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural, one {{counter} Пост} few {{counter} Пости} many {{counter} Постів} other {{counter} Пости}}",
   "account.unblock": "Розблокувати @{name}",
   "account.unblock_domain": "Розблокувати {domain}",
   "account.unendorse": "Не публікувати у профілі",
@@ -166,13 +168,15 @@
   "empty_column.notifications": "У вас ще немає сповіщень. Переписуйтесь з іншими користувачами, щоб почати розмову.",
   "empty_column.public": "Тут поки нічого немає! Опублікуйте щось, або вручну підпишіться на користувачів інших інстанцій, щоб заповнити стрічку",
   "error.unexpected_crash.explanation": "Ця сторінка не може бути коректно відображена через баґ у нашому коді або через проблему сумісності браузера.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "Спробуйте перезавантажити сторінку. Якщо це не допоможе, ви все ще зможете використовувати Mastodon через інший браузер або рідний додаток.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Скопіювати трасування стека у буфер обміну",
   "errors.unexpected_crash.report_issue": "Повідомити про проблему",
   "follow_request.authorize": "Авторизувати",
   "follow_request.reject": "Відмовити",
   "follow_requests.unlocked_explanation": "Хоча ваш обліковий запис не заблоковано, працівники {domain} припускають, що, можливо, ви хотіли б переглянути ці запити на підписку.",
-  "generic.saved": "Saved",
+  "generic.saved": "Збережено",
   "getting_started.developers": "Розробникам",
   "getting_started.directory": "Каталог профілів",
   "getting_started.documentation": "Документація",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "розфокусуватися з нового допису чи пошуку",
   "keyboard_shortcuts.up": "рухатися вверх списком",
   "lightbox.close": "Закрити",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Далі",
   "lightbox.previous": "Назад",
   "lightbox.view_context": "Переглянути контекст",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Змінити назву",
   "lists.new.create": "Додати список",
   "lists.new.title_placeholder": "Нова назва списку",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Шукати серед людей, на яких ви підписані",
   "lists.subheading": "Ваші списки",
   "load_pending": "{count, plural, one {# новий елемент} other {# нових елементів}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Показати/приховати",
   "missing_indicator.label": "Не знайдено",
   "missing_indicator.sublabel": "Ресурс не знайдений",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Приховати сповіщення від користувача?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Мобільні додатки",
   "navigation_bar.blocks": "Заблоковані користувачі",
   "navigation_bar.bookmarks": "Закладки",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Ваше опитування завершено",
   "notification.poll": "Опитування, у якому ви голосували, закінчилося",
   "notification.reblog": "{name} передмухнув(-ла) Ваш допис",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Очистити сповіщення",
   "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщеня?",
   "notifications.column_settings.alert": "Сповіщення на комп'ютері",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Передмухи:",
   "notifications.column_settings.show": "Показати в колонці",
   "notifications.column_settings.sound": "Відтворювати звуки",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "Усі",
   "notifications.filter.boosts": "Передмухи",
   "notifications.filter.favourites": "Улюблені",
   "notifications.filter.follows": "Підписки",
   "notifications.filter.mentions": "Згадки",
   "notifications.filter.polls": "Результати опитування",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} сповіщень",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Закрито",
   "poll.refresh": "Оновити",
   "poll.total_people": "{count, plural, one {# особа} other {# осіб}}",
@@ -423,29 +445,30 @@
   "timeline_hint.resources.followers": "Підписники",
   "timeline_hint.resources.follows": "Підписки",
   "timeline_hint.resources.statuses": "Старіші дмухи",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} особа обговорює} few {{counter} особи обговорюють} many {{counter} осіб обговорюють} other {{counter} особи обговорюють}}",
   "trends.trending_now": "Актуальні",
   "ui.beforeunload": "Вашу чернетку буде втрачено, якщо ви покинете Mastodon.",
-  "units.short.billion": "{count}B",
-  "units.short.million": "{count}M",
-  "units.short.thousand": "{count}K",
+  "units.short.billion": "{count} млрд",
+  "units.short.million": "{count} млн",
+  "units.short.thousand": "{count} тис",
   "upload_area.title": "Перетягніть сюди, щоб завантажити",
-  "upload_button.label": "Додати медіа ({formats})",
+  "upload_button.label": "Додати медіа",
   "upload_error.limit": "Ліміт завантаження файлів перевищено.",
   "upload_error.poll": "Не можна завантажувати файли до опитувань.",
   "upload_form.audio_description": "Опишіть для людей із вадами слуху",
   "upload_form.description": "Опишіть для людей з вадами зору",
   "upload_form.edit": "Змінити",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "Змінити мініатюру",
   "upload_form.undo": "Видалити",
   "upload_form.video_description": "Опишіть для людей із вадами слуху або зору",
   "upload_modal.analyzing_picture": "Аналізуємо малюнок…",
   "upload_modal.apply": "Застосувати",
-  "upload_modal.choose_image": "Choose image",
+  "upload_modal.choose_image": "Вибрати зображення",
   "upload_modal.description_placeholder": "Щурячий бугай із їжаком-харцизом в'ючись підписали ґешефт у єнах",
   "upload_modal.detect_text": "Виявити текст на малюнку",
   "upload_modal.edit_media": "Редагувати медіа",
   "upload_modal.hint": "Клацніть або перетягніть коло на превью, щоб обрати точку, яку буде завжди видно на мініатюрах.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Переглянути ({ratio})",
   "upload_progress.label": "Завантаження...",
   "video.close": "Закрити відео",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index ada675496..3260a33cd 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -9,8 +9,10 @@
   "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "درخواستِ پیروی منسوخ کریں",
   "account.direct": "راست پیغام @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "پوشیدہ ڈومین",
   "account.edit_profile": "مشخص ترمیم کریں",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "مشکص پر نمایاں کریں",
   "account.follow": "پیروی کریں",
   "account.followers": "پیروکار",
@@ -98,7 +100,7 @@
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "وسائل کو حساس نشاندہ کریں",
   "compose_form.sensitive.marked": "وسائل حساس نشاندہ ہے",
-  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
   "compose_form.spoiler.marked": "Text is hidden behind warning",
   "compose_form.spoiler.unmarked": "Text is not hidden",
   "compose_form.spoiler_placeholder": "Write your warning here",
@@ -166,7 +168,9 @@
   "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.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "صفحے کو تازہ کرنے کی کوشش کریں. اگر کارآمد نہ ہو تو آپ کسی دیگر براؤزر یا مقامی ایپ سے ہنوز ماسٹوڈون استعمال کر سکتے ہیں.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
   "errors.unexpected_crash.report_issue": "مسئلہ کی اطلاع کریں",
   "follow_request.authorize": "اجازت دیں",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
   "keyboard_shortcuts.up": "to move up in the list",
   "lightbox.close": "Close",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "Next",
   "lightbox.previous": "Previous",
   "lightbox.view_context": "View context",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "Search among people you follow",
   "lists.subheading": "Your lists",
   "load_pending": "{count, plural, one {# new item} other {# new items}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.bookmarks": "Bookmarks",
@@ -298,6 +310,7 @@
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
   "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "Boosts:",
   "notifications.column_settings.show": "Show in column",
   "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "All",
   "notifications.filter.boosts": "Boosts",
   "notifications.filter.favourites": "Favourites",
   "notifications.filter.follows": "Follows",
   "notifications.filter.mentions": "Mentions",
   "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "Closed",
   "poll.refresh": "Refresh",
   "poll.total_people": "{count, plural, one {# person} other {# people}}",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "Detect text from picture",
   "upload_modal.edit_media": "Edit media",
   "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "Preview ({ratio})",
   "upload_progress.label": "Uploading…",
   "video.close": "Close video",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index aa0c0d5ff..5a3988ce8 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -8,9 +8,11 @@
   "account.blocked": "Đã chặn",
   "account.browse_more_on_origin_server": "Tìm những tài khoản có liên quan",
   "account.cancel_follow_request": "Hủy yêu cầu theo dõi",
-  "account.direct": "Nhắn tin cho @{name}",
+  "account.direct": "Nhắn tin @{name}",
+  "account.disable_notifications": "Không thông báo khi @{name} đăng tút",
   "account.domain_blocked": "Đã chặn người dùng",
-  "account.edit_profile": "Chỉnh sửa trang cá nhân",
+  "account.edit_profile": "Giới thiệu bản thân",
+  "account.enable_notifications": "Thông báo khi @{name} đăng tút",
   "account.endorse": "Vinh danh người này",
   "account.follow": "Theo dõi",
   "account.followers": "Người theo dõi",
@@ -20,7 +22,7 @@
   "account.follows.empty": "Người dùng này chưa theo dõi ai.",
   "account.follows_you": "Đang theo dõi bạn",
   "account.hide_reblogs": "Ẩn chia sẻ từ @{name}",
-  "account.last_status": "Hoạt động cuối",
+  "account.last_status": "Trực tuyến",
   "account.link_verified_on": "Liên kết này đã được xác thực vào {date}",
   "account.locked_info": "Người dùng này thiết lập trạng thái ẩn. Họ sẽ tự mình xét duyệt các yêu cầu theo dõi.",
   "account.media": "Bộ sưu tập",
@@ -31,7 +33,7 @@
   "account.muted": "Đã ẩn",
   "account.never_active": "Chưa có bất cứ hoạt động nào",
   "account.posts": "Tút",
-  "account.posts_with_replies": "Trả lời",
+  "account.posts_with_replies": "Tương tác",
   "account.report": "Báo cáo @{name}",
   "account.requested": "Đang chờ chấp thuận. Nhấp vào đây để hủy yêu cầu theo dõi",
   "account.share": "Chia sẻ hồ sơ @{name}",
@@ -48,9 +50,9 @@
   "alert.rate_limited.title": "Vượt giới hạn",
   "alert.unexpected.message": "Đã xảy ra lỗi không mong muốn.",
   "alert.unexpected.title": "Ốiii!",
-  "announcement.announcement": "Thông báo",
+  "announcement.announcement": "Thông báo chung",
   "autosuggest_hashtag.per_week": "{count} mỗi tuần",
-  "boost_modal.combo": "Bạn có thể nhấn {combo} để bỏ qua",
+  "boost_modal.combo": "Nhấn {combo} để chia sẻ nhanh hơn",
   "bundle_column_error.body": "Đã có lỗi xảy ra trong khi tải nội dung này.",
   "bundle_column_error.retry": "Thử lại",
   "bundle_column_error.title": "Không có kết nối internet",
@@ -58,25 +60,25 @@
   "bundle_modal_error.message": "Đã có lỗi xảy ra trong khi tải nội dung này.",
   "bundle_modal_error.retry": "Thử lại",
   "column.blocks": "Người dùng đã chặn",
-  "column.bookmarks": "Tút đã lưu",
+  "column.bookmarks": "Những tút bạn đã lưu",
   "column.community": "Máy chủ của bạn",
   "column.direct": "Tin nhắn của bạn",
-  "column.directory": "Tìm một ai đó",
+  "column.directory": "Tìm người cùng sở thích",
   "column.domain_blocks": "Máy chủ đã chặn",
-  "column.favourites": "Thích",
+  "column.favourites": "Lượt thích của bạn",
   "column.follow_requests": "Yêu cầu theo dõi",
   "column.home": "Bảng tin",
   "column.lists": "Danh sách",
   "column.mutes": "Người dùng đã ẩn",
   "column.notifications": "Thông báo",
   "column.pins": "Tút ghim",
-  "column.public": "Mạng liên kết",
+  "column.public": "Từ những máy chủ khác",
   "column_back_button.label": "Quay lại",
-  "column_header.hide_settings": "Ẩn cài đặt",
+  "column_header.hide_settings": "Ẩn bộ lọc",
   "column_header.moveLeft_settings": "Dời cột sang bên trái",
   "column_header.moveRight_settings": "Dời cột sang bên phải",
   "column_header.pin": "Ghim",
-  "column_header.show_settings": "Hiển thị cài đặt",
+  "column_header.show_settings": "Hiện bộ lọc",
   "column_header.unpin": "Không ghim",
   "column_subheading.settings": "Cài đặt",
   "community.column_settings.local_only": "Chỉ máy chủ của bạn",
@@ -99,8 +101,8 @@
   "compose_form.sensitive.hide": "Nội dung nhạy cảm",
   "compose_form.sensitive.marked": "Nội dung đã đánh dấu nhạy cảm",
   "compose_form.sensitive.unmarked": "Nội dung không đánh dấu nhạy cảm",
-  "compose_form.spoiler.marked": "Văn bản bị ẩn",
-  "compose_form.spoiler.unmarked": "Văn bản không ẩn sau spoil",
+  "compose_form.spoiler.marked": "Hủy nội dung ẩn",
+  "compose_form.spoiler.unmarked": "Tạo nội dung ẩn",
   "compose_form.spoiler_placeholder": "Viết nội dung ẩn của bạn ở đây",
   "confirmation_modal.cancel": "Hủy bỏ",
   "confirmations.block.block_and_report": "Chặn & Báo cáo",
@@ -115,7 +117,7 @@
   "confirmations.logout.confirm": "Đăng xuất",
   "confirmations.logout.message": "Bạn có thật sự muốn thoát?",
   "confirmations.mute.confirm": "Ẩn",
-  "confirmations.mute.explanation": "Điều này sẽ khiến tút của người đó và những tút có đề cập đến họ bị ẩn, tuy nhiên vẫn cho phép họ xem bài đăng của bạn và theo dõi bạn.",
+  "confirmations.mute.explanation": "Điều này sẽ khiến tút của họ và những tút có nhắc đến họ bị ẩn, tuy nhiên họ vẫn có thể xem tút của bạn và theo dõi bạn.",
   "confirmations.mute.message": "Bạn có chắc chắn muốn ẩn {name}?",
   "confirmations.redraft.confirm": "Xóa & viết lại",
   "confirmations.redraft.message": "Bạn có chắc chắn muốn xóa tút và viết lại? Điều này sẽ xóa mất những lượt thích và chia sẻ của tút, cũng như những trả lời sẽ không còn nội dung gốc.",
@@ -127,7 +129,7 @@
   "conversation.mark_as_read": "Đánh dấu là đã đọc",
   "conversation.open": "Xem toàn bộ tin nhắn",
   "conversation.with": "Với {names}",
-  "directory.federated": "Từ mạng liên kết",
+  "directory.federated": "Từ mạng liên hợp",
   "directory.local": "Từ {domain}",
   "directory.new_arrivals": "Mới tham gia",
   "directory.recently_active": "Hoạt động gần đây",
@@ -160,13 +162,15 @@
   "empty_column.hashtag": "Chưa có bài đăng nào sử dụng hashtag này.",
   "empty_column.home": "Chưa có bất cứ gì! Hãy bắt đầu bằng cách tìm kiếm hoặc truy cập {public} để theo dõi những người bạn quan tâm.",
   "empty_column.home.public_timeline": "tút công khai",
-  "empty_column.list": "Chưa có gì trong danh sách. Khi thành viên của danh sách này đăng tút mới, chúng mới xuất hiện ở đây.",
-  "empty_column.lists": "Bạn không có danh sách nào.",
+  "empty_column.list": "Chưa có tút. Khi những người trong danh sách này đăng tút mới, chúng sẽ xuất hiện ở đây.",
+  "empty_column.lists": "Bạn chưa tạo danh sách nào.",
   "empty_column.mutes": "Bạn chưa ẩn người dùng nào.",
   "empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn tin cho một ai đó.",
   "empty_column.public": "Trống trơn! Bạn hãy viết gì đó hoặc bắt đầu theo dõi người dùng khác",
   "error.unexpected_crash.explanation": "Trang này có thể không hiển thị chính xác do lỗi lập trình Mastodon hoặc vấn đề tương thích trình duyệt.",
+  "error.unexpected_crash.explanation_addons": "Trang này không thể hiển thị do xung khắc với add-on của trình duyệt hoặc công cụ tự động dịch ngôn ngữ.",
   "error.unexpected_crash.next_steps": "Hãy thử làm mới trang. Nếu vẫn không được, bạn hãy vào Mastodon bằng một ứng dụng di động hoặc trình duyệt khác.",
+  "error.unexpected_crash.next_steps_addons": "Hãy tắt add-on và làm tươi trang. Nếu vẫn không được, bạn nên thử đăng nhập Mastodon trên trình duyệt khác hoặc app khác.",
   "errors.unexpected_crash.copy_stacktrace": "Sao chép stacktrace vào clipboard",
   "errors.unexpected_crash.report_issue": "Báo cáo lỗi",
   "follow_request.authorize": "Cho phép",
@@ -174,9 +178,9 @@
   "follow_requests.unlocked_explanation": "Mặc dù tài khoản của bạn đang ở chế độ công khai, quản trị viên của {domain} vẫn tin rằng bạn sẽ muốn xem lại yêu cầu theo dõi từ những người khác.",
   "generic.saved": "Đã lưu",
   "getting_started.developers": "Nhà phát triển",
-  "getting_started.directory": "Danh sách người dùng",
+  "getting_started.directory": "Kết bạn",
   "getting_started.documentation": "Tài liệu",
-  "getting_started.heading": "Dành cho người mới",
+  "getting_started.heading": "Quản lý",
   "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 lỗi trên GitHub tại {github}.",
   "getting_started.security": "Bảo mật",
@@ -199,12 +203,12 @@
   "intervals.full.hours": "{number, plural, other {# giờ}}",
   "intervals.full.minutes": "{number, plural, other {# phút}}",
   "introduction.federation.action": "Tiếp theo",
-  "introduction.federation.federated.headline": "Mạng liên kết",
-  "introduction.federation.federated.text": "Nếu máy chủ của bạn có liên kết với các máy chủ khác, bài đăng công khai từ họ sẽ xuất hiện ở Mạng liên kết.",
+  "introduction.federation.federated.headline": "Mạng liên hợp",
+  "introduction.federation.federated.text": "Nếu máy chủ của bạn có liên kết với các máy chủ khác, bài đăng công khai từ họ sẽ xuất hiện ở Thế giới.",
   "introduction.federation.home.headline": "Bảng tin",
   "introduction.federation.home.text": "Bảng tin là nơi hiển thị bài đăng từ những người bạn theo dõi. Bạn có thể theo dõi bất cứ ai trên bất cứ máy chủ nào!",
-  "introduction.federation.local.headline": "Máy chủ của bạn",
-  "introduction.federation.local.text": "Máy chủ của bạn là nơi hiển thị bài đăng công khai từ những người thuộc cùng một máy chủ của bạn.",
+  "introduction.federation.local.headline": "Cộng đồng",
+  "introduction.federation.local.text": "Cộng đồng là nơi hiển thị bài đăng công khai từ những người thuộc cùng một máy chủ của bạn.",
   "introduction.interactions.action": "Tôi đã hiểu rồi!",
   "introduction.interactions.favourite.headline": "Thích",
   "introduction.interactions.favourite.text": "Thích một tút có nghĩa là bạn tâm đắc nội dung của tút và muốn lưu giữ để sau này xem lại.",
@@ -226,7 +230,7 @@
   "keyboard_shortcuts.enter": "viết tút mới",
   "keyboard_shortcuts.favourite": "thích",
   "keyboard_shortcuts.favourites": "mở lượt thích",
-  "keyboard_shortcuts.federated": "mở mạng liên kết",
+  "keyboard_shortcuts.federated": "mở mạng liên hợp",
   "keyboard_shortcuts.heading": "Các phím tắt",
   "keyboard_shortcuts.home": "mở bảng tin",
   "keyboard_shortcuts.hotkey": "Phím tắt",
@@ -250,6 +254,8 @@
   "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 trên danh sách",
   "lightbox.close": "Đóng",
+  "lightbox.compress": "Thu gọn khung hình",
+  "lightbox.expand": "Mở rộng khung hình",
   "lightbox.next": "Tiếp",
   "lightbox.previous": "Trước",
   "lightbox.view_context": "Xem nội dung",
@@ -258,25 +264,31 @@
   "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.create": "Tạo danh sách mới",
   "lists.new.title_placeholder": "Tên danh sách mới",
+  "lists.replies_policy.all_replies": "Bất cứ người dùng nào đã theo dõi",
+  "lists.replies_policy.list_replies": "Thành viên trong danh sách",
+  "lists.replies_policy.no_replies": "Tắt bình luận",
+  "lists.replies_policy.title": "Cho phép bình luận với:",
   "lists.search": "Tìm kiếm những người mà bạn quan tâm",
   "lists.subheading": "Danh sách của bạn",
-  "load_pending": "{count, plural, one {# tút} other {# tút}}",
-  "loading_indicator.label": "Đang tải...",
+  "load_pending": "{count, plural, one {# tút mới} other {# tút mới}}",
+  "loading_indicator.label": "Chờ xíu...",
   "media_gallery.toggle_visible": "Ẩn {number, plural, one {ảnh} other {ảnh}}",
   "missing_indicator.label": "Không tìm thấy",
-  "missing_indicator.sublabel": "Không tìm thấy cái này",
+  "missing_indicator.sublabel": "Nội dung này không còn tồn tại",
+  "mute_modal.duration": "Thời hạn",
   "mute_modal.hide_notifications": "Ẩn thông báo từ người dùng này?",
+  "mute_modal.indefinite": "Vĩnh viễn",
   "navigation_bar.apps": "Apps",
   "navigation_bar.blocks": "Người dùng đã chặn",
   "navigation_bar.bookmarks": "Đã lưu",
-  "navigation_bar.community_timeline": "Máy chủ của bạn",
-  "navigation_bar.compose": "Soạn tút mới",
+  "navigation_bar.community_timeline": "Cộng đồng",
+  "navigation_bar.compose": "Viết tút mới",
   "navigation_bar.direct": "Tin nhắn",
-  "navigation_bar.discover": "Cộng đồng",
+  "navigation_bar.discover": "Khám phá",
   "navigation_bar.domain_blocks": "Máy chủ đã ẩn",
-  "navigation_bar.edit_profile": "Chỉnh sửa trang cá nhân",
+  "navigation_bar.edit_profile": "Giới thiệu bản thân",
   "navigation_bar.favourites": "Lượt thích",
   "navigation_bar.filters": "Bộ lọc từ ngữ",
   "navigation_bar.follow_requests": "Yêu cầu theo dõi",
@@ -289,45 +301,55 @@
   "navigation_bar.personal": "Cá nhân",
   "navigation_bar.pins": "Tút ghim",
   "navigation_bar.preferences": "Cài đặt",
-  "navigation_bar.public_timeline": "Dòng thời gian liên kết",
+  "navigation_bar.public_timeline": "Thế giới",
   "navigation_bar.security": "Bảo mật",
-  "notification.favourite": "{name} vừa thích tút của bạn",
-  "notification.follow": "{name} vừa theo dõi bạn",
-  "notification.follow_request": "{name} vừa yêu cầu theo dõi bạn",
+  "notification.favourite": "{name} thích tút của bạn",
+  "notification.follow": "{name} theo dõi 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ò mà bạn tham gia đã kết thúc",
+  "notification.own_poll": "Cuộc bình chọn của bạn đã kết thúc",
+  "notification.poll": "Một cuộc bình chọn mà bạn tham gia đã kết thúc",
   "notification.reblog": "{name} chia sẻ tút của bạn",
+  "notification.status": "{name} vừa đăng",
   "notifications.clear": "Làm trống 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ả 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": "Lượt thích:",
-  "notifications.column_settings.filter_bar.advanced": "Hiển thị toàn bộ",
-  "notifications.column_settings.filter_bar.category": "Lọc nhanh",
-  "notifications.column_settings.filter_bar.show": "Hiện",
+  "notifications.column_settings.filter_bar.advanced": "Toàn bộ",
+  "notifications.column_settings.filter_bar.category": "Phân loại",
+  "notifications.column_settings.filter_bar.show": "Lượt nhắc",
   "notifications.column_settings.follow": "Người theo dõi mới:",
   "notifications.column_settings.follow_request": "Yêu cầu theo dõi mới:",
-  "notifications.column_settings.mention": "Đề cập:",
-  "notifications.column_settings.poll": "Kết quả cuộc thăm dò:",
+  "notifications.column_settings.mention": "Lượt nhắc đến:",
+  "notifications.column_settings.poll": "Kết quả bình chọn:",
   "notifications.column_settings.push": "Thông báo đẩy",
   "notifications.column_settings.reblog": "Lượt chia sẻ mới:",
   "notifications.column_settings.show": "Thông báo trên thanh menu",
   "notifications.column_settings.sound": "Kèm theo tiếng \"bíp\"",
+  "notifications.column_settings.status": "Tút mới:",
   "notifications.filter.all": "Toàn bộ",
   "notifications.filter.boosts": "Chia sẻ",
   "notifications.filter.favourites": "Thích",
   "notifications.filter.follows": "Đang theo dõi",
   "notifications.filter.mentions": "Lượt nhắc đến",
-  "notifications.filter.polls": "Kết quả cuộc thăm dò",
+  "notifications.filter.polls": "Kết quả bình chọn",
+  "notifications.filter.statuses": "Cập nhật từ những người bạn theo dõi",
   "notifications.group": "{count} thông báo",
-  "poll.closed": "Cuộc thăm dò đã kết thúc",
+  "notifications.mark_as_read": "Đánh dấu tất cả thông báo là đã đọc",
+  "notifications.permission_denied": "Trình duyệt không cho phép hiển thị thông báo trên màn hình.",
+  "notifications.permission_denied_alert": "Không thể bật thông báo trên màn hình bởi vì trình duyệt đã cấm trước đó",
+  "notifications_permission_banner.enable": "Cho phép thông báo trên màn hình",
+  "notifications_permission_banner.how_to_control": "Hãy bật thông báo trên màn hình để không bỏ lỡ những thông báo từ Mastodon. Một khi đã bật, bạn có thể lựa chọn từng loại thông báo khác nhau thông qua {icon} nút bên dưới.",
+  "notifications_permission_banner.title": "Không bỏ lỡ điều thú vị nào",
+  "picture_in_picture.restore": "Hiển thị bình thường",
+  "poll.closed": "Kết thúc",
   "poll.refresh": "Làm mới",
   "poll.total_people": "{count, plural, one {# người bình chọn} other {# người bình chọn}}",
   "poll.total_votes": "{count, plural, one {# bình chọn} other {# bình chọn}}",
-  "poll.vote": "Cuộc thăm dò",
+  "poll.vote": "Khảo sát",
   "poll.voted": "Bạn đã bình chọn câu trả lời này",
-  "poll_button.add_poll": "Tạo thăm dò",
-  "poll_button.remove_poll": "Hủy thăm dò",
+  "poll_button.add_poll": "Tạo cuộc bình chọn",
+  "poll_button.remove_poll": "Hủy cuộc bình chọn",
   "privacy.change": "Thay đổi quyền riêng tư",
   "privacy.direct.long": "Chỉ người được nhắc đến mới thấy",
   "privacy.direct.short": "Tin nhắn",
@@ -335,12 +357,12 @@
   "privacy.private.short": "Chỉ người theo dõi",
   "privacy.public.long": "Hiện trên bảng tin máy chủ",
   "privacy.public.short": "Công khai",
-  "privacy.unlisted.long": "Ai cũng có thể xem nhưng không hiện trên bảng tin máy chủ",
+  "privacy.unlisted.long": "Công khai nhưng không hiện trên bảng tin máy chủ",
   "privacy.unlisted.short": "Mở",
   "refresh": "Làm mớ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}d",
+  "relative_time.days": "{number} ngày",
   "relative_time.hours": "{number}h",
   "relative_time.just_now": "vừa xong",
   "relative_time.minutes": "{number}m",
@@ -348,14 +370,14 @@
   "relative_time.today": "hôm nay",
   "reply_indicator.cancel": "Hủy bỏ",
   "report.forward": "Chuyển đến {target}",
-  "report.forward_hint": "Người dùng này ở máy chủ khác. Gửi một báo xấu ẩn danh tới máy chủ đó?",
-  "report.hint": "Hãy cho quản trị viên biết lý do tại sao bạn lại báo xấu tài khoản này:",
+  "report.forward_hint": "Người dùng này ở máy chủ khác. Gửi một báo cáo ẩn danh tới máy chủ đó?",
+  "report.hint": "Hãy cho quản trị viên biết lý do vì sao bạn báo cáo tài khoản này:",
   "report.placeholder": "Bổ sung thêm",
   "report.submit": "Gửi đi",
-  "report.target": "Báo xấu {target}",
+  "report.target": "Báo cáo {target}",
   "search.placeholder": "Tìm kiếm",
-  "search_popout.search_format": "Tìm kiếm nâng cao",
-  "search_popout.tips.full_text": "Nội dung trả về bao gồm các tút do bạn viết, yêu thích, đã chia sẻ hoặc được nhắc đến. Cũng như địa chỉ người dùng, tên hiển thị lẫn hashtag.",
+  "search_popout.search_format": "Gợi ý",
+  "search_popout.tips.full_text": "Nội dung trả về bao gồm những tút do bạn viết, yêu thích, đã chia sẻ hoặc những tút có nhắc đến bạn. Bạn cũng có thể tìm địa chỉ người dùng, tên hiển thị và hashtag.",
   "search_popout.tips.hashtag": "hashtag",
   "search_popout.tips.status": "tút",
   "search_popout.tips.text": "Nội dung trả về là địa chỉ người dùng, tên hiển thị và hashtag",
@@ -374,7 +396,7 @@
   "status.copy": "Sao chép URL",
   "status.delete": "Xóa",
   "status.detailed_status": "Xem chi tiết thêm",
-  "status.direct": "Nhắn riêng @{name}",
+  "status.direct": "Nhắn tin @{name}",
   "status.embed": "Nhúng",
   "status.favourite": "Thích",
   "status.filtered": "Bộ lọc",
@@ -387,31 +409,31 @@
   "status.open": "Xem nguyên văn",
   "status.pin": "Ghim lên trang cá nhân",
   "status.pinned": "Tút đã ghim",
-  "status.read_more": "Đọc thêm",
+  "status.read_more": "Đọc thêm tút",
   "status.reblog": "Chia sẻ",
-  "status.reblog_private": "Chia sẻ với người viết tút gốc",
+  "status.reblog_private": "Chia sẻ với người có thể xem",
   "status.reblogged_by": "{name} chia sẻ",
   "status.reblogs.empty": "Tút này chưa có ai chia sẻ. Nếu có, nó sẽ hiển thị ở đây.",
   "status.redraft": "Xóa và viết lại",
   "status.remove_bookmark": "Hủy lưu",
   "status.reply": "Trả lời",
   "status.replyAll": "Trả lời tất cả",
-  "status.report": "Báo xấu @{name}",
+  "status.report": "Báo cáo @{name}",
   "status.sensitive_warning": "Nội dung nhạy cảm",
   "status.share": "Chia sẻ",
   "status.show_less": "Thu gọn",
   "status.show_less_all": "Thu gọn tất cả",
   "status.show_more": "Mở rộng",
   "status.show_more_all": "Hiển thị tất cả",
-  "status.show_thread": "Hiện thêm",
+  "status.show_thread": "Xem thêm",
   "status.uncached_media_warning": "N/A",
   "status.unmute_conversation": "Quan tâm",
   "status.unpin": "Bỏ ghim trên trang cá nhân",
   "suggestions.dismiss": "Tắt đề xuất",
   "suggestions.header": "Có thể bạn quan tâm…",
-  "tabs_bar.federated_timeline": "Mạng liên kết",
+  "tabs_bar.federated_timeline": "Thế giới",
   "tabs_bar.home": "Bảng tin",
-  "tabs_bar.local_timeline": "Máy chủ của bạn",
+  "tabs_bar.local_timeline": "Cộng đồng",
   "tabs_bar.notifications": "Thông báo",
   "tabs_bar.search": "Tìm kiếm",
   "time_remaining.days": "Kết thúc sau {number, plural, other {# ngày}}",
@@ -432,24 +454,25 @@
   "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": "Tập tin tải lên vượt quá giới hạn cho phép.",
-  "upload_error.poll": "Cuộc thăm dò không được tải tập tin.",
-  "upload_form.audio_description": "Mô tả cho người thính giác kém",
+  "upload_error.poll": "Cuộc bình chọn không cho phép đính kèm tập tin.",
+  "upload_form.audio_description": "Mô tả cho người mất thính giác",
   "upload_form.description": "Mô tả cho người khiếm thị",
   "upload_form.edit": "Biên tập",
   "upload_form.thumbnail": "Đổi ảnh thumbnail",
   "upload_form.undo": "Xóa bỏ",
-  "upload_form.video_description": "Mô tả cho người có vấn đề về thính giác",
+  "upload_form.video_description": "Mô tả cho người mất thị lực hoặc không thể nghe",
   "upload_modal.analyzing_picture": "Phân tích hình ảnh",
   "upload_modal.apply": "Áp dụng",
-  "upload_modal.choose_image": "Chọn hình",
+  "upload_modal.choose_image": "Chọn ảnh",
   "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
-  "upload_modal.detect_text": "Phát hiện văn bản trong hình ảnh",
-  "upload_modal.edit_media": "Chỉnh sửa ảnh/video",
+  "upload_modal.detect_text": "Trích văn bản từ trong ảnh",
+  "upload_modal.edit_media": "Biên tập",
   "upload_modal.hint": "Nhấp hoặc kéo vòng tròn trên bản xem trước để chọn phần hiển thị trên hình thu nhỏ.",
+  "upload_modal.preparing_ocr": "Đang nhận dạng ký tự…",
   "upload_modal.preview_label": "Xem trước ({ratio})",
   "upload_progress.label": "Đang tải lên...",
   "video.close": "Đóng video",
-  "video.download": "Tải tập tin",
+  "video.download": "Lưu về máy",
   "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",
diff --git a/app/javascript/mastodon/locales/whitelist_sa.json b/app/javascript/mastodon/locales/whitelist_sa.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_sa.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/whitelist_zgh.json b/app/javascript/mastodon/locales/whitelist_zgh.json
new file mode 100644
index 000000000..0d4f101c7
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_zgh.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/zgh.json b/app/javascript/mastodon/locales/zgh.json
new file mode 100644
index 000000000..b877d76b4
--- /dev/null
+++ b/app/javascript/mastodon/locales/zgh.json
@@ -0,0 +1,484 @@
+{
+  "account.account_note_header": "Note",
+  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.badges.bot": "Bot",
+  "account.badges.group": "ⵜⴰⵔⴰⴱⴱⵓⵜ",
+  "account.block": "ⴳⴷⵍ @{name}",
+  "account.block_domain": "Block domain {domain}",
+  "account.blocked": "Blocked",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.cancel_follow_request": "Cancel follow request",
+  "account.direct": "Direct message @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
+  "account.domain_blocked": "Domain blocked",
+  "account.edit_profile": "ⵙⵏⴼⵍ ⵉⴼⵔⵙ",
+  "account.enable_notifications": "Notify me when @{name} posts",
+  "account.endorse": "Feature on profile",
+  "account.follow": "ⴹⴼⵕ",
+  "account.followers": "Followers",
+  "account.followers.empty": "No one follows this user yet.",
+  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
+  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows_you": "Follows you",
+  "account.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.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.unblock": "Unblock @{name}",
+  "account.unblock_domain": "Unblock domain {domain}",
+  "account.unendorse": "Don't feature on profile",
+  "account.unfollow": "Unfollow",
+  "account.unmute": "Unmute @{name}",
+  "account.unmute_notifications": "Unmute notifications from @{name}",
+  "account_note.placeholder": "Click to add a note",
+  "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
+  "alert.rate_limited.title": "Rate limited",
+  "alert.unexpected.message": "An unexpected error occurred.",
+  "alert.unexpected.title": "Oops!",
+  "announcement.announcement": "Announcement",
+  "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": "ⵔⴳⵍ",
+  "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",
+  "column.domain_blocks": "Blocked domains",
+  "column.favourites": "Favourites",
+  "column.follow_requests": "Follow requests",
+  "column.home": "ⴰⵙⵏⵓⴱⴳ",
+  "column.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": "ⵜⵉⵙⵖⴰⵍ",
+  "community.column_settings.local_only": "Local only",
+  "community.column_settings.media_only": "Media only",
+  "community.column_settings.remote_only": "Remote 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.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": "{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}",
+  "compose_form.sensitive.marked": "{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}",
+  "compose_form.sensitive.unmarked": "{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}",
+  "compose_form.spoiler.marked": "Text is hidden behind warning",
+  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.spoiler_placeholder": "Write your warning here",
+  "confirmation_modal.cancel": "Cancel",
+  "confirmations.block.block_and_report": "Block & Report",
+  "confirmations.block.confirm": "Block",
+  "confirmations.block.message": "Are you sure you want to block {name}?",
+  "confirmations.delete.confirm": "ⴽⴽⵙ",
+  "confirmations.delete.message": "Are you sure you want to delete this status?",
+  "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.message": "Are you sure you want to log out?",
+  "confirmations.mute.confirm": "Mute",
+  "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": "ⵔⴰⵔ",
+  "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",
+  "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": "ⵉⵛⵏⵢⴰⵍⵏ",
+  "emoji_button.food": "Food & Drink",
+  "emoji_button.label": "Insert emoji",
+  "emoji_button.nature": "Nature",
+  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Objects",
+  "emoji_button.people": "People",
+  "emoji_button.recent": "Frequently used",
+  "emoji_button.search": "Search...",
+  "emoji_button.search_results": "Search results",
+  "emoji_button.symbols": "Symbols",
+  "emoji_button.travel": "Travel & Places",
+  "empty_column.account_timeline": "No toots here!",
+  "empty_column.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 blocked 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",
+  "error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
+  "error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
+  "errors.unexpected_crash.copy_stacktrace": "Copy stacktrace to clipboard",
+  "errors.unexpected_crash.report_issue": "Report issue",
+  "follow_request.authorize": "Authorize",
+  "follow_request.reject": "Reject",
+  "follow_requests.unlocked_explanation": "Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",
+  "generic.saved": "Saved",
+  "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",
+  "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}}",
+  "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": "ⴰⵙⵏⵓⴱⴳ",
+  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
+  "introduction.interactions.action": "Finish toot-orial!",
+  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
+  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
+  "introduction.interactions.reply.headline": "ⵔⴰⵔ",
+  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
+  "introduction.welcome.action": "Let's go!",
+  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.boost": "to boost",
+  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.down": "to move down in the list",
+  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourites": "to open favourites list",
+  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.legend": "to display this legend",
+  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.mention": "to mention author",
+  "keyboard_shortcuts.muted": "to open muted users list",
+  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.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",
+  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.start": "to open \"get started\" column",
+  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+  "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
+  "keyboard_shortcuts.toot": "to start a brand new toot",
+  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.up": "to move up in the list",
+  "lightbox.close": "ⵔⴳⵍ",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
+  "lightbox.next": "Next",
+  "lightbox.previous": "Previous",
+  "lightbox.view_context": "View context",
+  "lists.account.add": "ⵔⵏⵓ ⵖⵔ ⵜⵍⴳⴰⵎⵜ",
+  "lists.account.remove": "ⴽⴽⵙ ⵙⴳ ⵜⵍⴳⴰⵎⵜ",
+  "lists.delete": "ⴽⴽⵙ ⵜⴰⵍⴳⴰⵎⵜ",
+  "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
+  "lists.new.create": "Add list",
+  "lists.new.title_placeholder": "New list title",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
+  "lists.search": "Search among people you follow",
+  "lists.subheading": "Your lists",
+  "load_pending": "{count, plural, one {# new item} other {# new items}}",
+  "loading_indicator.label": "Loading...",
+  "media_gallery.toggle_visible": "Hide {number, plural, one {image} other {images}}",
+  "missing_indicator.label": "Not found",
+  "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.duration": "Duration",
+  "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "mute_modal.indefinite": "Indefinite",
+  "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",
+  "navigation_bar.discover": "Discover",
+  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.edit_profile": "Edit profile",
+  "navigation_bar.favourites": "Favourites",
+  "navigation_bar.filters": "Muted words",
+  "navigation_bar.follow_requests": "Follow requests",
+  "navigation_bar.follows_and_followers": "Follows and followers",
+  "navigation_bar.info": "About this server",
+  "navigation_bar.keyboard_shortcuts": "Hotkeys",
+  "navigation_bar.lists": "Lists",
+  "navigation_bar.logout": "Logout",
+  "navigation_bar.mutes": "Muted users",
+  "navigation_bar.personal": "Personal",
+  "navigation_bar.pins": "Pinned toots",
+  "navigation_bar.preferences": "Preferences",
+  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.security": "Security",
+  "notification.favourite": "{name} favourited your status",
+  "notification.follow": "{name} followed you",
+  "notification.follow_request": "{name} has requested to follow you",
+  "notification.mention": "{name} mentioned you",
+  "notification.own_poll": "Your poll has ended",
+  "notification.poll": "A poll you have voted in has ended",
+  "notification.reblog": "{name} boosted your status",
+  "notification.status": "{name} just posted",
+  "notifications.clear": "Clear notifications",
+  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "notifications.column_settings.alert": "Desktop notifications",
+  "notifications.column_settings.favourite": "Favourites:",
+  "notifications.column_settings.filter_bar.advanced": "Display all categories",
+  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.follow_request": "New follow requests:",
+  "notifications.column_settings.mention": "Mentions:",
+  "notifications.column_settings.poll": "Poll results:",
+  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.show": "Show in column",
+  "notifications.column_settings.sound": "Play sound",
+  "notifications.column_settings.status": "New toots:",
+  "notifications.filter.all": "All",
+  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.follows": "Follows",
+  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.polls": "Poll results",
+  "notifications.filter.statuses": "Updates from people you follow",
+  "notifications.group": "{count} notifications",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
+  "poll.closed": "Closed",
+  "poll.refresh": "Refresh",
+  "poll.total_people": "{count, plural, one {# 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": "ⵔⵏⵓ ⵢⴰⵏ ⵢⵉⴷⵣ",
+  "poll_button.remove_poll": "Remove poll",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Visible for mentioned users only",
+  "privacy.direct.short": "Direct",
+  "privacy.private.long": "Visible for followers only",
+  "privacy.private.short": "Followers-only",
+  "privacy.public.long": "Visible for all, shown in public timelines",
+  "privacy.public.short": "Public",
+  "privacy.unlisted.long": "Visible for all, but not in public timelines",
+  "privacy.unlisted.short": "Unlisted",
+  "refresh": "Refresh",
+  "regeneration_indicator.label": "ⴰⵣⴷⴰⵎ…",
+  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "relative_time.days": "{number}d",
+  "relative_time.hours": "{number}h",
+  "relative_time.just_now": "ⴷⵖⵉ",
+  "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?",
+  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.placeholder": "Additional comments",
+  "report.submit": "ⴰⵣⵏ",
+  "report.target": "Report {target}",
+  "search.placeholder": "ⵔⵣⵓ",
+  "search_popout.search_format": "Advanced search format",
+  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.status": "status",
+  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.user": "user",
+  "search_results.accounts": "People",
+  "search_results.hashtags": "Hashtags",
+  "search_results.statuses": "Toots",
+  "search_results.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.bookmark": "Bookmark",
+  "status.cancel_reblog_private": "Unboost",
+  "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
+  "status.delete": "ⴽⴽⵙ",
+  "status.detailed_status": "Detailed conversation view",
+  "status.direct": "Direct message @{name}",
+  "status.embed": "Embed",
+  "status.favourite": "Favourite",
+  "status.filtered": "Filtered",
+  "status.load_more": "Load more",
+  "status.media_hidden": "Media hidden",
+  "status.mention": "Mention @{name}",
+  "status.more": "More",
+  "status.mute": "Mute @{name}",
+  "status.mute_conversation": "Mute conversation",
+  "status.open": "Expand this status",
+  "status.pin": "Pin on profile",
+  "status.pinned": "Pinned toot",
+  "status.read_more": "ⵖⵔ ⵓⴳⴳⴰⵔ",
+  "status.reblog": "Boost",
+  "status.reblog_private": "Boost with original visibility",
+  "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}",
+  "status.sensitive_warning": "Sensitive content",
+  "status.share": "Share",
+  "status.show_less": "Show less",
+  "status.show_less_all": "Show less for all",
+  "status.show_more": "Show more",
+  "status.show_more_all": "Show more for all",
+  "status.show_thread": "Show thread",
+  "status.uncached_media_warning": "Not available",
+  "status.unmute_conversation": "Unmute conversation",
+  "status.unpin": "Unpin from profile",
+  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.header": "You might be interested in…",
+  "tabs_bar.federated_timeline": "Federated",
+  "tabs_bar.home": "ⴰⵙⵏⵓⴱⴳ",
+  "tabs_bar.local_timeline": "Local",
+  "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",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
+  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "trends.trending_now": "Trending now",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "units.short.billion": "{count}B",
+  "units.short.million": "{count}M",
+  "units.short.thousand": "{count}K",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add images, a video or an audio file",
+  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.poll": "File upload not allowed with polls.",
+  "upload_form.audio_description": "Describe for people with hearing loss",
+  "upload_form.description": "Describe for the visually impaired",
+  "upload_form.edit": "ⵙⵏⴼⵍ",
+  "upload_form.thumbnail": "Change thumbnail",
+  "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.choose_image": "Choose image",
+  "upload_modal.description_placeholder": "A quick brown fox jumps over the lazy dog",
+  "upload_modal.detect_text": "Detect text from picture",
+  "upload_modal.edit_media": "Edit media",
+  "upload_modal.hint": "Click or drag the circle on the preview to choose the focal point which will always be in view on all thumbnails.",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
+  "upload_modal.preview_label": "Preview ({ratio})",
+  "upload_progress.label": "Uploading…",
+  "video.close": "ⵔⴳⵍ ⴰⴼⵉⴷⵢⵓ",
+  "video.download": "ⴰⴳⵎ ⴰⴼⴰⵢⵍⵓ",
+  "video.exit_fullscreen": "Exit full screen",
+  "video.expand": "Expand video",
+  "video.fullscreen": "Full screen",
+  "video.hide": "Hide video",
+  "video.mute": "Mute sound",
+  "video.pause": "Pause",
+  "video.play": "Play",
+  "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index b57bbb2ad..956067e6f 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -9,14 +9,16 @@
   "account.browse_more_on_origin_server": "在原始个人资料页面上浏览详情",
   "account.cancel_follow_request": "取消关注请求",
   "account.direct": "发送私信给 @{name}",
+  "account.disable_notifications": "当 @{name} 发嘟时不要通知我",
   "account.domain_blocked": "网站已屏蔽",
   "account.edit_profile": "修改个人资料",
+  "account.enable_notifications": "当 @{name} 发嘟时通知我",
   "account.endorse": "在个人资料中推荐此用户",
   "account.follow": "关注",
   "account.followers": "关注者",
   "account.followers.empty": "目前无人关注此用户。",
-  "account.followers_counter": "被 {count, plural, one {{counter} 人} other {{counter} 人}}关注",
-  "account.following_counter": "正在关注 {count, plural, other {{counter} 人}}",
+  "account.followers_counter": "被 {counter} 人关注",
+  "account.following_counter": "正在关注 {counter} 人",
   "account.follows.empty": "此用户目前尚未关注任何人。",
   "account.follows_you": "关注了你",
   "account.hide_reblogs": "隐藏来自 @{name} 的转嘟",
@@ -36,7 +38,7 @@
   "account.requested": "正在等待对方同意。点击以取消发送关注请求",
   "account.share": "分享 @{name} 的个人资料",
   "account.show_reblogs": "显示来自 @{name} 的转嘟",
-  "account.statuses_counter": "{count, plural, one {{counter} 条} other {{counter} 条}}嘟文",
+  "account.statuses_counter": "{counter} 条嘟文",
   "account.unblock": "解除屏蔽 @{name}",
   "account.unblock_domain": "不再隐藏来自 {domain} 的内容",
   "account.unendorse": "不在个人资料中推荐此用户",
@@ -166,7 +168,9 @@
   "empty_column.notifications": "你还没有收到过任何通知,快和其他用户互动吧。",
   "empty_column.public": "这里什么都没有!写一些公开的嘟文,或者关注其他服务器的用户后,这里就会有嘟文出现了",
   "error.unexpected_crash.explanation": "此页面无法正确显示,这可能是因为我们的代码中有错误,也可能是因为浏览器兼容问题。",
+  "error.unexpected_crash.explanation_addons": "此页面无法正确显示,这个错误很可能是由浏览器附加组件或自动翻译工具造成的。",
   "error.unexpected_crash.next_steps": "刷新一下页面试试。如果没用,您可以换个浏览器或者用本地应用。",
+  "error.unexpected_crash.next_steps_addons": "请尝试禁用它们并刷新页面。如果没有帮助,你仍可以尝试使用其他浏览器或原生应用来使用 Mastodon。",
   "errors.unexpected_crash.copy_stacktrace": "把堆栈跟踪信息复制到剪贴板",
   "errors.unexpected_crash.report_issue": "报告问题",
   "follow_request.authorize": "同意",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "取消输入",
   "keyboard_shortcuts.up": "在列表中让光标上移",
   "lightbox.close": "关闭",
+  "lightbox.compress": "返回图片全览",
+  "lightbox.expand": "放大查看图片",
   "lightbox.next": "下一个",
   "lightbox.previous": "上一个",
   "lightbox.view_context": "查看上下文",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "更改标题",
   "lists.new.create": "新建列表",
   "lists.new.title_placeholder": "新列表的标题",
+  "lists.replies_policy.all_replies": "任何关注的用户",
+  "lists.replies_policy.list_replies": "列表成员",
+  "lists.replies_policy.no_replies": "没有人",
+  "lists.replies_policy.title": "显示回复给:",
   "lists.search": "搜索你关注的人",
   "lists.subheading": "你的列表",
   "load_pending": "{count} 项",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "隐藏 {number} 张图片",
   "missing_indicator.label": "找不到内容",
   "missing_indicator.sublabel": "无法找到此资源",
+  "mute_modal.duration": "持续期间",
   "mute_modal.hide_notifications": "同时隐藏来自这个用户的通知?",
+  "mute_modal.indefinite": "无期限",
   "navigation_bar.apps": "移动应用",
   "navigation_bar.blocks": "已屏蔽的用户",
   "navigation_bar.bookmarks": "书签",
@@ -298,6 +310,7 @@
   "notification.own_poll": "您的投票已经结束",
   "notification.poll": "你参与的一个投票已经结束",
   "notification.reblog": "{name} 转嘟了你的嘟文",
+  "notification.status": "{name} 刚刚发嘟",
   "notifications.clear": "清空通知列表",
   "notifications.clear_confirmation": "你确定要永久清空通知列表吗?",
   "notifications.column_settings.alert": "桌面通知",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "当有人转嘟了你的嘟文时:",
   "notifications.column_settings.show": "在通知栏显示",
   "notifications.column_settings.sound": "播放音效",
+  "notifications.column_settings.status": "新嘟文:",
   "notifications.filter.all": "全部",
   "notifications.filter.boosts": "转嘟",
   "notifications.filter.favourites": "喜欢",
   "notifications.filter.follows": "关注",
   "notifications.filter.mentions": "提及",
   "notifications.filter.polls": "投票结果",
+  "notifications.filter.statuses": "你关注的人的动态",
   "notifications.group": "{count} 条通知",
+  "notifications.mark_as_read": "将所有通知标为已读",
+  "notifications.permission_denied": "由于权限被拒绝,无法启用桌面通知。",
+  "notifications.permission_denied_alert": "由于在此之前浏览器权限请求就已被拒绝,所以启用桌面通知失败",
+  "notifications_permission_banner.enable": "启用桌面通知",
+  "notifications_permission_banner.how_to_control": "启用桌面通知以在 Mastodon 未打开时接收通知。您可以通过交互通过上面的 {icon} 按钮来精细控制可以发送桌面通知的交互类型。",
+  "notifications_permission_banner.title": "精彩不容错过",
+  "picture_in_picture.restore": "恢复",
   "poll.closed": "已关闭",
   "poll.refresh": "刷新",
   "poll.total_people": "{count}人",
@@ -328,7 +350,7 @@
   "poll.voted": "您已经对这个答案投过票了",
   "poll_button.add_poll": "发起投票",
   "poll_button.remove_poll": "移除投票",
-  "privacy.change": "设置嘟文可见范围",
+  "privacy.change": "设置嘟文的可见范围",
   "privacy.direct.long": "只有被提及的用户能看到",
   "privacy.direct.short": "私信",
   "privacy.private.long": "只有关注你的用户能看到",
@@ -383,7 +405,7 @@
   "status.mention": "提及 @{name}",
   "status.more": "更多",
   "status.mute": "隐藏 @{name}",
-  "status.mute_conversation": "隐藏此对话",
+  "status.mute_conversation": "将此对话静音",
   "status.open": "展开嘟文",
   "status.pin": "在个人资料页面置顶",
   "status.pinned": "置顶嘟文",
@@ -430,7 +452,7 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "将文件拖放到此处开始上传",
-  "upload_button.label": "上传媒体文件 ({formats})",
+  "upload_button.label": "上传媒体文件",
   "upload_error.limit": "文件大小超过限制。",
   "upload_error.poll": "投票中不允许上传文件。",
   "upload_form.audio_description": "为听障人士添加文字描述",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "从图片中检测文本",
   "upload_modal.edit_media": "编辑媒体",
   "upload_modal.hint": "在预览图上点击或拖动圆圈,以选择缩略图的焦点。",
+  "upload_modal.preparing_ocr": "正在准备文字识别……",
   "upload_modal.preview_label": "预览 ({ratio})",
   "upload_progress.label": "上传中……",
   "video.close": "关闭视频",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 248a74dcd..346bf058e 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -1,22 +1,24 @@
 {
-  "account.account_note_header": "備註",
+  "account.account_note_header": "筆記",
   "account.add_or_remove_from_list": "從名單中新增或移除",
   "account.badges.bot": "機械人",
   "account.badges.group": "群組",
   "account.block": "封鎖 @{name}",
   "account.block_domain": "隱藏來自 {domain} 的一切文章",
   "account.blocked": "封鎖",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "在該服務器的個人檔案頁上瀏覽更多",
   "account.cancel_follow_request": "取消關注請求",
   "account.direct": "私訊 @{name}",
+  "account.disable_notifications": "Stop notifying me when @{name} posts",
   "account.domain_blocked": "服務站被隱藏",
   "account.edit_profile": "修改個人資料",
+  "account.enable_notifications": "Notify me when @{name} posts",
   "account.endorse": "在個人資料推薦對方",
   "account.follow": "關注",
   "account.followers": "關注的人",
   "account.followers.empty": "尚沒有人關注這位使用者。",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "被 {count, plural,one {{counter} 人}other {{counter} 人}}關注",
+  "account.following_counter": "正在關注 {count, plural,one {{counter}}other {{counter} 人}}",
   "account.follows.empty": "這位使用者尚未關注任何使用者。",
   "account.follows_you": "關注你",
   "account.hide_reblogs": "隱藏 @{name} 的轉推",
@@ -36,14 +38,14 @@
   "account.requested": "等候審批",
   "account.share": "分享 @{name} 的個人資料",
   "account.show_reblogs": "顯示 @{name} 的推文",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural,one {{counter} 則}other {{counter} 則}}嘟文",
   "account.unblock": "解除對 @{name} 的封鎖",
   "account.unblock_domain": "不再隱藏 {domain}",
   "account.unendorse": "不再於個人資料頁面推薦對方",
   "account.unfollow": "取消關注",
   "account.unmute": "取消 @{name} 的靜音",
   "account.unmute_notifications": "取消來自 @{name} 通知的靜音",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "按此添加備注",
   "alert.rate_limited.message": "請在 {retry_time, time, medium} 過後重試",
   "alert.rate_limited.title": "已限速",
   "alert.unexpected.message": "發生不可預期的錯誤。",
@@ -79,9 +81,9 @@
   "column_header.show_settings": "顯示設定",
   "column_header.unpin": "取下",
   "column_subheading.settings": "設定",
-  "community.column_settings.local_only": "只有本地",
+  "community.column_settings.local_only": "只顯示本站",
   "community.column_settings.media_only": "僅媒體",
-  "community.column_settings.remote_only": "只有遠端",
+  "community.column_settings.remote_only": "只顯示外站",
   "compose_form.direct_message_warning": "這文章只有被提及的用戶才可以看到。",
   "compose_form.direct_message_warning_learn_more": "了解更多",
   "compose_form.hashtag_warning": "這文章因為不是公開,所以不會被標籤搜索。只有公開的文章才會被標籤搜索。",
@@ -166,13 +168,15 @@
   "empty_column.notifications": "你沒有任何通知紀錄,快向其他用戶搭訕吧。",
   "empty_column.public": "跨站時間軸暫時沒有內容!快寫一些公共的文章,或者關注另一些服務站的用戶吧!你和本站、友站的交流,將決定這裏出現的內容。",
   "error.unexpected_crash.explanation": "由於發生系統故障或瀏覽器相容性問題,故無法正常顯示頁面。",
+  "error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
   "error.unexpected_crash.next_steps": "請嘗試重新整理頁面。如果狀況沒有進展,你可以使用不同的瀏覽器或 Mastodon 應用程式來檢視。",
+  "error.unexpected_crash.next_steps_addons": "Try disabling them and refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
   "errors.unexpected_crash.copy_stacktrace": "複製到剪貼簿",
   "errors.unexpected_crash.report_issue": "舉報問題",
   "follow_request.authorize": "批准",
   "follow_request.reject": "拒絕",
-  "follow_requests.unlocked_explanation": "即便您的帳號未被鎖定,{domain} 的員工認為可能想要自己審核這些帳號的追蹤請求。",
-  "generic.saved": "Saved",
+  "follow_requests.unlocked_explanation": "即使您的帳戶未上鎖,{domain} 的工作人員認為您可能想手動審核來自這些帳戶的關注請求。",
+  "generic.saved": "已儲存",
   "getting_started.developers": "開發者",
   "getting_started.directory": "個人資料目錄",
   "getting_started.documentation": "文件",
@@ -242,7 +246,7 @@
   "keyboard_shortcuts.reply": "回覆",
   "keyboard_shortcuts.requests": "開啟關注請求名單",
   "keyboard_shortcuts.search": "把標示移動到搜索",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.spoilers": "顯示或隱藏被折疊的正文",
   "keyboard_shortcuts.start": "開啟「開始使用」欄位",
   "keyboard_shortcuts.toggle_hidden": "顯示或隱藏被標為敏感的文字",
   "keyboard_shortcuts.toggle_sensitivity": "顯示 / 隱藏媒體",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "把標示移離文字輸入和搜索",
   "keyboard_shortcuts.up": "在列表往上移動",
   "lightbox.close": "關閉",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "繼續",
   "lightbox.previous": "回退",
   "lightbox.view_context": "檢視內文",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "變更標題",
   "lists.new.create": "新增列表",
   "lists.new.title_placeholder": "新列表標題",
+  "lists.replies_policy.all_replies": "Any followed user",
+  "lists.replies_policy.list_replies": "Members of the list",
+  "lists.replies_policy.no_replies": "No one",
+  "lists.replies_policy.title": "Show replies to:",
   "lists.search": "從你關注的用戶中搜索",
   "lists.subheading": "列表",
   "load_pending": "{count, plural, other {# 個新項目}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "打開或關上",
   "missing_indicator.label": "找不到內容",
   "missing_indicator.sublabel": "無法找到內容",
+  "mute_modal.duration": "Duration",
   "mute_modal.hide_notifications": "隱藏來自這用戶的通知嗎?",
+  "mute_modal.indefinite": "Indefinite",
   "navigation_bar.apps": "封鎖的使用者",
   "navigation_bar.blocks": "被你封鎖的用戶",
   "navigation_bar.bookmarks": "書籤",
@@ -298,6 +310,7 @@
   "notification.own_poll": "您的投票已結束",
   "notification.poll": "您投過的投票已經結束",
   "notification.reblog": "{name} 轉推你的文章",
+  "notification.status": "{name} just posted",
   "notifications.clear": "清空通知紀錄",
   "notifications.clear_confirmation": "你確定要清空通知紀錄嗎?",
   "notifications.column_settings.alert": "顯示桌面通知",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "轉推你的文章:",
   "notifications.column_settings.show": "在通知欄顯示",
   "notifications.column_settings.sound": "播放音效",
+  "notifications.column_settings.status": "New toots:",
   "notifications.filter.all": "全部",
   "notifications.filter.boosts": "轉嘟",
   "notifications.filter.favourites": "最愛",
   "notifications.filter.follows": "關注的使用者",
   "notifications.filter.mentions": "提及",
   "notifications.filter.polls": "投票結果",
+  "notifications.filter.statuses": "Updates from people you follow",
   "notifications.group": "{count} 條通知",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "Put it back",
   "poll.closed": "已關閉",
   "poll.refresh": "重新整理",
   "poll.total_people": "{count, plural, one {# 個投票} other {# 個投票}}",
@@ -419,11 +441,11 @@
   "time_remaining.minutes": "剩餘{number, plural, one {# 分鐘} other {# 分鐘}}",
   "time_remaining.moments": "剩餘時間",
   "time_remaining.seconds": "剩餘 {number, plural, one {# 秒} other {# 秒}}",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "timeline_hint.remote_resource_not_displayed": "不會顯示來自其他服務器的 {resource}",
+  "timeline_hint.resources.followers": "關注者",
+  "timeline_hint.resources.follows": "關注中",
+  "timeline_hint.resources.statuses": "更早的嘟文",
+  "trends.counter_by_accounts": "{count, plural,one {{counter} 人}other {{counter} 人}}正在討論",
   "trends.trending_now": "目前趨勢",
   "ui.beforeunload": "如果你現在離開 Mastodon,你的草稿內容將會被丟棄。",
   "units.short.billion": "{count}B",
@@ -436,7 +458,7 @@
   "upload_form.audio_description": "簡單描述內容給聽障人士",
   "upload_form.description": "為視覺障礙人士添加文字說明",
   "upload_form.edit": "編輯",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "更改預覽圖",
   "upload_form.undo": "刪除",
   "upload_form.video_description": "簡單描述給聽障或視障人士",
   "upload_modal.analyzing_picture": "正在分析圖片…",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "從圖片偵測文字",
   "upload_modal.edit_media": "編輯媒體",
   "upload_modal.hint": "點擊或拖曳圓圈以選擇預覽縮圖。",
+  "upload_modal.preparing_ocr": "Preparing OCR…",
   "upload_modal.preview_label": "預覽 ({ratio})",
   "upload_progress.label": "上載中……",
   "video.close": "關閉影片",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index 429f6c5d3..598407a30 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -6,17 +6,19 @@
   "account.block": "封鎖 @{name}",
   "account.block_domain": "隱藏來自 {domain} 的所有內容",
   "account.blocked": "已封鎖",
-  "account.browse_more_on_origin_server": "Browse more on the original profile",
+  "account.browse_more_on_origin_server": "在該服務器的個人檔案頁上瀏覽更多",
   "account.cancel_follow_request": "取消關注請求",
   "account.direct": "傳私訊給 @{name}",
+  "account.disable_notifications": "當 @{name} 嘟文時不要再通知我",
   "account.domain_blocked": "已隱藏網域",
   "account.edit_profile": "編輯個人資料",
+  "account.enable_notifications": "當 @{name} 嘟文時通知我",
   "account.endorse": "在個人資料推薦對方",
   "account.follow": "關注",
   "account.followers": "關注者",
   "account.followers.empty": "尚沒有人關注這位使用者。",
-  "account.followers_counter": "{count, plural, one {{counter} Follower} other {{counter} Followers}}",
-  "account.following_counter": "{count, plural, one {{counter} Following} other {{counter} Following}}",
+  "account.followers_counter": "被 {count, plural,one {{counter} 人}other {{counter} 人}}關注",
+  "account.following_counter": "正在關注 {count, plural,one {{counter}}other {{counter} 人}}",
   "account.follows.empty": "這位使用者尚未關注任何使用者。",
   "account.follows_you": "關注了你",
   "account.hide_reblogs": "隱藏來自 @{name} 的轉推",
@@ -36,14 +38,14 @@
   "account.requested": "正在等待核准。按一下取消關注請求",
   "account.share": "分享 @{name} 的個人資料",
   "account.show_reblogs": "顯示來自 @{name} 的嘟文",
-  "account.statuses_counter": "{count, plural, one {{counter} Toot} other {{counter} Toots}}",
+  "account.statuses_counter": "{count, plural,one {{counter} 則}other {{counter} 則}}嘟文",
   "account.unblock": "取消封鎖 @{name}",
   "account.unblock_domain": "取消隱藏 {domain}",
   "account.unendorse": "不再於個人資料頁面推薦對方",
   "account.unfollow": "取消關注",
   "account.unmute": "取消靜音 @{name}",
   "account.unmute_notifications": "重新接收來自 @{name} 的通知",
-  "account_note.placeholder": "Click to add a note",
+  "account_note.placeholder": "按此添加備注",
   "alert.rate_limited.message": "請在 {retry_time, time, medium} 過後重試",
   "alert.rate_limited.title": "已限速",
   "alert.unexpected.message": "發生了非預期的錯誤。",
@@ -166,13 +168,15 @@
   "empty_column.notifications": "您尚未收到任何通知,和別人互動開啟對話吧。",
   "empty_column.public": "這裡什麼都沒有!嘗試寫些公開的嘟文,或著自己關注其他伺服器的使用者後就會有嘟文出現了",
   "error.unexpected_crash.explanation": "由於發生系統故障或瀏覽器相容性問題,故無法正常顯示頁面。",
+  "error.unexpected_crash.explanation_addons": "此頁面無法被正常顯示,這可能是由瀏覽器附加元件或網頁自動翻譯工具造成的。",
   "error.unexpected_crash.next_steps": "請嘗試重新整理頁面。如果狀況沒有進展,你可以使用不同的瀏覽器或 Mastodon 應用程式來檢視。",
+  "error.unexpected_crash.next_steps_addons": "請嘗試重新整理頁面。如果狀況沒有進展,您可以嘗試使用不同的瀏覽器或 Mastodon 應用程式來檢視。",
   "errors.unexpected_crash.copy_stacktrace": "複製到剪貼簿",
   "errors.unexpected_crash.report_issue": "舉報問題",
   "follow_request.authorize": "授權",
   "follow_request.reject": "拒絕",
   "follow_requests.unlocked_explanation": "即便您的帳號未被鎖定,{domain} 的員工認為可能想要自己審核這些帳號的追蹤請求。",
-  "generic.saved": "Saved",
+  "generic.saved": "已儲存",
   "getting_started.developers": "開發者",
   "getting_started.directory": "個人資料目錄",
   "getting_started.documentation": "文件",
@@ -242,7 +246,7 @@
   "keyboard_shortcuts.reply": "回覆",
   "keyboard_shortcuts.requests": "開啟關注請求名單",
   "keyboard_shortcuts.search": "將焦點移至搜尋框",
-  "keyboard_shortcuts.spoilers": "to show/hide CW field",
+  "keyboard_shortcuts.spoilers": "顯示或隱藏被折疊的正文",
   "keyboard_shortcuts.start": "開啟「開始使用」欄位",
   "keyboard_shortcuts.toggle_hidden": "顯示/隱藏在內容警告之後的正文",
   "keyboard_shortcuts.toggle_sensitivity": "顯示 / 隱藏媒體",
@@ -250,6 +254,8 @@
   "keyboard_shortcuts.unfocus": "取消輸入文字區塊 / 搜尋的焦點",
   "keyboard_shortcuts.up": "往上移動名單項目",
   "lightbox.close": "關閉",
+  "lightbox.compress": "Compress image view box",
+  "lightbox.expand": "Expand image view box",
   "lightbox.next": "下一步",
   "lightbox.previous": "上一步",
   "lightbox.view_context": "檢視內文",
@@ -260,6 +266,10 @@
   "lists.edit.submit": "變更標題",
   "lists.new.create": "新增名單",
   "lists.new.title_placeholder": "新名單標題",
+  "lists.replies_policy.all_replies": "任何跟隨的使用者",
+  "lists.replies_policy.list_replies": "列表成員",
+  "lists.replies_policy.no_replies": "沒有人",
+  "lists.replies_policy.title": "顯示回覆",
   "lists.search": "搜尋您關注的使用者",
   "lists.subheading": "您的名單",
   "load_pending": "{count, plural, other {# 個新項目}}",
@@ -267,7 +277,9 @@
   "media_gallery.toggle_visible": "切換可見性",
   "missing_indicator.label": "找不到",
   "missing_indicator.sublabel": "找不到此資源",
+  "mute_modal.duration": "持續時間",
   "mute_modal.hide_notifications": "隱藏來自這位使用者的通知?",
+  "mute_modal.indefinite": "無期限",
   "navigation_bar.apps": "封鎖的使用者",
   "navigation_bar.blocks": "封鎖使用者",
   "navigation_bar.bookmarks": "書籤",
@@ -298,6 +310,7 @@
   "notification.own_poll": "您的投票已結束",
   "notification.poll": "您投過的投票已經結束",
   "notification.reblog": "{name}轉嘟了你的嘟文",
+  "notification.status": "{name} 剛剛嘟文",
   "notifications.clear": "清除通知",
   "notifications.clear_confirmation": "確定要永久清除你的通知嗎?",
   "notifications.column_settings.alert": "桌面通知",
@@ -313,13 +326,22 @@
   "notifications.column_settings.reblog": "轉嘟:",
   "notifications.column_settings.show": "在欄位中顯示",
   "notifications.column_settings.sound": "播放音效",
+  "notifications.column_settings.status": "新嘟文:",
   "notifications.filter.all": "全部",
   "notifications.filter.boosts": "轉嘟",
   "notifications.filter.favourites": "最愛",
   "notifications.filter.follows": "關注的使用者",
   "notifications.filter.mentions": "提及",
   "notifications.filter.polls": "投票結果",
+  "notifications.filter.statuses": "已跟隨使用者的最新動態",
   "notifications.group": "{count} 條通知",
+  "notifications.mark_as_read": "Mark every notification as read",
+  "notifications.permission_denied": "Desktop notifications are unavailable due to previously denied browser permissions request",
+  "notifications.permission_denied_alert": "Desktop notifications can't be enabled, as browser permission has been denied before",
+  "notifications_permission_banner.enable": "Enable desktop notifications",
+  "notifications_permission_banner.how_to_control": "To receive notifications when Mastodon isn't open, enable desktop notifications. You can control precisely which types of interactions generate desktop notifications through the {icon} button above once they're enabled.",
+  "notifications_permission_banner.title": "Never miss a thing",
+  "picture_in_picture.restore": "還原",
   "poll.closed": "已關閉",
   "poll.refresh": "重新整理",
   "poll.total_people": "{count, plural, one {# 個投票} other {# 個投票}}",
@@ -371,7 +393,7 @@
   "status.bookmark": "書籤",
   "status.cancel_reblog_private": "取消轉嘟",
   "status.cannot_reblog": "這篇嘟文無法被轉嘟",
-  "status.copy": "將連結複製到嘟文中",
+  "status.copy": "複製嘟文連結",
   "status.delete": "刪除",
   "status.detailed_status": "對話的詳細內容",
   "status.direct": "發送私訊給 @{name}",
@@ -419,11 +441,11 @@
   "time_remaining.minutes": "剩餘{number, plural, one {# 分鐘} other {# 分鐘}}",
   "time_remaining.moments": "剩餘時間",
   "time_remaining.seconds": "剩餘 {number, plural, one {# 秒} other {# 秒}}",
-  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
-  "timeline_hint.resources.followers": "Followers",
-  "timeline_hint.resources.follows": "Follows",
-  "timeline_hint.resources.statuses": "Older toots",
-  "trends.counter_by_accounts": "{count, plural, one {{counter} person} other {{counter} people}} talking",
+  "timeline_hint.remote_resource_not_displayed": "不會顯示來自其他服務器的 {resource}",
+  "timeline_hint.resources.followers": "關注者",
+  "timeline_hint.resources.follows": "正在關注",
+  "timeline_hint.resources.statuses": "更早的嘟文",
+  "trends.counter_by_accounts": "{count, plural,one {{counter} 人}other {{counter} 人}}正在討論",
   "trends.trending_now": "目前趨勢",
   "ui.beforeunload": "如果離開 Mastodon,你的草稿將會不見。",
   "units.short.billion": "{count}B",
@@ -436,7 +458,7 @@
   "upload_form.audio_description": "簡單描述內容給聽障人士",
   "upload_form.description": "為視障人士增加文字說明",
   "upload_form.edit": "編輯",
-  "upload_form.thumbnail": "Change thumbnail",
+  "upload_form.thumbnail": "更改預覽圖",
   "upload_form.undo": "刪除",
   "upload_form.video_description": "簡單描述給聽障或視障人士",
   "upload_modal.analyzing_picture": "正在分析圖片…",
@@ -446,6 +468,7 @@
   "upload_modal.detect_text": "從圖片偵測文字",
   "upload_modal.edit_media": "編輯媒體",
   "upload_modal.hint": "點擊或拖曳圓圈以選擇預覽縮圖。",
+  "upload_modal.preparing_ocr": "準備 OCR 中……",
   "upload_modal.preview_label": "預覽 ({ratio})",
   "upload_progress.label": "上傳中...",
   "video.close": "關閉影片",
diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js
index 1d4874717..46a9d5376 100644
--- a/app/javascript/mastodon/reducers/notifications.js
+++ b/app/javascript/mastodon/reducers/notifications.js
@@ -12,6 +12,7 @@ import {
   NOTIFICATIONS_MARK_AS_READ,
   NOTIFICATIONS_SET_BROWSER_SUPPORT,
   NOTIFICATIONS_SET_BROWSER_PERMISSION,
+  NOTIFICATIONS_DISMISS_BROWSER_PERMISSION,
 } from '../actions/notifications';
 import {
   ACCOUNT_BLOCK_SUCCESS,
@@ -250,6 +251,8 @@ export default function notifications(state = initialState, action) {
     return state.set('browserSupport', action.value);
   case NOTIFICATIONS_SET_BROWSER_PERMISSION:
     return state.set('browserPermission', action.value);
+  case NOTIFICATIONS_DISMISS_BROWSER_PERMISSION:
+    return state.set('browserPermission', 'denied');
   default:
     return state;
   }
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index be554a502..9c4e6d08f 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -794,6 +794,10 @@
   cursor: pointer;
 }
 
+.status__content {
+  clear: both;
+}
+
 .status__content,
 .reply-indicator__content {
   position: relative;
@@ -1067,16 +1071,15 @@
 }
 
 .status__relative-time,
-.status__visibility-icon,
 .notification__relative_time {
   color: $dark-text-color;
   float: right;
   font-size: 14px;
+  padding-bottom: 1px;
 }
 
 .status__visibility-icon {
-  margin-left: 4px;
-  margin-right: 4px;
+  padding: 0 4px;
 }
 
 .status__display-name {
@@ -1717,6 +1720,20 @@ a.account__display-name {
   align-items: center;
   justify-content: center;
   flex-direction: column;
+  scrollbar-width: none; /* Firefox */
+  -ms-overflow-style: none;  /* IE 10+ */
+
+  * {
+    scrollbar-width: none; /* Firefox */
+    -ms-overflow-style: none;  /* IE 10+ */
+  }
+
+  &::-webkit-scrollbar,
+  *::-webkit-scrollbar {
+    width: 0;
+    height: 0;
+    background: transparent; /* Chrome/Safari/Webkit */
+  }
 
   .image-loader__preview-canvas {
     max-width: $media-modal-media-max-width;
@@ -4603,6 +4620,21 @@ a.status-card.compact:hover {
   z-index: 100;
 }
 
+.media-modal__zoom-button {
+  position: absolute;
+  right: 64px;
+  top: 8px;
+  z-index: 100;
+  pointer-events: auto;
+  transition: opacity 0.3s linear;
+  will-change: opacity;
+}
+
+.media-modal__zoom-button--hidden {
+  pointer-events: none;
+  opacity: 0;
+}
+
 .onboarding-modal,
 .error-modal,
 .embed-modal {
@@ -5384,7 +5416,6 @@ a.status-card.compact:hover {
   }
 
   .video-player__controls {
-    padding: 0 15px;
     padding-top: 10px;
     background: transparent;
   }
@@ -5503,7 +5534,8 @@ a.status-card.compact:hover {
   &__buttons-bar {
     display: flex;
     justify-content: space-between;
-    padding-bottom: 10px;
+    padding-bottom: 8px;
+    margin: 0 -5px;
 
     .video-player__download__icon {
       color: inherit;
@@ -5520,22 +5552,13 @@ a.status-card.compact:hover {
     overflow: hidden;
     text-overflow: ellipsis;
 
-    &.left {
-      button {
-        padding-left: 0;
-      }
-    }
-
-    &.right {
-      button {
-        padding-right: 0;
-      }
-    }
+    .player-button {
+      display: inline-block;
+      outline: 0;
 
-    button {
       flex: 0 0 auto;
       background: transparent;
-      padding: 2px 10px;
+      padding: 5px;
       font-size: 16px;
       border: 0;
       color: rgba($white, 0.75);
@@ -5553,6 +5576,7 @@ a.status-card.compact:hover {
     flex: 0 1 auto;
     overflow: hidden;
     text-overflow: ellipsis;
+    margin: 0 5px;
   }
 
   &__time-sep,
@@ -5672,7 +5696,7 @@ a.status-card.compact:hover {
       display: block;
       position: absolute;
       height: 4px;
-      top: 10px;
+      top: 14px;
     }
 
     &__progress,
@@ -5681,7 +5705,7 @@ a.status-card.compact:hover {
       position: absolute;
       height: 4px;
       border-radius: 4px;
-      top: 10px;
+      top: 14px;
       background: lighten($ui-highlight-color, 8%);
     }
 
@@ -5696,7 +5720,7 @@ a.status-card.compact:hover {
       border-radius: 50%;
       width: 12px;
       height: 12px;
-      top: 6px;
+      top: 10px;
       margin-left: -6px;
       background: lighten($ui-highlight-color, 8%);
       box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
@@ -5720,7 +5744,7 @@ a.status-card.compact:hover {
   &.detailed,
   &.fullscreen {
     .video-player__buttons {
-      button {
+      .player-button {
         padding-top: 10px;
         padding-bottom: 10px;
       }
@@ -7180,6 +7204,13 @@ noscript {
   flex-direction: column;
   align-items: center;
   justify-content: center;
+  position: relative;
+
+  &__close {
+    position: absolute;
+    top: 10px;
+    right: 10px;
+  }
 
   h2 {
     font-size: 16px;
diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss
index 8602c3dde..f463419c8 100644
--- a/app/javascript/styles/mastodon/variables.scss
+++ b/app/javascript/styles/mastodon/variables.scss
@@ -36,6 +36,8 @@ $dark-text-color: $ui-base-lighter-color !default;
 $secondary-text-color: $ui-secondary-color !default;
 $highlight-text-color: $ui-highlight-color !default;
 $action-button-color: $ui-base-lighter-color !default;
+$passive-text-color: $gold-star !default;
+$active-passive-text-color: $success-green !default;
 // For texts on inverted backgrounds
 $inverted-text-color: $ui-base-color !default;
 $lighter-text-color: $ui-base-lighter-color !default;
diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss
index 5b97d1ec4..5ee4d104b 100644
--- a/app/javascript/styles/mastodon/widgets.scss
+++ b/app/javascript/styles/mastodon/widgets.scss
@@ -2,6 +2,10 @@
   margin-bottom: 10px;
   box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
 
+  &:last-child {
+    margin-bottom: 0;
+  }
+
   &__img {
     width: 100%;
     position: relative;
@@ -442,6 +446,26 @@
     vertical-align: initial !important;
   }
 
+  &__interrelationships {
+    width: 21px;
+  }
+
+  .fa {
+    font-size: 16px;
+
+    &.active {
+      color: $highlight-text-color;
+    }
+
+    &.passive {
+      color: $passive-text-color;
+    }
+
+    &.active.passive {
+      color: $active-passive-text-color;
+    }
+  }
+
   @media screen and (max-width: $no-gap-breakpoint) {
     tbody td.optional {
       display: none;
diff --git a/app/lib/access_token_extension.rb b/app/lib/access_token_extension.rb
new file mode 100644
index 000000000..3e184e775
--- /dev/null
+++ b/app/lib/access_token_extension.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module AccessTokenExtension
+  extend ActiveSupport::Concern
+
+  included do
+    after_commit :push_to_streaming_api
+  end
+
+  def revoke(clock = Time)
+    update(revoked_at: clock.now.utc)
+  end
+
+  def push_to_streaming_api
+    Redis.current.publish("timeline:access_token:#{id}", Oj.dump(event: :kill)) if revoked? || destroyed?
+  end
+end
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 3a9f83978..d56d47a2d 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -111,7 +111,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
         created_at: @object['published'],
         override_timestamps: @options[:override_timestamps],
         reply: @object['inReplyTo'].present?,
-        sensitive: @object['sensitive'] || false,
+        sensitive: @account.sensitized? || @object['sensitive'] || false,
         visibility: visibility_from_audience,
         thread: replied_to_status,
         conversation: conversation_from_uri(@object['conversation']),
diff --git a/app/lib/activitypub/activity/move.rb b/app/lib/activitypub/activity/move.rb
index 2103f503f..7e073f64d 100644
--- a/app/lib/activitypub/activity/move.rb
+++ b/app/lib/activitypub/activity/move.rb
@@ -20,6 +20,9 @@ class ActivityPub::Activity::Move < ActivityPub::Activity
 
     # Initiate a re-follow for each follower
     MoveWorker.perform_async(origin_account.id, target_account.id)
+  rescue
+    unmark_as_processing!
+    raise
   end
 
   private
diff --git a/app/lib/activitypub/adapter.rb b/app/lib/activitypub/adapter.rb
index 4e406b41d..ef00a4e2e 100644
--- a/app/lib/activitypub/adapter.rb
+++ b/app/lib/activitypub/adapter.rb
@@ -24,6 +24,7 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base
     discoverable: { 'toot' => 'http://joinmastodon.org/ns#', 'discoverable' => 'toot:discoverable' },
     voters_count: { 'toot' => 'http://joinmastodon.org/ns#', 'votersCount' => 'toot:votersCount' },
     olm: { 'toot' => 'http://joinmastodon.org/ns#', 'Device' => 'toot:Device', 'Ed25519Signature' => 'toot:Ed25519Signature', 'Ed25519Key' => 'toot:Ed25519Key', 'Curve25519Key' => 'toot:Curve25519Key', 'EncryptedMessage' => 'toot:EncryptedMessage', 'publicKeyBase64' => 'toot:publicKeyBase64', 'deviceId' => 'toot:deviceId', 'claim' => { '@type' => '@id', '@id' => 'toot:claim' }, 'fingerprintKey' => { '@type' => '@id', '@id' => 'toot:fingerprintKey' }, 'identityKey' => { '@type' => '@id', '@id' => 'toot:identityKey' }, 'devices' => { '@type' => '@id', '@id' => 'toot:devices' }, 'messageFranking' => 'toot:messageFranking', 'messageType' => 'toot:messageType', 'cipherText' => 'toot:cipherText' },
+    suspended: { 'toot' => 'http://joinmastodon.org/ns#', 'suspended' => 'toot:suspended' },
   }.freeze
 
   def self.default_key_transform
diff --git a/app/lib/webfinger.rb b/app/lib/webfinger.rb
index b2374c494..c7aa43bb3 100644
--- a/app/lib/webfinger.rb
+++ b/app/lib/webfinger.rb
@@ -2,6 +2,8 @@
 
 class Webfinger
   class Error < StandardError; end
+  class GoneError < Error; end
+  class RedirectError < StandardError; end
 
   class Response
     def initialize(body)
@@ -47,6 +49,8 @@ class Webfinger
         res.body_with_limit
       elsif res.code == 404 && use_fallback
         body_from_host_meta
+      elsif res.code == 410
+        raise Webfinger::GoneError, "#{@uri} is gone from the server"
       else
         raise Webfinger::Error, "Request for #{@uri} returned HTTP #{res.code}"
       end
diff --git a/app/models/account.rb b/app/models/account.rb
index 38f235baa..641e984cd 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -50,6 +50,8 @@
 #  avatar_storage_schema_version :integer
 #  header_storage_schema_version :integer
 #  devices_url                   :string
+#  sensitized_at                 :datetime
+#  suspension_origin             :integer
 #
 
 class Account < ApplicationRecord
@@ -76,6 +78,7 @@ class Account < ApplicationRecord
   }.freeze
 
   enum protocol: [:ostatus, :activitypub]
+  enum suspension_origin: [:local, :remote], _prefix: true
 
   validates :username, presence: true
   validates_with UniqueUsernameValidator, if: -> { will_save_change_to_username? }
@@ -96,6 +99,7 @@ class Account < ApplicationRecord
   scope :partitioned, -> { order(Arel.sql('row_number() over (partition by domain)')) }
   scope :silenced, -> { where.not(silenced_at: nil) }
   scope :suspended, -> { where.not(suspended_at: nil) }
+  scope :sensitized, -> { where.not(sensitized_at: nil) }
   scope :without_suspended, -> { where(suspended_at: nil) }
   scope :without_silenced, -> { where(silenced_at: nil) }
   scope :recent, -> { reorder(id: :desc) }
@@ -224,20 +228,40 @@ class Account < ApplicationRecord
     suspended_at.present?
   end
 
-  def suspend!(date = Time.now.utc)
+  def suspended_permanently?
+    suspended? && deletion_request.nil?
+  end
+
+  def suspended_temporarily?
+    suspended? && deletion_request.present?
+  end
+
+  def suspend!(date: Time.now.utc, origin: :local)
     transaction do
       create_deletion_request!
-      update!(suspended_at: date)
+      update!(suspended_at: date, suspension_origin: origin)
     end
   end
 
   def unsuspend!
     transaction do
       deletion_request&.destroy!
-      update!(suspended_at: nil)
+      update!(suspended_at: nil, suspension_origin: nil)
     end
   end
 
+  def sensitized?
+    sensitized_at.present?
+  end
+
+  def sensitize!(date = Time.now.utc)
+    update!(sensitized_at: date)
+  end
+
+  def unsensitize!
+    update!(sensitized_at: nil)
+  end
+
   def memorialize!
     update!(memorial: true)
   end
diff --git a/app/models/account_stat.rb b/app/models/account_stat.rb
index c84e4217c..e70b54d79 100644
--- a/app/models/account_stat.rb
+++ b/app/models/account_stat.rb
@@ -21,26 +21,26 @@ class AccountStat < ApplicationRecord
 
   def increment_count!(key)
     update(attributes_for_increment(key))
-  rescue ActiveRecord::StaleObjectError
+  rescue ActiveRecord::StaleObjectError, ActiveRecord::RecordNotUnique
     begin
       reload_with_id
     rescue ActiveRecord::RecordNotFound
-      # Nothing to do
-    else
-      retry
+      return
     end
+
+    retry
   end
 
   def decrement_count!(key)
-    update(key => [public_send(key) - 1, 0].max)
-  rescue ActiveRecord::StaleObjectError
+    update(attributes_for_decrement(key))
+  rescue ActiveRecord::StaleObjectError, ActiveRecord::RecordNotUnique
     begin
       reload_with_id
     rescue ActiveRecord::RecordNotFound
-      # Nothing to do
-    else
-      retry
+      return
     end
+
+    retry
   end
 
   private
@@ -51,8 +51,13 @@ class AccountStat < ApplicationRecord
     attrs
   end
 
+  def attributes_for_decrement(key)
+    attrs = { key => [public_send(key) - 1, 0].max }
+    attrs
+  end
+
   def reload_with_id
-    self.id = find_by!(account: account).id if new_record?
+    self.id = self.class.find_by!(account: account).id if new_record?
     reload
   end
 end
diff --git a/app/models/account_warning.rb b/app/models/account_warning.rb
index 157e6c04d..5efc924d5 100644
--- a/app/models/account_warning.rb
+++ b/app/models/account_warning.rb
@@ -13,7 +13,7 @@
 #
 
 class AccountWarning < ApplicationRecord
-  enum action: %i(none disable silence suspend), _suffix: :action
+  enum action: %i(none disable sensitive silence suspend), _suffix: :action
 
   belongs_to :account, inverse_of: :account_warnings
   belongs_to :target_account, class_name: 'Account', inverse_of: :targeted_account_warnings
diff --git a/app/models/admin/account_action.rb b/app/models/admin/account_action.rb
index c4ac09520..bf222391f 100644
--- a/app/models/admin/account_action.rb
+++ b/app/models/admin/account_action.rb
@@ -8,6 +8,7 @@ class Admin::AccountAction
   TYPES = %w(
     none
     disable
+    sensitive
     silence
     suspend
   ).freeze
@@ -64,6 +65,8 @@ class Admin::AccountAction
     case type
     when 'disable'
       handle_disable!
+    when 'sensitive'
+      handle_sensitive!
     when 'silence'
       handle_silence!
     when 'suspend'
@@ -109,6 +112,12 @@ class Admin::AccountAction
     target_account.user&.disable!
   end
 
+  def handle_sensitive!
+    authorize(target_account, :sensitive?)
+    log_action(:sensitive, target_account)
+    target_account.sensitize!
+  end
+
   def handle_silence!
     authorize(target_account, :silence?)
     log_action(:silence, target_account)
@@ -118,7 +127,7 @@ class Admin::AccountAction
   def handle_suspend!
     authorize(target_account, :suspend?)
     log_action(:suspend, target_account)
-    target_account.suspend!
+    target_account.suspend!(origin: :local)
   end
 
   def text_for_warning
diff --git a/app/models/admin/action_log_filter.rb b/app/models/admin/action_log_filter.rb
index 0ba7e1609..3a1b67e06 100644
--- a/app/models/admin/action_log_filter.rb
+++ b/app/models/admin/action_log_filter.rb
@@ -35,9 +35,11 @@ class Admin::ActionLogFilter
     reopen_report: { target_type: 'Report', action: 'reopen' }.freeze,
     reset_password_user: { target_type: 'User', action: 'reset_password' }.freeze,
     resolve_report: { target_type: 'Report', action: 'resolve' }.freeze,
+    sensitive_account: { target_type: 'Account', action: 'sensitive' }.freeze,
     silence_account: { target_type: 'Account', action: 'silence' }.freeze,
     suspend_account: { target_type: 'Account', action: 'suspend' }.freeze,
     unassigned_report: { target_type: 'Report', action: 'unassigned' }.freeze,
+    unsensitive_account: { target_type: 'Account', action: 'unsensitive' }.freeze,
     unsilence_account: { target_type: 'Account', action: 'unsilence' }.freeze,
     unsuspend_account: { target_type: 'Account', action: 'unsuspend' }.freeze,
     update_announcement: { target_type: 'Announcement', action: 'update' }.freeze,
diff --git a/app/models/announcement.rb b/app/models/announcement.rb
index c493604c2..f8183aabc 100644
--- a/app/models/announcement.rb
+++ b/app/models/announcement.rb
@@ -22,6 +22,7 @@ class Announcement < ApplicationRecord
   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')) }
+  scope :reverse_chronological, -> { order(Arel.sql('COALESCE(announcements.starts_at, announcements.scheduled_at, announcements.published_at, announcements.created_at) DESC')) }
 
   has_many :announcement_mutes, dependent: :destroy
   has_many :announcement_reactions, dependent: :destroy
diff --git a/app/models/form/account_batch.rb b/app/models/form/account_batch.rb
index 7b9e40f68..882770d7c 100644
--- a/app/models/form/account_batch.rb
+++ b/app/models/form/account_batch.rb
@@ -9,6 +9,8 @@ class Form::AccountBatch
 
   def save
     case action
+    when 'follow'
+      follow!
     when 'unfollow'
       unfollow!
     when 'remove_from_followers'
@@ -24,6 +26,12 @@ class Form::AccountBatch
 
   private
 
+  def follow!
+    accounts.find_each do |target_account|
+      FollowService.new.call(current_account, target_account)
+    end
+  end
+
   def unfollow!
     accounts.find_each do |target_account|
       UnfollowService.new.call(current_account, target_account)
diff --git a/app/models/session_activation.rb b/app/models/session_activation.rb
index 34d25c83d..b0ce9d112 100644
--- a/app/models/session_activation.rb
+++ b/app/models/session_activation.rb
@@ -70,12 +70,16 @@ class SessionActivation < ApplicationRecord
   end
 
   def assign_access_token
-    superapp = Doorkeeper::Application.find_by(superapp: true)
+    self.access_token = Doorkeeper::AccessToken.create!(access_token_attributes)
+  end
 
-    self.access_token = Doorkeeper::AccessToken.create!(application_id: superapp&.id,
-                                                        resource_owner_id: user_id,
-                                                        scopes: 'read write follow',
-                                                        expires_in: Doorkeeper.configuration.access_token_expires_in,
-                                                        use_refresh_token: Doorkeeper.configuration.refresh_token_enabled?)
+  def access_token_attributes
+    {
+      application_id: Doorkeeper::Application.find_by(superapp: true)&.id,
+      resource_owner_id: user_id,
+      scopes: 'read write follow',
+      expires_in: Doorkeeper.configuration.access_token_expires_in,
+      use_refresh_token: Doorkeeper.configuration.refresh_token_enabled?,
+    }
   end
 end
diff --git a/app/models/tag.rb b/app/models/tag.rb
index df2f86d95..bb93a52e2 100644
--- a/app/models/tag.rb
+++ b/app/models/tag.rb
@@ -126,7 +126,7 @@ class Tag < ApplicationRecord
     end
 
     def search_for(term, limit = 5, offset = 0, options = {})
-      normalized_term = normalize(term.strip).mb_chars.downcase.to_s
+      normalized_term = normalize(term.strip)
       pattern         = sanitize_sql_like(normalized_term) + '%'
       query           = Tag.listable.where(arel_table[:name].lower.matches(pattern))
       query           = query.where(arel_table[:name].lower.eq(normalized_term).or(arel_table[:reviewed_at].not_eq(nil))) if options[:exclude_unreviewed]
diff --git a/app/models/user.rb b/app/models/user.rb
index 3dcfd820e..9bdbac76d 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -63,7 +63,7 @@ class User < ApplicationRecord
   devise :two_factor_backupable,
          otp_number_of_backup_codes: 10
 
-  devise :registerable, :recoverable, :rememberable, :trackable, :validatable,
+  devise :registerable, :recoverable, :rememberable, :validatable,
          :confirmable
 
   include Omniauthable
@@ -165,6 +165,24 @@ class User < ApplicationRecord
     prepare_new_user! if new_user && approved?
   end
 
+  def update_sign_in!(request, new_sign_in: false)
+    old_current, new_current = current_sign_in_at, Time.now.utc
+    self.last_sign_in_at     = old_current || new_current
+    self.current_sign_in_at  = new_current
+
+    old_current, new_current = current_sign_in_ip, request.remote_ip
+    self.last_sign_in_ip     = old_current || new_current
+    self.current_sign_in_ip  = new_current
+
+    if new_sign_in
+      self.sign_in_count ||= 0
+      self.sign_in_count  += 1
+    end
+
+    save(validate: false) unless new_record?
+    prepare_returning_user!
+  end
+
   def pending?
     !approved?
   end
@@ -196,11 +214,6 @@ class User < ApplicationRecord
     prepare_new_user!
   end
 
-  def update_tracked_fields!(request)
-    super
-    prepare_returning_user!
-  end
-
   def otp_enabled?
     otp_required_for_login
   end
diff --git a/app/policies/account_policy.rb b/app/policies/account_policy.rb
index 1b105e92a..262ada42e 100644
--- a/app/policies/account_policy.rb
+++ b/app/policies/account_policy.rb
@@ -18,10 +18,18 @@ class AccountPolicy < ApplicationPolicy
   end
 
   def destroy?
-    record.suspended? && record.deletion_request.present? && admin?
+    record.suspended_temporarily? && admin?
   end
 
   def unsuspend?
+    staff? && record.suspension_origin_local?
+  end
+
+  def sensitive?
+    staff? && !record.user&.staff?
+  end
+
+  def unsensitive?
     staff?
   end
 
diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb
index 5d2741b17..759ef30f9 100644
--- a/app/serializers/activitypub/actor_serializer.rb
+++ b/app/serializers/activitypub/actor_serializer.rb
@@ -7,7 +7,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
 
   context_extensions :manually_approves_followers, :featured, :also_known_as,
                      :moved_to, :property_value, :identity_proof,
-                     :discoverable, :olm
+                     :discoverable, :olm, :suspended
 
   attributes :id, :type, :following, :followers,
              :inbox, :outbox, :featured, :featured_tags,
@@ -23,6 +23,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
   attribute :devices, unless: :instance_actor?
   attribute :moved_to, if: :moved?
   attribute :also_known_as, if: :also_known_as?
+  attribute :suspended, if: :suspended?
 
   class EndpointsSerializer < ActivityPub::Serializer
     include RoutingHelper
@@ -39,7 +40,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
   has_one :icon,  serializer: ActivityPub::ImageSerializer, if: :avatar_exists?
   has_one :image, serializer: ActivityPub::ImageSerializer, if: :header_exists?
 
-  delegate :moved?, :instance_actor?, to: :object
+  delegate :suspended?, :instance_actor?, to: :object
 
   def id
     object.instance_actor? ? instance_actor_url : account_url(object)
@@ -93,12 +94,16 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
     object.username
   end
 
+  def discoverable
+    object.suspended? ? false : (object.discoverable || false)
+  end
+
   def name
-    object.display_name
+    object.suspended? ? '' : object.display_name
   end
 
   def summary
-    Formatter.instance.simplified_format(object)
+    object.suspended? ? '' : Formatter.instance.simplified_format(object)
   end
 
   def icon
@@ -113,36 +118,44 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
     object
   end
 
+  def suspended
+    object.suspended?
+  end
+
   def url
     object.instance_actor? ? about_more_url(instance_actor: true) : short_account_url(object)
   end
 
   def avatar_exists?
-    object.avatar?
+    !object.suspended? && object.avatar?
   end
 
   def header_exists?
-    object.header?
+    !object.suspended? && object.header?
   end
 
   def manually_approves_followers
-    object.locked
+    object.suspended? ? false : object.locked
   end
 
   def virtual_tags
-    object.emojis + object.tags
+    object.suspended? ? [] : (object.emojis + object.tags)
   end
 
   def virtual_attachments
-    object.fields + object.identity_proofs.active
+    object.suspended? ? [] : (object.fields + object.identity_proofs.active)
   end
 
   def moved_to
     ActivityPub::TagManager.instance.uri_for(object.moved_to_account)
   end
 
+  def moved?
+    !object.suspended? && object.moved?
+  end
+
   def also_known_as?
-    !object.also_known_as.empty?
+    !object.suspended? && !object.also_known_as.empty?
   end
 
   class CustomEmojiSerializer < ActivityPub::EmojiSerializer
diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb
index a0965790e..c4f8f5c3f 100644
--- a/app/serializers/activitypub/note_serializer.rb
+++ b/app/serializers/activitypub/note_serializer.rb
@@ -40,10 +40,6 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
     object.spoiler_text.presence || (instance_options[:allow_local_only] ? nil : Setting.outgoing_spoilers.presence)
   end
 
-  def sensitive
-    object.sensitive || (!instance_options[:allow_local_only] && Setting.outgoing_spoilers.present?)
-  end
-
   def direct_message
     object.direct_visibility?
   end
@@ -110,6 +106,10 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
     ActivityPub::TagManager.instance.cc(object)
   end
 
+  def sensitive
+    object.account.sensitized? || object.sensitive || (!instance_options[:allow_local_only] && Setting.outgoing_spoilers.present?)
+  end
+
   def virtual_tags
     object.active_mentions.to_a.sort_by(&:id) + object.tags + object.emojis
   end
diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb
index 58e7bd4e4..b5dcf6208 100644
--- a/app/serializers/rest/status_serializer.rb
+++ b/app/serializers/rest/status_serializer.rb
@@ -60,6 +60,14 @@ class REST::StatusSerializer < ActiveModel::Serializer
     end
   end
 
+  def sensitive
+    if current_user? && current_user.account_id == object.account_id
+      object.sensitive
+    else
+      object.account.sensitized? || object.sensitive
+    end
+  end
+
   def uri
     ActivityPub::TagManager.instance.uri_for(object)
   end
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index a66aee226..0201c30b3 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -18,10 +18,11 @@ class ActivityPub::ProcessAccountService < BaseService
 
     RedisLock.acquire(lock_options) do |lock|
       if lock.acquired?
-        @account          = Account.remote.find_by(uri: @uri) if @options[:only_key]
-        @account        ||= Account.find_remote(@username, @domain)
-        @old_public_key   = @account&.public_key
-        @old_protocol     = @account&.protocol
+        @account            = Account.remote.find_by(uri: @uri) if @options[:only_key]
+        @account          ||= Account.find_remote(@username, @domain)
+        @old_public_key     = @account&.public_key
+        @old_protocol       = @account&.protocol
+        @suspension_changed = false
 
         create_account if @account.nil?
         update_account
@@ -36,9 +37,10 @@ class ActivityPub::ProcessAccountService < BaseService
 
     after_protocol_change! if protocol_changed?
     clear_tombstones! if key_changed?
+    after_suspension_change! if suspension_changed?
     return after_key_change! if key_changed? && !@options[:signed_with_known_key]
 
-    unless @options[:only_key]
+    unless @options[:only_key] || @account.suspended?
       check_featured_collection! if @account.featured_collection_url.present?
       check_links! unless @account.fields.empty?
       process_sync
@@ -53,20 +55,23 @@ class ActivityPub::ProcessAccountService < BaseService
 
   def create_account
     @account = Account.new
-    @account.protocol     = :activitypub
-    @account.username     = @username
-    @account.domain       = @domain
-    @account.private_key  = nil
-    @account.suspended_at = domain_block.created_at if auto_suspend?
-    @account.silenced_at  = domain_block.created_at if auto_silence?
+    @account.protocol          = :activitypub
+    @account.username          = @username
+    @account.domain            = @domain
+    @account.private_key       = nil
+    @account.suspended_at      = domain_block.created_at if auto_suspend?
+    @account.suspension_origin = :local if auto_suspend?
+    @account.silenced_at       = domain_block.created_at if auto_silence?
+    @account.save
   end
 
   def update_account
     @account.last_webfingered_at = Time.now.utc unless @options[:only_key]
     @account.protocol            = :activitypub
 
-    set_immediate_attributes!
-    set_fetchable_attributes! unless @options[:only_keys]
+    set_suspension!
+    set_immediate_attributes! unless @account.suspended?
+    set_fetchable_attributes! unless @options[:only_keys] || @account.suspended?
 
     @account.save_with_optional_media!
   end
@@ -100,6 +105,18 @@ class ActivityPub::ProcessAccountService < BaseService
     @account.moved_to_account  = @json['movedTo'].present? ? moved_account : nil
   end
 
+  def set_suspension!
+    return if @account.suspended? && @account.suspension_origin_local?
+
+    if @account.suspended? && !@json['suspended']
+      @account.unsuspend!
+      @suspension_changed = true
+    elsif !@account.suspended? && @json['suspended']
+      @account.suspend!(origin: :remote)
+      @suspension_changed = true
+    end
+  end
+
   def after_protocol_change!
     ActivityPub::PostUpgradeWorker.perform_async(@account.domain)
   end
@@ -109,6 +126,14 @@ class ActivityPub::ProcessAccountService < BaseService
     nil
   end
 
+  def after_suspension_change!
+    if @account.suspended?
+      Admin::SuspensionWorker.perform_async(@account.id)
+    else
+      Admin::UnsuspensionWorker.perform_async(@account.id)
+    end
+  end
+
   def check_featured_collection!
     ActivityPub::SynchronizeFeaturedCollectionWorker.perform_async(@account.id)
   end
@@ -229,6 +254,10 @@ class ActivityPub::ProcessAccountService < BaseService
     !@old_public_key.nil? && @old_public_key != @account.public_key
   end
 
+  def suspension_changed?
+    @suspension_changed
+  end
+
   def clear_tombstones!
     Tombstone.where(account_id: @account.id).delete_all
   end
diff --git a/app/services/activitypub/process_collection_service.rb b/app/services/activitypub/process_collection_service.rb
index e6ccaccc9..f1d175dac 100644
--- a/app/services/activitypub/process_collection_service.rb
+++ b/app/services/activitypub/process_collection_service.rb
@@ -8,7 +8,7 @@ class ActivityPub::ProcessCollectionService < BaseService
     @json    = Oj.load(body, mode: :strict)
     @options = options
 
-    return if !supported_context? || (different_actor? && verify_account!.nil?) || @account.suspended? || @account.local?
+    return if !supported_context? || (different_actor? && verify_account!.nil?) || suspended_actor? || @account.local?
 
     case @json['type']
     when 'Collection', 'CollectionPage'
@@ -28,6 +28,14 @@ class ActivityPub::ProcessCollectionService < BaseService
     @json['actor'].present? && value_or_id(@json['actor']) != @account.uri
   end
 
+  def suspended_actor?
+    @account.suspended? && !activity_allowed_while_suspended?
+  end
+
+  def activity_allowed_while_suspended?
+    %w(Delete Reject Undo Update).include?(@json['type'])
+  end
+
   def process_items(items)
     items.reverse_each.map { |item| process_item(item) }.compact
   end
diff --git a/app/services/block_domain_service.rb b/app/services/block_domain_service.rb
index 1cf3382b3..76cc36ff6 100644
--- a/app/services/block_domain_service.rb
+++ b/app/services/block_domain_service.rb
@@ -16,7 +16,7 @@ class BlockDomainService < BaseService
     scope = Account.by_domain_and_subdomains(domain_block.domain)
 
     scope.where(silenced_at: domain_block.created_at).in_batches.update_all(silenced_at: nil) unless domain_block.silence?
-    scope.where(suspended_at: domain_block.created_at).in_batches.update_all(suspended_at: nil) unless domain_block.suspend?
+    scope.where(suspended_at: domain_block.created_at).in_batches.update_all(suspended_at: nil, suspension_origin: nil) unless domain_block.suspend?
   end
 
   def process_domain_block!
@@ -34,7 +34,8 @@ class BlockDomainService < BaseService
   end
 
   def suspend_accounts!
-    blocked_domain_accounts.without_suspended.in_batches.update_all(suspended_at: @domain_block.created_at)
+    blocked_domain_accounts.without_suspended.in_batches.update_all(suspended_at: @domain_block.created_at, suspension_origin: :local)
+
     blocked_domain_accounts.where(suspended_at: @domain_block.created_at).reorder(nil).find_each do |account|
       DeleteAccountService.new.call(account, reserve_username: true, suspended_at: @domain_block.created_at)
     end
diff --git a/app/services/delete_account_service.rb b/app/services/delete_account_service.rb
index 15bdd13e3..de6488c78 100644
--- a/app/services/delete_account_service.rb
+++ b/app/services/delete_account_service.rb
@@ -64,8 +64,15 @@ class DeleteAccountService < BaseService
   def reject_follows!
     return if @account.local? || !@account.activitypub?
 
+    # When deleting a remote account, the account obviously doesn't
+    # actually become deleted on its origin server, i.e. unlike a
+    # locally deleted account it continues to have access to its home
+    # feed and other content. To prevent it from being able to continue
+    # to access toots it would receive because it follows local accounts,
+    # we have to force it to unfollow them.
+
     ActivityPub::DeliveryWorker.push_bulk(Follow.where(account: @account)) do |follow|
-      [build_reject_json(follow), follow.target_account_id, follow.account.inbox_url]
+      [Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer)), follow.target_account_id, @account.inbox_url]
     end
   end
 
@@ -114,19 +121,20 @@ class DeleteAccountService < BaseService
 
     return unless @options[:reserve_username]
 
-    @account.silenced_at      = nil
-    @account.suspended_at     = @options[:suspended_at] || Time.now.utc
-    @account.locked           = false
-    @account.memorial         = false
-    @account.discoverable     = false
-    @account.display_name     = ''
-    @account.note             = ''
-    @account.fields           = []
-    @account.statuses_count   = 0
-    @account.followers_count  = 0
-    @account.following_count  = 0
-    @account.moved_to_account = nil
-    @account.trust_level      = :untrusted
+    @account.silenced_at       = nil
+    @account.suspended_at      = @options[:suspended_at] || Time.now.utc
+    @account.suspension_origin = :local
+    @account.locked            = false
+    @account.memorial          = false
+    @account.discoverable      = false
+    @account.display_name      = ''
+    @account.note              = ''
+    @account.fields            = []
+    @account.statuses_count    = 0
+    @account.followers_count   = 0
+    @account.following_count   = 0
+    @account.moved_to_account  = nil
+    @account.trust_level       = :untrusted
     @account.avatar.destroy
     @account.header.destroy
     @account.save!
@@ -154,10 +162,6 @@ class DeleteAccountService < BaseService
     @delete_actor_json ||= Oj.dump(serialize_payload(@account, ActivityPub::DeleteActorSerializer, signer: @account))
   end
 
-  def build_reject_json(follow)
-    Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer))
-  end
-
   def delivery_inboxes
     @delivery_inboxes ||= @account.followers.inboxes + Relay.enabled.pluck(:inbox_url)
   end
diff --git a/app/services/resolve_account_service.rb b/app/services/resolve_account_service.rb
index 3f7bb7cc5..4783e6d33 100644
--- a/app/services/resolve_account_service.rb
+++ b/app/services/resolve_account_service.rb
@@ -5,8 +5,6 @@ class ResolveAccountService < BaseService
   include DomainControlHelper
   include WebfingerHelper
 
-  class WebfingerRedirectError < StandardError; end
-
   # Find or create an account record for a remote user. When creating,
   # look up the user's webfinger and fetch ActivityPub data
   # @param [String, Account] uri URI in the username@domain format or account record
@@ -40,13 +38,18 @@ class ResolveAccountService < BaseService
 
     @account ||= Account.find_remote(@username, @domain)
 
-    return @account if @account&.local? || !webfinger_update_due?
+    if gone_from_origin? && not_yet_deleted?
+      queue_deletion!
+      return
+    end
+
+    return @account if @account&.local? || gone_from_origin? || !webfinger_update_due?
 
     # Now it is certain, it is definitely a remote account, and it
     # either needs to be created, or updated from fresh data
 
     process_account!
-  rescue Webfinger::Error, WebfingerRedirectError, Oj::ParseError => e
+  rescue Webfinger::Error, Oj::ParseError => e
     Rails.logger.debug "Webfinger query for #{@uri} failed: #{e}"
     nil
   end
@@ -86,10 +89,12 @@ class ResolveAccountService < BaseService
     elsif !redirected
       return process_webfinger!("#{confirmed_username}@#{confirmed_domain}", true)
     else
-      raise WebfingerRedirectError, "The URI #{uri} tries to hijack #{@username}@#{@domain}"
+      raise Webfinger::RedirectError, "The URI #{uri} tries to hijack #{@username}@#{@domain}"
     end
 
     @domain = nil if TagManager.instance.local_domain?(@domain)
+  rescue Webfinger::GoneError
+    @gone = true
   end
 
   def process_account!
@@ -131,6 +136,18 @@ class ResolveAccountService < BaseService
     @actor_json = supported_context?(json) && equals_or_includes_any?(json['type'], ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES) ? json : nil
   end
 
+  def gone_from_origin?
+    @gone
+  end
+
+  def not_yet_deleted?
+    @account.present? && !@account.local?
+  end
+
+  def queue_deletion!
+    AccountDeletionWorker.perform_async(@account.id, reserve_username: false)
+  end
+
   def lock_options
     { redis: Redis.current, key: "resolve:#{@username}@#{@domain}" }
   end
diff --git a/app/services/resolve_url_service.rb b/app/services/resolve_url_service.rb
index 78080d878..2b10ac1e0 100644
--- a/app/services/resolve_url_service.rb
+++ b/app/services/resolve_url_service.rb
@@ -34,7 +34,17 @@ class ResolveURLService < BaseService
 
     # 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)
+    uris = [@url]
+
+    # We don't have an index on `url`, so try guessing the `uri` from `url`
+    parsed_url = Addressable::URI.parse(@url)
+    parsed_url.path.match(%r{/@(?<username>#{Account::USERNAME_RE})/(?<status_id>[0-9]+)\Z}) do |matched|
+      parsed_url.path = "/users/#{matched[:username]}/statuses/#{matched[:status_id]}"
+      uris << parsed_url.to_s
+    end
+
+    status = Status.find_by(uri: uris)
+
     authorize_with @on_behalf_of, status, :show? unless status.nil?
     status
   rescue Mastodon::NotPermittedError
diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb
index 5a079c3ac..7c70a6021 100644
--- a/app/services/suspend_account_service.rb
+++ b/app/services/suspend_account_service.rb
@@ -1,10 +1,14 @@
 # frozen_string_literal: true
 
 class SuspendAccountService < BaseService
+  include Payloadable
+
   def call(account)
     @account = account
 
     suspend!
+    reject_remote_follows!
+    distribute_update_actor!
     unmerge_from_home_timelines!
     unmerge_from_list_timelines!
     privatize_media_attachments!
@@ -16,9 +20,34 @@ class SuspendAccountService < BaseService
     @account.suspend! unless @account.suspended?
   end
 
+  def reject_remote_follows!
+    return if @account.local? || !@account.activitypub?
+
+    # When suspending a remote account, the account obviously doesn't
+    # actually become suspended on its origin server, i.e. unlike a
+    # locally suspended account it continues to have access to its home
+    # feed and other content. To prevent it from being able to continue
+    # to access toots it would receive because it follows local accounts,
+    # we have to force it to unfollow them. Unfortunately, there is no
+    # counterpart to this operation, i.e. you can't then force a remote
+    # account to re-follow you, so this part is not reversible.
+
+    follows = Follow.where(account: @account).to_a
+
+    ActivityPub::DeliveryWorker.push_bulk(follows) do |follow|
+      [Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer)), follow.target_account_id, @account.inbox_url]
+    end
+
+    follows.each(&:destroy)
+  end
+
+  def distribute_update_actor!
+    ActivityPub::UpdateDistributionWorker.perform_async(@account.id) if @account.local?
+  end
+
   def unmerge_from_home_timelines!
     @account.followers_for_local_distribution.find_each do |follower|
-      FeedManager.instance.unmerge_from_timeline(@account, follower)
+      FeedManager.instance.unmerge_from_home(@account, follower)
     end
   end
 
@@ -39,11 +68,15 @@ class SuspendAccountService < BaseService
         styles.each do |style|
           case Paperclip::Attachment.default_options[:storage]
           when :s3
-            attachment.s3_object(style).acl.put(:private)
+            attachment.s3_object(style).acl.put(acl: 'private')
           when :fog
             # Not supported
           when :filesystem
-            FileUtils.chmod(0o600 & ~File.umask, attachment.path(style))
+            begin
+              FileUtils.chmod(0o600 & ~File.umask, attachment.path(style)) unless attachment.path(style).nil?
+            rescue Errno::ENOENT
+              Rails.logger.warn "Tried to change permission on non-existent file #{attachment.path(style)}"
+            end
           end
         end
       end
diff --git a/app/services/unblock_domain_service.rb b/app/services/unblock_domain_service.rb
index d502d9e49..e765fb7a8 100644
--- a/app/services/unblock_domain_service.rb
+++ b/app/services/unblock_domain_service.rb
@@ -13,6 +13,6 @@ class UnblockDomainService < BaseService
     scope = Account.by_domain_and_subdomains(domain_block.domain)
 
     scope.where(silenced_at: domain_block.created_at).in_batches.update_all(silenced_at: nil) unless domain_block.noop?
-    scope.where(suspended_at: domain_block.created_at).in_batches.update_all(suspended_at: nil) if domain_block.suspend?
+    scope.where(suspended_at: domain_block.created_at).in_batches.update_all(suspended_at: nil, suspension_origin: nil) if domain_block.suspend?
   end
 end
diff --git a/app/services/unsuspend_account_service.rb b/app/services/unsuspend_account_service.rb
index 3e731ddd9..a81d1ac4f 100644
--- a/app/services/unsuspend_account_service.rb
+++ b/app/services/unsuspend_account_service.rb
@@ -5,6 +5,10 @@ class UnsuspendAccountService < BaseService
     @account = account
 
     unsuspend!
+    refresh_remote_account!
+
+    return if @account.nil?
+
     merge_into_home_timelines!
     merge_into_list_timelines!
     publish_media_attachments!
@@ -16,9 +20,25 @@ class UnsuspendAccountService < BaseService
     @account.unsuspend! if @account.suspended?
   end
 
+  def refresh_remote_account!
+    return if @account.local?
+
+    # While we had the remote account suspended, it could be that
+    # it got suspended on its origin, too. So, we need to refresh
+    # it straight away so it gets marked as remotely suspended in
+    # that case.
+
+    @account.update!(last_webfingered_at: nil)
+    @account = ResolveAccountService.new.call(@account)
+
+    # Worth noting that it is possible that the remote has not only
+    # been suspended, but deleted permanently, in which case
+    # @account would now be nil.
+  end
+
   def merge_into_home_timelines!
     @account.followers_for_local_distribution.find_each do |follower|
-      FeedManager.instance.merge_into_timeline(@account, follower)
+      FeedManager.instance.merge_into_home(@account, follower)
     end
   end
 
@@ -39,11 +59,15 @@ class UnsuspendAccountService < BaseService
         styles.each do |style|
           case Paperclip::Attachment.default_options[:storage]
           when :s3
-            attachment.s3_object(style).acl.put(Paperclip::Attachment.default_options[:s3_permissions])
+            attachment.s3_object(style).acl.put(acl: Paperclip::Attachment.default_options[:s3_permissions])
           when :fog
             # Not supported
           when :filesystem
-            FileUtils.chmod(0o666 & ~File.umask, attachment.path(style))
+            begin
+              FileUtils.chmod(0o666 & ~File.umask, attachment.path(style)) unless attachment.path(style).nil?
+            rescue Errno::ENOENT
+              Rails.logger.warn "Tried to change permission on non-existent file #{attachment.path(style)}"
+            end
           end
         end
       end
diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml
index c9688ea88..1a81b96f6 100644
--- a/app/views/accounts/show.html.haml
+++ b/app/views/accounts/show.html.haml
@@ -39,12 +39,12 @@
             = render partial: 'statuses/status', collection: @pinned_statuses, as: :status, locals: { pinned: true }
 
           - if @newer_url
-            .entry= link_to_more @newer_url
+            .entry= link_to_newer @newer_url
 
           = render partial: 'statuses/status', collection: @statuses, as: :status
 
           - if @older_url
-            .entry= link_to_more @older_url
+            .entry= link_to_older @older_url
 
   .column-1
     - if @account.memorial?
diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml
index f0a216f6b..d5978eddd 100644
--- a/app/views/admin/accounts/show.html.haml
+++ b/app/views/admin/accounts/show.html.haml
@@ -69,6 +69,8 @@
           = t('admin.accounts.confirming')
         - elsif @account.local? && !@account.user_approved?
           = t('admin.accounts.pending')
+        - elsif @account.sensitized?
+          = t('admin.accounts.sensitive')
         - else
           = t('admin.accounts.no_limits_imposed')
       .dashboard__counters__label= t 'admin.accounts.login_status'
@@ -192,6 +194,11 @@
           - else
             = link_to t('admin.accounts.disable'), new_admin_account_action_path(@account.id, type: 'disable'), class: 'button' if can?(:disable, @account.user)
 
+        - if @account.sensitized?
+          = link_to t('admin.accounts.undo_sensitized'), unsensitive_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unsensitive, @account)
+        - elsif !@account.local? || @account.user_approved?
+          = link_to t('admin.accounts.sensitive'), new_admin_account_action_path(@account.id, type: 'sensitive'), class: 'button' if can?(:sensitive, @account)
+
         - if @account.silenced?
           = link_to t('admin.accounts.undo_silenced'), unsilence_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unsilence, @account)
         - elsif !@account.local? || @account.user_approved?
diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml
index 9530e612a..ce47418d4 100644
--- a/app/views/home/index.html.haml
+++ b/app/views/home/index.html.haml
@@ -1,8 +1,8 @@
 - content_for :header_tags do
-  = preload_link_tag asset_pack_path('features/getting_started.js'), crossorigin: 'anonymous'
-  = preload_link_tag asset_pack_path('features/compose.js'), crossorigin: 'anonymous'
-  = preload_link_tag asset_pack_path('features/home_timeline.js'), crossorigin: 'anonymous'
-  = preload_link_tag asset_pack_path('features/notifications.js'), crossorigin: 'anonymous'
+  = preload_pack_asset 'features/getting_started.js', crossorigin: 'anonymous'
+  = preload_pack_asset 'features/compose.js', crossorigin: 'anonymous'
+  = preload_pack_asset 'features/home_timeline.js', crossorigin: 'anonymous'
+  = preload_pack_asset 'features/notifications.js', crossorigin: 'anonymous'
 
   %meta{name: 'applicationServerKey', content: Rails.configuration.x.vapid_public_key}
   = render_initial_state
diff --git a/app/views/layouts/_theme.html.haml b/app/views/layouts/_theme.html.haml
index 066d9de42..92de64b0d 100644
--- a/app/views/layouts/_theme.html.haml
+++ b/app/views/layouts/_theme.html.haml
@@ -2,12 +2,12 @@
   - if theme[:pack] != 'common' && theme[:common]
     = render partial: 'layouts/theme', object: theme[:common]
   - if theme[:pack]
-    = javascript_pack_tag theme[:flavour] ? "flavours/#{theme[:flavour]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, crossorigin: 'anonymous'
+    = javascript_pack_tag theme[:flavour] ? "flavours/#{theme[:flavour]}/#{theme[:pack]}" : "core/#{theme[:pack]}", crossorigin: 'anonymous'
     - if theme[:skin]
       - if !theme[:flavour] || theme[:skin] == 'default'
-        = stylesheet_pack_tag theme[:flavour] ? "flavours/#{theme[:flavour]}/#{theme[:pack]}" : "core/#{theme[:pack]}", integrity: true, media: 'all'
+        = stylesheet_pack_tag theme[:flavour] ? "flavours/#{theme[:flavour]}/#{theme[:pack]}" : "core/#{theme[:pack]}", media: 'all', crossorigin: 'anonymous'
       - else
-        = stylesheet_pack_tag "skins/#{theme[:flavour]}/#{theme[:skin]}/#{theme[:pack]}"
+        = stylesheet_pack_tag "skins/#{theme[:flavour]}/#{theme[:skin]}/#{theme[:pack]}", crossorigin: 'anonymous'
     - if theme[:preload]
       - theme[:preload].each do |link|
         %link{ href: asset_pack_path("#{link}.js"), crossorigin: 'anonymous', rel: 'preload', as: 'script' }/
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 1481f6973..32681773f 100755
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -21,12 +21,12 @@
 
     %title= content_for?(:page_title) ? safe_join([yield(:page_title).chomp.html_safe, title], ' - ') : title
 
-    = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous'
+    = javascript_pack_tag "locales", crossorigin: 'anonymous'
     - if @theme
       - if @theme[:supported_locales].include? I18n.locale.to_s
-        = javascript_pack_tag "locales/#{@theme[:flavour]}/#{I18n.locale}", integrity: true, crossorigin: 'anonymous'
+        = javascript_pack_tag "locales/#{@theme[:flavour]}/#{I18n.locale}", crossorigin: 'anonymous'
       - elsif @theme[:supported_locales].include? 'en'
-        = javascript_pack_tag "locales/#{@theme[:flavour]}/en", integrity: true, crossorigin: 'anonymous'
+        = javascript_pack_tag "locales/#{@theme[:flavour]}/en", crossorigin: 'anonymous'
     = csrf_meta_tags
     %meta{ name: 'style-nonce', content: request.content_security_policy_nonce }
 
diff --git a/app/views/layouts/embedded.html.haml b/app/views/layouts/embedded.html.haml
index 69b206f69..431bd260c 100644
--- a/app/views/layouts/embedded.html.haml
+++ b/app/views/layouts/embedded.html.haml
@@ -12,12 +12,12 @@
       %link{ rel: 'dns-prefetch', href: storage_host }/
 
     = render_initial_state
-    = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous'
+    = javascript_pack_tag "locales", crossorigin: 'anonymous'
     - if @theme
       - if @theme[:supported_locales].include? I18n.locale.to_s
-        = javascript_pack_tag "locales/#{@theme[:flavour]}/#{I18n.locale}", integrity: true, crossorigin: 'anonymous'
+        = javascript_pack_tag "locales/#{@theme[:flavour]}/#{I18n.locale}", crossorigin: 'anonymous'
       - elsif @theme[:supported_locales].include? 'en'
-        = javascript_pack_tag "locales/#{@theme[:flavour]}/en", integrity: true, crossorigin: 'anonymous'
+        = javascript_pack_tag "locales/#{@theme[:flavour]}/en", crossorigin: 'anonymous'
     = render partial: 'layouts/theme', object: @core
     = render partial: 'layouts/theme', object: @theme
 
diff --git a/app/views/layouts/error.html.haml b/app/views/layouts/error.html.haml
index f8315afb5..55da5de3f 100644
--- a/app/views/layouts/error.html.haml
+++ b/app/views/layouts/error.html.haml
@@ -5,7 +5,7 @@
     %meta{ charset: 'utf-8' }/
     %title= safe_join([yield(:page_title), Setting.default_settings['site_title']], ' - ')
     %meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/
-    = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous'
+    = javascript_pack_tag "locales", crossorigin: 'anonymous'
     = render partial: 'layouts/theme', object: (@core || { pack: 'common' })
     = render partial: 'layouts/theme', object: (@theme || { pack: 'error', flavour: 'glitch', common: { pack: 'common', flavour: 'glitch', skin: 'default' } })
   %body.error
diff --git a/app/views/media/player.html.haml b/app/views/media/player.html.haml
index bd5610a0b..7369628a4 100644
--- a/app/views/media/player.html.haml
+++ b/app/views/media/player.html.haml
@@ -1,11 +1,11 @@
 - content_for :header_tags do
   = render_initial_state
-  = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous'
+  = javascript_pack_tag "locales", crossorigin: 'anonymous'
   - if @theme
     - if @theme[:supported_locales].include? I18n.locale.to_s
-      = javascript_pack_tag "locales/#{@theme[:flavour]}/#{I18n.locale}", integrity: true, crossorigin: 'anonymous'
+      = javascript_pack_tag "locales/#{@theme[:flavour]}/#{I18n.locale}", crossorigin: 'anonymous'
     - elsif @theme[:supported_locales].include? 'en'
-      = javascript_pack_tag "locales/#{@theme[:flavour]}/en", integrity: true, crossorigin: 'anonymous'
+      = javascript_pack_tag "locales/#{@theme[:flavour]}/en", crossorigin: 'anonymous'
   = render partial: 'layouts/theme', object: @core
   = render partial: 'layouts/theme', object: @theme
 
diff --git a/app/views/relationships/_account.html.haml b/app/views/relationships/_account.html.haml
index af5a4aaf7..f521aff22 100644
--- a/app/views/relationships/_account.html.haml
+++ b/app/views/relationships/_account.html.haml
@@ -5,6 +5,8 @@
     %table.accounts-table
       %tbody
         %tr
+          %td.accounts-table__interrelationships
+            = interrelationships_icon(@relationships, account.id)
           %td= account_link_to account
           %td.accounts-table__count.optional
             = number_to_human account.statuses_count, strip_insignificant_zeros: true
diff --git a/app/views/relationships/show.html.haml b/app/views/relationships/show.html.haml
index a6f8cdc15..7ad4e08f6 100644
--- a/app/views/relationships/show.html.haml
+++ b/app/views/relationships/show.html.haml
@@ -39,6 +39,8 @@
       %label.batch-table__toolbar__select.batch-checkbox-all
         = check_box_tag :batch_checkbox_all, nil, false
       .batch-table__toolbar__actions
+        = f.button safe_join([fa_icon('user-plus'), t('relationships.follow_selected_followers')]), name: :follow, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } if followed_by_relationship? && !mutual_relationship?
+
         = f.button safe_join([fa_icon('user-times'), t('relationships.remove_selected_follows')]), name: :unfollow, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } unless followed_by_relationship?
 
         = f.button safe_join([fa_icon('trash'), t('relationships.remove_selected_followers')]), name: :remove_from_followers, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } unless following_relationship?
diff --git a/app/views/statuses/_detailed_status.html.haml b/app/views/statuses/_detailed_status.html.haml
index b3e9c44fc..a4dd8534f 100644
--- a/app/views/statuses/_detailed_status.html.haml
+++ b/app/views/statuses/_detailed_status.html.haml
@@ -29,17 +29,17 @@
   - if !status.media_attachments.empty?
     - if status.media_attachments.first.video?
       - video = status.media_attachments.first
-      = react_component :video, src: full_asset_url(video.file.url(:original)), preview: full_asset_url(video.thumbnail.present? ? video.thumbnail.url : video.file.url(:small)), blurhash: video.blurhash, sensitive: status.sensitive?, width: 670, height: 380, detailed: true, inline: true, alt: video.description do
+      = react_component :video, src: full_asset_url(video.file.url(:original)), preview: full_asset_url(video.thumbnail.present? ? video.thumbnail.url : video.file.url(:small)), blurhash: video.blurhash, sensitive: sensitized?(status, current_account), 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: full_asset_url(audio.file.url(:original)), poster: full_asset_url(audio.thumbnail.present? ? audio.thumbnail.url : status.account.avatar_static_url), backgroundColor: audio.file.meta.dig('colors', 'background'), foregroundColor: audio.file.meta.dig('colors', 'foreground'), accentColor: audio.file.meta.dig('colors', 'accent'), width: 670, height: 380, 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: 380, sensitive: status.sensitive?, standalone: true, autoplay: autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
+      = react_component :media_gallery, height: 380, sensitive: sensitized?(status, current_account), 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, sensitive: status.sensitive?, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
+    = react_component :card, sensitive: sensitized?(status, current_account), 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
 
   .detailed-status__meta
     %data.dt-published{ value: status.created_at.to_time.iso8601 }
diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml
index 0e5ca41d1..199061c46 100644
--- a/app/views/statuses/_simple_status.html.haml
+++ b/app/views/statuses/_simple_status.html.haml
@@ -1,10 +1,10 @@
 .status{ class: "status-#{status.visibility}" }
   .status__info
     = link_to ActivityPub::TagManager.instance.url_for(status), class: 'status__relative-time u-url u-uid', target: stream_link_target, rel: 'noopener noreferrer' do
+      %span.status__visibility-icon><
+        = visibility_icon status
       %time.time-ago{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at)
     %data.dt-published{ value: status.created_at.to_time.iso8601 }
-    %span.status__visibility-icon
-      = visibility_icon status
 
     .p-author.h-card
       = link_to ActivityPub::TagManager.instance.url_for(status.account), class: 'status__display-name u-url', target: stream_link_target, rel: 'noopener noreferrer' do
@@ -35,17 +35,17 @@
   - if !status.media_attachments.empty?
     - if status.media_attachments.first.video?
       - video = status.media_attachments.first
-      = react_component :video, src: full_asset_url(video.file.url(:original)), preview: full_asset_url(video.thumbnail.present? ? video.thumbnail.url : video.file.url(:small)), blurhash: video.blurhash, sensitive: status.sensitive?, width: 610, height: 343, inline: true, alt: video.description do
+      = react_component :video, src: full_asset_url(video.file.url(:original)), preview: full_asset_url(video.thumbnail.present? ? video.thumbnail.url : video.file.url(:small)), blurhash: video.blurhash, sensitive: sensitized?(status, current_account), 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: full_asset_url(audio.file.url(:original)), poster: full_asset_url(audio.thumbnail.present? ? audio.thumbnail.url : status.account.avatar_static_url), backgroundColor: audio.file.meta.dig('colors', 'background'), foregroundColor: audio.file.meta.dig('colors', 'foreground'), accentColor: audio.file.meta.dig('colors', 'accent'), width: 610, height: 343, 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: status.sensitive?, autoplay: autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
+      = react_component :media_gallery, height: 343, sensitive: sensitized?(status, current_account), 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, sensitive: status.sensitive?, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
+    = react_component :card, sensitive: sensitized?(status, current_account), '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
diff --git a/app/views/statuses/_status.html.haml b/app/views/statuses/_status.html.haml
index 0e3652503..650f9b679 100644
--- a/app/views/statuses/_status.html.haml
+++ b/app/views/statuses/_status.html.haml
@@ -17,7 +17,7 @@
 - if status.reply? && include_threads
   - if @next_ancestor
     .entry{ class: entry_classes }
-      = link_to_more ActivityPub::TagManager.instance.url_for(@next_ancestor)
+      = link_to_older ActivityPub::TagManager.instance.url_for(@next_ancestor)
 
   = render partial: 'statuses/status', collection: @ancestors, as: :status, locals: { is_predecessor: true, direct_reply_id: status.in_reply_to_id }, autoplay: autoplay
 
@@ -44,16 +44,16 @@
 - if include_threads
   - if @since_descendant_thread_id
     .entry{ class: entry_classes }
-      = link_to_more short_account_status_url(status.account.username, status, max_descendant_thread_id: @since_descendant_thread_id + 1)
+      = link_to_newer short_account_status_url(status.account.username, status, max_descendant_thread_id: @since_descendant_thread_id + 1)
   - @descendant_threads.each do |thread|
     = render partial: 'statuses/status', collection: thread[:statuses], as: :status, locals: { is_successor: true, parent_id: status.id }, autoplay: autoplay
 
     - if thread[:next_status]
       .entry{ class: entry_classes }
-        = link_to_more ActivityPub::TagManager.instance.url_for(thread[:next_status])
+        = link_to_newer ActivityPub::TagManager.instance.url_for(thread[:next_status])
   - if @next_descendant_thread
     .entry{ class: entry_classes }
-      = link_to_more short_account_status_url(status.account.username, status, since_descendant_thread_id: @max_descendant_thread_id - 1)
+      = link_to_newer short_account_status_url(status.account.username, status, since_descendant_thread_id: @max_descendant_thread_id - 1)
 
 - if include_threads && !embedded_view? && !user_signed_in?
   .entry{ class: entry_classes }
diff --git a/app/workers/account_deletion_worker.rb b/app/workers/account_deletion_worker.rb
index 0f6be71e1..81c3b91ad 100644
--- a/app/workers/account_deletion_worker.rb
+++ b/app/workers/account_deletion_worker.rb
@@ -5,8 +5,9 @@ class AccountDeletionWorker
 
   sidekiq_options queue: 'pull'
 
-  def perform(account_id)
-    DeleteAccountService.new.call(Account.find(account_id), reserve_username: true, reserve_email: false)
+  def perform(account_id, options = {})
+    reserve_username = options.with_indifferent_access.fetch(:reserve_username, true)
+    DeleteAccountService.new.call(Account.find(account_id), reserve_username: reserve_username, reserve_email: false)
   rescue ActiveRecord::RecordNotFound
     true
   end
diff --git a/app/workers/poll_expiration_notify_worker.rb b/app/workers/poll_expiration_notify_worker.rb
index 8a12fc075..f0191d479 100644
--- a/app/workers/poll_expiration_notify_worker.rb
+++ b/app/workers/poll_expiration_notify_worker.rb
@@ -15,7 +15,7 @@ class PollExpirationNotifyWorker
     end
 
     # Notify local voters
-    poll.votes.includes(:account).map(&:account).select(&:local?).each do |account|
+    poll.votes.includes(:account).group(:account_id).select(:account_id).map(&:account).select(&:local?).each do |account|
       NotifyService.new.call(account, :poll, poll)
     end
   rescue ActiveRecord::RecordNotFound