about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md16
-rw-r--r--Gemfile2
-rw-r--r--Gemfile.lock4
-rw-r--r--app/controllers/api/web/embeds_controller.rb16
-rw-r--r--app/controllers/tags_controller.rb10
-rw-r--r--app/javascript/flavours/glitch/components/status_action_bar.js2
-rw-r--r--app/javascript/flavours/glitch/features/status/components/action_bar.js5
-rw-r--r--app/javascript/flavours/glitch/styles/components/announcements.scss7
-rw-r--r--app/javascript/mastodon/components/status_action_bar.js2
-rw-r--r--app/javascript/mastodon/features/status/components/action_bar.js6
-rw-r--r--app/javascript/mastodon/locales/ar.json6
-rw-r--r--app/javascript/mastodon/locales/ast.json58
-rw-r--r--app/javascript/mastodon/locales/ca.json4
-rw-r--r--app/javascript/mastodon/locales/cy.json6
-rw-r--r--app/javascript/mastodon/locales/gl.json24
-rw-r--r--app/javascript/mastodon/locales/id.json2
-rw-r--r--app/javascript/mastodon/locales/kab.json18
-rw-r--r--app/javascript/mastodon/locales/pl.json18
-rw-r--r--app/javascript/mastodon/locales/sk.json6
-rw-r--r--app/javascript/mastodon/locales/ta.json102
-rw-r--r--app/javascript/styles/mastodon/components.scss7
-rw-r--r--app/lib/formatter.rb2
-rw-r--r--app/lib/sanitize_config.rb39
-rw-r--r--config/locales/ar.yml2
-rw-r--r--config/locales/ast.yml17
-rw-r--r--config/locales/cy.yml1
-rw-r--r--config/locales/devise.kab.yml20
-rw-r--r--config/locales/devise.pl.yml12
-rw-r--r--config/locales/doorkeeper.ast.yml2
-rw-r--r--config/locales/doorkeeper.kab.yml36
-rw-r--r--config/locales/doorkeeper.pl.yml3
-rw-r--r--config/locales/id.yml4
-rw-r--r--config/locales/kab.yml124
-rw-r--r--config/locales/nl.yml6
-rw-r--r--config/locales/pl.yml29
-rw-r--r--config/locales/simple_form.kab.yml19
-rw-r--r--config/locales/simple_form.pl.yml27
-rw-r--r--config/locales/sk.yml7
-rw-r--r--lib/mastodon/version.rb2
-rw-r--r--spec/lib/sanitize_config_spec.rb16
40 files changed, 461 insertions, 228 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fa5b2bfed..84e08341e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,7 @@ Changelog
 
 All notable changes to this project will be documented in this file.
 
