about summary refs log tree commit diff
path: root/app/javascript
diff options
context:
space:
mode:
authorClaire <claire.github-309c@sitedethib.com>2022-03-23 15:56:24 +0100
committerGitHub <noreply@github.com>2022-03-23 15:56:24 +0100
commit6f032076ed0f338d914d70aaa3333d4c00940c71 (patch)
tree274b9b71a73dabcdc7fb89e14b329a38a917fda0 /app/javascript
parent9ff119eecd1079e52a8a41d7b8d61520c4303c2f (diff)
parent6391a869aee853b01bdd9136b390e2f9b21857cb (diff)
Merge pull request #1721 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes
Diffstat (limited to 'app/javascript')
-rw-r--r--app/javascript/flavours/glitch/features/compose/components/upload.js9
-rw-r--r--app/javascript/flavours/glitch/styles/admin.scss2
-rw-r--r--app/javascript/flavours/glitch/styles/components/composer.scss63
-rw-r--r--app/javascript/flavours/glitch/styles/components/modal.scss9
-rw-r--r--app/javascript/flavours/glitch/styles/components/status.scss10
-rw-r--r--app/javascript/flavours/glitch/styles/mastodon-light/diff.scss8
-rw-r--r--app/javascript/mastodon/features/compose/components/upload.js9
-rw-r--r--app/javascript/mastodon/features/explore/results.js6
-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.scss150
17 files changed, 196 insertions, 234 deletions
diff --git a/app/javascript/flavours/glitch/features/compose/components/upload.js b/app/javascript/flavours/glitch/features/compose/components/upload.js
index 338bfca37..963b95c87 100644
--- a/app/javascript/flavours/glitch/features/compose/components/upload.js
+++ b/app/javascript/flavours/glitch/features/compose/components/upload.js
@@ -5,7 +5,6 @@ import Motion from 'flavours/glitch/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 'flavours/glitch/components/icon';
 import { isUserTouching } from 'flavours/glitch/util/is_mobile';
 
@@ -44,10 +43,16 @@ export default class Upload extends ImmutablePureComponent {
         <Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12, }) }}>
           {({ scale }) => (
             <div style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}>
-              <div className={classNames('composer--upload_form--actions', { active: true })}>
+              <div className='composer--upload_form--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='composer--upload_form--item__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/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss
index 40cd899b3..27be22f1b 100644
--- a/app/javascript/flavours/glitch/styles/admin.scss
+++ b/app/javascript/flavours/glitch/styles/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/flavours/glitch/styles/components/composer.scss b/app/javascript/flavours/glitch/styles/components/composer.scss
index 937751d00..96ea096e1 100644
--- a/app/javascript/flavours/glitch/styles/components/composer.scss
+++ b/app/javascript/flavours/glitch/styles/components/composer.scss
@@ -425,54 +425,12 @@
     background-repeat: no-repeat;
     overflow: hidden;
 
-    textarea {
-      display: block;
-      position: absolute;
-      box-sizing: border-box;
-      bottom: 0;
-      left: 0;
-      margin: 0;
-      border: 0;
-      padding: 10px;
-      width: 100%;
-      color: $secondary-text-color;
-      background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
-      font-size: 14px;
-      font-family: inherit;
-      font-weight: 500;
-      opacity: 0;
-      z-index: 2;
-      transition: opacity .1s ease;
-
-      &:focus { color: $white }
-
-      &::placeholder {
-        opacity: 0.54;
-        color: $secondary-text-color;
-      }
-    }
-
     & > .close { mix-blend-mode: difference }
   }
 
-  &.active {
-    & > div {
-      textarea { opacity: 1 }
-    }
-  }
-}
-
-.composer--upload_form--actions {
-  background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
-  display: flex;
-  align-items: flex-start;
-  justify-content: space-between;
-  opacity: 0;
-  transition: opacity .1s ease;
-
   .icon-button {
     flex: 0 1 auto;
-    color: $ui-secondary-color;
+    color: $secondary-text-color;
     font-size: 14px;
     font-weight: 500;
     padding: 10px;
@@ -481,15 +439,28 @@
     &:hover,
     &:focus,
     &:active {
-      color: lighten($ui-secondary-color, 4%);
+      color: lighten($secondary-text-color, 7%);
     }
   }
 
-  &.active {
-    opacity: 1;
+  &__warning {
+    position: absolute;
+    z-index: 2;
+    bottom: 0;
+    left: 0;
+    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);
   }
 }
 
