about summary refs log tree commit diff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/controllers/activitypub/base_controller.rb1
-rw-r--r--app/controllers/api/base_controller.rb2
-rw-r--r--app/javascript/mastodon/features/compose/components/upload.js9
-rw-r--r--app/javascript/mastodon/locales/ca.json24
-rw-r--r--app/javascript/mastodon/locales/fa.json46
-rw-r--r--app/javascript/mastodon/locales/ja.json22
-rw-r--r--app/javascript/mastodon/locales/ru.json32
-rw-r--r--app/javascript/mastodon/locales/sk.json8
-rw-r--r--app/javascript/mastodon/locales/uk.json10
-rw-r--r--app/javascript/mastodon/locales/vi.json20
-rw-r--r--app/javascript/styles/mastodon/admin.scss2
-rw-r--r--app/javascript/styles/mastodon/components.scss113
-rw-r--r--app/views/accounts/_moved.html.haml4
-rw-r--r--app/views/admin/account_actions/new.html.haml4
-rw-r--r--app/views/admin/account_warnings/_account_warning.html.haml2
-rw-r--r--app/views/admin/accounts/index.html.haml2
-rw-r--r--app/views/admin/accounts/show.html.haml2
-rw-r--r--app/views/admin/change_emails/show.html.haml2
-rw-r--r--app/views/admin/disputes/appeals/_appeal.html.haml2
-rw-r--r--app/views/admin/relationships/index.html.haml2
-rw-r--r--app/views/admin/statuses/index.html.haml2
-rw-r--r--app/views/admin_mailer/new_report.text.erb2
-rw-r--r--app/views/auth/registrations/_status.html.haml2
-rw-r--r--app/views/authorize_interactions/show.html.haml2
-rw-r--r--app/views/authorize_interactions/success.html.haml2
-rw-r--r--app/views/notification_mailer/_status.html.haml2
-rw-r--r--app/views/notification_mailer/digest.text.erb2
-rw-r--r--app/views/notification_mailer/favourite.html.haml2
-rw-r--r--app/views/notification_mailer/favourite.text.erb2
-rw-r--r--app/views/notification_mailer/follow.html.haml2
-rw-r--r--app/views/notification_mailer/follow.text.erb2
-rw-r--r--app/views/notification_mailer/follow_request.html.haml2
-rw-r--r--app/views/notification_mailer/follow_request.text.erb2
-rw-r--r--app/views/notification_mailer/mention.html.haml2
-rw-r--r--app/views/notification_mailer/mention.text.erb2
-rw-r--r--app/views/notification_mailer/reblog.html.haml2
-rw-r--r--app/views/notification_mailer/reblog.text.erb2
-rw-r--r--app/views/settings/aliases/index.html.haml2
-rw-r--r--app/views/settings/migrations/show.html.haml4
-rw-r--r--app/workers/scheduler/user_cleanup_scheduler.rb2
40 files changed, 148 insertions, 203 deletions
diff --git a/app/controllers/activitypub/base_controller.rb b/app/controllers/activitypub/base_controller.rb
index 4cbc3ab8f..196d85a32 100644
--- a/app/controllers/activitypub/base_controller.rb
+++ b/app/controllers/activitypub/base_controller.rb
@@ -2,6 +2,7 @@
 
 class ActivityPub::BaseController < Api::BaseController
   skip_before_action :require_authenticated_user!
+  skip_around_action :set_locale
 
   private
 
diff --git a/app/controllers/api/base_controller.rb b/app/controllers/api/base_controller.rb
index 72c30dec7..d96285b44 100644
--- a/app/controllers/api/base_controller.rb
+++ b/app/controllers/api/base_controller.rb
@@ -15,8 +15,6 @@ class Api::BaseController < ApplicationController
 
   protect_from_forgery with: :null_session
 
-  skip_around_action :set_locale
-
   rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e|
     render json: { error: e.to_s }, status: 422
   end
diff --git a/app/javascript/mastodon/features/compose/components/upload.js b/app/javascript/mastodon/features/compose/components/upload.js
index 1289d6b94..706824dc7 100644
--- a/app/javascript/mastodon/features/compose/components/upload.js
+++ b/app/javascript/mastodon/features/compose/components/upload.js
@@ -5,7 +5,6 @@ import Motion from '../../ui/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { FormattedMessage } from 'react-intl';
-import classNames from 'classnames';
 import Icon from 'mastodon/components/icon';
 
 export default class Upload extends ImmutablePureComponent {
@@ -43,10 +42,16 @@ export default class Upload extends ImmutablePureComponent {
         <Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}>
           {({ scale }) => (
             <div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}>
-              <div className={classNames('compose-form__upload__actions', { active: true })}>
+              <div className='compose-form__upload__actions'>
                 <button className='icon-button' onClick={this.handleUndoClick}><Icon id='times' /> <FormattedMessage id='upload_form.undo' defaultMessage='Delete' /></button>
                 {!isEditingStatus && (<button className='icon-button' onClick={this.handleFocalPointClick}><Icon id='pencil' /> <FormattedMessage id='upload_form.edit' defaultMessage='Edit' /></button>)}
               </div>
+
+              {(media.get('description') || '').length === 0 && (
+                <div className='compose-form__upload__warning'>
+                  <button className='icon-button' onClick={this.handleFocalPointClick}><Icon id='info-circle' /> <FormattedMessage id='upload_form.description_missing' defaultMessage='No description added' /></button>
+                </div>
+              )}
             </div>
           )}
         </Motion>
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 287fd0771..055732cfd 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -328,7 +328,7 @@
   "notifications.column_settings.filter_bar.category": "Barra ràpida de filtres",
   "notifications.column_settings.filter_bar.show_bar": "Mostra la barra de filtres",
   "notifications.column_settings.follow": "Nous seguidors:",
-  "notifications.column_settings.follow_request": "Nova sol·licitud de seguiment:",
+  "notifications.column_settings.follow_request": "Noves sol·licituts de seguiment:",
   "notifications.column_settings.mention": "Mencions:",
   "notifications.column_settings.poll": "Resultats de l’enquesta:",
   "notifications.column_settings.push": "Notificacions push",
@@ -353,7 +353,7 @@
   "notifications.permission_denied_alert": "No es poden activar les notificacions del escriptori perquè el permís del navegador ha estat denegat abans",
   "notifications.permission_required": "Les notificacions d'escriptori no estan disponibles perquè el permís requerit no ha estat concedit.",
   "notifications_permission_banner.enable": "Activar les notificacions d’escriptori",
-  "notifications_permission_banner.how_to_control": "Per a rebre notificacions quan Mastodon no està obert cal activar les notificacions d’escriptori. Pots controlar amb precisió quins tipus d’interaccions generen notificacions d’escriptori després d’activar el botó {icon} de dalt.",
+  "notifications_permission_banner.how_to_control": "Per a rebre notificacions quan Mastodon no és obert cal activar les notificacions d’escriptori. Pots controlar amb precisió quins tipus d’interaccions generen notificacions d’escriptori després d’activar el botó {icon} de dalt.",
   "notifications_permission_banner.title": "Mai et perdis res",
   "picture_in_picture.restore": "Retorna’l",
   "poll.closed": "Finalitzada",
@@ -376,7 +376,7 @@
   "privacy.unlisted.short": "No llistat",
   "refresh": "Actualitza",
   "regeneration_indicator.label": "Carregant…",
-  "regeneration_indicator.sublabel": "S'està preparant la línia de temps Inici!",
+  "regeneration_indicator.sublabel": "S'està preparant la teva línia de temps Inici!",
   "relative_time.days": "fa {number} dies",
   "relative_time.full.days": "fa {number, plural, one {# dia} other {# dies}}",
   "relative_time.full.hours": "fa {number, plural, one {# hora} other {# hores}}",
@@ -394,7 +394,7 @@
   "report.categories.other": "Altres",
   "report.categories.spam": "Contingut brossa",
   "report.categories.violation": "El contingut viola una o més regles del servidor",
-  "report.category.subtitle": "Tria la millor combinació",
+  "report.category.subtitle": "Tria la millor coincidència",
   "report.category.title": "Digue'ns què està passant amb aquest {type}",
   "report.category.title_account": "perfil",
   "report.category.title_status": "publicació",
