about summary refs log tree commit diff
diff options
context:
space:
mode:
authorThibG <thib@sitedethib.com>2018-08-22 21:35:07 +0200
committerGitHub <noreply@github.com>2018-08-22 21:35:07 +0200
commit8aa58e34bb2b62192a997ac7ea8919b22fc45f80 (patch)
treeabc0ea9862c55c2e114c855b20eb4a35f1141709
parent628fca50e20bcf41f206877083fc5ee8789c1088 (diff)
parente70fc059a9511d43b42c2502514f6220b416cdd5 (diff)
Merge pull request #665 from ThibG/glitch-soc/merge-upstream
Merge upstream changes
-rw-r--r--app/chewy/statuses_index.rb2
-rw-r--r--app/controllers/admin/reports_controller.rb8
-rw-r--r--app/controllers/admin/suspensions_controller.rb39
-rw-r--r--app/helpers/admin/action_logs_helper.rb2
-rw-r--r--app/helpers/jsonld_helper.rb6
-rw-r--r--app/javascript/mastodon/locales/ar.json13
-rw-r--r--app/javascript/mastodon/locales/ast.json1
-rw-r--r--app/javascript/mastodon/locales/bg.json1
-rw-r--r--app/javascript/mastodon/locales/ca.json1
-rw-r--r--app/javascript/mastodon/locales/co.json1
-rw-r--r--app/javascript/mastodon/locales/cs.json13
-rw-r--r--app/javascript/mastodon/locales/da.json31
-rw-r--r--app/javascript/mastodon/locales/de.json1
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json4
-rw-r--r--app/javascript/mastodon/locales/el.json1
-rw-r--r--app/javascript/mastodon/locales/en.json1
-rw-r--r--app/javascript/mastodon/locales/eo.json11
-rw-r--r--app/javascript/mastodon/locales/es.json1
-rw-r--r--app/javascript/mastodon/locales/eu.json5
-rw-r--r--app/javascript/mastodon/locales/fa.json7
-rw-r--r--app/javascript/mastodon/locales/fi.json1
-rw-r--r--app/javascript/mastodon/locales/fr.json5
-rw-r--r--app/javascript/mastodon/locales/gl.json5
-rw-r--r--app/javascript/mastodon/locales/he.json11
-rw-r--r--app/javascript/mastodon/locales/hr.json1
-rw-r--r--app/javascript/mastodon/locales/hu.json1
-rw-r--r--app/javascript/mastodon/locales/hy.json1
-rw-r--r--app/javascript/mastodon/locales/id.json1
-rw-r--r--app/javascript/mastodon/locales/io.json1
-rw-r--r--app/javascript/mastodon/locales/it.json3
-rw-r--r--app/javascript/mastodon/locales/ja.json5
-rw-r--r--app/javascript/mastodon/locales/ka.json1
-rw-r--r--app/javascript/mastodon/locales/ko.json1
-rw-r--r--app/javascript/mastodon/locales/nl.json5
-rw-r--r--app/javascript/mastodon/locales/no.json1
-rw-r--r--app/javascript/mastodon/locales/oc.json1
-rw-r--r--app/javascript/mastodon/locales/pl.json1
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json1
-rw-r--r--app/javascript/mastodon/locales/pt.json1
-rw-r--r--app/javascript/mastodon/locales/ru.json1
-rw-r--r--app/javascript/mastodon/locales/sk.json1
-rw-r--r--app/javascript/mastodon/locales/sl.json1
-rw-r--r--app/javascript/mastodon/locales/sr-Latn.json1
-rw-r--r--app/javascript/mastodon/locales/sr.json1
-rw-r--r--app/javascript/mastodon/locales/sv.json5
-rw-r--r--app/javascript/mastodon/locales/te.json1
-rw-r--r--app/javascript/mastodon/locales/th.json1
-rw-r--r--app/javascript/mastodon/locales/tr.json1
-rw-r--r--app/javascript/mastodon/locales/uk.json1
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json1
-rw-r--r--app/javascript/mastodon/locales/zh-HK.json1
-rw-r--r--app/javascript/mastodon/locales/zh-TW.json1
-rw-r--r--app/javascript/styles/mastodon/forms.scss6
-rw-r--r--app/lib/ostatus/activity/creation.rb11
-rw-r--r--app/models/account.rb7
-rw-r--r--app/models/form/admin_suspension_confirmation.rb7
-rw-r--r--app/models/status.rb3
-rw-r--r--app/services/activitypub/fetch_remote_account_service.rb2
-rw-r--r--app/services/activitypub/fetch_remote_key_service.rb2
-rw-r--r--app/services/activitypub/fetch_remote_status_service.rb2
-rw-r--r--app/services/backup_service.rb24
-rw-r--r--app/services/fetch_remote_account_service.rb7
-rw-r--r--app/views/about/more.html.haml4
-rw-r--r--app/views/about/show.html.haml8
-rw-r--r--app/views/admin/accounts/show.html.haml2
-rw-r--r--app/views/admin/reports/show.html.haml2
-rw-r--r--app/views/admin/suspensions/new.html.haml25
-rw-r--r--config/locales/ar.yml69
-rw-r--r--config/locales/cs.yml15
-rw-r--r--config/locales/da.yml30
-rw-r--r--config/locales/devise.da.yml21
-rw-r--r--config/locales/doorkeeper.da.yml5
-rw-r--r--config/locales/doorkeeper.uk.yml2
-rw-r--r--config/locales/el.yml13
-rw-r--r--config/locales/en.yml14
-rw-r--r--config/locales/eo.yml48
-rw-r--r--config/locales/eu.yml31
-rw-r--r--config/locales/fa.yml20
-rw-r--r--config/locales/fr.yml6
-rw-r--r--config/locales/gl.yml19
-rw-r--r--config/locales/he.yml7
-rw-r--r--config/locales/it.yml48
-rw-r--r--config/locales/ja.yml11
-rw-r--r--config/locales/nl.yml13
-rw-r--r--config/locales/oc.yml11
-rw-r--r--config/locales/pl.yml2
-rw-r--r--config/locales/pt-BR.yml15
-rw-r--r--config/locales/simple_form.ar.yml2
-rw-r--r--config/locales/simple_form.da.yml28
-rw-r--r--config/locales/simple_form.eu.yml6
-rw-r--r--config/locales/simple_form.fa.yml4
-rw-r--r--config/locales/simple_form.uk.yml1
-rw-r--r--config/locales/uk.yml1
-rw-r--r--config/routes.rb2
-rw-r--r--db/migrate/20180820232245_add_foreign_key_indices.rb16
-rw-r--r--db/schema.rb10
-rw-r--r--spec/controllers/admin/reports_controller_spec.rb15
-rw-r--r--spec/controllers/admin/suspensions_controller_spec.rb2
-rw-r--r--spec/models/status_spec.rb11
-rw-r--r--spec/services/activitypub/fetch_remote_account_service_spec.rb7
-rw-r--r--spec/services/activitypub/fetch_remote_status_service_spec.rb22
-rw-r--r--spec/services/fetch_remote_account_service_spec.rb20
-rw-r--r--spec/services/fetch_remote_status_service_spec.rb52
103 files changed, 757 insertions, 167 deletions
diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb
index 8bf5b4af7..d3104172c 100644
--- a/app/chewy/statuses_index.rb
+++ b/app/chewy/statuses_index.rb
@@ -31,7 +31,7 @@ class StatusesIndex < Chewy::Index
     },
   }
 
-  define_type ::Status.without_reblogs do
+  define_type ::Status.unscoped.without_reblogs do
     crutch :mentions do |collection|
       data = ::Mention.where(status_id: collection.map(&:id)).pluck(:status_id, :account_id)
       data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) }
diff --git a/app/controllers/admin/reports_controller.rb b/app/controllers/admin/reports_controller.rb
index d00b3d222..5d7f43e00 100644
--- a/app/controllers/admin/reports_controller.rb
+++ b/app/controllers/admin/reports_controller.rb
@@ -44,14 +44,8 @@ module Admin
       when 'resolve'
         @report.resolve!(current_account)
         log_action :resolve, @report
-      when 'suspend'
-        Admin::SuspensionWorker.perform_async(@report.target_account.id)
-
-        log_action :resolve, @report
-        log_action :suspend, @report.target_account
-
-        resolve_all_target_account_reports
       when 'silence'
+        @report.resolve!(current_account)
         @report.target_account.update!(silenced: true)
 
         log_action :resolve, @report
diff --git a/app/controllers/admin/suspensions_controller.rb b/app/controllers/admin/suspensions_controller.rb
index 5f222e125..0c7bdad9e 100644
--- a/app/controllers/admin/suspensions_controller.rb
+++ b/app/controllers/admin/suspensions_controller.rb
@@ -4,11 +4,24 @@ module Admin
   class SuspensionsController < BaseController
     before_action :set_account
 
+    def new
+      @suspension = Form::AdminSuspensionConfirmation.new(report_id: params[:report_id])
+    end
+
     def create
       authorize @account, :suspend?
-      Admin::SuspensionWorker.perform_async(@account.id)
-      log_action :suspend, @account
-      redirect_to admin_accounts_path
+
+      @suspension = Form::AdminSuspensionConfirmation.new(suspension_params)
+
+      if suspension_params[:acct] == @account.acct
+        resolve_report! if suspension_params[:report_id]
+        perform_suspend!
+        mark_reports_resolved!
+        redirect_to admin_accounts_path
+      else
+        flash.now[:alert] = I18n.t('admin.suspensions.bad_acct_msg')
+        render :new
+      end
     end
 
     def destroy
@@ -23,5 +36,25 @@ module Admin
     def set_account
       @account = Account.find(params[:account_id])
     end
+
+    def suspension_params
+      params.require(:form_admin_suspension_confirmation).permit(:acct, :report_id)
+    end
+
+    def resolve_report!
+      report = Report.find(suspension_params[:report_id])
+      report.resolve!(current_account)
+      log_action :resolve, report
+    end
+
+    def perform_suspend!
+      @account.suspend!
+      Admin::SuspensionWorker.perform_async(@account.id)
+      log_action :suspend, @account
+    end
+
+    def mark_reports_resolved!
+      Report.where(target_account: @account).unresolved.update_all(action_taken: true, action_taken_by_account_id: current_account.id)
+    end
   end
 end
diff --git a/app/helpers/admin/action_logs_helper.rb b/app/helpers/admin/action_logs_helper.rb
index 85bd30304..c28f0be6b 100644
--- a/app/helpers/admin/action_logs_helper.rb
+++ b/app/helpers/admin/action_logs_helper.rb
@@ -33,7 +33,7 @@ module Admin::ActionLogsHelper
     when 'DomainBlock', 'EmailDomainBlock'
       link_to attributes['domain'], "https://#{attributes['domain']}"
     when 'Status'
-      tmp_status = Status.new(attributes)
+      tmp_status = Status.new(attributes.except('reblogs_count', 'favourites_count'))
       if tmp_status.account
         link_to tmp_status.account&.acct || "##{tmp_status.account_id}", admin_account_path(tmp_status.account_id)
       else
diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb
index 9d2b6cf00..532397272 100644
--- a/app/helpers/jsonld_helper.rb
+++ b/app/helpers/jsonld_helper.rb
@@ -73,8 +73,10 @@ module JsonLdHelper
     end
   end
 
-  def body_to_json(body)
-    body.is_a?(String) ? Oj.load(body, mode: :strict) : body
+  def body_to_json(body, compare_id: nil)
+    json = body.is_a?(String) ? Oj.load(body, mode: :strict) : body
+    return if compare_id.present? && json['id'] != compare_id
+    json
   rescue Oj::ParseError
     nil
   end
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index b14be3434..b38dbcf73 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -7,7 +7,7 @@
   "account.disclaimer_full": "قد لا تعكس المعلومات أدناه الملف الشخصي الكامل للمستخدم.",
   "account.domain_blocked": "النطاق مخفي",
   "account.edit_profile": "تعديل الملف الشخصي",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "إبرازه على الملف الشخصي",
   "account.follow": "تابِع",
   "account.followers": "المتابعون",
   "account.follows": "يتبع",
@@ -27,7 +27,7 @@
   "account.show_reblogs": "عرض ترقيات @{name}",
   "account.unblock": "إلغاء الحظر عن @{name}",
   "account.unblock_domain": "فك حظر {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "إزالة ترويجه مِن الملف الشخصي",
   "account.unfollow": "إلغاء المتابعة",
   "account.unmute": "إلغاء الكتم عن @{name}",
   "account.unmute_notifications": "إلغاء كتم إخطارات @{name}",
@@ -90,7 +90,7 @@
   "confirmations.redraft.message": "هل أنت متأكد من أنك تريد حذف هذا المنشور و إعادة صياغته ؟ سوف تفقد جميع الردود و الترقيات و المفضلة المتصلة به.",
   "confirmations.unfollow.confirm": "إلغاء المتابعة",
   "confirmations.unfollow.message": "متأكد من أنك تريد إلغاء متابعة {name} ؟",
-  "embed.instructions": "يمكنكم إدماج هذه الحالة على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.",
+  "embed.instructions": "يمكنكم إدماج هذا المنشور على موقعكم الإلكتروني عن طريق نسخ الشفرة أدناه.",
   "embed.preview": "هكذا ما سوف يبدو عليه :",
   "emoji_button.activity": "الأنشطة",
   "emoji_button.custom": "مخصص",
@@ -109,7 +109,7 @@
   "empty_column.community": "الخط الزمني المحلي فارغ. أكتب شيئا ما للعامة كبداية !",
   "empty_column.direct": "لم تتلق أية رسالة خاصة مباشِرة بعد. سوف يتم عرض الرسائل المباشرة هنا إن قمت بإرسال واحدة أو تلقيت البعض منها.",
   "empty_column.hashtag": "ليس هناك بعدُ أي محتوى ذو علاقة بهذا الوسم.",
-  "empty_column.home": "إنك لا تتبع بعد أي شخص إلى حد الآن. زر {public} أو استخدام حقل البحث لكي تبدأ على التعرف على مستخدمين آخرين.",
+  "empty_column.home": "إنّ الخيط الزمني لصفحتك الرئيسية فارغ. قم بزيارة {public} أو استخدم حقل البحث لكي تكتشف مستخدمين آخرين.",
   "empty_column.home.public_timeline": "الخيط العام",
   "empty_column.list": "هذه القائمة فارغة مؤقتا و لكن سوف تمتلئ تدريجيا عندما يبدأ الأعضاء المُنتَمين إليها بنشر تبويقات.",
   "empty_column.notifications": "لم تتلق أي إشعار بعدُ. تفاعل مع المستخدمين الآخرين لإنشاء محادثة.",
@@ -162,6 +162,7 @@
   "missing_indicator.label": "تعذر العثور عليه",
   "missing_indicator.sublabel": "تعذر العثور على هذا المورد",
   "mute_modal.hide_notifications": "هل تود إخفاء الإخطارات القادمة من هذا المستخدم ؟",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "الحسابات المحجوبة",
   "navigation_bar.community_timeline": "الخيط العام المحلي",
   "navigation_bar.direct": "الرسائل المباشِرة",
@@ -181,7 +182,7 @@
   "navigation_bar.preferences": "التفضيلات",
   "navigation_bar.public_timeline": "الخيط العام الموحد",
   "navigation_bar.security": "الأمان",
-  "notification.favourite": "{name} أعجب بمنشورك",
+  "notification.favourite": "أُعجِب {name} بمنشورك",
   "notification.follow": "{name} يتابعك",
   "notification.mention": "{name} ذكرك",
   "notification.reblog": "{name} قام بترقية تبويقك",
@@ -272,7 +273,7 @@
   "status.pinned": "تبويق مثبَّت",
   "status.reblog": "رَقِّي",
   "status.reblog_private": "القيام بالترقية إلى الجمهور الأصلي",
-  "status.reblogged_by": "{name} رقى",
+  "status.reblogged_by": "رقّاه {name}",
   "status.redraft": "إزالة و إعادة الصياغة",
   "status.reply": "ردّ",
   "status.replyAll": "رُد على الخيط",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 1327d0ec2..96e3a14d9 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index fa1ba594d..b41045fb8 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 0ffc7509b..7378b703b 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "No trobat",
   "missing_indicator.sublabel": "Aquest recurs no pot ser trobat",
   "mute_modal.hide_notifications": "Amagar notificacions d'aquest usuari?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Usuaris bloquejats",
   "navigation_bar.community_timeline": "Línia de temps Local",
   "navigation_bar.direct": "Missatges directes",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index feb796577..717397d41 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Micca trovu",
   "missing_indicator.sublabel": "Ùn era micca pussivule di truvà sta risorsa",
   "mute_modal.hide_notifications": "Piattà nutificazione da st'utilizatore?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Utilizatori bluccati",
   "navigation_bar.community_timeline": "Linea pubblica lucale",
   "navigation_bar.direct": "Missaghji diretti",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index e93baf750..b71179ca0 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -7,7 +7,7 @@
   "account.disclaimer_full": "Níže uvedené informace nemusejí zcela odrážet profil uživatele.",
   "account.domain_blocked": "Doména skryta",
   "account.edit_profile": "Upravit profil",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "Představit na profilu",
   "account.follow": "Sleduj",
   "account.followers": "Sledovatelé",
   "account.follows": "Sleduje",
@@ -27,7 +27,7 @@
   "account.show_reblogs": "Zobrazit boosty od uživatele @{name}",
   "account.unblock": "Odblokovat uživatele @{name}",
   "account.unblock_domain": "Odkrýt doménu {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "Nepředstavit na profilu",
   "account.unfollow": "Přestat sledovat",
   "account.unmute": "Přestat ignorovat uživatele @{name}",
   "account.unmute_notifications": "Odtišit oznámení od uživatele @{name}",
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Nenalezeno",
   "missing_indicator.sublabel": "Tento zdroj se nepodařilo najít",
   "mute_modal.hide_notifications": "Skrýt oznámení před tímto uživatelem?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokovaní uživatelé",
   "navigation_bar.community_timeline": "Místní časová osa",
   "navigation_bar.direct": "Přímé zprávy",
@@ -229,11 +230,11 @@
   "privacy.unlisted.short": "Nezobrazované",
   "regeneration_indicator.label": "Načítám…",
   "regeneration_indicator.sublabel": "Váš domovský proud se připravuje!",
-  "relative_time.days": "{number}d",
-  "relative_time.hours": "{number}h",
+  "relative_time.days": "{number} d",
+  "relative_time.hours": "{number} h",
   "relative_time.just_now": "teď",
-  "relative_time.minutes": "{number}m",
-  "relative_time.seconds": "{number}s",
+  "relative_time.minutes": "{number} m",
+  "relative_time.seconds": "{number} s",
   "reply_indicator.cancel": "Zrušit",
   "report.forward": "Přeposlat k {target}",
   "report.forward_hint": "Tento účet je z jiného serveru. Chcete na něj také poslat anonymizovanou kopii?",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 10f52465d..4c38b8eb2 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -7,27 +7,27 @@
   "account.disclaimer_full": "Nedenstående oplysninger reflekterer ikke nødvendigvis brugerens profil fuldstændigt.",
   "account.domain_blocked": "Domænet er blevet skjult",
   "account.edit_profile": "Rediger profil",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "Fremhæv på profil",
   "account.follow": "Følg",
   "account.followers": "Følgere",
   "account.follows": "Følger",
   "account.follows_you": "Følger dig",
   "account.hide_reblogs": "Skjul fremhævelserne fra @{name}",
-  "account.media": "Multimedier",
+  "account.media": "Medie",
   "account.mention": "Nævn @{name}",
   "account.moved_to": "{name} er flyttet til:",
   "account.mute": "Dæmp @{name}",
   "account.mute_notifications": "Dæmp notifikationer fra @{name}",
   "account.muted": "Dæmpet",
-  "account.posts": "Dyt",
-  "account.posts_with_replies": "Toots og svar",
+  "account.posts": "Trut",
+  "account.posts_with_replies": "Trut samt svar",
   "account.report": "Rapporter @{name}",
   "account.requested": "Afventer godkendelse. Tryk for at annullere følgeanmodning",
   "account.share": "Del @{name}s profil",
   "account.show_reblogs": "Vis fremhævelserne fra @{name}",
   "account.unblock": "Fjern blokeringen af @{name}",
   "account.unblock_domain": "Skjul ikke længere {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "Fremhæv ikke på profil",
   "account.unfollow": "Følg ikke længere",
   "account.unmute": "Fjern dæmpningen af @{name}",
   "account.unmute_notifications": "Fjern dæmpningen af notifikationer fra @{name}",
@@ -83,7 +83,7 @@
   "confirmations.delete_list.confirm": "Slet",
   "confirmations.delete_list.message": "Er du sikker på, du vil slette denne liste?",
   "confirmations.domain_block.confirm": "Skjul helt domæne",
-  "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.domain_block.message": "Er du helt sikker på du vil blokere hele {domain} domænet? I de fleste tilfælde vil få specifikke blokeringer eller dæmpninger være nok og at fortrække. Du vil ikke se indhold fra det domæne hverken på offentlige tidslinjer eller i dine notifikationer. Dine følgere fra det domæne vil blive fjernet.",
   "confirmations.mute.confirm": "Dæmp",
   "confirmations.mute.message": "Er du sikker på, du vil dæmpe {name}?",
   "confirmations.redraft.confirm": "Slet & omskriv",
@@ -103,7 +103,7 @@
   "emoji_button.people": "Mennesker",
   "emoji_button.recent": "Oftest brugt",
   "emoji_button.search": "Søg...",