+.composer--upload_form--actions {
+  background: linear-gradient(180deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
+  display: flex;
+  align-items: flex-start;
+  justify-content: space-between;
+}
+
 .composer--upload_form--progress {
   display: flex;
   padding: 10px;
diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss
index 7e6918356..61c292b19 100644
--- a/app/javascript/flavours/glitch/styles/components/modal.scss
+++ b/app/javascript/flavours/glitch/styles/components/modal.scss
@@ -609,6 +609,15 @@
     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/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index ad6c24ea6..0d7dfd64d 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -198,7 +198,8 @@
   .status__content__spoiler-link {
     background: lighten($ui-base-color, 30%);
 
-    &:hover {
+    &:hover,
+    &:focus {
       background: lighten($ui-base-color, 33%);
       text-decoration: none;
     }
@@ -222,13 +223,13 @@
   background: lighten($ui-base-color, 30%);
   border: 0;
   color: $inverted-text-color;
-  font-weight: 500;
+  font-weight: 700;
   font-size: 11px;
   padding: 0 5px;
   text-transform: uppercase;
   line-height: inherit;
   cursor: pointer;
-  vertical-align: bottom;
+  vertical-align: top;
 
   &:hover {
     background: lighten($ui-base-color, 33%);
@@ -760,7 +761,8 @@ a.status__display-name,
     background: $ui-base-lighter-color;
     color: $inverted-text-color;
 
-    &:hover {
+    &:hover,
+    &:focus {
       background: lighten($ui-base-color, 29%);
       text-decoration: none;
     }
diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
index 020d39aff..bb91abdac 100644
--- a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
+++ b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
@@ -165,14 +165,6 @@
   }
 }
 
-.composer--upload_form--item > div input {
-  color: lighten($white, 7%);
-
-  &::placeholder {
-    color: lighten($white, 10%);
-  }
-}
-
 .dropdown-menu__separator,
 .dropdown-menu__item.edited-timestamp__history__item,
 .dropdown-menu__container__header,
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/features/explore/results.js b/app/javascript/mastodon/features/explore/results.js
index ff900de08..339f883c5 100644
--- a/app/javascript/mastodon/features/explore/results.js
+++ b/app/javascript/mastodon/features/explore/results.js
@@ -24,15 +24,15 @@ const appendLoadMore = (id, list, onLoadMore) => {
   }
 };
 
-const renderAccounts = (results, onLoadMore) => appendLoadMore('accounts', results.get('accounts').map(item => (
+const renderAccounts = (results, onLoadMore) => appendLoadMore('accounts', results.get('accounts', ImmutableList()).map(item => (
   <Account key={`account-${item}`} id={item} />
 )), onLoadMore);
 
-const renderHashtags = (results, onLoadMore) => appendLoadMore('hashtags', results.get('hashtags').map(item => (
+const renderHashtags = (results, onLoadMore) => appendLoadMore('hashtags', results.get('hashtags', ImmutableList()).map(item => (
   <Hashtag key={`tag-${item.get('name')}`} hashtag={item} />
 )), onLoadMore);
 
-const renderStatuses = (results, onLoadMore) => appendLoadMore('statuses', results.get('statuses').map(item => (
+const renderStatuses = (results, onLoadMore) => appendLoadMore('statuses', results.get('statuses', ImmutableList()).map(item => (
   <Status key={`status-${item}`} id={item} />
 )), onLoadMore);
 
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..713d24c0f 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,
@@ -1223,6 +1154,43 @@
   .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,
+        &:focus {
+          background: lighten($ui-primary-color, 8%);
+        }
+      }
+    }
+  }
 }
 
 .detailed-status__meta {
@@ -1646,7 +1614,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 +5127,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;