@@ -410,7 +410,7 @@
   "report.reasons.dislike_description": "Això no és quelcom que vulguis veure",
   "report.reasons.other": "Això és una altre cosa",
   "report.reasons.other_description": "El problema no encaixa en altres categories",
-  "report.reasons.spam": "Això és brossa",
+  "report.reasons.spam": "Això és contingut brossa",
   "report.reasons.spam_description": "Enllaços maliciosos, compromís falç o respostes repetitives",
   "report.reasons.violation": "Viola les regles del servidor",
   "report.reasons.violation_description": "Ets conscient que trenca regles especifiques",
@@ -447,7 +447,7 @@
   "status.cancel_reblog_private": "Desfer l'impuls",
   "status.cannot_reblog": "Aquesta publicació no pot ser impulsada",
   "status.copy": "Copia l'enllaç a l'estat",
-  "status.delete": "Esborrar",
+  "status.delete": "Esborra",
   "status.detailed_status": "Visualització detallada de la conversa",
   "status.direct": "Missatge directe @{name}",
   "status.edit": "Edita",
@@ -465,17 +465,17 @@
   "status.mute": "Silenciar @{name}",
   "status.mute_conversation": "Silenciar conversació",
   "status.open": "Ampliar aquest estat",
-  "status.pin": "Fixat en el perfil",
+  "status.pin": "Fixa en el perfil",
   "status.pinned": "Publicació fixada",
   "status.read_more": "Llegir més",
   "status.reblog": "Impuls",
-  "status.reblog_private": "Impulsar a l'audiència original",
+  "status.reblog_private": "Impulsar amb la visibilitat original",
   "status.reblogged_by": "{name} ha impulsat",
   "status.reblogs.empty": "Encara ningú no ha impulsat aquesta publicació. Quan algú ho faci, apareixeran aquí.",
   "status.redraft": "Esborrar i reescriure",
   "status.remove_bookmark": "Suprimeix el marcador",
   "status.reply": "Respondre",
-  "status.replyAll": "Respondre al tema",
+  "status.replyAll": "Respondre al fil",
   "status.report": "Informar sobre @{name}",
   "status.sensitive_warning": "Contingut sensible",
   "status.share": "Compartir",
@@ -510,11 +510,11 @@
   "units.short.million": "{count}M",
   "units.short.thousand": "{count}K",
   "upload_area.title": "Arrossega i deixa anar per a carregar",
-  "upload_button.label": "Afegir multimèdia (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_button.label": "Afegir mèdia, un vídeo o un fitxer d'audio",
   "upload_error.limit": "S'ha superat el límit de càrrega d'arxius.",
   "upload_error.poll": "No es permet l'enviament de fitxers en les enquestes.",
   "upload_form.audio_description": "Descriviu per a les persones amb pèrdua auditiva",
-  "upload_form.description": "Descriure els problemes visuals",
+  "upload_form.description": "Descriure per els que tenen problemes visuals",
   "upload_form.edit": "Edita",
   "upload_form.thumbnail": "Canvia la miniatura",
   "upload_form.undo": "Esborra",
@@ -523,7 +523,7 @@
   "upload_modal.apply": "Aplica",
   "upload_modal.applying": "Aplicant…",
   "upload_modal.choose_image": "Tria imatge",
-  "upload_modal.description_placeholder": "Jove xef, porti whisky amb quinze glaçons d’hidrogen, coi!",
+  "upload_modal.description_placeholder": "Una ràpida guineu marró salta sobre el gos mandrós",
   "upload_modal.detect_text": "Detecta el text de l'imatge",
   "upload_modal.edit_media": "Editar multimèdia",
   "upload_modal.hint": "Fes clic o arrossega el cercle en la previsualització per escollir el punt focal que sempre serà visible de totes les miniatures.",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 659336393..820b90640 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -18,7 +18,7 @@
   "account.followers": "پی‌گیرندگان",
   "account.followers.empty": "هنوز کسی این کاربر را پی‌گیری نمی‌کند.",
   "account.followers_counter": "{count, plural, one {{counter} پی‌گیرنده} other {{counter} پی‌گیرنده}}",
-  "account.following": "Following",
+  "account.following": "پی می‌گیرید",
   "account.following_counter": "{count, plural, one {{counter} پی‌گرفته} other {{counter} پی‌گرفته}}",
   "account.follows.empty": "این کاربر هنوز پی‌گیر کسی نیست.",
   "account.follows_you": "پی می‌گیردتان",
@@ -41,12 +41,12 @@
   "account.statuses_counter": "{count, plural, one {{counter} فرسته} other {{counter} فرسته}}",
   "account.unblock": "رفع مسدودیت @{name}",
   "account.unblock_domain": "رفع مسدودیت دامنهٔ {domain}",
-  "account.unblock_short": "Unblock",
+  "account.unblock_short": "رفع مسدودیت",
   "account.unendorse": "معرّفی نکردن در نمایه",
   "account.unfollow": "ناپی‌گیری",
   "account.unmute": "ناخموشی @{name}",
   "account.unmute_notifications": "ناخموشی آگاهی‌ها از @{name}",
-  "account.unmute_short": "Unmute",
+  "account.unmute_short": "ناخموشی",
   "account_note.placeholder": "برای افزودن یادداشت کلیک کنید",
   "admin.dashboard.daily_retention": "User retention rate by day after sign-up",
   "admin.dashboard.monthly_retention": "User retention rate by month after sign-up",
@@ -106,7 +106,7 @@
   "compose_form.poll.switch_to_single": "تبدیل به نظرسنجی تک‌گزینه‌ای",
   "compose_form.publish": "بوق",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.save_changes": "Save changes",
+  "compose_form.save_changes": "ذخیرهٔ تغییرات",
   "compose_form.sensitive.hide": "{count, plural, one {علامت‌گذاری رسانه به عنوان حساس} other {علامت‌گذاری رسانه‌ها به عنوان حساس}}",
   "compose_form.sensitive.marked": "{count, plural, one {رسانه به عنوان حساس علامت‌گذاری شد} other {رسانه‌ها به عنوان حساس علامت‌گذاری شدند}}",
   "compose_form.sensitive.unmarked": "{count, plural, one {رسانه به عنوان حساس علامت‌گذاری نشد} other {رسانه‌ها به عنوان حساس علامت‌گذاری نشدند}}",
@@ -187,12 +187,12 @@
   "error.unexpected_crash.next_steps_addons": "لطفاً از کارشان انداخته و صفحه را نوسازی کنید. اگر کمکی نکرد، شاید همچنان بتوانید با مرورگری دیگر یا با کاره‌ای بومی از ماستودون استفاده کنید.",
   "errors.unexpected_crash.copy_stacktrace": "رونوشت از جزئیات اشکال",
   "errors.unexpected_crash.report_issue": "گزارش مشکل",
-  "explore.search_results": "Search results",
-  "explore.suggested_follows": "For you",
-  "explore.title": "Explore",
-  "explore.trending_links": "News",
-  "explore.trending_statuses": "Posts",
-  "explore.trending_tags": "Hashtags",
+  "explore.search_results": "نتایج جست‌وجو",
+  "explore.suggested_follows": "برای شما",
+  "explore.title": "کاوش",
+  "explore.trending_links": "اخبار",
+  "explore.trending_statuses": "فرسته‌ها",
+  "explore.trending_tags": "هشتگ‌ها",
   "follow_recommendations.done": "انجام شد",
   "follow_recommendations.heading": "افرادی را که می‌خواهید فرسته‌هایشان را ببینید پی‌گیری کنید! این‌ها تعدادی پیشنهاد هستند.",
   "follow_recommendations.lead": "فرسته‌های افرادی که دنبال می‌کنید به ترتیب زمانی در خوراک خانه‌تان نشان داده خواهد شد. از اشتباه کردن نترسید. می‌توانید به همین سادگی در هر زمانی از دنبال کردن افراد دست بکشید!",
@@ -294,7 +294,7 @@
   "navigation_bar.discover": "گشت و گذار",
   "navigation_bar.domain_blocks": "دامنه‌های مسدود شده",
   "navigation_bar.edit_profile": "ویرایش نمایه",
-  "navigation_bar.explore": "Explore",
+  "navigation_bar.explore": "کاوش",
   "navigation_bar.favourites": "پسندیده‌ها",
   "navigation_bar.filters": "واژه‌های خموش",
   "navigation_bar.follow_requests": "درخواست‌های پی‌گیری",