-  "emoji_button.search_results": "Søgeresultat",
+  "emoji_button.search_results": "Søgeresultater",
   "emoji_button.symbols": "Symboler",
   "emoji_button.travel": "Rejser & steder",
   "empty_column.community": "Den lokale tidslinje er tom. Skriv noget offentligt for at starte lavinen!",
@@ -139,7 +139,7 @@
   "keyboard_shortcuts.hotkey": "Hurtigtast",
   "keyboard_shortcuts.legend": "for at vise denne legende",
   "keyboard_shortcuts.mention": "for at nævne forfatteren",
-  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.profile": "til profil af åben forfatter",
   "keyboard_shortcuts.reply": "for at svare",
   "keyboard_shortcuts.search": "for at fokusere søgningen",
   "keyboard_shortcuts.toggle_hidden": "for at vise/skjule tekst bag CW",
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Ikke fundet",
   "missing_indicator.sublabel": "Denne ressource kunne ikke blive fundet",
   "mute_modal.hide_notifications": "Skjul notifikationer fra denne bruger?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokerede brugere",
   "navigation_bar.community_timeline": "Lokal tidslinje",
   "navigation_bar.direct": "Direkte beskeder",
@@ -215,8 +216,8 @@
   "onboarding.page_six.read_guidelines": "Læs venligst {domain}s {guidelines}!",
   "onboarding.page_six.various_app": "apps til mobilen",
   "onboarding.page_three.profile": "Rediger din profil for at ændre profilbillede, beskrivelse og visningsnavn. Der vil du også finde andre indstillinger.",
-  "onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
-  "onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
+  "onboarding.page_three.search": "Brug søgefeltdet for at finde folk og at kigge på hashtags, så som {illustration} and {introductions}. For at finde en person der ikke er på denne instans, brug deres fulde brugernavn.",
+  "onboarding.page_two.compose": "Skriv opslag fra skrive kolonnen. Du kan uploade billeder, ændre privatlivsindstillinger, og tilføje indholds advarsler med ikoner forneden.",
   "onboarding.skip": "Spring over",
   "privacy.change": "Ændre status privatliv",
   "privacy.direct.long": "Post til kun de nævnte brugere",
@@ -243,7 +244,7 @@
   "report.target": "Anmelder {target}",
   "search.placeholder": "Søg",
   "search_popout.search_format": "Avanceret søgeformat",
-  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.full_text": "Simpel tekst returnerer statusser du har skrevet, favoriseret, fremhævet, eller er blevet nævnt i, lige så vel som matchende brugernavne, visningsnavne, og hashtags.",
   "search_popout.tips.hashtag": "emnetag",
   "search_popout.tips.status": "status",
   "search_popout.tips.text": "Simpelt tekst returnerer passende visningsnavne, brugernavne og hashtags",
@@ -275,7 +276,7 @@
   "status.reblogged_by": "{name} fremhævede",
   "status.redraft": "Slet og omskriv",
   "status.reply": "Svar",
-  "status.replyAll": "Svar tråd",
+  "status.replyAll": "Svar samtale",
   "status.report": "Anmeld @{name}",
   "status.sensitive_toggle": "Tryk for at se",
   "status.sensitive_warning": "Følsomt indhold",
@@ -291,11 +292,11 @@
   "tabs_bar.local_timeline": "Lokal",
   "tabs_bar.notifications": "Notifikationer",
   "tabs_bar.search": "Søg",
-  "trends.count_by_accounts": "{count} {rawCount, flere, en {person} flere {people}} snakker",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} snakker",
   "ui.beforeunload": "Din kladde vil gå tabt hvis du forlader Mastodon.",
   "upload_area.title": "Træk og slip for at uploade",
-  "upload_button.label": "Tilføj multimedier",
-  "upload_form.description": "Beskrivelse for de svagtseende",
+  "upload_button.label": "Tilføj medie",
+  "upload_form.description": "Beskriv for de svagtseende",
   "upload_form.focus": "Beskær",
   "upload_form.undo": "Slet",
   "upload_progress.label": "Uploader...",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 83e675682..3427b322b 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Nicht gefunden",
   "missing_indicator.sublabel": "Die Ressource konnte nicht gefunden werden",
   "mute_modal.hide_notifications": "Benachrichtigungen von diesem Account verbergen?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blockierte Profile",
   "navigation_bar.community_timeline": "Lokale Zeitleiste",
   "navigation_bar.direct": "Direktnachrichten",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index f034f195a..2d836be90 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -1175,6 +1175,10 @@
         "id": "navigation_bar.info"
       },
       {
+        "defaultMessage": "Mobile apps",
+        "id": "navigation_bar.apps"
+      },
+      {
         "defaultMessage": "Terms of service",
         "id": "getting_started.terms"
       },
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 1e059b682..76a003f65 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Δε βρέθηκε",
   "missing_indicator.sublabel": "Αδύνατη η εύρεση αυτού του πόρου",
   "mute_modal.hide_notifications": "Απόκρυψη ειδοποιήσεων αυτού του χρήστη;",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Αποκλεισμένοι χρήστες",
   "navigation_bar.community_timeline": "Τοπική ροή",
   "navigation_bar.direct": "Προσωπικά μηνύματα",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 53429f92c..27b2cb45e 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -166,6 +166,7 @@
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 862c2b4d0..f4c316441 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -7,7 +7,7 @@
   "account.disclaimer_full": "Subaj informoj povas reflekti la profilon de la uzanto nekomplete.",
   "account.domain_blocked": "Domajno kaŝita",
   "account.edit_profile": "Redakti profilon",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "Montri en profilo",
   "account.follow": "Sekvi",
   "account.followers": "Sekvantoj",
   "account.follows": "Sekvatoj",
@@ -27,7 +27,7 @@
   "account.show_reblogs": "Montri diskonigojn de @{name}",
   "account.unblock": "Malbloki @{name}",
   "account.unblock_domain": "Malkaŝi {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "Ne montri en profilo",
   "account.unfollow": "Ne plu sekvi",
   "account.unmute": "Malsilentigi @{name}",
   "account.unmute_notifications": "Malsilentigi sciigojn de @{name}",
@@ -139,7 +139,7 @@
   "keyboard_shortcuts.hotkey": "Rapidklavo",
   "keyboard_shortcuts.legend": "por montri ĉi tiun noton",
   "keyboard_shortcuts.mention": "por mencii la aŭtoron",
-  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.profile": "por malfermi la profilon de la aŭtoro",
   "keyboard_shortcuts.reply": "por respondi",
   "keyboard_shortcuts.search": "por fokusigi la serĉilon",
   "keyboard_shortcuts.toggle_hidden": "por montri/kaŝi tekston malantaŭ enhava averto",
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Ne trovita",
   "missing_indicator.sublabel": "Ĉi tiu elemento ne estis trovita",
   "mute_modal.hide_notifications": "Ĉu vi volas kaŝi la sciigojn el ĉi tiu uzanto?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokitaj uzantoj",
   "navigation_bar.community_timeline": "Loka tempolinio",
   "navigation_bar.direct": "Rektaj mesaĝoj",
@@ -169,7 +170,7 @@
   "navigation_bar.domain_blocks": "Kaŝitaj domajnoj",
   "navigation_bar.edit_profile": "Redakti profilon",
   "navigation_bar.favourites": "Stelumoj",
-  "navigation_bar.filters": "Muted words",
+  "navigation_bar.filters": "Silentigitaj vortoj",
   "navigation_bar.follow_requests": "Petoj de sekvado",
   "navigation_bar.info": "Pri ĉi tiu nodo",
   "navigation_bar.keyboard_shortcuts": "Rapidklavoj",
@@ -260,7 +261,7 @@
   "status.direct": "Rekte mesaĝi @{name}",
   "status.embed": "Enkorpigi",
   "status.favourite": "Stelumi",
-  "status.filtered": "Filtered",
+  "status.filtered": "Filtrita",
   "status.load_more": "Ŝargi pli",
   "status.media_hidden": "Aŭdovidaĵo kaŝita",
   "status.mention": "Mencii @{name}",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 2359f4ba3..b17e1411e 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "No encontrado",
   "missing_indicator.sublabel": "No se encontró este recurso",
   "mute_modal.hide_notifications": "Ocultar notificaciones de este usuario?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Usuarios bloqueados",
   "navigation_bar.community_timeline": "Historia local",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index aab24b231..ec27fe425 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -7,7 +7,7 @@
   "account.disclaimer_full": "Baliteke beheko informazioak erabiltzailearen profilaren zati bat baino ez erakustea.",
   "account.domain_blocked": "Ezkutatutako domeinua",
   "account.edit_profile": "Aldatu profila",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "Nabarmendu profilean",
   "account.follow": "Jarraitu",
   "account.followers": "Jarraitzaileak",
   "account.follows": "Jarraitzen",
@@ -27,7 +27,7 @@
   "account.show_reblogs": "Erakutsi @{name}(r)en bultzadak",
   "account.unblock": "Desblokeatu @{name}",
   "account.unblock_domain": "Berriz erakutsi {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "Ez nabarmendu profilean",
   "account.unfollow": "Jarraitzeari utzi",
   "account.unmute": "Desmututu @{name}",
   "account.unmute_notifications": "Desmututu @{name}(r)en jakinarazpenak",
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Ez aurkitua",
   "missing_indicator.sublabel": "Baliabide hau ezin izan da aurkitu",
   "mute_modal.hide_notifications": "Ezkutatu erabiltzaile honen jakinarazpenak?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokeatutako erabiltzaileak",
   "navigation_bar.community_timeline": "Denbora-lerro lokala",
   "navigation_bar.direct": "Mezu zuzenak",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index f95c9dc78..03c6bb7ce 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -7,7 +7,7 @@
   "account.disclaimer_full": "اطلاعات زیر ممکن است نمایهٔ این کاربر را به تمامی نشان ندهد.",
   "account.domain_blocked": "دامین پنهان‌شده",
   "account.edit_profile": "ویرایش نمایه",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "نمایش در نمایه",
   "account.follow": "پی بگیرید",
   "account.followers": "پیگیران",
   "account.follows": "پی می‌گیرد",
@@ -27,7 +27,7 @@
   "account.show_reblogs": "نشان‌دادن بازبوق‌های  @{name}",
   "account.unblock": "رفع انسداد @{name}",
   "account.unblock_domain": "رفع پنهان‌سازی از {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "نهفتن از نمایه",
   "account.unfollow": "پایان پیگیری",
   "account.unmute": "باصدا کردن @{name}",
   "account.unmute_notifications": "باصداکردن اعلان‌ها از طرف @{name}",
@@ -139,7 +139,7 @@
   "keyboard_shortcuts.hotkey": "میان‌بر",
   "keyboard_shortcuts.legend": "برای نمایش این راهنما",
   "keyboard_shortcuts.mention": "برای نام‌بردن از نویسنده",
-  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.profile": "گشودن نمایهٔ نویسنده",
   "keyboard_shortcuts.reply": "برای پاسخ‌دادن",
   "keyboard_shortcuts.search": "برای فعال‌کردن جستجو",
   "keyboard_shortcuts.toggle_hidden": "برای نمایش/نهفتن نوشتهٔ پشت هشدار محتوا",
@@ -162,6 +162,7 @@
   "missing_indicator.label": "پیدا نشد",
   "missing_indicator.sublabel": "این منبع پیدا نشد",
   "mute_modal.hide_notifications": "اعلان‌های این کاربر پنهان شود؟",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "کاربران مسدودشده",
   "navigation_bar.community_timeline": "نوشته‌های محلی",
   "navigation_bar.direct": "پیغام‌های خصوصی",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index c092764fc..0861c42fc 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Ei löytynyt",
   "missing_indicator.sublabel": "Tätä resurssia ei löytynyt",
   "mute_modal.hide_notifications": "Piilota tältä käyttäjältä tulevat ilmoitukset?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Estetyt käyttäjät",
   "navigation_bar.community_timeline": "Paikallinen aikajana",
   "navigation_bar.direct": "Viestit",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index a4797f1fc..79ce01c05 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -7,7 +7,7 @@
   "account.disclaimer_full": "Les données ci-dessous peuvent ne pas refléter ce profil dans sa totalité.",
   "account.domain_blocked": "Domaine caché",
   "account.edit_profile": "Modifier le profil",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "Figure sur le profil",
   "account.follow": "Suivre",
   "account.followers": "Abonné⋅e⋅s",
   "account.follows": "Abonnements",
@@ -27,7 +27,7 @@
   "account.show_reblogs": "Afficher les partages de @{name}",
   "account.unblock": "Débloquer",
   "account.unblock_domain": "Ne plus masquer {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "Ne figure pas sur le profil",
   "account.unfollow": "Ne plus suivre",
   "account.unmute": "Ne plus masquer",
   "account.unmute_notifications": "Réactiver les notifications de @{name}",
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Non trouvé",
   "missing_indicator.sublabel": "Ressource introuvable",
   "mute_modal.hide_notifications": "Masquer les notifications de cette personne ?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Comptes bloqués",
   "navigation_bar.community_timeline": "Fil public local",
   "navigation_bar.direct": "Messages directs",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 6cb399d87..d83b11d74 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -86,8 +86,8 @@
   "confirmations.domain_block.message": "Realmente está segura de que quere bloquear por completo o dominio {domain}? Normalmente é suficiente, e preferible, bloquear de xeito selectivo varios elementos. Non verá contidos de ese dominio en ningunha liña temporal ou nas notificacións. As súas seguidoras en ese dominio serán eliminadas.",
   "confirmations.mute.confirm": "Acalar",
   "confirmations.mute.message": "Está segura de que quere acalar a {name}?",
-  "confirmations.redraft.confirm": "Delete & redraft",
-  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
+  "confirmations.redraft.confirm": "Eliminar e reescribir",
+  "confirmations.redraft.message": "Está segura de querer eliminar este estado e voltalo a escribir? Perderá todas as réplicas, promocións e favoritas da mensaxe.",
   "confirmations.unfollow.confirm": "Deixar de seguir",
   "confirmations.unfollow.message": "Quere deixar de seguir a {name}?",
   "embed.instructions": "Copie o código inferior para incrustar no seu sitio web este estado.",
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Non atopado",
   "missing_indicator.sublabel": "Non se puido atopar o recurso",
   "mute_modal.hide_notifications": "Esconder notificacións deste usuario?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Usuarias bloqueadas",
   "navigation_bar.community_timeline": "Liña temporal local",
   "navigation_bar.direct": "Mensaxes directas",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index ef86c0dfa..d20adce11 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -23,17 +23,17 @@
   "account.posts_with_replies": "Toots with replies",
   "account.report": "לדווח על @{name}",
   "account.requested": "בהמתנה לאישור",
-  "account.share": "לשתף את אודות @{name}",
+  "account.share": "לשתף את הפרופיל של @{name}",
   "account.show_reblogs": "להראות הדהודים מאת @{name}",
   "account.unblock": "הסרת חסימה מעל @{name}",
   "account.unblock_domain": "הסר חסימה מקהילת {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "לא להציג בפרופיל",
   "account.unfollow": "הפסקת מעקב",
   "account.unmute": "הפסקת השתקת @{name}",
   "account.unmute_notifications": "להפסיק הסתרת הודעות מעם @{name}",
-  "account.view_full_profile": "הראה אודות מלאות",
-  "alert.unexpected.message": "An unexpected error occurred.",
-  "alert.unexpected.title": "Oops!",
+  "account.view_full_profile": "הצגת פרופיל מלא",
+  "alert.unexpected.message": "אירעה שגיאה בלתי צפויה.",
+  "alert.unexpected.title": "אופס!",
   "boost_modal.combo": "ניתן להקיש {combo} כדי לדלג בפעם הבאה",
   "bundle_column_error.body": "משהו השתבש בעת הצגת הרכיב הזה.",
   "bundle_column_error.retry": "לנסות שוב",
@@ -162,6 +162,7 @@
   "missing_indicator.label": "לא נמצא",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.hide_notifications": "להסתיר הודעות מחשבון זה?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "חסימות",
   "navigation_bar.community_timeline": "ציר זמן מקומי",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index 2b5adc353..e6ce3359d 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Nije nađen",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokirani korisnici",
   "navigation_bar.community_timeline": "Lokalni timeline",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 791be67e3..80c3a1de8 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Nincs találat",
   "missing_indicator.sublabel": "Ezen forrás nem található",
   "mute_modal.hide_notifications": "Értesítések elrejtése ezen felhasználótól?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Tiltott felhasználók",
   "navigation_bar.community_timeline": "Helyi idővonal",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 1d90c20de..e5ad93fd8 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Չգտնվեց",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.hide_notifications": "Թաքցնե՞լ ցանուցումներն այս օգտատիրոջից։",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Արգելափակված օգտատերեր",
   "navigation_bar.community_timeline": "Տեղական հոսք",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 6b182bbe9..010d35b73 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Tidak ditemukan",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Pengguna diblokir",
   "navigation_bar.community_timeline": "Linimasa lokal",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 75924d9e1..06e6b02d7 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Ne trovita",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokusita uzeri",
   "navigation_bar.community_timeline": "Lokala tempolineo",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index a0e1a1d2d..c9ac57c74 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -139,7 +139,7 @@
   "keyboard_shortcuts.hotkey": "Tasto di scelta rapida",
   "keyboard_shortcuts.legend": "per mostrare questa spiegazione",
   "keyboard_shortcuts.mention": "per menzionare l'autore",
-  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.profile": "per aprire il profilo dell'autore",
   "keyboard_shortcuts.reply": "per rispondere",
   "keyboard_shortcuts.search": "per spostare il focus sulla ricerca",
   "keyboard_shortcuts.toggle_hidden": "per mostrare/nascondere il testo dei CW",
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Non trovato",
   "missing_indicator.sublabel": "Risorsa non trovata",
   "mute_modal.hide_notifications": "Nascondere le notifiche da quest'utente?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Utenti bloccati",
   "navigation_bar.community_timeline": "Timeline locale",
   "navigation_bar.direct": "Messaggi diretti",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 21bcb42f8..d8ec6e934 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -7,7 +7,7 @@
   "account.disclaimer_full": "以下の情報は不正確な可能性があります。",
   "account.domain_blocked": "ドメイン非表示中",
   "account.edit_profile": "プロフィールを編集",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "プロフィールで紹介する",
   "account.follow": "フォロー",
   "account.followers": "フォロワー",
   "account.follows": "フォロー",
@@ -27,7 +27,7 @@
   "account.show_reblogs": "@{name}さんからのブーストを表示",
   "account.unblock": "@{name}さんのブロックを解除",
   "account.unblock_domain": "{domain}を表示",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "プロフィールから外す",
   "account.unfollow": "フォロー解除",
   "account.unmute": "@{name}さんのミュートを解除",
   "account.unmute_notifications": "@{name}さんからの通知を受け取るようにする",
@@ -166,6 +166,7 @@
   "missing_indicator.label": "見つかりません",
   "missing_indicator.sublabel": "見つかりませんでした",
   "mute_modal.hide_notifications": "このユーザーからの通知を隠しますか?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "ブロックしたユーザー",
   "navigation_bar.community_timeline": "ローカルタイムライン",
   "navigation_bar.direct": "ダイレクトメッセージ",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 494270b9d..d2a915c60 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "არაა ნაპოვნი",
   "missing_indicator.sublabel": "ამ რესურსის პოვნა ვერ მოხერხდა",
   "mute_modal.hide_notifications": "დავმალოთ შეტყობინებები ამ მომხმარებლისგან?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "დაბლოკილი მომხმარებლები",
   "navigation_bar.community_timeline": "ლოკალური თაიმლაინი",
   "navigation_bar.direct": "პირდაპირი წერილები",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index b7b280591..18150d17c 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "찾을 수 없습니다",
   "missing_indicator.sublabel": "이 리소스를 찾을 수 없었습니다",
   "mute_modal.hide_notifications": "이 사용자로부터의 알림을 뮤트하시겠습니까?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "차단한 사용자",
   "navigation_bar.community_timeline": "로컬 타임라인",
   "navigation_bar.direct": "다이렉트 메시지",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index c19598a21..72ffbdc6e 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -7,7 +7,7 @@
   "account.disclaimer_full": "De informatie hieronder kan mogelijk een incompleet beeld geven van dit gebruikersprofiel.",
   "account.domain_blocked": "Domein verborgen",
   "account.edit_profile": "Profiel bewerken",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "Op profiel weergeven",
   "account.follow": "Volgen",
   "account.followers": "Volgers",
   "account.follows": "Volgt",
@@ -27,7 +27,7 @@
   "account.show_reblogs": "Toon boosts van @{name}",
   "account.unblock": "Deblokkeer @{name}",
   "account.unblock_domain": "{domain} niet langer negeren",