-## Unreleased
+## [3.1.0] - 2020-02-09
 ### Added
 
 - Add bookmarks ([ThibG](https://github.com/tootsuite/mastodon/pull/7107), [Gargron](https://github.com/tootsuite/mastodon/pull/12494), [Gomasy](https://github.com/tootsuite/mastodon/pull/12381))
@@ -38,8 +38,9 @@ All notable changes to this project will be documented in this file.
 - Add support for KaiOS arrow navigation to public pages ([nolanlawson](https://github.com/tootsuite/mastodon/pull/12251))
 - Add `discoverable` to accounts in REST API ([trwnh](https://github.com/tootsuite/mastodon/pull/12508))
 - Add admin setting to disable default follows ([ArisuOngaku](https://github.com/tootsuite/mastodon/pull/12566))
-- Add support for LDAP and PAM in the OAuth password grant strategy ([ntl-purism](https://github.com/tootsuite/mastodon/pull/12390))
+- Add support for LDAP and PAM in the OAuth password grant strategy ([ntl-purism](https://github.com/tootsuite/mastodon/pull/12390), [Gargron](https://github.com/tootsuite/mastodon/pull/12743))
 - Allow support for `Accept`/`Reject` activities with a non-embedded object ([puckipedia](https://github.com/tootsuite/mastodon/pull/12199))
+- Add "Show thread" button to public profiles ([Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/13000))
 
 ### Changed
 
@@ -65,6 +66,7 @@ All notable changes to this project will be documented in this file.
 - Change to fallback to to `Create` audience when `object` has no defined audience ([ThibG](https://github.com/tootsuite/mastodon/pull/12249))
 - Change Twemoji library to 12.1.3 in web UI ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/12342))
 - Change blocked users to be hidden from following/followers lists ([ThibG](https://github.com/tootsuite/mastodon/pull/12733))
+- Change signature verification to ignore signatures with invalid host ([Gargron](https://github.com/tootsuite/mastodon/pull/13033))
 
 ### Removed
 
@@ -92,14 +94,13 @@ All notable changes to this project will be documented in this file.
 - Fix old migrations failing because of strong migrations update ([ThibG](https://github.com/tootsuite/mastodon/pull/12787), [ThibG](https://github.com/tootsuite/mastodon/pull/12692))
 - Fix reuse of detailed status components in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12792))
 - Fix base64-encoded file uploads not being possible in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/12748), [Gargron](https://github.com/tootsuite/mastodon/pull/12857))
-- Fix resource_owner_from_credentials in Doorkeeper initializer ([Gargron](https://github.com/tootsuite/mastodon/pull/12743))
 - Fix error due to missing authentication call in filters controller ([Gargron](https://github.com/tootsuite/mastodon/pull/12746))
 - Fix uncaught unknown format error in host meta controller ([Gargron](https://github.com/tootsuite/mastodon/pull/12747))
 - Fix URL search not returning private toots user has access to ([ThibG](https://github.com/tootsuite/mastodon/pull/12742), [ThibG](https://github.com/tootsuite/mastodon/pull/12336))
 - Fix cache digesting log noise on status embeds ([Gargron](https://github.com/tootsuite/mastodon/pull/12750))
 - Fix slowness due to layout thrashing when reloading a large set of statuses in web UI ([panarom](https://github.com/tootsuite/mastodon/pull/12661), [panarom](https://github.com/tootsuite/mastodon/pull/12744), [Gargron](https://github.com/tootsuite/mastodon/pull/12712))
 - Fix error when fetching followers/following from REST API when user has network hidden ([Gargron](https://github.com/tootsuite/mastodon/pull/12716))
-- Fix IDN mentions not being processed, IDN domains not being rendered ([Gargron](https://github.com/tootsuite/mastodon/pull/12715))
+- Fix IDN mentions not being processed, IDN domains not being rendered ([Gargron](https://github.com/tootsuite/mastodon/pull/12715), [Gargron](https://github.com/tootsuite/mastodon/pull/13035), [Gargron](https://github.com/tootsuite/mastodon/pull/13030))
 - Fix error when searching for empty phrase ([Gargron](https://github.com/tootsuite/mastodon/pull/12711))
 - Fix backups stopping due to read timeouts ([chr-1x](https://github.com/tootsuite/mastodon/pull/12281))
 - Fix batch actions on non-pending tags in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/12537))
@@ -152,6 +153,13 @@ All notable changes to this project will be documented in this file.
 - Fix voting issue with remote polls that contain trailing spaces ([ThibG](https://github.com/tootsuite/mastodon/pull/12515))
 - Fix dynamic elements not working in pgHero due to CSP rules ([ykzts](https://github.com/tootsuite/mastodon/pull/12489))
 - Fix overly verbose backtraces when delivering ActivityPub payloads ([zunda](https://github.com/tootsuite/mastodon/pull/12798))
+- Fix rendering `<a>` without `href` when scheme unsupported ([Gargron](https://github.com/tootsuite/mastodon/pull/13040))
+- Fix unfiltered params error when generating ActivityPub tag pagination ([Gargron](https://github.com/tootsuite/mastodon/pull/13049))
+- Fix malformed HTML causing uncaught error ([Gargron](https://github.com/tootsuite/mastodon/pull/13042))
+- Fix native share button not being displayed for unlisted toots ([ThibG](https://github.com/tootsuite/mastodon/pull/13045))
+- Fix remote convertible media attachments (e.g. GIFs) not being saved ([Gargron](https://github.com/tootsuite/mastodon/pull/13032))
+- Fix account query not using faster index ([abcang](https://github.com/tootsuite/mastodon/pull/13016))
+- Fix error when sending moderation notification ([renatolond](https://github.com/tootsuite/mastodon/pull/13014))
 
 ### Security
 
diff --git a/Gemfile b/Gemfile
index 8d3fe095b..8a36db08d 100644
--- a/Gemfile
+++ b/Gemfile
@@ -61,7 +61,7 @@ gem 'htmlentities', '~> 4.3'
 gem 'http', '~> 4.3'
 gem 'http_accept_language', '~> 2.1'
 gem 'http_parser.rb', '~> 0.6', git: 'https://github.com/tmm1/http_parser.rb', ref: '54b17ba8c7d8d20a16dfc65d1775241833219cf2', submodules: true
-gem 'httplog', '~> 1.4.1'
+gem 'httplog', '~> 1.4.2'
 gem 'idn-ruby', require: 'idn'
 gem 'kaminari', '~> 1.1'
 gem 'link_header', '~> 0.0'
diff --git a/Gemfile.lock b/Gemfile.lock
index f5076302e..e33748197 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -284,7 +284,7 @@ GEM
     http-parser (1.2.1)
       ffi-compiler (>= 1.0, < 2.0)
     http_accept_language (2.1.1)
-    httplog (1.4.1)
+    httplog (1.4.2)
       rack (>= 1.0)
       rainbow (>= 2.0.0)
     i18n (1.8.2)
@@ -713,7 +713,7 @@ DEPENDENCIES
   http (~> 4.3)
   http_accept_language (~> 2.1)
   http_parser.rb (~> 0.6)!
-  httplog (~> 1.4.1)
+  httplog (~> 1.4.2)
   i18n-tasks (~> 0.9)
   idn-ruby
   iso-639
diff --git a/app/controllers/api/web/embeds_controller.rb b/app/controllers/api/web/embeds_controller.rb
index 6231733b7..4aa31695c 100644
--- a/app/controllers/api/web/embeds_controller.rb
+++ b/app/controllers/api/web/embeds_controller.rb
@@ -7,15 +7,21 @@ class Api::Web::EmbedsController < Api::Web::BaseController
 
   def create
     status = StatusFinder.new(params[:url]).status
+
+    return not_found if status.hidden?
+
     render json: status, serializer: OEmbedSerializer, width: 400
   rescue ActiveRecord::RecordNotFound
     oembed = FetchOEmbedService.new.call(params[:url])
-    oembed[:html] = Formatter.instance.sanitize(oembed[:html], Sanitize::Config::MASTODON_OEMBED) if oembed[:html].present?
 
-    if oembed
-      render json: oembed
-    else
-      render json: {}, status: :not_found
+    return not_found if oembed.nil?
+
+    begin
+      oembed[:html] = Formatter.instance.sanitize(oembed[:html], Sanitize::Config::MASTODON_OEMBED)
+    rescue ArgumentError
+      return not_found
     end
+
+    render json: oembed
   end
 end
diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb
index ef61c980f..c59446efc 100644
--- a/app/controllers/tags_controller.rb
+++ b/app/controllers/tags_controller.rb
@@ -25,7 +25,7 @@ class TagsController < ApplicationController
       format.rss do
         expires_in 0, public: true
 
-        @statuses = HashtagQueryService.new.call(@tag, params.slice(:any, :all, :none)).limit(PAGE_SIZE)
+        @statuses = HashtagQueryService.new.call(@tag, filter_params).limit(PAGE_SIZE)
         @statuses = cache_collection(@statuses, Status)
 
         render xml: RSS::TagSerializer.render(@tag, @statuses)
@@ -34,7 +34,7 @@ class TagsController < ApplicationController
       format.json do
         expires_in 3.minutes, public: public_fetch_mode?
 
-        @statuses = HashtagQueryService.new.call(@tag, params.slice(:any, :all, :none), current_account, params[:local]).paginate_by_max_id(PAGE_SIZE, params[:max_id])
+        @statuses = HashtagQueryService.new.call(@tag, filter_params, current_account, params[:local]).paginate_by_max_id(PAGE_SIZE, params[:max_id])
         @statuses = cache_collection(@statuses, Status)
 
         render json: collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json'
@@ -58,10 +58,14 @@ class TagsController < ApplicationController
 
   def collection_presenter
     ActivityPub::CollectionPresenter.new(
-      id: tag_url(@tag, params.slice(:any, :all, :none)),
+      id: tag_url(@tag, filter_params),
       type: :ordered,
       size: @tag.statuses.count,
       items: @statuses.map { |s| ActivityPub::TagManager.instance.uri_for(s) }
     )
   end
+
+  def filter_params
+    params.slice(:any, :all, :none).permit(:any, :all, :none)
+  end
 end
diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js
index 60b370622..0a481c816 100644
--- a/app/javascript/flavours/glitch/components/status_action_bar.js
+++ b/app/javascript/flavours/glitch/components/status_action_bar.js
@@ -265,7 +265,7 @@ class StatusActionBar extends ImmutablePureComponent {
       replyTitle = intl.formatMessage(messages.replyAll);
     }
 
-    const shareButton = ('share' in navigator) && status.get('visibility') === 'public' && (
+    const shareButton = ('share' in navigator) && publicStatus && (
       <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.share)} icon='share-alt' onClick={this.handleShareClick} />
     );
 
diff --git a/app/javascript/flavours/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js
index d71a3ae08..bb53f9288 100644
--- a/app/javascript/flavours/glitch/features/status/components/action_bar.js
+++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js
@@ -188,7 +188,7 @@ class ActionBar extends React.PureComponent {
       }
     }
 
-    const shareButton = ('share' in navigator) && status.get('visibility') === 'public' && (
+    const shareButton = ('share' in navigator) && publicStatus && (
       <div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.share)} icon='share-alt' onClick={this.handleShare} /></div>
     );
 
@@ -196,13 +196,12 @@ class ActionBar extends React.PureComponent {
     //if (status.get('visibility') === 'direct') reblogIcon = 'envelope';
     // else if (status.get('visibility') === 'private') reblogIcon = 'lock';
 
-    let reblog_disabled = (status.get('visibility') === 'direct' || (status.get('visibility') === 'private' && me !== status.getIn(['account', 'id'])));
     let reblog_message  = status.get('visibility') === 'private' ? messages.reblog_private : messages.reblog;
 
     return (
       <div className='detailed-status__action-bar'>
         <div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.reply)} icon={status.get('in_reply_to_id', null) === null ? 'reply' : 'reply-all'} onClick={this.handleReplyClick} /></div>
-        <div className='detailed-status__button'><IconButton disabled={reblog_disabled} active={status.get('reblogged')} title={reblog_disabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(reblog_message)} icon={reblogIcon} onClick={this.handleReblogClick} /></div>
+        <div className='detailed-status__button'><IconButton disabled={!publicStatus} active={status.get('reblogged')} title={!publicStatus ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(reblog_message)} icon={reblogIcon} onClick={this.handleReblogClick} /></div>
         <div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /></div>
         {shareButton}
         <div className='detailed-status__button'><IconButton className='bookmark-icon' active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /></div>
diff --git a/app/javascript/flavours/glitch/styles/components/announcements.scss b/app/javascript/flavours/glitch/styles/components/announcements.scss
index ac4c199cd..eab6c728b 100644
--- a/app/javascript/flavours/glitch/styles/components/announcements.scss
+++ b/app/javascript/flavours/glitch/styles/components/announcements.scss
@@ -84,14 +84,13 @@
 
     &__unread {
       position: absolute;
-      top: 15px;
-      right: 15px;
-      display: inline-block;
+      top: 19px;
+      right: 19px;
+      display: block;
       background: $highlight-text-color;
       border-radius: 50%;
       width: 0.625rem;
       height: 0.625rem;
-      margin: 0 .15em;
     }
   }
 
diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js
index 4b3c79d0d..e2c8d43c9 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/mastodon/components/status_action_bar.js
@@ -319,7 +319,7 @@ class StatusActionBar extends ImmutablePureComponent {
       replyTitle = intl.formatMessage(messages.replyAll);
     }
 
-    const shareButton = ('share' in navigator) && status.get('visibility') === 'public' && (
+    const shareButton = ('share' in navigator) && publicStatus && (
       <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.share)} icon='share-alt' onClick={this.handleShareClick} />
     );
 
diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js
index 657d2bb1c..959774da4 100644
--- a/app/javascript/mastodon/features/status/components/action_bar.js
+++ b/app/javascript/mastodon/features/status/components/action_bar.js
@@ -250,7 +250,7 @@ class ActionBar extends React.PureComponent {
       }
     }
 
-    const shareButton = ('share' in navigator) && status.get('visibility') === 'public' && (
+    const shareButton = ('share' in navigator) && publicStatus && (
       <div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.share)} icon='share-alt' onClick={this.handleShare} /></div>
     );
 
@@ -265,12 +265,10 @@ class ActionBar extends React.PureComponent {
     if (status.get('visibility') === 'direct') reblogIcon = 'envelope';
     else if (status.get('visibility') === 'private') reblogIcon = 'lock';
 
-    let reblog_disabled = (status.get('visibility') === 'direct' || status.get('visibility') === 'private');
-
     return (
       <div className='detailed-status__action-bar'>
         <div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.reply)} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} /></div>
-        <div className='detailed-status__button'><IconButton disabled={reblog_disabled} active={status.get('reblogged')} title={reblog_disabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} /></div>
+        <div className='detailed-status__button'><IconButton disabled={!publicStatus} active={status.get('reblogged')} title={!publicStatus ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} /></div>
         <div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /></div>
         {shareButton}
         <div className='detailed-status__button'><IconButton className='bookmark-icon' active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /></div>
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 596ebc051..c71212b85 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -184,8 +184,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 {# يوم} other {# أيام}}",
   "intervals.full.hours": "{number, plural, one {# ساعة} other {# ساعات}}",
   "intervals.full.minutes": "{number, plural, one {# دقيقة} other {# دقائق}}",
@@ -335,7 +335,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": "هذا الحساب ينتمي إلى خادوم آخَر. هل تودّ إرسال نسخة مجهولة مِن التقرير إلى هنالك أيضًا؟",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 8a2657792..8006a1306 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -29,14 +29,14 @@
   "account.never_active": "Enxamás",
   "account.posts": "Barritos",
   "account.posts_with_replies": "Barritos y rempuestes",
-  "account.report": "Informar de @{name}",
+  "account.report": "Report @{name}",
   "account.requested": "Esperando pola aprobación. Calca pa encaboxar la solicitú de siguimientu",
   "account.share": "Share @{name}'s profile",
-  "account.show_reblogs": "Show boosts from @{name}",
+  "account.show_reblogs": "Amosar les comparticiones de @{name}",
   "account.unblock": "Desbloquiar a @{name}",
   "account.unblock_domain": "Amosar {domain}",
   "account.unendorse": "Nun destacar nel perfil",
-  "account.unfollow": "Unfollow",
+  "account.unfollow": "Dexar de siguir",
   "account.unmute": "Unmute @{name}",
   "account.unmute_notifications": "Unmute notifications from @{name}",
   "alert.rate_limited.message": "Please retry after {retry_time, time, medium}.",
@@ -84,7 +84,7 @@
   "compose_form.poll.add_option": "Amestar una escoyeta",
   "compose_form.poll.duration": "Poll duration",
   "compose_form.poll.option_placeholder": "Escoyeta {number}",
-  "compose_form.poll.remove_option": "Remove this choice",
+  "compose_form.poll.remove_option": "Desaniciar esta escoyeta",
   "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
   "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
   "compose_form.publish": "Barritar",
@@ -96,30 +96,30 @@
   "compose_form.spoiler.unmarked": "El testu nun va anubrise",
   "compose_form.spoiler_placeholder": "Escribi equí l'alvertencia",
   "confirmation_modal.cancel": "Encaboxar",
-  "confirmations.block.block_and_report": "Block & Report",
-  "confirmations.block.confirm": "Block",
+  "confirmations.block.block_and_report": "Bloquiar ya informar",
+  "confirmations.block.confirm": "Bloquiar",
   "confirmations.block.message": "¿De xuru que quies bloquiar a {name}?",
-  "confirmations.delete.confirm": "Delete",
+  "confirmations.delete.confirm": "Desaniciar",
   "confirmations.delete.message": "¿De xuru que quies desaniciar esti estáu?",
   "confirmations.delete_list.confirm": "Desaniciar",
   "confirmations.delete_list.message": "¿De xuru que quies desaniciar dafechu esta llista?",
   "confirmations.domain_block.confirm": "Anubrir tol dominiu",
-  "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.domain_block.message": "¿De xuru xurísimu que quies bloquiar el dominiu {domain} enteru? Na mayoría de casos bloquiar o silenciar dalguna cuenta ye abondo y preferible. Nun vas ver el conteníu d'esi dominiu en nenguna llinia temporal pública o nos avisos, y van desanciase los tos siguidores d'esi dominiu.",
+  "confirmations.logout.confirm": "Zarrar sesión",
+  "confirmations.logout.message": "¿De xuru que quies zarrar la sesión?",
+  "confirmations.mute.confirm": "Silenciar",
+  "confirmations.mute.explanation": "Esto va anubrir los espublizamientos y les sos menciones pero entá va permiti-yos ver los tos espublizamientos y siguite.",
   "confirmations.mute.message": "¿De xuru que quies silenciar a {name}?",
   "confirmations.redraft.confirm": "Desaniciar y reeditar",
   "confirmations.redraft.message": "¿De xuru que quies desaniciar esti estáu y reeditalu? Van perdese los favoritos y comparticiones, y les rempuestes al toot orixinal van quedar güérfanes.",
-  "confirmations.reply.confirm": "Reply",
-  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
-  "confirmations.unfollow.confirm": "Unfollow",
+  "confirmations.reply.confirm": "Responder",
+  "confirmations.reply.message": "Responder agora va sobrescribir el mensaxe que tas componiendo anguaño. ¿De xuru que quies siguir?",
+  "confirmations.unfollow.confirm": "Dexar de siguir",
   "confirmations.unfollow.message": "¿De xuru que quies dexar de siguir a {name}?",
   "conversation.delete": "Delete conversation",
   "conversation.mark_as_read": "Mark as read",
   "conversation.open": "View conversation",
-  "conversation.with": "With {names}",
+  "conversation.with": "Con {names}",
   "directory.federated": "Dende'l fediversu",
   "directory.local": "Dende {domain} namái",
   "directory.new_arrivals": "Cuentes nueves",
@@ -142,21 +142,21 @@
   "emoji_button.travel": "Viaxes y llugares",
   "empty_column.account_timeline": "¡Equí nun hai barritos!",
   "empty_column.account_unavailable": "Profile unavailable",
-  "empty_column.blocks": "Entá nun bloquiesti a dengún usuariu.",
+  "empty_column.blocks": "Entá nun bloquiesti a nunengún usuariu.",
   "empty_column.bookmarked_statuses": "Entá nun tienes nengún barritu en Marcadores. Cuando amiestes unu, va amosase equí.",
   "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
-  "empty_column.direct": "Entá nun tienes dengún mensaxe direutu. Cuando unvies o recibas dalgún, va apaecer equí.",
+  "empty_column.direct": "Entá nun tienes nunengún mensaxe direutu. Cuando unvies o recibas dalgún, va apaecer equí.",
   "empty_column.domain_blocks": "Entá nun hai dominios anubríos.",
   "empty_column.favourited_statuses": "Entá nun tienes nengún barritu en Favoritos. Cuando amiestes unu, va amosase equí.",
   "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
-  "empty_column.follow_requests": "Entá nun tienes denguna solicitú de siguimientu. Cuando recibas una, va amosase equí.",
+  "empty_column.follow_requests": "Entá nun tienes nenguna solicitú de siguimientu. Cuando recibas una, va amosase equí.",
   "empty_column.hashtag": "Entá nun hai nada nesta etiqueta.",
   "empty_column.home": "¡Tienes la llinia temporal balera! Visita {public} o usa la gueta pa entamar y conocer a otros usuarios.",
   "empty_column.home.public_timeline": "la llinia temporal pública",
   "empty_column.list": "Entá nun hai nada nesta llista. Cuando los miembros d'esta llista espublicen estaos nuevos, van apaecer equí.",
-  "empty_column.lists": "Entá nun tienes denguna llista. Cuando crees una, va amosase equí.",
-  "empty_column.mutes": "Entá nun silenciesti a dengún usuariu.",
-  "empty_column.notifications": "Entá nun tienes dengún avisu. Interactúa con otros p'aniciar la conversación.",
+  "empty_column.lists": "Entá nun tienes nunenguna llista. Cuando crees una, va amosase equí.",
+  "empty_column.mutes": "Entá nun silenciesti a nunengún usuariu.",
+  "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.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.",
@@ -189,7 +189,7 @@
   "intervals.full.days": "{number, plural, one {# día} other {# díes}}",
   "intervals.full.hours": "{number, plural, one {# hora} other {# hores}}",
   "intervals.full.minutes": "{number, plural, one {# minutu} other {# minutos}}",
-  "introduction.federation.action": "Next",
+  "introduction.federation.action": "Siguiente",
   "introduction.federation.federated.headline": "Federated",
   "introduction.federation.federated.text": "Los espublizamientos públicos de los demás sirvidores del fediversu van apaecer na llinia temporal federada.",
   "introduction.federation.home.headline": "Home",
@@ -198,12 +198,12 @@
   "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
   "introduction.interactions.action": "¡Finar el tutorial!",
   "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
+  "introduction.interactions.favourite.text": "Pues guardar un barritu pa dempués y facer que l'autor sepa que te prestó marcándolu como favoritu.",
   "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.action": "¡Vamos!",
   "introduction.welcome.headline": "Primeros pasos",
   "introduction.welcome.text": "¡Afáyate nel fediversu! Nun momentu vas ser a tresmitir mensaxes y falar colos collacios d'una montonera de sirvidores. Pero esti sirvidor, {domain}, ye especial: agospia'l to perfil, asina qu'alcuérdate de cómo se llama.",
   "keyboard_shortcuts.back": "pa dir p'atrás",
@@ -316,8 +316,8 @@
   "poll.total_votes": "{count, plural, one {# votu} other {# votos}}",
   "poll.vote": "Vote",
   "poll.voted": "You voted for this answer",
-  "poll_button.add_poll": "Add a poll",
-  "poll_button.remove_poll": "Remove poll",
+  "poll_button.add_poll": "Amestar una encuesta",
+  "poll_button.remove_poll": "Desaniciar la encuesta",
   "privacy.change": "Adjust status privacy",
   "privacy.direct.long": "Post to mentioned users only",
   "privacy.direct.short": "Direct",
@@ -341,7 +341,7 @@
   "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
   "report.hint": "L'informe va unviase a los llendadores del to sirvidor. Embaxo, pues desplicar por qué informes d'esta cuenta:",
   "report.placeholder": "Comentarios adicionales",
-  "report.submit": "Submit",
+  "report.submit": "Unviar",
   "report.target": "Report {target}",
   "search.placeholder": "Guetar",
   "search_popout.search_format": "Formatu de gueta avanzada",
@@ -362,7 +362,7 @@
   "status.cancel_reblog_private": "Dexar de compartir",
   "status.cannot_reblog": "Esti artículu nun pue compartise",
   "status.copy": "Copiar l'enllaz al estáu",
-  "status.delete": "Delete",
+  "status.delete": "Desaniciar",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Unviar un mensaxe direutu a @{name}",
   "status.embed": "Empotrar",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 11092a133..f55420793 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -158,8 +158,8 @@
   "empty_column.mutes": "Encara no has silenciat cap usuari.",
   "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 no podria ser mostrada correctament.",
-  "error.unexpected_crash.next_steps": "Prova recarregant la pàgina. Si això no ajuda encara pots ser capaç d'utilitzar Mastodont a través d'un navegador diferent o app nativa.",
+  "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.",
   "errors.unexpected_crash.copy_stacktrace": "Còpia stacktrace al porta-retalls",
   "errors.unexpected_crash.report_issue": "Informa d'un problema",
   "follow_request.authorize": "Autoritzar",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index 890baec0b..0d535cbc2 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -184,8 +184,8 @@
   "home.column_settings.basic": "Syml",
   "home.column_settings.show_reblogs": "Dangos bŵstiau",
   "home.column_settings.show_replies": "Dangos ymatebion",
-  "home.hide_announcements": "Hide announcements",
-  "home.show_announcements": "Show announcements",
+  "home.hide_announcements": "Cuddio cyhoeddiadau",
+  "home.show_announcements": "Dangos cyhoeddiadau",
   "intervals.full.days": "{number, plural, one {# ddydd} other {# o ddyddiau}}",
   "intervals.full.hours": "{number, plural, one {# awr} other {# o oriau}}",
   "intervals.full.minutes": "{number, plural, one {# funud} other {# o funudau}}",
@@ -335,7 +335,7 @@
   "relative_time.just_now": "nawr",
   "relative_time.minutes": "{number}munud",
   "relative_time.seconds": "{number}eiliad",
-  "relative_time.today": "today",
+  "relative_time.today": "heddiw",
   "reply_indicator.cancel": "Canslo",
   "report.forward": "Ymlaen i {target}",
   "report.forward_hint": "Mae'r cyfrif o weinydd arall. Anfon copi anhysbys o'r adroddiad yno hefyd?",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 798557200..76657cdde 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -72,7 +72,7 @@
   "column_header.moveRight_settings": "Mover columna cara a dereita",
   "column_header.pin": "Fixar",
   "column_header.show_settings": "Amosar axustes",
-  "column_header.unpin": "Desafixar",
+  "column_header.unpin": "Desapegar",
   "column_subheading.settings": "Axustes",
   "community.column_settings.media_only": "Só multimedia",
   "compose_form.direct_message_warning": "Este toot só será enviado ás usuarias mencionadas.",
@@ -118,7 +118,7 @@
   "confirmations.unfollow.message": "Desexas deixar de seguir a {name}?",
   "conversation.delete": "Eliminar conversa",
   "conversation.mark_as_read": "Marcar como lido",
-  "conversation.open": "Ollar conversa",
+  "conversation.open": "Ver conversa",
   "conversation.with": "Con {names}",
   "directory.federated": "Do fediverso coñecido",
   "directory.local": "Só de {domain}",
@@ -129,7 +129,7 @@
   "emoji_button.activity": "Actividade",
   "emoji_button.custom": "Personalizado",
   "emoji_button.flags": "Bandeiras",
-  "emoji_button.food": "Comida e bebida",
+  "emoji_button.food": "Comida e Bebida",
   "emoji_button.label": "Inserir emoticona",
   "emoji_button.nature": "Natureza",
   "emoji_button.not_found": "Non hai emoticonas!! (╯°□°)╯︵ ┻━┻",
@@ -139,11 +139,11 @@
   "emoji_button.search": "Procurar...",
   "emoji_button.search_results": "Resultados da procura",
   "emoji_button.symbols": "Símbolos",
-  "emoji_button.travel": "Viaxes e lugares",
+  "emoji_button.travel": "Viaxes e Lugares",
   "empty_column.account_timeline": "Non hai toots aquí!",
-  "empty_column.account_unavailable": "Perfil non dispoñíbel",
+  "empty_column.account_unavailable": "Perfil non dispoñible",
   "empty_column.blocks": "Aínda non bloqueaches a ningún usuaria.",
-  "empty_column.bookmarked_statuses": "Aínda non marcaches ningún toot. Cando o fagas, amosaranse aquí.",
+  "empty_column.bookmarked_statuses": "Aínda non marcaches ningún toot. Cando o fagas, aparecerán aquí.",
   "empty_column.community": "A cronoloxía local está baleira. Escribe algo de xeito público para espallalo!",
   "empty_column.direct": "Aínda non tes mensaxes directas. Cando envíes ou recibas unha, amosarase aquí.",
   "empty_column.domain_blocks": "Aínda non hai dominios agochados.",
@@ -165,7 +165,7 @@
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rexeitar",
   "getting_started.developers": "Desenvolvedores",
-  "getting_started.directory": "Directorio do perfil",
+  "getting_started.directory": "Directorio local",
   "getting_started.documentation": "Documentación",
   "getting_started.heading": "Primeiros pasos",
   "getting_started.invite": "Convidar persoas",
@@ -223,13 +223,13 @@
   "keyboard_shortcuts.hotkey": "Tecla de atallo",
   "keyboard_shortcuts.legend": "para amosar esta lenda",
   "keyboard_shortcuts.local": "para abrir a cronoloxía local",
-  "keyboard_shortcuts.mention": "para mencionar ó autor",
+  "keyboard_shortcuts.mention": "para mencionar a autora",
   "keyboard_shortcuts.muted": "abrir lista de usuarias acaladas",
   "keyboard_shortcuts.my_profile": "para abrir o teu perfil",
   "keyboard_shortcuts.notifications": "para abrir a columna das notificacións",
   "keyboard_shortcuts.open_media": "para abrir o contido multimedia",
   "keyboard_shortcuts.pinned": "para abrir a listaxe dos toots fixados",
-  "keyboard_shortcuts.profile": "para abrir o perfil do autor",
+  "keyboard_shortcuts.profile": "para abrir o perfil da autora",
   "keyboard_shortcuts.reply": "para responder",
   "keyboard_shortcuts.requests": "para abrir a listaxe das peticións de seguimento",
   "keyboard_shortcuts.search": "para destacar a procura",
@@ -313,7 +313,7 @@
   "poll.closed": "Pechado",
   "poll.refresh": "Actualizar",
   "poll.total_people": "{count, plural,one {# persoa}other {# persoas}}",
-  "poll.total_votes": "{count, plural, one {# voto} outros {# votos}}",
+  "poll.total_votes": "{count, plural, one {# voto} other {# votos}}",
   "poll.vote": "Votar",
   "poll.voted": "Votaches por esta opción",
   "poll_button.add_poll": "Engadir unha enquisa",
@@ -357,14 +357,14 @@
   "search_results.total": "{count, number} {count, plural, one {resultado} other {resultados}}",
   "status.admin_account": "Abrir interface de moderación para @{name}",
   "status.admin_status": "Abrir este estado na interface de moderación",
-  "status.block": "Bloquear @{name}",
+  "status.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.delete": "Eliminar",
   "status.detailed_status": "Vista detallada da conversa",
-  "status.direct": "Mensaxe directa @{name}",
+  "status.direct": "Mensaxe directa a @{name}",
   "status.embed": "Embeber nunha web",
   "status.favourite": "Favorito",
   "status.filtered": "Filtrado",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 8cf3f3e58..98d0af510 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "Batasan tingkat",
   "alert.unexpected.message": "Terjadi kesalahan yang tidak terduga.",
   "alert.unexpected.title": "Oops!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Pengumuman",
   "autosuggest_hashtag.per_week": "{count} per minggu",
   "boost_modal.combo": "Anda dapat menekan {combo} untuk melewati ini",
   "bundle_column_error.body": "Kesalahan terjadi saat memuat komponen ini.",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index d73110508..e78b4cc4f 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -28,7 +28,7 @@
   "account.muted": "Yettwasgugem",
   "account.never_active": "Werǧin",
   "account.posts": "Tijewwaqin",
-  "account.posts_with_replies": "Tibarraḥin d tririyin",
+  "account.posts_with_replies": "Tijewwaqin akked tririyin",
   "account.report": "Sewɛed @{name}",
   "account.requested": "Di laɛḍil ad yettwaqbel. Ssit iwakken ad yefsex usuter n weḍfar",
   "account.share": "Bḍu amaγnu n @{name}",
@@ -41,7 +41,7 @@
   "account.unmute_notifications": "Serreḥ ilγa sγur @{name}",
   "alert.rate_limited.message": "Ma ulac aγilif ɛreḍ tikelt-nniḍen mbeɛd {retry_time, time, medium}.",
   "alert.rate_limited.title": "Aktum s talast",
-  "alert.unexpected.message": "Tella-d tuccḍa i ɣef ur nedmi ara.",
+  "alert.unexpected.message": "Tella-d tuccḍa i γef ur nedmi ara.",
   "alert.unexpected.title": "Ayhuh!",
   "announcement.announcement": "Ulγu",
   "autosuggest_hashtag.per_week": "{count} i yimalas",
@@ -109,18 +109,18 @@
   "confirmations.logout.message": "D tidet tebγiḍ ad teffγeḍ?",
   "confirmations.mute.confirm": "Sgugem",
   "confirmations.mute.explanation": "Aya ad yeffer iznan-is d wid i deg d-yettwabder neγ d-tettwabder, maca xas akka yezmer neγ tezmer awali n yiznan-inek d uḍfaṛ-ik.",
-  "confirmations.mute.message": "Tetḥeqqeḍ belli tebγiḍ asɛuggen n {name}?",
+  "confirmations.mute.message": "Tetḥeqqeḍ belli tebγiḍ ad ttegugmeḍ {name}?",
   "confirmations.redraft.confirm": "Sfeḍ & Ɛiwed tira",
   "confirmations.redraft.message": "Tetḥeqqeḍ belli tebγiḍ tuksa n waddad-agi iwakken ad s-tɛiwdeḍ tira? Ismenyifen d beḍḍuwat ad ṛuḥen, ma d tiririyin-is ad uγalent d tigujilin.",
   "confirmations.reply.confirm": "Err",
   "confirmations.reply.message": "Tiririt akka tura ad k-degger izen-agi i tettaruḍ. Tebγiḍ ad tkemmleḍ?",
   "confirmations.unfollow.confirm": "Ur ḍḍafaṛ ara",
-  "confirmations.unfollow.message": "Tetḥeqqeḍ belli tebγiḍ ur teḍḍafaṛeḍ ara {name}?",
+  "confirmations.unfollow.message": "Tetḥeqqeḍ belli tebγiḍ ur teṭafaṛeḍ ara {name}?",
   "conversation.delete": "Sfeḍ adiwenni",
   "conversation.mark_as_read": "Creḍ yettwaγṛa",
   "conversation.open": "Sken adiwenni",
   "conversation.with": "Akked {names}",
-  "directory.federated": "Seg fedivers yettwasnen",
+  "directory.federated": "Deg fedivers yettwasnen",
   "directory.local": "Seg {domain} kan",
   "directory.new_arrivals": "Imaynuten id yewḍen",
   "directory.recently_active": "Yermed xas melmi kan",
@@ -205,7 +205,7 @@
   "introduction.interactions.reply.text": "Tzemreḍ ad terreḍ γef tjewwakin-ik d tid n medden-nniḍen, d acu ara tent-id-iɛeqden ta deffir ta deg yiwen udiwenni.",
   "introduction.welcome.action": "Bdu!",
   "introduction.welcome.headline": "Isurifen imenza",
-  "introduction.welcome.text": "Anṣuf γer fediverse! Deg kra n yimiren, ad tizmireḍ ad tzzuzreḍ iznan neɣ ad tmeslayeḍ i yemddukkal deg waṭas n yiqeddacen. Maca aqeddac-agi, {domain}, mačči am wiyaḍ - deg-s i yella umaγnu-ik, ihi cfu γef yisem-is.",
+  "introduction.welcome.text": "Anṣuf γer fediverse! Deg kra n yimiren, ad tizmireḍ ad tzzuzreḍ iznan neγ ad tmeslayeḍ i yemddukkal deg waṭas n yiqeddacen. Maca aqeddac-agi, {domain}, mačči am wiyaḍ - deg-s i yella umaγnu-ik, ihi cfu γef yisem-is.",
   "keyboard_shortcuts.back": "uγal ar deffir",
   "keyboard_shortcuts.blocked": "akken ad teldiḍ tabdert n yimseqdacen yettwasḥebsen",
   "keyboard_shortcuts.boost": "i beṭṭu tikelt-nniḍen",
@@ -412,8 +412,8 @@
   "trends.count_by_accounts": "{count} {rawCount, plural, one {n umdan} other {n yemdanen}} i yettmeslayen",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Arewway-ik·im ad iruḥ ma yella tefeγ-ed deg Maṣṭudun.",
-  "upload_area.title": "Drag & drop to upload",
-  "upload_button.label": "Add media ({formats})",
+  "upload_area.title": "Zuḥeb rnu sers i tasalyt",
+  "upload_button.label": "Rnu Taγwalt ({formats})",
   "upload_error.limit": "File upload limit exceeded.",
   "upload_error.poll": "File upload not allowed with polls.",
   "upload_form.audio_description": "Glem-d i yemdanen i yesɛan ugur deg tmesliwt",
@@ -427,7 +427,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.preview_label": "Preview ({ratio})",
+  "upload_modal.preview_label": "Taskant ({ratio})",
   "upload_progress.label": "Asali iteddu...",
   "video.close": "Mdel tabidyutt",
   "video.download": "Sidered afaylu",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 9d119902a..9d9eaa769 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -1,7 +1,7 @@
 {
   "account.add_or_remove_from_list": "Dodaj lub usuń z list",
   "account.badges.bot": "Bot",
-  "account.badges.group": "Group",
+  "account.badges.group": "Grupa",
   "account.block": "Blokuj @{name}",
   "account.block_domain": "Blokuj wszystko z {domain}",
   "account.blocked": "Zablokowany(-a)",
@@ -43,7 +43,7 @@
   "alert.rate_limited.title": "Ograniczony czasowo",
   "alert.unexpected.message": "Wystąpił nieoczekiwany błąd.",
   "alert.unexpected.title": "O nie!",
-  "announcement.announcement": "Announcement",
+  "announcement.announcement": "Ogłoszenie",
   "autosuggest_hashtag.per_week": "{count} co tydzień",
   "boost_modal.combo": "Naciśnij {combo}, aby pominąć to następnym razem",
   "bundle_column_error.body": "Coś poszło nie tak podczas ładowania tego składnika.",
@@ -89,8 +89,8 @@
   "compose_form.poll.duration": "Czas trwania głosowania",
   "compose_form.poll.option_placeholder": "Opcja {number}",
   "compose_form.poll.remove_option": "Usuń tę opcję",
-  "compose_form.poll.switch_to_multiple": "Change poll to allow multiple choices",
-  "compose_form.poll.switch_to_single": "Change poll to allow for a single choice",
+  "compose_form.poll.switch_to_multiple": "Pozwól na wybranie wielu opcji",
+  "compose_form.poll.switch_to_single": "Pozwól na wybranie tylko jednej opcji",
   "compose_form.publish": "Wyślij",
   "compose_form.publish_loud": "{publish}!",
   "compose_form.sensitive.hide": "Oznacz multimedia jako wrażliwe",
@@ -188,8 +188,8 @@
   "home.column_settings.basic": "Podstawowe",
   "home.column_settings.show_reblogs": "Pokazuj podbicia",
   "home.column_settings.show_replies": "Pokazuj odpowiedzi",
-  "home.hide_announcements": "Hide announcements",
-  "home.show_announcements": "Show announcements",
+  "home.hide_announcements": "Ukryj ogłoszenia",
+  "home.show_announcements": "Pokaż ogłoszenia",
   "intervals.full.days": "{number, plural, one {# dzień} few {# dni} many {# dni} other {# dni}}",
   "intervals.full.hours": "{number, plural, one {# godzina} few {# godziny} many {# godzin} other {# godzin}}",
   "intervals.full.minutes": "{number, plural, one {# minuta} few {# minuty} many {# minut} other {# minut}}",
@@ -340,7 +340,7 @@
   "relative_time.just_now": "teraz",
   "relative_time.minutes": "{number} min.",
   "relative_time.seconds": "{number} s.",
-  "relative_time.today": "today",
+  "relative_time.today": "dzisiaj",
   "reply_indicator.cancel": "Anuluj",
   "report.forward": "Przekaż na {target}",
   "report.forward_hint": "To konto znajduje się na innej instancji. Czy chcesz wysłać anonimową kopię zgłoszenia rnież na nią?",
@@ -421,11 +421,11 @@
   "upload_button.label": "Dodaj zawartość multimedialną (JPEG, PNG, GIF, WebM, MP4, MOV)",
   "upload_error.limit": "Przekroczono limit plików do wysłania.",
   "upload_error.poll": "Dołączanie plików nie dozwolone z głosowaniami.",
-  "upload_form.audio_description": "Describe for people with hearing loss",
+  "upload_form.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": "Edytuj",
   "upload_form.undo": "Usuń",
-  "upload_form.video_description": "Describe for people with hearing loss or visual impairment",
+  "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.description_placeholder": "Pchnąć w tę łódź jeża lub ośm skrzyń fig",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 8217a1369..ad4407e9d 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -184,8 +184,8 @@
   "home.column_settings.basic": "Základné",
   "home.column_settings.show_reblogs": "Ukáž vyzdvihnuté",
   "home.column_settings.show_replies": "Ukáž odpovede",
-  "home.hide_announcements": "Hide announcements",
-  "home.show_announcements": "Show announcements",
+  "home.hide_announcements": "Skry oboznámenia",
+  "home.show_announcements": "Ukáž oboznámenia",
   "intervals.full.days": "{number, plural, one {# deň} few {# dní} many {# dní} other {# dní}}",
   "intervals.full.hours": "{number, plural, one {# hodina} few {# hodín} many {# hodín} other {# hodín}}",
   "intervals.full.minutes": "{number, plural, one {# minúta} few {# minút} many {# minút} other {# minút}}",
@@ -335,7 +335,7 @@
   "relative_time.just_now": "teraz",
   "relative_time.minutes": "{number}min",
   "relative_time.seconds": "{number}sek",
-  "relative_time.today": "today",
+  "relative_time.today": "dnes",
   "reply_indicator.cancel": "Zrušiť",
   "report.forward": "Posuň ku {target}",
   "report.forward_hint": "Tento účet je z iného serveru. Chceš poslať anonymnú kópiu hlásenia aj tam?",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 1674499e9..003dfaf3b 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -47,7 +47,7 @@
   "autosuggest_hashtag.per_week": "ஒவ்வொரு வாரம் {count}",
   "boost_modal.combo": "நீங்கள் இதை அடுத்தமுறை தவிர்க்க {combo} வை அழுத்தவும்",
   "bundle_column_error.body": "இக்கூற்றை ஏற்றம் செய்யும்பொழுது ஏதோ தவறு ஏற்பட்டுள்ளது.",
-  "bundle_column_error.retry": "மீண்டும் முயல்க",
+  "bundle_column_error.retry": "மீண்டும் முயற்சிக்கவும்",
   "bundle_column_error.title": "பிணையப் பிழை",
   "bundle_modal_error.close": "மூடுக",
   "bundle_modal_error.message": "இக்கூற்றை ஏற்றம் செய்யும்பொழுது ஏதோ தவறு ஏற்பட்டுள்ளது.",
@@ -65,70 +65,70 @@
   "column.mutes": "மௌனத் தடை செய்யப்பட்ட பயனர்கள்",
   "column.notifications": "அறிவிப்புகள்",
   "column.pins": "பொருத்தப்பட்ட டூட்டுகள்",
-  "column.public": "கூட்டாட்சி காலக்கெடு",
+  "column.public": "ஆலமரத்தில் நிகழ்பவை",
   "column_back_button.label": "திரும்பு",
   "column_header.hide_settings": "அமைப்புகளை மறை",
-  "column_header.moveLeft_settings": "நெடுவரிசையை இடதுபுறமாக நகர்த்தவும்",
-  "column_header.moveRight_settings": "நெடுவரிசை வலது புறமாக நகர்த்து",
-  "column_header.pin": "குண்டூசி",
+  "column_header.moveLeft_settings": "நெடுவரிசையை இடதுபுறமாக நகர்த்து",
+  "column_header.moveRight_settings": "நெடுவரிசையை வலதுபுறமாக நகர்த்து",
+  "column_header.pin": "பொருத்து",
   "column_header.show_settings": "அமைப்புகளைக் காட்டு",
-  "column_header.unpin": "பொருத்தப்படாத",
+  "column_header.unpin": "கழட்டு",
   "column_subheading.settings": "அமைப்புகள்",
   "community.column_settings.media_only": "படங்கள் மட்டுமே",
-  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "மேலும் அறிக",
-  "compose_form.hashtag_warning": "இந்த toot பட்டியலிடப்படாதது போல எந்த ஹேஸ்டேக்கின் கீழ் பட்டியலிடப்படாது. ஹேஸ்டேக் மூலம் பொது டோட்டல்கள் மட்டுமே தேட முடியும்.",
-  "compose_form.lock_disclaimer": "உங்கள் கணக்கு அல்ல {locked}. உங்களுடைய பின்தொடர்பவர் மட்டும் இடுகைகளை யாராவது காணலாம்.",
-  "compose_form.lock_disclaimer.lock": "தாழிடு",
-  "compose_form.placeholder": "What is on your mind?",
-  "compose_form.poll.add_option": "ஒரு விருப்பத்தைச் சேர்க்கவும்",
-  "compose_form.poll.duration": "வாக்கெடுப்பு காலம்",
-  "compose_form.poll.option_placeholder": "தேர்ந்தெடுப்ப {number}",
-  "compose_form.poll.remove_option": "இந்த விருப்பத்தை அகற்றவும்",
+  "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": "டூட்",
   "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": "எதிராணை",
+  "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.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": "நீக்கு & redraft",
-  "confirmations.redraft.message": "நிச்சயமாக இந்த நிலையை நீக்கி, அதை மறுபடியும் உருவாக்க வேண்டுமா? பிடித்தவை மற்றும் ஊக்கங்கள் இழக்கப்படும், மற்றும் அசல் இடுகையில் பதில்கள் அனாதையான இருக்கும்.",
-  "confirmations.reply.confirm": "பதில்",
-  "confirmations.reply.message": "இப்போது பதில், தற்போது நீங்கள் உருவாக்கும் செய்தி மேலெழுதப்படும். நீங்கள் தொடர விரும்புகிறீர்களா?",
-  "confirmations.unfollow.confirm": "பின்தொடராட்",
-  "confirmations.unfollow.message": "நிச்சயமாக நீங்கள் பின்தொடர விரும்புகிறீர்களா {name}?",
-  "conversation.delete": "உரையாடலை அழிக்கவும்",
+  "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.open": "உரையாடலைக் காட்டு",
   "conversation.with": "{names} உடன்",
-  "directory.federated": "தெரிந்த ஃபெடிவெர்சிலிருந்து",
-  "directory.local": "{domain} இல் இருந்து மட்டும்",
+  "directory.federated": "ஆலமரத்தின் அறியப்பட்டப் பகுதியிலிருந்து",
+  "directory.local": "{domain} களத்திலிருந்து மட்டும்",
   "directory.new_arrivals": "புதிய வரவு",
-  "directory.recently_active": "தற்பொழுது இயாக்கதிலிருப்பவர்கள்",
-  "embed.instructions": "கீழே உள்ள குறியீட்டை நகலெடுப்பதன் மூலம் உங்கள் இணையதளத்தில் இந்த நிலையை உட்பொதிக்கவும்.",
-  "embed.preview": "இது போன்ற தோற்றத்தை இங்கு காணலாம்:",
-  "emoji_button.activity": "நடவடிக்கை",
-  "emoji_button.custom": "வழக்கம்",
-  "emoji_button.flags": "கொடி",
+  "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": "இயற்கை",
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 54372022a..aa885e241 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -6697,14 +6697,13 @@ noscript {
 
     &__unread {
       position: absolute;
-      top: 15px;
-      right: 15px;
-      display: inline-block;
+      top: 19px;
+      right: 19px;
+      display: block;
       background: $highlight-text-color;
       border-radius: 50%;
       width: 0.625rem;
       height: 0.625rem;
-      margin: 0 .15em;
     }
   }
 
diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
index f1a751f84..fcc99d009 100644
--- a/app/lib/formatter.rb
+++ b/app/lib/formatter.rb
@@ -77,6 +77,8 @@ class Formatter
 
   def reformat(html)
     sanitize(html, Sanitize::Config::MASTODON_STRICT)
+  rescue ArgumentError
+    ''
   end
 
   def plaintext(status)
diff --git a/app/lib/sanitize_config.rb b/app/lib/sanitize_config.rb
index 2b5d554b5..e3fc94ba6 100644
--- a/app/lib/sanitize_config.rb
+++ b/app/lib/sanitize_config.rb
@@ -2,7 +2,23 @@
 
 class Sanitize
   module Config
-    HTTP_PROTOCOLS ||= ['http', 'https', 'dat', 'dweb', 'ipfs', 'ipns', 'ssb', 'gopher', 'xmpp', 'magnet', :relative].freeze
+    HTTP_PROTOCOLS = %w(
+      http
+      https
+    ).freeze
+
+    LINK_PROTOCOLS = %w(
+      http
+      https
+      dat
+      dweb
+      ipfs
+      ipns
+      ssb
+      gopher
+      xmpp
+      magnet
+    ).freeze
 
     CLASS_WHITELIST_TRANSFORMER = lambda do |env|
       node = env[:node]
@@ -38,6 +54,22 @@ class Sanitize
       end
     end
 
+    UNSUPPORTED_HREF_TRANSFORMER = lambda do |env|
+      return unless env[:node_name] == 'a'
+
+      current_node = env[:node]
+
+      scheme = begin
+        if current_node['href'] =~ Sanitize::REGEX_PROTOCOL
+          Regexp.last_match(1).downcase
+        else
+          :relative
+        end
+      end
+
+      current_node.replace(current_node.text) unless LINK_PROTOCOLS.include?(scheme)
+    end
+
     MASTODON_STRICT ||= freeze_config(
       elements: %w(p br span a abbr del pre blockquote code b strong u sub sup i em h1 h2 h3 h4 h5 ul ol li),
 
@@ -56,13 +88,14 @@ class Sanitize
       },
 
       protocols: {
-        'a'          => { 'href' => HTTP_PROTOCOLS },
-        'blockquote' => { 'cite' => HTTP_PROTOCOLS },
+        'a'          => { 'href' => LINK_PROTOCOLS },
+        'blockquote' => { 'cite' => LINK_PROTOCOLS },
       },
 
       transformers: [
         CLASS_WHITELIST_TRANSFORMER,
         IMG_TAG_TRANSFORMER,
+        UNSUPPORTED_HREF_TRANSFORMER,
       ]
     )
 
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 29ad72988..f5a6f067d 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -250,6 +250,7 @@ ar:
         create: إنشاء إعلان
         title: إعلان جديد
       published_msg: تم نشر الإعلان بنجاح!
+      scheduled_for: بُرمِج على %{time}
       scheduled_msg: تمت جدولة نشر الإعلان!
       title: الإعلانات
       unpublished_msg: تم إلغاء نشر الإعلان بنجاح!
@@ -1074,6 +1075,7 @@ ar:
         zero: بدون صوت %{count}
       vote: صوّت
     show_more: أظهر المزيد
+    show_thread: اعرض خيط المحادثة
     sign_in_to_participate: قم بتسجيل الدخول للمشاركة في هذه المحادثة
     title: '%{name}: "%{quote}"'
     visibilities:
diff --git a/config/locales/ast.yml b/config/locales/ast.yml
index 308fef71c..d7e0faf41 100644
--- a/config/locales/ast.yml
+++ b/config/locales/ast.yml
@@ -40,7 +40,6 @@ ast:
       one: Siguidor
       other: Siguidores
     joined: Xunióse en %{date}
-    last_active: última actividá
     moved_html: "%{name} mudóse a %{new_profile_link}:"
     network_hidden: Esta información nun ta disponible
     never_active: Enxamás
@@ -73,6 +72,7 @@ ast:
       reject_all: Refugar too
       resend_confirmation:
         already_confirmed: Esti usuariu yá ta confirmáu
+        send: Reunviar les instrucciones
       role: Permisos
       roles:
         admin: Alministrador
@@ -92,6 +92,7 @@ ast:
         disable_custom_emoji: "%{name} desactivó'l fustaxe %{target}"
         disable_user: "%{name} desactivó l'aniciu de sesión del usuariu %{target}"
         enable_custom_emoji: "%{name} activó'l fustaxe %{target}"
+        enable_user: "%{name} activó l'aniciu de sesión del usuariu %{target}"
         promote_user: "%{name} ascendió al usuariu %{target}"
         remove_avatar_user: "%{name} desanició l'avatar de %{target}"
         reopen_report: "%{name} reabrió l'informe de %{target}"
@@ -147,6 +148,7 @@ ast:
           other: "%{count} informes"
       are_you_sure: "¿De xuru?"
       status: Estáu
+      title: Informes
     settings:
       registrations:
         min_invite_role:
@@ -167,6 +169,7 @@ ast:
     new_pending_account:
       body: Los detalles de la cuenta nueva tán embaxo. Pues aprobar o refugar esta aplicación.
     new_report:
+      body: "%{reporter} informó de %{target}"
       body_remote: Daquién dende %{domain} informó de %{target}
     new_trending_tag:
       body: 'Güei la etiqueta #%{name} ye tendencia pero nun se revisó anteriormente. Nun va amosase públicamente a nun ser que lo permitas o guardes el formulariu como ta pa nun saber más d''ello.'
@@ -180,6 +183,7 @@ ast:
       body: Mastodon tradúcenlu voluntarios,
       guide_link: https://crowdin.com/project/mastodon
       guide_link_text: tol mundu pue collaborar.
+    sensitive_content: Conteníu sensible
     toot_layout: Distribución de los barritos
   applications:
     invalid_url: La URL apurrida nun ye válida
@@ -192,6 +196,7 @@ ast:
     delete_account_html: Si deseyes desaniciar la to cuenta, pues <a href="%{path}">siguir equí</a>. Va pidísete la confirmación.
     description:
       suffix: "¡Con una cuenta, vas ser a siguir a persones, espublizar anovamientos ya intercambiar mensaxes con usuarios de cualesquier sirvidor de Mastodon y más!"
+    didnt_get_confirmation: "¿Nun recibiesti les instrucciones de confirmación?"
     forgot_password: "¿Escaeciesti la contraseña?"
     login: Aniciar sesión
     migrate_account: Mudase a otra cuenta
@@ -221,6 +226,7 @@ ast:
       email_contact_html: Si entá nun aportó, pues unviar un corréu a<a href="mailto:%{email}">%{email}</a> pa más ayuda
       more_details_html: Pa más detalles, mira la <a href="%{terms_path}">política de privacidá</a>.
   directories:
+    directory: Direutoriu de perfiles
     explanation: y descubri a usuarios según los sos intereses
     explore_mastodon: Esplora %{title}
   errors:
@@ -266,15 +272,22 @@ ast:
   generic:
     all: Too
     changes_saved_msg: "¡Los cambeos guardáronse con ésitu!"
+    order_by: Clasificación
     save_changes: Guardar cambeos
   identity_proofs:
     authorize: Sí, autorizar
     i_am_html: Soi %{username} de %{service}.
     identity: Identidá
   imports:
+    modes:
+      merge: Mecíu
+      merge_long: Caltién los rexistros esistentes y amesta otros nuevos
+      overwrite: Sobrescritura
+      overwrite_long: Troca los rexistros actuales por otros nuevos
     preface: Pues importar los datos qu'esportares dende otra instancia, como por exemplu la llista de persones que bloquiares o tuvieres siguiendo.
     types:
       blocking: Llista de xente bloquiao
+      domain_blocking: Llista de dominios bloquiaos
       following: Llista de siguidores
       muting: Llista de xente silenciao
     upload: Xubir
@@ -345,10 +358,12 @@ ast:
   preferences:
     public_timelines: Llinies temporales públiques
   relationships:
+    activity: Actividá
     followers: Siguidores
     most_recent: Lo más recién
     relationship: Rellación
     remove_selected_follows: Dexar de siguir a los usuarios esbillaos
+    status: Estáu
   remote_follow:
     acct: Introduz el nome_usuariu@dominiu dende'l que lo quies facer
     no_account_html: "¿Nun tienes una cuenta? Pues <a href='%{sign_up_path}' target='_blank'>rexistrate equí</a>"
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index d1d099f32..afca0212a 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -1157,6 +1157,7 @@ cy:
         zero: "%{count} pleidlais"
       vote: Pleidleisio
     show_more: Dangos mwy
+    show_thread: Dangos edefyn
     sign_in_to_participate: Mengofnodwch i gymryd rhan yn y sgwrs
     title: '%{name}: "%{quote}"'
     visibilities:
diff --git a/config/locales/devise.kab.yml b/config/locales/devise.kab.yml
index c2624315d..650ade1e4 100644
--- a/config/locales/devise.kab.yml
+++ b/config/locales/devise.kab.yml
@@ -8,21 +8,21 @@ kab:
     failure:
       already_authenticated: Aqla-k teqqneḍ yakan.
       inactive: Amiḍan-inek mazal ur yermed ara.
-      invalid: Tella tuccḍa deg %{authentication_keys} neɣ deg wawal uffir.
-      last_attempt: Ɣur-k yiwen n uɛraḍ-nniḍen kan qbel ad yettucekkel umiḍan-ik.
+      invalid: Tella tuccḍa deg %{authentication_keys} neγ deg wawal uffir.
+      last_attempt: Γur-k yiwen n uɛraḍ-nniḍen kan send ad yettucekkel umiḍan-ik.
       locked: Amiḍan-ik yewḥel.
-      not_found_in_database: Tella tuccḍa deg %{authentication_keys} neɣ deg wawal uffir.
-      pending: Amiḍan-inek mazal-it deg ɛiwed n tmuɣli.
-      timeout: Tiɣimit n tuqqna tezri. Ma ulac aɣilif ɛiwed tuqqna akken ad tkemmleḍ.
+      not_found_in_database: Tella tuccḍa deg %{authentication_keys} neγ deg wawal uffir.
+      pending: Amiḍan-inek mazal-it deg ɛiwed n tmuγli.
+      timeout: Tiγimit n tuqqna tezri. Ma ulac aγilif ɛiwed tuqqna akken ad tkemmleḍ.
       unauthenticated: Ilaq ad teqqneḍ neγ ad tjerrḍeḍ akken ad tkemmelḍ.
       unconfirmed: Ilaq ad wekdeḍ tansa-inek imayl akken ad tkemmelḍ.
     mailer:
       confirmation_instructions:
         action: Senqed tansa-inek imayl
-        action_with_app: Wekked sakkin uɣal ɣer %{app}
+        action_with_app: Wekked sakkin uγal γer %{app}
         explanation: Aqla-k terniḍ amiḍan deg %{host} s tansa imayl-agi. Mazal-ak yiwen utekki akken ad t-tremdeḍ. Ma mačči d kečč i yessutren ay-agi, ttxil-k ssinef izen-a.
-        explanation_when_pending: Tsutreḍ-d ajerred deg %{host} s tansa-agi imayl. Ad nɣeṛ asuter-ik ticki tsentmeḍ tansa-ik imayl. Send asentem, ur tezmireḍ ara ad teqqneḍ ɣer umiḍan-ik. Ma yella nugi asuter-ik, isefka-ik ad ttwakksen seg uqeddac, ihi ulac tigawt-nniḍen ara k-d-yettuqeblen. Ma mačči d kečč i yellan deffir n usuter-agi, ttxil-k ssinef izen-agi.
-        extra_html: Ttxil-k ẓer daɣen <a href="%{terms_path}">ilugan n uqeddac</a> akked <a href="%{policy_path}">twetlin n useqdec</a>.
+        explanation_when_pending: Tsutreḍ-d ajerred deg %{host} s tansa-agi imayl. Ad nγeṛ asuter-ik ticki tsentmeḍ tansa-ik imayl. Send asentem, ur tezmireḍ ara ad teqqneḍ γer umiḍan-ik. Ma yella nugi asuter-ik, isefka-ik ad ttwakksen seg uqeddac, ihi ulac tigawt-nniḍen ara k-d-yettuqeblen. Ma mačči d kečč i yellan deffir n usuter-agi, ttxil-k ssinef izen-agi.
+        extra_html: Ttxil-k ẓer daγen <a href="%{terms_path}">ilugan n uqeddac</a> akked <a href="%{policy_path}">twetlin n useqdec</a>.
         subject: 'Maṣṭudun: Asentem n ujerred deg uqeddac %{instance}'
         title: Senqed tansa-inek imayl
       email_changed:
@@ -43,7 +43,7 @@ kab:
         explanation: Tessutreḍ awal uffir amaynut i umiḍan-ik.
         title: Aɛiwed n wawal uffir
     passwords:
-      send_paranoid_instructions: Ma nufa tansa-inek imayl tella deg uzadur-nneɣ n yisefka, ad n-teṭṭfeḍ izen deg kra n tesdatin, deg-s assaɣ i uɛawed n wawal uffir. Ma ur k-in-yewwiḍ ara yizen, ttxil-k ẓer deg ukaram spam.
+      send_paranoid_instructions: Ma nufa tansa-inek imayl tella deg uzadur-nneγ n yisefka, ad n-teṭṭfeḍ izen deg kra n tesdatin, deg-s assaγ i uɛawed n wawal uffir. Ma ur k-in-yewwiḍ ara yizen, ttxil-k ẓer deg ukaram spam.
       updated: Awal-ik uffir yettwabeddel mebla ugur. Aqla-k tura tjerrḍeḍ.
       updated_not_active: Awal-ik uffir yettwabeddel mebla ugur.
     registrations:
@@ -51,7 +51,7 @@ kab:
       signed_up: Anṣuf! Aqla-k tkecmeḍ.
     sessions:
       signed_in: Aqla-k teqqneḍ.
-      signed_out: Aqla-k teffɣeḍ.
+      signed_out: Aqla-k teffγeḍ.
   errors:
     messages:
       not_found: ulac-it
diff --git a/config/locales/devise.pl.yml b/config/locales/devise.pl.yml
index a0af51c32..6336a5794 100644
--- a/config/locales/devise.pl.yml
+++ b/config/locales/devise.pl.yml
@@ -46,6 +46,18 @@ pl:
         extra: Jeżeli to nie Ty, zignoruj tą wiadomość. Twoje hasło nie ulegnie zmianie, jeżeli nie wykorzystasz powyższego odnośnika i nie utworzysz nowego hasła.
         subject: 'Mastodon: Instrukcje ustawienia nowego hasła'
         title: Przywracanie hasła
+      two_factor_disabled:
+        explanation: Uwierzytelnianie dwuskładnikowe dla Twojego konta zostało wyłączone. Możesz się teraz logować korzystając z samego adresu e-mail i hasła.
+        subject: Mastodon – wyłączono uwierzytelnianie dwustopniowe
+        title: Wyłączono 2FA
+      two_factor_enabled:
+        explanation: Uwierzytelnianie dwuskładnikowe dla Twojego konta zostało włączone. Logując się, będziesz potrzebować tokenu z połączonej aplikacji TOTP.
+        subject: Mastodon – włączono uwierzytelnianie dwustopniowe
+        title: Włączono 2FA
+      two_factor_recovery_codes_changed:
+        explanation: Poprzednie kody zapasowe zostały unieważnione, a nowe zostały wygenerowane.
+        subject: Mastodon – wygenerowano nowe kody ratunkowe 2FA
+        title: Zmieniono kody odzyskiwania 2FA
       unlock_instructions:
         subject: 'Mastodon: Instrukcje odblokowania konta'
     omniauth_callbacks:
diff --git a/config/locales/doorkeeper.ast.yml b/config/locales/doorkeeper.ast.yml
index af9dee300..b9ab81618 100644
--- a/config/locales/doorkeeper.ast.yml
+++ b/config/locales/doorkeeper.ast.yml
@@ -77,7 +77,7 @@ ast:
     scopes:
       admin:read: lleer tolos datos del sirvidor
       admin:read:accounts: lleer la información sensible de toles cuentes
-      admin:read:reports: lleer la información sensible de tolos informe y cuentes informaes
+      admin:read:reports: lleer la información sensible de tolos informes y cuentes informaes
       admin:write: modificar tolos datos del sirvidor
       read: lleer tolos datos de la to cuenta
       read:accounts: ver información de cuentes
diff --git a/config/locales/doorkeeper.kab.yml b/config/locales/doorkeeper.kab.yml
index 9cd506488..b384b76b1 100644
--- a/config/locales/doorkeeper.kab.yml
+++ b/config/locales/doorkeeper.kab.yml
@@ -12,7 +12,7 @@ kab:
           attributes:
             redirect_uri:
               fragment_present: ur yezmir ad yegber afrur.
-              invalid_uri: ilaq ad tili d tansa URL tameɣtut.
+              invalid_uri: ilaq ad tili d tansa URL tameγtut.
               relative_uri: ilaq ad yili d URI amagdaz.
               secured_uri: ilaq URI ad yili HTTPS/SSL.
   doorkeeper:
@@ -56,19 +56,23 @@ kab:
         title: Tella-d tuccḍa
       new:
         able_to: Asnas-agi yezmer
-        prompt: Eǧǧ i %{client_name} ad yekcem ɣer umiḍan-ik
+        prompt: Eǧǧ i %{client_name} ad yekcem γer umiḍan-ik
+        title: Tlaq tsiregt
       show:
-        title: Nɣel tangalt n wurag sakkin senteḍ-itt deg usnas.
+        title: Nγel tangalt n wurag sakkin senteḍ-itt deg usnas.
     authorized_applications:
+      buttons:
+        revoke: Ḥwi
       confirmations:
         revoke: Tetḥeqqeḍ?
       index:
         application: Asnas
         created_at: Yettussireg
         date_format: "%d-%m-%Y %H:%M:%S"
+        title: Isnasen-ik·im yettusirgen
     errors:
       messages:
-        invalid_redirect_uri: URI n uwelleh mačči d ameɣtu.
+        invalid_redirect_uri: URI n uwelleh mačči d ameγtu.
     flash:
       applications:
         create:
@@ -77,16 +81,21 @@ kab:
           notice: Asnan yettwakkes.
         update:
           notice: Asnan yettwalqem.
+      authorized_applications:
+        destroy:
+          notice: Yettwaḥwi wesnas.
     layouts:
       admin:
         nav:
           applications: Isnasen
+      application:
+        title: Tlaq tsiregt n OAuth
     scopes:
-      admin:read: ɣeṛ akk isefka ɣef uqeddac
-      admin:write: ẓreg akk isefka ɣef uqeddac
-      follow: beddel assaɣen n umiḍan
-      push: ṭṭef-d tilɣa-ik yettwademren
-      read: ɣeṛ akk isefka n umiḍan-ik
+      admin:read: γeṛ akk isefka γef uqeddac
+      admin:write: ẓreg akk isefka γef uqeddac
+      follow: beddel assaγen n umiḍan
+      push: ṭṭef-d tilγa-ik yettwademren
+      read: γeṛ akk isefka n umiḍan-ik
       read:accounts: ẓer isallen n yimiḍanen
       read:blocks: ẓer imiḍanen i tesḥebseḍ
       read:bookmarks: ẓer ticraḍ-ik
@@ -95,12 +104,13 @@ kab:
       read:follows: ẓer imeḍfaṛen-ik
       read:lists: ẓer tibdarin-ik
       read:mutes: ẓer wid i tesgugmeḍ
-      read:notifications: ẓer tilɣa-ik
-      read:statuses: ẓer meṛṛa tisuffaɣ
+      read:notifications: ẓer tilγa-ik
+      read:statuses: ẓer meṛṛa tisuffaγ
       write: beddel meṛṛa isefka n umiḍan-ik
-      write:accounts: ẓreg amaɣnu-ik
-      write:blocks: seḥbes imiḍanen d tɣula
+      write:accounts: ẓreg amaγnu-ik
+      write:blocks: seḥbes imiḍanen d tγula
       write:bookmarks: ad yernu tisuffγin γer ticraḍ
       write:filters: rnu-d imsizedgen
       write:follows: ḍfeṛ imdanen
       write:lists: rnu-d tibdarin
+      write:media: ad yessali ifayluyen n teγwalt
diff --git a/config/locales/doorkeeper.pl.yml b/config/locales/doorkeeper.pl.yml
index 2068eeef4..7c6c4fb6d 100644
--- a/config/locales/doorkeeper.pl.yml
+++ b/config/locales/doorkeeper.pl.yml
@@ -38,6 +38,7 @@ pl:
         application: Aplikacja
         callback_url: URL wywołania zwrotnego (callback)
         delete: Usuń
+        empty: Nie masz aplikacji.
         name: Nazwa
         new: Nowa aplikacja
         scopes: Zakres
@@ -125,6 +126,7 @@ pl:
       read: możliwość odczytu wszystkich danych konta
       read:accounts: dostęp do informacji o koncie
       read:blocks: dostęp do listy blokowanych
+      read:bookmarks: dostęp do zakładek
       read:favourites: dostęp do listy ulubionych
       read:filters: dostęp do filtrów
       read:follows: dostęp do listy śledzonych
@@ -137,6 +139,7 @@ pl:
       write: możliwość modyfikowania wszystkich danych o koncie
       write:accounts: możliwość modyfikowania informacji o koncie
       write:blocks: możliwość blokowania domen i użytkowników
+      write:bookmarks: możliwość dodawania wpisów do zakładek
       write:favourites: możliwość dodawnia wpisów do ulubionych
       write:filters: możliwość tworzenia filtrów
       write:follows: możliwość śledzenia ludzi
diff --git a/config/locales/id.yml b/config/locales/id.yml
index 6ef16c8ed..ca222946c 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -743,8 +743,10 @@ id:
     add_new: Tambah baru
     errors:
       limit: Anda sudah menampilkan tagar unggulan dengan jumlah maksimum
+    hint_html: "<strong>Apa itu tagar yang diunggulkan?</strong> Mereka ditampilkan secara mencolok di profil publik Anda dan mengizinkan orang-orang untuk menjelajahi kiriman publik khususnya yang ada di bawah tagar tersebut. Mereka adalah alat yang bagus untuk melacak pekerjaan kreatif atau proyek jangka panjang."
   filters:
     contexts:
+      account: Profil
       home: Beranda
       notifications: Notifikasi
       public: Linimasa publik
@@ -768,6 +770,8 @@ id:
     all: Semua
     changes_saved_msg: Perubahan berhasil disimpan!
     copy: Salin
+    delete: Hapus
+    no_batch_actions_available: Tindakan batch tidak tersedia di halaman ini
     order_by: Urut berdasarkan
     save_changes: Simpan perubahan
     validation_errors:
diff --git a/config/locales/kab.yml b/config/locales/kab.yml
index 1e8b508ba..03f4d8c13 100644
--- a/config/locales/kab.yml
+++ b/config/locales/kab.yml
@@ -1,12 +1,12 @@
 ---
 kab:
   about:
-    about_hashtag_html: Tigi d tijewwiqin tizuyaz, γur-sent <strong>#%{hashtag}</strong>. Tzemreḍ ad tesdemreḍ akked yid-sent ma tesɛiḍ amiḍan deg kra n umḍiq deg fediverse.
+    about_hashtag_html: Tigi d tijewwiqin tizuyaz, γur-sent <strong>#%{hashtag}</strong>. Tzemreḍ ad tesdemreḍ akked yid-sent ma tesɛiḍ amiḍan deg kra n umḍiq deg fedivers.
     about_mastodon_html: 'Azeṭṭa ametti n uzekka: Ulac deg-s asussen, ulac taɛessast n tsuddiwin fell-ak, yebna γef leqder d ttrebga, daγen d akeslemmas! Akked Maṣṭudun, isefka-inek ad qimen inek!'
     about_this: Γef
     active_count_after: d urmid
     active_footnote: Imseqdacen yekkren s wayyur (MAU)
-    administered_by: 'Yettwadbel sɣur:'
+    administered_by: 'Yettwadbel sγur:'
     api: API
     apps: Isnasen izirazen
     apps_platforms: Seqdec Maṣṭudun deg iOS, Android d tγeṛγṛin-nniḍen
@@ -22,18 +22,18 @@ kab:
     privacy_policy: Tasertit tabaḍnit
     see_whats_happening: Ẓer d acu i iḍerrun
     server_stats: 'Tidaddanin n uqeddac:'
-    source_code: Tangalt n uɣbalu
+    source_code: Tangalt Taγbalut
     status_count_after:
-      one: n tsuffeɣt
-      other: n tsuffɣin
-    status_count_before: I d-yessuffɣen
+      one: n tsuffeγt
+      other: n tsuffγin
+    status_count_before: I d-yessuffγen
     tagline: Ḍfeṛ imddukkal-ik tissineḍ-d wiyaḍ
     terms: Tiwetlin n useqdec
     unavailable_content: Ulac agbur
     unavailable_content_description:
       domain: Aqeddac
       reason: Taγzent
-      silenced: 'Tisuffɣin ara d-yekken seg yiqeddacen-agi ad ttwaffrent deg tsuddmin tizuyaz d yidiwenniten, daɣen ur ttilin ara telɣa ɣef usedmer n yimseqdacen-nsen, skud ur ten-teḍfiṛeḍ ara:'
+      silenced: 'Tisuffγin ara d-yekken seg yiqeddacen-agi ad ttwaffrent deg tsuddmin tizuyaz d yidiwenniten, daγen ur ttilin ara telγa γef usedmer n yimseqdacen-nsen, skud ur ten-teḍfiṛeḍ ara:'
     unavailable_content_html: Maṣṭudun s umata yeḍmen-ak ad teẓreḍ agbur, ad tesdemreḍ akked yimseqdacen-nniḍen seg yal aqeddac deg fedivers. Ha-tent-an γur-k tsuraf i yellan deg uqeddac-agi.
     user_count_after:
       one: amseqdac
@@ -46,10 +46,10 @@ kab:
       one: Ameḍfaṛ
       other: Imeḍfaṛen
     following: Yeṭafaṛ
-    joined: Yettwarna-d deg %{date}
+    joined: Ikcemed deg %{date}
     last_active: armud aneggaru
     media: Taγwalt
-    moved_html: "%{name} ibeddel amiḍan ɣer %{new_profile_link}:"
+    moved_html: 'ibeddel %{name} amiḍan γer %{new_profile_link}:'
     network_hidden: Ulac isalli-agi
     never_active: Werǧin
     nothing_here: Ulac kra da!
@@ -59,13 +59,13 @@ kab:
       one: Tajewwiqt
       other: Tijewwiqin
     posts_tab_heading: Tiberraḥin
-    posts_with_replies: Tibarraḥin d tririyin
+    posts_with_replies: Tijewwaqin akked tririyin
     reserved_username: Isem-agi n umseqdac yettwaṭṭef yakan
     roles:
       admin: Anedbal
       bot: Aṛubut
       group: Agraw
-    unavailable: Ur nufi ara amaɣnu-a
+    unavailable: Ur nufi ara amaγnu-a
     unfollow: Ur ṭṭafaṛ ara
   admin:
     account_moderation_notes:
@@ -76,7 +76,7 @@ kab:
       approve_all: Qbel kullec
       are_you_sure: Tetḥeqqeḍ?
       avatar: Tugna n wummuγ
-      by_domain: Taɣult
+      by_domain: Taγult
       change_email:
         changed_msg: Imayl n umiḍan yettwabeddel mebla ugur!
         current_email: Imayl n tura
@@ -92,7 +92,7 @@ kab:
       disable_two_factor_authentication: Gdel 2FA
       disabled: Yensa
       display_name: Isem ara d-yettwaskanen
-      domain: Taɣult
+      domain: Taγult
       edit: Ẓreg
       email: Imayl
       email_status: Addad n imayl
@@ -103,7 +103,7 @@ kab:
       header: Ixef
       inbox_url: URL n yinekcam
       ip: Tansa IP
-      joined: Yettwarna-d
+      joined: Ikcemed deg
       location:
         all: Akk
         local: Adigan
@@ -121,7 +121,7 @@ kab:
       no_limits_imposed: War tilisa
       protocol: Aneggaf
       public: Azayez
-      redownload: Smiren amaɣnu
+      redownload: Smiren amaγnu
       reject: Ggami
       reject_all: Ggami-ten akk
       remove_avatar: Kkes tugna n wummuγ
@@ -131,6 +131,7 @@ kab:
         success: Imayl n usentem yettwazen mebla ugur!
       reset: Wennez
       reset_password: Beddel awal uffir
+      role: Tisirag
       roles:
         admin: Anedbal
         staff: Tarbaɛt
@@ -153,16 +154,16 @@ kab:
       actions:
         change_email_user: "%{name} ibeddel imayl n umseqdac %{target}"
         confirm_user: "%{name} isentem tansa imayl n umseqdac %{target}"
-        create_account_warning: "%{name} yuzen alɣu i %{target}"
+        create_account_warning: "%{name} yuzen alγu i %{target}"
         create_custom_emoji: "%{name} yessuli-d imujiten imaynuten %{target}"
-        create_domain_allow: "%{name} yerna taɣult %{target} ɣer tebdart tamellalt"
-        create_domain_block: "%{name} yesseḥbes taɣult %{target}"
-        create_email_domain_block: "%{name} yerna taɣult n imayl %{target} ɣer tebdart taberkant"
+        create_domain_allow: "%{name} yerna taγult %{target} γer tebdart tamellalt"
+        create_domain_block: "%{name} yesseḥbes taγult %{target}"
+        create_email_domain_block: "%{name} yerna taγult n imayl %{target} γer tebdart taberkant"
         destroy_custom_emoji: "%{name} ihudd imuji %{target}"
-        destroy_domain_allow: "%{name} yekkes taɣult %{target} seg tebdart tamellalt"
-        destroy_domain_block: "%{name} yekkes aseḥbes n taɣult %{target}"
-        destroy_email_domain_block: "%{name} yerna taɣult n imayl %{target} ɣer tebdart tamellalt"
-        destroy_status: "%{name} yekkes tasuffeɣt n %{target}"
+        destroy_domain_allow: "%{name} yekkes taγult %{target} seg tebdart tamellalt"
+        destroy_domain_block: "%{name} yekkes aseḥbes n taγult %{target}"
+        destroy_email_domain_block: "%{name} yerna taγult n imayl %{target} γer tebdart tamellalt"
+        destroy_status: "%{name} yekkes tasuffeγt n %{target}"
         disable_custom_emoji: "%{name} yessens imuji %{target}"
         disable_user: "%{name} yessens tuqqna i umseqdac %{target}"
         enable_custom_emoji: "%{name} yermed imuji %{target}"
@@ -171,8 +172,8 @@ kab:
         silence_account: "%{name} yesgugem amiḍan n %{target}"
         unsilence_account: "%{name} yekkes asgugem n umiḍan n %{target}"
         update_custom_emoji: "%{name} yelqem imuji %{target}"
-        update_status: "%{name} yelqem tasuffeɣt n %{target}"
-      deleted_status: "(tasuffeɣt tettwakkes)"
+        update_status: "%{name} yelqem tasuffeγt n %{target}"
+      deleted_status: "(tasuffeγt tettwakkes)"
     announcements:
       edit:
         title: Ẓreg ulγu
@@ -200,6 +201,7 @@ kab:
       list: Tabdart
       new:
         title: Timerna n imuji udmawan amaynut
+      overwrite: Semselsi
       title: Imujiten udmawanen
       unlist: Kkes si tabdert
       unlisted: Yettwakkes si tabdert
@@ -218,9 +220,9 @@ kab:
       week_users_active: yermed deg yimalas-agi
       week_users_new: imseqdacen deg yimalas-agi
     domain_allows:
-      add_new: Timerna n taɣult ɣer tebdart tamellalt
-      created_msg: Taɣult-a tettwarna ɣer tebdart tamellalt mebla ugur
-      destroyed_msg: Taɣult-a tettwakkes seg tebdart tamellalt
+      add_new: Timerna n taγult γer tebdart tamellalt
+      created_msg: Taγult-a tettwarna γer tebdart tamellalt mebla ugur
+      destroyed_msg: Taγult-a tettwakkes seg tebdart tamellalt
       undo: Kkes seg tebdart tamellalt
     domain_blocks:
       domain: Taγult
@@ -228,6 +230,8 @@ kab:
         severity:
           noop: Ula yiwen
           silence: Sgugem
+      private_comment: Awennit uslig
+      public_comment: Awennit azayez
       severity:
         silence: yettwasgugem
       show:
@@ -238,7 +242,7 @@ kab:
       domain: Taγult
       new:
         create: Rnu taγult
-        title: Timerna n taɣult tamaynut n imayl ɣer tebdart taberkant
+        title: Timerna n taγult tamaynut n imayl γer tebdart taberkant
       title: Tabdart taberkant n imayl
     instances:
       by_domain: Taγult
@@ -248,7 +252,10 @@ kab:
         other: "%{count} n yimiḍanen i yettwassnen"
       moderation:
         all: Akk
-      total_blocked_by_us: Ttwasḥebsen sɣur-neɣ
+      private_comment: Awennit uslig
+      public_comment: Awennit azayez
+      title: Tamatut
+      total_blocked_by_us: Ttwasḥebsen sγur-neγ
       total_followed_by_them: Ṭtafaṛen-t
       total_followed_by_us: Neṭṭafaṛ-it
     invites:
@@ -264,6 +271,7 @@ kab:
       enable: Rmed
       enabled: Yermed
       save_and_enable: Sekles rnu rmed-it
+      status: Addad
     reports:
       account:
         reports:
@@ -279,17 +287,18 @@ kab:
         delete: Kkes
       report: 'Aneqqis #%{id}'
       resolved: Fran
+      status: Addad
       title: Ineqqisen
       unresolved: Ur yefra ara
       updated_at: Yettwaleqqem
     settings:
       custom_css:
-        desc_html: Beddel aɣan s CSS ara d-yettwasalayen deg yal asebter
+        desc_html: Beddel aγan s CSS ara d-yettwasalayen deg yal asebter
         title: CSS udmawan
       domain_blocks:
-        all: Ɣef medden akk
-        disabled: Ɣef yiwen ala
-        users: Ɣef yimseqdacen idiganen i yeqqnen
+        all: I medden akk
+        disabled: Γef ula yiwen
+        users: Γef yimseqdacen idiganen i yeqqnen
       profile_directory:
         title: Rmed akaram n imaγnuten
       registrations:
@@ -315,6 +324,7 @@ kab:
     tags:
       directory: Deg ukaram
       in_directory: "%{count} deg ukaram"
+      last_active: Armud aneggaru
       most_popular: Ittwasnen aṭas
       most_recent: Melmi kan
     warning_presets:
@@ -325,6 +335,7 @@ kab:
     new_report:
       subject: Aneqqis amaynut i %{instance} (#%{id})
   appearance:
+    discovery: Asnirem
     localization:
       guide_link: https://crowdin.com/project/mastodon
       guide_link_text: Yal yiwen·t y·tezmer a ttekki.
@@ -349,6 +360,9 @@ kab:
     reset_password: Wennez awal uffir
     security: Taγellist
     set_new_password: Egr-ed awal uffir amaynut
+    status:
+      account_status: Addad n umiḍan
+      functional: Amiḍan-inek·m yettwaheyya.
     trouble_logging_in: Γur-k uguren n tuqqna?
   authorize_follow:
     already_following: Teṭafareḍ ya kan amiḍan-a
@@ -394,12 +408,15 @@ kab:
     '429': Throttled
     '500': 
     '503': The page could not be served due to a temporary server failure.
+  existing_username_validator:
+    not_found_multiple: ur yezmir ara ad yaf %{usernames}
   exports:
     archive_takeout:
       date: Azemz
       size: Teγzi
     csv: CSV
     lists: Tibdarin
+    mutes: Wid tesgugmeḍ
   featured_tags:
     add_new: Rnu amaynut
   filters:
@@ -407,8 +424,14 @@ kab:
       account: Imuγna
       notifications: Tilγa
       thread: Idiwenniyen
+    edit:
+      title: Ẓreg amzizdig
     index:
       delete: Kkes
+      empty: Ur tesɛid ara imzizdigen.
+      title: Imzizdigen
+    new:
+      title: Rnu yiwen umzizdig amaynut
   footer:
     developers: Ineflayen
     more: Ugar…
@@ -416,13 +439,21 @@ kab:
     all: Akk
     copy: Nγel
     delete: Kkes
+    order_by: Sizwer s
     save_changes: Sekles ibeddilen
   identity_proofs:
+    active: Yermed
     authorize: Ih, ssireg
     i_am_html: Nekki d %{username} deg %{service}.
+    identity: Tamagit
+    inactive: D arurmid
+    publicize_checkbox: 'Tjewqeḍ aya:'
   imports:
+    modes:
+      overwrite: Semselsi
     types:
       following: Tabdart n wid teṭafareḍ
+    upload: Sali
   invites:
     expires_in:
       '1800': 30 n tisdatin
@@ -435,16 +466,23 @@ kab:
     title: Ɛreḍ-d kra n yimdanen
   migrations:
     acct: Ibeddel γer
+    incoming_migrations: Tusiḍ-ed seg umiḍan nniḍen
   notification_mailer:
+    digest:
+      action: Wali akk tilγa
+      mention: 'Yuder-ik-id %{name} deg:'
     follow:
       body: "%{name} yeṭafaṛ-ik-id tura!"
       subject: "%{name} yeṭafaṛ-ik-id tura"
       title: Ameḍfaṛ amaynut
     mention:
       action: Err
+  notifications:
+    other_settings: Iγewwaṛen nniḍen n tilγa
   pagination:
     newer: Amaynut
     next: Wayed
+    older: Aqbuṛ
     prev: Win iɛeddan
     truncate: d
   preferences:
@@ -452,9 +490,12 @@ kab:
   relationships:
     followers: Imeḍfaṛen
     following: Yeṭafaṛ
+    moved: Igujj
+    status: Addad n umiḍan
   remote_follow:
     no_account_html: Ur tesɛid ara amiḍan? Tzmreḍ <a href='%{sign_up_path}' target='_blank'>ad jerdeḍ da</a>
   sessions:
+    activity: Armud aneggaru
     browser: Iminig
     browsers:
       alipay: Alipay
@@ -463,8 +504,14 @@ kab:
       edge: Microsoft Edge
       electron: Electron
       firefox: Firefox
+      generic: Iminig arusin
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Nokia S40 Ovi Browser
       opera: Opera
       otter: Otter
+      phantom_js: PhantomJS
+      qq: QQ Browser
       safari: Safari
       uc_browser: UCBrowser
       weibo: Weibo
@@ -482,13 +529,19 @@ kab:
       mac: Mac
       windows: Windows
       windows_mobile: Windows Mobile
+      windows_phone: Tiliγri Windows Phone
+    revoke: Ḥwi
   settings:
     account: Amiḍan
     account_settings: Iγewwaṛen n umiḍan
     appearance: Udem
+    authorized_apps: Isnasen yettussirgen
     back: Uγal γer Maṣṭudun
     development: Taneflit
     edit_profile: Ẓreg amaγnu
+    export: Taktert n yisefka
+    import: Kter
+    import_and_export: Taktert d usifeḍ
     notifications: Tilγa
     preferences: Imenyafen
     profile: Ameγnu
@@ -511,8 +564,10 @@ kab:
     title: '%{name}: "%{quote}"'
     visibilities:
       private: Imeḍfaṛen kan
+      private_long: Sken i ymeḍfaṛen kan
       public_long: Yal yiwen·t yezmer at iwali
   stream_entries:
+    pinned: Tijewwiqt yettwasentḍen
     sensitive_content: Agbur amḥulfu
   terms:
     title: Tiwtilin n useqdec akked tsertit tabaḍnit n %{instance}
@@ -535,6 +590,7 @@ kab:
       full_handle: Tansa umiḍan-ik takemmalit
       review_preferences_action: Beddel imenyafen
       subject: Ansuf γer Maṣṭudun
+      tips: Tixbaluyin
       title: Ansuf yessek·em, %{name}!
   users:
     signed_in_as: 'Teqqneḍ amzun d:'
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index d350a8e20..976072368 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -39,7 +39,7 @@ nl:
     unavailable_content_description:
       domain: Server
       reason: 'Reden:'
-      rejecting_media: Mediabestanden van deze server worden niet verwerkt en er worden geen thumbnails getoond. Je moet handmatig naar deze server doorklikken om de mediabestanden te kunnen bekijken.
+      rejecting_media: 'Mediabestanden van deze server worden niet verwerkt en er worden geen thumbnails getoond. Je moet handmatig naar deze server doorklikken om de mediabestanden te kunnen bekijken:'
       silenced: Toots van deze server worden nergens weergegeven, behalve op jouw eigen starttijdlijn wanneer je het account volgt.
       suspended: Je bent niet in staat om iemand van deze server te volgen, en er worden geen gegevens van deze server verwerkt of opgeslagen, en met deze server uitgewisseld.
     unavailable_content_html: Met Mastodon kun je in het algemeen berichten bekijken van en communiceren met gebruikers van elke andere server in de fediverse. Dit zijn de uitzonderingen die door deze server zijn gemaakt en expliciet alleen hier gelden.
@@ -953,8 +953,8 @@ nl:
     public_timelines: Openbare tijdlijnen
   reactions:
     errors:
-      limit_reached: Limiet van verschillende reacties bereikt
-      unrecognized_emoji: is geen bestaande emoji
+      limit_reached: Limiet van verschillende emoji-reacties bereikt
+      unrecognized_emoji: is geen bestaande emoji-reactie
   relationships:
     activity: Accountactiviteit
     dormant: Sluimerend
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 774319a5a..6f04720c5 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -11,6 +11,7 @@ pl:
     apps: Aplikacje
     apps_platforms: Korzystaj z Mastodona z poziomu iOS-a, Androida i innych
     browse_directory: Przeglądaj katalog profilów i filtruj z uwzględnieniem zainteresowań
+    browse_local_posts: Przeglądaj strumień publicznych wpisów z tego serwera
     browse_public_posts: Przeglądaj strumień publicznych wpisów na Mastodonie na żywo
     contact: Kontakt
     contact_missing: Nie ustawiono
@@ -85,6 +86,7 @@ pl:
     roles:
       admin: Administrator
       bot: Bot
+      group: Grupa
       moderator: Moderator
     unavailable: Profil niedostępny
     unfollow: Przestań śledzić
@@ -204,11 +206,15 @@ pl:
         change_email_user: "%{name} zmienił(a) adres e-mail użytkownika %{target}"
         confirm_user: "%{name} potwierdził(a) adres e-mail użytkownika %{target}"
         create_account_warning: "%{name} wysłał(a) ostrzeżenie do %{target}"
+        create_announcement: "%{name} utworzył(a) nowe ogłoszenie %{target}"
         create_custom_emoji: "%{name} dodał(a) nowe emoji %{target}"
+        create_domain_allow: "%{name} dodał(a) na białą listę domenę %{target}"
         create_domain_block: "%{name} zablokował(a) domenę %{target}"
         create_email_domain_block: "%{name} dodał(a) domenę e-mail %{target} na czarną listę"
         demote_user: "%{name} zdegradował(a) użytkownika %{target}"
+        destroy_announcement: "%{name} usunął(-ęła) ogłoszenie %{target}"
         destroy_custom_emoji: "%{name} usunął(-ęła) emoji %{target}"
+        destroy_domain_allow: "%{name} usunął(-ęła) domenę %{target} z białej listy"
         destroy_domain_block: "%{name} odblokował(a) domenę %{target}"
         destroy_email_domain_block: "%{name} usunął(-ęła) domenę e-mail %{target} z czarnej listy"
         destroy_status: "%{name} usunął(-ęła) wpis użytkownika %{target}"
@@ -228,10 +234,26 @@ pl:
         unassigned_report: "%{name} cofnął(-ęła) przypisanie zgłoszenia %{target}"
         unsilence_account: "%{name} cofnął(-ęła) wyciszenie konta %{target}"
         unsuspend_account: "%{name} cofnął(-ęła) zawieszenie konta %{target}"
+        update_announcement: "%{name} zaktualizował(-a) ogłoszenie %{target}"
         update_custom_emoji: "%{name} zaktualizował(a) emoji %{target}"
         update_status: "%{name} zaktualizował(a) wpis użytkownika %{target}"
       deleted_status: "(usunięty wpis)"
       title: Dziennik działań administracyjnych
+    announcements:
+      destroyed_msg: Pomyślnie usunięto ogłoszenie!
+      edit:
+        title: Edytuj ogłoszenie
+      empty: Nie znaleziono ogłoszeń.
+      live: Na żywo
+      new:
+        create: Utwórz ogłoszenie
+        title: Nowe ogłoszenie
+      published_msg: Pomyślnie opublikowano ogłoszenie!
+      scheduled_for: Zaplanowano na %{time}
+      scheduled_msg: Zaplanowano publikację ogłoszenia!
+      title: Ogłoszenia
+      unpublished_msg: Pomyślnie wycofano publikację ogłoszenia!
+      updated_msg: Pomyślnie zaktualizowano ogłoszenie!
     custom_emojis:
       assign_category: Ustaw kategorię
       by_domain: Domeny
@@ -243,9 +265,11 @@ pl:
       delete: Usuń
       destroyed_msg: Pomyślnie usunięto emoji!
       disable: Wyłącz
+      disabled: Wyłączone
       disabled_msg: Pomyślnie wyłączono emoji
       emoji: Emotikona
       enable: Włącz
+      enabled: Włączone
       enabled_msg: Pomyślnie przywrócono emoji
       image_hint: Plik PNG ważący do 50KB
       list: Dodaj do listy
@@ -314,6 +338,7 @@ pl:
       private_comment: Prywatny komentarz
       private_comment_hint: Komentarz na temat ograniczeń dla tej domeny do wewnętrznej informacji dla moderatorów.
       public_comment: Publiczny komentarz
+      public_comment_hint: Komentarz dotyczący tego ograniczenia domeny widoczny publicznie, jeżeli wyświetlanie listy ograniczonych domen jest włączone.
       reject_media: Odrzucaj pliki multimedialne
       reject_media_hint: Usuwa przechowywane lokalnie pliki multimedialne i nie pozwala na ich pobieranie. Nieprzydatne przy zawieszeniu
       reject_reports: Odrzucaj zgłoszenia
@@ -342,6 +367,7 @@ pl:
       delete: Usuń
       destroyed_msg: Pomyślnie usunięto blokadę domeny e-mail
       domain: Domena
+      empty: Żadna domena e-mail nie znajduje się obecnie na czarnej liście.
       new:
         create: Utwórz blokadę
         title: Nowa blokada domeny e-mail
@@ -376,6 +402,8 @@ pl:
       title: Zaproszenia
     pending_accounts:
       title: Oczekujące konta (%{count})
+    relationships:
+      title: Relacje %{acct}
     relays:
       add_new: Dodaj nowy
       delete: Usuń
@@ -400,6 +428,7 @@ pl:
       are_you_sure: Czy na pewno?
       assign_to_self: Przypisz do siebie
       assigned: Przypisany moderator
+      by_target_domain: Domena zgłaszanego konta
       comment:
         none: Brak
       created_at: Zgłoszono
diff --git a/config/locales/simple_form.kab.yml b/config/locales/simple_form.kab.yml
index e62fd2447..db4369e92 100644
--- a/config/locales/simple_form.kab.yml
+++ b/config/locales/simple_form.kab.yml
@@ -5,27 +5,29 @@ kab:
       account_alias:
         acct: Specify the username@domain of the account you want to move from
       account_migration:
-        acct: Sekcem isem n umseqdac@taɣult n umiḍan wuɣur tebɣiḍ ad tuɣaleḍ
+        acct: Sekcem isem n umseqdac@taγult n umiḍan anida itebγiḍ ad gujjeḍ
       admin_account_action:
-        send_email_notification: Amseqdac ad t-id-yewweḍ usefhem ɣef wayen yeḍran akked umiḍan-is
+        send_email_notification: Amseqdac ad t-id-yewweḍ usefhem γef wayen yeḍran akked umiḍan-is
         type_html: Fren d acu ara txedmeḍ s <strong>%{acct}</strong>
       defaults:
         autofollow: Imdanen ara ijerrden s usnebgi-inek, ad k-ḍefṛen s wudem awurman
-        discoverable: Tabdert n yimaɣnuten d udem-nniḍen i umiḍan-ik akken ad yettwassen ugar
+        discoverable: Tabdert n yimaγnuten d udem-nniḍen i umiḍan-ik akken ad yettwassen ugar
         email: Ad n-teṭṭfeḍ imayl i usentem
-        irreversible: Tibarraḥin i tessazedgeḍ ad ttwakksent i lebda, ula ma tekkseḍ imsizdeg-nni ar zdat
-        locale: Tutlayt n ugrudem, imaylen d tilɣa
+        irreversible: Tijewwaqin i tessazedgeḍ ad ttwakksent i lebda, ula ma tekkseḍ imsizdeg-nni ar zdat
+        locale: Tutlayt n ugrudem, imaylen d tilγa
         password: Seqdec ma drus 8 n yisekkilen
-        setting_hide_network: Wid i teṭṭafaṛeḍ d wid i k-yeṭṭafaṛen ur d-ttwaseknen ara deg umaɣnu-inek
+        setting_hide_network: Wid i teṭṭafaṛeḍ d wid i k-yeṭṭafaṛen ur d-ttwaseknen ara deg umaγnu-inek
         username: Isem-ik n umseqdac ad yili d ayiwen, ulac am netta deg %{domain}
       featured_tag:
-        name: 'Ahat ad tebɣuḍ ad tesqedceḍ yiwen gar-asen:'
+        name: 'Ahat ad tebγuḍ ad tesqedceḍ yiwen gar-asen:'
       imports:
         data: Afaylu CSV id yusan seg uqeddac-nniḍen n Maṣṭudun
     labels:
       account:
         fields:
           value: Agbur
+      account_migration:
+        acct: Tansa n umiḍan amaynut
       admin_account_action:
         types:
           silence: Sgugem
@@ -49,6 +51,7 @@ kab:
         setting_display_media_hide_all: Ffer kullec
         setting_display_media_show_all: Sken kullec
         setting_hide_network: Ffer azetta-k·m
+        setting_theme: Asental n wesmel
         username: Isem n useqdac
         username_or_email: Isem n useqdac neγ imal
         whole_word: Awal akk
@@ -57,7 +60,7 @@ kab:
       invite:
         comment: Awennit
       invite_request:
-        text: Acimi tebɣiḍ ad ternuḍ iman-ik?
+        text: Acimi tebγiḍ ad ternuḍ iman-ik?
     'no': Ala
     required:
       mark: "*"
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index d3d726440..c985badb4 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -39,12 +39,16 @@ pl:
         whole_word: Jeśli słowo lub fraza składa się jedynie z liter lub cyfr, filtr będzie zastosowany tylko do pełnych wystąpień
       featured_tag:
         name: 'Sugerujemy użycie jednego z następujących:'
+      form_challenge:
+        current_password: Wchodzisz w strefę bezpieczną
       imports:
         data: Plik CSV wyeksportowany z innego serwera Mastodona
       invite_request:
         text: To pomoże nam w recenzji Twojej aplikacji
       sessions:
         otp: 'Wprowadź kod weryfikacji dwuetapowej z telefonu lub wykorzystaj jeden z kodów zapasowych:'
+      tag:
+        name: Możesz zmieniać tylko wielkość liter, np. aby były bardziej widoczne
       user:
         chosen_languages: Jeżeli zaznaczone, tylko wpisy w wybranych językach będą wyświetlane na publicznych osiach czasu
     labels:
@@ -52,9 +56,14 @@ pl:
         fields:
           name: Nazwa
           value: Zawartość
+      account_alias:
+        acct: Nazwa starego konta
+      account_migration:
+        acct: Nazwa nowego konta
       account_warning_preset:
         text: Tekst szablonu
       admin_account_action:
+        include_statuses: Uwzględniaj zgłoszone wpisy w wiadomości e-mail
         send_email_notification: Powiadom użytkownika mailem
         text: Niestandardowe ostrzeżenie
         type: Działanie
@@ -64,6 +73,12 @@ pl:
           silence: Wycisz
           suspend: Zawieś i nieodwracalnie usuń dane konta
         warning_preset_id: Użyj szablonu ostrzeżenia
+      announcement:
+        all_day: Wydarzenie całodniowe
+        ends_at: Koniec wydarzenia
+        scheduled_at: Zaplanuj publikację
+        starts_at: Początek wydarzenia
+        text: Ogłoszenie
       defaults:
         autofollow: Zapraszaj do śledzenia swojego konta
         avatar: Awatar
@@ -94,6 +109,7 @@ pl:
         setting_aggregate_reblogs: Grupuj podbicia na osiach czasu
         setting_auto_play_gif: Automatycznie odtwarzaj animowane GIFy
         setting_boost_modal: Pytaj o potwierdzenie przed podbiciem
+        setting_crop_images: Przycinaj obrazki w nierozwiniętych wpisach do 16x9
         setting_default_language: Język wpisów
         setting_default_privacy: Widoczność wpisów
         setting_default_sensitive: Zawsze oznaczaj zawartość multimedialną jako wrażliwą
@@ -110,8 +126,11 @@ pl:
         setting_show_application: Informuj o aplikacji z której wysłano wpisy
         setting_skin: Motyw
         setting_system_font_ui: Używaj domyślnej czcionki systemu
+        setting_theme: Motyw strony
+        setting_trends: Pokazuj dzisiejsze „Na czasie”
         setting_unfollow_modal: Pytaj o potwierdzenie przed cofnięciem śledzenia
         setting_use_blurhash: Pokazuj kolorowe gradienty dla ukrytej zawartości multimedialnej
+        setting_use_pending_items: Tryb spowolniony
         severity: Priorytet
         type: Importowane dane
         username: Nazwa użytkownika
@@ -123,6 +142,8 @@ pl:
         must_be_follower: Nie wyświetlaj powiadomień od osób, które Cię nie śledzą
         must_be_following: Nie wyświetlaj powiadomień od osób, których nie śledzisz
         must_be_following_dm: Nie wyświetlaj wiadomości bezpośrednich od osób, których nie śledzisz
+      invite:
+        comment: Komentarz
       invite_request:
         text: Czemu chcesz dołączyć?
       notification_emails:
@@ -134,6 +155,12 @@ pl:
         pending_account: Wyślij e-mail kiedy nowe konto potrzebuje recenzji
         reblog: Powiadamiaj mnie e-mailem, gdy ktoś podbije mój wpis
         report: Powiadamiaj mnie e-mailem, gdy zostanie utworzone nowe zgłoszenie
+        trending_tag: Nieprzejrzany hashtag jest na czasie
+      tag:
+        listable: Pozwól, aby ten hashtag pojawiał się w wynikach wyszukiwania i katalogu profilów
+        name: Hashtag
+        trendable: Pozwól na wyświetlanie tego hashtagu w „Na czasie”
+        usable: Pozwól na umieszczanie tego hashtagu we wpisach
     'no': Nie
     recommended: Polecane
     required:
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 16adcb837..dbee6bb12 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -357,6 +357,7 @@ sk:
       delete: Vymaž
       destroyed_msg: Emailová doména bola úspešne vymazaná zo zoznamu zakázaných
       domain: Doména
+      empty: Žiadné emailové domény niesú v súčasnosti na čiernej listine.
       new:
         create: Pridaj doménu
         title: Nový email na zablokovanie
@@ -391,6 +392,8 @@ sk:
       title: Pozvánky
     pending_accounts:
       title: Čakajúcich účtov (%{count})
+    relationships:
+      title: Vzťahy užívateľa %{acct}
     relays:
       add_new: Pridaj nový federovací mostík
       delete: Vymaž
@@ -467,6 +470,8 @@ sk:
         users: Prihláseným, miestnym užívateľom
       domain_blocks_rationale:
         title: Ukáž zdôvodnenie
+      enable_bootstrap_timeline_accounts:
+        title: Novým užívateľom povoľ východiskové následovania
       hero:
         desc_html: Zobrazuje sa na hlavnej stránke. Doporučené je rozlišenie aspoň 600x100px. Pokiaľ nič nieje dodané, bude nastavený základný orázok serveru.
         title: Obrázok hrdinu
@@ -594,6 +599,7 @@ sk:
     confirmation_dialogs: Potvrdzovacie dialógy
     discovery: Nájdenie
     localization:
+      body: Mastodon je prekladaný dobrovoľníkmi.
       guide_link_text: Prispievať môže každý.
     sensitive_content: Chúlostivý obsah
     toot_layout: Rozloženie príspevkov
@@ -938,6 +944,7 @@ sk:
     dormant: Spiace
     followers: Následovatelia
     following: Následovaní
+    invited: Pozvaný/á
     last_active: Naposledy aktívny
     most_recent: Najnovšie
     moved: Presunuli sa
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index 4a56470d0..c3e288eee 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -17,7 +17,7 @@ module Mastodon
     end
 
     def flags
-      'rc2'
+      ''
     end
 
     def suffix
diff --git a/spec/lib/sanitize_config_spec.rb b/spec/lib/sanitize_config_spec.rb
index c5143bcef..50558a0d8 100644
--- a/spec/lib/sanitize_config_spec.rb
+++ b/spec/lib/sanitize_config_spec.rb
@@ -14,5 +14,21 @@ describe Sanitize::Config do
     it 'keeps ul' do
       expect(Sanitize.fragment('<p>Check out:</p><ul><li>Foo</li><li>Bar</li></ul>', subject)).to eq '<p>Check out:</p><ul><li>Foo</li><li>Bar</li></ul>'
     end
+
+    it 'removes a without href' do
+      expect(Sanitize.fragment('<a>Test</a>', subject)).to eq 'Test'
+    end
+
+    it 'removes a without href and only keeps text content' do
+      expect(Sanitize.fragment('<a><span class="invisible">foo&amp;</span><span>Test</span></a>', subject)).to eq 'foo&amp;Test'
+    end
+
+    it 'removes a with unsupported scheme in href' do
+      expect(Sanitize.fragment('<a href="foo://bar">Test</a>', subject)).to eq 'Test'
+    end
+
+    it 'keeps a with href' do
+      expect(Sanitize.fragment('<a href="http://example.com">Test</a>', subject)).to eq '<a href="http://example.com" rel="nofollow noopener tag noreferrer" target="_blank">Test</a>'
+    end
   end
 end