@@ -309,7 +309,7 @@
   "navigation_bar.preferences": "ترجیحات",
   "navigation_bar.public_timeline": "خط زمانی همگانی",
   "navigation_bar.security": "امنیت",
-  "notification.admin.sign_up": "{name} signed up",
+  "notification.admin.sign_up": "{name} ثبت نام کرد",
   "notification.favourite": "‫{name}‬ فرسته‌تان را پسندید",
   "notification.follow": "‫{name}‬ پی‌گیرتان شد",
   "notification.follow_request": "{name} می‌خواهد پی‌گیر شما باشد",
@@ -318,10 +318,10 @@
   "notification.poll": "نظرسنجی‌ای که در آن رأی دادید به پایان رسیده است",
   "notification.reblog": "‫{name}‬ فرسته‌تان را تقویت کرد",
   "notification.status": "{name} چیزی فرستاد",
-  "notification.update": "{name} edited a post",
+  "notification.update": "{name} فرسته‌ای را ویرایش کرد",
   "notifications.clear": "پاک‌سازی آگاهی‌ها",
   "notifications.clear_confirmation": "مطمئنید می‌خواهید همهٔ آگاهی‌هایتان را برای همیشه پاک کنید؟",
-  "notifications.column_settings.admin.sign_up": "New sign-ups:",
+  "notifications.column_settings.admin.sign_up": "ثبت نام‌های جدید:",
   "notifications.column_settings.alert": "آگاهی‌های میزکار",
   "notifications.column_settings.favourite": "پسندیده‌ها:",
   "notifications.column_settings.filter_bar.advanced": "نمایش همۀ دسته‌ها",
@@ -338,7 +338,7 @@
   "notifications.column_settings.status": "فرسته‌های جدید:",
   "notifications.column_settings.unread_notifications.category": "آگاهی‌های خوانده نشده",
   "notifications.column_settings.unread_notifications.highlight": "پررنگ کردن آگاهی‌های خوانده نشده",
-  "notifications.column_settings.update": "Edits:",
+  "notifications.column_settings.update": "ویرایش‌ها:",
   "notifications.filter.all": "همه",
   "notifications.filter.boosts": "تقویت‌ها",
   "notifications.filter.favourites": "پسندها",
@@ -378,20 +378,20 @@
   "regeneration_indicator.label": "در حال بار شدن…",
   "regeneration_indicator.sublabel": "خوراک خانگیان دارد آماده می‌شود!",
   "relative_time.days": "{number} روز",
-  "relative_time.full.days": "{number, plural, one {# day} other {# days}} ago",
-  "relative_time.full.hours": "{number, plural, one {# hour} other {# hours}} ago",
-  "relative_time.full.just_now": "just now",
-  "relative_time.full.minutes": "{number, plural, one {# minute} other {# minutes}} ago",
-  "relative_time.full.seconds": "{number, plural, one {# second} other {# seconds}} ago",
+  "relative_time.full.days": "{number, plural, one {# روز} other {# روز}} پیش",
+  "relative_time.full.hours": "{number, plural, one {# ساعت} other {# ساعت}} پیش",
+  "relative_time.full.just_now": "همين آلان",
+  "relative_time.full.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}} پیش",
+  "relative_time.full.seconds": "{number, plural, one {# ثانیه} other {# ثانیه}} پیش",
   "relative_time.hours": "{number} ساعت",
   "relative_time.just_now": "حالا",
   "relative_time.minutes": "{number} دقیقه",
   "relative_time.seconds": "{number} ثانیه",
   "relative_time.today": "امروز",
   "reply_indicator.cancel": "لغو",
-  "report.block": "Block",
-  "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
-  "report.categories.other": "Other",
+  "report.block": "مسدود کردن",
+  "report.block_explanation": "شما فرسته‌هایشان را نخواهید دید. آن‌ها نمی‌توانند فرسته‌هایتان را ببینند یا شما را پی‌بگیرند. آنها می‌توانند بگویند که مسدود شده‌اند.",
+  "report.categories.other": "غیره",
   "report.categories.spam": "Spam",
   "report.categories.violation": "Content violates one or more server rules",
   "report.category.subtitle": "Choose the best match",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index c0f902bab..4a388f92b 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -18,7 +18,7 @@
   "account.followers": "フォロワー",
   "account.followers.empty": "まだ誰もフォローしていません。",
   "account.followers_counter": "{counter} フォロワー",
-  "account.following": "Following",
+  "account.following": "フォロー中",
   "account.following_counter": "{counter} フォロー",
   "account.follows.empty": "まだ誰もフォローしていません。",
   "account.follows_you": "フォローされています",
@@ -41,12 +41,12 @@
   "account.statuses_counter": "{counter} 投稿",
   "account.unblock": "@{name}さんのブロックを解除",
   "account.unblock_domain": "{domain}のブロックを解除",
-  "account.unblock_short": "Unblock",
+  "account.unblock_short": "ブロック解除",
   "account.unendorse": "プロフィールから外す",
   "account.unfollow": "フォロー解除",
   "account.unmute": "@{name}さんのミュートを解除",
   "account.unmute_notifications": "@{name}さんからの通知を受け取るようにする",
-  "account.unmute_short": "Unmute",
+  "account.unmute_short": "ミュート解除",
   "account_note.placeholder": "クリックしてメモを追加",
   "admin.dashboard.daily_retention": "サインアップ後の日ごとのユーザー継続率",
   "admin.dashboard.monthly_retention": "サインアップ後の月ごとのユーザー継続率",
@@ -192,7 +192,7 @@
   "errors.unexpected_crash.copy_stacktrace": "スタックトレースをクリップボードにコピー",
   "errors.unexpected_crash.report_issue": "問題を報告",
   "explore.search_results": "検索結果",
-  "explore.suggested_follows": "For you",
+  "explore.suggested_follows": "あなたに",
   "explore.title": "エクスプローラー",
   "explore.trending_links": "ニュース",
   "explore.trending_statuses": "投稿",
@@ -326,7 +326,7 @@
   "notification.update": "{name} が投稿を編集しました",
   "notifications.clear": "通知を消去",
   "notifications.clear_confirmation": "本当に通知を消去しますか?",
-  "notifications.column_settings.admin.sign_up": "New sign-ups:",
+  "notifications.column_settings.admin.sign_up": "新規登録:",
   "notifications.column_settings.alert": "デスクトップ通知",
   "notifications.column_settings.favourite": "お気に入り:",
   "notifications.column_settings.filter_bar.advanced": "すべてのカテゴリを表示",
@@ -395,7 +395,7 @@
   "relative_time.today": "今日",
   "reply_indicator.cancel": "キャンセル",
   "report.block": "ブロック",
-  "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+  "report.block_explanation": "相手の投稿が表示されなくなります。相手はあなたの投稿を見ることやフォローすることができません。相手はブロックされていることがわかります。",
   "report.categories.other": "その他",
   "report.categories.spam": "スパム",
   "report.categories.violation": "サーバーのルールに違反",
@@ -404,11 +404,11 @@
   "report.category.title_account": "プロフィール",
   "report.category.title_status": "投稿",
   "report.close": "完了",
-  "report.comment.title": "Is there anything else you think we should know?",
+  "report.comment.title": "その他に私たちに伝えておくべき事はありますか?",
   "report.forward": "{target} に転送する",
   "report.forward_hint": "このアカウントは別のサーバーに所属しています。通報内容を匿名で転送しますか?",
   "report.mute": "ミュート",
-  "report.mute_explanation": "You will not see their posts. They can still follow you and see your posts and will not know that they are muted.",
+  "report.mute_explanation": "相手の投稿は表示されなくなります。相手は引き続きあなたをフォローして、あなたの投稿を表示することができますが、ミュートされていることはわかりません。",
   "report.next": "次へ",
   "report.placeholder": "追加コメント",
   "report.reasons.dislike": "興味がありません",
@@ -426,9 +426,9 @@
   "report.submit": "通報する",
   "report.target": "{target}さんを通報する",
   "report.thanks.take_action": "次のような方法はいかがでしょうか?",
-  "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+  "report.thanks.take_action_actionable": "私達が確認している間でも、あなたは @{name} さんに対して対応することが出来ます:",
   "report.thanks.title": "見えないようにしたいですか?",