-  "account.unendorse": "Don't feature on profile",
+  "account.unendorse": "Niet op profiel weergeven",
   "account.unfollow": "Ontvolgen",
   "account.unmute": "@{name} niet langer negeren",
   "account.unmute_notifications": "@{name} meldingen niet langer negeren",
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Niet gevonden",
   "missing_indicator.sublabel": "Deze hulpbron kan niet gevonden worden",
   "mute_modal.hide_notifications": "Verberg meldingen van deze persoon?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Geblokkeerde gebruikers",
   "navigation_bar.community_timeline": "Lokale tijdlijn",
   "navigation_bar.direct": "Directe berichten",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index d11e3a5a4..3e9612edb 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Ikke funnet",
   "missing_indicator.sublabel": "Denne ressursen ble ikke funnet",
   "mute_modal.hide_notifications": "Skjul varslinger fra denne brukeren?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokkerte brukere",
   "navigation_bar.community_timeline": "Lokal tidslinje",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 1d81594ca..6aaf4cc63 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Pas trobat",
   "missing_indicator.sublabel": "Aquesta ressorsa es pas estada trobada",
   "mute_modal.hide_notifications": "Rescondre las notificacions d’aquesta persona ?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Personas blocadas",
   "navigation_bar.community_timeline": "Flux public local",
   "navigation_bar.direct": "Messatges dirèctes",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 42371059d..595e5d57b 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -166,6 +166,7 @@
   "missing_indicator.label": "Nie znaleziono",
   "missing_indicator.sublabel": "Nie można odnaleźć tego zasobu",
   "mute_modal.hide_notifications": "Chcesz ukryć powiadomienia od tego użytkownika?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Zablokowani użytkownicy",
   "navigation_bar.community_timeline": "Lokalna oś czasu",
   "navigation_bar.direct": "Wiadomości bezpośrednie",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 2764fb4c6..bdfdd46e5 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Não encontrado",
   "missing_indicator.sublabel": "Esse recurso não pôde ser encontrado",
   "mute_modal.hide_notifications": "Esconder notificações deste usuário?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Usuários bloqueados",
   "navigation_bar.community_timeline": "Local",
   "navigation_bar.direct": "Mensagens diretas",
diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json
index 94e68db43..b3c4c3ad9 100644
--- a/app/javascript/mastodon/locales/pt.json
+++ b/app/javascript/mastodon/locales/pt.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Não encontrado",
   "missing_indicator.sublabel": "Este recurso não foi encontrado",
   "mute_modal.hide_notifications": "Esconder notificações deste utilizador?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Utilizadores bloqueados",
   "navigation_bar.community_timeline": "Local",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 0e8586903..8ba26a3c8 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Не найдено",
   "missing_indicator.sublabel": "Запрашиваемый ресурс не найден",
   "mute_modal.hide_notifications": "Убрать уведомления от этого пользователя?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Список блокировки",
   "navigation_bar.community_timeline": "Локальная лента",
   "navigation_bar.direct": "Личные сообщения",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 7554485a3..8c36f866d 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Nenájdené",
   "missing_indicator.sublabel": "Tento zdroj sa nepodarilo nájsť",
   "mute_modal.hide_notifications": "Skryť notifikácie od tohoto užívateľa?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokovaní užívatelia",
   "navigation_bar.community_timeline": "Lokálna časová os",
   "navigation_bar.direct": "Súkromné správy",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 8f637143c..01617f790 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index 473b18fa3..96b46077a 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Nije pronađeno",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.hide_notifications": "Sakrij obaveštenja od ovog korisnika?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blokirani korisnici",
   "navigation_bar.community_timeline": "Lokalna lajna",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index 4ee47fb2d..681337947 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Није пронађено",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.hide_notifications": "Сакриј обавештења од овог корисника?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Блокирани корисници",
   "navigation_bar.community_timeline": "Локална лајна",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 0d55fbd82..5c11e72d9 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -3,9 +3,9 @@
   "account.block": "Blockera @{name}",
   "account.block_domain": "Dölj allt från {domain}",
   "account.blocked": "Blockerad",
-  "account.direct": "Direct Message @{name}",
+  "account.direct": "Direktmeddelande @{name}",
   "account.disclaimer_full": "Informationen nedan kan spegla användarens profil ofullständigt.",
-  "account.domain_blocked": "Domän gömd",
+  "account.domain_blocked": "Domän dold",
   "account.edit_profile": "Redigera profil",
   "account.endorse": "Feature on profile",
   "account.follow": "Följ",
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Hittades inte",
   "missing_indicator.sublabel": "Den här resursen kunde inte hittas",
   "mute_modal.hide_notifications": "Dölj notifikationer från denna användare?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blockerade användare",
   "navigation_bar.community_timeline": "Lokal tidslinje",
   "navigation_bar.direct": "Direktmeddelanden",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index f8228e7ff..8aeebd048 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "దొరకలేదు",
   "missing_indicator.sublabel": "ఈ వనరు కనుగొనబడలేదు",
   "mute_modal.hide_notifications": "ఈ వినియోగదారు నుండి నోటిఫికేషన్లను దాచాలా?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "బ్లాక్ చేయబడిన వినియోగదారులు",
   "navigation_bar.community_timeline": "స్థానిక కాలక్రమం",
   "navigation_bar.direct": "ప్రత్యక్ష సందేశాలు",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index ce48e7259..5e4995b71 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Not found",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Blocked users",
   "navigation_bar.community_timeline": "Local timeline",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 032a82a22..be7ad47e4 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Bulunamadı",
   "missing_indicator.sublabel": "This resource could not be found",
   "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Engellenen kullanıcılar",
   "navigation_bar.community_timeline": "Yerel zaman tüneli",
   "navigation_bar.direct": "Direct messages",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index cca98840b..5f7e5c266 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "Не знайдено",
   "missing_indicator.sublabel": "Ресурс не знайдений",
   "mute_modal.hide_notifications": "Приховати сповіщення від користувача?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "Заблоковані користувачі",
   "navigation_bar.community_timeline": "Локальна стрічка",
   "navigation_bar.direct": "Прямі повідомлення",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index dd4ec4adc..378a1a45b 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "找不到内容",
   "missing_indicator.sublabel": "无法找到此资源",
   "mute_modal.hide_notifications": "同时隐藏来自这个用户的通知",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "已屏蔽的用户",
   "navigation_bar.community_timeline": "本站时间轴",
   "navigation_bar.direct": "私信",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 70442cfe8..f0718468a 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "找不到內容",
   "missing_indicator.sublabel": "無法找到內容",
   "mute_modal.hide_notifications": "隱藏來自這用戶的通知嗎?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "被你封鎖的用戶",
   "navigation_bar.community_timeline": "本站時間軸",
   "navigation_bar.direct": "個人訊息",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index 841f79dd3..ca5919e30 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -162,6 +162,7 @@
   "missing_indicator.label": "找不到",
   "missing_indicator.sublabel": "找不到此資源",
   "mute_modal.hide_notifications": "隱藏來自這個使用者的通知?",
+  "navigation_bar.apps": "Mobile apps",
   "navigation_bar.blocks": "封鎖的使用者",
   "navigation_bar.community_timeline": "本地時間軸",
   "navigation_bar.direct": "私訊",
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index 22dbfa8cf..020be5ad2 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -50,6 +50,12 @@ code {
         color: $highlight-text-color;
       }
     }