-  "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
+  "report.thanks.title_actionable": "ご報告ありがとうございます、追って確認します。",
   "report.unfollow": "@{name}のフォローを解除",
   "report.unfollow_explanation": "このアカウントをフォローしています。ホームフィードに彼らの投稿を表示しないようにするには、彼らのフォローを外してください。",
   "search.placeholder": "検索",
@@ -441,7 +441,7 @@
   "search_results.accounts": "人々",
   "search_results.all": "すべて",
   "search_results.hashtags": "ハッシュタグ",
-  "search_results.nothing_found": "Could not find anything for these search terms",
+  "search_results.nothing_found": "この検索条件では何も見つかりませんでした",
   "search_results.statuses": "投稿",
   "search_results.statuses_fts_disabled": "このサーバーでは投稿本文の検索は利用できません。",
   "search_results.total": "{count, number}件の結果",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index 1bbc2918c..79fac6eb5 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -18,7 +18,7 @@
   "account.followers": "Подписчики",
   "account.followers.empty": "На этого пользователя пока никто не подписан.",
   "account.followers_counter": "{count, plural, one {{counter} подписчик} many {{counter} подписчиков} other {{counter} подписчика}}",
-  "account.following": "Following",
+  "account.following": "Подписки",
   "account.following_counter": "{count, plural, one {{counter} подписка} many {{counter} подписок} other {{counter} подписки}}",
   "account.follows.empty": "Этот пользователь пока ни на кого не подписался.",
   "account.follows_you": "Подписан(а) на вас",
@@ -95,7 +95,7 @@
   "compose_form.direct_message_warning": "Адресованные посты отправляются и видны только упомянутым в них пользователям.",
   "compose_form.direct_message_warning_learn_more": "Подробнее",
   "compose_form.hashtag_warning": "Так как этот пост не публичный, он не отобразится в поиске по хэштегам.",
-  "compose_form.lock_disclaimer": "Ваша учётная запись не {locked}. Любой пользователь сможет подписаться на вас и просматривать посты для подписчиков.",
+  "compose_form.lock_disclaimer": "Ваша учётная запись {locked}. Любой пользователь сможет подписаться на вас и просматривать посты для подписчиков.",
   "compose_form.lock_disclaimer.lock": "не закрыта",
   "compose_form.placeholder": "О чём думаете?",
   "compose_form.poll.add_option": "Добавить вариант",
@@ -390,42 +390,42 @@
   "relative_time.today": "сегодня",
   "reply_indicator.cancel": "Отмена",
   "report.block": "Заблокировать",
-  "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
+  "report.block_explanation": "В перестаните видеть посты этого пользователя, а он(а) больше не сможет подписаться на вас и читать ваши посты. Он(а) сможет понять что вы заблокировали его/её.",
   "report.categories.other": "Другое",
   "report.categories.spam": "Спам",
   "report.categories.violation": "Содержимое нарушает одно или несколько правил узла",
   "report.category.subtitle": "Выберите наиболее подходящее",
-  "report.category.title": "Расскажите нам, что происходит с {type}",
-  "report.category.title_account": "профиль",
-  "report.category.title_status": "пост",
+  "report.category.title": "Расскажите нам, что не так с {type}",
+  "report.category.title_account": "этим профилем",
+  "report.category.title_status": "этим постом",
   "report.close": "Готово",
-  "report.comment.title": "Есть что-нибудь еще, что мы должны знать?",
-  "report.forward": "Переслать в {target}",
+  "report.comment.title": "Есть ли что-нибудь ещё, что нам стоит знать?",
+  "report.forward": "Переслать на {target}",
   "report.forward_hint": "Эта учётная запись расположена на другом узле. Отправить туда анонимную копию вашей жалобы?",
-  "report.mute": "Mute",
+  "report.mute": "Игнорировать",
   "report.mute_explanation": "Вы не будете видеть их посты. Они по-прежнему могут подписываться на вас и видеть ваши посты, но не будут знать, что они в списке игнорируемых.",
   "report.next": "Далее",
-  "report.placeholder": "Комментарий",
+  "report.placeholder": "Дополнительные комментарии",
   "report.reasons.dislike": "Мне не нравится",
   "report.reasons.dislike_description": "Не хотел(а) бы видеть такой контент",
   "report.reasons.other": "Другое",
-  "report.reasons.other_description": "Проблема не подпадает под другие категории",
+  "report.reasons.other_description": "Проблема не попадает ни под одну из категорий",
   "report.reasons.spam": "Это спам",
-  "report.reasons.spam_description": "Вредоносные ссылки, поддельные действия или повторяющиеся ответы",
+  "report.reasons.spam_description": "Вредоносные ссылки, фальшивое взаимодействие или повторяющиеся ответы",
   "report.reasons.violation": "Нарушаются правила сервера",
   "report.reasons.violation_description": "Вы знаете, что подобное нарушает определенные правила",
   "report.rules.subtitle": "Выберите все подходящие варианты",
   "report.rules.title": "Какие правила нарушены?",
   "report.statuses.subtitle": "Выберите все подходящие варианты",
-  "report.statuses.title": "Есть ли сообщения, подтверждающие основания этой жалобы?",
+  "report.statuses.title": "Выберите посты, которые относятся к вашей жалобе.",
   "report.submit": "Отправить",
   "report.target": "Жалоба на {target}",
-  "report.thanks.take_action": "Here are your options for controlling what you see on Mastodon:",
-  "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
+  "report.thanks.take_action": "Вот несколько опций управления тем, что вы видите в Mastodon:",
+  "report.thanks.take_action_actionable": "Пока мы рассматриваем его, вот действия, которые вы можете предпринять лично против @{name}:",
   "report.thanks.title": "Не хотите видеть это?",
   "report.thanks.title_actionable": "Спасибо за обращение, мы его рассмотрим.",
   "report.unfollow": "Отписаться от @{name}",
-  "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
+  "report.unfollow_explanation": "Вы подписаны на этого пользователя. Чтобы не видеть его/её посты в своей домашней ленте, отпишитесь от него/неё.",
   "search.placeholder": "Поиск",
   "search_popout.search_format": "Продвинутый формат поиска",
   "search_popout.tips.full_text": "Поиск по простому тексту отобразит посты, которые вы написали, добавили в избранное, продвинули или в которых были упомянуты, а также подходящие имена пользователей и хэштеги.",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 60b513aa1..860e65413 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -389,7 +389,7 @@
   "relative_time.seconds": "{number}sek",
   "relative_time.today": "dnes",
   "reply_indicator.cancel": "Zrušiť",
-  "report.block": "Block",
+  "report.block": "Blokuj",
   "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
   "report.categories.other": "Other",
   "report.categories.spam": "Spam",
@@ -424,7 +424,7 @@
   "report.thanks.take_action_actionable": "While we review this, you can take action against @{name}:",
   "report.thanks.title": "Nechceš to vidieť?",
   "report.thanks.title_actionable": "Thanks for reporting, we'll look into this.",
-  "report.unfollow": "Unfollow @{name}",
+  "report.unfollow": "Nesleduj @{name}",
   "report.unfollow_explanation": "You are following this account. To not see their posts in your home feed anymore, unfollow them.",
   "search.placeholder": "Hľadaj",
   "search_popout.search_format": "Pokročilé vyhľadávanie",
@@ -434,7 +434,7 @@
   "search_popout.tips.text": "Vráti jednoduchý textový výpis zhodujúcich sa mien, prezývok a haštagov",
   "search_popout.tips.user": "užívateľ",
   "search_results.accounts": "Ľudia",
-  "search_results.all": "All",
+  "search_results.all": "Všetky",
   "search_results.hashtags": "Haštagy",
   "search_results.nothing_found": "Could not find anything for these search terms",
   "search_results.statuses": "Príspevky",
@@ -451,7 +451,7 @@
   "status.detailed_status": "Podrobný náhľad celej konverzácie",
   "status.direct": "Priama správa pre @{name}",
   "status.edit": "Uprav",
-  "status.edited": "Edited {date}",
+  "status.edited": "Upravené {date}",
   "status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
   "status.embed": "Vložiť",
   "status.favourite": "Páči sa mi",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 06bb94307..876f8aa8a 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -41,7 +41,7 @@
   "account.statuses_counter": "{count, plural, one {{counter} Пост} few {{counter} Пости} many {{counter} Постів} other {{counter} Пости}}",
   "account.unblock": "Розблокувати @{name}",
   "account.unblock_domain": "Розблокувати {domain}",