+
+    code {
+      border-radius: 3px;
+      padding: 0.2em 0.4em;
+      background: darken($ui-base-color, 12%);
+    }
   }
 
   .card {
diff --git a/app/lib/ostatus/activity/creation.rb b/app/lib/ostatus/activity/creation.rb
index d3a303a0c..8f8c70052 100644
--- a/app/lib/ostatus/activity/creation.rb
+++ b/app/lib/ostatus/activity/creation.rb
@@ -7,7 +7,7 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
       return [nil, false]
     end
 
-    return [nil, false] if @account.suspended?
+    return [nil, false] if @account.suspended? || invalid_origin?
 
     RedisLock.acquire(lock_options) do |lock|
       if lock.acquired?
@@ -204,6 +204,15 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
     end
   end
 
+  def invalid_origin?
+    return false unless id.start_with?('http') # Legacy IDs cannot be checked
+
+    needle = Addressable::URI.parse(id).normalized_host
+
+    !(needle.casecmp(@account.domain).zero? ||
+      needle.casecmp(Addressable::URI.parse(@account.remote_url.presence || @account.uri).normalized_host).zero?)
+  end
+
   def lock_options
     { redis: Redis.current, key: "create:#{id}" }
   end
diff --git a/app/models/account.rb b/app/models/account.rb
index 9daf063a5..c84a7406d 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -196,6 +196,13 @@ class Account < ApplicationRecord
     ResolveAccountService.new.call(acct)
   end
 
+  def suspend!
+    transaction do
+      user&.disable! if local?
+      update!(suspended: true)
+    end
+  end
+
   def unsuspend!
     transaction do
       user&.enable! if local?
diff --git a/app/models/form/admin_suspension_confirmation.rb b/app/models/form/admin_suspension_confirmation.rb
new file mode 100644
index 000000000..c34b5b30e
--- /dev/null
+++ b/app/models/form/admin_suspension_confirmation.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class Form::AdminSuspensionConfirmation
+  include ActiveModel::Model
+
+  attr_accessor :acct, :report_id
+end
diff --git a/app/models/status.rb b/app/models/status.rb
index f38227b85..f9c0c68d9 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -395,7 +395,8 @@ class Status < ApplicationRecord
 
     def account_silencing_filter(account)
       if account.silenced?
-        including_silenced_accounts
+        including_myself = left_outer_joins(:account).where(account_id: account.id).references(:accounts)
+        excluding_silenced_accounts.or(including_myself)
       else
         excluding_silenced_accounts
       end
diff --git a/app/services/activitypub/fetch_remote_account_service.rb b/app/services/activitypub/fetch_remote_account_service.rb
index 41fec9170..1ec9ee5dd 100644
--- a/app/services/activitypub/fetch_remote_account_service.rb
+++ b/app/services/activitypub/fetch_remote_account_service.rb
@@ -11,7 +11,7 @@ class ActivityPub::FetchRemoteAccountService < BaseService
     @json = if prefetched_body.nil?
               fetch_resource(uri, id)
             else
-              body_to_json(prefetched_body)
+              body_to_json(prefetched_body, compare_id: id ? uri : nil)
             end
 
     return if !supported_context? || !expected_type? || (break_on_redirect && @json['movedTo'].present?)
diff --git a/app/services/activitypub/fetch_remote_key_service.rb b/app/services/activitypub/fetch_remote_key_service.rb
index 505baccd4..df17d9079 100644
--- a/app/services/activitypub/fetch_remote_key_service.rb
+++ b/app/services/activitypub/fetch_remote_key_service.rb
@@ -17,7 +17,7 @@ class ActivityPub::FetchRemoteKeyService < BaseService
         @json = fetch_resource(uri, id)
       end
     else
-      @json = body_to_json(prefetched_body)
+      @json = body_to_json(prefetched_body, compare_id: id ? uri : nil)
     end
 
     return unless supported_context?(@json) && expected_type?
diff --git a/app/services/activitypub/fetch_remote_status_service.rb b/app/services/activitypub/fetch_remote_status_service.rb
index 2b447abb3..469821032 100644
--- a/app/services/activitypub/fetch_remote_status_service.rb
+++ b/app/services/activitypub/fetch_remote_status_service.rb
@@ -8,7 +8,7 @@ class ActivityPub::FetchRemoteStatusService < BaseService
     @json = if prefetched_body.nil?
               fetch_resource(uri, id, on_behalf_of)
             else
-              body_to_json(prefetched_body)
+              body_to_json(prefetched_body, compare_id: id ? uri : nil)
             end
 
     return unless supported_context? && expected_type?
diff --git a/app/services/backup_service.rb b/app/services/backup_service.rb
index da7db6462..4cfa22ab8 100644
--- a/app/services/backup_service.rb
+++ b/app/services/backup_service.rb
@@ -44,6 +44,7 @@ class BackupService < BaseService
         Gem::Package::TarWriter.new(gz) do |tar|
           dump_media_attachments!(tar)
           dump_outbox!(tar)
+          dump_likes!(tar)
           dump_actor!(tar)
         end
       end
@@ -82,6 +83,8 @@ class BackupService < BaseService
 
     actor[:icon][:url]  = 'avatar' + File.extname(actor[:icon][:url])  if actor[:icon]
     actor[:image][:url] = 'header' + File.extname(actor[:image][:url]) if actor[:image]
+    actor[:outbox]      = 'outbox.json'
+    actor[:likes]       = 'likes.json'
 
     download_to_tar(tar, account.avatar, 'avatar' + File.extname(account.avatar.path)) if account.avatar.exists?
     download_to_tar(tar, account.header, 'header' + File.extname(account.header.path)) if account.header.exists?
@@ -91,15 +94,30 @@ class BackupService < BaseService
     tar.add_file_simple('actor.json', 0o444, json.bytesize) do |io|
       io.write(json)
     end
+  end
+
+  def dump_likes!(tar)
+    collection = serialize(ActivityPub::CollectionPresenter.new(id: 'likes.json', type: :ordered, size: 0, items: []), ActivityPub::CollectionSerializer)
+
+    Status.reorder(nil).joins(:favourites).includes(:account).merge(account.favourites).find_in_batches do |statuses|
+      statuses.each do |status|
+        collection[:totalItems] += 1
+        collection[:orderedItems] << ActivityPub::TagManager.instance.uri_for(status)
+      end
 
-    tar.add_file_simple('key.pem', 0o444, account.private_key.bytesize) do |io|
-      io.write(account.private_key)
+      GC.start
+    end
+
+    json = Oj.dump(collection)
+
+    tar.add_file_simple('likes.json', 0o444, json.bytesize) do |io|
+      io.write(json)
     end
   end
 
   def collection_presenter
     ActivityPub::CollectionPresenter.new(
-      id: account_outbox_url(account),
+      id: 'outbox.json',
       type: :ordered,
       size: account.statuses_count,
       items: []
diff --git a/app/services/fetch_remote_account_service.rb b/app/services/fetch_remote_account_service.rb
index a0f031a44..cfc560022 100644
--- a/app/services/fetch_remote_account_service.rb
+++ b/app/services/fetch_remote_account_service.rb
@@ -27,7 +27,7 @@ class FetchRemoteAccountService < BaseService
 
     account = author_from_xml(xml.at_xpath('/xmlns:feed', xmlns: OStatus::TagManager::XMLNS), false)
 
-    UpdateRemoteProfileService.new.call(xml, account) unless account.nil?
+    UpdateRemoteProfileService.new.call(xml, account) if account.present? && trusted_domain?(url, account)
 
     account
   rescue TypeError
@@ -37,4 +37,9 @@ class FetchRemoteAccountService < BaseService
     Rails.logger.debug 'Invalid XML or missing namespace'
     nil
   end
+
+  def trusted_domain?(url, account)
+    domain = Addressable::URI.parse(url).normalized_host
+    domain.casecmp(account.domain).zero? || domain.casecmp(Addressable::URI.parse(account.remote_url.presence || account.uri).normalized_host).zero?
+  end
 end
diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml
index bafe618cc..46eb17cf7 100644
--- a/app/views/about/more.html.haml
+++ b/app/views/about/more.html.haml
@@ -17,11 +17,11 @@
           .information-board__section
             %span= t 'about.user_count_before'
             %strong= number_with_delimiter @instance_presenter.user_count
-            %span= t 'about.user_count_after'
+            %span= t 'about.user_count_after', count: @instance_presenter.user_count
           .information-board__section
             %span= t 'about.status_count_before'
             %strong= number_with_delimiter @instance_presenter.status_count
-            %span= t 'about.status_count_after'
+            %span= t 'about.status_count_after', count: @instance_presenter.status_count
         .row__mascot
           .landing-page__mascot
             = image_tag asset_pack_path('elephant_ui_plane.svg')
diff --git a/app/views/about/show.html.haml b/app/views/about/show.html.haml
index 9d40eceeb..fd76a6b7d 100644
--- a/app/views/about/show.html.haml
+++ b/app/views/about/show.html.haml
@@ -55,11 +55,11 @@
                 .information-board__section
                   %span= t 'about.user_count_before'
                   %strong= number_with_delimiter @instance_presenter.user_count
-                  %span= t 'about.user_count_after'
+                  %span= t 'about.user_count_after', count: @instance_presenter.user_count
                 .information-board__section
                   %span= t 'about.status_count_before'
                   %strong= number_with_delimiter @instance_presenter.status_count
-                  %span= t 'about.status_count_after'
+                  %span= t 'about.status_count_after', count: @instance_presenter.status_count
               .row__mascot
                 .landing-page__mascot
                   = image_tag asset_pack_path('elephant_ui_plane.svg')
@@ -87,11 +87,11 @@
                 .information-board__section
                   %span= t 'about.user_count_before'
                   %strong= number_with_delimiter @instance_presenter.user_count
-                  %span= t 'about.user_count_after'
+                  %span= t 'about.user_count_after', count: @instance_presenter.user_count
                 .information-board__section
                   %span= t 'about.status_count_before'
                   %strong= number_with_delimiter @instance_presenter.status_count
-                  %span= t 'about.status_count_after'
+                  %span= t 'about.status_count_after', count: @instance_presenter.status_count
               .row__mascot
                 .landing-page__mascot
                   = image_tag asset_pack_path('elephant_ui_plane.svg')
diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml
index ed8190af5..f2c53e3fe 100644
--- a/app/views/admin/accounts/show.html.haml
+++ b/app/views/admin/accounts/show.html.haml
@@ -123,7 +123,7 @@
     - if @account.suspended?
       = link_to t('admin.accounts.undo_suspension'), admin_account_suspension_path(@account.id), method: :delete, class: 'button' if can?(:unsuspend, @account)
     - else
-      = link_to t('admin.accounts.perform_full_suspension'), admin_account_suspension_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button' if can?(:suspend, @account)
+      = link_to t('admin.accounts.perform_full_suspension'), new_admin_account_suspension_path(@account.id), class: 'button' if can?(:suspend, @account)
 
 - if !@account.local? && @account.hub_url.present?
   %hr.spacer/
diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml
index ac2dec7ec..ae0bf81f8 100644
--- a/app/views/admin/reports/show.html.haml
+++ b/app/views/admin/reports/show.html.haml
@@ -5,7 +5,7 @@
   - if @report.unresolved?
     %div{ style: 'float: right' }
       = link_to t('admin.reports.silence_account'), admin_report_path(@report, outcome: 'silence'), method: :put, class: 'button'
-      = link_to t('admin.reports.suspend_account'), admin_report_path(@report, outcome: 'suspend'), method: :put, class: 'button'
+      = link_to t('admin.reports.suspend_account'), new_admin_account_suspension_path(@report.target_account_id, report_id: @report.id), class: 'button'
     %div{ style: 'float: left' }
       = link_to t('admin.reports.mark_as_resolved'), admin_report_path(@report, outcome: 'resolve'), method: :put, class: 'button'
   - else
diff --git a/app/views/admin/suspensions/new.html.haml b/app/views/admin/suspensions/new.html.haml
new file mode 100644
index 000000000..5ffbbbe46
--- /dev/null
+++ b/app/views/admin/suspensions/new.html.haml
@@ -0,0 +1,25 @@
+- content_for :page_title do
+  = t('admin.suspensions.title', acct: @account.acct)
+
+= simple_form_for @suspension, url: admin_account_suspension_path(@account.id), method: :post do |f|
+  %p.hint= t('admin.suspensions.warning_html')
+
+  .fields-group
+    %ul
+      %li.negative-hint
+        = number_to_human @account.statuses_count, strip_insignificant_zeros: true
+        = t('accounts.posts')
+      %li.negative-hint
+        = number_to_human @account.following_count, strip_insignificant_zeros: true
+        = t('accounts.following')
+      %li.negative-hint
+        = number_to_human @account.followers_count, strip_insignificant_zeros: true
+        = t('accounts.followers')
+
+  %p.hint= t('admin.suspensions.hint_html', value: content_tag(:code, @account.acct))
+
+  = f.input :acct
+  = f.input_field :report_id, as: :hidden
+
+  .actions
+    = f.button :button, t('admin.suspensions.proceed'), type: :submit, class: 'negative'
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 76c4078db..e32dac715 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -1,22 +1,25 @@
 ---
 ar:
   about:
-    about_hashtag_html: هذه هي الرسائل العامة مع الكلمات الدلالية  <strong> 1#%{hashtag}</strong>. يمكنك التفاعل معهم إذا كان لديك حساب في أي مكان على الإنترنت المتحد.
-    about_mastodon_html: ماستدون شبكة إجتماعية <em>حرة و مفتوحة المصدر</em>. هو بديل <em>لامركزي</em> لمنصات تجارية ، يمكنك من تجنب احتكار شركة واحدة للإتصالات الخاصة بك. يمكنك اختيار أي خادم تثق فيه. أيهما تختار، يمكنك التفاعل مع أي شخص آخر على الشبكة. يمكن لأي شخص تنصيب و تشغيل خادم ماستدون خاص به والمشاركة في <em>الشبكات الاجتماعية</em> بكل شفافية.
+    about_hashtag_html: هذه تبويقات متاحة للجمهور تحتوي على الكلمات الدلالية <strong>#%{hashtag}</strong>. يمكنك التفاعل معها إن كان لديك حساب في أي مكان على الفديفرس.
+    about_mastodon_html: ماستدون شبكة إجتماعية مبنية على أسُس بروتوكولات برمجيات الويب الحرة و مفتوحة المصدر. و هو لامركزي تمامًا كالبريد الإلكتروني.
     about_this: عن مثيل الخادوم هذا
-    administered_by: 'يديره :'
-    closed_registrations: التسجيلات في مثيل الخادوم هذا مُغلقة حاليًا.
+    administered_by: 'يُديره :'
+    api: واجهة برمجة التطبيقات
+    apps: تطبيقات الأجهزة المحمولة
+    closed_registrations: التسجيلات في مثيل الخادوم هذا مُغلقة حاليًا. غير أنه بامكانك العثور على خادم آخر لإنشاء حسابك و مِن ثم النفاذ إلى نفس الشبكة مِن هناك.
     contact: للتواصل معنا
-    contact_missing: غير محدد
+    contact_missing: لم يتم تعيينه
     contact_unavailable: غير متوفر
+    documentation: الدليل
     extended_description_html: |
       <h3>مكان جيد للقواعد</h3>
-      <p>لا يوجد تفصيل طويل حتى الآن.</p>
+      <p>لم يتم بعد إدخال الوصف الطويل.</p>
     features:
       humane_approach_body: تعلُّمًا مِن فشل الشبكات الأخرى، غاية ماستدون هي بلوغ الخيارات الأخلاقية في التصميم لمُحارَبة إسائة إستعمال شبكات التواصل الإجتماعية.
-      humane_approach_title: أسلوب يعيد الإعتبار للإنسان
+      humane_approach_title: أسلوب يُعيد الإعتبار للفَرد
       not_a_product_body: ماستدون ليس شبكة تجارية. لا يحتوي على إعلانات و لا يقوم باستغلال البيانات و لا هو بِبُستان مُسيَّج. لا تحكم فيه وليس له أية هيئةٍ مركزيةٍ.
-      not_a_product_title: إنك إنسان و لست سلعة
+      not_a_product_title: إنك فرد و لست سلعة
       real_conversation_body: يُمكنكم التعبير عن آرائكم بكل حرية بفضل 500 حرف و انتقاء دقيق للمحتوى و الوسائط بفضل أدوات التحذير التي هي بين أيديكم.
       real_conversation_title: مبني لتحقيق تواصل حقيقي
       within_reach_body: إبقوا على اتصال دائم بأصدقائكم حيثما كانوا عبر عدة تطبيقات لنظام آي أواس و أندرويد و عدة منصات أخرى بفضل واجهة برمجية للتطبيقات و بيئة صديقة للتطوير.
@@ -25,22 +28,28 @@ ar:
     hosted_on: ماستدون مُستضاف على %{domain}
     learn_more: تعلم المزيد
     other_instances: خوادم أخرى
+    privacy_policy: سياسة الخصوصية
     source_code: الشفرة المصدرية
     status_count_after: منشورا
     status_count_before: نشروا
+    terms: شروط الخدمة
     user_count_after: مستخدم
     user_count_before: يستضيف
     what_is_mastodon: ما هو ماستدون ؟
   accounts:
+    choices_html: 'توصيات %{name} :'
     follow: إتبع
     followers: متابِعون
     following: يتابعون
+    joined: انضم·ت في %{date}
     media: الوسائط
     moved_html: "%{name} إنتقلَ إلى %{new_profile_link} :"
     network_hidden: إنّ المعطيات غير متوفرة
     nothing_here: لا يوجد أي شيء هنا !
     people_followed_by: الأشخاص الذين يتبعهم %{name}
     people_who_follow: الأشخاص الذين يتبعون %{name}
+    pin_errors:
+      following: يجب أن تكون مِن متابعي حساب الشخص الذي تريد إبرازه
     posts: منشورات
     posts_with_replies: التبويقات و الردود
     reserved_username: إسم المستخدم محجوز
@@ -176,6 +185,7 @@ ar:
         unsuspend_account: لقد قام %{name} بإلغاء التعليق المفروض على حساب %{target}
         update_custom_emoji: "%{name} قام بتحديث الإيموجي %{target}"
         update_status: لقد قام %{name} بتحديث منشور %{target}
+      deleted_status: "(منشور محذوف)"
       title: سِجلّ التفتيش و المعاينة
     custom_emojis:
       by_domain: النطاق
@@ -203,15 +213,24 @@ ar:
       updated_msg: تم تحديث الإيموجي بنجاح !
       upload: رفع
     dashboard:
+      backlog: الأعمال المتراكمة
+      config: الإعداد
+      feature_deletions: الحسابات المحذوفة
       feature_invites: روابط الدعوات
       feature_registrations: التسجيلات
       feature_relay: المُرحّل الفديرالي
       features: الميّزات
       hidden_service: الفيديرالية مع الخدمات الخفية
+      open_reports: فتح التقريرات
+      recent_users: أحدث المستخدِمين
       search: البحث النصي الكامل
+      single_user_mode: وضع المستخدِم الأوحد
       software: البرنامج
       space: المساحة المستخدَمة
       title: لوح المراقبة
+      total_users: إجمالي المستخدِمين
+      trends: المؤشرات
+      week_interactions: تفاعُلات هذا الأسبوع
       week_users_active: نشط هذا الأسبوع
       week_users_new: مستخدِمين هذا الأسبوع
     domain_blocks:
@@ -263,6 +282,7 @@ ar:
       search: البحث
       title: مثيلات الخوادم المعروفة
     invites:
+      deactivate_all: تعطيلها كافة
       filter:
         all: الكل
         available: المتوفرة
@@ -271,6 +291,7 @@ ar:
       title: الدعوات
     relays:
       add_new: إضافة مُرحّل جديد
+      enable_hint: عندما تقوم بتنشيط هذه الميزة، سوف يشترك خادومك في جميع التبويقات القادمة مِن هذا المُرحِّل و سيشرع كذلك بإرسال كافة التبويقات العمومية إليه.
       inbox_url: رابط المُرحّل
       setup: إعداد اتصال بمُرحّل
       status: الحالة
@@ -332,6 +353,8 @@ ar:
       peers_api_enabled:
         desc_html: أسماء النطاقات التي إلتقى بها مثيل الخادوم على البيئة الموحَّدة فيديفرس
         title: نشر عدد مثيلات الخوادم التي تم مصادفتها
+      preview_sensitive_media:
+        title: إظهار الصور الحساسة في مُعاينات أوبن غراف
       registrations:
         closed_message:
           desc_html: يتم عرضه على الصفحة الرئيسية عندما يتم غلق تسجيل الحسابات الجديدة. يمكنكم إستخدام علامات الأيتش تي أم أل HTML
@@ -357,6 +380,9 @@ ar:
       site_description_extended:
         desc_html: مكان جيد لمدونة قواعد السلوك والقواعد والإرشادات وغيرها من الأمور التي تحدد حالتك. يمكنك استخدام علامات HTML
         title: الوصف المُفصّل للموقع
+      site_short_description:
+        desc_html: يتم عرضه في لوحة جانبية و في البيانات الوصفية. قم بوصف ماستدون و ما يميز هذا السيرفر عن الآخرين في فقرة موجزة. إن تركت الحقل فارغا فسوف يتم عرض الوصف الإفتراضي لمثيل الخادوم.
+        title: مقدمة وصفية قصيرة عن مثيل الخادوم
       site_terms:
         desc_html: يمكنك كتابة سياسة الخصوصية الخاصة بك ، شروط الخدمة أو غيرها من القوانين. يمكنك استخدام علامات HTML
         title: شروط الخدمة المخصصة
@@ -378,6 +404,7 @@ ar:
       media:
         title: الوسائط
       no_media: لا يوجد وسائط
+      no_status_selected: لم يطرأ أي تغيير على أي منشور بما أنه لم يتم اختيار أي واحد
       title: منشورات الحساب
       with_media: بالوسائط
     subscriptions:
@@ -509,7 +536,13 @@ ar:
     success:
       one: جارية عملية حظر المتابِعين بسلاسة من نطاق آخر ...
       other: جارية عملية حظر المتابِعين بسلاسة من %{count} نطاقات أخرى ...
+    true_privacy_html: تذكر دائمًا أنّ <strong>الخصوصية التامة لا يمكن بلوغها إلّا بالتعمية و التشفير من طرف إلى آخَر</strong>.
+    unlocked_warning_html: يمكن لأي كان متابعة حسابك و الإطلاع مباشرة على تبويقاتك. إستخدِم %{lock_link} لمُعاينة أو رفض طلبات المتابِعين الجُدُد.
     unlocked_warning_title: إنّ حسابك غير مقفل
+  footer:
+    developers: المطورون
+    more: المزيد …
+    resources: الموارد
   generic:
     changes_saved_msg: تم حفظ التعديلات بنجاح !
     save_changes: حفظ التغييرات
@@ -524,6 +557,7 @@ ar:
       following: قائمة المستخدمين المتبوعين
       muting: قائمة الكتم
     upload: تحميل
+  in_memoriam_html: في ذكرى.
   invites:
     delete: تعطيل
     expired: إنتهت صلاحيتها
@@ -617,11 +651,14 @@ ar:
     publishing: النشر
     web: الويب
   remote_follow:
-    acct: قم بإدخال عنوان حسابك username@domain الذي من خلاله تود المتابعة
+    acct: قم بإدخال عنوان حسابك username@domain الذي من خلاله تود النشاط
     missing_resource: تعذر العثور على رابط التحويل المطلوب الخاص بحسابك
     no_account_html: أليس عندك حساب بعدُ ؟ يُمْكنك <a href='%{sign_up_path}' target='_blank'>التسجيل مِن هنا</a>
     proceed: أكمل المتابعة
     prompt: 'إنك  بصدد متابعة :'
+  remote_interaction:
+    proceed: إبدأ التفاعل
+    prompt: 'تريد التفاعُل مع هذا التبويق:'
   remote_unfollow:
     error: خطأ
     title: العنوان
@@ -691,6 +728,7 @@ ar:
       video:
         one: "%{count} فيديو"
         other: "%{count} فيديوهات"
+    boosted_from_html: تم إعادة ترقيته مِن %{acct_link}
     content_warning: 'تحذير عن المحتوى : %{warning}'
     disallowed_hashtags:
       one: 'يحتوي على وسم ممنوع : %{tags}'
@@ -701,9 +739,10 @@ ar:
     pin_errors:
       limit: لقد بلغت الحد الأقصى للتبويقات المدبسة
       ownership: لا يمكن تدبيس تبويق نشره شخص آخر
-      private: لا يمكن تثبيت تبويق لم يُنشر للعامة
+      private: لا يمكن تدبيس تبويق لم يُنشر للعامة
       reblog: لا يمكن تثبيت ترقية
     show_more: أظهر المزيد
+    sign_in_to_participate: قم بتسجيل الدخول للمشاركة في هذه المحادثة
     title: '%{name} : "%{quote}"'
     visibilities:
       private: إعرض فقط لمتتبعيك
@@ -725,6 +764,7 @@ ar:
   time:
     formats:
       default: "%b %d, %Y, %H:%M"
+      month: "%b %Y"
   two_factor_authentication:
     code_hint: قم بإدخال الرمز المُوَلّد عبر تطبيق المصادقة للتأكيد
     description_html: في حال تفعيل <strong>المصادقة بخطوتين </strong>، فتسجيل الدخول يتطلب منك أن يكون بحوزتك هاتفك النقال قصد توليد الرمز الذي سيتم إدخاله.
@@ -734,6 +774,7 @@ ar:
     enabled_success: تم تفعيل المصادقة بخطوتين بنجاح
     generate_recovery_codes: توليد رموز الإسترجاع
     instructions_html: "<strong>قم بمسح رمز الكيو آر عبر Google Authenticator أو أي تطبيق TOTP على جهازك</strong>. من الآن فصاعدا سوف يقوم ذاك التطبيق بتوليد رموز يجب عليك إدخالها عند تسجيل الدخول."
+    lost_recovery_codes: تُمكّنك رموز الإسترجاع الإحتاطية مِن استرجاع النفاذ إلى حسابك في حالة فقدان جهازك المحمول. إن ضاعت منك هذه الرموز فبإمكانك إعادة توليدها مِن هنا و إبطال الرموز القديمة.
     manual_instructions: 'في حالة تعذّر مسح رمز الكيو آر أو طُلب منك إدخال يدوي، يُمْكِنك إدخال هذا النص السري على التطبيق :'
     recovery_codes: النسخ الإحتياطي لرموز الإسترجاع
     recovery_codes_regenerated: تم إعادة توليد رموز الإسترجاع الإحتياطية بنجاح
@@ -741,16 +782,22 @@ ar:
     wrong_code: الرمز الذي أدخلته غير صالح ! تحقق من صحة الوقت على الخادم و الجهاز ؟
   user_mailer:
     backup_ready:
-      explanation: ''
+      explanation: لقد قمت بطلب نسخة كاملة لحسابك على ماستدون. إنها متوفرة الآن للتنزيل !
       subject: نسخة بيانات حسابك جاهزة للتنزيل
       title: المغادرة بأرشيف الحساب
     welcome:
       edit_profile_action: تهيئة الملف الشخصي
       explanation: ها هي بعض النصائح قبل بداية الإستخدام
       final_action: اشرَع في النشر
+      final_step: |-
+        يمكنك الشروع في النشر في الحين ! حتى و إن لم كنت لا تمتلك متابِعين بعدُ، يمكن للآخرين الإطلاع على منشوراتك الموجهة للجمهور على الخيط المحلي أو إن قمت باستخدام وسوم.
+        إبدأ بتقديم نفسك باستعمال وسم #introductions.
       full_handle: عنوانك الكامل
+      full_handle_hint: هذا هو ما يجب تقديمه لأصدقائك قصد أن يكون بإمكانهم متابَعتك أو مُراسَلتك حتى و إن كانت حساباتهم على خوادم أخرى.
       review_preferences_action: تعديل التفضيلات
       subject: أهلًا بك على ماستدون
+      tip_bridge_html: إن كنت قادما مِن تويتر، باستطاعتك العثور على أصدقائك على ماستدون باستخدام <a href="%{bridge_url}">تطبيق الجسر</a> بشرط أن يكون أصدقاؤك قد سجلوا حساباتهم على الجسر مِن قبل، و إلّا فلن تنجح العملية !
+      tip_following: أنت تتبع تلقائيا مديري و مديرات الخادم. للعثور على أشخاص مميزين أو قد تهمك حساباتهم بإمكانك الإطلاع على الخيوط المحلية و كذا الفدرالية.
       tips: نصائح
       title: أهلاً بك، %{name} !
   users:
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 94577249e..9ae9c259c 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -6,6 +6,7 @@ cs:
     about_this: O této instanci
     administered_by: 'Server spravuje:'
     api: API
+    apps: Mobilní aplikace
     closed_registrations: Registrace na této instanci jsou momentálně uzavřené. Můžete si však najít jinou instanci, vytvořit si na ní účet a získat z ní přístup do naprosto stejné sítě.
     contact: Kontakt
     contact_missing: Nenastaveno
@@ -36,6 +37,7 @@ cs:
     user_count_before: Domov
     what_is_mastodon: Co je Mastodon?
   accounts:
+    choices_html: 'Volby uživatele %{name}:'
     follow: Sledovat
     followers: Sledovatelé
     following: Sleduje
@@ -46,6 +48,8 @@ cs:
     nothing_here: Tady nic není!
     people_followed_by: Lidé, které %{name} sleduje
     people_who_follow: Lidé, kteří sledují uživatele %{name}
+    pin_errors:
+      following: Musíte již sledovat osobu, kterou chcete podpořit
     posts: Tooty
     posts_with_replies: Tooty a odpovědi
     reserved_username: Toto uživatelské jméno je rezervováno
@@ -181,6 +185,7 @@ cs:
         unsuspend_account: "%{name} zrušil/a suspenzaci účtu uživatele %{target}"
         update_custom_emoji: "%{name} aktualizoval/a emoji %{target}"
         update_status: "%{name} aktualizoval/a příspěvek uživatele %{target}"
+      deleted_status: "(smazaný příspěvek)"
       title: Záznam auditu
     custom_emojis:
       by_domain: Doména
@@ -277,6 +282,7 @@ cs:
       search: Hledat
       title: Známé instance
     invites:
+      deactivate_all: Deaktivovat vše
       filter:
         all: Vše
         available: Dostupné
@@ -398,6 +404,7 @@ cs:
       media:
         title: Média
       no_media: Žádná média
+      no_status_selected: Nebyly změněny žádné příspěvky, neboť žádné nebyly vybrány
       title: Příspěvky účtu
       with_media: S médii
     subscriptions:
@@ -649,11 +656,14 @@ cs:
     publishing: Publikování
     web: Web
   remote_follow:
-    acct: Napište svou přezdívku@doménu, ze které chcete sledovat
+    acct: Napište svou přezdívku@doménu, ze které chcete jednat
     missing_resource: Nemůžeme najít požadované přesměrovací URL pro váš účet
     no_account_html: Ještě nemáte účet? Můžete se <a href='%{sign_up_path}' target='_blank'>registrovat zde</a>
     proceed: Pokračujte pro sledování
     prompt: 'Budete sledovat:'
+  remote_interaction:
+    proceed: Pokračujte k interakci
+    prompt: 'Chcete interagovat s tímto tootem:'
   remote_unfollow:
     error: Chyba
     title: Nadpis
@@ -737,6 +747,7 @@ cs:
       private: Nelze připnout neveřejné tooty
       reblog: Nelze připnout boostnutí
     show_more: Zobrazit více
+    sign_in_to_participate: Chcete-li se účastnit této konverzace, přihlaste se
     title: '%{name}: "%{quote}"'
     visibilities:
       private: Pouze pro sledovatele
@@ -748,7 +759,7 @@ cs:
   stream_entries:
     pinned: Připnutý toot
     reblogged: boostnutý
-    sensitive_content: CItlivý obsah
+    sensitive_content: Citlivý obsah
   terms:
     body_html: |
       <h2>Zásady soukromí</h2>
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 1a27db34f..285a0b23f 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -6,6 +6,7 @@ da:
     about_this: Om
     administered_by: 'Administreret af:'
     api: API
+    apps: Apps til mobilen
     closed_registrations: Registreringer er på nuværrende tidspunkt lukkede for denne instans. Du kan dog finde andre instanser du kan oprette dig på og få adgang til det samme netværk derfra.
     contact: Kontakt
     contact_missing: Ikke sat
@@ -36,6 +37,7 @@ da:
     user_count_before: Hjem til
     what_is_mastodon: Hvad er Mastodon?
   accounts:
+    choices_html: "%{name}s valg:"
     follow: Følg
     followers: Følgere
     following: Følger
@@ -46,6 +48,8 @@ da:
     nothing_here: Der er intet her!
     people_followed_by: Folk som %{name} følger
     people_who_follow: Folk der følger %{name}
+    pin_errors:
+      following: Du er nødt til at følge den person du ønsker at støtte
     posts: Trut
     posts_with_replies: Trut og svar
     reserved_username: Brugernavnet er allerede taget
@@ -181,6 +185,7 @@ da:
         unsuspend_account: "%{name} fjernede udelukkelsen fra %{target}s konto"
         update_custom_emoji: "%{name} opdaterede humørikonet %{target}"
         update_status: "%{name} opdaterede status for %{target}"
+      deleted_status: "(slettet status)"
       title: Revisionslog
     custom_emojis:
       by_domain: Domæne
@@ -266,6 +271,7 @@ da:
       domain: Domæne
       new:
         create: Tilføj domæne
+        title: Ny email blokade opslag
       title: Email sortliste
     instances:
       account_count: Kendte konti
@@ -274,6 +280,7 @@ da:
       search: Søg
       title: Kendte instanser
     invites:
+      deactivate_all: Deaktiver alle
       filter:
         all: Alle
         available: Tilgængelig
@@ -318,19 +325,26 @@ da:
       suspend_account: Udeluk konto
       target: Mål
       title: Anmeldelser
+      unassign: Utildel
       unresolved: Uløst
       updated_at: Opdateret
       view: Se
     settings:
+      bootstrap_timeline_accounts:
+        title: Standard følger for nye brugere
       contact_information:
         email: Forretnings email
         username: Kontakt brugernavn
       hero:
+        desc_html: Vist på forsiden. Mindst 600x100px anbefales. Hvis ikke sat, vil dette falde tilbage til billedet for instansen
         title: Billede af helt
       peers_api_enabled:
         title: Udgiv liste over opdagede instanser
+      preview_sensitive_media:
+        title: Vis følsomt medie i OpenGraph forhåndsvisninger
       registrations:
         closed_message:
+          desc_html: Vist på forsiden når registreringer er lukkede. Du kan bruge HTML tags
           title: Besked for lukkede registreringer
         deletion:
           desc_html: Tillad alle at slette deres konto
@@ -341,6 +355,8 @@ da:
         open:
           desc_html: Tillad alle at oprette en konto
           title: Åben registrering
+      show_known_fediverse_at_about_page:
+        title: Vis kendte fedivers på tidslinje forhåndsvisning
       show_staff_badge:
         desc_html: Vis personale emblem på en brugerside
         title: Vis personale emblem
@@ -351,6 +367,7 @@ da:
       site_title: Navn på instans
       timeline_preview:
         desc_html: Vis offentlig tidslinje på landingssiden
+        title: Tidslinje forhåndsvisning
       title: Indstillinger for side
     statuses:
       back_to_account: Tilbage til kontosiden
@@ -455,6 +472,7 @@ da:
     csv: CSV
     follows: Du følger
     mutes: Du dæmper
+    storage: Medie lager
   filters:
     contexts:
       home: Hjemme tidslinje
@@ -537,11 +555,13 @@ da:
     favourite:
       body: 'Din status blev favoriseret af %{name}:'
       subject: "%{name} favoriserede din status"
+      title: Ny favorit
     follow:
       body: "%{name} følger dig nu!"
       subject: "%{name} følger dig nu"
       title: Ny følger
     follow_request:
+      action: Håndter følgeranmodninger
       body: "%{name} har anmodet om at følge dig"
     mention:
       action: Svar
@@ -576,6 +596,8 @@ da:
     no_account_html: Har du ikke en konto? Du kan <a href='%{sign_up_path}' target='_blank'>oprette dig her</a>
     proceed: Fortsæt for at følge
     prompt: 'Du er ved at følge:'
+  remote_interaction:
+    prompt: 'Du ønsker at interagere med dette trut:'
   remote_unfollow:
     error: Fejl
     title: Titel
@@ -609,6 +631,7 @@ da:
     delete: Sletning af konto
     development: Udvikling
     edit_profile: Rediger profil
+    export: Data exportering
     followers: Godkendte følgere
     import: Importer
     migrate: Konto migrering
@@ -633,10 +656,11 @@ da:
     over_character_limit: grænsen på %{max} tegn er overskredet
     pin_errors:
       limit: Du har allerede fastgjort det maksimale antal trut
-      ownership: Dun kan ikke fastgøre en anden persons toot
+      ownership: Du kan ikke fastgøre en anden persons trut
       private: Ikke offentlige trut kan ikke blive fastgjort
       reblog: Fremhævede trut kan ikke fastgøres
     show_more: Vis mere
+    sign_in_to_participate: Log ind for at deltage i samtalen
     title: '%{name}: "%{quote}"'
     visibilities:
       private: Kun-følgere
@@ -646,7 +670,7 @@ da:
       unlisted: Ikke listet
       unlisted_long: Alle kan se, men vil ikke være listet på offentlige tidslinjer
   stream_entries:
-    pinned: Fastgjort toot
+    pinned: Fastgjort trut
     reblogged: fremhævede
     sensitive_content: Følsomt indhold
   terms:
@@ -680,10 +704,12 @@ da:
       edit_profile_action: Opsæt profil
       explanation: Her er nogle råd til at starte med
       final_action: Kom igang med at poste
+      final_step: 'Start med at skrive opslag! Selv uden følgere vil dine offentlige beskeder kunne ses af andre, foreksempel på den lokale tidslinje og i hashtags. Måske kunne du tænke dig at introducere dig selv på #introductions hashtagget.'
       full_handle: Dit fulde brugernavn
       full_handle_hint: Dette er hvad du vil fortælle dine venner så de kan sende dig beskeder eller følge dig fra andre instanser.
       review_preferences_action: Ændre præferencer
       subject: Velkommen til Mastodon
+      tip_bridge_html: Hvis du kommer fra Twitter, kan du finde dine venner på Mastodon ved at bruge <a href="%{bridge_url}">bridge appen</a>. Den virker dog kun hvis de også bruger bridge appen!
       tip_following: Du følger som standard administratoren(e) for den server du er på. For at finde flere folk, tjek både den lokale og fælles tidslinje.
       tip_local_timeline: Den lokale tidslinje er et have af folk i %{instance}. Disse er dine umiddelbare naboer!
       tip_mobile_webapp: Hvis din mobil browser tilbyder dig at tilføje Mastodon til din hjemmeskærm, kan du modtage push meddelelser. Dette opfører sig på mange måder ligesom en almindelig app!
diff --git a/config/locales/devise.da.yml b/config/locales/devise.da.yml
index 6660aaae0..b201b7ca8 100644
--- a/config/locales/devise.da.yml
+++ b/config/locales/devise.da.yml
@@ -4,6 +4,7 @@ da:
     confirmations:
       confirmed: Din email adresse er blevet succesfuldt bekræftet.
       send_instructions: Du vil modtage en mail med instrukser for hvordan du bekræfter din email adresse om få minutter. Tjek venligst din spam mappe hvis du ikke har modtaget denne email.
+      send_paranoid_instructions: Hvis din email adresse allerede findes i vores database, vil du modtage en email med instrukser for hvordan du bekræfter din email adresse om få minutter. Tjek gerne din spam mappe hvis du ikke modtager denne email.
     failure:
       already_authenticated: Du er allerede logget ind.
       inactive: Din konto er endnu ikke aktiveret.
@@ -33,14 +34,32 @@ da:
         title: Kodeordet er blevet ændret
       reconfirmation_instructions:
         explanation: Bekræft den nye adresse for at ændre din email.
+        extra: Hvis denne ændring ikke blev foretaget af dig, ignorer denne email. Email adressen for denne Mastodon konto vil ikke blive ændret før du følger linket foroven.
         subject: 'Mastodon: Bekræft email for %{instance}'
         title: Bekræft email adresse
       reset_password_instructions:
         action: Ændre kodeord
-        explanation: Du anmodede om et nyt kodeord for din konto.
+        explanation: Du anmodede om en ny adgangskode for din konto.
+        extra: Hvis du ikke har anmodet om dette, ignorer denne email. Din adgangskode vil ikke blive ændret før du har fulgt linket foroven og oprettet en ny.
+        subject: 'Mastodon: Instrukser for nulstilling af adgangskode'
         title: Kodeordet er blevet nulstillet
+      unlock_instructions:
+        subject: 'Mastodon: Instruktioner for oplåsning'
+    omniauth_callbacks:
+      failure: Kunne ikke godkende dig fra %{kind} fordi "%{reason}".
+      success: Godkendelse fra %{kind} konto lykkedes.
+    passwords:
+      no_token: Du kan ikke tilgå denne side uden at komme fra en email om nulstilling af adgangskode. Hvis du kommer fra en email om nulstilling af adgangskode, tjek om du brugte det fulde link der blev angivet.
+      send_instructions: Hvis din email adresse allerede findes i vores database, vil du modtage et link til nulstilling af adgangskode til din email adresse om få minutter. Tjek din spam mappe hvis du ikke har modtaget denne email.
+      send_paranoid_instructions: Hvis din email adresse allerede findes i vores database, vil du modtage et link til nulstilling af adgangskode til din email adresse om få minutter. Tjek din spam mappe hvis du ikke har modtaget denne email.
+      updated: Din adgangskode er nu blevet ændret. Du er nu logget ind.
+      updated_not_active: Din adgangskode blev ændret.
     registrations:
+      destroyed: Farvel! Din konto er nu annulleret. Vi håber snart at se dig igen.
       signed_up: Velkommen! Du har nu tilmeldt dig.
+      signed_up_but_inactive: Du har nu oprettet dig. Vi kunne dog ikke logge dig ind da din konto endnu ikke er aktiveret.
+      signed_up_but_locked: Du har nu oprettet dig. Vi kunne dog ikke logge dig ind da din konto er låst.
+      signed_up_but_unconfirmed: En besked med et bekræftelses link er nu blevet sendt til din email adresse. Følg linket for at aktivere din konti. Tjek din spam mappe hvis du ikke har modtaget denne email.
       update_needs_confirmation: Du har succesfuldt opdateret din konto, men vi er nødt til at bekræfte din email adresse. Tjek venligst din email og følg bekræftelses linket for at bekræfte din nye email adresse. Tjek venligst din spam mappe hvis du ikke har modtaget denne email.
       updated: Din konto er nu blevet opdateret.
     sessions:
diff --git a/config/locales/doorkeeper.da.yml b/config/locales/doorkeeper.da.yml
index 7b6d0d361..dd45a5078 100644
--- a/config/locales/doorkeeper.da.yml
+++ b/config/locales/doorkeeper.da.yml
@@ -78,14 +78,19 @@ da:
     errors:
       messages:
         access_denied: Ejeren af ressourcen eller godkendelses serveren afviste anmodningen.
+        credential_flow_not_configured: Flytning af ressourceejers adgangskode mislykkedes grundet Doorkeeper.configure.resource_owner_from_credentials ikke er opsat.
         invalid_client: Klient autentikationen mislykkedes grundet en ukendt klient, ingen klient autentikation fulgte med, eller en ikke-understøttet metode.
+        invalid_grant: Autoriseringen er ugyldig, udløbet, ophævet, passer ikke med den henvisnings URI der blev brugt i autoriserings anmodningen, eller blev givet til en anden klient.
         invalid_redirect_uri: Ormdirigerings-uri'en der blev angivet er ikke gyldig.
         invalid_request: Anmodningen mangler en parametre, inkluderer en ikke understøttet parametre værdi eller er på en eller anden måde deformeret.
+        invalid_resource_owner: De angivne ressource ejer kredentialer er ikke gyldige, eller ressource ejeren kunne ikke blive fundet
         invalid_scope: Det anmodede omfang er ugyldigt, ukendt eller deformeret.
         invalid_token:
           expired: Adgangs-beviset er udløbet
           revoked: Adgangs-beviset er blevet ophævet
           unknown: Adgangs-beviset er ugyldigt
+        resource_owner_authenticator_not_configured: Ressource ejeren kunne ikke blive fundet grundet Doorkeeper.configure.resource_owner_authenticator ikke er konfigureret.
+        server_error: Autoriserings serveren blev mødt med en uventet betingelse der forhindrede den i at færdiggøre anmodningen.
         unauthorized_client: Klienten er ikke godkendt til at udføre denne anmodning ved at bruge denne metode.
         unsupported_response_type: Godkendelses serveren understøtter ikke denne type respons.
     flash:
diff --git a/config/locales/doorkeeper.uk.yml b/config/locales/doorkeeper.uk.yml
index d80abf01a..205ad026f 100644
--- a/config/locales/doorkeeper.uk.yml
+++ b/config/locales/doorkeeper.uk.yml
@@ -5,6 +5,8 @@ uk:
       doorkeeper/application:
         name: Ім'я
         redirect_uri: URI перенаправлення
+        scopes: Рамки
+        website: Веб-сайт додатку
     errors:
       models:
         doorkeeper/application:
diff --git a/config/locales/el.yml b/config/locales/el.yml
index da2a3d3cc..67baee0f2 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -6,6 +6,7 @@ el:
     about_this: Σχετικά
     administered_by: 'Διαχειρίζεται από:'
     api: API
+    apps: Εφαρμογές κινητών
     closed_registrations: Αυτή τη στιγμή οι εγγραφές σε αυτό τον κόμβο είναι κλειστές. Αλλά! Μπορείς να βρεις έναν άλλο κόμβο για να ανοίξεις λογαριασμό και να έχεις πρόσβαση από εκεί στο ίδιο ακριβώς δίκτυο.
     contact: Επικοινωνία
     contact_missing: Δεν έχει οριστεί
@@ -36,6 +37,7 @@ el:
     user_count_before: Σπίτι για
     what_is_mastodon: Τι είναι το Mastodon;
   accounts:
+    choices_html: 'Επιλογές του/της %{name}:'
     follow: Ακολούθησε
     followers: Ακόλουθοι
     following: Ακολουθεί
@@ -46,6 +48,8 @@ el:
     nothing_here: Δεν υπάρχει τίποτα εδώ!
     people_followed_by: Χρήστες που ακολουθεί ο/η %{name}
     people_who_follow: Χρήστες που ακολουθούν τον/την %{name}
+    pin_errors:
+      following: Πρέπει ήδη να ακολουθείς το άτομο που θέλεις να επιδοκιμάσεις
     posts: Τουτ
     posts_with_replies: Τουτ και απαντήσεις
     reserved_username: Το όνομα χρήστη είναι κατειλημμένο
@@ -181,6 +185,7 @@ el:
         unsuspend_account: Ο/Η %{name} ήρε την παύση του λογαριασμού του χρήστη %{target}
         update_custom_emoji: Ο/Η %{name} ενημέρωσε το emoji %{target}
         update_status: Ο/Η %{name} ενημέρωσε την κατάσταση του/της %{target}
+      deleted_status: "(διαγραμμένη δημοσίευση)"
       title: Αρχείο ελέγχου
     custom_emojis:
       by_domain: Τομέας
@@ -277,6 +282,7 @@ el:
       search: Αναζήτηση
       title: Γνωστοί κόμβοι
     invites:
+      deactivate_all: Απενεργοποίηση όλων
       filter:
         all: Όλες
         available: Διαθέσιμες
@@ -398,6 +404,7 @@ el:
       media:
         title: Πολυμέσα
       no_media: Χωρίς πολυμέσα
+      no_status_selected: Καμία δημοσίευση δεν άλλαξε αφού καμία δεν ήταν επιλεγμένη
       title: Καταστάσεις λογαριασμού
       with_media: Με πολυμέσα
     subscriptions:
@@ -649,11 +656,14 @@ el:
     publishing: Δημοσίευση
     web: Διαδίκτυο
   remote_follow:
-    acct: Γράψε το ΌνομαΧρήστη@τομέας από όπου θέλεις να ακολουθήσεις
+    acct: Γράψε το ΌνομαΧρήστη@τομέα από όπου θέλεις να εκτελέσεις την ενέργεια αυτή
     missing_resource: Δεν βρέθηκε το απαιτούμενο URL ανακατεύθυνσης για το λογαριασμό σου
     no_account_html: Δεν έχεις λογαριασμό; Μπορείς <a href='%{sign_up_path}' target='_blank'>να γραφτείς εδώ</a>
     proceed: Συνέχισε για να ακολουθήσεις
     prompt: 'Θα ακολουθήσεις:'
+  remote_interaction:
+    proceed: Συνέχισε για να αλληλεπιδράσεις
+    prompt: 'Θέλεις να αλληλεπιδράσεις με αυτό το τουτ:'
   remote_unfollow:
     error: Σφάλμα
     title: Τίτλος
@@ -737,6 +747,7 @@ el:
       private: Τα μη δημόσια τουτ δεν καρφιτσώνονται
       reblog: Οι προωθήσεις δεν καρφιτσώνονται
     show_more: Δείξε περισσότερα
+    sign_in_to_participate: Εγγράφου για να συμμετάσχεις στη συζήτηση
     title: '%{name}: "%{quote}"'
     visibilities:
       private: Μόνο ακόλουθοι
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 1bffb309b..7e062781c 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -30,10 +30,14 @@ en:
     other_instances: Instance list
     privacy_policy: Privacy policy
     source_code: Source code
-    status_count_after: statuses
+    status_count_after:
+      one: status
+      other: statuses
     status_count_before: Who authored
     terms: Terms of service
-    user_count_after: users
+    user_count_after:
+      one: user
+      other: users
     user_count_before: Home to
     what_is_mastodon: What is Mastodon?
   accounts:
@@ -414,6 +418,12 @@ en:
       last_delivery: Last delivery
       title: WebSub
       topic: Topic
+    suspensions:
+      bad_acct_msg: The confirmation value didn't match up. Are you suspending the right account?
+      hint_html: 'To confirm the suspension of the account, please enter %{value} into the field below:'
+      proceed: Proceed
+      title: Suspend %{acct}
+      warning_html: 'Suspending this account will <strong>irreversibly</strong> delete data from this account, which includes:'
     title: Administration
   admin_mailer:
     new_report:
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index 788fd5f52..996287335 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -5,10 +5,13 @@ eo:
     about_mastodon_html: Mastodon estas socia reto bazita sur malfermitaj retaj protokoloj kaj sur libera malfermitkoda programo. Ĝi estas sencentra kiel retmesaĝoj.
     about_this: Pri
     administered_by: 'Administrata de:'
+    api: API
+    apps: Poŝtelefonaj aplikaĵoj
     closed_registrations: Registriĝoj estas nuntempe fermitaj en ĉi tiu nodo. Tamen, vi povas trovi alian nodon por fari konton kaj aliri al la sama reto de tie.
     contact: Kontakti
     contact_missing: Ne elektita
     contact_unavailable: Ne disponebla
+    documentation: Dokumentado
     extended_description_html: |
       <h3>Bona loko por reguloj</h3>
       <p>La detala priskribo ne estis elektita.</p>
@@ -25,22 +28,28 @@ eo:
     hosted_on: "%{domain} estas nodo de Mastodon"
     learn_more: Lerni pli
     other_instances: Listo de nodoj
+    privacy_policy: Privateca politiko
     source_code: Fontkodo
     status_count_after: mesaĝoj
     status_count_before: Kie skribiĝis
+    terms: Uzkondiĉoj
     user_count_after: uzantoj
     user_count_before: Hejmo de
     what_is_mastodon: Kio estas Mastodon?
   accounts:
+    choices_html: 'Proponoj de %{name}:'
     follow: Sekvi
     followers: Sekvantoj
     following: Sekvatoj
+    joined: Aliĝis je %{date}
     media: Aŭdovidaĵoj
     moved_html: "%{name} moviĝis al %{new_profile_link}:"
     network_hidden: Tiu informo ne estas disponebla
     nothing_here: Estas nenio ĉi tie!
     people_followed_by: Sekvatoj de %{name}
     people_who_follow: Sekvantoj de %{name}
+    pin_errors:
+      following: Vi devas sekvi la homon, kiun vi volas proponi
     posts: Mesaĝoj
     posts_with_replies: Mesaĝoj kaj respondoj
     reserved_username: La uzantnomo estas rezervita
@@ -176,6 +185,7 @@ eo:
         unsuspend_account: "%{name} malhaltigis la konton de %{target}"
         update_custom_emoji: "%{name} ĝisdatigis emoĝion %{target}"
         update_status: "%{name} ĝisdatigis mesaĝon de %{target}"
+      deleted_status: "(forigita mesaĝo)"
       title: Kontrola protokolo
     custom_emojis:
       by_domain: Domajno
@@ -202,6 +212,27 @@ eo:
       update_failed_msg: Ĝisdatigi tiun emoĝion ne eblis
       updated_msg: Emoĝio sukcese ĝisdatigita!
       upload: Alŝuti
+    dashboard:
+      backlog: postigitaj taskoj
+      config: Agordado
+      feature_deletions: Forigo de kontoj
+      feature_invites: Invitaj ligiloj
+      feature_registrations: Registriĝoj
+      feature_relay: Federacia ripetilo
+      features: Funkcioj
+      hidden_service: Federacio kun kaŝitaj servoj
+      open_reports: nefermitaj raportoj
+      recent_users: Lastatempaj uzantoj
+      search: Tutteksta serĉado
+      single_user_mode: Unuuzanta reĝimo
+      software: Programo
+      space: Memorspaca uzado
+      title: Kontrolpanelo
+      total_users: uzantoj sume
+      trends: Furoroj
+      week_interactions: interagoj tiusemajne
+      week_users_active: aktivaj tiusemajne
+      week_users_new: uzantoj tiusemajne
     domain_blocks:
       add_new: Aldoni novan
       created_msg: Domajna blokado en traktado
@@ -251,6 +282,7 @@ eo:
       search: Serĉi
       title: Konataj nodoj
     invites:
+      deactivate_all: Malaktivigi ĉion
       filter:
         all: Ĉio
         available: Disponebla
@@ -343,11 +375,14 @@ eo:
         desc_html: Montri teaman insignon en paĝo de uzanto
         title: Montri teaman insignon
       site_description:
-        desc_html: Enkonduka alineo en la ĉefpaĝo kaj en informaj etikedoj. Vi povas uzi HTML-etikedojn, kiel <code>&lt;a&gt;</code> kaj <code>&lt;em&gt;</code>.
+        desc_html: Enkonduka alineo en la ĉefpaĝo. Priskribu la unikaĵojn de ĉi tiu nodo de Mastodon, kaj ĉiujn aliajn gravaĵojn. Vi povas uzi HTML-etikedojn, kiel <code>&lt;a&gt;</code> kaj <code>&lt;em&gt;</code>.
         title: Priskribo de la nodo
       site_description_extended:
         desc_html: Bona loko por viaj sintenaj reguloj, aliaj reguloj, gvidlinioj kaj aliaj aferoj, kiuj apartigas vian nodon. Vi povas uzi HTML-etikedojn
         title: Propraj detalaj informoj
+      site_short_description:
+        desc_html: Afiŝita en la flankpanelo kaj metadatumaj etikedoj. Priskribu kio estas Mastodon, kaj kio specialas en ĉi tiu nodo, per unu alineo. Se malplena, la priskribo de la nodo estos uzata.
+        title: Mallonga priskribo de la nodo
       site_terms:
         desc_html: Vi povas skribi vian propran privatecan politikon, viajn uzkondiĉojn aŭ aliajn leĝaĵojn. Vi povas uzi HTML-etikedojn
         title: Propraj uzkondiĉoj
@@ -369,6 +404,7 @@ eo:
       media:
         title: Aŭdovidaĵoj
       no_media: Neniu aŭdovidaĵo
+      no_status_selected: Neniu mesaĝo estis ŝanĝita ĉar neniu estis elektita
       title: Mesaĝoj de la konto
       with_media: Kun aŭdovidaĵoj
     subscriptions:
@@ -511,6 +547,10 @@ eo:
     true_privacy_html: Bonvolu atenti, ke <strong>vera privateco povas esti atingita nur per ĉifrado de komenco al fino</strong>.
     unlocked_warning_html: Iu ajn povas eksekvi vin por tuj vidi viajn privatajn mesaĝojn. %{lock_link} por povi akcepti kaj rifuzi petojn de sekvado.
     unlocked_warning_title: Via konto ne estas ŝlosita
+  footer:
+    developers: Programistoj
+    more: Pli…
+    resources: Rimedoj
   generic:
     changes_saved_msg: Ŝanĝoj sukcese konservitaj!
     save_changes: Konservi ŝanĝojn
@@ -619,11 +659,14 @@ eo:
     publishing: Publikado
     web: Reto
   remote_follow:
-    acct: Enmetu vian uzantnomo@domajno de kie vi volas sekvi
+    acct: Enmetu vian uzantnomo@domajno de kie vi volas agi
     missing_resource: La URL de plusendado ne estis trovita
     no_account_html: Ĉu vi ne havas konton? Vi povas <a href='%{sign_up_path}' target='_blank'>registriĝi tie</a>
     proceed: Daŭrigi por eksekvi
     prompt: 'Vi eksekvos:'
+  remote_interaction:
+    proceed: Efektivigi la interagon
+    prompt: 'Vi volas interagi kun ĉi tiu mesaĝo:'
   remote_unfollow:
     error: Eraro
     title: Titolo
@@ -707,6 +750,7 @@ eo:
       private: Mesaĝo nepublika ne povas esti alpinglita
       reblog: Diskonigo ne povas esti alpinglita
     show_more: Montri pli
+    sign_in_to_participate: Ensaluti por partopreni en la konversacio
     title: '%{name}: "%{quote}"'
     visibilities:
       private: Montri nur al sekvantoj
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 46975f016..1cacad345 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -36,6 +36,7 @@ eu:
     user_count_before: Hemen
     what_is_mastodon: Zer da Mastodon?
   accounts:
+    choices_html: "%{name}(r)en aukerak:"
     follow: Jarraitu
     followers: Jarraitzaile
     following: Jarraitzen
@@ -46,6 +47,8 @@ eu:
     nothing_here: Ez dago ezer hemen!
     people_followed_by: "%{name}(e)k jarraitzen dituenak"
     people_who_follow: "%{name} jarraitzen dutenak"
+    pin_errors:
+      following: Onetsi nahi duzun pertsona aurretik jarraitu behar duzu
     posts: Toot-ak
     posts_with_replies: Toot eta erantzunak
     reserved_username: Erabiltzaile-izena erreserbatuta dago
@@ -340,6 +343,9 @@ eu:
       peers_api_enabled:
         desc_html: Instantzia honek fedibertsuan aurkitutako domeinu-izenak
         title: Argitaratu aurkitutako instantzien zerrenda
+      preview_sensitive_media:
+        desc_html: Beste webguneetako esteken aurrebistak iruditxoa izango du multimedia hunkigarri gisa markatzen bada ere
+        title: Erakutsi multimedia hunkigarria OpenGraph aurrebistetan
       registrations:
         closed_message:
           desc_html: Azaleko orrian bistaratua izen ematea ixten denean. HTML etiketak erabili ditzakezu
@@ -360,11 +366,13 @@ eu:
         desc_html: Erakutsi langile banda erabiltzailearen orrian
         title: Erakutsi langile banda
       site_description:
-        desc_html: Azaleko orrian eta meta etiketetan agertuko den sarrera paragrafoa. HTML etiketak erabili ditzakezu, zehazki <code>&lt;a&gt;</code> eta <code>&lt;em&gt;</code>.
+        desc_html: Azaleko orrian agertuko den sarrera paragrafoa. Azaldu zerk egiten duen berezi Mastodon zerbitzari hau eta garrantzizko beste edozer. HTML etiketak erabili ditzakezu, zehazki <code>&lt;a&gt;</code> eta <code>&lt;em&gt;</code>.
         title: Instantziaren deskripzioa
       site_description_extended:
         desc_html: Zure jokabide-koderako  toki on bat, arauak, gidalerroak eta zure instantzia desberdin egiten duten bestelakoak. HTML etiketak erabili ditzakezu
         title: Informazio hedatu pertsonalizatua
+      site_short_description:
+        title: Instantziaren deskripzio laburra
       site_terms:
         desc_html: Zure pribatutasun politika, erabilera baldintzak eta bestelako testu legalak idatzi ditzakezu. HTML etiketak erabili ditzakezu
         title: Erabilera baldintza pertsonalizatuak
@@ -498,6 +506,22 @@ eu:
     follows: Zuk jarraitutakoak
     mutes: Zuk mututukoak
     storage: Multimedia biltegiratzea
+  filters:
+    contexts:
+      home: Hasierako denbora-lerroa
+      notifications: Jakinarazpenak
+      public: Denbora-lerro publikoak
+      thread: Elkarrizketak
+    edit:
+      title: Editatu iragazkia
+    errors:
+      invalid_context: Testuinguru baliogabe edo hutsa eman da
+      invalid_irreversible: Behin betiko iragazketa hasiera edo jakinarazpenen testuinguruan besterik ez dabil
+    index:
+      delete: Ezabatu
+      title: Iragazkiak
+    new:
+      title: Gehitu iragazki berria
   followers:
     domain: Domeinua
     explanation_html: Zure mezuen pribatutasuna bermatu nahi baduzu, nork jarraitzen zaituen jakin behar duzu. <strong>Zure mezu pribatuak zure jarraitzaileak dituzten instantzia guztietara bidaltzen dira</strong>.  Instantzia bateko langileek edo softwareak zure pribatutasunari dagokion begirunea ez dutela izango uste baduzu, berrikusi eta kendu jarraitzaileak.
@@ -510,6 +534,10 @@ eu:
     true_privacy_html: Kontuan izan <strong>egiazko pribatutasuna lortzeko muturretik muturrerako zifratzea ezinbestekoa dela</strong>.
     unlocked_warning_html: Edonork jarraitu zaitzake eta berehala zure mezu pribatuak ikusi. %{lock_link} jarraitzaileak berrikusi eta ukatu ahal izateko.
     unlocked_warning_title: Zure kontua ez dago giltzapetuta
+  footer:
+    developers: Garatzaileak
+    more: Gehiago…
+    resources: Baliabideak
   generic:
     changes_saved_msg: Aldaketak ongi gorde dira!
     save_changes: Gorde aldaketak
@@ -620,6 +648,7 @@ eu:
   remote_follow:
     acct: Sartu jarraitzeko erabili nahi duzun erabiltzaile@domeinua
     missing_resource: Ezin izan da zure konturako behar den birbideratze URL-a
+    no_account_html: Ez duzu konturik? <a href='%{sign_up_path}' target='_blank'>Izena eman</a> dezakezu
     proceed: Ekin jarraitzeari
     prompt: 'Hau jarraituko duzu:'
   remote_unfollow:
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 25d1e81ab..f9ed10fd5 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -5,10 +5,12 @@ fa:
     about_mastodon_html: ماستدون (Mastodon) یک شبکهٔ اجتماعی است که بر اساس پروتکل‌های آزاد وب و نرم‌افزارهای آزاد و کدباز ساخته شده است. این شبکه مانند ایمیل غیرمتمرکز است.
     about_this: درباره
     administered_by: 'با مدیریت:'
+    api: رابط برنامه‌نویسی کاربردی
     closed_registrations: ثبت‌نام روی این سرور هم‌اینک فعال نیست. اما شما می‌توانید سرور دیگری بیابید و با حسابی که آن‌جا می‌سازید دقیقاً به همین شبکه دسترسی داشته باشید.
     contact: تماس
     contact_missing: تعیین نشده
     contact_unavailable: موجود نیست
+    documentation: مستندات
     extended_description_html: |
       <h3>جای خوبی برای قانون‌ها</h3>
       <p>توضیحات تکمیلی نوشته نشده است.</p>
@@ -25,22 +27,28 @@ fa:
     hosted_on: ماستدون، میزبانی‌شده روی %{domain}
     learn_more: بیشتر بدانید
     other_instances: فهرست سرورها
+    privacy_policy: سیاست رازداری
     source_code: کدهای منبع
     status_count_after: چیز نوشته‌اند
     status_count_before: که جمعاً
+    terms: شرایط کاربری
     user_count_after: کاربر
     user_count_before: دارای
     what_is_mastodon: ماستدون چیست؟
   accounts:
+    choices_html: 'انتخاب‌های %{name}:'
     follow: پی بگیرید
     followers: پیگیران
     following: پی می‌گیرد
+    joined: کاربر از %{date}
     media: عکس و ویدیو
     moved_html: "%{name} حساب خود را به %{new_profile_link} منتقل کرده است:"
     network_hidden: این اطلاعات در دسترس نیست
     nothing_here: این‌جا چیزی نیست!
     people_followed_by: کسانی که %{name} پی می‌گیرد
     people_who_follow: کسانی که %{name} را پی می‌گیرند
+    pin_errors:
+      following: شما باید پیگیر کاربری باشید که می‌خواهید ثابت کنید
     posts: نوشته‌ها
     posts_with_replies: نوشته‌ها و پاسخ‌ها
     reserved_username: این نام کاربری در دسترس نیست
@@ -176,6 +184,7 @@ fa:
         unsuspend_account: "%{name} حساب کاربر %{target} را از تعلیق خارج کرد"
         update_custom_emoji: "%{name} شکلک %{target} را به‌روز کرد"
         update_status: "%{name} نوشتهٔ %{target} را به‌روز کرد"
+      deleted_status: "(بوق پاک‌شده)"
       title: سیاههٔ بازرسی
     custom_emojis:
       by_domain: دامین
@@ -364,11 +373,14 @@ fa:
         desc_html: نمایش علامت همکار روی صفحهٔ کاربر
         title: نمایش علامت همکار
       site_description:
-        desc_html: معرفی کوتاهی که روی صفحهٔ اصلی و همچنین به عنوان فرادادهٔ صفحه‌ها نمایش می‌یابد. می‌توانید HTML بنویسید, به‌ویژه <code>&lt;a&gt;</code> و <code>&lt;em&gt;</code>.
+        desc_html: معرفی کوتاهی که روی صفحهٔ اصلی نمایش می‌یابد. دربارهٔ این که چه چیزی دربارهٔ این سرور ماستدون ویژه است یا هر چیز مهم دیگری بنویسید. می‌توانید HTML بنویسید، به‌ویژه <code>&lt;a&gt;</code> و <code>&lt;em&gt;</code>.
         title: دربارهٔ سایت
       site_description_extended:
         desc_html: جای خوبی برای نوشتن سیاست‌های کاربری، قانون‌ها، راهنماها، و هر چیزی که ویژهٔ این سرور است. تگ‌های HTML هم مجاز است
         title: اطلاعات تکمیلی سفارشی
+      site_short_description:
+        desc_html: روی نوار کناری و همچنین به عنوان فرادادهٔ صفحه‌ها نمایش می‌یابد. در یک بند توضیح دهید که ماستدون چیست و چرا این سرور با بقیه فرق دارد. اگر خالی بگذارید، به جایش «دربارهٔ سایت» نمایش می‌یابد.
+        title: توضیح کوتاه دربارهٔ سایت
       site_terms:
         desc_html: می‌توانید سیاست رازداری، شرایط استفاده، یا سایر مسائل قانونی را به دلخواه خود بنویسید. تگ‌های HTML هم مجاز است
         title: شرایط استفادهٔ سفارشی
@@ -390,6 +402,7 @@ fa:
       media:
         title: رسانه
       no_media: بدون عکس یا ویدیو
+      no_status_selected: هیچ بوقی تغییری نکرد زیرا هیچ‌کدام از آن‌ها انتخاب نشده بودند
       title: نوشته‌های حساب
       with_media: دارای عکس یا ویدیو
     subscriptions:
@@ -530,6 +543,10 @@ fa:
     true_privacy_html: لطفاً بدانید که <strong>داشتن حریم خصوصی واقعی تنها با رمزگذاری سرتاسر (end-to-end encryption) ممکن است</strong>.
     unlocked_warning_html: هر کسی می‌تواند پیگیر شما شود تا بلافاصله نوشته‌های خصوصی شما را ببیند. اگر  %{lock_link} خواهید توانست درخواست‌های پیگیری را بررسی کرده و نپذیرید.
     unlocked_warning_title: حساب شما خصوصی نیست
+  footer:
+    developers: برنامه‌نویسان
+    more: بیشتر…
+    resources: منابع
   generic:
     changes_saved_msg: تغییرات با موفقیت ذخیره شدند!
     save_changes: ذخیرهٔ تغییرات
@@ -747,6 +764,7 @@ fa:
   time:
     formats:
       default: "%d %b %Y, %H:%M"
+      month: "%b %Y"
   two_factor_authentication:
     code_hint: برای تأیید، کدی را که برنامهٔ تأییدکننده ساخته است وارد کنید
     description_html: اگر <strong>ورود دومرحله‌ای</strong> را فعال کنید، برای ورود به سیستم به تلفن خود نیاز خواهید داشت تا برایتان یک کد موقتی بسازد.
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index c6884fd4a..b563405bd 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -6,6 +6,7 @@ fr:
     about_this: À propos
     administered_by: 'Administré par :'
     api: API
+    apps: Applications mobiles
     closed_registrations: Les inscriptions sont actuellement fermées sur cette instance. Cependant, vous pouvez trouver une autre instance sur laquelle vous créer un compte et à partir de laquelle vous pourrez accéder au même réseau.
     contact: Contact
     contact_missing: Manquant
@@ -27,13 +28,16 @@ fr:
     hosted_on: Instance Mastodon hébergée par %{domain}
     learn_more: En savoir plus
     other_instances: Liste des instances
+    privacy_policy: Politique de vie privée
     source_code: Code source
     status_count_after: statuts
     status_count_before: Ayant publié
+    terms: Conditions d'utilisation
     user_count_after: utilisateur⋅ice⋅s
     user_count_before: Abrite
     what_is_mastodon: Qu’est-ce que Mastodon ?
   accounts:
+    choices_html: 'Sélection de %{name} :'
     follow: Suivre
     followers: Abonné⋅e⋅s
     following: Abonnements
@@ -207,6 +211,7 @@ fr:
     dashboard:
       config: Configuration
       feature_invites: Liens d'invitation
+      feature_registrations: Inscriptions
       feature_relay: Relais de fédération
       features: Fonctionnalités
       hidden_service: Fédération avec des services cachés
@@ -270,6 +275,7 @@ fr:
       search: Rechercher
       title: Instances connues
     invites:
+      deactivate_all: Tout désactiver
       filter:
         all: Tout
         available: Disponible
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 504b5abe4..e2944122d 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -6,6 +6,7 @@ gl:
     about_this: Sobre
     administered_by: 'Administrada por:'
     api: API
+    apps: Apps móbiles
     closed_registrations: O rexistro en esta instancia está pechado en este intre. Porén! Pode atopar unha instancia diferente para obter unha conta e ter acceso exactamente a misma rede desde alí.
     contact: Contacto
     contact_missing: Non establecido
@@ -36,6 +37,7 @@ gl:
     user_count_before: Fogar de
     what_is_mastodon: Qué é Mastodon?
   accounts:
+    choices_html: 'Eleccións de %{name}:'
     follow: Seguir
     followers: Seguidoras
     following: Seguindo
@@ -46,6 +48,8 @@ gl:
     nothing_here: Nada por aquí!
     people_followed_by: Personas que segue %{name}
     people_who_follow: Personas que seguen a %{name}
+    pin_errors:
+      following: Debe seguir a persoa que intenta recomendar
     posts: Mensaxes
     posts_with_replies: Toots e respostas
     reserved_username: O nome de usuaria está reservado
@@ -181,6 +185,7 @@ gl:
         unsuspend_account: "%{name} activou a conta de %{target}"
         update_custom_emoji: "%{name} actualizou emoji %{target}"
         update_status: "%{name} actualizou un estado de %{target}"
+      deleted_status: "(estado eliminado)"
       title: Rexistro de auditoría
     custom_emojis:
       by_domain: Dominio
@@ -208,6 +213,7 @@ gl:
       updated_msg: Actualizouse correctamente o emoji!
       upload: Subir
     dashboard:
+      backlog: backlogged jobs
       config: Axustes
       feature_deletions: Borrado de contas
       feature_invites: Ligazóns de convite
@@ -276,6 +282,7 @@ gl:
       search: Buscar
       title: Instancias coñecidas
     invites:
+      deactivate_all: Desactivar todo
       filter:
         all: Todo
         available: Dispoñible
@@ -368,11 +375,14 @@ gl:
         desc_html: Mostrar unha insignia de membresía nunha páxina de usuaria
         title: Mostrar insigna de membresía
       site_description:
-        desc_html: Parágrafo de presentación na páxina principal e nas meta etiquetas. Pode utilizar etiquetas HTML, en particular <code>&lt;a&gt;</code> e <code>&lt;em&gt;</code>.
+        desc_html: Parágrafo de presentación na páxina principal. Describe o que fai especial a este servidor Mastodon e calquera outra ouca importante. Pode utilizar etiquetas HTML, en particular <code>&lt;a&gt;</code> e <code>&lt;em&gt;</code>.
         title: Descrición da instancia
       site_description_extended:
         desc_html: Un bo lugar para o seu código de conducta, regras, guías e outras cousas que distingan a súa instancia. Pode utilizar etiquetas HTML
         title: Información extendida da personalización
+      site_short_description:
+        desc_html: Mostrado na barra lateral e nas etiquetas meta. Describe o que é Mastodon e que fai especial a este servidor nun só parágrafo. Si está baldeiro, mostrará a descrición da instancia.
+        title: Descrición curta da instancia
       site_terms:
         desc_html: Pode escribir a súa propia política de intimidade, termos de servizo ou aclaracións legais. Pode utilizar etiquetas HTML
         title: Termos de servizo personalizados
@@ -394,6 +404,7 @@ gl:
       media:
         title: Medios
       no_media: Sen medios
+      no_status_selected: Non se cambiou ningún estado xa que ningún foi seleccionado
       title: Estados da conta
       with_media: con medios
     subscriptions:
@@ -646,11 +657,14 @@ gl:
     publishing: Publicando
     web: Web
   remote_follow:
-    acct: Introduza o seu nomedeusuaria@dominio desde onde quere facer seguimento
+    acct: Introduza o seu usuaria@servidor desde onde quere interactuar
     missing_resource: Non se puido atopar o URL de redirecionamento requerido para a súa conta
     no_account_html: Non ten unha conta? Pode <a href='%{sign_up_path}' target='_blank'>rexistrarse aquí</a>
     proceed: Proceda para seguir
     prompt: 'Vostede vai seguir:'
+  remote_interaction:
+    proceed: Proceda para interactuar
+    prompt: 'Vostede quere interactuar con este toot:'
   remote_unfollow:
     error: Fallo
     title: Título
@@ -734,6 +748,7 @@ gl:
       private: As mensaxes non-públicas non poden ser fixadas
       reblog: Non se poden fixar as mensaxes promovidas
     show_more: Mostrar máis
+    sign_in_to_participate: Conéctese para participar na conversa
     title: '%{name}: "%{quote}"'
     visibilities:
       private: Só seguidoras
diff --git a/config/locales/he.yml b/config/locales/he.yml
index e3bb64364..ccf53e14a 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -4,10 +4,13 @@ he:
     about_hashtag_html: אלו סטטוסים פומביים המתוייגים בתור<strong>#%{hashtag}</strong>. ניתן להגיב, להדהד או לחבב אותם אם יש לך חשבון בכל מקום בפדרציה.
     about_mastodon_html: מסטודון היא רשת חברתית <em>חופשית, מבוססת תוכנה חופשית ("קוד פתוח")</em>. כאלטרנטיבה <em>בלתי ריכוזית</em> לפלטפרומות המסחריות, מסטודון מאפשרת להמנע מהסיכונים הנלווים להפקדת התקשורת שלך בידי חברה יחידה. שמת את מבטחך בשרת אחד &mdash; לא משנה במי בחרת, תמיד אפשר לדבר עם כל שאר המשתמשים. לכל מי שרוצה יש את האפשרות להקים שרת מסטודון עצמאי, ולהשתתף ב<em>רשת החברתית</em> באופן חלק.
     about_this: אודות שרת זה
+    api: API
+    apps: יישומונים לנייד
     closed_registrations: הרשמות סגורות לשרת זה לעת עתה.
-    contact: צור קשר
-    contact_missing: אין
+    contact: יצירת קשר
+    contact_missing: ללא הגדרה
     contact_unavailable: לא רלוונטי/חסר
+    documentation: תיעוד
     extended_description_html: |
       <h3>מקום טוב לכללים</h3>
       <p>התיאור המורחב טרם הוגדר.</p>
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 0f25dd231..c947e3107 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -5,45 +5,54 @@ it:
     about_mastodon_html: Mastodon è un social network <em>gratuito e open-source</em>. Un'alternativa <em>decentralizzata</em> alle piattaforme commerciali che evita che una singola compagnia monopolizzi il tuo modo di comunicare. Scegli un server di cui ti fidi &mdash; qualunque sia la tua scelta, potrai interagire con chiunque altro. Chiunque può sviluppare un suo server Mastodon e partecipare alla vita del <em>social network</em>.
     about_this: A proposito di questo server
     administered_by: 'Amministrato da:'
-    closed_registrations: Al momento le iscrizioni a questo server sono chiuse. Tuttavia! Puoi provare a cercare un istanza diversa su cui creare un account ed avere accesso alla stessa identica rete di questa.
+    api: API
+    apps: Applicazioni Mobile
+    closed_registrations: Al momento le iscrizioni a questo server sono chiuse. Tuttavia! Puoi provare a cercare un istanza diversa su cui creare un account ed avere accesso alla stessa identica rete.
     contact: Contatti
     contact_missing: Non impostato
     contact_unavailable: N/D
+    documentation: Documentazione
     extended_description_html: |
       <h3>Un buon posto per le regole</h3>
       <p>La descrizione estesa non è ancora stata preparata.</p>
     features:
-      humane_approach_body: Imparando dai fallimenti degli altri networks, Mastodon mira a fare scelte di design etico per combattere l'abuso dei social media.
+      humane_approach_body: Imparando dai fallimenti degli altri networks, Mastodon mira a fare scelte etiche di design per combattere l'abuso dei social media.
       humane_approach_title: Un approccio più umano
-      not_a_product_body: Mastodon non è una rete commerciale. Niente pubblicità, niente data mining, nessun giardino murato. Non c'è nessuna autorità centrale.
+      not_a_product_body: Mastodon non è una rete commerciale. Niente pubblicità, niente data mining, nessun recinto dorato. Non c'è nessuna autorità centrale.
       not_a_product_title: Tu sei una persona, non un prodotto
       real_conversation_body: Con 500 caratteri a disposizione, un supporto per i contenuti granulari ed avvisi sui media potrai esprimerti nel modo desiderato.
       real_conversation_title: Creato per conversazioni reali
-      within_reach_body: Apps per iOS, Android ed altre piattaforme, realizzate grazie ad un ecosistema di API adatto agli sviluppatori, ti consentono di poter stare ovunque al passo con i tuoi amici.
+      within_reach_body: Apps per iOS, Android ed altre piattaforme, realizzate grazie ad un ecosistema di API adatto agli sviluppatori, ti consentono di poter stare in contatto con i tuoi amici ovunque ti trovi.
       within_reach_title: Sempre a portata di mano
     generic_description: "%{domain} è un server nella rete"
     hosted_on: Mastodon ospitato su %{domain}
     learn_more: Scopri altro
     other_instances: Elenco istanze
+    privacy_policy: Policy su la Privacy
     source_code: Codice sorgente
     status_count_after: stati
     status_count_before: Che hanno pubblicato
+    terms: Termini di Servizio
     user_count_after: utenti
     user_count_before: Home di
     what_is_mastodon: Che cos'è Mastodon?
   accounts:
+    choices_html: 'Suggerimenti da %{name}:'
     follow: Segui
     followers: Seguaci
     following: Segui
+    joined: Dal %{date}
     media: Media
     moved_html: "%{name} è stato spostato su %{new_profile_link}:"
     network_hidden: Questa informazione non e' disponibile
     nothing_here: Qui non c'è nulla!
     people_followed_by: Persone seguite da %{name}
     people_who_follow: Persone che seguono %{name}
+    pin_errors:
+      following: Devi gia seguire la persona che vuoi promuovere
     posts: Posts
     posts_with_replies: Toot e risposte
-    reserved_username: Il nome utente è riservato
+    reserved_username: Il nome utente è gia stato preso
     roles:
       admin: Amministratore
       bot: Bot
@@ -171,9 +180,13 @@ it:
         resolve_report: "%{name} ha risolto il rapporto %{target}"
         silence_account: "%{name} ha silenziato l'account di %{target}"
         suspend_account: "%{name} ha sospeso l'account di %{target}"
+        unassigned_report: "%{name} report non assegnato %{target}"
         unsilence_account: "%{name} ha de-silenziato l'account di %{target}"
         unsuspend_account: "%{name} ha annullato la sospensione dell'account di %{target}"
         update_custom_emoji: "%{name} ha aggiornato l'emoji %{target}"
+        update_status: "%{name} stato aggiornato da %{target}"
+      deleted_status: "(stato cancellato)"
+      title: Audit log
     custom_emojis:
       by_domain: Dominio
       copied_msg: Creata con successo una copia locale dell'emoji
@@ -199,6 +212,25 @@ it:
       update_failed_msg: Impossibile aggiornare questa emojii
       updated_msg: Emoji aggiornata con successo!
       upload: Carica
+    dashboard:
+      backlog: backlogged jobs
+      config: Configurazione
+      feature_invites: Link di invito
+      feature_registrations: Registrazioni
+      features: Funzionalità
+      hidden_service: Federazione con servizi nascosti
+      open_reports: apri report
+      recent_users: Utenti Recenti
+      search: Ricerca testo intero
+      single_user_mode: Modalita utente singolo
+      software: Software
+      space: Utilizzo dello spazio
+      title: Dashboard
+      total_users: utenti totali
+      trends: Trends
+      week_interactions: interazioni per questa settimana
+      week_users_active: attivi questa settimana
+      week_users_new: utenti questa settimana
     domain_blocks:
       add_new: Aggiungi nuovo
       created_msg: Il blocco del dominio sta venendo processato
@@ -206,11 +238,14 @@ it:
       domain: Dominio
       new:
         create: Crea blocco
+        hint: Il blocco dominio non previene la creazione di utenti nel database, ma applicherà automaticamente e retroattivamente metodi di moderazione specifici su quegli account.
         severity:
           noop: Nessuno
           silence: Silenzia
           suspend: Sospendi
         title: Nuovo blocco dominio
+      reject_media: Rifiuta file media
+      reject_media_hint: Rimuovi i file media salvati in locale e blocca i download futuri. Irrilevante per le sospensioni
       severities:
         noop: Nessuno
         silence: Silenzia
@@ -243,12 +278,15 @@ it:
       search: Cerca
       title: Istanze conosciute
     invites:
+      deactivate_all: Disattiva tutto
       filter:
         all: Tutto
         available: Disponibile
         expired: Scaduto
         title: Filtro
       title: Inviti
+    relays:
+      inbox_url: Url Relay
     reports:
       account:
         note: note
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 4c03e8225..47177b809 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -6,6 +6,7 @@ ja:
     about_this: 詳細情報
     administered_by: '管理者:'
     api: API
+    apps: アプリ
     closed_registrations: 現在このインスタンスでの新規登録は受け付けていません。しかし、他のインスタンスにアカウントを作成しても全く同じネットワークに参加することができます。
     contact: 連絡先
     contact_missing: 未設定
@@ -36,6 +37,7 @@ ja:
     user_count_before: ユーザー数
     what_is_mastodon: Mastodon とは?
   accounts:
+    choices_html: "%{name} によるおすすめ:"
     follow: フォロー
     followers: フォロワー
     following: フォロー中
@@ -46,6 +48,8 @@ ja:
     nothing_here: 何もありません!
     people_followed_by: "%{name} さんがフォロー中のアカウント"
     people_who_follow: "%{name} さんをフォロー中のアカウント"
+    pin_errors:
+      following: 推薦したい人はあなたが既にフォローしている必要があります
     posts: トゥート
     posts_with_replies: トゥートと返信
     reserved_username: このユーザー名は予約されています
@@ -181,6 +185,7 @@ ja:
         unsuspend_account: "%{name} さんが %{target} さんの停止を解除しました"
         update_custom_emoji: "%{name} さんがカスタム絵文字 %{target} を更新しました"
         update_status: "%{name} さんが %{target} さんの投稿を更新しました"
+      deleted_status: "(削除されました)"
       title: 操作履歴
     custom_emojis:
       by_domain: ドメイン
@@ -277,6 +282,7 @@ ja:
       search: 検索
       title: 既知のインスタンス
     invites:
+      deactivate_all: すべて無効化
       filter:
         all: すべて
         available: 使用可能
@@ -398,6 +404,7 @@ ja:
       media:
         title: メディア
       no_media: メディアなし
+      no_status_selected: 何も選択されていないため、変更されていません
       title: トゥート一覧
       with_media: メディアあり
     subscriptions:
@@ -656,6 +663,9 @@ ja:
     no_account_html: アカウントをお持ちではないですか?<a href='%{sign_up_path}' target='_blank'>こちら</a>からサインアップできます
     proceed: フォローする
     prompt: 'フォローしようとしています:'
+  remote_interaction:
+    proceed: 進む
+    prompt: 'このトゥートに返信しようとしています:'
   remote_unfollow:
     error: エラー
     title: タイトル
@@ -740,6 +750,7 @@ ja:
       private: 非公開のトゥートを固定することはできません
       reblog: ブーストされたトゥートを固定することはできません
     show_more: もっと見る
+    sign_in_to_participate: ログインして会話に参加
     title: '%{name}: "%{quote}"'
     visibilities:
       private: フォロワー限定
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 1de909384..cd706a484 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -6,6 +6,7 @@ nl:
     about_this: Over deze server
     administered_by: 'Beheerd door:'
     api: API
+    apps: Mobiele apps
     closed_registrations: Registreren op deze server is momenteel niet mogelijk. Je kunt echter een andere server vinden om zo toegang te krijgen tot het netwerk.
     contact: Contact
     contact_missing: Niet ingesteld
@@ -36,6 +37,7 @@ nl:
     user_count_before: Thuisbasis van
     what_is_mastodon: Wat is Mastodon?
   accounts:
+    choices_html: 'Aanbevelingen van %{name}:'
     follow: Volgen
     followers: Volgers
     following: Volgend
@@ -46,6 +48,8 @@ nl:
     nothing_here: Hier is niets!
     people_followed_by: Mensen die %{name} volgen
     people_who_follow: Mensen die %{name} volgen
+    pin_errors:
+      following: Je moet dit account wel al volgen, alvorens je het kan aanbevelen
     posts: Toots
     posts_with_replies: Toots en reacties
     reserved_username: Deze gebruikersnaam is gereserveerd
@@ -181,6 +185,7 @@ nl:
         unsuspend_account: Opschorten van account %{target} is door %{name} opgeheven
         update_custom_emoji: Emoji %{target} is door %{name} bijgewerkt
         update_status: De toots van %{target} zijn door %{name} bijgewerkt
+      deleted_status: "(verwijderde toot}"
       title: Auditlog
     custom_emojis:
       by_domain: Domein
@@ -277,6 +282,7 @@ nl:
       search: Zoeken
       title: Bekende servers
     invites:
+      deactivate_all: Alles deactiveren
       filter:
         all: Alles
         available: Beschikbaar
@@ -398,6 +404,7 @@ nl:
       media:
         title: Media
       no_media: Geen media
+      no_status_selected: Er werden geen toots gewijzigd, omdat er geen enkele werd geselecteerd
       title: Toots van account
       with_media: Met media
     subscriptions:
@@ -650,11 +657,14 @@ nl:
     publishing: Publiceren
     web: Webapp
   remote_follow:
-    acct: Geef jouw account@domein.tld op waarvandaan je wilt volgen
+    acct: Geef jouw account@domein op die je wilt gebruiken
     missing_resource: Kon vereiste doorverwijzings-URL voor jouw account niet vinden
     no_account_html: Heb je geen account? Je kunt er <a href='%{sign_up_path}' target='_blank'>hier een registreren</a>
     proceed: Ga door om te volgen
     prompt: 'Jij gaat volgen:'
+  remote_interaction:
+    proceed: Ga de interactie aan
+    prompt: 'Jij wilt de interactie aangaan met deze toot:'
   remote_unfollow:
     error: Fout
     title: Titel
@@ -738,6 +748,7 @@ nl:
       private: Alleen openbare toots kunnen worden vastgezet
       reblog: Een boost kan niet worden vastgezet
     show_more: Meer tonen
+    sign_in_to_participate: Meld je aan om aan dit gesprek mee te doen
     title: '%{name}: "%{quote}"'
     visibilities:
       private: Alleen volgers
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index de024f019..e61fcd0c9 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -6,6 +6,7 @@ oc:
     about_this: A prepaus d’aquesta instància
     administered_by: 'Gerida per :'
     api: API
+    apps: Aplicacions per mobil
     closed_registrations: Las inscripcions son clavadas pel moment sus aquesta instància.
     contact: Contacte
     contact_missing: Pas parametrat
@@ -36,6 +37,7 @@ oc:
     user_count_before: Ostal de
     what_is_mastodon: Qu’es Mastodon ?
   accounts:
+    choices_html: 'Recomandacion de %{name} :'
     follow: Sègre
     followers: Seguidors
     following: Abonaments
@@ -46,6 +48,8 @@ oc:
     nothing_here: I a pas res aquí !
     people_followed_by: Lo monde que %{name} sèc
     people_who_follow: Lo monde que sègon %{name}
+    pin_errors:
+      following: Vos cal d’en primièr sègre las personas que volètz promòure
     posts: Tuts
     posts_with_replies: Tuts e responsas
     reserved_username: Aqueste nom d’utilizaire es reservat
@@ -182,6 +186,7 @@ oc:
         unsuspend_account: "%{name} restabliguèt lo compte a %{target}"
         update_custom_emoji: "%{name} metèt a jorn l’emoji %{target}"
         update_status: "%{name} metèt a jorn l’estatut a %{target}"
+      deleted_status: "(estatut suprimit)"
       title: Audit dels jornals
     custom_emojis:
       by_domain: Domeni
@@ -278,6 +283,7 @@ oc:
       search: Cercar
       title: Instàncias conegudas
     invites:
+      deactivate_all: O desactivar tot
       filter:
         all: Totes
         available: Disponibles
@@ -399,6 +405,7 @@ oc:
       media:
         title: Mèdia
       no_media: Cap de mèdia
+      no_status_selected: Cap d’estatut pas cambiat estant que cap èra pas seleccionat
       title: Estatuts del compte
       with_media: Amb mèdia
     subscriptions:
@@ -712,6 +719,8 @@ oc:
     no_account_html: Avètz pas cap de compte ? Podètz <a href='%{sign_up_path}' target='_blank'>vos marcar aquí</a>
     proceed: Clicatz per sègre
     prompt: 'Sètz per sègre :'
+  remote_interaction:
+    prompt: 'Volètz interagir amb aqueste tut :'
   remote_unfollow:
     error: Error
     title: Títol
@@ -795,6 +804,7 @@ oc:
       private: Se pòt pas penjar los tuts pas publics
       reblog: Se pòt pas penjar un tut partejat
     show_more: Ne veire mai
+    sign_in_to_participate: Inscrivètz-vos per participar a la conversacion
     title: '%{name} : "%{quote}"'
     visibilities:
       private: Seguidors solament
@@ -850,6 +860,7 @@ oc:
   time:
     formats:
       default: Lo %d %b de %Y a %Ho%M
+      month: "%b %Y"
   two_factor_authentication:
     code_hint: Picatz lo còdi generat per vòstra aplicacion d’autentificacion per confirmar
     description_html: S’activatz <strong> l’autentificacion two-factor</strong>, vos caldrà vòstre mobil per vos connectar perque generarà un geton per vos daissar dintrar.
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 924173140..f58f32668 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -878,7 +878,7 @@ pl:
     wrong_code: Wprowadzony kod jest niepoprawny! Czy czas serwera i urządzenia jest poprawny?
   user_mailer:
     backup_ready:
-      explanation: Zażądałeś pełnej kopii zapasowej konta na Mastodonie. Jest ono dostępne do pobrania
+      explanation: Zażądałeś pełnej kopii zapasowej konta na Mastodonie. Jest ona dostępna do pobrania!
       subject: Twoje archiwum jest gotowe do pobrania
       title: Odbiór archiwum
     welcome:
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index bc22a2c76..32f70e977 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -6,6 +6,7 @@ pt-BR:
     about_this: Sobre
     administered_by: 'Administrado por:'
     api: API
+    apps: Apps
     closed_registrations: Os cadastros estão atualmente fechados nesta instância. No entanto, você pode procurar uma instância diferente na qual possa criar uma conta e acessar a mesma rede por lá.
     contact: Contato
     contact_missing: Não definido
@@ -31,11 +32,12 @@ pt-BR:
     source_code: Código-fonte
     status_count_after: publicações
     status_count_before: Autores de
-    terms: Termos de Serviço
+    terms: Termos de serviço
     user_count_after: usuários
     user_count_before: Casa de
     what_is_mastodon: O que é Mastodon?
   accounts:
+    choices_html: 'Escolhas de %{name}:'
     follow: Seguir
     followers: Seguidores
     following: Seguindo
@@ -46,6 +48,8 @@ pt-BR:
     nothing_here: Não há nada aqui!
     people_followed_by: Pessoas que %{name} segue
     people_who_follow: Pessoas que seguem %{name}
+    pin_errors:
+      following: Você tem que estar seguindo a pessoa que você quer sugerir
     posts: Toots
     posts_with_replies: Toots e respostas
     reserved_username: Este usuário está reservado
@@ -181,6 +185,7 @@ pt-BR:
         unsuspend_account: "%{name} desativou a suspensão de  %{target}"
         update_custom_emoji: "%{name} atualizou o emoji %{target}"
         update_status: "%{name} atualizou o estado de %{target}"
+      deleted_status: "(status deletado)"
       title: Auditar relatório
     custom_emojis:
       by_domain: Domínio
@@ -277,6 +282,7 @@ pt-BR:
       search: Buscar
       title: Instâncias conhecidas
     invites:
+      deactivate_all: Desativar todos
       filter:
         all: Todos
         available: Disponíveis
@@ -398,6 +404,7 @@ pt-BR:
       media:
         title: Mídia
       no_media: Não há mídia
+      no_status_selected: Nenhum status foi modificado porque nenhum estava selecionado
       title: Postagens da conta
       with_media: Com mídia
     subscriptions:
@@ -650,11 +657,14 @@ pt-BR:
     publishing: Publicação
     web: Web
   remote_follow:
-    acct: Insira o seu usuário@domínio do qual você quer seguir
+    acct: Insira o seu usuário@domínio a partir do qual você deseja agir
     missing_resource: Não foi possível encontrar a URL de direcionamento para a sua conta
     no_account_html: Não tem uma conta? Você pode <a href='%{sign_up_path}' target='_blank'>cadastrar-se aqui</a>
     proceed: Prosseguir para seguir
     prompt: 'Você irá seguir:'
+  remote_interaction:
+    proceed: Continue para interagir
+    prompt: 'Você quer interagir com este toot:'
   remote_unfollow:
     error: Erro
     title: Título
@@ -738,6 +748,7 @@ pt-BR:
       private: Toot não-público não pode ser fixado
       reblog: Um compartilhamento não pode ser fixado
     show_more: Mostrar mais
+    sign_in_to_participate: Entre para participar dessa conversa
     title: '%{name}: "%{quote}"'
     visibilities:
       private: Apenas seguidores
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index d7cb88a6f..3ee4a92a4 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -16,6 +16,7 @@ ar:
         locale: لغة واجهة المستخدم و الرسائل الإلكترونية و الإشعارات
         locked: يتطلب منك الموافقة يدويا على طلبات المتابعة
         note: <span class="note-counter">%{count}</span> حرف باق
+        phrase: سوف يتم العثور عليه مهما كان نوع النص أو حتى و إن كان داخل الويب فيه تحذير عن المحتوى
         scopes: ما هي المجالات المسموح بها في التطبيق ؟ إن قمت باختيار أعلى المجالات فيمكنك الإستغناء عن الخَيار اليدوي.
         setting_default_language: يمكن الكشف التلقائي للّغة اللتي استخدمتها في تحرير تبويقاتك ، غيرَ أنّ العملية ليست دائما دقيقة
         setting_hide_network: الحسابات التي تُتابعها و التي تُتابِعك على حد سواء لن تُعرَض على صفحتك الشخصية
@@ -47,6 +48,7 @@ ar:
         expires_in: تنتهي مدة صلاحيته بعد
         fields: واصفات بيانات الملف الشخصي
         header: الرأسية
+        inbox_url: عنوان رابط صندوق المُرَحِّل
         irreversible: إسقاط بدلا من إخفائها
         locale: لغة الواجهة
         locked: تجميد الحساب
diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml
index fc3258993..a5697220e 100644
--- a/config/locales/simple_form.da.yml
+++ b/config/locales/simple_form.da.yml
@@ -14,25 +14,25 @@ da:
         fields: Du kan have op til 4 ting vist som en tabel på din profil
         header: PNG, GIF eller JPG. Højest %{size}. Vil blive skaleret ned til %{dimensions}px
         inbox_url: Kopiere linket fra forsiden af den relay som du ønsker at bruge
-        irreversible: Filtrerede toots vil forsvinde fulstændigt, selv hvis filteret senere skulle blive fjernet
+        irreversible: Filtrerede trut vil forsvinde fulstændigt, selv hvis filteret senere skulle blive fjernet
         locale: Sproget på interfacet, emails og push beskeder
         locked: Kræver, at du godkender følgere manuelt
         note:
           one: <span class="note-counter">1</span> tegn tilbage
           other: <span class="note-counter">%{count}</span> tegn tilbage
-        phrase: Vil blive parret uanset om der er store eller små bogstaver i teksten eller om der er en advarsel om en toot
+        phrase: Vil blive parret uanset om der er store eller små bogstaver i teksten eller om der er en advarsel om et trut
         scopes: Hvilke APIs applikationen vil få adgang til. Hvis du vælger et højtlevel omfang, behøver du ikke vælge enkeltstående.
-        setting_default_language: Sproget for dine toots kan blive fundet automatisk, men det er ikke altid præcist
+        setting_default_language: Sproget for dine trut kan blive fundet automatisk, men det er ikke altid præcist
         setting_hide_network: Hvem du følger og hvem der følger dig vil ikke blive vist på din profil
         setting_noindex: Påvirker din offentlige profil og status sider
-        setting_theme: Påvirker hvordan Mastodon ser ud nåt du er logget ind via en hvilken som helst enhed.
-        whole_word: Når nøgle ordet eller udtrykket kun er alfabetisk, vil det kun blive brugt hvis det passer hele ordet
+        setting_theme: Påvirker hvordan Mastodon ser ud når du er logget ind via en hvilken som helst enhed.
+        whole_word: Når nøgle ordet eller udtrykket kun er alfanumerisk, vil det kun blive brugt hvis det passer hele ordet
       imports:
         data: CSV fil eksporteret fra en anden Mastodon instans
       sessions:
-        otp: 'Indtast to-faktor koden der generes af appen på din fon eller brug en af din genoprettelses koder:'
+        otp: 'Indtast to-faktor koden der generes af appen af appen på din telefon eller brug en af din genoprettelses koder:'
       user:
-        chosen_languages: Når markeret, vil kun toots i de valgte sprog blive vist på offentlige tidslinjer
+        chosen_languages: Når markeret, vil kun trut i de valgte sprog blive vist på offentlige tidslinjer
     labels:
       account:
         fields:
@@ -41,12 +41,12 @@ da:
       defaults:
         autofollow: Inviter til at følge din konto
         avatar: Profilbillede
-        bot: Dette er en bot konto
+        bot: Dette er en robot konto
         chosen_languages: Filtrer sprog
-        confirm_new_password: Bekræft dit nye kodeord
-        confirm_password: Bekræft kodeord
+        confirm_new_password: Bekræft din nye adgangskode
+        confirm_password: Bekræft adgangskode
         context: Filtrer sammenhænge
-        current_password: Nuværende kodeord
+        current_password: Nuværende adgangskode
         data: Data
         display_name: Visningsnavn
         email: E-mail adresse
@@ -58,17 +58,17 @@ da:
         locale: Sprog på interface
         locked: Lås konto
         max_uses: Højeste antal benyttelser
-        new_password: Nyt kodeord
+        new_password: Ny adgangskode
         note: Biografi
         otp_attempt: To-faktor kode
-        password: Kodeord
+        password: Adgangskode
         phrase: Nøgleord eller sætning
         setting_auto_play_gif: Afspil automatisk animerede GIFs
         setting_boost_modal: Vis bekræftelses dialog før du fremhæver
         setting_default_language: Sprog for opslag
         setting_default_privacy: Privatliv
         setting_default_sensitive: Marker altid multimedia som værende følsomt
-        setting_delete_modal: Vis bekræftelses dialog før du sletter et toot
+        setting_delete_modal: Vis bekræftelses dialog før du sletter et trut
         setting_display_sensitive_media: Vis altid multimedier markeret som værende følsomt
         setting_hide_network: Skjul dit netværk
         setting_noindex: Frameld dig søgemaskiners indeksering
diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml
index 649d18484..09a338200 100644
--- a/config/locales/simple_form.eu.yml
+++ b/config/locales/simple_form.eu.yml
@@ -20,10 +20,12 @@ eu:
           one: Karaktere<span class="note-counter">1</span> geratzen da
           other: <span class="note-counter"> %{count}</span> karaktere geratzen dira
         phrase: Bat egingo du Maiuskula/minuskula kontuan hartu gabe eta edukiaren abisua kontuan hartu gabe
+        scopes: Zeintzuk API atzitu ditzakeen aplikazioak. Goi mailako arloa aukeratzen baduzu, ez dituzu azpikoak aukeratu behar.
         setting_default_language: Zure toot-en hizkuntza automatikoki antzeman daiteke, baina ez da beti zehatza
         setting_hide_network: Nor jarraitzen duzun eta nork jarraitzen zaituen ez da bistaratuko zure profilean
         setting_noindex: Zure profil publiko eta toot orrietan eragina du
         setting_theme: Edozein gailutik konektatzean Mastodon-en itxuran eragiten du.
+        whole_word: Hitz eta esaldi gakoa alfanumerikoa denean, hitz osoarekin bat datorrenean besterik ez da aplikatuko
       imports:
         data: Beste Mastodon instantzia batetik esportatutako CSV fitxategia
       sessions:
@@ -42,6 +44,7 @@ eu:
         chosen_languages: Iragazi hizkuntzak
         confirm_new_password: Berretsi pasahitz berria
         confirm_password: Berretsi pasahitza
+        context: Iragazkiaren testuinguruak
         current_password: Oraingo pasahitza
         data: Datuak
         display_name: Pantaila-izena
@@ -49,6 +52,7 @@ eu:
         expires_in: Iraungitzea
         fields: Profilaren metadatuak
         header: Goiburua
+        irreversible: Baztertu ezkutatu ordez
         locale: Interfazearen hizkuntza
         locked: Giltzapetu kontua
         max_uses: Gehieneko erabiltzaile kopurua
@@ -56,6 +60,7 @@ eu:
         note: Biografia
         otp_attempt: Bi faktoreetako kodea
         password: Pasahitza
+        phrase: Hitz edo esaldi gakoa
         setting_auto_play_gif: Erreproduzitu GIF animatuak automatikoki
         setting_boost_modal: Erakutsi baieztapen elkarrizketa-koadroa bultzada eman aurretik
         setting_default_language: Argitalpenen hizkuntza
@@ -73,6 +78,7 @@ eu:
         type: Inportazio mota
         username: Erabiltzaile-izena
         username_or_email: Erabiltzaile-izena edo e-mail helbidea
+        whole_word: Hitz osoa
       interactions:
         must_be_follower: Blokeatu jarraitzaile ez direnen jakinarazpenak
         must_be_following: Blokeatu zuk jarraitzen ez dituzunen jakinarazpenak
diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml
index f4266e167..c24037d41 100644
--- a/config/locales/simple_form.fa.yml
+++ b/config/locales/simple_form.fa.yml
@@ -4,7 +4,7 @@ fa:
     hints:
       defaults:
         autofollow: کسانی که از راه دعوت‌نامه عضو می‌شوند به طور خودکار پیگیر شما خواهند شد
-        avatar: یکی از قالب‌های PNG یا  GIF یا JPG. بیشترین اندازه ۲ مگابایت. تصویر به اندازهٔ ۴۰۰×۴۰۰ پیکسل تبدیل خواهد شد
+        avatar: یکی از قالب‌های PNG یا  GIF یا JPG. بیشترین اندازه %{size}. تصویر به اندازهٔ %{dimensions} پیکسل تبدیل خواهد شد
         bot: این حساب بیشتر به طور خودکار فعالیت می‌کند و نظارت پیوسته‌ای روی آن وجود ندارد
         context: یک یا چند زمینه که فیلتر باید در آن‌ها اعمال شود
         digest: تنها وقتی فرستاده می‌شود که مدتی طولانی فعالیتی نداشته باشید و در این مدت برای شما پیغام خصوصی‌ای نوشته شده باشد
@@ -12,7 +12,7 @@ fa:
           one: <span class="name-counter">1</span> حرف باقی مانده
           other: <span class="name-counter">%{count}</span> حرف باقی مانده
         fields: شما می‌توانید تا چهار مورد را در یک جدول در نمایهٔ خود نمایش دهید
-        header: یکی از قالب‌های PNG یا  GIF یا JPG. بیشترین اندازه ۲ مگابایت. تصویر به اندازهٔ ۳۳۵×۷۰۰ پیکسل تبدیل خواهد شد
+        header: یکی از قالب‌های PNG یا  GIF یا JPG. بیشترین اندازه %{size}. تصویر به اندازهٔ %{dimensions} پیکسل تبدیل خواهد شد
         inbox_url: نشانی صفحهٔ اصلی رله‌ای را که می‌خواهید به کار ببرید کپی کنید
         irreversible: بوق‌های فیلترشده به طور برگشت‌ناپذیری ناپدید می‌شوند، حتی اگر فیلتر را بعداً بردارید
         locale: زبان محیط کاربری، ایمیل‌ها، و اعلان‌ها
diff --git a/config/locales/simple_form.uk.yml b/config/locales/simple_form.uk.yml
index b4d2d6a80..834631fdf 100644
--- a/config/locales/simple_form.uk.yml
+++ b/config/locales/simple_form.uk.yml
@@ -4,6 +4,7 @@ uk:
     hints:
       defaults:
         avatar: PNG, GIF, або JPG. Максимум - 2МБ. Буде зменшено до %{dimensions}px
+        bot: Цей аккаунт в основному виконує автоматичні дії та може не відстежуватіся
         display_name: 'Залишилося символів: <span class="name-counter">%{count}</span>'
         header: PNG, GIF, або JPG. Максимум - 2МБ. Буде зменшено до %{dimensions}px
         locked: Буде вимагати від Вас самостійного підтверждення підписників, змінить приватність постів за замовчуванням на "тільки для підписників"
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index 5a37c0c36..6783495bb 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -19,6 +19,7 @@ uk:
       humane_approach_title: Більш людський підхід
       not_a_product_body: Mastodon - це некомерційна мережа. Ніякої реклами, збору даних і залізних стін. Тут немає центральної влади.
       not_a_product_title: Ви - особистість, а не продукт
+      real_conversation_body: Висловлюйте свої думки себе у будь-який спосіб маючи в розпорядженні 500 символів з підтримкою гранульованого контенту та попереджень медіа.
       real_conversation_title: Побудований для справжньої розмови
       within_reach_body: Велика кількість застосунків для iOS, Android та інших платформ, завдяки дружній до розробника екосистемі дозволяє бути на звязку з друзями звідусіль.
       within_reach_title: Завжди на звязку
diff --git a/config/routes.rb b/config/routes.rb
index dffa2fb8b..37bb4967b 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -177,7 +177,7 @@ Rails.application.routes.draw do
       resource :change_email, only: [:show, :update]
       resource :reset, only: [:create]
       resource :silence, only: [:create, :destroy]
-      resource :suspension, only: [:create, :destroy]
+      resource :suspension, only: [:new, :create, :destroy]
       resources :statuses, only: [:index, :create, :update, :destroy]
 
       resource :confirmation, only: [:create] do
diff --git a/db/migrate/20180820232245_add_foreign_key_indices.rb b/db/migrate/20180820232245_add_foreign_key_indices.rb
new file mode 100644
index 000000000..e346c1f5b
--- /dev/null
+++ b/db/migrate/20180820232245_add_foreign_key_indices.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddForeignKeyIndices < ActiveRecord::Migration[5.2]
+  disable_ddl_transaction!
+
+  def change
+    add_index :follows, :target_account_id, algorithm: :concurrently
+    add_index :blocks, :target_account_id, algorithm: :concurrently
+    add_index :mutes, :target_account_id, algorithm: :concurrently
+    add_index :notifications, :from_account_id, algorithm: :concurrently
+    add_index :accounts, :moved_to_account_id, algorithm: :concurrently
+    add_index :statuses, :in_reply_to_account_id, algorithm: :concurrently
+    add_index :session_activations, :access_token_id, algorithm: :concurrently
+    add_index :oauth_access_grants, :resource_owner_id, algorithm: :concurrently
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index bac85869a..8c0f5431d 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2018_08_14_171349) do
+ActiveRecord::Schema.define(version: 2018_08_20_232245) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -88,6 +88,7 @@ ActiveRecord::Schema.define(version: 2018_08_14_171349) do
     t.string "actor_type"
     t.index "(((setweight(to_tsvector('simple'::regconfig, (display_name)::text), 'A'::\"char\") || setweight(to_tsvector('simple'::regconfig, (username)::text), 'B'::\"char\")) || setweight(to_tsvector('simple'::regconfig, (COALESCE(domain, ''::character varying))::text), 'C'::\"char\")))", name: "search_index", using: :gin
     t.index "lower((username)::text), lower((domain)::text)", name: "index_accounts_on_username_and_domain_lower", unique: true
+    t.index ["moved_to_account_id"], name: "index_accounts_on_moved_to_account_id"
     t.index ["uri"], name: "index_accounts_on_uri"
     t.index ["url"], name: "index_accounts_on_url"
   end
@@ -122,6 +123,7 @@ ActiveRecord::Schema.define(version: 2018_08_14_171349) do
     t.bigint "target_account_id", null: false
     t.string "uri"
     t.index ["account_id", "target_account_id"], name: "index_blocks_on_account_id_and_target_account_id", unique: true
+    t.index ["target_account_id"], name: "index_blocks_on_target_account_id"
   end
 
   create_table "bookmarks", force: :cascade do |t|
@@ -219,6 +221,7 @@ ActiveRecord::Schema.define(version: 2018_08_14_171349) do
     t.boolean "show_reblogs", default: true, null: false
     t.string "uri"
     t.index ["account_id", "target_account_id"], name: "index_follows_on_account_id_and_target_account_id", unique: true
+    t.index ["target_account_id"], name: "index_follows_on_target_account_id"
   end
 
   create_table "identities", id: :serial, force: :cascade do |t|
@@ -307,6 +310,7 @@ ActiveRecord::Schema.define(version: 2018_08_14_171349) do
     t.bigint "account_id", null: false
     t.bigint "target_account_id", null: false
     t.index ["account_id", "target_account_id"], name: "index_mutes_on_account_id_and_target_account_id", unique: true
+    t.index ["target_account_id"], name: "index_mutes_on_target_account_id"
   end
 
   create_table "notifications", force: :cascade do |t|
@@ -319,6 +323,7 @@ ActiveRecord::Schema.define(version: 2018_08_14_171349) do
     t.index ["account_id", "activity_id", "activity_type"], name: "account_activity", unique: true
     t.index ["account_id", "id"], name: "index_notifications_on_account_id_and_id", order: { id: :desc }
     t.index ["activity_id", "activity_type"], name: "index_notifications_on_activity_id_and_activity_type"
+    t.index ["from_account_id"], name: "index_notifications_on_from_account_id"
   end
 
   create_table "oauth_access_grants", force: :cascade do |t|
@@ -330,6 +335,7 @@ ActiveRecord::Schema.define(version: 2018_08_14_171349) do
     t.string "scopes"
     t.bigint "application_id", null: false
     t.bigint "resource_owner_id", null: false
+    t.index ["resource_owner_id"], name: "index_oauth_access_grants_on_resource_owner_id"
     t.index ["token"], name: "index_oauth_access_grants_on_token", unique: true
   end
 
@@ -433,6 +439,7 @@ ActiveRecord::Schema.define(version: 2018_08_14_171349) do
     t.bigint "access_token_id"
     t.bigint "user_id", null: false
     t.bigint "web_push_subscription_id"
+    t.index ["access_token_id"], name: "index_session_activations_on_access_token_id"
     t.index ["session_id"], name: "index_session_activations_on_session_id", unique: true
     t.index ["user_id"], name: "index_session_activations_on_user_id"
   end
@@ -497,6 +504,7 @@ ActiveRecord::Schema.define(version: 2018_08_14_171349) do
     t.bigint "in_reply_to_account_id"
     t.boolean "local_only"
     t.index ["account_id", "id", "visibility", "updated_at"], name: "index_statuses_20180106", order: { id: :desc }
+    t.index ["in_reply_to_account_id"], name: "index_statuses_on_in_reply_to_account_id"
     t.index ["in_reply_to_id"], name: "index_statuses_on_in_reply_to_id"
     t.index ["reblog_of_id", "account_id"], name: "index_statuses_on_reblog_of_id_and_account_id"
     t.index ["uri"], name: "index_statuses_on_uri", unique: true
diff --git a/spec/controllers/admin/reports_controller_spec.rb b/spec/controllers/admin/reports_controller_spec.rb
index e50c02a72..bcc789c57 100644
--- a/spec/controllers/admin/reports_controller_spec.rb
+++ b/spec/controllers/admin/reports_controller_spec.rb
@@ -68,21 +68,6 @@ describe Admin::ReportsController do
       end
     end
 
-    describe 'with an outcome of `suspend`' do
-      it 'suspends the reported account' do
-        report = Fabricate(:report)
-        allow(Admin::SuspensionWorker).to receive(:perform_async)
-
-        put :update, params: { id: report, outcome: 'suspend' }
-        expect(response).to redirect_to(admin_reports_path)
-        report.reload
-        expect(report.action_taken_by_account).to eq user.account
-        expect(report.action_taken).to eq true
-        expect(Admin::SuspensionWorker).
-          to have_received(:perform_async).with(report.target_account_id)
-      end
-    end
-
     describe 'with an outsome of `silence`' do
       it 'silences the reported account' do
         report = Fabricate(:report)
diff --git a/spec/controllers/admin/suspensions_controller_spec.rb b/spec/controllers/admin/suspensions_controller_spec.rb
index ddfc938d1..babb1ed96 100644
--- a/spec/controllers/admin/suspensions_controller_spec.rb
+++ b/spec/controllers/admin/suspensions_controller_spec.rb
@@ -12,7 +12,7 @@ describe Admin::SuspensionsController do
       account = Fabricate(:account, suspended: false)
       expect(Admin::SuspensionWorker).to receive(:perform_async).with(account.id)
 
-      post :create, params: { account_id: account.id }
+      post :create, params: { account_id: account.id, form_admin_suspension_confirmation: { acct: account.acct } }
 
       expect(response).to redirect_to(admin_accounts_path)
     end
diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb
index 3467342ee..512dc258e 100644
--- a/spec/models/status_spec.rb
+++ b/spec/models/status_spec.rb
@@ -610,17 +610,6 @@ RSpec.describe Status, type: :model do
           expect(results).to include(es_status)
         end
       end
-
-      context 'where that account is silenced' do
-        it 'includes statuses from other accounts that are silenced' do
-          @account.update(silenced: true)
-          other_silenced_account = Fabricate(:account, silenced: true)
-          other_status = Fabricate(:status, account: other_silenced_account)
-
-          results = Status.as_public_timeline(@account)
-          expect(results).to include(other_status)
-        end
-      end
     end
 
     context 'with local-only statuses' do
diff --git a/spec/services/activitypub/fetch_remote_account_service_spec.rb b/spec/services/activitypub/fetch_remote_account_service_spec.rb
index dba55c034..aa13f0a9b 100644
--- a/spec/services/activitypub/fetch_remote_account_service_spec.rb
+++ b/spec/services/activitypub/fetch_remote_account_service_spec.rb
@@ -59,7 +59,6 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do
       it 'returns nil' do
         expect(account).to be_nil
       end
-
     end
 
     context 'when URI and WebFinger share the same host' do
@@ -119,5 +118,11 @@ RSpec.describe ActivityPub::FetchRemoteAccountService, type: :service do
 
       include_examples 'sets profile data'
     end
+
+    context 'with wrong id' do
+      it 'does not create account' do
+        expect(subject.call('https://fake.address/@foo', prefetched_body: Oj.dump(actor))).to be_nil
+      end
+    end
   end
 end
diff --git a/spec/services/activitypub/fetch_remote_status_service_spec.rb b/spec/services/activitypub/fetch_remote_status_service_spec.rb
index 549eb80fa..9ae409996 100644
--- a/spec/services/activitypub/fetch_remote_status_service_spec.rb
+++ b/spec/services/activitypub/fetch_remote_status_service_spec.rb
@@ -70,5 +70,27 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
         expect(strip_tags(status.text)).to eq "Nyan Cat 10 hours remix https://#{valid_domain}/watch?v=12345"
       end
     end
+
+    context 'with wrong id' do
+      let(:note) do
+        {
+          '@context': 'https://www.w3.org/ns/activitystreams',
+          id: "https://real.address/@foo/1234",
+          type: 'Note',
+          content: 'Lorem ipsum',
+          attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
+        }
+      end
+
+      let(:object) do
+        temp = note.dup
+        temp[:id] = 'https://fake.address/@foo/5678'
+        temp
+      end
+
+      it 'does not create status' do
+        expect(sender.statuses.first).to be_nil
+      end
+    end
   end
 end
diff --git a/spec/services/fetch_remote_account_service_spec.rb b/spec/services/fetch_remote_account_service_spec.rb
index 1c3abe8f3..20dd505d0 100644
--- a/spec/services/fetch_remote_account_service_spec.rb
+++ b/spec/services/fetch_remote_account_service_spec.rb
@@ -1,7 +1,7 @@
 require 'rails_helper'
 
 RSpec.describe FetchRemoteAccountService, type: :service do
-  let(:url) { 'https://example.com' }
+  let(:url) { 'https://example.com/alice' }
   let(:prefetched_body) { nil }
   let(:protocol) { :ostatus }
   subject { FetchRemoteAccountService.new.call(url, prefetched_body, protocol) }
@@ -46,6 +46,24 @@ RSpec.describe FetchRemoteAccountService, type: :service do
     end
 
     include_examples 'return Account'
+
+    it 'does not update account information if XML comes from an unverified domain' do
+      feed_xml = <<-XML.squish
+        <?xml version="1.0" encoding="UTF-8"?>
+        <feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
+          <author>
+            <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+            <uri>http://kickass.zone/users/localhost</uri>
+            <name>localhost</name>
+            <poco:preferredUsername>localhost</poco:preferredUsername>
+            <poco:displayName>Villain!!!</poco:displayName>
+          </author>
+        </feed>
+      XML
+
+      returned_account = described_class.new.call('https://real-fake-domains.com/alice', feed_xml, :ostatus)
+      expect(returned_account.display_name).to_not eq 'Villain!!!'
+    end
   end
 
   context 'when prefetched_body is nil' do
diff --git a/spec/services/fetch_remote_status_service_spec.rb b/spec/services/fetch_remote_status_service_spec.rb
index 0df9c329a..f9db024b9 100644
--- a/spec/services/fetch_remote_status_service_spec.rb
+++ b/spec/services/fetch_remote_status_service_spec.rb
@@ -32,4 +32,56 @@ RSpec.describe FetchRemoteStatusService, type: :service do
       expect(status.text).to eq 'Lorem ipsum'
     end
   end
+
+  context 'protocol is :ostatus' do
+    subject { described_class.new }
+
+    before do
+      Fabricate(:account, username: 'tracer', domain: 'real.domain', remote_url: 'https://real.domain/users/tracer')
+    end
+
+    it 'does not create status with author at different domain' do
+      status_body = <<-XML.squish
+        <?xml version="1.0"?>
+        <entry xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:media="http://purl.org/syndication/atommedia" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:mastodon="http://mastodon.social/schema/1.0">
+          <id>tag:real.domain,2017-04-27:objectId=4487555:objectType=Status</id>
+          <published>2017-04-27T13:49:25Z</published>
+          <updated>2017-04-27T13:49:25Z</updated>
+          <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+          <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+          <author>
+            <id>https://real.domain/users/tracer</id>
+            <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+            <uri>https://real.domain/users/tracer</uri>
+            <name>tracer</name>
+          </author>
+          <content type="html">Overwatch rocks</content>
+        </entry>
+      XML
+
+      expect(subject.call('https://fake.domain/foo', status_body, :ostatus)).to be_nil
+    end
+
+    it 'does not create status with wrong id when id uses http format' do
+      status_body = <<-XML.squish
+        <?xml version="1.0"?>
+        <entry xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:media="http://purl.org/syndication/atommedia" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:mastodon="http://mastodon.social/schema/1.0">
+          <id>https://other-real.domain/statuses/123</id>
+          <published>2017-04-27T13:49:25Z</published>
+          <updated>2017-04-27T13:49:25Z</updated>
+          <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+          <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+          <author>
+            <id>https://real.domain/users/tracer</id>
+            <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+            <uri>https://real.domain/users/tracer</uri>
+            <name>tracer</name>
+          </author>
+          <content type="html">Overwatch rocks</content>
+        </entry>
+      XML
+
+      expect(subject.call('https://real.domain/statuses/456', status_body, :ostatus)).to be_nil
+    end
+  end
 end