-  "account.unblock_short": "Unblock",
+  "account.unblock_short": "Розблокувати",
   "account.unendorse": "Не публікувати у профілі",
   "account.unfollow": "Відписатися",
   "account.unmute": "Зняти глушення з @{name}",
@@ -187,7 +187,7 @@
   "error.unexpected_crash.next_steps_addons": "Спробуйте їх вимкнути та оновити сторінку. Якщо це не допомагає, ви можете використовувати Mastodon через інший браузер або окремий застосунок.",
   "errors.unexpected_crash.copy_stacktrace": "Скопіювати трасування стека у буфер обміну",
   "errors.unexpected_crash.report_issue": "Повідомити про проблему",
-  "explore.search_results": "Search results",
+  "explore.search_results": "Результати пошуку",
   "explore.suggested_follows": "Для вас",
   "explore.title": "Огляд",
   "explore.trending_links": "Новини",
@@ -309,7 +309,7 @@
   "navigation_bar.preferences": "Налаштування",
   "navigation_bar.public_timeline": "Глобальна стрічка",
   "navigation_bar.security": "Безпека",
-  "notification.admin.sign_up": "{name} signed up",
+  "notification.admin.sign_up": "{name} приєднується",
   "notification.favourite": "{name} вподобав(-ла) ваш допис",
   "notification.follow": "{name} підписався(-лась) на вас",
   "notification.follow_request": "{name} відправив(-ла) запит на підписку",
@@ -321,7 +321,7 @@
   "notification.update": "{name} змінює допис",
   "notifications.clear": "Очистити сповіщення",
   "notifications.clear_confirmation": "Ви впевнені, що хочете назавжди видалити всі сповіщеня?",
-  "notifications.column_settings.admin.sign_up": "New sign-ups:",
+  "notifications.column_settings.admin.sign_up": "Нові реєстрації:",
   "notifications.column_settings.alert": "Сповіщення на комп'ютері",
   "notifications.column_settings.favourite": "Вподобане:",
   "notifications.column_settings.filter_bar.advanced": "Показати всі категорії",
@@ -389,7 +389,7 @@
   "relative_time.seconds": "{number}с",
   "relative_time.today": "сьогодні",
   "reply_indicator.cancel": "Відмінити",
-  "report.block": "Block",
+  "report.block": "Заблокувати",
   "report.block_explanation": "You will not see their posts. They will not be able to see your posts or follow you. They will be able to tell that they are blocked.",
   "report.categories.other": "Інше",
   "report.categories.spam": "Спам",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index b6db3c14b..d47033881 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -8,7 +8,7 @@
   "account.blocked": "Đã chặn",
   "account.browse_more_on_origin_server": "Truy cập trang của người này",
   "account.cancel_follow_request": "Hủy yêu cầu theo dõi",
-  "account.direct": "Nhắn tin @{name}",
+  "account.direct": "Nhắn riêng @{name}",
   "account.disable_notifications": "Không thông báo khi @{name} đăng tút",
   "account.domain_blocked": "Người đã chặn",
   "account.edit_profile": "Chỉnh sửa trang cá nhân",
@@ -49,9 +49,9 @@
   "account.unmute_short": "Bỏ ẩn",
   "account_note.placeholder": "Nhấn để thêm",
   "admin.dashboard.daily_retention": "Tỉ lệ người dùng sau đăng ký ở lại theo ngày",
-  "admin.dashboard.monthly_retention": "Tỉ lệ người dùng sau đăng ký ở lại theo tháng",
+  "admin.dashboard.monthly_retention": "Tỉ lệ người dùng ở lại sau khi đăng ký",
   "admin.dashboard.retention.average": "Trung bình",
-  "admin.dashboard.retention.cohort": "Đăng ký tháng",
+  "admin.dashboard.retention.cohort": "Tháng đăng ký",
   "admin.dashboard.retention.cohort_size": "Người dùng mới",
   "alert.rate_limited.message": "Vui lòng thử lại sau {retry_time, time, medium}.",
   "alert.rate_limited.title": "Vượt giới hạn",
@@ -179,7 +179,7 @@
   "empty_column.list": "Chưa có tút. Khi những người trong danh sách này đăng tút mới, chúng sẽ xuất hiện ở đây.",
   "empty_column.lists": "Bạn chưa tạo danh sách nào.",
   "empty_column.mutes": "Bạn chưa ẩn bất kỳ ai.",
-  "empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn tin cho một ai đó.",
+  "empty_column.notifications": "Bạn chưa có thông báo nào. Hãy thử theo dõi hoặc nhắn riêng cho một ai đó.",
   "empty_column.public": "Trống trơn! Bạn hãy viết gì đó hoặc bắt đầu theo dõi những người khác",
   "error.unexpected_crash.explanation": "Trang này có thể không hiển thị chính xác do lỗi lập trình Mastodon hoặc vấn đề tương thích trình duyệt.",
   "error.unexpected_crash.explanation_addons": "Trang này không thể hiển thị do xung khắc với add-on của trình duyệt hoặc công cụ tự động dịch ngôn ngữ.",
@@ -188,7 +188,7 @@
   "errors.unexpected_crash.copy_stacktrace": "Sao chép stacktrace vào clipboard",
   "errors.unexpected_crash.report_issue": "Báo cáo lỗi",
   "explore.search_results": "Kết quả tìm kiếm",
-  "explore.suggested_follows": "Đề xuất cho bạn",
+  "explore.suggested_follows": "Dành cho bạn",
   "explore.title": "Khám phá",
   "explore.trending_links": "Tin tức",
   "explore.trending_statuses": "Tút",
@@ -294,7 +294,7 @@
   "navigation_bar.discover": "Khám phá",
   "navigation_bar.domain_blocks": "Máy chủ đã ẩn",
   "navigation_bar.edit_profile": "Trang cá nhân",
-  "navigation_bar.explore": "Khám phá",
+  "navigation_bar.explore": "Xu hướng",
   "navigation_bar.favourites": "Thích",
   "navigation_bar.filters": "Bộ lọc từ ngữ",
   "navigation_bar.follow_requests": "Yêu cầu theo dõi",
@@ -309,7 +309,7 @@
   "navigation_bar.preferences": "Cài đặt",
   "navigation_bar.public_timeline": "Thế giới",
   "navigation_bar.security": "Bảo mật",
-  "notification.admin.sign_up": "{name} vừa đăng ký",
+  "notification.admin.sign_up": "{name} đăng ký máy chủ của bạn",
   "notification.favourite": "{name} thích tút của bạn",
   "notification.follow": "{name} theo dõi bạn",
   "notification.follow_request": "{name} yêu cầu theo dõi bạn",
@@ -367,7 +367,7 @@
   "poll_button.remove_poll": "Hủy cuộc bình chọn",
   "privacy.change": "Thay đổi quyền riêng tư",
   "privacy.direct.long": "Chỉ người được nhắc đến mới thấy",
-  "privacy.direct.short": "Tin nhắn",
+  "privacy.direct.short": "Nhắn riêng",
   "privacy.private.long": "Dành riêng cho người theo dõi",
   "privacy.private.short": "Riêng tư",
   "privacy.public.long": "Hiện trên bảng tin máy chủ",
@@ -449,7 +449,7 @@
   "status.copy": "Sao chép URL",
   "status.delete": "Xóa",
   "status.detailed_status": "Xem chi tiết thêm",
-  "status.direct": "Nhắn tin @{name}",
+  "status.direct": "Nhắn riêng @{name}",
   "status.edit": "Sửa",
   "status.edited": "Đã sửa {date}",
   "status.edited_x_times": "Đã sửa {count, plural, other {{count} lần}}",
@@ -483,7 +483,7 @@
   "status.show_less_all": "Thu gọn toàn bộ",
   "status.show_more": "Xem thêm",
   "status.show_more_all": "Hiển thị tất cả",
-  "status.show_thread": "Toàn chủ đề",
+  "status.show_thread": "Xem chuỗi tút này",
   "status.uncached_media_warning": "Uncached",
   "status.unmute_conversation": "Quan tâm",
   "status.unpin": "Bỏ ghim trên trang cá nhân",
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index 40cd899b3..27be22f1b 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -1322,7 +1322,7 @@ a.sparkline {
       width: 50px;
       height: 21px;
       position: absolute;
-      bottom: 8px;
+      bottom: 0;
       right: 15px;
       background: linear-gradient(to left, $ui-base-color, transparent);
       pointer-events: none;
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 295b0ddfb..57b265f95 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -596,30 +596,24 @@
         display: flex;
         align-items: flex-start;
         justify-content: space-between;
-        opacity: 0;
-        transition: opacity .1s ease;
+      }
 
-        .icon-button {
-          flex: 0 1 auto;
-          color: $secondary-text-color;
-          font-size: 14px;
-          font-weight: 500;
-          padding: 10px;
-          font-family: inherit;
-
-          &:hover,
-          &:focus,
-          &:active {
-            color: lighten($secondary-text-color, 7%);
-          }
-        }
+      .icon-button {
+        flex: 0 1 auto;
+        color: $secondary-text-color;
+        font-size: 14px;
+        font-weight: 500;
+        padding: 10px;
+        font-family: inherit;
 
-        &.active {
-          opacity: 1;
+        &:hover,
+        &:focus,
+        &:active {
+          color: lighten($secondary-text-color, 7%);
         }
       }
 
-      &-description {
+      &__warning {
         position: absolute;
         z-index: 2;
         bottom: 0;
@@ -627,34 +621,6 @@
         right: 0;
         box-sizing: border-box;
         background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
-        padding: 10px;
-        opacity: 0;
-        transition: opacity .1s ease;
-
-        textarea {
-          background: transparent;
-          color: $secondary-text-color;
-          border: 0;
-          padding: 0;
-          margin: 0;
-          width: 100%;
-          font-family: inherit;
-          font-size: 14px;
-          font-weight: 500;
-
-          &:focus {
-            color: $white;
-          }
-
-          &::placeholder {
-            opacity: 0.75;
-            color: $secondary-text-color;
-          }
-        }
-
-        &.active {
-          opacity: 1;
-        }
       }
     }
 
@@ -870,7 +836,8 @@
   .status__content__spoiler-link {
     background: $action-button-color;
 
-    &:hover {
+    &:hover,
+    &:focus {
       background: lighten($action-button-color, 7%);
       text-decoration: none;
     }
@@ -982,7 +949,7 @@
   text-transform: uppercase;
   line-height: 20px;
   cursor: pointer;
-  vertical-align: middle;
+  vertical-align: top;
 }
 
 .status__wrapper--filtered {
@@ -1042,42 +1009,6 @@
   .audio-player {
     margin-top: 8px;
   }
-
-  &.light {
-    .status__relative-time,
-    .status__visibility-icon {
-      color: $light-text-color;
-    }
-
-    .status__display-name {
-      color: $inverted-text-color;
-    }
-
-    .display-name {
-      color: $light-text-color;
-
-      strong {
-        color: $inverted-text-color;
-      }
-    }
-
-    .status__content {
-      color: $inverted-text-color;
-
-      a {
-        color: $highlight-text-color;
-      }
-
-      a.status__content__spoiler-link {
-        color: $primary-text-color;
-        background: $ui-primary-color;
-
-        &:hover {
-          background: lighten($ui-primary-color, 8%);
-        }
-      }
-    }
-  }
 }
 
 .status__relative-time,
@@ -1646,7 +1577,8 @@ a.account__display-name {
     background: $ui-base-lighter-color;
     color: $inverted-text-color;
 
-    &:hover {
+    &:hover,
+    &:focus {
       background: lighten($ui-base-lighter-color, 7%);
       text-decoration: none;
     }
@@ -5158,6 +5090,15 @@ a.status-card.compact:hover {
     color: $inverted-text-color;
   }
 
+  .status__content__spoiler-link {
+    color: $primary-text-color;
+    background: $ui-primary-color;
+
+    &:hover {
+      background: lighten($ui-primary-color, 8%);
+    }
+  }
+
   .dialog-option .poll__input {
     border-color: $inverted-text-color;
     color: $ui-secondary-color;
diff --git a/app/views/accounts/_moved.html.haml b/app/views/accounts/_moved.html.haml
index 4f71b062d..2f46e0dd0 100644
--- a/app/views/accounts/_moved.html.haml
+++ b/app/views/accounts/_moved.html.haml
@@ -3,7 +3,7 @@
 .moved-account-widget
   .moved-account-widget__message
     = fa_icon 'suitcase'
-    = t('accounts.moved_html', name: content_tag(:bdi, content_tag(:strong, display_name(account, custom_emojify: true), class: :emojify)), new_profile_link: link_to(content_tag(:strong, safe_join(['@', content_tag(:span, moved_to_account.acct)])), ActivityPub::TagManager.instance.url_for(moved_to_account), class: 'mention'))
+    = t('accounts.moved_html', name: content_tag(:bdi, content_tag(:strong, display_name(account, custom_emojify: true), class: :emojify)), new_profile_link: link_to(content_tag(:strong, safe_join(['@', content_tag(:span, moved_to_account.pretty_acct)])), ActivityPub::TagManager.instance.url_for(moved_to_account), class: 'mention'))
 
   .moved-account-widget__card
     = link_to ActivityPub::TagManager.instance.url_for(moved_to_account), class: 'detailed-status__display-name p-author h-card', target: '_blank', rel: 'me noopener noreferrer' do
@@ -17,4 +17,4 @@
       %span.display-name
         %bdi
           %strong.emojify= display_name(moved_to_account, custom_emojify: true)
-        %span @#{moved_to_account.acct}
+        %span @#{moved_to_account.pretty_acct}
diff --git a/app/views/admin/account_actions/new.html.haml b/app/views/admin/account_actions/new.html.haml
index ca4f9663f..c7bb618df 100644
--- a/app/views/admin/account_actions/new.html.haml
+++ b/app/views/admin/account_actions/new.html.haml
@@ -1,11 +1,11 @@
 - content_for :page_title do
-  = t('admin.account_actions.title', acct: @account.acct)
+  = t('admin.account_actions.title', acct: @account.pretty_acct)
 
 = simple_form_for @account_action, url: admin_account_action_path(@account.id) do |f|
   = f.input :report_id, as: :hidden
 
   .fields-group
-    = f.input :type, as: :radio_buttons, collection: Admin::AccountAction.types_for_account(@account), include_blank: false, wrapper: :with_block_label, label_method: ->(type) { safe_join([I18n.t("simple_form.labels.admin_account_action.types.#{type}"), content_tag(:span, I18n.t("simple_form.hints.admin_account_action.types.#{type}"), class: 'hint')])}, hint: t('simple_form.hints.admin_account_action.type_html', acct: @account.acct)
+    = f.input :type, as: :radio_buttons, collection: Admin::AccountAction.types_for_account(@account), include_blank: false, wrapper: :with_block_label, label_method: ->(type) { safe_join([I18n.t("simple_form.labels.admin_account_action.types.#{type}"), content_tag(:span, I18n.t("simple_form.hints.admin_account_action.types.#{type}"), class: 'hint')])}, hint: t('simple_form.hints.admin_account_action.type_html', acct: @account.pretty_acct)
 
   - if @account.local?
     %hr.spacer/
diff --git a/app/views/admin/account_warnings/_account_warning.html.haml b/app/views/admin/account_warnings/_account_warning.html.haml
index 1462e76d0..030635185 100644
--- a/app/views/admin/account_warnings/_account_warning.html.haml
+++ b/app/views/admin/account_warnings/_account_warning.html.haml
@@ -5,7 +5,7 @@
         = fa_icon 'warning'
     .log-entry__content
       .log-entry__title
-        = t(account_warning.action, scope: 'admin.strikes.actions', name: content_tag(:span, account_warning.account.username, class: 'username'), target: content_tag(:span, account_warning.target_account.acct, class: 'target')).html_safe
+        = t(account_warning.action, scope: 'admin.strikes.actions', name: content_tag(:span, account_warning.account.username, class: 'username'), target: content_tag(:span, account_warning.target_account.pretty_acct, class: 'target')).html_safe
       .log-entry__timestamp
         %time.formatted{ datetime: account_warning.created_at.iso8601 }
           = l(account_warning.created_at)
diff --git a/app/views/admin/accounts/index.html.haml b/app/views/admin/accounts/index.html.haml
index fc667b376..0290df7de 100644
--- a/app/views/admin/accounts/index.html.haml
+++ b/app/views/admin/accounts/index.html.haml
@@ -33,7 +33,7 @@
         = hidden_field_tag key, params[key]
 
     - %i(username by_domain display_name email ip).each do |key|
-      - unless key == :by_domain && params[:remote].blank?
+      - unless key == :by_domain && params[:origin] != 'remote'
         .input.string.optional
           = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.accounts.#{key}")
 
diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml
index 9a1f07a06..805cf8a4f 100644
--- a/app/views/admin/accounts/show.html.haml
+++ b/app/views/admin/accounts/show.html.haml
@@ -1,5 +1,5 @@
 - content_for :page_title do
-  = @account.acct
+  = @account.pretty_acct
 
 - if @account.instance_actor?
   .flash-message.notice
diff --git a/app/views/admin/change_emails/show.html.haml b/app/views/admin/change_emails/show.html.haml
index 6ff0d785e..bc00d6114 100644
--- a/app/views/admin/change_emails/show.html.haml
+++ b/app/views/admin/change_emails/show.html.haml
@@ -1,5 +1,5 @@
 - content_for :page_title do
-  = t('admin.accounts.change_email.title', username: @account.acct)
+  = t('admin.accounts.change_email.title', username: @account.username)
 
 = simple_form_for @user, url: admin_account_change_email_path(@account.id) do |f|
   .fields-group
diff --git a/app/views/admin/disputes/appeals/_appeal.html.haml b/app/views/admin/disputes/appeals/_appeal.html.haml
index 02b8777e1..3f6efb856 100644
--- a/app/views/admin/disputes/appeals/_appeal.html.haml
+++ b/app/views/admin/disputes/appeals/_appeal.html.haml
@@ -4,7 +4,7 @@
       = image_tag appeal.account.avatar.url(:original), alt: '', width: 40, height: 40, class: 'avatar'
     .log-entry__content
       .log-entry__title
-        = t(appeal.strike.action, scope: 'admin.strikes.actions', name: content_tag(:span, appeal.strike.account.username, class: 'username'), target: content_tag(:span, appeal.account.acct, class: 'target')).html_safe
+        = t(appeal.strike.action, scope: 'admin.strikes.actions', name: content_tag(:span, appeal.strike.account.username, class: 'username'), target: content_tag(:span, appeal.account.username, class: 'target')).html_safe
       .log-entry__timestamp
         %time.formatted{ datetime: appeal.strike.created_at.iso8601 }
           = l(appeal.strike.created_at)
diff --git a/app/views/admin/relationships/index.html.haml b/app/views/admin/relationships/index.html.haml
index 60b9b5b25..f82cf26a3 100644
--- a/app/views/admin/relationships/index.html.haml
+++ b/app/views/admin/relationships/index.html.haml
@@ -1,5 +1,5 @@
 - content_for :page_title do
-  = t('admin.relationships.title', acct: @account.acct)
+  = t('admin.relationships.title', acct: @account.pretty_acct)
 
 .filters
   .filter-subset
diff --git a/app/views/admin/statuses/index.html.haml b/app/views/admin/statuses/index.html.haml
index 865464c72..9163dee79 100644
--- a/app/views/admin/statuses/index.html.haml
+++ b/app/views/admin/statuses/index.html.haml
@@ -1,7 +1,7 @@
 - content_for :page_title do
   = t('admin.statuses.title')
   \-
-  = "@#{@account.acct}"
+  = "@#{@account.pretty_acct}"
 
 .filters
   .filter-subset
diff --git a/app/views/admin_mailer/new_report.text.erb b/app/views/admin_mailer/new_report.text.erb
index d6c7d6bab..f8a5224a1 100644
--- a/app/views/admin_mailer/new_report.text.erb
+++ b/app/views/admin_mailer/new_report.text.erb
@@ -1,5 +1,5 @@
 <%= raw t('application_mailer.salutation', name: display_name(@me)) %>
 
-<%= raw(@report.account.local? ? t('admin_mailer.new_report.body', target: @report.target_account.acct, reporter: @report.account.acct) : t('admin_mailer.new_report.body_remote', target: @report.target_account.acct, domain: @report.account.domain)) %>
+<%= raw(@report.account.local? ? t('admin_mailer.new_report.body', target: @report.target_account.pretty_acct, reporter: @report.account.pretty_acct) : t('admin_mailer.new_report.body_remote', target: @report.target_account.acct, domain: @report.account.domain)) %>
 
 <%= raw t('application_mailer.view')%> <%= admin_report_url(@report) %>
diff --git a/app/views/auth/registrations/_status.html.haml b/app/views/auth/registrations/_status.html.haml
index 68954a5da..759bbc41c 100644
--- a/app/views/auth/registrations/_status.html.haml
+++ b/app/views/auth/registrations/_status.html.haml
@@ -7,7 +7,7 @@
     = t('auth.status.pending')
 - elsif @user.account.moved_to_account_id.present?
   .flash-message.warning
-    = t('auth.status.redirecting_to', acct: @user.account.moved_to_account.acct)
+    = t('auth.status.redirecting_to', acct: @user.account.moved_to_account.pretty_acct)
     = link_to t('migrations.cancel'), settings_migration_path
 
 %h3= t('auth.status.account_status')
diff --git a/app/views/authorize_interactions/show.html.haml b/app/views/authorize_interactions/show.html.haml
index 42c874134..2b4d2ed62 100644
--- a/app/views/authorize_interactions/show.html.haml
+++ b/app/views/authorize_interactions/show.html.haml
@@ -1,5 +1,5 @@
 - content_for :page_title do
-  = t('authorize_follow.title', acct: @resource.acct)
+  = t('authorize_follow.title', acct: @resource.pretty_acct)
 
 .form-container
   .follow-prompt
diff --git a/app/views/authorize_interactions/success.html.haml b/app/views/authorize_interactions/success.html.haml
index 47fd09767..86fa55eac 100644
--- a/app/views/authorize_interactions/success.html.haml
+++ b/app/views/authorize_interactions/success.html.haml
@@ -1,5 +1,5 @@
 - content_for :page_title do
-  = t('authorize_follow.title', acct: @resource.acct)
+  = t('authorize_follow.title', acct: @resource.pretty_acct)
 
 .form-container
   .follow-prompt
diff --git a/app/views/notification_mailer/_status.html.haml b/app/views/notification_mailer/_status.html.haml
index f520208e1..219e7e667 100644
--- a/app/views/notification_mailer/_status.html.haml
+++ b/app/views/notification_mailer/_status.html.haml
@@ -23,7 +23,7 @@
                                       = image_tag full_asset_url(status.account.avatar.url), alt:''
                                     %td{ align: 'left' }
                                       %bdi= display_name(status.account)
-                                      = "@#{status.account.acct}"
+                                      = "@#{status.account.pretty_acct}"
 
                               - if status.spoiler_text?
                                 %div.auto-dir
diff --git a/app/views/notification_mailer/digest.text.erb b/app/views/notification_mailer/digest.text.erb
index b2c85a9e3..4cd4190c1 100644
--- a/app/views/notification_mailer/digest.text.erb
+++ b/app/views/notification_mailer/digest.text.erb
@@ -3,7 +3,7 @@
 <%= raw t('notification_mailer.digest.body', since: l(@me.user_current_sign_in_at || @since), instance: root_url) %>
 <% @notifications.each do |notification| %>
 
-* <%= raw t('notification_mailer.digest.mention', name: notification.from_account.acct) %>
+* <%= raw t('notification_mailer.digest.mention', name: notification.from_account.pretty_acct) %>
 
   <%= raw Formatter.instance.plaintext(notification.target_status) %>
 
diff --git a/app/views/notification_mailer/favourite.html.haml b/app/views/notification_mailer/favourite.html.haml
index a715d615c..ebc5c29c7 100644
--- a/app/views/notification_mailer/favourite.html.haml
+++ b/app/views/notification_mailer/favourite.html.haml
@@ -20,7 +20,7 @@
                                       = image_tag full_pack_url('media/images/mailer/icon_grade.png'), alt:''
 
                               %h1= t 'notification_mailer.favourite.title'
-                              %p.lead= t('notification_mailer.favourite.body', name: @account.acct)
+                              %p.lead= t('notification_mailer.favourite.body', name: @account.pretty_acct)
 
 = render 'status', status: @status
 
diff --git a/app/views/notification_mailer/favourite.text.erb b/app/views/notification_mailer/favourite.text.erb
index 2581b4909..f4f869656 100644
--- a/app/views/notification_mailer/favourite.text.erb
+++ b/app/views/notification_mailer/favourite.text.erb
@@ -1,5 +1,5 @@
 <%= raw t('application_mailer.salutation', name: display_name(@me)) %>
 
-<%= raw t('notification_mailer.favourite.body', name: @account.acct) %>
+<%= raw t('notification_mailer.favourite.body', name: @account.pretty_acct) %>
 
 <%= render 'status', status: @status %>
diff --git a/app/views/notification_mailer/follow.html.haml b/app/views/notification_mailer/follow.html.haml
index cd84f7858..a59ef8835 100644
--- a/app/views/notification_mailer/follow.html.haml
+++ b/app/views/notification_mailer/follow.html.haml
@@ -20,7 +20,7 @@
                                       = image_tag full_pack_url('media/images/mailer/icon_person_add.png'), alt: ''
 
                               %h1= t 'notification_mailer.follow.title'
-                              %p.lead= t('notification_mailer.follow.body', name: @account.acct)
+                              %p.lead= t('notification_mailer.follow.body', name: @account.pretty_acct)
 
 %table.email-table{ cellspacing: 0, cellpadding: 0 }
   %tbody
diff --git a/app/views/notification_mailer/follow.text.erb b/app/views/notification_mailer/follow.text.erb
index cbe46f552..016a0a4cf 100644
--- a/app/views/notification_mailer/follow.text.erb
+++ b/app/views/notification_mailer/follow.text.erb
@@ -1,5 +1,5 @@
 <%= raw t('application_mailer.salutation', name: display_name(@me)) %>
 
-<%= raw t('notification_mailer.follow.body', name: @account.acct) %>
+<%= raw t('notification_mailer.follow.body', name: @account.pretty_acct) %>
 
 <%= raw t('application_mailer.view')%> <%= web_url("accounts/#{@account.id}") %>
diff --git a/app/views/notification_mailer/follow_request.html.haml b/app/views/notification_mailer/follow_request.html.haml
index a63e27a90..4c32c831e 100644
--- a/app/views/notification_mailer/follow_request.html.haml
+++ b/app/views/notification_mailer/follow_request.html.haml
@@ -20,7 +20,7 @@
                                       = image_tag full_pack_url('media/images/mailer/icon_person_add.png'), alt: ''
 
                               %h1= t 'notification_mailer.follow_request.title'
-                              %p.lead= t('notification_mailer.follow_request.body', name: @account.acct)
+                              %p.lead= t('notification_mailer.follow_request.body', name: @account.pretty_acct)
 
 %table.email-table{ cellspacing: 0, cellpadding: 0 }
   %tbody
diff --git a/app/views/notification_mailer/follow_request.text.erb b/app/views/notification_mailer/follow_request.text.erb
index a018394b8..66aa97fe3 100644
--- a/app/views/notification_mailer/follow_request.text.erb
+++ b/app/views/notification_mailer/follow_request.text.erb
@@ -1,5 +1,5 @@
 <%= raw t('application_mailer.salutation', name: display_name(@me)) %>
 
-<%= raw t('notification_mailer.follow_request.body', name: @account.acct) %>
+<%= raw t('notification_mailer.follow_request.body', name: @account.pretty_acct) %>
 
 <%= raw t('application_mailer.view')%> <%= web_url("follow_requests") %>
diff --git a/app/views/notification_mailer/mention.html.haml b/app/views/notification_mailer/mention.html.haml
index 619873cfa..cfb7465c1 100644
--- a/app/views/notification_mailer/mention.html.haml
+++ b/app/views/notification_mailer/mention.html.haml
@@ -20,7 +20,7 @@
                                       = image_tag full_pack_url('media/images/mailer/icon_reply.png'), alt: ''
 
                               %h1= t 'notification_mailer.mention.title'
-                              %p.lead= t('notification_mailer.mention.body', name: @status.account.acct)
+                              %p.lead= t('notification_mailer.mention.body', name: @status.account.pretty_acct)
 
 = render 'status', status: @status
 
diff --git a/app/views/notification_mailer/mention.text.erb b/app/views/notification_mailer/mention.text.erb
index 03f53813b..f104d5f92 100644
--- a/app/views/notification_mailer/mention.text.erb
+++ b/app/views/notification_mailer/mention.text.erb
@@ -1,5 +1,5 @@
 <%= raw t('application_mailer.salutation', name: display_name(@me)) %>
 
-<%= raw t('notification_mailer.mention.body', name: @status.account.acct) %>
+<%= raw t('notification_mailer.mention.body', name: @status.account.pretty_acct) %>
 
 <%= render 'status', status: @status %>
diff --git a/app/views/notification_mailer/reblog.html.haml b/app/views/notification_mailer/reblog.html.haml
index a2811be23..c528536ec 100644
--- a/app/views/notification_mailer/reblog.html.haml
+++ b/app/views/notification_mailer/reblog.html.haml
@@ -20,7 +20,7 @@
                                       = image_tag full_pack_url('media/images/mailer/icon_cached.png'), alt: ''
 
                               %h1= t 'notification_mailer.reblog.title'
-                              %p.lead= t('notification_mailer.reblog.body', name: @account.acct)
+                              %p.lead= t('notification_mailer.reblog.body', name: @account.pretty_acct)
 
 = render 'status', status: @status
 
diff --git a/app/views/notification_mailer/reblog.text.erb b/app/views/notification_mailer/reblog.text.erb
index 8fc841bf6..73a3b3945 100644
--- a/app/views/notification_mailer/reblog.text.erb
+++ b/app/views/notification_mailer/reblog.text.erb
@@ -1,5 +1,5 @@
 <%= raw t('application_mailer.salutation', name: display_name(@me)) %>
 
-<%= raw t('notification_mailer.reblog.body', name: @account.acct) %>
+<%= raw t('notification_mailer.reblog.body', name: @account.pretty_acct) %>
 
 <%= render 'status', status: @status %>
diff --git a/app/views/settings/aliases/index.html.haml b/app/views/settings/aliases/index.html.haml
index 5df0c9669..c618a82f1 100644
--- a/app/views/settings/aliases/index.html.haml
+++ b/app/views/settings/aliases/index.html.haml
@@ -29,5 +29,5 @@
       - else
         - @aliases.each do |account_alias|
           %tr
-            %td= account_alias.acct
+            %td= account_alias.pretty_acct
             %td= table_link_to 'trash', t('aliases.remove'), settings_alias_path(account_alias), data: { method: :delete }
diff --git a/app/views/settings/migrations/show.html.haml b/app/views/settings/migrations/show.html.haml
index 078eaebc6..492f6fe12 100644
--- a/app/views/settings/migrations/show.html.haml
+++ b/app/views/settings/migrations/show.html.haml
@@ -8,7 +8,7 @@
         = render 'application/card', account: current_account.moved_to_account
       .fields-row__column.fields-group.fields-row__column-6
         %p.hint
-          %span.positive-hint= t('migrations.redirecting_to', acct: current_account.moved_to_account.acct)
+          %span.positive-hint= t('migrations.redirecting_to', acct: current_account.moved_to_account.pretty_acct)
 
         %p.hint= t('migrations.cancel_explanation')
 
@@ -76,7 +76,7 @@
               - if migration.target_account.present?
                 = compact_account_link_to migration.target_account
               - else
-                = migration.acct
+                = migration.pretty_acct
 
             %td= number_with_delimiter migration.followers_count
 
diff --git a/app/workers/scheduler/user_cleanup_scheduler.rb b/app/workers/scheduler/user_cleanup_scheduler.rb
index 750d2127b..d1f00c47f 100644
--- a/app/workers/scheduler/user_cleanup_scheduler.rb
+++ b/app/workers/scheduler/user_cleanup_scheduler.rb
@@ -27,7 +27,7 @@ class Scheduler::UserCleanupScheduler
   end
 
   def clean_discarded_statuses!
-    Status.discarded.where('deleted_at <= ?', 30.days.ago).find_in_batches do |statuses|
+    Status.unscoped.discarded.where('deleted_at <= ?', 30.days.ago).find_in_batches do |statuses|
       RemovalWorker.push_bulk(statuses) do |status|
         [status.id, { 'immediate' => true }]
       end